doum
3 天以前 3c7399c25c0f35c8aa7cb6af1935e31d1a3f0102
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkDeskEnergyServiceImpl.java
@@ -1,7 +1,10 @@
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;
@@ -18,6 +21,7 @@
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;
@@ -42,13 +46,54 @@
    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);
@@ -93,31 +138,36 @@
        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())));
        }
        return normalizeBucket(bucket);
        try {
            Date date = DateUtil.StringToDate(text, READ_TIME_PATTERN);
            if (date != null) {
                return date.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDate();
            }
        } catch (Exception ignored) {
        }
        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "抄表时间格式不正确");
    }
    private static void upsertLatestReading(Map<String, Map<String, MeterDayReading>> meterDayLatest,