FlowServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package com.ruoyi.flowable.service.impl;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.ruoyi.common.utils.StringUtils;
  4. import com.ruoyi.flowable.factory.FlowServiceFactory;
  5. import com.ruoyi.flowable.service.IFlowService;
  6. import com.ruoyi.flowable.service.ISysFormService;
  7. import com.ruoyi.flowable.service.ISysTaskFormService;
  8. import org.flowable.engine.*;
  9. import org.flowable.engine.form.FormProperty;
  10. import org.flowable.engine.impl.form.StartFormDataImpl;
  11. import org.flowable.engine.impl.form.TaskFormDataImpl;
  12. import org.flowable.engine.runtime.ProcessInstance;
  13. import org.flowable.task.api.Task;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. @Service
  20. public class FlowServiceImpl extends FlowServiceFactory implements IFlowService {
  21. @Autowired
  22. private TaskService taskService;
  23. @Autowired
  24. private HistoryService historyService;
  25. @Autowired
  26. private RuntimeService runtimeService;
  27. @Autowired
  28. private FormService formService;
  29. @Autowired
  30. private IdentityService identityService;
  31. @Autowired
  32. private RepositoryService repositoryService;
  33. @Autowired
  34. private ISysFormService sysFormService;
  35. /**
  36. * 根据任务Id获取流程实例信息
  37. */
  38. @Override
  39. public ProcessInstance getProcessInstance(String taskId){
  40. ProcessInstance pInstan = null;
  41. try{
  42. Task task = taskService.createTaskQuery().taskId(taskId).active().singleResult();
  43. if(task != null){
  44. String processInstanceId = task.getProcessInstanceId();
  45. pInstan = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
  46. }
  47. }catch(Exception e){
  48. e.printStackTrace();
  49. }
  50. return pInstan;
  51. }
  52. /**
  53. * 根据任务对象获取流程实例信息
  54. */
  55. @Override
  56. public ProcessInstance getProcessInstance(Task task){
  57. ProcessInstance pInstan = null;
  58. try{
  59. if(task != null){
  60. String processInstanceId = task.getProcessInstanceId();
  61. pInstan = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
  62. }
  63. }catch(Exception e){
  64. e.printStackTrace();
  65. }
  66. return pInstan;
  67. }
  68. /**
  69. * 获取节点的formkey值
  70. */
  71. /*@Override
  72. public String getFormKey(String pInstId, String taskId, String opType){
  73. String formKey = "";
  74. if(StringUtils.isNotBlank(pInstId)) {
  75. if(StringUtils.isNotBlank(taskId)){
  76. formKey = formService.getTaskFormKey(pInstId, taskId);
  77. }
  78. // 如果指定的任务没有设置 formkey, 则取表单开始节点设置的 formkey
  79. if(StringUtils.isBlank(formKey) || "detail".equals(opType)){
  80. formKey = formService.getStartFormKey(pInstId);
  81. if(StringUtils.isNotBlank(formKey)){
  82. *//**
  83. * 以流程开始节点为基准, 根据opType参数和固定的规则来构建 表单请求路径
  84. *//*
  85. // 申请表单 -- 因为开始节点设置的 formkey 就是申请表单,所以暂时不需要处理
  86. if(AcOperateTypeEnum.CREATE.eq(opType)){
  87. }else if(AcOperateTypeEnum.DETAIL.eq(opType)){ // 表单详情
  88. int index = formKey.lastIndexOf("/");
  89. formKey = formKey.substring(0, index) + "/detail";
  90. }else if(AcOperateTypeEnum.AUDIT.eq(opType)){ // 表单审核
  91. int index = formKey.lastIndexOf("/");
  92. formKey = formKey.substring(0, index) + "/audit";
  93. }
  94. }
  95. }
  96. }
  97. return formKey;
  98. }*/
  99. /**
  100. * 获取表单信息, 如果 taskId 不为空则获取指定taskId的表单,否则就根据pDefId获取流程开始节点定义的表单
  101. */
  102. @SuppressWarnings("unchecked")
  103. @Override
  104. public Map<String, Object> getFormProperties(String pDefId, String taskId){
  105. Map<String, Object> rs = new HashMap<>();
  106. try{
  107. List<FormProperty> formProperties = null;
  108. if(StringUtils.isNotBlank(taskId)) {
  109. TaskFormDataImpl taskFormData = (TaskFormDataImpl) formService.getTaskFormData(taskId);
  110. // 设置task为null,否则输出json的时候会报错
  111. taskFormData.setTask(null);
  112. formProperties = taskFormData.getFormProperties();
  113. rs.put("form", taskFormData);
  114. } else if(StringUtils.isNotBlank(pDefId)){
  115. StartFormDataImpl startFormData = (StartFormDataImpl) formService.getStartFormData(pDefId);
  116. startFormData.setProcessDefinition(null);
  117. formProperties = startFormData.getFormProperties();
  118. rs.put("form", startFormData);
  119. }
  120. if(formProperties != null){
  121. for (FormProperty formProperty : formProperties) {
  122. Map<String, String> values = (Map<String, String>) formProperty.getType().getInformation("values");
  123. if (values != null) {
  124. for (Map.Entry<String, String> enumEntry : values.entrySet()) {
  125. }
  126. rs.put(formProperty.getId(), values);
  127. }
  128. }
  129. }
  130. }catch(Exception e){
  131. e.printStackTrace();
  132. }
  133. return rs;
  134. }
  135. /**
  136. * 给指定的表单map赋值,并返回 表单form的字符串表示形式
  137. */
  138. @Override
  139. public String getFormProperties(Map<String, Object> fpMap, Map<String, String[]> mapParams) {
  140. String fpMapStr = "";
  141. try {
  142. if(fpMap != null && mapParams != null){
  143. ObjectMapper objMapper = new ObjectMapper();
  144. fpMapStr = objMapper.writeValueAsString(fpMap);
  145. Map<String, Object> fpMapNew = objMapper.readValue(fpMapStr, Map.class);
  146. Object oFormMap = fpMapNew.get("form");
  147. if(oFormMap != null){
  148. Map<String, Object> formMap = (Map<String, Object>)oFormMap;
  149. Object oFormProperties = formMap.get("formProperties");
  150. if(oFormProperties != null){
  151. List<Map<String, Object>> lstFpMap = (List<Map<String, Object>>)oFormProperties;
  152. for(Map<String, Object> fp : lstFpMap){
  153. String id = "fp_" + fp.get("id").toString();
  154. if(mapParams.containsKey(id)){
  155. fp.put("value", mapParams.get(id)[0]);
  156. }
  157. }
  158. }
  159. }
  160. return objMapper.writeValueAsString(fpMapNew);
  161. }
  162. } catch (Exception e) {
  163. e.printStackTrace();
  164. }
  165. return fpMapStr;
  166. }
  167. @Override
  168. public Map<String, Object> taskComplete(String taskId, boolean isOk, Map<String, Object> map, String loginId) throws Exception {
  169. Map<String, Object> rs = new HashMap<String, Object>();
  170. rs.put("status", false);
  171. Map<String, Object> formProperties = new HashMap<String, Object>();
  172. TaskFormDataImpl taskFormData = (TaskFormDataImpl) formService.getTaskFormData(taskId);
  173. if (taskFormData != null) {
  174. // 设置task为null,否则输出json的时候会报错
  175. taskFormData.setTask(null);
  176. List<FormProperty> lstFormProperties = taskFormData.getFormProperties();
  177. if (lstFormProperties != null) {
  178. for (FormProperty formProperty : lstFormProperties) {
  179. if (!formProperty.isWritable()) {
  180. continue;
  181. }
  182. formProperties.put(formProperty.getId(), formProperty.getValue());
  183. }
  184. }
  185. }
  186. for (Map.Entry<String, Object> mm : map.entrySet()) {
  187. formProperties.put(mm.getKey(), mm.getValue());
  188. }
  189. // 从request中读取参数然后转换
  190. formProperties.put("isOk", String.valueOf(isOk));
  191. try {
  192. // 设置审批人,以及提交审批信息
  193. identityService.setAuthenticatedUserId(loginId);
  194. taskService.complete(taskId, formProperties);
  195. // formService.submitTaskFormData(taskId, formProperties);
  196. rs.put("status", true);
  197. // String msg = isOk ? "审核完成,同意成功!" : "审核完成,驳回成功!";
  198. String msg = "审核完成!";
  199. rs.put("msg", msg);
  200. //更新代办任务数量
  201. sysFormService.updateToDoNumber();
  202. } catch (Exception e) {
  203. e.printStackTrace();
  204. rs.put("status", false);
  205. rs.put("msg", "审核失败!");
  206. } finally {
  207. identityService.setAuthenticatedUserId(null);
  208. }
  209. return rs;
  210. }
  211. /**
  212. *
  213. * @Description (跳转任意目标节点)
  214. * @author liuwei
  215. * @Date 2021年11月3日上午10:23:00
  216. * @version 1.0.0
  217. * @param map
  218. * taskId,destTaskKey,rejectMessage,outcome
  219. */
  220. /*@Override
  221. public void skipStipulationTask(Map<String, Object> map) {
  222. String taskId = (String) map.get("taskId");
  223. // 目标任务key
  224. String destTaskKey = (String) map.get("destTaskKey");
  225. //审批消息
  226. String rejectMessage = (String) map.get("rejectMessage");
  227. //流程线
  228. String outcome = (String) map.get("outcome");
  229. //业务的用户ID
  230. String uid = (String) map.get("uid");
  231. //审批消息
  232. String message = (String) map.get("message");
  233. // 使用任务ID,获取任务信息
  234. Task taskEntity = taskService.createTaskQuery().taskId(taskId).singleResult();
  235. // 获得当前任务的流程实例ID
  236. String processInstanceId = taskEntity.getProcessInstanceId();
  237. // 获得当前任务的流程定义ID
  238. String processDefinitionId = taskEntity.getProcessDefinitionId();
  239. // 当前任务key
  240. String currtaskDefKey = taskEntity.getTaskDefinitionKey();
  241. // 获得当前活动节点和驳回的目标节点"draft"
  242. ActivityImpl currActiviti = null;// 当前活动节点
  243. ActivityImpl destActiviti = null;// 驳回目标节点
  244. currActiviti = getActivityImpl(currtaskDefKey, processDefinitionId);
  245. destActiviti = getActivityImpl(destTaskKey, processDefinitionId);
  246. // 保存当前活动节点的流程流出参数
  247. List<PvmTransition> hisPvmTransitionList = new ArrayList<PvmTransition>(0);
  248. for (PvmTransition pvmTransition : currActiviti.getOutgoingTransitions()) {
  249. hisPvmTransitionList.add(pvmTransition);
  250. }
  251. // 清空当前活动节点的所有流出项
  252. currActiviti.getOutgoingTransitions().clear();
  253. // 为当前节点动态创建新的流出项
  254. TransitionImpl newTransitionImpl = currActiviti.createOutgoingTransition();
  255. // 为当前活动节点新的流出项指定为目标流程节点
  256. newTransitionImpl.setDestination(destActiviti);
  257. // 保存驳回意见
  258. taskEntity.setDescription(rejectMessage);// 设置驳回意见
  259. taskService.saveTask(taskEntity);
  260. *//**
  261. * 注意:添加批注的时候,由于Activiti底层代码是使用: String userId =
  262. * Authentication.getAuthenticatedUserId(); CommentEntity comment = new
  263. * CommentEntity(); comment.setUserId(userId);
  264. * 所有需要从Session中获取当前登录人,作为该任务的办理人(审核人),对应act_hi_comment表中的User_ID的字段,
  265. * 不添加审核人,该字段为null
  266. * 所以要求,添加配置执行使用Authentication.setAuthenticatedUserId();添加当前任务的审核人
  267. *//*
  268. Authentication.setAuthenticatedUserId(uid);
  269. taskService.addComment(taskId, processInstanceId, message);
  270. // 设定驳回标志
  271. Map<String, Object> variables = new HashMap<String, Object>(0);
  272. variables.put("outcome", outcome);
  273. // 执行当前任务驳回到目标任务draft
  274. taskService.complete(taskEntity.getId(), variables);
  275. // 清除目标节点的新流入项
  276. destActiviti.getIncomingTransitions().remove(newTransitionImpl);
  277. // 清除原活动节点的临时流程项
  278. currActiviti.getOutgoingTransitions().clear();
  279. // 还原原活动节点流出项参数
  280. currActiviti.getOutgoingTransitions().addAll(hisPvmTransitionList);
  281. }*/
  282. /**
  283. *
  284. * @Description (通过任务key,获取对应的节点信息)
  285. * @author liuwei
  286. * @Date 2021年11月3日下午1:53:29
  287. * @version 1.0.0
  288. * @param destTaskKey
  289. * @param processDefinitionId
  290. * @return
  291. */
  292. /*public ActivityImpl getActivityImpl(String destTaskKey, String processDefinitionId) {
  293. // 获得当前流程的定义模型
  294. ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
  295. .getDeployedProcessDefinition(processDefinitionId);
  296. // 获得当前流程定义模型的所有任务节点
  297. List<ActivityImpl> activitilist = processDefinition.getActivities();
  298. // 获得当前活动节点和驳回的目标节点"draft"
  299. ActivityImpl descActiviti = null;// 当前活动节点
  300. for (ActivityImpl activityImpl : activitilist) {
  301. // 获取节点对应的key
  302. String taskKey = activityImpl.getId();
  303. // 确定当前活动activiti节点
  304. if (destTaskKey.equals(taskKey)) {
  305. descActiviti = activityImpl;
  306. break;
  307. }
  308. }
  309. return descActiviti;
  310. }*/
  311. }