From 60d2db6cdd14ba2821c39af16250d0691f9cdab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Sat, 17 Sep 2022 21:31:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor(calculate):=E6=8A=A5=E8=A1=A8=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E6=9C=8D=E5=8A=A1=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service/calculate.go | 263 +++++++++++++++++++++---------------------- 1 file changed, 127 insertions(+), 136 deletions(-) diff --git a/service/calculate.go b/service/calculate.go index 1dee27d..9e184ef 100644 --- a/service/calculate.go +++ b/service/calculate.go @@ -1,6 +1,7 @@ package service import ( + "database/sql" "electricity_bill_calc/cache" "electricity_bill_calc/exceptions" "electricity_bill_calc/global" @@ -8,8 +9,6 @@ import ( "fmt" "github.com/shopspring/decimal" - "xorm.io/builder" - "xorm.io/xorm/schemas" ) type _CalculateService struct{} @@ -17,227 +16,220 @@ type _CalculateService struct{} var CalculateService _CalculateService func (_CalculateService) ComprehensivelyCalculateReport(reportId string) (err error) { + ctx, cancel := global.TimeoutContext(12) + defer cancel() + // 资料准备 - var reportIndex = new(model.Report) - has, err := global.DBConn.ID(reportId).NoAutoCondition().Get(reportIndex) - if err != nil || !has { + var report *model.Report + err = global.DB.NewSelect().Model(report). + Relation("Summary"). + Relation("WillDilutedFees"). + Relation("EndUsers"). + Where("r.id = ?", reportId). + Scan(ctx) + if err != nil || report == nil { return exceptions.NewNotFoundErrorFromError("未找到指定的公示报表", err) } - var summary = new(model.ReportSummary) - has, err = global.DBConn.ID(reportId).NoAutoCondition().Get(summary) - if err != nil || !has { - return exceptions.NewNotFoundErrorFromError("未找到指定的公示报表概览", err) - } - var maintenanceFeeRecords = make([]model.WillDilutedFee, 0) - err = global.DBConn.Where(builder.Eq{"report_id": reportId}).Find(&maintenanceFeeRecords) - if err != nil { - return exceptions.NewNotFoundErrorFromError("未能获取到公示报表对应的待摊薄费用信息", err) - } - var endUserDetails = make([]*model.EndUserDetail, 0) - err = global.DBConn.Where(builder.Eq{"report_id": reportId}).Find(&endUserDetails) - if err != nil { - return exceptions.NewNotFoundErrorFromError("未获取到公示报表对应的终端用户抄表信息", err) - } // 综合计算 - summary.CalculatePrices() + report.Summary.CalculatePrices() // 计算维护费总计 maintenanceFeeTotal := decimal.NewFromInt(0) - for _, m := range maintenanceFeeRecords { + for _, m := range report.WillDilutedFees { maintenanceFeeTotal = maintenanceFeeTotal.Add(m.Fee) } // 计算终端用户信息与概览中的合计 - summary.PublicConsumption = decimal.NewNullDecimal(decimal.Zero) - summary.PublicConsumptionCritical = decimal.NewNullDecimal(decimal.Zero) - summary.PublicConsumptionPeak = decimal.NewNullDecimal(decimal.Zero) - summary.PublicConsumptionFlat = decimal.NewNullDecimal(decimal.Zero) - summary.PublicConsumptionValley = decimal.NewNullDecimal(decimal.Zero) - summary.CustomerConsumption = decimal.NewNullDecimal(decimal.Zero) - summary.CustomerConsumptionCritical = decimal.NewNullDecimal(decimal.Zero) - summary.CustomerConsumptionPeak = decimal.NewNullDecimal(decimal.Zero) - summary.CustomerConsumptionFlat = decimal.NewNullDecimal(decimal.Zero) - summary.CustomerConsumptionValley = decimal.NewNullDecimal(decimal.Zero) - for _, eu := range endUserDetails { + report.Summary.PublicConsumption = decimal.NewNullDecimal(decimal.Zero) + report.Summary.PublicConsumptionCritical = decimal.NewNullDecimal(decimal.Zero) + report.Summary.PublicConsumptionPeak = decimal.NewNullDecimal(decimal.Zero) + report.Summary.PublicConsumptionFlat = decimal.NewNullDecimal(decimal.Zero) + report.Summary.PublicConsumptionValley = decimal.NewNullDecimal(decimal.Zero) + report.Summary.CustomerConsumption = decimal.NewNullDecimal(decimal.Zero) + report.Summary.CustomerConsumptionCritical = decimal.NewNullDecimal(decimal.Zero) + report.Summary.CustomerConsumptionPeak = decimal.NewNullDecimal(decimal.Zero) + report.Summary.CustomerConsumptionFlat = decimal.NewNullDecimal(decimal.Zero) + report.Summary.CustomerConsumptionValley = decimal.NewNullDecimal(decimal.Zero) + for _, eu := range report.EndUsers { eu.OverallFee = decimal.NewNullDecimal( - eu.Overall.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + eu.Overall.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) eu.CriticalFee = decimal.NewNullDecimal( - eu.Critical.Decimal.Mul(summary.CriticalPrice.Decimal).RoundBank(2), + eu.Critical.Decimal.Mul(report.Summary.CriticalPrice.Decimal).RoundBank(2), ) eu.PeakFee = decimal.NewNullDecimal( - eu.Peak.Decimal.Mul(summary.PeakPrice.Decimal).RoundBank(2), + eu.Peak.Decimal.Mul(report.Summary.PeakPrice.Decimal).RoundBank(2), ) eu.FlatFee = decimal.NewNullDecimal( - eu.Flat.Decimal.Mul(summary.FlatPrice.Decimal).RoundBank(2), + eu.Flat.Decimal.Mul(report.Summary.FlatPrice.Decimal).RoundBank(2), ) eu.ValleyFee = decimal.NewNullDecimal( - eu.Valley.Decimal.Mul(summary.ValleyPrice.Decimal).RoundBank(2), + eu.Valley.Decimal.Mul(report.Summary.ValleyPrice.Decimal).RoundBank(2), ) if eu.IsPublicMeter && eu.WillDilute { - summary.PublicConsumption.Decimal = summary.PublicConsumption.Decimal.Add(eu.Overall.Decimal) - summary.PublicConsumptionCritical.Decimal = summary.PublicConsumptionCritical.Decimal.Add(eu.Critical.Decimal) - summary.PublicConsumptionPeak.Decimal = summary.PublicConsumptionPeak.Decimal.Add(eu.Peak.Decimal) - summary.PublicConsumptionFlat.Decimal = summary.PublicConsumptionFlat.Decimal.Add(eu.Flat.Decimal) - summary.PublicConsumptionValley.Decimal = summary.PublicConsumptionValley.Decimal.Add(eu.Valley.Decimal) + report.Summary.PublicConsumption.Decimal = report.Summary.PublicConsumption.Decimal.Add(eu.Overall.Decimal) + report.Summary.PublicConsumptionCritical.Decimal = report.Summary.PublicConsumptionCritical.Decimal.Add(eu.Critical.Decimal) + report.Summary.PublicConsumptionPeak.Decimal = report.Summary.PublicConsumptionPeak.Decimal.Add(eu.Peak.Decimal) + report.Summary.PublicConsumptionFlat.Decimal = report.Summary.PublicConsumptionFlat.Decimal.Add(eu.Flat.Decimal) + report.Summary.PublicConsumptionValley.Decimal = report.Summary.PublicConsumptionValley.Decimal.Add(eu.Valley.Decimal) } else { - summary.CustomerConsumption.Decimal = summary.CustomerConsumption.Decimal.Add(eu.Overall.Decimal) - summary.CustomerConsumptionCritical.Decimal = summary.CustomerConsumptionCritical.Decimal.Add(eu.Critical.Decimal) - summary.CustomerConsumptionPeak.Decimal = summary.CustomerConsumptionPeak.Decimal.Add(eu.Peak.Decimal) - summary.CustomerConsumptionFlat.Decimal = summary.CustomerConsumptionFlat.Decimal.Add(eu.Flat.Decimal) - summary.CustomerConsumptionValley.Decimal = summary.CustomerConsumptionValley.Decimal.Add(eu.Valley.Decimal) + report.Summary.CustomerConsumption.Decimal = report.Summary.CustomerConsumption.Decimal.Add(eu.Overall.Decimal) + report.Summary.CustomerConsumptionCritical.Decimal = report.Summary.CustomerConsumptionCritical.Decimal.Add(eu.Critical.Decimal) + report.Summary.CustomerConsumptionPeak.Decimal = report.Summary.CustomerConsumptionPeak.Decimal.Add(eu.Peak.Decimal) + report.Summary.CustomerConsumptionFlat.Decimal = report.Summary.CustomerConsumptionFlat.Decimal.Add(eu.Flat.Decimal) + report.Summary.CustomerConsumptionValley.Decimal = report.Summary.CustomerConsumptionValley.Decimal.Add(eu.Valley.Decimal) } } // 计算户表总电费和公共总电费以及相应的摊薄 - if reportIndex.SubmeterType == model.CUSTOMER_METER_NON_PV { - summary.CustomerConsumptionFee = decimal.NewNullDecimal( - summary.CustomerConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + if report.SubmeterType == model.CUSTOMER_METER_NON_PV { + report.Summary.CustomerConsumptionFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal( - summary.CustomerConsumptionCritical.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionCritical.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal( - summary.CustomerConsumptionPeak.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionPeak.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal( - summary.CustomerConsumptionFlat.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionFlat.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal( - summary.CustomerConsumptionValley.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionValley.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionFee = decimal.NewNullDecimal( - summary.PublicConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionFee = decimal.NewNullDecimal( + report.Summary.PublicConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal( - summary.PublicConsumptionCritical.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionCritical.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionPeakFee = decimal.NewNullDecimal( - summary.PublicConsumptionPeak.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionPeakFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionPeak.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionFlatFee = decimal.NewNullDecimal( - summary.PublicConsumptionFlat.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionFlatFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionFlat.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionValleyFee = decimal.NewNullDecimal( - summary.PublicConsumptionValley.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionValleyFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionValley.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) } - if reportIndex.SubmeterType == model.CUSTOMER_METER_PV { - summary.CustomerConsumptionFee = decimal.NewNullDecimal( - summary.CustomerConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + if report.SubmeterType == model.CUSTOMER_METER_PV { + report.Summary.CustomerConsumptionFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal( - summary.CustomerConsumptionCritical.Decimal.Mul(summary.CriticalPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionCritical.Decimal.Mul(report.Summary.CriticalPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal( - summary.CustomerConsumptionPeak.Decimal.Mul(summary.PeakPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionPeak.Decimal.Mul(report.Summary.PeakPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal( - summary.CustomerConsumptionFlat.Decimal.Mul(summary.FlatPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionFlat.Decimal.Mul(report.Summary.FlatPrice.Decimal).RoundBank(2), ) - summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal( - summary.CustomerConsumptionValley.Decimal.Mul(summary.ValleyPrice.Decimal).RoundBank(2), + report.Summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal( + report.Summary.CustomerConsumptionValley.Decimal.Mul(report.Summary.ValleyPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionFee = decimal.NewNullDecimal( - summary.PublicConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionFee = decimal.NewNullDecimal( + report.Summary.PublicConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal( - summary.PublicConsumptionCritical.Decimal.Mul(summary.CriticalPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionCritical.Decimal.Mul(report.Summary.CriticalPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionPeakFee = decimal.NewNullDecimal( - summary.PublicConsumptionPeak.Decimal.Mul(summary.PeakPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionPeakFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionPeak.Decimal.Mul(report.Summary.PeakPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionFlatFee = decimal.NewNullDecimal( - summary.PublicConsumptionFlat.Decimal.Mul(summary.FlatPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionFlatFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionFlat.Decimal.Mul(report.Summary.FlatPrice.Decimal).RoundBank(2), ) - summary.PublicConsumptionValleyFee = decimal.NewNullDecimal( - summary.PublicConsumptionValley.Decimal.Mul(summary.ValleyPrice.Decimal).RoundBank(2), + report.Summary.PublicConsumptionValleyFee = decimal.NewNullDecimal( + report.Summary.PublicConsumptionValley.Decimal.Mul(report.Summary.ValleyPrice.Decimal).RoundBank(2), ) } - if summary.Overall.Abs().GreaterThan(decimal.Zero) { - summary.PublicConsumptionProportion = decimal.NewNullDecimal( - summary.PublicConsumption.Decimal.Div(summary.Overall).RoundBank(15), + if report.Summary.Overall.Abs().GreaterThan(decimal.Zero) { + report.Summary.PublicConsumptionProportion = decimal.NewNullDecimal( + report.Summary.PublicConsumption.Decimal.Div(report.Summary.Overall).RoundBank(15), ) } // 计算线损 - summary.Loss = decimal.NewNullDecimal( - summary.Overall.Sub(summary.PublicConsumption.Decimal).Sub(summary.CustomerConsumption.Decimal), + report.Summary.Loss = decimal.NewNullDecimal( + report.Summary.Overall.Sub(report.Summary.PublicConsumption.Decimal).Sub(report.Summary.CustomerConsumption.Decimal), ) - summary.LossFee = decimal.NewNullDecimal( - summary.Loss.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(8), + report.Summary.LossFee = decimal.NewNullDecimal( + report.Summary.Loss.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(8), ) - if summary.Overall.Abs().GreaterThan(decimal.Zero) { - summary.LossProportion = decimal.NewNullDecimal( - summary.Loss.Decimal.Div(summary.Overall).RoundBank(15), + if report.Summary.Overall.Abs().GreaterThan(decimal.Zero) { + report.Summary.LossProportion = decimal.NewNullDecimal( + report.Summary.Loss.Decimal.Div(report.Summary.Overall).RoundBank(15), ) } - if summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { - summary.LossDilutedPrice = decimal.NewNullDecimal( - summary.LossFee.Decimal.Div(summary.CustomerConsumption.Decimal).RoundBank(8), + if report.Summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { + report.Summary.LossDilutedPrice = decimal.NewNullDecimal( + report.Summary.LossFee.Decimal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8), ) } // 计算基本电费和调整电费等的摊薄 - if summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { - summary.BasicDilutedPrice = decimal.NewNullDecimal( - summary.BasicFee.Div(summary.CustomerConsumption.Decimal).RoundBank(8), + if report.Summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { + report.Summary.BasicDilutedPrice = decimal.NewNullDecimal( + report.Summary.BasicFee.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8), ) - summary.AdjustDilutedPrice = decimal.NewNullDecimal( - summary.AdjustFee.Div(summary.CustomerConsumption.Decimal).RoundBank(8), + report.Summary.AdjustDilutedPrice = decimal.NewNullDecimal( + report.Summary.AdjustFee.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8), ) - summary.MaintenanceDilutedPrice = decimal.NewNullDecimal( - maintenanceFeeTotal.Div(summary.CustomerConsumption.Decimal).RoundBank(8), + report.Summary.MaintenanceDilutedPrice = decimal.NewNullDecimal( + maintenanceFeeTotal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8), ) - summary.PublicConsumptionDilutedPrice = decimal.NewNullDecimal( - summary.PublicConsumptionFee.Decimal.Div(summary.CustomerConsumption.Decimal).RoundBank(8), + report.Summary.PublicConsumptionDilutedPrice = decimal.NewNullDecimal( + report.Summary.PublicConsumptionFee.Decimal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8), ) } // 计算摊薄总计 - summary.MaintenanceOverall = decimal.NewNullDecimal(maintenanceFeeTotal) - summary.FinalDilutedOverall = decimal.NewNullDecimal( - summary.BasicFee. - Add(summary.AdjustFee). - Add(summary.PublicConsumptionFee.Decimal). + report.Summary.MaintenanceOverall = decimal.NewNullDecimal(maintenanceFeeTotal) + report.Summary.FinalDilutedOverall = decimal.NewNullDecimal( + report.Summary.BasicFee. + Add(report.Summary.AdjustFee). + Add(report.Summary.PublicConsumptionFee.Decimal). Add(maintenanceFeeTotal). - Add(summary.LossFee.Decimal), + Add(report.Summary.LossFee.Decimal), ) // 计算终端用户的全部摊薄内容 - for _, eu := range endUserDetails { + for _, eu := range report.EndUsers { if eu.IsPublicMeter && eu.WillDilute { // 计算需要摊薄的公共表计的摊薄内容 - if summary.PublicConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { - eu.OverallProportion = eu.Overall.Decimal.Div(summary.PublicConsumption.Decimal).RoundBank(15) + if report.Summary.PublicConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { + eu.OverallProportion = eu.Overall.Decimal.Div(report.Summary.PublicConsumption.Decimal).RoundBank(15) } else { eu.OverallProportion = decimal.Zero } } else { // 计算户表表计的摊薄内容 - if summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { - eu.OverallProportion = eu.Overall.Decimal.Div(summary.CustomerConsumption.Decimal).RoundBank(15) + if report.Summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { + eu.OverallProportion = eu.Overall.Decimal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(15) } else { eu.OverallProportion = decimal.Zero } eu.BasicFeeDiluted = decimal.NewNullDecimal( - eu.Overall.Decimal.Mul(summary.BasicDilutedPrice.Decimal).RoundBank(2), + eu.Overall.Decimal.Mul(report.Summary.BasicDilutedPrice.Decimal).RoundBank(2), ) eu.AdjustFeeDiluted = decimal.NewNullDecimal( - eu.Overall.Decimal.Mul(summary.AdjustDilutedPrice.Decimal).RoundBank(2), + eu.Overall.Decimal.Mul(report.Summary.AdjustDilutedPrice.Decimal).RoundBank(2), ) eu.LossDiluted = decimal.NewNullDecimal( - summary.Loss.Decimal.Mul(eu.OverallProportion).RoundBank(8), + report.Summary.Loss.Decimal.Mul(eu.OverallProportion).RoundBank(8), ) eu.LossFeeDiluted = decimal.NewNullDecimal( - eu.Overall.Decimal.Mul(summary.LossDilutedPrice.Decimal).RoundBank(8), + eu.Overall.Decimal.Mul(report.Summary.LossDilutedPrice.Decimal).RoundBank(8), ) eu.MaintenanceFeeDiluted = decimal.NewNullDecimal( - eu.Overall.Decimal.Mul(summary.MaintenanceDilutedPrice.Decimal).RoundBank(8), + eu.Overall.Decimal.Mul(report.Summary.MaintenanceDilutedPrice.Decimal).RoundBank(8), ) eu.PublicConsumptionDiluted = decimal.NewNullDecimal( - eu.Overall.Decimal.Mul(summary.PublicConsumptionDilutedPrice.Decimal).RoundBank(8), + eu.Overall.Decimal.Mul(report.Summary.PublicConsumptionDilutedPrice.Decimal).RoundBank(8), ) eu.FinalDiluted = decimal.NewNullDecimal( eu.BasicFeeDiluted.Decimal. @@ -254,19 +246,18 @@ func (_CalculateService) ComprehensivelyCalculateReport(reportId string) (err er } // 向数据库保存报表概况以及终端用户摊薄结果 - tx := global.DBConn.NewSession() - if err = tx.Begin(); err != nil { + tx, err := global.DB.BeginTx(ctx, &sql.TxOptions{}) + if err != nil { return } - defer tx.Close() - _, err = tx.ID(reportId).Update(summary) + _, err = tx.NewUpdate().Model(report.Summary).WherePK().Exec(ctx) if err != nil { tx.Rollback() return } - for _, eu := range endUserDetails { - _, err = tx.ID(schemas.NewPK(eu.ReportId, eu.ParkId, eu.MeterId)).Update(eu) + for _, eu := range report.EndUsers { + _, err = tx.NewUpdate().Model(eu).WherePK().Exec(ctx) if err != nil { tx.Rollback() return @@ -278,6 +269,6 @@ func (_CalculateService) ComprehensivelyCalculateReport(reportId string) (err er tx.Rollback() return } - cache.AbolishRelation(fmt.Sprintf("publicity_%s", reportId)) + cache.AbolishRelation(fmt.Sprintf("publicity:%s", reportId)) return }