diff --git a/skyeye-activiti/src/main/java/com/skyeye/activiti/controller/CounterSignController.java b/skyeye-activiti/src/main/java/com/skyeye/activiti/controller/CounterSignController.java new file mode 100644 index 0000000000000000000000000000000000000000..5ea63181735dca814f5585eb4ea08f21aef0265a --- /dev/null +++ b/skyeye-activiti/src/main/java/com/skyeye/activiti/controller/CounterSignController.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright 卫志强 QQ:598748873@qq.com Inc. All rights reserved. 开源地址:https://gitee.com/doc_wei01/skyeye + ******************************************************************************/ + +package com.skyeye.activiti.controller; + +import com.skyeye.activiti.service.CounterSignService; +import com.skyeye.common.object.InputObject; +import com.skyeye.common.object.OutputObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @ClassName: CounterSignController + * @Description: 会签相关 + * @author: skyeye云系列--卫志强 + * @date: 2021/12/13 20:45 + * @Copyright: 2021 https://gitee.com/doc_wei01/skyeye Inc. All rights reserved. + * 注意:本内容仅限购买后使用.禁止私自外泄以及用于其他的商业目的 + */ +@Controller +public class CounterSignController { + + @Autowired + private CounterSignService counterSignService; + + /** + * 将 普通节点转换成为会签 任务 + * + * @param inputObject + * @param outputObject + * @throws Exception + */ + @RequestMapping("/post/CounterSignController/covertToMultiInstance") + @ResponseBody + public void covertToMultiInstance(InputObject inputObject, OutputObject outputObject) throws Exception { + counterSignService.covertToMultiInstance(inputObject, outputObject); + } + +} diff --git a/skyeye-activiti/src/main/java/com/skyeye/activiti/service/CounterSignService.java b/skyeye-activiti/src/main/java/com/skyeye/activiti/service/CounterSignService.java new file mode 100644 index 0000000000000000000000000000000000000000..494daa90db374aa7a70ea31a38a5c821fb684e9a --- /dev/null +++ b/skyeye-activiti/src/main/java/com/skyeye/activiti/service/CounterSignService.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright 卫志强 QQ:598748873@qq.com Inc. All rights reserved. 开源地址:https://gitee.com/doc_wei01/skyeye + ******************************************************************************/ + +package com.skyeye.activiti.service; + +import com.skyeye.common.object.InputObject; +import com.skyeye.common.object.OutputObject; +import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics; +import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior; + +import java.util.Map; + +/** + * @ClassName: CounterSignService + * @Description: 会签相关服务接口层 + * @author: skyeye云系列--卫志强 + * @date: 2021/12/13 20:45 + * @Copyright: 2021 https://gitee.com/doc_wei01/skyeye Inc. All rights reserved. + * 注意:本内容仅限购买后使用.禁止私自外泄以及用于其他的商业目的 + */ +public interface CounterSignService { + + /** + * 将 普通节点转换成为会签 任务 + * + * @param inputObject + * @param outputObject + * @throws Exception + */ + void covertToMultiInstance(InputObject inputObject, OutputObject outputObject) throws Exception; + + /** + * 创建多实例 循环解释器 + * + * @param isSequential 是否串行 + * @param assigneeListExp 用户组表达 + * @param assignee 用户标识 + * @return + */ + MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential, String assigneeListExp, String assignee); + + /** + * 创建多实例 循环解释器 + * + * @param isSequential 是否 串行 + * @return + */ + MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential); + + /** + * 创建 多实例 行为解释器 + * + * @param processInstanceId + * @param sequential + * @return + */ + MultiInstanceActivityBehavior createMultiInstanceBehavior(String processInstanceId, boolean sequential); + + /** + * 创建多实例行为解释器 + * + * @param processInstanceId 流程id + * @param sequential 是否串行 + * @param assigneeListExp 用户组表达 + * @param assigneeExp 用户标识 + * @return + */ + MultiInstanceActivityBehavior createMultiInstanceBehavior(String processInstanceId, boolean sequential, String assigneeListExp, String assigneeExp); + + /** + * 将 普通节点转换成为会签 任务 + * + * @param taskId + * @param sequential + * @param data + */ + void covertToMultiInstance(String taskId, boolean sequential, Map data); + + /** + * 将 普通节点转换成为会签 任务 + * @param taskId + * @param sequential + * @param assigneeExp 任务执行人表达式 + * @param data + */ + void covertToMultiInstance(String taskId, boolean sequential, String assigneeExp, Map data); + +} diff --git a/skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/CounterSignServiceImpl.java b/skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/CounterSignServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..566d61703f41da57bcdaa201a093f7e5d9db709f --- /dev/null +++ b/skyeye-activiti/src/main/java/com/skyeye/activiti/service/impl/CounterSignServiceImpl.java @@ -0,0 +1,214 @@ +/******************************************************************************* + * Copyright 卫志强 QQ:598748873@qq.com Inc. All rights reserved. 开源地址:https://gitee.com/doc_wei01/skyeye + ******************************************************************************/ + +package com.skyeye.activiti.service.impl; + +import com.skyeye.activiti.service.CounterSignService; +import com.skyeye.common.constans.ActivitiConstants; +import com.skyeye.common.object.InputObject; +import com.skyeye.common.object.OutputObject; +import org.activiti.bpmn.model.BpmnModel; +import org.activiti.bpmn.model.MultiInstanceLoopCharacteristics; +import org.activiti.bpmn.model.UserTask; +import org.activiti.engine.ProcessEngine; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.impl.RepositoryServiceImpl; +import org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior; +import org.activiti.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.activiti.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior; +import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.activiti.engine.impl.el.ExpressionManager; +import org.activiti.engine.impl.persistence.entity.ExecutionEntity; +import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; +import org.activiti.engine.impl.pvm.process.ActivityImpl; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @ClassName: CounterSignServiceImpl + * @Description: 会签相关服务类 + * @author: skyeye云系列--卫志强 + * @date: 2021/12/13 20:45 + * @Copyright: 2021 https://gitee.com/doc_wei01/skyeye Inc. All rights reserved. + * 注意:本内容仅限购买后使用.禁止私自外泄以及用于其他的商业目的 + */ +@Service +public class CounterSignServiceImpl implements CounterSignService { + + @Autowired + protected ProcessEngine processEngine; + + @Autowired + protected TaskService taskService; + + @Autowired + protected RepositoryService repositoryService; + + @Autowired + private RuntimeService runtimeService; + + /** + * 将 普通节点转换成为会签 任务 + * + * @param inputObject + * @param outputObject + * @throws Exception + */ + @Override + public void covertToMultiInstance(InputObject inputObject, OutputObject outputObject) throws Exception { + Map params = inputObject.getParams(); + + } + + /** + * 创建多实例 循环解释器 + * + * @param isSequential 是否串行 + * @param assigneeListExp 用户组表达 + * @param assignee 用户标识 + * @return + */ + @Override + public MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential, String assigneeListExp, String assignee) { + MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); + multiInstanceLoopCharacteristics.setSequential(isSequential); + multiInstanceLoopCharacteristics.setInputDataItem(assigneeListExp); + multiInstanceLoopCharacteristics.setElementVariable(assignee); + return multiInstanceLoopCharacteristics; + } + + /** + * 创建多实例 循环解释器 + * + * @param isSequential 是否 串行 + * @return + */ + @Override + public MultiInstanceLoopCharacteristics createMultiInstanceLoopCharacteristics(boolean isSequential) { + return this.createMultiInstanceLoopCharacteristics(isSequential, ActivitiConstants.DEFAULT_ASSIGNEE_LIST_EXP, ActivitiConstants.ASSIGNEE_USER); + } + + /** + * 创建 多实例 行为解释器 + * + * @param processInstanceId 流程id + * @param sequential + * @return + */ + @Override + public MultiInstanceActivityBehavior createMultiInstanceBehavior(String processInstanceId, boolean sequential) { + return createMultiInstanceBehavior(processInstanceId, sequential, ActivitiConstants.DEFAULT_ASSIGNEE_LIST_EXP, ActivitiConstants.ASSIGNEE_USER); + } + + /** + * 创建多实例行为解释器 + * + * @param processInstanceId 流程id + * @param sequential 是否串行 + * @param assigneeListExp 用户组表达 + * @param assigneeExp 用户标识 + * @return + */ + @Override + public MultiInstanceActivityBehavior createMultiInstanceBehavior(String processInstanceId, boolean sequential, String assigneeListExp, String assigneeExp) { + ActivityImpl activityNode = this.getCurrentActivityNode(processInstanceId); + if(activityNode == null){ + return null; + } + UserTask currentNode = this.getCurrentUserTask(processInstanceId); + ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration(); + /** + * 创建解释器 + */ + UserTaskActivityBehavior userTaskActivityBehavior = processEngineConfiguration.getActivityBehaviorFactory() + .createUserTaskActivityBehavior(currentNode, ((UserTaskActivityBehavior) activityNode.getActivityBehavior()).getTaskDefinition()); + + MultiInstanceActivityBehavior behavior = null; + if (sequential) { + behavior = new SequentialMultiInstanceBehavior(activityNode, userTaskActivityBehavior); + } else { + behavior = new ParallelMultiInstanceBehavior(activityNode, userTaskActivityBehavior); + } + + /** + * 注入表达式 解释器 + */ + ExpressionManager expressionManager = processEngineConfiguration.getExpressionManager(); + + /** + * 设置表达式变量 + */ + behavior.setCollectionExpression(expressionManager.createExpression(assigneeListExp)); + behavior.setCollectionElementVariable(assigneeExp); + + return behavior; + } + + private UserTask getCurrentUserTask(String processInstanceId) { + Task cueerntTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); + BpmnModel bpmnModel = repositoryService.getBpmnModel(cueerntTask.getProcessDefinitionId()); + org.activiti.bpmn.model.Process process = bpmnModel.getProcesses().get(0); + // 当前节点 + UserTask currentNode = (UserTask) process.getFlowElement(cueerntTask.getTaskDefinitionKey()); + return currentNode; + } + + /** + * 获取当前的activityImpl节点 + * + * @param processInstanceId processInstanceId + * @return + */ + private ActivityImpl getCurrentActivityNode(String processInstanceId){ + // 获取流程发布Id信息 + String definitionId = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().getProcessDefinitionId(); + ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(definitionId); + ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + + // 当前流程节点Id信息 + String activitiId = execution.getActivityId(); + // 获取流程所有节点信息 + List activitiList = processDefinitionEntity.getActivities(); + // 遍历所有节点信息 + for (ActivityImpl activityImpl : activitiList) { + String id = activityImpl.getId(); + if (activitiId.equals(id)) { + return activityImpl; + } + } + return null; + } + + /** + * 将 普通节点转换成为会签 任务 + * + * @param taskId + * @param sequential + * @param data + */ + @Override + public void covertToMultiInstance(String taskId, boolean sequential, Map data) { + + } + + /** + * 将 普通节点转换成为会签 任务 + * + * @param taskId + * @param sequential + * @param assigneeExp 任务执行人表达式 + * @param data + */ + @Override + public void covertToMultiInstance(String taskId, boolean sequential, String assigneeExp, Map data) { + + } +} diff --git a/skyeye-common/src/main/java/com/skyeye/common/constans/ActivitiConstants.java b/skyeye-common/src/main/java/com/skyeye/common/constans/ActivitiConstants.java index d8b7f6061ad24dd5620fb540e473d626988e0b07..99e5eac3086f5968106dbb3d93266dc2a2c6afd5 100644 --- a/skyeye-common/src/main/java/com/skyeye/common/constans/ActivitiConstants.java +++ b/skyeye-common/src/main/java/com/skyeye/common/constans/ActivitiConstants.java @@ -25,6 +25,12 @@ public class ActivitiConstants { public static final String APPROVAL_NO_PASS = "nopass"; + public static final String ASSIGNEE_USER = "assignee"; + + public static final String DEFAULT_ASSIGNEE_LIST_EXP = "${assigneeList}"; + + public static final String ASSIGNEE_USER_EXP = "${" + ASSIGNEE_USER + "}"; + /** * form表单数据存储在task的varables的key */ diff --git a/skyeye-common/src/main/java/com/skyeye/eve/service/impl/SysEnclosureServiceImpl.java b/skyeye-common/src/main/java/com/skyeye/eve/service/impl/SysEnclosureServiceImpl.java index 2ef060d9299b6a478e227ba945dd1b4f91acca5c..3abde1dfc7a2d5f921167f9d299afaea07dfa444 100644 --- a/skyeye-common/src/main/java/com/skyeye/eve/service/impl/SysEnclosureServiceImpl.java +++ b/skyeye-common/src/main/java/com/skyeye/eve/service/impl/SysEnclosureServiceImpl.java @@ -205,7 +205,6 @@ public class SysEnclosureServiceImpl implements SysEnclosureService{ * @return void 返回类型 * @throws */ - @SuppressWarnings({ "static-access", "rawtypes", "unchecked" }) @Override @Transactional(value="transactionManager") public void insertUploadFileByUserId(InputObject inputObject, OutputObject outputObject) throws Exception { @@ -271,7 +270,6 @@ public class SysEnclosureServiceImpl implements SysEnclosureService{ * @return void 返回类型 * @throws */ - @SuppressWarnings({ "resource", "unchecked" }) @Override @Transactional(value="transactionManager") public void insertUploadFileChunksByUserId(InputObject inputObject, OutputObject outputObject) throws Exception { @@ -331,7 +329,6 @@ public class SysEnclosureServiceImpl implements SysEnclosureService{ * @return void 返回类型 * @throws */ - @SuppressWarnings({ "unchecked", "unused" }) @Override public void queryUploadFileChunksByChunkMd5(InputObject inputObject, OutputObject outputObject) throws Exception { Map map = inputObject.getParams(); diff --git a/skyeye-knowlg/src/main/java/com/skyeye/eve/service/impl/KnowledgeContentServiceImpl.java b/skyeye-knowlg/src/main/java/com/skyeye/eve/service/impl/KnowledgeContentServiceImpl.java index d6b9a6bc97d8827b4a656b14485b516ee2be598d..5ecfe3dffee5d72d78fe039df61edcfc6b59d3a5 100644 --- a/skyeye-knowlg/src/main/java/com/skyeye/eve/service/impl/KnowledgeContentServiceImpl.java +++ b/skyeye-knowlg/src/main/java/com/skyeye/eve/service/impl/KnowledgeContentServiceImpl.java @@ -177,7 +177,6 @@ public class KnowledgeContentServiceImpl implements KnowledgeContentService { * @return void 返回类型 * @throws */ - @SuppressWarnings({ "static-access", "rawtypes", "unchecked" }) @Override public void insertUploadFileByUserId(InputObject inputObject, OutputObject outputObject) throws Exception { Map map = inputObject.getParams(); @@ -241,7 +240,6 @@ public class KnowledgeContentServiceImpl implements KnowledgeContentService { * @return void 返回类型 * @throws */ - @SuppressWarnings({ "unchecked", "resource" }) @Override public void insertUploadFileChunksByUserId(InputObject inputObject, OutputObject outputObject) throws Exception { Map map = inputObject.getParams(); @@ -321,7 +319,6 @@ public class KnowledgeContentServiceImpl implements KnowledgeContentService { * @return void 返回类型 * @throws */ - @SuppressWarnings({ "unchecked", "unused" }) @Override public void queryUploadFileChunksByChunkMd5(InputObject inputObject, OutputObject outputObject) throws Exception { Map map = inputObject.getParams();