fix: 优化水质锚点数据获取

This commit is contained in:
tangwei 2026-07-10 11:17:30 +08:00
parent b1bdb4cf66
commit 693408a59a
9 changed files with 633 additions and 10 deletions

View File

@ -15,7 +15,11 @@
*/ */
package com.yfd.platform.config; package com.yfd.platform.config;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.system.domain.QuartzJob; import com.yfd.platform.system.domain.QuartzJob;
import com.yfd.platform.system.mapper.QuartzJobMapper; import com.yfd.platform.system.mapper.QuartzJobMapper;
import com.yfd.platform.utils.QuartzManage; import com.yfd.platform.utils.QuartzManage;
@ -42,6 +46,7 @@ public class JobRunner implements ApplicationRunner {
private static final Logger log = LoggerFactory.getLogger(JobRunner.class); private static final Logger log = LoggerFactory.getLogger(JobRunner.class);
private final QuartzJobMapper quartzJobMapper; private final QuartzJobMapper quartzJobMapper;
private final QuartzManage quartzManage; private final QuartzManage quartzManage;
private final EnvWqDataService envWqDataService;
/** /**
* 项目启动时重新激活启用的定时任务 * 项目启动时重新激活启用的定时任务
@ -55,5 +60,15 @@ public class JobRunner implements ApplicationRunner {
quartzJobMapper.selectList(new LambdaQueryWrapper<QuartzJob>().eq(QuartzJob::getStatus, "1")); quartzJobMapper.selectList(new LambdaQueryWrapper<QuartzJob>().eq(QuartzJob::getStatus, "1"));
quartzJobs.forEach(quartzManage::addJob); quartzJobs.forEach(quartzManage::addJob);
log.info("--------------------定时任务注入完成---------------------"); log.info("--------------------定时任务注入完成---------------------");
JobBaseAo ao = new JobBaseAo();
//如果没有传递时间则默认为上个月的开始到现在
if (null == ao.getEndTime()){
ao.setEndTime(DateUtil.date());
}
if (null == ao.getStartTime()){
ao.setStartTime(DateUtil.beginOfYear(DateUtil.offset(ao.getEndTime(), DateField.YEAR,-1)));
}
envWqDataService.wqLastData(ao);
log.info("--------------------wq最新一条数据---------------------");
} }
} }

View File

@ -0,0 +1,310 @@
package com.yfd.platform.qgc_env.wq.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@TableName("SD_WQ_R")
@Schema(description = "水质监测数据表实体")
public class SdWqR {
@TableId(value = "ID", type = IdType.ASSIGN_UUID)
@Schema(description = "主键")
private String id;
@TableField("STCD")
@Schema(description = "站码")
private String stcd;
@TableField("TM")
@Schema(description = "采样时间")
private Date tm;
@TableField("WQGRD")
@Schema(description = "水质类别")
private String wqgrd;
@Schema(description = "水质类别")
@TableField(exist = false)
private String wqgrdName;
@TableField("PERIOD")
@Schema(description = "丰平枯时期")
private String period;
@TableField("SPSTLC")
@Schema(description = "水平位置")
private Long spstlc;
@TableField("WTMP")
@Schema(description = "水温")
private BigDecimal wtmp;
@TableField("PH")
@Schema(description = "PH")
private BigDecimal ph;
@TableField("DOX")
@Schema(description = "溶解氧")
private BigDecimal dox;
@TableField("CODMN")
@Schema(description = "高锰酸盐指数")
private BigDecimal codmn;
@TableField("CODCR")
@Schema(description = "化学需氧量")
private BigDecimal codcr;
@TableField("BOD5")
@Schema(description = "五日生化需氧量")
private BigDecimal bod5;
@TableField("NH3N")
@Schema(description = "氨氮")
private BigDecimal nh3n;
@TableField("TP")
@Schema(description = "总磷")
private BigDecimal tp;
@TableField("TN")
@Schema(description = "总氮")
private BigDecimal tn;
@TableField("CU")
@Schema(description = "")
private BigDecimal cu;
@TableField("ZN")
@Schema(description = "")
private BigDecimal zn;
@TableField("F")
@Schema(description = "氟化物")
private BigDecimal f;
@TableField("SE")
@Schema(description = "")
private BigDecimal se;
@TableField("ARS")
@Schema(description = "")
private BigDecimal ars;
@TableField("HG")
@Schema(description = "")
private BigDecimal hg;
@TableField("CD")
@Schema(description = "")
private BigDecimal cd;
@TableField("CR6")
@Schema(description = "铬(六价)")
private BigDecimal cr6;
@TableField("PB")
@Schema(description = "")
private BigDecimal pb;
@TableField("CN")
@Schema(description = "氰化物")
private BigDecimal cn;
@TableField("VLPH")
@Schema(description = "挥发酚")
private BigDecimal vlph;
@TableField("OIL")
@Schema(description = "石油类")
private BigDecimal oil;
@TableField("LAS")
@Schema(description = "阴离子表面活性剂")
private BigDecimal las;
@TableField("S2")
@Schema(description = "硫化物")
private BigDecimal s2;
@TableField("FCG")
@Schema(description = "粪大肠菌群")
private BigDecimal fcg;
@TableField("CL")
@Schema(description = "氯化物")
private BigDecimal cl;
@TableField("SO4")
@Schema(description = "硫酸盐")
private BigDecimal so4;
@TableField("NO3")
@Schema(description = "硝氮/硝酸盐氮")
private BigDecimal no3;
@TableField("THRD")
@Schema(description = "总硬度")
private BigDecimal thrd;
@TableField("COND")
@Schema(description = "电导率")
private BigDecimal cond;
@TableField("FE")
@Schema(description = "")
private BigDecimal fe;
@TableField("MN")
@Schema(description = "")
private BigDecimal mn;
@TableField("AL")
@Schema(description = "")
private BigDecimal al;
@TableField("CHLA")
@Schema(description = "叶绿素a")
private BigDecimal chla;
@TableField("CLARITY")
@Schema(description = "透明度")
private BigDecimal clarity;
@TableField("TU")
@Schema(description = "浊度")
private BigDecimal tu;
@TableField("CYANO")
@Schema(description = "蓝绿藻")
private BigDecimal cyano;
@TableField("NI")
@Schema(description = "")
private BigDecimal ni;
@TableField("TOD")
@Schema(description = "总氧/总需氧量")
private BigDecimal tod;
@TableField("SFDB")
@Schema(description = "是否达标")
private Integer sfdb;
@TableField("FID")
@Schema(description = "文件ID")
private String fid;
@TableField("VLSR")
@Schema(description = "数据来源")
private String vlsr;
@TableField("WQ_SFDBHN_YS")
@Schema(description = "水质不达标的要素")
private String wqSfdbhnYs;
@TableField("REMARK")
@Schema(description = "备注")
private String remark;
@TableField("TLI_SUM")
@Schema(description = "综合营养状态指数")
private BigDecimal tliSum;
@TableField("TLI_SUM_LEVEL")
@Schema(description = "综合营养状态指数分级")
private String tliSumLevel;
@TableField("CA")
@Schema(description = "")
private BigDecimal ca;
@TableField("PO4")
@Schema(description = "磷酸盐")
private BigDecimal po4;
@TableField("N_NO2")
@Schema(description = "亚硝酸盐氮(弃用)")
private BigDecimal nNo2;
@TableField("NA")
@Schema(description = "")
private BigDecimal na;
@TableField("K")
@Schema(description = "")
private BigDecimal k;
@TableField("TOC")
@Schema(description = "总有机碳")
private BigDecimal toc;
@TableField("OPOR")
@Schema(description = "有机磷农药")
private BigDecimal opor;
@TableField("SS")
@Schema(description = "悬浮物")
private BigDecimal ss;
@TableField("NO2")
@Schema(description = "亚硝酸盐氮")
private BigDecimal no2;
@TableField("ORP")
@Schema(description = "氧化还原电位")
private BigDecimal orp;
@TableField("FWGHTEMP")
@Schema(description = "FWGHTEMP")
private BigDecimal fwghtemp;
@TableField("RECORD_USER")
@Schema(description = "创建人")
private String recordUser;
@TableField("RECORD_TIME")
@Schema(description = "创建时间")
private Date recordTime;
@TableField("MODIFY_USER")
@Schema(description = "更新人")
private String modifyUser;
@TableField("MODIFY_TIME")
@Schema(description = "更新时间")
private Date modifyTime;
@TableField("IS_DELETED")
@Schema(description = "是否已删除")
private Integer isDeleted;
@TableField("DELETE_USER")
@Schema(description = "删除人")
private String deleteUser;
@TableField("DELETE_TIME")
@Schema(description = "删除时间")
private Date deleteTime;
@TableField(exist = false)
private Integer sfdbNew;
@TableField(exist = false)
private String tmNew;
@TableField(exist = false)
private String baseId;
@TableField(exist = false)
private Integer dtinType;
}

View File

@ -0,0 +1,139 @@
package com.yfd.platform.qgc_env.wq.entity.ao;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Set;
@Data
@Schema(description = "定时任务基础参数")
public class JobBaseAo {
public static final String JOB_TYPE_DAY = "day";
public static final String JOB_TYPE_HOUR = "hour";
@Schema(description = "job类型 day=天 hour=小时", example = "hour", allowableValues = "day,hour")
private String jobType;
@Schema(description = "只能是数字或特定字符串,为空=1。job类型为天即单位为天类型为小时即单位小时 today=当天 am15=跨月15天取开始月份1号", example = "2")
private String jobStep;
@Schema(description = "开始时间", example = "2022-08-01 00:00:00")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@Schema(description = "结束时间", example = "2022-08-31 23:59:59")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
@Schema(description = "设施类型")
private String sttpCode;
@Schema(description = "测站编码集合")
private Set<String> stcds;
@Schema(description = "备注")
private String remarks;
public void initTime() {
Date startTime = this.getStartTime();
Date endTime = this.getEndTime();
if (startTime == null || endTime == null) {
Date now = new Date();
String num = this.getJobStep() != null && !"".equals(this.getJobStep().trim()) ? this.getJobStep() : "1";
if ("hour".equals(this.getJobType())) {
if ("today".equalsIgnoreCase(num)) {
startTime = getDayStartTime(now);
endTime = parseWholeMinuteEnd(now);
} else {
startTime = parseWholeMinuteStart(DateUtils.addHours(now, -Integer.parseInt(num)));
endTime = parseWholeMinuteEnd(now);
}
} else if ("day".equals(this.getJobType())) {
if ("today".equalsIgnoreCase(num)) {
startTime = getDayStartTime(now);
endTime = parseWholeMinuteEnd(now);
} else if (num.toLowerCase().startsWith("am")) {
num = num.replace("am", "");
startTime = getMonthFirstDayStartTime(DateUtils.addDays(now, -Integer.parseInt(num)));
endTime = parseWholeMinuteEnd(now);
} else {
startTime = getDayStartTime(DateUtils.addDays(now, -Integer.parseInt(num)));
endTime = parseWholeMinuteEnd(now);
}
}
}
if (startTime != null && endTime != null) {
if (startTime.getTime() > endTime.getTime()) {
throw new RuntimeException("开始时间不能大于结束时间");
} else {
this.startTime = startTime;
this.endTime = endTime;
}
} else {
throw new RuntimeException("开始时间和结束时间不能为空");
}
}
private Date getMonthFirstDayStartTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
private static Date getDayStartTime(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
private static Date parseWholeMinuteEnd(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTime();
}
private static Date parseWholeMinuteStart(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
private static class DateUtils {
public static Date addHours(Date date, int hours) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.HOUR_OF_DAY, hours);
return calendar.getTime();
}
public static Date addDays(Date date, int days) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, days);
return calendar.getTime();
}
}
}

View File

@ -1,5 +1,6 @@
package com.yfd.platform.qgc_env.wq.entity.vo; package com.yfd.platform.qgc_env.wq.entity.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ -11,6 +12,8 @@ import java.util.Map;
@Data @Data
@Schema(description = "水质实时数据") @Schema(description = "水质实时数据")
public class EnvWqDataVo { public class EnvWqDataVo {
@Schema(description = "id")
private String id;
@Schema(description = "测站编码") @Schema(description = "测站编码")
private String stcd; private String stcd;
@Schema(description = "电站编码") @Schema(description = "电站编码")
@ -137,6 +140,34 @@ public class EnvWqDataVo {
private Integer rstcdStepSort; private Integer rstcdStepSort;
@Schema(description = "测站排序") @Schema(description = "测站排序")
private Integer siteStepSort; private Integer siteStepSort;
@Schema(description = "创建人")
private String recordUser;
@Schema(description = "创建时间")
private Date recordTime;
@Schema(description = "更新人")
private String modifyUser;
@Schema(description = "更新时间")
private Date modifyTime;
@Schema(description = "是否已删除")
private Integer isDeleted;
@Schema(description = "删除人")
private String deleteUser;
@Schema(description = "删除时间")
private Date deleteTime;
@Schema(description = "水质要素最小限值集合") @Schema(description = "水质要素最小限值集合")
private List<Map<String, Object>> min; private List<Map<String, Object>> min;
@Schema(description = "水质要素最大限值集合") @Schema(description = "水质要素最大限值集合")

View File

@ -0,0 +1,18 @@
package com.yfd.platform.qgc_env.wq.mapper;
import com.yfd.platform.qgc_env.wq.entity.SdWqR;
import com.yfd.platform.qgc_env.wq.entity.ao.JobBaseAo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface WqJobMapper {
List<SdWqR> getWqLastData(@Param("ao") JobBaseAo ao);
List<SdWqR> getWqYsLastData(@Param("startTimeStr") String startTimeStr, @Param("endTimeStr") String endTimeStr);
void mergeWqR(@Param("wqRs") List<SdWqR> wqRs);
}

View File

@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.wq.service;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
import com.yfd.platform.qgc_env.wq.entity.ao.JobBaseAo;
import com.yfd.platform.qgc_env.wq.entity.vo.WqBaseInfoVo; import com.yfd.platform.qgc_env.wq.entity.vo.WqBaseInfoVo;
import com.yfd.platform.qgc_env.wq.entity.vo.EnvWqAnchorPointVo; import com.yfd.platform.qgc_env.wq.entity.vo.EnvWqAnchorPointVo;
@ -45,4 +46,6 @@ public interface EnvWqDataService {
boolean removeKendoByIds(BatchDeleteAo batchDeleteAo); boolean removeKendoByIds(BatchDeleteAo batchDeleteAo);
DataSourceResult<EnvWqAnchorPointVo> getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<EnvWqAnchorPointVo> getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest);
void wqLastData(JobBaseAo ao);
} }

View File

@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.common.*; import com.yfd.platform.common.*;
import com.yfd.platform.common.exception.BizException; import com.yfd.platform.common.exception.BizException;
@ -15,14 +16,14 @@ import com.yfd.platform.qgc_base.entity.vo.DataParam;
import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper; import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper;
import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper; import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper;
import com.yfd.platform.qgc_base.service.IDataScopeFilterService; import com.yfd.platform.qgc_base.service.IDataScopeFilterService;
import com.yfd.platform.qgc_env.wq.entity.SdWqR;
import com.yfd.platform.qgc_env.wq.entity.ao.JobBaseAo;
import com.yfd.platform.qgc_env.wq.entity.vo.*; import com.yfd.platform.qgc_env.wq.entity.vo.*;
import com.yfd.platform.qgc_env.wq.mapper.WqJobMapper;
import com.yfd.platform.qgc_env.wq.service.EnvWqDataService; import com.yfd.platform.qgc_env.wq.service.EnvWqDataService;
import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo;
import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils;
import com.yfd.platform.utils.KendoUtil; import com.yfd.platform.utils.*;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import com.yfd.platform.utils.RequestHolder;
import com.yfd.platform.utils.SecurityUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -51,6 +52,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
@Resource @Resource
private IDataScopeFilterService dataScopeFilterService; private IDataScopeFilterService dataScopeFilterService;
@Resource
private RedisCacheUtil redisCacheUtil;
private static final String WQ_HOUR_TABLE_NAME = "SD_WQ_R"; private static final String WQ_HOUR_TABLE_NAME = "SD_WQ_R";
private static final String WQ_DAY_TABLE_NAME = "SD_WQDAY_S"; private static final String WQ_DAY_TABLE_NAME = "SD_WQDAY_S";
private static final String WQ_MONTH_TABLE_NAME = "SD_WQDRTP_S"; private static final String WQ_MONTH_TABLE_NAME = "SD_WQDRTP_S";
@ -159,6 +163,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
@Resource @Resource
private MsOperationLogDetailMapper msOperationLogDetailMapper; private MsOperationLogDetailMapper msOperationLogDetailMapper;
@Resource
private WqJobMapper wqJobMapper;
@Override @Override
public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) { public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) {
boolean calculated = CommonConstant.CALCULATE_SUCCESS.equals( boolean calculated = CommonConstant.CALCULATE_SUCCESS.equals(
@ -4550,7 +4557,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
} }
@Override @Override
@Cacheable(cacheNames = "weCache#3600", keyGenerator = "cacheKeyGenerator") // @Cacheable(cacheNames = "weCache#3600", keyGenerator = "cacheKeyGenerator")
public DataSourceResult<EnvWqAnchorPointVo> getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest) { public DataSourceResult<EnvWqAnchorPointVo> getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceResult<EnvWqAnchorPointVo> dataSourceResult = new DataSourceResult<>(); DataSourceResult<EnvWqAnchorPointVo> dataSourceResult = new DataSourceResult<>();
dataSourceResult.setAggregates(new HashMap<>()); dataSourceResult.setAggregates(new HashMap<>());
@ -4651,12 +4658,12 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
List<EnvWqDataVo> wqDataList = queryWqDataByStcdBatch(stcdList); // List<EnvWqDataVo> wqDataList = queryWqDataByStcdBatch(stcdList);
Map<String, EnvWqDataVo> wqDataMap = wqDataList.stream() // Map<String, EnvWqDataVo> wqDataMap = wqDataList.stream()
.collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue)); // .collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue));
for (EnvWqAnchorPointVo anchorPointVo : wqVoList) { for (EnvWqAnchorPointVo anchorPointVo : wqVoList) {
EnvWqDataVo wqData = wqDataMap.get(anchorPointVo.getStcd()); EnvWqDataVo wqData = redisCacheUtil.fromJson(redisCacheUtil.getString("wqLastDate:" + anchorPointVo.getStcd()), EnvWqDataVo.class);
if (wqData != null) { if (wqData != null) {
anchorPointVo.setTm(wqData.getTm()); anchorPointVo.setTm(wqData.getTm());
anchorPointVo.setWqGrd(wqData.getWqgrd()); anchorPointVo.setWqGrd(wqData.getWqgrd());
@ -4964,4 +4971,29 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
} }
} }
} }
@Override
public void wqLastData(JobBaseAo ao) {
List<SdWqR> wqDataVos = wqJobMapper.getWqLastData(ao);
String startTimeStr = DateUtil.format(ao.getStartTime(), "yyyy-MM-dd HH:mm:ss");
String endTimeStr = DateUtil.format(ao.getEndTime(), "yyyy-MM-dd HH:mm:ss");
List<SdWqR> wqYsDataVos = wqJobMapper.getWqYsLastData(startTimeStr, endTimeStr);
if (CollectionUtils.isNotEmpty(wqYsDataVos)) {
for (SdWqR wqDataVo : wqYsDataVos) {
redisCacheUtil.setString("wqYsLastDate:" + wqDataVo.getStcd(), JSONUtil.toJsonStr(wqDataVo));
}
}
if (CollUtil.isEmpty(wqDataVos)) {
return;
}
if (!wqDataVos.isEmpty()) {
List<List<SdWqR>> newWqrListPartition = CollUtil.split(wqDataVos, 300);
for (List<SdWqR> t : newWqrListPartition) {
wqJobMapper.mergeWqR(t);
}
}
for (SdWqR wqDataVo : wqDataVos) {
redisCacheUtil.setString("wqLastDate:" + wqDataVo.getStcd(), JSONUtil.toJsonStr(wqDataVo));
}
}
} }

View File

@ -1,6 +1,9 @@
package com.yfd.platform.utils; package com.yfd.platform.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -12,8 +15,9 @@ import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Component @Component
@Slf4j
public class RedisCacheUtil { public class RedisCacheUtil {
static final ObjectMapper objectMapper = new ObjectMapper();
@Resource @Resource
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
@ -41,6 +45,21 @@ public class RedisCacheUtil {
return (T) value; return (T) value;
} }
public <T> T fromJson(String json, Class<T> clazz) {
if (!StringUtils.isBlank(json) && clazz != null) {
try {
return (T)objectMapper.readValue(json, clazz);
} catch (Exception var4) {
if (log.isErrorEnabled()) {
log.error(var4.getMessage(), var4);
}
return null;
}
} else {
return null;
}
}
public Object get(String key) { public Object get(String key) {
return redisTemplate.opsForValue().get(key); return redisTemplate.opsForValue().get(key);
} }

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yfd.platform.qgc_env.wq.mapper.WqJobMapper">
<select id="getWqLastData" resultType="com.yfd.platform.qgc_env.wq.entity.SdWqR">
SELECT SHR.*,CASE SHR.WQGRD
WHEN '1' THEN ''
WHEN '2' THEN 'Ⅱ'
WHEN '3' THEN 'Ⅲ'
WHEN '4' THEN 'Ⅳ'
WHEN '5' THEN ''
WHEN '6' THEN 'V'
ELSE '未知'
END AS wqgrdName FROM (
SELECT STCD, MAX(TM) TM FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 GROUP BY STCD
) T LEFT JOIN SD_WQ_R SHR ON T.STCD = SHR.STCD AND SHR.TM = T.TM
</select>
<select id="getWqYsLastData" resultType="com.yfd.platform.qgc_env.wq.entity.SdWqR">
SELECT * FROM (
SELECT SD_WQ_R.*,CASE SD_WQ_R.WQGRD
WHEN '1' THEN ''
WHEN '2' THEN 'Ⅱ'
WHEN '3' THEN 'Ⅲ'
WHEN '4' THEN 'Ⅳ'
WHEN '5' THEN ''
WHEN '6' THEN 'V'
ELSE '未知'
END AS wqgrdName,
RANK() OVER (PARTITION BY STCD ORDER BY TM DESC) AS RANK
FROM SD_WQ_R
WHERE NVL(IS_DELETED, 0) = 0
AND <![CDATA[ TM >= TO_DATE(#{startTimeStr}, 'yyyy-MM-dd HH24:mi:ss') ]]>
AND <![CDATA[ TM <= TO_DATE(#{endTimeStr}, 'yyyy-MM-dd HH24:mi:ss') ]]>
AND (NH3N IS NOT NULL OR TP IS NOT NULL OR TN IS NOT NULL)
) WHERE RANK = 1
</select>
<update id="mergeWqR">
MERGE INTO SD_WQ_R T
USING (
<foreach collection="wqRs" index="index" item="wqR" open="" close="" separator="union all">
SELECT #{wqR.id,jdbcType=VARCHAR} AS ID
, #{wqR.wqgrd,jdbcType=VARCHAR} AS WQGRD
, #{wqR.sfdb,jdbcType=NUMERIC} AS SFDB
, #{wqR.wqSfdbhnYs,jdbcType=VARCHAR} AS WQ_SFDBHN_YS
, SYSDATE AS MODIFY_TIME
FROM DUAL
</foreach>
) S
ON (T.ID = S.ID)
WHEN MATCHED THEN
UPDATE SET T.WQGRD = S.WQGRD, T.SFDB = S.SFDB, T.WQ_SFDBHN_YS = S.WQ_SFDBHN_YS, T.MODIFY_TIME = S.MODIFY_TIME
</update>
</mapper>