forked from free-lancers/electricity_bill_calc_service
		
	[计算相关]计算线损以及调整线损(完成)
This commit is contained in:
		| @@ -7,25 +7,27 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| type ReportIndex struct { | type ReportIndex struct { | ||||||
| 	Id                    string          `json:"id"` | 	Id                          string          `json:"id"` | ||||||
| 	Park                  string          `json:"parkId" db:"park_id"` | 	Park                        string          `json:"parkId" db:"park_id"` | ||||||
| 	Period                types.DateRange `json:"period"` | 	Period                      types.DateRange `json:"period"` | ||||||
| 	Category              int16           `json:"category"` | 	Category                    int16           `json:"category"` | ||||||
| 	MeterType             int16           `json:"meter04kvType" db:"meter_04kv_type"` | 	MeterType                   int16           `json:"meter04kvType" db:"meter_04kv_type"` | ||||||
| 	PricePolicy           int16           `json:"pricePolicy"` | 	PricePolicy                 int16           `json:"pricePolicy"` | ||||||
| 	BasisPooled           int16           `json:"basisPooled"` | 	BasisPooled                 int16           `json:"basisPooled"` | ||||||
| 	AdjustPooled          int16           `json:"adjustPooled"` | 	AdjustPooled                int16           `json:"adjustPooled"` | ||||||
| 	LossPooled            int16           `json:"lossPooled"` | 	LossPooled                  int16           `json:"lossPooled"` | ||||||
| 	PublicPooled          int16           `json:"publicPooled"` | 	PublicPooled                int16           `json:"publicPooled"` | ||||||
| 	Published             bool            `json:"published"` | 	Published                   bool            `json:"published"` | ||||||
| 	PublishedAt           *types.DateTime `json:"publishedAt" db:"published_at"` | 	PublishedAt                 *types.DateTime `json:"publishedAt" db:"published_at"` | ||||||
| 	Withdraw              int16           `json:"withdraw"` | 	Withdraw                    int16           `json:"withdraw"` | ||||||
| 	LastWithdrawAppliedAt *types.DateTime `json:"lastWithdrawAppliedAt" db:"last_withdraw_applied_at"` | 	LastWithdrawAppliedAt       *types.DateTime `json:"lastWithdrawAppliedAt" db:"last_withdraw_applied_at"` | ||||||
| 	LastWithdrawAuditAt   *types.DateTime `json:"lastWithdrawAuditAt" db:"last_withdraw_audit_at"` | 	LastWithdrawAuditAt         *types.DateTime `json:"lastWithdrawAuditAt" db:"last_withdraw_audit_at"` | ||||||
| 	Status                *int16          `json:"status"` | 	Status                      *int16          `json:"status"` | ||||||
| 	Message               *string         `json:"message"` | 	Message                     *string         `json:"message"` | ||||||
| 	CreatedAt             types.DateTime  `json:"createdAt" db:"created_at"` | 	CreatedAt                   types.DateTime  `json:"createdAt" db:"created_at"` | ||||||
| 	LastModifiedAt        types.DateTime  `json:"lastModifiedAt" db:"last_modified_at"` | 	LastModifiedAt              types.DateTime  `json:"lastModifiedAt" db:"last_modified_at"` | ||||||
|  | 	AuthorizedLossRate          float64         `json:"authorized_loss_rate" db:"authorized_loss_rate"` | ||||||
|  | 	AuthorizedLossRateIncrement float64         `json:"authorized_loss_rate_increment" db:"authorized_loss_rate_increment"` | ||||||
| } | } | ||||||
|  |  | ||||||
| type ReportSummary struct { | type ReportSummary struct { | ||||||
|   | |||||||
| @@ -1,7 +1,10 @@ | |||||||
| package calculate | package calculate | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"electricity_bill_calc/model" | ||||||
| 	"electricity_bill_calc/model/calculate" | 	"electricity_bill_calc/model/calculate" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
| 	"github.com/shopspring/decimal" | 	"github.com/shopspring/decimal" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -37,3 +40,50 @@ func removeDuplicates(meters []calculate.Meter) []calculate.Meter { | |||||||
| 	} | 	} | ||||||
| 	return result | 	return result | ||||||
| } | } | ||||||
|  |  | ||||||
|  | //计算线损以及调整线损 | ||||||
|  | func LossCalculate(report *model.ReportIndex, Public []calculate.Meter, | ||||||
|  | 	publicTotal decimal.Decimal, summary calculate.Summary) error { | ||||||
|  | 	summary.Loss = summary.Overall.Amount.Sub(summary.TotalConsumption) | ||||||
|  |  | ||||||
|  | 	var summaryAmount decimal.Decimal | ||||||
|  | 	if summary.Overall.Amount == decimal.Zero { | ||||||
|  | 		summaryAmount = decimal.NewFromFloat(1.0) | ||||||
|  | 	} else { | ||||||
|  | 		summaryAmount = summary.Overall.Amount | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	summary.LossProportion = summary.Loss.Div(summaryAmount) | ||||||
|  |  | ||||||
|  | 	var authorizedLossRate decimal.Decimal | ||||||
|  | 	if summary.LossProportion.InexactFloat64() > report.AuthorizedLossRate { | ||||||
|  | 		authorizedLossRate = summary.LossProportion | ||||||
|  | 	} else { | ||||||
|  | 		return errors.New(fmt.Sprintf("经过核算园区的线损率为:{%.8f}, 核定线损率为:{%.8f}", summary.LossProportion.InexactFloat64(),authorizedLossRate.InexactFloat64())) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	summary.AuthoizeLoss = model.ConsumptionUnit{ | ||||||
|  | 		Amount:     decimal.NewFromFloat(summary.Overall.Amount.InexactFloat64() * authorizedLossRate.InexactFloat64()), | ||||||
|  | 		Fee:        decimal.NewFromFloat((summary.Overall.Amount.InexactFloat64() * authorizedLossRate.InexactFloat64()) * summary.Overall.Price.InexactFloat64()), | ||||||
|  | 		Price:      summary.Overall.Price, | ||||||
|  | 		Proportion: authorizedLossRate, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	differentialLoss := summary.LossDilutedPrice.Sub(summary.AuthoizeLoss.Amount) | ||||||
|  |  | ||||||
|  | 	if publicTotal.InexactFloat64() <= decimal.Zero.InexactFloat64() { | ||||||
|  | 		return errors.New("园区公共表计的电量总和为非正值,或者园区未设置公共表计,无法计算核定线损") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, meter := range Public { | ||||||
|  | 		amountProportion := meter.Overall.Amount.InexactFloat64() / publicTotal.InexactFloat64() | ||||||
|  | 		adjustAmount := differentialLoss.InexactFloat64() * decimal.NewFromFloat(-1.0).InexactFloat64() | ||||||
|  | 		meter.AdjustLoss = model.ConsumptionUnit{ | ||||||
|  | 			Amount:     decimal.NewFromFloat(adjustAmount), | ||||||
|  | 			Fee:        decimal.NewFromFloat(adjustAmount * summary.LossDilutedPrice.InexactFloat64()), | ||||||
|  | 			Price:      summary.LossDilutedPrice, | ||||||
|  | 			Proportion: decimal.NewFromFloat(amountProportion), | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|   | |||||||
| @@ -65,6 +65,12 @@ func MainCalculateProcess(rid string) { | |||||||
| 	//计算所有表计的总电量 | 	//计算所有表计的总电量 | ||||||
| 	parkTotal := TotalConsumptionCalculate(tenementReports, summary) | 	parkTotal := TotalConsumptionCalculate(tenementReports, summary) | ||||||
|  |  | ||||||
|  | 	err = LossCalculate(report, parkMetersReports, parkTotal, summary) | ||||||
|  | 	if err != nil { | ||||||
|  | 		fmt.Println("9", err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	fmt.Println(meterRelations, poolingMetersReports, parkMetersReports, parkTotal) | 	fmt.Println(meterRelations, poolingMetersReports, parkMetersReports, parkTotal) | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user