117 lines
3.7 KiB
Go
117 lines
3.7 KiB
Go
package calculate
|
|
|
|
import (
|
|
"electricity_bill_calc/model"
|
|
"electricity_bill_calc/model/calculate"
|
|
"electricity_bill_calc/repository"
|
|
"fmt"
|
|
"github.com/shopspring/decimal"
|
|
"time"
|
|
"unsafe"
|
|
)
|
|
|
|
// 核算园区中的全部公摊表计的电量用量
|
|
func PooledMetersCalculate(report *model.ReportIndex, periodStart time.Time,
|
|
periodEnd time.Time, meterDetails []*model.MeterDetail,
|
|
summary calculate.Summary) ([]calculate.Meter, error) {
|
|
poolingMeterReadings, err := repository.CalculateRepository.GetMeterReadings(report.Id, model.METER_INSTALLATION_POOLING)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
lastTermPoolingMeterReadings, err := repository.CalculateRepository.GetLastPeriodReadings(report.Id, model.METER_INSTALLATION_POOLING)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
poolingMeterReadings = append(poolingMeterReadings, lastTermPoolingMeterReadings...)
|
|
fmt.Println(poolingMeterReadings, "==============================================")
|
|
if len(poolingMeterReadings) <= 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
var poolingMetersReports []calculate.Meter
|
|
for _, meter := range meterDetails {
|
|
poolingMetersReport, err := determinePublicMeterConsumptions(meter.Code, periodStart, periodEnd, poolingMeterReadings, *meter, summary)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
poolingMetersReports = append(poolingMetersReports, poolingMetersReport)
|
|
}
|
|
return poolingMetersReports, nil
|
|
}
|
|
|
|
// 确定指定非商户表计在指定时间段内的全部电量
|
|
func determinePublicMeterConsumptions(meterId string, periodStart time.Time,
|
|
periodEnd time.Time, readings []model.MeterReading,
|
|
meterDetail model.MeterDetail, summary calculate.Summary) (calculate.Meter, error) {
|
|
startReading, err := DeterminePublicMeterStartReading(meterId, periodStart, meterDetail.DetachedAt.Time, readings)
|
|
if err != nil {
|
|
return calculate.Meter{}, err
|
|
}
|
|
|
|
endReading, err := DeterminePublicMeterEndReading(meterId, periodEnd, meterDetail.DetachedAt.Time, readings)
|
|
if err != nil {
|
|
return calculate.Meter{}, err
|
|
}
|
|
|
|
overall, err := ComputeOverall(*startReading, *endReading, summary)
|
|
if err != nil {
|
|
return calculate.Meter{}, err
|
|
}
|
|
|
|
critical, err := ComputeCritical(*startReading, *endReading, summary)
|
|
if err != nil {
|
|
return calculate.Meter{}, err
|
|
}
|
|
|
|
peak, err := ComputePeak(*startReading, *endReading, summary)
|
|
if err != nil {
|
|
return calculate.Meter{}, err
|
|
}
|
|
|
|
flat, err := ComputeFlat(*startReading, *endReading, summary)
|
|
if err != nil {
|
|
return calculate.Meter{}, err
|
|
}
|
|
|
|
valley, err := ComputeValley(*startReading, *endReading, summary)
|
|
if err != nil {
|
|
return calculate.Meter{}, err
|
|
}
|
|
|
|
return calculate.Meter{
|
|
Code: meterId,
|
|
Detail: meterDetail,
|
|
CoveredArea: meterDetail.Area.Decimal,
|
|
LastTermReading: (*calculate.Reading)(unsafe.Pointer(&model.Reading{
|
|
Ratio: startReading.Ratio,
|
|
Overall: startReading.Overall,
|
|
Critical: startReading.Critical,
|
|
Peak: startReading.Peak,
|
|
Flat: startReading.Flat,
|
|
Valley: startReading.Valley,
|
|
})),
|
|
CurrentTermReading: (*calculate.Reading)(unsafe.Pointer(&model.Reading{
|
|
Ratio: endReading.Ratio,
|
|
Overall: endReading.Overall,
|
|
Critical: endReading.Critical,
|
|
Peak: endReading.Peak,
|
|
Flat: endReading.Flat,
|
|
Valley: endReading.Valley,
|
|
})),
|
|
Overall: overall,
|
|
Critical: critical,
|
|
Peak: peak,
|
|
Flat: flat,
|
|
Valley: valley,
|
|
AdjustLoss: model.ConsumptionUnit{},
|
|
PooledBasic: model.ConsumptionUnit{},
|
|
PooledAdjust: model.ConsumptionUnit{},
|
|
PooledLoss: model.ConsumptionUnit{},
|
|
PooledPublic: model.ConsumptionUnit{},
|
|
SharedPoolingProportion: decimal.Decimal{},
|
|
Poolings: nil,
|
|
}, nil
|
|
}
|