Przeglądaj źródła

优化办理逻辑

java110 4 lat temu
rodzic
commit
eadc0790df

+ 19 - 0
java110-interface/src/main/java/com/java110/intf/common/IOaWorkflowUserInnerServiceSMO.java

@@ -67,6 +67,25 @@ public interface IOaWorkflowUserInnerServiceSMO {
     @RequestMapping(value = "/completeTask", method = RequestMethod.POST)
     boolean completeTask(@RequestBody JSONObject reqJson);
 
+    /**
+     * 处理任务
+     *
+     * @param reqJson
+     * @return true 为流程结束 false 为流程没有结束
+     */
+    @RequestMapping(value = "/changeTaskToOtherUser", method = RequestMethod.POST)
+    boolean changeTaskToOtherUser(@RequestBody JSONObject reqJson);
+
+    /**
+     * 处理任务
+     *
+     * @param reqJson
+     * @return true 为流程结束 false 为流程没有结束
+     */
+    @RequestMapping(value = "/goBackTask", method = RequestMethod.POST)
+    boolean goBackTask(@RequestBody JSONObject reqJson);
+
+
     /**
      * 查询批注信息
      *

+ 1 - 0
service-common/pom.xml

@@ -37,6 +37,7 @@
             <artifactId>activiti-spring-boot-starter-basic</artifactId>
         </dependency>
 
+
         <dependency>
             <groupId>org.activiti</groupId>
             <artifactId>activiti-json-converter</artifactId>

+ 102 - 4
service-common/src/main/java/com/java110/common/smo/impl/OaWorkflowUserInnerServiceSMOImpl.java

@@ -13,19 +13,28 @@ import com.java110.intf.common.IWorkflowInnerServiceSMO;
 import com.java110.intf.user.IUserInnerServiceSMO;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.StringUtil;
+import org.activiti.bpmn.model.BpmnModel;
+import org.activiti.bpmn.model.FlowNode;
+import org.activiti.bpmn.model.SequenceFlow;
 import org.activiti.engine.HistoryService;
 import org.activiti.engine.ProcessEngine;
+import org.activiti.engine.RepositoryService;
 import org.activiti.engine.RuntimeService;
 import org.activiti.engine.TaskService;
+import org.activiti.engine.history.HistoricActivityInstance;
 import org.activiti.engine.history.HistoricProcessInstance;
 import org.activiti.engine.history.HistoricTaskInstance;
 import org.activiti.engine.history.HistoricTaskInstanceQuery;
 import org.activiti.engine.impl.identity.Authentication;
+import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
 import org.activiti.engine.query.Query;
+import org.activiti.engine.runtime.Execution;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Comment;
 import org.activiti.engine.task.Task;
 import org.activiti.engine.task.TaskQuery;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
@@ -39,6 +48,7 @@ import java.util.Map;
 @RestController
 public class OaWorkflowUserInnerServiceSMOImpl extends BaseServiceSMO implements IOaWorkflowUserInnerServiceSMO {
 
+    private static Logger logger = LoggerFactory.getLogger(OaWorkflowUserInnerServiceSMOImpl.class);
     @Autowired
     private ProcessEngine processEngine;
 
@@ -48,12 +58,18 @@ public class OaWorkflowUserInnerServiceSMOImpl extends BaseServiceSMO implements
     @Autowired
     private TaskService taskService;
 
+    @Autowired
+    private HistoryService historyService;
+
     @Autowired
     private IUserInnerServiceSMO userInnerServiceSMOImpl;
 
     @Autowired
     private IWorkflowInnerServiceSMO workflowInnerServiceSMOImpl;
 
+    @Autowired
+    private RepositoryService repositoryService;
+
 
     /**
      * 启动流程
@@ -220,13 +236,11 @@ public class OaWorkflowUserInnerServiceSMOImpl extends BaseServiceSMO implements
         TaskService taskService = processEngine.getTaskService();
         Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult();
         String processInstanceId = task.getProcessInstanceId();
-        Authentication.setAuthenticatedUserId(reqJson.getString("createUserId"));
+        Authentication.setAuthenticatedUserId(reqJson.getString("nextUserId"));
         taskService.addComment(reqJson.getString("taskId"), processInstanceId, reqJson.getString("auditMessage"));
         Map<String, Object> variables = new HashMap<String, Object>();
-        variables.put("auditCode", reqJson.getString("auditCode"));
         variables.put("nextUserId", reqJson.getString("nextUserId"));
-        variables.put("flag", "1200".equals(reqJson.getString("auditCode")) ? "false" : "true");
-        variables.put("startUserId", reqJson.getString("startUserId"));
+        //variables.put("startUserId", reqJson.getString("startUserId"));
         taskService.complete(reqJson.getString("taskId"), variables);
 
         ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
@@ -236,6 +250,90 @@ public class OaWorkflowUserInnerServiceSMOImpl extends BaseServiceSMO implements
         return false;
     }
 
+    public boolean changeTaskToOtherUser(@RequestBody JSONObject reqJson) {
+        TaskService taskService = processEngine.getTaskService();
+        Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult();
+        String processInstanceId = task.getProcessInstanceId();
+        taskService.addComment(reqJson.getString("taskId"), processInstanceId, reqJson.getString("auditMessage"));
+        taskService.setAssignee(reqJson.getString("taskId"), reqJson.getString("nextUserId"));
+        taskService.setOwner(reqJson.getString("taskId"), reqJson.getString("nextUserId"));
+        return true;
+    }
+
+    public boolean goBackTask(@RequestBody JSONObject reqJson) {
+        TaskService taskService = processEngine.getTaskService();
+        Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult();
+        if (task == null) {
+            throw new IllegalArgumentException("流程未启动或已执行完成,无法退回");
+        }
+        List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()
+                .processInstanceBusinessKey(reqJson.getString("id"))
+                .orderByTaskCreateTime()
+                .asc()
+                .list();
+        String myTaskId = null;
+        HistoricTaskInstance myTask = null;
+        for (HistoricTaskInstance hti : htiList) {
+            if (reqJson.getString("curUserId").equals(hti.getAssignee())) {
+                myTaskId = hti.getId();
+                myTask = hti;
+                break;
+            }
+        }
+        if (null == myTaskId) {
+            throw new IllegalArgumentException("该任务非当前用户提交,无法退回");
+        }
+
+        String processDefinitionId = myTask.getProcessDefinitionId();
+        ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
+        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
+
+        //变量
+//		Map<String, VariableInstance> variables = runtimeService.getVariableInstances(currentTask.getExecutionId());
+        String myActivityId = null;
+        List<HistoricActivityInstance> haiList = historyService.createHistoricActivityInstanceQuery()
+                .executionId(myTask.getExecutionId()).finished().list();
+        for (HistoricActivityInstance hai : haiList) {
+            if (myTaskId.equals(hai.getTaskId())) {
+                myActivityId = hai.getActivityId();
+                break;
+            }
+        }
+        FlowNode myFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId);
+
+
+        Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();
+        String activityId = execution.getActivityId();
+        logger.warn("------->> activityId:" + activityId);
+        FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId);
+
+        //记录原活动方向
+        List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
+        oriSequenceFlows.addAll(flowNode.getOutgoingFlows());
+
+        //清理活动方向
+        flowNode.getOutgoingFlows().clear();
+        //建立新方向
+        List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
+        SequenceFlow newSequenceFlow = new SequenceFlow();
+        newSequenceFlow.setId("newSequenceFlowId");
+        newSequenceFlow.setSourceFlowElement(flowNode);
+        newSequenceFlow.setTargetFlowElement(myFlowNode);
+        newSequenceFlowList.add(newSequenceFlow);
+        flowNode.setOutgoingFlows(newSequenceFlowList);
+
+        Authentication.setAuthenticatedUserId(reqJson.getString("curUserId"));
+        taskService.addComment(task.getId(), task.getProcessInstanceId(), "退回," + reqJson.getString("auditMessage"));
+
+        Map<String, Object> currentVariables = new HashMap<String, Object>();
+        currentVariables.put("applier", reqJson.getString("curUserId"));
+        //完成任务
+        taskService.complete(task.getId(), currentVariables);
+        //恢复原方向
+        flowNode.setOutgoingFlows(oriSequenceFlows);
+        return true;
+    }
+
     public List<AuditMessageDto> getAuditMessage(@RequestBody JSONObject reqJson) {
 
         TaskService taskService = processEngine.getTaskService();

+ 2 - 0
service-oa/src/main/java/com/java110/oa/api/OaWorkflowApi.java

@@ -440,6 +440,7 @@ public class OaWorkflowApi {
      */
     @RequestMapping(value = "/auditOaWorkflow", method = RequestMethod.POST)
     public ResponseEntity<String> auditOaWorkflow(@RequestHeader(value = "store-id") String storeId,
+                                                  @RequestHeader(value = "user-id") String userId,
                                                   @RequestBody JSONObject reqJson) {
         Assert.hasKeyAndValue(reqJson, "flowId", "flowId不能为空");
         Assert.hasKeyAndValue(reqJson, "id", "id不能为空");
@@ -447,6 +448,7 @@ public class OaWorkflowApi {
         Assert.hasKeyAndValue(reqJson, "auditMessage", "审核意见不能为空");
         Assert.hasKeyAndValue(reqJson, "auditCode", "审核状态不能为空");
         reqJson.put("storeId", storeId);
+        reqJson.put("curUserId", userId);
         return getOaWorkflowFormBMOImpl.auditOaWorkflow(reqJson);
     }
 }

+ 26 - 6
service-oa/src/main/java/com/java110/oa/bmo/oaWorkflowForm/impl/GetOaWorkflowFormBMOImpl.java

@@ -249,7 +249,7 @@ public class GetOaWorkflowFormBMOImpl implements IGetOaWorkflowFormBMO {
         if (count > 0) {
             datas = oaWorkflowUserInnerServiceSMOImpl.getUserHistoryTasks(auditUser);
             //刷新 表单数据
-            freshFormData(datas, paramIn,oaWorkflowFormDtos.get(0));
+            freshFormData(datas, paramIn, oaWorkflowFormDtos.get(0));
         } else {
             datas = new ArrayList<>();
         }
@@ -276,14 +276,34 @@ public class GetOaWorkflowFormBMOImpl implements IGetOaWorkflowFormBMO {
         List<OaWorkflowFormDto> oaWorkflowFormDtos = oaWorkflowFormInnerServiceSMOImpl.queryOaWorkflowForms(oaWorkflowFormDto);
         Assert.listOnlyOne(oaWorkflowFormDtos, "未包含流程表单,请先设置表单");
 
-
-        reqJson.put("nextUserId", reqJson.getString("taskId"));
-        boolean isLastTask = oaWorkflowUserInnerServiceSMOImpl.completeTask(reqJson);
-        if (isLastTask) {
-            reqJson.put("state", "1005");
+        //业务办理
+        if ("1100".equals(reqJson.getString("auditCode"))) {
+            reqJson.put("nextUserId", reqJson.getString("staffId"));
+            boolean isLastTask = oaWorkflowUserInnerServiceSMOImpl.completeTask(reqJson);
+            if (isLastTask) {
+                reqJson.put("state", "1005");
+            } else {
+                reqJson.put("state", "1002");
+            }
+            reqJson.put("tableName", oaWorkflowFormDtos.get(0).getTableName());
+            oaWorkflowFormInnerServiceSMOImpl.updateOaWorkflowFormData(reqJson);
+        } else if ("1300".equals(reqJson.getString("auditCode"))) {
+            reqJson.put("nextUserId", reqJson.getString("staffId"));
+            oaWorkflowUserInnerServiceSMOImpl.changeTaskToOtherUser(reqJson);
+            reqJson.put("state", "1004");
             reqJson.put("tableName", oaWorkflowFormDtos.get(0).getTableName());
             oaWorkflowFormInnerServiceSMOImpl.updateOaWorkflowFormData(reqJson);
+        } else if ("1200".equals(reqJson.getString("auditCode"))) {
+            reqJson.put("curUserId", reqJson.getString("curUserId"));
+            oaWorkflowUserInnerServiceSMOImpl.goBackTask(reqJson);
+            reqJson.put("state", "1003");
+            reqJson.put("tableName", oaWorkflowFormDtos.get(0).getTableName());
+            oaWorkflowFormInnerServiceSMOImpl.updateOaWorkflowFormData(reqJson);
+        } else {
+            throw new IllegalArgumentException("不支持的类型");
         }
+
+
         return ResultVo.success();
     }