From defe1e1c3ade87de0a7990f565f08f93aeb2decc Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期日, 08 十一月 2026 19:31:46 +0800
Subject: [PATCH] fix(bpm): 统一审批标题单号并收紧各模块提交校验
---
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
index f7d2dd5..b8e9371 100644
--- a/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
+++ b/yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -5,6 +5,7 @@
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
+import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
@@ -15,13 +16,16 @@
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ActivityNodeTask;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
import cn.iocoder.yudao.module.bpm.dal.redis.BpmProcessIdRedisDAO;
import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
+import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelFormTypeEnum;
import cn.iocoder.yudao.module.bpm.enums.definition.BpmModelTypeEnum;
import cn.iocoder.yudao.module.bpm.enums.definition.BpmSimpleModelNodeTypeEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmAttachmentTypeEnum;
@@ -37,6 +41,8 @@
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.SimpleModelUtils;
+import cn.iocoder.yudao.module.bpm.service.attach.BpmBusinessAttachService;
+import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@@ -123,6 +129,11 @@
@Resource
private BpmProcessIdRedisDAO processIdRedisDAO;
+
+ @Resource
+ private BpmBusinessAttachService businessAttachService;
+ @Resource
+ private BpmFormService formService;
// ========== Query 鏌ヨ鐩稿叧鏂规硶 ==========
@@ -389,9 +400,38 @@
Map<String, String> formFieldsPermission = getFormFieldsPermission(bpmnModel, reqVO.getActivityId(), taskId);
// 3. 鎷兼帴鏁版嵁
- return BpmProcessInstanceConvert.INSTANCE.buildApprovalDetail(bpmnModel, processDefinition,
- processDefinitionInfo, processInstance,
+ BpmApprovalDetailRespVO detailRespVO = BpmProcessInstanceConvert.INSTANCE.buildApprovalDetail(bpmnModel,
+ processDefinition, processDefinitionInfo, processInstance,
processInstanceStatus, approveNodes, todoTask, formFieldsPermission, userMap, deptMap);
+
+ // 3.1 鏅�氳〃鍗曞厹搴曪細鍘嗗彶閮ㄧ讲 / 閰嶇疆瀵煎叆鐨勬暟鎹紝bpm_process_definition_info 鍙兘娌℃湁 formConf銆乫ormFields锛�
+ // 姝ゆ椂鎸� formId 鍥炶 bpm_form锛岄伩鍏嶅鎵硅鎯呴〉琛ㄥ崟鍖哄煙绌虹櫧
+ fillNormalForm(detailRespVO.getProcessDefinition(), processDefinitionInfo);
+
+ // 4. 濉厖涓氬姟闄勪欢閰嶇疆锛屽疄鐜板鎵硅鎯呰嚜鍔ㄥ睍绀哄閮ㄤ笟鍔′俊鎭�
+ businessAttachService.fillBusinessForm(detailRespVO.getProcessDefinition(), processDefinition.getKey(),
+ processInstance != null ? processInstance.getBusinessKey() : null);
+ return detailRespVO;
+ }
+
+ /**
+ * 鏅�氳〃鍗曞厹搴曞~鍏咃細鍘嗗彶閮ㄧ讲鎴栭厤缃鍏ョ殑娴佺▼瀹氫箟锛屽彲鑳藉彧鏈� formId 鑰岀己澶� formConf銆乫ormFields锛�
+ * 瀵艰嚧瀹℃壒璇︽儏椤电殑琛ㄥ崟鍖哄煙绌虹櫧銆傝繖閲屾寜 formId 鍥炶 bpm_form 琛ラ綈銆�
+ */
+ private void fillNormalForm(BpmProcessDefinitionRespVO definition, BpmProcessDefinitionInfoDO processDefinitionInfo) {
+ if (definition == null || !Objects.equals(definition.getFormType(), BpmModelFormTypeEnum.NORMAL.getType())) {
+ return;
+ }
+ Long formId = definition.getFormId() != null ? definition.getFormId()
+ : (processDefinitionInfo != null ? processDefinitionInfo.getFormId() : null);
+ if (formId == null
+ || (StrUtil.isNotBlank(definition.getFormConf()) && CollUtil.isNotEmpty(definition.getFormFields()))) {
+ return;
+ }
+ BpmFormDO form = formService.getForm(formId);
+ if (form != null) {
+ definition.setFormConf(form.getConf()).setFormFields(form.getFields());
+ }
}
/**
@@ -805,10 +845,8 @@
validateStartUserSelectAssignees(userId, definition, startUserSelectAssignees, variables);
// 2. 鍒涘缓娴佺▼瀹炰緥
- if (variables == null) {
- variables = new HashMap<>();
- }
- FlowableUtils.filterProcessInstanceFormVariable(variables); // 杩囨护涓�涓嬶紝閬垮厤 ProcessInstance 绯荤粺绾х殑鍙橀噺琚崰鐢�
+ variables = FlowableUtils.filterProcessInstanceFormVariable(
+ variables == null ? new HashMap<>() : variables); // 澶嶅埗骞惰繃婊わ紝閬垮厤淇敼璋冪敤鏂圭殑鍙橀噺
variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_START_USER_ID, userId); // 璁剧疆娴佺▼鍙橀噺锛屽彂璧蜂汉 ID
variables.put(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 娴佺▼瀹炰緥鐘舵�侊細瀹℃壒涓�
BpmProcessInstanceStatusEnum.RUNNING.getStatus());
@@ -875,6 +913,11 @@
}
BpmModelMetaInfoVO.TitleSetting titleSetting = definitionInfo.getTitleSetting();
if (titleSetting == null || !BooleanUtil.isTrue(titleSetting.getEnable())) {
+ String businessNo = MapUtil.getStr(variables,
+ BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_BUSINESS_NO);
+ if (StrUtil.isNotBlank(businessNo)) {
+ return definition.getName() + "-" + businessNo;
+ }
return definition.getName();
}
AdminUserRespDTO user = adminUserApi.getUser(userId);
@@ -1016,8 +1059,11 @@
}
// 3. 鍙戦�佹祦绋嬪疄渚嬬殑鐘舵�佷簨浠�
+ // 甯︿笂娴佺▼鍒嗙被锛氳嚜瀹氫箟娴佺▼妯″瀷鐨� key 鍙兘鏄殢鏈哄�硷紙濡� C000_abc.锛夛紝涓氬姟鐩戝惉鍣ㄩ渶瑕佹寜鍒嗙被鍏滃簳鍖归厤
+ ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(instance.getProcessDefinitionId());
processInstanceEventPublisher.sendProcessInstanceResultEvent(
- BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance, status, reason));
+ BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, instance,
+ processDefinition != null ? processDefinition.getCategory() : null, status, reason));
// 4. 娴佺▼鍚庣疆閫氱煡
if (Objects.equals(status, BpmProcessInstanceStatusEnum.APPROVE.getStatus())) {
--
Gitblit v1.9.3