From 410a869db20d37b12c7bc49c0f3a671a8aafa7fa Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Thu, 5 Mar 2026 21:32:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(pigx-flow-biz):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=89=93=E5=8D=B0=E6=A8=A1=E6=9D=BF=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Process 实体类中新增 printTemplate 字段,用于存储 HTML 格式的打印模板 - 新增数据库表字段 print_template,支持流程定义的打印模板存储 - 在 ProcessController 中新增获取和保存打印模板的 REST API 接口 - 在 ProcessInstanceRecordVo 中新增 hasPrintTemplate 字段,标识流程是否配置打印模板 - 优化流程实例列表查询,批量检查打印模板配置状态 - 修复 ProcessInstanceServiceImpl 中重复设置 formData 的问题 --- db/0pigxx_boot.sql | 1 + db/3pigxx_flow.sql | 1 + .../pig4cloud/pigx/flow/entity/Process.java | 12 +++++++++ .../pigx/flow/vo/ProcessInstanceRecordVo.java | 9 +++++++ .../flow/controller/ProcessController.java | 24 +++++++++++++++++ .../impl/ProcessInstanceServiceImpl.java | 27 ++++++++++++++----- 6 files changed, 67 insertions(+), 7 deletions(-) diff --git a/db/0pigxx_boot.sql b/db/0pigxx_boot.sql index 4a7329887..54cb854b9 100644 --- a/db/0pigxx_boot.sql +++ b/db/0pigxx_boot.sql @@ -1536,6 +1536,7 @@ CREATE TABLE `process` ( `unique_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '唯一性id', `admin_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理员', `range_show` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '范围描述显示', + `print_template` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '打印模板', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `idx_form_id` (`flow_id`) USING BTREE, diff --git a/db/3pigxx_flow.sql b/db/3pigxx_flow.sql index fefcab043..02af665f5 100644 --- a/db/3pigxx_flow.sql +++ b/db/3pigxx_flow.sql @@ -47,6 +47,7 @@ CREATE TABLE `process` ( `unique_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '唯一性id', `admin_list` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理员', `range_show` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '范围描述显示', + `print_template` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '打印模板', `tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属租户id', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `idx_form_id` (`flow_id`) USING BTREE, diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/Process.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/Process.java index b841172db..1f13c11e1 100644 --- a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/Process.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/entity/Process.java @@ -118,6 +118,18 @@ public class Process { @TableField("range_show") private String rangeShow; + /** + * 打印模板 HTML格式的打印模板内容,支持 mention 变量占位符 + */ + @TableField("print_template") + private String printTemplate; + + /** + * 租户ID 多租户隔离字段,用于区分不同租户的流程定义 + */ + @TableField("tenant_id") + private Long tenantId; + /** * 主键ID 使用雪花算法生成的分布式ID */ diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessInstanceRecordVo.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessInstanceRecordVo.java index 43b39975a..2d7057c62 100644 --- a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessInstanceRecordVo.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/vo/ProcessInstanceRecordVo.java @@ -35,4 +35,13 @@ public class ProcessInstanceRecordVo extends ProcessInstanceRecord { */ private String resubmitTaskId; + /** + * 是否配置了打印模板 + *

+ * true表示该流程定义已配置打印模板,前端显示打印按钮; + * false或null表示未配置打印模板,前端不显示打印按钮 + *

+ */ + private Boolean hasPrintTemplate; + } diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessController.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessController.java index bd8b157bb..47c267493 100644 --- a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessController.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/controller/ProcessController.java @@ -94,4 +94,28 @@ public class ProcessController { return processService.validateFlowId(flowId); } + /** + * 获取流程打印模板 + * + * @param flowId 流程定义ID + * @return 打印模板HTML内容 + */ + @GetMapping("printTemplate/{flowId}") + public R getPrintTemplate(@PathVariable String flowId) { + Process process = processService.getByFlowId(flowId); + return R.ok(process != null ? process.getPrintTemplate() : null); + } + + /** + * 保存流程打印模板 + * + * @param process 包含flowId和printTemplate的实体 + * @return 操作结果 + */ + @PutMapping("printTemplate") + public R savePrintTemplate(@RequestBody Process process) { + processService.updateByFlowId(new Process().setFlowId(process.getFlowId()).setPrintTemplate(process.getPrintTemplate())); + return R.ok(); + } + } diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceServiceImpl.java index e3b09edd1..1b8331bf0 100644 --- a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessInstanceServiceImpl.java @@ -309,7 +309,6 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { record.setGroupName(processInstanceRecord.getGroupName()); record.setRootUserName(startUser.getName()); record.setRootUserAvatarUrl(startUser.getAvatar()); - record.setTaskId(record.getTaskId()); record.setStartTime(processInstanceRecord.getCreateTime()); taskNewDtoList.add(record); } @@ -368,21 +367,29 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { // 转换为 VO 并添加驳回状态信息 List voList = BeanUtil.copyToList(instanceRecordPage.getRecords(), ProcessInstanceRecordVo.class); + // 批量查询流程定义,用于检查打印模板 + Set flowIds = voList.stream() + .map(ProcessInstanceRecordVo::getFlowId) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + List processList = CollUtil.isEmpty(flowIds) ? Collections.emptyList() + : processService.lambdaQuery().in(Process::getFlowId, flowIds).list(); + for (ProcessInstanceRecordVo vo : voList) { try { // 从 Flowable 变量中获取 rejectToStarter 状态 Object rejectVar = runtimeService.getVariable( - vo.getProcessInstanceId(), - "rejectToStarter" + vo.getProcessInstanceId(), + "rejectToStarter" ); vo.setRejectToStarter(Boolean.TRUE.equals(rejectVar)); // 如果是驳回状态,获取 root 任务 ID 用于重新提交 if (Boolean.TRUE.equals(vo.getRejectToStarter())) { Task task = taskService.createTaskQuery() - .processInstanceId(vo.getProcessInstanceId()) - .taskDefinitionKey("root") - .singleResult(); + .processInstanceId(vo.getProcessInstanceId()) + .taskDefinitionKey("root") + .singleResult(); if (task != null) { vo.setResubmitTaskId(task.getId()); } @@ -391,6 +398,12 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { // 流程可能已结束,设置为 false vo.setRejectToStarter(false); } + + // 检查是否配置了打印模板(不依赖运行时变量,无需放在 try-catch 内) + processList.stream() + .filter(process -> process.getFlowId().equalsIgnoreCase(vo.getFlowId())) + .findFirst() + .ifPresent(process -> vo.setHasPrintTemplate(StrUtil.isNotBlank(process.getPrintTemplate()))); } // 构建返回的分页对象 @@ -537,7 +550,7 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { Node nodeDto = objectMapper.readValue(process, Node.class); Map formPerms1 = nodeDto.getFormPerms(); - Dict set = Dict.create().set(ProcessInstanceRecord.Fields.processInstanceId, processInstanceId).set(ProcessInstanceRecord.Fields.status, processInstanceRecord.getStatus()).set("process", oaForms.getProcess()).set("formItems", oaForms.getFormItems()).set("formData", formData).set("formData", formData).set("formConfig", oaForms.getFormConfig()).set("formPerms", formPerms1); + Dict set = Dict.create().set(ProcessInstanceRecord.Fields.processInstanceId, processInstanceId).set(ProcessInstanceRecord.Fields.status, processInstanceRecord.getStatus()).set("process", oaForms.getProcess()).set("formItems", oaForms.getFormItems()).set("formData", formData).set("formConfig", oaForms.getFormConfig()).set("formPerms", formPerms1); return R.ok(set); }