forked from free-lancers/electricity_bill_calc_service
		
	fix(#10): 修复创建报表错误
This commit is contained in:
		| @@ -24,23 +24,23 @@ type Pooling struct { | ||||
| } | ||||
|  | ||||
| type Meter struct { | ||||
| 	Code                    string | ||||
| 	Detail                  model.MeterDetail | ||||
| 	CoveredArea             decimal.Decimal | ||||
| 	LastTermReading         *Reading | ||||
| 	CurrentTermReading      *Reading | ||||
| 	Overall                 model.ConsumptionUnit | ||||
| 	Critical                model.ConsumptionUnit | ||||
| 	Peak                    model.ConsumptionUnit | ||||
| 	Flat                    model.ConsumptionUnit | ||||
| 	Valley                  model.ConsumptionUnit | ||||
| 	AdjustLoss              model.ConsumptionUnit | ||||
| 	PooledBasic             model.ConsumptionUnit | ||||
| 	PooledAdjust            model.ConsumptionUnit | ||||
| 	PooledLoss              model.ConsumptionUnit | ||||
| 	PooledPublic            model.ConsumptionUnit | ||||
| 	SharedPoolingProportion decimal.Decimal | ||||
| 	Poolings                []*Pooling | ||||
| 	Code                    string                `json:"code"` | ||||
| 	Detail                  model.MeterDetail     `json:"detail"` | ||||
| 	CoveredArea             decimal.Decimal       `json:"covered_area"` | ||||
| 	LastTermReading         *Reading              `json:"last_term_reading"` | ||||
| 	CurrentTermReading      *Reading              `json:"current_term_reading"` | ||||
| 	Overall                 model.ConsumptionUnit `json:"overall"` | ||||
| 	Critical                model.ConsumptionUnit `json:"critical"` | ||||
| 	Peak                    model.ConsumptionUnit `json:"peak"` | ||||
| 	Flat                    model.ConsumptionUnit `json:"flat"` | ||||
| 	Valley                  model.ConsumptionUnit `json:"valley"` | ||||
| 	AdjustLoss              model.ConsumptionUnit `json:"adjust_loss"` | ||||
| 	PooledBasic             model.ConsumptionUnit `json:"pooled_basic"` | ||||
| 	PooledAdjust            model.ConsumptionUnit `json:"pooled_adjust"` | ||||
| 	PooledLoss              model.ConsumptionUnit `json:"pooled_loss"` | ||||
| 	PooledPublic            model.ConsumptionUnit `json:"pooled_public"` | ||||
| 	SharedPoolingProportion decimal.Decimal       `json:"shared_pooling_proportion"` | ||||
| 	Poolings                []*Pooling            `json:"poolings"` | ||||
| } | ||||
|  | ||||
| type PrimaryTenementStatistics struct { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package repository | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"electricity_bill_calc/global" | ||||
| 	"electricity_bill_calc/logger" | ||||
| 	"electricity_bill_calc/model" | ||||
| @@ -322,43 +323,47 @@ func (cr _CalculateRepository) ClearReportContent(tx pgx.Tx, rid string) error { | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
| func (cr _CalculateRepository) SaveReportPublics(tx pgx.Tx, rid string, meters []calculate.Meter) error { | ||||
| 	ctx, cancel := global.TimeoutContext() | ||||
| 	defer cancel() | ||||
| func (cr _CalculateRepository) SaveReportPublics(tx pgx.Tx, ctx context.Context, rid string, meters []calculate.Meter) error { | ||||
| 	if len(meters) == 0 { | ||||
| 		// 如果没有公共表计则直接返回 | ||||
| 		return nil | ||||
| 	} | ||||
| 	// 准备插入表达式 | ||||
| 	insertExpr := cr.ds.Insert("report_public_consumption"). | ||||
| 		Cols( | ||||
| 			"report_id", "park_meter_id", "overall", "critical", "peak", "flat", "valley", | ||||
| 			"loss_adjust", "consumption_total", "loss_adjust_total", "final_total", | ||||
| 		).Prepared(true) | ||||
| 	// 添加值到插入表达式中 | ||||
|  | ||||
| 	for _, meter := range meters { | ||||
| 		insertExpr = insertExpr.Vals([]interface{}{ | ||||
| 		// 准备插入表达式 | ||||
| 		insertExpr := cr.ds.Insert("report_public_consumption"). | ||||
| 			Cols( | ||||
| 				"report_id", "park_meter_id", "overall", "critical", "peak", "flat", "valley", | ||||
| 				"loss_adjust", "consumption_total", "loss_adjust_total", "final_total", | ||||
| 			) | ||||
| 		// 添加值到插入表达式中 | ||||
| 		overall,_ := json.Marshal(meter.Overall) | ||||
| 		criyical,_ := json.Marshal(meter.Critical) | ||||
| 		peak,_ := json.Marshal(meter.Peak) | ||||
| 		flat,_ := json.Marshal(meter.Flat) | ||||
| 		valley,_ := json.Marshal(meter.Valley) | ||||
| 		adjustLoss,_ := json.Marshal(meter.AdjustLoss) | ||||
| 		insertExpr = insertExpr.Vals(goqu.Vals{ | ||||
| 			rid, | ||||
| 			meter.Code, | ||||
| 			meter.Overall.Fee, | ||||
| 			meter.Critical.Fee, | ||||
| 			meter.Peak.Fee, | ||||
| 			meter.Flat.Fee, | ||||
| 			meter.Valley.Fee, | ||||
| 			meter.AdjustLoss.Fee, | ||||
| 			overall, | ||||
| 			criyical, | ||||
| 			peak, | ||||
| 			flat, | ||||
| 			valley, | ||||
| 			adjustLoss, | ||||
| 			meter.Overall.Fee, | ||||
| 			meter.AdjustLoss.Fee, | ||||
| 			meter.Overall.Fee.Add(meter.AdjustLoss.Fee), | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	// 执行插入语句 | ||||
| 	inserSql, insertArgs, err := insertExpr.Prepared(true).ToSQL() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if _, err := tx.Exec(ctx, inserSql, insertArgs); err != nil { | ||||
| 		return fmt.Errorf("保存报表核算概要失败: %w", err) | ||||
| 		// 执行插入语句 | ||||
| 		inserSql, insertArgs, _ := insertExpr.ToSQL() | ||||
| 		fmt.Println(inserSql) | ||||
| 		_, err := tx.Exec(ctx, inserSql, insertArgs...) | ||||
| 		if err != nil { | ||||
| 			_ = tx.Rollback(ctx) | ||||
| 			return fmt.Errorf("保存报表核算概要失败: %w", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| @@ -454,10 +459,15 @@ func (cr _CalculateRepository) SaveReportPoolings(tx pgx.Tx, | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		overall,_ := json.Marshal(meter.Overall) | ||||
| 		criyical,_ := json.Marshal(meter.Critical) | ||||
| 		peak,_ := json.Marshal(meter.Peak) | ||||
| 		flat,_ := json.Marshal(meter.Flat) | ||||
| 		valley,_ := json.Marshal(meter.Valley) | ||||
|  | ||||
| 		insertQuery := goqu.Insert("report_pooled_consumption"). | ||||
| 			Cols("report_id", "pooled_meter_id", "overall", "critical", "peak", "flat", "valley", "pooled_area", "diluted"). | ||||
| 			Vals(goqu.Vals{rid, meter.Code, meter.Overall, meter.Critical, meter.Peak, meter.Flat, meter.Valley, meter.CoveredArea, submetersJSON}) | ||||
| 			Vals(goqu.Vals{rid, meter.Code, overall, criyical, peak, flat, valley, meter.CoveredArea, submetersJSON}) | ||||
|  | ||||
| 		insertQueries = append(insertQueries, *insertQuery) | ||||
| 	} | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package calculate | ||||
| import ( | ||||
| 	"electricity_bill_calc/model" | ||||
| 	"electricity_bill_calc/model/calculate" | ||||
| 	"electricity_bill_calc/repository" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"github.com/shopspring/decimal" | ||||
| @@ -189,147 +188,169 @@ func CalculateTenementPoolings(report model.ReportIndex, summary calculate.Summa | ||||
| 	switch report.PublicPooled { | ||||
| 	case model.POOLING_MODE_AREA: | ||||
| 		for _, meter := range meters { | ||||
| 			if meter.Detail.MeterType != model.METER_INSTALLATION_TENEMENT { | ||||
| 				var pooleds []struct { | ||||
| 					PooledAmount decimal.Decimal | ||||
| 					ParentAmount decimal.Decimal | ||||
| 					ParentCode   string | ||||
| 				} | ||||
| 			if meter.Detail.MeterType == model.METER_INSTALLATION_TENEMENT { | ||||
| 				pooleds := make([]struct { | ||||
| 					Electricity       decimal.Decimal | ||||
| 					ParentElectricity decimal.Decimal | ||||
| 					Code              string | ||||
| 				}, 0) | ||||
|  | ||||
| 				for _, relation := range meterRelations { | ||||
| 					if relation.SlaveMeter == meter.Code { | ||||
| 						key := Key{ | ||||
| 							Code: relation.MasterMeter, | ||||
| 							Code:       relation.MasterMeter, | ||||
| 							TenementID: "", | ||||
| 						} | ||||
| 						parentMeter, ok := meters[key] | ||||
| 						if !ok { | ||||
| 							// 处理未找到父级表计的情况 | ||||
| 							continue | ||||
| 						} | ||||
| 						// 计算分摊电量和父级表电量 | ||||
| 						pooledAmount := meter.Detail.Area.Decimal.Div(parentMeter.CoveredArea).Mul(parentMeter.Overall.Amount).Mul(meter.SharedPoolingProportion) | ||||
|  | ||||
| 						area := parentMeter.CoveredArea | ||||
| 						coveredArea := area | ||||
| 						overall := parentMeter.Overall | ||||
| 						proportion := meter.SharedPoolingProportion | ||||
|  | ||||
| 						electricity := area.InexactFloat64() / coveredArea.InexactFloat64() * overall.Amount.InexactFloat64() * proportion.InexactFloat64() | ||||
| 						pooleds = append(pooleds, struct { | ||||
| 							PooledAmount decimal.Decimal | ||||
| 							ParentAmount decimal.Decimal | ||||
| 							ParentCode   string | ||||
| 							Electricity       decimal.Decimal | ||||
| 							ParentElectricity decimal.Decimal | ||||
| 							Code              string | ||||
| 						}{ | ||||
| 							PooledAmount: pooledAmount, | ||||
| 							ParentAmount: parentMeter.Overall.Amount, | ||||
| 							ParentCode:   parentMeter.Code, | ||||
| 							Electricity:       decimal.NewFromFloat(electricity), | ||||
| 							ParentElectricity: overall.Amount, | ||||
| 							Code:              parentMeter.Code, | ||||
| 						}) | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				// 计算总分摊电量和总父级电量 | ||||
| 				var consumptions, total decimal.Decimal | ||||
| 				for _, p := range pooleds { | ||||
| 					consumptions = consumptions.Add(p.PooledAmount) | ||||
| 					total = total.Add(p.ParentAmount) | ||||
| 				} | ||||
| 				// 计算并更新公摊分摊信息 | ||||
| 				for _, p := range pooleds { | ||||
| 					poolingAmount := p.PooledAmount | ||||
| 					proportion := p.PooledAmount.Div(p.ParentAmount) | ||||
| 					fee := poolingAmount.Mul(summary.Overall.Price) | ||||
| 				consumptions := 0.00 | ||||
| 				total := 0.00 | ||||
| 				var pooled []*calculate.Pooling | ||||
|  | ||||
| 					// 更新父级表计的公摊分摊信息 | ||||
| 					key := Key{ | ||||
| 						Code: p.ParentCode, | ||||
| 				for _, p := range pooleds { | ||||
| 					consumptions += p.Electricity.InexactFloat64() | ||||
| 					total += p.ParentElectricity.InexactFloat64() | ||||
|  | ||||
| 					unit := model.ConsumptionUnit{ | ||||
| 						Amount:     p.Electricity, | ||||
| 						Fee:        decimal.NewFromFloat(p.Electricity.InexactFloat64() * summary.Overall.Price.InexactFloat64()), | ||||
| 						Price:      summary.Overall.Price, | ||||
| 						Proportion: decimal.Zero, | ||||
| 					} | ||||
| 					parentMeter := meters[key] | ||||
| 					parentMeter.PooledPublic.Amount = consumptions | ||||
| 					parentMeter.PooledPublic.Fee = consumptions.Mul(summary.Overall.Price) | ||||
| 					parentMeter.PooledPublic.Proportion = consumptions.Div(total) | ||||
| 					meters[Key{Code: p.ParentCode}] = parentMeter | ||||
| 					// 创建并更新分摊信息 | ||||
|  | ||||
| 					if p.ParentElectricity != decimal.Zero { | ||||
| 						unit.Proportion = decimal.NewFromFloat(p.Electricity.InexactFloat64() / p.ParentElectricity.InexactFloat64()) | ||||
| 					} | ||||
|  | ||||
| 					pooling := calculate.Pooling{ | ||||
| 						Code: p.ParentCode, | ||||
| 						Detail: model.ConsumptionUnit{ | ||||
| 							Amount:     poolingAmount, | ||||
| 							Fee:        fee, | ||||
| 							Price:      summary.Overall.Price, | ||||
| 							Proportion: proportion, | ||||
| 						}, | ||||
| 						Code:   p.Code, | ||||
| 						Detail: unit, | ||||
| 					} | ||||
| 					meter.Poolings = append(meter.Poolings, &pooling) | ||||
|  | ||||
| 					pooled = append(pooled, &pooling) | ||||
| 				} | ||||
|  | ||||
| 				meter.PooledPublic = model.ConsumptionUnit{ | ||||
| 					Amount:     decimal.NewFromFloat(consumptions), | ||||
| 					Fee:        decimal.NewFromFloat(consumptions * summary.Overall.Price.InexactFloat64()), | ||||
| 					Price:      summary.Overall.Price, | ||||
| 					Proportion: decimal.NewFromFloat(consumptions / total), | ||||
| 				} | ||||
|  | ||||
| 				meter.Poolings = pooled | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	case model.POOLING_MODE_CONSUMPTION: | ||||
| 	case model.PRICING_POLICY_CONSUMPTION: | ||||
| 		for _, meter := range meters { | ||||
| 			if meter.Detail.MeterType == model.METER_INSTALLATION_TENEMENT { | ||||
| 				var pooled []struct { | ||||
| 					PooledAmount decimal.Decimal | ||||
| 					ParentAmount decimal.Decimal | ||||
| 					ParentCode   string | ||||
| 				} | ||||
| 				pooled := make([]struct { | ||||
| 					Electricity       decimal.Decimal | ||||
| 					ParentElectricity decimal.Decimal | ||||
| 					Code              string | ||||
| 				}, 0) | ||||
|  | ||||
| 				for _, relation := range meterRelations { | ||||
| 					if relation.SlaveMeter == meter.Code { | ||||
| 						parentMeter, ok := meters[Key{Code: relation.MasterMeter}] | ||||
| 						key := Key{ | ||||
| 							Code:       relation.MasterMeter, | ||||
| 							TenementID: "", | ||||
| 						} | ||||
| 						parentMeter, ok := meters[key] | ||||
| 						if !ok { | ||||
| 							// 处理未找到父级表计的情况 | ||||
| 							continue | ||||
| 						} | ||||
| 						// 计算分摊电量和父级电量 | ||||
| 						var pooledAmount decimal.Decimal | ||||
| 						if parentMeter.Overall.Amount.IsZero() { | ||||
| 							relations, err := repository.MeterRepository.ListPooledMeterRelations(report.Park, meter.Code) | ||||
| 							if err != nil { | ||||
| 								return err | ||||
| 							} | ||||
| 							//此处rust版本有误,更新后的解决办法 | ||||
| 							pooledAmount = meter.Overall.Amount.Div(decimal.NewFromInt(int64(len(relations)))).Mul(parentMeter.Overall.Amount) | ||||
|  | ||||
| 						overall := parentMeter.Overall | ||||
|  | ||||
| 						if overall.Amount == decimal.Zero { | ||||
| 							pooled = append(pooled, struct { | ||||
| 								Electricity       decimal.Decimal | ||||
| 								ParentElectricity decimal.Decimal | ||||
| 								Code              string | ||||
| 							}{ | ||||
| 								Electricity:       decimal.Zero, | ||||
| 								ParentElectricity: decimal.Zero, | ||||
| 								Code:              parentMeter.Code, | ||||
| 							}) | ||||
| 						} else { //TODO: 2023.08.11 计算处理流程修改到此处,以下问题未作修改还存在问题 | ||||
| 							electricity := meter.Overall.Amount.InexactFloat64() / overall.Amount.InexactFloat64() * overall.Amount.InexactFloat64() | ||||
| 							pooled = append(pooled, struct { | ||||
| 								Electricity       decimal.Decimal | ||||
| 								ParentElectricity decimal.Decimal | ||||
| 								Code              string | ||||
| 							}{ | ||||
| 								Electricity:       decimal.NewFromFloat(electricity), | ||||
| 								ParentElectricity: overall.Amount, | ||||
| 								Code:              parentMeter.Code, | ||||
| 							}) | ||||
| 						} | ||||
| 						pooled = append(pooled, struct { | ||||
| 							PooledAmount decimal.Decimal | ||||
| 							ParentAmount decimal.Decimal | ||||
| 							ParentCode   string | ||||
| 						}{ | ||||
| 							PooledAmount: pooledAmount, | ||||
| 							ParentAmount: parentMeter.Overall.Amount, | ||||
| 							ParentCode:   parentMeter.Code, | ||||
| 						}) | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				// 计算总分摊电量和总父级表记电量 | ||||
| 				var consumptions, total decimal.Decimal | ||||
| 				consumptions := decimal.Zero.InexactFloat64() | ||||
| 				total := decimal.Zero.InexactFloat64() | ||||
| 				var poolings []*calculate.Pooling | ||||
|  | ||||
| 				for _, p := range pooled { | ||||
| 					consumptions = consumptions.Add(p.PooledAmount) | ||||
| 					total = total.Add(p.ParentAmount) | ||||
| 				} | ||||
| 					consumptions += p.Electricity.InexactFloat64() | ||||
| 					total += p.ParentElectricity.InexactFloat64() | ||||
|  | ||||
| 				// 计算并更新公摊分摊信息 | ||||
| 				for _, p := range pooled { | ||||
| 					poolingAmount := p.PooledAmount | ||||
| 					proportion := p.PooledAmount.Div(p.ParentAmount) | ||||
| 					fee := poolingAmount.Mul(summary.Overall.Price) | ||||
| 					unit := model.ConsumptionUnit{ | ||||
| 						Amount:     p.Electricity, | ||||
| 						Fee:        decimal.NewFromFloat(p.Electricity.InexactFloat64() * summary.Overall.Price.InexactFloat64()), | ||||
| 						Price:      summary.Overall.Price, | ||||
| 						Proportion: decimal.Zero, | ||||
| 					} | ||||
|  | ||||
| 					// 更新父级表计的公摊分摊信息 | ||||
| 					parentMeter := meters[Key{Code: p.ParentCode}] | ||||
| 					parentMeter.PooledPublic.Amount = consumptions | ||||
| 					parentMeter.PooledPublic.Fee = consumptions.Mul(summary.Overall.Price) | ||||
| 					parentMeter.PooledPublic.Proportion = consumptions.Div(total) | ||||
| 					meters[Key{Code: p.ParentCode}] = parentMeter | ||||
| 					if p.ParentElectricity != decimal.Zero { | ||||
| 						unit.Proportion = decimal.NewFromFloat(p.Electricity.InexactFloat64() / p.ParentElectricity.InexactFloat64()) | ||||
| 					} | ||||
|  | ||||
| 					// 创建并更新分摊信息 | ||||
| 					pooling := calculate.Pooling{ | ||||
| 						Code: p.ParentCode, | ||||
| 						Detail: model.ConsumptionUnit{ | ||||
| 							Amount:     poolingAmount, | ||||
| 							Fee:        fee, | ||||
| 							Price:      summary.Overall.Price, | ||||
| 							Proportion: proportion, | ||||
| 						}, | ||||
| 						Code:   p.Code, | ||||
| 						Detail: unit, | ||||
| 					} | ||||
| 					meter.Poolings = append(meter.Poolings, &pooling) | ||||
|  | ||||
| 					poolings = append(poolings, &pooling) | ||||
| 				} | ||||
|  | ||||
| 				meter.PooledPublic = model.ConsumptionUnit{ | ||||
| 					Amount:     decimal.NewFromFloat(consumptions), | ||||
| 					Fee:        decimal.NewFromFloat(consumptions * summary.Overall.Price.InexactFloat64()), | ||||
| 					Price:      summary.Overall.Price, | ||||
| 					Proportion: decimal.Zero, | ||||
| 				} | ||||
|  | ||||
| 				if total != decimal.Zero.InexactFloat64() { | ||||
| 					meter.SharedPoolingProportion = decimal.NewFromFloat(consumptions / total) | ||||
| 				} | ||||
|  | ||||
| 				meter.Poolings = poolings | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		// 处理其他分摊模式 | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -1,43 +1,41 @@ | ||||
| package calculate | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"electricity_bill_calc/global" | ||||
| 	"electricity_bill_calc/model" | ||||
| 	"electricity_bill_calc/model/calculate" | ||||
| 	"electricity_bill_calc/repository" | ||||
| 	"fmt" | ||||
| 	"github.com/jackc/pgx/v5" | ||||
| ) | ||||
|  | ||||
| // 向数据库保存核算概况结果 | ||||
| func SaveSummary(tx pgx.Tx, summary calculate.Summary) error { | ||||
| 	ctx, cancel := global.TimeoutContext() | ||||
| 	defer cancel() | ||||
|  | ||||
| 	// 保存核算概况结果到数据库 | ||||
| 	err := repository.CalculateRepository.SaveReportSummary(tx, summary) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	tx.Commit(ctx) | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // type MeterMap map[string]map[string]calculate.Meter | ||||
| // 向数据库保存公共表计的计算结果 | ||||
| func SavePublics(tx pgx.Tx, report model.ReportIndex, meters MeterMap) error { | ||||
| 	ctx, cancel := global.TimeoutContext() | ||||
| 	defer cancel() | ||||
| func SavePublics(tx pgx.Tx, ctx context.Context, report model.ReportIndex, meters MeterMap) error { | ||||
| 	var filteredMeters []calculate.Meter | ||||
| 	for _, m := range meters { | ||||
| 		if m.Detail.MeterType == model.METER_INSTALLATION_PARK { | ||||
| 			filteredMeters = append(filteredMeters, m) | ||||
| 		} | ||||
| 	} | ||||
| 	err := repository.CalculateRepository.SaveReportPublics(tx, report.Id, filteredMeters) | ||||
| 	fmt.Println(tx) | ||||
| 	err := repository.CalculateRepository.SaveReportPublics(tx, ctx, report.Id, filteredMeters) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	tx.Commit(ctx) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -94,7 +94,7 @@ func determineTenementConsumptions(tenement model.Tenement, | ||||
| 		moveOutAt := tenement.MovedOutAt | ||||
| 		if moveOutAt == nil { | ||||
| 			shiftedTime := ShiftToAsiaShanghai(time.Time{}) | ||||
| 			moveOutAt =  &types.DateTime{Time: shiftedTime}// 使用 types.DateTime 的零值表示时间的最大值 | ||||
| 			moveOutAt = &types.DateTime{Time: shiftedTime} // 使用 types.DateTime 的零值表示时间的最大值 | ||||
| 		} | ||||
| 		endReading, err := determineTenementMeterEndReading(meter.MeterId, periodEnd, ShiftToAsiaShanghai(moveOutAt.Time), meter, currentTermReadings) | ||||
| 		if err != nil { | ||||
| @@ -296,7 +296,7 @@ func TenementChargeCalculate(tenements []calculate.PrimaryTenementStatistics, | ||||
| 	for tCode, meterCodes := range result { | ||||
| 		relatedMeters := make([]calculate.Meter, 0) | ||||
| 		for _, code := range meterCodes { | ||||
| 			Key.Code = code + "_" + tCode | ||||
| 			Key.Code = code | ||||
| 			meter, ok := meters[Key] | ||||
| 			if ok { | ||||
| 				relatedMeters = append(relatedMeters, meter) | ||||
| @@ -401,28 +401,29 @@ func TenementChargeCalculate(tenements []calculate.PrimaryTenementStatistics, | ||||
| 			} | ||||
|  | ||||
| 			var CriticalProportion decimal.Decimal | ||||
| 			if summary.Critical.Amount == decimal.Zero { | ||||
| 			fmt.Println(summary.Critical.Amount == decimal.Zero) | ||||
| 			if summary.Critical.Amount.InexactFloat64() == decimal.Zero.InexactFloat64() { | ||||
| 				CriticalProportion = decimal.Zero | ||||
| 			} else { | ||||
| 				CriticalProportion = decimal.NewFromFloat(critical.Amount.InexactFloat64() / summary.Critical.Amount.InexactFloat64()) | ||||
| 			} | ||||
|  | ||||
| 			var PeakProportion decimal.Decimal | ||||
| 			if summary.Peak.Amount == decimal.Zero { | ||||
| 			if summary.Peak.Amount.InexactFloat64() == decimal.Zero.InexactFloat64() { | ||||
| 				PeakProportion = decimal.Zero | ||||
| 			} else { | ||||
| 				PeakProportion = decimal.NewFromFloat(peak.Amount.InexactFloat64() / summary.Peak.Amount.InexactFloat64()) | ||||
| 			} | ||||
|  | ||||
| 			var FlatProportion decimal.Decimal | ||||
| 			if summary.Flat.Amount == decimal.Zero { | ||||
| 			if summary.Flat.Amount.InexactFloat64() == decimal.Zero.InexactFloat64() { | ||||
| 				FlatProportion = decimal.Zero | ||||
| 			} else { | ||||
| 				FlatProportion = decimal.NewFromFloat(flat.Amount.InexactFloat64() / summary.Flat.Amount.InexactFloat64()) | ||||
| 			} | ||||
|  | ||||
| 			var ValleyProportion decimal.Decimal | ||||
| 			if summary.Valley.Amount == decimal.Zero { | ||||
| 			if summary.Valley.Amount.InexactFloat64() == decimal.Zero.InexactFloat64() { | ||||
| 				ValleyProportion = decimal.Zero | ||||
| 			} else { | ||||
| 				ValleyProportion = decimal.NewFromFloat(valley.Amount.InexactFloat64() / summary.Valley.Amount.InexactFloat64()) | ||||
| @@ -465,5 +466,6 @@ func TenementChargeCalculate(tenements []calculate.PrimaryTenementStatistics, | ||||
| 			tc = append(tc, tenementCharge) | ||||
| 		} | ||||
| 	} | ||||
| 	fmt.Println(tc) | ||||
| 	return tc | ||||
| } | ||||
|   | ||||
| @@ -94,9 +94,6 @@ func MainCalculateProcess(rid string) error { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	// 计算商户的合计电费信息,并归总与商户相关联的表计记录 | ||||
| 	tenementCharges := TenementChargeCalculate(tenementReports, summary, meters) | ||||
|  | ||||
| 	// 根据核算报表中设置的摊薄内容,逐个表计进行计算 | ||||
| 	err = CalculateBasicPooling(report, &summary, &meters) | ||||
| 	if err != nil { | ||||
| @@ -125,7 +122,7 @@ func MainCalculateProcess(rid string) error { | ||||
| 		return err | ||||
| 	} | ||||
| 	// 计算商户的合计电费信息,并归总与商户相关联的表计记录 | ||||
| 	tenementCharges = TenementChargeCalculate(tenementReports, summary, meters) | ||||
| 	tenementCharges := TenementChargeCalculate(tenementReports, summary, meters) | ||||
|  | ||||
| 	// 从此处开始向数据库保存全部计算结果。 | ||||
| 	ctx, cancel := global.TimeoutContext() | ||||
| @@ -133,35 +130,35 @@ func MainCalculateProcess(rid string) error { | ||||
| 	tx, _ := global.DB.Begin(ctx) | ||||
| 	err = repository.CalculateRepository.ClearReportContent(tx, report.Id) | ||||
| 	if err != nil { | ||||
| 		tx.Rollback(ctx) | ||||
| 		_ = tx.Rollback(ctx) | ||||
| 		fmt.Println("18", err) | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	err = SaveSummary(tx, summary) | ||||
| 	if err != nil { | ||||
| 		tx.Rollback(ctx) | ||||
| 		_ = tx.Rollback(ctx) | ||||
| 		fmt.Println("19", err) | ||||
| 		return err | ||||
| 	} | ||||
| 	err = SavePublics(tx, *report, meters) | ||||
| 	err = SavePublics(tx, ctx, *report, meters) | ||||
| 	if err != nil { | ||||
| 		tx.Rollback(ctx) | ||||
| 		_ = tx.Rollback(ctx) | ||||
| 		fmt.Println("20", err) | ||||
| 		return err | ||||
| 	} | ||||
| 	err = SavePoolings(tx, *report, meters, meterRelations) | ||||
| 	if err != nil { | ||||
| 		tx.Rollback(ctx) | ||||
| 		_ = tx.Rollback(ctx) | ||||
| 		fmt.Println("21", err) | ||||
| 		return err | ||||
| 	} | ||||
| 	err = SaveTenements(tx, *report, tenementReports, tenementCharges) | ||||
| 	if err != nil { | ||||
| 		tx.Rollback(ctx) | ||||
| 		_ = tx.Rollback(ctx) | ||||
| 		fmt.Println("22", err) | ||||
| 		return err | ||||
| 	} | ||||
| 	tx.Commit(ctx) | ||||
| 	_ = tx.Commit(ctx) | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -12,9 +12,9 @@ Server: | ||||
|   ReadTimeout: 60 | ||||
|   WriteTimeout: 60 | ||||
| Redis: | ||||
|   Host: 192.168.88.129 | ||||
|   Host: 127.0.0.1 | ||||
|   Port: 6379 | ||||
|   Password: 123456 | ||||
|   Password: | ||||
|   DB: 1 | ||||
| Service: | ||||
|   MaxSessionLife: 2h | ||||
|   | ||||
		Reference in New Issue
	
	Block a user