fix: 增加水质明细数据查询接口

This commit is contained in:
tangwei 2026-05-25 10:17:01 +08:00
parent cf220b8326
commit 66a810ca36
2 changed files with 483 additions and 12 deletions

View File

@ -29,6 +29,12 @@ public class EnvWqDataController {
return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest));
}
@PostMapping("/data/GetKendoListCust")
@Operation(summary = "水质明细数据查询")
public ResponseResult getDataKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(envWqDataService.processKendoList(dataSourceRequest));
}
@PostMapping("/GetStbprpYsByStcd")
@Operation(summary = "水质统计分析")
public ResponseResult GetStbprpYsByStcd(@RequestBody DataSourceRequest dataSourceRequest) {

View File

@ -12,6 +12,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.WqBaseInfoVo;
import com.yfd.platform.env.wq.entity.vo.WqVmsstbprptVo;
@ -25,9 +26,14 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
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;
@Service
public class EnvWqDataServiceImpl implements EnvWqDataService {
@ -41,14 +47,13 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
RequestHolder.getHttpServletRequest().getParameter(CommonConstant.CALCULATE_FLAG)
);
StringBuilder sql = new StringBuilder(buildEnvWqProcessBaseSql(calculated));
StringBuilder sql = new StringBuilder(buildEnvWqDataBaseSql(calculated));
Map<String, Object> paramMap = new HashMap<>();
if (calculated) {
paramMap.put("recordUser", SecurityUtils.getUserId());
}
String filterSql = buildEnvWqFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap, new int[]{0});
String filterSql = buildEnvWqDataFilterCondition(
dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap,
new int[]{0}
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
@ -57,7 +62,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
String groupBy = KendoUtil.getGroupBy(dataSourceRequest);
GroupingInfo[] groupInfos = loadOptions.getGroup();
if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) {
String groupedSql = buildEnvWqGroupSql(sql.toString(), dataSourceRequest, groupInfos);
String groupedSql = buildEnvWqDataGroupSql(sql.toString(), groupBy, groupInfos);
List<Map<String, Object>> list = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap);
DataSourceResult result = new DataSourceResult();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
@ -70,13 +75,14 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return result;
}
sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort()));
sql.append(buildEnvWqDataOrderBySql(dataSourceRequest.getSort()));
PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions);
Page<?> page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null;
List<EnvWqVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqVo.class);
fillEnvWqDerivedFields(list, calculated);
List<EnvWqDataVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqDataVo.class);
fillEnvWqDataDerivedFields(list);
fillEnvWqDataLimit(list);
DataSourceResult<EnvWqVo> result = new DataSourceResult<>();
DataSourceResult<EnvWqDataVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
@ -239,6 +245,465 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return list.get(0);
}
private String buildEnvWqDataBaseSql(boolean calculated) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("T.STCD AS stcd, ")
.append("T.RSTCD AS rstcd, ")
.append("T.STNM AS stnm, ")
.append("T.ST_CODE AS stCode, ")
.append("T.ST_NAME AS stName, ")
.append("T.ENNM AS ennm, ")
.append("T.TM AS tm, ")
.append("T.WTMP AS wtmp, ")
.append("T.PH AS ph, ")
.append("T.DOX AS dox, ")
.append("T.CODMN AS codmn, ")
.append("T.CODCR AS codcr, ")
.append("T.BOD5 AS bod5, ")
.append("T.NH3N AS nh3n, ")
.append("T.TP AS tp, ")
.append("T.TN AS tn, ")
.append("T.CU AS cu, ")
.append("T.ZN AS zn, ")
.append("T.F AS f, ")
.append("T.SE AS se, ")
.append("T.ARS AS ars, ")
.append("T.HG AS hg, ")
.append("T.CD AS cd, ")
.append("T.CR6 AS cr6, ")
.append("T.PB AS pb, ")
.append("T.CN AS cn, ")
.append("T.VLPH AS vlph, ")
.append("T.OIL AS oil, ")
.append("T.LAS AS las, ")
.append("T.S2 AS s2, ")
.append("T.FCG AS fcg, ")
.append("T.CL AS cl, ")
.append("T.SO4 AS so4, ")
.append("T.NO3 AS no3, ")
.append("T.THRD AS thrd, ")
.append("T.COND AS cond, ")
.append("T.FE AS fe, ")
.append("T.MN AS mn, ")
.append("T.AL AS al, ")
.append("T.CHLA AS chla, ")
.append("T.CLARITY AS clarity, ")
.append("T.TU AS tu, ")
.append("T.TOD AS tod, ")
.append("T.CYANO AS cyano, ")
.append("T.WQGRD AS wqgrd, ")
.append("T.WWQTG AS wwqtg, ")
.append("T.SFDB AS sfdb, ")
.append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ")
.append("T.BASE_ID AS baseId, ")
.append("T.BASE_NAME AS baseName, ")
.append("T.RVCD_NAME AS rvcdName, ")
.append("T.ADDVCD_NAME AS addvcdName, ")
.append("T.DTIN_TYPE AS dtinType, ")
.append("T.QI AS qi, ")
.append("T.QO AS qo, ")
.append("T.BASESTEPSORT AS baseStepSort, ")
.append("T.RVCDSTEPSORT AS rvcdStepSort, ")
.append("T.RSTCDSTEPSORT AS rstcdStepSort, ")
.append("T.SITESTEPSORT AS siteStepSort ")
.append("FROM (SELECT ")
.append("SWR.STCD, ")
.append("MSB.RSTCD, ")
.append("MSB.STNM, ")
.append("MSB.ST_CODE, ")
.append("MSB.ST_NAME, ")
.append("MSB.ENNM, ")
.append("SWR.TM, ")
.append("SWR.WTMP, SWR.PH, SWR.DOX, SWR.CODMN, SWR.CODCR, SWR.BOD5, ")
.append("SWR.NH3N, SWR.TP, SWR.TN, SWR.CU, SWR.ZN, SWR.F, SWR.SE, SWR.ARS, SWR.HG, SWR.CD, SWR.CR6, ")
.append("SWR.PB, SWR.CN, SWR.VLPH, SWR.OIL, SWR.LAS, SWR.S2, SWR.FCG, SWR.CL, SWR.SO4, SWR.NO3, SWR.THRD, ")
.append("SWR.COND, SWR.FE, SWR.MN, SWR.AL, SWR.CHLA, SWR.CLARITY, SWR.TU, SWR.TOD, SWR.CYANO, ")
.append("SWR.WQGRD, MSB.WWQTG, SWR.SFDB, SWR.WQ_SFDBHN_YS, ")
.append("MSB.BASE_ID, MSB.BASE_NAME, MSB.RVCD_NAME, MSB.ADDVCD_NAME, MSB.DTIN_TYPE, ")
.append("MSB.BASESTEPSORT, MSB.RVCDSTEPSORT, MSB.RSTCDSTEPSORT, MSB.SITESTEPSORT, ")
.append("MSB.TTPWR, MSB.STTP_CODE, ");
if (calculated) {
sql.append("CAST(NULL AS NUMBER(15,3)) AS QI, CAST(NULL AS NUMBER(15,3)) AS QO ");
} else {
sql.append("SHR.QI AS QI, SHR.QO AS QO ");
}
sql.append("FROM ");
if (calculated) {
sql.append("MS_WQCALCULATION_R SWR ");
} else {
sql.append("SD_WQ_R SWR ");
}
sql.append("INNER JOIN (").append(buildEnvWqDataStationBaseSql()).append(") MSB ON MSB.STCD = SWR.STCD ");
if (!calculated) {
sql.append("LEFT JOIN SD_HYDROPW_R SHR ON MSB.RSTCD = SHR.STCD AND SWR.TM = SHR.TM AND MSB.DTIN_TYPE = 0 ")
.append("WHERE SWR.TM <= SYSDATE ")
.append("AND (SWR.TASK_ID IS NULL OR SWR.TASK_ID = '' OR SWR.TASK_STATUS = 'Approved') ");
} else {
sql.append("WHERE 1 = 1 ");
}
sql.append(") T WHERE 1 = 1 ");
return sql.toString();
}
private String buildEnvWqDataStationBaseSql() {
return "SELECT " +
"wq.STCD, " +
"wq.RSTCD, " +
"wq.STNM, " +
"wq.FHSTCD AS ST_CODE, " +
"CAST(NULL AS VARCHAR2(200)) AS ST_NAME, " +
"eng.ENNM, " +
"eng.BASE_ID, " +
"hb.BASENAME AS BASE_NAME, " +
"rv.RVNM AS RVCD_NAME, " +
"addv.ADDVNM AS ADDVCD_NAME, " +
"wq.WWQTG, " +
"wq.DTIN_TYPE, " +
"siteAlong.SORT AS SITESTEPSORT, " +
"hb.ORDER_INDEX AS BASESTEPSORT, " +
"eng.TTPWR AS TTPWR, " +
"rstAlong.SORT AS RSTCDSTEPSORT, " +
"rvAlong.ORDER_INDEX AS RVCDSTEPSORT, " +
"wq.STTP AS STTP_CODE " +
"FROM SD_WQ_B_H wq " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wq.RSTCD " +
"LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " +
"LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " +
"LEFT JOIN MS_ALONG_B rvAlong ON rvAlong.RVCD = eng.HBRVCD AND rvAlong.CODE = 'common' AND NVL(rvAlong.IS_DELETED, 0) = 0 " +
"LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " +
" FROM MS_ALONGDET_B det " +
" INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " +
" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') rstAlong " +
" ON rstAlong.RVCD = eng.HBRVCD AND rstAlong.STCD = wq.RSTCD " +
"LEFT JOIN (SELECT det.SORT, along.RVCD, det.STCD " +
" FROM MS_ALONGDET_B det " +
" INNER JOIN MS_ALONG_B along ON det.ALONG_ID = along.ID " +
" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(along.IS_DELETED, 0) = 0 AND along.CODE = 'common') siteAlong " +
" ON siteAlong.RVCD = eng.HBRVCD AND siteAlong.STCD = wq.STCD " +
"WHERE wq.STTP = 'WQ' AND NVL(wq.IS_DELETED, 0) = 0";
}
private String buildEnvWqDataFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildEnvWqDataLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildEnvWqDataFilterCondition(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
conditions.add(childSql);
}
}
if (conditions.isEmpty()) {
return "";
}
String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
return "(" + String.join(logic, conditions) + ")";
}
private String buildEnvWqDataLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String column = mapEnvWqDataColumn(filter.getField());
if (StrUtil.isBlank(column) || filter.getValue() == null) {
return "";
}
String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
String key = "envWqDataParam" + indexHolder[0]++;
boolean dateField = "tm".equals(filter.getField());
switch (operator) {
case "eq":
paramMap.put(key, filter.getValue());
return dateField ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + key + "}";
case "neq":
paramMap.put(key, filter.getValue());
return dateField ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + key + "}";
case "gt":
paramMap.put(key, filter.getValue());
return dateField ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + key + "}";
case "gte":
paramMap.put(key, filter.getValue());
return dateField ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + key + "}";
case "lt":
paramMap.put(key, filter.getValue());
return dateField ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + key + "}";
case "lte":
paramMap.put(key, filter.getValue());
return dateField ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + key + "}";
case "contains":
paramMap.put(key, "%" + filter.getValue() + "%");
return column + " LIKE #{map." + key + "}";
default:
return "";
}
}
private String mapEnvWqDataColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field) {
case "baseName" -> "T.BASE_NAME";
case "stnm" -> "T.STNM";
case "wwqtg" -> "T.WWQTG";
case "baseId" -> "T.BASE_ID";
case "rstcd" -> "T.RSTCD";
case "ennm" -> "T.ENNM";
case "stCode" -> "T.ST_CODE";
case "stName" -> "T.ST_NAME";
case "stcd" -> "T.STCD";
case "tm" -> "T.TM";
case "wqgrd" -> "T.WQGRD";
case "ph" -> "T.PH";
case "dox" -> "T.DOX";
case "codmn" -> "T.CODMN";
case "codcr" -> "T.CODCR";
case "bod5" -> "T.BOD5";
case "nh3n" -> "T.NH3N";
case "tp" -> "T.TP";
case "tn" -> "T.TN";
case "cu" -> "T.CU";
case "zn" -> "T.ZN";
case "f" -> "T.F";
case "se" -> "T.SE";
case "ars" -> "T.ARS";
case "hg" -> "T.HG";
case "cd" -> "T.CD";
case "cr6" -> "T.CR6";
case "pb" -> "T.PB";
case "cn" -> "T.CN";
case "vlph" -> "T.VLPH";
case "oil" -> "T.OIL";
case "las" -> "T.LAS";
case "s2" -> "T.S2";
case "fcg" -> "T.FCG";
case "cl" -> "T.CL";
case "so4" -> "T.SO4";
case "no3" -> "T.NO3";
case "thrd" -> "T.THRD";
case "cond" -> "T.COND";
case "fe" -> "T.FE";
case "mn" -> "T.MN";
case "al" -> "T.AL";
case "chla" -> "T.CHLA";
case "clarity" -> "T.CLARITY";
case "tu" -> "T.TU";
case "cyano" -> "T.CYANO";
case "sfdb" -> "T.SFDB";
case "wtmp" -> "T.WTMP";
case "dtinType" -> "T.DTIN_TYPE";
case "tod" -> "T.TOD";
case "wqSfdbhnYs" -> "T.WQ_SFDBHN_YS";
case "siteStepSort" -> "T.SITESTEPSORT";
case "baseStepSort" -> "T.BASESTEPSORT";
case "ttpwr" -> "T.TTPWR";
case "rstcdStepSort" -> "T.RSTCDSTEPSORT";
case "sttpCode" -> "T.STTP_CODE";
default -> null;
};
}
private String buildEnvWqDataGroupSql(String baseSql, String groupBy, GroupingInfo[] groupInfos) {
StringBuilder sql = new StringBuilder("SELECT ");
List<String> groupFields = new ArrayList<>();
for (GroupingInfo item : groupInfos) {
if (item != null && StrUtil.isNotBlank(item.getSelector())) {
groupFields.add(item.getSelector());
}
}
sql.append(String.join(", ", groupFields));
for (GroupingInfo item : groupInfos) {
sql.append(", COUNT(*) AS count_").append(item.getSelector()).append(" ");
}
sql.append("FROM (").append(baseSql).append(") T ").append(groupBy);
return sql.toString();
}
private String buildEnvWqDataOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (sortList == null || sortList.isEmpty()) {
return "";
}
StringBuilder sql = new StringBuilder(" ORDER BY ");
boolean appended = false;
for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) {
if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) {
continue;
}
String column = mapEnvWqDataColumn(sortDescriptor.getField());
if (column == null) {
continue;
}
if (appended) {
sql.append(", ");
}
sql.append(column).append(" ")
.append("desc".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC");
appended = true;
}
return appended ? sql.toString() : "";
}
private void fillEnvWqDataDerivedFields(List<EnvWqDataVo> list) {
if (CollUtil.isEmpty(list)) {
return;
}
for (EnvWqDataVo item : list) {
item.setWqgrdName(getWqLevelName(item.getWqgrd()));
item.setWwqtgName(getWqLevelName(item.getWwqtg()));
item.setSfdbName(getSfdbName(item.getSfdb()));
item.setWqSfdbhnYsName(convertWqFactors(item.getWqSfdbhnYs()));
}
}
private void fillEnvWqDataLimit(List<EnvWqDataVo> 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 (EnvWqDataVo 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);
}
}
private Map<String, Integer> getWqLimitDirection(List<Map<String, Object>> ruleList) {
Map<String, List<Map<String, Object>>> grouped = ruleList.stream()
.collect(Collectors.groupingBy(item -> asString(item.get("ys"))));
Map<String, Integer> result = new HashMap<>();
for (Map.Entry<String, List<Map<String, Object>>> entry : grouped.entrySet()) {
List<Map<String, Object>> current = entry.getValue().stream()
.sorted(Comparator.comparing(item -> asBigDecimal(item.get("minVal")), Comparator.nullsLast(BigDecimal::compareTo)))
.collect(Collectors.toList());
Set<BigDecimal> minSet = current.stream().map(item -> asBigDecimal(item.get("minVal"))).collect(Collectors.toSet());
Set<BigDecimal> maxSet = current.stream().map(item -> asBigDecimal(item.get("maxVal"))).collect(Collectors.toSet());
if (minSet.size() == 1 && maxSet.size() == 1) {
result.put(entry.getKey(), 2);
} else {
int first = Integer.parseInt(asString(current.get(0).get("lvl")));
int last = Integer.parseInt(asString(current.get(current.size() - 1).get("lvl")));
result.put(entry.getKey(), first > last ? 1 : 0);
}
}
return result;
}
private String convertWqFactors(String raw) {
if (StrUtil.isBlank(raw)) {
return null;
}
Map<String, String> factorMap = new LinkedHashMap<>();
factorMap.put("WTMP", "水温");
factorMap.put("PH", "pH");
factorMap.put("DOX", "溶解氧");
factorMap.put("CODMN", "高锰酸盐指数");
factorMap.put("CODCR", "化学需氧量");
factorMap.put("BOD5", "五日生化需氧量");
factorMap.put("NH3N", "氨氮");
factorMap.put("TP", "总磷");
factorMap.put("TN", "总氮");
factorMap.put("CU", "");
factorMap.put("ZN", "");
factorMap.put("F", "氟化物");
factorMap.put("SE", "");
factorMap.put("ARS", "");
factorMap.put("HG", "");
factorMap.put("CD", "");
factorMap.put("CR6", "六价铬");
factorMap.put("PB", "");
factorMap.put("CN", "氰化物");
factorMap.put("VLPH", "挥发酚");
factorMap.put("OIL", "石油类");
factorMap.put("LAS", "阴离子表面活性剂");
factorMap.put("S2", "硫化物");
factorMap.put("FCG", "粪大肠菌群");
factorMap.put("CL", "氯化物");
factorMap.put("SO4", "硫酸盐");
factorMap.put("NO3", "硝酸盐氮");
factorMap.put("THRD", "总硬度");
factorMap.put("COND", "电导率");
factorMap.put("FE", "");
factorMap.put("MN", "");
factorMap.put("AL", "");
factorMap.put("CHLA", "叶绿素a");
factorMap.put("CLARITY", "透明度");
factorMap.put("TU", "浊度");
factorMap.put("CYANO", "蓝绿藻");
factorMap.put("TOD", "总需氧量");
List<String> names = new ArrayList<>();
for (String part : raw.split(",")) {
String key = StrUtil.trim(part).toUpperCase();
if (StrUtil.isBlank(key)) {
continue;
}
names.add(factorMap.getOrDefault(key, key));
}
return names.isEmpty() ? null : String.join(",", names);
}
private String asString(Object value) {
return value == null ? null : String.valueOf(value);
}
private BigDecimal asBigDecimal(Object value) {
if (value == null) {
return null;
}
if (value instanceof BigDecimal bigDecimal) {
return bigDecimal;
}
return new BigDecimal(String.valueOf(value));
}
private String buildEnvWqProcessBaseSql(boolean calculated) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")