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);
}