ActivitiService.java 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  1. package com.common.workflow.service.activiti;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.text.SimpleDateFormat;
  8. import java.util.*;
  9. import javax.annotation.Resource;
  10. import javax.imageio.ImageIO;
  11. import javax.servlet.http.HttpServletResponse;
  12. import com.common.workflow.service.activiti.supplierAnnualListener.AnnualApprovalRefuseTaskService;
  13. import com.common.workflow.service.dto.ActiHistoricTaskDTO;
  14. import com.common.workflow.service.dto.ActiMyTaskDTO;
  15. import com.common.workflow.service.dto.ActiPageResultDTO;
  16. import com.common.workflow.service.dto.ActiUserTaskDTO;
  17. import com.common.workflow.web.rest.vm.ActiCompleteVM;
  18. import com.common.workflow.web.rest.vm.AllProcessTaskVM;
  19. import com.common.workflow.web.rest.vm.MultiActiCompleteVM;
  20. import com.common.workflow.web.rest.vm.MultiOrgAuditVM;
  21. import org.activiti.bpmn.model.BpmnModel;
  22. import org.activiti.bpmn.model.FlowNode;
  23. import org.activiti.bpmn.model.SequenceFlow;
  24. import org.activiti.engine.*;
  25. import org.activiti.engine.delegate.DelegateExecution;
  26. import org.activiti.engine.delegate.event.impl.ActivitiEntityWithVariablesEventImpl;
  27. import org.activiti.engine.history.*;
  28. import org.activiti.engine.impl.RepositoryServiceImpl;
  29. import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
  30. import org.activiti.engine.impl.identity.Authentication;
  31. import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
  32. import org.activiti.engine.runtime.Execution;
  33. import org.activiti.engine.runtime.ProcessInstance;
  34. import org.activiti.engine.task.Task;
  35. import org.activiti.engine.task.TaskQuery;
  36. import org.activiti.image.ProcessDiagramGenerator;
  37. import org.apache.commons.lang3.StringUtils;
  38. import org.slf4j.Logger;
  39. import org.slf4j.LoggerFactory;
  40. import org.springframework.beans.factory.annotation.Autowired;
  41. import org.springframework.stereotype.Service;
  42. import org.springframework.transaction.annotation.Transactional;
  43. @Service
  44. public class ActivitiService {
  45. private static final Logger logger = LoggerFactory.getLogger(ActivitiService.class);
  46. @Autowired
  47. private RuntimeService runtimeService;
  48. @Autowired
  49. private TaskService taskService;
  50. @Autowired
  51. private HistoryService historyService;
  52. @Autowired
  53. private ProcessEngine processEngine;
  54. @Autowired
  55. private RepositoryService repositoryService;
  56. @Autowired
  57. private ProcessEngineConfigurationImpl processEngineConfiguration;
  58. /**
  59. * 启动流程
  60. * @param businessKey 业务id
  61. */
  62. public String startProcesses(String processKey, String businessKey, String userNames, String result) {
  63. Map<String, Object> variables = new HashMap<String, Object>();
  64. variables.put("businessKey", businessKey);
  65. variables.put("recorder", userNames);
  66. variables.put("result", result);
  67. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, variables);
  68. logger.info("流程启动成功,流程id:" + processInstance.getId() + " 业务ID: " + businessKey);
  69. return processInstance.getProcessInstanceId();
  70. }
  71. /**
  72. * 启动流程
  73. * @param businessKey 业务id
  74. */
  75. public String startProcesses(String processKey, String businessKey, String userNames, String result, String type, String supplierName) {
  76. Map<String, Object> variables = new HashMap<String, Object>();
  77. variables.put("businessKey", businessKey);
  78. variables.put("recorder", userNames);
  79. variables.put("result", result);
  80. variables.put("type", type);
  81. variables.put("supplierName", supplierName);
  82. ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, variables);
  83. logger.info("流程启动成功,流程id:" + processInstance.getId() + " 业务ID: " + businessKey);
  84. return processInstance.getProcessInstanceId();
  85. }
  86. /**
  87. *
  88. * <p>描述: 根据工作流Key, 用户id, 业务表Key 查询待办任务列表</p>
  89. */
  90. @Transactional
  91. public void completeTask(ActiCompleteVM actiVm) {
  92. String processKey = actiVm.getProcessKey();
  93. String businessKey = actiVm.getBusinessKey();
  94. String userNames = actiVm.getUserNames();
  95. String userId = actiVm.getUserId();
  96. String result = actiVm.getResult();
  97. String remarks = actiVm.getRemarks();
  98. String callbackUrl = actiVm.getCallbackUrl();
  99. Task myTask = taskService.createTaskQuery()
  100. .processDefinitionKey(processKey)
  101. .taskCandidateOrAssigned(userId)
  102. //.taskAssignee(userId)
  103. .processVariableValueEquals("businessKey", businessKey)
  104. .singleResult();
  105. /*List<Task> testTasks = taskService.createTaskQuery()
  106. .processDefinitionKey(processKey)
  107. .taskCandidateOrAssigned(userId)
  108. //.taskAssignee(userId)
  109. .processVariableValueEquals("businessKey", businessKey)
  110. .list();*/
  111. //获取流程实例
  112. logger.info("创建的myTask: " + myTask.toString());
  113. logger.info("工作流参数 processKey:" + processKey);
  114. logger.info("工作流参数 businessKey:" + businessKey);
  115. logger.info("工作流参数 userId:" + userId);
  116. logger.info("工作流参数 result:" + result);
  117. logger.info("工作流参数 callbackUrl:" + callbackUrl);
  118. taskService.claim(myTask.getId(), userId);
  119. Map<String,Object> vars = new HashMap<String,Object>();
  120. vars.put("users", userNames);
  121. vars.put("result", Integer.parseInt(result));
  122. vars.put("callbackUrl", callbackUrl);
  123. List<String> assigneeList = Arrays.asList(userNames.split(","));
  124. vars.put("assigneeList", assigneeList);
  125. //设置流程变量【基本类型】
  126. taskService.setVariableLocal(myTask.getId(), "businessKey", businessKey);
  127. taskService.setVariableLocal(myTask.getId(), "users", userNames);
  128. taskService.setVariableLocal(myTask.getId(), "result", Integer.parseInt(result));
  129. taskService.setVariableLocal(myTask.getId(), "remarks", remarks);
  130. taskService.complete(myTask.getId(), vars);
  131. //taskService.complete(myTask.getId(), vars, true);
  132. }
  133. /**
  134. *
  135. * <p>描述: 多实例,下一步</p>
  136. */
  137. public void multiCompleteTask(MultiActiCompleteVM actiVm) {
  138. String processKey = actiVm.getProcessKey();
  139. String businessKey = actiVm.getBusinessKey();
  140. String userNames = actiVm.getUserNames();
  141. List<MultiOrgAuditVM> multiOrgAudits = actiVm.getMultiOrgAudits();
  142. String userId = actiVm.getUserId();
  143. String result = actiVm.getResult();
  144. String remarks = actiVm.getRemarks();
  145. String callbackUrl = actiVm.getCallbackUrl();
  146. Task myTask = taskService.createTaskQuery()
  147. .processDefinitionKey(processKey)
  148. .taskCandidateOrAssigned(userId)
  149. //.taskAssignee(userId)
  150. .processVariableValueEquals("businessKey", businessKey)
  151. .singleResult();
  152. /*List<Task> testTasks = taskService.createTaskQuery()
  153. .processDefinitionKey(processKey)
  154. .taskCandidateOrAssigned(userId)
  155. //.taskAssignee(userId)
  156. .processVariableValueEquals("businessKey", businessKey)
  157. .list();*/
  158. //获取流程实例
  159. taskService.claim(myTask.getId(), userId);
  160. Map<String,Object> vars = new HashMap<String,Object>();
  161. vars.put("users", userNames);
  162. vars.put("result", Integer.parseInt(result));
  163. vars.put("callbackUrl", callbackUrl);
  164. List<String> orgInfos = new ArrayList<>();
  165. for(MultiOrgAuditVM orgInfo : multiOrgAudits) {
  166. String orgstr = orgInfo.getOrgId();
  167. orgstr += ":" + orgInfo.getOrgName();
  168. orgstr += ":" + orgInfo.getUserIds();
  169. orgInfos.add(orgstr);
  170. }
  171. vars.put("assigneeList", orgInfos);
  172. //设置流程变量【基本类型】
  173. taskService.setVariableLocal(myTask.getId(), "businessKey", businessKey);
  174. taskService.setVariableLocal(myTask.getId(), "users", userNames);
  175. taskService.setVariableLocal(myTask.getId(), "result", Integer.parseInt(result));
  176. taskService.setVariableLocal(myTask.getId(), "remarks", remarks);
  177. taskService.complete(myTask.getId(), vars);
  178. //taskService.complete(myTask.getId(), vars, true);
  179. }
  180. /**
  181. *
  182. * <p>描述:任务审批 (通过/拒接) </p>
  183. * @author 范相如
  184. * @date 2018年2月25日
  185. * @param taskId 任务id
  186. * @param userId 用户id
  187. * @param result false OR true
  188. */
  189. /*public void completeTask(String taskId,String userId,String result, String comments) {
  190. //获取流程实例
  191. taskService.claim(taskId, userId);
  192. Map<String,Object> vars = new HashMap<String,Object>();
  193. vars.put("sign", "true");
  194. taskService.complete(taskId, vars);
  195. }*/
  196. /**
  197. *
  198. * <p>描述: 根据工作流Key 和 用户id查询待办任务列表</p>
  199. */
  200. public String findTasksByUserId(String processKey, String userId) {
  201. List<Task> resultTasks = taskService.createTaskQuery().processDefinitionKey(processKey).taskCandidateOrAssigned(userId).list();
  202. String businessKeys = "";
  203. int i = 0;
  204. for (Task myTask : resultTasks) {
  205. if(resultTasks.size()-1 == i) {
  206. businessKeys += taskService.getVariable(myTask.getId(), "businessKey").toString();
  207. } else {
  208. businessKeys += taskService.getVariable(myTask.getId(), "businessKey").toString()+ ",";
  209. }
  210. i++;
  211. }
  212. return businessKeys;
  213. }
  214. /**
  215. *
  216. * <p>描述: 根据工作流Key 和 用户id查询待办任务列表</p>
  217. */
  218. public List<ActiUserTaskDTO> findAllProcessTasks(AllProcessTaskVM allVm) {
  219. List<String> userList = Arrays.asList( allVm.getUserIds().split(",") );
  220. List<String> definitionKeys = Arrays.asList( allVm.getDefinitionKeys().split(",") );
  221. List<Task> resultTasks = taskService.createTaskQuery()
  222. .processDefinitionKeyIn(definitionKeys)
  223. .list();
  224. List<ActiUserTaskDTO> myTaskDTOS = new ArrayList<>();
  225. for (Task myTask : resultTasks) {
  226. ActiUserTaskDTO myTaskDTO = new ActiUserTaskDTO();
  227. myTaskDTO.setProcessDefinitionId(myTask.getProcessDefinitionId());
  228. myTaskDTO.setBusinessKey(taskService.getVariable(myTask.getId(), "businessKey").toString());
  229. myTaskDTO.setWorkflowId(myTask.getProcessInstanceId());
  230. myTaskDTO.setCreateTime(myTask.getCreateTime().getTime());
  231. myTaskDTO.setTaskName(myTask.getName());
  232. myTaskDTO.setUserId( taskService.getVariable(myTask.getId(), "users").toString() );
  233. myTaskDTOS.add(myTaskDTO);
  234. }
  235. return myTaskDTOS;
  236. }
  237. /**
  238. *
  239. * <p>描述: 根据工作流Key 和 用户id查询待办任务列表</p>
  240. */
  241. public List<ActiMyTaskDTO> findTasksWithCreateTimeByUserId(String processKey, String userId) {
  242. List<Task> resultTasks = taskService.createTaskQuery().processDefinitionKey(processKey).taskCandidateOrAssigned(userId).list();
  243. List<ActiMyTaskDTO> myTaskDTOS = new ArrayList<>();
  244. for (Task myTask : resultTasks) {
  245. ActiMyTaskDTO myTaskDTO = new ActiMyTaskDTO();
  246. myTaskDTO.setBusinessKey(taskService.getVariable(myTask.getId(), "businessKey").toString());
  247. myTaskDTO.setWorkflowId(myTask.getProcessInstanceId());
  248. myTaskDTO.setCreateTime(myTask.getCreateTime().getTime());
  249. myTaskDTOS.add(myTaskDTO);
  250. }
  251. return myTaskDTOS;
  252. }
  253. public String findAllUserTodoList() {
  254. List<Task> resultTasks = taskService.createTaskQuery().includeTaskLocalVariables().list();
  255. List<String> todoTaskUserIdList = new ArrayList<>();
  256. for (Task myTask : resultTasks) {
  257. Map<String, Object> obj = myTask.getTaskLocalVariables();
  258. if (obj.size() > 0) {
  259. String userIds = obj.get("users").toString();
  260. List<String> userIdArr = Arrays.asList(userIds.split(","));
  261. todoTaskUserIdList.addAll(userIdArr);
  262. }
  263. }
  264. logger.info("所有待办任务审批人id:" + StringUtils.join(todoTaskUserIdList, ","));
  265. return StringUtils.join(todoTaskUserIdList, ",");
  266. }
  267. public ActiPageResultDTO findAllTypePagingTasksWithCreateTimeByUserId(String userId, int pageIndex, int pageSize, String wfName, String type, String supplierName) {
  268. TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned(userId);
  269. //按工作流名称查询
  270. if (!wfName.isEmpty()) {
  271. taskQuery = taskQuery.processDefinitionKeyIn(Arrays.asList(wfName.split(",")));
  272. }
  273. //按分类查询
  274. if (!type.isEmpty()) {
  275. taskQuery = taskQuery.processVariableValueEquals("type", type);
  276. }
  277. //按供应商名称查询
  278. if (!supplierName.isEmpty()) {
  279. taskQuery = taskQuery.processVariableValueLikeIgnoreCase("supplierName", "%"+supplierName +"%");
  280. }
  281. //按节点名称查询。可按条件判断是否需要过滤掉集中评审
  282. //不获取集中评审的待办任务 select distinct NAME_ from ACT_RU_TASK;
  283. List<String> allTaskNameExceptConcentrate = Arrays.asList("准入申请", "年审申请", "增项申请", "变更申请", "日常评价", "二级单位分办", "二级单位初审", "二级单位复审", "二级单位审核",
  284. "业务处室接收", "业务处室专业审批", "专业审批", "专业处室分办", "交费", "企管法规处入库", "企管法规处审批", "企业法规处审批",
  285. "企业法规处审核", "企管法规处审核", "企管法规处编号、入库", "审批未通过", "审核未通过", "待开发票");
  286. taskQuery = taskQuery.taskNameIn(allTaskNameExceptConcentrate);
  287. long taskTotal = taskQuery.count();
  288. List<ActiMyTaskDTO> myTaskDTOS = new ArrayList<>();
  289. List<Task> resultTasks = taskQuery.orderByTaskCreateTime().desc().listPage((pageIndex-1)*pageSize, pageSize);
  290. for (Task myTask : resultTasks) {
  291. ActiMyTaskDTO myTaskDTO = new ActiMyTaskDTO();
  292. myTaskDTO.setProcessDefinitionId(myTask.getProcessDefinitionId());
  293. myTaskDTO.setBusinessKey(taskService.getVariable(myTask.getId(), "businessKey").toString());
  294. myTaskDTO.setWorkflowId(myTask.getProcessInstanceId());
  295. myTaskDTO.setCreateTime(myTask.getCreateTime().getTime());
  296. myTaskDTO.setTaskName(myTask.getName());
  297. myTaskDTOS.add(myTaskDTO);
  298. }
  299. ActiPageResultDTO pageResultDTO = new ActiPageResultDTO();
  300. pageResultDTO.setTotal(taskTotal);
  301. pageResultDTO.setTaskDTOList(myTaskDTOS);
  302. return pageResultDTO;
  303. }
  304. public ActiPageResultDTO findAllTypePagingTasksWithCreateTimeByUserId(String userId, int pageIndex, int pageSize, String wfName, String taskName) {
  305. TaskQuery taskQuery = taskService.createTaskQuery().taskCandidateOrAssigned(userId);
  306. //按工作流名称查询
  307. if (!wfName.isEmpty()) {
  308. taskQuery = taskQuery.processDefinitionKeyIn(Arrays.asList(wfName.split(",")));
  309. }
  310. //按节点名称查询
  311. if (!taskName.isEmpty()) {
  312. taskQuery = taskQuery.taskNameIn(Arrays.asList(taskName.split(",")));
  313. }
  314. long taskTotal = taskQuery.count();
  315. List<ActiMyTaskDTO> myTaskDTOS = new ArrayList<>();
  316. List<Task> resultTasks = taskQuery.orderByTaskCreateTime().desc().listPage((pageIndex-1)*pageSize, pageSize);
  317. for (Task myTask : resultTasks) {
  318. ActiMyTaskDTO myTaskDTO = new ActiMyTaskDTO();
  319. myTaskDTO.setProcessDefinitionId(myTask.getProcessDefinitionId());
  320. myTaskDTO.setBusinessKey(taskService.getVariable(myTask.getId(), "businessKey").toString());
  321. myTaskDTO.setWorkflowId(myTask.getProcessInstanceId());
  322. myTaskDTO.setCreateTime(myTask.getCreateTime().getTime());
  323. myTaskDTO.setTaskName(myTask.getName());
  324. myTaskDTOS.add(myTaskDTO);
  325. }
  326. ActiPageResultDTO pageResultDTO = new ActiPageResultDTO();
  327. pageResultDTO.setTotal(taskTotal);
  328. pageResultDTO.setTaskDTOList(myTaskDTOS);
  329. return pageResultDTO;
  330. }
  331. /**
  332. *
  333. * <p>描述: 根据工作流Key 和 用户id查询已办任务列表</p>
  334. */
  335. public String findTaskHistByUserId(String processKey, String userId) {
  336. List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
  337. .processDefinitionKey(processKey)
  338. .taskAssignee(userId)
  339. .orderByTaskId()
  340. .desc()
  341. .list();
  342. List<String> businessKeyList = new ArrayList<>();
  343. String businessKeys = "";
  344. for (HistoricTaskInstance myTask : hisTaskList) {
  345. List<HistoricVariableInstance> varList = historyService.createHistoricVariableInstanceQuery()
  346. .processInstanceId(myTask.getProcessInstanceId())
  347. .list();
  348. for(HistoricVariableInstance hisvar : varList) {
  349. if(hisvar.getVariableName().equals("businessKey") && !businessKeyList.contains(hisvar.getValue().toString())) {
  350. businessKeyList.add(hisvar.getValue().toString());
  351. break;
  352. }
  353. }
  354. }
  355. businessKeys = StringUtils.join(businessKeyList.toArray(), ",");
  356. return businessKeys;
  357. }
  358. /**
  359. *
  360. * <p>描述: 根据工作流Key 和 用户id查询已办任务列表</p>
  361. */
  362. public List<ActiMyTaskDTO> findTaskHistWithCreateTimeByUserId(String processKey, String userId) {
  363. List<HistoricTaskInstance> hisTaskList = historyService.createHistoricTaskInstanceQuery()
  364. .processDefinitionKey(processKey)
  365. .taskAssignee(userId)
  366. .orderByTaskId()
  367. .desc()
  368. .list();
  369. List<ActiMyTaskDTO> myTaskDTOS = new ArrayList<>();
  370. for (HistoricTaskInstance myTask : hisTaskList) {
  371. ActiMyTaskDTO myTaskDTO = new ActiMyTaskDTO();
  372. myTaskDTO.setWorkflowId(myTask.getProcessInstanceId());
  373. myTaskDTO.setCreateTime(myTask.getCreateTime().getTime());
  374. List<HistoricVariableInstance> varList = historyService.createHistoricVariableInstanceQuery()
  375. .processInstanceId(myTask.getProcessInstanceId())
  376. .list();
  377. for(HistoricVariableInstance hisvar : varList) {
  378. if (hisvar.getVariableName().equals("businessKey")) {
  379. myTaskDTO.setBusinessKey(hisvar.getValue().toString());
  380. break;
  381. }
  382. }
  383. myTaskDTOS.add(myTaskDTO);
  384. }
  385. return myTaskDTOS;
  386. }
  387. public ActiPageResultDTO findAllTypePagingTaskHistWithCreateTimeByUserId(String userId, int pageIndex, int pageSize, String wfName, String type, String supplierName) {
  388. HistoricTaskInstanceQuery taskInstanceQuery = historyService.createHistoricTaskInstanceQuery().taskAssignee(userId);
  389. //按工作流名称查询
  390. if (!wfName.isEmpty()) {
  391. taskInstanceQuery = taskInstanceQuery.processDefinitionKeyIn(Arrays.asList(wfName.split(",")));
  392. }
  393. //按分类查询
  394. if (!type.isEmpty()) {
  395. taskInstanceQuery = taskInstanceQuery.processVariableValueEquals("type", type);
  396. }
  397. //按供应商名称查询
  398. if (!supplierName.isEmpty()) {
  399. taskInstanceQuery = taskInstanceQuery.processVariableValueLikeIgnoreCase("supplierName", "%"+supplierName +"%");
  400. }
  401. //查询总条数
  402. long taskTotal = taskInstanceQuery.count();
  403. //查询分页
  404. List<HistoricTaskInstance> hisTaskList = taskInstanceQuery.orderByTaskCreateTime().desc()
  405. .listPage((pageIndex-1)*pageSize, pageSize);
  406. List<ActiMyTaskDTO> myTaskDTOS = new ArrayList<>();
  407. for (HistoricTaskInstance myTask : hisTaskList) {
  408. ActiMyTaskDTO myTaskDTO = new ActiMyTaskDTO();
  409. myTaskDTO.setProcessDefinitionId(myTask.getProcessDefinitionId());
  410. myTaskDTO.setTaskName(myTask.getName());
  411. myTaskDTO.setWorkflowId(myTask.getProcessInstanceId());
  412. myTaskDTO.setCreateTime(myTask.getCreateTime().getTime());
  413. List<HistoricVariableInstance> varList = historyService.createHistoricVariableInstanceQuery()
  414. .processInstanceId(myTask.getProcessInstanceId())
  415. .list();
  416. for(HistoricVariableInstance hisvar : varList) {
  417. if (hisvar.getVariableName().equals("businessKey")) {
  418. myTaskDTO.setBusinessKey(hisvar.getValue().toString());
  419. break;
  420. }
  421. }
  422. myTaskDTOS.add(myTaskDTO);
  423. }
  424. ActiPageResultDTO pageResultDTO = new ActiPageResultDTO();
  425. pageResultDTO.setTotal(taskTotal);
  426. pageResultDTO.setTaskDTOList(myTaskDTOS);
  427. return pageResultDTO;
  428. }
  429. /**
  430. * 查询当前用户的待办任务
  431. * @param processDefinitionKey 流程定义key(流程定义的标识)
  432. * @return
  433. */
  434. /*public List<Task> findTasks(String processDefinitionKey, String assignee) {
  435. //创建查询对象
  436. TaskQuery taskQuery = taskService.createTaskQuery();
  437. //设置查询条件
  438. taskQuery.taskAssignee(assignee);
  439. //指定流程定义key,只查询某个流程的任务
  440. taskQuery.processDefinitionKey(processDefinitionKey);
  441. //获取查询列表
  442. List<Task> list = taskQuery.list();
  443. return list;
  444. }*/
  445. public List<ActiHistoricTaskDTO> getHistoricTasks(String processDefinitionKey, String businessKey, String processInstanceId) {
  446. List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
  447. .processInstanceId(processInstanceId)
  448. .list();
  449. List<HistoricVariableInstance> varList = historyService.createHistoricVariableInstanceQuery()
  450. .processInstanceId(processInstanceId)
  451. .list();
  452. List<ActiHistoricTaskDTO> historicTaskDTOS = new ArrayList<>();
  453. if (list != null && list.size() > 0) {
  454. for(HistoricTaskInstance histTask : list) {
  455. ActiHistoricTaskDTO historicTask = new ActiHistoricTaskDTO();
  456. String orgName = "";
  457. for(HistoricVariableInstance hvi : varList){
  458. if(hvi.getTaskId() != null && hvi.getTaskId().equals(histTask.getId())) {
  459. if(hvi.getVariableName().equals("businessKey")) {
  460. historicTask.setBusinessKey(hvi.getValue().toString());
  461. } else if(hvi.getVariableName().equals("result")) {
  462. historicTask.setResult(hvi.getValue().toString());
  463. } else if(hvi.getVariableName().equals("remarks")) {
  464. historicTask.setRemarks(hvi.getValue().toString());
  465. } else if( hvi.getVariableName().equals("users")) {
  466. historicTask.setUsers(hvi.getValue().toString());
  467. } else if( hvi.getVariableName().equals("orgName")) {
  468. orgName = hvi.getValue().toString();
  469. } else if( hvi.getVariableName().equals("refuseName")) {
  470. historicTask.setRefuseName(hvi.getValue().toString());
  471. }
  472. }
  473. }
  474. //当前未完成的步骤,取出当前操作人
  475. if ( histTask.getClaimTime() == null || histTask.getEndTime() == null ) {
  476. List<HistoricVariableInstance> varListTmp = historyService.createHistoricVariableInstanceQuery()
  477. .processInstanceId(processInstanceId)
  478. .executionId(histTask.getExecutionId())
  479. .list();
  480. Collections.reverse(varListTmp);
  481. for(HistoricVariableInstance hvi : varListTmp){
  482. if(hvi.getVariableName().equals("businessKey")) {
  483. historicTask.setBusinessKey(hvi.getValue().toString());
  484. } else if(hvi.getVariableName().equals("result")) {
  485. historicTask.setResult(hvi.getValue().toString());
  486. } else if(hvi.getVariableName().equals("remarks")) {
  487. historicTask.setRemarks(hvi.getValue().toString());
  488. } else if( hvi.getVariableName().equals("users")) {
  489. if (!StringUtils.isEmpty(hvi.getValue().toString()) && StringUtils.isEmpty(historicTask.getUsers())) {
  490. historicTask.setUsers(hvi.getValue().toString());
  491. }
  492. } else if( hvi.getVariableName().equals("orgName")) {
  493. orgName = hvi.getValue().toString();
  494. } else if( hvi.getVariableName().equals("refuseName")) {
  495. historicTask.setRefuseName(hvi.getValue().toString());
  496. }
  497. }
  498. }
  499. historicTask.setAssignee(histTask.getAssignee());
  500. historicTask.setTaskName(histTask.getName());
  501. if(orgName.length() > 0) {
  502. historicTask.setTaskName(histTask.getName() + "-" + orgName);
  503. }
  504. if(histTask.getStartTime() != null) {
  505. historicTask.setStartTime(histTask.getStartTime().getTime());
  506. }
  507. if(histTask.getEndTime() != null) {
  508. historicTask.setEndTime(histTask.getEndTime().getTime());
  509. }
  510. historicTask.setProcessInstanceId(histTask.getProcessInstanceId());
  511. historicTaskDTOS.add(historicTask);
  512. }
  513. }
  514. return historicTaskDTOS;
  515. }
  516. /**
  517. * 更改业务流程状态#{ActivityDemoServiceImpl.updateBizStatus(execution,"tj")}
  518. * @param execution
  519. * @param status
  520. */
  521. /*public void updateBizStatus(DelegateExecution execution,String status) {
  522. String bizId = execution.getProcessBusinessKey();
  523. //根据业务id自行处理业务表
  524. logger.info("业务表["+bizId+"]状态更改成功,状态更改为:"+status);
  525. }*/
  526. //流程节点权限用户列表${ActivityDemoServiceImpl.findUsers(execution,sign)}
  527. /*public List<String> findUsersForSL(DelegateExecution execution){
  528. return Arrays.asList("sly1","sly2");
  529. }*/
  530. //流程节点权限用户列表${ActivityDemoServiceImpl.findUsers(execution,sign)}
  531. /*public List<String> findUsersForSP(DelegateExecution execution){
  532. return Arrays.asList("spy1","uspy2");
  533. }*/
  534. /**
  535. *
  536. * <p>描述: 生成流程图
  537. * 首先启动流程,获取processInstanceId,替换即可生成</p>
  538. * @author 范相如
  539. * @date 2018年2月25日
  540. * @param processInstanceId
  541. * @throws Exception
  542. */
  543. /*public void queryProImg(String processInstanceId) throws Exception {
  544. //获取历史流程实例
  545. HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  546. //根据流程定义获取输入流
  547. InputStream is = repositoryService.getProcessDiagram(processInstance.getProcessDefinitionId());
  548. BufferedImage bi = ImageIO.read(is);
  549. File file = new File("demo2.png");
  550. if(!file.exists()) file.createNewFile();
  551. FileOutputStream fos = new FileOutputStream(file);
  552. ImageIO.write(bi, "png", fos);
  553. fos.close();
  554. is.close();
  555. logger.info("图片生成成功");
  556. List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("userId").list();
  557. for(Task t : tasks) {
  558. logger.info(t.getName());
  559. }
  560. }*/
  561. /**
  562. * 获取流程图像,已执行节点和流程线高亮显示
  563. */
  564. public void getActivitiProccessImage(String pProcessInstanceId, HttpServletResponse response)
  565. {
  566. //logger.info("[开始]-获取流程图图像");
  567. try {
  568. // 获取历史流程实例
  569. HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
  570. .processInstanceId(pProcessInstanceId).singleResult();
  571. if (historicProcessInstance == null) {
  572. //throw new BusinessException("获取流程实例ID[" + pProcessInstanceId + "]对应的历史流程实例失败!");
  573. }
  574. else
  575. {
  576. // 获取流程定义
  577. ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
  578. .getDeployedProcessDefinition(historicProcessInstance.getProcessDefinitionId());
  579. // 获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序
  580. List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery()
  581. .processInstanceId(pProcessInstanceId).orderByHistoricActivityInstanceId().asc().list();
  582. // 已执行的节点ID集合
  583. List<String> executedActivityIdList = new ArrayList<String>();
  584. int index = 1;
  585. //logger.info("获取已经执行的节点ID");
  586. for (HistoricActivityInstance activityInstance : historicActivityInstanceList) {
  587. executedActivityIdList.add(activityInstance.getActivityId());
  588. //logger.info("第[" + index + "]个已执行节点=" + activityInstance.getActivityId() + " : " +activityInstance.getActivityName());
  589. index++;
  590. }
  591. BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
  592. // 已执行的线集合
  593. List<String> flowIds = new ArrayList<String>();
  594. // 获取流程走过的线 (getHighLightedFlows是下面的方法)
  595. flowIds = getHighLightedFlows(bpmnModel,processDefinition, historicActivityInstanceList);
  596. // 获取流程图图像字符流
  597. ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
  598. ProcessDiagramGenerator pec = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();
  599. //配置字体
  600. InputStream imageStream = pec.generateDiagram(bpmnModel, "png", executedActivityIdList, flowIds,"宋体","微软雅黑","黑体",null,2.0);
  601. response.setContentType("image/png");
  602. OutputStream os = response.getOutputStream();
  603. int bytesRead = 0;
  604. byte[] buffer = new byte[8192];
  605. while ((bytesRead = imageStream.read(buffer, 0, 8192)) != -1) {
  606. os.write(buffer, 0, bytesRead);
  607. }
  608. os.close();
  609. imageStream.close();
  610. }
  611. //logger.info("[完成]-获取流程图图像");
  612. } catch (Exception e) {
  613. logger.info(e.getMessage());
  614. //logger.error("【异常】-获取流程图失败!" + e.getMessage());
  615. //throw new BusinessException("获取流程图失败!" + e.getMessage());
  616. }
  617. }
  618. public List<String> getHighLightedFlows(BpmnModel bpmnModel,ProcessDefinitionEntity processDefinitionEntity,List<HistoricActivityInstance> historicActivityInstances)
  619. {
  620. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //24小时制
  621. List<String> highFlows = new ArrayList<String>();// 用以保存高亮的线flowId
  622. for (int i = 0; i < historicActivityInstances.size() - 1; i++)
  623. {
  624. // 对历史流程节点进行遍历
  625. // 得到节点定义的详细信息
  626. FlowNode activityImpl = (FlowNode)bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(i).getActivityId());
  627. List<FlowNode> sameStartTimeNodes = new ArrayList<FlowNode>();// 用以保存后续开始时间相同的节点
  628. FlowNode sameActivityImpl1 = null;
  629. HistoricActivityInstance activityImpl_ = historicActivityInstances.get(i);// 第一个节点
  630. HistoricActivityInstance activityImp2_ ;
  631. for(int k = i + 1 ; k <= historicActivityInstances.size() - 1; k++)
  632. {
  633. activityImp2_ = historicActivityInstances.get(k);// 后续第1个节点
  634. if ( activityImpl_.getActivityType().equals("userTask") && activityImp2_.getActivityType().equals("userTask") &&
  635. df.format(activityImpl_.getStartTime()).equals(df.format(activityImp2_.getStartTime())) ) //都是usertask,且主节点与后续节点的开始时间相同,说明不是真实的后继节点
  636. {
  637. }
  638. else
  639. {
  640. sameActivityImpl1 = (FlowNode)bpmnModel.getMainProcess().getFlowElement(historicActivityInstances.get(k).getActivityId());//找到紧跟在后面的一个节点
  641. break;
  642. }
  643. }
  644. sameStartTimeNodes.add(sameActivityImpl1); // 将后面第一个节点放在时间相同节点的集合里
  645. for (int j = i + 1; j < historicActivityInstances.size() - 1; j++)
  646. {
  647. HistoricActivityInstance activityImpl1 = historicActivityInstances.get(j);// 后续第一个节点
  648. HistoricActivityInstance activityImpl2 = historicActivityInstances.get(j + 1);// 后续第二个节点
  649. if (df.format(activityImpl1.getStartTime()).equals(df.format(activityImpl2.getStartTime())) )
  650. {// 如果第一个节点和第二个节点开始时间相同保存
  651. FlowNode sameActivityImpl2 = (FlowNode)bpmnModel.getMainProcess().getFlowElement(activityImpl2.getActivityId());
  652. sameStartTimeNodes.add(sameActivityImpl2);
  653. }
  654. else
  655. {// 有不相同跳出循环
  656. break;
  657. }
  658. }
  659. List<SequenceFlow> pvmTransitions = activityImpl.getOutgoingFlows() ; // 取出节点的所有出去的线
  660. for (SequenceFlow pvmTransition : pvmTransitions)
  661. {// 对所有的线进行遍历
  662. FlowNode pvmActivityImpl = (FlowNode)bpmnModel.getMainProcess().getFlowElement( pvmTransition.getTargetRef());// 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示
  663. if (sameStartTimeNodes.contains(pvmActivityImpl)) {
  664. highFlows.add(pvmTransition.getId());
  665. }
  666. }
  667. }
  668. return highFlows;
  669. }
  670. public void suspendProcessInstanceById(String processInstanceId) {
  671. runtimeService.suspendProcessInstanceById(processInstanceId);
  672. }
  673. public void deleteProcessInstance(String processInstanceId, String comments) {
  674. // 删除正在运行中的流程根据流程实例ID
  675. try {
  676. runtimeService.deleteProcessInstance(processInstanceId, comments);
  677. } catch (Exception e) {
  678. logger.info("删除工作流,未找到进行中工作流ID:" + processInstanceId + ", 异常信息:" + e);
  679. }
  680. // 删除历史流程实例根据流程实例ID
  681. try {
  682. historyService.deleteHistoricProcessInstance(processInstanceId);
  683. } catch (Exception e) {
  684. logger.info("删除历史或已完成工作流,ID:" + processInstanceId + ", 异常信息:" + e);
  685. }
  686. }
  687. @Transactional
  688. public void returnAssignNode(String processKey, String businessKey, String proInstanceId, String curUserId, String createUserId, String callBackUrl) {
  689. Task task = taskService.createTaskQuery()
  690. .processDefinitionKey(processKey)
  691. .processVariableValueEquals("businessKey", businessKey)
  692. .singleResult();
  693. if(null==task || proInstanceId.equals("") || curUserId.equals("") || createUserId.equals("")) {
  694. return;
  695. }
  696. List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
  697. .processInstanceId(proInstanceId)
  698. .list();
  699. String myTaskId = null;
  700. HistoricTaskInstance myTask = null;
  701. if (list != null && list.size() > 0) {
  702. for(HistoricTaskInstance hti : list) {
  703. if(curUserId.equals(hti.getAssignee())) {
  704. myTaskId = hti.getId();
  705. myTask = hti;
  706. break;
  707. }
  708. }
  709. }
  710. if(null==myTaskId) {
  711. return;
  712. }
  713. String processDefinitionId = myTask.getProcessDefinitionId();
  714. // ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
  715. BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
  716. //变量
  717. // Map<String, VariableInstance> variables = runtimeService.getVariableInstances(currentTask.getExecutionId());
  718. String myActivityId = null;
  719. List<HistoricActivityInstance> haiList = historyService.createHistoricActivityInstanceQuery()
  720. .executionId(myTask.getExecutionId()).finished().list();
  721. for(HistoricActivityInstance hai : haiList) {
  722. if(myTaskId.equals(hai.getTaskId())) {
  723. myActivityId = hai.getActivityId();
  724. break;
  725. }
  726. }
  727. FlowNode myFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(myActivityId);
  728. Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();
  729. String activityId = execution.getActivityId();
  730. logger.warn("------->> 撤回的activityId:" + activityId);
  731. FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(activityId);
  732. //记录原活动方向
  733. List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
  734. oriSequenceFlows.addAll(flowNode.getOutgoingFlows());
  735. //清理活动方向
  736. flowNode.getOutgoingFlows().clear();
  737. //建立新方向
  738. List<SequenceFlow> newSequenceFlowList = new ArrayList<SequenceFlow>();
  739. SequenceFlow newSequenceFlow = new SequenceFlow();
  740. newSequenceFlow.setId("newSequenceFlowId");
  741. newSequenceFlow.setSourceFlowElement(flowNode);
  742. newSequenceFlow.setTargetFlowElement(myFlowNode);
  743. newSequenceFlowList.add(newSequenceFlow);
  744. flowNode.setOutgoingFlows(newSequenceFlowList);
  745. Authentication.setAuthenticatedUserId(curUserId);
  746. // TODO 审批意见字段未设置成功
  747. taskService.addComment(task.getId(), task.getProcessInstanceId(), "上级单位撤回");
  748. taskService.setAssignee(task.getId(), createUserId);
  749. taskService.setVariable(task.getId(),"remarks", "上级单位撤回");
  750. taskService.setVariableLocal(task.getId(), "remarks", "上级单位撤回");
  751. Map<String,Object> currentVariables = new HashMap<String,Object>();
  752. currentVariables.put("applier", curUserId);
  753. currentVariables.put("businessKey", businessKey);
  754. currentVariables.put("users", curUserId);
  755. currentVariables.put("remarks", "上级单位撤回");
  756. currentVariables.put("callbackUrl", callBackUrl);
  757. //完成任务
  758. taskService.complete(task.getId(),currentVariables);
  759. //恢复原方向
  760. flowNode.setOutgoingFlows(oriSequenceFlows);
  761. logger.info("回滚完成:businessKey " + businessKey);
  762. }
  763. }