From cfededd9721be4322e660fc879f11a806fcc7963 Mon Sep 17 00:00:00 2001
From: weidy <lastanimals@163.com>
Date: 星期二, 20 六月 2023 17:07:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/VCIFlowserviceImpl.java |  176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 176 insertions(+), 0 deletions(-)

diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/VCIFlowserviceImpl.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/VCIFlowserviceImpl.java
new file mode 100644
index 0000000..1221fa3
--- /dev/null
+++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/VCIFlowserviceImpl.java
@@ -0,0 +1,176 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.flow.engine.service.impl;
+
+import com.vci.ubcs.flow.core.constant.ProcessConstant;
+import com.vci.ubcs.flow.core.entity.BladeFlow;
+import com.vci.ubcs.flow.core.utils.TaskUtil;
+import com.vci.ubcs.flow.engine.entity.*;
+import com.vci.ubcs.flow.engine.service.FlowEngineService;
+import com.vci.ubcs.flow.engine.service.FlowTaskUserService;
+import com.vci.ubcs.flow.engine.service.VICFlowService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.flowable.bpmn.model.*;
+import org.flowable.engine.*;
+import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.support.Kv;
+import org.springframework.stereotype.Service;
+import java.util.*;
+
+/**
+ * 宸ヤ綔娴佹湇鍔″疄鐜扮被
+ *
+ * @author Chill
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class VCIFlowserviceImpl implements VICFlowService {
+
+	private final RuntimeService runtimeService;
+	private final IdentityService identityService;
+	private final RepositoryService repositoryService;
+	private final TaskService taskService;
+	private final FlowTaskUserService flowTaskUserService;
+	private final FlowEngineService flowEngineService;
+	private final HistoryService historyService;
+
+	@Override
+	public R<BladeFlow> startProcess(FlowTaskDTO flowTaskUserC){
+		String modelKey = flowTaskUserC.getModelKey();
+		String templateId = flowTaskUserC.getTemplateId();
+
+		Kv kv = Kv.create()
+			.set(ProcessConstant.TASK_VARIABLE_CREATE_USER, AuthUtil.getUserName());
+
+		// 璁剧疆娴佺▼鍚姩鐢ㄦ埛
+		identityService.setAuthenticatedUserId(TaskUtil.getTaskUser());
+
+		// 寮�鍚祦绋�
+		//鏌ヨ鏈�鏂扮殑娴佺▼閮ㄧ讲id
+		ProcessDefinition latesDefinition = repositoryService.createProcessDefinitionQuery().latestVersion().processDefinitionKey(modelKey).singleResult();
+		String processDefinitionId = latesDefinition.getId();
+
+		//鏌ヨ姣忎竴姝ュ鏍镐汉
+		List<FlowTaskUser> taskUsers = flowTaskUserService.getTaskUserByTemplateAndModelKey(templateId,modelKey);
+		Set<String> taskIdSet = new HashSet<>();
+		for (FlowTaskUser taskUser:taskUsers){
+			kv.put(taskUser.getTaskId(),TaskUtil.getTaskUser(taskUser.getUserId()));
+			taskIdSet.add(taskUser.getTaskId());
+		}
+
+		//瀵规瘮閰嶇疆鐨勫鏍镐汉鍛樺拰娴佺▼涓妭鐐规槸鍚︿竴鑷达紝鍙兘瀛樺湪娴佺▼鑺傜偣鍙樻洿浜嗭紝澶氫簡鎴栬�呭皯浜嗚妭鐐癸紝浣嗘槸閰嶇疆瀹℃牳浜哄憳鐨勮妭鐐规病鏈夊彉
+//		List<Map<String,String>> processTasks = flowEngineService.getNodeByFlowableKey(modelKey);
+//		for (Map<String,String> mi:processTasks){
+//			String taskId = mi.get(flowEngineService.getTaskIdString());
+//			if(!taskIdSet.contains(taskId)){
+//				throw new ServiceException("娴佺▼宸查噸鏂伴儴缃诧紝鑺傜偣宸叉敼鍙橈紝璇疯缃鏍镐汉鍛橈紒");
+//			}
+//		}
+//		if(taskIdSet.size()!=processTasks.size()){
+//			throw new ServiceException("娴佺▼宸查噸鏂伴儴缃诧紝鑺傜偣宸叉敼鍙橈紝璇疯缃鏍镐汉鍛橈紒");
+//		}
+
+		//娴佺▼涓枃浠躲�佸彉閲忕瓑
+		//do..
+
+		ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, modelKey, kv);
+		// 缁勮娴佺▼閫氱敤绫�
+		BladeFlow flow = new BladeFlow();
+		flow.setProcessInstanceId(processInstance.getId());
+
+		return R.data(flow);
+	}
+
+	public static String NODE_NOW = "now";
+	public static String NODE_NEXT = "next";
+	/**
+	 * 鑾峰彇浠诲姟鑺傜偣
+	 *
+	 * @param node   鏌ヨ鑺傜偣閫夋嫨
+	 * @param processInstanceId 娴佺▼瀹炰緥id
+	 */
+	public FlowTaskDTO nextFlowNode(String node, String processInstanceId) {
+		FlowTaskDTO flowTaskDTO = new FlowTaskDTO();
+		List<FlowTaskDTO> taskList = new ArrayList<>();//鑺傜偣鎸夐挳
+		flowTaskDTO.setToTasks(taskList);
+
+		Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).active().singleResult();
+		ExecutionEntity ee = (ExecutionEntity) runtimeService.createExecutionQuery()
+			.executionId(task.getExecutionId()).singleResult();
+		// 褰撳墠瀹℃壒鑺傜偣
+		String crruentActivityId = ee.getActivityId();
+		BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
+		FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(crruentActivityId);
+
+		//杩欎釜瀹炰緥鐨勬墍鏈夎妭鐐�
+		ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+		Map<String, Object> processVariables = processInstance.getProcessVariables();//鎵�鏈夊弬鏁�
+		flowTaskDTO.setVars(processVariables);
+
+		String modelKey = processInstance.getProcessDefinitionKey();
+		List<FlowTaskDTO> mis = flowEngineService.getNodeByFlowableKey(modelKey);
+
+		// 杈撳嚭杩炵嚎
+		List<SequenceFlow> outFlows = flowNode.getOutgoingFlows();
+		for (SequenceFlow sequenceFlow : outFlows) {
+			//褰撳墠瀹℃壒鑺傜偣
+			if (NODE_NOW.equals(node)) {
+				FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement();
+				System.out.println("褰撳墠鑺傜偣: id=" + sourceFlowElement.getId() + ",name=" + sourceFlowElement.getName());
+			} else if (NODE_NEXT.equals(node)) {
+				// 涓嬩竴涓鎵硅妭鐐�
+				FlowElement targetFlow = sequenceFlow.getTargetFlowElement();
+				if (targetFlow instanceof UserTask) {
+					System.out.println("涓嬩竴鑺傜偣: id=" + targetFlow.getId() + ",name=" + targetFlow.getName());
+				}
+				// 濡傛灉涓嬩釜瀹℃壒鑺傜偣涓烘帓浠栫綉鍏�
+				if (targetFlow instanceof ExclusiveGateway) {
+
+					ExclusiveGateway exclusiveGateway = (ExclusiveGateway) targetFlow;
+					List<SequenceFlow> exclusiveGatewayOutgoingFlows = exclusiveGateway.getOutgoingFlows();
+					for (SequenceFlow nexti:exclusiveGatewayOutgoingFlows){
+						String conditionExpression = nexti.getConditionExpression();//condition
+						String taskId = nexti.getTargetRef();//taskId
+						String name = nexti.getName();//toName,椹冲洖銆佸悓鎰�
+
+						for (FlowTaskDTO flowTaskUserCi:mis){
+							if(taskId.equals(flowTaskUserCi.getTaskId())){
+								flowTaskUserCi.setCondition(conditionExpression);
+								if(conditionExpression.split("=").length>1) {
+									flowTaskUserCi.setConditionKey(conditionExpression.split("=")[0]);
+									flowTaskUserCi.setConditionValue(conditionExpression.split("=")[1]);
+								}
+								flowTaskUserCi.setToName(name);
+								flowTaskUserCi.setToTaskId(taskId);
+								flowTaskUserCi.setToTaskName(flowTaskUserCi.getTaskName());
+								taskList.add(flowTaskUserCi);
+							}
+						}
+					}
+				}
+			}
+		}
+		return flowTaskDTO;
+	}
+}

--
Gitblit v1.9.3