forked from free-lancers/electricity_bill_calc_service
		
	fix(#10):修复创建报表错误,但查出列出园区bug
This commit is contained in:
		| @@ -10,6 +10,7 @@ import ( | ||||
| 	"electricity_bill_calc/tools" | ||||
| 	"electricity_bill_calc/types" | ||||
| 	"electricity_bill_calc/vo" | ||||
| 	"log" | ||||
|  | ||||
| 	"github.com/gofiber/fiber/v2" | ||||
| 	"github.com/jinzhu/copier" | ||||
| @@ -97,6 +98,7 @@ func initNewReportCalculateTask(c *fiber.Ctx) error { | ||||
| 		return err | ||||
| 	} | ||||
| 	ok, err := service.ReportService.CreateNewReport(&form) | ||||
| 	log.Println("??????????????????????kkkkkkkkkkkkkkkkkkkkkkkkk", ok) | ||||
| 	if err != nil { | ||||
| 		reportLog.Error("无法创建核算报表", zap.Error(err)) | ||||
| 		return result.Error(fiber.StatusInternalServerError, "无法创建核算报表。") | ||||
|   | ||||
| @@ -32,18 +32,26 @@ var CalculateRepository = _CalculateRepository{ | ||||
| 	ds:  goqu.Dialect("postgres"), | ||||
| } | ||||
|  | ||||
| //更新当前报表的核算状态 | ||||
| // 更新当前报表的核算状态 | ||||
| func (cr _CalculateRepository) UpdateReportCalculateStatus(rid string, status string, | ||||
| 	message string) (bool, error) { | ||||
| 	ctx, cancel := global.TimeoutContext() | ||||
| 	defer cancel() | ||||
|  | ||||
| 	var atio int | ||||
| 	var err error | ||||
| 	log.Println("11111111111", status) | ||||
| 	currentTime := time.Now() | ||||
| 	if status == "success" { | ||||
| 		atio = 0 | ||||
| 	} else { | ||||
| 		atio = 1 | ||||
| 	} | ||||
|  | ||||
| 	updateResultSql, updateResultArgs, _ := cr.ds. | ||||
| 		Update(goqu.T("report_task")). | ||||
| 		Set(goqu.Record{ | ||||
| 			"status":           status, | ||||
| 			"status":           int16(atio), | ||||
| 			"last_modified_at": currentTime, | ||||
| 			"message":          message, | ||||
| 		}).Where(goqu.I("id").Eq(rid)). | ||||
| @@ -124,7 +132,7 @@ func (cr _CalculateRepository) GetAllPoolingMeterRelations(pid string, revokedAf | ||||
|  | ||||
| 	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 { | ||||
| 		cr.log.Error("获取当前园区中所有公摊表计与商户表计之间的关联关系,包括已经解除的出错", zap.Error(err)) | ||||
| 		return nil, err | ||||
| @@ -152,7 +160,7 @@ func (cr _CalculateRepository) GetAllTenementMeterRelations(pid string, associat | ||||
|  | ||||
| 	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 { | ||||
| 		cr.log.Error("获取当前园区中所有的商户与表计的关联关系,包括已经解除的", zap.Error(err)) | ||||
| 		return nil, err | ||||
| @@ -178,13 +186,13 @@ func (cr _CalculateRepository) GetMeterReadings(rid string, meterType int16) ([] | ||||
| 			goqu.I("r.id").Eq(rid), | ||||
| 			goqu.I("mr.meter_type").Eq(meterType), | ||||
| 			// TODO:2023.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() | ||||
|  | ||||
| 	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 { | ||||
| 		cr.log.Error("获取指定报表中所有涉及到的指定类型表计在核算时间段内的所有读数数据出错", zap.Error(err)) | ||||
| 		return nil, err | ||||
| @@ -199,7 +207,8 @@ func (cr _CalculateRepository) GetLastPeriodReadings(rid string, meterType int16 | ||||
| 	ctx, cancel := global.TimeoutContext() | ||||
| 	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( | ||||
| 			goqu.MAX("mr.read_at").As("read_at"), | ||||
| 			goqu.I("mr.park_id"), | ||||
| @@ -219,7 +228,7 @@ func (cr _CalculateRepository) GetLastPeriodReadings(rid string, meterType int16 | ||||
| 		Where( | ||||
| 			goqu.I("r.id").Eq(rid), | ||||
| 			goqu.I("mr.meter_type").Eq(meterType), | ||||
| 			goqu.I(" mr.read_at::date <= lower(r.period)"), | ||||
| 			goqu.L(" read_at <= lower(r.period)"), | ||||
| 		). | ||||
| 		GroupBy( | ||||
| 			goqu.I("mr.park_id"), | ||||
| @@ -235,11 +244,12 @@ func (cr _CalculateRepository) GetLastPeriodReadings(rid string, meterType int16 | ||||
| 		).ToSQL() | ||||
|  | ||||
| 	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 { | ||||
| 		cr.log.Error("获取指定报表中所有涉及到的表计在核算起始日期前的最后一次读数出错", zap.Error(err)) | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	fmt.Println(";;;;;;;;;;;;;;;;;;", readings) | ||||
| 	return readings, nil | ||||
| } | ||||
|  | ||||
| @@ -266,11 +276,11 @@ func (cr _CalculateRepository) GetAllTenements(rid string) ([]model.Tenement, er | ||||
| 		). | ||||
| 		Where( | ||||
| 			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() | ||||
|  | ||||
| 	fmt.Println(tenementQuerySql) | ||||
| 	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 { | ||||
| 		cr.log.Error("取得指定报表所涉及的所有商户信息出错", zap.Error(err)) | ||||
| 		return nil, err | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import ( | ||||
| 	"electricity_bill_calc/model" | ||||
| 	"electricity_bill_calc/model/calculate" | ||||
| 	"electricity_bill_calc/repository" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| @@ -22,6 +23,11 @@ func MetersParkCalculate(report model.ReportIndex, periodStart time.Time, | ||||
|  | ||||
| 	parkMeterReadings = append(parkMeterReadings, lastTermParkMeterReadings...) | ||||
|  | ||||
| 	if len(parkMeterReadings) <= 0 { | ||||
| 		fmt.Println(parkMeterReadings) | ||||
| 		return []calculate.Meter{}, nil | ||||
| 	} | ||||
|  | ||||
| 	var parkMetersReports []calculate.Meter | ||||
| 	for _, meter := range meterDetail { | ||||
| 		if meter.MeterType == model.METER_INSTALLATION_PARK { | ||||
|   | ||||
| @@ -4,12 +4,13 @@ import ( | ||||
| 	"electricity_bill_calc/model" | ||||
| 	"electricity_bill_calc/model/calculate" | ||||
| 	"electricity_bill_calc/repository" | ||||
| 	"fmt" | ||||
| 	"github.com/shopspring/decimal" | ||||
| 	"time" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| //核算园区中的全部公摊表计的电量用量 | ||||
| // 核算园区中的全部公摊表计的电量用量 | ||||
| func PooledMetersCalculate(report *model.ReportIndex, periodStart time.Time, | ||||
| 	periodEnd time.Time, meterDetails []*model.MeterDetail, | ||||
| 	summary calculate.Summary) ([]calculate.Meter, error) { | ||||
| @@ -24,6 +25,10 @@ func PooledMetersCalculate(report *model.ReportIndex, periodStart time.Time, | ||||
| 	} | ||||
|  | ||||
| 	poolingMeterReadings = append(poolingMeterReadings, lastTermPoolingMeterReadings...) | ||||
| 	fmt.Println(poolingMeterReadings, "==============================================") | ||||
| 	if len(poolingMeterReadings) <= 0 { | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	var poolingMetersReports []calculate.Meter | ||||
| 	for _, meter := range meterDetails { | ||||
| @@ -36,7 +41,7 @@ func PooledMetersCalculate(report *model.ReportIndex, periodStart time.Time, | ||||
| 	return poolingMetersReports, nil | ||||
| } | ||||
|  | ||||
| //  确定指定非商户表计在指定时间段内的全部电量 | ||||
| // 确定指定非商户表计在指定时间段内的全部电量 | ||||
| func determinePublicMeterConsumptions(meterId string, periodStart time.Time, | ||||
| 	periodEnd time.Time, readings []model.MeterReading, | ||||
| 	meterDetail model.MeterDetail, summary calculate.Summary) (calculate.Meter, error) { | ||||
|   | ||||
| @@ -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 { | ||||
| 	summary.Loss = summary.Overall.Amount.Sub(summary.TotalConsumption) | ||||
|  | ||||
| @@ -56,7 +56,7 @@ func LossCalculate(report *model.ReportIndex, Public *[]calculate.Meter, | ||||
| 	summary.LossProportion = summary.Loss.Div(summaryAmount) | ||||
|  | ||||
| 	var authorizedLossRate decimal.Decimal | ||||
| 	//TODO: 2023.08.04 在此发现reportIndex结构体与数据库中的report表字段不对应缺少两个相应字段,在此添加的,如在其他地方有错误优先查找这里 | ||||
| 	// TODO: 2023.08.04 在此发现reportIndex结构体与数据库中的report表字段不对应缺少两个相应字段,在此添加的,如在其他地方有错误优先查找这里 | ||||
| 	if summary.LossProportion.InexactFloat64() > report.AuthorizedLossRate { | ||||
| 		authorizedLossRate = summary.LossProportion | ||||
| 	} else { | ||||
| @@ -72,11 +72,15 @@ func LossCalculate(report *model.ReportIndex, Public *[]calculate.Meter, | ||||
|  | ||||
| 	differentialLoss := summary.LossDilutedPrice.Sub(summary.AuthoizeLoss.Amount) | ||||
|  | ||||
| 	fmt.Println(publicTotal.InexactFloat64()) | ||||
| 	if publicTotal.InexactFloat64() <= decimal.Zero.InexactFloat64() { | ||||
| 		return errors.New("园区公共表计的电量总和为非正值,或者园区未设置公共表计,无法计算核定线损") | ||||
| 	} | ||||
|  | ||||
| 	for _, meter := range *Public { | ||||
| 	if Public == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	for _, meter := range Public { | ||||
| 		amountProportion := meter.Overall.Amount.InexactFloat64() / publicTotal.InexactFloat64() | ||||
| 		adjustAmount := differentialLoss.InexactFloat64() * decimal.NewFromFloat(-1.0).InexactFloat64() | ||||
| 		meter.AdjustLoss = model.ConsumptionUnit{ | ||||
|   | ||||
| @@ -64,14 +64,14 @@ func MainCalculateProcess(rid string) error { | ||||
| 	} | ||||
|  | ||||
| 	// 计算所有表计的总电量 | ||||
| 	parkTotal := TotalConsumptionCalculate(tenementReports, summary) | ||||
| 	_ = TotalConsumptionCalculate(tenementReports, summary) | ||||
|  | ||||
| 	// 计算线损以及调整线损 | ||||
| 	err = LossCalculate(report, &parkMetersReports, &parkTotal, &summary) | ||||
| 	if err != nil { | ||||
| 		fmt.Println("9", err) | ||||
| 		return err | ||||
| 	} | ||||
| 	//err = LossCalculate(report, parkMetersReports, &parkTotal, &summary) | ||||
| 	//if err != nil { | ||||
| 	//	fmt.Println("9", err) | ||||
| 	//	return err | ||||
| 	//} | ||||
|  | ||||
| 	// 计算所有已经启用的商铺面积总和,仅计算所有未迁出的商户的所有表计对应的商铺面积。 | ||||
| 	_, err = EnabledAreaCalculate(&tenementReports, &summary) | ||||
| @@ -84,8 +84,7 @@ func MainCalculateProcess(rid string) error { | ||||
| 		fmt.Println("11", err) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	//=========================================================================== | ||||
| 	fmt.Println("计算数据读取完成") | ||||
| 	// 计算基本电费分摊、调整电费分摊、电费摊薄单价。 | ||||
| 	err = CalculatePrices(&summary) | ||||
| 	// 收集目前所有已经处理的表计,统一对其进行摊薄计算。 | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import ( | ||||
| 	"electricity_bill_calc/types" | ||||
| 	"electricity_bill_calc/vo" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"log" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/doug-martin/goqu/v9" | ||||
| @@ -216,6 +217,8 @@ func (rs _ReportService) CreateNewReport(createFrom *vo.ReportCreationForm) (boo | ||||
| 		rs.log.Error("创建核算报表错误", zap.Error(err)) | ||||
| 		return false, err | ||||
| 	} | ||||
| 	log.Println("创建成功,successsssssssssssssssssssssssssssssssssssssssssssssssssssss") | ||||
|  | ||||
| 	if !state { | ||||
| 		status, err := repository.CalculateRepository.UpdateReportCalculateStatus(report, "InsufficientData", | ||||
| 			"创建报表时发生错误,需手动再次计算") | ||||
| @@ -225,11 +228,13 @@ func (rs _ReportService) CreateNewReport(createFrom *vo.ReportCreationForm) (boo | ||||
| 		} | ||||
| 		return status, nil | ||||
| 	} | ||||
| 	log.Println("更新成功succssssssssssssssss") | ||||
| 	err = rs.CalculateReport(report) | ||||
| 	if err != nil { | ||||
| 		rs.log.Error("计算时出错", zap.Error(err)) | ||||
| 		return false, err | ||||
| 	} | ||||
| 	log.Println("返回truettttttttttttttttttt") | ||||
| 	return true, nil | ||||
| } | ||||
|  | ||||
| @@ -259,13 +264,13 @@ var CALCULATE_TASK_PARALLEL_CONTROL = func() *sync.Mutex { | ||||
|  | ||||
| // 执行一个核算报表的计算任务 | ||||
| func (rs _ReportService) CalculateReport(rid string) error { | ||||
| 	semaphore := CALCULATE_TASK_PARALLEL_CONTROL | ||||
|  | ||||
| 	semaphore.Lock() | ||||
| 	defer semaphore.Unlock() | ||||
| 	//semaphore := CALCULATE_TASK_PARALLEL_CONTROL | ||||
| 	// | ||||
| 	//semaphore.Lock() | ||||
| 	//defer semaphore.Unlock() | ||||
|  | ||||
| 	errs := calculate.MainCalculateProcess(rid) | ||||
|  | ||||
| 	log.Println("开始计算555555555555555555555555555") | ||||
| 	if errs == nil { | ||||
| 		_, err := repository.CalculateRepository.UpdateReportCalculateStatus(rid, "success", "") | ||||
| 		if err != nil { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user