108 lines
3.1 KiB
Go
108 lines
3.1 KiB
Go
package calculate
|
|
|
|
import (
|
|
"electricity_bill_calc/model"
|
|
"electricity_bill_calc/types"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// 确定指定非商户表计的起始读数
|
|
func DeterminePublicMeterStartReading(meterId string, periodStart time.Time,
|
|
attachedAt time.Time, meterReadings []model.MeterReading) (*model.MeterReading, error) {
|
|
periodBeginning := types.Date{Time: periodStart}.ToBeginningOfDate()
|
|
|
|
if len(meterReadings) <= 0 {
|
|
return nil, errors.New(fmt.Sprintf("表计的抄表记录数据不足%s", meterId))
|
|
}
|
|
|
|
var minReading types.DateTime
|
|
for _, reading := range meterReadings {
|
|
if reading.ReadAt.Before(minReading.Time) {
|
|
minReading = reading.ReadAt
|
|
}
|
|
}
|
|
startTimes := []time.Time{
|
|
minReading.Time,
|
|
periodBeginning.Time,
|
|
ShiftToAsiaShanghai(attachedAt),
|
|
}
|
|
if len(startTimes) < 0 {
|
|
return nil, errors.New(fmt.Sprintf("无法确定表计 {%s} 的计量的起始时间", meterId))
|
|
}
|
|
|
|
var startReading []model.MeterReading
|
|
for _, reading := range meterReadings {
|
|
readingAt := ShiftToAsiaShanghai(reading.ReadAt.UTC())
|
|
for _, startTime := range startTimes {
|
|
if reading.Meter == meterId && readingAt.Truncate(24*time.Hour).Equal(startTime.Truncate(24*time.Hour)) || readingAt.After(startTime) {
|
|
startReading = append(startReading, reading)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
fmt.Println(startReading)
|
|
|
|
if len(startReading) <= 0 {
|
|
return nil, errors.New(fmt.Sprintf("无法确定表计 %s 的计量的起始读数", meterId))
|
|
}
|
|
|
|
var startReadings *model.MeterReading
|
|
for _, readings := range startReading {
|
|
if startReadings == nil || readings.ReadAt.Before(startReadings.ReadAt.Time) {
|
|
startReadings = &readings
|
|
}
|
|
}
|
|
return startReadings, nil
|
|
}
|
|
|
|
// 确定指定非商户表计的结束读数
|
|
func DeterminePublicMeterEndReading(meterId string, periodEnd time.Time,
|
|
detachedAt time.Time, meterReadings []model.MeterReading) (*model.MeterReading, error) {
|
|
periodEnding := types.Date{Time: periodEnd}.ToEndingOfDate()
|
|
|
|
if len(meterReadings) <= 0 {
|
|
return nil, errors.New(fmt.Sprintf("表计的抄表记录数据不足%s", meterId))
|
|
}
|
|
|
|
var minReading types.DateTime
|
|
for _, reading := range meterReadings {
|
|
if reading.ReadAt.Before(minReading.Time) {
|
|
minReading = reading.ReadAt
|
|
}
|
|
}
|
|
endTimes := []time.Time{
|
|
minReading.Time,
|
|
periodEnding.Time,
|
|
ShiftToAsiaShanghai(detachedAt),
|
|
}
|
|
if len(endTimes) < 0 {
|
|
return nil, errors.New(fmt.Sprintf("无法确定表计 {%s} 的计量的终止时间", meterId))
|
|
}
|
|
|
|
var startReading []model.MeterReading
|
|
for _, reading := range meterReadings {
|
|
readingAt := ShiftToAsiaShanghai(reading.ReadAt.UTC())
|
|
for _, endTime := range endTimes {
|
|
if reading.Meter == meterId && readingAt.Truncate(24*time.Hour).Equal(endTime.Truncate(24*time.Hour)) || readingAt.Before(endTime) {
|
|
startReading = append(startReading, reading)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(startReading) <= 0 {
|
|
return nil, errors.New(fmt.Sprintf("无法确定表计 %s 的计量的终止读数", meterId))
|
|
}
|
|
|
|
var startReadings *model.MeterReading
|
|
for _, readings := range startReading {
|
|
if startReadings == nil || readings.ReadAt.Before(startReadings.ReadAt.Time) {
|
|
startReadings = &readings
|
|
}
|
|
}
|
|
return startReadings, nil
|
|
}
|