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