From 5d76129fbbf09dd02c83ef2b067f82a4e99a3f42 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 2 Sep 2026 17:34:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=87=8E=E7=94=9F=E5=8A=A8=E7=89=A9?= =?UTF-8?q?=E7=9B=91=E6=B5=8B-=E4=B8=80=E7=BA=A7=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=8A=A8=E7=89=A9=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wte/controller/WeFishController.java | 6 + .../wte/entity/vo/WeAnimalListQgcVo.java | 59 ++++ .../qgc_env/wte/service/WeFishService.java | 2 + .../wte/service/impl/WeFishServiceImpl.java | 332 ++++++++++++++++++ .../service/impl/PushConfigServiceImpl.java | 85 ++--- 5 files changed, 444 insertions(+), 40 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index 558ad5aa..3bf7f261 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -156,6 +156,12 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); } + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index 87ef8c9f..3342f0bf 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -57,6 +57,8 @@ public interface WeFishService { DataSourceResult getQgcWeAnimalPoint(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcWeAnimalList(DataSourceRequest dataSourceRequest); + DataSourceResult getTeSpecialAnimalList(DataSourceRequest dataSourceRequest); List getWeDefaultData(String stcd); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java index d9852375..4c1665e1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/impl/WeFishServiceImpl.java @@ -1266,6 +1266,338 @@ public class WeFishServiceImpl implements WeFishService { return result; } + @Override + public DataSourceResult getQgcWeAnimalList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildWeAnimalListFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT r.id AS id, r.name AS name, r.code AS code, ") + .append("r.baseId AS baseId, r.baseName AS baseName, ") + .append("r.rvcd AS rvcd, r.rvcdName AS rvcdName, ") + .append("r.hbrvcd AS hbrvcd, r.hbrvcdName AS hbrvcdName, ") + .append("r.rstcd AS rstcd, r.ennm AS ennm, ") + .append("r.stcd AS stcd, r.stnm AS stnm, ") + .append("r.tm AS tm, r.yr AS yr, r.acnt AS acnt ") + .append("FROM (") + .append(buildWeAnimalListDetailSql()) + .append(") r WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + + DataSourceResult result = new DataSourceResult<>(); + if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + String groupedSql = buildWeAnimalListGroupSql(sql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.getAllList(groupedSql, paramMap); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + sql.append(buildWeAnimalListOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + Page page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List> rows = microservicDynamicSQLMapper.pageAllList(page, sql.toString(), paramMap); + List list = new ArrayList<>(); + for (Map row : rows) { + WeAnimalListQgcVo vo = buildWeAnimalListQgcVo(row); + if (vo != null) { + list.add(vo); + } + } + + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildWeAnimalListDetailSql() { + return "SELECT " + + "a.ID AS id, a.NAME AS name, a.CODE AS code, " + + "aim.RVCD AS rvcd, rv.RVNM AS rvcdName, " + + "aim.HBRVCD AS hbrvcd, hbrv.HBRVNM AS hbrvcdName, " + + "aim.RSTCD AS rstcd, eng.ENNM AS ennm, " + + "aim.BASE_ID AS baseId, hb.BASENAME AS baseName, " + + "aim.STCD AS stcd, aim.STNM AS stnm, " + + "MAX(w.TM) AS tm, TO_CHAR(MAX(w.TM), 'yyyy') AS yr, " + + "COUNT(*) AS acnt " + + "FROM SD_WVA_R w " + + "INNER JOIN SD_ANIMALDICTORY_B a ON a.ID = w.ANIMAL_ID " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + " AND NVL(a.ENABLE, 1) = 1 " + + "INNER JOIN SD_AIMONITOR_B_H aim ON aim.STCD = w.STCD " + + " AND NVL(aim.IS_DELETED, 0) = 0 " + + " AND aim.STTP = 'WVA' " + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = aim.RSTCD " + + " AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = aim.BASE_ID " + + " AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = aim.RVCD " + + " AND NVL(rv.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = aim.HBRVCD " + + " AND hbrv.BASEID = aim.BASE_ID " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 " + + "WHERE NVL(w.IS_DELETED, 0) = 0 " + + "GROUP BY a.ID, a.NAME, a.CODE, " + + "aim.RVCD, rv.RVNM, aim.HBRVCD, hbrv.HBRVNM, aim.RSTCD, eng.ENNM, " + + "aim.BASE_ID, hb.BASENAME, aim.STCD, aim.STNM"; + } + + private String buildWeAnimalListFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWeAnimalListLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWeAnimalListFilterCondition(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 buildWeAnimalListLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapWeAnimalListColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeWeFishQgcValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + Object normalizedValue = normalizeWeAnimalListValue(filter.getField(), value); + if (normalizedValue == null) { + continue; + } + String key = "weAnimalListP" + indexHolder[0]++; + paramMap.put(key, normalizedValue); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + + Object normalizedValue = normalizeWeAnimalListValue(filter.getField(), filter.getValue()); + if (normalizedValue == null) { + return ""; + } + String key = "weAnimalListP" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, normalizedValue); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, normalizedValue); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, normalizedValue); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, normalizedValue); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, normalizedValue); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, normalizedValue); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim() + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim() + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, String.valueOf(normalizedValue).trim() + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + String.valueOf(normalizedValue).trim()); + yield column + " LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapWeAnimalListColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "r.id"; + case "name" -> "r.name"; + case "code" -> "r.code"; + case "baseId" -> "r.baseId"; + case "baseName" -> "r.baseName"; + case "rvcd" -> "r.rvcd"; + case "rvcdName" -> "r.rvcdName"; + case "hbrvcd" -> "r.hbrvcd"; + case "hbrvcdName" -> "r.hbrvcdName"; + case "rstcd" -> "r.rstcd"; + case "ennm" -> "r.ennm"; + case "stcd" -> "r.stcd"; + case "stnm" -> "r.stnm"; + case "tm" -> "r.tm"; + case "yr" -> "r.yr"; + case "acnt" -> "r.acnt"; + default -> null; + }; + } + + private String buildWeAnimalListGroupSql(String baseSql, GroupingInfo[] groupInfos) { + if (groupInfos == null || groupInfos.length == 0) { + return baseSql; + } + List groupFields = new ArrayList<>(); + List selectItems = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String groupColumn = mapWeAnimalListColumn(item.getSelector()); + if (StrUtil.isBlank(groupColumn)) { + continue; + } + groupFields.add(groupColumn.startsWith("r.") ? groupColumn.substring(2) : groupColumn); + selectItems.add(groupColumn.startsWith("r.") ? groupColumn.substring(2) + " AS " + item.getSelector().toUpperCase() : groupColumn); + selectItems.add("COUNT(*) AS COUNT_" + item.getSelector().toUpperCase()); + } + if (groupFields.isEmpty()) { + return baseSql; + } + StringBuilder sql = new StringBuilder("SELECT "); + sql.append(String.join(", ", selectItems)) + .append(" FROM (") + .append(baseSql) + .append(") T GROUP BY ") + .append(String.join(", ", groupFields)); + return sql.toString(); + } + + private String buildWeAnimalListOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWeAnimalListColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private Object normalizeWeAnimalListValue(String field, Object value) { + if (value == null) { + return null; + } + if ("yr".equals(field)) { + try { + return Integer.parseInt(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + if ("acnt".equals(field)) { + try { + return new BigDecimal(String.valueOf(value).trim()); + } catch (Exception ex) { + return null; + } + } + if ("tm".equals(field)) { + return parseDateTimeSafely(value); + } + return value; + } + + private WeAnimalListQgcVo buildWeAnimalListQgcVo(Map row) { + if (row == null || row.isEmpty()) { + return null; + } + return new WeAnimalListQgcVo() + .setId(safeWeFishString(firstPresentWeFishValue(row, "ID", "id"))) + .setName(safeWeFishString(firstPresentWeFishValue(row, "NAME", "name"))) + .setCode(safeWeFishString(firstPresentWeFishValue(row, "CODE", "code"))) + .setBaseId(safeWeFishString(firstPresentWeFishValue(row, "BASEID", "baseId"))) + .setBaseName(safeWeFishString(firstPresentWeFishValue(row, "BASENAME", "baseName"))) + .setRvcd(safeWeFishString(firstPresentWeFishValue(row, "RVCD", "rvcd"))) + .setRvcdName(safeWeFishString(firstPresentWeFishValue(row, "RVCDNAME", "rvcdName"))) + .setHbrvcd(safeWeFishString(firstPresentWeFishValue(row, "HBRVCD", "hbrvcd"))) + .setHbrvcdName(safeWeFishString(firstPresentWeFishValue(row, "HBRVCDNAME", "hbrvcdName"))) + .setRstcd(safeWeFishString(firstPresentWeFishValue(row, "RSTCD", "rstcd"))) + .setEnnm(safeWeFishString(firstPresentWeFishValue(row, "ENNM", "ennm"))) + .setStcd(safeWeFishString(firstPresentWeFishValue(row, "STCD", "stcd"))) + .setStnm(safeWeFishString(firstPresentWeFishValue(row, "STNM", "stnm"))) + .setTm(toWeFishDateTimeTextValue(firstPresentWeFishValue(row, "TM", "tm"))) + .setYr(toWeFishIntegerValue(firstPresentWeFishValue(row, "YR", "yr"))) + .setAcnt(toWeFishLongValue(firstPresentWeFishValue(row, "ACNT", "acnt"))); + } + private Map> queryWePointFishMap(List stcdList, String stcd, String startTime, diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/PushConfigServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/PushConfigServiceImpl.java index 1932cdaa..bd0e9a62 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/PushConfigServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/PushConfigServiceImpl.java @@ -82,7 +82,7 @@ public class PushConfigServiceImpl extends ServiceImpl updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.set(PushConfig::getTargetType,request.getTargetType()); - updateWrapper.eq(PushConfig::getId,request.getConfigId()); + updateWrapper.set(PushConfig::getTargetType, request.getTargetType()); + updateWrapper.eq(PushConfig::getId, request.getConfigId()); Boolean update = this.update(updateWrapper); if (request.getUserRoleIds() == null || request.getUserRoleIds().isEmpty()) { return true; } int type = 0; //如果是所有人或者按人 - if(request.getTargetType() ==3 ){ + if (request.getTargetType() == 3) { type = 1; } List list = new ArrayList<>(); @@ -238,7 +244,7 @@ public class PushConfigServiceImpl extends ServiceImpl pushConfigTargetVoList = pushConfigUserMapper.selectConfigTargets(configId); List userRoleIds = new ArrayList<>(); - if(pushConfigTargetVoList.size()>0){ + if (pushConfigTargetVoList.size() > 0) { for (PushConfigTargetVo pushConfigTargetVo : pushConfigTargetVoList) { userRoleIds.add(pushConfigTargetVo.getUserRoleId()); @@ -481,7 +487,7 @@ public class PushConfigServiceImpl extends ServiceImpl monitorList, List videoList, String baseId) { @@ -607,6 +614,7 @@ public class PushConfigServiceImpl extends ServiceImpl paramMap, String column, String value, String paramKey) { @@ -632,10 +641,11 @@ public class PushConfigServiceImpl extends ServiceImpl paramMap, @@ -657,8 +667,9 @@ public class PushConfigServiceImpl extends ServiceImpl baseIdList, Map paramMap) { @@ -812,10 +823,9 @@ public class PushConfigServiceImpl extends ServiceImpl().eq(PushConfigUser::getConfigId, pushConfig.getId())); + if (count <= 0) { + throw new BizException("推送目标不能为空"); + } + } + if (StrUtil.isNotBlank(pushConfig.getCronExpression())) { if (StrUtil.isBlank(pushConfig.getCronExpression()) || !CronExpression.isValidExpression(pushConfig.getCronExpression())) { throw new BizException("cron表达式格式错误."); } @@ -1178,7 +1183,7 @@ public class PushConfigServiceImpl extends ServiceImpl