From 3d48fb05b4435fa80345988cbfc9fc53b0f93eae Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 13 May 2026 13:35:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=88=B0=E6=95=B0?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/JwtAuthenticationTokenFilter.java | 5 + .../controller/FishDraftDataController.java | 12 ++ .../data/domain/vo/FishStatisticsVO.java | 32 ++++ .../data/mapper/FishStatisticsMapper.java | 17 +++ .../data/service/IFishStatisticsService.java | 10 ++ .../impl/FishStatisticsServiceImpl.java | 66 +++++++++ .../src/main/resources/application-prod.yml | 2 +- .../mapper/data/FishStatisticsMapper.xml | 137 ++++++++++++++++++ 8 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/data/domain/vo/FishStatisticsVO.java create mode 100644 backend/src/main/java/com/yfd/platform/data/mapper/FishStatisticsMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/data/service/IFishStatisticsService.java create mode 100644 backend/src/main/java/com/yfd/platform/data/service/impl/FishStatisticsServiceImpl.java create mode 100644 backend/src/main/resources/mapper/data/FishStatisticsMapper.xml diff --git a/backend/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java b/backend/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java index bcb79c0..2f3c035 100644 --- a/backend/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java +++ b/backend/src/main/java/com/yfd/platform/config/JwtAuthenticationTokenFilter.java @@ -11,6 +11,7 @@ import com.yfd.platform.constant.Constant; import com.yfd.platform.system.domain.LoginUser; import com.yfd.platform.system.domain.Message; import com.yfd.platform.system.service.IMessageService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; @@ -25,6 +26,7 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @Component +@Slf4j public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Autowired @@ -36,6 +38,9 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { FilterChain filterChain) throws ServletException, IOException { //获取token String uri = httpServletRequest.getRequestURI(); + if(uri.contains("/data/fishDraft/importZip")){ + log.info("请求地址:{}", uri); + } String token = httpServletRequest.getHeader("token"); if (StrUtil.isEmpty(token) || "/user/login".equals(uri)) { filterChain.doFilter(httpServletRequest, httpServletResponse); diff --git a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java index d4ce024..539ff86 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java @@ -26,9 +26,11 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.data.domain.*; import com.yfd.platform.data.domain.vo.FishDraftDataVO; +import com.yfd.platform.data.domain.vo.FishStatisticsVO; import com.yfd.platform.data.service.AttachmentUploadService; import com.yfd.platform.data.service.IFishDraftDataService; import com.yfd.platform.data.service.IFishImportService; +import com.yfd.platform.data.service.IFishStatisticsService; import com.yfd.platform.data.service.IImportTaskService; import com.yfd.platform.data.utils.ZipFileUtil; import com.yfd.platform.utils.KendoUtil; @@ -77,6 +79,9 @@ public class FishDraftDataController { @Resource private AttachmentUploadService attachmentUploadService; + @Resource + private IFishStatisticsService fishStatisticsService; + @Autowired private ThreadPoolTaskExecutor taskExecutor; @@ -100,6 +105,13 @@ public class FishDraftDataController { return ResponseResult.successData(list); } + @PostMapping("/statistics") + @Operation(summary = "过鱼到数统计(按用户月度汇总,支持流域/电站多选过滤)") + public ResponseResult statistics(@RequestBody DataSourceRequest dataSourceRequest) { + Page result = fishStatisticsService.queryPage(dataSourceRequest); + return ResponseResult.successData(result); + } + @GetMapping("/getById") @Operation(summary = "根据ID查询") public ResponseResult getById(@RequestParam String id) { 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 new file mode 100644 index 0000000..4459c9a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/data/domain/vo/FishStatisticsVO.java @@ -0,0 +1,32 @@ +package com.yfd.platform.data.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class FishStatisticsVO implements Serializable { + + private static final long serialVersionUID = 1L; + + private String userId; + + private String realName; + + private String phone; + + private String contact; + + private String basinNames; + + private String stationNames; + + private String reportMonth; + + private Date minStrdt; + + private Date maxEnddt; + + private Integer totalFcnt; +} \ No newline at end of file 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 new file mode 100644 index 0000000..aeae61e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/data/mapper/FishStatisticsMapper.java @@ -0,0 +1,17 @@ +package com.yfd.platform.data.mapper; + +import com.yfd.platform.data.domain.vo.FishStatisticsVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface FishStatisticsMapper { + + List queryStatistics(@Param("basinNames") List basinNames, + @Param("stationNames") List stationNames, + @Param("startRow") int startRow, + @Param("endRow") int endRow); + + int countStatistics(@Param("basinNames") List basinNames, + @Param("stationNames") List stationNames); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/service/IFishStatisticsService.java b/backend/src/main/java/com/yfd/platform/data/service/IFishStatisticsService.java new file mode 100644 index 0000000..514d485 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/data/service/IFishStatisticsService.java @@ -0,0 +1,10 @@ +package com.yfd.platform.data.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.data.domain.vo.FishStatisticsVO; + +public interface IFishStatisticsService { + + Page queryPage(DataSourceRequest dataSourceRequest); +} \ 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 new file mode 100644 index 0000000..7778c5f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishStatisticsServiceImpl.java @@ -0,0 +1,66 @@ +package com.yfd.platform.data.service.impl; + +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.data.domain.vo.FishStatisticsVO; +import com.yfd.platform.data.mapper.FishStatisticsMapper; +import com.yfd.platform.data.service.IFishStatisticsService; +import com.yfd.platform.utils.KendoUtil; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Service +@Slf4j +public class FishStatisticsServiceImpl implements IFishStatisticsService { + + @Resource + private FishStatisticsMapper fishStatisticsMapper; + + @Override + public Page queryPage(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String basinNamesStr = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "basinNames"); + String stationNamesStr = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stationNames"); + + List basinNames = parseFilterList(basinNamesStr); + List stationNames = parseFilterList(stationNamesStr); + + int take = dataSourceRequest.getTake(); + int skip = dataSourceRequest.getSkip(); + if (take <= 0) { + take = 20; + } + + int startRow = skip; + int endRow = skip + take; + + List records = fishStatisticsMapper.queryStatistics( + basinNames, stationNames, startRow, endRow); + + int total = fishStatisticsMapper.countStatistics(basinNames, stationNames); + + Page page = new Page<>(); + page.setRecords(records); + page.setTotal(total); + page.setSize(take); + page.setCurrent(skip / take + 1L); + + return page; + } + + private List parseFilterList(String filterValue) { + if (StrUtil.isBlank(filterValue)) { + return new ArrayList<>(); + } + return Arrays.asList(filterValue.split(",")); + } +} \ No newline at end of file diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml index 9c33cd0..15a029b 100644 --- a/backend/src/main/resources/application-prod.yml +++ b/backend/src/main/resources/application-prod.yml @@ -116,7 +116,7 @@ spring: # 关键:文件超过 1KB 就写入磁盘临时文件,避免内存积压 file-size-threshold: 1KB # 指定临时目录(确保 Docker 容器内该目录可写且有空间) - location: /qgc-platform/tmp/zip_import_temp + location: /tmp/upload logging: file: name: logs/platform-dev.log diff --git a/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml new file mode 100644 index 0000000..1709c26 --- /dev/null +++ b/backend/src/main/resources/mapper/data/FishStatisticsMapper.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + 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') + + 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') + ), + 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 + ), + 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') + ) + 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 + JOIN QGC_REFA.SYS_USER su + ON us.USER_ID = su.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 + + + + + + + \ No newline at end of file