116 lines
6.5 KiB
Go
116 lines
6.5 KiB
Go
package model
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/shopspring/decimal"
|
|
"github.com/uptrace/bun"
|
|
)
|
|
|
|
type EndUserDetail struct {
|
|
bun.BaseModel `bun:"table:end_user_detail,alias:eud"`
|
|
CreatedAndModified `bun:"extend"`
|
|
ReportId string `bun:",pk,notnull" json:"reportId"`
|
|
ParkId string `bun:",pk,notnull" json:"parkId"`
|
|
MeterId string `bun:"meter_04kv_id,pk,notnull" json:"meterId"`
|
|
Seq int64 `bun:"type:bigint,notnull" json:"seq"`
|
|
Ratio decimal.Decimal `bun:",notnull" json:"ratio"`
|
|
Address *string `json:"address"`
|
|
CustomerName *string `json:"customerName"`
|
|
ContactName *string `json:"contactName"`
|
|
ContactPhone *string `json:"contactPhone"`
|
|
IsPublicMeter bool `bun:"public_meter,notnull" json:"isPublicMeter"`
|
|
WillDilute bool `bun:"dilute,notnull" json:"willDilute"`
|
|
LastPeriodOverall decimal.Decimal `bun:",notnull" json:"lastPeriodOverall"`
|
|
LastPeriodCritical decimal.Decimal `bun:",notnull" json:"lastPeriodCritical"`
|
|
LastPeriodPeak decimal.Decimal `bun:",notnull" json:"lastPeriodPeak"`
|
|
LastPeriodFlat decimal.Decimal `bun:",notnull" json:"lastPeriodFlat"`
|
|
LastPeriodValley decimal.Decimal `bun:",notnull" json:"lastPeriodValley"`
|
|
CurrentPeriodOverall decimal.Decimal `bun:",notnull" json:"currentPeriodOverall"`
|
|
CurrentPeriodCritical decimal.Decimal `bun:",notnull" json:"currentPeriodCritical"`
|
|
CurrentPeriodPeak decimal.Decimal `bun:",notnull" json:"currentPeriodPeak"`
|
|
CurrentPeriodFlat decimal.Decimal `bun:",notnull" json:"currentPeriodFlat"`
|
|
CurrentPeriodValley decimal.Decimal `bun:",notnull" json:"currentPeriodValley"`
|
|
AdjustOverall decimal.Decimal `bun:",notnull" json:"adjustOverall"`
|
|
AdjustCritical decimal.Decimal `bun:",notnull" json:"adjustCritical"`
|
|
AdjustPeak decimal.Decimal `bun:",notnull" json:"adjustPeak"`
|
|
AdjustFlat decimal.Decimal `bun:",notnull" json:"adjustFlat"`
|
|
AdjustValley decimal.Decimal `bun:",notnull" json:"adjustValley"`
|
|
Overall decimal.NullDecimal `json:"overall"`
|
|
OverallFee decimal.NullDecimal `json:"overallFee"`
|
|
OverallProportion decimal.Decimal `bun:",notnull" json:"-"`
|
|
Critical decimal.NullDecimal `json:"critical"`
|
|
CriticalFee decimal.NullDecimal `json:"criticalFee"`
|
|
Peak decimal.NullDecimal `json:"peak"`
|
|
PeakFee decimal.NullDecimal `json:"peakFee"`
|
|
Flat decimal.NullDecimal `json:"flat"`
|
|
FlatFee decimal.NullDecimal `json:"flatFee"`
|
|
Valley decimal.NullDecimal `json:"valley"`
|
|
ValleyFee decimal.NullDecimal `json:"valleyFee"`
|
|
BasicFeeDiluted decimal.NullDecimal `json:"basicFeeDiluted"`
|
|
AdjustFeeDiluted decimal.NullDecimal `json:"adjustFeeDiluted"`
|
|
LossDiluted decimal.NullDecimal `json:"lossDiluted"`
|
|
LossFeeDiluted decimal.NullDecimal `json:"lossFeeDiluted"`
|
|
MaintenanceFeeDiluted decimal.NullDecimal `json:"maintenanceFeeDiluted"`
|
|
PublicConsumptionDiluted decimal.NullDecimal `json:"publicConsumptionDiluted"`
|
|
FinalDiluted decimal.NullDecimal `json:"finalDiluted"`
|
|
FinalCharge decimal.NullDecimal `json:"finalCharge"`
|
|
Initialize bool `bun:"-" json:"-"`
|
|
Origin *Meter04KV `bun:"rel:belongs-to,join:park_id=park_id,join:meter_04kv_id=code" json:"-"`
|
|
}
|
|
|
|
var _ bun.BeforeAppendModelHook = (*EndUserDetail)(nil)
|
|
|
|
func (d *EndUserDetail) BeforeAppendModel(ctx context.Context, query bun.Query) error {
|
|
oprTime := time.Now()
|
|
switch query.(type) {
|
|
case *bun.InsertQuery:
|
|
d.CreatedAt = oprTime
|
|
d.LastModifiedAt = &oprTime
|
|
case *bun.UpdateQuery:
|
|
d.LastModifiedAt = &oprTime
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (d EndUserDetail) Validate() (bool, error) {
|
|
lastPeriodSum := decimal.Sum(d.LastPeriodCritical, d.LastPeriodPeak, d.LastPeriodValley)
|
|
if lastPeriodSum.GreaterThan(d.LastPeriodOverall) {
|
|
return false, errors.New("上期峰谷计量总量大于上期总计电量")
|
|
}
|
|
currentPeriodSum := decimal.Sum(d.CurrentPeriodCritical, d.CurrentPeriodPeak, d.CurrentPeriodValley)
|
|
if currentPeriodSum.GreaterThan(d.CurrentPeriodOverall) {
|
|
return false, errors.New("本期峰谷计量总量大于本期总计电量")
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
func (d *EndUserDetail) CalculatePeriod() {
|
|
d.LastPeriodFlat = d.LastPeriodOverall.Sub(d.LastPeriodCritical).Sub(d.LastPeriodPeak).Sub(d.LastPeriodValley)
|
|
d.CurrentPeriodFlat = d.CurrentPeriodOverall.Sub(d.CurrentPeriodCritical).Sub(d.CurrentPeriodPeak).Sub(d.CurrentPeriodValley)
|
|
d.Overall = decimal.NewNullDecimal(d.CurrentPeriodOverall.Sub(d.LastPeriodOverall).Mul(d.Ratio).Add(d.AdjustOverall).RoundBank(2))
|
|
d.Critical = decimal.NewNullDecimal(d.CurrentPeriodCritical.Sub(d.LastPeriodCritical).Mul(d.Ratio).Add(d.AdjustCritical).RoundBank(2))
|
|
d.Peak = decimal.NewNullDecimal(d.CurrentPeriodPeak.Sub(d.LastPeriodPeak).Mul(d.Ratio).Add(d.AdjustPeak).RoundBank(2))
|
|
d.Flat = decimal.NewNullDecimal(d.CurrentPeriodFlat.Sub(d.LastPeriodFlat).Mul(d.Ratio).Add(d.AdjustFlat).RoundBank(2))
|
|
d.Valley = decimal.NewNullDecimal(d.CurrentPeriodValley.Sub(d.LastPeriodValley).Mul(d.Ratio).Add(d.AdjustValley).RoundBank(2))
|
|
}
|
|
|
|
type EndUserImport struct {
|
|
MeterId string `excel:"meterId"`
|
|
LastPeriodOverall decimal.Decimal `excel:"lastPeriodOverall"`
|
|
CurrentPeriodOverall decimal.Decimal `excel:"currentPeriodOverall"`
|
|
LastPeriodCritical decimal.NullDecimal `excel:"lastPeriodCritical"`
|
|
LastPeriodPeak decimal.NullDecimal `excel:"lastPeriodPeak"`
|
|
LastPeriodValley decimal.NullDecimal `excel:"lastPeriodValley"`
|
|
CurrentPeriodCritical decimal.NullDecimal `excel:"currentPeriodCritical"`
|
|
CurrentPeriodPeak decimal.NullDecimal `excel:"currentPeriodPeak"`
|
|
CurrentPeriodValley decimal.NullDecimal `excel:"currentPeriodValley"`
|
|
AdjustOverall decimal.Decimal `excel:"adjustOverall"`
|
|
AdjustCritical decimal.NullDecimal `excel:"adjustCritical"`
|
|
AdjustPeak decimal.NullDecimal `excel:"adjustPeak"`
|
|
AdjustFlat decimal.NullDecimal `excel:"adjustFlat"`
|
|
AdjustValley decimal.NullDecimal `excel:"adjustValley"`
|
|
}
|