| | |
| | | package com.doumee.service.business.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.doumee.core.constants.ResponseStatus; |
| | | import com.doumee.core.exception.BusinessException; |
| | | import com.doumee.core.utils.Constants; |
| | | import com.doumee.core.utils.DateUtil; |
| | | import com.doumee.dao.business.YwConditionerUsageMapper; |
| | | import com.doumee.dao.business.YwElectricalDataMapper; |
| | | import com.doumee.dao.business.model.YwConditionerUsage; |
| | |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.time.format.DateTimeParseException; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | |
| | | public List<DailyEnergyStatVO> electricalDailyStats() { |
| | | LocalDate end = LocalDate.now(); |
| | | LocalDate start = end.minusDays(DAYS - 1L); |
| | | LocalDate queryStart = start.minusDays(1L); |
| | | return buildElectricalDailyStats(start, end); |
| | | } |
| | | |
| | | @Override |
| | | public String refreshElectricalDailyStatsForRange(String readTimeBegin, String readTimeEnd) { |
| | | if (StringUtils.isBlank(readTimeBegin) || StringUtils.isBlank(readTimeEnd)) { |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "抄表时间段不能为空"); |
| | | } |
| | | LocalDate start = parseDateTime(readTimeBegin.trim()).minusDays(1); |
| | | LocalDate end = parseDateTime(readTimeEnd.trim()).plusDays(1); |
| | | if (start.isAfter(end)) { |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "抄表时间段无效"); |
| | | } |
| | | buildElectricalDailyStats(start, end); |
| | | return "已刷新每日电量/电费统计(" + start.format(DATE_FMT) + " ~ " + end.format(DATE_FMT) + ")"; |
| | | } |
| | | |
| | | @Override |
| | | public List<DailyEnergyStatVO> conditionerDailyStats() { |
| | | LocalDate end = LocalDate.now(); |
| | | LocalDate start = end.minusDays(DAYS - 1L); |
| | | Map<String, DailyEnergyStatVO> bucket = initDailyBucket(start, end); |
| | | |
| | | List<YwElectricalData> rows = ywElectricalDataMapper.selectList(new QueryWrapper<YwElectricalData>().lambda() |
| | | .eq(YwElectricalData::getIsdeleted, Constants.ZERO) |
| | | .ge(YwElectricalData::getCreateDate, java.sql.Date.valueOf(queryStart)) |
| | | .le(YwElectricalData::getCreateDate, java.sql.Date.valueOf(end.plusDays(1)))); |
| | | List<YwConditionerUsage> rows = ywConditionerUsageMapper.selectList(new QueryWrapper<YwConditionerUsage>().lambda() |
| | | .eq(YwConditionerUsage::getIsdeleted, Constants.ZERO) |
| | | .ge(YwConditionerUsage::getUsageDate, java.sql.Date.valueOf(start)) |
| | | .le(YwConditionerUsage::getUsageDate, java.sql.Date.valueOf(end))); |
| | | |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | for (YwConditionerUsage row : rows) { |
| | | if (row.getUsageDate() == null) { |
| | | continue; |
| | | } |
| | | String dayKey = sdf.format(row.getUsageDate()); |
| | | if (!bucket.containsKey(dayKey)) { |
| | | continue; |
| | | } |
| | | DailyEnergyStatVO stat = bucket.get(dayKey); |
| | | stat.setTotalKwh(stat.getTotalKwh().add(nullToZero(row.getSumDl()))); |
| | | stat.setTotalFee(stat.getTotalFee().add(nullToZero(row.getSumDf()))); |
| | | } |
| | | return normalizeBucket(bucket); |
| | | } |
| | | |
| | | private List<DailyEnergyStatVO> buildElectricalDailyStats(LocalDate start, LocalDate end) { |
| | | LocalDate queryStart = start.minusDays(1L); |
| | | Map<String, DailyEnergyStatVO> bucket = initDailyBucket(start, end); |
| | | List<YwElectricalData> rows = loadElectricalRowsForStats(queryStart, end); |
| | | |
| | | SimpleDateFormat dayFmt = new SimpleDateFormat("yyyy-MM-dd"); |
| | | SimpleDateFormat readTimeFmt = new SimpleDateFormat(READ_TIME_PATTERN); |
| | |
| | | return normalizeBucket(bucket); |
| | | } |
| | | |
| | | @Override |
| | | public List<DailyEnergyStatVO> conditionerDailyStats() { |
| | | LocalDate end = LocalDate.now(); |
| | | LocalDate start = end.minusDays(DAYS - 1L); |
| | | Map<String, DailyEnergyStatVO> bucket = initDailyBucket(start, end); |
| | | private List<YwElectricalData> loadElectricalRowsForStats(LocalDate queryStart, LocalDate end) { |
| | | String queryStartStr = queryStart.format(DATE_FMT) + " 00:00:00"; |
| | | String queryEndStr = end.format(DATE_FMT) + " 23:59:59"; |
| | | return ywElectricalDataMapper.selectList(new QueryWrapper<YwElectricalData>().lambda() |
| | | .eq(YwElectricalData::getIsdeleted, Constants.ZERO) |
| | | .and(w -> w.and(w1 -> w1.isNotNull(YwElectricalData::getAddTime) |
| | | .ne(YwElectricalData::getAddTime, "") |
| | | .ge(YwElectricalData::getAddTime, queryStartStr) |
| | | .le(YwElectricalData::getAddTime, queryEndStr)) |
| | | .or(w2 -> w2.and(w3 -> w3.isNull(YwElectricalData::getAddTime) |
| | | .or().eq(YwElectricalData::getAddTime, "")) |
| | | .ge(YwElectricalData::getCreateDate, java.sql.Date.valueOf(queryStart)) |
| | | .le(YwElectricalData::getCreateDate, java.sql.Date.valueOf(end.plusDays(1)))))); |
| | | } |
| | | |
| | | List<YwConditionerUsage> rows = ywConditionerUsageMapper.selectList(new QueryWrapper<YwConditionerUsage>().lambda() |
| | | .eq(YwConditionerUsage::getIsdeleted, Constants.ZERO) |
| | | .ge(YwConditionerUsage::getUsageDate, java.sql.Date.valueOf(start)) |
| | | .le(YwConditionerUsage::getUsageDate, java.sql.Date.valueOf(end))); |
| | | |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | for (YwConditionerUsage row : rows) { |
| | | if (row.getUsageDate() == null) { |
| | | continue; |
| | | private static LocalDate parseDateTime(String text) { |
| | | if (text.length() >= 10) { |
| | | try { |
| | | return LocalDate.parse(text.substring(0, 10), DATE_FMT); |
| | | } catch (DateTimeParseException ignored) { |
| | | } |
| | | String dayKey = sdf.format(row.getUsageDate()); |
| | | if (!bucket.containsKey(dayKey)) { |
| | | continue; |
| | | } |
| | | DailyEnergyStatVO stat = bucket.get(dayKey); |
| | | stat.setTotalKwh(stat.getTotalKwh().add(nullToZero(row.getSumDl()))); |
| | | stat.setTotalFee(stat.getTotalFee().add(nullToZero(row.getSumDf()))); |
| | | try { |
| | | Date date = DateUtil.StringToDate(text, READ_TIME_PATTERN); |
| | | if (date != null) { |
| | | return date.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate(); |
| | | } |
| | | return normalizeBucket(bucket); |
| | | } catch (Exception ignored) { |
| | | } |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "抄表时间格式不正确"); |
| | | } |
| | | |
| | | private static void upsertLatestReading(Map<String, Map<String, MeterDayReading>> meterDayLatest, |