package calculate import ( "electricity_bill_calc/global" "electricity_bill_calc/repository" "github.com/doug-martin/goqu/v9" ) type _ModService struct { ds goqu.DialectWrapper } var ModService = _ModService{ ds: goqu.Dialect("postgres"), } func mainCalculateProcess(rid string) error { // 计算所有已经启用的商铺面积总和,仅计算所有未迁出的商户的所有表计对应的商铺面积。 err := CalculateEnabledArea(tenementreports, &summary) // 计算基本电费分摊、调整电费分摊、电费摊薄单价。 err = CalculatePrices(&summary) // 收集目前所有已经处理的表计,统一对其进行摊薄计算。 collectMeters, err := CollectMeters(tenementreports, poolingmetersreports, parkmetersreports) meters, err := collectMeters, err if err != nil { return err } // 根据核算报表中设置的摊薄内容,逐个表计进行计算 CalculateBasicPooling(report, summary, meters) CalculateAdjustPooling(report, summary, meters) CalculateLossPooling(report, summary, meters) // 计算所有商户类型表计的全周期电量,并根据全周期电量计算共用过同一表计的商户的二次分摊比例。 CalculateTenementConsumptions(meters) CalculateTenementPoolings(report, summary, meters, metersrelations) // 计算商户的合计电费信息,并归总与商户相关联的表计记录 tenementCharges, err := CalculateTenementCharge(tenementReports, summary, meters, meterRelations) if err != nil { // 处理错误 } // 从此处开始向数据库保存全部计算结果。 ctx, cancel := global.TimeoutContext() defer cancel() tx, _ := global.DB.Begin(ctx) err = repository.CalculateRepository.ClearReportContent(tx, report.Id) if err != nil { tx.Rollback(ctx) return err } err = SaveSummary(tx, summary) if err != nil { tx.Rollback(ctx) return err } err = SavePublics(tx, report, meters) if err != nil { tx.Rollback(ctx) return err } err = SavePoolings(tx) if err != nil { tx.Rollback(ctx) return err } err = SaveTenements(tx) if err != nil { tx.Rollback(ctx) return err } tx.Commit(ctx) }