diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbMsfbrdmController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbMsfbrdmController.java index 0606b62e..3a70e79a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbMsfbrdmController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbMsfbrdmController.java @@ -26,4 +26,10 @@ public class FbMsfbrdmController { public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fbStationService.getFbFlDataKendoListCust(dataSourceRequest)); } + + @PostMapping("/qgc/GetKendoListCust") + @Operation(summary = "(全过程)增殖站二级页面: 增殖放流情况") + public ResponseResult getQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getQgcMsfbrdmKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbMsfbrdmQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbMsfbrdmQgcVo.java new file mode 100644 index 00000000..e93d3e87 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbMsfbrdmQgcVo.java @@ -0,0 +1,47 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class FbMsfbrdmQgcVo { + + private String stcd; + + private String stnm; + + private String baseId; + + private String baseName; + + private String rstcd; + + private String ennm; + + private Integer bldstt; + + private Integer hydrodtin; + + private Integer runState; + + private String runStateName; + + private String ftp; + + private String ftpName; + + private Long fcntjh; + + private Long fcntjc; + + private String flyr; + + private String fsz; + + private String fwet; + + private String fid; + + private List directionVoList; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbReleaseDirectionVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbReleaseDirectionVo.java new file mode 100644 index 00000000..c8137b2c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbReleaseDirectionVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class FbReleaseDirectionVo { + + private String flstcd; + + private String flstnm; + + private Long flfnct; + + private String flyr; + + private String ftp; + + private String stcd; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index d62ac4d5..66d93a2b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -6,6 +6,7 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; @@ -22,6 +23,8 @@ public interface FbStationService { DataSourceResult getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getBsmfRFishKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index fdb4c098..6387b803 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -17,7 +17,9 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishSummaryVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFtpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbReleaseDirectionVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStBaseInfoVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo; @@ -81,6 +83,16 @@ public class FbStationServiceImpl implements FbStationService { return queryFbFlDataDetailList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getQgcMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + return queryQgcMsfbrdmGroupList(dataSourceRequest, loadOptions, groups); + } + return queryQgcMsfbrdmDetailList(dataSourceRequest, loadOptions); + } + @Override public DataSourceResult getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -732,6 +744,505 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + private DataSourceResult queryQgcMsfbrdmDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + Map paramMap = new HashMap<>(); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildQgcMsfbrdmDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildQgcMsfbrdmCoreSql(parseDateTimeSafely(startTime), parseDateTimeSafely(endTime), paramMap)) + .append(") t WHERE 1 = 1 "); + + String filterSql = buildQgcMsfbrdmFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildQgcMsfbrdmOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, FbMsfbrdmQgcVo.class + ); + enrichQgcMsfbrdmDirections(list, parseDateTimeSafely(startTime), parseDateTimeSafely(endTime)); + deduplicateQgcMsfbrdmFids(list); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private DataSourceResult queryQgcMsfbrdmGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + GroupingInfo[] groupInfos) { + Map paramMap = new HashMap<>(); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT * FROM (") + .append(buildQgcMsfbrdmCoreSql(parseDateTimeSafely(startTime), parseDateTimeSafely(endTime), paramMap)) + .append(") t WHERE 1 = 1 "); + + String filterSql = buildQgcMsfbrdmFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + String groupSql = buildQgcMsfbrdmGroupSql(sql.toString(), dataSourceRequest == null ? null : dataSourceRequest.getGroup()); + List> rows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + List grouped = new GroupHelper().group(rows, Arrays.asList(groupInfos)); + populateQgcMsfbrdmGroupKeyNames(grouped); + result.setData((List) (List) grouped); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildQgcMsfbrdmCoreSql(Date startTime, Date endTime, Map paramMap) { + Integer year = startTime == null ? null : Integer.parseInt(DateUtil.format(startTime, "yyyy")); + String ftpCodeExpr = "COALESCE(TO_CHAR(NVL(relRv.ZY_FISH_ID, relRv.FISH_ID)), " + + "TO_CHAR(NVL(relZy.ZY_FISH_ID, relZy.FISH_ID)), TO_CHAR(stat.FTP))"; + String ftpNameExpr = buildFishNameExpr("stat.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT fb.STCD AS stcd, ") + .append("fb.STNM AS stnm, ") + .append("fb.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("fb.BASE_ID AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("TO_CHAR(mt.YR) AS flyr, ") + .append(ftpCodeExpr).append(" AS ftp, ") + .append(ftpNameExpr).append(" AS ftpName, ") + .append("stat.FCNTJH AS fcntjh, ") + .append("stat.FCNTJC AS fcntjc, ") + .append("stat.FSZ AS fsz, ") + .append("stat.FWET AS fwet, ") + .append("fb.DTIN AS hydrodtin, ") + .append("fb.BLDSTT_CODE AS bldstt, ") + .append("mt.STD_SSTATE AS runState, ") + .append("CASE mt.STD_SSTATE ") + .append(" WHEN 0 THEN '数据未接入' ") + .append(" WHEN 1 THEN '正常运行' ") + .append(" WHEN 2 THEN '未正常报送数据' ") + .append(" WHEN 3 THEN '未正常运行' ") + .append(" ELSE NULL END AS runStateName, ") + .append("stat.FID AS fid ") + .append("FROM MS_STSTATE_T mt ") + .append("INNER JOIN SD_FBRD_B_H fb ON fb.STCD = mt.STCD ") + .append(" AND NVL(fb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = fb.BASE_ID ") + .append(" AND NVL(hb.IS_DELETED, 0) = 0 ") + .append(" AND NVL(hb.ENABLED, 1) = 1 ") + .append("LEFT JOIN (") + .append(" SELECT COALESCE(planAgg.STCD, actualAgg.STCD) AS STCD, ") + .append(" COALESCE(planAgg.FTP, actualAgg.FTP) AS FTP, ") + .append(" COALESCE(planAgg.FLYR, actualAgg.FLYR) AS FLYR, ") + .append(" planAgg.FCNTJH AS FCNTJH, ") + .append(" actualAgg.FCNTJC AS FCNTJC, ") + .append(" actualAgg.FID AS FID, ") + .append(" actualAgg.FSZ AS FSZ, ") + .append(" actualAgg.FWET AS FWET ") + .append(" FROM (") + .append(" SELECT plan.RSTCD AS STCD, ") + .append(" planDet.FTP AS FTP, ") + .append(" TO_NUMBER(TO_CHAR(plan.PLANSD, 'YYYY')) AS FLYR, ") + .append(" SUM(planDet.FCNT) AS FCNTJH ") + .append(" FROM SD_ENGFRPLAN_B plan ") + .append(" INNER JOIN SD_ENGFRPLANDET_B planDet ON plan.ID = planDet.RPJH_ID ") + .append(" AND NVL(planDet.IS_DELETED, 0) = 0 ") + .append(" AND planDet.FTP IS NOT NULL ") + .append(" WHERE NVL(plan.IS_DELETED, 0) = 0 "); + if (startTime != null) { + paramMap.put("qgcMsfbrdmPlanStart", startTime); + sql.append(" AND plan.PLANSD >= #{map.qgcMsfbrdmPlanStart} "); + } + if (endTime != null) { + paramMap.put("qgcMsfbrdmPlanEnd", endTime); + sql.append(" AND plan.PLANED <= #{map.qgcMsfbrdmPlanEnd} "); + } + sql.append(" GROUP BY plan.RSTCD, planDet.FTP, TO_NUMBER(TO_CHAR(plan.PLANSD, 'YYYY')) ") + .append(" ) planAgg ") + .append(" FULL OUTER JOIN (") + .append(" SELECT run.RSTCD AS STCD, ") + .append(" actualDet.FTP AS FTP, ") + .append(" TO_NUMBER(TO_CHAR(run.TM, 'YYYY')) AS FLYR, ") + .append(" SUM(actualDet.FCNT) AS FCNTJC, ") + .append(" LISTAGG(run.FPRFID || ',' || run.FLRFID || ',' || run.BRRFID || ',' || run.BRFFID, ',') ") + .append(" WITHIN GROUP (ORDER BY run.ID) AS FID, ") + .append(" MAX(actualDet.FSZ) AS FSZ, ") + .append(" MAX(actualDet.FWET) AS FWET ") + .append(" FROM SD_ENGFR_R run ") + .append(" INNER JOIN SD_RPIMNFISH_R actualDet ON run.ID = actualDet.RPIMN_ID ") + .append(" AND NVL(actualDet.IS_DELETED, 0) = 0 ") + .append(" AND actualDet.FTP IS NOT NULL ") + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 "); + if (startTime != null) { + paramMap.put("qgcMsfbrdmRunStart", startTime); + sql.append(" AND run.TM >= #{map.qgcMsfbrdmRunStart} "); + } + if (endTime != null) { + paramMap.put("qgcMsfbrdmRunEnd", endTime); + sql.append(" AND run.TM <= #{map.qgcMsfbrdmRunEnd} "); + } + sql.append(" GROUP BY run.RSTCD, actualDet.FTP, TO_NUMBER(TO_CHAR(run.TM, 'YYYY')) ") + .append(" ) actualAgg ") + .append(" ON planAgg.STCD = actualAgg.STCD ") + .append(" AND NVL(planAgg.FTP, '~') = NVL(actualAgg.FTP, '~') ") + .append(" AND NVL(planAgg.FLYR, -1) = NVL(actualAgg.FLYR, -1) ") + .append(") stat ON stat.STCD = mt.STCD AND stat.FLYR = mt.YR ") + .append(buildFishJoinSql("stat.FTP", "fb.HBRVCD")) + .append("WHERE NVL(mt.IS_DELETED, 0) = 0 ") + .append(" AND mt.STTP_CODE = 'FB' "); + if (year != null) { + paramMap.put("qgcMsfbrdmYear", year); + sql.append(" AND mt.YR = #{map.qgcMsfbrdmYear} "); + } + return sql.toString(); + } + + private void enrichQgcMsfbrdmDirections(List list, Date startTime, Date endTime) { + if (CollUtil.isEmpty(list)) { + return; + } + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT run.STCD AS flstcd, ") + .append(" eng.ENNM AS flstnm, ") + .append(" SUM(det.FCNT) AS flfnct, ") + .append(" TO_CHAR(run.TM, 'YYYY') AS flyr, ") + .append(" COALESCE(TO_CHAR(NVL(relRv.ZY_FISH_ID, relRv.FISH_ID)), ") + .append(" TO_CHAR(NVL(relZy.ZY_FISH_ID, relZy.FISH_ID)), TO_CHAR(det.FTP)) AS ftp, ") + .append(" run.RSTCD AS stcd ") + .append("FROM SD_ENGFR_R run ") + .append("INNER JOIN SD_RPIMNFISH_R det ON det.RPIMN_ID = run.ID ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_FBRD_B_H fb ON fb.STCD = run.RSTCD ") + .append(" AND NVL(fb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = run.STCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append(buildFishJoinSql("det.FTP", "fb.HBRVCD")) + .append("WHERE NVL(run.IS_DELETED, 0) = 0 "); + if (startTime != null) { + paramMap.put("qgcMsfbrdmDirStart", startTime); + sql.append(" AND run.TM >= #{map.qgcMsfbrdmDirStart} "); + } + if (endTime != null) { + paramMap.put("qgcMsfbrdmDirEnd", endTime); + sql.append(" AND run.TM <= #{map.qgcMsfbrdmDirEnd} "); + } + sql.append("GROUP BY run.STCD, eng.ENNM, TO_CHAR(run.TM, 'YYYY'), ") + .append(" COALESCE(TO_CHAR(NVL(relRv.ZY_FISH_ID, relRv.FISH_ID)), ") + .append(" TO_CHAR(NVL(relZy.ZY_FISH_ID, relZy.FISH_ID)), TO_CHAR(det.FTP)), ") + .append(" run.RSTCD "); + + List directions = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql.toString(), paramMap, FbReleaseDirectionVo.class + ); + if (CollUtil.isEmpty(directions)) { + return; + } + Map> directionMap = directions.stream() + .collect(Collectors.groupingBy( + item -> StrUtil.blankToDefault(item.getStcd(), "") + "|" + + StrUtil.blankToDefault(item.getFtp(), "") + "|" + + StrUtil.blankToDefault(item.getFlyr(), ""), + LinkedHashMap::new, + Collectors.toList() + )); + for (FbMsfbrdmQgcVo item : list) { + String key = StrUtil.blankToDefault(item.getStcd(), "") + "|" + + StrUtil.blankToDefault(item.getFtp(), "") + "|" + + StrUtil.blankToDefault(item.getFlyr(), ""); + item.setDirectionVoList(directionMap.getOrDefault(key, Collections.emptyList())); + } + } + + private void deduplicateQgcMsfbrdmFids(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + for (FbMsfbrdmQgcVo item : list) { + if (item == null || StrUtil.isBlank(item.getFid())) { + continue; + } + Set fidSet = Arrays.stream(item.getFid().split(",")) + .map(StrUtil::trim) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toCollection(LinkedHashSet::new)); + item.setFid(fidSet.isEmpty() ? null : String.join(",", fidSet)); + } + } + + private String buildQgcMsfbrdmDetailSelectSql(List select) { + List fields = CollUtil.isEmpty(select) + ? List.of("stcd", "stnm", "baseId", "baseName", "rstcd", "ennm", "bldstt", + "hydrodtin", "runState", "runStateName", "ftp", "ftpName", "fcntjh", "fcntjc", + "flyr", "fsz", "fwet", "fid") + : select; + List selectParts = new ArrayList<>(); + for (String field : fields) { + String column = mapQgcMsfbrdmColumn(field); + if (StrUtil.isNotBlank(column)) { + selectParts.add(column + " AS " + field); + } + } + if (selectParts.isEmpty()) { + selectParts.add("t.stcd AS stcd"); + } + return String.join(", ", selectParts); + } + + private String buildQgcMsfbrdmFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildQgcMsfbrdmLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildQgcMsfbrdmFilterCondition(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 buildQgcMsfbrdmLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapQgcMsfbrdmColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + Object value = filter.getValue(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeQgcBsmfRValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "qgcMsfbrdmP" + indexHolder[0]++; + paramMap.put(key, normalizeQgcMsfbrdmValue(filter.getField(), item)); + placeholders.add("#{map." + key + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String key = "qgcMsfbrdmP" + indexHolder[0]++; + Object normalizedValue = normalizeQgcMsfbrdmValue(filter.getField(), value); + 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, "%" + normalizedValue + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + normalizedValue + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, normalizedValue + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + normalizedValue); + yield column + " LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String buildQgcMsfbrdmOrderBySql(List sortDescriptors) { + if (CollUtil.isEmpty(sortDescriptors)) { + return " ORDER BY t.flyr DESC, t.stnm ASC, t.ftpName ASC"; + } + List parts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor descriptor : sortDescriptors) { + String column = mapQgcMsfbrdmColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + parts.add(column + " " + direction); + } + if (parts.isEmpty()) { + return " ORDER BY t.flyr DESC, t.stnm ASC, t.ftpName ASC"; + } + return " ORDER BY " + String.join(", ", parts); + } + + private String buildQgcMsfbrdmGroupSql(String baseSql, List groups) { + if (CollUtil.isEmpty(groups)) { + return baseSql; + } + List validGroups = groups.stream() + .filter(group -> StrUtil.isNotBlank(mapQgcMsfbrdmColumn(group.getField()))) + .toList(); + if (validGroups.isEmpty()) { + return baseSql; + } + List fields = validGroups.stream().map(DataSourceRequest.GroupDescriptor::getField).toList(); + StringBuilder sql = new StringBuilder("SELECT "); + for (int i = 0; i < fields.size(); i++) { + if (i > 0) { + sql.append(", "); + } + sql.append(fields.get(i)); + } + for (String field : fields) { + sql.append(", COUNT(*) AS count_").append(field); + } + sql.append(" FROM (").append(baseSql).append(") t GROUP BY "); + for (int i = 0; i < fields.size(); i++) { + if (i > 0) { + sql.append(", "); + } + sql.append(fields.get(i)); + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : validGroups) { + if (Boolean.FALSE.equals(descriptor.getNeedSortFlag())) { + continue; + } + String direction = "desc".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orderByParts.add(descriptor.getField() + " " + direction); + } + if (!orderByParts.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderByParts)); + } + return sql.toString(); + } + + private String mapQgcMsfbrdmColumn(String field) { + return switch (field) { + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "bldstt" -> "t.bldstt"; + case "hydrodtin" -> "t.hydrodtin"; + case "runState" -> "t.runState"; + case "runStateName" -> "t.runStateName"; + case "ftp" -> "t.ftp"; + case "ftpName" -> "t.ftpName"; + case "fcntjh" -> "t.fcntjh"; + case "fcntjc" -> "t.fcntjc"; + case "flyr" -> "t.flyr"; + case "fsz" -> "t.fsz"; + case "fwet" -> "t.fwet"; + case "fid" -> "t.fid"; + default -> ""; + }; + } + + private Object normalizeQgcMsfbrdmValue(String field, Object value) { + if (value == null) { + return null; + } + return switch (field) { + case "fcntjh", "fcntjc", "bldstt", "hydrodtin", "runState" -> Integer.valueOf(String.valueOf(value)); + case "flyr" -> String.valueOf(value); + default -> value; + }; + } + + @SuppressWarnings("unchecked") + private void populateQgcMsfbrdmGroupKeyNames(List groups) { + if (CollUtil.isEmpty(groups)) { + return; + } + for (Group group : groups) { + if (group == null) { + continue; + } + if ("runState".equals(group.getField()) || "runStateName".equals(group.getField())) { + group.setKeyName(resolveQgcMsfbrdmRunStateName(group.getKey())); + } + if (CollUtil.isNotEmpty(group.getItems()) && group.getItems().get(0) instanceof Group) { + populateQgcMsfbrdmGroupKeyNames((List) group.getItems()); + } + } + } + + private String resolveQgcMsfbrdmRunStateName(Object value) { + if (value == null) { + return null; + } + String text = String.valueOf(value); + return switch (text) { + case "0" -> "数据未接入"; + case "1" -> "正常运行"; + case "2" -> "未正常报送数据"; + case "3" -> "未正常运行"; + default -> text; + }; + } + private DataSourceResult queryQgcBsmfRDetailList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { Map paramMap = new HashMap<>(); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java index 88b8a6f9..a5b7963a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java @@ -136,15 +136,15 @@ public class FpBuildServiceImpl implements FpBuildService { String sql = "SELECT DISTINCT " + " fish.ID AS id, " + " fish.NAME AS name " + - "FROM SD_FPSS_B_H fp " + - "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD " + - " AND NVL(eng.IS_DELETED, 0) = 0 " + - "INNER JOIN SD_FISHDICTORY_RLTN_B rel ON rel.RVCD = eng.HBRVCD " + + "FROM SD_FBRD_B_H fb " + +// "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD " + +// " AND NVL(eng.IS_DELETED, 0) = 0 " + + "INNER JOIN SD_FISHDICTORY_RLTN_B rel ON rel.BASE_ID = fb.BASE_ID " + " AND NVL(rel.IS_DELETED, 0) = 0 " + "INNER JOIN SD_FISHDICTORY_B fish ON fish.ID = NVL(rel.ZY_FISH_ID, rel.FISH_ID) " + " AND NVL(fish.IS_DELETED, 0) = 0 " + " AND NVL(fish.ENABLE, 1) = 1 " + - "WHERE fp.STCD = #{map.stcd} " + + "WHERE fb.STCD = #{map.stcd} " + "ORDER BY fish.NAME"; List list = microservicDynamicSQLMapper.getAllListWithResultType(