From f2e6b406fa26258c334c685e988e2343f70c13f3 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 10 Jul 2026 12:22:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=94=B5=E7=AB=99?= =?UTF-8?q?=E9=94=9A=E7=82=B9=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yfd/platform/config/JobRunner.java | 4 + .../qgc_base/domain/vo/EngPointVo.java | 4 + .../service/impl/SdEngInfoBHServiceImpl.java | 25 +++++- .../qgc_job/service/IEqJobService.java | 8 ++ .../service/impl/EqJobServiceImpl.java | 85 +++++++++++++++++++ .../qgc_job/vo/EqAnchorPointLastDateVo.java | 79 +++++++++++++++++ 6 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_job/service/IEqJobService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_job/service/impl/EqJobServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_job/vo/EqAnchorPointLastDateVo.java diff --git a/backend/src/main/java/com/yfd/platform/config/JobRunner.java b/backend/src/main/java/com/yfd/platform/config/JobRunner.java index fc760aeb..6154f2d6 100644 --- a/backend/src/main/java/com/yfd/platform/config/JobRunner.java +++ b/backend/src/main/java/com/yfd/platform/config/JobRunner.java @@ -20,6 +20,7 @@ import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.yfd.platform.qgc_env.wq.entity.ao.JobBaseAo; import com.yfd.platform.qgc_env.wq.service.EnvWqDataService; +import com.yfd.platform.qgc_job.service.IEqJobService; import com.yfd.platform.system.domain.QuartzJob; import com.yfd.platform.system.mapper.QuartzJobMapper; import com.yfd.platform.utils.QuartzManage; @@ -47,6 +48,7 @@ public class JobRunner implements ApplicationRunner { private final QuartzJobMapper quartzJobMapper; private final QuartzManage quartzManage; private final EnvWqDataService envWqDataService; + private final IEqJobService iEqJobService; /** * 项目启动时重新激活启用的定时任务 @@ -69,6 +71,8 @@ public class JobRunner implements ApplicationRunner { ao.setStartTime(DateUtil.beginOfYear(DateUtil.offset(ao.getEndTime(), DateField.YEAR,-1))); } envWqDataService.wqLastData(ao); + + iEqJobService.eqAnchorPointLastDate( ao); log.info("--------------------wq最新一条数据---------------------"); } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngPointVo.java index c693d44d..ad4444c9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngPointVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngPointVo.java @@ -1,5 +1,6 @@ package com.yfd.platform.qgc_base.domain.vo; +import com.yfd.platform.qgc_eng.eq.entity.vo.LastTmEngEqDataVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -99,4 +100,7 @@ public class EngPointVo { @Schema(description = "基地排序") private Integer baseStepSort; + + @Schema(description="电站最新数据:入库流量和出库流量") + private LastTmEngEqDataVo lastTmEngEqDataVo; } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index ab376ac5..9beaa978 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -42,8 +43,10 @@ import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper; import com.yfd.platform.qgc_base.service.IDataScopeFilterService; import com.yfd.platform.qgc_base.service.IMsOperationLogService; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; +import com.yfd.platform.qgc_eng.eq.entity.vo.LastTmEngEqDataVo; import com.yfd.platform.system.service.IAdminAuthService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import com.yfd.platform.utils.RedisCacheUtil; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.cache.annotation.CacheEvict; @@ -65,7 +68,8 @@ import java.util.stream.Collectors; public class SdEngInfoBHServiceImpl extends ServiceImpl implements ISdEngInfoBHService { private static final Map ENG_CODE_NAME_FIELD_MAP = new LinkedHashMap<>(); - + @Resource + private RedisCacheUtil redisCacheUtil; @Resource private IDataScopeFilterService dataScopeFilterService; @@ -2924,7 +2928,24 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EngPointVo.class); - + if(CollUtil.isNotEmpty(list)){ + for( EngPointVo engPointVo: list ){ + String stcd = engPointVo.getStcd(); + //查询最新一条数据的缓存 + LastTmEngEqDataVo lastTmEngEqDataVo = redisCacheUtil.fromJson(redisCacheUtil.getString("eqAnchorPointLastDate:"+stcd),LastTmEngEqDataVo.class); + if (ObjectUtil.isEmpty(lastTmEngEqDataVo)){ + lastTmEngEqDataVo = new LastTmEngEqDataVo(); + lastTmEngEqDataVo.setStcd(engPointVo.getStcd()); + }else{ + lastTmEngEqDataVo.setStcd(engPointVo.getStcd()); + } + // 设置电站名称、装机容量、正常蓄水位 + lastTmEngEqDataVo.setStnm(engPointVo.getEnnm()); + lastTmEngEqDataVo.setTtpwr(engPointVo.getTtpwr()); + lastTmEngEqDataVo.setNormz(engPointVo.getNormz()); + engPointVo.setLastTmEngEqDataVo(lastTmEngEqDataVo); + } + } result.setData(list); result.setTotal(page == null ? list.size() : page.getTotal()); return result; diff --git a/backend/src/main/java/com/yfd/platform/qgc_job/service/IEqJobService.java b/backend/src/main/java/com/yfd/platform/qgc_job/service/IEqJobService.java new file mode 100644 index 00000000..05285586 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_job/service/IEqJobService.java @@ -0,0 +1,8 @@ +package com.yfd.platform.qgc_job.service; + +import com.yfd.platform.qgc_env.wq.entity.ao.JobBaseAo; + +public interface IEqJobService { + + void eqAnchorPointLastDate(JobBaseAo ao); +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_job/service/impl/EqJobServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_job/service/impl/EqJobServiceImpl.java new file mode 100644 index 00000000..d5dcd9ea --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_job/service/impl/EqJobServiceImpl.java @@ -0,0 +1,85 @@ +package com.yfd.platform.qgc_job.service.impl; + +import cn.hutool.json.JSONUtil; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.wq.entity.ao.JobBaseAo; +import com.yfd.platform.qgc_job.service.IEqJobService; +import com.yfd.platform.qgc_job.vo.EqAnchorPointLastDateVo; +import com.yfd.platform.utils.RedisCacheUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class EqJobServiceImpl implements IEqJobService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Resource + private RedisCacheUtil redisCacheUtil; + + @Override + public void eqAnchorPointLastDate(JobBaseAo ao) { + Map paramMap = new HashMap<>(); + // 旧逻辑只按当前时间截取最新一条工程运行数据,ao 在此方法中不参与过滤 + paramMap.put("currentTime", new Date()); + + List eqDataVos = microservicDynamicSQLMapper.getAllListWithResultType( + buildEqAnchorPointLastDateSql(), + paramMap, + EqAnchorPointLastDateVo.class + ); + for (EqAnchorPointLastDateVo eqDataVo : eqDataVos) { + redisCacheUtil.setString("eqAnchorPointLastDate:" + eqDataVo.getStcd(), JSONUtil.toJsonStr(eqDataVo)); + } + } + + private String buildEqAnchorPointLastDateSql() { + return "SELECT " + + "run.STCD AS stcd, " + + "run.TM AS tm, " + + "run.QI AS qi, " + + "run.QO AS qo, " + + "run.RZ AS rz, " + + "run.DZ AS dz, " + + "qec.QEC_LIMIT AS qecLimit, " + + "qec.QEC_C AS qecC, " + + "qec.MWR_LIMIT AS mwrLimit, " + + "qec.MWR_C AS mwrC, " + + "NVL(qec.AVQ_LIMIT, eng.AVQ) AS avqLimit, " + + "qec.AVQ_C AS avqC, " + + "qecDetail.VLSR AS vlsr, " + + "qecDetail.VLSR_TM AS vlsrTm, " + + "mwrDetail.VLSR AS mwrVlsr, " + + "mwrDetail.VLSR_TM AS mwrVlsrTm " + + "FROM ( " + + " SELECT STCD, MAX(TM) AS TM " + + " FROM SD_HYDROPW_R " + + " WHERE NVL(IS_DELETED, 0) = 0 " + + " AND TM <= #{map.currentTime} " + + " GROUP BY STCD " + + ") lastRun " + + "INNER JOIN SD_HYDROPW_R run " + + " ON lastRun.STCD = run.STCD " + + " AND lastRun.TM = run.TM " + + " AND NVL(run.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_QEC_R qec " + + " ON qec.STCD = run.STCD " + + " AND qec.TM = run.TM " + + " AND NVL(qec.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_ENGINFO_B_H eng " + + " ON eng.STCD = run.STCD " + + " AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN MS_WARN_RULE_DETAIL_B qecDetail " + + " ON qecDetail.ID = qec.QEC_RULE_DID " + + " AND NVL(qecDetail.IS_DELETED, 0) = 0 " + + "LEFT JOIN MS_WARN_RULE_DETAIL_B mwrDetail " + + " ON mwrDetail.ID = qec.QEC_MWRRULE_DID " + + " AND NVL(mwrDetail.IS_DELETED, 0) = 0"; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_job/vo/EqAnchorPointLastDateVo.java b/backend/src/main/java/com/yfd/platform/qgc_job/vo/EqAnchorPointLastDateVo.java new file mode 100644 index 00000000..78889407 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_job/vo/EqAnchorPointLastDateVo.java @@ -0,0 +1,79 @@ +package com.yfd.platform.qgc_job.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "电站锚点最新缓存数据") +public class EqAnchorPointLastDateVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "数据时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date tm; + + @Schema(description = "装机容量") + private BigDecimal ttpwr; + + @Schema(description = "生态流量限值(环保部)") + private BigDecimal qecLimit; + + @Schema(description = "生态流量限值(水利部)") + private BigDecimal mwrLimit; + + @Schema(description = "生态流量限值(多年平均)") + private BigDecimal avqLimit; + + @Schema(description = "生态流量系数(环保部)") + private BigDecimal qecC; + + @Schema(description = "生态流量系数(水利部)") + private BigDecimal mwrC; + + @Schema(description = "生态流量系数(多年平均)") + private BigDecimal avqC; + + @Schema(description = "正常蓄水位") + private BigDecimal normz; + + @Schema(description = "死水位") + private BigDecimal ddz; + + @Schema(description = "入库流量") + private BigDecimal qi; + + @Schema(description = "出库流量") + private BigDecimal qo; + + @Schema(description = "坝上水位") + private BigDecimal rz; + + @Schema(description = "坝下水位") + private BigDecimal dz; + + @Schema(description = "规则来源") + private String vlsr; + + @Schema(description = "规则来源时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date vlsrTm; + + @Schema(description = "规则来源(水利部)") + private String mwrVlsr; + + @Schema(description = "规则来源时间(水利部)") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date mwrVlsrTm; +}