fix: 优化逻辑

This commit is contained in:
tangwei 2026-05-28 10:06:20 +08:00
parent de04f0ec49
commit c234d57ccd

View File

@ -13,12 +13,7 @@ import com.yfd.platform.common.GroupingInfo;
import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.common.PageInfo;
import com.yfd.platform.common.exception.BizException;
import com.yfd.platform.env.wq.entity.vo.EnvWqDataVo;
import com.yfd.platform.env.wq.entity.vo.EnvWqVo;
import com.yfd.platform.env.wq.entity.vo.StTbYsVo;
import com.yfd.platform.env.wq.entity.vo.WqBaseInfoVo;
import com.yfd.platform.env.wq.entity.vo.WqMsstbprptGroupVo;
import com.yfd.platform.env.wq.entity.vo.WqVmsstbprptVo;
import com.yfd.platform.env.wq.entity.vo.*;
import com.yfd.platform.env.wq.service.EnvWqDataService;
import com.yfd.platform.env.wt.entity.vo.WbsbVo;
import com.yfd.platform.utils.KendoUtil;
@ -28,14 +23,15 @@ import com.yfd.platform.utils.SecurityUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;
import java.util.Set;
import java.util.stream.Collectors;
@ -146,9 +142,257 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
@Override
public DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
String rvcd = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "rvcd");
if (StrUtil.isBlank(rvcd) && loadOptions != null) {
rvcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd");
}
String baseId = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "baseId");
if (StrUtil.isBlank(baseId) && loadOptions != null) {
baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId");
}
String tm = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "tm");
if (StrUtil.isBlank(tm) && loadOptions != null) {
tm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm");
}
if (StrUtil.isBlank(tm)) {
throw new BizException("时间(tm)不能为空.");
}
String[] tmRange = normalizeTmRange(tm);
Map<String, Object> maxTmParamMap = new HashMap<>();
if (StrUtil.isNotBlank(rvcd)) {
maxTmParamMap.put("rvcd", rvcd);
}
if (StrUtil.isNotBlank(baseId)) {
maxTmParamMap.put("baseId", baseId);
}
if (tmRange != null) {
maxTmParamMap.put("startTime", tmRange[0]);
maxTmParamMap.put("endTime", tmRange[1]);
}
List<Map<String, Object>> maxTmRows = microservicDynamicSQLMapper.pageAllList(
null,
buildAlongWqMaxTmSql(rvcd, baseId, tmRange != null),
maxTmParamMap
);
Date maxTm = null;
if (CollUtil.isNotEmpty(maxTmRows)) {
Object value = maxTmRows.get(0).get("TM");
if (value instanceof Date) {
maxTm = (Date) value;
}
}
Map<String, Object> listParamMap = new HashMap<>();
if (StrUtil.isNotBlank(rvcd)) {
listParamMap.put("rvcd", rvcd);
}
if (StrUtil.isNotBlank(baseId)) {
listParamMap.put("baseId", baseId);
}
if (maxTm != null) {
listParamMap.put("maxTm", maxTm);
}
List<WqAlongVo> alongList = microservicDynamicSQLMapper.getAllListWithResultType(
buildAlongWqListSql(rvcd, baseId, maxTm != null),
listParamMap,
WqAlongVo.class
);
if (CollUtil.isEmpty(alongList)) {
return emptyResult();
}
Set<String> rstcdSet = alongList.stream()
.filter(item -> "WQ".equalsIgnoreCase(item.getSttp()))
.map(WqAlongVo::getRstcd)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toSet());
alongList = alongList.stream()
.filter(item -> "WQ".equalsIgnoreCase(item.getSttp()) || rstcdSet.contains(item.getStcd()))
.collect(Collectors.toList());
for (WqAlongVo item : alongList) {
item.setMinTm(maxTm);
item.setTm(maxTm);
item.setWqgrdName(getWqLevelName(item.getWqgrd()));
}
fillWqAlongLimit(alongList);
DataSourceResult<WqAlongVo> result = new DataSourceResult<>();
result.setData(alongList);
result.setTotal((long) alongList.size());
result.setAggregates(new HashMap<>());
return result;
}
private String[] normalizeTmRange(String tm) {
if (StrUtil.isBlank(tm)) {
return null;
}
String[] parts = tm.split(",");
if (parts.length != 2) {
return null;
}
String first = StrUtil.trim(parts[0]);
String second = StrUtil.trim(parts[1]);
if (StrUtil.isBlank(first) || StrUtil.isBlank(second)) {
return null;
}
return first.compareTo(second) <= 0 ? new String[]{first, second} : new String[]{second, first};
}
private String buildAlongWqMaxTmSql(String rvcd, String baseId, boolean hasTmRange) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT TM FROM (")
.append("SELECT swr.TM ")
.append("FROM MS_ALONG_B mab ")
.append("INNER JOIN MS_ALONGDET_B sab ON mab.ID = sab.ALONG_ID AND mab.CODE = 'common' ")
.append("INNER JOIN SD_WQ_B_H wq ON wq.STCD = sab.STCD AND wq.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN (SELECT * FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 ");
if (hasTmRange) {
sql.append("AND TM BETWEEN TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') ")
.append("AND TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') ");
}
sql.append(") swr ON swr.STCD = sab.STCD ")
.append("WHERE sab.STTP = 'WQ' ")
.append("AND NVL(mab.IS_DELETED, 0) = 0 ")
.append("AND NVL(sab.IS_DELETED, 0) = 0 ");
if (StrUtil.isNotBlank(rvcd)) {
sql.append("AND mab.RVCD = #{map.rvcd} ");
}
if (StrUtil.isNotBlank(baseId)) {
sql.append("AND eng.BASE_ID = #{map.baseId} ");
}
sql.append("AND swr.TM IS NOT NULL ")
.append("ORDER BY NVL(mab.ORDER_INDEX, 999999) ASC, NVL(sab.SORT, 999999) ASC, swr.TM DESC")
.append(") WHERE ROWNUM = 1");
return sql.toString();
}
private String buildAlongWqListSql(String rvcd, String baseId, boolean hasMaxTm) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("COALESCE(wq.STCD, engNode.STCD, sab.STCD) AS stcd, ")
.append("COALESCE(wq.RSTCD, sab.RSTCD, engNode.STCD) AS rstcd, ")
.append("COALESCE(wq.STNM, engNode.ENNM) AS stnm, ")
.append("sab.STTP AS sttp, ")
.append("swr.TM AS tm, ")
.append("swr.WTMP AS wtmp, ")
.append("swr.PH AS ph, ")
.append("swr.DOX AS dox, ")
.append("swr.CODMN AS codmn, ")
.append("swr.CODCR AS codcr, ")
.append("swr.BOD5 AS bod5, ")
.append("swr.NH3N AS nh3n, ")
.append("swr.TP AS tp, ")
.append("swr.TN AS tn, ")
.append("swr.CU AS cu, ")
.append("swr.ZN AS zn, ")
.append("swr.F AS f, ")
.append("swr.SE AS se, ")
.append("swr.ARS AS ars, ")
.append("swr.HG AS hg, ")
.append("swr.CD AS cd, ")
.append("swr.CR6 AS cr6, ")
.append("swr.PB AS pb, ")
.append("swr.CN AS cn, ")
.append("swr.VLPH AS vlph, ")
.append("swr.OIL AS oil, ")
.append("swr.LAS AS las, ")
.append("swr.S2 AS s2, ")
.append("swr.FCG AS fcg, ")
.append("swr.CL AS cl, ")
.append("swr.SO4 AS so4, ")
.append("swr.NO3 AS no3, ")
.append("swr.THRD AS thrd, ")
.append("swr.COND AS cond, ")
.append("swr.FE AS fe, ")
.append("swr.MN AS mn, ")
.append("swr.AL AS al, ")
.append("swr.CHLA AS chla, ")
.append("swr.CLARITY AS clarity, ")
.append("swr.TU AS tu, ")
.append("swr.CYANO AS cyano, ")
.append("TO_CHAR(wq.WWQTG) AS wwqtg, ")
.append("TO_CHAR(swr.WQGRD) AS wqgrd ")
.append("FROM MS_ALONG_B mab ")
.append("INNER JOIN MS_ALONGDET_B sab ON mab.ID = sab.ALONG_ID AND mab.CODE = 'common' ")
.append("LEFT JOIN SD_WQ_B_H wq ON wq.STCD = sab.STCD AND sab.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H engNode ON engNode.STCD = sab.STCD AND sab.STTP = 'ENG' AND NVL(engNode.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = COALESCE(wq.RSTCD, sab.RSTCD, engNode.STCD) AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN (SELECT * FROM SD_WQ_R WHERE NVL(IS_DELETED, 0) = 0 ");
if (hasMaxTm) {
sql.append("AND TM = #{map.maxTm} ");
} else {
sql.append("AND 1 = 0 ");
}
sql.append(") swr ON swr.STCD = sab.STCD ")
.append("WHERE NVL(mab.IS_DELETED, 0) = 0 ")
.append("AND NVL(sab.IS_DELETED, 0) = 0 ")
.append("AND sab.STTP IN ('ENG', 'WQ') ")
.append("AND ((sab.STTP = 'WQ' AND wq.STCD IS NOT NULL) OR (sab.STTP = 'ENG' AND engNode.STCD IS NOT NULL)) ");
if (StrUtil.isNotBlank(rvcd)) {
sql.append("AND mab.RVCD = #{map.rvcd} ");
}
if (StrUtil.isNotBlank(baseId)) {
sql.append("AND eng.BASE_ID = #{map.baseId} ");
}
sql.append("ORDER BY NVL(mab.ORDER_INDEX, 999999) ASC, NVL(sab.SORT, 999999) ASC");
return sql.toString();
}
private void fillWqAlongLimit(List<WqAlongVo> list) {
if (CollUtil.isEmpty(list)) {
return;
}
String sql = "SELECT t2.YS AS ys, t2.MIN_VAL AS minVal, t2.MAX_VAL AS maxVal, t2.LVL AS lvl " +
"FROM MS_WARN_RULE_B t1 " +
"INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID " +
"WHERE t1.RULE_TYPE = 'WQLVL'";
List<Map<String, Object>> ruleList = microservicDynamicSQLMapper.pageAllList(null, sql, null);
if (CollUtil.isEmpty(ruleList)) {
return;
}
Map<String, Integer> ruleDirectionMap = getWqLimitDirection(ruleList);
Map<String, List<Map<String, Object>>> levelRuleMap = ruleList.stream()
.filter(item -> StrUtil.isNotBlank(asString(item.get("lvl"))))
.collect(Collectors.groupingBy(item -> asString(item.get("lvl"))));
for (WqAlongVo item : list) {
if (StrUtil.isBlank(item.getWwqtg())) {
continue;
}
List<Map<String, Object>> currentRules = levelRuleMap.get(item.getWwqtg());
if (CollUtil.isEmpty(currentRules)) {
continue;
}
List<Map<String, Object>> max = new ArrayList<>();
List<Map<String, Object>> min = new ArrayList<>();
for (Map<String, Object> rule : currentRules) {
String ys = asString(rule.get("ys"));
Integer direction = ruleDirectionMap.get(ys);
Map<String, Object> maxMap = new LinkedHashMap<>();
Map<String, Object> minMap = new LinkedHashMap<>();
if (direction != null && direction == 2) {
maxMap.put(ys, rule.get("maxVal"));
minMap.put(ys, rule.get("minVal"));
max.add(maxMap);
min.add(minMap);
} else if (direction != null && direction == 1) {
minMap.put(ys, rule.get("minVal"));
min.add(minMap);
} else {
maxMap.put(ys, rule.get("maxVal"));
max.add(maxMap);
}
}
item.setMax(max);
item.setMin(min);
}
}
@Override
public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) {
String groupField = "dtinType";