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.After(startTime) || readingAt.Equal(startTime) { 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 } // 确定指定非商户表计的结束读数 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 } } startTimes := []time.Time{ minReading.Time, periodEnding.Time, ShiftToAsiaShanghai(detachedAt), } 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.After(startTime) || readingAt.Equal(startTime) { 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 }