From 252e99421e97bcb7fee33cff288ac4f3d8a4cd7d Mon Sep 17 00:00:00 2001 From: weicw <594098497@qq.com> Date: Fri, 30 Oct 2026 22:28:05 +0800 Subject: [PATCH] =?UTF-8?q?fix(approval):=20=E6=B4=BE=E5=8D=95=E5=BD=92?= =?UTF-8?q?=E5=B1=9E=E5=8F=97=E7=90=86=E9=83=A8=E9=97=A8=E8=B4=9F=E8=B4=A3?= =?UTF-8?q?=E4=BA=BA=E3=80=81PC=20=E5=85=A8=E7=A7=9F=E6=88=B7=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=E6=94=B9=E6=B4=BE=E4=B8=8E=20keywords=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 协调单流程定义升至 v2:dispatch 节点 resolver 改为 acceptOrgLeader,v1 行不可变保留;getOrCreate 取最新版本 - 详情新增 pendingTasks,canAssign 在持有 assign 权限且实例 PENDING 时可用 - /todo/page 支持 scope=all(仅 assign 权限),详情/列表/导出可见性 SQL 与 countVisible 一致 - 查询参数 keyword 统一为 BaseParam.keywords;术语统一为报送人 - 删除 ApprovalDirectoryService.hasDepartmentLeader 与 ApprovalFileService.getById 死代码 --- .../approval/constant/ApprovalConstants.java | 19 +++++- .../approval/mapper/ApprovalExportMapper.java | 3 +- .../mapper/ApprovalInstanceMapper.java | 3 +- .../approval/mapper/ApprovalQueryMapper.java | 3 +- .../approval/mapper/ApprovalTaskMapper.java | 6 ++ .../mapper/xml/ApprovalExportMapper.xml | 11 ++-- .../mapper/xml/ApprovalInstanceMapper.xml | 1 + .../mapper/xml/ApprovalQueryMapper.xml | 13 ++-- .../mapper/xml/ApprovalTaskMapper.xml | 36 +++++++++++ .../param/ApprovalCoordinationParam.java | 2 +- .../approval/param/ApprovalQueryParam.java | 5 +- .../approval/param/ApprovalTaskListParam.java | 4 ++ .../service/ApprovalAttachmentService.java | 2 +- .../service/ApprovalDirectoryService.java | 5 -- .../service/ApprovalExportService.java | 14 ++++- .../approval/service/ApprovalFileService.java | 11 ---- .../approval/service/ApprovalFlowService.java | 40 +++++++++---- .../service/ApprovalInstanceService.java | 60 +++++++++++++++++-- .../service/ApprovalQueryService.java | 14 ++++- .../approval/vo/ApprovalInstanceVO.java | 3 + .../approval/vo/ApprovalPendingTaskVO.java | 27 +++++++++ .../approval/ApprovalCoordinationIT.java | 20 +++++-- .../approval/ApprovalDispatchIT.java | 23 ++++--- .../gxwebsoft/approval/ApprovalExportIT.java | 10 ++-- .../gxwebsoft/approval/ApprovalPcTodoIT.java | 48 +++++++++++++++ .../gxwebsoft/approval/ApprovalQueryIT.java | 16 ++--- 26 files changed, 317 insertions(+), 82 deletions(-) create mode 100644 src/main/java/com/gxwebsoft/approval/vo/ApprovalPendingTaskVO.java diff --git a/src/main/java/com/gxwebsoft/approval/constant/ApprovalConstants.java b/src/main/java/com/gxwebsoft/approval/constant/ApprovalConstants.java index ed5bbaf..cd8b795 100644 --- a/src/main/java/com/gxwebsoft/approval/constant/ApprovalConstants.java +++ b/src/main/java/com/gxwebsoft/approval/constant/ApprovalConstants.java @@ -23,7 +23,7 @@ public final class ApprovalConstants { public static final String STATUS_APPROVED = "APPROVED"; public static final String STATUS_ARCHIVED = "ARCHIVED"; - /** 发起人可编辑、可提交的状态。 */ + /** 报送人可编辑、可提交的状态。 */ public static final Set EDITABLE_STATUSES = Collections.unmodifiableSet(new java.util.HashSet<>(Arrays.asList( STATUS_DRAFT, STATUS_REJECTED, STATUS_WITHDRAWN))); @@ -72,6 +72,14 @@ public final class ApprovalConstants { public static final String ROLE_USER = "user"; public static final String ROLE_GUEST = "guest"; + // 权限串(与 spec 约定一致;菜单/按钮共用) + public static final String PERMISSION_LIST = "approval:instance:list"; + public static final String PERMISSION_SUBMIT = "approval:instance:submit"; + public static final String PERMISSION_APPROVE = "approval:instance:approve"; + public static final String PERMISSION_ARCHIVE = "approval:instance:archive"; + public static final String PERMISSION_ASSIGN = "approval:instance:assign"; + public static final String PERMISSION_EXPORT = "approval:instance:export"; + // 附件规则 public static final long MAX_ATTACHMENT_SIZE = 20L * 1024 * 1024; public static final int MAX_ATTACHMENT_COUNT = 9; @@ -141,11 +149,16 @@ public final class ApprovalConstants { + "{\"key\":\"archive\",\"type\":\"ARCHIVE\",\"resolver\":\"archivist\",\"name\":\"归档\"}" + "]"; - /** 内部协调单流程定义(version=1,表单与派单由后续迭代启用)。 */ + /** + * 内部协调单流程定义(version=2)。 + * + *

version=1 的派单节点按受理部门全员生成任务,导致普通成员也能派单且部门无成员时卡单; + * v2 改为受理部门负责人(或签)。版本不可变:已发布实例仍引用其定义版本。

+ */ public static final String COORDINATION_NODES_JSON = "[" + "{\"key\":\"reportLeader\",\"type\":\"APPROVE\",\"resolver\":\"reporterOrgLeader\",\"name\":\"报送部门负责人\"}," + "{\"key\":\"acceptLeader\",\"type\":\"APPROVE\",\"resolver\":\"acceptOrgLeader\",\"name\":\"受理部门负责人\"}," - + "{\"key\":\"dispatch\",\"type\":\"DISPATCH\",\"resolver\":\"acceptOrgMembers\",\"name\":\"派单\"}," + + "{\"key\":\"dispatch\",\"type\":\"DISPATCH\",\"resolver\":\"acceptOrgLeader\",\"name\":\"派单\"}," + "{\"key\":\"confirm\",\"type\":\"CONFIRM\",\"resolver\":\"reporterAndDispatchTarget\",\"name\":\"存档\"}," + "{\"key\":\"archive\",\"type\":\"ARCHIVE\",\"resolver\":\"archivist\",\"name\":\"归档\"}" + "]"; diff --git a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalExportMapper.java b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalExportMapper.java index 2663ca4..e2053fb 100644 --- a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalExportMapper.java +++ b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalExportMapper.java @@ -18,5 +18,6 @@ public interface ApprovalExportMapper { */ List selectExportRows(@Param("param") ApprovalQueryParam param, @Param("userId") Integer userId, - @Param("allVisible") Integer allVisible); + @Param("allVisible") Integer allVisible, + @Param("assignVisible") Integer assignVisible); } diff --git a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalInstanceMapper.java b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalInstanceMapper.java index 0212f77..3754eb8 100644 --- a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalInstanceMapper.java +++ b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalInstanceMapper.java @@ -24,7 +24,8 @@ public interface ApprovalInstanceMapper extends BaseMapper { */ int countVisible(@Param("id") Long id, @Param("userId") Integer userId, - @Param("allVisible") Integer allVisible); + @Param("allVisible") Integer allVisible, + @Param("assignVisible") Integer assignVisible); /** * 我发起的列表。 diff --git a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalQueryMapper.java b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalQueryMapper.java index e3ae64c..45f0817 100644 --- a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalQueryMapper.java +++ b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalQueryMapper.java @@ -18,5 +18,6 @@ public interface ApprovalQueryMapper { List selectInstancePage(@Param("page") IPage page, @Param("param") ApprovalQueryParam param, @Param("userId") Integer userId, - @Param("allVisible") Integer allVisible); + @Param("allVisible") Integer allVisible, + @Param("assignVisible") Integer assignVisible); } diff --git a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalTaskMapper.java b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalTaskMapper.java index ece5152..6399fb4 100644 --- a/src/main/java/com/gxwebsoft/approval/mapper/ApprovalTaskMapper.java +++ b/src/main/java/com/gxwebsoft/approval/mapper/ApprovalTaskMapper.java @@ -22,6 +22,12 @@ public interface ApprovalTaskMapper extends BaseMapper { @Param("userId") Integer userId, @Param("taskStatus") String taskStatus); + /** + * 全租户待办列表:任一 PENDING 任务对应的实例,按实例去重。 + */ + List selectPendingInstancePage(@Param("page") IPage page, + @Param("param") ApprovalTaskListParam param); + /** * 本人待办实例数量(同一实例多任务只算一条)。 */ diff --git a/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalExportMapper.xml b/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalExportMapper.xml index 837c511..985bafc 100644 --- a/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalExportMapper.xml +++ b/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalExportMapper.xml @@ -31,6 +31,7 @@ i.reporter_id = #{userId} OR (i.status != 'DRAFT' AND ( #{allVisible} = 1 + OR (#{assignVisible} = 1 AND i.status = 'PENDING') OR EXISTS (SELECT 1 FROM approval_task t WHERE t.instance_id = i.id AND t.assignee_id = #{userId}) OR EXISTS (SELECT 1 FROM approval_record r WHERE r.instance_id = i.id AND r.operator_id = #{userId}) OR i.dispatch_target_id = #{userId} @@ -54,11 +55,11 @@ AND i.status = #{param.status} - - AND (i.biz_no LIKE CONCAT('%', #{param.keyword}, '%') - OR f.name LIKE CONCAT('%', #{param.keyword}, '%') - OR co.title LIKE CONCAT('%', #{param.keyword}, '%') - OR f.implement_org LIKE CONCAT('%', #{param.keyword}, '%')) + + AND (i.biz_no LIKE CONCAT('%', #{param.keywords}, '%') + OR f.name LIKE CONCAT('%', #{param.keywords}, '%') + OR co.title LIKE CONCAT('%', #{param.keywords}, '%') + OR f.implement_org LIKE CONCAT('%', #{param.keywords}, '%')) AND i.submit_time >= #{param.submitTimeStart} diff --git a/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalInstanceMapper.xml b/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalInstanceMapper.xml index e934317..0e84228 100644 --- a/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalInstanceMapper.xml +++ b/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalInstanceMapper.xml @@ -17,6 +17,7 @@ i.reporter_id = #{userId} OR (i.status != 'DRAFT' AND ( #{allVisible} = 1 + OR (#{assignVisible} = 1 AND i.status = 'PENDING') OR EXISTS (SELECT 1 FROM approval_task t WHERE t.instance_id = i.id AND t.assignee_id = #{userId}) OR EXISTS (SELECT 1 FROM approval_record r WHERE r.instance_id = i.id AND r.operator_id = #{userId}) OR i.dispatch_target_id = #{userId} diff --git a/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalQueryMapper.xml b/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalQueryMapper.xml index 1b13427..6056a81 100644 --- a/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalQueryMapper.xml +++ b/src/main/java/com/gxwebsoft/approval/mapper/xml/ApprovalQueryMapper.xml @@ -2,7 +2,7 @@ - + + +