From d39e4f7d839167c16425086dfa2f8747bccfdff9 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 05 十一月 2026 17:39:01 +0800
Subject: [PATCH] feat: 打通销售采购财务闭环并完成累计业务优化

---
 yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java |   48 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 45 insertions(+), 3 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..a4c41e0 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
@@ -15,13 +15,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 +40,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 +128,11 @@
 
     @Resource
     private BpmProcessIdRedisDAO processIdRedisDAO;
+
+    @Resource
+    private BpmBusinessAttachService businessAttachService;
+    @Resource
+    private BpmFormService formService;
 
     // ========== Query 鏌ヨ鐩稿叧鏂规硶 ==========
 
@@ -389,9 +399,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());
+        }
     }
 
     /**
@@ -1016,8 +1055,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