OperatorServiceImpl.java 108 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212
  1. package jnpf.flowable.service.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  7. import com.baomidou.mybatisplus.core.metadata.IPage;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import com.github.yulichang.toolkit.JoinWrappers;
  10. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  11. import com.google.common.collect.ImmutableList;
  12. import jnpf.base.Pagination;
  13. import jnpf.base.model.flow.FlowFormDataModel;
  14. import jnpf.base.service.SuperServiceImpl;
  15. import jnpf.constant.MsgCode;
  16. import jnpf.exception.WorkFlowException;
  17. import jnpf.flowable.entity.*;
  18. import jnpf.flowable.enums.*;
  19. import jnpf.flowable.job.FlowJobUtil;
  20. import jnpf.flowable.mapper.OperatorMapper;
  21. import jnpf.flowable.model.candidates.CandidateCheckFo;
  22. import jnpf.flowable.model.candidates.CandidateCheckVo;
  23. import jnpf.flowable.model.candidates.CandidateUserVo;
  24. import jnpf.flowable.model.flowable.*;
  25. import jnpf.flowable.model.message.FlowMsgModel;
  26. import jnpf.flowable.model.operator.*;
  27. import jnpf.flowable.model.record.NodeRecordModel;
  28. import jnpf.flowable.model.task.AuditModel;
  29. import jnpf.flowable.model.task.FlowMethod;
  30. import jnpf.flowable.model.task.FlowModel;
  31. import jnpf.flowable.model.task.TaskPagination;
  32. import jnpf.flowable.model.templatejson.TemplateJsonInfoVO;
  33. import jnpf.flowable.model.templatenode.BackNodeModel;
  34. import jnpf.flowable.model.templatenode.FlowErrorModel;
  35. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  36. import jnpf.flowable.model.templatenode.nodejson.TemplateJsonModel;
  37. import jnpf.flowable.model.util.*;
  38. import jnpf.flowable.service.*;
  39. import jnpf.flowable.util.*;
  40. import jnpf.model.FlowWorkListVO;
  41. import jnpf.model.FlowWorkModel;
  42. import jnpf.permission.entity.UserEntity;
  43. import jnpf.permission.model.user.WorkHandoverModel;
  44. import jnpf.util.*;
  45. import org.springframework.beans.factory.annotation.Autowired;
  46. import org.springframework.stereotype.Service;
  47. import java.util.*;
  48. import java.util.stream.Collectors;
  49. /**
  50. * 类的描述
  51. *
  52. * @author JNPF@YinMai Info. Co., Ltd
  53. * @version 5.0.x
  54. * @since 2024/4/18 15:30
  55. */
  56. @Service
  57. public class OperatorServiceImpl extends SuperServiceImpl<OperatorMapper, OperatorEntity> implements OperatorService {
  58. @Autowired
  59. private FlowAbleUrl flowAbleUrl;
  60. @Autowired
  61. private TaskUtil taskUtil;
  62. @Autowired
  63. private TaskService taskService;
  64. @Autowired
  65. private ServiceUtil serviceUtil;
  66. @Autowired
  67. private OperatorUtil operatorUtil;
  68. @Autowired
  69. private ConditionService conditionService;
  70. @Autowired
  71. private TemplateNodeService templateNodeService;
  72. @Autowired
  73. private TemplateJsonService templateJsonService;
  74. @Autowired
  75. private RecordUtil recordUtil;
  76. @Autowired
  77. private CirculateUtil circulateUtil;
  78. @Autowired
  79. private CandidatesService candidatesService;
  80. @Autowired
  81. private MsgUtil msgUtil;
  82. @Autowired
  83. private RejectDataService rejectDataService;
  84. @Autowired
  85. private RecordService recordService;
  86. @Autowired
  87. private LaunchUserService launchUserService;
  88. @Autowired
  89. private DelegateService delegateService;
  90. @Autowired
  91. private TemplateService templateService;
  92. @Autowired
  93. private ButtonUtil buttonUtil;
  94. @Autowired
  95. private RedisUtil redisUtil;
  96. @Autowired
  97. private NodeRecordService nodeRecordService;
  98. @Autowired
  99. private TaskLineService taskLineService;
  100. @Autowired
  101. private RevokeService revokeService;
  102. @Autowired
  103. private EventLogService eventLogService;
  104. @Override
  105. public OperatorEntity getInfo(String id) throws WorkFlowException {
  106. if (StringUtil.isBlank(id)) {
  107. return null;
  108. }
  109. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  110. queryWrapper.lambda().eq(OperatorEntity::getId, id);
  111. OperatorEntity operator = this.getOne(queryWrapper);
  112. if (null == operator) {
  113. throw new WorkFlowException(MsgCode.FA001.get());
  114. }
  115. return operator;
  116. }
  117. @Override
  118. public List<OperatorEntity> getList(String taskId) {
  119. if (StringUtil.isBlank(taskId)) {
  120. return new ArrayList<>();
  121. }
  122. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  123. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).orderByDesc(OperatorEntity::getCreatorTime);
  124. return this.list(queryWrapper);
  125. }
  126. @Override
  127. public List<OperatorVo> getList(TaskPagination pagination) {
  128. String loginUserId = StringUtil.isNotEmpty(pagination.getUserId()) ? pagination.getUserId() : UserProvider.getLoginUserId();
  129. List<Integer> statusList = ImmutableList.of(TemplateStatueEnum.up.getCode(), TemplateStatueEnum.downContinue.getCode());
  130. MPJLambdaWrapper<OperatorEntity> wrapper = JoinWrappers.lambda(OperatorEntity.class)
  131. .selectAll(OperatorEntity.class)
  132. .selectAs(OperatorEntity::getStatus, OperatorVo::getStatus)
  133. .selectAs(OperatorEntity::getNodeName, OperatorVo::getCurrentNodeName)
  134. .selectAs(TaskEntity::getCreatorUserId, OperatorVo::getCreatorUserId)
  135. .selectAs(TaskEntity::getUrgent, OperatorVo::getFlowUrgent)
  136. .selectAs(TaskEntity::getFullName, OperatorVo::getFullName)
  137. .selectAs(TaskEntity::getFlowName, OperatorVo::getFlowName)
  138. .selectAs(TaskEntity::getStartTime, OperatorVo::getStartTime)
  139. .selectAs(TaskEntity::getFlowId, OperatorVo::getFlowId)
  140. .selectAs(TaskEntity::getFlowVersion, OperatorVo::getFlowVersion)
  141. .selectAs(TaskEntity::getFlowCategory, OperatorVo::getFlowCategory)
  142. .selectAs(TemplateEntity::getSystemId, OperatorVo::getSystemName)
  143. .leftJoin(TaskEntity.class, TaskEntity::getId, OperatorEntity::getTaskId)
  144. .leftJoin(TemplateEntity.class, TemplateEntity::getId, TaskEntity::getTemplateId)
  145. .in(TemplateEntity::getStatus, statusList)
  146. .eq(OperatorEntity::getCompletion, FlowNature.Normal)
  147. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode())
  148. .ne(OperatorEntity::getStatus, OperatorStateEnum.Waiting.getCode())
  149. .ne(TaskEntity::getStatus, TaskStatusEnum.CANCEL.getCode())
  150. .ne(TaskEntity::getStatus, TaskStatusEnum.REVOKED.getCode());
  151. CategoryEnum categoryEnum = CategoryEnum.getType(pagination.getCategory());
  152. switch (categoryEnum) {
  153. case Sign: // 待签
  154. wrapper.isNull(OperatorEntity::getSignTime).isNull(OperatorEntity::getStartHandleTime)
  155. .isNull(OperatorEntity::getHandleStatus);
  156. break;
  157. case Todo: // 待办
  158. wrapper.isNotNull(OperatorEntity::getSignTime).isNull(OperatorEntity::getStartHandleTime)
  159. .isNull(OperatorEntity::getHandleStatus);
  160. break;
  161. case Doing: // 在办
  162. wrapper.isNotNull(OperatorEntity::getSignTime).isNotNull(OperatorEntity::getStartHandleTime)
  163. .isNull(OperatorEntity::getHandleStatus);
  164. break;
  165. case BatchDoing: // 批量在办
  166. wrapper.isNotNull(OperatorEntity::getSignTime).isNotNull(OperatorEntity::getStartHandleTime)
  167. .isNull(OperatorEntity::getHandleStatus)
  168. .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode())
  169. .ne(OperatorEntity::getStatus, OperatorStateEnum.AddSign.getCode());
  170. }
  171. Integer status = pagination.getStatus();
  172. if (null != status) {
  173. if (status == -2) {// 超时
  174. wrapper.isNotNull(OperatorEntity::getDuedate);
  175. } else {// 7.协办 5.退回
  176. wrapper.eq(OperatorEntity::getStatus, status);
  177. }
  178. }
  179. // 版本
  180. String flowId = pagination.getFlowId();
  181. if (ObjectUtil.isNotEmpty(flowId)) {
  182. wrapper.eq(TaskEntity::getFlowId, flowId);
  183. }
  184. String nodeCode = pagination.getNodeCode();
  185. if (StringUtil.isNotBlank(nodeCode)) {
  186. wrapper.eq(OperatorEntity::getNodeCode, nodeCode);
  187. }
  188. Boolean delegateType = pagination.getDelegateType();
  189. Map<String, String[]> delegateListAll = new HashMap<>();
  190. List<String> handleId = new ArrayList<>();
  191. // 是否委托
  192. if (delegateType) {
  193. List<DelegateEntity> delegateList = delegateService.getByToUserId(loginUserId);
  194. for (DelegateEntity delegate : delegateList) {
  195. if (StringUtil.isNotEmpty(delegate.getFlowId())) {
  196. String[] flowIds = delegate.getFlowId().split(",");
  197. delegateListAll.put(delegate.getUserId(), flowIds);
  198. } else {
  199. handleId.add(delegate.getUserId());
  200. }
  201. }
  202. }
  203. wrapper.and(t -> {
  204. t.eq(OperatorEntity::getHandleId, loginUserId);
  205. if (!handleId.isEmpty()) {
  206. t.or(t1 -> t1.in(OperatorEntity::getHandleId, handleId).ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode()));
  207. }
  208. if (delegateType) {
  209. for (String key : delegateListAll.keySet()) {
  210. t.or(tw -> tw.in(TaskEntity::getTemplateId, delegateListAll.get(key)).eq(OperatorEntity::getHandleId, key)
  211. .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode()));
  212. }
  213. }
  214. });
  215. //关键字
  216. String keyWord = pagination.getKeyword();
  217. if (ObjectUtil.isNotEmpty(keyWord)) {
  218. wrapper.and(t -> t.like(TaskEntity::getEnCode, keyWord).or().like(TaskEntity::getFullName, keyWord));
  219. }
  220. //所属分类
  221. String category = pagination.getFlowCategory();
  222. if (ObjectUtil.isNotEmpty(category)) {
  223. List<String> categoryList = Arrays.stream(category.split(",")).collect(Collectors.toList());
  224. wrapper.in(TaskEntity::getFlowCategory, categoryList);
  225. }
  226. // 所属流程
  227. String templateId = pagination.getTemplateId();
  228. if (ObjectUtil.isNotEmpty(templateId)) {
  229. wrapper.eq(TaskEntity::getTemplateId, templateId);
  230. }
  231. // 紧急程度
  232. Integer flowUrgent = pagination.getFlowUrgent();
  233. if (ObjectUtil.isNotEmpty(flowUrgent)) {
  234. wrapper.eq(TaskEntity::getUrgent, flowUrgent);
  235. }
  236. // 发起人员
  237. String creatorUserId = pagination.getCreatorUserId();
  238. if (ObjectUtil.isNotEmpty(creatorUserId)) {
  239. wrapper.eq(TaskEntity::getCreatorUserId, creatorUserId);
  240. }
  241. // 日期范围(近7天、近1月、近3月、自定义)
  242. if (ObjectUtil.isNotEmpty(pagination.getStartTime()) && ObjectUtil.isNotEmpty(pagination.getEndTime())) {
  243. wrapper.between(TaskEntity::getStartTime, new Date(pagination.getStartTime()), new Date(pagination.getEndTime()));
  244. }
  245. //应用主键
  246. String systemId = pagination.getSystemId();
  247. if (ObjectUtil.isNotEmpty(systemId)) {
  248. wrapper.eq(TemplateEntity::getSystemId, systemId);
  249. }
  250. wrapper.orderByDesc(OperatorEntity::getCreatorTime);
  251. Page<OperatorVo> page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize());
  252. IPage<OperatorVo> operatorVoPage = this.selectJoinListPage(page, OperatorVo.class, wrapper);
  253. for (OperatorVo record : operatorVoPage.getRecords()) {
  254. boolean isUser = record.getHandleId().equals(loginUserId);
  255. record.setDelegateUser(!isUser ? record.getCreatorUserId() : null);
  256. // 待签状态
  257. if (Objects.equals(categoryEnum, CategoryEnum.Sign)) {
  258. record.setStatus(OperatorStateEnum.WaitSign.getCode());
  259. }
  260. }
  261. return pagination.setData(operatorVoPage.getRecords(), page.getTotal());
  262. }
  263. @Override
  264. public List<OperatorEntity> handleOperator(FlowModel flowModel) throws Exception {
  265. TaskEntity taskEntity = flowModel.getTaskEntity();
  266. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  267. Map<String, NodeModel> nodes = flowModel.getNodes();
  268. Map<String, Object> formData = flowModel.getFormData();
  269. String instanceId = taskEntity.getInstanceId();
  270. String deploymentId = flowModel.getDeploymentId();
  271. NodeModel global = nodes.get(NodeEnum.global.getType());
  272. OperatorEntity operatorEntity = flowModel.getOperatorEntity();
  273. // 最终要返回一个所有节点下的审批人的集合
  274. List<OperatorEntity> list = new ArrayList<>();
  275. // 原来的当前节点
  276. List<String> srcCurrentList = StringUtil.isNotEmpty(taskEntity.getCurrentNodeCode()) ? Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList()) : new ArrayList<>();
  277. // 获取引擎当前任务
  278. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
  279. if (CollectionUtil.isEmpty(taskModelList)) {
  280. return list;
  281. }
  282. taskUtil.updateCurrentNode(taskModelList, nodes, taskEntity);
  283. List<String> types = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.approver.getType(), NodeEnum.processing.getType(), NodeEnum.outside.getType());
  284. List<FlowErrorModel> errorList = new ArrayList<>();
  285. // 生成经办
  286. for (FlowableTaskModel model : taskModelList) {
  287. // 当前节点已存在,跳过
  288. if (CollectionUtil.isNotEmpty(srcCurrentList) && srcCurrentList.contains(model.getTaskKey())) {
  289. continue;
  290. }
  291. // 获取对应的节点信息
  292. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  293. .filter(e -> e.getNodeCode().equals(model.getTaskKey())).findFirst().orElse(null);
  294. if (null == nodeEntity) {
  295. continue;
  296. }
  297. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  298. if (nodeModel == null) {
  299. continue;
  300. }
  301. // 不是审批、子流程、外部、办理节点
  302. if (!types.contains(nodeModel.getType())) {
  303. continue;
  304. }
  305. FlowMethod flowMethod = new FlowMethod();
  306. flowMethod.setTaskEntity(taskEntity);
  307. flowMethod.setNodeEntity(nodeEntity);
  308. flowMethod.setNodeEntityList(nodeEntityList);
  309. flowMethod.setFlowModel(flowModel);
  310. // 流程参数
  311. taskUtil.updateGlobalParam(taskEntity, nodeModel, global, flowModel.getFormData());
  312. flowModel.setFlowableTaskId(model.getTaskId());
  313. List<String> typeList = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.outside.getType());
  314. // 处理子流程节点、外部节点,传递表单数据
  315. boolean isOutside = Objects.equals(nodeModel.getType(), NodeEnum.outside.getType());
  316. if (typeList.contains(nodeModel.getType())) {
  317. if (StringUtil.isEmpty(taskEntity.getRejectDataId()) && CollectionUtil.isEmpty(flowModel.getErrorRuleUserList())) {
  318. FlowMethod method = new FlowMethod();
  319. method.setDeploymentId(flowModel.getDeploymentId());
  320. method.setNodeCode(nodeModel.getNodeId());
  321. method.setNodes(flowModel.getNodes());
  322. method.setFormData(flowModel.getFormData());
  323. List<NodeModel> nextApprover = taskUtil.getNextApprover(method);
  324. int nextError = taskUtil.checkNextError(flowModel, nextApprover, true, true, true);
  325. if (nextError == 3) {
  326. errorList.addAll(flowModel.getErrorList());
  327. flowModel.setErrorList(new ArrayList<>());
  328. continue;
  329. } else if (nextError == 2) {
  330. throw new WorkFlowException(MsgCode.WF061.get());
  331. }
  332. }
  333. flowModel.setOperatorEntity(operatorEntity);
  334. if (isOutside) {
  335. //外部节点
  336. String eventId = RandomUtil.uuId();
  337. Map<String, List<TemplateJsonModel>> outsideOptions = nodeModel.getOutsideOptions();
  338. String resultNodeCode = taskUtil.resultNodeCode(flowMethod);
  339. List<TemplateJsonModel> templateJsonModelList = outsideOptions.get(resultNodeCode) != null ? outsideOptions.get(resultNodeCode) : new ArrayList<>();
  340. FlowModel outsideModel = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  341. outsideModel.setNodeCode(nodeModel.getNodeId());
  342. TemplateNodeEntity resultNode = nodeEntityList.stream().filter(e -> Objects.equals(e.getNodeCode(), resultNodeCode)).findFirst().orElse(null);
  343. if (resultNode != null) {
  344. outsideModel.setFormData(taskUtil.infoData(resultNode.getFormId(), taskEntity.getId()));
  345. }
  346. Map<String, String> parameterData = operatorUtil.outsideData(outsideModel, templateJsonModelList, FlowContextHolder.getAllData(), resultNodeCode, eventId);
  347. //保存外部节点事件数据
  348. EventLogEntity eventLog = new EventLogEntity();
  349. eventLog.setId(eventId);
  350. eventLog.setTaskId(taskEntity.getId());
  351. eventLog.setNodeId(model.getTaskId());
  352. eventLog.setNodeName(nodeModel.getNodeName());
  353. eventLog.setNodeCode(nodeModel.getNodeId());
  354. eventLog.setType(nodeModel.getType());
  355. eventLog.setUpNode(resultNodeCode);
  356. eventLog.setInterfaceId(nodeModel.getFormId());
  357. eventLog.setData(JsonUtil.getObjectToString(formData));
  358. eventLog.setStatus(FlowNature.Lose);
  359. eventLogService.create(eventLog);
  360. EventModel event = JsonUtil.getJsonToBean(eventLog, EventModel.class);
  361. event.setParameterData(parameterData);
  362. FlowEventHolder.addOutsideEvent(event, FlowContextHolder.getAllData());
  363. } else {
  364. //子流程
  365. operatorUtil.handleSubFlow(nodeEntity, flowModel);
  366. }
  367. continue;
  368. }
  369. taskUtil.dataTransfer(flowMethod);
  370. flowMethod.setNodeModel(nodeModel);
  371. flowMethod.setFormData(formData);
  372. flowMethod.setDeploymentId(deploymentId);
  373. flowMethod.setNodeCode(nodeEntity.getNodeCode());
  374. flowMethod.setNodes(nodes);
  375. // 节点自动审批
  376. if (taskEntity.getRejectDataId() == null) {
  377. int flag = operatorUtil.checkAuto(flowMethod);
  378. if (flag == 1 || flag == 2) {
  379. // 判断下一级是否存在候选人,存在候选人返回false
  380. List<NodeModel> nextApprover;
  381. boolean mark = true;
  382. try {
  383. nextApprover = taskUtil.getNextApprover(flowMethod);
  384. } catch (WorkFlowException e) {
  385. nextApprover = null;
  386. mark = false;
  387. }
  388. Map<String, Boolean> resMap = conditionService.handleCondition(flowMethod);
  389. try {
  390. conditionService.checkCondition(resMap, nodes);
  391. } catch (WorkFlowException e) {
  392. mark = false;
  393. }
  394. // 下一节点的条件判断不满足,不触发系统审批
  395. if (mark) {
  396. boolean isBranch = taskUtil.checkBranch(nodeModel);
  397. int nextError = taskUtil.checkNextError(flowModel, nextApprover, false, false);
  398. if (!isBranch && taskUtil.checkNextCandidates(nextApprover) && nextError == 0) {
  399. flowModel.setHandleOpinion("系统审批");
  400. flowModel.setSignImg(null);
  401. flowModel.setFileList(null);
  402. flowModel.setHandleStatus(flag == 1 ? FlowNature.AuditCompletion : FlowNature.RejectCompletion);
  403. flowMethod.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class));
  404. flowMethod.setNodeModel(nodeModel);
  405. OperatorEntity operator = operatorUtil.saveSystemOperator(flowMethod);
  406. SystemAuditModel systemAuditModel = new SystemAuditModel();
  407. systemAuditModel.setOperator(operator);
  408. systemAuditModel.setFlowModel(flowMethod.getFlowModel());
  409. SystemAuditHolder.add(systemAuditModel);
  410. continue;
  411. }
  412. }
  413. }
  414. }
  415. // 获取审批人
  416. flowMethod.setErrorRule(true);
  417. flowMethod.setExtraRule(true);
  418. List<String> userIds = taskUtil.userListAll(flowMethod);
  419. // 获取正常的用户
  420. List<UserEntity> users = serviceUtil.getUserName(userIds, true);
  421. // 全局异常处理
  422. if (users.isEmpty()) {
  423. // 自动通过
  424. Integer pass = flowMethod.getPass();
  425. if (pass > 0) {
  426. // 自动审批 要判断候选人等
  427. boolean mark = true;
  428. List<NodeModel> nextApprover;
  429. try {
  430. nextApprover = taskUtil.getNextApprover(flowMethod);
  431. } catch (WorkFlowException e) {
  432. // 异常节点(默认通过)下条件不满足、候选人,走admin兜底方案
  433. nextApprover = null;
  434. mark = false;
  435. }
  436. Map<String, Boolean> resMap = conditionService.handleCondition(flowMethod);
  437. try {
  438. conditionService.checkCondition(resMap, nodes);
  439. } catch (WorkFlowException e) {
  440. mark = false;
  441. }
  442. if (mark && !taskUtil.checkBranch(nodeModel) && taskUtil.checkNextCandidates(nextApprover)) {
  443. flowModel.setHandleOpinion(ObjectUtil.equals(nodeModel.getType(), NodeEnum.processing.getType()) ? "默认办理通过" : "默认审批通过");
  444. flowModel.setSignImg(null);
  445. flowModel.setFileList(null);
  446. flowModel.setHandleStatus(FlowNature.AuditCompletion);
  447. flowMethod.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class));
  448. flowMethod.setNodeModel(nodeModel);
  449. OperatorEntity operator = operatorUtil.saveSystemOperator(flowMethod);
  450. SystemAuditModel systemAuditModel = new SystemAuditModel();
  451. systemAuditModel.setOperator(operator);
  452. systemAuditModel.setFlowModel(flowMethod.getFlowModel());
  453. SystemAuditHolder.add(systemAuditModel);
  454. continue;
  455. } else {
  456. String admin = serviceUtil.getAdmin();
  457. UserEntity userEntity = serviceUtil.getUserInfo(admin);
  458. users.add(userEntity);
  459. }
  460. }
  461. // 上一节点审批人指定处理人
  462. Integer node = flowMethod.getNode();
  463. if (node > 0) {
  464. operatorUtil.handleErrorRule(nodeModel, errorList);
  465. }
  466. // 无法提交
  467. Integer notSubmit = flowMethod.getNotSubmit();
  468. if (notSubmit > 0) {
  469. throw new WorkFlowException(MsgCode.WF061.get());
  470. }
  471. }
  472. userIds = users.stream().map(UserEntity::getId).collect(Collectors.toList());
  473. flowMethod.setNodeModel(nodeModel);
  474. flowMethod.setUserIds(userIds);
  475. flowMethod.setFlowModel(flowModel);
  476. List<OperatorEntity> operator = operatorUtil.createOperator(flowMethod);
  477. list.addAll(operator);
  478. //保存逐级用户数据
  479. LaunchUserEntity launchUser = flowMethod.getLaunchUser();
  480. if (launchUser != null) {
  481. launchUserService.save(launchUser);
  482. }
  483. }
  484. if (!errorList.isEmpty()) {
  485. AuditModel model = new AuditModel();
  486. model.setErrorCodeList(errorList);
  487. throw new WorkFlowException(200, JsonUtil.getObjectToString(model));
  488. }
  489. operatorUtil.addOperatorList(list, flowModel);
  490. return list;
  491. }
  492. @DSTransactional
  493. @Override
  494. public void auditWithCheck(String id, FlowModel flowModel) throws Exception {
  495. this.audit(id, flowModel);
  496. }
  497. @Override
  498. public void audit(String id, FlowModel flowModel) throws Exception {
  499. OperatorEntity operator = operatorUtil.checkOperator(id);
  500. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  501. TaskEntity taskEntity = flowModel.getTaskEntity();
  502. String handleOpinion = flowModel.getHandleOpinion();
  503. String signId = flowModel.getSignId();
  504. String signImg = flowModel.getSignImg();
  505. Boolean useSignNext = flowModel.getUseSignNext();
  506. Map<String, Object> formData = flowModel.getFormData();
  507. Map<String, NodeModel> nodes = flowModel.getNodes();
  508. NodeModel global = nodes.get(NodeEnum.global.getType());
  509. NodeModel nodeModel = nodes.get(operator.getNodeCode());
  510. TemplateJsonEntity jsonEntity = flowModel.getJsonEntity();
  511. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  512. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  513. .filter(e -> StringUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null);
  514. String formId = null != nodeEntity ? nodeEntity.getFormId() : "";
  515. // 获取流程参数
  516. taskUtil.getGlobalParam(taskEntity, nodeModel, global, formData);
  517. flowModel.setTaskEntity(taskEntity);
  518. RevokeEntity revokeEntity = revokeService.getRevokeTask(taskEntity.getId());
  519. if (CollectionUtil.isNotEmpty(formData) && null == revokeEntity) {
  520. FlowFormDataModel model = new FlowFormDataModel();
  521. model.setFormId(formId);
  522. model.setId(taskEntity.getId());
  523. model.setFormOperates(nodeModel.getFormOperates());
  524. model.setMap(formData);
  525. model.setFlowId(jsonEntity.getId());
  526. serviceUtil.saveOrUpdateFormData(model);
  527. }
  528. formData = serviceUtil.infoData(formId, taskEntity.getId());
  529. // 表单
  530. if (CollectionUtil.isNotEmpty(formData)) {
  531. flowModel.setFormData(formData);
  532. // 保存表单到线程
  533. FlowContextHolder.addChildData(taskEntity.getId(), formId, formData, nodeModel.getFormOperates(), false);
  534. }
  535. this.audit(operator, flowModel);
  536. if (useSignNext) {
  537. serviceUtil.updateSign(signId, signImg);
  538. }
  539. serviceUtil.addCommonWordsNum(handleOpinion);
  540. // 保存表单数据
  541. //FlowContextHolder.delete(taskEntity.getId(), formId);
  542. FlowContextHolder.deleteFormOperator();
  543. serviceUtil.handleFormData(taskEntity.getFlowId(), true);
  544. }
  545. @Override
  546. public void audit(OperatorEntity operator, FlowModel flowModel) throws Exception {
  547. TaskEntity taskEntity = flowModel.getTaskEntity();
  548. //判断是否审批过
  549. if (null != operator.getHandleStatus()) {
  550. return;
  551. }
  552. taskUtil.isSuspend(taskEntity);
  553. taskUtil.isCancel(taskEntity);
  554. if (null == flowModel.getUserInfo()) {
  555. flowModel.setUserInfo(UserProvider.getUser());
  556. }
  557. RevokeEntity revokeEntity = revokeService.getRevokeTask(taskEntity.getId());
  558. if (null != revokeEntity) {
  559. // 处理撤销的经办
  560. operatorUtil.addTask(ImmutableList.of(revokeEntity.getTaskId()));
  561. operatorUtil.handleRevoke(flowModel, operator, revokeEntity);
  562. return;
  563. }
  564. operatorUtil.addTask(ImmutableList.of(taskEntity.getId()));
  565. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  566. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  567. .filter(e -> StringUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null);
  568. if (nodeEntity == null) {
  569. throw new WorkFlowException(MsgCode.WF076.get());
  570. }
  571. flowModel.setNodeEntity(nodeEntity);
  572. String deploymentId = flowModel.getDeploymentId();
  573. Map<String, NodeModel> nodes = flowModel.getNodes();
  574. NodeModel nodeModel = nodes.get(operator.getNodeCode());
  575. // 全局节点
  576. TemplateNodeEntity globalEntity = nodeEntityList.stream()
  577. .filter(e -> StringUtil.equals(NodeEnum.global.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  578. NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
  579. // 表单
  580. Map<String, Object> formData = flowModel.getFormData();
  581. if (CollectionUtil.isNotEmpty(flowModel.getCandidateList())) {
  582. // 或签,删除其他人选择的候选人
  583. if (ObjectUtil.equals(nodeModel.getCounterSign(), FlowNature.FixedApprover)) {
  584. NextOrPrevFo nextOrPrevFo = new NextOrPrevFo();
  585. nextOrPrevFo.setDeploymentId(flowModel.getDeploymentId());
  586. nextOrPrevFo.setTaskKey(operator.getNodeCode());
  587. List<FlowableNodeModel> nextModels = flowAbleUrl.getNext(nextOrPrevFo);
  588. List<String> nextCodes = nextModels.stream().map(FlowableNodeModel::getId).collect(Collectors.toList());
  589. if (CollectionUtil.isNotEmpty(nextCodes)) {
  590. candidatesService.deleteByCodes(operator.getTaskId(), nextCodes);
  591. }
  592. }
  593. }
  594. // 保存候选人、异常人
  595. candidatesService.create(flowModel, operator.getTaskId(), nodeEntityList, operator);
  596. // 流程参数
  597. taskUtil.updateGlobalParam(taskEntity, nodeModel, global, flowModel.getFormData());
  598. flowModel.setTaskEntity(taskEntity);
  599. FlowMethod flowMethod = new FlowMethod();
  600. Integer handleStatus = flowModel.getHandleStatus();
  601. boolean isAudit = handleStatus.equals(FlowNature.AuditCompletion);
  602. if (isAudit) {
  603. operator.setHandleStatus(FlowNature.AuditCompletion);
  604. flowMethod.setType(RecordEnum.audit.getCode());
  605. flowModel.setEventStatus(EventEnum.Approve.getStatus());
  606. } else {
  607. operator.setHandleStatus(FlowNature.RejectCompletion);
  608. flowMethod.setType(RecordEnum.reject.getCode());
  609. flowModel.setEventStatus(EventEnum.Reject.getStatus());
  610. }
  611. // 同意、拒绝
  612. operator.setHandleTime(new Date());
  613. operator.setCompletion(FlowNature.Action);
  614. this.updateById(operator);
  615. if (StringUtil.isNotBlank(operator.getDraftData())) {
  616. // 清除草稿数据
  617. UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
  618. updateWrapper.lambda().eq(OperatorEntity::getId, operator.getId())
  619. .set(OperatorEntity::getDraftData, null);
  620. this.update(updateWrapper);
  621. }
  622. // 记录
  623. flowMethod.setFlowModel(flowModel);
  624. flowMethod.setOperatorEntity(operator);
  625. recordUtil.createRecord(flowMethod);
  626. flowMethod.setTaskEntity(taskEntity);
  627. flowMethod.setNodeEntity(nodeEntity);
  628. flowMethod.setNodeEntityList(nodeEntityList);
  629. flowMethod.setDeploymentId(deploymentId);
  630. flowMethod.setFormData(formData);
  631. flowMethod.setNodes(nodes);
  632. flowMethod.setNodeCode(operator.getNodeCode());
  633. flowMethod.setNodeModel(nodeModel);
  634. flowMethod.setHandleStatus(handleStatus);
  635. // 抄送
  636. List<CirculateEntity> circulateList = new ArrayList<>();
  637. if (flowModel.getCopyMsgFlag()) {
  638. circulateList = circulateUtil.circulateList(flowMethod);
  639. }
  640. flowMethod.setCirculateList(circulateList);
  641. // 判断加签比例
  642. if (!StringUtil.equals(operator.getParentId(), FlowNature.ParentId)) {
  643. operatorUtil.handleAddCounterSign(operator, flowModel);
  644. FlowMsgModel flowMsgModel = new FlowMsgModel();
  645. flowMsgModel.setNodeList(nodeEntityList);
  646. flowMsgModel.setCirculateList(circulateList);
  647. flowMsgModel.setFlowModel(flowModel);
  648. flowMsgModel.setTaskEntity(taskEntity);
  649. flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
  650. flowMsgModel.setWait(false);
  651. flowMsgModel.setCopy(true);
  652. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  653. msgUtil.message(flowMsgModel);
  654. return;
  655. }
  656. // 选择分支
  657. candidatesService.createBranch(flowModel.getBranchList(), operator);
  658. // 指派的经办无需计算比例,或系统审批
  659. if (!ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.Assigned.getCode())
  660. || ObjectUtil.equals(operator.getHandleId(), FlowNature.SYSTEM_CODE)) {
  661. // 判断比例
  662. boolean auditRes = operatorUtil.checkAudit(flowMethod);
  663. if (!auditRes) {
  664. return;
  665. }
  666. //逐级审批过
  667. List<LaunchUserEntity> launchUserList = launchUserService.getTaskList(operator.getTaskId());
  668. LaunchUserEntity launchUser = launchUserList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null);
  669. if (launchUser != null) {
  670. if (isAudit || global.getHasContinueAfterReject()) {
  671. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  672. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
  673. .eq(OperatorEntity::getNodeCode, operator.getNodeCode())
  674. .eq(OperatorEntity::getParentId, FlowNature.ParentId)
  675. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode());
  676. List<OperatorEntity> list = list(queryWrapper);
  677. boolean result = operatorUtil.checkStep(list, nodeModel, launchUser);
  678. if (!result) {
  679. String positionId = launchUser.getPositionId() != null ? launchUser.getPositionId() : "";
  680. List<String> positionList = Arrays.asList(positionId.split(","));
  681. String organizeId = launchUser.getOrganizeId() != null ? launchUser.getOrganizeId() : "";
  682. List<String> organizeList = Arrays.asList(organizeId.split(","));
  683. //获取逐级下个审批人
  684. FlowMethod jsonToBean = new FlowMethod();
  685. flowModel.setFlowableTaskId(operator.getNodeId());
  686. jsonToBean.setTaskEntity(flowMethod.getTaskEntity());
  687. jsonToBean.setFlowModel(flowModel);
  688. jsonToBean.setNodeEntityList(flowMethod.getNodeEntityList());
  689. jsonToBean.setNodeEntity(flowMethod.getNodeEntity());
  690. jsonToBean.setSubFormData(flowMethod.getSubFormData());
  691. jsonToBean.setExtraRule(true);
  692. jsonToBean.setNodeModel(nodeModel);
  693. jsonToBean.setOperatorEntity(operator);
  694. UserEntity userEntity = new UserEntity();
  695. userEntity.setPositionId(positionList.get(positionList.size() - 1));
  696. userEntity.setOrganizeId(organizeList.get(organizeList.size() - 1));
  697. String managerByLevel = taskUtil.getManagerByLevel(userEntity, list.size() + 1);
  698. UserEntity userInfo = serviceUtil.getUserInfo(managerByLevel);
  699. if (userInfo == null) {
  700. throw new WorkFlowException(MsgCode.WF153.get());
  701. }
  702. jsonToBean.setUserIds(ImmutableList.of(managerByLevel));
  703. List<OperatorEntity> entityList = operatorUtil.createOperator(jsonToBean);
  704. for (OperatorEntity entity : entityList) {
  705. entity.setHandleAll(operator.getId());
  706. }
  707. this.updateBatchById(entityList);
  708. operatorUtil.addOperatorList(entityList, flowModel);
  709. // 消息
  710. FlowMsgModel flowMsgModel = new FlowMsgModel();
  711. flowMsgModel.setNodeList(nodeEntityList);
  712. flowMsgModel.setCirculateList(circulateList);
  713. flowMsgModel.setFlowModel(flowModel);
  714. flowMsgModel.setTaskEntity(taskEntity);
  715. flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
  716. flowMsgModel.setOperatorList(entityList);
  717. if (flowModel.getCopyMsgFlag()) {
  718. flowMsgModel.setCopy(true);
  719. }
  720. if (isAudit) {
  721. flowMsgModel.setApprove(true);
  722. } else {
  723. flowMsgModel.setReject(true);
  724. }
  725. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  726. msgUtil.message(flowMsgModel);
  727. return;
  728. }
  729. }
  730. }
  731. }
  732. //审批事件
  733. operatorUtil.addEvent(flowModel);
  734. Integer tempStatus = flowMethod.getHandleStatus() != null ? flowMethod.getHandleStatus() : handleStatus;
  735. // 判断拒绝后是否继续流转
  736. if (FlowNature.RejectCompletion.equals(tempStatus) && !global.getHasContinueAfterReject()) {
  737. flowMethod.setOperatorEntity(operator);
  738. flowMethod.setFlowModel(flowModel);
  739. taskUtil.handleEndTask(flowMethod);
  740. launchUserService.deleteStepUser(taskEntity.getId());
  741. return;
  742. }
  743. flowModel.setOperatorEntity(operator);
  744. boolean isRejectDataId = taskEntity.getRejectDataId() != null;
  745. if (isRejectDataId) {
  746. operatorUtil.handleRejectData(flowModel);
  747. } else {
  748. List<String> branchList = candidatesService.getBranch(operator.getTaskId(), operator.getNodeCode());
  749. Map<String, Boolean> resMap;
  750. if (branchList.isEmpty()) {
  751. resMap = conditionService.handleCondition(flowMethod);
  752. conditionService.checkCondition(resMap, nodes);
  753. } else {
  754. resMap = conditionService.getForBranch(flowMethod, branchList);
  755. }
  756. taskLineService.create(taskEntity.getId(), resMap);
  757. // 完成
  758. CompleteFo fo = new CompleteFo();
  759. fo.setTaskId(operator.getNodeId());
  760. fo.setVariables(new HashMap<>(resMap));
  761. flowAbleUrl.complete(fo);
  762. }
  763. // 节点记录
  764. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  765. nodeRecordModel.setTaskId(operator.getTaskId());
  766. nodeRecordModel.setNodeId(operator.getNodeId());
  767. nodeRecordModel.setNodeCode(operator.getNodeCode());
  768. nodeRecordModel.setNodeName(operator.getNodeName());
  769. nodeRecordModel.setNodeStatus(isAudit ? NodeStateEnum.pass.getCode() : NodeStateEnum.reject.getCode());
  770. nodeRecordService.create(nodeRecordModel);
  771. // 生成下一节点
  772. List<OperatorEntity> entityList = this.handleOperator(flowModel);
  773. // 删除选择分支
  774. candidatesService.deleteBranch(operator.getTaskId(), operator.getNodeCode());
  775. //删除逐级数据
  776. launchUserService.delete(operator.getTaskId(), ImmutableList.of(operator.getNodeCode()));
  777. if (!isRejectDataId) {
  778. boolean isProcessing = ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.processing.getType());
  779. flowModel.setAction(ObjectUtil.equals(handleStatus, FlowNature.RejectCompletion) ? 2 : isProcessing ? 4 : 1);
  780. operatorUtil.handleTrigger(operator, flowModel);
  781. }
  782. // 判断任务是否结束
  783. flowModel.setHandleStatus(flowMethod.getHandleStatus() != null ? flowMethod.getHandleStatus() : handleStatus);
  784. taskUtil.isFinished(flowModel);
  785. // 消息
  786. FlowMsgModel flowMsgModel = new FlowMsgModel();
  787. flowMsgModel.setNodeList(nodeEntityList);
  788. flowMsgModel.setCirculateList(circulateList);
  789. flowMsgModel.setFlowModel(flowModel);
  790. flowMsgModel.setTaskEntity(taskEntity);
  791. flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
  792. flowMsgModel.setOperatorList(entityList);
  793. if (flowModel.getCopyMsgFlag()) {
  794. flowMsgModel.setCopy(true);
  795. }
  796. if (isAudit) {
  797. flowMsgModel.setApprove(true);
  798. } else {
  799. flowMsgModel.setReject(true);
  800. }
  801. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  802. msgUtil.message(flowMsgModel);
  803. // 系统审批
  804. operatorUtil.systemAudit();
  805. }
  806. @Override
  807. public void sign(FlowModel flowModel) throws WorkFlowException {
  808. UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
  809. if (CollectionUtil.isNotEmpty(flowModel.getIds())) {
  810. List<String> ids = new ArrayList<>();
  811. if (flowModel.getType().equals(0)) {
  812. operatorUtil.checkBatch(flowModel.getIds(), ids, false);
  813. List<String> list = new ArrayList<>();
  814. operatorUtil.checkCancel(ids, list);
  815. // 签收
  816. updateWrapper.lambda().in(OperatorEntity::getId, list)
  817. .set(OperatorEntity::getSignTime, new Date());
  818. } else {
  819. operatorUtil.checkBatch(flowModel.getIds(), ids, true);
  820. List<String> list = new ArrayList<>();
  821. operatorUtil.checkCancel(ids, list);
  822. // 退签
  823. updateWrapper.lambda().in(OperatorEntity::getId, list)
  824. .set(OperatorEntity::getSignTime, null);
  825. }
  826. this.update(updateWrapper);
  827. }
  828. }
  829. @Override
  830. public void startHandle(FlowModel flowModel) throws WorkFlowException {
  831. List<String> ids = new ArrayList<>();
  832. operatorUtil.checkBatch(flowModel.getIds(), ids, false);
  833. List<String> list = new ArrayList<>();
  834. operatorUtil.checkCancel(ids, list);
  835. UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
  836. updateWrapper.lambda().in(OperatorEntity::getId, list)
  837. .set(OperatorEntity::getStartHandleTime, new Date());
  838. this.update(updateWrapper);
  839. }
  840. @Override
  841. public void saveAudit(String id, FlowModel flowModel) throws WorkFlowException {
  842. OperatorEntity entity = this.getById(id);
  843. if (null == entity) {
  844. throw new WorkFlowException(MsgCode.FA001.get());
  845. }
  846. TaskEntity taskEntity = taskService.getInfo(entity.getTaskId());
  847. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  848. taskUtil.isSuspend(taskEntity);
  849. taskUtil.isCancel(taskEntity);
  850. entity.setDraftData(JsonUtil.getObjectToString(flowModel.getFormData()));
  851. this.updateById(entity);
  852. }
  853. @DSTransactional
  854. @Override
  855. public void addSign(String id, FlowModel flowModel) throws Exception {
  856. OperatorEntity operator = operatorUtil.checkOperator(id);
  857. List<OperatorEntity> childList = operatorUtil.getChildList(operator.getId());
  858. childList = childList.stream().filter(e -> ObjectUtil.equals(e.getCompletion(), FlowNature.Normal) && !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.Futility.getCode())).collect(Collectors.toList());
  859. if (CollectionUtil.isNotEmpty(childList)) {
  860. throw new WorkFlowException(MsgCode.WF081.get());
  861. }
  862. AddSignModel parameter = flowModel.getAddSignParameter();
  863. List<String> idList = parameter.getAddSignUserIdList();
  864. buttonUtil.checkAddSign(operator, parameter);
  865. // 保存选择分支
  866. List<String> branchList = flowModel.getBranchList();
  867. if (CollectionUtil.isNotEmpty(branchList)) {
  868. candidatesService.createBranch(branchList, operator);
  869. }
  870. if (idList.isEmpty() || operator.getStatus().equals(OperatorStateEnum.Transfer.getCode())
  871. || operator.getStatus().equals(OperatorStateEnum.Assist.getCode())) {
  872. throw new WorkFlowException(MsgCode.WF081.get());
  873. }
  874. String userId = UserProvider.getLoginUserId();
  875. if (idList.contains(userId)) {
  876. throw new WorkFlowException(MsgCode.WF106.get());
  877. }
  878. if (!ObjectUtil.equals(operator.getHandleId(), userId)) {
  879. List<DelegateEntity> delegateList = delegateService.getByToUserId(userId);
  880. List<String> userIds = delegateList.stream().map(DelegateEntity::getUserId).distinct().collect(Collectors.toList());
  881. List<String> filterList = userIds.stream().filter(idList::contains).collect(Collectors.toList());
  882. if (CollectionUtil.isNotEmpty(filterList)) {
  883. throw new WorkFlowException(MsgCode.WF116.get());
  884. }
  885. }
  886. // 将之前的加签经办作废
  887. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  888. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getParentId, id)
  889. .and(i -> i.eq(OperatorEntity::getStatus, OperatorStateEnum.AddSign.getCode())
  890. .or().eq(OperatorEntity::getStatus, OperatorStateEnum.Recall.getCode()));
  891. List<OperatorEntity> list = this.list(queryWrapper);
  892. if (CollectionUtil.isNotEmpty(list)) {
  893. list.forEach(e -> e.setStatus(OperatorStateEnum.Futility.getCode()));
  894. this.updateBatchById(list);
  895. }
  896. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  897. TaskEntity taskEntity = flowModel.getTaskEntity();
  898. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  899. taskUtil.isSuspend(taskEntity);
  900. taskUtil.isCancel(taskEntity);
  901. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  902. Map<String, Object> formData = flowModel.getFormData();
  903. // 表单
  904. if (CollectionUtil.isNotEmpty(formData)) {
  905. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  906. .filter(e -> StringUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null);
  907. if (null != nodeEntity) {
  908. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  909. // 保存表单到线程
  910. FlowContextHolder.addChildData(taskEntity.getId(), nodeEntity.getFormId(), formData, nodeModel.getFormOperates(), true);
  911. }
  912. }
  913. // 保存候选人、异常人
  914. candidatesService.create(flowModel, operator.getTaskId(), nodeEntityList, operator);
  915. // 更新经办信息
  916. operator.setHandleParameter(JsonUtil.getObjectToString(parameter));
  917. if (parameter.getAddSignType().equals(FlowNature.Later)) {
  918. operator.setHandleStatus(FlowNature.AuditCompletion);
  919. }
  920. operator.setCompletion(FlowNature.Action);
  921. if (this.updateById(operator)) {
  922. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  923. .filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null);
  924. if (null == nodeEntity) {
  925. throw new WorkFlowException(MsgCode.WF076.get());
  926. }
  927. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  928. // 全局节点
  929. TemplateNodeEntity globalEntity = nodeEntityList.stream()
  930. .filter(e -> StringUtil.equals(NodeEnum.global.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  931. NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
  932. Date date = new Date();
  933. // 后加签默认同意的记录
  934. if (parameter.getAddSignType().equals(FlowNature.Later)) {
  935. FlowMethod flowMethod = new FlowMethod();
  936. flowMethod.setType(RecordEnum.audit.getCode());
  937. flowMethod.setFlowModel(flowModel);
  938. operator.setHandleTime(date);
  939. flowMethod.setOperatorEntity(operator);
  940. recordUtil.createRecord(flowMethod);
  941. }
  942. // 生成加签的经办
  943. List<OperatorEntity> entityList = new ArrayList<>();
  944. for (String handleId : idList) {
  945. FlowMethod flowMethod = new FlowMethod();
  946. flowMethod.setTaskEntity(taskEntity);
  947. flowMethod.setNodeEntity(nodeEntity);
  948. flowMethod.setNodeModel(nodeModel);
  949. flowMethod.setSignFor(global.getHasSignFor());
  950. flowMethod.setFlowableTaskId(operator.getNodeId());
  951. OperatorEntity entity = operatorUtil.createOperatorEntity(flowMethod);
  952. entity.setHandleId(handleId);
  953. entity.setParentId(operator.getId());
  954. entity.setStatus(OperatorStateEnum.AddSign.getCode());
  955. entityList.add(entity);
  956. if (ObjectUtil.equals(parameter.getCounterSign(), FlowNature.ImproperApprover)) {
  957. break;
  958. }
  959. }
  960. // 加签记录
  961. FlowMethod flowMethod = new FlowMethod();
  962. flowMethod.setFlowModel(flowModel);
  963. operator.setHandleTime(date);
  964. flowMethod.setOperatorEntity(operator);
  965. Integer type = RecordEnum.addSign.getCode();
  966. flowMethod.setType(type);
  967. flowMethod.setUserId(String.join(",", idList));
  968. recordUtil.createRecord(flowMethod);
  969. if (CollectionUtil.isNotEmpty(entityList)) {
  970. this.saveBatch(entityList);
  971. // 消息
  972. FlowMsgModel flowMsgModel = new FlowMsgModel();
  973. flowMsgModel.setOperatorList(entityList);
  974. flowMsgModel.setNodeList(nodeEntityList);
  975. flowMsgModel.setFlowModel(flowModel);
  976. flowMsgModel.setTaskEntity(taskEntity);
  977. flowMsgModel.setNodeCode(operator.getNodeCode());
  978. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  979. msgUtil.message(flowMsgModel);
  980. operatorUtil.addOperatorList(entityList, flowModel);
  981. }
  982. }
  983. serviceUtil.handleFormData(taskEntity.getFlowId(), false);
  984. }
  985. @Override
  986. public List<CandidateUserVo> getReduceList(String id, Pagination pagination) throws WorkFlowException {
  987. RecordEntity record = recordService.getInfo(id);
  988. if (null == record) {
  989. throw new WorkFlowException(MsgCode.FA001.get());
  990. }
  991. OperatorEntity operator = this.getById(record.getOperatorId());
  992. if (null == operator) {
  993. throw new WorkFlowException(MsgCode.FA001.get());
  994. }
  995. if (null == operator.getHandleParameter()) {
  996. throw new WorkFlowException(MsgCode.WF082.get());
  997. }
  998. AddSignModel model = JsonUtil.getJsonToBean(operator.getHandleParameter(), AddSignModel.class);
  999. List<CandidateUserVo> list = new ArrayList<>();
  1000. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1001. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getParentId, operator.getId())
  1002. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode())
  1003. .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode());
  1004. List<OperatorEntity> entityList = this.list(queryWrapper);
  1005. if (CollectionUtil.isEmpty(entityList)) {
  1006. return list;
  1007. }
  1008. // 获取未审批的加签经办
  1009. List<OperatorEntity> todoList = entityList.stream().filter(e -> null == e.getHandleStatus()
  1010. && ObjectUtil.equals(e.getCompletion(), FlowNature.Normal)).collect(Collectors.toList());
  1011. // 依次审批,获取未创建经办的人员
  1012. if (ObjectUtil.equals(model.getCounterSign(), FlowNature.ImproperApprover) && CollectionUtil.isNotEmpty(todoList)) {
  1013. List<String> idList = model.getAddSignUserIdList();
  1014. OperatorEntity operatorEntity = todoList.get(0);
  1015. int index = idList.indexOf(operatorEntity.getHandleId());
  1016. if (index < idList.size() - 1) {
  1017. for (int i = index + 1; i < idList.size(); i++) {
  1018. OperatorEntity op = new OperatorEntity();
  1019. op.setHandleId(idList.get(i));
  1020. todoList.add(op);
  1021. }
  1022. }
  1023. }
  1024. return operatorUtil.getReduceUsers(todoList, pagination);
  1025. }
  1026. // 减签
  1027. @Override
  1028. @DSTransactional
  1029. public void reduce(String id, FlowModel flowModel) throws WorkFlowException {
  1030. List<String> ids = flowModel.getIds();
  1031. RecordEntity record = recordService.getInfo(id);
  1032. if (null == record) {
  1033. throw new WorkFlowException(MsgCode.FA001.get());
  1034. }
  1035. OperatorEntity operator = this.getById(record.getOperatorId());
  1036. if (null == operator) {
  1037. throw new WorkFlowException(MsgCode.FA001.get());
  1038. }
  1039. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1040. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getParentId, operator.getId())
  1041. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode())
  1042. .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode());
  1043. List<OperatorEntity> list = this.list(queryWrapper);
  1044. if (CollectionUtil.isEmpty(list)) {
  1045. throw new WorkFlowException(MsgCode.FA001.get());
  1046. }
  1047. if (CollectionUtil.isNotEmpty(ids)) {
  1048. String userId = ids.get(0);
  1049. OperatorEntity operatorEntity = list.stream()
  1050. .filter(e -> ObjectUtil.equals(e.getHandleId(), userId) && e.getHandleTime() != null).findFirst().orElse(null);
  1051. if (null != operatorEntity && null != operatorEntity.getHandleStatus()) {
  1052. throw new WorkFlowException(MsgCode.WF128.get());
  1053. }
  1054. }
  1055. AddSignModel model = JsonUtil.getJsonToBean(operator.getHandleParameter(), AddSignModel.class);
  1056. boolean inTurn = ObjectUtil.equals(model.getCounterSign(), FlowNature.ImproperApprover);
  1057. List<OperatorEntity> unApproved = list.stream()
  1058. .filter(e -> ObjectUtil.equals(e.getCompletion(), FlowNature.Normal) && e.getHandleTime() == null).collect(Collectors.toList());
  1059. if (inTurn) {
  1060. // 依次审批的处理
  1061. List<String> idList = model.getAddSignUserIdList();
  1062. OperatorEntity entity = unApproved.stream().filter(e -> ids.contains(e.getHandleId())).findFirst().orElse(null);
  1063. if (null != entity) {
  1064. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  1065. Map<String, NodeModel> nodes = flowModel.getNodes();
  1066. NodeModel global = nodes.get(NodeEnum.global.getType());
  1067. int index = idList.indexOf(entity.getHandleId());
  1068. if (index == idList.size() - 1) {
  1069. throw new WorkFlowException(MsgCode.WF109.get());
  1070. }
  1071. String handleId = idList.get(index + 1);
  1072. // 创建下一个经办
  1073. OperatorEntity newOperator = operatorUtil.createOperator(entity, OperatorStateEnum.AddSign.getCode(), handleId, global);
  1074. this.save(newOperator);
  1075. FlowMethod flowMethod = new FlowMethod();
  1076. flowMethod.setFlowModel(flowModel);
  1077. flowMethod.setAddSignModel(model);
  1078. flowMethod.setOperatorEntity(operator);
  1079. flowMethod.setTaskEntity(flowModel.getTaskEntity());
  1080. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1081. flowMethod.setNodeEntityList(nodeEntityList);
  1082. TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), operator.getNodeCode()))
  1083. .findFirst().orElse(null);
  1084. flowMethod.setNodeEntity(nodeEntity);
  1085. operatorUtil.improperApproverMessage(flowMethod, newOperator);
  1086. // 删除需要减签的经办
  1087. this.removeById(entity);
  1088. }
  1089. // 更新handleParameter
  1090. idList.removeAll(ids);
  1091. model.setAddSignUserIdList(idList);
  1092. operator.setHandleParameter(JsonUtil.getObjectToString(model));
  1093. this.updateById(operator);
  1094. } else {
  1095. if (unApproved.size() == 1) {
  1096. throw new WorkFlowException(MsgCode.WF109.get());
  1097. }
  1098. }
  1099. // 记录
  1100. FlowMethod flowMethod = new FlowMethod();
  1101. flowMethod.setFlowModel(flowModel);
  1102. flowMethod.setOperatorEntity(operator);
  1103. Integer type = RecordEnum.subtractSign.getCode();
  1104. flowMethod.setType(type);
  1105. flowMethod.setUserId(String.join(",", ids));
  1106. recordUtil.createRecord(flowMethod);
  1107. if (inTurn) {
  1108. return;
  1109. }
  1110. List<String> handleIds = list.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList());
  1111. handleIds.removeAll(ids);
  1112. if (handleIds.isEmpty()) {
  1113. // 全部减签
  1114. this.removeByIds(list);
  1115. // 还原经办
  1116. UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
  1117. updateWrapper.lambda().eq(OperatorEntity::getId, operator.getId())
  1118. .set(OperatorEntity::getCompletion, FlowNature.Normal)
  1119. .set(OperatorEntity::getHandleParameter, null);
  1120. this.update(updateWrapper);
  1121. } else {
  1122. List<OperatorEntity> collect = list.stream().filter(t -> ids.contains(t.getHandleId())).collect(Collectors.toList());
  1123. this.removeByIds(collect);
  1124. }
  1125. }
  1126. // 获取可退回的节点
  1127. @Override
  1128. public List<BackNodeModel> getFallbacks(String id) throws WorkFlowException {
  1129. OperatorEntity operator = this.getInfo(id);
  1130. if (null == operator) {
  1131. throw new WorkFlowException(MsgCode.FA001.get());
  1132. }
  1133. TaskEntity taskEntity = taskService.getInfo(operator.getTaskId());
  1134. if (null == taskEntity) {
  1135. throw new WorkFlowException(MsgCode.FA001.get());
  1136. }
  1137. TemplateJsonEntity jsonEntity = templateJsonService.getInfo(taskEntity.getFlowId());
  1138. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(taskEntity.getFlowId());
  1139. Map<String, NodeModel> nodes = new HashMap<>();
  1140. for (TemplateNodeEntity nodeEntity : nodeEntityList) {
  1141. nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
  1142. }
  1143. NodeModel nodeModel = nodes.get(operator.getNodeCode());
  1144. List<BackNodeModel> list = new ArrayList<>();
  1145. // 获取经办过滤
  1146. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1147. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId());
  1148. List<OperatorEntity> operatorEntityList = this.list(queryWrapper);
  1149. List<String> nodeList = operatorEntityList.stream().map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList());
  1150. TemplateNodeEntity start = nodeEntityList.stream().filter(e -> e.getNodeType().equals(NodeEnum.start.getType())).findFirst().orElse(null);
  1151. if (null == start) {
  1152. throw new WorkFlowException(MsgCode.WF076.get());
  1153. }
  1154. NodeModel startModel = JsonUtil.getJsonToBean(start.getNodeJson(), NodeModel.class);
  1155. if (ObjectUtil.equals(nodeModel.getBackNodeCode(), FlowNature.Start)) {
  1156. BackNodeModel model = new BackNodeModel();
  1157. model.setNodeName(startModel.getNodeName());
  1158. model.setNodeCode(startModel.getNodeId());
  1159. list.add(model);
  1160. } else if (ObjectUtil.equals(nodeModel.getBackNodeCode(), FlowNature.Up)) {
  1161. List<String> resList = new ArrayList<>();
  1162. List<String> nodeCodeList = new ArrayList<>();
  1163. taskUtil.prevNode(jsonEntity.getFlowableId(), operator.getNodeCode(), nodeEntityList, nodeCodeList);
  1164. List<String> nodeCodes = operatorUtil.getList(taskEntity.getId()).stream()
  1165. .filter(e -> !e.getStatus().equals(OperatorStateEnum.Futility.getCode()))
  1166. .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList());
  1167. nodeCodes.add(start.getNodeCode());
  1168. for (String nodeCode : nodeCodeList) {
  1169. NodeModel node = nodes.get(nodeCode);
  1170. // 退回节点包含子流程
  1171. if (null != node) {
  1172. if (NodeEnum.subFlow.getType().equals(node.getType())) {
  1173. throw new WorkFlowException(MsgCode.WF046.get());
  1174. }
  1175. if (NodeEnum.outside.getType().equals(node.getType())) {
  1176. throw new WorkFlowException(MsgCode.WF154.get());
  1177. }
  1178. }
  1179. if (!nodeCodes.contains(nodeCode)) {
  1180. continue;
  1181. }
  1182. resList.add(nodeCode);
  1183. }
  1184. if (resList.isEmpty()) {
  1185. resList.addAll(nodeCodeList);
  1186. }
  1187. BackNodeModel model = new BackNodeModel();
  1188. model.setNodeName("上级审批节点");
  1189. model.setNodeCode(String.join(",", resList));
  1190. list.add(model);
  1191. } else if (ObjectUtil.equals(nodeModel.getBackNodeCode(), FlowNature.Reject)) {
  1192. List<String> fallbacks = flowAbleUrl.getFallbacks(operator.getNodeId());
  1193. nodeList.add(start.getNodeCode());
  1194. fallbacks = fallbacks.stream().filter(nodeList::contains).collect(Collectors.toList());
  1195. // 获取经办进行过滤
  1196. List<String> nodeCodeList = operatorUtil.getList(taskEntity.getId()).stream()
  1197. .filter(e -> !e.getStatus().equals(OperatorStateEnum.Futility.getCode()))
  1198. .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList());
  1199. nodeCodeList.add(start.getNodeCode());
  1200. for (String nodeCode : fallbacks) {
  1201. // 过滤没有走过的点
  1202. if (!nodeCodeList.contains(nodeCode) || ObjectUtil.equals(nodeCode, operator.getNodeCode())) {
  1203. continue;
  1204. }
  1205. NodeModel node = nodes.get(nodeCode);
  1206. BackNodeModel model = new BackNodeModel();
  1207. model.setNodeName(node.getNodeName());
  1208. model.setNodeCode(node.getNodeId());
  1209. list.add(model);
  1210. }
  1211. } else {
  1212. NodeModel optional = nodes.get(nodeModel.getBackNodeCode());
  1213. if (null != optional) {
  1214. BackNodeModel model = new BackNodeModel();
  1215. model.setNodeName(optional.getNodeName());
  1216. model.setNodeCode(nodeModel.getBackNodeCode());
  1217. list.add(model);
  1218. }
  1219. }
  1220. return list;
  1221. }
  1222. // 退回
  1223. @DSTransactional
  1224. @Override
  1225. public void back(String id, FlowModel flowModel) throws Exception {
  1226. OperatorEntity operator = operatorUtil.checkOperator(id);
  1227. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  1228. TaskEntity taskEntity = flowModel.getTaskEntity();
  1229. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  1230. taskUtil.isSuspend(taskEntity);
  1231. taskUtil.isCancel(taskEntity);
  1232. if (null != taskEntity.getRejectDataId()) {
  1233. throw new WorkFlowException(MsgCode.WF083.get());
  1234. }
  1235. Map<String, NodeModel> nodes = flowModel.getNodes();
  1236. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1237. String deploymentId = flowModel.getDeploymentId();
  1238. NodeModel nodeModel = nodes.get(operator.getNodeCode());
  1239. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  1240. .filter(e -> ObjectUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null);
  1241. flowModel.setNodeEntity(nodeEntity);
  1242. TemplateNodeEntity start = nodeEntityList.stream().filter(e -> e.getNodeType().equals(NodeEnum.start.getType())).findFirst().orElse(null);
  1243. if (null == start) {
  1244. throw new WorkFlowException(MsgCode.WF076.get());
  1245. }
  1246. Integer backType = flowModel.getBackType();
  1247. String backStep = flowModel.getBackNodeCode();
  1248. List<String> stepList = new ArrayList<>();
  1249. if (FlowNature.Start.equals(backStep)) {
  1250. stepList.add(start.getNodeCode());
  1251. } else {
  1252. stepList = StringUtil.isNotEmpty(backStep) ? Arrays.stream(backStep.split(",")).collect(Collectors.toList()) : new ArrayList<>();
  1253. // 判断没有经过的节点,不能退回
  1254. List<String> nodeCodeList = operatorUtil.getList(taskEntity.getId()).stream()
  1255. .filter(e -> !e.getStatus().equals(OperatorStateEnum.Futility.getCode()))
  1256. .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList());
  1257. nodeCodeList.add(start.getNodeCode());
  1258. for (String step : stepList) {
  1259. if (!nodeCodeList.contains(step)) {
  1260. throw new WorkFlowException(MsgCode.WF047.get());
  1261. }
  1262. }
  1263. }
  1264. operatorUtil.addTask(ImmutableList.of(taskEntity.getId()));
  1265. AfterFo afterFo = new AfterFo();
  1266. afterFo.setDeploymentId(deploymentId);
  1267. afterFo.setTaskKeys(stepList);
  1268. // 获取目标节点之后的所有节点,将这些节点的经办全部保存、更新状态
  1269. List<String> afterListAll = flowAbleUrl.getAfter(afterFo);
  1270. List<String> afterList = new ArrayList<>();
  1271. List<String> deleteAfterList = new ArrayList<>(afterListAll);
  1272. afterList.addAll(stepList);
  1273. afterList.addAll(afterListAll);
  1274. afterList = afterList.stream().distinct().collect(Collectors.toList());
  1275. QueryWrapper<OperatorEntity> wrapper = new QueryWrapper<>();
  1276. wrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
  1277. .in(OperatorEntity::getNodeCode, afterList);
  1278. List<OperatorEntity> list = this.list(wrapper);
  1279. // 当前审批时 保存 任务、经办、外部 转json
  1280. QueryWrapper<EventLogEntity> logWrapper = new QueryWrapper<>();
  1281. logWrapper.lambda().eq(EventLogEntity::getTaskId, operator.getTaskId())
  1282. .in(EventLogEntity::getNodeCode, afterList);
  1283. logWrapper.lambda().select(EventLogEntity::getId, EventLogEntity::getNodeCode);
  1284. List<EventLogEntity> logList = eventLogService.list(logWrapper);
  1285. RejectDataEntity rejectDataEntity = null;
  1286. if (FlowNature.PresentType.equals(backType)) {
  1287. rejectDataEntity = rejectDataService.create(taskEntity, list, logList, stepList.get(0));
  1288. //更新外部节点
  1289. UpdateWrapper<EventLogEntity> updateLogWrapper = new UpdateWrapper<>();
  1290. updateLogWrapper.lambda().eq(EventLogEntity::getTaskId, operator.getTaskId());
  1291. updateLogWrapper.lambda().in(EventLogEntity::getNodeCode, afterList);
  1292. updateLogWrapper.lambda().set(EventLogEntity::getNodeCode, null);
  1293. eventLogService.update(updateLogWrapper);
  1294. } else {
  1295. // 子流程处理,重新审批:子流程需删除,当前审批:无需终止
  1296. taskUtil.deleteSubflow(taskEntity.getId(), afterList);
  1297. }
  1298. // 更改状态 state 转 -1
  1299. for (OperatorEntity operatorEntity : list) {
  1300. operatorEntity.setStatus(OperatorStateEnum.Futility.getCode());
  1301. // 删除超时相关
  1302. FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil);
  1303. }
  1304. this.updateBatchById(list);
  1305. // 记录
  1306. FlowMethod flowMethod = new FlowMethod();
  1307. flowMethod.setType(RecordEnum.back.getCode());
  1308. flowMethod.setFlowModel(flowModel);
  1309. flowMethod.setOperatorEntity(operator);
  1310. recordUtil.createRecord(flowMethod);
  1311. // 记录作废
  1312. if (ObjectUtil.equals(backType, FlowNature.RestartType)) {
  1313. recordService.updateStatusToInvalid(taskEntity.getId(), afterList);
  1314. }
  1315. // 节点记录
  1316. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  1317. nodeRecordModel.setTaskId(operator.getTaskId());
  1318. nodeRecordModel.setNodeId(operator.getNodeId());
  1319. nodeRecordModel.setNodeCode(operator.getNodeCode());
  1320. nodeRecordModel.setNodeName(operator.getNodeName());
  1321. nodeRecordModel.setNodeStatus(NodeStateEnum.back.getCode());
  1322. nodeRecordService.create(nodeRecordModel);
  1323. UpdateWrapper<TaskEntity> updateWrapper = new UpdateWrapper<>();
  1324. updateWrapper.lambda().eq(TaskEntity::getId, operator.getTaskId());
  1325. if (null != rejectDataEntity) {
  1326. updateWrapper.lambda().set(TaskEntity::getRejectDataId, rejectDataEntity.getId());
  1327. }
  1328. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1329. flowModel.setAction(3);
  1330. flowModel.setOperatorEntity(operator);
  1331. if (null != nodeEntity) {
  1332. Map<String, Object> map = serviceUtil.infoData(nodeEntity.getFormId(), operator.getTaskId());
  1333. FlowContextHolder.addChildData(operator.getTaskId(), nodeEntity.getFormId(), map, nodeModel.getFormOperates(), false);
  1334. flowModel.setFormData(map);
  1335. }
  1336. if (!FlowNature.PresentType.equals(backType)) {
  1337. operatorUtil.handleTrigger(operator, flowModel);
  1338. }
  1339. // 开始节点
  1340. if (stepList.size() == 1 && stepList.get(0).equals(start.getNodeCode())) {
  1341. // 更新任务
  1342. updateWrapper.lambda()
  1343. .set(TaskEntity::getCurrentNodeName, FlowNature.START_NAME)
  1344. .set(TaskEntity::getCurrentNodeCode, FlowNature.START_CODE)
  1345. .set(TaskEntity::getStatus, TaskStatusEnum.BACKED.getCode());
  1346. if (rejectDataEntity == null) {
  1347. updateWrapper.lambda().set(TaskEntity::getInstanceId, null);
  1348. }
  1349. taskService.update(updateWrapper);
  1350. List<OperatorEntity> entityList = new ArrayList<>();
  1351. OperatorEntity operatorEntity = new OperatorEntity();
  1352. operatorEntity.setNodeCode(start.getNodeCode());
  1353. operatorEntity.setHandleId(taskEntity.getCreatorUserId());
  1354. entityList.add(operatorEntity);
  1355. flowMsgModel.setOperatorList(entityList);
  1356. flowMsgModel.setWait(false);
  1357. if (!FlowNature.PresentType.equals(backType)) {
  1358. // 删除发起用户
  1359. launchUserService.delete(taskEntity.getId());
  1360. }
  1361. // 删除引擎实例
  1362. if (rejectDataEntity == null) {
  1363. String instanceId = taskEntity.getInstanceId();
  1364. flowAbleUrl.deleteInstance(instanceId, "back");
  1365. }
  1366. } else {
  1367. String sourceId = StringUtil.isNotEmpty(flowModel.getBackId()) ? flowModel.getBackId() : operator.getNodeId();
  1368. BackFo fo = new BackFo();
  1369. fo.setTaskId(sourceId);
  1370. fo.setTargetKey(backStep);
  1371. flowAbleUrl.back(fo);
  1372. List<OperatorEntity> entityList = this.handleOperator(flowModel);
  1373. // 更新状态为退回状态
  1374. for (OperatorEntity entity : entityList) {
  1375. entity.setStatus(OperatorStateEnum.Back.getCode());
  1376. }
  1377. this.updateBatchById(entityList);
  1378. flowMsgModel.setOperatorList(entityList);
  1379. operatorUtil.addOperatorList(entityList, flowModel);
  1380. if (null != rejectDataEntity) {
  1381. taskService.update(updateWrapper);
  1382. }
  1383. }
  1384. if (!FlowNature.PresentType.equals(backType)) {
  1385. // 重新审批,删除候选人、逐级、外部
  1386. if (CollectionUtil.isNotEmpty(deleteAfterList)) {
  1387. candidatesService.deleteByCodes(taskEntity.getId(), deleteAfterList);
  1388. launchUserService.delete(taskEntity.getId(), deleteAfterList);
  1389. eventLogService.delete(taskEntity.getId(), deleteAfterList);
  1390. }
  1391. }
  1392. // 消息
  1393. flowMsgModel.setNodeList(nodeEntityList);
  1394. flowMsgModel.setFlowModel(flowModel);
  1395. flowMsgModel.setTaskEntity(taskEntity);
  1396. flowMsgModel.setNodeCode(nodeModel.getNodeId());
  1397. flowMsgModel.setBack(true);
  1398. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  1399. msgUtil.message(flowMsgModel);
  1400. //退回事件
  1401. flowModel.setEventStatus(EventEnum.Back.getStatus());
  1402. operatorUtil.addEvent(flowModel);
  1403. }
  1404. // 撤回
  1405. @DSTransactional
  1406. @Override
  1407. public void recall(String id, FlowModel flowModel) throws WorkFlowException {
  1408. RecordEntity record = flowModel.getRecordEntity();
  1409. OperatorEntity operator = flowModel.getOperatorEntity();
  1410. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  1411. TaskEntity taskEntity = flowModel.getTaskEntity();
  1412. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  1413. taskUtil.isSuspend(taskEntity);
  1414. taskUtil.isCancel(taskEntity);
  1415. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1416. if (CollectionUtil.isEmpty(nodeEntityList)) {
  1417. throw new WorkFlowException(MsgCode.WF076.get());
  1418. }
  1419. TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null);
  1420. if (null == nodeEntity) {
  1421. throw new WorkFlowException(MsgCode.WF076.get());
  1422. }
  1423. flowModel.setNodeEntity(nodeEntity);
  1424. flowModel.setRecordEntity(record);
  1425. flowModel.setFlag(FlowNature.ApprovalFlag);
  1426. flowModel.setIsException(true);
  1427. if (!buttonUtil.checkRecall(flowModel)) {
  1428. throw new WorkFlowException(MsgCode.WF077.get());
  1429. }
  1430. operatorUtil.addTask(ImmutableList.of(taskEntity.getId()));
  1431. List<String> nextCodes = flowModel.getNextCodes();
  1432. if (CollectionUtil.isNotEmpty(nextCodes)) {
  1433. // 删除外部节点
  1434. eventLogService.delete(taskEntity.getId(), nextCodes);
  1435. // 删除子流程
  1436. taskUtil.deleteSubflow(taskEntity.getId(), nextCodes);
  1437. }
  1438. // 更新记录状态
  1439. record.setStatus(FlowNature.Invalid);
  1440. recordService.updateById(record);
  1441. // 记录
  1442. FlowMethod flowMethod = new FlowMethod();
  1443. flowMethod.setType(RecordEnum.recall.getCode());
  1444. flowMethod.setFlowModel(flowModel);
  1445. operator.setHandleTime(null);
  1446. flowMethod.setOperatorEntity(operator);
  1447. recordUtil.createRecord(flowMethod);
  1448. List<String> currentNodes = new ArrayList<>();
  1449. String currentNodeCode = taskEntity.getCurrentNodeCode();
  1450. if (StringUtil.isNotBlank(currentNodeCode)) {
  1451. currentNodes = Arrays.stream(currentNodeCode.split(",")).collect(Collectors.toList());
  1452. }
  1453. if (currentNodes.contains(operator.getNodeCode())) {
  1454. // 加签 撤回的处理
  1455. if (!ObjectUtil.equals(operator.getParentId(), FlowNature.ParentId)) {
  1456. OperatorEntity parentEntity = this.getById(operator.getParentId());
  1457. if (null != parentEntity) {
  1458. if (ObjectUtil.equals(parentEntity.getCompletion(), FlowNature.Normal)) {
  1459. parentEntity.setCompletion(FlowNature.Action);
  1460. this.updateById(parentEntity);
  1461. }
  1462. }
  1463. }
  1464. // 当前节点已审批的人 撤回无需跳转
  1465. UpdateWrapper<OperatorEntity> wrapper = new UpdateWrapper<>();
  1466. wrapper.lambda().eq(OperatorEntity::getId, operator.getId())
  1467. .set(OperatorEntity::getCompletion, FlowNature.Normal)
  1468. .set(OperatorEntity::getStatus, OperatorStateEnum.Recall.getCode())
  1469. .set(OperatorEntity::getHandleStatus, null)
  1470. .set(OperatorEntity::getCreatorTime, new Date())
  1471. .set(OperatorEntity::getHandleTime, null);
  1472. this.update(wrapper);
  1473. //删除其他经办
  1474. if (ObjectUtil.equals(operator.getParentId(), FlowNature.ParentId)) {
  1475. // 依次审批
  1476. if (StringUtil.isNotBlank(operator.getHandleAll())) {
  1477. operatorUtil.deleteInTurnOperator(operator, operator.getHandleId());
  1478. }
  1479. //逐级审批
  1480. operatorUtil.deleteStepOperator(operator);
  1481. }
  1482. return;
  1483. }
  1484. // 节点记录
  1485. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  1486. nodeRecordModel.setTaskId(operator.getTaskId());
  1487. nodeRecordModel.setNodeId(operator.getNodeId());
  1488. nodeRecordModel.setNodeCode(operator.getNodeCode());
  1489. nodeRecordModel.setNodeName(operator.getNodeName());
  1490. nodeRecordModel.setNodeStatus(NodeStateEnum.recall.getCode());
  1491. nodeRecordService.update(nodeRecordModel);
  1492. // 删除该节点下一级的经办
  1493. if (CollectionUtil.isNotEmpty(nextCodes)) {
  1494. QueryWrapper<OperatorEntity> wrapper = new QueryWrapper<>();
  1495. wrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId())
  1496. .in(OperatorEntity::getNodeCode, nextCodes);
  1497. List<OperatorEntity> list = this.list(wrapper);
  1498. if (CollectionUtil.isNotEmpty(list)) {
  1499. this.remove(wrapper);
  1500. // 删除超时相关
  1501. FlowJobUtil.deleteByOperatorId(operator.getId(), redisUtil);
  1502. for (OperatorEntity operatorEntity : list) {
  1503. FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil);
  1504. }
  1505. }
  1506. //逐级信息删除
  1507. QueryWrapper<LaunchUserEntity> launchWrapper = new QueryWrapper<>();
  1508. launchWrapper.lambda().eq(LaunchUserEntity::getType, FlowNature.StepInitiation)
  1509. .eq(LaunchUserEntity::getTaskId, taskEntity.getId())
  1510. .in(LaunchUserEntity::getNodeCode, nextCodes);
  1511. launchUserService.remove(launchWrapper);
  1512. }
  1513. // 撤回跳转
  1514. JumpFo fo = new JumpFo();
  1515. fo.setInstanceId(taskEntity.getInstanceId());
  1516. List<String> executeNodes = this.getNodeCodeByGroupId(nextCodes, flowModel.getNodes());
  1517. if (CollectionUtil.isNotEmpty(executeNodes)) {
  1518. nextCodes.addAll(executeNodes);
  1519. }
  1520. fo.setSource(nextCodes);
  1521. List<String> targetList = new ArrayList<>();
  1522. targetList.add(nodeEntity.getNodeCode());
  1523. fo.setTarget(targetList);
  1524. flowAbleUrl.jump(fo);
  1525. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(taskEntity.getInstanceId());
  1526. FlowableTaskModel model = taskModelList.stream().filter(e -> e.getTaskKey().equals(operator.getNodeCode())).findFirst().orElse(null);
  1527. String nodeId = null;
  1528. if (null != model) {
  1529. nodeId = model.getTaskId();
  1530. }
  1531. // 还原经办(其它已审批、作废的经办无需还原)
  1532. UpdateWrapper<OperatorEntity> wrapper = new UpdateWrapper<>();
  1533. wrapper.lambda().eq(OperatorEntity::getId, operator.getId())
  1534. .set(OperatorEntity::getCompletion, FlowNature.Normal)
  1535. .set(OperatorEntity::getNodeId, nodeId)
  1536. .set(OperatorEntity::getStatus, OperatorStateEnum.Recall.getCode())
  1537. .set(OperatorEntity::getHandleStatus, null)
  1538. .set(OperatorEntity::getCreatorTime, new Date())
  1539. .set(OperatorEntity::getHandleTime, null);
  1540. this.update(wrapper);
  1541. // 更新节点经办的nodeId
  1542. wrapper.clear();
  1543. wrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
  1544. .eq(OperatorEntity::getNodeCode, operator.getNodeCode()).eq(OperatorEntity::getParentId, operator.getParentId())
  1545. .set(OperatorEntity::getNodeId, nodeId);
  1546. this.update(wrapper);
  1547. List<String> userIds = new ArrayList<>();
  1548. userIds.add(operator.getHandleId());
  1549. // 获取未审批过的复原
  1550. operatorUtil.recallRestore(operator, nodeId, userIds);
  1551. // 删除该节点下一级的候选人,有修改操作的
  1552. // candidatesService.deleteByCodes(taskEntity.getId(), nextCodes);
  1553. candidatesService.delete(taskEntity.getId(), nextCodes, userIds);
  1554. // 超时
  1555. List<OperatorEntity> entityList = new ArrayList<>();
  1556. OperatorEntity entity = this.getById(operator.getId());
  1557. entityList.add(entity);
  1558. operatorUtil.addOperatorList(entityList, flowModel);
  1559. // 获取当前节点信息
  1560. taskUtil.updateCurrentNode(taskModelList, flowModel.getNodes(), taskEntity);
  1561. }
  1562. // 根据组ID获取同组的执行节点
  1563. public List<String> getNodeCodeByGroupId(List<String> nextCodes, Map<String, NodeModel> nodes) {
  1564. List<String> list = new ArrayList<>();
  1565. if (CollectionUtil.isEmpty(nextCodes) || CollectionUtil.isEmpty(nodes)) {
  1566. return list;
  1567. }
  1568. for (String nextCode : nextCodes) {
  1569. NodeModel nodeModel = nodes.get(nextCode);
  1570. if (null != nodeModel && ObjectUtil.equals(nodeModel.getType(), NodeEnum.trigger.getType())) {
  1571. String groupId = nodeModel.getGroupId();
  1572. for (String key : nodes.keySet()) {
  1573. NodeModel model = nodes.get(key);
  1574. if (null != model && ObjectUtil.equals(model.getGroupId(), groupId)) {
  1575. list.add(key);
  1576. }
  1577. }
  1578. }
  1579. }
  1580. return list;
  1581. }
  1582. // 转审
  1583. @Override
  1584. public void transfer(String id, FlowModel flowModel) throws Exception {
  1585. String transferUserId = flowModel.getHandleIds();
  1586. OperatorEntity operator = operatorUtil.checkOperator(id);
  1587. boolean isProcessing = ObjectUtil.equals(operator.getIsProcessing(), FlowNature.Processing);
  1588. if (StringUtil.isBlank(transferUserId) || operator.getStatus().equals(OperatorStateEnum.Transfer.getCode())
  1589. || operator.getStatus().equals(OperatorStateEnum.AddSign.getCode())) {
  1590. throw new WorkFlowException(isProcessing ? MsgCode.WF151.get() : MsgCode.WF084.get());
  1591. }
  1592. String userId = flowModel.getUserInfo() == null ? UserProvider.getLoginUserId() : flowModel.getUserInfo().getUserId();
  1593. if (StringUtil.equals(transferUserId, userId)) {
  1594. throw new WorkFlowException(isProcessing ? MsgCode.WF149.get() : MsgCode.WF107.get());
  1595. }
  1596. if (!ObjectUtil.equals(operator.getHandleId(), userId)) {
  1597. List<DelegateEntity> delegateList = delegateService.getByToUserId(userId);
  1598. List<String> userIds = delegateList.stream().map(DelegateEntity::getUserId).distinct().collect(Collectors.toList());
  1599. if (userIds.contains(transferUserId)) {
  1600. throw new WorkFlowException(isProcessing ? MsgCode.WF150.get() : MsgCode.WF117.get());
  1601. }
  1602. }
  1603. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  1604. TaskEntity taskEntity = flowModel.getTaskEntity();
  1605. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  1606. taskUtil.isSuspend(taskEntity);
  1607. taskUtil.isCancel(taskEntity);
  1608. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1609. TemplateNodeEntity globalEntity = nodeEntityList.stream()
  1610. .filter(e -> StringUtil.equals(NodeEnum.global.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  1611. NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
  1612. // 记录
  1613. FlowMethod flowMethod = new FlowMethod();
  1614. flowMethod.setType(ObjectUtil.equals(operator.getIsProcessing(), FlowNature.NotProcessing) ? RecordEnum.transfer.getCode() : RecordEnum.transferProcessing.getCode());
  1615. flowMethod.setFlowModel(flowModel);
  1616. flowMethod.setOperatorEntity(operator);
  1617. List<String> userIds = new ArrayList<>();
  1618. userIds.add(transferUserId);
  1619. flowMethod.setUserId(String.join(",", userIds));
  1620. recordUtil.createRecord(flowMethod);
  1621. // 更新经办
  1622. UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
  1623. updateWrapper.lambda().eq(OperatorEntity::getId, operator.getId())
  1624. .set(OperatorEntity::getHandleId, transferUserId)
  1625. .set(OperatorEntity::getCreatorTime, new Date())
  1626. .set(OperatorEntity::getDraftData, null)
  1627. .set(OperatorEntity::getStatus, OperatorStateEnum.Transfer.getCode());
  1628. Boolean flowTodo = serviceUtil.getFlowTodo();
  1629. if (!flowTodo) {
  1630. updateWrapper.lambda().set(OperatorEntity::getStartHandleTime, null);
  1631. Boolean flowSign = serviceUtil.getFlowSign();
  1632. if (!flowSign) {
  1633. if (global != null && global.getHasSignFor()) {
  1634. updateWrapper.lambda().set(OperatorEntity::getSignTime, null);
  1635. }
  1636. }
  1637. }
  1638. this.update(updateWrapper);
  1639. // 消息
  1640. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1641. List<OperatorEntity> list = new ArrayList<>();
  1642. operator = this.getById(operator.getId());
  1643. list.add(operator);
  1644. flowMsgModel.setOperatorList(list);
  1645. flowMsgModel.setNodeList(nodeEntityList);
  1646. flowMsgModel.setFlowModel(flowModel);
  1647. flowMsgModel.setTaskEntity(taskEntity);
  1648. flowMsgModel.setNodeCode(operator.getNodeCode());
  1649. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  1650. flowMsgModel.setTransfer(true);
  1651. msgUtil.message(flowMsgModel);
  1652. // 删除超时相关
  1653. FlowJobUtil.deleteByOperatorId(operator.getId(), redisUtil);
  1654. operatorUtil.addOperatorList(list, flowModel);
  1655. }
  1656. // 协办, 新增经办,节点通过后,删除协办
  1657. @Override
  1658. public void assist(String id, FlowModel flowModel) throws WorkFlowException {
  1659. String handleIds = flowModel.getHandleIds();
  1660. List<String> ids = Arrays.stream(handleIds.split(",")).collect(Collectors.toList());
  1661. String userId = UserProvider.getLoginUserId();
  1662. if (ids.contains(userId)) {
  1663. throw new WorkFlowException(MsgCode.WF108.get());
  1664. }
  1665. OperatorEntity operator = operatorUtil.checkOperator(id);
  1666. if (!ObjectUtil.equals(operator.getHandleId(), userId)) {
  1667. List<DelegateEntity> delegateList = delegateService.getByToUserId(userId);
  1668. List<String> userIds = delegateList.stream().map(DelegateEntity::getUserId).distinct().collect(Collectors.toList());
  1669. List<String> filterList = userIds.stream().filter(ids::contains).collect(Collectors.toList());
  1670. if (CollectionUtil.isNotEmpty(filterList)) {
  1671. throw new WorkFlowException(MsgCode.WF118.get());
  1672. }
  1673. }
  1674. // QueryWrapper<OperatorEntity> wrapper = new QueryWrapper<>();
  1675. // wrapper.lambda().eq(OperatorEntity::getParentId, id).eq(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode());
  1676. // long count = this.count(wrapper);
  1677. // if (count > 0) {
  1678. // throw new WorkFlowException(MsgCode.WF085.get());
  1679. // }
  1680. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  1681. TaskEntity taskEntity = flowModel.getTaskEntity();
  1682. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  1683. taskUtil.isSuspend(taskEntity);
  1684. taskUtil.isCancel(taskEntity);
  1685. Map<String, NodeModel> nodes = flowModel.getNodes();
  1686. NodeModel global = nodes.get(NodeEnum.global.getType());
  1687. boolean signFor = false;
  1688. if (null != global) {
  1689. signFor = global.getHasSignFor();
  1690. }
  1691. List<UserEntity> userList = serviceUtil.getUserName(ids);
  1692. if (CollectionUtil.isNotEmpty(userList)) {
  1693. Boolean flowTodo = serviceUtil.getFlowTodo();
  1694. Boolean flowSign = serviceUtil.getFlowSign();
  1695. List<OperatorEntity> list = new ArrayList<>();
  1696. NodeModel nodeModel = nodes.get(operator.getNodeCode());
  1697. int processing = ObjectUtil.isNotEmpty(nodeModel) && ObjectUtil.equals(nodeModel.getType(), NodeEnum.processing.getType()) ? FlowNature.Processing : FlowNature.NotProcessing;
  1698. for (UserEntity user : userList) {
  1699. OperatorEntity operatorEntity = new OperatorEntity();
  1700. operatorEntity.setParentId(operator.getId());
  1701. operatorEntity.setNodeName(operator.getNodeName());
  1702. operatorEntity.setNodeCode(operator.getNodeCode());
  1703. operatorEntity.setTaskId(operator.getTaskId());
  1704. operatorEntity.setNodeId(operator.getNodeId());
  1705. operatorEntity.setEngineType(operator.getEngineType());
  1706. operatorEntity.setHandleId(user.getId());
  1707. operatorEntity.setStatus(OperatorStateEnum.Assist.getCode());
  1708. operatorEntity.setIsProcessing(processing);
  1709. operatorEntity.setCompletion(FlowNature.Normal);
  1710. if (flowTodo) {
  1711. operatorEntity.setSignTime(new Date());
  1712. operatorEntity.setStartHandleTime(new Date());
  1713. } else {
  1714. if (flowSign) {
  1715. operatorEntity.setSignTime(new Date());
  1716. } else {
  1717. if (!signFor) {
  1718. operatorEntity.setSignTime(new Date());
  1719. }
  1720. }
  1721. }
  1722. list.add(operatorEntity);
  1723. }
  1724. this.saveBatch(list);
  1725. // 记录
  1726. FlowMethod flowMethod = new FlowMethod();
  1727. flowMethod.setType(RecordEnum.assist.getCode());
  1728. flowMethod.setFlowModel(flowModel);
  1729. flowMethod.setOperatorEntity(operator);
  1730. List<String> userIds = userList.stream().map(UserEntity::getId).collect(Collectors.toList());
  1731. flowMethod.setUserId(String.join(",", userIds));
  1732. recordUtil.createRecord(flowMethod);
  1733. // 消息
  1734. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1735. flowMsgModel.setOperatorList(list);
  1736. flowMsgModel.setNodeList(flowModel.getNodeEntityList());
  1737. flowMsgModel.setFlowModel(flowModel);
  1738. flowMsgModel.setTaskEntity(taskEntity);
  1739. flowMsgModel.setNodeCode(operator.getNodeCode());
  1740. msgUtil.message(flowMsgModel);
  1741. }
  1742. }
  1743. // 协办保存,仅保存表单数据
  1744. @DSTransactional
  1745. @Override
  1746. public void assistSave(String id, FlowModel flowModel) throws WorkFlowException {
  1747. OperatorEntity operator = operatorUtil.checkOperator(id);
  1748. taskUtil.setFlowModel(operator.getTaskId(), flowModel);
  1749. TaskEntity taskEntity = flowModel.getTaskEntity();
  1750. taskUtil.checkTemplateHide(taskEntity.getTemplateId());
  1751. taskUtil.isSuspend(taskEntity);
  1752. taskUtil.isCancel(taskEntity);
  1753. Map<String, Object> formData = flowModel.getFormData();
  1754. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1755. TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null);
  1756. if (null == nodeEntity) {
  1757. throw new WorkFlowException(MsgCode.WF076.get());
  1758. }
  1759. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1760. FlowContextHolder.addChildData(operator.getTaskId(), nodeEntity.getFormId(), formData, nodeModel.getFormOperates(), true);
  1761. serviceUtil.handleFormData(taskEntity.getFlowId(), false);
  1762. }
  1763. @Override
  1764. public List<FlowBatchModel> batchFlowSelector() {
  1765. List<OperatorEntity> batchList = this.getBatchList();
  1766. List<String> taskIdList = batchList.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList());
  1767. List<TaskEntity> taskList = taskUtil.getOrderStaList(taskIdList);
  1768. Map<String, List<TaskEntity>> flowList = taskList.stream()
  1769. .collect(Collectors.groupingBy(TaskEntity::getTemplateId));
  1770. List<FlowBatchModel> batchFlowList = new ArrayList<>();
  1771. for (String key : flowList.keySet()) {
  1772. List<TaskEntity> flowTaskList = flowList.get(key);
  1773. if (CollectionUtil.isNotEmpty(flowTaskList)) {
  1774. List<String> taskIds = flowTaskList.stream().map(TaskEntity::getId).collect(Collectors.toList());
  1775. List<String> flowIds = flowTaskList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList());
  1776. List<TemplateJsonEntity> jsonList = templateJsonService.listByIds(flowIds);
  1777. String fullName = flowTaskList.stream().map(TaskEntity::getFlowName).distinct().collect(Collectors.joining(","));
  1778. String flowId = jsonList.stream().map(TemplateJsonEntity::getTemplateId).distinct().collect(Collectors.joining(","));
  1779. long count = batchList.stream().filter(e -> taskIds.contains(e.getTaskId())).count();
  1780. FlowBatchModel model = new FlowBatchModel();
  1781. model.setNum(count);
  1782. model.setId(flowId);
  1783. model.setFullName(fullName + "(" + count + ")");
  1784. batchFlowList.add(model);
  1785. }
  1786. }
  1787. batchFlowList = batchFlowList.stream().sorted(Comparator.comparing(FlowBatchModel::getNum).reversed()).collect(Collectors.toList());
  1788. return batchFlowList;
  1789. }
  1790. public List<OperatorEntity> getBatchList() {
  1791. String userId = UserProvider.getLoginUserId();
  1792. List<String> userList = delegateService.getByToUserId(userId).stream()
  1793. .map(DelegateEntity::getCreatorUserId).collect(Collectors.toList());
  1794. userList.add(userId);
  1795. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1796. queryWrapper.lambda().in(OperatorEntity::getHandleId, userList)
  1797. .eq(OperatorEntity::getCompletion, FlowNature.Normal)
  1798. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode())
  1799. .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode())
  1800. .isNotNull(OperatorEntity::getSignTime).isNotNull(OperatorEntity::getStartHandleTime)
  1801. .isNull(OperatorEntity::getHandleStatus)
  1802. .select(OperatorEntity::getTaskId);
  1803. return this.list(queryWrapper);
  1804. }
  1805. @Override
  1806. public List<FlowBatchModel> batchVersionSelector(String templateId) {
  1807. List<String> taskIdList = this.getBatchList().stream().map(OperatorEntity::getTaskId).collect(Collectors.toList());
  1808. List<TaskEntity> taskList = taskUtil.getOrderStaList(taskIdList);
  1809. List<String> flowIdList = taskList.stream().filter(e -> e.getTemplateId().equals(templateId))
  1810. .map(TaskEntity::getFlowId).collect(Collectors.toList());
  1811. List<FlowBatchModel> batchFlowList = new ArrayList<>();
  1812. if (CollectionUtil.isEmpty(flowIdList)) {
  1813. return batchFlowList;
  1814. }
  1815. List<TemplateJsonEntity> jsonList = templateJsonService.listByIds(flowIdList);
  1816. List<TemplateEntity> templateList = templateService.listByIds(jsonList.stream().map(TemplateJsonEntity::getTemplateId).distinct().collect(Collectors.toList()));
  1817. for (TemplateJsonEntity jsonEntity : jsonList) {
  1818. FlowBatchModel model = JsonUtil.getJsonToBean(jsonEntity, FlowBatchModel.class);
  1819. TemplateEntity template = templateList.stream().filter(e -> e.getId().equals(jsonEntity.getTemplateId())).findFirst().orElse(null);
  1820. if (null != template) {
  1821. model.setFullName(template.getFullName() + "(v" + jsonEntity.getVersion() + ")");
  1822. batchFlowList.add(model);
  1823. }
  1824. }
  1825. return batchFlowList;
  1826. }
  1827. @Override
  1828. public List<FlowBatchModel> batchNodeSelector(String flowId) {
  1829. List<TemplateNodeEntity> nodeList = templateNodeService.getList(flowId);
  1830. List<FlowBatchModel> list = new ArrayList<>();
  1831. for (TemplateNodeEntity nodeEntity : nodeList) {
  1832. if (NodeEnum.approver.getType().equals(nodeEntity.getNodeType())) {
  1833. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1834. FlowBatchModel model = new FlowBatchModel();
  1835. model.setId(nodeModel.getNodeId());
  1836. model.setFullName(nodeModel.getNodeName());
  1837. list.add(model);
  1838. }
  1839. }
  1840. return list;
  1841. }
  1842. @Override
  1843. public Map<String, Object> batchNode(FlowModel flowModel) throws WorkFlowException {
  1844. String flowId = flowModel.getFlowId();
  1845. String nodeCode = flowModel.getNodeCode();
  1846. TemplateJsonInfoVO jsonInfoVO = templateJsonService.getInfoVo(flowId);
  1847. Map<String, Map<String, Object>> flowNodes = jsonInfoVO.getFlowNodes();
  1848. return flowNodes.get(nodeCode);
  1849. }
  1850. // 批量获取候选人,不允许条件 1.线上存在条件 2.下一级节点存在候选人(20240711 第二项去除)
  1851. @Override
  1852. public CandidateCheckVo batchCandidates(String flowId, String operatorId, Integer batchType) throws WorkFlowException {
  1853. TemplateJsonEntity jsonEntity = templateJsonService.getInfo(flowId);
  1854. OperatorEntity operator = this.getById(operatorId);
  1855. if (null == operator) {
  1856. throw new WorkFlowException(MsgCode.FA001.get());
  1857. }
  1858. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(flowId);
  1859. Map<String, NodeModel> nodes = new HashMap<>();
  1860. for (TemplateNodeEntity nodeEntity : nodeEntityList) {
  1861. nodes.put(nodeEntity.getNodeCode(), JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
  1862. }
  1863. NodeModel nodeModel = nodes.get(operator.getNodeCode());
  1864. if (taskUtil.checkBranch(nodeModel)) {
  1865. throw new WorkFlowException("下一节点为选择分支无法批量审批");
  1866. }
  1867. NodeModel global = nodes.get(NodeEnum.global.getType());
  1868. if (ObjectUtil.equals(batchType, 1) && !global.getHasContinueAfterReject()) {
  1869. return new CandidateCheckVo();
  1870. }
  1871. // 获取节点的出线
  1872. OutgoingFlowsFo flowsFo = new OutgoingFlowsFo();
  1873. flowsFo.setDeploymentId(jsonEntity.getFlowableId());
  1874. flowsFo.setTaskKey(operator.getNodeCode());
  1875. List<String> outgoingFlows = flowAbleUrl.getOutgoingFlows(flowsFo);
  1876. // 线上存在条件
  1877. for (String outgoingFlow : outgoingFlows) {
  1878. NodeModel flowNode = nodes.get(outgoingFlow);
  1879. if (flowNode != null && CollectionUtil.isNotEmpty(flowNode.getConditions())) {
  1880. throw new WorkFlowException(MsgCode.WF119.get());
  1881. }
  1882. }
  1883. CandidateCheckFo fo = new CandidateCheckFo();
  1884. fo.setFlowId(flowId);
  1885. fo.setHandleStatus(ObjectUtil.equals(batchType, 1) ? FlowNature.RejectCompletion : FlowNature.AuditCompletion);
  1886. return taskService.checkCandidates(operatorId, fo);
  1887. }
  1888. @DSTransactional
  1889. @Override
  1890. public void batch(FlowModel flowModel) throws Exception {
  1891. Integer batchType = flowModel.getBatchType();
  1892. List<String> ids = new ArrayList<>();
  1893. List<String> idList = new ArrayList<>();
  1894. operatorUtil.checkBatch(flowModel.getIds(), idList, false);
  1895. operatorUtil.checkBatchRevoke(idList, ids, batchType);
  1896. int count = 0;
  1897. List<TaskEntity> taskList = new ArrayList<>();
  1898. for (String id : ids) {
  1899. operatorUtil.checkOperatorPermission(id);
  1900. OperatorEntity operator = operatorUtil.checkOperator(id);
  1901. TaskEntity taskEntity = taskService.getInfo(operator.getTaskId());
  1902. taskList.add(taskEntity);
  1903. FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  1904. model.setId(id);
  1905. switch (batchType) {
  1906. case 0:
  1907. case 1:
  1908. model.setHandleStatus(Objects.equals(1, batchType) ? FlowNature.RejectCompletion : FlowNature.AuditCompletion);
  1909. try {
  1910. this.audit(id, model);
  1911. } catch (Exception e) {
  1912. if (e instanceof WorkFlowException) {
  1913. // 当选择多条数据且下个审批节点出现异常时,跳过异常节点能通过的即审批通过,异常的不处理
  1914. WorkFlowException workFlowException = (WorkFlowException) e;
  1915. if (ObjectUtil.equals(workFlowException.getCode(), 200)) {
  1916. count++;
  1917. break;
  1918. }
  1919. }
  1920. operatorUtil.compensate(taskEntity);
  1921. throw e;
  1922. }
  1923. break;
  1924. case 2:
  1925. this.transfer(id, model);
  1926. break;
  1927. case 3:
  1928. try {
  1929. this.back(id, model);
  1930. } catch (Exception e) {
  1931. operatorUtil.compensate(taskEntity);
  1932. throw e;
  1933. }
  1934. }
  1935. }
  1936. // 当选择的数据都是异常时,提示:“下一节点审批异常,无法批量审批”
  1937. if (ids.size() == count) {
  1938. flowModel.setTaskList(taskList);
  1939. throw new WorkFlowException(MsgCode.WF120.get());
  1940. }
  1941. }
  1942. @Override
  1943. public FlowWorkListVO flowWork(String fromId) {
  1944. FlowWorkListVO vo = new FlowWorkListVO();
  1945. List<FlowWorkModel> waitList = new ArrayList<>();
  1946. // 经办
  1947. QueryWrapper<OperatorEntity> operatorWrapper = new QueryWrapper<>();
  1948. operatorWrapper.lambda().eq(OperatorEntity::getHandleId, fromId).eq(OperatorEntity::getCompletion, FlowNature.Normal)
  1949. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode());
  1950. List<OperatorEntity> operatorList = this.list(operatorWrapper);
  1951. if (CollectionUtil.isNotEmpty(operatorList)) {
  1952. List<String> taskIds = operatorList.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList());
  1953. List<TaskEntity> taskList = taskUtil.getOrderStaList(taskIds);
  1954. List<TemplateEntity> templateList = templateService.getListOfHidden(taskList.stream().map(TaskEntity::getTemplateId).collect(Collectors.toList()));
  1955. for (OperatorEntity operator : operatorList) {
  1956. FlowWorkModel workModel = JsonUtil.getJsonToBean(operator, FlowWorkModel.class);
  1957. TaskEntity taskEntity = taskList.stream().filter(e -> e.getId().equals(operator.getTaskId())).findFirst().orElse(null);
  1958. if (null != taskEntity) {
  1959. workModel.setFullName(taskEntity.getFullName());
  1960. TemplateEntity template = templateList.stream()
  1961. .filter(e -> e.getId().equals(taskEntity.getTemplateId())).findFirst().orElse(null);
  1962. if (null != template) {
  1963. workModel.setIcon(template.getIcon());
  1964. waitList.add(workModel);
  1965. }
  1966. }
  1967. }
  1968. }
  1969. vo.setFlowTask(waitList);
  1970. // 流程
  1971. List<FlowWorkModel> flowList = new ArrayList<>();
  1972. List<TemplateNodeEntity> nodeList = templateNodeService.getListLikeUserId(fromId);
  1973. if (CollectionUtil.isNotEmpty(nodeList)) {
  1974. List<String> flowIds = nodeList.stream().map(TemplateNodeEntity::getFlowId).collect(Collectors.toList());
  1975. List<TemplateJsonEntity> versionList = templateJsonService.listByIds(flowIds);
  1976. List<TemplateEntity> templateList = templateService.getListByFlowIds(flowIds);
  1977. for (TemplateJsonEntity jsonEntity : versionList) {
  1978. if (!ObjectUtil.equals(jsonEntity.getState(), 1)) {
  1979. continue;
  1980. }
  1981. FlowWorkModel workModel = JsonUtil.getJsonToBean(jsonEntity, FlowWorkModel.class);
  1982. for (TemplateNodeEntity nodeEntity : nodeList) {
  1983. if (nodeEntity.getNodeJson().contains(fromId)) {
  1984. TemplateEntity template = templateList.stream()
  1985. .filter(e -> e.getId().equals(jsonEntity.getTemplateId())).findFirst().orElse(null);
  1986. if (null != template) {
  1987. workModel.setIcon(template.getIcon());
  1988. workModel.setFullName(template.getFullName() + "(V" + jsonEntity.getVersion() + ")");
  1989. flowList.add(workModel);
  1990. break;
  1991. }
  1992. }
  1993. }
  1994. }
  1995. }
  1996. vo.setFlow(flowList);
  1997. return vo;
  1998. }
  1999. @Override
  2000. public boolean flowWork(WorkHandoverModel workHandoverModel) {
  2001. String fromId = workHandoverModel.getFromId();
  2002. String toId = workHandoverModel.getHandoverUser();
  2003. List<String> waitList = workHandoverModel.getFlowTaskList();
  2004. if (!waitList.isEmpty()) {
  2005. // 更新经办
  2006. QueryWrapper<OperatorEntity> operator = new QueryWrapper<>();
  2007. operator.lambda().in(OperatorEntity::getId, waitList)
  2008. .eq(OperatorEntity::getHandleId, fromId);
  2009. List<OperatorEntity> operatorList = this.list(operator);
  2010. if (CollectionUtil.isNotEmpty(operatorList)) {
  2011. for (OperatorEntity entity : operatorList) {
  2012. entity.setHandleId(toId);
  2013. String handleAll = entity.getHandleAll();
  2014. if (StringUtil.isNotBlank(handleAll)) {
  2015. String str = handleAll.replaceAll(fromId, toId);
  2016. entity.setHandleAll(str);
  2017. }
  2018. }
  2019. this.updateBatchById(operatorList);
  2020. }
  2021. // 更新候选人
  2022. UpdateWrapper<CandidatesEntity> candidate = new UpdateWrapper<>();
  2023. candidate.lambda().in(CandidatesEntity::getOperatorId, waitList)
  2024. .eq(CandidatesEntity::getHandleId, fromId)
  2025. .set(CandidatesEntity::getHandleId, toId);
  2026. candidatesService.update(candidate);
  2027. }
  2028. // 流程
  2029. List<String> flowList = workHandoverModel.getFlowList();
  2030. if (!flowList.isEmpty()) {
  2031. UserEntity toUser = serviceUtil.getUserInfo(toId);
  2032. String toUserName = toUser != null ? toUser.getRealName() + "/" + toUser.getAccount() : "";
  2033. UserEntity fromUser = serviceUtil.getUserInfo(fromId);
  2034. String fromUserName = fromUser != null ? fromUser.getRealName() + "/" + fromUser.getAccount() : "";
  2035. List<TemplateJsonEntity> versionList = templateJsonService.listByIds(flowList);
  2036. if (CollectionUtil.isNotEmpty(versionList)) {
  2037. List<TemplateNodeEntity> updateList = new ArrayList<>();
  2038. for (TemplateJsonEntity jsonEntity : versionList) {
  2039. List<TemplateNodeEntity> nodeList = templateNodeService.getList(jsonEntity.getId());
  2040. for (TemplateNodeEntity nodeEntity : nodeList) {
  2041. if (nodeEntity.getNodeJson().contains(fromId)) {
  2042. String str = nodeEntity.getNodeJson().replaceAll(fromId, toId).replaceAll(fromUserName, toUserName);
  2043. nodeEntity.setNodeJson(str);
  2044. updateList.add(nodeEntity);
  2045. }
  2046. }
  2047. }
  2048. if (CollectionUtil.isNotEmpty(updateList)) {
  2049. templateNodeService.updateBatchById(updateList);
  2050. }
  2051. }
  2052. }
  2053. return true;
  2054. }
  2055. }