From 148535c154da3e9ba5300ae19934670fc551d883 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Thu, 19 Mar 2026 16:41:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=A3=8E=E9=99=A9=E4=BB=AA?= =?UTF-8?q?=E8=A1=A8=E7=9B=98=E6=80=BB=E4=BA=BA=E6=95=B0=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/CcdiBankStatementMapper.java | 2 ++ .../impl/CcdiFileUploadServiceImpl.java | 9 +------ .../ccdi/project/CcdiBankStatementMapper.xml | 9 +++++++ .../impl/CcdiFileUploadServiceImplTest.java | 11 +++----- ...-dashboard-target-count-match-staff-fix.md | 25 +++++++++++++++++++ ...9-fix-project-target-count-match-staff.sql | 19 ++++++++++++++ 6 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 docs/reports/implementation/2026-03-19-risk-dashboard-target-count-match-staff-fix.md create mode 100644 sql/migration/2026-03-19-fix-project-target-count-match-staff.sql diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapper.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapper.java index f3d0601e..7070ac8e 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapper.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/mapper/CcdiBankStatementMapper.java @@ -38,4 +38,6 @@ public interface CcdiBankStatementMapper extends BaseMapper { CcdiBankStatementDetailVO selectStatementDetailById(@Param("bankStatementId") Long bankStatementId); CcdiBankStatementFilterOptionsVO selectFilterOptions(@Param("projectId") Long projectId); + + Integer countMatchedStaffCountByProjectId(@Param("projectId") Long projectId); } diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java index 3441781c..02f18376 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java @@ -2,7 +2,6 @@ package com.ruoyi.ccdi.project.service.impl; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.ccdi.project.domain.CcdiProject; import com.ruoyi.ccdi.project.domain.enums.TriggerType; @@ -954,13 +953,7 @@ public class CcdiFileUploadServiceImpl implements ICcdiFileUploadService { return; } - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.select("DISTINCT TRIM(cret_no)"); - queryWrapper.eq("project_id", projectId); - queryWrapper.isNotNull("cret_no"); - queryWrapper.apply("TRIM(cret_no) <> ''"); - - int targetCount = bankStatementMapper.selectObjs(queryWrapper).size(); + int targetCount = bankStatementMapper.countMatchedStaffCountByProjectId(projectId); project.setTargetCount(targetCount); projectMapper.updateById(project); } diff --git a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml index cc7ae5fa..d1a0c1db 100644 --- a/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml +++ b/ccdi-project/src/main/resources/mapper/ccdi/project/CcdiBankStatementMapper.xml @@ -115,6 +115,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select="selectOurAccountOptions"/> + + CASE WHEN bs.TRX_DATE IS NULL OR TRIM(bs.TRX_DATE) = '' THEN NULL diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java index efa99272..cebe32f7 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java @@ -287,7 +287,7 @@ class CcdiFileUploadServiceImplTest { CcdiProject project = new CcdiProject(); project.setProjectId(PROJECT_ID); when(projectMapper.selectById(PROJECT_ID)).thenReturn(project); - when(bankStatementMapper.selectObjs(any())).thenReturn(List.of("110101199001018888")); + when(bankStatementMapper.countMatchedStaffCountByProjectId(PROJECT_ID)).thenReturn(1); when(lsfxClient.uploadFile(eq(LSFX_PROJECT_ID), any())).thenReturn(buildUploadResponse()); when(lsfxClient.checkParseStatus(LSFX_PROJECT_ID, String.valueOf(LOG_ID))) @@ -375,7 +375,7 @@ class CcdiFileUploadServiceImplTest { when(recordMapper.selectById(RECORD_ID)).thenReturn(record); when(lsfxClient.deleteFiles(any())).thenReturn(buildDeleteFilesResponse()); when(projectMapper.selectById(PROJECT_ID)).thenReturn(project); - when(bankStatementMapper.selectObjs(any())).thenReturn(List.of("110101199001018888", "110101199001019999")); + when(bankStatementMapper.countMatchedStaffCountByProjectId(PROJECT_ID)).thenReturn(2); when(recordMapper.updateById(any(CcdiFileUploadRecord.class))).thenReturn(1); String result = service.deleteFileUploadRecord(RECORD_ID, 9527L); @@ -562,14 +562,11 @@ class CcdiFileUploadServiceImplTest { } @Test - void refreshProjectTargetCount_shouldUpdateProjectWithDistinctIdCardCount() { + void refreshProjectTargetCount_shouldUseMatchedStaffCountOnly() { CcdiProject project = new CcdiProject(); project.setProjectId(PROJECT_ID); when(projectMapper.selectById(PROJECT_ID)).thenReturn(project); - when(bankStatementMapper.selectObjs(any())).thenReturn(List.of( - "110101199001018888", - "110101199001019999" - )); + when(bankStatementMapper.countMatchedStaffCountByProjectId(PROJECT_ID)).thenReturn(2); ReflectionTestUtils.invokeMethod(service, "refreshProjectTargetCount", PROJECT_ID); diff --git a/docs/reports/implementation/2026-03-19-risk-dashboard-target-count-match-staff-fix.md b/docs/reports/implementation/2026-03-19-risk-dashboard-target-count-match-staff-fix.md new file mode 100644 index 00000000..7616d078 --- /dev/null +++ b/docs/reports/implementation/2026-03-19-risk-dashboard-target-count-match-staff-fix.md @@ -0,0 +1,25 @@ +# 风险仪表盘总人数员工匹配口径修正记录 + +**日期**: 2026-03-19 +**范围**: 后端 + +## 口径修正 + +- 原修复将 `target_count` 按项目流水中全部去重身份证号回写 +- 用户确认后的正确口径为: + - 统计 `ccdi_bank_statement.cret_no` + - 仅保留能匹配 `ccdi_base_staff.id_card` 的记录 + - 再按去重身份证号数量回写 `ccdi_project.target_count` + +## 本次修改 + +1. 在 `CcdiBankStatementMapper` 新增“按项目统计匹配员工主数据后的去重身份证号人数”查询 +2. 在 `CcdiFileUploadServiceImpl.refreshProjectTargetCount` 中改为调用该查询 +3. 保持导入成功、删除成功后的目标人数刷新时机不变,仅修正统计口径 +4. 新增增量脚本 `sql/migration/2026-03-19-fix-project-target-count-match-staff.sql`,用于修正已错误回填的项目人数 +5. 调整单元测试,锁定“只统计能匹配员工主数据的人数”这一行为 + +## 验证 + +- 执行:`mvn -pl ccdi-project -Dtest=CcdiFileUploadServiceImplTest test` +- 结果:通过 diff --git a/sql/migration/2026-03-19-fix-project-target-count-match-staff.sql b/sql/migration/2026-03-19-fix-project-target-count-match-staff.sql new file mode 100644 index 00000000..d2ec4276 --- /dev/null +++ b/sql/migration/2026-03-19-fix-project-target-count-match-staff.sql @@ -0,0 +1,19 @@ +-- 修正项目目标人数口径 +-- 正确口径:银行流水中的身份证号在员工主数据中存在时,按去重身份证号数量回写 ccdi_project.target_count + +UPDATE ccdi_project project +LEFT JOIN ( + SELECT + bs.project_id, + COUNT(DISTINCT TRIM(bs.cret_no)) AS target_count + FROM ccdi_bank_statement bs + INNER JOIN ccdi_base_staff staff + ON staff.id_card = bs.cret_no + WHERE bs.cret_no IS NOT NULL + AND TRIM(bs.cret_no) <> '' + GROUP BY bs.project_id +) stats ON stats.project_id = project.project_id +SET project.target_count = COALESCE(stats.target_count, 0), + project.update_by = 'system', + project.update_time = NOW() +WHERE project.del_flag = '0';