diff --git a/backend/src/main/java/com/yfd/platform/config/ProdApiPrefixFilter.java b/backend/src/main/java/com/yfd/platform/config/ProdApiPrefixFilter.java deleted file mode 100644 index 4c1680a..0000000 --- a/backend/src/main/java/com/yfd/platform/config/ProdApiPrefixFilter.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.yfd.platform.config; - -import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.RequestDispatcher; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; -import jakarta.servlet.annotation.WebFilter; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * 将以 /prod-api/ 开头的请求转发到去掉前缀的真实后端接口路径。 - * 例如:/prod-api/user/code -> /user/code - * 这样可以兼容前端生产环境仍使用 /prod-api 作为网关前缀的情况。 - */ -@WebFilter(urlPatterns = "/prod-api/*", filterName = "prodApiPrefixFilter") -public class ProdApiPrefixFilter implements Filter { - - private static final String PREFIX = "/prod-api"; - - @Override - public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { - if (!(req instanceof HttpServletRequest) || !(res instanceof HttpServletResponse)) { - chain.doFilter(req, res); - return; - } - - HttpServletRequest request = (HttpServletRequest) req; - String uri = request.getRequestURI(); - - // 仅拦截 /prod-api/* 的接口请求并进行内部 forward - if (uri.startsWith(PREFIX + "/")) { - String forwardUri = uri.substring(PREFIX.length()); - RequestDispatcher dispatcher = request.getRequestDispatcher(forwardUri); - dispatcher.forward(req, res); - return; - } - - chain.doFilter(req, res); - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/domain/vo/FishStatisticsVO.java b/backend/src/main/java/com/yfd/platform/data/domain/vo/FishStatisticsVO.java index 4459c9a..17d4572 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/vo/FishStatisticsVO.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/vo/FishStatisticsVO.java @@ -22,6 +22,10 @@ public class FishStatisticsVO implements Serializable { private String stationNames; + private String basinCode; + + private String stationCode; + private String reportMonth; private Date minStrdt; diff --git a/backend/src/main/java/com/yfd/platform/data/mapper/FishStatisticsMapper.java b/backend/src/main/java/com/yfd/platform/data/mapper/FishStatisticsMapper.java index aeae61e..47a44ec 100644 --- a/backend/src/main/java/com/yfd/platform/data/mapper/FishStatisticsMapper.java +++ b/backend/src/main/java/com/yfd/platform/data/mapper/FishStatisticsMapper.java @@ -7,11 +7,11 @@ import java.util.List; public interface FishStatisticsMapper { - List queryStatistics(@Param("basinNames") List basinNames, - @Param("stationNames") List stationNames, + List queryStatistics(@Param("basinCode") String basinCode, + @Param("stationCode") String stationCode, @Param("startRow") int startRow, @Param("endRow") int endRow); - int countStatistics(@Param("basinNames") List basinNames, - @Param("stationNames") List stationNames); + int countStatistics(@Param("basinCode") String basinCode, + @Param("stationCode") String stationCode); } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishStatisticsServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishStatisticsServiceImpl.java index 7778c5f..2b43bbe 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishStatisticsServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishStatisticsServiceImpl.java @@ -28,11 +28,11 @@ public class FishStatisticsServiceImpl implements IFishStatisticsService { public Page queryPage(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - String basinNamesStr = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "basinNames"); - String stationNamesStr = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stationNames"); + String basinNamesStr = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "basinCode"); + String stationNamesStr = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stationCode"); - List basinNames = parseFilterList(basinNamesStr); - List stationNames = parseFilterList(stationNamesStr); +// List basinNames = parseFilterList(basinNamesStr); +// List stationNames = parseFilterList(stationNamesStr); int take = dataSourceRequest.getTake(); int skip = dataSourceRequest.getSkip(); @@ -44,9 +44,9 @@ public class FishStatisticsServiceImpl implements IFishStatisticsService { int endRow = skip + take; List records = fishStatisticsMapper.queryStatistics( - basinNames, stationNames, startRow, endRow); + basinNamesStr, stationNamesStr, startRow, endRow); - int total = fishStatisticsMapper.countStatistics(basinNames, stationNames); + int total = fishStatisticsMapper.countStatistics(basinNamesStr, basinNamesStr); Page page = new Page<>(); page.setRecords(records); diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml index 5e9570a..5f7dcb3 100644 --- a/backend/src/main/resources/application-devtw.yml +++ b/backend/src/main/resources/application-devtw.yml @@ -1,5 +1,8 @@ server: port: 8093 + tomcat: + connection-timeout: 300000 + max-swallow-size: 500MB spring: #应用名称 @@ -112,6 +115,9 @@ spring: multipart: max-file-size: 300MB max-request-size: 500MB + file-size-threshold: 1KB + location: /tmp/upload + resolve-lazily: true logging: file: diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml index 15a029b..9c441c1 100644 --- a/backend/src/main/resources/application-prod.yml +++ b/backend/src/main/resources/application-prod.yml @@ -1,8 +1,8 @@ server: port: 8093 tomcat: - max-http-form-post-size: 500MB # Tomcat 表单体大小限制 - connection-timeout: 120000 # 连接超时(毫秒),大文件上传需要更长 + connection-timeout: 300000 + max-swallow-size: 500MB spring: #应用名称 application: diff --git a/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml index 1709c26..1680c7b 100644 --- a/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml +++ b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml @@ -10,6 +10,8 @@ + + @@ -17,117 +19,171 @@ - WITH user_scope_detail AS ( - SELECT DISTINCT - su.ID AS USER_ID, - h.HBRVNM AS BASIN_NAME, - e.ENNM AS STATION_NAME - FROM QGC_REFA.SYS_USER su - JOIN QGC_REFA.SYS_USER_DATA_SCOPE sud - ON su.ID = sud.USER_ID - AND sud.STATUS = 1 - AND sud.ORG_TYPE = 'HBRVCD' - JOIN QGC_REFA.SD_HBRV_DIC h - ON sud.ORG_ID = h.HBRVCD - AND h.ENABLED = 1 - AND h.IS_DELETED = 0 - JOIN QGC_REFA.SD_ENGINFO_B_H e - ON e.HBRVCD = h.HBRVCD - AND e.USFL = 1 - WHERE su.STATUS = 1 - AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED') + WITH + user_scope_detail AS ( + SELECT DISTINCT + su.ID AS USER_ID, + e.STCD AS STATION_CODE, + h.HBRVCD AS BASIN_CODE, + h.HBRVNM AS BASIN_NAME, + e.ENNM AS STATION_NAME + FROM QGC_REFA.SYS_USER su + JOIN QGC_REFA.SYS_USER_DATA_SCOPE sud + ON su.ID = sud.USER_ID + AND sud.STATUS = 1 + AND sud.ORG_TYPE = 'HBRVCD' + JOIN QGC_REFA.SD_HBRV_DIC h + ON sud.ORG_ID = h.HBRVCD + AND h.ENABLED = 1 + AND h.IS_DELETED = 0 + JOIN QGC_REFA.SD_ENGINFO_B_H e + ON e.HBRVCD = h.HBRVCD + AND e.USFL = 1 + WHERE su.STATUS = 1 + AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED') - UNION + UNION - SELECT DISTINCT - su.ID AS USER_ID, - h.HBRVNM AS BASIN_NAME, - e.ENNM AS STATION_NAME - FROM QGC_REFA.SYS_USER su - JOIN QGC_REFA.SYS_USER_DATA_SCOPE sud - ON su.ID = sud.USER_ID - AND sud.STATUS = 1 - AND sud.ORG_TYPE = 'STATION' - JOIN QGC_REFA.SD_ENGINFO_B_H e - ON sud.ORG_ID = e.STCD - AND e.USFL = 1 - JOIN QGC_REFA.SD_HBRV_DIC h - ON e.HBRVCD = h.HBRVCD - AND h.ENABLED = 1 - AND h.IS_DELETED = 0 - WHERE su.STATUS = 1 - AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED') + SELECT DISTINCT + su.ID AS USER_ID, + e.STCD AS STATION_CODE, + h.HBRVCD AS BASIN_CODE, + h.HBRVNM AS BASIN_NAME, + e.ENNM AS STATION_NAME + FROM QGC_REFA.SYS_USER su + JOIN QGC_REFA.SYS_USER_DATA_SCOPE sud + ON su.ID = sud.USER_ID + AND sud.STATUS = 1 + AND sud.ORG_TYPE = 'STATION' + JOIN QGC_REFA.SD_ENGINFO_B_H e + ON sud.ORG_ID = e.STCD + AND e.USFL = 1 + JOIN QGC_REFA.SD_HBRV_DIC h + ON e.HBRVCD = h.HBRVCD + AND h.ENABLED = 1 + AND h.IS_DELETED = 0 + WHERE su.STATUS = 1 + AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED') ), - user_scope AS ( - SELECT - USER_ID, - RTRIM( - XMLAGG(XMLELEMENT(E, BASIN_NAME || ',') ORDER BY BASIN_NAME) - .EXTRACT('//text()').GETCLOBVAL(), - ',' - ) AS BASIN_NAMES, - RTRIM( - XMLAGG(XMLELEMENT(E, STATION_NAME || ',') ORDER BY STATION_NAME) - .EXTRACT('//text()').GETCLOBVAL(), - ',' - ) AS STATION_NAMES - FROM user_scope_detail - GROUP BY USER_ID + + filtered_users AS ( + SELECT DISTINCT USER_ID + FROM user_scope_detail + + + AND BASIN_CODE = #{basinCode} + + + AND STATION_CODE = #{stationCode} + + ), - fish_monthly AS ( - SELECT - CREATED_BY, - TO_CHAR(STRDT, 'YYYY-MM') AS REPORT_MONTH, - MIN(STRDT) AS MIN_STRDT, - MAX(STRDT) AS MAX_ENDDT, - SUM(FCNT) AS TOTAL_FCNT - FROM QGC_REFA.FISH_DRAFT_DATA - WHERE DELETED_FLAG = 0 AND STATUS IN ('PENDING','APPROVED') - GROUP BY CREATED_BY, TO_CHAR(STRDT, 'YYYY-MM') - ) + + distinct_basins AS ( + SELECT DISTINCT USER_ID,BASIN_CODE, BASIN_NAME + FROM user_scope_detail + WHERE USER_ID IN (SELECT USER_ID FROM filtered_users) + ), + + distinct_stations AS ( + SELECT DISTINCT USER_ID, STATION_CODE, STATION_NAME + FROM user_scope_detail + WHERE USER_ID IN (SELECT USER_ID FROM filtered_users) + ), + + basin_agg AS ( SELECT - us.USER_ID, - su.REAL_NAME, - su.PHONE, - su.NICKNAME || '/' || su.PHONE AS CONTACT, - us.BASIN_NAMES, - us.STATION_NAMES, - fm.REPORT_MONTH, - fm.MIN_STRDT, - fm.MAX_ENDDT, - fm.TOTAL_FCNT - FROM user_scope us + USER_ID, + RTRIM( + XMLAGG(XMLELEMENT(E, BASIN_NAME || ',') ORDER BY BASIN_NAME) + .EXTRACT('//text()').GETCLOBVAL(), + ',' + ) AS BASIN_NAMES, + MIN(BASIN_CODE) AS MIN_BASIN_CODE -- 辅助排序字段(VARCHAR2) + FROM distinct_basins + GROUP BY USER_ID + ), + + station_agg AS ( + SELECT + USER_ID, + RTRIM( + XMLAGG(XMLELEMENT(E, STATION_NAME || ',') ORDER BY STATION_NAME) + .EXTRACT('//text()').GETCLOBVAL(), + ',' + ) AS STATION_NAMES, + MIN(STATION_CODE) AS MIN_STATION_CODE -- 辅助排序字段(VARCHAR2) + FROM distinct_stations + GROUP BY USER_ID + ), + + fish_monthly AS ( + SELECT + CREATED_BY, + TO_CHAR(STRDT, 'YYYY-MM') AS REPORT_MONTH, + MIN(STRDT) AS MIN_STRDT, + MAX(STRDT) AS MAX_ENDDT, + SUM(FCNT) AS TOTAL_FCNT + FROM QGC_REFA.FISH_DRAFT_DATA + WHERE DELETED_FLAG = 0 + AND STATUS IN ('PENDING','APPROVED') + GROUP BY CREATED_BY, TO_CHAR(STRDT, 'YYYY-MM') + ), + + all_users AS ( + SELECT USER_ID FROM filtered_users + ) + + SELECT + u.USER_ID, + su.REAL_NAME, + su.PHONE, + su.NICKNAME || '/' || su.PHONE AS CONTACT, + ba.MIN_BASIN_CODE, + sa.MIN_STATION_CODE, + ba.BASIN_NAMES, + sa.STATION_NAMES, + fm.REPORT_MONTH, + fm.MIN_STRDT, + fm.MAX_ENDDT, + fm.TOTAL_FCNT + FROM all_users u JOIN QGC_REFA.SYS_USER su - ON us.USER_ID = su.ID + ON u.USER_ID = su.ID + LEFT JOIN basin_agg ba + ON u.USER_ID = ba.USER_ID + LEFT JOIN station_agg sa + ON u.USER_ID = sa.USER_ID LEFT JOIN fish_monthly fm - ON us.USER_ID = fm.CREATED_BY - WHERE 1 = 1 - - AND ( - - INSTR(us.BASIN_NAMES, #{name}) > 0 - - ) - - - AND ( - - INSTR(us.STATION_NAMES, #{name}) > 0 - - ) - - ORDER BY fm.REPORT_MONTH, us.USER_ID + ON u.USER_ID = fm.CREATED_BY + + + + + + + + + + + + + + + + -