fix(#10):修复创建报表错误,但查出列出园区bug

This commit is contained in:
DEKA_123 2023-08-09 10:48:33 +08:00
parent 00cf35ec2a
commit dd6becc994
7 changed files with 61 additions and 30 deletions

View File

@ -10,6 +10,7 @@ import (
"electricity_bill_calc/tools" "electricity_bill_calc/tools"
"electricity_bill_calc/types" "electricity_bill_calc/types"
"electricity_bill_calc/vo" "electricity_bill_calc/vo"
"log"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
@ -97,6 +98,7 @@ func initNewReportCalculateTask(c *fiber.Ctx) error {
return err return err
} }
ok, err := service.ReportService.CreateNewReport(&form) ok, err := service.ReportService.CreateNewReport(&form)
log.Println("??????????????????????kkkkkkkkkkkkkkkkkkkkkkkkk", ok)
if err != nil { if err != nil {
reportLog.Error("无法创建核算报表", zap.Error(err)) reportLog.Error("无法创建核算报表", zap.Error(err))
return result.Error(fiber.StatusInternalServerError, "无法创建核算报表。") return result.Error(fiber.StatusInternalServerError, "无法创建核算报表。")

View File

@ -38,12 +38,20 @@ func (cr _CalculateRepository) UpdateReportCalculateStatus(rid string, status st
ctx, cancel := global.TimeoutContext() ctx, cancel := global.TimeoutContext()
defer cancel() defer cancel()
var atio int
var err error
log.Println("11111111111", status)
currentTime := time.Now() currentTime := time.Now()
if status == "success" {
atio = 0
} else {
atio = 1
}
updateResultSql, updateResultArgs, _ := cr.ds. updateResultSql, updateResultArgs, _ := cr.ds.
Update(goqu.T("report_task")). Update(goqu.T("report_task")).
Set(goqu.Record{ Set(goqu.Record{
"status": status, "status": int16(atio),
"last_modified_at": currentTime, "last_modified_at": currentTime,
"message": message, "message": message,
}).Where(goqu.I("id").Eq(rid)). }).Where(goqu.I("id").Eq(rid)).
@ -124,7 +132,7 @@ func (cr _CalculateRepository) GetAllPoolingMeterRelations(pid string, revokedAf
var meterRelation []model.MeterRelation var meterRelation []model.MeterRelation
err := pgxscan.Select(ctx, global.DB, meterRelation, relationsSql, relationsArgs...) err := pgxscan.Select(ctx, global.DB, &meterRelation, relationsSql, relationsArgs...)
if err != nil { if err != nil {
cr.log.Error("获取当前园区中所有公摊表计与商户表计之间的关联关系,包括已经解除的出错", zap.Error(err)) cr.log.Error("获取当前园区中所有公摊表计与商户表计之间的关联关系,包括已经解除的出错", zap.Error(err))
return nil, err return nil, err
@ -152,7 +160,7 @@ func (cr _CalculateRepository) GetAllTenementMeterRelations(pid string, associat
var tenementMeter []model.TenementMeter var tenementMeter []model.TenementMeter
err := pgxscan.Select(ctx, global.DB, tenementMeter, relationsQuerySql, relationsQueryArgs...) err := pgxscan.Select(ctx, global.DB, &tenementMeter, relationsQuerySql, relationsQueryArgs...)
if err != nil { if err != nil {
cr.log.Error("获取当前园区中所有的商户与表计的关联关系,包括已经解除的", zap.Error(err)) cr.log.Error("获取当前园区中所有的商户与表计的关联关系,包括已经解除的", zap.Error(err))
return nil, err return nil, err
@ -178,13 +186,13 @@ func (cr _CalculateRepository) GetMeterReadings(rid string, meterType int16) ([]
goqu.I("r.id").Eq(rid), goqu.I("r.id").Eq(rid),
goqu.I("mr.meter_type").Eq(meterType), goqu.I("mr.meter_type").Eq(meterType),
// TODO2023.08.02 此方法出错优先查看是否这里出问题 // TODO2023.08.02 此方法出错优先查看是否这里出问题
goqu.I("mr.read_at::date <@ r.period"), goqu.L("mr.read_at < lower(r.period)"),
). ).
Order(goqu.I("mr.read_at").Asc()).Select(goqu.I("mr.*")).ToSQL() Order(goqu.I("mr.read_at").Asc()).Select(goqu.I("mr.*")).ToSQL()
var readings []model.MeterReading var readings []model.MeterReading
err := pgxscan.Select(ctx, global.DB, readings, readingsQuerySql, readingsQueryArgs...) err := pgxscan.Select(ctx, global.DB, &readings, readingsQuerySql, readingsQueryArgs...)
if err != nil { if err != nil {
cr.log.Error("获取指定报表中所有涉及到的指定类型表计在核算时间段内的所有读数数据出错", zap.Error(err)) cr.log.Error("获取指定报表中所有涉及到的指定类型表计在核算时间段内的所有读数数据出错", zap.Error(err))
return nil, err return nil, err
@ -199,7 +207,8 @@ func (cr _CalculateRepository) GetLastPeriodReadings(rid string, meterType int16
ctx, cancel := global.TimeoutContext() ctx, cancel := global.TimeoutContext()
defer cancel() defer cancel()
readingsSql, readingsArgs, _ := cr.ds.From(goqu.T("meter_reading").As("mr")). readingsSql, readingsArgs, _ := cr.ds.
From(goqu.T("meter_reading").As("mr")).
Select( Select(
goqu.MAX("mr.read_at").As("read_at"), goqu.MAX("mr.read_at").As("read_at"),
goqu.I("mr.park_id"), goqu.I("mr.park_id"),
@ -219,7 +228,7 @@ func (cr _CalculateRepository) GetLastPeriodReadings(rid string, meterType int16
Where( Where(
goqu.I("r.id").Eq(rid), goqu.I("r.id").Eq(rid),
goqu.I("mr.meter_type").Eq(meterType), goqu.I("mr.meter_type").Eq(meterType),
goqu.I(" mr.read_at::date <= lower(r.period)"), goqu.L(" read_at <= lower(r.period)"),
). ).
GroupBy( GroupBy(
goqu.I("mr.park_id"), goqu.I("mr.park_id"),
@ -235,11 +244,12 @@ func (cr _CalculateRepository) GetLastPeriodReadings(rid string, meterType int16
).ToSQL() ).ToSQL()
var readings []model.MeterReading var readings []model.MeterReading
err := pgxscan.Select(ctx, global.DB, readings, readingsSql, readingsArgs...) err := pgxscan.Select(ctx, global.DB, &readings, readingsSql, readingsArgs...)
if err != nil { if err != nil {
cr.log.Error("获取指定报表中所有涉及到的表计在核算起始日期前的最后一次读数出错", zap.Error(err)) cr.log.Error("获取指定报表中所有涉及到的表计在核算起始日期前的最后一次读数出错", zap.Error(err))
return nil, err return nil, err
} }
fmt.Println(";;;;;;;;;;;;;;;;;;", readings)
return readings, nil return readings, nil
} }
@ -266,11 +276,11 @@ func (cr _CalculateRepository) GetAllTenements(rid string) ([]model.Tenement, er
). ).
Where( Where(
goqu.I("r.id").Eq(rid), goqu.I("r.id").Eq(rid),
goqu.I("t.moved_in_at <= upper(r.period)"), goqu.L("t.moved_in_at <= upper(r.period)"),
).ToSQL() ).ToSQL()
fmt.Println(tenementQuerySql)
var tenements []model.Tenement var tenements []model.Tenement
err := pgxscan.Select(ctx, global.DB, tenements, tenementQuerySql, tenementQueryArgs...) err := pgxscan.Select(ctx, global.DB, &tenements, tenementQuerySql, tenementQueryArgs...)
if err != nil { if err != nil {
cr.log.Error("取得指定报表所涉及的所有商户信息出错", zap.Error(err)) cr.log.Error("取得指定报表所涉及的所有商户信息出错", zap.Error(err))
return nil, err return nil, err

View File

@ -4,6 +4,7 @@ import (
"electricity_bill_calc/model" "electricity_bill_calc/model"
"electricity_bill_calc/model/calculate" "electricity_bill_calc/model/calculate"
"electricity_bill_calc/repository" "electricity_bill_calc/repository"
"fmt"
"time" "time"
) )
@ -22,6 +23,11 @@ func MetersParkCalculate(report model.ReportIndex, periodStart time.Time,
parkMeterReadings = append(parkMeterReadings, lastTermParkMeterReadings...) parkMeterReadings = append(parkMeterReadings, lastTermParkMeterReadings...)
if len(parkMeterReadings) <= 0 {
fmt.Println(parkMeterReadings)
return []calculate.Meter{}, nil
}
var parkMetersReports []calculate.Meter var parkMetersReports []calculate.Meter
for _, meter := range meterDetail { for _, meter := range meterDetail {
if meter.MeterType == model.METER_INSTALLATION_PARK { if meter.MeterType == model.METER_INSTALLATION_PARK {

View File

@ -4,6 +4,7 @@ import (
"electricity_bill_calc/model" "electricity_bill_calc/model"
"electricity_bill_calc/model/calculate" "electricity_bill_calc/model/calculate"
"electricity_bill_calc/repository" "electricity_bill_calc/repository"
"fmt"
"github.com/shopspring/decimal" "github.com/shopspring/decimal"
"time" "time"
"unsafe" "unsafe"
@ -24,6 +25,10 @@ func PooledMetersCalculate(report *model.ReportIndex, periodStart time.Time,
} }
poolingMeterReadings = append(poolingMeterReadings, lastTermPoolingMeterReadings...) poolingMeterReadings = append(poolingMeterReadings, lastTermPoolingMeterReadings...)
fmt.Println(poolingMeterReadings, "==============================================")
if len(poolingMeterReadings) <= 0 {
return nil, nil
}
var poolingMetersReports []calculate.Meter var poolingMetersReports []calculate.Meter
for _, meter := range meterDetails { for _, meter := range meterDetails {

View File

@ -42,7 +42,7 @@ func removeDuplicates(meters []calculate.Meter) []calculate.Meter {
} }
// 计算线损以及调整线损 // 计算线损以及调整线损
func LossCalculate(report *model.ReportIndex, Public *[]calculate.Meter, func LossCalculate(report *model.ReportIndex, Public []calculate.Meter,
publicTotal *decimal.Decimal, summary *calculate.Summary) error { publicTotal *decimal.Decimal, summary *calculate.Summary) error {
summary.Loss = summary.Overall.Amount.Sub(summary.TotalConsumption) summary.Loss = summary.Overall.Amount.Sub(summary.TotalConsumption)
@ -72,11 +72,15 @@ func LossCalculate(report *model.ReportIndex, Public *[]calculate.Meter,
differentialLoss := summary.LossDilutedPrice.Sub(summary.AuthoizeLoss.Amount) differentialLoss := summary.LossDilutedPrice.Sub(summary.AuthoizeLoss.Amount)
fmt.Println(publicTotal.InexactFloat64())
if publicTotal.InexactFloat64() <= decimal.Zero.InexactFloat64() { if publicTotal.InexactFloat64() <= decimal.Zero.InexactFloat64() {
return errors.New("园区公共表计的电量总和为非正值,或者园区未设置公共表计,无法计算核定线损") return errors.New("园区公共表计的电量总和为非正值,或者园区未设置公共表计,无法计算核定线损")
} }
for _, meter := range *Public { if Public == nil {
return nil
}
for _, meter := range Public {
amountProportion := meter.Overall.Amount.InexactFloat64() / publicTotal.InexactFloat64() amountProportion := meter.Overall.Amount.InexactFloat64() / publicTotal.InexactFloat64()
adjustAmount := differentialLoss.InexactFloat64() * decimal.NewFromFloat(-1.0).InexactFloat64() adjustAmount := differentialLoss.InexactFloat64() * decimal.NewFromFloat(-1.0).InexactFloat64()
meter.AdjustLoss = model.ConsumptionUnit{ meter.AdjustLoss = model.ConsumptionUnit{

View File

@ -64,14 +64,14 @@ func MainCalculateProcess(rid string) error {
} }
// 计算所有表计的总电量 // 计算所有表计的总电量
parkTotal := TotalConsumptionCalculate(tenementReports, summary) _ = TotalConsumptionCalculate(tenementReports, summary)
// 计算线损以及调整线损 // 计算线损以及调整线损
err = LossCalculate(report, &parkMetersReports, &parkTotal, &summary) //err = LossCalculate(report, parkMetersReports, &parkTotal, &summary)
if err != nil { //if err != nil {
fmt.Println("9", err) // fmt.Println("9", err)
return err // return err
} //}
// 计算所有已经启用的商铺面积总和,仅计算所有未迁出的商户的所有表计对应的商铺面积。 // 计算所有已经启用的商铺面积总和,仅计算所有未迁出的商户的所有表计对应的商铺面积。
_, err = EnabledAreaCalculate(&tenementReports, &summary) _, err = EnabledAreaCalculate(&tenementReports, &summary)
@ -84,8 +84,7 @@ func MainCalculateProcess(rid string) error {
fmt.Println("11", err) fmt.Println("11", err)
return err return err
} }
fmt.Println("计算数据读取完成")
//===========================================================================
// 计算基本电费分摊、调整电费分摊、电费摊薄单价。 // 计算基本电费分摊、调整电费分摊、电费摊薄单价。
err = CalculatePrices(&summary) err = CalculatePrices(&summary)
// 收集目前所有已经处理的表计,统一对其进行摊薄计算。 // 收集目前所有已经处理的表计,统一对其进行摊薄计算。

View File

@ -9,6 +9,7 @@ import (
"electricity_bill_calc/types" "electricity_bill_calc/types"
"electricity_bill_calc/vo" "electricity_bill_calc/vo"
"github.com/pkg/errors" "github.com/pkg/errors"
"log"
"sync" "sync"
"github.com/doug-martin/goqu/v9" "github.com/doug-martin/goqu/v9"
@ -216,6 +217,8 @@ func (rs _ReportService) CreateNewReport(createFrom *vo.ReportCreationForm) (boo
rs.log.Error("创建核算报表错误", zap.Error(err)) rs.log.Error("创建核算报表错误", zap.Error(err))
return false, err return false, err
} }
log.Println("创建成功successsssssssssssssssssssssssssssssssssssssssssssssssssssss")
if !state { if !state {
status, err := repository.CalculateRepository.UpdateReportCalculateStatus(report, "InsufficientData", status, err := repository.CalculateRepository.UpdateReportCalculateStatus(report, "InsufficientData",
"创建报表时发生错误,需手动再次计算") "创建报表时发生错误,需手动再次计算")
@ -225,11 +228,13 @@ func (rs _ReportService) CreateNewReport(createFrom *vo.ReportCreationForm) (boo
} }
return status, nil return status, nil
} }
log.Println("更新成功succssssssssssssssss")
err = rs.CalculateReport(report) err = rs.CalculateReport(report)
if err != nil { if err != nil {
rs.log.Error("计算时出错", zap.Error(err)) rs.log.Error("计算时出错", zap.Error(err))
return false, err return false, err
} }
log.Println("返回truettttttttttttttttttt")
return true, nil return true, nil
} }
@ -259,13 +264,13 @@ var CALCULATE_TASK_PARALLEL_CONTROL = func() *sync.Mutex {
// 执行一个核算报表的计算任务 // 执行一个核算报表的计算任务
func (rs _ReportService) CalculateReport(rid string) error { func (rs _ReportService) CalculateReport(rid string) error {
semaphore := CALCULATE_TASK_PARALLEL_CONTROL //semaphore := CALCULATE_TASK_PARALLEL_CONTROL
//
semaphore.Lock() //semaphore.Lock()
defer semaphore.Unlock() //defer semaphore.Unlock()
errs := calculate.MainCalculateProcess(rid) errs := calculate.MainCalculateProcess(rid)
log.Println("开始计算555555555555555555555555555")
if errs == nil { if errs == nil {
_, err := repository.CalculateRepository.UpdateReportCalculateStatus(rid, "success", "") _, err := repository.CalculateRepository.UpdateReportCalculateStatus(rid, "success", "")
if err != nil { if err != nil {