TaskUtil.java 94 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954
  1. package jnpf.flowable.util;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.google.common.collect.ImmutableList;
  7. import jnpf.base.ActionResult;
  8. import jnpf.base.Pagination;
  9. import jnpf.base.UserInfo;
  10. import jnpf.constant.JnpfConst;
  11. import jnpf.constant.MsgCode;
  12. import jnpf.constant.PermissionConst;
  13. import jnpf.exception.WorkFlowException;
  14. import jnpf.flowable.entity.*;
  15. import jnpf.flowable.enums.*;
  16. import jnpf.flowable.model.candidates.CandidateUserVo;
  17. import jnpf.flowable.model.flowable.*;
  18. import jnpf.flowable.model.message.FlowMsgModel;
  19. import jnpf.flowable.model.record.NodeRecordModel;
  20. import jnpf.flowable.model.task.*;
  21. import jnpf.flowable.model.templatejson.FlowFormModel;
  22. import jnpf.flowable.model.templatejson.FlowParamModel;
  23. import jnpf.flowable.model.templatenode.FlowErrorModel;
  24. import jnpf.flowable.model.templatenode.nodejson.*;
  25. import jnpf.flowable.model.util.FlowConstant;
  26. import jnpf.flowable.model.util.FlowContextHolder;
  27. import jnpf.flowable.model.util.FlowNature;
  28. import jnpf.flowable.service.*;
  29. import jnpf.permission.entity.*;
  30. import jnpf.util.*;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Component;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. /**
  36. * 类的描述
  37. *
  38. * @author JNPF@YinMai Info. Co., Ltd
  39. * @version 5.0.x
  40. * @since 2024/4/22 16:46
  41. */
  42. @Component
  43. public class TaskUtil {
  44. @Autowired
  45. private ServiceUtil serviceUtil;
  46. @Autowired
  47. private LaunchUserService launchUserService;
  48. @Autowired
  49. private CandidatesService candidatesService;
  50. @Autowired
  51. private RecordService recordService;
  52. @Autowired
  53. private MsgUtil msgUtil;
  54. @Autowired
  55. private FlowAbleUrl flowAbleUrl;
  56. @Autowired
  57. private TaskService taskService;
  58. @Autowired
  59. private OperatorService operatorService;
  60. @Autowired
  61. private OperatorUtil operatorUtil;
  62. @Autowired
  63. private TemplateService templateService;
  64. @Autowired
  65. private TemplateJsonService templateJsonService;
  66. @Autowired
  67. private TemplateNodeService templateNodeService;
  68. @Autowired
  69. private ConditionService conditionService;
  70. @Autowired
  71. private TaskLineService taskLineService;
  72. @Autowired
  73. private RevokeService revokeService;
  74. @Autowired
  75. private NodeRecordService nodeRecordService;
  76. @Autowired
  77. private RecordUtil recordUtil;
  78. @Autowired
  79. private SubtaskDataService subtaskDataService;
  80. // 提交撤销流程
  81. public void submitOfRevoke(FlowModel flowModel) throws Exception {
  82. TaskEntity task = flowModel.getTaskEntity();
  83. List<TaskLineEntity> lineList = taskLineService.getList(task.getId());
  84. if (CollectionUtil.isEmpty(lineList)) {
  85. throw new WorkFlowException("无法撤销");
  86. }
  87. // 委托人的处理
  88. UserInfo userInfo = flowModel.getUserInfo();
  89. String creatorUserId = task.getCreatorUserId();
  90. String delegateUserId = task.getDelegateUserId();
  91. boolean isDelegate = !ObjectUtil.equals(userInfo.getUserId(), creatorUserId);
  92. if (isDelegate) {
  93. if (StringUtil.isNotEmpty(delegateUserId)) {
  94. String token = AuthUtil.loginTempUser(task.getCreatorUserId(), UserProvider.getUser().getTenantId());
  95. userInfo = UserProvider.getUser(token);
  96. flowModel.setUserInfo(userInfo);
  97. }
  98. }
  99. Map<String, Object> variables = new HashMap<>();
  100. for (TaskLineEntity condition : lineList) {
  101. variables.put(condition.getLineKey(), Boolean.valueOf(condition.getLineValue()));
  102. }
  103. TaskEntity entity = new TaskEntity();
  104. entity.setId(RandomUtil.uuId());
  105. entity.setType(1);
  106. entity.setUrgent(task.getUrgent());
  107. entity.setCreatorUserId(task.getCreatorUserId());
  108. entity.setStartTime(new Date());
  109. entity.setCreatorTime(new Date());
  110. entity.setFullName(task.getFullName() + "的撤销申请");
  111. entity.setFlowCategory(task.getFlowCategory());
  112. entity.setFlowCode(task.getFlowCode());
  113. entity.setFlowName(task.getFlowName());
  114. entity.setFlowVersion(task.getFlowVersion());
  115. entity.setFlowId(task.getFlowId());
  116. entity.setTemplateId(task.getTemplateId());
  117. entity.setParentId(task.getParentId());
  118. entity.setFlowType(task.getFlowType());
  119. entity.setStatus(TaskStatusEnum.RUNNING.getCode());
  120. entity.setEngineType(task.getEngineType());
  121. if (isDelegate) {
  122. entity.setDelegateUserId(delegateUserId);
  123. }
  124. TemplateJsonEntity jsonEntity = templateJsonService.getInfo(task.getFlowId());
  125. String instanceId = flowAbleUrl.startInstance(jsonEntity.getFlowableId(), variables);
  126. entity.setInstanceId(instanceId);
  127. if (taskService.save(entity)) {
  128. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  129. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  130. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  131. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  132. // 记录
  133. FlowMethod method = new FlowMethod();
  134. method.setFlowModel(flowModel);
  135. method.setType(RecordEnum.submit.getCode());
  136. OperatorEntity operatorEntity = new OperatorEntity();
  137. operatorEntity.setNodeCode(nodeEntity.getNodeCode());
  138. operatorEntity.setNodeName(nodeModel.getNodeName());
  139. operatorEntity.setTaskId(entity.getId());
  140. operatorEntity.setHandleId(entity.getCreatorUserId());
  141. if (StringUtil.isNotBlank(flowModel.getUserId())) {
  142. method.setHandId(flowModel.getUserId());
  143. }
  144. operatorEntity.setHandleTime(entity.getStartTime());
  145. method.setOperatorEntity(operatorEntity);
  146. recordUtil.createRecord(method);
  147. // 节点记录
  148. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  149. nodeRecordModel.setTaskId(entity.getId());
  150. nodeRecordModel.setNodeCode(nodeEntity.getNodeCode());
  151. nodeRecordModel.setNodeName(nodeModel.getNodeName());
  152. nodeRecordModel.setNodeStatus(NodeStateEnum.submit.getCode());
  153. nodeRecordService.create(nodeRecordModel);
  154. // 保存到撤销表
  155. RevokeEntity revokeEntity = new RevokeEntity();
  156. revokeEntity.setId(RandomUtil.uuId());
  157. revokeEntity.setTaskId(task.getId());
  158. revokeEntity.setRevokeTaskId(entity.getId());
  159. RevokeFormDataModel model = new RevokeFormDataModel();
  160. String billNumber = serviceUtil.getBillNumber();
  161. model.setBillRule(billNumber);
  162. model.setHandleOpinion(flowModel.getHandleOpinion());
  163. Date date = new Date();
  164. model.setCreatorTime(date.getTime());
  165. model.setRevokeTaskId(task.getId());
  166. model.setRevokeTaskName(task.getFullName());
  167. String str = JsonUtil.getObjectToString(model);
  168. revokeEntity.setFormData(str);
  169. revokeService.save(revokeEntity);
  170. // 处理撤销经办
  171. FlowMethod flowMethod = new FlowMethod();
  172. flowMethod.setFlowModel(flowModel);
  173. flowMethod.setTaskId(task.getId());
  174. flowMethod.setTaskEntity(entity);
  175. operatorUtil.handleRevokeOperator(flowMethod);
  176. // 自动审批
  177. FlowModel revokeModel = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  178. revokeModel.setTaskEntity(entity);
  179. operatorUtil.autoAudit(revokeModel);
  180. // 判断结束
  181. flowModel.setTaskEntity(entity);
  182. if (this.isFinished(flowModel)) {
  183. this.endRevoke(task);
  184. }
  185. }
  186. }
  187. public void endRevoke(TaskEntity task) {
  188. QueryWrapper<TaskEntity> wrapper = new QueryWrapper<>();
  189. wrapper.lambda().in(TaskEntity::getParentId, task.getId());
  190. List<TaskEntity> subTaskList = taskService.list(wrapper);
  191. // 变更子流程任务状态
  192. if (CollectionUtil.isNotEmpty(subTaskList)) {
  193. for (TaskEntity subTask : subTaskList) {
  194. subTask.setStatus(TaskStatusEnum.REVOKED.getCode());
  195. }
  196. taskService.updateBatchById(subTaskList);
  197. }
  198. task.setStatus(TaskStatusEnum.REVOKED.getCode());
  199. taskService.updateById(task);
  200. }
  201. // 更新当前节点
  202. public void updateCurrentNode(List<FlowableTaskModel> taskModelList, Map<String, NodeModel> nodes, TaskEntity taskEntity) {
  203. List<String> currentNodeList = new ArrayList<>();
  204. List<String> currentNodeNameList = new ArrayList<>();
  205. List<String> nodeTypes = ImmutableList.of(NodeEnum.approver.getType(), NodeEnum.subFlow.getType(), NodeEnum.processing.getType(), NodeEnum.outside.getType());
  206. for (FlowableTaskModel model : taskModelList) {
  207. NodeModel nodeModel = nodes.get(model.getTaskKey());
  208. if (null != nodeModel && nodeTypes.contains(nodeModel.getType())) {
  209. currentNodeList.add(nodeModel.getNodeId());
  210. currentNodeNameList.add(nodeModel.getNodeName());
  211. }
  212. }
  213. if (CollectionUtil.isNotEmpty(currentNodeList)) {
  214. // 更新任务的当前节点信息
  215. taskEntity.setCurrentNodeName(String.join(",", currentNodeNameList));
  216. taskEntity.setCurrentNodeCode(String.join(",", currentNodeList));
  217. taskService.updateById(taskEntity);
  218. }
  219. }
  220. // 拒绝结束流程
  221. public void handleEndTask(FlowMethod flowMethod) throws Exception {
  222. OperatorEntity operator = flowMethod.getOperatorEntity();
  223. List<CirculateEntity> circulateList = flowMethod.getCirculateList();
  224. FlowModel flowModel = flowMethod.getFlowModel();
  225. TaskEntity taskEntity = flowModel.getTaskEntity();
  226. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  227. // 触发
  228. if (!flowMethod.getIsRevoke()) {
  229. flowModel.setAction(2);
  230. flowModel.setRejectTrigger(true);
  231. operatorUtil.handleTrigger(operator, flowModel);
  232. }
  233. // 直接结束流程
  234. flowMethod.setState(TaskStatusEnum.REJECTED.getCode());
  235. this.endTask(flowMethod);
  236. // 处理当前节点
  237. flowModel.setFinishFlag(false);
  238. List<String> codes = Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList());
  239. codes.remove(operator.getNodeCode());
  240. taskEntity.setCurrentNodeCode(String.join(",", codes));
  241. // 节点记录
  242. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  243. nodeRecordModel.setTaskId(operator.getTaskId());
  244. nodeRecordModel.setNodeId(operator.getNodeId());
  245. nodeRecordModel.setNodeCode(operator.getNodeCode());
  246. nodeRecordModel.setNodeName(operator.getNodeName());
  247. nodeRecordModel.setNodeStatus(NodeStateEnum.reject.getCode());
  248. nodeRecordService.create(nodeRecordModel);
  249. FlowMsgModel flowMsgModel = new FlowMsgModel();
  250. flowMsgModel.setNodeList(nodeEntityList);
  251. flowMsgModel.setFlowModel(flowModel);
  252. flowMsgModel.setTaskEntity(taskEntity);
  253. flowMsgModel.setNodeCode(operator.getNodeCode());
  254. flowMsgModel.setWait(false);
  255. flowMsgModel.setReject(true);
  256. flowMsgModel.setCopy(true);
  257. List<OperatorEntity> operatorList = new ArrayList<>();
  258. OperatorEntity entity = new OperatorEntity();
  259. entity.setNodeCode(operator.getNodeCode());
  260. entity.setHandleId(taskEntity.getCreatorUserId());
  261. operatorList.add(entity);
  262. flowMsgModel.setOperatorList(operatorList);
  263. flowMsgModel.setCirculateList(circulateList);
  264. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  265. msgUtil.message(flowMsgModel);
  266. this.isFinished(flowModel);
  267. }
  268. public List<TaskEntity> getTaskByTemplate(String templateId) {
  269. QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
  270. queryWrapper.lambda().eq(TaskEntity::getTemplateId, templateId);
  271. return taskService.list(queryWrapper);
  272. }
  273. public void updateGlobalParam(TaskEntity taskEntity, NodeModel nodeModel, NodeModel global, Map<String, Object> formData) throws WorkFlowException {
  274. this.getGlobalParam(taskEntity, nodeModel, global, formData);
  275. taskService.updateById(taskEntity);
  276. }
  277. public void getGlobalParam(TaskEntity taskEntity, NodeModel nodeModel, NodeModel global, Map<String, Object> formData) throws WorkFlowException {
  278. List<FlowParamModel> paramModelList = global.getGlobalParameterList();
  279. if (CollectionUtil.isEmpty(paramModelList)) {
  280. return;
  281. }
  282. formData = formData == null ? new HashMap<>() : formData;
  283. List<TemplateJsonModel> list = new ArrayList<>();
  284. for (GroupsModel group : nodeModel.getParameterList()) {
  285. TemplateJsonModel model = new TemplateJsonModel();
  286. model.setField(group.getField());
  287. model.setSourceType(Objects.equals(FieldEnum.Condition.getCode(), group.getFieldValueType()) ? FieldEnum.System.getCode() : group.getFieldValueType());
  288. model.setRelationField(String.valueOf(group.getFieldValue()));
  289. model.setMsgTemplateId(group.getField());
  290. list.add(model);
  291. }
  292. Map<String, Object> taskMap = taskEntity.getGlobalParameter() != null ? JsonUtil.stringToMap(taskEntity.getGlobalParameter()) : new HashMap<>();
  293. if (CollectionUtil.isEmpty(taskMap)) {
  294. for (FlowParamModel model : paramModelList) {
  295. if (model.getDefaultValue() != null) {
  296. taskMap.put(model.getFieldName(), model.getDefaultValue());
  297. }
  298. }
  299. }
  300. RecordEntity record = new RecordEntity();
  301. record.setNodeCode(nodeModel.getNodeId());
  302. // UserEntity createUser = serviceUtil.getUserInfo(taskEntity.getCreatorUserId());
  303. // UserEntity delegate = StringUtil.isNotEmpty(taskEntity.getDelegateUserId()) ? serviceUtil.getUserInfo(taskEntity.getDelegateUserId()) : null;
  304. FlowModel parameterModel = new FlowModel();
  305. parameterModel.setFormData(formData);
  306. parameterModel.setRecordEntity(record);
  307. parameterModel.setTaskEntity(taskEntity);
  308. Map<String, String> map = msgUtil.parameterMap(parameterModel, list);
  309. taskMap.putAll(map);
  310. for (FlowParamModel model : paramModelList) {
  311. if (ObjectUtil.equals(model.getDataType(), "datetime")) {
  312. String fieldName = model.getFieldName();
  313. Long longVal = Long.valueOf(String.valueOf(taskMap.get(fieldName)));
  314. taskMap.put(fieldName, longVal);
  315. }
  316. }
  317. taskEntity.setGlobalParameter(JsonUtil.getObjectToString(taskMap));
  318. }
  319. /**
  320. * 根据主键集合获取任务实体
  321. *
  322. * @param ids 主键集合
  323. */
  324. public List<TaskEntity> getOrderStaList(List<String> ids) {
  325. List<TaskEntity> list = new ArrayList<>();
  326. if (CollectionUtil.isNotEmpty(ids)) {
  327. QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
  328. queryWrapper.lambda().in(TaskEntity::getId, ids);
  329. list = taskService.list(queryWrapper);
  330. }
  331. return list;
  332. }
  333. /**
  334. * 设置参数
  335. *
  336. * @param taskId 任务主键
  337. * @param flowModel 参数
  338. */
  339. public void setFlowModel(String taskId, FlowModel flowModel) throws WorkFlowException {
  340. if (flowModel.getUserInfo() == null) {
  341. flowModel.setUserInfo(UserProvider.getUser());
  342. }
  343. TaskEntity taskEntity = taskService.getInfo(taskId);
  344. if (null == taskEntity) {
  345. throw new WorkFlowException(MsgCode.FA001.get());
  346. }
  347. TemplateJsonEntity jsonEntity = templateJsonService.getInfo(taskEntity.getFlowId());
  348. flowModel.setJsonEntity(jsonEntity);
  349. flowModel.setDeploymentId(jsonEntity.getFlowableId());
  350. flowModel.setTaskEntity(taskEntity);
  351. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(taskEntity.getFlowId());
  352. flowModel.setNodeEntityList(nodeEntityList);
  353. Map<String, NodeModel> nodes = new HashMap<>();
  354. for (TemplateNodeEntity nodeEntity : nodeEntityList) {
  355. nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
  356. }
  357. flowModel.setNodes(nodes);
  358. }
  359. /**
  360. * 依次审批的排序
  361. *
  362. * @param userIds 用户主键集合
  363. * @param nodeModel 节点属性
  364. */
  365. public List<String> improperSort(List<String> userIds, NodeModel nodeModel) {
  366. List<String> list = new ArrayList<>();
  367. List<String> sortList = nodeModel.getApproversSortList();
  368. if (sortList.isEmpty()) {
  369. return userIds;
  370. }
  371. for (String id : sortList) {
  372. List<String> collect = userIds.stream().filter(id::contains).collect(Collectors.toList());
  373. list.addAll(collect);
  374. }
  375. return list.stream().distinct().collect(Collectors.toList());
  376. }
  377. // 结束任务
  378. public void endTask(FlowMethod flowMethod) throws Exception {
  379. TaskEntity taskEntity = flowMethod.getTaskEntity();
  380. Integer state = flowMethod.getState();
  381. taskEntity.setStatus(state);
  382. taskEntity.setEndTime(new Date());
  383. if (taskService.updateById(taskEntity)) {
  384. flowMethod.setTaskId(taskEntity.getId());
  385. flowMethod.setNodeCode(null);
  386. operatorUtil.endOperator(flowMethod);
  387. flowAbleUrl.deleteInstance(taskEntity.getInstanceId(), "reject");
  388. }
  389. }
  390. /**
  391. * 判断任务是否结束
  392. *
  393. * @param flowModel 参数
  394. */
  395. public boolean isFinished(FlowModel flowModel) throws Exception {
  396. TaskEntity taskEntity = flowModel.getTaskEntity();
  397. if (null == taskEntity.getId()) {
  398. return false;
  399. }
  400. TaskEntity task = taskService.getById(taskEntity.getId());
  401. if (null != task && ObjectUtil.equals(task.getStatus(), TaskStatusEnum.CANCEL.getCode())) {
  402. return false;
  403. }
  404. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  405. String instanceId = taskEntity.getInstanceId();
  406. boolean flag;
  407. FlowableInstanceModel instance = flowAbleUrl.getInstance(instanceId);
  408. if (null != instance && null != instance.getEndTime()) {
  409. flag = true;
  410. } else {
  411. List<String> historicEnd = flowAbleUrl.getHistoricEnd(instanceId);
  412. flag = CollectionUtil.isNotEmpty(historicEnd);
  413. }
  414. if (flag) {
  415. TemplateNodeEntity endNodeEntity = nodeEntityList.stream()
  416. .filter(e -> StringUtil.equals(e.getNodeType(), NodeEnum.end.getType())).findFirst().orElse(null);
  417. if (null != endNodeEntity) {
  418. if (flowModel.getFinishFlag()) {
  419. taskEntity.setCurrentNodeCode(FlowNature.END_CODE);
  420. taskEntity.setCurrentNodeName(FlowNature.END_NAME);
  421. }
  422. Integer status = flowModel.getHandleStatus().equals(FlowNature.AuditCompletion) ?
  423. TaskStatusEnum.PASSED.getCode() : TaskStatusEnum.REJECTED.getCode();
  424. taskEntity.setStatus(status);
  425. taskEntity.setEndTime(new Date());
  426. if (taskService.updateById(taskEntity)) {
  427. this.subFlowOfEnd(flowModel);
  428. //结束事件
  429. flowModel.setEventStatus(EventEnum.End.getStatus());
  430. operatorUtil.addEvent(flowModel);
  431. // 发送结束消息
  432. FlowMsgModel flowMsgModel = new FlowMsgModel();
  433. flowMsgModel.setNodeList(nodeEntityList);
  434. flowMsgModel.setTaskEntity(taskEntity);
  435. flowMsgModel.setFlowModel(flowModel);
  436. flowMsgModel.setEnd(true);
  437. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  438. msgUtil.message(flowMsgModel);
  439. return true;
  440. }
  441. }
  442. }
  443. return false;
  444. }
  445. // 判断能否归档
  446. public AuditModel getAuditModel(String taskId, FlowModel flowModel, OperatorEntity operator) {
  447. TaskEntity task = taskService.getById(taskId);
  448. AuditModel model = new AuditModel();
  449. if (operator != null && ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.Revoke.getCode())) {
  450. return model;
  451. }
  452. if (task != null) {
  453. model.setTaskId(taskId);
  454. if (task.getEndTime() != null) {
  455. NodeModel global = flowModel.getNodes().get(NodeEnum.global.getType());
  456. FileConfig config = global.getFileConfig();
  457. if (config.getOn() && StringUtil.isNotBlank(config.getTemplateId())) {
  458. model.setIsEnd(true);
  459. }
  460. }
  461. }
  462. return model;
  463. }
  464. // 子流程结束 要处理的事情
  465. public void subFlowOfEnd(FlowModel flowModel) throws Exception {
  466. TaskEntity taskEntity = flowModel.getTaskEntity();
  467. if (StringUtil.equals(FlowNature.ParentId, taskEntity.getParentId())) {
  468. return;
  469. }
  470. // 获取父级节点集合
  471. TaskEntity parentTask = taskService.getInfo(taskEntity.getParentId());
  472. if (null == parentTask) {
  473. throw new WorkFlowException(MsgCode.FA001.get());
  474. }
  475. TemplateJsonEntity jsonEntity = templateJsonService.getById(parentTask.getFlowId());
  476. String deploymentId = jsonEntity.getFlowableId();
  477. List<TemplateNodeEntity> parentNodeList = templateNodeService.getList(parentTask.getFlowId());
  478. String subCode = taskEntity.getSubCode();
  479. SubParameterModel subParameter = JsonUtil.getJsonToBean(taskEntity.getSubParameter(), SubParameterModel.class);
  480. String flowableTaskId = subParameter.getNodeId();
  481. String parentCode = subParameter.getParentCode();
  482. TemplateNodeEntity parentNode = parentNodeList.stream()
  483. .filter(e -> e.getNodeCode().equals(parentCode)).findFirst().orElse(new TemplateNodeEntity());
  484. TemplateNodeEntity subNode = parentNodeList.stream()
  485. .filter(e -> e.getNodeCode().equals(subCode)).findFirst().orElse(new TemplateNodeEntity());
  486. NodeModel nodeModel = JsonUtil.getJsonToBean(subNode.getNodeJson(), NodeModel.class);
  487. if (nodeModel == null) {
  488. return;
  489. }
  490. // 判断是否依次创建,存在依次创建的子流程数据,则发起子流程
  491. if (!ObjectUtil.equals(nodeModel.getCreateRule(), FlowNature.ChildSync)) {
  492. List<SubtaskDataEntity> list = subtaskDataService.getList(taskEntity.getParentId(), subCode);
  493. if (CollectionUtil.isNotEmpty(list)) {
  494. SubtaskDataEntity subtaskData = list.get(0);
  495. FlowModel model = JsonUtil.getJsonToBean(subtaskData.getSubtaskJson(), FlowModel.class);
  496. taskService.batchSaveOrSubmit(model);
  497. subtaskDataService.removeById(subtaskData);
  498. operatorUtil.autoAudit(model);
  499. return;
  500. }
  501. }
  502. // 判断下一级是否子流程节点,且是否存在候选人
  503. NextOrPrevFo fo = new NextOrPrevFo();
  504. fo.setDeploymentId(deploymentId);
  505. fo.setTaskKey(subCode);
  506. List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(fo);
  507. for (FlowableNodeModel nextModel : nextModels) {
  508. TemplateNodeEntity nodeEntity = parentNodeList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), nextModel.getId()))
  509. .findFirst().orElse(new TemplateNodeEntity());
  510. if (ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.subFlow.getType())) {
  511. NodeModel subFlow = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  512. TemplateEntity template = templateService.getById(subFlow.getFlowId());
  513. TemplateJsonEntity subJsonEntity = templateJsonService.getById(template.getFlowId());
  514. List<TemplateNodeEntity> subNodeList = templateNodeService.getList(template.getFlowId());
  515. Map<String, NodeModel> subNodes = new HashMap<>();
  516. for (TemplateNodeEntity node : subNodeList) {
  517. subNodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
  518. }
  519. TemplateNodeEntity subStart = subNodeList.stream()
  520. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  521. FlowMethod method = new FlowMethod();
  522. method.setDeploymentId(subJsonEntity.getFlowableId());
  523. method.setNodes(subNodes);
  524. method.setNodeEntityList(subNodeList);
  525. method.setNodeCode(subStart.getNodeCode());
  526. if (this.checkBranch(subStart)) {
  527. throw new WorkFlowException(MsgCode.WF121.get());
  528. }
  529. List<NodeModel> nextApprover = this.getNextApprover(method);
  530. if (!this.checkNextCandidates(nextApprover)) {
  531. throw new WorkFlowException(MsgCode.WF121.get());
  532. }
  533. FlowModel model = new FlowModel();
  534. model.setDeploymentId(flowModel.getDeploymentId());
  535. model.setNodeEntityList(subNodeList);
  536. if (this.checkNextError(model, nextApprover, false, false) != 0) {
  537. throw new WorkFlowException(MsgCode.WF121.get());
  538. }
  539. }
  540. }
  541. if (nodeModel.getIsAsync().equals(FlowNature.ChildAsync)) {
  542. // 异步已经完成节点
  543. return;
  544. }
  545. // 父节点下的子流程
  546. QueryWrapper<TaskEntity> wrapper = new QueryWrapper<>();
  547. wrapper.lambda().eq(TaskEntity::getParentId, taskEntity.getParentId())
  548. .eq(TaskEntity::getSubCode, subCode);
  549. List<TaskEntity> subList = taskService.list(wrapper);
  550. // 未审批集合
  551. List<TaskEntity> unfinishedList = subList.stream()
  552. .filter(e -> !e.getStatus().equals(TaskStatusEnum.PASSED.getCode()) && !e.getStatus().equals(TaskStatusEnum.REJECTED.getCode()))
  553. .collect(Collectors.toList());
  554. if (unfinishedList.isEmpty()) {
  555. FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  556. model.setFinishFlag(true);
  557. subList = subList.stream().filter(e -> null != e.getEndTime())
  558. .sorted(Comparator.comparing(TaskEntity::getEndTime).reversed()).collect(Collectors.toList());
  559. if (CollectionUtil.isNotEmpty(subList)) {
  560. TaskEntity finalTask = subList.get(0);
  561. model.setHandleStatus(ObjectUtil.equals(finalTask.getStatus(), TaskStatusEnum.PASSED.getCode()) ? 1 : 0);
  562. } else {
  563. model.setHandleStatus(1);
  564. }
  565. String formId = parentNode.getFormId();
  566. this.setFlowModel(parentTask.getId(), model);
  567. Map<String, NodeModel> nodes = model.getNodes();
  568. Map<String, Object> formData = serviceUtil.infoData(formId, parentTask.getId());
  569. model.setFormData(formData);
  570. FlowMethod flowMethod = new FlowMethod();
  571. flowMethod.setDeploymentId(model.getDeploymentId());
  572. flowMethod.setNodeCode(subCode);
  573. flowMethod.setFormData(formData);
  574. flowMethod.setNodes(nodes);
  575. flowMethod.setTaskEntity(parentTask);
  576. Map<String, Boolean> resMap = conditionService.handleCondition(flowMethod);
  577. conditionService.checkCondition(resMap, nodes);
  578. flowMethod.setFlowModel(model);
  579. flowMethod.setFlowableTaskId(flowableTaskId);
  580. flowMethod.setResMap(resMap);
  581. flowMethod.setNodeEntityList(parentNodeList);
  582. // 递归subCode的所有上级节点,获取审批节点的经办
  583. model.setOperatorEntity(new OperatorEntity());
  584. List<String> nodeCodeList = new ArrayList<>();
  585. prevNodeList(flowModel.getDeploymentId(), subCode, parentNodeList, nodeCodeList);
  586. if (CollectionUtil.isNotEmpty(nodeCodeList)) {
  587. List<OperatorEntity> list = operatorUtil.getList(parentTask.getId(), nodeCodeList);
  588. if (CollectionUtil.isNotEmpty(list)) {
  589. model.setOperatorEntity(list.get(0));
  590. }
  591. }
  592. operatorUtil.completeNode(flowMethod);
  593. }
  594. }
  595. // 删除子流程(退回时若是重新审批)
  596. public void deleteSubflow(String taskId, List<String> nodeCodeList) {
  597. QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
  598. queryWrapper.lambda().eq(TaskEntity::getParentId, taskId);
  599. if (CollectionUtil.isNotEmpty(nodeCodeList)) {
  600. queryWrapper.lambda().in(TaskEntity::getSubCode, nodeCodeList);
  601. }
  602. List<TaskEntity> list = taskService.list(queryWrapper);
  603. if (CollectionUtil.isNotEmpty(list)) {
  604. List<String> idList = list.stream().map(TaskEntity::getId).distinct().collect(Collectors.toList());
  605. List<String> idAll = new ArrayList<>();
  606. taskService.deleTaskAll(idList, idAll);
  607. List<TaskEntity> childList = taskService.getInfosSubmit(idAll.toArray(new String[]{}), TaskEntity::getId, TaskEntity::getFlowId);
  608. for (TaskEntity entity : childList) {
  609. operatorUtil.addDelTask(entity.getId(), entity.getFlowId());
  610. }
  611. taskService.setIgnoreLogicDelete().removeByIds(idAll);
  612. taskService.clearIgnoreLogicDelete();
  613. }
  614. }
  615. /**
  616. * 判断任务是否在挂起状态
  617. *
  618. * @param taskEntity 任务
  619. */
  620. public void isSuspend(TaskEntity taskEntity) throws WorkFlowException {
  621. Integer status = taskEntity != null ? taskEntity.getStatus() : null;
  622. if (TaskStatusEnum.PAUSED.getCode().equals(status)) {
  623. throw new WorkFlowException(MsgCode.WF114.get());
  624. }
  625. }
  626. /**
  627. * 判断任务是否终止状态
  628. *
  629. * @param taskEntity 任务
  630. */
  631. public void isCancel(TaskEntity taskEntity) throws WorkFlowException {
  632. Integer status = taskEntity != null ? taskEntity.getStatus() : null;
  633. if (ObjectUtil.equals(TaskStatusEnum.CANCEL.getCode(), status)) {
  634. throw new WorkFlowException(MsgCode.WF123.get());
  635. }
  636. }
  637. /**
  638. * 获取审批人
  639. *
  640. * @param flowMethod
  641. * @return
  642. */
  643. public List<String> userListAll(FlowMethod flowMethod) throws WorkFlowException {
  644. List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
  645. TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
  646. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  647. TemplateNodeEntity globalEntity = nodeEntityList.stream().filter(t -> NodeEnum.global.getType().equals(t.getNodeType())).findFirst().get();
  648. NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
  649. Integer errRule = global.getErrorRule();
  650. List<String> errRuleUser = global.getErrorRuleUser();
  651. // 子流程去获取指定成员、异常处理
  652. if (StringUtil.equals(nodeModel.getType(), NodeEnum.subFlow.getType())) {
  653. errRule = nodeModel.getErrorRule();
  654. errRuleUser = nodeModel.getErrorRuleUser();
  655. }
  656. Boolean errorRule = flowMethod.getErrorRule();
  657. int pass = 0;
  658. int notSubmit = 0;
  659. int node = 0;
  660. Boolean extraRule = flowMethod.getExtraRule();
  661. TaskEntity taskEntity = flowMethod.getTaskEntity();
  662. List<String> userIdAll = user(flowMethod, nodeModel.getAssigneeType());
  663. // String admin = serviceUtil.getAdmin();
  664. // userIdAll = userIdAll.stream().filter(e -> !ObjectUtil.equals(e, admin)).distinct().collect(Collectors.toList());
  665. //附加规则
  666. if (extraRule && !nodeModel.getIsCandidates()) {
  667. rule(userIdAll, taskEntity.getId(), nodeModel.getExtraRule());
  668. }
  669. //获取最新用户
  670. List<UserEntity> userList = serviceUtil.getUserName(userIdAll, true);
  671. // 子流程权限
  672. if (StringUtil.equals(nodeModel.getType(), NodeEnum.subFlow.getType())) {
  673. String flowId = nodeModel.getFlowId();
  674. TemplateEntity template = templateService.getById(flowId);
  675. if (template != null && template.getVisibleType().equals(FlowNature.Authority) && ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  676. List<UserEntity> list = new ArrayList<>(userList);
  677. if (nodeModel.getHasPermission()) {
  678. for (UserEntity user : list) {
  679. if (serviceUtil.isCommonUser(user.getId())) {
  680. List<String> flowIds = serviceUtil.getPermission(user.getId());
  681. // 权限中不存在 该流程版本
  682. if (!flowIds.contains(flowId)) {
  683. UserEntity userEntity = list.stream().filter(e -> e.getId().equals(user.getId())).findFirst().orElse(null);
  684. if (null != userEntity) {
  685. userList.remove(user);
  686. }
  687. }
  688. }
  689. }
  690. }
  691. }
  692. }
  693. userIdAll = userList.stream().map(UserEntity::getId).collect(Collectors.toList());
  694. //异常规则
  695. if (errorRule && userList.isEmpty()) {
  696. //异常处理规则
  697. switch (ErrorRuleEnum.getByCode(errRule)) {
  698. case administrator:
  699. userIdAll.add(serviceUtil.getAdmin());
  700. break;
  701. case initiator:
  702. List<UserEntity> errorRuleUser = serviceUtil.getUserName(errRuleUser, true);
  703. if (!errorRuleUser.isEmpty()) {
  704. userIdAll.addAll(errorRuleUser.stream().map(UserEntity::getId).collect(Collectors.toList()));
  705. } else {
  706. userIdAll.add(serviceUtil.getAdmin());
  707. }
  708. break;
  709. case node:
  710. String nodeId = nodeEntity.getNodeCode();
  711. List<String> userId = new ArrayList<>();
  712. List<CandidatesEntity> list = candidatesService.getList(taskEntity.getId(), nodeId);
  713. for (CandidatesEntity t : list) {
  714. List<String> candidates = StringUtil.isNotEmpty(t.getCandidates()) ? Arrays.stream(t.getCandidates().split(",")).collect(Collectors.toList()) : new ArrayList<>();
  715. userId.addAll(candidates);
  716. }
  717. if (!list.isEmpty()) {
  718. List<UserEntity> errorRuleUserList = serviceUtil.getUserName(userId, true);
  719. if (!errorRuleUserList.isEmpty()) {
  720. userIdAll.addAll(errorRuleUserList.stream().map(UserEntity::getId).collect(Collectors.toList()));
  721. } else {
  722. userIdAll.add(serviceUtil.getAdmin());
  723. }
  724. }
  725. node++;
  726. break;
  727. case pass:
  728. pass++;
  729. break;
  730. case notSubmit:
  731. notSubmit++;
  732. break;
  733. case creatorUserId:
  734. userIdAll.add(taskEntity.getCreatorUserId());
  735. break;
  736. default:
  737. break;
  738. }
  739. }
  740. flowMethod.setPass(pass);
  741. flowMethod.setNotSubmit(notSubmit);
  742. flowMethod.setNode(node);
  743. return userIdAll;
  744. }
  745. /**
  746. * 附加条件
  747. */
  748. public void rule(List<String> userIdAll, String taskId, int rule) {
  749. LaunchUserEntity flowUser = launchUserService.getInfoByTask(taskId);
  750. if (flowUser != null) {
  751. rule(userIdAll, flowUser, rule);
  752. }
  753. }
  754. // 附加条件过滤
  755. public void rule(List<String> userIdAll, LaunchUserEntity flowUser, int rule) {
  756. List<Integer> ruleList = ImmutableList.of(ExtraRuleEnum.organize.getCode(), ExtraRuleEnum.position.getCode(),
  757. ExtraRuleEnum.manager.getCode(), ExtraRuleEnum.subordinate.getCode(), ExtraRuleEnum.department.getCode());
  758. if (ruleList.contains(rule)) {
  759. if (flowUser != null) {
  760. List<String> organizeList = flowUser.getOrganizeId() != null ? Arrays.asList(flowUser.getOrganizeId().split(",")) : new ArrayList<>();
  761. List<String> positionList = flowUser.getPositionId() != null ? Arrays.asList(flowUser.getPositionId().split(",")) : new ArrayList<>();
  762. List<String> managerList = flowUser.getManagerId() != null ? Arrays.asList(flowUser.getManagerId().split(",")) : new ArrayList<>();
  763. List<String> subordinateList = flowUser.getSubordinate() != null ? Arrays.asList(flowUser.getSubordinate().split(",")) : new ArrayList<>();
  764. List<UserEntity> userList = serviceUtil.getUserName(userIdAll, true);
  765. List<String> userListAll = userList.stream().map(UserEntity::getId).collect(Collectors.toList());
  766. //同一部门、公司的用户
  767. Map<String, List<String>> userMap = new HashMap<>();
  768. Map<String, List<UserRelationEntity>> relationUserList = serviceUtil.getListByUserIdAll(userListAll).stream().filter(t -> StringUtil.isNotEmpty(t.getObjectId())).collect(Collectors.groupingBy(UserRelationEntity::getObjectId));
  769. //附加条件
  770. switch (ExtraRuleEnum.getByCode(rule)) {
  771. case organize:
  772. for (String organizeId : organizeList) {
  773. OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(organizeId);
  774. if (null != organizeInfo && Objects.equals(organizeInfo.getCategory(), PermissionConst.DEPARTMENT)) {
  775. List<String> userId = userMap.get(organizeId) != null ? userMap.get(organizeId) : new ArrayList<>();
  776. if (relationUserList.get(organizeId) != null) {
  777. userId.addAll(relationUserList.get(organizeId).stream().map(UserRelationEntity::getUserId).collect(Collectors.toList()));
  778. }
  779. userMap.put(organizeId, userId);
  780. }
  781. }
  782. List<String> userIdList = new ArrayList<>();
  783. for (String key : userMap.keySet()) {
  784. List<String> id = userMap.get(key);
  785. if (ObjectUtil.isEmpty(id)) {
  786. continue;
  787. }
  788. userIdList.addAll(id);
  789. }
  790. userIdAll.retainAll(userIdList);
  791. break;
  792. case position:
  793. List<String> position = new ArrayList<>();
  794. for (String positionId : positionList) {
  795. if (relationUserList.get(positionId) != null) {
  796. position.addAll(relationUserList.get(positionId).stream().map(UserRelationEntity::getUserId).collect(Collectors.toList()));
  797. }
  798. }
  799. userIdAll.retainAll(position);
  800. break;
  801. case manager:
  802. List<String> manager = new ArrayList<>();
  803. manager.addAll(managerList);
  804. userIdAll.retainAll(manager);
  805. break;
  806. case subordinate:
  807. List<String> subordinate = new ArrayList<>();
  808. for (String subordinateId : subordinateList) {
  809. if (StringUtil.isNotEmpty(subordinateId)) {
  810. subordinate.addAll(new ArrayList<>(Arrays.asList(subordinateId.split(","))));
  811. }
  812. }
  813. userIdAll.retainAll(subordinate);
  814. break;
  815. case department:
  816. List<String> categoryList = ImmutableList.of("agency", "office");
  817. for (String organizeId : organizeList) {
  818. OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(organizeId);
  819. if (organizeInfo == null || categoryList.contains(organizeInfo.getCategory())) {
  820. continue;
  821. }
  822. List<String> orgList = serviceUtil.getDepartmentAll(organizeId).stream().map(OrganizeEntity::getId).collect(Collectors.toList());
  823. List<String> departmentAll = serviceUtil.getListByOrgIds(orgList).stream().map(PositionEntity::getId).collect(Collectors.toList());
  824. for (String id : departmentAll) {
  825. List<String> userId = userMap.get(id) != null ? userMap.get(id) : new ArrayList<>();
  826. if (relationUserList.get(id) != null) {
  827. userId.addAll(relationUserList.get(id).stream().map(UserRelationEntity::getUserId).collect(Collectors.toList()));
  828. }
  829. userMap.put(id, userId);
  830. }
  831. }
  832. if (!userMap.isEmpty()) {
  833. List<String> userId = new ArrayList<>();
  834. for (String key : userMap.keySet()) {
  835. List<String> id = userMap.get(key);
  836. if (ObjectUtil.isEmpty(id)) {
  837. continue;
  838. }
  839. userId.addAll(id);
  840. }
  841. userIdAll.retainAll(userId);
  842. }
  843. break;
  844. default:
  845. break;
  846. }
  847. }
  848. }
  849. }
  850. public void getByRule(List<String> userIdAll, UserEntity flowUser, int rule) {
  851. if (flowUser != null) {
  852. String userId = flowUser.getId();
  853. //附加条件
  854. switch (ExtraRuleEnum.getByCode(rule)) {
  855. case role:
  856. List<String> roleId = serviceUtil.getRoleObjectId(ImmutableList.of(userId)).stream().map(RoleRelationEntity::getRoleId).collect(Collectors.toList());
  857. List<String> userIdList = serviceUtil.getListByRoleId(roleId).stream().map(RoleRelationEntity::getObjectId).collect(Collectors.toList());
  858. List<String> roleUserId = userIdList.stream().filter(e -> !ObjectUtil.equals(e, userId)).collect(Collectors.toList());
  859. userIdAll.addAll(roleUserId);
  860. break;
  861. case organize:
  862. case group:
  863. case position:
  864. String type = Objects.equals(ExtraRuleEnum.group.getCode(), rule) ? PermissionConst.GROUP : PermissionConst.POSITION;
  865. List<UserRelationEntity> userRelationList = serviceUtil.getListByUserIdAll(ImmutableList.of(userId));
  866. List<String> objectIdList = new ArrayList<>();
  867. List<String> idList = userRelationList.stream().filter(e -> ObjectUtil.equals(e.getObjectType(), type))
  868. .map(UserRelationEntity::getObjectId).collect(Collectors.toList());
  869. if (Objects.equals(ExtraRuleEnum.organize.getCode(), rule)) {
  870. List<PositionEntity> positionList = serviceUtil.getPosList(idList);
  871. List<String> organizeList = positionList.stream().map(PositionEntity::getOrganizeId).collect(Collectors.toList());
  872. List<String> orgList = serviceUtil.getOrganizeList(organizeList).stream().filter(e -> Objects.equals(e.getCategory(), PermissionConst.DEPARTMENT)).map(OrganizeEntity::getId).collect(Collectors.toList());
  873. objectIdList.addAll(orgList);
  874. } else {
  875. objectIdList.addAll(idList);
  876. }
  877. List<String> userIds = serviceUtil.getListByObjectIdAll(objectIdList).stream().map(UserRelationEntity::getUserId)
  878. .filter(e -> !ObjectUtil.equals(e, userId)).collect(Collectors.toList());
  879. userIdAll.addAll(userIds);
  880. break;
  881. }
  882. }
  883. }
  884. /**
  885. * 封装查询审批人
  886. */
  887. private List<String> user(FlowMethod flowMethod, int type) throws WorkFlowException {
  888. List<String> userIdAll = new ArrayList<>();
  889. Boolean isCandidates = flowMethod.getIsCandidates();
  890. TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
  891. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  892. TaskEntity taskEntity = flowMethod.getTaskEntity();
  893. String createUserId = taskEntity.getCreatorUserId();
  894. FlowModel flowModel = flowMethod.getFlowModel();
  895. OperatorEntity operator = flowModel.getOperatorEntity();
  896. String deploymentId = flowModel.getDeploymentId();
  897. Boolean autoAudit = flowModel.getAutoAudit();
  898. List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
  899. List<String> prevList = new ArrayList<>();
  900. TemplateNodeEntity startNode = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null);
  901. boolean prevIsStart = false;
  902. if (nodeModel.getIsCandidates() && isCandidates) {
  903. String nodeCode = nodeEntity.getNodeCode();
  904. List<CandidatesEntity> candidatesList = candidatesService.getList(taskEntity.getId(), nodeCode);
  905. if (CollectionUtil.isNotEmpty(candidatesList)) {
  906. List<String> opIds = candidatesList.stream().map(CandidatesEntity::getOperatorId).collect(Collectors.toList());
  907. List<OperatorEntity> operators = operatorService.listByIds(opIds);
  908. for (CandidatesEntity t : candidatesList) {
  909. OperatorEntity op = operators.stream().filter(e -> ObjectUtil.equals(e.getId(), t.getOperatorId())).findFirst().orElse(null);
  910. if (null != op && null == op.getHandleStatus() && null != op.getHandleParameter()) {
  911. continue;
  912. }
  913. List<String> candidates = StringUtil.isNotEmpty(t.getCandidates()) ? Arrays.stream(t.getCandidates().split(",")).collect(Collectors.toList()) : new ArrayList<>();
  914. userIdAll.addAll(candidates);
  915. }
  916. }
  917. return userIdAll;
  918. }
  919. //发起者【发起者主管】
  920. if (OperatorEnum.LaunchCharge.getCode().equals(type)) {
  921. this.prevNode(deploymentId, nodeEntity.getNodeCode(), nodeEntityList, prevList);
  922. if (null != startNode) {
  923. prevIsStart = prevList.contains(startNode.getNodeCode());
  924. }
  925. List<String> userId = new ArrayList<>();
  926. // 判断 发起人、上一节点
  927. Integer approverType = nodeModel.getApproverType();
  928. if (ObjectUtil.equals(approverType, FlowNature.Previously) && !prevIsStart) {
  929. List<String> handleIds = new ArrayList<>();
  930. if (!isCandidates) {
  931. if (prevList.contains(operator.getNodeCode())) {
  932. handleIds.add(operator.getHandleId());
  933. }
  934. } else {
  935. handleIds.addAll(this.getHandleIds(taskEntity.getId(), operator, autoAudit));
  936. }
  937. List<UserEntity> userList = serviceUtil.getUserName(handleIds);
  938. userId.addAll(userList.stream().map(UserEntity::getId).collect(Collectors.toList()));
  939. } else {
  940. userId.add(createUserId);
  941. }
  942. for (String id : userId) {
  943. List<UserRelationEntity> userPositionList = serviceUtil.getListByUserIdAll(ImmutableList.of(id)).stream()
  944. .filter(t -> PermissionConst.POSITION.equals(t.getObjectType())).collect(Collectors.toList());
  945. for (UserRelationEntity relation : userPositionList) {
  946. UserEntity user = new UserEntity();
  947. user.setPositionId(relation.getObjectId());
  948. String managerByLevel = getManagerByLevel(user, nodeModel.getManagerLevel());
  949. if (StringUtil.isNotEmpty(managerByLevel)) {
  950. userIdAll.add(managerByLevel);
  951. }
  952. }
  953. }
  954. }
  955. //【发起本人】
  956. if (OperatorEnum.InitiatorMe.getCode().equals(type)) {
  957. userIdAll.add(createUserId);
  958. }
  959. //【变量】
  960. if (OperatorEnum.Variate.getCode().equals(type)) {
  961. flowMethod.setIsAssign(false);
  962. Map<String, Object> dataAll = flowMethod.getSubFormData();
  963. if (CollectionUtil.isEmpty(dataAll)) {
  964. dataAll = !isCandidates ? flowModel.getFormData() : createOrUpdate(flowMethod);
  965. }
  966. Object data = this.getOneData(dataAll, nodeModel.getFormField());
  967. List<String> handleIdAll = this.getUserId(data);
  968. userIdAll.addAll(handleIdAll);
  969. }
  970. //【环节】
  971. if (OperatorEnum.Link.getCode().equals(type)) {
  972. List<RecordEntity> list = recordUtil.getList(taskEntity.getId());
  973. list = list.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), nodeModel.getApproverNodeId())
  974. && (FlowNature.AuditCompletion.equals(e.getHandleType()) || FlowNature.RejectCompletion.equals(e.getHandleType()))
  975. && !FlowNature.Invalid.equals(e.getStatus()) && !e.getHandleId().equals(FlowNature.SYSTEM_CODE) && !e.getHandleId().equals(FlowNature.ParentId))
  976. .collect(Collectors.toList());
  977. List<String> handleId = list.stream().map(RecordEntity::getHandleId).collect(Collectors.toList());
  978. if (CollectionUtil.isEmpty(handleId) && autoAudit) {
  979. handleId.add(operator.getHandleId());
  980. }
  981. userIdAll.addAll(handleId);
  982. }
  983. //【服务】
  984. if (OperatorEnum.Serve.getCode().equals(type)) {
  985. flowMethod.setIsAssign(false);
  986. Map<String, Object> dataAll = !isCandidates ? flowModel.getFormData() : createOrUpdate(flowMethod);
  987. InterfaceConfig interfaceConfig = nodeModel.getInterfaceConfig();
  988. String interfaceId = interfaceConfig.getInterfaceId();
  989. if (StringUtil.isNotEmpty(interfaceId)) {
  990. UserInfo userInfo = UserProvider.getUser();
  991. List<TemplateJsonModel> templateJsonModelList = interfaceConfig.getTemplateJson();
  992. RecordEntity record = new RecordEntity();
  993. record.setTaskId(taskEntity.getId());
  994. record.setNodeCode(nodeEntity.getNodeCode());
  995. record.setHandleId(userInfo.getUserId());
  996. FlowModel parameterModel = new FlowModel();
  997. parameterModel.setFormData(dataAll);
  998. parameterModel.setRecordEntity(record);
  999. parameterModel.setTaskEntity(taskEntity);
  1000. Map<String, String> parameterMap = msgUtil.parameterMap(parameterModel, templateJsonModelList);
  1001. ActionResult result = serviceUtil.infoToId(interfaceId, parameterMap);
  1002. if (Objects.equals(200, result.getCode())) {
  1003. Object data = result.getData();
  1004. if (data instanceof Map) {
  1005. JSONObject map = new JSONObject((Map) data);
  1006. List<String> handleId = StringUtil.isNotEmpty(map.getString("handleId")) ? Arrays.asList(map.getString("handleId").split(",")) : new ArrayList<>();
  1007. userIdAll.addAll(handleId);
  1008. }
  1009. }
  1010. }
  1011. }
  1012. //【指定人】
  1013. if (OperatorEnum.Nominator.getCode().equals(type)) {
  1014. List<String> handleIdAll = serviceUtil.getUserListAll(nodeModel.getApprovers());
  1015. userIdAll.addAll(handleIdAll);
  1016. }
  1017. //【逐级】
  1018. if (OperatorEnum.Step.getCode().equals(type)) {
  1019. LaunchUserEntity launchUser = new LaunchUserEntity();
  1020. launchUser.setId(RandomUtil.uuId());
  1021. launchUser.setNodeCode(nodeModel.getNodeId());
  1022. launchUser.setTaskId(taskEntity.getId());
  1023. launchUser.setType(FlowNature.StepInitiation);
  1024. launchUser.setCreatorTime(new Date());
  1025. this.prevNode(deploymentId, nodeEntity.getNodeCode(), nodeEntityList, prevList);
  1026. if (null != startNode) {
  1027. prevIsStart = prevList.contains(startNode.getNodeCode());
  1028. }
  1029. // 判断 发起人、上一节点
  1030. String userId = createUserId;
  1031. ApproversConfig approversConfig = nodeModel.getApproversConfig();
  1032. Integer start = approversConfig.getStart();
  1033. if (ObjectUtil.equals(start, FlowNature.Previously) && !prevIsStart) {
  1034. List<String> handleIds = this.getHandleIds(taskEntity.getId(), operator, autoAudit);
  1035. userId = !handleIds.isEmpty() ? handleIds.get(0) : "";
  1036. }
  1037. UserEntity info = serviceUtil.getUserInfo(userId);
  1038. String managerByLevel = getManagerByLevel(info, 1);
  1039. //直属主管
  1040. UserEntity managerInfo = serviceUtil.getUserInfo(managerByLevel);
  1041. if (managerInfo != null) {
  1042. userIdAll.add(managerInfo.getId());
  1043. //保存逐级对象
  1044. PositionEntity positionInfo = serviceUtil.getPositionInfo(info.getPositionId());
  1045. if (positionInfo != null) {
  1046. launchUser.setPositionId(positionInfo.getPositionIdTree());
  1047. launchUser.setOrganizeId(positionInfo.getOrganizeId());
  1048. OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionInfo.getOrganizeId());
  1049. if (organizeInfo != null) {
  1050. launchUser.setOrganizeId(organizeInfo.getOrganizeIdTree());
  1051. }
  1052. launchUser.setCreatorUserId(userId);
  1053. flowMethod.setLaunchUser(launchUser);
  1054. }
  1055. }
  1056. }
  1057. return userIdAll;
  1058. }
  1059. public Object getOneData(Map<String, Object> map, String key) {
  1060. Object obj = null;
  1061. if (null != map) {
  1062. obj = map.get(key + FlowNature.FORM_FIELD_SUFFIX);
  1063. if (null == obj) {
  1064. obj = map.get(key);
  1065. }
  1066. }
  1067. return obj;
  1068. }
  1069. //字段的值获取用户
  1070. public List<String> getUserId(Object data) {
  1071. List<String> userIdList = new ArrayList<>();
  1072. if (ObjectUtil.isNotEmpty(data)) {
  1073. List<String> list = new ArrayList<>();
  1074. try {
  1075. list.addAll(JsonUtil.getJsonToList(String.valueOf(data), String.class));
  1076. } catch (Exception e) {
  1077. }
  1078. if (data instanceof List) {
  1079. list.addAll((List) data);
  1080. } else {
  1081. list.addAll(Arrays.asList(String.valueOf(data).split(",")));
  1082. }
  1083. List<String> id = new ArrayList<>();
  1084. for (String s : list) {
  1085. id.add(s.split("--")[0]);
  1086. }
  1087. List<UserRelationEntity> userRelationList = serviceUtil.getListByObjectIdAll(id);
  1088. List<RoleRelationEntity> roleRelationList = serviceUtil.getListByRoleId(id);
  1089. List<String> userList = serviceUtil.getUserListAll(list);
  1090. List<String> userRelation = userRelationList.stream().map(UserRelationEntity::getUserId).collect(Collectors.toList());
  1091. List<String> roleRelation = roleRelationList.stream().map(RoleRelationEntity::getObjectId).collect(Collectors.toList());
  1092. Set<String> handleIdAll = new HashSet<>();
  1093. handleIdAll.addAll(userRelation);
  1094. handleIdAll.addAll(roleRelation);
  1095. handleIdAll.addAll(id);
  1096. handleIdAll.addAll(userList);
  1097. userIdList.addAll(handleIdAll);
  1098. }
  1099. return userIdList;
  1100. }
  1101. //封装用户对象
  1102. public List<CandidateUserVo> getUserModel(List<String> ids, Pagination pagination) {
  1103. List<String> userIds = serviceUtil.getUserListAll(ids);
  1104. List<UserEntity> userList = serviceUtil.getUserName(userIds, pagination);
  1105. pagination.setTotal(pagination.getTotal());
  1106. List<String> userIdList = userList.stream().map(UserEntity::getId).collect(Collectors.toList());
  1107. List<UserRelationEntity> userRelationList = serviceUtil.getListByUserIdAll(userIdList);
  1108. Map<String, List<UserRelationEntity>> userMap = userRelationList.stream()
  1109. .filter(t -> PermissionConst.POSITION.equals(t.getObjectType())).collect(Collectors.groupingBy(UserRelationEntity::getUserId));
  1110. List<CandidateUserVo> list = new ArrayList<>();
  1111. for (UserEntity user : userList) {
  1112. CandidateUserVo vo = JsonUtil.getJsonToBean(user, CandidateUserVo.class);
  1113. vo.setFullName(user.getRealName() + "/" + user.getAccount());
  1114. vo.setHeadIcon(UploaderUtil.uploaderImg(user.getHeadIcon()));
  1115. List<UserRelationEntity> listByUserId = userMap.get(user.getId()) != null ? userMap.get(user.getId()) : new ArrayList<>();
  1116. StringJoiner joiner = new StringJoiner(",");
  1117. for (UserRelationEntity relation : listByUserId) {
  1118. StringJoiner name = new StringJoiner("/");
  1119. PositionEntity position = serviceUtil.getPositionInfo(relation.getObjectId());
  1120. if (position != null) {
  1121. OrganizeEntity organize = serviceUtil.getOrganizeInfo(position.getOrganizeId());
  1122. if (organize != null) {
  1123. List<String> organizeIdTree = new ArrayList<>(Arrays.asList(organize.getOrganizeIdTree().split(",")));
  1124. List<OrganizeEntity> organizeList = serviceUtil.getOrganizeList(organizeIdTree);
  1125. for (String organizeId : organizeIdTree) {
  1126. OrganizeEntity entity = organizeList.stream().filter(e -> Objects.equals(e.getId(), organizeId)).findFirst().orElse(null);
  1127. if (entity != null) {
  1128. name.add(entity.getFullName());
  1129. }
  1130. }
  1131. }
  1132. List<String> positionIdTree = new ArrayList<>(Arrays.asList(position.getPositionIdTree().split(",")));
  1133. List<PositionEntity> positionList = serviceUtil.getPosList(positionIdTree);
  1134. for (String positionId : positionIdTree) {
  1135. PositionEntity entity = positionList.stream().filter(e -> Objects.equals(e.getId(), positionId)).findFirst().orElse(null);
  1136. if (entity != null) {
  1137. name.add(entity.getFullName());
  1138. }
  1139. }
  1140. }
  1141. joiner.add(name.toString());
  1142. }
  1143. vo.setOrganize(joiner.toString());
  1144. list.add(vo);
  1145. }
  1146. return list;
  1147. }
  1148. // 根据经办获取上一审批节点的审批人
  1149. public List<String> getHandleIds(String taskId, OperatorEntity operator, boolean autoAudit) {
  1150. List<String> handleIds = new ArrayList<>();
  1151. List<OperatorEntity> operatorList = operatorUtil.getList(taskId);
  1152. if (CollectionUtil.isNotEmpty(operatorList)) {
  1153. List<OperatorEntity> list = operatorList.stream()
  1154. .filter(e -> e.getHandleTime() != null && ObjectUtil.equals(e.getNodeId(), operator.getNodeId())).sorted(Comparator.comparing(OperatorEntity::getHandleTime).reversed()).collect(Collectors.toList());
  1155. handleIds = list.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList());
  1156. }
  1157. if (CollectionUtil.isEmpty(handleIds) && autoAudit) {
  1158. handleIds.add(operator.getHandleId());
  1159. }
  1160. return handleIds;
  1161. }
  1162. /**
  1163. * 递归主管
  1164. *
  1165. * @param userEntity 用户
  1166. * @param level 第几级
  1167. * @return
  1168. */
  1169. public String getManagerByLevel(UserEntity userEntity, int level) {
  1170. return getManagerByLevel(userEntity, level, false);
  1171. }
  1172. public String getManagerByLevel(UserEntity userEntity, int level, boolean isOrganize) {
  1173. String managerUser = "";
  1174. if (userEntity == null) {
  1175. return managerUser;
  1176. }
  1177. String positionId = "";
  1178. if (isOrganize) {
  1179. PositionEntity positionEntity = serviceUtil.getPositionInfo(userEntity.getPositionId());
  1180. if (positionEntity != null) {
  1181. OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionEntity.getOrganizeId());
  1182. positionId = getManageOrg(organizeInfo, level);
  1183. }
  1184. } else {
  1185. PositionEntity positionEntity = serviceUtil.getPositionInfo(userEntity.getPositionId());
  1186. positionId = getManagerPos(positionEntity, level);
  1187. }
  1188. PositionEntity position = serviceUtil.getPositionInfo(positionId);
  1189. return position != null && StringUtil.isNotEmpty(position.getDutyUser()) ? position.getDutyUser() : "";
  1190. }
  1191. /**
  1192. * 查询岗位
  1193. */
  1194. public String getManagerPos(PositionEntity position, int level) {
  1195. String positionId = "";
  1196. if (position != null) {
  1197. String[] tree = position.getPositionIdTree().split(",");
  1198. positionId = position.getId();
  1199. for (int i = tree.length - 1; i >= 0; i--) {
  1200. String id = tree[i];
  1201. if (Objects.equals(id, position.getId())) {
  1202. continue;
  1203. }
  1204. --level;
  1205. positionId = id;
  1206. if (level == 0) {
  1207. break;
  1208. }
  1209. }
  1210. if (level > 0) {
  1211. PositionEntity positionInfo = serviceUtil.getPositionInfo(positionId);
  1212. if (positionInfo != null) {
  1213. OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionInfo.getOrganizeId());
  1214. return getManageOrg(organizeInfo, level);
  1215. }
  1216. }
  1217. }
  1218. return positionId;
  1219. }
  1220. /**
  1221. * 查询组织
  1222. */
  1223. private String getManageOrg(OrganizeEntity organize, long level) {
  1224. List<String> organizeList = new ArrayList<>();
  1225. organizeList.add(organize.getId());
  1226. String[] tree = organize.getOrganizeIdTree().split(",");
  1227. for (int i = tree.length - 1; i >= 0; i--) {
  1228. String id = tree[i];
  1229. if (Objects.equals(id, organize.getId())) {
  1230. continue;
  1231. }
  1232. --level;
  1233. organizeList.add(id);
  1234. if (level == 0) {
  1235. break;
  1236. }
  1237. }
  1238. OrganizeEntity entity = serviceUtil.getOrganizeInfo(organizeList.get(organizeList.size() - 1));
  1239. return level == 0 && entity != null ? entity.getDutyPosition() : "";
  1240. }
  1241. /**
  1242. * 保存、更新数据,仅处理数据
  1243. */
  1244. public Map<String, Object> createOrUpdate(FlowMethod flowMethod) throws WorkFlowException {
  1245. TaskEntity taskEntity = flowMethod.getTaskEntity();
  1246. TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
  1247. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1248. FlowModel flowModel = flowMethod.getFlowModel();
  1249. Map<String, Object> formData = flowModel.getFormData();
  1250. Map<String, Object> data = new HashMap<>();
  1251. //保存数据的表单
  1252. String formId = nodeEntity.getFormId();
  1253. // 子流程选择的流程版本id
  1254. String taskId = taskEntity.getId();
  1255. String resultNodeCode = resultNodeCode(flowMethod);
  1256. flowMethod.setResultNodeCode(resultNodeCode);
  1257. List<Assign> assignList = nodeModel.getAssignList().stream().filter(e -> e.getNodeId().equals(resultNodeCode)).collect(Collectors.toList());
  1258. //获取当前表单
  1259. Map<String, Object> thisNodeData = infoData(formId, taskId);
  1260. data.putAll(thisNodeData);
  1261. data.putAll(formData(formData, assignList, taskEntity, flowMethod));
  1262. return data;
  1263. }
  1264. /**
  1265. * 获取节点的最后一个审批节点
  1266. */
  1267. public String resultNodeCode(FlowMethod flowMethod) throws WorkFlowException {
  1268. TaskEntity taskEntity = flowMethod.getTaskEntity();
  1269. TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
  1270. List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
  1271. FlowModel flowModel = flowMethod.getFlowModel();
  1272. Map<String, Object> formData = flowModel.getFormData();
  1273. // 子流程选择的流程版本id
  1274. String taskId = taskEntity.getId();
  1275. List<Integer> handleStatus = ImmutableList.of(RecordEnum.audit.getCode(), RecordEnum.submit.getCode());
  1276. //递归
  1277. List<String> nodeIdList = new ArrayList<>();
  1278. prevNodeList(flowModel.getDeploymentId(), nodeEntity.getNodeCode(), nodeEntityList, nodeIdList);
  1279. List<RecordEntity> list = recordService.getRecordList(taskId, handleStatus).stream().filter(t -> nodeIdList.contains(t.getNodeCode())).sorted(Comparator.comparing(RecordEntity::getHandleTime).reversed()).collect(Collectors.toList());
  1280. List<String> recordNodeIdList = new ArrayList<>();
  1281. for (int i = 0; i < list.size(); i++) {
  1282. if (i == 0) {
  1283. recordNodeIdList.add(list.get(i).getNodeCode());
  1284. }
  1285. }
  1286. List<TemplateNodeEntity> taskNodeEntity = nodeEntityList.stream().filter(t -> nodeIdList.contains(t.getNodeCode())).collect(Collectors.toList());
  1287. if (taskNodeEntity.isEmpty()) {
  1288. taskNodeEntity.addAll(nodeEntityList.stream().filter(t -> recordNodeIdList.contains(t.getNodeCode())).collect(Collectors.toList()));
  1289. }
  1290. String nodeCode = "";
  1291. if (CollectionUtil.isNotEmpty(list)) {
  1292. nodeCode = list.get(0).getNodeCode();
  1293. } else {
  1294. if (!taskNodeEntity.isEmpty()) {
  1295. nodeCode = taskNodeEntity.get(0).getNodeCode();
  1296. }
  1297. }
  1298. if (!taskNodeEntity.isEmpty()) {
  1299. formData.put(FlowConstant.PREV_NODE_FORM_ID, taskNodeEntity.get(0).getFormId());
  1300. }
  1301. return nodeCode;
  1302. }
  1303. /**
  1304. * 处理数据传递,并存储在线程,后续保存数据库
  1305. */
  1306. public Map<String, Object> dataTransfer(FlowMethod flowMethod) throws WorkFlowException {
  1307. List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
  1308. FlowModel flowModel = flowMethod.getFlowModel();
  1309. Map<String, Object> formData = flowModel.getFormData();
  1310. TemplateNodeEntity globalEntity = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.global.getType())).findFirst().orElse(null);
  1311. // 判断是否能数据传递
  1312. if (null != globalEntity) {
  1313. NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
  1314. if (!global.getHasAloneConfigureForms()) {
  1315. return formData;
  1316. }
  1317. }
  1318. TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
  1319. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1320. if (CollectionUtil.isEmpty(nodeModel.getAssignList())) {
  1321. return formData;
  1322. }
  1323. TaskEntity taskEntity = flowMethod.getTaskEntity();
  1324. String rejectDataId = taskEntity.getRejectDataId();
  1325. //保存数据的表单
  1326. String formId = nodeEntity.getFormId();
  1327. String taskId = taskEntity.getId();
  1328. boolean isAssign = flowMethod.getIsAssign();
  1329. Map<String, Object> data = createOrUpdate(flowMethod);
  1330. String resultNodeCode = flowMethod.getResultNodeCode();
  1331. //判断是否是外部节点最后一个审批
  1332. TemplateNodeEntity resultNode = nodeEntityList.stream().filter(e -> Objects.equals(e.getNodeCode(), resultNodeCode)).findFirst().orElse(null);
  1333. if (resultNode != null && Objects.equals(resultNode.getNodeType(), NodeEnum.outside.getType())) {
  1334. //判断是否是从当前节点回来
  1335. if (StringUtil.isNotEmpty(rejectDataId)) {
  1336. return formData;
  1337. }
  1338. }
  1339. List<String> typeList = ImmutableList.of(NodeEnum.end.getType(), NodeEnum.subFlow.getType());
  1340. if (isAssign) {
  1341. boolean isWrite = !typeList.contains(nodeModel.getType());
  1342. FlowContextHolder.addChildData(taskId, formId, data, new ArrayList<>(), isWrite);
  1343. }
  1344. return data;
  1345. }
  1346. /**
  1347. * 获取上级节点
  1348. *
  1349. * @param deploymentId 部署id
  1350. * @param nodeCode 节点编码
  1351. * @param nodeEntityList 节点集合
  1352. * @param nodeCodeList 上一级节点编码集合
  1353. */
  1354. public void prevNodeList(String deploymentId, String nodeCode, List<TemplateNodeEntity> nodeEntityList, List<String> nodeCodeList) throws WorkFlowException {
  1355. NextOrPrevFo fo = new NextOrPrevFo();
  1356. fo.setDeploymentId(deploymentId);
  1357. fo.setTaskKey(nodeCode);
  1358. List<String> prevList = flowAbleUrl.getPrev(fo);
  1359. if (CollectionUtil.isNotEmpty(prevList)) {
  1360. for (String prev : prevList) {
  1361. TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(prev)).findFirst().orElse(null);
  1362. if (nodeEntity != null) {
  1363. // 获取 不是子流程类型的节点
  1364. if (nodeEntity.getNodeType().equals(NodeEnum.subFlow.getType())) {
  1365. prevNodeList(deploymentId, nodeEntity.getNodeCode(), nodeEntityList, nodeCodeList);
  1366. } else {
  1367. nodeCodeList.add(nodeEntity.getNodeCode());
  1368. }
  1369. }
  1370. }
  1371. }
  1372. }
  1373. /**
  1374. * 获取上级节点,不过滤子流程节点
  1375. *
  1376. * @param deploymentId 部署id
  1377. * @param nodeCode 节点编码
  1378. * @param nodeEntityList 节点集合
  1379. * @param nodeCodeList 上一级节点编码集合
  1380. */
  1381. public void prevNode(String deploymentId, String nodeCode, List<TemplateNodeEntity> nodeEntityList, List<String> nodeCodeList) throws WorkFlowException {
  1382. NextOrPrevFo fo = new NextOrPrevFo();
  1383. fo.setDeploymentId(deploymentId);
  1384. fo.setTaskKey(nodeCode);
  1385. List<String> prevList = flowAbleUrl.getPrev(fo);
  1386. if (CollectionUtil.isNotEmpty(prevList)) {
  1387. for (String prev : prevList) {
  1388. TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(prev)).findFirst().orElse(null);
  1389. if (nodeEntity != null) {
  1390. nodeCodeList.add(nodeEntity.getNodeCode());
  1391. }
  1392. }
  1393. }
  1394. }
  1395. /**
  1396. * 查询表单值
  1397. *
  1398. * @return
  1399. */
  1400. public Map<String, Object> infoData(String formId, String taskId) throws WorkFlowException {
  1401. Map<String, Map<String, Object>> allData = FlowContextHolder.getAllData();
  1402. Map<String, Object> dataAll = allData.get(taskId + JnpfConst.SIDE_MARK + formId) != null ? allData.get(taskId + JnpfConst.SIDE_MARK + formId) : serviceUtil.infoData(formId, taskId);
  1403. return dataAll;
  1404. }
  1405. // 截取数据传递字段,获取表单id
  1406. public List<AssignRule> handleAssignRule(List<AssignRule> ruleList) {
  1407. List<AssignRule> list = new ArrayList<>();
  1408. if (CollectionUtil.isNotEmpty(ruleList)) {
  1409. for (AssignRule assignRule : ruleList) {
  1410. AssignRule rule = JsonUtil.getJsonToBean(assignRule, AssignRule.class);
  1411. String parentField = assignRule.getParentField();
  1412. int index = parentField.lastIndexOf("|");
  1413. if (index != -1) {
  1414. String field = parentField.substring(0, index);
  1415. rule.setParentField(field);
  1416. String substring = parentField.substring(index + 1);
  1417. rule.setFormId(substring);
  1418. }
  1419. list.add(rule);
  1420. }
  1421. }
  1422. return list;
  1423. }
  1424. // 表单赋值
  1425. public Map<String, Object> formData(Map<String, Object> formData, List<Assign> assignListAll, TaskEntity taskEntity, FlowMethod flowMethod) throws WorkFlowException {
  1426. String taskId = taskEntity.getId();
  1427. List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
  1428. TemplateNodeEntity startNode = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null);
  1429. if (startNode != null) {
  1430. formData.put(FlowConstant.StartNodeFormId, startNode.getFormId());
  1431. }
  1432. Map<String, Object> result = new HashMap<>(formData);
  1433. Map<String, Object> oldData = new HashMap<>(formData);
  1434. Map<String, Map<String, Object>> map = new HashMap<>();
  1435. // 全局参数
  1436. String globalParameter = taskEntity.getGlobalParameter();
  1437. Map<String, Object> taskMap = globalParameter != null ? JsonUtil.stringToMap(globalParameter) : new HashMap<>();
  1438. for (Assign assignModel : assignListAll) {
  1439. List<AssignRule> ruleList = this.handleAssignRule(assignModel.getRuleList());
  1440. for (AssignRule assignMode : ruleList) {
  1441. String parentField = assignMode.getParentField();
  1442. String[] parentFieldList = parentField.split("-");
  1443. String childField = assignMode.getChildField();
  1444. String[] childFieldList = childField.split("-");
  1445. if (childFieldList.length > 1 && parentFieldList.length > 1) {
  1446. int end = 0;
  1447. if (oldData.get(parentFieldList[0]) instanceof List) {
  1448. List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(parentFieldList[0]);
  1449. end = parentList.size();
  1450. }
  1451. if (result.get(childFieldList[0]) instanceof List) {
  1452. List<Map<String, Object>> childList = (List<Map<String, Object>>) result.get(childFieldList[0]);
  1453. for (int i = 0; i < childList.size() - end; i++) {
  1454. childList.add(new HashMap<>());
  1455. }
  1456. } else {
  1457. List<Map<String, Object>> childList = new ArrayList<>();
  1458. for (int i = 0; i < end; i++) {
  1459. childList.add(new HashMap<>());
  1460. }
  1461. result.put(childFieldList[0], childList);
  1462. result.put(childFieldList[0] + FlowNature.FORM_FIELD_SUFFIX, childList);
  1463. }
  1464. }
  1465. }
  1466. }
  1467. for (Assign assignModel : assignListAll) {
  1468. List<AssignRule> ruleList = this.handleAssignRule(assignModel.getRuleList());
  1469. for (AssignRule assignMode : ruleList) {
  1470. String formId = assignMode.getFormId();
  1471. if (StringUtil.equals(formId, FlowNature.GLOBAL_PARAMETER)) {
  1472. oldData.putAll(taskMap);
  1473. } else {
  1474. if (StringUtil.isNotEmpty(formId)) {
  1475. Map<String, Object> mapData = map.get(formId);
  1476. if (CollectionUtil.isEmpty(mapData)) {
  1477. Map<String, Object> data = serviceUtil.infoData(formId, taskId);
  1478. map.put(formId, data);
  1479. oldData.putAll(data);
  1480. }
  1481. } else {
  1482. oldData.putAll(formData);
  1483. }
  1484. }
  1485. //子表处理规则
  1486. String parentField = assignMode.getParentField();
  1487. String[] parentFieldList = parentField.split("-");
  1488. String childField = assignMode.getChildField();
  1489. String[] childFieldList = childField.split("-");
  1490. Object childData = getSysParamData(oldData, parentField, taskId);
  1491. if (childFieldList.length > 1) {
  1492. List<Map<String, Object>> childMapAll = new ArrayList<>();
  1493. if (result.get(childFieldList[0]) instanceof List) {
  1494. List<Map<String, Object>> childList = (List<Map<String, Object>>) result.get(childFieldList[0]);
  1495. for (Map<String, Object> objectMap : childList) {
  1496. Map<String, Object> childMap = new HashMap<>(objectMap);
  1497. childMapAll.add(childMap);
  1498. }
  1499. }
  1500. if (parentFieldList.length > 1) {
  1501. if (oldData.get(parentFieldList[0]) instanceof List) {
  1502. List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(parentFieldList[0]);
  1503. int num = parentList.size() - childMapAll.size();
  1504. for (int i = 0; i < num; i++) {
  1505. childMapAll.add(new HashMap<>());
  1506. }
  1507. for (int i = 0; i < parentList.size(); i++) {
  1508. Map<String, Object> parentMap = parentList.get(i);
  1509. Map<String, Object> childMap = childMapAll.get(i);
  1510. childMap.put(childFieldList[1], parentMap.get(parentFieldList[1]));
  1511. }
  1512. }
  1513. } else {
  1514. // 主传子
  1515. if (1 > childMapAll.size()) {
  1516. childMapAll.add(new HashMap<>());
  1517. }
  1518. for (Map<String, Object> childMap : childMapAll) {
  1519. childMap.put(childFieldList[1], childData);
  1520. }
  1521. }
  1522. result.put(childFieldList[0], childMapAll);
  1523. result.put(childFieldList[0] + FlowNature.FORM_FIELD_SUFFIX, childMapAll);
  1524. } else {
  1525. if (parentFieldList.length > 1) {
  1526. if (oldData.get(parentFieldList[0]) instanceof List) {
  1527. List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(parentFieldList[0]);
  1528. for (int i = 0; i < parentList.size(); i++) {
  1529. Map<String, Object> parentMap = parentList.get(i);
  1530. if (i == 0) {
  1531. childData = parentMap.get(parentFieldList[1]);
  1532. }
  1533. }
  1534. }
  1535. }
  1536. result.put(childField, childData);
  1537. result.put(childField + FlowNature.FORM_FIELD_SUFFIX, childData);
  1538. }
  1539. }
  1540. }
  1541. return result;
  1542. }
  1543. /**
  1544. * 处理系统参数:
  1545. *
  1546. * @prevNodeFormId上节点表单id
  1547. */
  1548. private Object getSysParamData(Map<String, Object> formData, String parentField, String taskId) {
  1549. Object data;
  1550. if (FlowConstant.PREV_NODE_FORM_ID.equals(parentField)) {
  1551. data = taskId;
  1552. } else {
  1553. data = formData.get(parentField);
  1554. }
  1555. return data;
  1556. }
  1557. // true为选择分支
  1558. public boolean checkBranch(TemplateNodeEntity nodeEntity) {
  1559. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1560. return this.checkBranch(nodeModel);
  1561. }
  1562. public boolean checkBranch(NodeModel nodeModel) {
  1563. String divideRule = nodeModel.getDivideRule();
  1564. return ObjectUtil.equals(DivideRuleEnum.CHOOSE.getType(), divideRule);
  1565. }
  1566. // false为候选人
  1567. public boolean checkNextCandidates(List<NodeModel> nodeList) {
  1568. if (CollectionUtil.isNotEmpty(nodeList)) {
  1569. for (NodeModel node : nodeList) {
  1570. if (node.getIsCandidates()) {
  1571. return false;
  1572. }
  1573. }
  1574. }
  1575. return true;
  1576. }
  1577. public int checkNextError(FlowModel flowModel, List<NodeModel> nextApprover, boolean nodeFlag, boolean notSubmitFlag) throws WorkFlowException {
  1578. return this.checkNextError(flowModel, nextApprover, nodeFlag, notSubmitFlag, false);
  1579. }
  1580. // 判断异常处理是否是 上一节点审批人指定处理人、无法提交
  1581. public int checkNextError(FlowModel flowModel, List<NodeModel> nextApprover, boolean nodeFlag, boolean notSubmitFlag, boolean errorFlag) throws WorkFlowException {
  1582. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1583. TaskEntity taskEntity = flowModel.getTaskEntity();
  1584. List<FlowErrorModel> errorList = new ArrayList<>();
  1585. for (NodeModel nodeModel : nextApprover) {
  1586. // 候选人节点跳过
  1587. if (nodeModel.getIsCandidates()) {
  1588. continue;
  1589. }
  1590. TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(nodeModel.getNodeId())).findFirst().orElse(null);
  1591. // 获取审批人
  1592. FlowMethod flowMethod = new FlowMethod();
  1593. flowMethod.setFlowModel(flowModel);
  1594. flowMethod.setTaskEntity(taskEntity);
  1595. flowMethod.setNodeEntity(nodeEntity);
  1596. flowMethod.setNodeEntityList(nodeEntityList);
  1597. flowMethod.setErrorRule(true);
  1598. flowMethod.setExtraRule(true);
  1599. List<String> userIds = this.userListAll(flowMethod);
  1600. Integer node = flowMethod.getNode();
  1601. Integer notSubmit = flowMethod.getNotSubmit();
  1602. if (node > 0) {
  1603. if (nodeFlag) {
  1604. operatorUtil.handleErrorRule(nodeModel, errorList);
  1605. } else {
  1606. return 1;
  1607. }
  1608. }
  1609. if (notSubmit > 0) {
  1610. if (notSubmitFlag) {
  1611. throw new WorkFlowException(MsgCode.WF061.get());
  1612. }
  1613. return 2;
  1614. }
  1615. }
  1616. if (errorFlag && CollectionUtil.isNotEmpty(errorList)) {
  1617. flowModel.setErrorList(errorList);
  1618. return 3;
  1619. }
  1620. if (!errorList.isEmpty()) {
  1621. AuditModel model = new AuditModel();
  1622. model.setErrorCodeList(errorList);
  1623. throw new WorkFlowException(200, JsonUtil.getObjectToString(model));
  1624. }
  1625. return 0;
  1626. }
  1627. /**
  1628. * 获取下一级审批节点
  1629. */
  1630. public List<NodeModel> getNextApprover(FlowMethod flowMethod) throws WorkFlowException {
  1631. String deploymentId = flowMethod.getDeploymentId();
  1632. String nodeCode = flowMethod.getNodeCode();
  1633. Map<String, NodeModel> nodes = flowMethod.getNodes();
  1634. List<NodeModel> nextNode = flowMethod.getNextNode();
  1635. // 获取下一级节点
  1636. NextOrPrevFo fo = new NextOrPrevFo();
  1637. fo.setDeploymentId(deploymentId);
  1638. fo.setTaskKey(nodeCode);
  1639. List<FlowableNodeModel> nextList = flowAbleUrl.getNext(fo);
  1640. if (CollectionUtil.isNotEmpty(nextList)) {
  1641. OutgoingFlowsFo flowsFo = new OutgoingFlowsFo();
  1642. flowsFo.setDeploymentId(deploymentId);
  1643. flowsFo.setTaskKey(nodeCode);
  1644. List<String> outgoingFlows = flowAbleUrl.getOutgoingFlows(flowsFo);
  1645. Map<String, Boolean> res = new HashMap<>();
  1646. flowMethod.setOutgoingFlows(outgoingFlows);
  1647. flowMethod.setResMap(res);
  1648. conditionService.getConditionResult(flowMethod);
  1649. conditionService.checkCondition(res, nodes);
  1650. for (FlowableNodeModel next : nextList) {
  1651. // 判断条件,子流程的出线 条件都为false 则跳过
  1652. Map<String, Boolean> resMap = new HashMap<>();
  1653. flowMethod.setOutgoingFlows(next.getIncomingList());
  1654. flowMethod.setResMap(resMap);
  1655. flowMethod.setNodeCode(next.getId());
  1656. conditionService.getConditionResult(flowMethod);
  1657. try {
  1658. conditionService.checkCondition(resMap, nodes);
  1659. } catch (WorkFlowException e) {
  1660. continue;
  1661. }
  1662. NodeModel nodeModel = nodes.get(next.getId());
  1663. if (null != nodeModel) {
  1664. // 子流程、外部节点往下递归
  1665. List<String> typeList = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.outside.getType());
  1666. if (typeList.contains(nodeModel.getType())) {
  1667. if (flowMethod.getNextSubFlow()) {
  1668. nextNode.add(nodeModel);
  1669. }
  1670. getNextApprover(flowMethod);
  1671. } else {
  1672. nextNode.add(nodeModel);
  1673. }
  1674. }
  1675. }
  1676. }
  1677. return nextNode;
  1678. }
  1679. // 删除表单数据
  1680. public void deleteFormData(List<TaskEntity> taskList) throws Exception {
  1681. if (taskList.isEmpty()) {
  1682. return;
  1683. }
  1684. List<TemplateNodeEntity> nodeEntityList = new ArrayList<>();
  1685. List<String> flowIds = taskList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList());
  1686. if (!flowIds.isEmpty()) {
  1687. nodeEntityList = templateNodeService.getList(flowIds, null);
  1688. }
  1689. for (TaskEntity taskEntity : taskList) {
  1690. List<String> formIds = nodeEntityList.stream().filter(e -> e.getFlowId().equals(taskEntity.getFlowId()) && StringUtil.isNotBlank(e.getFormId())).map(TemplateNodeEntity::getFormId).distinct().collect(Collectors.toList());
  1691. for (String formId : formIds) {
  1692. serviceUtil.deleteFormData(formId, taskEntity.getId());
  1693. }
  1694. }
  1695. }
  1696. public List<String> getNextList(String deploymentId, String nodeCode, Map<String, NodeModel> nodes, List<String> nextList) throws WorkFlowException {
  1697. nextList = nextList != null ? nextList : new ArrayList<>();
  1698. NextOrPrevFo fo = new NextOrPrevFo();
  1699. fo.setDeploymentId(deploymentId);
  1700. fo.setTaskKey(nodeCode);
  1701. List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(fo);
  1702. for (FlowableNodeModel next : nextModels) {
  1703. NodeModel nodeModel = nodes.get(next.getId());
  1704. if (null != nodeModel) {
  1705. // 子流程往下递归
  1706. List<String> typeList = ImmutableList.of(NodeEnum.subFlow.getType());
  1707. if (typeList.contains(nodeModel.getType())) {
  1708. nextList.add(next.getId());
  1709. getNextList(deploymentId, next.getId(), nodes, nextList);
  1710. } else {
  1711. nextList.add(next.getId());
  1712. }
  1713. }
  1714. }
  1715. return nextList;
  1716. }
  1717. public List<TaskEntity> getSubTask(String taskId, List<String> nodeCodes) {
  1718. if (StringUtil.isEmpty(taskId)) {
  1719. return new ArrayList<>();
  1720. }
  1721. QueryWrapper<TaskEntity> queryWrapper = new QueryWrapper<>();
  1722. queryWrapper.lambda().eq(TaskEntity::getParentId, taskId);
  1723. if (CollectionUtil.isNotEmpty(nodeCodes)) {
  1724. queryWrapper.lambda().in(TaskEntity::getSubCode, nodeCodes);
  1725. }
  1726. return taskService.list(queryWrapper);
  1727. }
  1728. public void checkTemplateHide(String templateId) throws WorkFlowException {
  1729. TemplateEntity template = templateService.getById(templateId);
  1730. if (null != template) {
  1731. List<Integer> templateStatus = ImmutableList.of(TemplateStatueEnum.up.getCode(), TemplateStatueEnum.downContinue.getCode());
  1732. if (!templateStatus.contains(template.getStatus())) {
  1733. throw new WorkFlowException(MsgCode.WF140.get());
  1734. }
  1735. }
  1736. }
  1737. public ActionResult launchFlow(FlowModel flowModel) throws Exception {
  1738. String templateId = flowModel.getTemplateId();
  1739. List<String> userIds = flowModel.getUserIds();
  1740. List<Map<String, Object>> formDataList = flowModel.getFormDataList();
  1741. if (CollectionUtil.isEmpty(formDataList)) {
  1742. return ActionResult.fail("未选择记录,发起失败");
  1743. }
  1744. TemplateEntity template = templateService.getById(templateId);
  1745. if (null == template) {
  1746. return ActionResult.fail(MsgCode.WF122.get());
  1747. }
  1748. if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  1749. throw new WorkFlowException(MsgCode.WF140.get());
  1750. }
  1751. TemplateJsonEntity jsonEntity = templateJsonService.getById(template.getFlowId());
  1752. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(jsonEntity.getId());
  1753. Map<String, NodeModel> nodes = new HashMap<>();
  1754. for (TemplateNodeEntity node : nodeEntityList) {
  1755. nodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
  1756. }
  1757. FlowMethod method = new FlowMethod();
  1758. method.setDeploymentId(jsonEntity.getFlowableId());
  1759. TemplateNodeEntity startNode = nodeEntityList.stream().filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  1760. if (this.checkBranch(startNode)) {
  1761. throw new WorkFlowException(MsgCode.WF147.get());
  1762. }
  1763. method.setNodeCode(startNode.getNodeCode());
  1764. method.setNodes(nodes);
  1765. method.setNodeEntityList(nodeEntityList);
  1766. Map<String, Boolean> resMap = conditionService.handleCondition(method);
  1767. // 判断条件、候选人
  1768. try {
  1769. conditionService.checkCondition(resMap, nodes);
  1770. } catch (WorkFlowException e) {
  1771. throw new WorkFlowException(MsgCode.WF133.get());
  1772. }
  1773. method.setNextSubFlow(true);
  1774. List<NodeModel> nextApprover = this.getNextApprover(method);
  1775. if (!this.checkNextCandidates(nextApprover)) {
  1776. throw new WorkFlowException(MsgCode.WF134.get());
  1777. }
  1778. String flowId = jsonEntity.getId();
  1779. // 判断流程权限
  1780. List<String> userListAll = serviceUtil.getUserListAll(userIds);
  1781. FlowFormModel formIdAndFlowId = templateService.getFormIdAndFlowId(userListAll, templateId);
  1782. List<UserEntity> userList = serviceUtil.getUserName(flowModel.getHasPermission() ? formIdAndFlowId.getUserId() : formIdAndFlowId.getUserIdAll(), true);
  1783. if (CollectionUtil.isEmpty(userList)) {
  1784. throw new WorkFlowException(MsgCode.WF136.get());
  1785. }
  1786. for (UserEntity user : userList) {
  1787. UserInfo userInfo = new UserInfo();
  1788. userInfo.setUserId(user.getId());
  1789. userInfo.setUserName(user.getRealName());
  1790. FlowModel model = new FlowModel();
  1791. model.setUserInfo(userInfo);
  1792. model.setFlowId(flowId);
  1793. model.setStatus(TaskStatusEnum.RUNNING.getCode());
  1794. model.setDeploymentId(jsonEntity.getFlowableId());
  1795. model.setNodeEntityList(nodeEntityList);
  1796. for (Map<String, Object> formData : formDataList) {
  1797. model.setFormData(formData);
  1798. if (this.checkNextError(model, nextApprover, false, false) != 0) {
  1799. throw new WorkFlowException(MsgCode.WF135.get());
  1800. }
  1801. taskService.batchSaveOrSubmit(model);
  1802. operatorUtil.event(model, 1);
  1803. TaskEntity taskEntity = model.getTaskEntity();
  1804. if (taskEntity.getRejectDataId() == null) {
  1805. operatorUtil.autoAudit(model);
  1806. operatorUtil.handleEvent();
  1807. }
  1808. operatorUtil.handleTaskStatus();
  1809. }
  1810. }
  1811. return ActionResult.success(MsgCode.SU006.get());
  1812. }
  1813. /**
  1814. * 用户的信息
  1815. */
  1816. public void launchUser(LaunchUserEntity flowUser, UserEntity userEntity) {
  1817. if (userEntity != null) {
  1818. //全部岗位
  1819. List<UserRelationEntity> userPositionList = serviceUtil.getListByUserIdAll(ImmutableList.of(userEntity.getId())).stream()
  1820. .filter(t -> PermissionConst.POSITION.equals(t.getObjectType())).collect(Collectors.toList());
  1821. List<String> pos = new ArrayList<>();
  1822. List<String> org = new ArrayList<>();
  1823. List<String> managerId = new ArrayList<>();
  1824. List<String> subordinateList = new ArrayList<>();
  1825. for (UserRelationEntity relation : userPositionList) {
  1826. PositionEntity positionInfo = serviceUtil.getPositionInfo(relation.getObjectId());
  1827. if (positionInfo != null) {
  1828. userEntity.setPositionId(positionInfo.getId());
  1829. pos.add(positionInfo.getId());
  1830. OrganizeEntity organizeInfo = serviceUtil.getOrganizeInfo(positionInfo.getOrganizeId());
  1831. if (organizeInfo != null) {
  1832. org.add(organizeInfo.getId());
  1833. }
  1834. String managerByLevel = getManagerByLevel(userEntity, 1);
  1835. if (StringUtil.isNotEmpty(managerByLevel)) {
  1836. managerId.add(managerByLevel);
  1837. }
  1838. List<PositionEntity> childPosition = serviceUtil.getChildPosition(userEntity.getPositionId());
  1839. List<String> positionList = childPosition.stream().map(PositionEntity::getId).collect(Collectors.toList());
  1840. positionList.remove(userEntity.getPositionId());
  1841. List<UserRelationEntity> userRelationList = serviceUtil.getListByObjectIdAll(positionList);
  1842. subordinateList.addAll(userRelationList.stream().map(UserRelationEntity::getUserId).collect(Collectors.toList()));
  1843. }
  1844. }
  1845. flowUser.setPositionId(String.join(",", pos));
  1846. flowUser.setOrganizeId(String.join(",", org));
  1847. flowUser.setManagerId(String.join(",", managerId));
  1848. String subordinate = serviceUtil.getUserName(subordinateList, true).stream().map(UserEntity::getId).collect(Collectors.joining(","));
  1849. flowUser.setSubordinate(subordinate);
  1850. }
  1851. }
  1852. }