feat(pigx-flow-biz): 新增流程打印模板功能

- 在 Process 实体类中新增 printTemplate 字段,用于存储 HTML 格式的打印模板
- 新增数据库表字段 print_template,支持流程定义的打印模板存储
- 在 ProcessController 中新增获取和保存打印模板的 REST API 接口
- 在 ProcessInstanceRecordVo 中新增 hasPrintTemplate 字段,标识流程是否配置打印模板
- 优化流程实例列表查询,批量检查打印模板配置状态
- 修复 ProcessInstanceServiceImpl 中重复设置 formData 的问题
This commit is contained in:
PIGCLOUD committed 2026-03-08 15:06:59 +08:00
1 parent 3c05364e12
commit 410a869db2
6 files changed
+67 -7

No files matched your search

+1
View File
@@ -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,
+1
View File
@@ -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,
@@ -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
*/
@@ -35,4 +35,13 @@ public class ProcessInstanceRecordVo extends ProcessInstanceRecord {
*/
private String resubmitTaskId;
/**
* 是否配置了打印模板
* <p>
* true表示该流程定义已配置打印模板,前端显示打印按钮;
* false或null表示未配置打印模板,前端不显示打印按钮
* </p>
*/
private Boolean hasPrintTemplate;
}
@@ -94,4 +94,28 @@ public class ProcessController {
return processService.validateFlowId(flowId);
}
/**
* 获取流程打印模板
*
* @param flowId 流程定义ID
* @return 打印模板HTML内容
*/
@GetMapping("printTemplate/{flowId}")
public R<String> 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<Void> savePrintTemplate(@RequestBody Process process) {
processService.updateByFlowId(new Process().setFlowId(process.getFlowId()).setPrintTemplate(process.getPrintTemplate()));
return R.ok();
}
}
@@ -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<ProcessInstanceRecordVo> voList = BeanUtil.copyToList(instanceRecordPage.getRecords(), ProcessInstanceRecordVo.class);
// 批量查询流程定义,用于检查打印模板
Set<String> flowIds = voList.stream()
.map(ProcessInstanceRecordVo::getFlowId)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toSet());
List<Process> 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<String, String> 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);
}