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 | 71 +++++++++++++++++++++++++++++------
1 files changed, 59 insertions(+), 12 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 5344dd7..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
@@ -7,7 +7,6 @@
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
@@ -16,15 +15,19 @@
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;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmReasonEnum;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
@@ -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;
@@ -57,6 +62,7 @@
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceBuilder;
+import org.flowable.engine.task.Attachment;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.context.annotation.Lazy;
@@ -89,7 +95,7 @@
* <p>
* 绠�鍗曟潵璇达紝鍓嶈�� = 鍘嗗彶 + 杩愯涓殑娴佺▼瀹炰緥锛屽悗鑰呬粎鏄繍琛屼腑鐨勬祦绋嬪疄渚�
*
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
*/
@Service
@Validated
@@ -122,6 +128,11 @@
@Resource
private BpmProcessIdRedisDAO processIdRedisDAO;
+
+ @Resource
+ private BpmBusinessAttachService businessAttachService;
+ @Resource
+ private BpmFormService formService;
// ========== Query 鏌ヨ鐩稿叧鏂规硶 ==========
@@ -275,11 +286,10 @@
processVariables.putAll(reqVO.getProcessVariables());
}
- // 3. 鑾峰彇涓嬩竴涓皢瑕佹墽琛岀殑鑺傜偣闆嗗悎
+ // 3.1 鑾峰彇涓嬩竴涓皢瑕佹墽琛岀殑鑺傜偣闆嗗悎
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
- List<FlowNode> nextFlowNodes = BpmnModelUtils.getNextFlowNodes(flowElement, bpmnModel, processVariables);
- // 浠呬粎鑾峰彇 UserTask 鑺傜偣 TODO add from jason锛氬鏋滅綉鍏宠妭鐐瑰拰缃戝叧鑺傜偣鐩歌繛锛岃幏鍙栦笅涓� UserTask. 璨屼技鏈夌偣涓嶅噯銆�
- List<FlowNode> nextUserTaskList = CollectionUtils.filterList(nextFlowNodes, node -> node instanceof UserTask);
+ // 3.2 鑾峰彇 UserTask 鑺傜偣
+ List<UserTask> nextUserTaskList = BpmnModelUtils.getNextUserTasks(flowElement, bpmnModel, processVariables);
List<ActivityNode> nextActivityNodes = convertList(nextUserTaskList, node -> new ActivityNode().setId(node.getId())
.setName(node.getName()).setNodeType(BpmSimpleModelNodeTypeEnum.APPROVE_NODE.getType())
.setStatus(BpmTaskStatusEnum.RUNNING.getStatus())
@@ -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());
+ }
}
/**
@@ -404,8 +443,13 @@
// 閬嶅巻 tasks 鍒楄〃锛屽彧澶勭悊宸茬粨鏉熺殑 UserTask
// 涓轰粈涔堜笉閫氳繃 activities 鍛紵鍥犱负锛屽姞绛惧満鏅笅锛屽畠鍙瓨鍦ㄤ簬 tasks锛屾病鏈� activities锛屽鑷村鏋滈亶鍘� activities 鐨勮瘽锛屽畠鏃犳硶鎴愪负涓�涓妭鐐�
List<HistoricTaskInstance> endTasks = filterList(tasks, task -> task.getEndTime() != null);
+ // 鑾峰彇宸插畬鎴愯妭鐐圭殑闄勪欢
+ Set<String> endTaskIds = convertSet(endTasks, HistoricTaskInstance::getId);
+ List<Attachment> attachments = taskService.getAttachments(historicProcessInstance.getId(), endTaskIds, BpmAttachmentTypeEnum.TASK_ATTACHMENT);
+ Map<String, List<Attachment>> taskAttachmentMap = convertMultiMap(attachments, Attachment::getTaskId);
List<ActivityNode> approvalNodes = convertList(endTasks, task -> {
FlowElement flowNode = BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey());
+ List<Attachment> taskAttachments = taskAttachmentMap.get(task.getId());
ActivityNode activityNode = new ActivityNode().setId(task.getTaskDefinitionKey()).setName(task.getName())
.setNodeType(START_USER_NODE_ID.equals(task.getTaskDefinitionKey())
? BpmSimpleModelNodeTypeEnum.START_USER_NODE.getType()
@@ -414,7 +458,7 @@
.setStatus(getEndActivityNodeStatus(task))
.setCandidateStrategy(BpmnModelUtils.parseCandidateStrategy(flowNode))
.setStartTime(DateUtils.of(task.getCreateTime())).setEndTime(DateUtils.of(task.getEndTime()))
- .setTasks(singletonList(BpmProcessInstanceConvert.INSTANCE.buildApprovalTaskInfo(task)));
+ .setTasks(singletonList(BpmProcessInstanceConvert.INSTANCE.buildApprovalTaskInfo(task, taskAttachments)));
// 濡傛灉鏄彇娑堢姸鎬侊紝鍒欒烦杩�
if (BpmTaskStatusEnum.isCancelStatus(activityNode.getStatus())) {
return null;
@@ -528,14 +572,14 @@
if (task == null) {
continue;
}
- activityNode.getTasks().add(BpmProcessInstanceConvert.INSTANCE.buildApprovalTaskInfo(task));
+ activityNode.getTasks().add(BpmProcessInstanceConvert.INSTANCE.buildApprovalTaskInfo(task, null));
// 鍔犵瀛愪换鍔★紝闇�瑕佽繃婊ゆ帀宸茬粡瀹屾垚鐨勫姞绛惧瓙浠诲姟
List<HistoricTaskInstance> childrenTasks = filterList(
taskService.getAllChildrenTaskListByParentTaskId(activity.getTaskId(), tasks),
childTask -> childTask.getEndTime() == null);
if (CollUtil.isNotEmpty(childrenTasks)) {
activityNode.getTasks().addAll(
- convertList(childrenTasks, BpmProcessInstanceConvert.INSTANCE::buildApprovalTaskInfo));
+ convertList(childrenTasks, item->BpmProcessInstanceConvert.INSTANCE.buildApprovalTaskInfo(item, null)));
}
}
// 澶勭悊姣忎釜浠诲姟鐨� candidateUsers 灞炴�э細濡傛灉鏄緷娆″鎵癸紝闇�瑕侀娴嬪畠鐨勫悗缁鎵逛汉銆傚洜涓� Task 鏄鎵瑰畬涓�涓紝鍒涘缓涓�涓柊鐨� Task
@@ -1011,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