package calculate import ( "electricity_bill_calc/global" "electricity_bill_calc/model/calculate" "electricity_bill_calc/repository" "fmt" ) func MainCalculateProcess(rid string) error { report, err := repository.ReportRepository.GetReportIndex(rid) if err != nil { fmt.Println("1", err.Error()+"指定报表不存在") return err } reportSummary, err := repository.ReportRepository.RetrieveReportSummary(rid) if err != nil { fmt.Println("2", err.Error()+"指定报表的基本电量电费数据不存在") return err } summary := calculate.FromReportSummary(reportSummary, report) periodStart := report.Period.SafeLower() periodEnd := report.Period.SafeUpper() meterDetails, err := repository.MeterRepository.AllUsedMetersInReport(report.Id) if err != nil { fmt.Println("3", err) return err } meterRelations, err := repository.CalculateRepository.GetAllPoolingMeterRelations(report.Park, periodStart.Time) if err != nil { fmt.Println("4", err) return err } _, err = CheckMeterArea(report, meterDetails) if err != nil { fmt.Println("5", err) return err } // 寻找每一个商户的所有表计读数,然后对分配到各个商户的表计读数进行初步的计算. tenementReports, err := TenementMetersCalculate(report, periodStart.Time, periodEnd.Time, meterDetails, summary) if err != nil { fmt.Println("6", err) return err } // 取得所有公摊表计的读数,以及公摊表计对应的分摊表计 poolingMetersReports, err := PooledMetersCalculate(report, periodStart.Time, periodEnd.Time, meterDetails, summary) if err != nil { fmt.Println("7", err) return err } // 获取所有的物业表计,然后对所有的物业表计电量进行计算。 parkMetersReports, err := MetersParkCalculate(*report, periodStart.Time, periodEnd.Time, meterDetails, summary) if err != nil { fmt.Println("8", err) return err } // 计算所有表计的总电量 parkTotal := TotalConsumptionCalculate(tenementReports, summary) // 计算线损以及调整线损 err = LossCalculate(report, &parkMetersReports, &parkTotal, &summary) if err != nil { fmt.Println("9", err) return err } // 计算所有已经启用的商铺面积总和,仅计算所有未迁出的商户的所有表计对应的商铺面积。 _, err = EnabledAreaCalculate(&tenementReports, &summary) if err != nil { fmt.Println("10", err) return err } err = CalculatePrices(&summary) if err != nil { fmt.Println("11", err) return err } //=========================================================================== // 计算基本电费分摊、调整电费分摊、电费摊薄单价。 err = CalculatePrices(&summary) // 收集目前所有已经处理的表计,统一对其进行摊薄计算。 meters, err := CollectMeters(tenementReports, poolingMetersReports, parkMetersReports) if err != nil { fmt.Println("12", err) return err } // 计算商户的合计电费信息,并归总与商户相关联的表计记录 tenementCharges := TenementChargeCalculate(tenementReports, summary, meters) // 根据核算报表中设置的摊薄内容,逐个表计进行计算 err = CalculateBasicPooling(report, &summary, &meters) if err != nil { fmt.Println("13", err) return err } err = CalculateAdjustPooling(*report, summary, meters) if err != nil { fmt.Println("14", err) return err } err = CalculateLossPooling(*report, summary, meters) if err != nil { fmt.Println("15", err) return err } // 计算所有商户类型表计的全周期电量,并根据全周期电量计算共用过同一表计的商户的二次分摊比例。 _, err = CalculateTenementConsumptions(meters) if err != nil { fmt.Println("16", err) return err } err = CalculateTenementPoolings(*report, summary, meters, meterRelations) if err != nil { fmt.Println("17", err) return err } // 计算商户的合计电费信息,并归总与商户相关联的表计记录 tenementCharges = TenementChargeCalculate(tenementReports, summary, meters) // 从此处开始向数据库保存全部计算结果。 ctx, cancel := global.TimeoutContext() defer cancel() tx, _ := global.DB.Begin(ctx) err = repository.CalculateRepository.ClearReportContent(tx, report.Id) if err != nil { tx.Rollback(ctx) fmt.Println("18", err) return err } err = SaveSummary(tx, summary) if err != nil { tx.Rollback(ctx) fmt.Println("19", err) return err } err = SavePublics(tx, *report, meters) if err != nil { tx.Rollback(ctx) fmt.Println("20", err) return err } err = SavePoolings(tx, *report, meters, meterRelations) if err != nil { tx.Rollback(ctx) fmt.Println("21", err) return err } err = SaveTenements(tx, *report, tenementReports, tenementCharges) if err != nil { tx.Rollback(ctx) fmt.Println("22", err) return err } tx.Commit(ctx) return nil }