ActTaskService.java 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470
  1. /**
  2. * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
  3. */
  4. package com.jeeplus.modules.act.service;
  5. import java.io.InputStream;
  6. import java.util.*;
  7. import com.jeeplus.modules.sg.managementcenter.activiti.entity.Construction;
  8. import com.jeeplus.modules.sg.managementcenter.activiti.entity.Disclose;
  9. import com.jeeplus.modules.sg.managementcenter.activiti.service.ConstructionService;
  10. import com.jeeplus.modules.sg.managementcenter.activiti.service.DiscloseService;
  11. import org.activiti.bpmn.model.BpmnModel;
  12. import org.activiti.engine.FormService;
  13. import org.activiti.engine.HistoryService;
  14. import org.activiti.engine.IdentityService;
  15. import org.activiti.engine.RepositoryService;
  16. import org.activiti.engine.RuntimeService;
  17. import org.activiti.engine.TaskService;
  18. import org.activiti.engine.delegate.Expression;
  19. import org.activiti.engine.history.HistoricActivityInstance;
  20. import org.activiti.engine.history.HistoricProcessInstance;
  21. import org.activiti.engine.history.HistoricProcessInstanceQuery;
  22. import org.activiti.engine.history.HistoricTaskInstance;
  23. import org.activiti.engine.history.HistoricTaskInstanceQuery;
  24. import org.activiti.engine.impl.RepositoryServiceImpl;
  25. import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
  26. import org.activiti.engine.impl.context.Context;
  27. import org.activiti.engine.impl.javax.el.ExpressionFactory;
  28. import org.activiti.engine.impl.javax.el.ValueExpression;
  29. import org.activiti.engine.impl.juel.ExpressionFactoryImpl;
  30. import org.activiti.engine.impl.juel.SimpleContext;
  31. import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
  32. import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
  33. import org.activiti.engine.impl.pvm.PvmActivity;
  34. import org.activiti.engine.impl.pvm.PvmTransition;
  35. import org.activiti.engine.impl.pvm.delegate.ActivityBehavior;
  36. import org.activiti.engine.impl.pvm.process.ActivityImpl;
  37. import org.activiti.engine.impl.task.TaskDefinition;
  38. import org.activiti.engine.repository.Deployment;
  39. import org.activiti.engine.repository.ProcessDefinition;
  40. import org.activiti.engine.repository.ProcessDefinitionQuery;
  41. import org.activiti.engine.runtime.Execution;
  42. import org.activiti.engine.runtime.ProcessInstance;
  43. import org.activiti.engine.runtime.ProcessInstanceQuery;
  44. import org.activiti.engine.task.Comment;
  45. import org.activiti.engine.task.Task;
  46. import org.activiti.engine.task.TaskQuery;
  47. import org.activiti.image.impl.DefaultProcessDiagramGenerator;
  48. import org.activiti.spring.ProcessEngineFactoryBean;
  49. import org.apache.commons.beanutils.PropertyUtils;
  50. import org.apache.commons.lang3.builder.ToStringBuilder;
  51. import org.springframework.beans.factory.annotation.Autowired;
  52. import org.springframework.stereotype.Service;
  53. import org.springframework.transaction.annotation.Transactional;
  54. import com.google.common.collect.Lists;
  55. import com.google.common.collect.Maps;
  56. import com.jeeplus.common.utils.StringUtils;
  57. import com.jeeplus.core.persistence.Page;
  58. import com.jeeplus.core.service.BaseService;
  59. import com.jeeplus.modules.act.entity.Act;
  60. import com.jeeplus.modules.act.mapper.ActMapper;
  61. import com.jeeplus.modules.act.utils.ActUtils;
  62. import com.jeeplus.modules.act.utils.ProcessDefCache;
  63. import com.jeeplus.modules.sys.entity.User;
  64. import com.jeeplus.modules.sys.utils.UserUtils;
  65. /**
  66. * 流程定义相关Service
  67. * @author jeeplus
  68. * @version 2016-11-03
  69. */
  70. @Service
  71. @Transactional(readOnly = true)
  72. public class ActTaskService extends BaseService {
  73. @Autowired
  74. private ActMapper actMapper;
  75. @Autowired
  76. private ProcessEngineFactoryBean processEngine;
  77. @Autowired
  78. private RuntimeService runtimeService;
  79. @Autowired
  80. private TaskService taskService;
  81. @Autowired
  82. private FormService formService;
  83. @Autowired
  84. private HistoryService historyService;
  85. @Autowired
  86. private RepositoryService repositoryService;
  87. @Autowired
  88. private IdentityService identityService;
  89. @Autowired
  90. private ConstructionService constructionService;
  91. @Autowired
  92. private DiscloseService discloseService;
  93. /**
  94. * 获取待办任务列表
  95. * @return
  96. */
  97. public Page<HashMap<String,String>> todoList(Page<HashMap<String,String>> page, Act act){
  98. List<HashMap<String,String>> result = new ArrayList<HashMap<String,String>>();
  99. String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId());
  100. // =============== 已经签收的任务 ===============
  101. TaskQuery todoTaskQuery = taskService.createTaskQuery().taskAssignee(userId).active()
  102. .includeProcessVariables().orderByTaskCreateTime().desc();
  103. // 设置查询条件
  104. if (StringUtils.isNotBlank(act.getProcDefKey())){
  105. todoTaskQuery.processDefinitionKey(act.getProcDefKey());
  106. }
  107. if (act.getBeginDate() != null){
  108. todoTaskQuery.taskCreatedAfter(act.getBeginDate());
  109. }
  110. if (act.getEndDate() != null){
  111. todoTaskQuery.taskCreatedBefore(act.getEndDate());
  112. }
  113. // =============== 等待签收的任务 ===============
  114. TaskQuery toClaimQuery = taskService.createTaskQuery().taskCandidateUser(userId)
  115. .includeProcessVariables().active().orderByTaskCreateTime().desc();
  116. // 设置查询条件
  117. if (StringUtils.isNotBlank(act.getProcDefKey())){
  118. toClaimQuery.processDefinitionKey(act.getProcDefKey());
  119. }
  120. if (act.getBeginDate() != null){
  121. toClaimQuery.taskCreatedAfter(act.getBeginDate());
  122. }
  123. if (act.getEndDate() != null){
  124. toClaimQuery.taskCreatedBefore(act.getEndDate());
  125. }
  126. long taskCount = todoTaskQuery.count();
  127. long claimCount = toClaimQuery.count();
  128. long total = taskCount + claimCount;
  129. page.setCount(total);
  130. int start = page.getFirstResult();
  131. int end = page.getFirstResult() + page.getMaxResults();
  132. // 查询列表
  133. List<Task> todoList = Lists.newArrayList();
  134. // 查询列表
  135. List<Task> toClaimList = Lists.newArrayList();
  136. if(end == -1){//不分页
  137. todoList = todoTaskQuery.list();
  138. toClaimList = toClaimQuery.list();
  139. }else{
  140. if(end <= taskCount){
  141. todoList = todoTaskQuery.listPage(start, page.getMaxResults());
  142. }else if(start <taskCount){
  143. todoList = todoTaskQuery.listPage(start, (int)taskCount - start);
  144. toClaimList = toClaimQuery.listPage(0, end -(int)taskCount);
  145. }else{
  146. toClaimList= toClaimQuery.listPage(start-(int)taskCount, page.getMaxResults());
  147. }
  148. }
  149. for (Task task : todoList) {
  150. HashMap map = new HashMap();
  151. map.put("task.assignee",task.getAssignee());
  152. map.put("task.id", task.getId());
  153. map.put("task.createTime", task.getCreateTime());
  154. map.put("task.name", task.getName());
  155. map.put("task.executionId",task.getExecutionId());
  156. map.put("task.processDefinitionId", task.getProcessDefinitionId());
  157. map.put("task.processInstanceId", task.getProcessInstanceId());
  158. map.put("task.taskDefinitionKey", task.getTaskDefinitionKey());
  159. map.put("vars",task.getProcessVariables());
  160. map.put("procDef.name", ProcessDefCache.get(task.getProcessDefinitionId()).getName());
  161. map.put("procDef.version", ProcessDefCache.get(task.getProcessDefinitionId()).getVersion());
  162. map.put("status","todo");
  163. map.put("title",task.getProcessVariables().get("title"));
  164. page.getList().add(map);
  165. }
  166. for (Task task : toClaimList) {
  167. HashMap map = new HashMap();
  168. map.put("task.assignee",task.getAssignee());
  169. map.put("task.id", task.getId());
  170. map.put("task.name", task.getName());
  171. map.put("task.createTime", task.getCreateTime());
  172. map.put("task.executionId",task.getExecutionId());
  173. map.put("task.processInstanceId", task.getProcessInstanceId());
  174. map.put("task.processDefinitionId", task.getProcessDefinitionId());
  175. map.put("task.taskDefinitionKey", task.getTaskDefinitionKey());
  176. map.put("vars",task.getProcessVariables());
  177. map.put("procDef.name", ProcessDefCache.get(task.getProcessDefinitionId()).getName());
  178. map.put("procDef.version", ProcessDefCache.get(task.getProcessDefinitionId()).getVersion());
  179. map.put("status", "claim");
  180. map.put("title",task.getProcessVariables().get("title"));
  181. page.getList().add(map);
  182. }
  183. return page;
  184. }
  185. /**
  186. * 获取已办任务列表
  187. * @param page
  188. * @return
  189. */
  190. public Page<HashMap<String,String>> historicList(Page<HashMap<String,String>> page, Act act){
  191. String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId());
  192. HistoricTaskInstanceQuery histTaskQuery = historyService.createHistoricTaskInstanceQuery().taskAssignee(userId).finished()
  193. .includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc();
  194. // 设置查询条件
  195. if (StringUtils.isNotBlank(act.getProcDefKey())){
  196. histTaskQuery.processDefinitionKey(act.getProcDefKey());
  197. }
  198. if (act.getBeginDate() != null){
  199. histTaskQuery.taskCompletedAfter(act.getBeginDate());
  200. }
  201. if (act.getEndDate() != null){
  202. histTaskQuery.taskCompletedBefore(act.getEndDate());
  203. }
  204. // 查询总数
  205. page.setCount(histTaskQuery.count());
  206. page.initialize();
  207. // 查询列表
  208. List<HistoricTaskInstance> histList = Lists.newArrayList();
  209. if(page.getMaxResults() == -1){
  210. histList = histTaskQuery.list();
  211. }else{
  212. histList = histTaskQuery.listPage(page.getFirstResult(), page.getMaxResults());
  213. }
  214. for (HistoricTaskInstance histTask : histList) {
  215. Act e = new Act();
  216. e.setHistTask(histTask);
  217. e.setVars(histTask.getProcessVariables());
  218. // e.setTaskVars(histTask.getTaskLocalVariables());
  219. // System.out.println(histTask.getId()+" = "+histTask.getProcessVariables() + " ========== " + histTask.getTaskLocalVariables());
  220. e.setProcDef(ProcessDefCache.get(histTask.getProcessDefinitionId()));
  221. // e.setProcIns(runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult());
  222. // e.setProcExecUrl(ActUtils.getProcExeUrl(task.getProcessDefinitionId()));
  223. e.setStatus("finish");
  224. HashMap map = new HashMap();
  225. map.put("task.assignee",histTask.getAssignee());
  226. map.put("task.id", histTask.getId());
  227. map.put("task.name", histTask.getName());
  228. map.put("task.endTime", histTask.getEndTime());
  229. map.put("task.executionId",histTask.getExecutionId());
  230. map.put("task.processInstanceId", histTask.getProcessInstanceId());
  231. map.put("task.processDefinitionId", histTask.getProcessDefinitionId());
  232. map.put("task.taskDefinitionKey", histTask.getTaskDefinitionKey());
  233. map.put("vars",histTask.getProcessVariables());
  234. map.put("procDef.name", ProcessDefCache.get(histTask.getProcessDefinitionId()).getName());
  235. map.put("procDef.version", ProcessDefCache.get(histTask.getProcessDefinitionId()).getVersion());
  236. try {
  237. map.put("status", queryProcessState(histTask.getProcessInstanceId()));
  238. } catch (Exception e1) {
  239. e1.printStackTrace();
  240. }
  241. page.getList().add(map);
  242. }
  243. return page;
  244. }
  245. /**
  246. * 获取流转历史任务列表
  247. * @param procInsId 流程实例
  248. * @param startAct 开始活动节点名称
  249. * @param endAct 结束活动节点名称
  250. */
  251. public List<Act> histoicFlowList(String procInsId, String startAct, String endAct){
  252. List<Act> actList = Lists.newArrayList();
  253. List<HistoricActivityInstance> list = Lists.newArrayList();
  254. List<HistoricActivityInstance> historicActivityInstances2 = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId)
  255. .orderByHistoricActivityInstanceStartTime().asc().orderByHistoricActivityInstanceEndTime().asc().list();;
  256. for(HistoricActivityInstance historicActivityInstance:historicActivityInstances2){
  257. if(historicActivityInstance.getEndTime() != null){
  258. list.add(historicActivityInstance);
  259. }
  260. }
  261. for(HistoricActivityInstance historicActivityInstance:historicActivityInstances2){
  262. if(historicActivityInstance.getEndTime() == null){
  263. list.add(historicActivityInstance);
  264. }
  265. }
  266. boolean start = false;
  267. Map<String, Integer> actMap = Maps.newHashMap();
  268. for (int i=0; i<list.size(); i++){
  269. HistoricActivityInstance histIns = list.get(i);
  270. // 过滤开始节点前的节点
  271. if (StringUtils.isNotBlank(startAct) && startAct.equals(histIns.getActivityId())){
  272. start = true;
  273. }
  274. if (StringUtils.isNotBlank(startAct) && !start){
  275. continue;
  276. }
  277. // 只显示开始节点和结束节点,并且执行人不为空的任务
  278. if (StringUtils.isNotBlank(histIns.getAssignee())
  279. || "startEvent".equals(histIns.getActivityType())
  280. || "endEvent".equals(histIns.getActivityType())){
  281. // 给节点增加一个序号
  282. Integer actNum = actMap.get(histIns.getActivityId());
  283. if (actNum == null){
  284. actMap.put(histIns.getActivityId(), actMap.size());
  285. }
  286. Act e = new Act();
  287. e.setHistIns(histIns);
  288. // 获取流程发起人名称
  289. if ("startEvent".equals(histIns.getActivityType())){
  290. List<HistoricProcessInstance> il = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).orderByProcessInstanceStartTime().asc().list();
  291. // List<HistoricIdentityLink> il = historyService.getHistoricIdentityLinksForProcessInstance(procInsId);
  292. if (il.size() > 0){
  293. if (StringUtils.isNotBlank(il.get(0).getStartUserId())){
  294. User user = UserUtils.getByLoginName(il.get(0).getStartUserId());
  295. if (user != null){
  296. e.setAssignee(histIns.getAssignee());
  297. e.setAssigneeName(user.getName());
  298. }
  299. }
  300. }
  301. }
  302. // 获取任务执行人名称
  303. if (StringUtils.isNotEmpty(histIns.getAssignee())){
  304. User user = UserUtils.getByLoginName(histIns.getAssignee());
  305. if (user != null){
  306. e.setAssignee(histIns.getAssignee());
  307. e.setAssigneeName(user.getName());
  308. }
  309. }
  310. // 获取意见评论内容
  311. if (StringUtils.isNotBlank(histIns.getTaskId())){
  312. List<Comment> commentList = taskService.getTaskComments(histIns.getTaskId());
  313. if (commentList.size()>0){
  314. e.setComment(commentList.get(0).getFullMessage());
  315. }
  316. }
  317. actList.add(e);
  318. }
  319. // 过滤结束节点后的节点
  320. if (StringUtils.isNotBlank(endAct) && endAct.equals(histIns.getActivityId())){
  321. boolean bl = false;
  322. Integer actNum = actMap.get(histIns.getActivityId());
  323. // 该活动节点,后续节点是否在结束节点之前,在后续节点中是否存在
  324. for (int j=i+1; j<list.size(); j++){
  325. HistoricActivityInstance hi = list.get(j);
  326. Integer actNumA = actMap.get(hi.getActivityId());
  327. if ((actNumA != null && actNumA < actNum) || StringUtils.equals(hi.getActivityId(), histIns.getActivityId())){
  328. bl = true;
  329. }
  330. }
  331. if (!bl){
  332. break;
  333. }
  334. }
  335. }
  336. return actList;
  337. }
  338. /**
  339. * 获取流程定义列表
  340. * @param category 流程分类
  341. */
  342. public Page<Object[]> processList(Page<Object[]> page, String category) {
  343. /*
  344. * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
  345. */
  346. ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
  347. .latestVersion().active().orderByProcessDefinitionKey().asc();
  348. if (StringUtils.isNotEmpty(category)){
  349. processDefinitionQuery.processDefinitionCategory(category);
  350. }
  351. page.setCount(processDefinitionQuery.count());
  352. List<ProcessDefinition> processDefinitionList = Lists.newArrayList();
  353. if(page.getMaxResults() == -1){//不分页
  354. processDefinitionList = processDefinitionQuery.list();
  355. }else{
  356. processDefinitionList = processDefinitionQuery.listPage(page.getFirstResult(), page.getMaxResults());
  357. }
  358. for (ProcessDefinition processDefinition : processDefinitionList) {
  359. String deploymentId = processDefinition.getDeploymentId();
  360. Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult();
  361. page.getList().add(new Object[]{processDefinition, deployment});
  362. }
  363. return page;
  364. }
  365. /**
  366. * 获取流程表单(首先获取任务节点表单KEY,如果没有则取流程开始节点表单KEY)
  367. * @return
  368. */
  369. public String getFormKey(String procDefId, String taskDefKey){
  370. String formKey = "";
  371. if (StringUtils.isNotBlank(procDefId)){
  372. if (StringUtils.isNotBlank(taskDefKey)){
  373. try{
  374. formKey = formService.getTaskFormKey(procDefId, taskDefKey);
  375. }catch (Exception e) {
  376. formKey = "";
  377. }
  378. }
  379. if (StringUtils.isBlank(formKey)){
  380. formKey = formService.getStartFormKey(procDefId);
  381. }
  382. if (StringUtils.isBlank(formKey)){
  383. formKey = "/404";
  384. }
  385. }
  386. logger.debug("getFormKey: {}", formKey);
  387. return formKey;
  388. }
  389. /**
  390. * 获取正在运行的流程实例对象
  391. * @param procInsId
  392. * @return
  393. */
  394. @Transactional(readOnly = false)
  395. public ProcessInstance getProcIns(String procInsId) {
  396. return runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
  397. }
  398. /**
  399. * 获取已经结束流程实例对象
  400. * @param procInsId
  401. * @return
  402. */
  403. @Transactional(readOnly = false)
  404. public HistoricProcessInstance getFinishedProcIns(String procInsId) {
  405. return historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).singleResult();
  406. }
  407. /**
  408. * 获取正在运行的流程实例对象列表
  409. * @param procDefKey
  410. * @return
  411. */
  412. @Transactional(readOnly = false)
  413. public List<ProcessInstance> getRunngingProcIns(String procDefKey, User user, int[] pageParams) {
  414. ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery().processDefinitionKey(procDefKey).active().orderByProcessInstanceId().desc();
  415. List<ProcessInstance> list = new ArrayList<ProcessInstance>();
  416. if (User.isAdmin(user.getId())){
  417. list = query.listPage(pageParams[0], pageParams[1]);
  418. } else {
  419. list = query.involvedUser(user.getLoginName()).listPage(pageParams[0], pageParams[1]);
  420. }
  421. return list;
  422. }
  423. /**
  424. * 获取已经结束的流程实例对象列表
  425. * @param procDefKey
  426. * @return
  427. */
  428. @Transactional(readOnly = false)
  429. public List<HistoricProcessInstance> getFinishedProcIns(String procDefKey, User user, int[] pageParams) {
  430. HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery().processDefinitionKey(procDefKey).finished().orderByProcessInstanceEndTime().desc();
  431. List<HistoricProcessInstance> list = new ArrayList<HistoricProcessInstance>();
  432. if (User.isAdmin(user.getId())){
  433. list = query.listPage(pageParams[0], pageParams[1]);
  434. } else {
  435. list = query.involvedUser(user.getLoginName()).listPage(pageParams[0], pageParams[1]);
  436. }
  437. return list;
  438. }
  439. /**
  440. * 获取我发起的流程申请列表
  441. * @param user
  442. * @return
  443. */
  444. @Transactional(readOnly = false)
  445. public Page<HashMap> getMyStartedProcIns( User user, Page<HashMap> page) throws Exception{
  446. HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery().startedBy(user.getLoginName()).includeProcessVariables().orderByProcessInstanceStartTime().desc();
  447. page.setCount(query.count());
  448. List<HistoricProcessInstance> histList = Lists.newArrayList();
  449. if(page.getMaxResults() == -1){//不分页
  450. histList = query.list();
  451. }else {
  452. histList = query.involvedUser(user.getLoginName()).listPage(page.getFirstResult(), page.getMaxResults());
  453. }
  454. for (HistoricProcessInstance historicProcessInstance : histList) {
  455. HashMap map = new HashMap();
  456. // p.getActivityId());
  457. // map.put("suspended", String.valueOf(p.isSuspended()));
  458. // historicProcessInstance.
  459. String state = queryProcessState(historicProcessInstance.getId());
  460. map.put("procIns.endTime", historicProcessInstance.getEndTime());
  461. map.put("procIns.startTime",historicProcessInstance.getStartTime());
  462. map.put("procIns.processInstanceId", historicProcessInstance.getId());
  463. map.put("procDef.processDefinitionId", historicProcessInstance.getProcessDefinitionId());
  464. map.put("vars",historicProcessInstance.getProcessVariables());
  465. map.put("procDef.name", historicProcessInstance.getProcessDefinitionName());
  466. map.put("procDef.version", historicProcessInstance.getProcessDefinitionVersion());
  467. map.put("procIns.status", state);
  468. page.getList().add(map);
  469. }
  470. return page;
  471. }
  472. /**
  473. * 启动流程
  474. * @param procDefKey 流程定义KEY
  475. * @param businessTable 业务表表名
  476. * @param businessId 业务表编号
  477. * @return 流程实例ID
  478. */
  479. @Transactional(readOnly = false)
  480. public String startProcess(String procDefKey, String businessTable, String businessId) {
  481. return startProcess(procDefKey, businessTable, businessId, "");
  482. }
  483. /**
  484. * 启动流程
  485. * @param procDefKey 流程定义KEY
  486. * @param businessTable 业务表表名
  487. * @param businessId 业务表编号
  488. * @param title 流程标题,显示在待办任务标题
  489. * @return 流程实例ID
  490. */
  491. @Transactional(readOnly = false)
  492. public String startProcess(String procDefKey, String businessTable, String businessId, String title) {
  493. Map<String, Object> vars = Maps.newHashMap();
  494. return startProcess(procDefKey, businessTable, businessId, title, vars);
  495. }
  496. /**
  497. * 启动流程
  498. * @param procDefKey 流程定义KEY
  499. * @param businessTable 业务表表名
  500. * @param businessId 业务表编号
  501. * @param title 流程标题,显示在待办任务标题
  502. * @param vars 流程变量
  503. * @return 流程实例ID
  504. */
  505. @SuppressWarnings("unused")
  506. @Transactional(readOnly = false)
  507. public String startProcess(String procDefKey, String businessTable, String businessId, String title, Map<String, Object> vars) {
  508. //String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId())
  509. // 设置流程变量
  510. if (vars == null){
  511. vars = Maps.newHashMap();
  512. }
  513. String userId = (String) vars.get("applyUserId");
  514. if(userId == null ){
  515. userId = UserUtils.getUser().getLoginName();
  516. }
  517. String userName = UserUtils.getByLoginName(userId).getName();
  518. vars.put("userName", userName);
  519. // 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
  520. identityService.setAuthenticatedUserId(userId);
  521. // 设置流程标题
  522. if (StringUtils.isNotBlank(title)){
  523. vars.put("title", title);
  524. }
  525. // 启动流程
  526. ProcessInstance procIns = runtimeService.startProcessInstanceByKey(procDefKey, businessTable+":"+businessId, vars);
  527. // 更新业务表流程实例ID
  528. Act act = new Act();
  529. act.setBusinessTable(businessTable);// 业务表名
  530. act.setBusinessId(businessId); // 业务表ID
  531. act.setProcInsId(procIns.getId());
  532. act.setVars(vars);
  533. actMapper.updateProcInsIdByBusinessId(act);
  534. return act.getProcInsId();
  535. }
  536. /**
  537. * 新启动流程
  538. * @param procDefKey 流程定义KEY
  539. * @param businessTable 业务表表名
  540. * @param businessId 业务表编号
  541. * @param title 流程标题,显示在待办任务标题
  542. * @param vars 流程变量
  543. * @return 流程实例ID
  544. */
  545. @SuppressWarnings("unused")
  546. @Transactional(readOnly = false)
  547. public String startProcessNew(String procDefKey, String businessTable, String businessId, String title, Map<String, Object> vars) {
  548. //String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId())
  549. // 设置流程变量
  550. if (vars == null){
  551. vars = Maps.newHashMap();
  552. }
  553. String userId = (String) vars.get("applyUserId");
  554. if(userId == null ){
  555. userId = UserUtils.getUser().getLoginName();
  556. }
  557. String userName = UserUtils.getByLoginName(userId).getName();
  558. vars.put("userName", userName);
  559. String processer = (String) vars.get("processer");
  560. if (processer != null) {
  561. vars.put("processer", processer);
  562. }
  563. // 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
  564. identityService.setAuthenticatedUserId(userId);
  565. // 设置流程标题
  566. if (StringUtils.isNotBlank(title)){
  567. vars.put("title", title);
  568. }
  569. // 启动流程
  570. ProcessInstance procIns = runtimeService.startProcessInstanceByKey(procDefKey, businessTable+":"+businessId, vars);
  571. // 更新业务表流程实例ID
  572. Act act = new Act();
  573. act.setBusinessTable(businessTable);// 业务表名
  574. act.setBusinessId(businessId); // 业务表ID
  575. act.setProcInsId(procIns.getId());
  576. act.setVars(vars);
  577. actMapper.updateProcInsIdByBusinessId(act);
  578. return act.getProcInsId();
  579. }
  580. /**
  581. * 获取任务
  582. * @param taskId 任务ID
  583. */
  584. public Task getTask(String taskId){
  585. return taskService.createTaskQuery().taskId(taskId).singleResult();
  586. }
  587. /**
  588. * 删除任务
  589. * @param taskId 任务ID
  590. * @param deleteReason 删除原因
  591. */
  592. public void deleteTask(String taskId, String deleteReason){
  593. taskService.deleteTask(taskId, deleteReason);
  594. }
  595. /**
  596. * 签收任务
  597. * @param taskId 任务ID
  598. * @param userId 签收用户ID(用户登录名)
  599. */
  600. @Transactional(readOnly = false)
  601. public void claim(String taskId, String userId){
  602. taskService.claim(taskId, userId);
  603. }
  604. /**
  605. * 提交任务, 并保存意见
  606. * @param taskId 任务ID
  607. * @param procInsId 流程实例ID,如果为空,则不保存任务提交意见
  608. * @param comment 任务提交意见的内容
  609. * @param vars 任务变量
  610. */
  611. @Transactional(readOnly = false)
  612. public void complete(String taskId, String procInsId, String comment, Map<String, Object> vars){
  613. complete(taskId, procInsId, comment, "", vars);
  614. }
  615. /**
  616. * 提交任务, 并保存意见
  617. * @param taskId 任务ID
  618. * @param procInsId 流程实例ID,如果为空,则不保存任务提交意见
  619. * @param comment 任务提交意见的内容
  620. * @param title 流程标题,显示在待办任务标题
  621. * @param vars 任务变量
  622. */
  623. @Transactional(readOnly = false)
  624. public void complete(String taskId, String procInsId, String comment, String title, Map<String, Object> vars){
  625. // 添加意见
  626. if (StringUtils.isNotBlank(procInsId) && StringUtils.isNotBlank(comment)){
  627. taskService.addComment(taskId, procInsId, comment);
  628. }
  629. // 设置流程变量
  630. if (vars == null){
  631. vars = Maps.newHashMap();
  632. }
  633. // 设置流程标题
  634. if (StringUtils.isNotBlank(title)){
  635. vars.put("title", title);
  636. }
  637. // 提交任务
  638. taskService.complete(taskId, vars);
  639. }
  640. /**
  641. * 完成第一个任务
  642. * @param procInsId
  643. */
  644. public void completeFirstTask(String procInsId){
  645. completeFirstTask(procInsId, null, null, null);
  646. }
  647. /**
  648. * 完成第一个任务
  649. * @param procInsId
  650. * @param comment
  651. * @param title
  652. * @param vars
  653. */
  654. public void completeFirstTask(String procInsId, String comment, String title, Map<String, Object> vars){
  655. String userId = UserUtils.getUser().getLoginName();
  656. Task task = taskService.createTaskQuery().taskAssignee(userId).processInstanceId(procInsId).active().singleResult();
  657. if (task != null){
  658. complete(task.getId(), procInsId, comment, title, vars);
  659. }
  660. }
  661. /**
  662. * 查询流程实例状态
  663. * @param processInstanceId
  664. * @return
  665. * @throws Exception
  666. */
  667. public String queryProcessState(String processInstanceId) throws Exception {
  668. // 通过流程实例ID查询流程实例
  669. ProcessInstance pi = runtimeService.createProcessInstanceQuery()
  670. .processInstanceId(processInstanceId).singleResult();
  671. if (pi != null) {
  672. if(pi.isSuspended()){
  673. //执行实例
  674. return "[已挂起]";
  675. }else{
  676. //执行实例
  677. List<Task> tasks = taskService.createTaskQuery().processInstanceId(pi.getId()).active().orderByTaskCreateTime().desc().listPage(0, 1);
  678. return "[进行中] :" + tasks.get(0).getName();
  679. }
  680. } else {
  681. HistoricProcessInstance pi2 = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  682. if(pi2 != null){
  683. if(pi2.getDeleteReason() == null){
  684. return "[正常结束]";
  685. }else if(pi2.getDeleteReason().equals("用户撤销")){
  686. return "[用户撤销]";
  687. }else{
  688. return "[流程作废] :"+ pi2.getDeleteReason();
  689. }
  690. }else{
  691. return "[已删除]";
  692. }
  693. }
  694. }
  695. /**
  696. * 终止流程实例
  697. * @param processInstanceId
  698. */
  699. public void endProcessInstance(String processInstanceId, String deleteReason) throws Exception {
  700. runtimeService.deleteProcessInstance(processInstanceId, deleteReason);
  701. }
  702. // /**
  703. // * 委派任务
  704. // * @param taskId 任务ID
  705. // * @param userId 被委派人
  706. // */
  707. // public void delegateTask(String taskId, String userId){
  708. // taskService.delegateTask(taskId, userId);
  709. // }
  710. //
  711. // /**
  712. // * 被委派人完成任务
  713. // * @param taskId 任务ID
  714. // */
  715. // public void resolveTask(String taskId){
  716. // taskService.resolveTask(taskId);
  717. // }
  718. //
  719. // /**
  720. // * 回退任务
  721. // * @param taskId
  722. // */
  723. // public void backTask(String taskId){
  724. // taskService.
  725. // }
  726. ////////////////////////////////////////////////////////////////////
  727. /**
  728. * 读取带跟踪的图片
  729. * @param executionId 环节ID
  730. * @return 封装了各种节点信息
  731. */
  732. public InputStream tracePhoto(String processDefinitionId, String executionId) {
  733. // ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(executionId).singleResult();
  734. BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
  735. List<String> activeActivityIds = Lists.newArrayList();
  736. if (runtimeService.createExecutionQuery().executionId(executionId).count() > 0){
  737. activeActivityIds = runtimeService.getActiveActivityIds(executionId);
  738. }
  739. List<String> highLightedFlows = Lists.newArrayList();
  740. // 获得历史活动记录实体(通过启动时间正序排序,不然有的线可以绘制不出来)
  741. List<HistoricActivityInstance> historicActivityInstances= Lists.newArrayList();
  742. List<HistoricActivityInstance> historicActivityInstances2 = historyService
  743. .createHistoricActivityInstanceQuery().executionId(executionId).orderByHistoricActivityInstanceStartTime().asc().orderByHistoricActivityInstanceEndTime().asc().list();
  744. for(HistoricActivityInstance historicActivityInstance:historicActivityInstances2){
  745. if(historicActivityInstance.getEndTime() != null){
  746. historicActivityInstances.add(historicActivityInstance);
  747. }
  748. }
  749. for(HistoricActivityInstance historicActivityInstance:historicActivityInstances2){
  750. if(historicActivityInstance.getEndTime() == null){
  751. historicActivityInstances.add(historicActivityInstance);
  752. }
  753. }
  754. List<String> highLightedActivities = Lists.newArrayList();
  755. for(HistoricActivityInstance historicActivityInstance : historicActivityInstances){
  756. highLightedActivities.add(historicActivityInstance.getActivityId());
  757. }
  758. // 计算活动线
  759. highLightedFlows = this.getHighLightedFlows((ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
  760. .getDeployedProcessDefinition(processDefinitionId),historicActivityInstances);
  761. // 不使用spring请使用下面的两行代码
  762. // ProcessEngineImpl defaultProcessEngine = (ProcessEngineImpl)ProcessEngines.getDefaultProcessEngine();
  763. // Context.setProcessEngineConfiguration(defaultProcessEngine.getProcessEngineConfiguration());
  764. // 使用spring注入引擎请使用下面的这行代码
  765. Context.setProcessEngineConfiguration(processEngine.getProcessEngineConfiguration());
  766. DefaultProcessDiagramGenerator processDiagramGeneratornew = new DefaultProcessDiagramGenerator();
  767. //return processDiagramGeneratornew.generateDiagram(bpmnModel, "png", activeActivityIds);
  768. return processDiagramGeneratornew.generateDiagram(bpmnModel, "png",
  769. highLightedActivities, highLightedFlows,
  770. processEngine.getProcessEngineConfiguration().getActivityFontName(),
  771. processEngine.getProcessEngineConfiguration().getLabelFontName(),
  772. executionId, processEngine.getProcessEngineConfiguration().getClassLoader(), 1.0);
  773. }
  774. /**
  775. * 获得高亮线
  776. *
  777. * @param processDefinitionEntity 流程定义实体
  778. * @param historicActivityInstances 历史活动实体
  779. * @return 线ID集合
  780. */
  781. public List<String> getHighLightedFlows(ProcessDefinitionEntity processDefinitionEntity,List<HistoricActivityInstance> historicActivityInstances) {
  782. List<String> highFlows = new ArrayList<String>();// 用以保存高亮的线flowId
  783. for (int i = 0; i < historicActivityInstances.size(); i++) {// 对历史流程节点进行遍历
  784. ActivityImpl activityImpl1 = processDefinitionEntity
  785. .findActivity(historicActivityInstances.get(i)
  786. .getActivityId());// 得到节点定义的详细信息
  787. List<ActivityImpl> sameStartTimeNodes = new ArrayList<ActivityImpl>();// 用以保存后需开始时间相同的节点
  788. HistoricActivityInstance historicActivityInstance1 = historicActivityInstances
  789. .get(i);// 后续第一个节点
  790. for (int j = 0; j < historicActivityInstances.size(); j++) {
  791. if(i == j){
  792. continue;
  793. }
  794. HistoricActivityInstance historicActivityInstance2 = historicActivityInstances
  795. .get(j);// 后续第一个节点
  796. if (historicActivityInstance1.getEndTime()!=null && historicActivityInstance1.getEndTime().equals(
  797. historicActivityInstance2.getStartTime()) ) {
  798. // 如果第一个节点的结束时间和第二个节点开始时间相同保存
  799. ActivityImpl sameActivityImpl2 = processDefinitionEntity
  800. .findActivity(historicActivityInstance2.getActivityId());
  801. sameStartTimeNodes.add(sameActivityImpl2);
  802. }
  803. }
  804. List<PvmTransition> pvmTransitions = activityImpl1
  805. .getOutgoingTransitions();// 取出节点的所有出去的线
  806. for (PvmTransition pvmTransition : pvmTransitions) {
  807. // 对所有的线进行遍历
  808. ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition
  809. .getDestination();
  810. // 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示
  811. if (sameStartTimeNodes.contains(pvmActivityImpl)) {
  812. highFlows.add(pvmTransition.getId());
  813. }
  814. }
  815. }
  816. return highFlows;
  817. }
  818. /**
  819. * 流程跟踪图信息
  820. * @param processInstanceId 流程实例ID
  821. * @return 封装了各种节点信息
  822. */
  823. public List<Map<String, Object>> traceProcess(String processInstanceId) throws Exception {
  824. Execution execution = runtimeService.createExecutionQuery().executionId(processInstanceId).singleResult();//执行实例
  825. Object property = PropertyUtils.getProperty(execution, "activityId");
  826. String activityId = "";
  827. if (property != null) {
  828. activityId = property.toString();
  829. }
  830. ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId)
  831. .singleResult();
  832. ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
  833. .getDeployedProcessDefinition(processInstance.getProcessDefinitionId());
  834. List<ActivityImpl> activitiList = processDefinition.getActivities();//获得当前任务的所有节点
  835. List<Map<String, Object>> activityInfos = new ArrayList<Map<String, Object>>();
  836. for (ActivityImpl activity : activitiList) {
  837. boolean currentActiviti = false;
  838. String id = activity.getId();
  839. // 当前节点
  840. if (id.equals(activityId)) {
  841. currentActiviti = true;
  842. }
  843. Map<String, Object> activityImageInfo = packageSingleActivitiInfo(activity, processInstance, currentActiviti);
  844. activityInfos.add(activityImageInfo);
  845. }
  846. return activityInfos;
  847. }
  848. /**
  849. * 封装输出信息,包括:当前节点的X、Y坐标、变量信息、任务类型、任务描述
  850. * @param activity
  851. * @param processInstance
  852. * @param currentActiviti
  853. * @return
  854. */
  855. private Map<String, Object> packageSingleActivitiInfo(ActivityImpl activity, ProcessInstance processInstance,
  856. boolean currentActiviti) throws Exception {
  857. Map<String, Object> vars = new HashMap<String, Object>();
  858. Map<String, Object> activityInfo = new HashMap<String, Object>();
  859. activityInfo.put("currentActiviti", currentActiviti);
  860. setPosition(activity, activityInfo);
  861. setWidthAndHeight(activity, activityInfo);
  862. Map<String, Object> properties = activity.getProperties();
  863. vars.put("节点名称", properties.get("name"));
  864. vars.put("任务类型", ActUtils.parseToZhType(properties.get("type").toString()));
  865. ActivityBehavior activityBehavior = activity.getActivityBehavior();
  866. logger.debug("activityBehavior={}", activityBehavior);
  867. if (activityBehavior instanceof UserTaskActivityBehavior) {
  868. Task currentTask = null;
  869. // 当前节点的task
  870. if (currentActiviti) {
  871. currentTask = getCurrentTaskInfo(processInstance);
  872. }
  873. // 当前任务的分配角色
  874. UserTaskActivityBehavior userTaskActivityBehavior = (UserTaskActivityBehavior) activityBehavior;
  875. TaskDefinition taskDefinition = userTaskActivityBehavior.getTaskDefinition();
  876. Set<Expression> candidateGroupIdExpressions = taskDefinition.getCandidateGroupIdExpressions();
  877. if (!candidateGroupIdExpressions.isEmpty()) {
  878. // 任务的处理角色
  879. setTaskGroup(vars, candidateGroupIdExpressions);
  880. // 当前处理人
  881. if (currentTask != null) {
  882. setCurrentTaskAssignee(vars, currentTask);
  883. }
  884. }
  885. }
  886. vars.put("节点说明", properties.get("documentation"));
  887. String description = activity.getProcessDefinition().getDescription();
  888. vars.put("描述", description);
  889. logger.debug("trace variables: {}", vars);
  890. activityInfo.put("vars", vars);
  891. return activityInfo;
  892. }
  893. /**
  894. * 设置任务组
  895. * @param vars
  896. * @param candidateGroupIdExpressions
  897. */
  898. private void setTaskGroup(Map<String, Object> vars, Set<Expression> candidateGroupIdExpressions) {
  899. String roles = "";
  900. for (Expression expression : candidateGroupIdExpressions) {
  901. String expressionText = expression.getExpressionText();
  902. String roleName = identityService.createGroupQuery().groupId(expressionText).singleResult().getName();
  903. roles += roleName;
  904. }
  905. vars.put("任务所属角色", roles);
  906. }
  907. /**
  908. * 设置当前处理人信息
  909. * @param vars
  910. * @param currentTask
  911. */
  912. private void setCurrentTaskAssignee(Map<String, Object> vars, Task currentTask) {
  913. String assignee = currentTask.getAssignee();
  914. if (assignee != null) {
  915. org.activiti.engine.identity.User assigneeUser = identityService.createUserQuery().userId(assignee).singleResult();
  916. String userInfo = assigneeUser.getFirstName() + " " + assigneeUser.getLastName();
  917. vars.put("当前处理人", userInfo);
  918. }
  919. }
  920. /**
  921. * 获取当前节点信息
  922. * @param processInstance
  923. * @return
  924. */
  925. private Task getCurrentTaskInfo(ProcessInstance processInstance) {
  926. Task currentTask = null;
  927. try {
  928. String activitiId = (String) PropertyUtils.getProperty(processInstance, "activityId");
  929. logger.debug("current activity id: {}", activitiId);
  930. currentTask = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskDefinitionKey(activitiId)
  931. .singleResult();
  932. logger.debug("current task for processInstance: {}", ToStringBuilder.reflectionToString(currentTask));
  933. } catch (Exception e) {
  934. logger.error("can not get property activityId from processInstance: {}", processInstance);
  935. }
  936. return currentTask;
  937. }
  938. /**
  939. * 设置宽度、高度属性
  940. * @param activity
  941. * @param activityInfo
  942. */
  943. private void setWidthAndHeight(ActivityImpl activity, Map<String, Object> activityInfo) {
  944. activityInfo.put("width", activity.getWidth());
  945. activityInfo.put("height", activity.getHeight());
  946. }
  947. /**
  948. * 设置坐标位置
  949. * @param activity
  950. * @param activityInfo
  951. */
  952. private void setPosition(ActivityImpl activity, Map<String, Object> activityInfo) {
  953. activityInfo.put("x", activity.getX());
  954. activityInfo.put("y", activity.getY());
  955. }
  956. /**
  957. * 保存审核意见
  958. * @param act
  959. */
  960. @Transactional(readOnly = false)
  961. public void auditSave(Act act) {
  962. // 设置意见
  963. act.setComment(("yes".equals(act.getFlag())?"[同意] ":"[驳回] ")+act.getComment());
  964. act.preUpdate();
  965. // 对不同环节的业务逻辑进行操作
  966. String taskDefKey = act.getTaskDefKey();
  967. // 提交流程任务
  968. Map<String, Object> vars = Maps.newHashMap();
  969. vars.put("pass", "yes".equals(act.getFlag())? true : false);
  970. complete(act.getTaskId(), act.getProcInsId(), act.getComment(), vars);
  971. }
  972. /**
  973. * 施工保存审核意见
  974. * @param act
  975. */
  976. @Transactional(readOnly = false)
  977. public void auditSave2(Act act) {
  978. // 设置意见
  979. act.setComment(("yes".equals(act.getFlag())?"[没有问题] ":"[存在问题] ")+act.getComment());
  980. act.preUpdate();
  981. // 对不同环节的业务逻辑进行操作
  982. String taskDefKey = act.getTaskDefKey();
  983. // 提交流程任务
  984. Map<String, Object> vars = Maps.newHashMap();
  985. vars.put("pass", "yes".equals(act.getFlag())? true : false);
  986. complete(act.getTaskId(), act.getProcInsId(), act.getComment(), vars);
  987. }
  988. /**
  989. * 经理保存审核意见
  990. * @param act
  991. */
  992. @Transactional(readOnly = false)
  993. public void auditSave3(Act act,Disclose disclose,Boolean flagDesign,Boolean flagItemCLose,Boolean flagDeal) {
  994. // 设置意见
  995. act.setComment(("yes".equals(act.getFlag())?"[没有问题] ":"[存在问题] ")+act.getComment());
  996. act.preUpdate();
  997. // 对不同环节的业务逻辑进行操作
  998. String taskDefKey = act.getTaskDefKey();
  999. // 提交流程任务
  1000. Map<String, Object> vars = Maps.newHashMap();
  1001. vars.put("pass", false);
  1002. vars.put("pass1", false);
  1003. vars.put("pass2", false);
  1004. vars.put("pass3", false);
  1005. vars.put("pass4", false);
  1006. if (null!=disclose){
  1007. if (null!=disclose.getPrecondition()&&!"".equals(disclose.getPrecondition())){
  1008. if (flagDesign){
  1009. vars.put("pass1", flagDesign);
  1010. }
  1011. if (flagItemCLose){
  1012. vars.put("pass2",flagItemCLose);
  1013. }
  1014. if (flagDeal){
  1015. vars.put("pass3",flagDeal);
  1016. }
  1017. if (!flagDesign&&!flagItemCLose&&!flagDeal){
  1018. vars.put("pass",true);
  1019. }
  1020. }else {
  1021. vars.put("pass4", true);
  1022. }
  1023. }else {
  1024. vars.put("pass",true);
  1025. }
  1026. complete(act.getTaskId(), act.getProcInsId(), act.getComment(), vars);
  1027. }
  1028. /**
  1029. * 保存审核意见
  1030. *
  1031. * @param act
  1032. */
  1033. @Transactional(readOnly = false)
  1034. public void newAuditSave(Act act,String tuser,Construction construction) {
  1035. // String comment = act.getComment();
  1036. // 设置意见
  1037. // constructionService.save(construction);
  1038. if ("manager".equals(act.getFlag())) {
  1039. act.setComment(act.getComment());
  1040. } else if ("company".equals(act.getFlag())) {
  1041. act.setComment(act.getComment());
  1042. } else {
  1043. act.setComment(act.getComment());
  1044. }
  1045. // act.setComment(("yes".equals(act.getFlag())?"[同意] ":"[驳回] ")+act.getComment());
  1046. act.preUpdate();
  1047. // 对不同环节的业务逻辑进行操作
  1048. String taskDefKey = act.getTaskDefKey();
  1049. // 提交流程任务
  1050. // Map<String, Object> vars = Maps.newHashMap();
  1051. Map<String, Object> vars = new HashMap<>();
  1052. String flag = act.getFlag();
  1053. if ("manager".equals(flag)) {
  1054. vars.put("manager", true);
  1055. vars.put("company", false);
  1056. vars.put("reject", false);
  1057. if (tuser !=null || tuser !="") {
  1058. String loginName = UserUtils.getByLoginName(tuser).getLoginName();
  1059. vars.put("processer", loginName);
  1060. }
  1061. } else if ("company".equals(flag)) {
  1062. vars.put("manager", false);
  1063. vars.put("company", true);
  1064. vars.put("reject", false);
  1065. String loginName = UserUtils.getUser().getLoginName();
  1066. vars.put("processer", loginName);
  1067. } else {
  1068. vars.put("manager", false);
  1069. vars.put("company", false);
  1070. vars.put("reject", true);
  1071. }
  1072. constructionService.newUpdate(construction);
  1073. // vars.put("processer", UserUtils.get(construction.getTuser().getId()).getLoginName());
  1074. vars.put("pass", "yes".equals(act.getFlag())? true : false);
  1075. complete(act.getTaskId(), act.getProcInsId(), act.getComment(), vars);
  1076. }
  1077. /**
  1078. * 判断下一个节点是互斥网关还是用户任务节点
  1079. * @param processInstanceId 任务Id信息
  1080. * @return 下一个用户任务用户组信息
  1081. * @throws Exception
  1082. */
  1083. public boolean isNextGatewaty(String processInstanceId) {
  1084. ProcessDefinitionEntity processDefinitionEntity = null;
  1085. String id = null;
  1086. ActivityImpl nextActivityImpl = null;
  1087. //获取流程实例Id信息
  1088. //String processInstanceId = taskService.createTaskQuery().taskId(taskId).singleResult().getProcessInstanceId();
  1089. //获取流程发布Id信息
  1090. ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  1091. if(processInstance == null){
  1092. return false;
  1093. }
  1094. String definitionId = processInstance.getProcessDefinitionId();
  1095. processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
  1096. .getDeployedProcessDefinition(definitionId);
  1097. ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
  1098. //当前流程节点Id信息
  1099. String activitiId = execution.getActivityId();
  1100. //获取流程所有节点信息
  1101. List<ActivityImpl> activitiList = processDefinitionEntity.getActivities();
  1102. //遍历所有节点信息
  1103. for(ActivityImpl activityImpl : activitiList){
  1104. id = activityImpl.getId();
  1105. if (activitiId.equals(id)) {
  1106. //获取下一个节点信息
  1107. {
  1108. PvmActivity ac = null;
  1109. Object s = null;
  1110. // 如果遍历节点为用户任务并且节点不是当前节点信息
  1111. if ("userTask".equals(activityImpl.getProperty("type")) && !activitiId.equals(activityImpl.getId())) {
  1112. // 获取该节点下一个节点信息
  1113. TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior())
  1114. .getTaskDefinition();
  1115. return false;
  1116. } else if("exclusiveGateway".equals(activityImpl.getProperty("type"))){// 当前节点为exclusiveGateway
  1117. List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
  1118. //outTransitionsTemp = ac.getOutgoingTransitions();
  1119. // 如果网关路线判断条件为空信息
  1120. // if (StringUtils.isEmpty(elString)) {
  1121. // 获取流程启动时设置的网关判断条件信息
  1122. String elString = getGatewayCondition(activityImpl.getId(), processInstanceId);
  1123. // }
  1124. // 如果排他网关只有一条线路信息
  1125. if (outTransitions.size() == 1) {
  1126. return false;
  1127. } else if (outTransitions.size() > 1) { // 如果排他网关有多条线路信息
  1128. return true;
  1129. }
  1130. }else {
  1131. // 获取节点所有流向线路信息
  1132. List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
  1133. List<PvmTransition> outTransitionsTemp = null;
  1134. for (PvmTransition tr : outTransitions) {
  1135. ac = tr.getDestination(); // 获取线路的终点节点
  1136. // 如果流向线路为排他网关
  1137. if ("exclusiveGateway".equals(ac.getProperty("type"))) {
  1138. return true;
  1139. } else if ("userTask".equals(ac.getProperty("type"))) {
  1140. return false;
  1141. } else {
  1142. return false;
  1143. }
  1144. }
  1145. return false;
  1146. }
  1147. return false;
  1148. }
  1149. }
  1150. }
  1151. return false;
  1152. }
  1153. /**
  1154. * 下一个任务节点信息,
  1155. *
  1156. * 如果下一个节点为用户任务则直接返回,
  1157. *
  1158. * 如果下一个节点为排他网关, 获取排他网关Id信息, 根据排他网关Id信息和execution获取流程实例排他网关Id为key的变量值,
  1159. * 根据变量值分别执行排他网关后线路中的el表达式, 并找到el表达式通过的线路后的用户任务
  1160. * @param activityImpl 流程节点信息
  1161. * @param activityId 当前流程节点Id信息
  1162. * @param elString 排他网关顺序流线段判断条件
  1163. * @param processInstanceId 流程实例Id信息
  1164. * @return
  1165. */
  1166. private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString, String processInstanceId){
  1167. PvmActivity ac = null;
  1168. Object s = null;
  1169. // 如果遍历节点为用户任务并且节点不是当前节点信息
  1170. if ("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())) {
  1171. // 获取该节点下一个节点信息
  1172. TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior())
  1173. .getTaskDefinition();
  1174. return taskDefinition;
  1175. } else if("exclusiveGateway".equals(activityImpl.getProperty("type"))){// 当前节点为exclusiveGateway
  1176. List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
  1177. //outTransitionsTemp = ac.getOutgoingTransitions();
  1178. // 如果网关路线判断条件为空信息
  1179. // if (StringUtils.isEmpty(elString)) {
  1180. // 获取流程启动时设置的网关判断条件信息
  1181. elString = getGatewayCondition(activityImpl.getId(), processInstanceId);
  1182. // }
  1183. // 如果排他网关只有一条线路信息
  1184. if (outTransitions.size() == 1) {
  1185. return nextTaskDefinition((ActivityImpl) outTransitions.get(0).getDestination(), activityId,
  1186. elString, processInstanceId);
  1187. } else if (outTransitions.size() > 1) { // 如果排他网关有多条线路信息
  1188. for (PvmTransition tr1 : outTransitions) {
  1189. s = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息
  1190. // 判断el表达式是否成立
  1191. if (isCondition(activityImpl.getId(), StringUtils.trim(s.toString()), elString)) {
  1192. return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,
  1193. processInstanceId);
  1194. }
  1195. }
  1196. }
  1197. }else {
  1198. // 获取节点所有流向线路信息
  1199. List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
  1200. List<PvmTransition> outTransitionsTemp = null;
  1201. for (PvmTransition tr : outTransitions) {
  1202. ac = tr.getDestination(); // 获取线路的终点节点
  1203. // 如果流向线路为排他网关
  1204. if ("exclusiveGateway".equals(ac.getProperty("type"))) {
  1205. outTransitionsTemp = ac.getOutgoingTransitions();
  1206. // 如果网关路线判断条件为空信息
  1207. if (StringUtils.isEmpty(elString)) {
  1208. // 获取流程启动时设置的网关判断条件信息
  1209. elString = getGatewayCondition(ac.getId(), processInstanceId);
  1210. }
  1211. // 如果排他网关只有一条线路信息
  1212. if (outTransitionsTemp.size() == 1) {
  1213. return nextTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), activityId,
  1214. elString, processInstanceId);
  1215. } else if (outTransitionsTemp.size() > 1) { // 如果排他网关有多条线路信息
  1216. for (PvmTransition tr1 : outTransitionsTemp) {
  1217. s = tr1.getProperty("conditionText"); // 获取排他网关线路判断条件信息
  1218. // 判断el表达式是否成立
  1219. if (isCondition(ac.getId(), StringUtils.trim(s.toString()), elString)) {
  1220. return nextTaskDefinition((ActivityImpl) tr1.getDestination(), activityId, elString,
  1221. processInstanceId);
  1222. }
  1223. }
  1224. }
  1225. } else if ("userTask".equals(ac.getProperty("type"))) {
  1226. return ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior()).getTaskDefinition();
  1227. } else {
  1228. }
  1229. }
  1230. return null;
  1231. }
  1232. return null;
  1233. }
  1234. /**
  1235. * 查询流程启动时设置排他网关判断条件信息
  1236. * @param gatewayId 排他网关Id信息, 流程启动时设置网关路线判断条件key为网关Id信息
  1237. * @param processInstanceId 流程实例Id信息
  1238. * @return
  1239. */
  1240. public String getGatewayCondition(String gatewayId, String processInstanceId) {
  1241. Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).singleResult();
  1242. Object object= runtimeService.getVariable(execution.getId(), gatewayId);
  1243. return object==null? "":object.toString();
  1244. }
  1245. /**
  1246. * 根据key和value判断el表达式是否通过信息
  1247. * @param key el表达式key信息
  1248. * @param el el表达式信息
  1249. * @param value el表达式传入值信息
  1250. * @return
  1251. */
  1252. public boolean isCondition(String key, String el, String value) {
  1253. ExpressionFactory factory = new ExpressionFactoryImpl();
  1254. SimpleContext context = new SimpleContext();
  1255. context.setVariable(key, factory.createValueExpression(value, String.class));
  1256. ValueExpression e = factory.createValueExpression(context, el, boolean.class);
  1257. return (Boolean) e.getValue(context);
  1258. }
  1259. public Boolean isJudgeItemClose(Disclose disclose){
  1260. Boolean flag = false;
  1261. if (null!=disclose.getChannel()&&disclose.getChannel().equals("无")){//施工通道
  1262. flag =true;
  1263. }
  1264. if (null!=disclose.getHiddenDanger()&&disclose.getHiddenDanger().equals("有")){
  1265. flag =true;
  1266. }
  1267. if (null!=disclose.getInfluenceConstruction()&&disclose.getInfluenceConstruction().equals("有")){
  1268. flag =true;
  1269. }
  1270. if (null!=disclose.getProjectRepetition()&&disclose.getProjectRepetition().equals("是")){
  1271. flag =true;
  1272. }
  1273. if (null!=disclose.getImplemented()&&disclose.getImplemented().equals("是")){
  1274. flag =true;
  1275. }
  1276. if (null!=disclose.getTransformer()&&disclose.getTransformer().equals("有")){
  1277. flag =true;
  1278. }
  1279. //必要性说明
  1280. // if (null!=disclose.getTransformer()&&disclose.getTransformer().equals("有")){
  1281. // flag =true;
  1282. // }
  1283. return flag;
  1284. }
  1285. public Boolean isJudgeDesign(Disclose disclose){
  1286. Boolean flag = false;
  1287. if (null!=disclose.getLineName()&&disclose.getLineName().equals("否")){
  1288. flag = true;
  1289. }
  1290. if (null!=disclose.getQuantities()&&disclose.getQuantities().equals("否")){
  1291. flag = true;
  1292. }
  1293. if (null!=disclose.getRodNumber()&&disclose.getRodNumber().equals("否")){
  1294. flag = true;
  1295. }
  1296. return flag;
  1297. }
  1298. public Boolean isJudgeDeal(Disclose disclose){
  1299. Boolean flag = false;
  1300. if (null!=disclose.getAdministrationType()){
  1301. if (disclose.getAdministrationType().contains("民事政处")||
  1302. disclose.getAdministrationType().contains("行政政处")||
  1303. disclose.getAdministrationType().contains("农村政处")){
  1304. if (null!=disclose.getPoliticalProblem()&&disclose.getPoliticalProblem().equals("是")){
  1305. flag=true;
  1306. }
  1307. }
  1308. }
  1309. // if (null!)
  1310. return flag;
  1311. }
  1312. }