refactor(calculate):报表计算服务基本完成迁移。

This commit is contained in:
徐涛 2022-09-17 21:31:37 +08:00
parent 805911f72b
commit 60d2db6cdd

View File

@ -1,6 +1,7 @@
package service package service
import ( import (
"database/sql"
"electricity_bill_calc/cache" "electricity_bill_calc/cache"
"electricity_bill_calc/exceptions" "electricity_bill_calc/exceptions"
"electricity_bill_calc/global" "electricity_bill_calc/global"
@ -8,8 +9,6 @@ import (
"fmt" "fmt"
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"xorm.io/builder"
"xorm.io/xorm/schemas"
) )
type _CalculateService struct{} type _CalculateService struct{}
@ -17,227 +16,220 @@ type _CalculateService struct{}
var CalculateService _CalculateService var CalculateService _CalculateService
func (_CalculateService) ComprehensivelyCalculateReport(reportId string) (err error) { func (_CalculateService) ComprehensivelyCalculateReport(reportId string) (err error) {
ctx, cancel := global.TimeoutContext(12)
defer cancel()
// 资料准备 // 资料准备
var reportIndex = new(model.Report) var report *model.Report
has, err := global.DBConn.ID(reportId).NoAutoCondition().Get(reportIndex) err = global.DB.NewSelect().Model(report).
if err != nil || !has { Relation("Summary").
Relation("WillDilutedFees").
Relation("EndUsers").
Where("r.id = ?", reportId).
Scan(ctx)
if err != nil || report == nil {
return exceptions.NewNotFoundErrorFromError("未找到指定的公示报表", err) 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) maintenanceFeeTotal := decimal.NewFromInt(0)
for _, m := range maintenanceFeeRecords { for _, m := range report.WillDilutedFees {
maintenanceFeeTotal = maintenanceFeeTotal.Add(m.Fee) maintenanceFeeTotal = maintenanceFeeTotal.Add(m.Fee)
} }
// 计算终端用户信息与概览中的合计 // 计算终端用户信息与概览中的合计
summary.PublicConsumption = decimal.NewNullDecimal(decimal.Zero) report.Summary.PublicConsumption = decimal.NewNullDecimal(decimal.Zero)
summary.PublicConsumptionCritical = decimal.NewNullDecimal(decimal.Zero) report.Summary.PublicConsumptionCritical = decimal.NewNullDecimal(decimal.Zero)
summary.PublicConsumptionPeak = decimal.NewNullDecimal(decimal.Zero) report.Summary.PublicConsumptionPeak = decimal.NewNullDecimal(decimal.Zero)
summary.PublicConsumptionFlat = decimal.NewNullDecimal(decimal.Zero) report.Summary.PublicConsumptionFlat = decimal.NewNullDecimal(decimal.Zero)
summary.PublicConsumptionValley = decimal.NewNullDecimal(decimal.Zero) report.Summary.PublicConsumptionValley = decimal.NewNullDecimal(decimal.Zero)
summary.CustomerConsumption = decimal.NewNullDecimal(decimal.Zero) report.Summary.CustomerConsumption = decimal.NewNullDecimal(decimal.Zero)
summary.CustomerConsumptionCritical = decimal.NewNullDecimal(decimal.Zero) report.Summary.CustomerConsumptionCritical = decimal.NewNullDecimal(decimal.Zero)
summary.CustomerConsumptionPeak = decimal.NewNullDecimal(decimal.Zero) report.Summary.CustomerConsumptionPeak = decimal.NewNullDecimal(decimal.Zero)
summary.CustomerConsumptionFlat = decimal.NewNullDecimal(decimal.Zero) report.Summary.CustomerConsumptionFlat = decimal.NewNullDecimal(decimal.Zero)
summary.CustomerConsumptionValley = decimal.NewNullDecimal(decimal.Zero) report.Summary.CustomerConsumptionValley = decimal.NewNullDecimal(decimal.Zero)
for _, eu := range endUserDetails { for _, eu := range report.EndUsers {
eu.OverallFee = decimal.NewNullDecimal( 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.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.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.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.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 { if eu.IsPublicMeter && eu.WillDilute {
summary.PublicConsumption.Decimal = summary.PublicConsumption.Decimal.Add(eu.Overall.Decimal) report.Summary.PublicConsumption.Decimal = report.Summary.PublicConsumption.Decimal.Add(eu.Overall.Decimal)
summary.PublicConsumptionCritical.Decimal = summary.PublicConsumptionCritical.Decimal.Add(eu.Critical.Decimal) report.Summary.PublicConsumptionCritical.Decimal = report.Summary.PublicConsumptionCritical.Decimal.Add(eu.Critical.Decimal)
summary.PublicConsumptionPeak.Decimal = summary.PublicConsumptionPeak.Decimal.Add(eu.Peak.Decimal) report.Summary.PublicConsumptionPeak.Decimal = report.Summary.PublicConsumptionPeak.Decimal.Add(eu.Peak.Decimal)
summary.PublicConsumptionFlat.Decimal = summary.PublicConsumptionFlat.Decimal.Add(eu.Flat.Decimal) report.Summary.PublicConsumptionFlat.Decimal = report.Summary.PublicConsumptionFlat.Decimal.Add(eu.Flat.Decimal)
summary.PublicConsumptionValley.Decimal = summary.PublicConsumptionValley.Decimal.Add(eu.Valley.Decimal) report.Summary.PublicConsumptionValley.Decimal = report.Summary.PublicConsumptionValley.Decimal.Add(eu.Valley.Decimal)
} else { } else {
summary.CustomerConsumption.Decimal = summary.CustomerConsumption.Decimal.Add(eu.Overall.Decimal) report.Summary.CustomerConsumption.Decimal = report.Summary.CustomerConsumption.Decimal.Add(eu.Overall.Decimal)
summary.CustomerConsumptionCritical.Decimal = summary.CustomerConsumptionCritical.Decimal.Add(eu.Critical.Decimal) report.Summary.CustomerConsumptionCritical.Decimal = report.Summary.CustomerConsumptionCritical.Decimal.Add(eu.Critical.Decimal)
summary.CustomerConsumptionPeak.Decimal = summary.CustomerConsumptionPeak.Decimal.Add(eu.Peak.Decimal) report.Summary.CustomerConsumptionPeak.Decimal = report.Summary.CustomerConsumptionPeak.Decimal.Add(eu.Peak.Decimal)
summary.CustomerConsumptionFlat.Decimal = summary.CustomerConsumptionFlat.Decimal.Add(eu.Flat.Decimal) report.Summary.CustomerConsumptionFlat.Decimal = report.Summary.CustomerConsumptionFlat.Decimal.Add(eu.Flat.Decimal)
summary.CustomerConsumptionValley.Decimal = summary.CustomerConsumptionValley.Decimal.Add(eu.Valley.Decimal) report.Summary.CustomerConsumptionValley.Decimal = report.Summary.CustomerConsumptionValley.Decimal.Add(eu.Valley.Decimal)
} }
} }
// 计算户表总电费和公共总电费以及相应的摊薄 // 计算户表总电费和公共总电费以及相应的摊薄
if reportIndex.SubmeterType == model.CUSTOMER_METER_NON_PV { if report.SubmeterType == model.CUSTOMER_METER_NON_PV {
summary.CustomerConsumptionFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionFee = decimal.NewNullDecimal(
summary.CustomerConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal(
summary.CustomerConsumptionCritical.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionCritical.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal(
summary.CustomerConsumptionPeak.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionPeak.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal(
summary.CustomerConsumptionFlat.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionFlat.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal(
summary.CustomerConsumptionValley.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionValley.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionFee = decimal.NewNullDecimal(
summary.PublicConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.PublicConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal(
summary.PublicConsumptionCritical.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionCritical.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionPeakFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionPeakFee = decimal.NewNullDecimal(
summary.PublicConsumptionPeak.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionPeak.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionFlatFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionFlatFee = decimal.NewNullDecimal(
summary.PublicConsumptionFlat.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionFlat.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionValleyFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionValleyFee = decimal.NewNullDecimal(
summary.PublicConsumptionValley.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionValley.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
} }
if reportIndex.SubmeterType == model.CUSTOMER_METER_PV { if report.SubmeterType == model.CUSTOMER_METER_PV {
summary.CustomerConsumptionFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionFee = decimal.NewNullDecimal(
summary.CustomerConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionCriticalFee = decimal.NewNullDecimal(
summary.CustomerConsumptionCritical.Decimal.Mul(summary.CriticalPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionCritical.Decimal.Mul(report.Summary.CriticalPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionPeakFee = decimal.NewNullDecimal(
summary.CustomerConsumptionPeak.Decimal.Mul(summary.PeakPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionPeak.Decimal.Mul(report.Summary.PeakPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionFlatFee = decimal.NewNullDecimal(
summary.CustomerConsumptionFlat.Decimal.Mul(summary.FlatPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionFlat.Decimal.Mul(report.Summary.FlatPrice.Decimal).RoundBank(2),
) )
summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal( report.Summary.CustomerConsumptionValleyFee = decimal.NewNullDecimal(
summary.CustomerConsumptionValley.Decimal.Mul(summary.ValleyPrice.Decimal).RoundBank(2), report.Summary.CustomerConsumptionValley.Decimal.Mul(report.Summary.ValleyPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionFee = decimal.NewNullDecimal(
summary.PublicConsumption.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(2), report.Summary.PublicConsumption.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionCriticalFee = decimal.NewNullDecimal(
summary.PublicConsumptionCritical.Decimal.Mul(summary.CriticalPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionCritical.Decimal.Mul(report.Summary.CriticalPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionPeakFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionPeakFee = decimal.NewNullDecimal(
summary.PublicConsumptionPeak.Decimal.Mul(summary.PeakPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionPeak.Decimal.Mul(report.Summary.PeakPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionFlatFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionFlatFee = decimal.NewNullDecimal(
summary.PublicConsumptionFlat.Decimal.Mul(summary.FlatPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionFlat.Decimal.Mul(report.Summary.FlatPrice.Decimal).RoundBank(2),
) )
summary.PublicConsumptionValleyFee = decimal.NewNullDecimal( report.Summary.PublicConsumptionValleyFee = decimal.NewNullDecimal(
summary.PublicConsumptionValley.Decimal.Mul(summary.ValleyPrice.Decimal).RoundBank(2), report.Summary.PublicConsumptionValley.Decimal.Mul(report.Summary.ValleyPrice.Decimal).RoundBank(2),
) )
} }
if summary.Overall.Abs().GreaterThan(decimal.Zero) { if report.Summary.Overall.Abs().GreaterThan(decimal.Zero) {
summary.PublicConsumptionProportion = decimal.NewNullDecimal( report.Summary.PublicConsumptionProportion = decimal.NewNullDecimal(
summary.PublicConsumption.Decimal.Div(summary.Overall).RoundBank(15), report.Summary.PublicConsumption.Decimal.Div(report.Summary.Overall).RoundBank(15),
) )
} }
// 计算线损 // 计算线损
summary.Loss = decimal.NewNullDecimal( report.Summary.Loss = decimal.NewNullDecimal(
summary.Overall.Sub(summary.PublicConsumption.Decimal).Sub(summary.CustomerConsumption.Decimal), report.Summary.Overall.Sub(report.Summary.PublicConsumption.Decimal).Sub(report.Summary.CustomerConsumption.Decimal),
) )
summary.LossFee = decimal.NewNullDecimal( report.Summary.LossFee = decimal.NewNullDecimal(
summary.Loss.Decimal.Mul(summary.OverallPrice.Decimal).RoundBank(8), report.Summary.Loss.Decimal.Mul(report.Summary.OverallPrice.Decimal).RoundBank(8),
) )
if summary.Overall.Abs().GreaterThan(decimal.Zero) { if report.Summary.Overall.Abs().GreaterThan(decimal.Zero) {
summary.LossProportion = decimal.NewNullDecimal( report.Summary.LossProportion = decimal.NewNullDecimal(
summary.Loss.Decimal.Div(summary.Overall).RoundBank(15), report.Summary.Loss.Decimal.Div(report.Summary.Overall).RoundBank(15),
) )
} }
if summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { if report.Summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) {
summary.LossDilutedPrice = decimal.NewNullDecimal( report.Summary.LossDilutedPrice = decimal.NewNullDecimal(
summary.LossFee.Decimal.Div(summary.CustomerConsumption.Decimal).RoundBank(8), report.Summary.LossFee.Decimal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8),
) )
} }
// 计算基本电费和调整电费等的摊薄 // 计算基本电费和调整电费等的摊薄
if summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { if report.Summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) {
summary.BasicDilutedPrice = decimal.NewNullDecimal( report.Summary.BasicDilutedPrice = decimal.NewNullDecimal(
summary.BasicFee.Div(summary.CustomerConsumption.Decimal).RoundBank(8), report.Summary.BasicFee.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8),
) )
summary.AdjustDilutedPrice = decimal.NewNullDecimal( report.Summary.AdjustDilutedPrice = decimal.NewNullDecimal(
summary.AdjustFee.Div(summary.CustomerConsumption.Decimal).RoundBank(8), report.Summary.AdjustFee.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8),
) )
summary.MaintenanceDilutedPrice = decimal.NewNullDecimal( report.Summary.MaintenanceDilutedPrice = decimal.NewNullDecimal(
maintenanceFeeTotal.Div(summary.CustomerConsumption.Decimal).RoundBank(8), maintenanceFeeTotal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8),
) )
summary.PublicConsumptionDilutedPrice = decimal.NewNullDecimal( report.Summary.PublicConsumptionDilutedPrice = decimal.NewNullDecimal(
summary.PublicConsumptionFee.Decimal.Div(summary.CustomerConsumption.Decimal).RoundBank(8), report.Summary.PublicConsumptionFee.Decimal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(8),
) )
} }
// 计算摊薄总计 // 计算摊薄总计
summary.MaintenanceOverall = decimal.NewNullDecimal(maintenanceFeeTotal) report.Summary.MaintenanceOverall = decimal.NewNullDecimal(maintenanceFeeTotal)
summary.FinalDilutedOverall = decimal.NewNullDecimal( report.Summary.FinalDilutedOverall = decimal.NewNullDecimal(
summary.BasicFee. report.Summary.BasicFee.
Add(summary.AdjustFee). Add(report.Summary.AdjustFee).
Add(summary.PublicConsumptionFee.Decimal). Add(report.Summary.PublicConsumptionFee.Decimal).
Add(maintenanceFeeTotal). 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 eu.IsPublicMeter && eu.WillDilute {
// 计算需要摊薄的公共表计的摊薄内容 // 计算需要摊薄的公共表计的摊薄内容
if summary.PublicConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { if report.Summary.PublicConsumption.Decimal.Abs().GreaterThan(decimal.Zero) {
eu.OverallProportion = eu.Overall.Decimal.Div(summary.PublicConsumption.Decimal).RoundBank(15) eu.OverallProportion = eu.Overall.Decimal.Div(report.Summary.PublicConsumption.Decimal).RoundBank(15)
} else { } else {
eu.OverallProportion = decimal.Zero eu.OverallProportion = decimal.Zero
} }
} else { } else {
// 计算户表表计的摊薄内容 // 计算户表表计的摊薄内容
if summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) { if report.Summary.CustomerConsumption.Decimal.Abs().GreaterThan(decimal.Zero) {
eu.OverallProportion = eu.Overall.Decimal.Div(summary.CustomerConsumption.Decimal).RoundBank(15) eu.OverallProportion = eu.Overall.Decimal.Div(report.Summary.CustomerConsumption.Decimal).RoundBank(15)
} else { } else {
eu.OverallProportion = decimal.Zero eu.OverallProportion = decimal.Zero
} }
eu.BasicFeeDiluted = decimal.NewNullDecimal( 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.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( 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.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.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.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.FinalDiluted = decimal.NewNullDecimal(
eu.BasicFeeDiluted.Decimal. eu.BasicFeeDiluted.Decimal.
@ -254,19 +246,18 @@ func (_CalculateService) ComprehensivelyCalculateReport(reportId string) (err er
} }
// 向数据库保存报表概况以及终端用户摊薄结果 // 向数据库保存报表概况以及终端用户摊薄结果
tx := global.DBConn.NewSession() tx, err := global.DB.BeginTx(ctx, &sql.TxOptions{})
if err = tx.Begin(); err != nil { if err != nil {
return return
} }
defer tx.Close()
_, err = tx.ID(reportId).Update(summary) _, err = tx.NewUpdate().Model(report.Summary).WherePK().Exec(ctx)
if err != nil { if err != nil {
tx.Rollback() tx.Rollback()
return return
} }
for _, eu := range endUserDetails { for _, eu := range report.EndUsers {
_, err = tx.ID(schemas.NewPK(eu.ReportId, eu.ParkId, eu.MeterId)).Update(eu) _, err = tx.NewUpdate().Model(eu).WherePK().Exec(ctx)
if err != nil { if err != nil {
tx.Rollback() tx.Rollback()
return return
@ -278,6 +269,6 @@ func (_CalculateService) ComprehensivelyCalculateReport(reportId string) (err er
tx.Rollback() tx.Rollback()
return return
} }
cache.AbolishRelation(fmt.Sprintf("publicity_%s", reportId)) cache.AbolishRelation(fmt.Sprintf("publicity:%s", reportId))
return return
} }