From c3cc3898b494f74ad9aa1b90cb588c5f7d7efaa5 Mon Sep 17 00:00:00 2001 From: lroyia <814876716@qq.com> Date: Wed, 15 Apr 2026 11:43:11 +0800 Subject: [PATCH] =?UTF-8?q?XQ-20260414-002:=20=E4=BF=AE=E5=A4=8D=E5=B7=B2?= =?UTF-8?q?=E5=8A=9E=E5=88=97=E8=A1=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复已办列表显示全自治区记录的问题 - Controller层始终设置机构过滤参数 - 默认childUnitSwitch为0(不查看下级) - 增加isAutonomousRegion参数判断自治区账号 2. 修复已办列表重复显示同一业务多条记录的问题 - 使用ROW_NUMBER()窗口函数按BIZSEQID去重 - 每笔业务只显示最新环节的一条记录 涉及文件: - TaskController.java: finishTaskUnionPage方法 - TSTaskListMapper.xml: selectFinishUnionTaskPage查询 --- devdoc/XQ-20260414-002_失败报告.md | 27 +++ .../XQ-20260414-002_开发思路与改动.md | 209 ++++++++++++++++++ devdoc/XQ-20260414-002_需求清单.md | 28 +++ .../business/controller/TaskController.java | 16 +- .../aiccs/business/TSTaskListMapper.xml | 170 ++++++++------ 5 files changed, 383 insertions(+), 67 deletions(-) create mode 100644 devdoc/XQ-20260414-002_失败报告.md create mode 100644 devdoc/XQ-20260414-002_开发思路与改动.md create mode 100644 devdoc/XQ-20260414-002_需求清单.md diff --git a/devdoc/XQ-20260414-002_失败报告.md b/devdoc/XQ-20260414-002_失败报告.md new file mode 100644 index 0000000..e19382f --- /dev/null +++ b/devdoc/XQ-20260414-002_失败报告.md @@ -0,0 +1,27 @@ +# XQ-20260414-002 失败报告 + +## 状态 +- **开发状态**: 已完成 +- **编译状态**: 未验证(环境无mvn) +- **推送状态**: 待推送 + +## 尝试修复的问题 + +### 问题1: 已办列表显示全自治区记录 +- **根本原因**: 当 `childUnitSwitch` 参数不存在时,SQL子查询没有任何过滤条件,返回所有记录 +- **修复方案**: + 1. Controller层始终设置机构过滤参数 + 2. 默认 `childUnitSwitch = "0"`(不查看下级) + 3. 增加 `isAutonomousRegion` 参数判断是否为自治区账号 + 4. Mapper XML中根据这些参数正确过滤 + +### 问题2: 已办列表重复显示同一业务的多条记录 +- **根本原因**: 每笔业务在TShwfProcessNode表中有多条记录(每个环节一条),DISTINCT无法合并 +- **修复方案**: 使用窗口函数 `ROW_NUMBER() OVER (PARTITION BY BIZSEQID ORDER BY LAUPTIME DESC)` 去重,只取每笔业务最新的一条记录 + +## 未解决问题 +暂无 + +## 备注 +- 本次修改涉及TaskController.java和TSTaskListMapper.xml两个文件 +- 由于环境限制,未能执行Maven编译验证,建议在IDE中验证后推送 diff --git a/devdoc/XQ-20260414-002_开发思路与改动.md b/devdoc/XQ-20260414-002_开发思路与改动.md new file mode 100644 index 0000000..152752c --- /dev/null +++ b/devdoc/XQ-20260414-002_开发思路与改动.md @@ -0,0 +1,209 @@ +# XQ-20260414-002 开发思路与改动 + +## 问题分析 + +### 问题1根因分析 +查看 `TSTaskListMapper.xml` 的 `selectFinishUnionTaskPage` 查询: + +```sql +SELECT DISTINCT ta.TASKLISTID, ta.WORKFLOWID, ... +FROM TSTaskList ta +LEFT JOIN TShwfProcessNode n ON ta.WorkflowID = n.processid +WHERE ta.BUSSTATUS = 2 +AND ta.WORKFLOWID IN ( + SELECT DISTINCT WORKFLOWID FROM tsopinion tso + + + -- 有 childUnitSwitch 时的过滤逻辑 + + -- 注意:如果 childUnitSwitch 为空或不存在,整个 WHERE 块不生效 + -- 导致子查询返回 tsopinion 表中所有 WORKFLOWID + +) +``` + +**根本原因**:当 `childUnitSwitch` 参数不存在时,子查询没有任何过滤条件,返回 tsopinion 表中所有 WORKFLOWID,导致已办列表显示全自治区的记录。 + +### 问题2根因分析 +查询结果中每条 TASKLIST 记录会对应 TShwfProcessNode 表中的多个节点记录(每个环节一个),而 DISTINCT 无法将同一业务的多条记录合并成一条。 + +--- + +## 解决方案 + +### 修复1: 已办列表按机构范围过滤 + +**修改文件**: `TaskController.java` (第280行附近 `finishTaskUnionPage` 方法) + +**当前逻辑**: +```java +if (customParamMap != null && customParamMap.containsKey("childUnitSwitch")) { + // 只有当 childUnitSwitch 存在时才设置机构过滤参数 +} +``` + +**修改后逻辑**: +```java +// 获取当前用户机构信息 +String myOrgNumber = StringUtils.clearRegionZero(curUser.getRegionID()); +if (StringUtils.isNotBlank(myOrgNumber)) { + customParamMap.put("myOrgNumber", myOrgNumber); + customParamMap.put("myOrgNumberLike", myOrgNumber + "%"); + + // 判断是否为自治区账号(机构等级为1) + Map orgParams = new HashMap<>(); + orgParams.put("deleted", "0"); + orgParams.put("unittype", "1"); + orgParams.put("orgNumber", myOrgNumber); + OrgUnits org = aicorgService.queryByOrgNumberMap(orgParams); + boolean isAutonomousRegion = org != null && org.getOrgLevel() != null && org.getOrgLevel() == 1; + + // 设置是否查看下级单位标志 + // childUnitSwitch = "1" 表示查看下级 + // childUnitSwitch 不传或为 "0" 表示不查看下级 + // 但自治区账号即使不查看下级,也应该能看到本级数据 + if (customParamMap.containsKey("childUnitSwitch")) { + // 前端明确传了 childUnitSwitch,使用前端值 + } else { + // 前端没传,默认不查看下级(childUnitSwitch = "0") + customParamMap.put("childUnitSwitch", "0"); + } +} +``` + +**同步修改 Mapper XML**: 确保当 `childUnitSwitch = "0"` 时,也要有机构过滤逻辑(不仅仅是 "1" 时)。 + +### 修复2: 每笔业务只显示一条记录 + +**方案**: 在外层查询使用 GROUP BY BIZSEQID,选择每个业务最新的一条记录。 + +**修改文件**: `TSTaskListMapper.xml` 的 `selectFinishUnionTaskPage` + +**当前**: +```sql +SELECT * FROM ( + (select DISTINCT ta.TASKLISTID, ta.WORKFLOWID, ta.BIZSEQID, ... + from TSTaskList ta + LEFT JOIN TShwfProcessNode n on ta.WorkflowID = n.processid + where ...) +) m +ORDER BY m.LAUPTIME DESC +``` + +**修改后**: +```sql +SELECT m.* FROM ( + SELECT * FROM ( + (select ... from TSTaskList ... UNION all select ... from tsrevtasklist ...) + ) sub + GROUP BY sub.BIZSEQID + HAVING sub.LAUPTIME = MAX(sub.LAUPTIME) -- 取每笔业务最新的一条 +) m +ORDER BY m.LAUPTIME DESC +``` + +或者使用窗口函数: +```sql +SELECT * FROM ( + SELECT t.*, + ROW_NUMBER() OVER (PARTITION BY t.BIZSEQID ORDER BY t.LAUPTIME DESC) as rn + FROM ( + (select ... from TSTaskList ta ... UNION all select ... from tsrevtasklist ...) + ) t +) tt +WHERE tt.rn = 1 +ORDER BY tt.LAUPTIME DESC +``` + +--- + +## 具体代码改动 + +### 1. TaskController.java 修改(约第290行) + +在 `finishTaskUnionPage` 方法中,修改机构过滤逻辑: + +```java +// 原有代码(只处理 childUnitSwitch 存在时): +// if (customParamMap != null && customParamMap.containsKey("childUnitSwitch")) { + +// 修改为:无条件设置机构参数 +if (customParamMap != null) { + String myOrgNumber = StringUtils.clearRegionZero(curUser.getRegionID()); + if (StringUtils.isNotBlank(myOrgNumber)) { + customParamMap.put("myOrgNumber", myOrgNumber); + customParamMap.put("myOrgNumberLike", myOrgNumber + "%"); + } + + // 确保 childUnitSwitch 有值(前端没传时默认为"0") + if (!customParamMap.containsKey("childUnitSwitch")) { + customParamMap.put("childUnitSwitch", "0"); + } +} +``` + +### 2. TSTaskListMapper.xml 修改(约第580-790行) + +**2.1 修改子查询逻辑**: + +当 `childUnitSwitch = "0"`(不查看下级)时,也需要按机构过滤: + +```xml + + and ( + tso.HANDLERID = #{customParamMap.userId} + or exists(select 1 from CXAICORG.T_USERS tu + left join CXAICORG.T_ORGUNITS torg on tu.ORGUNITID = torg.ORGUNITID + where tso.HANDLERID = tu.USERID + and torg.ORGNUMBER = #{customParamMap.myOrgNumber}) + ) + +``` + +**2.2 添加自治区账号特殊处理**: + +当机构等级为1(自治区)时,不过滤: + +```xml + + + + + + + and ( + tso.HANDLERID = #{customParamMap.userId} + or exists(select 1 from CXAICORG.T_USERS tu + left join CXAICORG.T_ORGUNITS torg on tu.ORGUNITID = torg.ORGUNITID + where tso.HANDLERID = tu.USERID + and torg.ORGNUMBER = #{customParamMap.myOrgNumber}) + ) + + + +``` + +**2.3 去重逻辑**: + +在外层包装查询结果,按 BIZSEQID 分组取最新: + +```xml +SELECT * FROM ( + SELECT m.*, + ROW_NUMBER() OVER (PARTITION BY m.BIZSEQID ORDER BY m.LAUPTIME DESC) as rn + FROM ( + + ) m +) mm +WHERE mm.rn = 1 +ORDER BY mm.LAUPTIME DESC +``` + +--- + +## 注意事项 + +1. **自治区账号识别**:需要在 Controller 层判断并传递 `isAutonomousRegion` 参数 +2. **兼容性**:确保修改后与现有功能兼容,不要破坏其他业务线的已办查询 +3. **性能**:去重查询可能影响性能,如果 BIZSEQID 已建立索引应无大碍 +4. **第3点难点**:如果去重逻辑 SQL 难以修改(涉及多表 UNION),可以在 Service 层用 Java 代码处理,但会增加内存压力 diff --git a/devdoc/XQ-20260414-002_需求清单.md b/devdoc/XQ-20260414-002_需求清单.md new file mode 100644 index 0000000..210a022 --- /dev/null +++ b/devdoc/XQ-20260414-002_需求清单.md @@ -0,0 +1,28 @@ +# XQ-20260414-002 需求清单 + +## 任务信息 +- **待办编号**: XQ-20260414-002 +- **标题**: 内蒙信用监管-修复我的已办问题 +- **到期日**: 2026-04-17 +- **执行人**: LiRunHao + +## 需求描述 + +### 问题1: 已办列表范围问题 +**现状**: 已办列表显示全自治区的已办记录 +**期望**: 改为按照"是否查看下级单位已办记录"的规则查询 +- 否:只显示当前单位的已办记录 +- 是:显示下级单位的已办记录,自治区账号显示全部已办记录 + +**具体案例**: 用户 hl_zhangwg (大杨树镇市场监督管理所) 提交了个体工商户移出异常名录业务 YW202603260005,提交成功后从已办业务中搜索不到办理的业务,全是其他单位的业务。 + +### 问题2: 已办记录重复问题 +**现状**: 当前已办功能将每一笔业务的所有环节(如审批中、审批通过)的记录都显示出来了 +**期望**: 每一笔业务只显示一条记录,显示当前业务的最新环节 + +**说明**: 第3点若查询语句难以修改,可以提出修改的难点,后续优化 + +## 涉及范围 +- 后端接口:`/task/finishTaskUnionPage` +- Mapper: `TSTaskListMapper.selectFinishUnionTaskPage` +- Service: `TSTaskListServiceImpl.searchFinishTaskUnionPage` diff --git a/src/main/java/com/chinaweal/aiccs/aiccs/business/controller/TaskController.java b/src/main/java/com/chinaweal/aiccs/aiccs/business/controller/TaskController.java index a087406..8e917c5 100644 --- a/src/main/java/com/chinaweal/aiccs/aiccs/business/controller/TaskController.java +++ b/src/main/java/com/chinaweal/aiccs/aiccs/business/controller/TaskController.java @@ -491,11 +491,25 @@ public class TaskController extends BaseController { } } - if (customParamMap != null && customParamMap.containsKey("childUnitSwitch")) { + if (customParamMap != null) { String myOrgNumber = StringUtils.clearRegionZero(curUser.getRegionID()); if (StringUtils.isNotBlank(myOrgNumber)) { customParamMap.put("myOrgNumber", myOrgNumber); customParamMap.put("myOrgNumberLike", myOrgNumber + "%"); + + // 判断是否为自治区账号(机构等级为1) + Map orgParams = new HashMap<>(); + orgParams.put("deleted", "0"); + orgParams.put("unittype", "1"); + orgParams.put("orgNumber", myOrgNumber); + OrgUnits org = aicorgService.queryByOrgNumberMap(orgParams); + boolean isAutonomousRegion = org != null && org.getOrgLevel() != null && org.getOrgLevel() == 1; + customParamMap.put("isAutonomousRegion", isAutonomousRegion); + } + + // childUnitSwitch 默认值为 "0"(不查看下级) + if (!customParamMap.containsKey("childUnitSwitch")) { + customParamMap.put("childUnitSwitch", "0"); } } diff --git a/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml b/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml index 13267c3..5d5e045 100644 --- a/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml +++ b/src/main/resources/mybatis/mapper/aiccs/business/TSTaskListMapper.xml @@ -578,108 +578,146 @@ ORDER BY n.OPINIONTYPE DESC LIMIT 1