electricity_bill_calc_service/vo/report.go

324 lines
13 KiB
Go

package vo
import (
"electricity_bill_calc/model"
"electricity_bill_calc/types"
"github.com/jinzhu/copier"
"github.com/shopspring/decimal"
)
type ReportCreationForm struct {
Park string `json:"parkId"`
PeriodBegin types.Date `json:"periodBegin"`
PeriodEnd types.Date `json:"periodEnd"`
Overall decimal.Decimal `json:"overall"`
OverallFee decimal.Decimal `json:"overallFee"`
Critical decimal.Decimal `json:"critical"`
CriticalFee decimal.Decimal `json:"criticalFee"`
Peak decimal.Decimal `json:"peak"`
PeakFee decimal.Decimal `json:"peakFee"`
Flat decimal.Decimal `json:"flat,omitempty"`
FlatFee decimal.Decimal `json:"flatFee,omitempty"`
Valley decimal.Decimal `json:"valley"`
ValleyFee decimal.Decimal `json:"valleyFee"`
BasicFee decimal.Decimal `json:"basicFee"`
AdjustFee decimal.Decimal `json:"adjustFee"`
}
type ReportModifyForm struct {
PeriodBegin types.Date `json:"periodBegin"`
PeriodEnd types.Date `json:"periodEnd"`
Overall decimal.Decimal `json:"overall"`
OverallFee decimal.Decimal `json:"overallFee"`
Critical decimal.Decimal `json:"critical"`
CriticalFee decimal.Decimal `json:"criticalFee"`
Peak decimal.Decimal `json:"peak"`
PeakFee decimal.Decimal `json:"peakFee"`
Flat decimal.Decimal `json:"flat,omitempty"`
FlatFee decimal.Decimal `json:"flatFee,omitempty"`
Valley decimal.Decimal `json:"valley"`
ValleyFee decimal.Decimal `json:"valleyFee"`
BasicFee decimal.Decimal `json:"basicFee"`
AdjustFee decimal.Decimal `json:"adjustFee"`
}
type SimplifiedReportIndex struct {
Id string `json:"id"`
Park string `json:"parkId"`
PeriodBegin types.Date `json:"periodBegin"`
PeriodEnd types.Date `json:"periodEnd"`
Published bool `json:"published"`
PublishedAt *types.DateTime `json:"publishedAt"`
Withdraw int16 `json:"withdraw"`
LastWithdrawAppliedAt *types.DateTime `json:"lastWithdrawAppliedAt"`
LastWithdrawAuditAt *types.DateTime `json:"lastWithdrawAuditAt"`
Status int16 `json:"status"`
Message *string `json:"message"`
}
func (sri *SimplifiedReportIndex) Period(p types.DateRange) {
sri.PeriodBegin = p.SafeLower()
sri.PeriodEnd = p.SafeUpper()
}
type ReportIndexQueryResponse struct {
Park SimplifiedParkDetail `json:"park"`
Report *SimplifiedReportIndex `json:"report"`
}
type ComprehensiveReportQueryResponse struct {
Report SimplifiedReportIndex `json:"report"`
Park SimplifiedParkDetail `json:"park"`
User SimplifiedUserDetail `json:"user"`
}
type BasicReportIndexResponse struct {
Id string `json:"id"`
Park string `json:"parkId"`
PeriodBegin types.Date `json:"periodBegin"`
PeriodEnd types.Date `json:"periodEnd"`
Category int16 `json:"category"`
MeterType int16 `json:"meter04kvType"`
PricePolicy int16 `json:"pricePolicy"`
BasisPooled int16 `json:"basisDiluted"`
AdjustPooled int16 `json:"adjustDiluted"`
LossPooled int16 `json:"lossDiluted"`
PublicPooled int16 `json:"publicDiluted"`
Published bool `json:"published"`
PublishedAt *types.DateTime `json:"publishedAt"`
Withdraw int16 `json:"withdraw"`
LastWithdrawAppliedAt *types.DateTime `json:"lastWithdrawAppliedAt"`
LastWithdrawAuditAt *types.DateTime `json:"lastWithdrawAuditAt"`
Status int16 `json:"status"`
Message *string `json:"message"`
CreatedAt types.DateTime `json:"createdAt"`
LastModifiedAt types.DateTime `json:"lastModifiedAt"`
}
func (bri *BasicReportIndexResponse) Period(p types.DateRange) {
bri.PeriodBegin = p.SafeLower()
bri.PeriodEnd = p.SafeUpper()
}
type ReportDetailQueryResponse struct {
Enterprise SimplifiedUserDetail `json:"enterprise"`
Park SimplifiedParkDetail `json:"park"`
Report BasicReportIndexResponse `json:"report"`
}
func NewReportDetailQueryResponse(user *model.UserDetail, park *model.Park, report *model.ReportIndex) ReportDetailQueryResponse {
var response ReportDetailQueryResponse
copier.Copy(&response.Enterprise, user)
copier.Copy(&response.Park, park)
copier.Copy(&response.Report, report)
return response
}
type ParkSummaryResponse struct {
ReportId string `json:"reportId"`
OverallDisplay ConsumptionDisplay `json:"overall"`
Area decimal.Decimal `json:"area"`
BasicFee decimal.Decimal `json:"basicFee"`
PooledBasicFeeByAmount decimal.Decimal `json:"pooledBasicFeeByAmount"`
PooledBasicFeeByArea decimal.Decimal `json:"pooledBasicFeeByArea"`
AdjustFee decimal.Decimal `json:"adjustFee"`
PooledAdjustFeeByAmount decimal.Decimal `json:"pooledAdjustFeeByAmount"`
PooledAdjustFeeByArea decimal.Decimal `json:"pooledAdjustFeeByArea"`
Consumption decimal.Decimal `json:"consumption"`
Loss decimal.Decimal `json:"loss"`
LossRate decimal.Decimal `json:"lossRate"`
}
func (psr *ParkSummaryResponse) Overall(value model.ConsumptionUnit) {
psr.OverallDisplay.FromConsumptionUnit(&value)
}
type SimplifiedReportSummary struct {
Overall model.ConsumptionUnit `json:"overall"`
Critical model.ConsumptionUnit `json:"critical"`
Peak model.ConsumptionUnit `json:"peak"`
Flat model.ConsumptionUnit `json:"flat"`
Valley model.ConsumptionUnit `json:"valley"`
BasicFee decimal.Decimal `json:"basicFee"`
AdjustFee decimal.Decimal `json:"adjustFee"`
ConsumptionFee decimal.Decimal `json:"consumptionFee" copier:"GetConsumptionFee"`
}
type TestCalculateForm struct {
Overall decimal.Decimal `json:"overall"`
OverallFee decimal.Decimal `json:"overallFee"`
Critical decimal.Decimal `json:"critical"`
CriticalFee decimal.Decimal `json:"criticalFee"`
Peak decimal.Decimal `json:"peak"`
PeakFee decimal.Decimal `json:"peakFee"`
Valley decimal.Decimal `json:"valley"`
ValleyFee decimal.Decimal `json:"valleyFee"`
BasicFee decimal.Decimal `json:"basicFee"`
AdjustFee decimal.Decimal `json:"adjustFee"`
}
type TestCalculateResult struct {
OverallPrice decimal.Decimal `json:"overallPrice"`
CriticalPrice decimal.Decimal `json:"criticalPrice"`
PeakPrice decimal.Decimal `json:"peakPrice"`
Flat decimal.Decimal `json:"flat"`
FlatFee decimal.Decimal `json:"flatFee"`
FlatPrice decimal.Decimal `json:"flatPrice"`
ValleyPrice decimal.Decimal `json:"valleyPrice"`
ConsumptionFee decimal.Decimal `json:"consumptionFee"`
}
func (t TestCalculateForm) Calculate() TestCalculateResult {
var r TestCalculateResult = TestCalculateResult{}
r.ConsumptionFee = t.OverallFee.Sub(t.BasicFee).Sub(t.AdjustFee)
if t.Overall.GreaterThan(decimal.Zero) {
r.OverallPrice = r.ConsumptionFee.Div(t.Overall).RoundBank(8)
}
if t.Critical.GreaterThan(decimal.Zero) {
r.CriticalPrice = t.CriticalFee.Div(t.Critical).RoundBank(8)
}
if t.Peak.GreaterThan(decimal.Zero) {
r.PeakPrice = t.PeakFee.Div(t.Peak).RoundBank(8)
}
r.Flat = t.Overall.Sub(t.Critical).Sub(t.Peak).Sub(t.Valley)
r.FlatFee = r.ConsumptionFee.Sub(t.CriticalFee).Sub(t.PeakFee).Sub(t.ValleyFee).RoundBank(8)
if r.Flat.GreaterThan(decimal.Zero) {
r.FlatPrice = r.FlatFee.Div(r.Flat).RoundBank(8)
}
r.ConsumptionFee = r.ConsumptionFee.RoundBank(8)
return r
}
type ReportCalculateTaskStatusResponse struct {
Id string `json:"id"`
Status int16 `json:"status"`
Message *string `json:"message"`
}
type ReportPublicQueryResponse struct {
SimplifiedMeterDetailResponse
Overall ConsumptionDisplay `json:"overall"`
AdjustLoss ConsumptionDisplay `json:"adjustLoss"`
}
func (rpqr *ReportPublicQueryResponse) FromReportDetailPublicConsumption(value *model.ReportDetailedPublicConsumption) {
copier.Copy(&rpqr.SimplifiedMeterDetailResponse, &value.MeterDetail)
rpqr.Overall.FromConsumptionUnit(&value.ReportPublicConsumption.Overall)
rpqr.Overall.Amount(value.ReportPublicConsumption.Overall.Amount.Add(value.ReportPublicConsumption.LossAdjust.Amount))
rpqr.AdjustLoss.FromConsumptionUnit(&value.ReportPublicConsumption.LossAdjust)
}
type ReportPooledQueryResponse struct {
SimplifiedMeterDetailResponse
Overall ConsumptionDisplay `json:"overall"`
PoolMethod int16 `json:"poolMethod"`
}
func (rpqr *ReportPooledQueryResponse) FromReportDetailPooledConsumption(value *model.ReportDetailedPooledConsumption) {
copier.Copy(&rpqr.SimplifiedMeterDetailResponse, &value.MeterDetail)
rpqr.Overall.FromConsumptionUnit(&value.ReportPooledConsumption.Overall)
rpqr.PoolMethod = value.PublicPooled
}
func (rpqr *ReportPooledQueryResponse) FromReportDetailNestedMeterConsumption(value *model.ReportDetailNestedMeterConsumption) {
copier.Copy(&rpqr.SimplifiedMeterDetailResponse, &value.Meter)
rpqr.Overall.FromConsumptionUnit(&value.Consumption.Overall)
rpqr.PoolMethod = -1
}
type ReportTenementSummaryResponse struct {
SimplifiedTenementDetailResponse
Consumption decimal.Decimal `json:"consumption"`
Fee decimal.Decimal `json:"fee"`
Pooled decimal.Decimal `json:"pooled"`
Total decimal.Decimal `json:"final"`
}
func (rtsr *ReportTenementSummaryResponse) FromReportTenement(value *model.ReportTenement) {
copier.Copy(&rtsr.SimplifiedTenementDetailResponse, &value.Detail)
fee := value.BasicFeePooled.Add(value.AdjustFeePooled).Add(value.LossFeePooled)
rtsr.Consumption = value.Overall.Amount
rtsr.Fee = fee
rtsr.Pooled = value.FinalPooled
rtsr.Total = value.FinalCharge
}
type ReportTenementComprehensiveDetailResponse struct {
Consumption decimal.Decimal `json:"consumption"`
Fee decimal.Decimal `json:"fee"`
Price decimal.Decimal `json:"price"`
BasicPooled decimal.Decimal `json:"basicPooled"`
AdjustPooled decimal.Decimal `json:"adjustPooled"`
LossPooled decimal.Decimal `json:"lossPooled"`
PublicPooled decimal.Decimal `json:"publicPooled"`
Total decimal.Decimal `json:"total"`
}
func (rtcdr *ReportTenementComprehensiveDetailResponse) FromReportTenement(value *model.ReportTenement) {
rtcdr.Consumption = value.Overall.Amount
rtcdr.Fee = value.Overall.Fee
rtcdr.Price = value.Overall.Price
rtcdr.BasicPooled = value.BasicFeePooled
rtcdr.AdjustPooled = value.AdjustFeePooled
rtcdr.LossPooled = value.LossFeePooled
rtcdr.PublicPooled = value.FinalPooled
rtcdr.Total = value.FinalCharge
}
type ReportMeterDetailResponse struct {
SimplifiedMeterDetailResponse
Overall ConsumptionDisplay `json:"overall"`
Critical ConsumptionDisplay `json:"critical"`
Peak ConsumptionDisplay `json:"peak"`
Flat ConsumptionDisplay `json:"flat"`
Valley ConsumptionDisplay `json:"valley"`
}
func (rmdr *ReportMeterDetailResponse) FromNestedMeter(value *model.NestedMeter) {
copier.Copy(&rmdr.SimplifiedMeterDetailResponse, &value.MeterDetail)
rmdr.Overall.FromConsumptionUnit(&value.Overall)
rmdr.Critical.FromConsumptionUnit(&value.Critical)
rmdr.Peak.FromConsumptionUnit(&value.Peak)
rmdr.Flat.FromConsumptionUnit(&value.Flat)
rmdr.Valley.FromConsumptionUnit(&value.Valley)
}
type ReportMeterExtendedDetailResponse struct {
ReportMeterDetailResponse
BasicPooled decimal.Decimal `json:"basicPooled"`
AdjustPooled decimal.Decimal `json:"adjustPooled"`
LossPooled decimal.Decimal `json:"lossPooled"`
PublicPooled decimal.Decimal `json:"publicPooled"`
FinalTotal decimal.Decimal `json:"finalTotal"`
}
func (rmedr *ReportMeterExtendedDetailResponse) FromNestedMeter(value *model.NestedMeter) {
rmedr.ReportMeterDetailResponse.FromNestedMeter(value)
rmedr.BasicPooled = value.BasicPooled
rmedr.AdjustPooled = value.AdjustPooled
rmedr.LossPooled = value.LossPooled
rmedr.PublicPooled = value.PublicPooled
rmedr.FinalTotal = value.FinalTotal
}
type ReportTenementDetailResponse struct {
Tenement SimplifiedTenementDetailResponse `json:"tenement"`
Comprehensive ReportTenementComprehensiveDetailResponse `json:"comprehensive"`
Meters []ReportMeterExtendedDetailResponse `json:"meters"`
Pooled []ReportMeterDetailResponse `json:"pooled"`
}
func (rtdr *ReportTenementDetailResponse) FromReportTenement(value *model.ReportTenement) {
copier.Copy(&rtdr.Tenement, &value.Detail)
rtdr.Comprehensive.FromReportTenement(value)
rtdr.Meters = make([]ReportMeterExtendedDetailResponse, len(value.Meters))
for i, v := range value.Meters {
rtdr.Meters[i].FromNestedMeter(&v)
}
rtdr.Pooled = make([]ReportMeterDetailResponse, len(value.Pooled))
for i, v := range value.Pooled {
rtdr.Pooled[i].FromNestedMeter(&v)
}
}