diff --git a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java index 58ec668..26819e7 100644 --- a/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/wq/service/impl/EnvWqDataServiceImpl.java @@ -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,7 +142,255 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { @Override public DataSourceResult getAlongWqKendoListCust(DataSourceRequest dataSourceRequest) { - return emptyResult(); + 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 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> 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 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 alongList = microservicDynamicSQLMapper.getAllListWithResultType( + buildAlongWqListSql(rvcd, baseId, maxTm != null), + listParamMap, + WqAlongVo.class + ); + if (CollUtil.isEmpty(alongList)) { + return emptyResult(); + } + + Set 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 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 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> ruleList = microservicDynamicSQLMapper.pageAllList(null, sql, null); + if (CollUtil.isEmpty(ruleList)) { + return; + } + Map ruleDirectionMap = getWqLimitDirection(ruleList); + Map>> 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> currentRules = levelRuleMap.get(item.getWwqtg()); + if (CollUtil.isEmpty(currentRules)) { + continue; + } + List> max = new ArrayList<>(); + List> min = new ArrayList<>(); + for (Map rule : currentRules) { + String ys = asString(rule.get("ys")); + Integer direction = ruleDirectionMap.get(ys); + Map maxMap = new LinkedHashMap<>(); + Map 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