AcBusinessController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package com.zhcs.dt.controller.activiti;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.ArrayList;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import java.util.Map;
  8. import org.activiti.bpmn.model.BpmnModel;
  9. import org.activiti.bpmn.model.FlowNode;
  10. import org.activiti.bpmn.model.SequenceFlow;
  11. import org.activiti.engine.HistoryService;
  12. import org.activiti.engine.ProcessEngine;
  13. import org.activiti.engine.RepositoryService;
  14. import org.activiti.engine.RuntimeService;
  15. import org.activiti.engine.TaskService;
  16. import org.activiti.engine.history.HistoricActivityInstance;
  17. import org.activiti.engine.history.HistoricProcessInstance;
  18. import org.activiti.engine.task.Task;
  19. import org.activiti.image.ProcessDiagramGenerator;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import com.zhcs.dt.controller.activiti.util.BpmsActivityTypeEnum;
  22. import com.zhcs.dt.controller.activiti.util.UtilMisc;
  23. import com.zhcs.dt.controller.base.BaseController;
  24. import com.zhcs.dt.util.Const;
  25. import com.zhcs.dt.util.DelAllFile;
  26. import com.zhcs.dt.util.FileUpload;
  27. import com.zhcs.dt.util.PathUtil;
  28. /**
  29. * 类名称:流程业务相关
  30. * 创建人:FH Admin fh313596790qq(青苔)
  31. * 更新时间:2018年1月31日
  32. * @version
  33. */
  34. public class AcBusinessController extends BaseController {
  35. @Autowired
  36. private ProcessEngine processEngine; //流程引擎对象
  37. @Autowired
  38. private RepositoryService repositoryService; //管理流程定义 与流程定义和部署对象相关的Service
  39. @Autowired
  40. private RuntimeService runtimeService; //与正在执行的流程实例和执行对象相关的Service(执行管理,包括启动、推进、删除流程实例等操作)
  41. @Autowired
  42. private TaskService taskService; //任务管理 与正在执行的任务管理相关的Service
  43. @Autowired
  44. private HistoryService historyService; //历史管理(执行完的数据的管理)
  45. /**指派任务的代理人
  46. * @param Assignee //代理人
  47. * @param taskId //任务ID
  48. */
  49. protected void setAssignee(String taskId,String Assignee){
  50. taskService.setAssignee(taskId, Assignee);
  51. }
  52. /**设置流程变量(绑定任务)用Map形式
  53. * @param taskId //任务ID
  54. * @param map
  55. */
  56. protected void setVariablesByTaskIdAsMap(String taskId,Map<String,Object> map){
  57. taskService.setVariablesLocal(taskId,map);
  58. }
  59. /**获取流程变量
  60. * @param taskId //任务ID
  61. * @param key //键
  62. * @param map
  63. */
  64. protected Object getVariablesByTaskIdAsMap(String taskId,String key){
  65. return taskService.getVariable(taskId, key);
  66. }
  67. /**设置流程变量(不绑定任务)
  68. * @param taskId //任务ID
  69. * @param map
  70. */
  71. protected void setVariablesByTaskId(String taskId,String key,String value){
  72. taskService.setVariable(taskId,key,value);
  73. }
  74. /**移除流程变量(从正在运行中)
  75. * @param PROC_INST_ID_ //流程实例ID
  76. * @param map
  77. */
  78. protected void removeVariablesByPROC_INST_ID_(String PROC_INST_ID_,String key){
  79. runtimeService.removeVariable(PROC_INST_ID_, key);
  80. }
  81. /**查询我的任务
  82. * @param USERNAME
  83. * @return 返回任务列表
  84. */
  85. protected List<Task> findMyPersonalTask(String USERNAME){
  86. return taskService.createTaskQuery() //创建查询对象
  87. .taskAssignee(USERNAME) //指定办理人
  88. .list(); //读出列表(比如从0到10)
  89. }
  90. /**完成任务
  91. * @param taskId 任务ID
  92. */
  93. protected void completeMyPersonalTask(String taskId){
  94. taskService.complete(taskId);
  95. }
  96. /**作废流程
  97. * @param processId //流程实例ID
  98. * @param reason //作废原因
  99. * @throws Exception
  100. */
  101. protected void deleteProcessInstance(String processId,String reason) throws Exception{
  102. runtimeService.deleteProcessInstance(processId, reason);
  103. }
  104. /**删除历史流程
  105. * @param PROC_INST_ID_ //流程实例ID
  106. * @throws Exception
  107. */
  108. protected void deleteHiProcessInstance(String PROC_INST_ID_) throws Exception{
  109. historyService.deleteHistoricProcessInstance(PROC_INST_ID_);
  110. }
  111. /**生成当前任务节点流程图片PNG
  112. * @param PROC_INST_ID_ //流程实例ID
  113. * @param FILENAME //图片名称
  114. * @throws IOException
  115. */
  116. protected void createXmlAndPngAtNowTask(String PROC_INST_ID_, String FILENAME) throws IOException{
  117. DelAllFile.delFolder(PathUtil.getClasspath()+"uploadFiles/activitiFile"); //生成先清空之前生成的文件
  118. InputStream in = getResourceDiagramInputStream(PROC_INST_ID_);
  119. FileUpload.copyFile(in,PathUtil.getClasspath()+Const.FILEACTIVITI,FILENAME);//把文件上传到文件目录里面
  120. in.close();
  121. }
  122. /**获取当前任务流程图片的输入流
  123. * @param PROC_INST_ID_ //流程实例ID
  124. * @return
  125. */
  126. private InputStream getResourceDiagramInputStream(String PROC_INST_ID_){
  127. try {
  128. HistoricProcessInstance hip = historyService.createHistoricProcessInstanceQuery().processInstanceId(PROC_INST_ID_).singleResult(); //获取历史流程实例
  129. List<HistoricActivityInstance> hai = historyService.createHistoricActivityInstanceQuery().processInstanceId(PROC_INST_ID_)
  130. .orderByHistoricActivityInstanceId().asc().list(); //获取流程中已经执行的节点,按照执行先后顺序排序
  131. List<String> executedActivityIdList = new ArrayList<String>(); // 构造已执行的节点ID集合
  132. for (HistoricActivityInstance activityInstance : hai) {
  133. executedActivityIdList.add(activityInstance.getActivityId());
  134. }
  135. BpmnModel bpmnModel = repositoryService.getBpmnModel(hip.getProcessDefinitionId()); // 获取bpmnModel
  136. List<String> flowIds = this.getExecutedFlows(bpmnModel, hai); // 获取流程已发生流转的线ID集合
  137. ProcessDiagramGenerator processDiagramGenerator = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();
  138. InputStream imageStream = processDiagramGenerator.generateDiagram(bpmnModel, "png", executedActivityIdList, flowIds, "宋体", "微软雅黑", "黑体", null, 2.0); //使用默认配置获得流程图表生成器,并生成追踪图片字符流
  139. return imageStream;
  140. } catch (Exception e) {
  141. e.printStackTrace();
  142. return null;
  143. }
  144. }
  145. /**获取流程已发生流转的线ID集合
  146. * @param bpmnModel
  147. * @param historicActivityInstances //历史流程实例list
  148. * @return
  149. */
  150. private List<String> getExecutedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances) {
  151. List<String> flowIdList = new ArrayList<String>(); //流转线ID集合
  152. List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>(); //全部活动实例
  153. List<HistoricActivityInstance> finishedActivityInstanceList = new LinkedList<HistoricActivityInstance>(); //已完成的历史活动节点
  154. for(HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
  155. historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true));
  156. if(historicActivityInstance.getEndTime() != null) {
  157. finishedActivityInstanceList.add(historicActivityInstance);
  158. }
  159. }
  160. /**遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的*/
  161. FlowNode currentFlowNode = null;
  162. for(HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) {
  163. /**获得当前活动对应的节点信息及outgoingFlows信息*/
  164. currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
  165. List<SequenceFlow> sequenceFlowList = currentFlowNode.getOutgoingFlows();
  166. /**
  167. * 遍历outgoingFlows并找到已流转的
  168. * 满足如下条件任务已流转:
  169. * 1.当前节点是并行网关或包含网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转
  170. * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最近的流转节点视为有效流转
  171. */
  172. FlowNode targetFlowNode = null;
  173. if(BpmsActivityTypeEnum.PARALLEL_GATEWAY.getType().equals(currentActivityInstance.getActivityType())
  174. || BpmsActivityTypeEnum.INCLUSIVE_GATEWAY.getType().equals(currentActivityInstance.getActivityType())) {
  175. for(SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的
  176. targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);
  177. if(historicFlowNodeList.contains(targetFlowNode)) {
  178. flowIdList.add(sequenceFlow.getId());
  179. }
  180. }
  181. }else{
  182. List<Map<String, String>> tempMapList = new LinkedList<Map<String,String>>();
  183. for(SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的
  184. for(HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
  185. if(historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) {
  186. tempMapList.add(UtilMisc.toMap("flowId", sequenceFlow.getId(), "activityStartTime", String.valueOf(historicActivityInstance.getStartTime().getTime())));
  187. }
  188. }
  189. }
  190. String flowId = null;
  191. for (Map<String, String> map : tempMapList) {
  192. flowId = map.get("flowId");
  193. flowIdList.add(flowId);
  194. }
  195. /**遍历匹配的集合,取得开始时间最早的一个*/
  196. /*long earliestStamp = 0L;
  197. String flowId = null;
  198. for (Map<String, String> map : tempMapList) {
  199. long activityStartTime = Long.valueOf(map.get("activityStartTime"));
  200. if (earliestStamp == 0 || earliestStamp >= activityStartTime) {
  201. earliestStamp = activityStartTime;
  202. flowId = map.get("flowId");
  203. }
  204. }
  205. flowIdList.add(flowId);*/
  206. }
  207. }
  208. return flowIdList;
  209. }
  210. /**获取发起人
  211. * @param PROC_INST_ID_ //流程实例ID
  212. * @return
  213. */
  214. protected String getInitiator(String PROC_INST_ID_) {
  215. HistoricProcessInstance hip = historyService.createHistoricProcessInstanceQuery().processInstanceId(PROC_INST_ID_).singleResult(); //获取历史流程实例
  216. List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery().processInstanceId(PROC_INST_ID_)
  217. .orderByHistoricActivityInstanceId().asc().list(); //获取流程中已经执行的节点,按照执行先后顺序排序
  218. BpmnModel bpmnModel = repositoryService.getBpmnModel(hip.getProcessDefinitionId()); // 获取bpmnModel
  219. List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>(); //全部活动实例
  220. for(HistoricActivityInstance hai : hais) {
  221. historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(hai.getActivityId(), true));
  222. if(hai.getAssignee() != null) {
  223. return hai.getAssignee(); //不为空的第一个节点办理人就是发起人
  224. }
  225. }
  226. return null;
  227. }
  228. }