fix: 优化水质接口

This commit is contained in:
tangwei 2026-05-27 17:17:18 +08:00
parent 767a7ac8a5
commit 914a3b68d8

View File

@ -197,13 +197,10 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
@Override
public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
String mway = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "mway");
String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode");
String dtinType = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dtinType");
String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd");
String stnm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm");
String coenvwState = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "coenvwState");
String sttpCode = findFilterFieldValue(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "sttpCode");
if (StrUtil.isBlank(sttpCode)) {
sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode");
}
StringBuilder sql = new StringBuilder();
boolean queryEngDirectly = "ENG".equalsIgnoreCase(sttpCode);
if (queryEngDirectly) {
@ -255,48 +252,17 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
}
Map<String, Object> paramMap = new HashMap<>();
if (!queryEngDirectly && StrUtil.isNotBlank(mway)) {
paramMap.put("mway", mway);
sql.append("AND wq.MWAY = #{map.mway} ");
}
if (!queryEngDirectly && StrUtil.isNotBlank(sttpCode)) {
paramMap.put("sttpCode", sttpCode);
sql.append("AND wq.STTP = #{map.sttpCode} ");
}
if (StrUtil.isNotBlank(dtinType)) {
paramMap.put("dtinType", dtinType);
if (queryEngDirectly) {
sql.append("AND NVL(eng.DTIN, 0) = #{map.dtinType} ");
} else {
sql.append("AND wq.DTIN_TYPE = #{map.dtinType} ");
}
}
if (StrUtil.isNotBlank(rstcd)) {
paramMap.put("rstcd", rstcd);
if (queryEngDirectly) {
sql.append("AND eng.STCD = #{map.rstcd} ");
} else {
sql.append("AND wq.RSTCD = #{map.rstcd} ");
}
}
if (StrUtil.isNotBlank(stnm)) {
paramMap.put("stnm", "%" + stnm + "%");
if (queryEngDirectly) {
sql.append("AND eng.ENNM LIKE #{map.stnm} ");
} else {
sql.append("AND wq.STNM LIKE #{map.stnm} ");
}
}
if (StrUtil.isNotBlank(coenvwState)) {
paramMap.put("coenvwState", coenvwState);
if (queryEngDirectly) {
sql.append("AND CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END = #{map.coenvwState} ");
} else {
sql.append("AND CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END = #{map.coenvwState} ");
}
String filterSql = buildVmsstbprptFilterCondition(
dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap,
new int[]{0},
queryEngDirectly
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(buildVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort(), queryEngDirectly));
// sql.append(buildEnvWqOrderBySql(dataSourceRequest.getSort()));
PageInfo pageInfo = QgcQueryWrapperUtil.getPageInfo(loadOptions);
Page<?> page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null;
List<WqVmsstbprptVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WqVmsstbprptVo.class);
@ -308,6 +274,25 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return result;
}
private String findFilterFieldValue(DataSourceRequest.FilterDescriptor filter, String field) {
if (filter == null || StrUtil.isBlank(field)) {
return null;
}
if (field.equalsIgnoreCase(filter.getField()) && filter.getValue() != null) {
return String.valueOf(filter.getValue());
}
if (CollUtil.isEmpty(filter.getFilters())) {
return null;
}
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String value = findFilterFieldValue(child, field);
if (StrUtil.isNotBlank(value)) {
return value;
}
}
return null;
}
@Override
public WqBaseInfoVo getStcdInfo(String stcd) {
if (StrUtil.isBlank(stcd)) {
@ -1217,6 +1202,166 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return result;
}
private String buildVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
boolean queryEngDirectly) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildVmsstbprptLeafCondition(filter, paramMap, indexHolder, queryEngDirectly);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildVmsstbprptFilterCondition(child, paramMap, indexHolder, queryEngDirectly);
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 buildVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder,
boolean queryEngDirectly) {
String column = mapVmsstbprptColumn(filter.getField(), queryEngDirectly);
if (StrUtil.isBlank(column)) {
return "";
}
String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
Object value = filter.getValue();
boolean dateField = "jcdt".equalsIgnoreCase(filter.getField());
if ("isnull".equals(operator)) {
return column + " IS NULL";
}
if ("isnotnull".equals(operator)) {
return column + " IS NOT NULL";
}
if ("in".equals(operator)) {
List<Object> values = normalizeMsstbprptValues(value);
if (values.isEmpty()) {
return "";
}
List<String> placeholders = new ArrayList<>();
for (Object item : values) {
String paramKey = "vmsP" + indexHolder[0]++;
paramMap.put(paramKey, item);
placeholders.add("#{map." + paramKey + "}");
}
return column + " IN (" + String.join(", ", placeholders) + ")";
}
String key = "vmsP" + indexHolder[0]++;
switch (operator) {
case "eq":
paramMap.put(key, value);
return dateField ? column + " = TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " = #{map." + key + "}";
case "neq":
paramMap.put(key, value);
return dateField ? column + " <> TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <> #{map." + key + "}";
case "gt":
paramMap.put(key, value);
return dateField ? column + " > TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " > #{map." + key + "}";
case "gte":
paramMap.put(key, value);
return dateField ? column + " >= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " >= #{map." + key + "}";
case "lt":
paramMap.put(key, value);
return dateField ? column + " < TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " < #{map." + key + "}";
case "lte":
paramMap.put(key, value);
return dateField ? column + " <= TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')" : column + " <= #{map." + key + "}";
case "contains":
paramMap.put(key, "%" + value + "%");
return column + " LIKE #{map." + key + "}";
case "startswith":
paramMap.put(key, value + "%");
return column + " LIKE #{map." + key + "}";
case "endswith":
paramMap.put(key, "%" + value);
return column + " LIKE #{map." + key + "}";
default:
return "";
}
}
private String mapVmsstbprptColumn(String field, boolean queryEngDirectly) {
if (StrUtil.isBlank(field)) {
return null;
}
if (queryEngDirectly) {
return switch (field) {
case "baseName" -> "hb.BASENAME";
case "baseId" -> "hb.BASEID";
case "stnm", "ennm" -> "eng.ENNM";
case "jcdt" -> "eng.JCDT";
case "stindx" -> "NULL";
case "coenvwState", "dtin", "dtinType" -> "CASE WHEN NVL(eng.DTIN, 0) = 1 THEN 1 ELSE 0 END";
case "sttpCode" -> "'ENG'";
case "stcd", "rstcd" -> "eng.STCD";
case "dvtp" -> "eng.DVTP";
case "baseStepSort" -> "hb.ORDER_INDEX";
case "hbrvcd" -> "eng.HBRVCD";
case "rstcdStepSort", "siteStepSort" -> "eng.ORDER_INDEX";
default -> null;
};
}
return switch (field) {
case "baseName" -> "hb.BASENAME";
case "baseId" -> "hb.BASEID";
case "stnm" -> "wq.STNM";
case "ennm" -> "eng.ENNM";
case "jcdt" -> "wq.JCDT";
case "stindx" -> "wq.STINDX";
case "coenvwState" -> "CASE WHEN recent.STCD IS NOT NULL THEN 1 ELSE 0 END";
case "sttpCode" -> "wq.STTP";
case "stcd" -> "wq.STCD";
case "rstcd" -> "wq.RSTCD";
case "dvtp" -> "eng.DVTP";
case "baseStepSort" -> "hb.ORDER_INDEX";
case "hbrvcd" -> "eng.HBRVCD";
case "rstcdStepSort" -> "eng.ORDER_INDEX";
case "siteStepSort" -> "wq.ORDER_INDEX";
case "mway" -> "wq.MWAY";
case "dtinType" -> "wq.DTIN_TYPE";
case "dtin" -> "wq.DTIN";
case "isDeleted" -> "NVL(wq.IS_DELETED, 0)";
default -> null;
};
}
private String buildVmsstbprptOrderBySql(List<DataSourceRequest.SortDescriptor> sortList, boolean queryEngDirectly) {
List<String> orderColumns = new ArrayList<>();
if (sortList != null) {
for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) {
if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) {
continue;
}
String column = mapVmsstbprptColumn(sortDescriptor.getField(), queryEngDirectly);
if (StrUtil.isBlank(column) || "NULL".equalsIgnoreCase(column)) {
continue;
}
String dir = ("desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir())) ? "DESC" : "ASC";
orderColumns.add(column + " " + dir);
}
}
if (orderColumns.isEmpty()) {
return " ORDER BY hb.ORDER_INDEX ASC NULLS LAST, eng.HBRVCD ASC NULLS LAST, eng.ORDER_INDEX ASC NULLS LAST"
+ (queryEngDirectly ? ", eng.ORDER_INDEX ASC NULLS LAST" : ", wq.ORDER_INDEX ASC NULLS LAST");
}
return " ORDER BY " + String.join(", ", orderColumns);
}
private String buildMsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {