diff --git a/model/end_user_detail.go b/model/end_user_detail.go index 99ad503..07191e8 100644 --- a/model/end_user_detail.go +++ b/model/end_user_detail.go @@ -1,6 +1,10 @@ package model -import "github.com/shopspring/decimal" +import ( + "errors" + + "github.com/shopspring/decimal" +) type EndUserDetail struct { CreatedAndModified `xorm:"extends"` @@ -32,6 +36,7 @@ type EndUserDetail struct { AdjustValley decimal.Decimal `xorm:"numeric(14,2) not null default 0" json:"adjustValley"` Overall decimal.NullDecimal `xorm:"numeric(14,2)" json:"overall"` OverallFee decimal.NullDecimal `xorm:"numeric(14,2)" json:"overallFee"` + OverallProporttion decimal.Decimal `xorm:"numeric(16,15) not null default 0" json:"-"` Critical decimal.NullDecimal `xorm:"numeric(14,2)" json:"critical"` CriticalFee decimal.NullDecimal `xorm:"numeric(18,8)" json:"criticalFee"` Peak decimal.NullDecimal `xorm:"numeric(14,2)" json:"peak"` @@ -52,3 +57,23 @@ type EndUserDetail struct { func (EndUserDetail) TableName() string { return "end_user_detail" } + +func (d EndUserDetail) Validate() (bool, error) { + lastPeriodSum := decimal.Sum(d.LastPeriodCritical, d.LastPeriodPeak, d.LastPeriodValley) + if lastPeriodSum.GreaterThan(d.LastPeriodOverall) { + return false, errors.New("上期峰谷计量总量大于上期总计电量") + } + currentPeriodSum := decimal.Sum(d.CurrentPeriodCritical, d.CurrentPeriodPeak, d.CurrentPeriodValley) + if currentPeriodSum.GreaterThan(d.CurrentPeriodOverall) { + return false, errors.New("本期峰谷计量总量大于本期总计电量") + } + return true, nil +} + +func (d *EndUserDetail) CalculatePeriod() { + d.Overall = decimal.NewNullDecimal(d.CurrentPeriodOverall.Sub(d.LastPeriodOverall).Add(d.AdjustOverall).RoundBank(2)) + d.Critical = decimal.NewNullDecimal(d.CurrentPeriodCritical.Sub(d.LastPeriodCritical).Add(d.AdjustCritical).RoundBank(2)) + d.Peak = decimal.NewNullDecimal(d.CurrentPeriodPeak.Sub(d.LastPeriodPeak).Add(d.AdjustPeak).RoundBank(2)) + d.Flat = decimal.NewNullDecimal(d.CurrentPeriodFlat.Sub(d.LastPeriodFlat).Add(d.AdjustFlat).RoundBank(2)) + d.Valley = decimal.NewNullDecimal(d.CurrentPeriodValley.Sub(d.LastPeriodValley).Add(d.AdjustValley).RoundBank(2)) +} diff --git a/model/report_summary.go b/model/report_summary.go index b10acc3..b314234 100644 --- a/model/report_summary.go +++ b/model/report_summary.go @@ -1,12 +1,16 @@ package model -import "github.com/shopspring/decimal" +import ( + "errors" + + "github.com/shopspring/decimal" +) type ReportSummary struct { ReportId string `xorm:"varchar(120) pk not null" json:"-"` Overall decimal.Decimal `xorm:"numeric(14,2) not null default 0" json:"overall"` OverallFee decimal.Decimal `xorm:"numeric(14,2) not null default 0" json:"overallFee"` - OverallPrice decimal.Decimal `xorm:"numeric(16,8)" json:"overallPrice"` + OverallPrice decimal.NullDecimal `xorm:"numeric(16,8)" json:"overallPrice"` Critical decimal.Decimal `xorm:"numeric(14,2) not null default 0" json:"critical"` CriticalFee decimal.Decimal `xorm:"numeric(14,2) not null default 0" json:"criticalFee"` CriticalPrice decimal.NullDecimal `xorm:"numeric(16,8)" json:"criticalPrice"` @@ -35,3 +39,41 @@ type ReportSummary struct { func (ReportSummary) TableName() string { return "report_summary" } + +func (s ReportSummary) Validate() (bool, error) { + amountSum := decimal.Sum(s.Critical, s.Peak, s.Valley) + if amountSum.GreaterThan(s.Overall) { + return false, errors.New("峰谷计量总量大于总计电量") + } + feeSum := decimal.Sum(s.CriticalFee, s.PeakFee, s.ValleyFee) + if feeSum.GreaterThan(s.OverallFee) { + return false, errors.New("峰谷计量费用大于总计费用") + } + return true, nil +} + +func (s *ReportSummary) CalculatePrices() { + s.OverallPrice = decimal.NewNullDecimal(s.OverallFee.Div(s.Overall).RoundBank(8)) + if s.Critical.GreaterThan(decimal.Zero) { + s.CriticalPrice = decimal.NewNullDecimal(s.CriticalFee.Div(s.Critical).RoundBank(8)) + } else { + s.CriticalPrice = decimal.NewNullDecimal(decimal.Zero) + } + if s.Peak.GreaterThan(decimal.Zero) { + s.PeakPrice = decimal.NewNullDecimal(s.PeakFee.Div(s.Peak).RoundBank(8)) + } else { + s.PeakPrice = decimal.NewNullDecimal(decimal.Zero) + } + if s.Valley.GreaterThan(decimal.Zero) { + s.ValleyPrice = decimal.NewNullDecimal(s.ValleyFee.Div(s.Valley).RoundBank(8)) + } else { + s.ValleyPrice = decimal.NewNullDecimal(decimal.Zero) + } + s.Flat = s.Overall.Sub(s.Critical).Sub(s.Peak).Sub(s.Valley) + s.FlatFee = s.OverallFee.Sub(s.CriticalFee).Sub(s.PeakFee).Sub(s.ValleyFee) + if s.Flat.GreaterThan(decimal.Zero) { + s.FlatPrice = decimal.NewNullDecimal(s.FlatFee.Div(s.Flat).RoundBank(8)) + } else { + s.FlatPrice = decimal.NewNullDecimal(decimal.Zero) + } +} diff --git a/service/report.go b/service/report.go index cc01476..b827c1f 100644 --- a/service/report.go +++ b/service/report.go @@ -7,7 +7,6 @@ import ( "time" "github.com/google/uuid" - "github.com/shopspring/decimal" "xorm.io/builder" ) @@ -155,13 +154,3 @@ func (_ReportService) RetreiveParkSummary(rid string) (*model.ReportSummary, err } return summary, nil } - -func (_ReportService) CheckSummaryOverall(summary model.ReportSummary) bool { - var sum = decimal.Sum(summary.Critical, summary.Peak, summary.Valley) - return sum.LessThan(summary.Overall) -} - -func (_ReportService) CheckSummaryOverallFee(summary model.ReportSummary) bool { - var sum = decimal.Sum(summary.CriticalFee, summary.PeakFee, summary.ValleyFee) - return sum.LessThan(summary.OverallFee) -}