[计算相关]计算线损以及调整线损(完成)
This commit is contained in:
parent
8fc463bd9d
commit
6b3d3dd93c
|
@ -7,25 +7,27 @@ import (
|
|||
)
|
||||
|
||||
type ReportIndex struct {
|
||||
Id string `json:"id"`
|
||||
Park string `json:"parkId" db:"park_id"`
|
||||
Period types.DateRange `json:"period"`
|
||||
Category int16 `json:"category"`
|
||||
MeterType int16 `json:"meter04kvType" db:"meter_04kv_type"`
|
||||
PricePolicy int16 `json:"pricePolicy"`
|
||||
BasisPooled int16 `json:"basisPooled"`
|
||||
AdjustPooled int16 `json:"adjustPooled"`
|
||||
LossPooled int16 `json:"lossPooled"`
|
||||
PublicPooled int16 `json:"publicPooled"`
|
||||
Published bool `json:"published"`
|
||||
PublishedAt *types.DateTime `json:"publishedAt" db:"published_at"`
|
||||
Withdraw int16 `json:"withdraw"`
|
||||
LastWithdrawAppliedAt *types.DateTime `json:"lastWithdrawAppliedAt" db:"last_withdraw_applied_at"`
|
||||
LastWithdrawAuditAt *types.DateTime `json:"lastWithdrawAuditAt" db:"last_withdraw_audit_at"`
|
||||
Status *int16 `json:"status"`
|
||||
Message *string `json:"message"`
|
||||
CreatedAt types.DateTime `json:"createdAt" db:"created_at"`
|
||||
LastModifiedAt types.DateTime `json:"lastModifiedAt" db:"last_modified_at"`
|
||||
Id string `json:"id"`
|
||||
Park string `json:"parkId" db:"park_id"`
|
||||
Period types.DateRange `json:"period"`
|
||||
Category int16 `json:"category"`
|
||||
MeterType int16 `json:"meter04kvType" db:"meter_04kv_type"`
|
||||
PricePolicy int16 `json:"pricePolicy"`
|
||||
BasisPooled int16 `json:"basisPooled"`
|
||||
AdjustPooled int16 `json:"adjustPooled"`
|
||||
LossPooled int16 `json:"lossPooled"`
|
||||
PublicPooled int16 `json:"publicPooled"`
|
||||
Published bool `json:"published"`
|
||||
PublishedAt *types.DateTime `json:"publishedAt" db:"published_at"`
|
||||
Withdraw int16 `json:"withdraw"`
|
||||
LastWithdrawAppliedAt *types.DateTime `json:"lastWithdrawAppliedAt" db:"last_withdraw_applied_at"`
|
||||
LastWithdrawAuditAt *types.DateTime `json:"lastWithdrawAuditAt" db:"last_withdraw_audit_at"`
|
||||
Status *int16 `json:"status"`
|
||||
Message *string `json:"message"`
|
||||
CreatedAt types.DateTime `json:"createdAt" db:"created_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 {
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
package calculate
|
||||
|
||||
import (
|
||||
"electricity_bill_calc/model"
|
||||
"electricity_bill_calc/model/calculate"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/shopspring/decimal"
|
||||
)
|
||||
|
||||
|
@ -37,3 +40,50 @@ func removeDuplicates(meters []calculate.Meter) []calculate.Meter {
|
|||
}
|
||||
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)
|
||||
|
||||
err = LossCalculate(report, parkMetersReports, parkTotal, summary)
|
||||
if err != nil {
|
||||
fmt.Println("9", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println(meterRelations, poolingMetersReports, parkMetersReports, parkTotal)
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user