From 5632e00f0bc35e1c4f7c523652d24d4f3f1822d2 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 15:54:04 +0800 Subject: [PATCH 01/20] =?UTF-8?q?feat:=20=E7=94=9F=E6=80=81=E6=B5=81?= =?UTF-8?q?=E9=87=8F=E5=91=A8=E6=97=AC=E6=9C=88=E5=AD=A3=E5=B9=B4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eq/controller/EngEqDataController.java | 8 + .../qgc_eng/eq/entity/vo/EngEqDrtpDataVo.java | 126 ++++++ .../qgc_eng/eq/service/EngEqDataService.java | 3 + .../eq/service/impl/EngEqDataServiceImpl.java | 379 ++++++++++++++++++ 4 files changed, 516 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqDrtpDataVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java index eb74aa9a..9421dcd7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java @@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqMsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRuleVo; @@ -42,6 +43,13 @@ public class EngEqDataController { return ResponseResult.successData(engEqDataService.getDayKendoListCust(dataSourceRequest)); } + @PostMapping("/data/drtp/GetKendoListCust") + @Operation(summary = "生态流量周旬月季年数据") + public ResponseResult getDrtpKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = engEqDataService.getDrtpKendoListCust(dataSourceRequest); + return ResponseResult.successData(result); + } + @PostMapping("/interval/GetKendoListCust") @Operation(summary = "生态流量达标情况") public ResponseResult getIntervalKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqDrtpDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqDrtpDataVo.java new file mode 100644 index 00000000..e7caab6c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqDrtpDataVo.java @@ -0,0 +1,126 @@ +package com.yfd.platform.qgc_eng.eq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "生态流量周旬月季年数据") +public class EngEqDrtpDataVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "工程名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地流域名称") + private String hbrvcdName; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "流域名称") + private String rvcdName; + + @Schema(description = "行政区名称") + private String addvcdName; + + @Schema(description = "入库流量") + private BigDecimal qi; + + @Schema(description = "出库流量") + private BigDecimal qo; + + @Schema(description = "坝上水位") + private BigDecimal rz; + + @Schema(description = "坝下水位") + private BigDecimal dz; + + @Schema(description = "生态流量限值(环保部)") + private BigDecimal qecLimit; + + @Schema(description = "生态流量") + private BigDecimal qec; + + @Schema(description = "生态流量限值(水利部)") + private BigDecimal mwrLimit; + + @Schema(description = "生态流量限值(多年平均)") + private BigDecimal avqLimit; + + @Schema(description = "生态流量系数(环保部)") + private BigDecimal qecC; + + @Schema(description = "生态流量系数(水利部)") + private BigDecimal mwrC; + + @Schema(description = "生态流量系数(多年平均)") + private BigDecimal avqC; + + @Schema(description = "生态流量是否达标") + private Integer sfdb; + + @Schema(description = "生态流量是否达标中文") + private String sfdbName; + + @Schema(description = "生态流量是否达标(环保部)") + private Integer qecSfdb; + + @Schema(description = "生态流量是否达标(水利部)") + private Integer mwrSfdb; + + @Schema(description = "生态流量是否达标(水利部)中文") + private String mwrSfdbName; + + @Schema(description = "生态流量是否达标(多年平均)") + private Integer avqSfdb; + + @Schema(description = "生态流量是否达标(多年平均)中文") + private String avqSfdbName; + + @Schema(description = "数据时间") + private Date tm; + + @Schema(description = "月") + private Integer month; + + @Schema(description = "年") + private Integer year; + + @Schema(description = "维度类型") + private String drtp; + + @Schema(description = "时段") + private Integer dr; + + @Schema(description = "基地排序") + private Integer baseStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "站点排序") + private Integer siteStepSort; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java index 009a42dc..e68b0699 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_eng.eq.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; @@ -21,6 +22,8 @@ public interface EngEqDataService { DataSourceResult getDayKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getDrtpKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getIntervalKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 49d442b7..e067db09 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -13,6 +13,7 @@ import com.yfd.platform.common.enums.QecIntervalEnum; import com.yfd.platform.common.enums.ShowEnum; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngFidVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; @@ -70,6 +71,15 @@ public class EngEqDataServiceImpl implements EngEqDataService { return queryDayGroupList(dataSourceRequest, loadOptions); } + @Override + public DataSourceResult getDrtpKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + return queryDrtpDetailList(dataSourceRequest, loadOptions); + } + return queryDrtpGroupList(dataSourceRequest, loadOptions); + } + @Override public DataSourceResult getIntervalKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1590,6 +1600,101 @@ public class EngEqDataServiceImpl implements EngEqDataService { return result; } + private DataSourceResult queryDrtpDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildDrtpDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildDrtpViewSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildDrtpFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildDrtpDetailOrderBySql(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, EngEqDrtpDataVo.class); + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult queryDrtpGroupList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + List groups = dataSourceRequest.getGroup(); + GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup(); + List selectItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapDrtpColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField().toUpperCase()); + selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase()); + if (CollUtil.isNotEmpty(descriptor.getAggregates())) { + for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) { + String aggregateColumn = mapDrtpColumn(aggregate.getField()); + if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) { + continue; + } + selectItems.add(buildAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField())); + } + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.STCD AS STCD"); + selectItems.add("COUNT(*) AS COUNT_STCD"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildDrtpViewSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildDrtpFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapDrtpColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" "); + } + sql.append(buildDrtpGroupOrderBySql(groups)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + 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((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + private DataSourceResult queryIntervalDetailList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { Map paramMap = new HashMap<>(); @@ -2683,6 +2788,75 @@ public class EngEqDataServiceImpl implements EngEqDataService { "WHERE NVL(day.IS_DELETED, 0) = 0"; } + private String buildDrtpViewSql() { + return "SELECT " + + "drtp.ID AS id, " + + "eng.STCD AS stcd, " + + "eng.ENNM AS stnm, " + + "eng.ENNM AS ennm, " + + "eng.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "eng.HBRVCD AS hbrvcd, " + + "hbrv.HBRVNM AS hbrvcdName, " + + "eng.RVCD AS rvcd, " + + "rv.RVNM AS rvcdName, " + + "addv.ADDVNM AS addvcdName, " + + "runDrtp.QI AS qi, " + + "runDrtp.QO AS qo, " + + "runDrtp.RZ AS rz, " + + "runDrtp.DZ AS dz, " + + "drtp.QEC_LIMIT AS qecLimit, " + + "drtp.QEC AS qec, " + + "drtp.MWR_LIMIT AS mwrLimit, " + + "drtp.AVQ_LIMIT AS avqLimit, " + + "drtp.QEC_C AS qecC, " + + "drtp.MWR_C AS mwrC, " + + "drtp.AVQ_C AS avqC, " + + "drtp.SFDB AS sfdb, " + + "CASE NVL(drtp.SFDB, -1) WHEN 0 THEN '不达标' WHEN 1 THEN '达标' WHEN 2 THEN '无生态流量数据' WHEN 3 THEN '无生态流量限值要求' ELSE NULL END AS sfdbName, " + + "drtp.SFDB AS qecSfdb, " + + "drtp.MWR_SFDB AS mwrSfdb, " + + "CASE NVL(drtp.MWR_SFDB, -1) WHEN 0 THEN '不达标' WHEN 1 THEN '达标' WHEN 2 THEN '无生态流量数据' WHEN 3 THEN '无生态流量限值要求' ELSE NULL END AS mwrSfdbName, " + + "drtp.AVQ_SFDB AS avqSfdb, " + + "CASE NVL(drtp.AVQ_SFDB, -1) WHEN 0 THEN '不达标' WHEN 1 THEN '达标' WHEN 2 THEN '无生态流量数据' WHEN 3 THEN '无生态流量限值要求' ELSE NULL END AS avqSfdbName, " + + "drtp.TM AS tm, " + + "drtp.YEAR AS year, " + + "drtp.MONTH AS month, " + + "drtp.DRTP AS drtp, " + + "drtp.DR AS dr, " + + "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + + "NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, " + + "NVL(rstSort.SORT, 999999) AS rstcdStepSort, " + + "NVL(siteSort.SORT, 999999) AS siteStepSort " + + "FROM SD_QECDRTP_S drtp " + + "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = drtp.STCD AND NVL(eng.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " + + "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 along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 " + + "LEFT JOIN ( " + + " SELECT det.SORT, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = eng.STCD " + + "LEFT JOIN ( " + + " SELECT det.SORT, cfg.RVCD, det.STCD " + + " FROM MS_ALONGDET_B det " + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID " + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' " + + ") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = eng.STCD " + + "LEFT JOIN SD_HYDROPWDRTP_S runDrtp ON drtp.STCD = runDrtp.STCD " + + " AND drtp.DRTP = runDrtp.DRTP " + + " AND NVL(drtp.DR, -1) = NVL(runDrtp.DR, -1) " + + " AND NVL(drtp.MONTH, -1) = NVL(runDrtp.MONTH, -1) " + + " AND drtp.YEAR = runDrtp.YEAR " + + " AND NVL(runDrtp.IS_DELETED, 0) = 0 " + + "WHERE NVL(drtp.IS_DELETED, 0) = 0"; + } + private String buildDayRunDaySql() { return "SELECT run.STCD, TRUNC(run.TM) AS DT, " + "AVG(run.QI) AS QI, AVG(run.QO) AS QO, AVG(run.RZ) AS RZ, AVG(run.DZ) AS DZ " + @@ -2729,6 +2903,25 @@ public class EngEqDataServiceImpl implements EngEqDataService { return String.join(", ", selected); } + private String buildDrtpDetailSelectSql(List selectFields) { + Map columns = drtpFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.addAll(columns.values()); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + if (selected.isEmpty()) { + selected.addAll(columns.values()); + } + } + return String.join(", ", selected); + } + private Map detailFieldColumns() { Map columns = new LinkedHashMap<>(); columns.put("id", "sqr.ID AS id"); @@ -2815,6 +3008,49 @@ public class EngEqDataServiceImpl implements EngEqDataService { return columns; } + private Map drtpFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("baseName", "t.baseName AS baseName"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("rvcdName", "t.rvcdName AS rvcdName"); + columns.put("addvcdName", "t.addvcdName AS addvcdName"); + columns.put("qi", "t.qi AS qi"); + columns.put("qo", "t.qo AS qo"); + columns.put("rz", "t.rz AS rz"); + columns.put("dz", "t.dz AS dz"); + columns.put("qecLimit", "t.qecLimit AS qecLimit"); + columns.put("qec", "t.qec AS qec"); + columns.put("mwrLimit", "t.mwrLimit AS mwrLimit"); + columns.put("avqLimit", "t.avqLimit AS avqLimit"); + columns.put("qecC", "t.qecC AS qecC"); + columns.put("mwrC", "t.mwrC AS mwrC"); + columns.put("avqC", "t.avqC AS avqC"); + columns.put("sfdb", "t.sfdb AS sfdb"); + columns.put("sfdbName", "t.sfdbName AS sfdbName"); + columns.put("qecSfdb", "t.qecSfdb AS qecSfdb"); + columns.put("mwrSfdb", "t.mwrSfdb AS mwrSfdb"); + columns.put("mwrSfdbName", "t.mwrSfdbName AS mwrSfdbName"); + columns.put("avqSfdb", "t.avqSfdb AS avqSfdb"); + columns.put("avqSfdbName", "t.avqSfdbName AS avqSfdbName"); + columns.put("tm", "t.tm AS tm"); + columns.put("year", "t.year AS year"); + columns.put("month", "t.month AS month"); + columns.put("drtp", "t.drtp AS drtp"); + columns.put("dr", "t.dr AS dr"); + columns.put("baseStepSort", "t.baseStepSort AS baseStepSort"); + columns.put("rvcdStepSort", "t.rvcdStepSort AS rvcdStepSort"); + columns.put("rstcdStepSort", "t.rstcdStepSort AS rstcdStepSort"); + columns.put("siteStepSort", "t.siteStepSort AS siteStepSort"); + return columns; + } + private String buildDetailOrderBySql(List sortList) { if (CollUtil.isEmpty(sortList)) { return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, tm DESC"; @@ -3596,6 +3832,10 @@ public class EngEqDataServiceImpl implements EngEqDataService { return "dt".equalsIgnoreCase(field) || "tm".equalsIgnoreCase(field); } + private boolean isEqDrtpDateField(String field) { + return "tm".equalsIgnoreCase(field); + } + private String buildEqValueExpr(String paramKey, boolean dateField, Object value) { if (!dateField || value == null) { return "#{map." + paramKey + "}"; @@ -3684,6 +3924,83 @@ public class EngEqDataServiceImpl implements EngEqDataService { return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); } + private String buildDrtpFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildDrtpLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildDrtpFilterCondition(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 buildDrtpLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapDrtpColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + return buildGenericCondition(column, filter, paramMap, indexHolder, isEqDrtpDateField(filter.getField())); + } + + private String buildDrtpDetailOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, year DESC, month DESC, drtp ASC, dr ASC"; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sortList) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapDrtpOrderColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + if (orders.isEmpty()) { + return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, year DESC, month DESC, drtp ASC, dr ASC"; + } + return " ORDER BY " + String.join(", ", orders); + } + + private String buildDrtpGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return ""; + } + List orders = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor descriptor : groups) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapDrtpColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(descriptor.getDir()) || "des".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orders.add(column + " " + dir); + } + return orders.isEmpty() ? "" : " ORDER BY " + String.join(", ", orders); + } + @@ -4247,4 +4564,66 @@ public class EngEqDataServiceImpl implements EngEqDataService { default -> null; }; } + + private String mapDrtpColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "stcd" -> "t.stcd"; + case "stnm", "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "hbrvcd" -> "t.hbrvcd"; + case "hbrvcdName" -> "t.hbrvcdName"; + case "rvcd" -> "t.rvcd"; + case "rvcdName" -> "t.rvcdName"; + case "addvcdName" -> "t.addvcdName"; + case "qi" -> "t.qi"; + case "qo" -> "t.qo"; + case "rz" -> "t.rz"; + case "dz" -> "t.dz"; + case "qecLimit" -> "t.qecLimit"; + case "qec" -> "t.qec"; + case "mwrLimit" -> "t.mwrLimit"; + case "avqLimit" -> "t.avqLimit"; + case "qecC" -> "t.qecC"; + case "mwrC" -> "t.mwrC"; + case "avqC" -> "t.avqC"; + case "sfdb" -> "t.sfdb"; + case "sfdbName" -> "t.sfdbName"; + case "qecSfdb" -> "t.qecSfdb"; + case "mwrSfdb" -> "t.mwrSfdb"; + case "mwrSfdbName" -> "t.mwrSfdbName"; + case "avqSfdb" -> "t.avqSfdb"; + case "avqSfdbName" -> "t.avqSfdbName"; + case "tm" -> "t.tm"; + case "year" -> "t.year"; + case "month" -> "t.month"; + case "drtp" -> "t.drtp"; + case "dr" -> "t.dr"; + case "baseStepSort" -> "NVL(t.baseStepSort, 999999)"; + case "rvcdStepSort" -> "NVL(t.rvcdStepSort, 999999)"; + case "rstcdStepSort" -> "NVL(t.rstcdStepSort, 999999)"; + case "siteStepSort" -> "NVL(t.siteStepSort, 999999)"; + default -> null; + }; + } + + private String mapDrtpOrderColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id", "baseId", "hbrvcd", "rvcd", "qecC", "mwrC", "avqC", + "sfdbName", "qecSfdb", "mwrSfdb", "mwrSfdbName", "avqSfdb", + "avqSfdbName", "baseStepSort", "rvcdStepSort", "rstcdStepSort", + "siteStepSort", "tm", "year", "month", "drtp", "dr", "stcd", + "stnm", "ennm", "qi", "qo", "qec", "sfdb", "rz", "dz", + "qecLimit", "mwrLimit", "avqLimit", "baseName", "rvcdName", + "hbrvcdName", "addvcdName" -> field; + default -> null; + }; + } } From 229a987dfadaef1fbaf8a021a59db372aab16d4f Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 17:13:58 +0800 Subject: [PATCH 02/20] =?UTF-8?q?feat:=20=E5=85=A8=E6=B5=81=E5=9F=9F?= =?UTF-8?q?=E5=A2=9E=E6=AE=96=E7=AB=99=E6=A6=82=E5=86=B5=E4=BA=8C=E7=BA=A7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 10 +- .../fb/controller/FbStationController.java | 29 ++ .../entity/vo/FbStationOverviewSecondVo.java | 53 ++++ .../qgc_env/fb/service/FbStationService.java | 10 + .../fb/service/impl/FbStationServiceImpl.java | 284 ++++++++++++++++++ .../service/impl/SdWtMonitorServiceImpl.java | 12 +- 6 files changed, 393 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationOverviewSecondVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 443e06a6..f0faacb1 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -122,11 +122,19 @@ public class SwaggerConfig { @Bean public GroupedOpenApi groupEnvFprApi() { return GroupedOpenApi.builder() - .group("3.5 全过程-生态环保数据服务-鱼类调查") + .group("3.6 全过程-生态环保数据服务-鱼类调查") .packagesToScan("com.yfd.platform.qgc_env.fpr.controller") .build(); } + @Bean + public GroupedOpenApi groupEnvFbApi() { + return GroupedOpenApi.builder() + .group("3.7 全过程-生态环保数据服务-鱼类调查") + .packagesToScan("com.yfd.platform.qgc_env.fb.controller") + .build(); + } + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java new file mode 100644 index 00000000..5ffb0de6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -0,0 +1,29 @@ +package com.yfd.platform.qgc_env.fb.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.fb.service.FbStationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/fb/station") +@Tag(name = "鱼类增殖站概况") +@Validated +public class FbStationController { + + @Resource + private FbStationService fbStationService; + + @PostMapping("/qgcoverview/getOverviewSecond") + @Operation(summary = "全流域增殖站概况二级页面") + public ResponseResult getQgcOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getQgcOverviewSecond(dataSourceRequest)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationOverviewSecondVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationOverviewSecondVo.java new file mode 100644 index 00000000..e39ace7a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationOverviewSecondVo.java @@ -0,0 +1,53 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "全流域增殖站概况二级页面") +public class FbStationOverviewSecondVo { + + @Schema(description = "增殖站编码") + private String stcd; + + @Schema(description = "增殖站名称") + private String stnm; + + @Schema(description = "服务电站") + private String ennm; + + @Schema(description = "增殖站总数") + private Integer count; + + @Schema(description = "鱼种类数") + private Integer ftpCount; + + @Schema(description = "总投资") + private BigDecimal totalInv; + + @Schema(description = "计划放流鱼种类") + private String planFtp; + + @Schema(description = "计划放流尾数") + private BigDecimal fcntjh; + + @Schema(description = "实际鱼种类数") + private Integer realftpCount; + + @Schema(description = "实际鱼种类") + private String realftp; + + @Schema(description = "实际放流尾数") + private BigDecimal realfcnt; + + @Schema(description = "实际放流尾数字符串") + private String realfcntStr; + + @Schema(description = "年份") + private String year; + + @Schema(description = "累计放鱼数量") + private Long totalFtpCount; +} 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 new file mode 100644 index 00000000..600f6664 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -0,0 +1,10 @@ +package com.yfd.platform.qgc_env.fb.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; + +public interface FbStationService { + + DataSourceResult getQgcOverviewSecond(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 new file mode 100644 index 00000000..ee43e15e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -0,0 +1,284 @@ +package com.yfd.platform.qgc_env.fb.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; +import com.yfd.platform.qgc_env.fb.service.FbStationService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +@Service +public class FbStationServiceImpl implements FbStationService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String year = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "year"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String hbrvcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "hbrvcd"); + String stnm = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); + List stcdList = resolveStcdList(dataSourceRequest, loadOptions); + + Map paramMap = new HashMap<>(); + String sql = buildQgcOverviewSecondSql(year, baseId, hbrvcd, stnm, stcdList, paramMap); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql, paramMap, FbStationOverviewSecondVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildQgcOverviewSecondSql(String year, + String baseId, + String hbrvcd, + String stnm, + List stcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT fb.STCD AS stcd, ") + .append("fb.STNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("fb.INV AS totalInv, ") + .append("t.YEAR AS year, ") + .append("MAX(t.planFtp) AS planFtp, ") + .append("SUM(t.fcntjh) AS fcntjh, ") + .append("MAX(t.realftp) AS realftp, ") + .append("MAX(t.realfcnt) AS realfcntStr ") + .append("FROM SD_FBRD_B_H fb ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (") + .append(buildPlanUnionActualSql(year, stcdList, paramMap)) + .append(") t ON fb.STCD = t.rstcd ") + .append("WHERE 1 = 1 "); + + if (StrUtil.isNotBlank(stnm)) { + paramMap.put("stnm", "%" + stnm.trim() + "%"); + sql.append("AND fb.STNM LIKE #{map.stnm} "); + } + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("baseId", baseId.trim()); + sql.append("AND fb.BASE_ID = #{map.baseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("hbrvcd", hbrvcd.trim()); + sql.append("AND fb.HBRVCD = #{map.hbrvcd} "); + } + appendLikeAnyCondition(sql, paramMap, "NVL(fb.RENGCD, fb.RSTCD)", stcdList, "stationFilter"); + + sql.append("GROUP BY fb.STCD, fb.STNM, eng.ENNM, t.YEAR, fb.INV ") + .append("ORDER BY fb.STCD ASC"); + return sql.toString(); + } + + private String buildPlanUnionActualSql(String year, List stcdList, Map paramMap) { + return buildPlanSql(year, stcdList, paramMap) + " UNION ALL " + buildActualSql(year, stcdList, paramMap); + } + + private String buildPlanSql(String year, List stcdList, Map paramMap) { + String fishNameExpr = buildFishNameExpr("det.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT plan.RSTCD AS rstcd, ") + .append("fishAgg.NAME AS planFtp, ") + .append("SUM(fishAgg.FCNT) AS fcntjh, ") + .append("CAST(NULL AS VARCHAR2(4000)) AS realftp, ") + .append("CAST(NULL AS VARCHAR2(4000)) AS realfcnt, ") + .append("TO_CHAR(plan.PLANSD, 'YYYY') AS year ") + .append("FROM SD_ENGFRPLAN_B plan ") + .append("LEFT JOIN ( ") + .append(" SELECT det.RPJH_ID, ") + .append(" SUM(det.FCNT) AS FCNT, ") + .append(" LISTAGG(TO_CHAR(").append(fishNameExpr).append("), ', ') ") + .append(" WITHIN GROUP (ORDER BY ").append(fishNameExpr).append(") AS NAME ") + .append(" FROM SD_ENGFRPLANDET_B det ") + .append(" INNER JOIN SD_ENGFRPLAN_B planInner ON det.RPJH_ID = planInner.ID ") + .append(" INNER JOIN SD_FBRD_B_H fbPlan ON fbPlan.STCD = planInner.RSTCD ") + .append(buildFishJoinSql("det.FTP", "fbPlan.HBRVCD")) + .append(" WHERE NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND det.FTP IS NOT NULL ") + .append(" GROUP BY det.RPJH_ID ") + .append(") fishAgg ON plan.ID = fishAgg.RPJH_ID ") + .append("WHERE NVL(plan.IS_DELETED, 0) = 0 "); + + if (StrUtil.isNotBlank(year)) { + paramMap.put("planYear", year.trim()); + sql.append("AND TO_CHAR(plan.PLANSD, 'YYYY') = #{map.planYear} "); + } + appendInCondition(sql, paramMap, "plan.STCD", stcdList, "planStcd"); + + sql.append("GROUP BY plan.RSTCD, fishAgg.NAME, TO_CHAR(plan.PLANSD, 'YYYY') "); + return sql.toString(); + } + + private String buildActualSql(String year, List stcdList, Map paramMap) { + String fishNameExpr = buildFishNameExpr("det.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT actualFish.RSTCD AS rstcd, ") + .append("CAST(NULL AS VARCHAR2(4000)) AS planFtp, ") + .append("CAST(NULL AS NUMBER(18, 2)) AS fcntjh, ") + .append("LISTAGG(TO_CHAR(actualFish.NAME), ', ') WITHIN GROUP (ORDER BY actualFish.NAME) AS realftp, ") + .append("LISTAGG(TO_CHAR(actualFish.FCNT), ', ') WITHIN GROUP (ORDER BY actualFish.NAME) AS realfcnt, ") + .append("actualFish.YR AS year ") + .append("FROM ( ") + .append(" SELECT run.RSTCD AS RSTCD, ") + .append(" TO_CHAR(run.TM, 'YYYY') AS YR, ") + .append(" ").append(fishNameExpr).append(" AS NAME, ") + .append(" SUM(det.FCNT) AS FCNT ") + .append(" FROM SD_ENGFR_R run ") + .append(" LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND det.FTP IS NOT NULL ") + .append(" INNER JOIN SD_FBRD_B_H fbRun ON fbRun.STCD = run.RSTCD ") + .append(buildFishJoinSql("det.FTP", "fbRun.HBRVCD")) + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 "); + + if (StrUtil.isNotBlank(year)) { + paramMap.put("actualYear", year.trim()); + sql.append("AND TO_CHAR(run.TM, 'YYYY') = #{map.actualYear} "); + } + appendInCondition(sql, paramMap, "run.STCD", stcdList, "actualStcd"); + + sql.append(" GROUP BY run.RSTCD, TO_CHAR(run.TM, 'YYYY'), ").append(fishNameExpr).append(" ") + .append(") actualFish ") + .append("GROUP BY actualFish.RSTCD, actualFish.YR "); + return sql.toString(); + } + + private String buildFishJoinSql(String fishFieldExpr, String hbrvcdFieldExpr) { + return " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = " + fishFieldExpr + + " AND relRv.RVCD = " + hbrvcdFieldExpr + + " AND NVL(relRv.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = NVL(relRv.ZY_FISH_ID, relRv.FISH_ID) " + + " AND NVL(fishRv.IS_DELETED, 0) = 0 " + + " AND NVL(fishRv.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = " + fishFieldExpr + + " AND relZy.RVCD = 'ZY' " + + " AND NVL(relZy.IS_DELETED, 0) = 0 " + + " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = NVL(relZy.ZY_FISH_ID, relZy.FISH_ID) " + + " AND NVL(fishZy.IS_DELETED, 0) = 0 " + + " AND NVL(fishZy.ENABLE, 1) = 1 " + + " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = " + fishFieldExpr + + " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + + " AND NVL(fishDirect.ENABLE, 1) = 1 "; + } + + private String buildFishNameExpr(String fishFieldExpr) { + return "COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, " + fishFieldExpr + ")"; + } + + private void appendInCondition(StringBuilder sql, + Map paramMap, + String column, + List values, + String keyPrefix) { + if (CollUtil.isEmpty(values)) { + return; + } + List placeholders = new ArrayList<>(); + for (int i = 0; i < values.size(); i++) { + String key = keyPrefix + i; + paramMap.put(key, values.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append("AND ").append(column).append(" IN (").append(String.join(", ", placeholders)).append(") "); + } + + private void appendLikeAnyCondition(StringBuilder sql, + Map paramMap, + String column, + List values, + String keyPrefix) { + if (CollUtil.isEmpty(values)) { + return; + } + List conditions = new ArrayList<>(); + for (int i = 0; i < values.size(); i++) { + String key = keyPrefix + i; + paramMap.put(key, "%" + values.get(i) + "%"); + conditions.add(column + " LIKE #{map." + key + "}"); + } + if (!conditions.isEmpty()) { + sql.append("AND (").append(String.join(" OR ", conditions)).append(") "); + } + } + + private List resolveStcdList(DataSourceRequest dataSourceRequest, DataSourceLoadOptionsBase loadOptions) { + Set values = new LinkedHashSet<>(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + addFilterValue(values, stcd); + collectFilterValues(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), "stcd", values); + return new ArrayList<>(values); + } + + private void collectFilterValues(DataSourceRequest.FilterDescriptor filter, String field, Set values) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if (field.equalsIgnoreCase(filter.getField())) { + addFilterValue(values, filter.getValue()); + } + return; + } + if (CollUtil.isEmpty(filter.getFilters())) { + return; + } + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectFilterValues(child, field, values); + } + } + + private void addFilterValue(Set values, Object value) { + if (value == null) { + return; + } + if (value instanceof List list) { + for (Object item : list) { + addFilterValue(values, item); + } + return; + } + if (value instanceof Object[] array) { + for (Object item : array) { + addFilterValue(values, item); + } + return; + } + String text = String.valueOf(value).trim() + .replace("[", "") + .replace("]", "") + .replace("\"", ""); + if (StrUtil.isBlank(text)) { + return; + } + if (text.contains(",")) { + for (String item : text.split(",")) { + String trimmed = StrUtil.trim(item); + if (StrUtil.isNotBlank(trimmed)) { + values.add(trimmed); + } + } + return; + } + values.add(text); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index d737184a..0ed6baea 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -700,8 +700,10 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("eng.DVTP AS dvtp, ") .append("CASE WHEN NVL(dw.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, ") .append("CASE ") - .append("WHEN dw.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' ") - .append("WHEN dw.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ") + .append("WHEN dw.BLDSTT_CODE = 2 THEN '已建' ") + .append("WHEN dw.BLDSTT_CODE = 1 THEN '在建' ") +// .append("WHEN dw.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' ") +// .append("WHEN dw.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ") .append("ELSE '未建/规划' END AS bldsttCcodeName, ") .append("dw.BLDSTT_CODE AS bldsttCcode, ") .append("eng.HBRVCD AS hbrvcd ") @@ -733,8 +735,10 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("wt.STCD AS stcd, ") .append("wt.RSTCD AS rstcd, ") .append("CASE ") - .append("WHEN wt.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' ") - .append("WHEN wt.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ") + .append("WHEN wt.BLDSTT_CODE = 2 THEN '已建' ") + .append("WHEN wt.BLDSTT_CODE = 1 THEN '在建' ") +// .append("WHEN wt.BLDSTT_CODE IN ('1', '10', '11') THEN '已建' ") +// .append("WHEN wt.BLDSTT_CODE IN ('2', '7', '8') THEN '在建' ") .append("ELSE '未建/规划' END AS bldsttCcodeName, ") .append("wt.BLDSTT_CODE AS bldsttCcode, ") .append("NULL AS stCode, ") From 95e6a5271b8d7f8ddfb402fa0d809b947aa2fb84 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 17:41:49 +0800 Subject: [PATCH 03/20] =?UTF-8?q?feat:=20=E5=A2=9E=E6=AE=96=E7=AB=99?= =?UTF-8?q?=E6=A6=82=E5=86=B5=E4=BA=8C=E7=BA=A7=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 6 + .../qgc_env/fb/service/FbStationService.java | 2 + .../fb/service/impl/FbStationServiceImpl.java | 143 ++++++++++++++++++ 3 files changed, 151 insertions(+) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 5ffb0de6..35b63bab 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -26,4 +26,10 @@ public class FbStationController { public ResponseResult getQgcOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fbStationService.getQgcOverviewSecond(dataSourceRequest)); } + + @PostMapping("/overview/getOverviewSecond") + @Operation(summary = "增殖站概况二级页面") + public ResponseResult getOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getOverviewSecond(dataSourceRequest)); + } } 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 600f6664..d32a7561 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,5 +6,7 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; public interface FbStationService { + DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcOverviewSecond(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 ee43e15e..361fbdf7 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 @@ -25,6 +25,27 @@ public class FbStationServiceImpl implements FbStationService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String year = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "year"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String stnm = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stnm"); + List stcdList = resolveStcdList(dataSourceRequest, loadOptions); + + Map paramMap = new HashMap<>(); + String sql = buildOverviewSecondSql(year, baseId, stnm, stcdList, paramMap); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql, paramMap, FbStationOverviewSecondVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -47,6 +68,45 @@ public class FbStationServiceImpl implements FbStationService { return result; } + private String buildOverviewSecondSql(String year, + String baseId, + String stnm, + List stcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT fb.STCD AS stcd, ") + .append("fb.STNM AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("fb.INV AS totalInv, ") + .append("t.YEAR AS year, ") + .append("MAX(t.planFtp) AS planFtp, ") + .append("SUM(t.fcntjh) AS fcntjh, ") + .append("MAX(t.realftp) AS realftp, ") + .append("SUM(t.realfcnt) AS realfcnt, ") + .append("TO_CHAR(SUM(t.realfcnt)) AS realfcntStr ") + .append("FROM SD_FBRD_B_H fb ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD ") + .append(" AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN (") + .append(buildOverviewPlanUnionActualSql(year, stcdList, paramMap)) + .append(") t ON fb.STCD = t.rstcd ") + .append("WHERE 1 = 1 "); + + if (StrUtil.isNotBlank(stnm)) { + paramMap.put("overviewStnm", "%" + stnm.trim() + "%"); + sql.append("AND fb.STNM LIKE #{map.overviewStnm} "); + } + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("overviewBaseId", baseId.trim()); + sql.append("AND fb.BASE_ID = #{map.overviewBaseId} "); + } + appendLikeAnyCondition(sql, paramMap, "NVL(fb.RENGCD, fb.RSTCD)", stcdList, "overviewStationFilter"); + + sql.append("GROUP BY fb.STCD, fb.STNM, eng.ENNM, t.YEAR, fb.INV ") + .append("ORDER BY fb.STCD ASC"); + return sql.toString(); + } + private String buildQgcOverviewSecondSql(String year, String baseId, String hbrvcd, @@ -94,6 +154,78 @@ public class FbStationServiceImpl implements FbStationService { return buildPlanSql(year, stcdList, paramMap) + " UNION ALL " + buildActualSql(year, stcdList, paramMap); } + private String buildOverviewPlanUnionActualSql(String year, List stcdList, Map paramMap) { + return buildOverviewPlanSql(year, stcdList, paramMap) + " UNION ALL " + + buildOverviewActualSql(year, stcdList, paramMap); + } + + private String buildOverviewPlanSql(String year, List stcdList, Map paramMap) { + String fishNameExpr = buildFishViewNameExpr("det.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT planFish.RSTCD AS rstcd, ") + .append("LISTAGG(planFish.NAME, ', ') WITHIN GROUP (ORDER BY planFish.NAME) AS planFtp, ") + .append("SUM(planFish.FCNT) AS fcntjh, ") + .append("CAST(NULL AS VARCHAR2(4000)) AS realftp, ") + .append("CAST(NULL AS NUMBER(18, 2)) AS realfcnt, ") + .append("TO_CHAR(planFish.PLANSD, 'YYYY') AS year ") + .append("FROM ( ") + .append(" SELECT plan.RSTCD AS RSTCD, plan.PLANSD AS PLANSD, ") + .append(" ").append(fishNameExpr).append(" AS NAME, ") + .append(" SUM(det.FCNT) AS FCNT ") + .append(" FROM SD_ENGFRPLAN_B plan ") + .append(" LEFT JOIN SD_ENGFRPLANDET_B det ON plan.ID = det.RPJH_ID ") + .append(" INNER JOIN SD_FBRD_B_H fbPlan ON fbPlan.STCD = plan.RSTCD ") + .append(buildFishViewJoinSql("det.FTP", "fbPlan.HBRVCD")) + .append(" WHERE NVL(plan.IS_DELETED, 0) = 0 ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND det.FTP IS NOT NULL "); + + if (StrUtil.isNotBlank(year)) { + paramMap.put("overviewPlanYear", year.trim()); + sql.append("AND TO_CHAR(plan.PLANSD, 'YYYY') = #{map.overviewPlanYear} "); + } + appendInCondition(sql, paramMap, "plan.STCD", stcdList, "overviewPlanStcd"); + + sql.append(" GROUP BY plan.RSTCD, plan.PLANSD, ").append(fishNameExpr).append(" ") + .append(") planFish ") + .append("GROUP BY planFish.RSTCD, TO_CHAR(planFish.PLANSD, 'YYYY') "); + return sql.toString(); + } + + private String buildOverviewActualSql(String year, List stcdList, Map paramMap) { + String fishNameExpr = buildFishViewNameExpr("det.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT actualFish.RSTCD AS rstcd, ") + .append("CAST(NULL AS VARCHAR2(4000)) AS planFtp, ") + .append("CAST(NULL AS NUMBER(18, 2)) AS fcntjh, ") + .append("LISTAGG(actualFish.NAME, ', ') WITHIN GROUP (ORDER BY actualFish.NAME) AS realftp, ") + .append("SUM(actualFish.FCNT) AS realfcnt, ") + .append("actualFish.YR AS year ") + .append("FROM ( ") + .append(" SELECT run.RSTCD AS RSTCD, ") + .append(" TO_CHAR(run.TM, 'YYYY') AS YR, ") + .append(" ").append(fishNameExpr).append(" AS NAME, ") + .append(" SUM(det.FCNT) AS FCNT ") + .append(" FROM SD_ENGFR_R run ") + .append(" LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append(" AND NVL(det.IS_DELETED, 0) = 0 ") + .append(" AND det.FTP IS NOT NULL ") + .append(" INNER JOIN SD_FBRD_B_H fbRun ON fbRun.STCD = run.RSTCD ") + .append(buildFishViewJoinSql("det.FTP", "fbRun.HBRVCD")) + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 "); + + if (StrUtil.isNotBlank(year)) { + paramMap.put("overviewActualYear", year.trim()); + sql.append("AND TO_CHAR(run.TM, 'YYYY') = #{map.overviewActualYear} "); + } + appendInCondition(sql, paramMap, "run.STCD", stcdList, "overviewActualStcd"); + + sql.append(" GROUP BY run.RSTCD, TO_CHAR(run.TM, 'YYYY'), ").append(fishNameExpr).append(" ") + .append(") actualFish ") + .append("GROUP BY actualFish.RSTCD, actualFish.YR "); + return sql.toString(); + } + private String buildPlanSql(String year, List stcdList, Map paramMap) { String fishNameExpr = buildFishNameExpr("det.FTP"); StringBuilder sql = new StringBuilder(); @@ -185,6 +317,17 @@ public class FbStationServiceImpl implements FbStationService { return "COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, " + fishFieldExpr + ")"; } + private String buildFishViewJoinSql(String fishFieldExpr, String hbrvcdFieldExpr) { + return " LEFT JOIN V_SD_FISHDICTORY_B fishViewRv ON fishViewRv.FISH_ID = " + fishFieldExpr + + " AND fishViewRv.RVCD = " + hbrvcdFieldExpr + + " LEFT JOIN V_SD_FISHDICTORY_B fishViewZy ON fishViewZy.FISH_ID = " + fishFieldExpr + + " AND fishViewZy.RVCD = 'ZY' "; + } + + private String buildFishViewNameExpr(String fishFieldExpr) { + return "COALESCE(fishViewRv.NAME, fishViewZy.NAME, " + fishFieldExpr + ")"; + } + private void appendInCondition(StringBuilder sql, Map paramMap, String column, From 6f81e82002c0652a0eb07d51a999cd8f35c211f5 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 18:16:26 +0800 Subject: [PATCH 04/20] =?UTF-8?q?feat:=20=E5=85=A8=E6=B5=81=E5=9F=9F?= =?UTF-8?q?=E5=A2=9E=E6=AE=96=E7=AB=99=E6=A6=82=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 6 + .../qgc_env/fb/service/FbStationService.java | 2 + .../fb/service/impl/FbStationServiceImpl.java | 217 +++++++++++++++++- 3 files changed, 223 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 35b63bab..07c15ee3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -32,4 +32,10 @@ public class FbStationController { public ResponseResult getOverviewSecond(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fbStationService.getOverviewSecond(dataSourceRequest)); } + + @PostMapping("/overview/GetKendoListCust") + @Operation(summary = "全流域增殖站概况") + public ResponseResult getOverviewKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getOverviewKendoListCust(dataSourceRequest)); + } } 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 d32a7561..6385c327 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,8 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; public interface FbStationService { + DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest); DataSourceResult getQgcOverviewSecond(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 361fbdf7..86c280cc 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 @@ -1,5 +1,6 @@ package com.yfd.platform.qgc_env.fb.service.impl; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.yfd.platform.common.DataSourceLoadOptionsBase; @@ -13,11 +14,15 @@ import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Collections; @Service public class FbStationServiceImpl implements FbStationService { @@ -25,6 +30,72 @@ public class FbStationServiceImpl implements FbStationService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + List stcdList = resolveStcdList(dataSourceRequest, loadOptions); + + DataSourceResult result = new DataSourceResult<>(); + FbStationOverviewSecondVo vo = new FbStationOverviewSecondVo(); + + Date startDate = StrUtil.isBlank(startTime) ? null : DateUtil.parse(startTime); + Date endDate = StrUtil.isBlank(endTime) ? null : DateUtil.parse(endTime); + + Map stationParamMap = new HashMap<>(); + String stationSql = buildOverviewStationListSql(baseId, stcdList, stationParamMap); + List stationList = microservicDynamicSQLMapper.pageAllListWithResultType( + null, stationSql, stationParamMap, FbStationOverviewSecondVo.class + ); + + if (CollUtil.isEmpty(stationList)) { + result.setData(Collections.emptyList()); + result.setTotal(0); + result.setAggregates(new HashMap<>()); + return result; + } + + List rstcdList = stationList.stream() + .map(FbStationOverviewSecondVo::getStcd) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + vo.setCount(stationList.size()); + BigDecimal inv = BigDecimal.ZERO; + for (FbStationOverviewSecondVo station : stationList) { + if (station.getTotalInv() != null) { + inv = inv.add(station.getTotalInv()); + } + } + vo.setTotalInv(inv.divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP)); + + if (startDate != null && endDate != null) { + vo.setYear(startTime.substring(0, 4)); + } else { + String latestYear = queryLatestOverviewYear(rstcdList); + if (StrUtil.isBlank(latestYear)) { + result.setData(Collections.emptyList()); + result.setTotal(0); + result.setAggregates(new HashMap<>()); + return result; + } + vo.setYear(latestYear); + startDate = DateUtil.parse(latestYear + "-01-01"); + endDate = DateUtil.parse(latestYear + "-12-31"); + } + + fillPlanOverviewStat(vo, rstcdList, stcdList, startDate, endDate); + fillActualOverviewStat(vo, rstcdList, stcdList, startDate, endDate); + vo.setTotalFtpCount(queryAccumulateCount(rstcdList, stcdList, endDate)); + + result.setData(Collections.singletonList(vo)); + result.setTotal(1); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -46,6 +117,148 @@ public class FbStationServiceImpl implements FbStationService { return result; } + private String buildOverviewStationListSql(String baseId, + List stcdList, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT fb.STCD AS stcd, fb.STNM AS stnm, fb.INV AS totalInv ") + .append("FROM SD_FBRD_B_H fb WHERE 1 = 1 "); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("stationBaseId", baseId.trim()); + sql.append("AND fb.BASE_ID = #{map.stationBaseId} "); + } + appendLikeAnyCondition(sql, paramMap, "fb.RSTCD", stcdList, "stationStcdFilter"); + return sql.toString(); + } + + private String queryLatestOverviewYear(List rstcdList) { + if (CollUtil.isEmpty(rstcdList)) { + return null; + } + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT yr FROM (") + .append("SELECT yr FROM (") + .append("SELECT plan.RSTCD, TO_CHAR(plan.PLANSD, 'YYYY') AS yr, plan.PLANSD AS sortTm ") + .append("FROM SD_ENGFRPLAN_B plan ") + .append("LEFT JOIN SD_ENGFRPLANDET_B det ON plan.ID = det.RPJH_ID ") + .append("WHERE NVL(plan.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 ") + .append("UNION ALL ") + .append("SELECT run.RSTCD, TO_CHAR(run.TM, 'YYYY') AS yr, run.TM AS sortTm ") + .append("FROM SD_ENGFR_R run ") + .append("LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append("WHERE NVL(run.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 ") + .append(") src WHERE 1 = 1 "); + appendInCondition(sql, paramMap, "src.RSTCD", rstcdList, "latestRstcd"); + sql.append("AND yr IS NOT NULL ORDER BY sortTm DESC) WHERE ROWNUM = 1"); + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows) || rows.get(0) == null || rows.get(0).get("YR") == null) { + return null; + } + return String.valueOf(rows.get(0).get("YR")); + } + + private void fillPlanOverviewStat(FbStationOverviewSecondVo vo, + List rstcdList, + List stcdList, + Date startDate, + Date endDate) { + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT det.FTP AS ftp, SUM(det.FCNT) AS fcntjh ") + .append("FROM SD_ENGFRPLAN_B plan ") + .append("LEFT JOIN SD_ENGFRPLANDET_B det ON plan.ID = det.RPJH_ID ") + .append("WHERE det.FTP IS NOT NULL ") + .append("AND NVL(plan.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "plan.RSTCD", rstcdList, "planOverviewRstcd"); + appendInCondition(sql, paramMap, "plan.STCD", stcdList, "planOverviewStcd"); + if (startDate != null) { + paramMap.put("planOverviewStartDate", startDate); + sql.append("AND plan.PLANSD >= #{map.planOverviewStartDate} "); + } + if (endDate != null) { + paramMap.put("planOverviewEndDate", endDate); + sql.append("AND plan.PLANED <= #{map.planOverviewEndDate} "); + } + sql.append("GROUP BY det.FTP"); + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows)) { + return; + } + vo.setFtpCount(rows.size()); + BigDecimal sum = BigDecimal.ZERO; + for (Map row : rows) { + sum = sum.add(toBigDecimal(row.get("FCNTJH"))); + } + vo.setFcntjh(sum); + } + + private void fillActualOverviewStat(FbStationOverviewSecondVo vo, + List rstcdList, + List stcdList, + Date startDate, + Date endDate) { + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT det.FTP AS ftp, SUM(det.FCNT) AS fcntjc ") + .append("FROM SD_ENGFR_R run ") + .append("LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append("WHERE det.FTP IS NOT NULL ") + .append("AND NVL(run.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "run.STCD", stcdList, "actualOverviewStcd"); + appendInCondition(sql, paramMap, "run.RSTCD", rstcdList, "actualOverviewRstcd"); + if (startDate != null) { + paramMap.put("actualOverviewStartDate", startDate); + sql.append("AND run.TM >= #{map.actualOverviewStartDate} "); + } + if (endDate != null) { + paramMap.put("actualOverviewEndDate", endDate); + sql.append("AND run.TM <= #{map.actualOverviewEndDate} "); + } + sql.append("GROUP BY det.FTP"); + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows)) { + return; + } + vo.setRealftpCount(rows.size()); + BigDecimal sum = BigDecimal.ZERO; + for (Map row : rows) { + sum = sum.add(toBigDecimal(row.get("FCNTJC"))); + } + vo.setRealfcnt(sum); + } + + private Long queryAccumulateCount(List rstcdList, List stcdList, Date endDate) { + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT SUM(det.FCNT) AS fcnt ") + .append("FROM SD_ENGFR_R run ") + .append("LEFT JOIN SD_RPIMNFISH_R det ON run.ID = det.RPIMN_ID ") + .append("WHERE det.FTP IS NOT NULL ") + .append("AND NVL(run.IS_DELETED, 0) = 0 AND NVL(det.IS_DELETED, 0) = 0 "); + appendInCondition(sql, paramMap, "run.RSTCD", rstcdList, "accRstcd"); + appendInCondition(sql, paramMap, "run.STCD", stcdList, "accStcd"); + if (endDate != null) { + paramMap.put("accEndDate", endDate); + sql.append("AND run.TM <= #{map.accEndDate} "); + } + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + if (CollUtil.isEmpty(rows) || rows.get(0) == null || rows.get(0).get("FCNT") == null) { + return null; + } + return toBigDecimal(rows.get(0).get("FCNT")).longValue(); + } + + private BigDecimal toBigDecimal(Object value) { + if (value == null) { + return BigDecimal.ZERO; + } + if (value instanceof BigDecimal bigDecimal) { + return bigDecimal; + } + return new BigDecimal(String.valueOf(value)); + } + @Override public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -100,7 +313,7 @@ public class FbStationServiceImpl implements FbStationService { paramMap.put("overviewBaseId", baseId.trim()); sql.append("AND fb.BASE_ID = #{map.overviewBaseId} "); } - appendLikeAnyCondition(sql, paramMap, "NVL(fb.RENGCD, fb.RSTCD)", stcdList, "overviewStationFilter"); + appendLikeAnyCondition(sql, paramMap, "fb.RSTCD", stcdList, "overviewStationFilter"); sql.append("GROUP BY fb.STCD, fb.STNM, eng.ENNM, t.YEAR, fb.INV ") .append("ORDER BY fb.STCD ASC"); @@ -143,7 +356,7 @@ public class FbStationServiceImpl implements FbStationService { paramMap.put("hbrvcd", hbrvcd.trim()); sql.append("AND fb.HBRVCD = #{map.hbrvcd} "); } - appendLikeAnyCondition(sql, paramMap, "NVL(fb.RENGCD, fb.RSTCD)", stcdList, "stationFilter"); + appendLikeAnyCondition(sql, paramMap, "fb.RSTCD", stcdList, "stationFilter"); sql.append("GROUP BY fb.STCD, fb.STNM, eng.ENNM, t.YEAR, fb.INV ") .append("ORDER BY fb.STCD ASC"); From c5a270ecd581e91fa6c21a0f30c5043bd77b3d23 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 18:34:41 +0800 Subject: [PATCH 05/20] =?UTF-8?q?feat:=20=E5=85=A8=E8=BF=87=E7=A8=8B?= =?UTF-8?q?=E6=94=BE=E6=B5=81=E7=BB=9F=E8=AE=A1=E6=80=BB=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=9F=BA=E5=9C=B0=E6=B5=81=E5=9F=9F=E5=88=86?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 9 ++ .../fb/entity/vo/FbFtpStatisticsVo.java | 24 +++++ .../fb/entity/vo/YearRpStatisticsVo.java | 23 +++++ .../qgc_env/fb/service/FbStationService.java | 5 ++ .../fb/service/impl/FbStationServiceImpl.java | 88 +++++++++++++++++-- 5 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFtpStatisticsVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/YearRpStatisticsVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 07c15ee3..6b12aa0f 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -3,12 +3,15 @@ package com.yfd.platform.qgc_env.fb.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_env.fb.service.FbStationService; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -38,4 +41,10 @@ public class FbStationController { public ResponseResult getOverviewKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fbStationService.getOverviewKendoListCust(dataSourceRequest)); } + + @GetMapping("/rpimnr/qgc/year/GetYearRpStatistics") + @Operation(summary = "全过程放流统计总数,根据基地流域分组") + public ResponseResult getYearRpStatistics(@Parameter(description = "年份") @RequestParam("year") String year) { + return ResponseResult.successData(fbStationService.getYearRpStatistics(year)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFtpStatisticsVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFtpStatisticsVo.java new file mode 100644 index 00000000..fe5cfabc --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFtpStatisticsVo.java @@ -0,0 +1,24 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "放流鱼种统计") +public class FbFtpStatisticsVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "鱼类编码") + private String ftp; + + @Schema(description = "鱼类名称") + private String fishName; + + @Schema(description = "数量") + private Integer fcnt; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/YearRpStatisticsVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/YearRpStatisticsVo.java new file mode 100644 index 00000000..cee4f3b0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/YearRpStatisticsVo.java @@ -0,0 +1,23 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "年度全过程放流统计") +public class YearRpStatisticsVo { + + @Schema(description = "放流总数") + private Integer fpCount; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "鱼类分组统计") + private List fpFtpStatitcsVos; +} 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 6385c327..e6b79eeb 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 @@ -2,10 +2,15 @@ package com.yfd.platform.qgc_env.fb.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; +import java.util.List; + public interface FbStationService { + List getYearRpStatistics(String year); + DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getOverviewSecond(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 86c280cc..a9027e60 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 @@ -7,22 +7,18 @@ import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.fb.entity.vo.FbFtpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; +import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo; import com.yfd.platform.qgc_env.fb.service.FbStationService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Collections; +import java.util.stream.Collectors; @Service public class FbStationServiceImpl implements FbStationService { @@ -30,6 +26,36 @@ public class FbStationServiceImpl implements FbStationService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override + public List getYearRpStatistics(String year) { + Map paramMap = new HashMap<>(); + String sql = buildYearRpStatisticsSql(year, paramMap); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql, paramMap, FbFtpStatisticsVo.class + ); + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + Map> grouped = list.stream() + .filter(item -> StrUtil.isNotBlank(item.getBaseId())) + .collect(Collectors.groupingBy(FbFtpStatisticsVo::getBaseId, LinkedHashMap::new, Collectors.toList())); + List result = new ArrayList<>(); + for (Map.Entry> entry : grouped.entrySet()) { + YearRpStatisticsVo vo = new YearRpStatisticsVo(); + vo.setBaseId(entry.getKey()); + vo.setBaseName(entry.getValue().get(0).getBaseName()); + int count = entry.getValue().stream() + .map(FbFtpStatisticsVo::getFcnt) + .filter(java.util.Objects::nonNull) + .mapToInt(Integer::intValue) + .sum(); + vo.setFpCount(count); + vo.setFpFtpStatitcsVos(entry.getValue()); + result.add(vo); + } + return result; + } + @Override public DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -259,6 +285,52 @@ public class FbStationServiceImpl implements FbStationService { return new BigDecimal(String.valueOf(value)); } + private String buildYearRpStatisticsSql(String year, Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT stat.BASE_ID AS baseId, ") + .append(" stat.BASE_NAME AS baseName, ") + .append(" stat.FTP AS ftp, ") + .append(" stat.FISH_NAME AS fishName, ") + .append(" stat.FCNT AS fcnt ") + .append("FROM ( ") + .append(" SELECT src.BASE_ID, ") + .append(" src.BASE_NAME, ") + .append(" src.FTP, ") + .append(" src.FISH_NAME, ") + .append(" SUM(src.FCNT) AS FCNT ") + .append(" FROM ( ") + .append(" SELECT run.STCD, ") + .append(" run.TM, ") + .append(" fish.FTP, ") + .append(" fish.FCNT, ") + .append(" fb.BASE_ID, ") + .append(" hb.BASENAME AS BASE_NAME, ") + .append(" dict.NAME AS FISH_NAME ") + .append(" FROM SD_ENGFR_R run ") + .append(" INNER JOIN SD_RPIMNFISH_R fish ON run.ID = fish.RPIMN_ID ") + .append(" INNER JOIN SD_FBRD_B_H fb ON run.RSTCD = fb.STCD ") + .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 V_SD_FISHDICTORY_B dict ON fish.FTP = dict.FISH_ID ") + .append(" AND (fb.HBRVCD = dict.RVCD OR dict.RVCD = 'ZY') ") + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(year)) { + paramMap.put("yearRpStatisticsYear", year.trim()); + sql.append("AND TO_CHAR(run.TM, 'YYYY') = #{map.yearRpStatisticsYear} "); + } + sql.append(" ) src ") + .append(" GROUP BY src.BASE_ID, src.BASE_NAME, src.FTP, src.FISH_NAME ") + .append(") stat ") + .append("LEFT JOIN SD_HYDROBASE hbSort ON stat.BASE_ID = hbSort.BASEID ") + .append(" AND NVL(hbSort.IS_DELETED, 0) = 0 ") + .append(" AND NVL(hbSort.ENABLED, 1) = 1 ") + .append("WHERE stat.FISH_NAME IS NOT NULL ") + .append("ORDER BY hbSort.ORDER_INDEX"); + return sql.toString(); + } + @Override public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); From afa40d0372b08acad36144a142c3a5b14f7ba5f1 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 18:58:36 +0800 Subject: [PATCH 06/20] =?UTF-8?q?feat:=20=E5=A2=9E=E6=AE=96=E7=AB=99?= =?UTF-8?q?=E6=94=BE=E6=B5=81=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 6 + .../fb/entity/vo/FbStationStaticsDataVo.java | 35 +++++ .../fb/entity/vo/FbStationStaticsRawVo.java | 36 +++++ .../qgc_env/fb/service/FbStationService.java | 3 + .../fb/service/impl/FbStationServiceImpl.java | 136 ++++++++++++++++++ 5 files changed, 216 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsDataVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsRawVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 6b12aa0f..b623c33d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -42,6 +42,12 @@ public class FbStationController { return ResponseResult.successData(fbStationService.getOverviewKendoListCust(dataSourceRequest)); } + @PostMapping("/qgc/getFbStaticsData") + @Operation(summary = "增殖站放流数据统计") + public ResponseResult getQgcFbStaticsData(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getQgcFbStaticsData(dataSourceRequest)); + } + @GetMapping("/rpimnr/qgc/year/GetYearRpStatistics") @Operation(summary = "全过程放流统计总数,根据基地流域分组") public ResponseResult getYearRpStatistics(@Parameter(description = "年份") @RequestParam("year") String year) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsDataVo.java new file mode 100644 index 00000000..d95d7f63 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsDataVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "增殖站放流统计结果") +public class FbStationStaticsDataVo { + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "鱼类种数") + private Integer ftp; + + @Schema(description = "放流数量") + private Long fcnt; + + @Schema(description = "增殖站数量") + private Integer stcdCnt; + + @Schema(description = "增殖站编码列表") + private List stcdList; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsRawVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsRawVo.java new file mode 100644 index 00000000..4526cfa4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStationStaticsRawVo.java @@ -0,0 +1,36 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "增殖站放流统计明细") +public class FbStationStaticsRawVo { + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "增殖站编码") + private String stcd; + + @Schema(description = "增殖站名称") + private String stnm; + + @Schema(description = "鱼类编码") + private String ftp; + + @Schema(description = "鱼类名称") + private String ftpName; + + @Schema(description = "放流数量") + private Long fcnt; +} 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 e6b79eeb..9a594d62 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 @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.fb.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; @@ -13,6 +14,8 @@ public interface FbStationService { DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcFbStaticsData(DataSourceRequest dataSourceRequest); + DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest); DataSourceResult getQgcOverviewSecond(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 a9027e60..64da7827 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 @@ -9,6 +9,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_env.fb.entity.vo.FbFtpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsRawVo; import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo; import com.yfd.platform.qgc_env.fb.service.FbStationService; import com.yfd.platform.utils.QgcQueryWrapperUtil; @@ -56,6 +58,79 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getQgcFbStaticsData(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String baseId = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + String hbrvcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "hbrvcd"); + + Map paramMap = new HashMap<>(); + String sql = buildQgcFbStaticsDataSql( + baseId, + hbrvcd, + parseDateTime(startTime), + parseDateTime(endTime), + paramMap + ); + List rows = microservicDynamicSQLMapper.pageAllListWithResultType( + null, sql, paramMap, FbStationStaticsRawVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + if (CollUtil.isEmpty(rows)) { + result.setData(Collections.emptyList()); + result.setTotal(0); + return result; + } + + Map> grouped = rows.stream() + .filter(item -> StrUtil.isNotBlank(item.getHbrvcd())) + .collect(Collectors.groupingBy( + FbStationStaticsRawVo::getHbrvcd, + LinkedHashMap::new, + Collectors.toList() + )); + + List data = new ArrayList<>(); + for (Map.Entry> entry : grouped.entrySet()) { + List value = entry.getValue(); + if (CollUtil.isEmpty(value)) { + continue; + } + FbStationStaticsRawVo first = value.get(0); + Set stcdSet = value.stream() + .map(FbStationStaticsRawVo::getStcd) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toCollection(LinkedHashSet::new)); + + FbStationStaticsDataVo vo = new FbStationStaticsDataVo(); + vo.setHbrvcd(entry.getKey()); + vo.setHbrvcdName(first.getHbrvcdName()); + vo.setBaseId(first.getBaseId()); + vo.setBaseName(first.getBaseName()); + vo.setFtp((int) value.stream() + .map(FbStationStaticsRawVo::getFtp) + .filter(StrUtil::isNotBlank) + .distinct() + .count()); + vo.setFcnt(value.stream() + .map(FbStationStaticsRawVo::getFcnt) + .filter(Objects::nonNull) + .mapToLong(Long::longValue) + .sum()); + vo.setStcdList(new ArrayList<>(stcdSet)); + vo.setStcdCnt(stcdSet.size()); + data.add(vo); + } + + result.setData(data); + result.setTotal(data.size()); + return result; + } + @Override public DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -285,6 +360,13 @@ public class FbStationServiceImpl implements FbStationService { return new BigDecimal(String.valueOf(value)); } + private Date parseDateTime(String value) { + if (StrUtil.isBlank(value)) { + return null; + } + return DateUtil.parse(value.trim(), "yyyy-MM-dd HH:mm:ss"); + } + private String buildYearRpStatisticsSql(String year, Map paramMap) { StringBuilder sql = new StringBuilder(); sql.append("SELECT stat.BASE_ID AS baseId, ") @@ -331,6 +413,60 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + private String buildQgcFbStaticsDataSql(String baseId, + String hbrvcd, + Date startDate, + Date endDate, + Map paramMap) { + String fishNameExpr = buildFishNameExpr("fish.FTP"); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT fb.HBRVCD AS hbrvcd, ") + .append("NVL(hbrv.HBRVNM, fb.HBRVCD) AS hbrvcdName, ") + .append("fb.BASE_ID AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("fb.STCD AS stcd, ") + .append("fb.STNM AS stnm, ") + .append("fish.FTP AS ftp, ") + .append(fishNameExpr).append(" AS ftpName, ") + .append("fish.FCNT AS fcnt ") + .append("FROM SD_ENGFR_R run ") + .append("INNER JOIN SD_RPIMNFISH_R fish ON run.ID = fish.RPIMN_ID ") + .append(" AND NVL(fish.IS_DELETED, 0) = 0 ") + .append(" AND fish.FTP IS NOT NULL ") + .append("INNER JOIN SD_FBRD_B_H fb ON fb.STCD = run.RSTCD ") + .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 SD_HBRV_DIC hbrv ON hbrv.HBRVCD = fb.HBRVCD ") + .append(" AND hbrv.BASEID = fb.BASE_ID ") + .append(" AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append(" AND NVL(hbrv.ENABLED, 1) = 1 ") + .append(buildFishJoinSql("fish.FTP", "fb.HBRVCD")) + .append("WHERE NVL(run.IS_DELETED, 0) = 0 "); + if (StrUtil.isNotBlank(baseId)) { + paramMap.put("fbStaticsBaseId", baseId.trim()); + sql.append("AND fb.BASE_ID = #{map.fbStaticsBaseId} "); + } + if (StrUtil.isNotBlank(hbrvcd)) { + paramMap.put("fbStaticsHbrvcd", hbrvcd.trim()); + sql.append("AND fb.HBRVCD = #{map.fbStaticsHbrvcd} "); + } + if (startDate != null) { + paramMap.put("fbStaticsStartDate", startDate); + sql.append("AND run.TM >= #{map.fbStaticsStartDate} "); + } + if (endDate != null) { + paramMap.put("fbStaticsEndDate", endDate); + sql.append("AND run.TM <= #{map.fbStaticsEndDate} "); + } + sql.append("ORDER BY NVL(hbrv.ORDER_INDEX, 9999), ") + .append("NVL(hb.ORDER_INDEX, 9999), ") + .append("NVL(fb.ORDER_INDEX, 9999), ") + .append("fb.STCD, ") + .append(fishNameExpr); + return sql.toString(); + } + @Override public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); From 21202f41602057390176e111155183968d486ed5 Mon Sep 17 00:00:00 2001 From: tangwei Date: Mon, 15 Jun 2026 19:17:36 +0800 Subject: [PATCH 07/20] =?UTF-8?q?feat:=20=E5=A2=9E=E6=AE=96=E7=AB=99?= =?UTF-8?q?=E5=A2=9E=E6=AE=96=E6=83=85=E5=86=B5(app)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbMsfbrdmController.java | 29 ++ .../qgc_env/fb/entity/vo/FbFlDataVo.java | 39 ++ .../qgc_env/fb/service/FbStationService.java | 3 + .../fb/service/impl/FbStationServiceImpl.java | 365 ++++++++++++++++++ 4 files changed, 436 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbMsfbrdmController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFlDataVo.java 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 new file mode 100644 index 00000000..0606b62e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbMsfbrdmController.java @@ -0,0 +1,29 @@ +package com.yfd.platform.qgc_env.fb.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.fb.service.FbStationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/fb/msfbrdm") +@Tag(name = "鱼类增殖站增殖情况") +@Validated +public class FbMsfbrdmController { + + @Resource + private FbStationService fbStationService; + + @PostMapping("/fbFlData/GetKendoListCust") + @Operation(summary = "增殖站增殖情况(app)") + public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getFbFlDataKendoListCust(dataSourceRequest)); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFlDataVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFlDataVo.java new file mode 100644 index 00000000..2dfd08ff --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbFlDataVo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "增殖站增殖情况") +public class FbFlDataVo { + + @Schema(description = "增殖站编码") + private String stcd; + + @Schema(description = "增殖站名称") + private String stnm; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "年份") + private String yr; + + @Schema(description = "鱼类名称") + private String ftpName; + + @Schema(description = "目标放鱼数量") + private Long targetFcnt; + + @Schema(description = "实际放鱼数量") + private Long realFcnt; +} 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 9a594d62..338b8036 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 @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.fb.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; @@ -14,6 +15,8 @@ public interface FbStationService { DataSourceResult getOverviewKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getQgcFbStaticsData(DataSourceRequest dataSourceRequest); DataSourceResult getOverviewSecond(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 64da7827..6f585661 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 @@ -3,11 +3,15 @@ package com.yfd.platform.qgc_env.fb.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; 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.FbStationOverviewSecondVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsRawVo; @@ -58,6 +62,16 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + if (groups != null && groups.length > 0) { + return queryFbFlDataGroupList(dataSourceRequest, groups); + } + return queryFbFlDataDetailList(dataSourceRequest, loadOptions); + } + @Override public DataSourceResult getQgcFbStaticsData(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -467,6 +481,357 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + private DataSourceResult queryFbFlDataDetailList(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildFbFlDataDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildFbFlDataCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildFbFlDataFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildFbFlDataOrderBySql(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, FbFlDataVo.class); + 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 queryFbFlDataGroupList(DataSourceRequest dataSourceRequest, + GroupingInfo[] groupInfos) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT * FROM (") + .append(buildFbFlDataCoreSql()) + .append(") t WHERE 1 = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildFbFlDataFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + String groupSql = buildFbFlDataGroupSql(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 { + result.setData((List) (List) new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal(0L); + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildFbFlDataCoreSql() { + String planFishNameExpr = buildFishNameExpr("planDet.FTP"); + String actualFishNameExpr = buildFishNameExpr("actualDet.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("stat.YR AS yr, ") + .append("stat.FTPNAME AS ftpName, ") + .append("stat.TARGETFCNT AS targetFcnt, ") + .append("stat.REALFCNT AS realFcnt ") + .append("FROM SD_FBRD_B_H fb ") + .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.YR, actualAgg.YR) AS YR, ") + .append(" COALESCE(planAgg.FTPNAME, actualAgg.FTPNAME) AS FTPNAME, ") + .append(" planAgg.TARGETFCNT AS TARGETFCNT, ") + .append(" actualAgg.REALFCNT AS REALFCNT ") + .append(" FROM (") + .append(" SELECT plan.RSTCD AS STCD, ") + .append(" TO_CHAR(plan.PLANSD, 'YYYY') AS YR, ") + .append(" ").append(planFishNameExpr).append(" AS FTPNAME, ") + .append(" SUM(planDet.FCNT) AS TARGETFCNT ") + .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(" INNER JOIN SD_FBRD_B_H fbPlan ON fbPlan.STCD = plan.RSTCD ") + .append(buildFishJoinSql("planDet.FTP", "fbPlan.HBRVCD")) + .append(" WHERE NVL(plan.IS_DELETED, 0) = 0 ") + .append(" GROUP BY plan.RSTCD, TO_CHAR(plan.PLANSD, 'YYYY'), ").append(planFishNameExpr) + .append(" ) planAgg ") + .append(" FULL OUTER JOIN (") + .append(" SELECT run.RSTCD AS STCD, ") + .append(" TO_CHAR(run.TM, 'YYYY') AS YR, ") + .append(" ").append(actualFishNameExpr).append(" AS FTPNAME, ") + .append(" SUM(actualDet.FCNT) AS REALFCNT ") + .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(" INNER JOIN SD_FBRD_B_H fbRun ON fbRun.STCD = run.RSTCD ") + .append(buildFishJoinSql("actualDet.FTP", "fbRun.HBRVCD")) + .append(" WHERE NVL(run.IS_DELETED, 0) = 0 ") + .append(" GROUP BY run.RSTCD, TO_CHAR(run.TM, 'YYYY'), ").append(actualFishNameExpr) + .append(" ) actualAgg ") + .append(" ON planAgg.STCD = actualAgg.STCD ") + .append(" AND NVL(planAgg.YR, '~') = NVL(actualAgg.YR, '~') ") + .append(" AND NVL(planAgg.FTPNAME, '~') = NVL(actualAgg.FTPNAME, '~') ") + .append(") stat ON fb.STCD = stat.STCD"); + return sql.toString(); + } + + private String buildFbFlDataDetailSelectSql(List select) { + List fields = CollUtil.isEmpty(select) + ? List.of("stcd", "stnm", "rstcd", "ennm", "baseId", "baseName", "yr", "ftpName", "targetFcnt", "realFcnt") + : select; + List selectParts = new ArrayList<>(); + for (String field : fields) { + String column = mapFbFlDataColumn(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 buildFbFlDataFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFbFlDataLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFbFlDataFilterCondition(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 buildFbFlDataLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + String column = mapFbFlDataColumn(field); + 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 = normalizeFbFlDataValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "fbFlDataP" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String key = "fbFlDataP" + indexHolder[0]++; + return switch (operator) { + case "eq" -> { + paramMap.put(key, value); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, value); + yield column + " <> #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "startswith" -> { + paramMap.put(key, value + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "endswith" -> { + paramMap.put(key, "%" + value); + yield column + " LIKE #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, value); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, value); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, value); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, value); + yield column + " <= #{map." + key + "}"; + } + default -> ""; + }; + } + + private String buildFbFlDataOrderBySql(List sortDescriptors) { + if (CollUtil.isEmpty(sortDescriptors)) { + return " ORDER BY t.baseId ASC, t.stcd ASC, t.yr ASC, t.ftpName ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor descriptor : sortDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapFbFlDataColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY t.baseId ASC, t.stcd ASC, t.yr ASC, t.ftpName ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private String buildFbFlDataGroupSql(String baseSql, List groups) { + if (CollUtil.isEmpty(groups)) { + return baseSql; + } + List validGroups = groups.stream() + .filter(Objects::nonNull) + .filter(group -> StrUtil.isNotBlank(group.getField())) + .filter(group -> StrUtil.isNotBlank(mapFbFlDataColumn(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 mapFbFlDataColumn(String field) { + return switch (field) { + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "baseName" -> "t.baseName"; + case "yr" -> "t.yr"; + case "ftpName" -> "t.ftpName"; + case "targetFcnt" -> "t.targetFcnt"; + case "realFcnt" -> "t.realFcnt"; + default -> ""; + }; + } + + private List normalizeFbFlDataValues(Object value) { + List values = new ArrayList<>(); + if (value == null) { + return values; + } + if (value instanceof Collection collection) { + values.addAll(collection); + return values; + } + if (value instanceof Object[] array) { + values.addAll(Arrays.asList(array)); + return values; + } + String text = String.valueOf(value).trim(); + if (text.startsWith("[") && text.endsWith("]")) { + text = text.substring(1, text.length() - 1); + } + if (text.contains(",")) { + for (String item : text.split(",")) { + String trimmed = StrUtil.trim(item); + if (StrUtil.isNotBlank(trimmed)) { + values.add(trimmed); + } + } + return values; + } + values.add(value); + return values; + } + @Override public DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); From 0ca4651bf197c26189b609f413ba9c48fec9d800 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 16 Jun 2026 10:47:15 +0800 Subject: [PATCH 08/20] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yfd/platform/config/SecurityConfig.java | 3 ++- .../qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index 79a4e331..7c7358e1 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -64,7 +64,8 @@ public class SecurityConfig { // .requestMatchers("/eng/**").permitAll() // .requestMatchers("/eq/**").permitAll() // .requestMatchers("/env/**").permitAll() -// .requestMatchers("/wt/**").permitAll() + .requestMatchers("/wt/**").permitAll() + .requestMatchers("/fb/**").permitAll() // .requestMatchers("/zq/**").permitAll() // .requestMatchers("/wq/**").permitAll() // .requestMatchers("/vd/**").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 0ed6baea..4770b522 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -1933,7 +1933,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { if ("baseStepSort".equals(field)) { orderColumns.add("NVL(baseStepSort, 999999) " + dir + " NULLS LAST"); } else if ("rvcdStepSort".equals(field)) { - orderColumns.add("NVL(rvcdStepSort, 999999) " + dir + " NULLS LAST"); +// orderColumns.add("NVL(rvcdStepSort, 999999) " + dir + " NULLS LAST"); } else if ("rstcdStepSort".equals(field)) { orderColumns.add("NVL(rstcdStepSort, 999999) " + dir + " NULLS LAST"); } else if ("siteStepSort".equals(field)) { From 1c7ad58b5bcbbd633be54692c08d0f6c7a7f52b7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 16 Jun 2026 10:59:29 +0800 Subject: [PATCH 09/20] =?UTF-8?q?feat:=20=E5=A2=9E=E6=AE=96=E7=AB=99?= =?UTF-8?q?=E5=8D=95=E7=AB=99=E5=9F=BA=E7=A1=80=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fb/controller/FbStationController.java | 6 +++ .../qgc_env/fb/entity/vo/FbStBaseInfoVo.java | 51 ++++++++++++++++++ .../fb/entity/vo/FbStInfoResultVo.java | 26 ++++++++++ .../qgc_env/fb/service/FbStationService.java | 3 ++ .../fb/service/impl/FbStationServiceImpl.java | 52 +++++++++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStBaseInfoVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStInfoResultVo.java diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index b623c33d..169d8762 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -48,6 +48,12 @@ public class FbStationController { return ResponseResult.successData(fbStationService.getQgcFbStaticsData(dataSourceRequest)); } + @GetMapping("/msstbprpt/getStInfoByStcd") + @Operation(summary = "增殖站单站基础信息") + public ResponseResult getStInfoByStcd(@Parameter(description = "站点编码") @RequestParam("stcd") String stcd) { + return ResponseResult.successData(fbStationService.getStInfoByStcd(stcd)); + } + @GetMapping("/rpimnr/qgc/year/GetYearRpStatistics") @Operation(summary = "全过程放流统计总数,根据基地流域分组") public ResponseResult getYearRpStatistics(@Parameter(description = "年份") @RequestParam("year") String year) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStBaseInfoVo.java new file mode 100644 index 00000000..a0041826 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStBaseInfoVo.java @@ -0,0 +1,51 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "鱼类增殖站单站基础信息") +public class FbStBaseInfoVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类名称") + private String sttpName; + + @Schema(description = "站类全路径") + private String sttpFullPath; + + @Schema(description = "站类层级") + private Integer sttpTreeLevel; + + @Schema(description = "关联站点编码") + private String stCode; + + @Schema(description = "关联站点名称") + private String stName; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地流域编码") + private String hbrvcd; + + @Schema(description = "所属基地流域名称") + private String hbrvcdName; + + @Schema(description = "所属流域编码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStInfoResultVo.java new file mode 100644 index 00000000..a58e8981 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbStInfoResultVo.java @@ -0,0 +1,26 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +@Data +@Schema(description = "鱼类增殖站详情返回") +public class FbStInfoResultVo { + + @Schema(description = "主信息兼容对象") + private Map msStbprpT = new LinkedHashMap<>(); + + @Schema(description = "测值列表") + private List stcdValVoList = new ArrayList<>(); + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + + @Schema(description = "站点基础信息") + private FbStBaseInfoVo stBaseInfo; +} 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 338b8036..b234336c 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 @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.fb.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; @@ -17,6 +18,8 @@ public interface FbStationService { DataSourceResult getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest); + FbStInfoResultVo getStInfoByStcd(String stcd); + DataSourceResult getQgcFbStaticsData(DataSourceRequest dataSourceRequest); DataSourceResult getOverviewSecond(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 6f585661..f14439a6 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 @@ -12,6 +12,8 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; 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.FbStBaseInfoVo; +import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsRawVo; @@ -72,6 +74,26 @@ public class FbStationServiceImpl implements FbStationService { return queryFbFlDataDetailList(dataSourceRequest, loadOptions); } + @Override + public FbStInfoResultVo getStInfoByStcd(String stcd) { + FbStInfoResultVo result = new FbStInfoResultVo(); + if (StrUtil.isBlank(stcd)) { + return result; + } + Map paramMap = new HashMap<>(); + paramMap.put("stcd", stcd.trim()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + null, + buildStInfoByStcdSql(), + paramMap, + FbStBaseInfoVo.class + ); + if (CollUtil.isNotEmpty(list)) { + result.setStBaseInfo(list.get(0)); + } + return result; + } + @Override public DataSourceResult getQgcFbStaticsData(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -381,6 +403,36 @@ public class FbStationServiceImpl implements FbStationService { return DateUtil.parse(value.trim(), "yyyy-MM-dd HH:mm:ss"); } + private String buildStInfoByStcdSql() { + return "SELECT " + + "fb.STCD AS stcd, " + + "fb.STNM AS stnm, " + + "fb.STTP AS sttpCode, " + + "sttp.STTP_NAME AS sttpName, " + + "sttp.FULL_PATH AS sttpFullPath, " + + "sttp.TREE_LEVEL AS sttpTreeLevel, " + + "CAST(NULL AS VARCHAR2(100)) AS stCode, " + + "CAST(NULL AS VARCHAR2(200)) AS stName, " + + "fb.BASE_ID AS baseId, " + + "hb.BASENAME AS baseName, " + + "fb.HBRVCD AS hbrvcd, " + + "hbrv.HBRVNM AS hbrvcdName, " + + "fb.HBRVCD AS rvcd, " + + "hbrv.HBRVNM AS rvcdName " + + "FROM SD_FBRD_B_H fb " + + "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = fb.BASE_ID " + + " AND NVL(hb.IS_DELETED, 0) = 0 " + + " AND NVL(hb.ENABLED, 1) = 1 " + + "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = fb.HBRVCD " + + " AND hbrv.BASEID = fb.BASE_ID " + + " AND NVL(hbrv.IS_DELETED, 0) = 0 " + + " AND NVL(hbrv.ENABLED, 1) = 1 " + + "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = fb.STTP " + + " AND NVL(sttp.IS_DELETED, 0) = 0 " + + " AND NVL(sttp.ENABLE, 1) = 1 " + + "WHERE fb.STCD = #{map.stcd}"; + } + private String buildYearRpStatisticsSql(String year, Map paramMap) { StringBuilder sql = new StringBuilder(); sql.append("SELECT stat.BASE_ID AS baseId, ") From 16f60e6b189d36631de26e70ce57c1e6b6f6221d Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 16 Jun 2026 11:30:40 +0800 Subject: [PATCH 10/20] =?UTF-8?q?feat:=20=E9=B1=BC=E7=B1=BB=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 2 +- .../fp/controller/FishPassageController.java | 6 + .../qgc_env/fp/entity/vo/FpFishDicVo.java | 73 +++ .../qgc_env/fp/service/FpBuildService.java | 3 + .../fp/service/impl/FpBuildServiceImpl.java | 459 +++++++++++++++++- 5 files changed, 541 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishDicVo.java diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index f0faacb1..3eb42938 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -130,7 +130,7 @@ public class SwaggerConfig { @Bean public GroupedOpenApi groupEnvFbApi() { return GroupedOpenApi.builder() - .group("3.7 全过程-生态环保数据服务-鱼类调查") + .group("3.7 全过程-生态环保数据服务-增殖放流") .packagesToScan("com.yfd.platform.qgc_env.fb.controller") .build(); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java index af4d66ff..7d2fa893 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java @@ -70,6 +70,12 @@ public class FishPassageController { return ResponseResult.successData(fpBuildService.processKendoList(dataSourceRequest)); } + @PostMapping("/fishDic/GetKendoListCust") + @Operation(summary = "鱼类字典列表") + public ResponseResult getFishDicList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpBuildService.getFishDicList(dataSourceRequest)); + } + @PostMapping("/vmsstbprpt/GetKendoList") @Operation(summary = "根据条件查询过鱼设施基础列表") public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishDicVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishDicVo.java new file mode 100644 index 00000000..31fa5e9c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpFishDicVo.java @@ -0,0 +1,73 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "过鱼设施模块鱼类字典信息") +public class FpFishDicVo { + + private String id; + private String code; + private String name; + private String nameEn; + private String alias; + private String logo; + private String introduce; + private String inffile; + private String orders; + private String family; + private String genus; + private String species; + private Integer type; + private String typeName; + private String fsz; + private Integer rare; + private String rareName; + private Integer specOrigin; + private String specOriginName; + private Integer ptype; + private String ptypeName; + private String rvcd; + private String rvcdName; + private String habitMigrat; + private String feedingHabit; + private String spawnCharact; + private String food; + private String timeFeed; + private String orignDate; + private String pretemp; + private String flowRate; + private String depth; + private String botmMater; + private String wqtq; + private String wqtqName; + private Integer habitat; + private String habitatName; + private Integer situation; + private String situationName; + private Integer resourceType; + private String resourceTypeName; + private String shapedesc; + private String protectlvl; + private String habitation; + private String fid; + private String description; + private Integer enable; + private String enableName; + private Integer internal; + private String internalName; + private Integer orderIndex; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private String spawnMonth; + private String vlsr; + private Date vlsrTm; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java index b7ff92f2..97d2e4f7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java @@ -3,6 +3,7 @@ package com.yfd.platform.qgc_env.fp.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.fp.entity.vo.FpConstructionSituationVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpFishDicVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpVmsstbprptVo; public interface FpBuildService { @@ -11,6 +12,8 @@ public interface FpBuildService { DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest); + DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest); FpVmsstbprptVo getStInfoByStcd(String stcd); 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 e3eabcb7..4ccffabc 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 @@ -1,21 +1,28 @@ package com.yfd.platform.qgc_env.fp.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.qgc_env.fp.entity.vo.FpConstructionSituationVo; +import com.yfd.platform.qgc_env.fp.entity.vo.FpFishDicVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpVmsstbprptVo; import com.yfd.platform.qgc_env.fp.service.FpBuildService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; -import org.springframework.util.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -61,6 +68,60 @@ public class FpBuildServiceImpl implements FpBuildService { return queryVmsstbprptList(dataSourceRequest, null); } + @Override + public DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + String filterSql = buildFishDicFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (CollUtil.isNotEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) { + StringBuilder groupedBaseSql = new StringBuilder("SELECT * FROM (") + .append(buildFishDicBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + groupedBaseSql.append(" AND ").append(filterSql).append(" "); + } + GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup(); + String groupedSql = buildFishDicGroupSql(groupedBaseSql.toString(), groupInfos); + List> rows = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap); + + DataSourceResult result = new DataSourceResult(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos))); + } else { + result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos))); + } + result.setTotal((long) rows.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + StringBuilder sql = new StringBuilder("SELECT ") + .append(buildFishDicDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildFishDicBaseSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + sql.append(buildFishDicOrderBySql(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, FpFishDicVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest) { return queryVmsstbprptList(dataSourceRequest, "FPQ"); @@ -113,6 +174,77 @@ public class FpBuildServiceImpl implements FpBuildService { return list.getFirst(); } + private String buildFishDicBaseSql() { + return "SELECT " + + "src.ID AS id, " + + "src.CODE AS code, " + + "src.NAME AS name, " + + "src.NAME_EN AS nameEn, " + + "src.ALIAS AS alias, " + + "src.LOGO AS logo, " + + "src.INTRODUCE AS introduce, " + + "src.INFFILE AS inffile, " + + "src.ORDERS AS orders, " + + "src.FAMILY AS family, " + + "src.GENUS AS genus, " + + "src.SPECIES AS species, " + + "src.TYPE AS type, " + + "CASE WHEN src.TYPE = 1 THEN '淡水' WHEN src.TYPE = 2 THEN '海水' ELSE NULL END AS typeName, " + + "src.FSZ AS fsz, " + + "src.RARE AS rare, " + + "CASE WHEN src.RARE = 1 THEN '是' WHEN src.RARE = 0 THEN '否' ELSE NULL END AS rareName, " + + "src.SPEC_ORIGIN AS specOrigin, " + + "CASE WHEN src.SPEC_ORIGIN = 1 THEN '本土物种' WHEN src.SPEC_ORIGIN = 2 THEN '外来物种' ELSE NULL END AS specOriginName, " + + "src.PTYPE AS ptype, " + + "CASE src.PTYPE " + + "WHEN 1 THEN '濒危' WHEN 2 THEN '极危' WHEN 3 THEN '近危' WHEN 4 THEN '易危' " + + "WHEN 5 THEN '重点保护' WHEN 6 THEN '无危' WHEN 7 THEN '国家二级' WHEN 8 THEN '市二级保护' ELSE NULL END AS ptypeName, " + + "src.RVCD AS rvcd, " + + "rv.RVNM AS rvcdName, " + + "src.HABIT_MIGRAT AS habitMigrat, " + + "src.FEEDING_HABIT AS feedingHabit, " + + "src.SPAWN_CHARACT AS spawnCharact, " + + "src.FOOD AS food, " + + "src.TIME_FEED AS timeFeed, " + + "src.ORIGN_DATE AS orignDate, " + + "src.PRETEMP AS pretemp, " + + "src.FLOW_RATE AS flowRate, " + + "src.DEPTH AS depth, " + + "src.BOTM_MATER AS botmMater, " + + "src.WQTQ AS wqtq, " + + "CASE src.WQTQ " + + "WHEN '1' THEN 'Ⅰ类' WHEN '2' THEN 'Ⅱ类' WHEN '3' THEN 'Ⅲ类' WHEN '4' THEN 'Ⅳ类' WHEN '5' THEN 'Ⅴ类' WHEN '6' THEN '劣V类' ELSE NULL END AS wqtqName, " + + "src.HABITAT AS habitat, " + + "CASE src.HABITAT WHEN 1 THEN '流水生境' WHEN 2 THEN '静缓流生境' WHEN 3 THEN '洞穴生境' ELSE NULL END AS habitatName, " + + "src.SITUATION AS situation, " + + "CASE src.SITUATION WHEN 1 THEN '优势种' WHEN 2 THEN '常见种' WHEN 3 THEN '少见种' WHEN 4 THEN '记录种' ELSE NULL END AS situationName, " + + "src.RESOURCE_TYPE AS resourceType, " + + "CASE src.RESOURCE_TYPE WHEN 1 THEN '保护鱼类' WHEN 2 THEN '特有鱼类' WHEN 3 THEN '重要经济鱼类' WHEN 4 THEN '濒危状况' ELSE NULL END AS resourceTypeName, " + + "src.SHAPEDESC AS shapedesc, " + + "src.PROTECTLVL AS protectlvl, " + + "src.HABITATION AS habitation, " + + "src.FID AS fid, " + + "src.DESCRIPTION AS description, " + + "src.ENABLE AS enable, " + + "CASE WHEN src.ENABLE = 1 THEN '启用' WHEN src.ENABLE = 0 THEN '禁用' ELSE NULL END AS enableName, " + + "src.INTERNAL AS internal, " + + "CASE WHEN src.INTERNAL = 1 THEN '是' WHEN src.INTERNAL = 0 THEN '否' ELSE NULL END AS internalName, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.RECORD_USER AS recordUser, " + + "src.RECORD_TIME AS recordTime, " + + "src.MODIFY_USER AS modifyUser, " + + "src.MODIFY_TIME AS modifyTime, " + + "src.IS_DELETED AS isDeleted, " + + "src.DELETE_USER AS deleteUser, " + + "src.DELETE_TIME AS deleteTime, " + + "src.SPAWN_MONTH AS spawnMonth, " + + "src.VLSR AS vlsr, " + + "src.VLSR_TM AS vlsrTm " + + "FROM SD_FISHDICTORY_B src " + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = src.RVCD " + + "WHERE NVL(src.IS_DELETED, 0) = 0 "; + } + private String buildVmsstbprptBaseSql() { StringBuilder sql = new StringBuilder(); sql.append("SELECT ") @@ -319,6 +451,87 @@ public class FpBuildServiceImpl implements FpBuildService { return selectMap; } + private String buildFishDicDetailSelectSql(List selectFields) { + LinkedHashMap columnMap = buildFishDicSelectColumnMap(); + if (CollUtil.isEmpty(selectFields)) { + return String.join(", ", columnMap.values()); + } + List selectColumns = new ArrayList<>(); + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + selectColumns.add(column); + } + } + return selectColumns.isEmpty() ? String.join(", ", columnMap.values()) : String.join(", ", selectColumns); + } + + private LinkedHashMap buildFishDicSelectColumnMap() { + LinkedHashMap columnMap = new LinkedHashMap<>(); + columnMap.put("id", "t.id AS id"); + columnMap.put("code", "t.code AS code"); + columnMap.put("name", "t.name AS name"); + columnMap.put("nameEn", "t.nameEn AS nameEn"); + columnMap.put("alias", "t.alias AS alias"); + columnMap.put("logo", "t.logo AS logo"); + columnMap.put("introduce", "t.introduce AS introduce"); + columnMap.put("inffile", "t.inffile AS inffile"); + columnMap.put("orders", "t.orders AS orders"); + columnMap.put("family", "t.family AS family"); + columnMap.put("genus", "t.genus AS genus"); + columnMap.put("species", "t.species AS species"); + columnMap.put("type", "t.type AS type"); + columnMap.put("typeName", "t.typeName AS typeName"); + columnMap.put("fsz", "t.fsz AS fsz"); + columnMap.put("rare", "t.rare AS rare"); + columnMap.put("rareName", "t.rareName AS rareName"); + columnMap.put("specOrigin", "t.specOrigin AS specOrigin"); + columnMap.put("specOriginName", "t.specOriginName AS specOriginName"); + columnMap.put("ptype", "t.ptype AS ptype"); + columnMap.put("ptypeName", "t.ptypeName AS ptypeName"); + columnMap.put("rvcd", "t.rvcd AS rvcd"); + columnMap.put("rvcdName", "t.rvcdName AS rvcdName"); + columnMap.put("habitMigrat", "t.habitMigrat AS habitMigrat"); + columnMap.put("feedingHabit", "t.feedingHabit AS feedingHabit"); + columnMap.put("spawnCharact", "t.spawnCharact AS spawnCharact"); + columnMap.put("food", "t.food AS food"); + columnMap.put("timeFeed", "t.timeFeed AS timeFeed"); + columnMap.put("orignDate", "t.orignDate AS orignDate"); + columnMap.put("pretemp", "t.pretemp AS pretemp"); + columnMap.put("flowRate", "t.flowRate AS flowRate"); + columnMap.put("depth", "t.depth AS depth"); + columnMap.put("botmMater", "t.botmMater AS botmMater"); + columnMap.put("wqtq", "t.wqtq AS wqtq"); + columnMap.put("wqtqName", "t.wqtqName AS wqtqName"); + columnMap.put("habitat", "t.habitat AS habitat"); + columnMap.put("habitatName", "t.habitatName AS habitatName"); + columnMap.put("situation", "t.situation AS situation"); + columnMap.put("situationName", "t.situationName AS situationName"); + columnMap.put("resourceType", "t.resourceType AS resourceType"); + columnMap.put("resourceTypeName", "t.resourceTypeName AS resourceTypeName"); + columnMap.put("shapedesc", "t.shapedesc AS shapedesc"); + columnMap.put("protectlvl", "t.protectlvl AS protectlvl"); + columnMap.put("habitation", "t.habitation AS habitation"); + columnMap.put("fid", "t.fid AS fid"); + columnMap.put("description", "t.description AS description"); + columnMap.put("enable", "t.enable AS enable"); + columnMap.put("enableName", "t.enableName AS enableName"); + columnMap.put("internal", "t.internal AS internal"); + columnMap.put("internalName", "t.internalName AS internalName"); + columnMap.put("orderIndex", "t.orderIndex AS orderIndex"); + columnMap.put("recordUser", "t.recordUser AS recordUser"); + columnMap.put("recordTime", "t.recordTime AS recordTime"); + columnMap.put("modifyUser", "t.modifyUser AS modifyUser"); + columnMap.put("modifyTime", "t.modifyTime AS modifyTime"); + columnMap.put("isDeleted", "t.isDeleted AS isDeleted"); + columnMap.put("deleteUser", "t.deleteUser AS deleteUser"); + columnMap.put("deleteTime", "t.deleteTime AS deleteTime"); + columnMap.put("spawnMonth", "t.spawnMonth AS spawnMonth"); + columnMap.put("vlsr", "t.vlsr AS vlsr"); + columnMap.put("vlsrTm", "t.vlsrTm AS vlsrTm"); + return columnMap; + } + private String buildVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, Map paramMap, int[] indexHolder) { @@ -345,6 +558,32 @@ public class FpBuildServiceImpl implements FpBuildService { return String.join(logic, conditions); } + private String buildFishDicFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (filter.getField() != null && !filter.getField().isBlank()) { + return buildFishDicLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFishDicFilterCondition(child, paramMap, indexHolder); + if (!childSql.isBlank()) { + 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 paramMap, int[] indexHolder) { @@ -410,6 +649,96 @@ public class FpBuildServiceImpl implements FpBuildService { } } + private String buildFishDicLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapFishDicColumn(filter.getField()); + if (column == null || column.isBlank()) { + return ""; + } + String operator = filter.getOperator() == null ? "eq" : filter.getOperator().toLowerCase(); + Object value = filter.getValue(); + if (isFishDicDateField(filter.getField())) { + return buildDateCondition(column, operator, value, paramMap, indexHolder, "fpFishDicP"); + } + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fpFishDicP" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String paramKey = "fpFishDicP" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String buildDateCondition(String column, + String operator, + Object value, + Map paramMap, + int[] indexHolder, + String prefix) { + if (value == null) { + return ""; + } + String paramKey = prefix + indexHolder[0]++; + paramMap.put(paramKey, value); + return switch (operator) { + case "eq" -> "TRUNC(" + column + ") = TRUNC(#{map." + paramKey + "})"; + case "neq" -> "TRUNC(" + column + ") <> TRUNC(#{map." + paramKey + "})"; + case "gt" -> column + " > #{map." + paramKey + "}"; + case "gte" -> column + " >= #{map." + paramKey + "}"; + case "lt" -> column + " < #{map." + paramKey + "}"; + case "lte" -> column + " <= #{map." + paramKey + "}"; + default -> ""; + }; + } + private List normalizeValues(Object value) { List values = new ArrayList<>(); if (value instanceof List list) { @@ -531,6 +860,76 @@ public class FpBuildServiceImpl implements FpBuildService { return columnMap.get(field); } + private String mapFishDicColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "code" -> "t.code"; + case "name" -> "t.name"; + case "nameEn" -> "t.nameEn"; + case "alias" -> "t.alias"; + case "logo" -> "t.logo"; + case "introduce" -> "t.introduce"; + case "inffile" -> "t.inffile"; + case "orders" -> "t.orders"; + case "family" -> "t.family"; + case "genus" -> "t.genus"; + case "species" -> "t.species"; + case "type" -> "t.type"; + case "typeName" -> "t.typeName"; + case "fsz" -> "t.fsz"; + case "rare" -> "t.rare"; + case "rareName" -> "t.rareName"; + case "specOrigin" -> "t.specOrigin"; + case "specOriginName" -> "t.specOriginName"; + case "ptype" -> "t.ptype"; + case "ptypeName" -> "t.ptypeName"; + case "rvcd" -> "t.rvcd"; + case "rvcdName" -> "t.rvcdName"; + case "habitMigrat" -> "t.habitMigrat"; + case "feedingHabit" -> "t.feedingHabit"; + case "spawnCharact" -> "t.spawnCharact"; + case "food" -> "t.food"; + case "timeFeed" -> "t.timeFeed"; + case "orignDate" -> "t.orignDate"; + case "pretemp" -> "t.pretemp"; + case "flowRate" -> "t.flowRate"; + case "depth" -> "t.depth"; + case "botmMater" -> "t.botmMater"; + case "wqtq" -> "t.wqtq"; + case "wqtqName" -> "t.wqtqName"; + case "habitat" -> "t.habitat"; + case "habitatName" -> "t.habitatName"; + case "situation" -> "t.situation"; + case "situationName" -> "t.situationName"; + case "resourceType" -> "t.resourceType"; + case "resourceTypeName" -> "t.resourceTypeName"; + case "shapedesc" -> "t.shapedesc"; + case "protectlvl" -> "t.protectlvl"; + case "habitation" -> "t.habitation"; + case "fid" -> "t.fid"; + case "description" -> "t.description"; + case "enable" -> "t.enable"; + case "enableName" -> "t.enableName"; + case "internal" -> "t.internal"; + case "internalName" -> "t.internalName"; + case "orderIndex" -> "t.orderIndex"; + case "recordUser" -> "t.recordUser"; + case "recordTime" -> "t.recordTime"; + case "modifyUser" -> "t.modifyUser"; + case "modifyTime" -> "t.modifyTime"; + case "isDeleted" -> "t.isDeleted"; + case "deleteUser" -> "t.deleteUser"; + case "deleteTime" -> "t.deleteTime"; + case "spawnMonth" -> "t.spawnMonth"; + case "vlsr" -> "t.vlsr"; + case "vlsrTm" -> "t.vlsrTm"; + default -> null; + }; + } + private String buildVmsstbprptOrderBySql(List sorts) { if (sorts == null || sorts.isEmpty()) { return " ORDER BY t.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " + @@ -555,6 +954,64 @@ public class FpBuildServiceImpl implements FpBuildService { return " ORDER BY " + String.join(", ", orderItems); } + private String buildFishDicOrderBySql(List sorts) { + List orderItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(sorts)) { + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || sort.getField() == null || sort.getField().isBlank()) { + continue; + } + String column = mapFishDicColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) + ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); + } + } + if (orderItems.isEmpty()) { + return " ORDER BY t.orderIndex ASC NULLS LAST, t.name ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildFishDicGroupSql(String detailSql, GroupingInfo[] groupInfos) { + if (groupInfos == null || groupInfos.length == 0) { + return detailSql; + } + List groupFields = new ArrayList<>(); + List selectItems = new ArrayList<>(); + List orderItems = new ArrayList<>(); + for (GroupingInfo item : groupInfos) { + if (item == null || StrUtil.isBlank(item.getSelector())) { + continue; + } + String selector = item.getSelector(); + String column = mapFishDicColumn(selector); + if (StrUtil.isBlank(column)) { + continue; + } + groupFields.add(column); + selectItems.add(column + " AS " + selector); + selectItems.add("COUNT(*) AS count_" + selector); + orderItems.add(column + (item.getDesc() ? " DESC" : " ASC")); + } + if (groupFields.isEmpty()) { + return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0"; + } + return "SELECT " + String.join(", ", selectItems) + + " FROM (" + detailSql + ") t GROUP BY " + String.join(", ", groupFields) + + " ORDER BY " + String.join(", ", orderItems); + } + + private boolean isFishDicDateField(String field) { + return "recordTime".equals(field) + || "modifyTime".equals(field) + || "deleteTime".equals(field) + || "vlsrTm".equals(field); + } + private String mapVmsstbprptOuterColumn(String field) { if (field == null || field.isBlank()) { return null; From b171d91e546fc28b79e9d2af2588892e00e93050 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 16 Jun 2026 16:00:02 +0800 Subject: [PATCH 11/20] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AE=E8=BF=87?= =?UTF-8?q?=E9=B1=BC=E8=AE=BE=E6=96=BD=E7=AB=99=E7=82=B9=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=B1=BC=E7=B1=BB=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 4 +- .../fp/controller/FishPassageController.java | 6 +++ .../qgc_env/fp/service/FpBuildService.java | 2 + .../fp/service/impl/FpBuildServiceImpl.java | 39 +++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index 7c7358e1..0a49d30b 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -64,8 +64,8 @@ public class SecurityConfig { // .requestMatchers("/eng/**").permitAll() // .requestMatchers("/eq/**").permitAll() // .requestMatchers("/env/**").permitAll() - .requestMatchers("/wt/**").permitAll() - .requestMatchers("/fb/**").permitAll() +// .requestMatchers("/wt/**").permitAll() +// .requestMatchers("/fb/**").permitAll() // .requestMatchers("/zq/**").permitAll() // .requestMatchers("/wq/**").permitAll() // .requestMatchers("/vd/**").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java index 7d2fa893..25fb7bb6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java @@ -76,6 +76,12 @@ public class FishPassageController { return ResponseResult.successData(fpBuildService.getFishDicList(dataSourceRequest)); } + @PostMapping("/fishDic/stcd/GetKendoList") + @Operation(summary = "根据过鱼设施站点查询鱼类列表") + public ResponseResult getFishDicListByStcd(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpBuildService.getFishDicListByStcd(dataSourceRequest)); + } + @PostMapping("/vmsstbprpt/GetKendoList") @Operation(summary = "根据条件查询过鱼设施基础列表") public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java index 97d2e4f7..56b2fadb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java @@ -14,6 +14,8 @@ public interface FpBuildService { DataSourceResult getFishDicList(DataSourceRequest dataSourceRequest); + DataSourceResult getFishDicListByStcd(DataSourceRequest dataSourceRequest); + DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest); FpVmsstbprptVo getStInfoByStcd(String stcd); 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 4ccffabc..86f893c6 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 @@ -10,6 +10,7 @@ import com.yfd.platform.common.GroupHelper; 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.qgc_env.fp.entity.vo.FpConstructionSituationVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishDicVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpVmsstbprptVo; @@ -122,6 +123,44 @@ public class FpBuildServiceImpl implements FpBuildService { return result; } + @Override + public DataSourceResult getFishDicListByStcd(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + if (StrUtil.isBlank(stcd)) { + throw new BizException("过鱼设施站点编码(stcd)不能为空."); + } + + Map paramMap = new HashMap<>(); + paramMap.put("stcd", StrUtil.trim(stcd)); + + 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 " + + " 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} " + + "ORDER BY fish.NAME"; + + List list = microservicDynamicSQLMapper.getAllListWithResultType( + sql, + paramMap, + FpFishDicVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(list == null ? 0L : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest) { return queryVmsstbprptList(dataSourceRequest, "FPQ"); From aa0dddc227b1353c03b83438c4b8d4fca650883a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E5=87=AF?= <2448379534@qq.com> Date: Tue, 16 Jun 2026 17:39:51 +0800 Subject: [PATCH 12/20] =?UTF-8?q?=E7=94=9F=E6=80=81=E6=B5=81=E9=87=8F?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=8C=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/stll/index.ts | 62 +- .../src/components/MapModal/column.config.ts | 768 ++++----- .../src/components/SidePanelItem/index.vue | 1452 +++++++++-------- .../EnvironmentalQualityTwoLayers.vue | 2 +- .../guoyujiance/components/FPVDDetailMD.vue | 2 +- .../xianZhiYanChenBianHua/index.vue | 450 +++-- .../xieFangFangShi/TwoLayer/STLLXFFS.vue | 879 ++++++++++ .../xieFangFangShi/index.vue | 465 ++++-- .../TwoLayer/FenBuQingKuangTwoLayer.vue | 737 +++++++++ .../xieFangFenBu/index.vue | 769 +++++---- .../TwoLayer/ModalYkzhbzdjcgz.vue | 2 +- .../ShengTaiLiuLiangDaBQKTwoLayer.vue | 8 +- .../TwoLayer/STLLXFFS.vue | 812 +++++++++ .../modules/shengtaidabiaoTwoMod/index.vue | 145 +- .../modules/stllyanchengChangeMod/index.vue | 614 +++++++ frontend/src/utils/request.ts | 2 +- .../shengTaiLiuLiangManZuQingKuang.vue | 45 +- .../shengTaiLiuLiangXieFangSheShi.vue | 47 +- 18 files changed, 5497 insertions(+), 1764 deletions(-) create mode 100644 frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue create mode 100644 frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/TwoLayer/FenBuQingKuangTwoLayer.vue create mode 100644 frontend/src/modules/shengtaidabiaoTwoMod/TwoLayer/STLLXFFS.vue create mode 100644 frontend/src/modules/stllyanchengChangeMod/index.vue diff --git a/frontend/src/api/stll/index.ts b/frontend/src/api/stll/index.ts index 57db7457..4eaf0cd0 100644 --- a/frontend/src/api/stll/index.ts +++ b/frontend/src/api/stll/index.ts @@ -2,7 +2,7 @@ import request from '@/utils/request'; //生态流量达标情况 export function qgcetQgcStaticData(data: any) { return request({ - url: '/api/wmp-eng-server/eng/eq/interval/qgc/getQgcStaticData', + url: '/eq/interval/qgc/getQgcStaticData', method: 'post', data }); @@ -10,7 +10,7 @@ export function qgcetQgcStaticData(data: any) { //tabs 日 export function dayGetKendoListCust(data: any) { return request({ - url: '/api/wmp-eng-server/eng/eq/interval/qgc/day/GetKendoListCust', + url: '/eq/interval/qgc/day/GetKendoListCust', method: 'post', data }); @@ -18,7 +18,7 @@ export function dayGetKendoListCust(data: any) { //tabs 小时 export function hourGetKendoListCust(queryParams: any) { return request({ - url: '/api/wmp-eng-server/eng/eq/interval/qgc/hour/GetKendoListCust', + url: '/eq/interval/qgc/hour/GetKendoListCust', method: 'post', data: queryParams }); @@ -26,7 +26,7 @@ export function hourGetKendoListCust(queryParams: any) { //接入过生态流量数据的电站 export function evnmAutoMonitorGetKendoListCust(queryParams: any) { return request({ - url: '/api/dec-lygk-base-server/base/evnmAutoMonitor/GetKendoListCust', + url: '/eq/evnmAutoMonitor/GetKendoListCust', method: 'post', data: queryParams }); @@ -34,15 +34,63 @@ export function evnmAutoMonitorGetKendoListCust(queryParams: any) { //获取电站 export function vmsstbprptGetKendoList(queryParams: any) { return request({ - url: '/api/dec-lygk-base-server/base/vmsstbprpt/GetKendoList', + url: '/eq/vmsstbprpt/GetKendoList', method: 'post', data: queryParams }); } -//生态流量达标情况 /api/wmp-eng-server/eng/eq/qecRateCount +//生态流量达标情况 export function eqqecRateCount(queryParams: any) { return request({ - url: '/api/wmp-eng-server/eng/eq/qecRateCount', + url: '/eq/qecRateCount', + method: 'post', + data: queryParams + }); +} +// 获取生态流量达标率按基地 +export function intervalGetKendoListCust(queryParams: any) { + return request({ + url: '/eq/interval/GetKendoListCust', + method: 'post', + data: queryParams + }); +} +// 获取生态流量达标率按性能 +export function eqGetKendoListCust(queryParams: any) { + return request({ + url: '/api/wmp-eng-server/eng/to/eq/GetKendoListCust', + method: 'post', + data: queryParams + }); +} +//生态流量沿程变化 +export function qgcHourVGetKendoListCust(queryParams: any) { + return request({ + url: '/eq/engalong/statistics/qgcHourV/GetKendoListCust', + method: 'post', + data: queryParams + }); +} +//根据流域获取电站 +export function wbsbGetKendoList(queryParams: any) { + return request({ + url: '/eq/wbsb/GetKendoList', + method: 'post', + data: queryParams + }); +} +//生态流量泄放方式 +export function msstbprptGetKendoList(queryParams: any) { + return request({ + url: '/eq/msstbprpt/GetKendoList', + method: 'post', + data: queryParams + }); +} +//根据流域获取电站 +export function qgcgetEngLimit(queryParams: any) { + return request({ + url: '/api/wmp-eng-server/eng/engalong/statistics/qgc/getEngLimit', method: 'post', data: queryParams }); diff --git a/frontend/src/components/MapModal/column.config.ts b/frontend/src/components/MapModal/column.config.ts index de95b033..e4e1b39d 100644 --- a/frontend/src/components/MapModal/column.config.ts +++ b/frontend/src/components/MapModal/column.config.ts @@ -994,22 +994,22 @@ const wtPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '建成日期', filed: 'jcdt', @@ -1070,22 +1070,22 @@ const FhWpPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '建成日期', filed: 'jcdt', @@ -1259,22 +1259,22 @@ const FhZQPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '建成日期', filed: 'jcdt', @@ -1328,22 +1328,22 @@ const FPPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '开工日期', @@ -1507,22 +1507,22 @@ const FPPointColumns1: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '开工日期', @@ -1766,22 +1766,22 @@ const FPPointColumns2: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '开工日期', @@ -1971,22 +1971,22 @@ const FPPointColumns4: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '开工日期', @@ -2190,22 +2190,22 @@ const FPPointColumns5: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '开工日期', @@ -2254,22 +2254,22 @@ const FBPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '开工日期', @@ -2420,22 +2420,22 @@ const VaPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '开工日期', @@ -2551,22 +2551,22 @@ const VPPointColumns: Array = [ format: 'YYYY-MM-DD', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '建成日期', filed: 'jcdt', @@ -2644,22 +2644,22 @@ const wePointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '', filed: '', @@ -2684,22 +2684,22 @@ const waPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '监测方式', filed: 'mwayName', @@ -2759,22 +2759,22 @@ const StinfoAiVidoPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '监控点地址', filed: 'stlc', @@ -2822,22 +2822,22 @@ const DwPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3006,22 +3006,22 @@ const DwFivePointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3176,22 +3176,22 @@ const DwSixPointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3325,22 +3325,22 @@ const DwOnePointColumns: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3486,22 +3486,22 @@ const EQPointColumns2: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3619,22 +3619,22 @@ const EQPointColumns5: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3723,22 +3723,22 @@ const EQPointColumns3: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3857,22 +3857,22 @@ const EQPointColumns4: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -3990,22 +3990,22 @@ const EQPointColumns1: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', @@ -4123,22 +4123,22 @@ const EQPointColumns7: Array = [ type: 'select', url: '' }, - { - name: '经度(°)', - filed: 'lgtd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, - { - name: '纬度(°)', - filed: 'lttd', - visible: true, - type: 'number', - toFixed: 6, - url: '' - }, + // { + // name: '经度(°)', + // filed: 'lgtd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, + // { + // name: '纬度(°)', + // filed: 'lttd', + // visible: true, + // type: 'number', + // toFixed: 6, + // url: '' + // }, { name: '所属电站', filed: 'ennm', diff --git a/frontend/src/components/SidePanelItem/index.vue b/frontend/src/components/SidePanelItem/index.vue index 7649cc2f..94fc9ac5 100644 --- a/frontend/src/components/SidePanelItem/index.vue +++ b/frontend/src/components/SidePanelItem/index.vue @@ -1,90 +1,174 @@ \ No newline at end of file + diff --git a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue index b9d6fa3b..ac7acf40 100644 --- a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue +++ b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue @@ -88,7 +88,7 @@ - \ No newline at end of file +.chart-wrapper { + width: 100%; + height: 100%; + + &.has-data { + min-height: 0; + } +} + diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue new file mode 100644 index 00000000..9abedb9a --- /dev/null +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/TwoLayer/STLLXFFS.vue @@ -0,0 +1,879 @@ + + + + diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue index a2585f76..27e29986 100644 --- a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFangShi/index.vue @@ -1,194 +1,365 @@ \ No newline at end of file + diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/TwoLayer/FenBuQingKuangTwoLayer.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/TwoLayer/FenBuQingKuangTwoLayer.vue new file mode 100644 index 00000000..c9f95601 --- /dev/null +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/TwoLayer/FenBuQingKuangTwoLayer.vue @@ -0,0 +1,737 @@ + + + + + diff --git a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue index 159d1a7b..7245ee49 100644 --- a/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue +++ b/frontend/src/modules/shengTaiLiuLiangXieFangSheShiMod/xieFangFenBu/index.vue @@ -1,386 +1,479 @@ - \ No newline at end of file + diff --git a/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ModalYkzhbzdjcgz.vue b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ModalYkzhbzdjcgz.vue index 63cea5e1..d186ce8d 100644 --- a/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ModalYkzhbzdjcgz.vue +++ b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ModalYkzhbzdjcgz.vue @@ -295,7 +295,7 @@ const handleChange = async () => { select: ['stcd', 'stnm'] }; let res = await vmsstbprptGetKendoList(params); - if (res?.data?.success && res?.data?.data) { + if ( res?.data?.data) { let data = res.data.data; stcdOptions.value = data.map((item: any) => ({ value: item.stcd, diff --git a/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue index 8f87e523..a7921bb2 100644 --- a/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue +++ b/frontend/src/modules/shengtaidabiaoMod/TwoLayer/ShengTaiLiuLiangDaBQKTwoLayer.vue @@ -36,7 +36,7 @@ v-model:value="dateRange" :allow-clear="false" format="YYYY-MM-DD" - style="width: 360px" + style="width: 260px" /> @@ -70,11 +70,11 @@ /> -
+
{ align-items: center; } } - .table { + .table1 { width: 65%; height: 482px; } diff --git a/frontend/src/modules/shengtaidabiaoTwoMod/TwoLayer/STLLXFFS.vue b/frontend/src/modules/shengtaidabiaoTwoMod/TwoLayer/STLLXFFS.vue new file mode 100644 index 00000000..5f319618 --- /dev/null +++ b/frontend/src/modules/shengtaidabiaoTwoMod/TwoLayer/STLLXFFS.vue @@ -0,0 +1,812 @@ + + + + diff --git a/frontend/src/modules/shengtaidabiaoTwoMod/index.vue b/frontend/src/modules/shengtaidabiaoTwoMod/index.vue index 6477b27e..f384b4f0 100644 --- a/frontend/src/modules/shengtaidabiaoTwoMod/index.vue +++ b/frontend/src/modules/shengtaidabiaoTwoMod/index.vue @@ -7,7 +7,9 @@ --> + + diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index a22e13f6..d5ff6a9a 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -33,7 +33,7 @@ service.interceptors.request.use( config.headers._sysid = '10EC2E0B-AEA9-4757-83A2-201BA1BC54E9'; config.headers.authorization = - 'bearer aa5be16b-d1a3-4b93-9886-b2490025c7d6'; + 'bearer 0952e56d-8a77-4c43-abe4-a44367a22d73'; config.baseURL = '/'; } else { const user = useUserStoreHook(); diff --git a/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangManZuQingKuang.vue b/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangManZuQingKuang.vue index e0b2b023..6fba0d80 100644 --- a/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangManZuQingKuang.vue +++ b/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangManZuQingKuang.vue @@ -1,21 +1,36 @@ - + diff --git a/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangXieFangSheShi.vue b/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangXieFangSheShi.vue index 2293fac9..5b924ab6 100644 --- a/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangXieFangSheShi.vue +++ b/frontend/src/views/shengTaiLiuLiang/shengTaiLiuLiangXieFangSheShi.vue @@ -1,22 +1,37 @@ - + From c0ee187eff714af47c71b96387ccec07fb1a836e Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 16 Jun 2026 17:53:29 +0800 Subject: [PATCH 13/20] =?UTF-8?q?feat:=20=E7=B3=BB=E7=BB=9F=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=A7=9F=E6=88=B7id=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SysConfigController.java | 23 +++- .../system/controller/SysLogController.java | 15 ++- .../system/controller/SysMenuController.java | 99 ++++++++++++---- .../controller/SysOrganizationController.java | 65 +++++++--- .../system/controller/SysRoleController.java | 111 ++++++++++++++---- .../system/controller/UserController.java | 31 +++-- .../yfd/platform/system/domain/SysConfig.java | 6 + .../yfd/platform/system/domain/SysLog.java | 6 + .../yfd/platform/system/domain/SysMenu.java | 6 + .../system/domain/SysOrganization.java | 6 + .../yfd/platform/system/domain/SysRole.java | 6 + .../yfd/platform/system/domain/SysUser.java | 6 + .../platform/system/mapper/SysMenuMapper.java | 14 ++- .../platform/system/mapper/SysRoleMapper.java | 11 +- .../platform/system/mapper/SysUserMapper.java | 7 +- .../system/service/ISysLogService.java | 2 +- .../system/service/ISysMenuService.java | 10 +- .../service/ISysOrganizationService.java | 6 +- .../system/service/ISysRoleService.java | 4 +- .../platform/system/service/IUserService.java | 4 +- .../service/impl/SysLogServiceImpl.java | 13 +- .../service/impl/SysMenuServiceImpl.java | 75 ++++++++---- .../impl/SysOrganizationServiceImpl.java | 31 ++++- .../service/impl/SysRoleServiceImpl.java | 9 +- .../system/service/impl/UserServiceImpl.java | 6 +- .../resources/mapper/system/SysMenuMapper.xml | 25 +++- .../resources/mapper/system/SysRoleMapper.xml | 7 ++ .../resources/mapper/system/SysUserMapper.xml | 4 + 28 files changed, 469 insertions(+), 139 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SysConfigController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysConfigController.java index 3cfa7cc9..d426628a 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysConfigController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysConfigController.java @@ -3,6 +3,7 @@ package com.yfd.platform.system.controller; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.system.domain.SysConfig; import com.yfd.platform.system.service.ISysConfigService; @@ -38,16 +39,22 @@ public class SysConfigController { @PostMapping("/getOneById") @Operation(summary = "根据id查询全局配置详情记录") @ResponseBody - public SysConfig getOneById(String id){ - return configService.getById(id); + public SysConfig getOneById(String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysConfig::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysConfig::getTenantId, StrUtil.trim(tenantId)); + return configService.getOne(queryWrapper); } @PostMapping("/addConfig") @Operation(summary = "根据id查询全局配置详情记录") @ResponseBody - public ResponseResult addConfig(@RequestBody SysConfig config ) throws IOException, UnsupportedAudioFileException { + public ResponseResult addConfig(@RequestBody SysConfig config, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) throws IOException, UnsupportedAudioFileException { if (StrUtil.isEmpty(config.getId())){ config.setId(IdUtil.fastSimpleUUID()); } + config.setTenantId(StrUtil.trimToNull(tenantId)); config.setLastmodifier(userService.getUsername()); config.setLastmodifydate(new Timestamp(System.currentTimeMillis())); boolean ok=configService.save(config); @@ -57,7 +64,15 @@ public class SysConfigController { @PostMapping("/updateById") @Operation(summary = "根据id修改全局配置记录") @ResponseBody - public ResponseResult updateById(@RequestBody SysConfig config) throws IOException, UnsupportedAudioFileException { + public ResponseResult updateById(@RequestBody SysConfig config, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) throws IOException, UnsupportedAudioFileException { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysConfig::getId, config.getId()) + .eq(StrUtil.isNotBlank(tenantId), SysConfig::getTenantId, StrUtil.trim(tenantId)); + if (configService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的配置记录"); + } + config.setTenantId(StrUtil.trimToNull(tenantId)); config.setLastmodifier(userService.getUsername()); config.setLastmodifydate(new Timestamp(System.currentTimeMillis())); boolean ok=configService.updateById(config); diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SysLogController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysLogController.java index 9f2081aa..2a949e23 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysLogController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysLogController.java @@ -1,5 +1,6 @@ package com.yfd.platform.system.controller; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; @@ -42,10 +43,11 @@ public class SysLogController { @Operation(summary = "分页查询日志信息") public ResponseResult getLogList(String username, String optType, String startDate, - String endDate, Page page) { - + String endDate, Page page, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + tenantId=null; Page sysLogPage = sysLogService.getLogList(username, optType, - startDate, endDate, page); + startDate, endDate, page, StrUtil.trimToNull(tenantId)); Map map = new HashMap<>(); map.put("list", sysLogPage.getRecords()); map.put("total", sysLogPage.getTotal()); @@ -65,10 +67,11 @@ public class SysLogController { public void exportExcel(String username, String optType, String startDate, String endDate, Page page, - HttpServletResponse response) throws IOException { - + HttpServletResponse response, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) throws IOException { + tenantId=null; Page sysLogPage = sysLogService.getLogList(username, optType, - startDate, endDate, page); + startDate, endDate, page, StrUtil.trimToNull(tenantId)); sysLogService.exportExcel(sysLogPage.getRecords(), response); } } diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java index 3ac00e2e..dea76c02 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java @@ -2,6 +2,7 @@ package com.yfd.platform.system.controller; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; @@ -58,8 +59,9 @@ public class SysMenuController { @ResponseBody public List> getMenuButtonTree(String systemcode, String name, - String isdisplay) { - return sysMenuService.getMenuButtonTree(systemcode, name, isdisplay); + String isdisplay, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + return sysMenuService.getMenuButtonTree(systemcode, name, isdisplay, StrUtil.trimToNull(tenantId)); } /*********************************** @@ -75,8 +77,9 @@ public class SysMenuController { @ResponseBody public List> getMenuTree(String systemcode, String name, - String isdisplay) { - return sysMenuService.getMenuTree(systemcode, name, isdisplay); + String isdisplay, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + return sysMenuService.getMenuTree(systemcode, name, isdisplay, StrUtil.trimToNull(tenantId)); } /*********************************** @@ -90,11 +93,12 @@ public class SysMenuController { @PostMapping("/permissionAssignment") @Operation(summary = "获取分配权限(不含按钮)") @ResponseBody - public List> permissionAssignment(String code, String roleId) { + public List> permissionAssignment(String code, String roleId, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { if (StrUtil.isBlank(code)) { code = "1"; } - return sysMenuService.permissionAssignment(code,roleId); + return sysMenuService.permissionAssignment(code, roleId, StrUtil.trimToNull(tenantId)); } /********************************** @@ -105,13 +109,13 @@ public class SysMenuController { @GetMapping("/treeRoutes") @Operation(summary = "获取当前用户菜单结构树") @ResponseBody - public List> getMenuTreeByUser() { + public List> getMenuTreeByUser(@RequestHeader(value = "Tenant_id", required = false) String tenantId) { SysUser userInfo = userService.getUserInfo(); String id = ""; if (0 != userInfo.getUsertype()) { id = userInfo.getId(); } - return sysMenuService.getMenuTree(id); + return sysMenuService.getMenuTree(id, StrUtil.isNotBlank(tenantId) ? StrUtil.trimToNull(tenantId) : userInfo.getTenantId()); } /*********************************** @@ -123,8 +127,12 @@ public class SysMenuController { @PostMapping("/getOneById") @Operation(summary = "根据id查询菜单或按钮详情") @ResponseBody - public ResponseResult getOneById(String id) { - SysMenu sysMenu = sysMenuService.getById(id); + public ResponseResult getOneById(String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + SysMenu sysMenu = sysMenuService.getOne(queryWrapper); return ResponseResult.successData(sysMenu); } @@ -138,7 +146,9 @@ public class SysMenuController { @PostMapping("/addMenu") @Operation(summary = "新增菜单及按钮") @ResponseBody - public ResponseResult addMenu(@RequestBody SysMenu sysMenu) { + public ResponseResult addMenu(@RequestBody SysMenu sysMenu, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + sysMenu.setTenantId(StrUtil.trimToNull(tenantId)); boolean isOk = sysMenuService.addMenu(sysMenu); if (isOk) { return ResponseResult.success(); @@ -157,7 +167,15 @@ public class SysMenuController { @PostMapping("/updateById") @Operation(summary = "修改菜单及按钮") @ResponseBody - public ResponseResult updateById(@RequestBody SysMenu sysMenu) { + public ResponseResult updateById(@RequestBody SysMenu sysMenu, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getId, sysMenu.getId()) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + if (sysMenuService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的菜单"); + } + sysMenu.setTenantId(StrUtil.trimToNull(tenantId)); sysMenu.setLastmodifier(userService.getUsername()); sysMenu.setLastmodifydate(new Timestamp(System.currentTimeMillis())); boolean isOk = sysMenuService.updateById(sysMenu); @@ -179,7 +197,14 @@ public class SysMenuController { @PostMapping("/deleteIcon") @Operation(summary = "根据id删除单个图标") @ResponseBody - public ResponseResult deleteIcon(@RequestParam String id) { + public ResponseResult deleteIcon(@RequestParam String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + if (sysMenuService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的菜单"); + } boolean ok = sysMenuService.deleteIcon(id); if (ok) { return ResponseResult.success(); @@ -199,10 +224,11 @@ public class SysMenuController { @PostMapping("/setIsDisplay") @Operation(summary = "更新菜单及按钮是否有效") @ResponseBody - public ResponseResult setIsDisplay(String id, String isdisplay) { + public ResponseResult setIsDisplay(String id, String isdisplay, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); //根据id 修改是否显示 ,最近修改人,最近修改时间 - updateWrapper.eq("id", id).set("isdisplay", isdisplay).set( + updateWrapper.eq("id", id).eq(StrUtil.isNotBlank(tenantId), "tenant_id", StrUtil.trim(tenantId)).set("isdisplay", isdisplay).set( "lastmodifier", userService.getUsername()).set( "lastmodifydate", new Timestamp(System.currentTimeMillis())); @@ -227,8 +253,15 @@ public class SysMenuController { @ResponseBody public ResponseResult moveOrderno(@RequestParam String parentid, @RequestParam String id, - @RequestParam int orderno) { - boolean ok = sysMenuService.moveOrderno(parentid, id, orderno); + @RequestParam int orderno, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + if (sysMenuService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的菜单"); + } + boolean ok = sysMenuService.moveOrderno(parentid, id, orderno, StrUtil.trimToNull(tenantId)); if (ok) { return ResponseResult.success(); } else { @@ -246,7 +279,14 @@ public class SysMenuController { @PostMapping("/deleteById") @Operation(summary = "根据id删除菜单或按钮") @ResponseBody - public ResponseResult deleteById(@RequestParam String id) { + public ResponseResult deleteById(@RequestParam String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + if (sysMenuService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的菜单"); + } boolean ok = sysMenuService.deleteById(id); if (ok) { return ResponseResult.success(); @@ -266,13 +306,23 @@ public class SysMenuController { @Operation(summary = "菜单或按钮切换") @ResponseBody public ResponseResult changeMenuOrder(@RequestParam String fromId, - @RequestParam String toId) { + @RequestParam String toId, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { if (StrUtil.isBlank(fromId) || StrUtil.isBlank(toId)) { return ResponseResult.error("参数为空!"); } if (fromId.equals(toId)) { return ResponseResult.error("切换失败!"); } + LambdaQueryWrapper fromWrapper = new LambdaQueryWrapper<>(); + fromWrapper.eq(SysMenu::getId, fromId) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + LambdaQueryWrapper toWrapper = new LambdaQueryWrapper<>(); + toWrapper.eq(SysMenu::getId, toId) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + if (sysMenuService.getOne(fromWrapper) == null || sysMenuService.getOne(toWrapper) == null) { + return ResponseResult.error("存在不属于当前租户的菜单"); + } boolean ok = sysMenuService.changeOderNoById(fromId, toId); if (ok) { return ResponseResult.success(); @@ -290,9 +340,16 @@ public class SysMenuController { @PostMapping("/uploadIcon") @Operation(summary = "上传单个图标") @ResponseBody - public ResponseResult uploadIcon(MultipartFile icon, String menuId) throws FileNotFoundException { + public ResponseResult uploadIcon(MultipartFile icon, String menuId, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) throws FileNotFoundException { if (StrUtil.isNotBlank(menuId)) { - SysMenu sysMenu = sysMenuService.getById(menuId); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysMenu::getId, menuId) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId)); + SysMenu sysMenu = sysMenuService.getOne(queryWrapper); + if (sysMenu == null) { + return ResponseResult.error("未找到对应租户的菜单"); + } //图片路径 String iconname = System.getProperty("user.dir") + "\\src\\main" + diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java index 45c0218d..907aaa1f 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysOrganizationController.java @@ -51,8 +51,9 @@ public class SysOrganizationController { @PostMapping("/getOrgScopeTree") @Operation(summary = "获取组织范围树结构") @ResponseBody - public List> getOrgScopeTree(String roleId) { - return organizationService.getOrgScopeTree(roleId); + public List> getOrgScopeTree(String roleId, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + return organizationService.getOrgScopeTree(roleId, StrUtil.trimToNull(tenantId)); } /*********************************** @@ -64,8 +65,9 @@ public class SysOrganizationController { @Operation(summary = "获取组织结构树") @ResponseBody public List> getOrgTree(String parentid, - String params) { - return organizationService.getOrgTree(parentid, params); + String params, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + return organizationService.getOrgTree(parentid, params, StrUtil.trimToNull(tenantId)); } /*********************************** @@ -77,12 +79,13 @@ public class SysOrganizationController { @PostMapping("/getOrganizationById") @Operation(summary = "根据企业ID查询组织信息") @ResponseBody - public ResponseResult getOrganizationById(String id, String orgName) { + public ResponseResult getOrganizationById(String id, String orgName, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { if (StrUtil.isBlank(id)) { return ResponseResult.error("查询失败!"); } List sysOrganizations = - organizationService.getOrganizationById(id, orgName); + organizationService.getOrganizationById(id, orgName, StrUtil.trimToNull(tenantId)); return ResponseResult.successData(sysOrganizations); } @@ -95,8 +98,13 @@ public class SysOrganizationController { @PostMapping("/getOneById") @Operation(summary = "根据ID查询组织详情") @ResponseBody - public ResponseResult getOneById(String id) { - SysOrganization sysOrganization = organizationService.getById(id); + public ResponseResult getOneById(String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + queryWrapper.eq(SysOrganization::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, StrUtil.trim(tenantId)); + SysOrganization sysOrganization = organizationService.getOne(queryWrapper); return ResponseResult.successData(sysOrganization); } @@ -110,7 +118,8 @@ public class SysOrganizationController { @PostMapping("/addOrg") @Operation(summary = "新增系统组织框架") @ResponseBody - public ResponseResult addOrg(@RequestBody SysOrganization sysOrganization) { + public ResponseResult addOrg(@RequestBody SysOrganization sysOrganization, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { //判断是否是否填写 有效 否则默认为 1 if (StrUtil.isEmpty(sysOrganization.getIsvaild())) { sysOrganization.setIsvaild("1"); @@ -118,6 +127,7 @@ public class SysOrganizationController { if("".equals(sysOrganization.getId())){ sysOrganization.setId(null); } + sysOrganization.setTenantId(StrUtil.trimToNull(tenantId)); //填写 当前用户名称 sysOrganization.setLastmodifier(userService.getUsername()); //填写 当前日期 @@ -141,7 +151,16 @@ public class SysOrganizationController { @PostMapping("/updateById") @Operation(summary = "修改系统组织框架") @ResponseBody - public ResponseResult updateById(@RequestBody SysOrganization sysOrganization) { + public ResponseResult updateById(@RequestBody SysOrganization sysOrganization, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper<>(); + queryWrapper.eq(SysOrganization::getId, sysOrganization.getId()) + .eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, StrUtil.trim(tenantId)); + if (organizationService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的组织"); + } + sysOrganization.setTenantId(StrUtil.trimToNull(tenantId)); //填写 当前用户名称 sysOrganization.setLastmodifier(userService.getUsername()); //填写 当前日期 @@ -166,10 +185,11 @@ public class SysOrganizationController { @Operation(summary = "设置组织是否有效") @ResponseBody public ResponseResult setIsValid(@RequestParam String id, - @RequestParam String isvaild) { + @RequestParam String isvaild, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); //根据id 修改是否有效,最近修改人,最近修改时间 - updateWrapper.eq("id", id).set("isvaild", isvaild).set("lastmodifier" + updateWrapper.eq("id", id).eq(StrUtil.isNotBlank(tenantId), "tenant_id", StrUtil.trim(tenantId)).set("isvaild", isvaild).set("lastmodifier" , userService.getUsername()).set("lastmodifydate", new Timestamp(System.currentTimeMillis())); boolean isOk = organizationService.update(updateWrapper); @@ -190,21 +210,34 @@ public class SysOrganizationController { @PostMapping("/deleteById") @Operation(summary = "根据id删除系统组织框架") @ResponseBody - public ResponseResult deleteById(@RequestParam String id) { + public ResponseResult deleteById(@RequestParam String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { String[] orgIds = id.split(","); for (String orgId : orgIds) { + LambdaQueryWrapper currentWrapper = + new LambdaQueryWrapper<>(); + currentWrapper.eq(SysOrganization::getId, orgId) + .eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, StrUtil.trim(tenantId)); + if (organizationService.getOne(currentWrapper) == null) { + return ResponseResult.error("存在不属于当前租户的组织"); + } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); List list = - organizationService.list(queryWrapper.eq(SysOrganization::getParentid, orgId)); + organizationService.list(queryWrapper.eq(SysOrganization::getParentid, orgId) + .eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, StrUtil.trim(tenantId))); List ids = list.stream().map(SysOrganization::getId).collect(Collectors.toList()); - boolean isOk = organizationService.removeById(orgId); + boolean isOk = organizationService.remove(new LambdaQueryWrapper() + .eq(SysOrganization::getId, orgId) + .eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, StrUtil.trim(tenantId))); if (!isOk) { continue; } for (String oid : ids) { - organizationService.removeById(oid); + organizationService.remove(new LambdaQueryWrapper() + .eq(SysOrganization::getId, oid) + .eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, StrUtil.trim(tenantId))); } } return ResponseResult.success(); diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SysRoleController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysRoleController.java index dae54721..fbb0bbc1 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysRoleController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysRoleController.java @@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysMenu; import com.yfd.platform.system.domain.SysRole; +import com.yfd.platform.system.service.ISysMenuService; import com.yfd.platform.system.service.ISysRoleService; import com.yfd.platform.system.service.IUserService; import io.swagger.v3.oas.annotations.Operation; @@ -16,6 +18,7 @@ import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import java.sql.Timestamp; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -38,6 +41,9 @@ public class SysRoleController { @Resource private IUserService userService; + @Resource + private ISysMenuService sysMenuService; + /*********************************** * 用途说明:查询所有角色 * 参数说明 @@ -47,8 +53,9 @@ public class SysRoleController { @PostMapping("/list") @Operation(summary = "查询所有角色") @ResponseBody - public List list(@RequestParam(required = false) String rolename) { - return roleService.selectRoleList(rolename); + public List list(@RequestParam(required = false) String rolename, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + return roleService.selectRoleList(rolename, StrUtil.trimToNull(tenantId)); } /*********************************** @@ -60,8 +67,12 @@ public class SysRoleController { @PostMapping("/getOneById") @Operation(summary = "根据Id获取当个角色") @ResponseBody - public ResponseResult getOneById(String id) { - SysRole sysRole = roleService.getById(id); + public ResponseResult getOneById(String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysRole::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysRole::getTenantId, StrUtil.trim(tenantId)); + SysRole sysRole = roleService.getOne(queryWrapper); return ResponseResult.successData(sysRole); } @@ -75,7 +86,9 @@ public class SysRoleController { @PostMapping("/addRole") @Operation(summary = "新增角色") @ResponseBody - public ResponseResult addRole(@RequestBody SysRole sysRole) { + public ResponseResult addRole(@RequestBody SysRole sysRole, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + sysRole.setTenantId(StrUtil.trimToNull(tenantId)); boolean isOk = roleService.addRole(sysRole); if (isOk) { return ResponseResult.success(); @@ -96,10 +109,11 @@ public class SysRoleController { @Operation(summary = "分配操作权限") @ResponseBody public ResponseResult setOptScope(@RequestParam String id, - @RequestParam String optscope) { + @RequestParam String optscope, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); //根据id 更新权限,最近修改人,最近修改时间 - updateWrapper.eq("id", id).set("optscope", optscope).set( + updateWrapper.eq("id", id).eq(StrUtil.isNotBlank(tenantId), "tenant_id", StrUtil.trim(tenantId)).set("optscope", optscope).set( "lastmodifier", userService.getUsername()).set( "lastmodifydate", LocalDateTime.now()); boolean ok = roleService.update(updateWrapper); @@ -121,13 +135,34 @@ public class SysRoleController { @PostMapping("/setMenuById") @Operation(summary = "角色菜单权限") @ResponseBody - public ResponseResult setMenuById(String id, String menuIds) { + public ResponseResult setMenuById(String id, String menuIds, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { if (StrUtil.isBlank(id)) { return ResponseResult.error("参数为空"); } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysRole::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysRole::getTenantId, StrUtil.trim(tenantId)); + if (roleService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的角色"); + } if (StrUtil.isBlank(menuIds)) { return ResponseResult.success(); } + List menuIdList = Arrays.stream(menuIds.split(",")) + .map(StrUtil::trim) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + if (menuIdList.isEmpty()) { + return ResponseResult.success(); + } + long menuCount = sysMenuService.count(new LambdaQueryWrapper() + .in(SysMenu::getId, menuIdList) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, StrUtil.trim(tenantId))); + if (menuCount != menuIdList.size()) { + return ResponseResult.error("存在不属于当前租户的菜单"); + } boolean ok = roleService.setMenuById(id, menuIds); if (ok) { return ResponseResult.success(); @@ -149,10 +184,11 @@ public class SysRoleController { @Operation(summary = "设置组织范围") @ResponseBody public ResponseResult setOrgscope(@RequestParam String id, - @RequestParam String orgscope) { + @RequestParam String orgscope, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); //根据id 更新组织范围,最近修改人,最近修改时间 - updateWrapper.eq("id", id).set("orgscope", orgscope).set( + updateWrapper.eq("id", id).eq(StrUtil.isNotBlank(tenantId), "tenant_id", StrUtil.trim(tenantId)).set("orgscope", orgscope).set( "lastmodifier", userService.getUsername()).set( "lastmodifydate", LocalDateTime.now()); boolean ok = roleService.update(updateWrapper); @@ -175,10 +211,11 @@ public class SysRoleController { @Operation(summary = "设置业务范围") @ResponseBody public ResponseResult setBusscope(@RequestParam String id, - @RequestParam String busscope) { + @RequestParam String busscope, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); //根据id 更新业务范围,最近修改人,最近修改时间 - updateWrapper.eq("id", id).set("busscope", busscope).set( + updateWrapper.eq("id", id).eq(StrUtil.isNotBlank(tenantId), "tenant_id", StrUtil.trim(tenantId)).set("busscope", busscope).set( "lastmodifier", userService.getUsername()).set( "lastmodifydate", LocalDateTime.now()); boolean ok = roleService.update(updateWrapper); @@ -200,7 +237,14 @@ public class SysRoleController { @PostMapping("/setRoleUsers") @Operation(summary = "角色添加用户") @ResponseBody - public ResponseResult setRoleUsers(String roleid, String userids) { + public ResponseResult setRoleUsers(String roleid, String userids, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); + roleWrapper.eq(SysRole::getId, roleid) + .eq(StrUtil.isNotBlank(tenantId), SysRole::getTenantId, StrUtil.trim(tenantId)); + if (roleService.getOne(roleWrapper) == null) { + return ResponseResult.error("未找到对应租户的角色"); + } boolean isOk = true; String[] temp = userids.split(","); for (String userid : temp) { @@ -223,7 +267,14 @@ public class SysRoleController { @Operation(summary = "删除角色用户") @ResponseBody public ResponseResult deleteRoleUsers(@RequestParam String roleid, - @RequestParam String userids) { + @RequestParam String userids, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper roleWrapper = new LambdaQueryWrapper<>(); + roleWrapper.eq(SysRole::getId, roleid) + .eq(StrUtil.isNotBlank(tenantId), SysRole::getTenantId, StrUtil.trim(tenantId)); + if (roleService.getOne(roleWrapper) == null) { + return ResponseResult.error("未找到对应租户的角色"); + } //根据角色id、用户id删除 boolean ok = roleService.deleteRoleUsers(roleid, userids); if (ok) { @@ -243,10 +294,11 @@ public class SysRoleController { @PostMapping("/setIsvaild") @Operation(summary = "设置角色是否有效") @ResponseBody - public ResponseResult setIsvaild(String id, String isvaild) { + public ResponseResult setIsvaild(String id, String isvaild, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); //根据id 更新业务范围,最近修改人,最近修改时间 - updateWrapper.eq("id", id).set("isvaild", isvaild).set("lastmodifier" + updateWrapper.eq("id", id).eq(StrUtil.isNotBlank(tenantId), "tenant_id", StrUtil.trim(tenantId)).set("isvaild", isvaild).set("lastmodifier" , userService.getUsername()).set("lastmodifydate", LocalDateTime.now()); boolean ok = roleService.update(updateWrapper); @@ -266,7 +318,15 @@ public class SysRoleController { @PostMapping("/updateById") @Operation(summary = "更新角色信息") @ResponseBody - public ResponseResult updateById(@RequestBody SysRole sysRole) { + public ResponseResult updateById(@RequestBody SysRole sysRole, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysRole::getId, sysRole.getId()) + .eq(StrUtil.isNotBlank(tenantId), SysRole::getTenantId, StrUtil.trim(tenantId)); + if (roleService.getOne(queryWrapper) == null) { + return ResponseResult.error("未找到对应租户的角色"); + } + sysRole.setTenantId(StrUtil.trimToNull(tenantId)); //更新最近修改人 sysRole.setLastmodifier(userService.getUsername()); //更新最近修改时间 @@ -289,7 +349,17 @@ public class SysRoleController { @PostMapping("/deleteById") @Operation(summary = "根据id删除角色") @ResponseBody - public ResponseResult deleteById(@RequestParam String id) { + public ResponseResult deleteById(@RequestParam String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + String[] roleIds = id.split(","); + for (String roleId : roleIds) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysRole::getId, roleId) + .eq(StrUtil.isNotBlank(tenantId), SysRole::getTenantId, StrUtil.trim(tenantId)); + if (roleService.getOne(queryWrapper) == null) { + return ResponseResult.error("存在不属于当前租户的角色"); + } + } roleService.deleteById(id); return ResponseResult.success(); } @@ -310,9 +380,10 @@ public class SysRoleController { @ResponseBody public List listRoleUsers(String orgid, String username, String status, String level, - String rolename, String isvaild) { + String rolename, String isvaild, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { return roleService.listRoleUsers(orgid, username, status, level, - rolename, isvaild); + rolename, isvaild, StrUtil.trimToNull(tenantId)); } } diff --git a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java index 01217a42..ce4945b4 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java @@ -1,6 +1,7 @@ package com.yfd.platform.system.controller; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; @@ -41,7 +42,10 @@ public class UserController { @PostMapping("/addUser") @Operation(summary = "新增系统用户") @ResponseBody - public ResponseResult addUser(@RequestBody SysUser user, String roleids) { + public ResponseResult addUser(@RequestBody SysUser user, + String roleids, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + user.setTenantId(StrUtil.trimToNull(tenantId)); Map reslut = userService.addUser(user, roleids); return ResponseResult.successData(reslut); } @@ -51,10 +55,12 @@ public class UserController { @Operation(summary = "修改用户信息") @ResponseBody public ResponseResult updateUser(@RequestBody SysUser user, - String roleids) { + String roleids, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { if (StrUtil.isEmpty(user.getId())) { return ResponseResult.error("没有用户ID"); } + user.setTenantId(StrUtil.trimToNull(tenantId)); //填写 当前用户名称 user.setLastmodifier(userService.getUsername()); //填写 当前日期 @@ -68,10 +74,12 @@ public class UserController { @Operation(summary = "查询用户信息") @ResponseBody public ResponseResult queryUsers(String orgid, - String username, Page page) { + String username, + Page page, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { Page mapPage = userService.queryUsers(orgid, - username, page); + username, StrUtil.trimToNull(tenantId), page); return ResponseResult.successData(mapPage); } @@ -104,8 +112,12 @@ public class UserController { @GetMapping("/queryUserById") @Operation(summary = "根据id查询用户信息") @ResponseBody - public ResponseResult queryUserById(String id) { - SysUser user = userService.getById(id); + public ResponseResult queryUserById(String id, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUser::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysUser::getTenantId, StrUtil.trim(tenantId)); + SysUser user = userService.getOne(queryWrapper); return ResponseResult.successData(user); } @@ -232,8 +244,11 @@ public class UserController { @GetMapping("/queryPendingAuditUsers") @Operation(summary = "查询待审核用户列表") @ResponseBody - public ResponseResult queryPendingAuditUsers(Page page,String name,String regStatus) { - Page result = userService.queryPendingAuditUsers(page,name,regStatus); + public ResponseResult queryPendingAuditUsers(Page page, + String name, + String regStatus, + @RequestHeader(value = "Tenant_id", required = false) String tenantId) { + Page result = userService.queryPendingAuditUsers(page, name, regStatus, StrUtil.trimToNull(tenantId)); return ResponseResult.successData(result); } } diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java b/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java index 3830d977..9bfa2913 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysConfig.java @@ -48,6 +48,12 @@ public class SysConfig implements Serializable { */ private String remark; + /** + * 租户ID + */ + @TableField("TENANT_ID") + private String tenantId; + /** * 最近修改者 */ diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java b/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java index a3597693..7ff890d1 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysLog.java @@ -83,6 +83,12 @@ public class SysLog implements Serializable { @TableField("REQUESTIP") private String requestip; + /** + * 租户ID + */ + @TableField("TENANT_ID") + private String tenantId; + /** * 浏览器类型 */ diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java b/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java index 8392ce6f..b99d35b0 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysMenu.java @@ -85,6 +85,12 @@ public class SysMenu implements Serializable { */ private String isdisplay; + /** + * 租户ID + */ + @TableField("TENANT_ID") + private String tenantId; + /** * 最近修改者 */ diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java b/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java index 0f9a7192..dbbdfd6f 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysOrganization.java @@ -63,6 +63,12 @@ public class SysOrganization implements Serializable { */ private String description; + /** + * 租户ID + */ + @TableField("TENANT_ID") + private String tenantId; + /** * 最近修改者 */ diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java b/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java index 68ab3ce9..bdd53f89 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysRole.java @@ -69,6 +69,12 @@ public class SysRole implements Serializable { */ private String isvaild; + /** + * 租户ID + */ + @TableField("TENANT_ID") + private String tenantId; + /** * 最近修改者 */ diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java index b23df274..2e53094f 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java @@ -79,6 +79,12 @@ public class SysUser implements Serializable { */ private String orgid; + /** + * 租户ID + */ + @TableField("TENANT_ID") + private String tenantId; + /** * 密码重置时间 */ diff --git a/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java b/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java index 061feebb..9ea863fa 100644 --- a/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java +++ b/backend/src/main/java/com/yfd/platform/system/mapper/SysMenuMapper.java @@ -25,7 +25,10 @@ public interface SysMenuMapper extends BaseMapper { *upOrderno 大于等于序号(更改的序号加一) * 返回值说明: 是否更新成功 ***********************************/ - boolean upMoveOrderno(@Param("parentid") String parentid, @Param("Orderno") int Orderno, @Param("upOrderno") int upOrderno); + boolean upMoveOrderno(@Param("parentid") String parentid, + @Param("Orderno") int Orderno, + @Param("upOrderno") int upOrderno, + @Param("tenantId") String tenantId); /*********************************** * 用途说明:菜单及按钮序号向下移动 @@ -35,13 +38,16 @@ public interface SysMenuMapper extends BaseMapper { *downOrderno 小于等于序号(更改的序号减一) * 返回值说明: 是否更新成功 ***********************************/ - boolean downMoveOrderno(@Param("parentid") String parentid, @Param("Orderno") int Orderno, @Param("downOrderno") int downOrderno); + boolean downMoveOrderno(@Param("parentid") String parentid, + @Param("Orderno") int Orderno, + @Param("downOrderno") int downOrderno, + @Param("tenantId") String tenantId); List selectPermsByUserId(String userId); //List selectMenuByUserId(String userId); - List selectMenuByUserId(String userId); + List selectMenuByUserId(@Param("userId") String userId, @Param("tenantId") String tenantId); /*********************************** * 用途说明:根据权限id查找系统类型 @@ -55,5 +61,5 @@ public interface SysMenuMapper extends BaseMapper { * 参数说明 id 权限id * 返回值说明: 返回权限集合 ***********************************/ - List selectMenuByRoleId(String id); + List selectMenuByRoleId(@Param("id") String id, @Param("tenantId") String tenantId); } diff --git a/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java b/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java index ea374888..28727c4a 100644 --- a/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java +++ b/backend/src/main/java/com/yfd/platform/system/mapper/SysRoleMapper.java @@ -44,8 +44,13 @@ public interface SysRoleMapper extends BaseMapper { * isvaild 角色是否有效 * 返回值说明: 系统用户角色数据集合 ***********************************/ - List listRoleUsers(String orgid, String username, String status, - String level, String rolename, String isvaild); + List listRoleUsers(@Param("orgid") String orgid, + @Param("username") String username, + @Param("status") String status, + @Param("level") String level, + @Param("rolename") String rolename, + @Param("isvaild") String isvaild, + @Param("tenantId") String tenantId); /*********************************** * 用途说明:根据 角色id和用户id 删除 (admin除外) @@ -113,6 +118,6 @@ public interface SysRoleMapper extends BaseMapper { * 参数说明:rolename - 角色名称 * 返回值说明:角色列表 ***********************************/ - List selectRoleList(@Param("rolename") String rolename); + List selectRoleList(@Param("rolename") String rolename, @Param("tenantId") String tenantId); } diff --git a/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java b/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java index f031cf87..e9ac1f55 100644 --- a/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java +++ b/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java @@ -81,9 +81,10 @@ public interface SysUserMapper extends BaseMapper { ************************************/ boolean delInRoleUsersByUserid(@Param("userid") String userid,@Param("roleids")String[] roleids); - Page queryUsers(String orgid, - String username, - Page page); + Page queryUsers(@Param("orgid") String orgid, + @Param("username") String username, + @Param("tenantId") String tenantId, + Page page); Map getOrganizationByid(String id); diff --git a/backend/src/main/java/com/yfd/platform/system/service/ISysLogService.java b/backend/src/main/java/com/yfd/platform/system/service/ISysLogService.java index 85fdffa3..641ec23f 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/ISysLogService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/ISysLogService.java @@ -28,7 +28,7 @@ public interface ISysLogService extends IService { ***********************************/ Page getLogList(String username, String optType, String startDate, - String endDate, Page page); + String endDate, Page page, String tenantId); /********************************** diff --git a/backend/src/main/java/com/yfd/platform/system/service/ISysMenuService.java b/backend/src/main/java/com/yfd/platform/system/service/ISysMenuService.java index b24b2835..3dad368d 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/ISysMenuService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/ISysMenuService.java @@ -27,7 +27,7 @@ public interface ISysMenuService extends IService { * isdisplay 是否显示 * 返回值说明: 菜单结构树集合 ***********************************/ - List> getMenuButtonTree(String systemcode, String name, String isdisplay); + List> getMenuButtonTree(String systemcode, String name, String isdisplay, String tenantId); /*********************************** * 用途说明:获取菜单结构树(不含按钮) @@ -37,7 +37,7 @@ public interface ISysMenuService extends IService { * isdisplay 是否显示 * 返回值说明: 菜单结构树集合 ***********************************/ - List> getMenuTree(String systemcode, String name, String isdisplay); + List> getMenuTree(String systemcode, String name, String isdisplay, String tenantId); /*********************************** @@ -73,7 +73,7 @@ public interface ISysMenuService extends IService { * orderMap map<菜单及按钮表id,排列序号> * 返回值说明: 是否更新成功 ***********************************/ - boolean moveOrderno(String parentid, String id, int orderno); + boolean moveOrderno(String parentid, String id, int orderno, String tenantId); /*********************************** * 用途说明:根据id删除菜单或按钮 @@ -85,7 +85,7 @@ public interface ISysMenuService extends IService { boolean changeOderNoById(String fromId, String toId); - List> getMenuTree(String id); + List> getMenuTree(String id, String tenantId); /*********************************** * 用途说明:权限分配 @@ -95,7 +95,7 @@ public interface ISysMenuService extends IService { * isdisplay 是否显示 * 返回值说明: 菜单结构树集合 ***********************************/ - List> permissionAssignment(String code,String roleId); + List> permissionAssignment(String code, String roleId, String tenantId); String uploadIcon(MultipartFile icon) throws FileNotFoundException; } diff --git a/backend/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java b/backend/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java index 5b03119a..b95ea368 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/ISysOrganizationService.java @@ -24,7 +24,7 @@ public interface ISysOrganizationService extends IService { * params 名称(根据名称查询二级) * 返回值说明: 组织树集合 ***********************************/ - List> getOrgTree(String parentid, String params); + List> getOrgTree(String parentid, String params, String tenantId); /*********************************** * 用途说明:新增系统组织框架 @@ -40,7 +40,7 @@ public interface ISysOrganizationService extends IService { * id 企业id * 返回值说明: 系统组织框架对象 ***********************************/ - List getOrganizationById(String id,String orgName); + List getOrganizationById(String id, String orgName, String tenantId); /*********************************** * 用途说明:获取组织范围树结构 @@ -48,7 +48,7 @@ public interface ISysOrganizationService extends IService { *roleId 角色id * 返回值说明: 组织树集合 ***********************************/ - List> getOrgScopeTree(String roleId); + List> getOrgScopeTree(String roleId, String tenantId); /********************************** * 用途说明: 修改角色组织范围 diff --git a/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java b/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java index 2065a177..36f25dec 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java @@ -52,7 +52,7 @@ public interface ISysRoleService extends IService { * isvaild 角色是否有效 * 返回值说明: 系统用户角色数据集合 ***********************************/ - List listRoleUsers(String orgid, String username, String status, String level, String rolename, String isvaild); + List listRoleUsers(String orgid, String username, String status, String level, String rolename, String isvaild, String tenantId); /*********************************** @@ -64,5 +64,5 @@ public interface ISysRoleService extends IService { ***********************************/ boolean setMenuById(String id, String menuIds); - List selectRoleList(String rolename); + List selectRoleList(String rolename, String tenantId); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java index 00a28682..e5d970ac 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java @@ -132,7 +132,7 @@ public interface IUserService extends IService { boolean addUserRoles(String roleid, String userid); //Page queryUsers(String orgid, String username, Page page); - Page queryUsers(String orgid, String username, Page page); + Page queryUsers(String orgid, String username, String tenantId, Page page); /*********************************** * 用途说明:根据ID批量删除用户 @@ -174,6 +174,6 @@ public interface IUserService extends IService { *page 分页参数 * 返回值说明: 待审核用户分页列表 ************************************/ - Page queryPendingAuditUsers(Page page,String name, String regStatus); + Page queryPendingAuditUsers(Page page, String name, String regStatus, String tenantId); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java index ee671bfe..1bf6fe5d 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysLogServiceImpl.java @@ -17,10 +17,13 @@ import com.yfd.platform.utils.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.AnnotatedType; @@ -55,7 +58,7 @@ public class SysLogServiceImpl extends ServiceImpl impleme @Override public Page getLogList(String username, String optType, String startDate, - String endDate, Page page) { + String endDate, Page page, String tenantId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // 没有传username就不按此条件查询 @@ -72,6 +75,9 @@ public class SysLogServiceImpl extends ServiceImpl impleme if (parseStartDate != null && parseEndDate != null) { queryWrapper.ge(SysLog::getLogtime, parseStartDate).lt(SysLog::getLogtime, dateTime); } + if (StrUtil.isNotBlank(tenantId)) { + queryWrapper.eq(SysLog::getTenantId, tenantId); + } queryWrapper.orderByDesc(SysLog::getLogtime); return sysLogMapper.selectPage(page, queryWrapper); @@ -152,6 +158,11 @@ public class SysLogServiceImpl extends ServiceImpl impleme log.setUsername(nickname); log.setParams(getParameter(method, joinPoint.getArgs())); log.setBrowser(browser); + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes != null) { + HttpServletRequest request = attributes.getRequest(); + log.setTenantId(StrUtil.trimToNull(request.getHeader("tenant_id"))); + } String operationtype = getOperationtype(signature.getName()); log.setOpttype(operationtype); log.setLogtime(new Timestamp(System.currentTimeMillis())); diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java index af5dcad1..b3531c9e 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java @@ -64,23 +64,28 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List> getMenuButtonTree(String systemcode, String name, - String isdisplay) { + String isdisplay, + String tenantId) { List> mapList=null; List> listMap =new ArrayList<>(); if(StrUtil.isEmpty(name)){//不带名称查询,返回树结构 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("parentid", "0").eq("systemcode", systemcode).orderByAsc("orderno"); + queryWrapper.eq("parentid", "0").eq("systemcode", systemcode) + .eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId) + .orderByAsc("orderno"); mapList = this.listMaps(queryWrapper); listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); for (int i = 0; i < listMap.size(); i++) { //查询下一子集 List> childList = child(listMap.get(i).get( - "id").toString(), systemcode, name, null, null); + "id").toString(), systemcode, name, null, null, tenantId); listMap.get(i).put("children", childList); //添加新列 子集 } }else{ //根据菜单名称查询,直接返回类别 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.like("name", name).eq("systemcode", systemcode).orderByAsc("name"); + queryWrapper.like("name", name).eq("systemcode", systemcode) + .eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId) + .orderByAsc("name"); mapList = this.listMaps(queryWrapper); listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); } @@ -97,7 +102,8 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List> getMenuTree(String systemcode, String name, - String isdisplay) { + String isdisplay, + String tenantId) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StrUtil.isNotEmpty(isdisplay)) { queryWrapper.eq("isdisplay", isdisplay); @@ -107,11 +113,11 @@ public class SysMenuServiceImpl extends ServiceImpl impl //根据系统 ,类型不为2 显示,序号 正序排序 queryWrapper.eq("parentid", "0").eq("systemcode", systemcode).ne( - "type", "2").orderByAsc("orderno"); + "type", "2").eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId).orderByAsc("orderno"); List> listMap = this.listMaps(queryWrapper); for (int i = 0; i < listMap.size(); i++) { List> childList = child(listMap.get(i).get( - "id").toString(), systemcode, name, isdisplay, "2");//查询下一子集 + "id").toString(), systemcode, name, isdisplay, "2", tenantId);//查询下一子集 listMap.get(i).put("children", childList); //添加新列 子集 } return listMap; @@ -128,10 +134,11 @@ public class SysMenuServiceImpl extends ServiceImpl impl ***********************************/ private List> child(String parentid, String systemcode, String name, - String isdisplay, String type) { + String isdisplay, String type, String tenantId) { List> mapList; QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parentid", parentid).eq("systemcode", systemcode); + queryWrapper.eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId); //根据上级id 系统 查询 if (StrUtil.isNotEmpty(type)) { queryWrapper.ne("type", type); @@ -146,7 +153,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl for (int i = 0; i < listMap.size(); i++) { //遍历表数据 List> childList = child(listMap.get(i).get("id").toString(), systemcode - , name, isdisplay, type); //循环获取下一子集 + , name, isdisplay, type, tenantId); //循环获取下一子集 listMap.get(i).put("children", childList); //添加新列 子集 } } @@ -165,20 +172,24 @@ public class SysMenuServiceImpl extends ServiceImpl impl String parentId = sysMenu.getParentid(); QueryWrapper queryWrapper = new QueryWrapper<>(); //根据上级id 查询到总数 并累加 - long orderno = this.count(queryWrapper.eq("parentid", - parentId)) + 1L; + queryWrapper.eq("parentid", parentId) + .eq(StrUtil.isNotBlank(sysMenu.getTenantId()), "tenant_id", sysMenu.getTenantId()); + long orderno = this.count(queryWrapper) + 1L; // 生成排序号 sysMenu.setOrderno((int) orderno); // 生成编号 QueryWrapper queryMaxCode = new QueryWrapper<>(); - queryMaxCode.eq("parentid", parentId); + queryMaxCode.eq("parentid", parentId) + .eq(StrUtil.isNotBlank(sysMenu.getTenantId()), "tenant_id", sysMenu.getTenantId()); // 使用 Oracle 兼容的 NVL 函数处理空值 List maxList = this.listObjs( queryMaxCode.select("NVL(MAX(code), '0') as code") .eq("systemcode", sysMenu.getSystemcode()) ); - SysMenu parentMenu = sysMenuMapper.selectById(parentId); + SysMenu parentMenu = "0".equals(parentId) ? null : this.getOne(new LambdaQueryWrapper() + .eq(SysMenu::getId, parentId) + .eq(StrUtil.isNotBlank(sysMenu.getTenantId()), SysMenu::getTenantId, sysMenu.getTenantId())); // 最大编号转换成int类型 String maxCode = !maxList.isEmpty() ? maxList.getFirst().toString() : "0"; int max = ObjectUtil.isEmpty(maxList) ? 0 : @@ -302,18 +313,25 @@ public class SysMenuServiceImpl extends ServiceImpl impl * 返回值说明: 是否更新成功 ***********************************/ @Override - public boolean moveOrderno(String parentid, String id, int orderno) { + public boolean moveOrderno(String parentid, String id, int orderno, String tenantId) { boolean ok = true; - SysMenu sysMenu = this.getById(id); //根据id查询原顺序号 + SysMenu sysMenu = this.getOne(new LambdaQueryWrapper() + .eq(SysMenu::getId, id) + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, tenantId)); //根据id查询原顺序号 + if (sysMenu == null) { + return false; + } if (sysMenu.getOrderno() > orderno) { ok = sysMenuMapper.upMoveOrderno(parentid, sysMenu.getOrderno(), - orderno); //根据 父级id 小于原序号 大于等于更改序号 + orderno, tenantId); //根据 父级id 小于原序号 大于等于更改序号 } else { ok = sysMenuMapper.downMoveOrderno(parentid, sysMenu.getOrderno() - , orderno); //根据 父级id 大于原序号 小于等于更改序号 + , orderno, tenantId); //根据 父级id 大于原序号 小于等于更改序号 } UpdateWrapper updateWrapper = new UpdateWrapper<>(); - ok = ok && this.update(updateWrapper.eq("id", id).set("orderno", + ok = ok && this.update(updateWrapper.eq("id", id) + .eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId) + .set("orderno", orderno)); //根据 id修改序号 return ok; } @@ -345,8 +363,9 @@ public class SysMenuServiceImpl extends ServiceImpl impl } QueryWrapper queryWrapper = new QueryWrapper<>(); //根据上级id 查询 根据 orderno 正序排序 - queryWrapper.eq("parentid", sysMenu.getParentid()).orderByAsc( - "orderno"); + queryWrapper.eq("parentid", sysMenu.getParentid()) + .eq(StrUtil.isNotBlank(sysMenu.getTenantId()), "tenant_id", sysMenu.getTenantId()) + .orderByAsc("orderno"); List list = this.list(queryWrapper); for (int i = 0; i < list.size(); i++) { SysMenu menu = list.get(i); @@ -409,16 +428,20 @@ public class SysMenuServiceImpl extends ServiceImpl impl * 返回值说明: 返回菜单树 ***********************************/ @Override - public List> getMenuTree(String id) { + public List> getMenuTree(String id, String tenantId) { // 根据id获取菜单 //List sysMenus = sysMenuMapper.selectMenuByUserId(id); List sysMenuList; if (StrUtil.isBlank(id)) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - sysMenuList = this.list(queryWrapper.eq(SysMenu::getIsdisplay, "1").ne(SysMenu::getType, "2").eq(SysMenu::getSystemcode, "1").orderByAsc(SysMenu::getOrderno)); + sysMenuList = this.list(queryWrapper.eq(SysMenu::getIsdisplay, "1") + .ne(SysMenu::getType, "2") +// .eq(SysMenu::getSystemcode, "1") + .eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, tenantId) + .orderByAsc(SysMenu::getOrderno)); } else { - sysMenuList = sysMenuMapper.selectMenuByUserId(id); + sysMenuList = sysMenuMapper.selectMenuByUserId(id, tenantId); } // 将 SysMenu 转换为 Map 并构建树 List> list = sysMenuList.stream() @@ -451,7 +474,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl * 返回值说明: 菜单结构树集合 ***********************************/ @Override - public List> permissionAssignment(String code,String roleId) { + public List> permissionAssignment(String code, String roleId, String tenantId) { // String code = sysMenuMapper.getSystemCodeById(roleId); // if (code == null) { @@ -459,13 +482,13 @@ public class SysMenuServiceImpl extends ServiceImpl impl // } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysMenu::getSystemcode, code).select(SysMenu::getId, - SysMenu::getParentid, SysMenu::getName).orderByAsc + SysMenu::getParentid, SysMenu::getName).eq(StrUtil.isNotBlank(tenantId), SysMenu::getTenantId, tenantId).orderByAsc (SysMenu::getOrderno); List> mapList = sysMenuMapper.selectMaps(queryWrapper); List> listAll = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList); List listRole = - sysMenuMapper.selectMenuByRoleId(roleId); + sysMenuMapper.selectMenuByRoleId(roleId, tenantId); for (Map map : listAll) { String id = (String) map.get("id"); if (listRole.contains(id)) { diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java index bb956d39..6e20d9dc 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysOrganizationServiceImpl.java @@ -56,7 +56,8 @@ public class SysOrganizationServiceImpl extends ServiceImpl> getOrgTree(String parentid, - String params) { + String params, + String tenantId) { SysUser userInfo = userService.getUserInfo(); // 构建权限过滤条件 @@ -75,7 +76,9 @@ public class SysOrganizationServiceImpl extends ServiceImpl list = sysOrganizationMapper.selectList( - new LambdaQueryWrapper().in(SysOrganization::getId, stringList)); + new LambdaQueryWrapper() + .in(SysOrganization::getId, stringList) + .eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, tenantId)); for (SysOrganization org : list) { if (org.getParentid() != null) { allowedOrgIds.add(org.getParentid()); @@ -90,6 +93,9 @@ public class SysOrganizationServiceImpl extends ServiceImpl() + .eq(SysOrganization::getId, sysOrganization.getParentid()) + .eq(StrUtil.isNotBlank(sysOrganization.getTenantId()), SysOrganization::getTenantId, sysOrganization.getTenantId())); queryWrapper.eq("parentid", sysOrganization.getParentid()); } else { //默认 填写父级id为0 sysOrganization.setParentid("0"); queryWrapper.eq("parentid", "0"); } + if (StrUtil.isNotBlank(sysOrganization.getTenantId())) { + queryWrapper.eq("tenant_id", sysOrganization.getTenantId()); + } List max = this.listObjs(queryWrapper); //判断查询是否存在 存在转换成 int 类型并给 codeMax 替换值 if (!max.isEmpty() && max.getFirst() != null) { @@ -233,7 +244,8 @@ public class SysOrganizationServiceImpl extends ServiceImpl getOrganizationById(String id, - String orgName) { + String orgName, + String tenantId) { SysUser userInfo = userService.getUserInfo(); // 收集所有允许的组织ID @@ -258,6 +270,7 @@ public class SysOrganizationServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysOrganization::getParentid, id); + queryWrapper.eq(StrUtil.isNotBlank(tenantId), SysOrganization::getTenantId, tenantId); if (StrUtil.isNotBlank(orgName)) { queryWrapper.like(SysOrganization::getOrgname, orgName); @@ -281,7 +294,7 @@ public class SysOrganizationServiceImpl extends ServiceImpl> getOrgScopeTree(String roleId) { + public List> getOrgScopeTree(String roleId, String tenantId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if(!"admin".equals(SecurityUtils.getCurrentUsername())){ @@ -300,11 +313,17 @@ public class SysOrganizationServiceImpl extends ServiceImpl> mapList = this.listMaps(queryWrapper); List> listMaps = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysOrganization.class, mapList); // 获取当前角色 - SysRole sysRole = sysRoleMapper.selectById(roleId); + SysRole sysRole = sysRoleMapper.selectOne(new QueryWrapper() + .eq("id", roleId) + .eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId)); + if (sysRole == null) { + return new ArrayList<>(); + } String orgscope = sysRole.getOrgscope(); List ids = new ArrayList<>(); if (StrUtil.isNotBlank(orgscope)) { diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java index f06dbd84..6b14175b 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java @@ -47,6 +47,7 @@ public class SysRoleServiceImpl extends ServiceImpl impl int codeMax = 0; DecimalFormat df = new DecimalFormat("000");//四位数字编号 QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotBlank(sysRole.getTenantId()), "tenant_id", sysRole.getTenantId()); List max = this.listObjs(queryWrapper.select("MAX(rolecode) " + "rolecode"));// 查询最大的编号 // 存在转换成 int 类型并给 codeMax 替换值 @@ -140,9 +141,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl @Override public List listRoleUsers(String orgid, String username, String status, String level, - String rolename, String isvaild) { + String rolename, String isvaild, String tenantId) { return roleMapper.listRoleUsers(orgid, username, status, level, - rolename, isvaild); + rolename, isvaild, tenantId); } /*********************************** @@ -167,8 +168,8 @@ public class SysRoleServiceImpl extends ServiceImpl impl } @Override - public List selectRoleList(String rolename) { - return roleMapper.selectRoleList(rolename); + public List selectRoleList(String rolename, String tenantId) { + return roleMapper.selectRoleList(rolename, tenantId); } } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 0b108700..0e157cd4 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -567,9 +567,10 @@ public class UserServiceImpl extends ServiceImpl impleme @Override public Page queryUsers(String orgid, String username, + String tenantId, Page page) { Page mapPage = sysUserMapper.queryUsers(orgid, - username, page); + username, tenantId, page); mapPage.getRecords().forEach(record -> { String id = record.getId(); List sysRoles = sysRoleMapper.getRoleByUserId(id); @@ -651,10 +652,11 @@ public class UserServiceImpl extends ServiceImpl impleme } @Override - public Page queryPendingAuditUsers(Page page, String name, String regStatus) { + public Page queryPendingAuditUsers(Page page, String name, String regStatus, String tenantId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SysUser::getRegStatus, "PENDING", "APPROVED", "REJECTED"); queryWrapper.eq(ObjectUtil.isNotEmpty(regStatus), SysUser::getRegStatus, regStatus); + queryWrapper.eq(StrUtil.isNotBlank(tenantId), SysUser::getTenantId, tenantId); queryWrapper.and(StrUtil.isNotBlank(name), wrapper -> wrapper.like(SysUser::getNickname, name) .or() diff --git a/backend/src/main/resources/mapper/system/SysMenuMapper.xml b/backend/src/main/resources/mapper/system/SysMenuMapper.xml index 93934a45..a65f0c7f 100644 --- a/backend/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/backend/src/main/resources/mapper/system/SysMenuMapper.xml @@ -4,12 +4,26 @@ - update sys_menu set orderno=orderno+1 where parentid=#{parentid} and orderno < #{Orderno} and orderno >= #{upOrderno} + update sys_menu + set orderno=orderno+1 + where parentid=#{parentid} + and orderno < #{Orderno} + and orderno >= #{upOrderno} + + and tenant_id = #{tenantId} + - update sys_menu SET orderno=orderno-1 where parentid=#{parentid} and orderno > #{Orderno} and orderno <= #{downOrderno} + update sys_menu + SET orderno=orderno-1 + where parentid=#{parentid} + and orderno > #{Orderno} + and orderno <= #{downOrderno} + + and tenant_id = #{tenantId} + diff --git a/backend/src/main/resources/mapper/system/SysRoleMapper.xml b/backend/src/main/resources/mapper/system/SysRoleMapper.xml index 8ebae211..8e56ec4f 100644 --- a/backend/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/backend/src/main/resources/mapper/system/SysRoleMapper.xml @@ -86,6 +86,10 @@ and c.isvaild=#{isvaild} + + and b.tenant_id = #{tenantId} + and c.tenant_id = #{tenantId} + ORDER BY c.level,b.orgid,b.code @@ -129,6 +133,9 @@ AND r.rolename LIKE '%' || #{rolename} || '%' + + AND r.tenant_id = #{tenantId} + AND r."LEVEL" != '1' ORDER BY r."LEVEL" ASC, lastmodifydate ASC diff --git a/backend/src/main/resources/mapper/system/SysUserMapper.xml b/backend/src/main/resources/mapper/system/SysUserMapper.xml index 4d381b21..5600fd5d 100644 --- a/backend/src/main/resources/mapper/system/SysUserMapper.xml +++ b/backend/src/main/resources/mapper/system/SysUserMapper.xml @@ -67,6 +67,7 @@ u.phone, u.avatar, u.orgid, + u.tenant_id AS tenantId, u.status, u.lastmodifier, u.lastmodifydate @@ -82,6 +83,9 @@ and u.username LIKE '%' || #{username} || '%' + + and u.tenant_id = #{tenantId} + ORDER BY u.lastmodifydate DESC