package com.java110.common.smo.impl; import com.alibaba.fastjson.JSONObject; import com.java110.core.annotation.Java110Transactional; import com.java110.core.base.smo.BaseServiceSMO; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.PageDto; import com.java110.dto.audit.AuditMessageDto; import com.java110.dto.oaWorkflow.OaWorkflowDataDto; import com.java110.dto.oaWorkflow.OaWorkflowXmlDto; import com.java110.dto.purchase.PurchaseApplyDto; import com.java110.dto.user.UserDto; import com.java110.dto.oaWorkflow.WorkflowDto; import com.java110.dto.audit.AuditUser; import com.java110.intf.common.IOaWorkflowActivitiInnerServiceSMO; import com.java110.intf.common.IWorkflowInnerServiceSMO; import com.java110.intf.oa.IOaWorkflowDataInnerServiceSMO; import com.java110.intf.store.IPurchaseApplyInnerServiceSMO; import com.java110.intf.user.IUserInnerServiceSMO; import com.java110.po.oaWorkflow.OaWorkflowDataPo; import com.java110.po.purchase.PurchaseApplyPo; import com.java110.utils.exception.SMOException; import com.java110.utils.util.Assert; import com.java110.utils.util.DateUtil; import com.java110.utils.util.StringUtil; import org.activiti.bpmn.converter.BpmnXMLConverter; import org.activiti.bpmn.model.*; import org.activiti.bpmn.model.Process; import org.activiti.engine.*; 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.query.Query; 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 com.java110.core.log.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.ByteArrayInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.*; //@Service("resourceEntryStoreSMOImpl") @RestController public class OaWorkflowActivitiInnerServiceSMOImpl extends BaseServiceSMO implements IOaWorkflowActivitiInnerServiceSMO { private static Logger logger = LoggerFactory.getLogger(OaWorkflowActivitiInnerServiceSMOImpl.class); @Autowired private ProcessEngine processEngine; @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private HistoryService historyService; @Autowired private IUserInnerServiceSMO userInnerServiceSMOImpl; @Autowired private IWorkflowInnerServiceSMO workflowInnerServiceSMOImpl; @Autowired private RepositoryService repositoryService; @Autowired private IOaWorkflowDataInnerServiceSMO oaWorkflowDataInnerServiceSMOImpl; @Autowired private IPurchaseApplyInnerServiceSMO purchaseApplyInnerServiceSMOImpl; /** * 启动流程 * * @return */ public JSONObject startProcess(@RequestBody JSONObject reqJson) { //将信息加入map,以便传入流程中 Map variables = new HashMap(); //variables.put("reqJson", reqJson); variables.put("startUserId", reqJson.getString("createUserId")); variables.put("nextUserId", reqJson.getString("createUserId")); UserDto userDto = new UserDto(); userDto.setUserId(reqJson.getString("createUserId")); List users = userInnerServiceSMOImpl.getUsers(userDto); Assert.listOnlyOne(users, "用户不存在"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(getWorkflowDto(reqJson.getString("flowId")), reqJson.getString("id"), variables); //将得到的实例流程id值赋给之前设置的变量 String processInstanceId = processInstance.getId(); // System.out.println("流程开启成功.......实例流程id:" + processInstanceId); reqJson.put("processInstanceId", processInstanceId); //第一个节点自动提交 //autoFinishFirstTask(reqJson); //刷入扩展表 OaWorkflowDataPo oaWorkflowDataPo = null; oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setBusinessKey(reqJson.getString("id")); oaWorkflowDataPo.setFlowId(reqJson.getString("flowId")); oaWorkflowDataPo.setContext(reqJson.getString("auditMessage")); oaWorkflowDataPo.setDataId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_dataId)); oaWorkflowDataPo.setEvent(OaWorkflowDataDto.EVENT_COMMIT); oaWorkflowDataPo.setPreDataId("-1"); oaWorkflowDataPo.setStaffId(reqJson.getString("createUserId")); oaWorkflowDataPo.setStaffName(users.get(0).getName()); oaWorkflowDataPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setStoreId(reqJson.getString("storeId")); oaWorkflowDataInnerServiceSMOImpl.saveOaWorkflowData(oaWorkflowDataPo); return reqJson; } private String getWorkflowDto(String flowId) { return WorkflowDto.DEFAULT_PROCESS + flowId; } /** * 自动提交第一步 */ public boolean autoFinishFirstTask(@RequestBody JSONObject reqJson) { Task task = null; TaskQuery query = taskService.createTaskQuery().taskCandidateOrAssigned(reqJson.getString("createUserId")).active(); List todoList = query.list();//获取申请人的待办任务列表 for (Task tmp : todoList) { if (tmp.getProcessInstanceId().equals(reqJson.getString("processInstanceId"))) { task = tmp;//获取当前流程实例,当前申请人的待办任务 break; } } if (task == null) { PurchaseApplyDto purchaseApplyDto = new PurchaseApplyDto(); purchaseApplyDto.setApplyOrderId(reqJson.getString("id")); List purchaseApplyList = purchaseApplyInnerServiceSMOImpl.queryPurchaseApplys(purchaseApplyDto); if (purchaseApplyList != null && purchaseApplyList.size() == 1) { PurchaseApplyPo purchaseApplyPo = new PurchaseApplyPo(); purchaseApplyPo.setApplyOrderId(reqJson.getString("id")); purchaseApplyPo.setStatusCd("1"); purchaseApplyInnerServiceSMOImpl.updatePurchaseApply(purchaseApplyPo); } } Assert.notNull(task, "未找到当前用户任务userId = " + reqJson.getString("createUserId")); reqJson.put("taskId", task.getId()); reqJson.put("auditCode", "10000"); reqJson.put("auditMessage", "提交"); return completeTask(reqJson); } /** * 查询用户任务数 * * @param user * @return */ public long getUserTaskCount(@RequestBody AuditUser user) { TaskService taskService = processEngine.getTaskService(); TaskQuery query = taskService.createTaskQuery().processDefinitionKey(getWorkflowDto(user.getFlowId())); query.taskAssignee(user.getUserId()); return query.count(); } /** * 获取用户任务 * * @param user 用户信息 */ public List getUserTasks(@RequestBody AuditUser user) { TaskService taskService = processEngine.getTaskService(); TaskQuery query = taskService.createTaskQuery().processDefinitionKey(getWorkflowDto(user.getFlowId())); query.taskAssignee(user.getUserId()); query.orderByTaskCreateTime().desc(); List list = null; if (user.getPage() != PageDto.DEFAULT_PAGE) { list = query.listPage((user.getPage() - 1) * user.getRow(), user.getRow()); } else { list = query.list(); } JSONObject taskBusinessKeyMap = null; List tasks = new ArrayList<>(); for (Task task : list) { taskBusinessKeyMap = new JSONObject(); String processInstanceId = task.getProcessInstanceId(); //3.使用流程实例,查询 ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //4.使用流程实例对象获取BusinessKey String business_key = pi.getBusinessKey(); taskBusinessKeyMap.put(business_key, task.getId()); taskBusinessKeyMap.put("taskId", task.getId()); taskBusinessKeyMap.put("id", business_key); tasks.add(taskBusinessKeyMap); } return tasks; } /** * 查询用户任务数 * * @param user * @return */ public long getUserHistoryTaskCount(@RequestBody AuditUser user) { HistoryService historyService = processEngine.getHistoryService(); // Query query = historyService.createHistoricTaskInstanceQuery() // .processDefinitionKey("complaint") // .taskAssignee(user.getUserId()); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() .processDefinitionKey(getWorkflowDto(user.getFlowId())) .taskAssignee(user.getUserId()) .finished(); if (!StringUtil.isEmpty(user.getAuditLink()) && "START".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaint"); } else if (!StringUtil.isEmpty(user.getAuditLink()) && "AUDIT".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaitDealUser"); } Query query = historicTaskInstanceQuery; return query.count(); } /** * 获取用户审批的任务 * * @param user 用户信息 */ public List getUserHistoryTasks(@RequestBody AuditUser user) { HistoryService historyService = processEngine.getHistoryService(); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() .processDefinitionKey(getWorkflowDto(user.getFlowId())) .taskAssignee(user.getUserId()) .finished(); if (!StringUtil.isEmpty(user.getAuditLink()) && "START".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaint"); } else if (!StringUtil.isEmpty(user.getAuditLink()) && "AUDIT".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaitDealUser"); } Query query = historicTaskInstanceQuery.orderByHistoricTaskInstanceStartTime().desc(); List list = null; if (user.getPage() != PageDto.DEFAULT_PAGE) { list = query.listPage((user.getPage() - 1) * user.getRow(), user.getRow()); } else { list = query.list(); } JSONObject taskBusinessKeyMap = null; List tasks = new ArrayList<>(); List complaintIds = new ArrayList<>(); for (HistoricTaskInstance task : list) { taskBusinessKeyMap = new JSONObject(); String processInstanceId = task.getProcessInstanceId(); //3.使用流程实例,查询 HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //4.使用流程实例对象获取BusinessKey String business_key = pi.getBusinessKey(); taskBusinessKeyMap.put(business_key, task.getId()); taskBusinessKeyMap.put("taskId", task.getId()); taskBusinessKeyMap.put("id", business_key); tasks.add(taskBusinessKeyMap); } return tasks; } /** * 查询用户任务数 * * @param user{ userId:'' * processDefinitionkeys:[] * } * @return */ public long getDefinitionKeysUserTaskCount(@RequestBody AuditUser user) { TaskService taskService = processEngine.getTaskService(); TaskQuery query = taskService.createTaskQuery().processDefinitionKeyIn(user.getProcessDefinitionKeys()); query.taskAssignee(user.getUserId()); return query.count(); } /** * 获取用户任务 * * @param user 用户信息{ * processDefinitionKeys:[], *

* } */ public List getDefinitionKeysUserTasks(@RequestBody AuditUser user) { TaskService taskService = processEngine.getTaskService(); TaskQuery query = taskService.createTaskQuery().processDefinitionKeyIn(user.getProcessDefinitionKeys()); query.taskAssignee(user.getUserId()); query.orderByTaskCreateTime().desc(); List list = null; if (user.getPage() != PageDto.DEFAULT_PAGE) { list = query.listPage((user.getPage() - 1) * user.getRow(), user.getRow()); } else { list = query.list(); } JSONObject taskBusinessKeyMap = null; List tasks = new ArrayList<>(); for (Task task : list) { taskBusinessKeyMap = new JSONObject(); String processInstanceId = task.getProcessInstanceId(); //3.使用流程实例,查询 ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //4.使用流程实例对象获取BusinessKey String business_key = pi.getBusinessKey(); taskBusinessKeyMap.put(business_key, task.getId()); taskBusinessKeyMap.put("taskId", task.getId()); taskBusinessKeyMap.put("id", business_key); tasks.add(taskBusinessKeyMap); } return tasks; } /** * 查询用户任务数 * * @param user * @return */ public long getDefinitionKeysUserHistoryTaskCount(@RequestBody AuditUser user) { HistoryService historyService = processEngine.getHistoryService(); // Query query = historyService.createHistoricTaskInstanceQuery() // .processDefinitionKey("complaint") // .taskAssignee(user.getUserId()); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() .processDefinitionKeyIn(user.getProcessDefinitionKeys()) .taskAssignee(user.getUserId()) .finished(); if (!StringUtil.isEmpty(user.getAuditLink()) && "START".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaint"); } else if (!StringUtil.isEmpty(user.getAuditLink()) && "AUDIT".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaitDealUser"); } Query query = historicTaskInstanceQuery; return query.count(); } /** * 获取用户审批的任务 * * @param user 用户信息 */ public List getDefinitionKeysUserHistoryTasks(@RequestBody AuditUser user) { HistoryService historyService = processEngine.getHistoryService(); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() .processDefinitionKeyIn(user.getProcessDefinitionKeys()) .taskAssignee(user.getUserId()) .finished(); if (!StringUtil.isEmpty(user.getAuditLink()) && "START".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaint"); } else if (!StringUtil.isEmpty(user.getAuditLink()) && "AUDIT".equals(user.getAuditLink())) { historicTaskInstanceQuery.taskName("complaitDealUser"); } Query query = historicTaskInstanceQuery.orderByHistoricTaskInstanceStartTime().desc(); List list = null; if (user.getPage() != PageDto.DEFAULT_PAGE) { list = query.listPage((user.getPage() - 1) * user.getRow(), user.getRow()); } else { list = query.list(); } JSONObject taskBusinessKeyMap = null; List tasks = new ArrayList<>(); List complaintIds = new ArrayList<>(); for (HistoricTaskInstance task : list) { taskBusinessKeyMap = new JSONObject(); String processInstanceId = task.getProcessInstanceId(); //3.使用流程实例,查询 HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); //4.使用流程实例对象获取BusinessKey String business_key = pi.getBusinessKey(); taskBusinessKeyMap.put(business_key, task.getId()); taskBusinessKeyMap.put("taskId", task.getId()); taskBusinessKeyMap.put("id", business_key); tasks.add(taskBusinessKeyMap); } return tasks; } @Java110Transactional public boolean completeTask(@RequestBody JSONObject reqJson) { TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult(); if (task == null) { throw new IllegalArgumentException("任务已处理"); } //判断是否为结束流程 // if ("1500".equals(reqJson.getString("auditCode"))) { // doTaskFinish(reqJson); // } else { // //扩展 工作流功能 // doTaskAuditAgree(reqJson); // } String processInstanceId = task.getProcessInstanceId(); Authentication.setAuthenticatedUserId(reqJson.getString("nextUserId")); taskService.addComment(reqJson.getString("taskId"), processInstanceId, reqJson.getString("auditMessage")); Map variables = new HashMap(); variables.put("nextUserId", reqJson.getString("nextUserId")); variables.put("auditCode", reqJson.getString("auditCode")); taskService.complete(reqJson.getString("taskId"), variables); ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); if (pi == null) { doTaskFinish(reqJson); return true; } //扩展 工作流功能 doTaskAuditAgree(reqJson); return false; } private void doTaskFinish(JSONObject reqJson) { OaWorkflowDataDto oaWorkflowDataDto = new OaWorkflowDataDto(); oaWorkflowDataDto.setStoreId(reqJson.getString("storeId")); oaWorkflowDataDto.setBusinessKey(reqJson.getString("id")); oaWorkflowDataDto.setPage(1); oaWorkflowDataDto.setRow(1); oaWorkflowDataDto.setHis("N"); List oaWorkflowDataDtos = oaWorkflowDataInnerServiceSMOImpl.queryOaWorkflowDatas(oaWorkflowDataDto); if (oaWorkflowDataDtos == null || oaWorkflowDataDtos.size() < 1) { return; } //修改 当前 为完成 OaWorkflowDataPo oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setDataId(oaWorkflowDataDtos.get(0).getDataId()); oaWorkflowDataPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setContext(reqJson.getString("auditMessage")); oaWorkflowDataInnerServiceSMOImpl.updateOaWorkflowData(oaWorkflowDataPo); } /** * 处理 审核状态 * * @param reqJson */ private void doTaskAuditAgree(JSONObject reqJson) { UserDto userDto = new UserDto(); userDto.setUserId(reqJson.getString("nextUserId")); List users = userInnerServiceSMOImpl.getUsers(userDto); Assert.listOnlyOne(users, "用户不存在"); String preDataId = "-1"; //查询当前节点 OaWorkflowDataDto oaWorkflowDataDto = new OaWorkflowDataDto(); oaWorkflowDataDto.setStoreId(reqJson.getString("storeId")); oaWorkflowDataDto.setBusinessKey(reqJson.getString("id")); oaWorkflowDataDto.setPage(1); oaWorkflowDataDto.setRow(1); List oaWorkflowDataDtos = oaWorkflowDataInnerServiceSMOImpl.queryOaWorkflowDatas(oaWorkflowDataDto); OaWorkflowDataPo oaWorkflowDataPo = null; if (oaWorkflowDataDtos == null || oaWorkflowDataDtos.size() < 1) { oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setBusinessKey(reqJson.getString("id")); oaWorkflowDataPo.setFlowId(reqJson.getString("flowId")); oaWorkflowDataPo.setContext(""); oaWorkflowDataPo.setDataId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_dataId)); oaWorkflowDataPo.setEvent(OaWorkflowDataDto.EVENT_COMMIT); oaWorkflowDataPo.setPreDataId(preDataId); oaWorkflowDataPo.setStaffId(reqJson.getString("nextUserId")); oaWorkflowDataPo.setStaffName(users.get(0).getName()); oaWorkflowDataPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setStoreId(reqJson.getString("storeId")); oaWorkflowDataInnerServiceSMOImpl.saveOaWorkflowData(oaWorkflowDataPo); return; } //修改 当前 为完成 oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setDataId(oaWorkflowDataDtos.get(0).getDataId()); oaWorkflowDataPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setContext(reqJson.getString("auditMessage")); oaWorkflowDataInnerServiceSMOImpl.updateOaWorkflowData(oaWorkflowDataPo); //如果为-1 不插入任务 if ("-1".equals(reqJson.getString("nextUserId"))) { return; } oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setBusinessKey(reqJson.getString("id")); oaWorkflowDataPo.setFlowId(reqJson.getString("flowId")); oaWorkflowDataPo.setContext(""); oaWorkflowDataPo.setDataId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_dataId)); oaWorkflowDataPo.setEvent(OaWorkflowDataDto.EVENT_COMMIT); oaWorkflowDataPo.setPreDataId(oaWorkflowDataDtos.get(0).getDataId()); oaWorkflowDataPo.setStaffId(reqJson.getString("nextUserId")); oaWorkflowDataPo.setStaffName(users.get(0).getName()); oaWorkflowDataPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setStoreId(reqJson.getString("storeId")); oaWorkflowDataInnerServiceSMOImpl.saveOaWorkflowData(oaWorkflowDataPo); } /** * 转办 * * @param reqJson * @return */ @Java110Transactional public boolean changeTaskToOtherUser(@RequestBody JSONObject reqJson) { //查询当前节点 OaWorkflowDataDto oaWorkflowDataDto = new OaWorkflowDataDto(); oaWorkflowDataDto.setStoreId(reqJson.getString("storeId")); oaWorkflowDataDto.setBusinessKey(reqJson.getString("id")); oaWorkflowDataDto.setPage(1); oaWorkflowDataDto.setRow(1); List oaWorkflowDataDtos = oaWorkflowDataInnerServiceSMOImpl.queryOaWorkflowDatas(oaWorkflowDataDto); Assert.listOnlyOne(oaWorkflowDataDtos, "数据错误未包含上级数据"); UserDto userDto = new UserDto(); userDto.setUserId(reqJson.getString("nextUserId")); List users = userInnerServiceSMOImpl.getUsers(userDto); Assert.listOnlyOne(users, "用户不存在"); 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")); OaWorkflowDataPo oaWorkflowDataPo = null; //修改 当前 为完成 oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setDataId(oaWorkflowDataDtos.get(0).getDataId()); oaWorkflowDataPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setContext(reqJson.getString("auditMessage")); oaWorkflowDataInnerServiceSMOImpl.updateOaWorkflowData(oaWorkflowDataPo); oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setBusinessKey(reqJson.getString("id")); oaWorkflowDataPo.setFlowId(reqJson.getString("flowId")); oaWorkflowDataPo.setContext(""); oaWorkflowDataPo.setDataId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_dataId)); oaWorkflowDataPo.setEvent(OaWorkflowDataDto.EVENT_TRANSFER); oaWorkflowDataPo.setPreDataId(oaWorkflowDataDtos.get(0).getDataId()); oaWorkflowDataPo.setStaffId(reqJson.getString("nextUserId")); oaWorkflowDataPo.setStaffName(users.get(0).getName()); oaWorkflowDataPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setStoreId(reqJson.getString("storeId")); oaWorkflowDataInnerServiceSMOImpl.saveOaWorkflowData(oaWorkflowDataPo); return true; } @Java110Transactional 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("任务已处理"); } // //退回给提交者 // if ("1400".equals(reqJson.getString("auditCode"))) { // String processInstanceId = task.getProcessInstanceId(); // Authentication.setAuthenticatedUserId(reqJson.getString("startUserId")); // taskService.addComment(reqJson.getString("taskId"), processInstanceId, reqJson.getString("auditMessage")); // Map variables = new HashMap(); // variables.put("nextUserId", reqJson.getString("startUserId")); // variables.put("auditCode", reqJson.getString("auditCode")); // taskService.complete(reqJson.getString("taskId"), variables); // // return true; // } String event = doTaskAuditUnAgree(reqJson); if (OaWorkflowDataDto.EVENT_COMMIT.equals(event)) { //提交状态 String processInstanceId = task.getProcessInstanceId(); Authentication.setAuthenticatedUserId(reqJson.getString("nextUserId")); taskService.addComment(reqJson.getString("taskId"), processInstanceId, reqJson.getString("auditMessage")); Map variables = new HashMap(); variables.put("nextUserId", reqJson.getString("nextUserId")); variables.put("auditCode", reqJson.getString("auditCode")); taskService.complete(reqJson.getString("taskId"), variables); } else { //转单 taskService.setAssignee(reqJson.getString("taskId"), reqJson.getString("nextUserId")); } return true; } /** * 审核不同意 退回 * * @param reqJson */ private String doTaskAuditUnAgree(JSONObject reqJson) { //查询当前节点 OaWorkflowDataDto oaWorkflowDataDto = new OaWorkflowDataDto(); oaWorkflowDataDto.setStoreId(reqJson.getString("storeId")); oaWorkflowDataDto.setBusinessKey(reqJson.getString("id")); oaWorkflowDataDto.setPage(1); oaWorkflowDataDto.setRow(1); List oaWorkflowDataDtos = oaWorkflowDataInnerServiceSMOImpl.queryOaWorkflowDatas(oaWorkflowDataDto); Assert.listOnlyOne(oaWorkflowDataDtos, "没有上级处理人"); if ("-1".equals(oaWorkflowDataDtos.get(0).getPreDataId())) { throw new IllegalArgumentException("没有上级处理人"); } oaWorkflowDataDto = new OaWorkflowDataDto(); oaWorkflowDataDto.setStoreId(reqJson.getString("storeId")); oaWorkflowDataDto.setDataId(oaWorkflowDataDtos.get(0).getPreDataId()); oaWorkflowDataDto.setPage(1); oaWorkflowDataDto.setRow(1); List preOaWorkflowDataDtos = oaWorkflowDataInnerServiceSMOImpl.queryOaWorkflowDatas(oaWorkflowDataDto); //将现在节点处理为完成 OaWorkflowDataPo oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setDataId(oaWorkflowDataDtos.get(0).getDataId()); oaWorkflowDataPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setContext(reqJson.getString("auditMessage")); oaWorkflowDataInnerServiceSMOImpl.updateOaWorkflowData(oaWorkflowDataPo); reqJson.put("nextUserId", preOaWorkflowDataDtos.get(0).getStaffId()); if ("1400".equals(reqJson.getString("auditCode"))) { reqJson.put("nextUserId", reqJson.getString("startUserId")); } oaWorkflowDataPo = new OaWorkflowDataPo(); oaWorkflowDataPo.setBusinessKey(preOaWorkflowDataDtos.get(0).getBusinessKey()); oaWorkflowDataPo.setFlowId(preOaWorkflowDataDtos.get(0).getFlowId()); oaWorkflowDataPo.setContext(""); oaWorkflowDataPo.setDataId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_dataId)); oaWorkflowDataPo.setEvent(preOaWorkflowDataDtos.get(0).getEvent()); oaWorkflowDataPo.setPreDataId(oaWorkflowDataDtos.get(0).getPreDataId()); oaWorkflowDataPo.setStaffId(reqJson.getString("nextUserId")); oaWorkflowDataPo.setStaffName(preOaWorkflowDataDtos.get(0).getStaffName()); oaWorkflowDataPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); oaWorkflowDataPo.setStoreId(preOaWorkflowDataDtos.get(0).getStoreId()); oaWorkflowDataInnerServiceSMOImpl.saveOaWorkflowData(oaWorkflowDataPo); return oaWorkflowDataDtos.get(0).getEvent(); } public List getAuditMessage(@RequestBody JSONObject reqJson) { TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult(); String processInstanceId = task.getProcessInstanceId(); List comments = taskService.getProcessInstanceComments(processInstanceId); List auditMessageDtos = new ArrayList<>(); if (comments == null || comments.size() < 1) { return auditMessageDtos; } AuditMessageDto messageDto = null; for (Comment comment : comments) { messageDto = new AuditMessageDto(); messageDto.setCreateTime(comment.getTime()); messageDto.setUserId(comment.getUserId()); messageDto.setMessage(comment.getFullMessage()); } return auditMessageDtos; } /** * 获取任务当前处理人 * * @param reqJson * @return */ public JSONObject getTaskCurrentUser(@RequestBody JSONObject reqJson) { TaskService taskService = processEngine.getTaskService(); List tasks = taskService.createTaskQuery().processInstanceBusinessKey(reqJson.getString("id")).list(); if (tasks == null || tasks.size() == 0) { reqJson.put("currentUserId", ""); reqJson.put("currentUserName", ""); reqJson.put("currentUserTel", ""); return reqJson; } String userIds = ""; String userNames = ""; String userTels = ""; String taskIds = ""; for (Task task : tasks) { String userId = task.getAssignee(); taskIds += (task.getId() + "/"); List users = userInnerServiceSMOImpl.getUserInfo(new String[]{userId}); if (users == null || users.size() == 0) { continue; } userIds += (userId + "/"); userNames += (users.get(0).getName() + "/"); userTels += (users.get(0).getTel() + "/"); } userIds = userIds.endsWith("/") ? userIds.substring(0, userIds.length() - 1) : userIds; userNames = userNames.endsWith("/") ? userNames.substring(0, userNames.length() - 1) : userNames; userTels = userTels.endsWith("/") ? userTels.substring(0, userTels.length() - 1) : userTels; taskIds = taskIds.endsWith("/") ? taskIds.substring(0, taskIds.length() - 1) : taskIds; reqJson.put("currentUserId", userIds); reqJson.put("currentUserName", userNames); reqJson.put("currentUserTel", userTels); reqJson.put("taskId", taskIds); return reqJson; } /** * 获取当前节点信息 * * @param reqJson{ taskId:'', * startUserId:'' * } * @return */ public JSONObject getCurrentNodeTask(@RequestBody JSONObject reqJson) { JSONObject curNode = new JSONObject(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult(); if (task == null) { throw new IllegalArgumentException("任务已处理"); } BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); flowNode.getName(); curNode.put("curTaskName", flowNode.getName()); return curNode; } @Override public List nextAllNodeTaskList(@RequestBody JSONObject reqJson) { List tasks = new ArrayList<>(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult(); if (task == null) { throw new IllegalArgumentException("任务已处理"); } BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); //获取当前节点输出连线 List outgoingFlows = flowNode.getOutgoingFlows(); JSONObject taskObj = null; taskObj = new JSONObject(); taskObj.put("assignee", "-1"); // 默认 不需要指定下一个处理人 表示结束 boolean isReturn = false; //遍历输出连线 for (SequenceFlow outgoingFlow : outgoingFlows) { //获取输出节点元素 FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement(); isReturn = false; //排除非用户任务接点 if (targetFlowElement instanceof UserTask) { //判断输出节点的el表达式 Map vars = new HashMap(); vars.put("auditCode", "1200"); if (isCondition(outgoingFlow.getConditionExpression(), vars)) { //true 获取输出节点名称 taskObj.put("back", outgoingFlow.getTargetFlowElement().getName()); isReturn = true; } vars.put("auditCode", "1400"); if (isCondition(outgoingFlow.getConditionExpression(), vars)) { //true 获取输出节点名称 taskObj.put("backIndex", outgoingFlow.getTargetFlowElement().getName()); isReturn = true; } //结束 vars.put("auditCode", "1500"); if (isCondition(outgoingFlow.getConditionExpression(), vars)) { //true 获取输出节点名称 taskObj.put("exit", outgoingFlow.getTargetFlowElement().getName()); isReturn = true; } if (!isReturn) { String assignee = ((UserTask) targetFlowElement).getAssignee(); if (!StringUtil.isEmpty(assignee) && assignee.indexOf("${") < 0) { taskObj.put("assignee", assignee); // 下一节点处理人 } if ("${startUserId}".equals(assignee)) { taskObj.put("assignee", reqJson.getString("startUserId")); // 开始人 } if ("${nextUserId}".equals(assignee)) { taskObj.put("assignee", "-2"); // 需要前台指定 } taskObj.put("next", outgoingFlow.getTargetFlowElement().getName()); } } //如果下一个为 结束节点 if (targetFlowElement instanceof EndEvent) { //true 获取输出节点名称 taskObj.put("exit", "1"); } } tasks.add(taskObj); return tasks; } @Override public List queryFirstAuditStaff(@RequestBody OaWorkflowXmlDto oaWorkflowXmlDto) { String bpmnXml = oaWorkflowXmlDto.getBpmnXml(); bpmnXml = bpmnXml.replaceAll("camunda:assignee", "activiti:assignee"); List tasks = new ArrayList<>(); XMLInputFactory xif = XMLInputFactory.newInstance(); InputStreamReader in = new InputStreamReader(new ByteArrayInputStream(bpmnXml.getBytes()), StandardCharsets.UTF_8); XMLStreamReader xtr = null; try { xtr = xif.createXMLStreamReader(in); } catch (XMLStreamException e) { throw new RuntimeException(e); } BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr); Process process = bpmnModel.getProcesses().get(0); Collection flowElements = process.getFlowElements(); StartEvent startEvent = null; for (FlowElement flowElement : flowElements) { //假设是开始节点 if (flowElement instanceof StartEvent) { startEvent = (StartEvent) flowElement; } } if (startEvent == null) { throw new SMOException("流程文件未包含开始节点"); } List outgoingFlows = startEvent.getOutgoingFlows(); UserTask submitUser = getUserTask(outgoingFlows); if (submitUser == null) { throw new SMOException("未包含提交者"); } UserTask auditUser = getUserTask(submitUser.getOutgoingFlows()); if (auditUser == null) { throw new SMOException("未包含审核人员"); } String assignee = auditUser.getAssignee(); JSONObject taskObj = null; taskObj = new JSONObject(); taskObj.put("assignee", "-1"); // 默认 不需要指定下一个处理人 表示结束 if (!StringUtil.isEmpty(assignee) && assignee.indexOf("${") < 0) { taskObj.put("assignee", assignee); // 下一节点处理人 } if ("${startUserId}".equals(assignee)) { taskObj.put("assignee", "-2"); // 开始人 } if ("${nextUserId}".equals(assignee)) { taskObj.put("assignee", "-2"); // 需要前台指定 } tasks.add(taskObj); return tasks; } private static UserTask getUserTask(List outgoingFlows) { for (SequenceFlow outgoingFlow : outgoingFlows) { //获取输出节点元素 FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement(); //排除非用户任务接点 if (targetFlowElement instanceof UserTask) { //判断输出节点的el表达式 Map vars = new HashMap(); vars.put("auditCode", "1200"); if (isCondition(outgoingFlow.getConditionExpression(), vars)) { continue; } vars.put("auditCode", "1400"); if (isCondition(outgoingFlow.getConditionExpression(), vars)) { continue; } //结束 vars.put("auditCode", "1500"); if (isCondition(outgoingFlow.getConditionExpression(), vars)) { continue; } return ((UserTask) targetFlowElement); } } return null; } /** * el表达式判断 * * @param expression * @param vars * @return */ private static boolean isCondition(String expression, Map vars) { if (expression == null || expression == "") { return false; } //分割表达式 String[] exprArr = expression.split("[{}$&]"); for (String expr : exprArr) { //是否包含键message if (expr.contains("auditCode")) { if (!vars.containsKey("auditCode")) { continue; } if (expr.contains("==")) { String[] primes = expr.split("=="); String valExpr = primes[1].trim(); if (valExpr.startsWith("'")) { valExpr = valExpr.substring(1); } if (valExpr.endsWith("'")) { valExpr = valExpr.substring(0, valExpr.length() - 1); } if (primes.length == 2 && valExpr.equals(vars.get("auditCode"))) { return true; } } } } return false; } public ProcessEngine getProcessEngine() { return processEngine; } public void setProcessEngine(ProcessEngine processEngine) { this.processEngine = processEngine; } public RuntimeService getRuntimeService() { return runtimeService; } public void setRuntimeService(RuntimeService runtimeService) { this.runtimeService = runtimeService; } public TaskService getTaskService() { return taskService; } public void setTaskService(TaskService taskService) { this.taskService = taskService; } }