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:"type:numeric,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"` LastPeriodOverall decimal.Decimal `bun:"type:numeric,notnull" json:"lastPeriodOverall"` LastPeriodCritical decimal.Decimal `bun:"type:numeric,notnull" json:"lastPeriodCritical"` LastPeriodPeak decimal.Decimal `bun:"type:numeric,notnull" json:"lastPeriodPeak"` LastPeriodFlat decimal.Decimal `bun:"type:numeric,notnull" json:"lastPeriodFlat"` LastPeriodValley decimal.Decimal `bun:"type:numeric,notnull" json:"lastPeriodValley"` CurrentPeriodOverall decimal.Decimal `bun:"type:numeric,notnull" json:"currentPeriodOverall"` CurrentPeriodCritical decimal.Decimal `bun:"type:numeric,notnull" json:"currentPeriodCritical"` CurrentPeriodPeak decimal.Decimal `bun:"type:numeric,notnull" json:"currentPeriodPeak"` CurrentPeriodFlat decimal.Decimal `bun:"type:numeric,notnull" json:"currentPeriodFlat"` CurrentPeriodValley decimal.Decimal `bun:"type:numeric,notnull" json:"currentPeriodValley"` AdjustOverall decimal.Decimal `bun:"type:numeric,notnull" json:"adjustOverall"` AdjustCritical decimal.Decimal `bun:"type:numeric,notnull" json:"adjustCritical"` AdjustPeak decimal.Decimal `bun:"type:numeric,notnull" json:"adjustPeak"` AdjustFlat decimal.Decimal `bun:"type:numeric,notnull" json:"adjustFlat"` AdjustValley decimal.Decimal `bun:"type:numeric,notnull" json:"adjustValley"` Overall decimal.NullDecimal `bun:"type:numeric" json:"overall"` OverallFee decimal.NullDecimal `bun:"type:numeric" json:"overallFee"` OverallProportion decimal.Decimal `bun:"type:numeric,notnull" json:"-"` Critical decimal.NullDecimal `bun:"type:numeric" json:"critical"` CriticalFee decimal.NullDecimal `bun:"type:numeric" json:"criticalFee"` Peak decimal.NullDecimal `bun:"type:numeric" json:"peak"` PeakFee decimal.NullDecimal `bun:"type:numeric" json:"peakFee"` Flat decimal.NullDecimal `bun:"type:numeric" json:"flat"` FlatFee decimal.NullDecimal `bun:"type:numeric" json:"flatFee"` Valley decimal.NullDecimal `bun:"type:numeric" json:"valley"` ValleyFee decimal.NullDecimal `bun:"type:numeric" json:"valleyFee"` BasicFeeDiluted decimal.NullDecimal `bun:"type:numeric" json:"basicFeeDiluted"` AdjustFeeDiluted decimal.NullDecimal `bun:"type:numeric" json:"adjustFeeDiluted"` LossDiluted decimal.NullDecimal `bun:"type:numeric" json:"lossDiluted"` LossFeeDiluted decimal.NullDecimal `bun:"type:numeric" json:"lossFeeDiluted"` FinalDiluted decimal.NullDecimal `bun:"type:numeric" json:"finalDiluted"` FinalCharge decimal.NullDecimal `bun:"type:numeric" json:"finalCharge"` Initialize bool `bun:"-" json:"-"` Origin *Meter04KV `bun:"rel:belongs-to,join:park_id=park_id,join:meter_04kv_id=code" json:"-"` Report *Report `bun:"rel:belongs-to,join:report_id=id" json:"-"` Park *Park `bun:"rel:belongs-to,join:park_id=id" 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"` } type EndUserPeriodStat struct { CustomerName *string `json:"customerName"` Address *string `json:"address"` MeterId string `bun:"meter_04kv_id" json:"meterId"` IsPublicMeter bool `bun:"public_meter" json:"isPublicMeter"` Kind int8 `bun:"-" json:"pvKind"` Overall decimal.NullDecimal `json:"overall"` Critical decimal.NullDecimal `json:"critical"` Peak decimal.NullDecimal `json:"peak"` Valley decimal.NullDecimal `json:"valley"` OverallFee decimal.NullDecimal `json:"overallFee"` CriticalFee decimal.NullDecimal `json:"criticalFee"` PeakFee decimal.NullDecimal `json:"peakFee"` ValleyFee decimal.NullDecimal `json:"valleyFee"` AdjustFee decimal.NullDecimal `bun:"final_diluted" json:"adjustFee"` AdjustProportion decimal.NullDecimal `bun:"-" json:"adjustProportion"` }