OperatorUtil.java 111 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361
  1. package jnpf.flowable.util;
  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.google.common.collect.ImmutableList;
  8. import jnpf.base.ActionResult;
  9. import jnpf.base.Pagination;
  10. import jnpf.base.UserInfo;
  11. import jnpf.constant.JnpfConst;
  12. import jnpf.base.model.flow.FlowStateModel;
  13. import jnpf.constant.MsgCode;
  14. import jnpf.exception.WorkFlowException;
  15. import jnpf.flowable.entity.*;
  16. import jnpf.flowable.enums.*;
  17. import jnpf.flowable.job.FlowJobUtil;
  18. import jnpf.flowable.model.candidates.CandidateUserVo;
  19. import jnpf.flowable.model.flowable.*;
  20. import jnpf.flowable.model.message.FlowMsgModel;
  21. import jnpf.flowable.model.operator.AddSignModel;
  22. import jnpf.flowable.model.record.NodeRecordModel;
  23. import jnpf.flowable.model.task.FlowMethod;
  24. import jnpf.flowable.model.task.FlowModel;
  25. import jnpf.flowable.model.task.SubParameterModel;
  26. import jnpf.flowable.model.templatenode.FlowErrorModel;
  27. import jnpf.flowable.model.templatenode.nodejson.*;
  28. import jnpf.flowable.model.trigger.ExecuteAsyncModel;
  29. import jnpf.flowable.model.trigger.ExecuteModel;
  30. import jnpf.flowable.model.util.*;
  31. import jnpf.flowable.service.*;
  32. import jnpf.permission.entity.UserEntity;
  33. import jnpf.util.*;
  34. import lombok.extern.slf4j.Slf4j;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.stereotype.Component;
  37. import java.util.*;
  38. import java.util.stream.Collectors;
  39. /**
  40. * 类的描述
  41. *
  42. * @author JNPF@YinMai Info. Co., Ltd
  43. * @version 5.0.x
  44. * @since 2024/4/24 20:38
  45. */
  46. @Slf4j
  47. @Component
  48. public class OperatorUtil {
  49. @Autowired
  50. private OperatorService operatorService;
  51. @Autowired
  52. private TaskUtil taskUtil;
  53. @Autowired
  54. private ConditionService conditionService;
  55. @Autowired
  56. private ServiceUtil serviceUtil;
  57. @Autowired
  58. private TaskService taskService;
  59. @Autowired
  60. private FlowAbleUrl flowAbleUrl;
  61. @Autowired
  62. private RejectDataService rejectDataService;
  63. @Autowired
  64. private RecordUtil recordUtil;
  65. @Autowired
  66. private MsgUtil msgUtil;
  67. @Autowired
  68. private TemplateNodeService templateNodeService;
  69. @Autowired
  70. private CirculateService circulateService;
  71. @Autowired
  72. private TemplateService templateService;
  73. @Autowired
  74. private TemplateJsonService templateJsonService;
  75. @Autowired
  76. private RedisUtil redisUtil;
  77. @Autowired
  78. private NodeRecordService nodeRecordService;
  79. @Autowired
  80. private CirculateUtil circulateUtil;
  81. @Autowired
  82. private TaskLineService taskLineService;
  83. @Autowired
  84. private RevokeService revokeService;
  85. @Autowired
  86. private TriggerUtil triggerUtil;
  87. @Autowired
  88. private DelegateService delegateService;
  89. @Autowired
  90. private SubtaskDataService subtaskDataService;
  91. @Autowired
  92. private EventLogService eventLogService;
  93. @Autowired
  94. private LaunchUserService launchUserService;
  95. // 组建FlowMethod
  96. public FlowMethod getFlowMethod(FlowMethod flowMethod) {
  97. FlowModel flowModel = flowMethod.getFlowModel();
  98. String nodeCode = flowMethod.getNodeCode();
  99. Map<String, NodeModel> nodes = flowMethod.getNodes();
  100. FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  101. model.setHandleOpinion("系统审批");
  102. model.setSignImg(null);
  103. model.setFileList(null);
  104. model.setHandleStatus(FlowNature.AuditCompletion);
  105. model.setTaskEntity(flowMethod.getTaskEntity());
  106. model.setFlowableTaskId(flowMethod.getFlowableTaskId());
  107. FlowMethod method = new FlowMethod();
  108. method.setFlowModel(model);
  109. NodeModel nodeModel = nodes.get(nodeCode);
  110. method.setNodeModel(nodeModel);
  111. method.setNodeCode(nodeCode);
  112. return method;
  113. }
  114. // 处理撤销的经办
  115. public void handleRevokeOperator(FlowMethod flowMethod) throws Exception {
  116. FlowModel flowModel = flowMethod.getFlowModel();
  117. String taskId = flowMethod.getTaskId();
  118. TaskEntity taskEntity = flowMethod.getTaskEntity();
  119. String instanceId = taskEntity.getInstanceId();
  120. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  121. Map<String, NodeModel> nodes = flowModel.getNodes();
  122. NodeModel global = nodes.get(NodeEnum.global.getType());
  123. List<OperatorEntity> operatorEntities = new ArrayList<>();
  124. // 生成经办,获取之前同意的经办,再次生成经办
  125. List<OperatorEntity> operatorList = this.getList(taskId)
  126. .stream().filter(e -> ObjectUtil.equals(e.getHandleStatus(), FlowNature.AuditCompletion)
  127. && !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.Futility.getCode())).collect(Collectors.toList());
  128. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
  129. // 原来的当前节点
  130. List<String> srcCurrentList = StringUtil.isNotEmpty(taskEntity.getCurrentNodeCode()) ?
  131. Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList()) : new ArrayList<>();
  132. taskUtil.updateCurrentNode(taskModelList, nodes, taskEntity);
  133. List<NodeRecordEntity> nodeRecordList = nodeRecordService.getList(taskId);
  134. nodeRecordList = nodeRecordList.stream()
  135. .sorted(Comparator.comparing(NodeRecordEntity::getCreatorTime).reversed()).collect(Collectors.toList());
  136. for (FlowableTaskModel flowableTaskModel : taskModelList) {
  137. // 当前节点已存在,跳过
  138. if (CollectionUtil.isNotEmpty(srcCurrentList) && srcCurrentList.contains(flowableTaskModel.getTaskKey())) {
  139. continue;
  140. }
  141. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  142. .filter(e -> ObjectUtil.equals(e.getNodeCode(), flowableTaskModel.getTaskKey())).findFirst().orElse(null);
  143. if (null == nodeEntity) {
  144. continue;
  145. }
  146. // 处理子流程、办理节点、外部节点
  147. List<String> typeList = ImmutableList.of(NodeEnum.subFlow.getType(), NodeEnum.processing.getType(), NodeEnum.outside.getType());
  148. if (typeList.contains(nodeEntity.getNodeType())) {
  149. // FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  150. // model.setTaskEntity(taskEntity);
  151. // model.setFlowableTaskId(flowableTaskModel.getTaskId());
  152. // this.handleSubFlow(nodeEntity, model);
  153. CompleteFo completeFo = new CompleteFo();
  154. completeFo.setTaskId(flowableTaskModel.getTaskId());
  155. flowAbleUrl.complete(completeFo);
  156. this.handleRevokeOperator(flowMethod);
  157. continue;
  158. }
  159. String nodeCode = flowableTaskModel.getTaskKey();
  160. String nodeId = flowableTaskModel.getTaskId();
  161. flowMethod.setFlowableTaskId(flowableTaskModel.getTaskId());
  162. flowMethod.setNodes(nodes);
  163. flowMethod.setNodeCode(nodeCode);
  164. // 判断拒绝
  165. NodeRecordEntity nodeRecord = nodeRecordList.stream()
  166. .filter(e -> ObjectUtil.equals(e.getNodeCode(), flowableTaskModel.getTaskKey())).findFirst().orElse(new NodeRecordEntity());
  167. if (ObjectUtil.equals(nodeRecord.getNodeStatus(), NodeStateEnum.reject.getCode())) {
  168. // 系统通过
  169. FlowMethod method = this.getFlowMethod(flowMethod);
  170. this.autoAudit(method);
  171. continue;
  172. }
  173. List<OperatorEntity> list = operatorList.stream()
  174. .filter(e -> ObjectUtil.equals(e.getNodeCode(), nodeCode)).collect(Collectors.toList());
  175. if (CollectionUtil.isNotEmpty(list)) {
  176. if ((list.size() == 1 && ObjectUtil.equals(list.get(0).getHandleId(), FlowNature.SYSTEM_CODE))) {
  177. // 系统通过
  178. FlowMethod method = this.getFlowMethod(flowMethod);
  179. this.autoAudit(method);
  180. continue;
  181. }
  182. for (OperatorEntity operator : list) {
  183. OperatorEntity operatorEntity = this.createOperator(operator, OperatorStateEnum.Revoke.getCode(), operator.getHandleId(), global);
  184. operatorEntity.setTaskId(taskEntity.getId());
  185. operatorEntity.setNodeId(nodeId);
  186. operatorEntity.setParentId(FlowNature.ParentId);
  187. operatorEntities.add(operatorEntity);
  188. }
  189. }
  190. }
  191. if (CollectionUtil.isNotEmpty(operatorEntities)) {
  192. operatorService.saveBatch(operatorEntities);
  193. addOperatorList(operatorEntities, flowModel);
  194. // 消息
  195. FlowMsgModel flowMsgModel = new FlowMsgModel();
  196. flowMsgModel.setNodeList(nodeEntityList);
  197. flowMsgModel.setTaskEntity(taskEntity);
  198. flowMsgModel.setFlowModel(flowModel);
  199. flowMsgModel.setOperatorList(operatorEntities);
  200. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  201. msgUtil.message(flowMsgModel);
  202. }
  203. }
  204. public List<OperatorEntity> getList(String taskId) {
  205. return operatorService.getList(taskId);
  206. }
  207. // 归档 最后节点审批人:表示最后节点的审批人才有权限查看该文档(取最后节点实际参与审批的人,不包含加签和转审人员);
  208. public List<String> getListOfLast(String taskId) {
  209. List<String> resList = new ArrayList<>();
  210. List<Integer> status = ImmutableList.of(OperatorStateEnum.AddSign.getCode(), OperatorStateEnum.Transfer.getCode(),
  211. OperatorStateEnum.Assist.getCode(), OperatorStateEnum.Futility.getCode());
  212. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  213. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId)
  214. .ne(OperatorEntity::getHandleId, FlowNature.SYSTEM_CODE)
  215. .notIn(OperatorEntity::getStatus, status)
  216. .isNotNull(OperatorEntity::getHandleStatus).orderByDesc(OperatorEntity::getHandleTime);
  217. List<OperatorEntity> list = operatorService.list(queryWrapper);
  218. if (CollectionUtil.isNotEmpty(list)) {
  219. // 获取符合条件的最后一个审批人,通过该审批人获取节点
  220. OperatorEntity operator = list.get(0);
  221. List<OperatorEntity> operatorList = list.stream()
  222. .filter(e -> ObjectUtil.equals(operator.getNodeId(), e.getNodeId()))
  223. .sorted(Comparator.comparing(OperatorEntity::getHandleTime).reversed()).collect(Collectors.toList());
  224. if (CollectionUtil.isNotEmpty(operatorList)) {
  225. List<String> handleIds = operatorList.stream().map(OperatorEntity::getHandleId).distinct().collect(Collectors.toList());
  226. resList.addAll(handleIds);
  227. }
  228. List<CirculateEntity> circulateList = circulateService.getList(taskId);
  229. if (CollectionUtil.isNotEmpty(circulateList)) {
  230. List<String> userIds = circulateList.stream().filter(e -> ObjectUtil.equals(operator.getNodeId(), e.getNodeId()))
  231. .map(CirculateEntity::getUserId).collect(Collectors.toList());
  232. resList.addAll(userIds);
  233. }
  234. }
  235. return resList.stream().distinct().collect(Collectors.toList());
  236. }
  237. // 归档 当前流程所有人:包含流程的发起人、所有节点的审批人及抄送人员,不包含加签和转审人员;(审批人读取参与审批的人)
  238. public List<String> getListOfFile(String taskId) {
  239. List<String> resList = new ArrayList<>();
  240. List<OperatorEntity> operatorList = operatorService.getList(taskId);
  241. if (CollectionUtil.isNotEmpty(operatorList)) {
  242. List<Integer> status = ImmutableList.of(OperatorStateEnum.AddSign.getCode(), OperatorStateEnum.Transfer.getCode(),
  243. OperatorStateEnum.Assist.getCode(), OperatorStateEnum.Futility.getCode());
  244. List<OperatorEntity> list = operatorList.stream()
  245. .filter(e -> !status.contains(e.getStatus()) && e.getHandleStatus() != null)
  246. .collect(Collectors.toList());
  247. resList.addAll(list.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList()));
  248. }
  249. List<CirculateEntity> circulateList = circulateService.getList(taskId);
  250. if (CollectionUtil.isNotEmpty(circulateList)) {
  251. resList.addAll(circulateList.stream().map(CirculateEntity::getUserId).collect(Collectors.toList()));
  252. }
  253. return resList.stream().distinct().collect(Collectors.toList());
  254. }
  255. // 校验经办
  256. public OperatorEntity checkOperator(String id) throws WorkFlowException {
  257. OperatorEntity operator = operatorService.getInfo(id);
  258. if (null == operator) {
  259. throw new WorkFlowException(MsgCode.FA001.get());
  260. }
  261. if (null == operator.getSignTime()) {
  262. throw new WorkFlowException(MsgCode.WF087.get());
  263. }
  264. if (null == operator.getStartHandleTime()) {
  265. throw new WorkFlowException(MsgCode.WF088.get());
  266. }
  267. if (null != operator.getHandleStatus()) {
  268. throw new WorkFlowException(MsgCode.WF031.get());
  269. }
  270. return operator;
  271. }
  272. //验证流程权限
  273. public void checkOperatorPermission(String id) throws WorkFlowException {
  274. OperatorEntity operator = operatorService.getInfo(id);
  275. TaskEntity task = taskService.getInfo(operator.getTaskId());
  276. List<String> delegateList = delegateService.getToUser(operator.getHandleId(), task.getFlowId());
  277. delegateList.add(UserProvider.getLoginUserId());
  278. if (!delegateList.contains(operator.getHandleId())) {
  279. throw new WorkFlowException(MsgCode.AD104.get());
  280. }
  281. }
  282. // 创建经办
  283. public List<OperatorEntity> createOperator(FlowMethod flowMethod) {
  284. List<String> userIds = flowMethod.getUserIds();
  285. NodeModel nodeModel = flowMethod.getNodeModel();
  286. FlowModel flowModel = flowMethod.getFlowModel();
  287. List<OperatorEntity> entityList = new ArrayList<>();
  288. if (userIds.isEmpty()) {
  289. return entityList;
  290. }
  291. TaskEntity taskEntity = flowModel.getTaskEntity();
  292. String flowableTaskId = flowModel.getFlowableTaskId();
  293. NodeModel global = flowModel.getNodes().get(NodeEnum.global.getType());
  294. // 是否签收
  295. Boolean signFor = global.getHasSignFor();
  296. flowMethod.setTaskEntity(taskEntity);
  297. flowMethod.setSignFor(signFor);
  298. flowMethod.setFlowableTaskId(flowableTaskId);
  299. if (nodeModel.getCounterSign().equals(FlowNature.ImproperApprover)) {
  300. List<String> list = taskUtil.improperSort(userIds, nodeModel);
  301. if (CollectionUtil.isNotEmpty(list)) {
  302. OperatorEntity entity = this.createOperatorEntity(flowMethod);
  303. entity.setHandleId(list.get(0));
  304. entity.setHandleAll(String.join(",", list));
  305. entity.setParentId(FlowNature.ParentId);
  306. entityList.add(entity);
  307. }
  308. } else {
  309. // 或签、会签
  310. for (String userId : userIds) {
  311. OperatorEntity entity = this.createOperatorEntity(flowMethod);
  312. entity.setHandleId(userId);
  313. entity.setParentId(FlowNature.ParentId);
  314. entityList.add(entity);
  315. }
  316. }
  317. if (CollectionUtil.isNotEmpty(entityList)) {
  318. operatorService.saveBatch(entityList);
  319. }
  320. return entityList;
  321. }
  322. public OperatorEntity createOperatorEntity(FlowMethod flowMethod) {
  323. TaskEntity taskEntity = flowMethod.getTaskEntity();
  324. TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
  325. NodeModel nodeModel = flowMethod.getNodeModel();
  326. Boolean signFor = flowMethod.getSignFor();
  327. String flowableTaskId = flowMethod.getFlowableTaskId();
  328. OperatorEntity entity = new OperatorEntity();
  329. entity.setId(RandomUtil.uuId());
  330. entity.setIsProcessing(ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.processing.getType()) ? FlowNature.Processing : FlowNature.NotProcessing);
  331. entity.setNodeId(flowableTaskId);
  332. entity.setNodeName(nodeModel.getNodeName());
  333. entity.setNodeCode(nodeEntity.getNodeCode());
  334. entity.setStatus(OperatorStateEnum.Runing.getCode());
  335. Boolean flowTodo = serviceUtil.getFlowTodo();
  336. if (flowTodo) {
  337. entity.setSignTime(new Date());
  338. entity.setStartHandleTime(new Date());
  339. } else {
  340. Boolean flowSign = serviceUtil.getFlowSign();
  341. if (flowSign) {
  342. entity.setSignTime(new Date());
  343. } else {
  344. if (!signFor) {
  345. entity.setSignTime(new Date());
  346. }
  347. }
  348. }
  349. entity.setCompletion(FlowNature.Normal);
  350. entity.setTaskId(taskEntity.getId());
  351. entity.setEngineType(taskEntity.getEngineType());
  352. return entity;
  353. }
  354. // 判断节点的审批结果
  355. public boolean checkAudit(FlowMethod flowMethod) throws WorkFlowException {
  356. OperatorEntity operator = flowMethod.getOperatorEntity();
  357. NodeModel nodeModel = flowMethod.getNodeModel();
  358. NodeModel global = flowMethod.getNodes().get(NodeEnum.global.getType());
  359. Integer handleStatus = flowMethod.getHandleStatus();
  360. Boolean isCandidates = flowMethod.getIsCandidates();
  361. boolean result = false;
  362. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  363. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
  364. .eq(OperatorEntity::getNodeCode, operator.getNodeCode())
  365. .eq(OperatorEntity::getParentId, FlowNature.ParentId)
  366. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode());
  367. List<OperatorEntity> list = operatorService.list(queryWrapper);
  368. Boolean auditFlag = flowMethod.getAuditFlag();
  369. if (auditFlag) {
  370. for (OperatorEntity entity : list) {
  371. if (ObjectUtil.equals(entity.getId(), operator.getId())) {
  372. entity.setHandleStatus(operator.getHandleStatus());
  373. break;
  374. }
  375. }
  376. }
  377. List<LaunchUserEntity> stepUserList = launchUserService.getTaskList(operator.getTaskId());
  378. LaunchUserEntity launchUser = stepUserList.stream().filter(e -> e.getNodeCode().equals(operator.getNodeCode())).findFirst().orElse(null);
  379. boolean isStep = Objects.equals(OperatorEnum.Step.getCode(), nodeModel.getAssigneeType());
  380. Integer counterSign = isStep ? FlowNature.FixedApprover : nodeModel.getCounterSign();
  381. if (FlowNature.FixedApprover.equals(counterSign)) {
  382. // 或签,一人同意或拒绝
  383. if (!isCandidates) {
  384. result = checkStep(list, nodeModel, launchUser);
  385. } else {
  386. result = operator.getHandleStatus().equals(handleStatus);
  387. }
  388. } else if (FlowNature.FixedJointlyApprover.equals(counterSign)) {
  389. // 会签
  390. long numAudit;
  391. long numReject;
  392. if (auditFlag) {
  393. numAudit = list.stream().filter(e -> FlowNature.AuditCompletion.equals(e.getHandleStatus())).count();
  394. numReject = list.stream().filter(e -> FlowNature.RejectCompletion.equals(e.getHandleStatus())).count();
  395. } else {
  396. numAudit = list.stream()
  397. .filter(e -> FlowNature.AuditCompletion.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
  398. numReject = list.stream()
  399. .filter(e -> FlowNature.RejectCompletion.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
  400. }
  401. CounterSignConfig config = nodeModel.getCounterSignConfig();
  402. // 判断计算方式,延后计算(在所有审批人审批完成后进行规则判断)
  403. int type = config.getCalculateType();
  404. if (ObjectUtil.equals(type, FlowNature.CALCULATE_TYPE_DELAY)) {
  405. int auditCount = (int) list.stream().filter(e -> null != e.getHandleStatus()).count();
  406. if (list.size() != auditCount) {
  407. return false;
  408. }
  409. }
  410. int auditNum = config.getAuditNum();
  411. int auditRatio = config.getAuditRatio();
  412. int rejectNum = config.getRejectNum();
  413. int rejectRatio = config.getRejectRatio();
  414. if (config.getAuditType().equals(FlowNature.Percent)) {
  415. // 百分比
  416. int res = (int) (numAudit * 100 / list.size());
  417. result = res >= auditRatio;
  418. } else if (config.getAuditType().equals(FlowNature.Number)) {
  419. // 人数
  420. result = numAudit >= auditNum;
  421. }
  422. // 同意比例没通过,再计算拒绝的比例
  423. if (!result) {
  424. if (config.getRejectType().equals(FlowNature.Percent)) {
  425. // 百分比
  426. int res = (int) (numReject * 100 / list.size());
  427. result = res >= rejectRatio;
  428. } else if (config.getRejectType().equals(FlowNature.Number)) {
  429. // 人数
  430. result = numReject >= rejectNum;
  431. } else {
  432. // 同意取反
  433. if (numReject > 0) {
  434. if (config.getAuditType().equals(FlowNature.Percent)) {
  435. int res = (int) (numReject * 100 / list.size());
  436. result = res >= (100 - auditRatio);
  437. } else if (config.getAuditType().equals(FlowNature.Number)) {
  438. result = numReject >= (list.size() - auditNum);
  439. }
  440. }
  441. }
  442. if (result && ObjectUtil.equals(type, FlowNature.CALCULATE_TYPE_DELAY)) {
  443. flowMethod.setHandleStatus(FlowNature.RejectCompletion);
  444. }
  445. } else {
  446. if (ObjectUtil.equals(type, FlowNature.CALCULATE_TYPE_DELAY)) {
  447. flowMethod.setHandleStatus(FlowNature.AuditCompletion);
  448. }
  449. }
  450. } else if (FlowNature.ImproperApprover.equals(counterSign)) {
  451. // 依次审批
  452. if (ObjectUtil.equals(handleStatus, FlowNature.RejectCompletion)) {
  453. // 拒绝直接返回true,根据拒绝是否继续流转,直接结束 或 流转一下节点
  454. return true;
  455. }
  456. List<String> allList = StringUtil.isNotEmpty(operator.getHandleAll()) ? Arrays.stream(operator.getHandleAll().split(",")).collect(Collectors.toList()) : new ArrayList<>();
  457. String userId = operator.getHandleId();
  458. // 转审的经办,通过记录获取原来的审批人
  459. if (ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.Transfer.getCode())) {
  460. RecordEntity record = recordUtil.getTransferRecord(operator.getId());
  461. String handleId = record.getHandleId();
  462. if (StringUtil.isNotBlank(handleId)) {
  463. userId = handleId;
  464. }
  465. }
  466. int index = allList.indexOf(userId);
  467. // 最后一人直接返回
  468. if (index == allList.size() - 1) {
  469. return true;
  470. }
  471. if (flowMethod.getAuditFlag()) {
  472. return false;
  473. }
  474. String handleId = "";
  475. if (index != -1) {
  476. handleId = allList.get(index + 1);
  477. }
  478. OperatorEntity entity = this.createOperator(operator, OperatorStateEnum.Runing.getCode(), handleId, global);
  479. operatorService.save(entity);
  480. this.improperApproverMessage(flowMethod, entity);
  481. }
  482. if (!flowMethod.getAuditFlag()) {
  483. flowMethod.setTaskId(operator.getTaskId());
  484. flowMethod.setNodeCode(operator.getNodeCode());
  485. if (result) {
  486. // 结束该节点的其他经办
  487. endOperator(flowMethod);
  488. } else {
  489. //当前审批完,结束协办数据
  490. endAssist(flowMethod);
  491. }
  492. }
  493. return result;
  494. }
  495. //判断逐级
  496. public boolean checkStep(List<OperatorEntity> list, NodeModel nodeModel, LaunchUserEntity launchUser) {
  497. if (null != launchUser) {
  498. String positionId = launchUser.getPositionId();
  499. List<String> positionList = Arrays.asList(positionId.split(","));
  500. String organizeId = launchUser.getOrganizeId();
  501. List<String> organizeList = Arrays.asList(organizeId.split(","));
  502. //判断结束层级
  503. ApproversConfig approversConfig = nodeModel.getApproversConfig();
  504. Integer end = approversConfig.getEnd();
  505. boolean isOrganize = Objects.equals(end, FlowNature.Organization);
  506. int endLevel = isOrganize ? approversConfig.getOriginLevel() : approversConfig.getLevel();
  507. int totalLevel = positionList.size() + organizeList.size() - 1;
  508. int level = totalLevel - list.size();
  509. //判断逐级是否结束
  510. boolean result = isOrganize ? level > endLevel : list.size() < Math.min(totalLevel - (positionList.size() == 1 ? 1 : 0), endLevel);
  511. return !result;
  512. }
  513. return true;
  514. }
  515. // 依次审批消息
  516. public void improperApproverMessage(FlowMethod flowMethod, OperatorEntity entity) throws WorkFlowException {
  517. FlowModel flowModel = flowMethod.getFlowModel();
  518. List<CirculateEntity> circulateList = flowMethod.getCirculateList();
  519. TemplateNodeEntity nodeEntity = flowMethod.getNodeEntity();
  520. TaskEntity taskEntity = flowMethod.getTaskEntity();
  521. List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
  522. List<OperatorEntity> entityList = new ArrayList<>();
  523. entityList.add(entity);
  524. // 消息
  525. FlowMsgModel flowMsgModel = new FlowMsgModel();
  526. flowMsgModel.setNodeList(nodeEntityList);
  527. flowMsgModel.setCirculateList(circulateList);
  528. flowMsgModel.setFlowModel(flowModel);
  529. flowMsgModel.setTaskEntity(taskEntity);
  530. flowMsgModel.setNodeCode(nodeEntity.getNodeCode());
  531. flowMsgModel.setOperatorList(entityList);
  532. flowMsgModel.setCopy(true);
  533. flowMsgModel.setApprove(true);
  534. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  535. msgUtil.message(flowMsgModel);
  536. }
  537. // 结束协办
  538. public void endAssist(FlowMethod flowMethod) {
  539. OperatorEntity operator = flowMethod.getOperatorEntity();
  540. String taskId = flowMethod.getTaskId();
  541. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  542. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).eq(OperatorEntity::getParentId, operator.getId())
  543. .eq(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode());
  544. List<OperatorEntity> list = operatorService.list(queryWrapper);
  545. if (CollectionUtil.isNotEmpty(list)) {
  546. for (OperatorEntity entity : list) {
  547. entity.setCompletion(FlowNature.Action);
  548. }
  549. operatorService.updateBatchById(list);
  550. }
  551. }
  552. // 结束经办
  553. public void endOperator(FlowMethod flowMethod) {
  554. String taskId = flowMethod.getTaskId();
  555. String nodeCode = flowMethod.getNodeCode();
  556. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  557. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId)
  558. .isNull(OperatorEntity::getHandleStatus);
  559. if (StringUtil.isNotEmpty(nodeCode)) {
  560. queryWrapper.lambda().eq(OperatorEntity::getNodeCode, nodeCode);
  561. }
  562. List<OperatorEntity> list = operatorService.list(queryWrapper);
  563. if (CollectionUtil.isNotEmpty(list)) {
  564. for (OperatorEntity entity : list) {
  565. entity.setCompletion(FlowNature.Action);
  566. }
  567. operatorService.updateBatchById(list);
  568. }
  569. }
  570. // 结束加签经办
  571. public void endAddSign(String taskId, String parentId) {
  572. List<OperatorEntity> list = new ArrayList<>();
  573. this.getAddSignChildren(parentId, list);
  574. if (CollectionUtil.isNotEmpty(list)) {
  575. operatorService.updateBatchById(list);
  576. }
  577. }
  578. // 撤回复原
  579. public void recallRestore(OperatorEntity operator, String nodeId, List<String> userIds) {
  580. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  581. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId())
  582. .eq(OperatorEntity::getNodeCode, operator.getNodeCode()).eq(OperatorEntity::getNodeId, nodeId)
  583. .eq(OperatorEntity::getCompletion, FlowNature.Action).isNull(OperatorEntity::getHandleTime);
  584. List<OperatorEntity> list = operatorService.list(queryWrapper);
  585. if (CollectionUtil.isEmpty(list)) {
  586. return;
  587. }
  588. List<OperatorEntity> updateList = new ArrayList<>();
  589. for (OperatorEntity operatorEntity : list) {
  590. if (ObjectUtil.equals(operatorEntity.getParentId(), operator.getParentId())) {
  591. updateList.add(operatorEntity);
  592. if (null != userIds) {
  593. userIds.add(operatorEntity.getHandleId());
  594. }
  595. }
  596. }
  597. if (CollectionUtil.isNotEmpty(updateList)) {
  598. Date date = new Date();
  599. UpdateWrapper<OperatorEntity> wrapper = new UpdateWrapper<>();
  600. List<String> ids = updateList.stream().map(OperatorEntity::getId).collect(Collectors.toList());
  601. wrapper.lambda().in(OperatorEntity::getId, ids)
  602. .set(OperatorEntity::getCreatorTime, date)
  603. .set(OperatorEntity::getStatus, OperatorStateEnum.Runing.getCode())
  604. .set(OperatorEntity::getCompletion, FlowNature.Normal)
  605. .set(OperatorEntity::getHandleStatus, null);
  606. operatorService.update(wrapper);
  607. // 作废记录
  608. recordUtil.invalid(updateList);
  609. }
  610. List<OperatorEntity> deleteList = new ArrayList<>();
  611. if (CollectionUtil.isNotEmpty(updateList)) {
  612. for (OperatorEntity op : updateList) {
  613. this.getAddSignChildren(op.getId(), deleteList);
  614. }
  615. if (CollectionUtil.isNotEmpty(deleteList)) {
  616. deleteList.forEach(e -> e.setStatus(OperatorStateEnum.Futility.getCode()));
  617. operatorService.updateBatchById(deleteList);
  618. // 作废记录
  619. recordUtil.invalid(deleteList);
  620. }
  621. }
  622. }
  623. public List<OperatorEntity> getAddSignChildren(String operatorId, List<OperatorEntity> list) {
  624. list = null == list ? new ArrayList<>() : list;
  625. List<OperatorEntity> childList = this.getChildList(operatorId);
  626. if (CollectionUtil.isNotEmpty(childList)) {
  627. for (OperatorEntity operator : childList) {
  628. operator.setCompletion(FlowNature.Action);
  629. list.add(operator);
  630. this.getAddSignChildren(operator.getId(), list);
  631. }
  632. }
  633. return list;
  634. }
  635. // 判断自动审批
  636. public int checkAuto(FlowMethod flowMethod) {
  637. NodeModel nodeModel = flowMethod.getNodeModel();
  638. if (nodeModel.getHasAutoApprover()) {
  639. AutoAuditRule autoAuditRule = nodeModel.getAutoAuditRule();
  640. if (null != autoAuditRule) {
  641. List<ProperCond> conditions = autoAuditRule.getConditions();
  642. flowMethod.setConditions(conditions);
  643. flowMethod.setMatchLogic(autoAuditRule.getMatchLogic());
  644. if (conditionService.hasCondition(flowMethod)) {
  645. return 1;
  646. }
  647. }
  648. AutoAuditRule autoRejectRule = nodeModel.getAutoRejectRule();
  649. if (null != autoRejectRule) {
  650. List<ProperCond> conditions = autoRejectRule.getConditions();
  651. flowMethod.setConditions(conditions);
  652. flowMethod.setMatchLogic(autoRejectRule.getMatchLogic());
  653. if (conditionService.hasCondition(flowMethod)) {
  654. return 2;
  655. }
  656. }
  657. }
  658. return 3;
  659. }
  660. // 节点的自动审批
  661. public void autoAudit(FlowMethod flowMethod) throws Exception {
  662. FlowModel flowModel = flowMethod.getFlowModel();
  663. OperatorEntity entity = this.saveSystemOperator(flowMethod);
  664. if (null == entity) {
  665. return;
  666. }
  667. operatorService.audit(entity, flowModel);
  668. }
  669. public void autoAudit(OperatorEntity entity, FlowModel flowModel) throws Exception {
  670. if (null == entity || null == flowModel) {
  671. return;
  672. }
  673. operatorService.audit(entity, flowModel);
  674. }
  675. // 系统审批
  676. public void systemAudit() {
  677. List<SystemAuditModel> systemList = SystemAuditHolder.getAll();
  678. if (CollectionUtil.isNotEmpty(systemList)) {
  679. List<SystemAuditModel> jsonToList = JsonUtil.getJsonToList(systemList, SystemAuditModel.class);
  680. SystemAuditHolder.clear();
  681. Map<String, TaskEntity> taskMap = new HashMap<>();
  682. for (SystemAuditModel model : jsonToList) {
  683. OperatorEntity operator = model.getOperator();
  684. FlowModel flowModel = model.getFlowModel();
  685. try {
  686. String taskId = operator.getTaskId();
  687. TaskEntity task = taskMap.get(taskId) != null ? taskMap.get(taskId) : taskService.getInfo(taskId);
  688. if (Objects.equals(task.getStatus(), TaskStatusEnum.REJECTED.getCode())) {
  689. continue;
  690. }
  691. flowModel.setTaskEntity(task);
  692. this.autoAudit(operator, flowModel);
  693. taskMap.put(taskId, task);
  694. } catch (Exception e) {
  695. e.printStackTrace();
  696. }
  697. }
  698. }
  699. }
  700. public OperatorEntity saveSystemOperator(FlowMethod flowMethod) {
  701. NodeModel nodeModel = flowMethod.getNodeModel();
  702. FlowModel flowModel = flowMethod.getFlowModel();
  703. TaskEntity taskEntity = flowModel.getTaskEntity();
  704. String flowableTaskId = flowModel.getFlowableTaskId();
  705. OperatorEntity entity = new OperatorEntity();
  706. entity.setStatus(OperatorStateEnum.Runing.getCode());
  707. entity.setCompletion(FlowNature.Action);
  708. entity.setParentId(FlowNature.ParentId);
  709. entity.setTaskId(taskEntity.getId());
  710. entity.setNodeCode(nodeModel.getNodeId());
  711. entity.setNodeId(flowableTaskId);
  712. entity.setNodeName(nodeModel.getNodeName());
  713. entity.setEngineType(taskEntity.getEngineType());
  714. entity.setSignTime(new Date());
  715. entity.setStartHandleTime(new Date());
  716. entity.setHandleId(FlowNature.SYSTEM_CODE);
  717. entity.setHandleTime(new Date());
  718. entity.setIsProcessing(ObjectUtil.equals(nodeModel.getType(), NodeEnum.processing.getType()) ? FlowNature.Processing : FlowNature.NotProcessing);
  719. operatorService.save(entity);
  720. return entity;
  721. }
  722. // 全局属性的自动审批
  723. public boolean handleGlobalAuto(FlowMethod flowMethod) throws WorkFlowException {
  724. OperatorEntity entity = flowMethod.getOperatorEntity();
  725. NodeModel global = flowMethod.getNodeModel();
  726. FlowModel flowModel = flowMethod.getFlowModel();
  727. TaskEntity taskEntity = flowModel.getTaskEntity();
  728. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  729. String deploymentId = flowModel.getDeploymentId();
  730. if (null == entity.getSignTime()) {
  731. entity.setSignTime(new Date());
  732. }
  733. // 自动提交规则
  734. AutoSubmitConfig autoSubmitConfig = global.getAutoSubmitConfig();
  735. // 相邻节点审批人重复
  736. if (autoSubmitConfig.getAdjacentNodeApproverRepeated()) {
  737. // 获取上一级节点编码
  738. List<String> nodeCodeList = new ArrayList<>();
  739. taskUtil.prevNodeList(deploymentId, entity.getNodeCode(), nodeEntityList, nodeCodeList);
  740. if (CollectionUtil.isNotEmpty(nodeCodeList)) {
  741. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  742. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId())
  743. .eq(OperatorEntity::getHandleId, entity.getHandleId()).isNotNull(OperatorEntity::getHandleStatus)
  744. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode())
  745. .in(OperatorEntity::getNodeCode, nodeCodeList);
  746. long count = operatorService.count(queryWrapper);
  747. if (count > 0) {
  748. entity.setStartHandleTime(new Date());
  749. return true;
  750. }
  751. }
  752. }
  753. // 审批人审批过该流程
  754. if (autoSubmitConfig.getApproverHasApproval()) {
  755. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  756. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId())
  757. .eq(OperatorEntity::getHandleId, entity.getHandleId()).ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode())
  758. .isNotNull(OperatorEntity::getHandleStatus);
  759. long count = operatorService.count(queryWrapper);
  760. if (count > 0) {
  761. entity.setStartHandleTime(new Date());
  762. return true;
  763. }
  764. }
  765. // 发起人与审批人重复
  766. if (autoSubmitConfig.getInitiatorApproverRepeated()) {
  767. if (StringUtil.equals(taskEntity.getCreatorUserId(), entity.getHandleId())) {
  768. entity.setStartHandleTime(new Date());
  769. return true;
  770. }
  771. }
  772. return false;
  773. }
  774. public List<OperatorEntity> getChildList(String id) {
  775. QueryWrapper<OperatorEntity> wrapper = new QueryWrapper<>();
  776. wrapper.lambda().eq(OperatorEntity::getParentId, id)
  777. .ne(OperatorEntity::getStatus, OperatorStateEnum.Assist.getCode());
  778. return operatorService.list(wrapper);
  779. }
  780. // 处理加签审批比例
  781. public void handleAddCounterSign(OperatorEntity operator, FlowModel flowModel) throws Exception {
  782. if (null == operator.getParentId()) {
  783. return;
  784. }
  785. OperatorEntity parentEntity = operatorService.getInfo(operator.getParentId());
  786. if (null == parentEntity) {
  787. return;
  788. }
  789. String handleParameter = parentEntity.getHandleParameter();
  790. AddSignModel addSignModel = JsonUtil.getJsonToBean(handleParameter, AddSignModel.class);
  791. if (null == addSignModel) {
  792. return;
  793. }
  794. TaskEntity taskEntity = flowModel.getTaskEntity();
  795. List<OperatorEntity> list = this.getChildList(operator.getParentId());
  796. int total = list.size();
  797. long countAudit = list.stream().filter(e -> FlowNature.AuditCompletion.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
  798. long countReject = list.stream().filter(e -> FlowNature.RejectCompletion.equals(e.getHandleStatus()) && null != e.getHandleTime()).count();
  799. FlowMethod flowMethod = new FlowMethod();
  800. flowMethod.setAddSignModel(addSignModel);
  801. flowMethod.setOperatorEntity(parentEntity);
  802. flowMethod.setFlowModel(flowModel);
  803. if (ObjectUtil.equals(addSignModel.getCounterSign(), FlowNature.ImproperApprover)) {
  804. if (ObjectUtil.equals(flowModel.getHandleStatus(), FlowNature.RejectCompletion)) {
  805. Map<String, NodeModel> nodes = flowModel.getNodes();
  806. NodeModel global = nodes.get(NodeEnum.global.getType());
  807. // 101003前加签给10001、10002、10003,不管是否开启拒绝继续流转,10001通过,10002拒绝,应该回到101003那里
  808. // 后加签逻辑:流程设置继续流转,依次审批中只要有人拒绝,其他审批人不用审批流程就流转下一节点;流程未设置继续流转,依次审批中只要有人拒绝,就拒绝回发起节点
  809. if (ObjectUtil.equals(addSignModel.getAddSignType(), FlowNature.Later) && !global.getHasContinueAfterReject()) {
  810. flowMethod.setTaskEntity(taskEntity);
  811. taskUtil.handleEndTask(flowMethod);
  812. } else {
  813. this.handleAddSign(flowMethod);
  814. }
  815. return;
  816. }
  817. String userId = operator.getHandleId();
  818. // 转审的经办,通过记录获取原来的审批人
  819. if (ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.Transfer.getCode())) {
  820. RecordEntity record = recordUtil.getTransferRecord(operator.getId());
  821. String handleId = record.getHandleId();
  822. if (StringUtil.isNotBlank(handleId)) {
  823. userId = handleId;
  824. }
  825. }
  826. List<String> idList = addSignModel.getAddSignUserIdList();
  827. int index = idList.indexOf(userId);
  828. if (index == idList.size() - 1) {
  829. // 依次审批最后一个人
  830. this.handleAddSign(flowMethod);
  831. } else {
  832. NodeModel global = flowModel.getNodes().get(NodeEnum.global.getType());
  833. String handleId = idList.get(index + 1);
  834. OperatorEntity entity = this.createOperator(operator, OperatorStateEnum.AddSign.getCode(), handleId, global);
  835. operatorService.save(entity);
  836. flowMethod.setNodeEntity(flowModel.getNodeEntity());
  837. flowMethod.setTaskEntity(taskEntity);
  838. flowMethod.setNodeEntityList(flowModel.getNodeEntityList());
  839. this.improperApproverMessage(flowMethod, entity);
  840. }
  841. } else if (ObjectUtil.equals(addSignModel.getCounterSign(), FlowNature.FixedJointlyApprover)) {
  842. // 会签
  843. Integer ratio = addSignModel.getAuditRatio();
  844. int rejectRatio = 100 - ratio;
  845. int rejectRes = (int) (countReject * 100 / total);
  846. if (rejectRes != 0 && rejectRes >= rejectRatio) {
  847. // 直接拒绝
  848. flowMethod.setHandleStatus(FlowNature.RejectCompletion);
  849. this.handleAddSign(flowMethod);
  850. this.endAddSign(taskEntity.getId(), parentEntity.getId());
  851. return;
  852. }
  853. int res = (int) (countAudit * 100 / total);
  854. if (res >= ratio) {
  855. flowMethod.setHandleStatus(FlowNature.AuditCompletion);
  856. this.handleAddSign(flowMethod);
  857. this.endAddSign(taskEntity.getId(), parentEntity.getId());
  858. }
  859. } else {
  860. int auditFlag = FlowNature.AuditCompletion;
  861. // 或签
  862. if (countReject >= 1) {
  863. auditFlag = FlowNature.RejectCompletion;
  864. }
  865. flowMethod.setHandleStatus(auditFlag);
  866. this.handleAddSign(flowMethod);
  867. this.endAddSign(taskEntity.getId(), parentEntity.getId());
  868. }
  869. }
  870. public void handleAddSign(FlowMethod flowMethod) throws Exception {
  871. AddSignModel addSignModel = flowMethod.getAddSignModel();
  872. OperatorEntity parentEntity = flowMethod.getOperatorEntity();
  873. FlowModel flowModel = flowMethod.getFlowModel();
  874. if (addSignModel.getAddSignType().equals(FlowNature.Later)) {
  875. // 后加签需要默认同意
  876. flowModel.setHandleStatus(FlowNature.AuditCompletion);
  877. UserEntity userEntity = serviceUtil.getUserInfo(parentEntity.getHandleId());
  878. UserInfo userInfo = JsonUtil.getJsonToBean(UserProvider.getUser(), UserInfo.class);
  879. userInfo.setUserId(userEntity.getId());
  880. userInfo.setUserName(userEntity.getRealName());
  881. flowModel.setUserInfo(userInfo);
  882. flowModel.setCopyMsgFlag(false);
  883. parentEntity.setHandleStatus(null);
  884. operatorService.audit(parentEntity, flowModel);
  885. flowModel.setCopyMsgFlag(true);
  886. } else {
  887. UpdateWrapper<OperatorEntity> updateWrapper = new UpdateWrapper<>();
  888. updateWrapper.lambda().eq(OperatorEntity::getId, parentEntity.getId())
  889. .set(OperatorEntity::getCreatorTime, new Date())
  890. .set(OperatorEntity::getCompletion, FlowNature.Normal);
  891. NodeModel global = flowModel.getNodes().get(NodeEnum.global.getType());
  892. Boolean flowTodo = serviceUtil.getFlowTodo();
  893. if (!flowTodo) {
  894. updateWrapper.lambda().set(OperatorEntity::getStartHandleTime, null);
  895. Boolean flowSign = serviceUtil.getFlowSign();
  896. if (!flowSign) {
  897. if (global != null && global.getHasSignFor()) {
  898. updateWrapper.lambda().set(OperatorEntity::getSignTime, null);
  899. }
  900. }
  901. }
  902. operatorService.update(updateWrapper);
  903. parentEntity = operatorService.getById(parentEntity.getId());
  904. // recordUtil.invalidAddSignRecord(parentEntity);
  905. // 超时经办
  906. List<OperatorEntity> list = new ArrayList<>();
  907. list.add(parentEntity);
  908. for (OperatorEntity operatorEntity : list) {
  909. FlowJobUtil.deleteByOperatorId(operatorEntity.getId(), redisUtil);
  910. }
  911. TaskEntity taskEntity = flowModel.getTaskEntity();
  912. UserEntity userEntity = serviceUtil.getUserInfo(taskEntity.getCreatorUserId());
  913. if (null != userEntity) {
  914. FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  915. UserInfo userInfo = model.getUserInfo();
  916. userInfo.setUserName(userEntity.getRealName());
  917. userInfo.setUserAccount(userEntity.getAccount());
  918. userInfo.setUserId(userEntity.getId());
  919. model.setUserInfo(userInfo);
  920. addOperatorList(list, model);
  921. }
  922. }
  923. }
  924. // 设置可减签的人员名称
  925. public List<CandidateUserVo> getReduceUsers(List<OperatorEntity> todoList, Pagination pagination) {
  926. List<String> ids = todoList.stream().map(OperatorEntity::getHandleId).collect(Collectors.toList());
  927. return taskUtil.getUserModel(ids, pagination);
  928. }
  929. // 处理退回数据,当前的经办通过计算比例后进入该方法,无需变更状态
  930. public void handleRejectData(FlowModel flowModel) throws WorkFlowException {
  931. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  932. OperatorEntity operatorEntity = flowModel.getOperatorEntity();
  933. TaskEntity taskEntity = flowModel.getTaskEntity();
  934. String currentNodeCode = taskEntity.getCurrentNodeCode();
  935. // 待提交(即未发起)重新发起,需要获取当前节点
  936. String instanceId = taskEntity.getInstanceId();
  937. if (instanceId != null) {
  938. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
  939. List<String> currentCodes = taskModelList.stream().map(FlowableTaskModel::getTaskKey).collect(Collectors.toList());
  940. currentNodeCode = String.join(",", currentCodes);
  941. }
  942. String rejectDataId = taskEntity.getRejectDataId();
  943. RejectDataEntity rejectData = rejectDataService.getInfo(taskEntity.getRejectDataId());
  944. if (!ObjectUtil.equals(rejectData.getNodeCode(), operatorEntity.getNodeCode())) {
  945. throw new WorkFlowException("当前节点无法操作");
  946. }
  947. String taskJson = rejectData.getTaskJson();
  948. String operatorJson = rejectData.getOperatorJson();
  949. String eventJson = rejectData.getEventLogJson();
  950. List<OperatorEntity> srcOperatorList = JsonUtil.getJsonToList(operatorJson, OperatorEntity.class);
  951. // 获取被退回的节点编码,用于表单值传递
  952. List<String> nodeCodes = srcOperatorList.stream().sorted(Comparator.comparing(OperatorEntity::getCreatorTime))
  953. .map(OperatorEntity::getNodeCode).distinct().collect(Collectors.toList());
  954. List<EventLogEntity> srcEventList = JsonUtil.getJsonToList(eventJson, EventLogEntity.class);
  955. TaskEntity srcTask = JsonUtil.getJsonToBean(taskJson, TaskEntity.class);
  956. String srcCurrentNodeCode = srcTask.getCurrentNodeCode();
  957. // 跳转
  958. JumpFo fo = new JumpFo();
  959. fo.setInstanceId(instanceId);
  960. List<String> sourceList = StringUtil.isNotEmpty(currentNodeCode) ? Arrays.stream(currentNodeCode.split(",")).collect(Collectors.toList()) : new ArrayList<>();
  961. List<String> targetList = StringUtil.isNotEmpty(srcCurrentNodeCode) ? Arrays.stream(srcCurrentNodeCode.split(",")).collect(Collectors.toList()) : new ArrayList<>();
  962. List<String> source = sourceList.stream().filter(e -> !targetList.contains(e)).collect(Collectors.toList());
  963. List<String> target = targetList.stream().filter(e -> !sourceList.contains(e)).collect(Collectors.toList());
  964. fo.setSource(source);
  965. fo.setTarget(target);
  966. flowAbleUrl.jump(fo);
  967. // 跳转后,获取当前的节点信息,更新经办
  968. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
  969. if (CollectionUtil.isNotEmpty(taskModelList)) {
  970. for (OperatorEntity operator : srcOperatorList) {
  971. FlowableTaskModel model = taskModelList.stream()
  972. .filter(e -> ObjectUtil.equals(e.getTaskKey(), operator.getNodeCode())).findFirst().orElse(null);
  973. if (null != model) {
  974. operator.setNodeId(model.getTaskId());
  975. }
  976. operator.setCreatorTime(new Date());
  977. }
  978. }
  979. // 还原经办
  980. operatorService.updateBatchById(srcOperatorList);
  981. //还原外部节点
  982. eventLogService.updateBatchById(srcEventList);
  983. // 还原任务
  984. UpdateWrapper<TaskEntity> updateWrapper = new UpdateWrapper<>();
  985. updateWrapper.lambda().eq(TaskEntity::getId, srcTask.getId())
  986. .set(TaskEntity::getInstanceId, instanceId)
  987. .set(TaskEntity::getCurrentNodeCode, srcTask.getCurrentNodeCode())
  988. .set(TaskEntity::getCurrentNodeName, srcTask.getCurrentNodeName())
  989. .set(TaskEntity::getStatus, srcTask.getStatus())
  990. .set(TaskEntity::getStartTime, srcTask.getStartTime())
  991. .set(TaskEntity::getRejectDataId, null);
  992. taskService.update(updateWrapper);
  993. // 赋值更新后的任务
  994. flowModel.setTaskEntity(srcTask);
  995. rejectDataService.removeById(rejectDataId);
  996. // 处理表单值传递
  997. for (TemplateNodeEntity nodeEntity : nodeEntityList) {
  998. if (nodeCodes.contains(nodeEntity.getNodeCode())) {
  999. FlowMethod flowMethod = new FlowMethod();
  1000. flowMethod.setTaskEntity(taskEntity);
  1001. flowMethod.setNodeEntity(nodeEntity);
  1002. flowMethod.setNodeEntityList(nodeEntityList);
  1003. flowMethod.setFlowModel(flowModel);
  1004. flowMethod.setIsAssign(true);
  1005. taskUtil.dataTransfer(flowMethod);
  1006. }
  1007. }
  1008. }
  1009. // 获取任务 节点下的经办
  1010. public List<OperatorEntity> getByNodeCode(String taskId, String nodeCode) {
  1011. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1012. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId)
  1013. .eq(OperatorEntity::getNodeCode, nodeCode)
  1014. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode());
  1015. List<OperatorEntity> list = operatorService.list(queryWrapper);
  1016. if (CollectionUtil.isNotEmpty(list)) {
  1017. return list;
  1018. }
  1019. return new ArrayList<>();
  1020. }
  1021. // 处理指派
  1022. public OperatorEntity handleAssign(FlowModel flowModel) throws WorkFlowException {
  1023. TaskEntity taskEntity = flowModel.getTaskEntity();
  1024. NodeModel global = flowModel.getNodes().get(NodeEnum.global.getType());
  1025. String nodeCode = flowModel.getNodeCode();
  1026. String assignUserId = flowModel.getHandleIds();
  1027. NodeModel nodeModel = flowModel.getNodes().get(nodeCode);
  1028. Integer transferState = ObjectUtil.equals(nodeModel.getType(), NodeEnum.processing.getType()) ?
  1029. OperatorStateEnum.TransferProcessing.getCode() : OperatorStateEnum.Transfer.getCode();
  1030. Integer state = flowModel.getAutoTransferFlag() ? transferState : OperatorStateEnum.Assigned.getCode();
  1031. List<OperatorEntity> operatorList = this.getByNodeCode(taskEntity.getId(), nodeCode);
  1032. if (CollectionUtil.isNotEmpty(operatorList)) {
  1033. // 作废记录
  1034. recordUtil.invalid(operatorList);
  1035. // 删除原来的经办
  1036. operatorService.removeByIds(operatorList);
  1037. OperatorEntity operator = operatorList.get(0);
  1038. operator.setParentId(FlowNature.ParentId);
  1039. // 生成指派经办
  1040. OperatorEntity entity = this.createOperator(operator, state, assignUserId, global);
  1041. operatorService.save(entity);
  1042. return entity;
  1043. } else {
  1044. OperatorEntity entity = new OperatorEntity();
  1045. entity.setId(RandomUtil.uuId());
  1046. NodeModel node = flowModel.getNodes().get(nodeCode);
  1047. entity.setNodeName(node.getNodeName());
  1048. List<FlowableTaskModel> currentTask = flowAbleUrl.getCurrentTask(taskEntity.getInstanceId());
  1049. FlowableTaskModel model = currentTask.stream().filter(e -> e.getTaskKey().equals(nodeCode)).findFirst().orElse(null);
  1050. if (null == model) {
  1051. throw new WorkFlowException(MsgCode.FA001.get());
  1052. }
  1053. entity.setNodeId(model.getTaskId());
  1054. entity.setNodeCode(nodeCode);
  1055. entity.setStatus(state);
  1056. entity.setTaskId(taskEntity.getId());
  1057. entity.setEngineType(taskEntity.getEngineType());
  1058. Boolean flowTodo = serviceUtil.getFlowTodo();
  1059. if (flowTodo) {
  1060. entity.setSignTime(new Date());
  1061. entity.setStartHandleTime(new Date());
  1062. } else {
  1063. Boolean flowSign = serviceUtil.getFlowSign();
  1064. if (flowSign) {
  1065. entity.setSignTime(new Date());
  1066. } else {
  1067. if (global != null && !global.getHasSignFor()) {
  1068. entity.setSignTime(new Date());
  1069. }
  1070. }
  1071. }
  1072. if (node.getCounterSign().equals(FlowNature.ImproperApprover)) {
  1073. entity.setHandleAll(assignUserId);
  1074. }
  1075. entity.setHandleId(assignUserId);
  1076. entity.setParentId(FlowNature.ParentId);
  1077. entity.setCompletion(FlowNature.Normal);
  1078. operatorService.save(entity);
  1079. return entity;
  1080. }
  1081. }
  1082. public void handleRevoke(FlowModel flowModel, OperatorEntity operator, RevokeEntity revokeEntity) throws Exception {
  1083. TaskEntity taskEntity = flowModel.getTaskEntity();
  1084. Integer handleStatus = flowModel.getHandleStatus();
  1085. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1086. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  1087. .filter(e -> StringUtil.equals(e.getNodeCode(), operator.getNodeCode())).findFirst().orElse(null);
  1088. FlowMethod flowMethod = new FlowMethod();
  1089. flowMethod.setNodeEntity(nodeEntity);
  1090. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1091. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  1092. flowMsgModel.setNodeList(nodeEntityList);
  1093. flowMsgModel.setFlowModel(flowModel);
  1094. flowMsgModel.setTaskEntity(taskEntity);
  1095. flowMsgModel.setNodeCode(operator.getNodeCode());
  1096. flowMsgModel.setWait(false);
  1097. List<OperatorEntity> operatorList = new ArrayList<>();
  1098. OperatorEntity entity = new OperatorEntity();
  1099. entity.setNodeCode(operator.getNodeCode());
  1100. entity.setHandleId(taskEntity.getCreatorUserId());
  1101. operatorList.add(entity);
  1102. flowMsgModel.setOperatorList(operatorList);
  1103. TaskEntity task = taskService.getById(revokeEntity.getTaskId());
  1104. boolean endFlag = false;
  1105. if (ObjectUtil.equals(handleStatus, FlowNature.AuditCompletion)) {
  1106. flowMsgModel.setApprove(true);
  1107. // 消息
  1108. msgUtil.message(flowMsgModel);
  1109. operator.setHandleStatus(FlowNature.AuditCompletion);
  1110. flowMethod.setType(RecordEnum.audit.getCode());
  1111. } else {
  1112. operator.setHandleStatus(FlowNature.RejectCompletion);
  1113. flowMethod.setType(RecordEnum.reject.getCode());
  1114. // 结束
  1115. endFlag = true;
  1116. }
  1117. // 经办记录
  1118. flowMethod.setFlowModel(flowModel);
  1119. flowMethod.setOperatorEntity(operator);
  1120. recordUtil.createRecord(flowMethod);
  1121. operator.setHandleTime(new Date());
  1122. operator.setCompletion(FlowNature.Action);
  1123. operatorService.updateById(operator);
  1124. flowMethod.setTaskEntity(taskEntity);
  1125. List<CirculateEntity> circulateList = circulateUtil.circulateList(flowMethod);
  1126. flowMethod.setCirculateList(circulateList);
  1127. if (endFlag) {
  1128. flowMethod.setIsRevoke(true);
  1129. taskUtil.handleEndTask(flowMethod);
  1130. revokeService.deleteRevoke(taskEntity.getId());
  1131. return;
  1132. }
  1133. // 判断撤销经办的比例
  1134. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1135. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId()).eq(OperatorEntity::getNodeCode, operator.getNodeCode())
  1136. .ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode());
  1137. List<OperatorEntity> list = operatorService.list(queryWrapper);
  1138. long count = list.stream().filter(e -> ObjectUtil.equals(e.getHandleStatus(), FlowNature.AuditCompletion)).count();
  1139. if (count == list.size()) {
  1140. // 节点记录
  1141. NodeRecordModel nodeRecordModel = new NodeRecordModel();
  1142. nodeRecordModel.setTaskId(operator.getTaskId());
  1143. nodeRecordModel.setNodeId(operator.getNodeId());
  1144. nodeRecordModel.setNodeCode(operator.getNodeCode());
  1145. nodeRecordModel.setNodeName(operator.getNodeName());
  1146. nodeRecordModel.setNodeStatus(NodeStateEnum.pass.getCode());
  1147. nodeRecordService.create(nodeRecordModel);
  1148. // 节点通过
  1149. CompleteFo fo = new CompleteFo();
  1150. fo.setTaskId(operator.getNodeId());
  1151. flowAbleUrl.complete(fo);
  1152. flowMethod.setTaskId(revokeEntity.getTaskId());
  1153. flowMethod.setTaskEntity(taskEntity);
  1154. this.handleRevokeOperator(flowMethod);
  1155. // 判断结束,更新源任务的状态
  1156. if (taskUtil.isFinished(flowModel)) {
  1157. if (null != task) {
  1158. taskUtil.endRevoke(task);
  1159. }
  1160. }
  1161. }
  1162. }
  1163. public OperatorEntity createOperator(OperatorEntity operator, Integer state, String handleId, NodeModel global) {
  1164. OperatorEntity entity = new OperatorEntity();
  1165. entity.setId(RandomUtil.uuId());
  1166. entity.setNodeName(operator.getNodeName());
  1167. entity.setNodeId(operator.getNodeId());
  1168. entity.setNodeCode(operator.getNodeCode());
  1169. entity.setStatus(state);
  1170. entity.setTaskId(operator.getTaskId());
  1171. entity.setIsProcessing(operator.getIsProcessing());
  1172. entity.setEngineType(operator.getEngineType());
  1173. Boolean flowTodo = serviceUtil.getFlowTodo();
  1174. if (flowTodo) {
  1175. entity.setSignTime(new Date());
  1176. entity.setStartHandleTime(new Date());
  1177. } else {
  1178. Boolean flowSign = serviceUtil.getFlowSign();
  1179. if (flowSign) {
  1180. entity.setSignTime(new Date());
  1181. } else {
  1182. if (global != null && !global.getHasSignFor()) {
  1183. entity.setSignTime(new Date());
  1184. }
  1185. }
  1186. }
  1187. entity.setHandleId(handleId);
  1188. entity.setHandleAll(operator.getHandleAll());
  1189. entity.setParentId(operator.getParentId());
  1190. entity.setCompletion(FlowNature.Normal);
  1191. return entity;
  1192. }
  1193. // 处理子流程
  1194. public void handleSubFlow(TemplateNodeEntity nodeEntity, FlowModel flowModel) throws Exception {
  1195. if (!nodeEntity.getNodeType().equals(NodeEnum.subFlow.getType())) {
  1196. return;
  1197. }
  1198. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1199. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1200. Map<String, List<String>> errorRuleUserList = flowModel.getErrorRuleUserList();
  1201. String templateId = nodeModel.getFlowId();
  1202. TemplateEntity template = templateService.getById(templateId);
  1203. if (null == template) {
  1204. return;
  1205. }
  1206. if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  1207. throw new WorkFlowException(MsgCode.WF140.get());
  1208. }
  1209. String flowId = template.getFlowId();
  1210. TemplateJsonEntity jsonEntity = templateJsonService.getById(flowId);
  1211. if (null == jsonEntity) {
  1212. return;
  1213. }
  1214. List<TemplateNodeEntity> subNodeEntityList = templateNodeService.getList(jsonEntity.getId());
  1215. Map<String, NodeModel> subNodes = new HashMap<>();
  1216. for (TemplateNodeEntity node : subNodeEntityList) {
  1217. subNodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
  1218. }
  1219. FlowMethod method = new FlowMethod();
  1220. method.setDeploymentId(jsonEntity.getFlowableId());
  1221. TemplateNodeEntity subStart = subNodeEntityList.stream()
  1222. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  1223. method.setNodeCode(subStart.getNodeCode());
  1224. method.setNodes(subNodes);
  1225. method.setNodeEntityList(subNodeEntityList);
  1226. List<NodeModel> nextApprover = taskUtil.getNextApprover(method);
  1227. boolean autoSubmit = ObjectUtil.equals(nodeModel.getAutoSubmit(), 1);
  1228. if (autoSubmit) {
  1229. if (taskUtil.checkBranch(subStart)) {
  1230. throw new WorkFlowException(MsgCode.WF121.get());
  1231. }
  1232. if (!taskUtil.checkNextCandidates(nextApprover)) {
  1233. throw new WorkFlowException(MsgCode.WF121.get());
  1234. }
  1235. }
  1236. String nodeCode = nodeModel.getNodeId();
  1237. TaskEntity taskEntity = flowModel.getTaskEntity();
  1238. String deploymentId = flowModel.getDeploymentId();
  1239. Map<String, NodeModel> nodes = flowModel.getNodes();
  1240. String flowableTaskId = flowModel.getFlowableTaskId();
  1241. FlowMethod flowMethod = new FlowMethod();
  1242. flowMethod.setFlowModel(flowModel);
  1243. flowMethod.setTaskEntity(taskEntity);
  1244. flowMethod.setNodeEntity(nodeEntity);
  1245. flowMethod.setNodeEntityList(nodeEntityList);
  1246. flowMethod.setErrorRule(true);
  1247. flowMethod.setExtraRule(true);
  1248. // 获取上一级节点
  1249. List<String> nodeCodeList = new ArrayList<>();
  1250. taskUtil.prevNodeList(deploymentId, nodeCode, nodeEntityList, nodeCodeList);
  1251. nodeCodeList = nodeCodeList.stream().distinct().collect(Collectors.toList());
  1252. String parentCode;
  1253. if (nodeCodeList.size() == 1) {
  1254. parentCode = nodeCodeList.get(0);
  1255. } else if (nodeCodeList.size() > 1) {
  1256. // 如果子流程是合流节点 就存最后一个审批的分流节点
  1257. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1258. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskEntity.getId())
  1259. .in(OperatorEntity::getNodeCode, nodeCodeList).isNotNull(OperatorEntity::getHandleStatus)
  1260. .orderByDesc(OperatorEntity::getHandleTime);
  1261. List<OperatorEntity> list = operatorService.list(queryWrapper);
  1262. if (CollectionUtil.isNotEmpty(list)) {
  1263. parentCode = list.get(0).getNodeCode();
  1264. } else {
  1265. parentCode = null;
  1266. }
  1267. } else {
  1268. TemplateNodeEntity startNode = nodeEntityList.stream()
  1269. .filter(e -> StringUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(new TemplateNodeEntity());
  1270. parentCode = startNode.getNodeCode();
  1271. }
  1272. TemplateNodeEntity parentNode = nodeEntityList.stream()
  1273. .filter(e -> StringUtil.equals(e.getNodeCode(), parentCode)).findFirst().orElse(new TemplateNodeEntity());
  1274. String formId = parentNode.getFormId();
  1275. Map<String, Boolean> resMap = new HashMap<>();
  1276. Map<String, Map<String, Object>> allData = FlowContextHolder.getAllData();
  1277. Map<String, Object> formData = allData.get(taskEntity.getId() + JnpfConst.SIDE_MARK + formId);
  1278. if (nodeModel.getIsAsync().equals(FlowNature.ChildAsync)) {
  1279. flowMethod.setDeploymentId(deploymentId);
  1280. flowMethod.setNodeCode(nodeCode);
  1281. flowMethod.setFormData(formData);
  1282. flowMethod.setNodes(nodes);
  1283. flowMethod.setTaskEntity(taskEntity);
  1284. resMap = conditionService.handleCondition(flowMethod);
  1285. conditionService.checkCondition(resMap, nodes);
  1286. }
  1287. // 表单数据传递
  1288. formData = taskUtil.createOrUpdate(flowMethod);
  1289. flowMethod.setSubFormData(formData);
  1290. List<String> userIds = taskUtil.userListAll(flowMethod);
  1291. List<UserEntity> userList = serviceUtil.getUserName(userIds, true);
  1292. if (userList.isEmpty()) {
  1293. userIds.add(serviceUtil.getAdmin());
  1294. }
  1295. Integer createRule = nodeModel.getCreateRule();
  1296. boolean inTurn = ObjectUtil.equals(createRule, 1);
  1297. int flag = 0;
  1298. List<FlowModel> subTaskData = new ArrayList<>();
  1299. UserInfo userInfo = flowModel.getUserInfo();
  1300. Map<String, FlowModel> taskMap = new HashMap<>();
  1301. for (UserEntity user : userList) {
  1302. flag++;
  1303. FlowModel model = new FlowModel();
  1304. model.setSubCode(nodeCode);
  1305. model.setParentId(taskEntity.getId());
  1306. model.setDeploymentId(jsonEntity.getFlowableId());
  1307. Map<String, Object> map = new HashMap<>();
  1308. if (CollectionUtil.isNotEmpty(formData)) {
  1309. map = new HashMap<>(formData);
  1310. }
  1311. map.put(FlowFormConstant.FLOWID, flowId);
  1312. model.setFormData(map);
  1313. model.setFlowId(flowId);
  1314. model.setErrorRuleUserList(errorRuleUserList);
  1315. // 自动提交 0.否
  1316. if (autoSubmit) {
  1317. model.setStatus(TaskStatusEnum.RUNNING.getCode());
  1318. } else {
  1319. model.setSubFlow(true);
  1320. }
  1321. SubParameterModel subParameter = new SubParameterModel();
  1322. subParameter.setParentCode(parentCode);
  1323. subParameter.setNodeId(flowableTaskId);
  1324. model.setSubParameter(subParameter);
  1325. UserInfo info = JsonUtil.getJsonToBean(userInfo, UserInfo.class);
  1326. info.setUserName(user.getRealName());
  1327. info.setUserAccount(user.getAccount());
  1328. info.setUserId(user.getId());
  1329. model.setUserInfo(info);
  1330. model.setIsAsync(nodeModel.getIsAsync());
  1331. model.setIsFlow(1);
  1332. TaskEntity subTask = new TaskEntity();
  1333. subTask.setCreatorUserId(user.getId());
  1334. model.setTaskEntity(subTask);
  1335. // 依次创建,只创建第一个人的,存储后续的人员参数
  1336. if (inTurn && flag > 1) {
  1337. subTaskData.add(model);
  1338. continue;
  1339. }
  1340. if (nodeModel.getAutoSubmit().equals(1)) {
  1341. model.setNodeEntityList(subNodeEntityList);
  1342. if (taskUtil.checkNextError(model, nextApprover, false, false) != 0) {
  1343. throw new WorkFlowException(MsgCode.WF121.get());
  1344. }
  1345. }
  1346. UserProvider.setLocalLoginUser(info);
  1347. // 生成任务,根据是否自动发起进行提交
  1348. taskService.saveOrSubmit(model);
  1349. // 组装消息发送的人
  1350. OperatorEntity operator = new OperatorEntity();
  1351. operator.setHandleId(user.getId());
  1352. operator.setNodeCode(nodeEntity.getNodeCode());
  1353. // 子流程任务
  1354. TaskEntity task = model.getTaskEntity();
  1355. operator.setTaskId(task.getId());
  1356. List<OperatorEntity> operatorList = new ArrayList<>();
  1357. operatorList.add(operator);
  1358. // 消息
  1359. if (ObjectUtil.equals(nodeModel.getAutoSubmit(), 0)) {
  1360. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1361. flowMsgModel.setOperatorList(operatorList);
  1362. flowMsgModel.setNodeList(nodeEntityList);
  1363. flowMsgModel.setFlowModel(flowModel);
  1364. flowMsgModel.setTaskEntity(task);
  1365. flowMsgModel.setNodeCode(nodeCode);
  1366. flowMsgModel.setWait(false);
  1367. flowMsgModel.setLaunch(true);
  1368. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  1369. msgUtil.message(flowMsgModel);
  1370. }
  1371. taskMap.put(task.getId(), model);
  1372. }
  1373. // 保存依次创建的子流程数据
  1374. subtaskDataService.save(subTaskData);
  1375. for (String taskId : taskMap.keySet()) {
  1376. FlowModel model = taskMap.get(taskId);
  1377. if (model == null) {
  1378. continue;
  1379. }
  1380. this.autoAudit(model);
  1381. }
  1382. UserProvider.setLocalLoginUser(userInfo);
  1383. // 异步,直接通过节点,后续继续递归下一级节点生成经办
  1384. if (nodeModel.getIsAsync().equals(FlowNature.ChildAsync)) {
  1385. flowMethod.setFlowableTaskId(flowableTaskId);
  1386. flowMethod.setResMap(resMap);
  1387. completeNode(flowMethod);
  1388. }
  1389. //子流程自动审批,更新主流程的当前节点
  1390. String instanceId = taskEntity.getInstanceId();
  1391. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
  1392. if (CollectionUtil.isEmpty(taskModelList)) {
  1393. return;
  1394. }
  1395. taskUtil.updateCurrentNode(taskModelList, nodes, taskEntity);
  1396. }
  1397. // 完成节点
  1398. public void completeNode(FlowMethod flowMethod) throws Exception {
  1399. FlowModel flowModel = flowMethod.getFlowModel();
  1400. String flowableTaskId = flowMethod.getFlowableTaskId();
  1401. Map<String, Boolean> resMap = flowMethod.getResMap();
  1402. TaskEntity taskEntity = flowMethod.getTaskEntity();
  1403. taskLineService.create(taskEntity.getId(), resMap);
  1404. CompleteFo completeFo = new CompleteFo();
  1405. completeFo.setTaskId(flowableTaskId);
  1406. completeFo.setVariables(new HashMap<>(resMap));
  1407. flowAbleUrl.complete(completeFo);
  1408. this.addTask(ImmutableList.of(taskEntity.getId()));
  1409. if (taskUtil.isFinished(flowModel)) {
  1410. return;
  1411. }
  1412. // 生成经办
  1413. List<OperatorEntity> operatorEntities = operatorService.handleOperator(flowModel);
  1414. List<TemplateNodeEntity> nodeEntityList = flowMethod.getNodeEntityList();
  1415. FlowMsgModel flowMsgModel = new FlowMsgModel();
  1416. flowMsgModel.setNodeList(nodeEntityList);
  1417. flowMsgModel.setTaskEntity(taskEntity);
  1418. flowMsgModel.setFlowModel(flowModel);
  1419. flowMsgModel.setOperatorList(operatorEntities);
  1420. flowMsgModel.setFormData(FlowContextHolder.getAllData());
  1421. msgUtil.message(flowMsgModel);
  1422. if (taskEntity.getRejectDataId() == null) {
  1423. this.autoAudit(flowModel);
  1424. }
  1425. }
  1426. public void autoAudit(FlowModel flowModel) throws Exception {
  1427. flowModel.setAutoAudit(true);
  1428. this.autoAudit(flowModel, true);
  1429. }
  1430. public void autoAudit(FlowModel flowModel, Boolean flag) throws Exception {
  1431. TaskEntity taskEntity = flowModel.getTaskEntity();
  1432. if (null == taskEntity) {
  1433. return;
  1434. }
  1435. flowModel.setBranchList(new ArrayList<>());
  1436. String taskId = taskEntity.getId();
  1437. List<OperatorEntity> operatorList = operatorService.getList(taskId);
  1438. operatorList = operatorList.stream().filter(e -> !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.Back.getCode())
  1439. && !ObjectUtil.equals(e.getCompletion(), FlowNature.Action)).collect(Collectors.toList());
  1440. this.autoAudit(flowModel, operatorList, flag);
  1441. }
  1442. @DSTransactional
  1443. public void autoAudit(FlowModel flowModel, List<OperatorEntity> operatorList, Boolean flag) throws Exception {
  1444. // flag标识为true时 需要排除未激活的经办
  1445. if (flag) {
  1446. operatorList = operatorList.stream()
  1447. .filter(e -> !ObjectUtil.equals(e.getStatus(), OperatorStateEnum.Waiting.getCode())).collect(Collectors.toList());
  1448. }
  1449. if (CollectionUtil.isEmpty(operatorList)) {
  1450. return;
  1451. }
  1452. String deploymentId = flowModel.getDeploymentId();
  1453. TaskEntity taskEntity = flowModel.getTaskEntity();
  1454. Map<String, NodeModel> nodes = flowModel.getNodes();
  1455. NodeModel global = nodes.get(NodeEnum.global.getType());
  1456. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1457. TemplateNodeEntity globalEntity = nodeEntityList.stream()
  1458. .filter(e -> StringUtil.equals(NodeEnum.global.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  1459. AutoSubmitConfig autoConfig = global.getAutoSubmitConfig();
  1460. if (!autoConfig.getApproverHasApproval() && !autoConfig.getInitiatorApproverRepeated() && !autoConfig.getAdjacentNodeApproverRepeated()) {
  1461. // 先判断自动审批,未开启直接返回
  1462. return;
  1463. }
  1464. flowModel.setSignImg(null);
  1465. flowModel.setFileList(null);
  1466. Map<String, List<OperatorEntity>> map = operatorList.stream().collect(Collectors.groupingBy(OperatorEntity::getNodeCode));
  1467. List<String> handleIds = operatorList.stream().map(OperatorEntity::getHandleId).distinct().collect(Collectors.toList());
  1468. List<UserEntity> users = serviceUtil.getUserName(handleIds);
  1469. for (String key : map.keySet()) {
  1470. NodeModel model = nodes.get(key);
  1471. Map<String, Map<String, Object>> allData = FlowContextHolder.getAllData();
  1472. String modelFormId = model.getFormId();
  1473. modelFormId = StringUtil.isNotBlank(modelFormId) ? modelFormId : globalEntity.getFormId();
  1474. Map<String, Object> formData = allData.get(taskEntity.getId() + JnpfConst.SIDE_MARK + modelFormId);
  1475. // 获取流程参数
  1476. taskUtil.getGlobalParam(taskEntity, model, global, formData);
  1477. flowModel.setTaskEntity(taskEntity);
  1478. FlowMethod flowMethod = new FlowMethod();
  1479. flowMethod.setTaskEntity(taskEntity);
  1480. flowMethod.setFormData(formData == null ? new HashMap<>() : formData);
  1481. flowMethod.setDeploymentId(deploymentId);
  1482. flowMethod.setNodeCode(key);
  1483. flowMethod.setNodes(nodes);
  1484. // 判断节点的线的条件
  1485. Map<String, Boolean> resMap = conditionService.handleCondition(flowMethod);
  1486. try {
  1487. conditionService.checkCondition(resMap, nodes);
  1488. } catch (WorkFlowException e) {
  1489. continue;
  1490. }
  1491. List<NodeModel> nextApprover;
  1492. boolean mark = true;
  1493. try {
  1494. nextApprover = taskUtil.getNextApprover(flowMethod);
  1495. } catch (WorkFlowException e) {
  1496. nextApprover = null;
  1497. mark = false;
  1498. }
  1499. if (!mark) {
  1500. continue;
  1501. }
  1502. List<OperatorEntity> list = map.get(key);
  1503. if (CollectionUtil.isNotEmpty(list)) {
  1504. flowModel.setOperatorEntity(list.get(0));
  1505. }
  1506. boolean isBranch = taskUtil.checkBranch(model);
  1507. boolean nextCandidates = taskUtil.checkNextCandidates(nextApprover);
  1508. int nextError = taskUtil.checkNextError(flowModel, nextApprover, false, false);
  1509. if (!isBranch && nextCandidates && nextError == 0) {
  1510. for (OperatorEntity operator : list) {
  1511. operator = operatorService.getById(operator.getId());
  1512. if (null == operator || ObjectUtil.equals(operator.getCompletion(), FlowNature.Action)) {
  1513. continue;
  1514. }
  1515. String handleId = operator.getHandleId();
  1516. String username = "";
  1517. String userId = "";
  1518. String userName = "";
  1519. String userAccount = "";
  1520. UserEntity user = users.stream().filter(e -> ObjectUtil.equals(e.getId(), handleId)).findFirst().orElse(null);
  1521. if (user != null) {
  1522. username = user.getAccount() + "(" + user.getRealName() + ")";
  1523. userId = user.getId();
  1524. userName = user.getRealName();
  1525. userAccount = user.getAccount();
  1526. }
  1527. String str = ObjectUtil.equals(operator.getIsProcessing(), FlowNature.NotProcessing) ? "自动审批通过" : "自动办理通过";
  1528. flowModel.setHandleOpinion(username + str);
  1529. FlowMethod method = new FlowMethod();
  1530. method.setOperatorEntity(operator);
  1531. method.setNodeModel(global);
  1532. method.setFlowModel(flowModel);
  1533. if (this.handleGlobalAuto(method)) {
  1534. if (taskEntity.getEndTime() != null) {
  1535. return;
  1536. }
  1537. UserInfo userInfo = flowModel.getUserInfo();
  1538. userInfo.setUserId(userId);
  1539. userInfo.setUserAccount(userAccount);
  1540. userInfo.setUserName(userName);
  1541. flowModel.setUserInfo(userInfo);
  1542. flowModel.setHandleStatus(FlowNature.AuditCompletion);
  1543. operatorService.audit(operator, flowModel);
  1544. if (taskEntity.getRejectDataId() == null) {
  1545. this.autoAudit(flowModel);
  1546. }
  1547. }
  1548. }
  1549. }
  1550. }
  1551. }
  1552. // 异常补偿
  1553. public void compensate(TaskEntity taskEntity) throws WorkFlowException {
  1554. String instanceId = taskEntity.getInstanceId();
  1555. CompensateFo fo = new CompensateFo();
  1556. fo.setInstanceId(instanceId);
  1557. List<String> sourceList = Arrays.stream(taskEntity.getCurrentNodeCode().split(",")).collect(Collectors.toList());
  1558. fo.setSource(sourceList);
  1559. List<FlowableTaskModel> models = flowAbleUrl.compensate(fo);
  1560. if (CollectionUtil.isNotEmpty(models)) {
  1561. FlowableTaskModel flowableTaskModel = models.get(0);
  1562. // 实例ID不一样,更新
  1563. String newInstanceId = flowableTaskModel.getInstanceId();
  1564. if (StringUtil.isNotBlank(newInstanceId) && !instanceId.equals(newInstanceId)) {
  1565. taskEntity.setInstanceId(newInstanceId);
  1566. taskService.updateById(taskEntity);
  1567. }
  1568. List<NodeRecordEntity> nodeRecords = recordUtil.getNodeRecord(taskEntity.getId());
  1569. List<String> nodeIds = nodeRecords.stream().map(NodeRecordEntity::getNodeId).filter(StringUtil::isNotBlank).collect(Collectors.toList());
  1570. // 更新经办关联的flowable的任务id
  1571. List<OperatorEntity> operatorList = this.getList(taskEntity.getId());
  1572. List<OperatorEntity> updateList = new ArrayList<>();
  1573. // 更新记录关联的flowable的任务id
  1574. List<RecordEntity> recordList = recordUtil.getList(taskEntity.getId());
  1575. List<RecordEntity> updateRecordList = new ArrayList<>();
  1576. //外部节点
  1577. List<EventLogEntity> eventLogList = eventLogService.getList(taskEntity.getId());
  1578. List<EventLogEntity> updateEventLogList = new ArrayList<>();
  1579. if (CollectionUtil.isNotEmpty(nodeIds)) {
  1580. // 在节点记录中的存在的nodeId,不需要更新
  1581. operatorList = operatorList.stream().filter(e -> !nodeIds.contains(e.getNodeId())).collect(Collectors.toList());
  1582. recordList = recordList.stream().filter(e -> !nodeIds.contains(e.getNodeId())).collect(Collectors.toList());
  1583. }
  1584. for (FlowableTaskModel model : models) {
  1585. List<OperatorEntity> list = operatorList.stream()
  1586. .filter(e -> e.getNodeCode().equals(model.getTaskKey())).collect(Collectors.toList());
  1587. list.forEach(e -> e.setNodeId(model.getTaskId()));
  1588. updateList.addAll(list);
  1589. // 记录修改
  1590. List<RecordEntity> collect = recordList.stream()
  1591. .filter(e -> e.getNodeCode().equals(model.getTaskKey())).collect(Collectors.toList());
  1592. collect.forEach(e -> e.setNodeId(model.getTaskId()));
  1593. updateRecordList.addAll(collect);
  1594. //外部节点
  1595. List<EventLogEntity> logList = eventLogList.stream()
  1596. .filter(e -> e.getNodeCode().equals(model.getTaskKey())).collect(Collectors.toList());
  1597. logList.forEach(e -> e.setNodeId(model.getTaskId()));
  1598. updateEventLogList.addAll(logList);
  1599. }
  1600. operatorService.updateBatchById(updateList);
  1601. recordUtil.updateRecords(updateRecordList);
  1602. eventLogService.updateBatchById(updateEventLogList);
  1603. }
  1604. if (!ObjectUtil.equals(taskEntity.getParentId(), FlowNature.ParentId)) {
  1605. TaskEntity parent = taskService.getById(taskEntity.getParentId());
  1606. if (null == parent) {
  1607. return;
  1608. }
  1609. this.compensate(parent);
  1610. List<FlowableTaskModel> currentModel = flowAbleUrl.getCurrentTask(parent.getInstanceId());
  1611. FlowableTaskModel model = currentModel.stream().filter(e -> ObjectUtil.equals(taskEntity.getSubCode(), e.getTaskKey())).findFirst().orElse(null);
  1612. if (null != model) {
  1613. SubParameterModel subParameter = JsonUtil.getJsonToBean(taskEntity.getSubParameter(), SubParameterModel.class);
  1614. subParameter.setNodeId(model.getTaskId());
  1615. taskEntity.setSubParameter(JsonUtil.getObjectToString(subParameter));
  1616. taskService.updateById(taskEntity);
  1617. }
  1618. }
  1619. }
  1620. // 设置异常处理
  1621. public void handleErrorRule(NodeModel nodeModel, List<FlowErrorModel> errorList) {
  1622. if (null == nodeModel) {
  1623. return;
  1624. }
  1625. FlowErrorModel errorModel = new FlowErrorModel();
  1626. errorModel.setNodeCode(nodeModel.getNodeId());
  1627. errorModel.setNodeName(nodeModel.getNodeName());
  1628. errorList.add(errorModel);
  1629. }
  1630. /**
  1631. * 校验经办的任务是否暂停
  1632. *
  1633. * @param ids 经办主键集合
  1634. * @param resList 结果经办主键集合
  1635. * @param flag true则判断退签
  1636. */
  1637. public void checkBatch(List<String> ids, List<String> resList, Boolean flag) throws WorkFlowException {
  1638. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1639. queryWrapper.lambda().in(OperatorEntity::getId, ids);
  1640. List<OperatorEntity> list = operatorService.list(queryWrapper);
  1641. List<String> taskIds = list.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList());
  1642. List<TaskEntity> taskEntityList = taskIds.isEmpty() ? new ArrayList<>() : taskService.listByIds(taskIds);
  1643. for (OperatorEntity operator : list) {
  1644. TaskEntity taskEntity = taskEntityList.stream()
  1645. .filter(e -> !Objects.equals(e.getStatus(), TaskStatusEnum.PAUSED.getCode())
  1646. && e.getId().equals(operator.getTaskId())).findFirst().orElse(null);
  1647. if (null != taskEntity) {
  1648. resList.add(operator.getId());
  1649. }
  1650. }
  1651. if (CollectionUtil.isEmpty(resList)) {
  1652. throw new WorkFlowException(MsgCode.WF112.get());
  1653. }
  1654. if (flag) {
  1655. resList.clear();
  1656. List<String> flowIds = taskEntityList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList());
  1657. List<TemplateNodeEntity> globalList = templateNodeService.getList(flowIds, NodeEnum.global.getType());
  1658. for (OperatorEntity operator : list) {
  1659. TaskEntity taskEntity = taskEntityList.stream()
  1660. .filter(e -> e.getId().equals(operator.getTaskId())).findFirst().orElse(null);
  1661. if (null != taskEntity) {
  1662. TemplateNodeEntity globalEntity = globalList.stream()
  1663. .filter(e -> e.getFlowId().equals(taskEntity.getFlowId())).findFirst().orElse(null);
  1664. if (null != globalEntity) {
  1665. NodeModel global = JsonUtil.getJsonToBean(globalEntity.getNodeJson(), NodeModel.class);
  1666. // 开启签收,允许退签
  1667. if (global.getHasSignFor()) {
  1668. resList.add(operator.getId());
  1669. }
  1670. }
  1671. }
  1672. }
  1673. if (CollectionUtil.isEmpty(resList)) {
  1674. throw new WorkFlowException(MsgCode.WF080.get());
  1675. }
  1676. }
  1677. }
  1678. public void checkBatchRevoke(List<String> ids, List<String> resList, Integer batchType) throws WorkFlowException {
  1679. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1680. queryWrapper.lambda().in(OperatorEntity::getId, ids);
  1681. List<OperatorEntity> list = operatorService.list(queryWrapper);
  1682. List<Integer> status = ImmutableList.of(2, 3);
  1683. for (OperatorEntity operator : list) {
  1684. if (status.contains(batchType) && ObjectUtil.equals(operator.getStatus(), OperatorStateEnum.Revoke.getCode())) {
  1685. continue;
  1686. }
  1687. resList.add(operator.getId());
  1688. }
  1689. if (CollectionUtil.isEmpty(resList)) {
  1690. if (ObjectUtil.equals(batchType, 2)) {
  1691. throw new WorkFlowException(MsgCode.WF126.get());
  1692. } else if (ObjectUtil.equals(batchType, 3)) {
  1693. throw new WorkFlowException(MsgCode.WF127.get());
  1694. }
  1695. }
  1696. }
  1697. // 判断终止
  1698. public void checkCancel(List<String> ids, List<String> resList) throws WorkFlowException {
  1699. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1700. queryWrapper.lambda().in(OperatorEntity::getId, ids);
  1701. List<OperatorEntity> list = operatorService.list(queryWrapper);
  1702. List<String> taskIds = list.stream().map(OperatorEntity::getTaskId).collect(Collectors.toList());
  1703. List<TaskEntity> taskEntityList = taskIds.isEmpty() ? new ArrayList<>() : taskService.listByIds(taskIds);
  1704. for (OperatorEntity operator : list) {
  1705. TaskEntity taskEntity = taskEntityList.stream()
  1706. .filter(e -> !Objects.equals(e.getStatus(), TaskStatusEnum.CANCEL.getCode())
  1707. && e.getId().equals(operator.getTaskId())).findFirst().orElse(null);
  1708. if (null != taskEntity) {
  1709. resList.add(operator.getId());
  1710. }
  1711. }
  1712. if (CollectionUtil.isEmpty(resList)) {
  1713. throw new WorkFlowException(MsgCode.WF123.get());
  1714. }
  1715. }
  1716. // 更新经办的接收时间
  1717. public void updateCreateTime(FlowModel flowModel) {
  1718. TaskEntity taskEntity = flowModel.getTaskEntity();
  1719. String taskId = taskEntity.getId();
  1720. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1721. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId)
  1722. .isNull(OperatorEntity::getHandleStatus);
  1723. List<OperatorEntity> list = operatorService.list(queryWrapper);
  1724. if (CollectionUtil.isNotEmpty(list)) {
  1725. list.forEach(e -> e.setCreatorTime(new Date()));
  1726. operatorService.updateBatchById(list);
  1727. addOperatorList(list, flowModel);
  1728. }
  1729. }
  1730. /**
  1731. * 添加事件到线程变量
  1732. */
  1733. public void addEvent(FlowModel flowModel) {
  1734. Integer status = flowModel.getEventStatus();
  1735. FlowModel model = new FlowModel();
  1736. model.setTaskEntity(flowModel.getTaskEntity());
  1737. model.setNodeEntity(flowModel.getNodeEntity());
  1738. model.setNodes(flowModel.getNodes());
  1739. model.setFormData(flowModel.getFormData());
  1740. if (ObjectUtil.equals(EventEnum.End.getStatus(), status)) {
  1741. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1742. TemplateNodeEntity start = nodeEntityList.stream()
  1743. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null);
  1744. if (null != start) {
  1745. model.setNodeEntity(start);
  1746. }
  1747. }
  1748. FlowEventHolder.addEvent(status, model, FlowContextHolder.getAllData());
  1749. }
  1750. /**
  1751. * 处理线程变量中的事件
  1752. */
  1753. public void handleEvent() throws WorkFlowException {
  1754. List<EventModel> allEvent = FlowEventHolder.getAllEvent();
  1755. for (EventModel eventModel : allEvent) {
  1756. String type = eventModel.getType();
  1757. if (Objects.equals(NodeEnum.approver.getType(), type)) {
  1758. this.event(eventModel.getFlowModel(), eventModel.getStatus(), eventModel.getAllData());
  1759. } else if (Objects.equals(NodeEnum.outside.getType(), type)) {
  1760. String interId = eventModel.getInterfaceId();
  1761. Map<String, String> parameterMap = eventModel.getParameterData();
  1762. String id = eventModel.getId();
  1763. ActionResult result = serviceUtil.infoToId(interId, parameterMap);
  1764. EventLogEntity eventLog = eventLogService.getById(id);
  1765. if (eventLog != null) {
  1766. eventLog.setResult(JsonUtil.getObjectToString(result));
  1767. boolean retryResult = Objects.equals(200, result.getCode());
  1768. eventLog.setStatus(retryResult ? FlowNature.Success : FlowNature.Lose);
  1769. eventLogService.updateById(eventLog);
  1770. }
  1771. }
  1772. }
  1773. FlowEventHolder.clear();
  1774. }
  1775. /**
  1776. * 处理线程变量中的超时
  1777. */
  1778. public void handleOperator() {
  1779. List<FlowOperatorModel> operatorListAll = FlowOperatorHolder.getOperatorList();
  1780. for (FlowOperatorModel model : operatorListAll) {
  1781. List<OperatorEntity> list = model.getList() != null ? model.getList() : new ArrayList<>();
  1782. Map<String, Map<String, Object>> allData = model.getAllData();
  1783. Map<String, List<OperatorEntity>> taskMap = list.stream().collect(Collectors.groupingBy(OperatorEntity::getTaskId));
  1784. for (String taskId : taskMap.keySet()) {
  1785. List<OperatorEntity> operatorList = taskMap.get(taskId) != null ? taskMap.get(taskId) : new ArrayList<>();
  1786. Map<String, List<OperatorEntity>> operatorMap = operatorList.stream().collect(Collectors.groupingBy(OperatorEntity::getNodeCode));
  1787. for (String nodeCode : operatorMap.keySet()) {
  1788. List<OperatorEntity> operator = operatorMap.get(nodeCode) != null ? operatorMap.get(nodeCode) : new ArrayList<>();
  1789. if (operator.isEmpty()) {
  1790. continue;
  1791. }
  1792. FlowModel flowModel = JsonUtil.getJsonToBean(model.getFlowModel(), FlowModel.class);
  1793. Map<String, NodeModel> nodes = flowModel.getNodes();
  1794. NodeModel global = nodes.get(NodeEnum.global.getType());
  1795. NodeModel nodeModel = nodes.get(nodeCode);
  1796. String modelFormId = nodeModel.getFormId();
  1797. modelFormId = StringUtil.isNotBlank(modelFormId) ? modelFormId : global.getFormId();
  1798. Map<String, Object> formData = allData.get(taskId + JnpfConst.SIDE_MARK + modelFormId);
  1799. if (formData != null) {
  1800. flowModel.setFormData(formData);
  1801. }
  1802. TimeUtil.timeModel(operator, flowModel, redisUtil);
  1803. }
  1804. }
  1805. }
  1806. FlowOperatorHolder.clear();
  1807. }
  1808. /**
  1809. * 添加超时到线程变量
  1810. */
  1811. public void addOperatorList(List<OperatorEntity> list, FlowModel flowModel) {
  1812. if (!list.isEmpty()) {
  1813. FlowOperatorModel model = new FlowOperatorModel();
  1814. model.setList(JsonUtil.getJsonToList(list, OperatorEntity.class));
  1815. model.setFlowModel(JsonUtil.getJsonToBean(flowModel, FlowModel.class));
  1816. FlowOperatorHolder.addOperator(model, FlowContextHolder.getAllData());
  1817. }
  1818. }
  1819. //保存流程id
  1820. public void addTask(List<String> taskIdList) {
  1821. FlowStatusHolder.addTaskIdList(taskIdList);
  1822. }
  1823. //删除流程id
  1824. public void addDelTask(String taskId, String flowId) {
  1825. FlowStatusHolder.addDelTaskIdList(taskId, flowId);
  1826. }
  1827. //更改状态
  1828. public void handleTaskStatus() {
  1829. Map<String, String> delTaskMap = FlowStatusHolder.getDelTaskMap();
  1830. for (String taskId : delTaskMap.keySet()) {
  1831. String flowId = delTaskMap.get(taskId);
  1832. if (StringUtil.isEmpty(flowId)) {
  1833. continue;
  1834. }
  1835. List<String> flowIdList = ImmutableList.of(flowId);
  1836. List<TemplateNodeEntity> list = templateNodeService.getList(flowIdList, null);
  1837. Set<String> formIds = list.stream().map(TemplateNodeEntity::getFormId).collect(Collectors.toSet());
  1838. FlowStateModel model = new FlowStateModel(new ArrayList<>(formIds), taskId, 0);
  1839. serviceUtil.saveState(model);
  1840. }
  1841. List<String> taskIdList = FlowStatusHolder.getTaskList();
  1842. if (!taskIdList.isEmpty()) {
  1843. List<TaskEntity> taskList = taskService.getInfosSubmit(taskIdList.toArray(new String[0]), TaskEntity::getId, TaskEntity::getStatus, TaskEntity::getFlowId);
  1844. List<String> flowIdList = taskList.stream().map(TaskEntity::getFlowId).collect(Collectors.toList());
  1845. List<TemplateNodeEntity> list = templateNodeService.getList(flowIdList, null);
  1846. for (TaskEntity task : taskList) {
  1847. String id = task.getId();
  1848. String flowId = task.getFlowId();
  1849. Integer status = task.getStatus();
  1850. Set<String> formIds = list.stream().filter(e -> e.getFlowId().equals(flowId)).map(TemplateNodeEntity::getFormId).collect(Collectors.toSet());
  1851. FlowStateModel model = new FlowStateModel(new ArrayList<>(formIds), id, status);
  1852. serviceUtil.saveState(model);
  1853. }
  1854. }
  1855. FlowStatusHolder.clear();
  1856. }
  1857. // 事件
  1858. public void event(FlowModel flowModel, Integer status, Map<String, Map<String, Object>> allData) throws WorkFlowException {
  1859. FlowModel model = JsonUtil.getJsonToBean(flowModel, FlowModel.class);
  1860. TemplateNodeEntity nodeEntity = model.getNodeEntity();
  1861. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1862. RecordEntity record = new RecordEntity();
  1863. record.setNodeCode(nodeModel.getNodeId());
  1864. // 结束事件
  1865. if (ObjectUtil.equals(status, EventEnum.End.getStatus())) {
  1866. List<TemplateNodeEntity> nodeEntityList = model.getNodeEntityList();
  1867. TemplateNodeEntity start = nodeEntityList.stream()
  1868. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null);
  1869. if (null != start) {
  1870. nodeModel = JsonUtil.getJsonToBean(start.getNodeJson(), NodeModel.class);
  1871. }
  1872. }
  1873. TaskEntity taskEntity = model.getTaskEntity();
  1874. String formId = nodeEntity.getFormId();
  1875. String taskId = taskEntity.getId();
  1876. Map<String, Object> map = allData.get(taskId + JnpfConst.SIDE_MARK + formId) != null ? allData.get(taskId + JnpfConst.SIDE_MARK + formId) : serviceUtil.infoData(formId, taskId);
  1877. model.setFormData(map);
  1878. msgUtil.event(status, nodeModel, record, model);
  1879. }
  1880. // 事件
  1881. public void event(FlowModel flowModel, Integer status) throws WorkFlowException {
  1882. event(flowModel, status, FlowContextHolder.getAllData());
  1883. }
  1884. public List<OperatorEntity> getList(String taskId, List<String> nodeCodes) {
  1885. if (StringUtil.isEmpty(taskId)) {
  1886. return new ArrayList<>();
  1887. }
  1888. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1889. queryWrapper.lambda().eq(OperatorEntity::getTaskId, taskId).ne(OperatorEntity::getStatus, OperatorStateEnum.Futility.getCode());
  1890. if (CollectionUtil.isNotEmpty(nodeCodes)) {
  1891. queryWrapper.lambda().in(OperatorEntity::getNodeCode, nodeCodes);
  1892. }
  1893. queryWrapper.lambda().orderByDesc(OperatorEntity::getCreatorTime);
  1894. return operatorService.list(queryWrapper);
  1895. }
  1896. public void deleteInTurnOperator(OperatorEntity operator, String handleId) {
  1897. List<String> handleAll = new ArrayList<>();
  1898. if (operator.getHandleAll() != null) {
  1899. handleAll = Arrays.stream(operator.getHandleAll().split(",")).collect(Collectors.toList());
  1900. } else {
  1901. String handleParameter = operator.getHandleParameter();
  1902. AddSignModel addSignModel = JsonUtil.getJsonToBean(handleParameter, AddSignModel.class);
  1903. if (ObjectUtil.equals(addSignModel.getCounterSign(), FlowNature.ImproperApprover)) {
  1904. handleAll = addSignModel.getAddSignUserIdList();
  1905. }
  1906. }
  1907. int index = handleAll.indexOf(handleId);
  1908. if (index != -1 && index < handleAll.size() - 1) {
  1909. String nextHandleId = handleAll.get(index + 1);
  1910. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1911. queryWrapper.lambda().eq(OperatorEntity::getNodeId, operator.getNodeId())
  1912. .eq(OperatorEntity::getHandleId, nextHandleId);
  1913. List<OperatorEntity> deleteList = operatorService.list(queryWrapper);
  1914. if (CollectionUtil.isNotEmpty(deleteList)) {
  1915. operatorService.removeByIds(deleteList);
  1916. }
  1917. }
  1918. }
  1919. public void deleteStepOperator(OperatorEntity operator) {
  1920. if (operator != null) {
  1921. QueryWrapper<OperatorEntity> queryWrapper = new QueryWrapper<>();
  1922. queryWrapper.lambda().eq(OperatorEntity::getTaskId, operator.getTaskId());
  1923. queryWrapper.lambda().eq(OperatorEntity::getHandleAll, operator.getId());
  1924. List<OperatorEntity> deleteList = operatorService.list(queryWrapper);
  1925. if (CollectionUtil.isNotEmpty(deleteList)) {
  1926. operatorService.removeByIds(deleteList);
  1927. }
  1928. }
  1929. }
  1930. // 处理嵌入的任务流程
  1931. public void handleTrigger(OperatorEntity operatorEntity, FlowModel flowModel) throws WorkFlowException {
  1932. String nodeCode = operatorEntity.getNodeCode();
  1933. Map<String, NodeModel> nodes = flowModel.getNodes();
  1934. List<String> nextList = new ArrayList<>();
  1935. nextList = taskUtil.getNextList(flowModel.getDeploymentId(), nodeCode, nodes, nextList);
  1936. if (CollectionUtil.isEmpty(nextList)) {
  1937. return;
  1938. }
  1939. Integer action = flowModel.getAction();
  1940. TaskEntity taskEntity = flowModel.getTaskEntity();
  1941. String flowId = taskEntity.getFlowId();
  1942. Map<String, Object> formData = flowModel.getFormData();
  1943. List<SystemAuditModel> systemList = SystemAuditHolder.getAll();
  1944. // 存在同步
  1945. boolean isAsync = false;
  1946. List<String> approveNode = new ArrayList<>();
  1947. Map<String, NodeModel> triggers = new HashMap<>();
  1948. for (String next : nextList) {
  1949. NodeModel nodeModel = nodes.get(next);
  1950. if (null != nodeModel) {
  1951. if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.trigger.getType())) {
  1952. if (ObjectUtil.equals(nodeModel.getIsAsync(), FlowNature.ChildSync)) {
  1953. isAsync = true;
  1954. }
  1955. triggers.put(next, nodeModel);
  1956. } else if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.approver.getType())) {
  1957. approveNode.add(nodeModel.getNodeId());
  1958. }
  1959. }
  1960. }
  1961. if (CollectionUtil.isEmpty(triggers)) {
  1962. return;
  1963. }
  1964. Boolean rejectTrigger = flowModel.getRejectTrigger();
  1965. if (ObjectUtil.equals(action, 3) || rejectTrigger) {
  1966. Map<String, Object> variables = triggerUtil.getVariables(flowModel.getDeploymentId(), nodeCode);
  1967. if (ObjectUtil.equals(action, 3)) {
  1968. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  1969. TemplateNodeEntity end = nodeEntityList.stream()
  1970. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.end.getType())).findFirst().orElse(null);
  1971. if (null != end) {
  1972. // 将目标是结束节点的线 的值变更为false
  1973. FlowableNodeModel info = flowAbleUrl.getElementInfo(flowModel.getDeploymentId(), end.getNodeCode());
  1974. List<String> incomingList = info.getIncomingList();
  1975. if (CollectionUtil.isNotEmpty(incomingList)) {
  1976. for (String key : variables.keySet()) {
  1977. if (incomingList.contains(key)) {
  1978. variables.put(key, false);
  1979. }
  1980. }
  1981. }
  1982. }
  1983. }
  1984. triggerUtil.complete(operatorEntity.getNodeId(), variables);
  1985. } else {
  1986. // 异步处理
  1987. if (!isAsync) {
  1988. // 获取线程存储的需要系统通过的经办
  1989. if (CollectionUtil.isNotEmpty(systemList)) {
  1990. for (SystemAuditModel model : systemList) {
  1991. try {
  1992. this.autoAudit(model.getOperator(), model.getFlowModel());
  1993. } catch (Exception e) {
  1994. log.error("系统审批异常", e);
  1995. }
  1996. }
  1997. systemList = new ArrayList<>();
  1998. }
  1999. }
  2000. }
  2001. UserInfo userInfo = UserProvider.getUser();
  2002. List<ExecuteAsyncModel> list = new ArrayList<>();
  2003. for (String key : triggers.keySet()) {
  2004. NodeModel nodeModel = nodes.get(key);
  2005. if (null == nodeModel) {
  2006. continue;
  2007. }
  2008. if (ObjectUtil.equals(nodeModel.getTriggerEvent(), 2)) {
  2009. if (!nodeModel.getActionList().contains(action)) {
  2010. continue;
  2011. }
  2012. }
  2013. List<OperatorEntity> operatorList = new ArrayList<>();
  2014. List<TaskEntity> subTaskList = new ArrayList<>();
  2015. Boolean sync = ObjectUtil.equals(nodeModel.getIsAsync(), FlowNature.ChildSync);
  2016. if (sync) {
  2017. if (CollectionUtil.isNotEmpty(approveNode)) {
  2018. operatorList = this.getList(taskEntity.getId(), approveNode);
  2019. if (CollectionUtil.isNotEmpty(operatorList)) {
  2020. for (OperatorEntity operator : operatorList) {
  2021. operator.setStatus(OperatorStateEnum.Waiting.getCode());
  2022. }
  2023. operatorService.updateBatchById(operatorList);
  2024. }
  2025. // 子流程的处理
  2026. subTaskList = taskUtil.getSubTask(taskEntity.getId(), approveNode);
  2027. if (CollectionUtil.isNotEmpty(subTaskList)) {
  2028. for (TaskEntity subTask : subTaskList) {
  2029. Integer status = subTask.getStatus();
  2030. subTask.setHisStatus(status);
  2031. subTask.setStatus(-2);
  2032. }
  2033. taskService.updateBatchById(subTaskList);
  2034. }
  2035. }
  2036. }
  2037. List<Map<String, Object>> dataList = new ArrayList<>();
  2038. dataList.add(formData);
  2039. ExecuteModel model = new ExecuteModel();
  2040. model.setFlowId(flowId);
  2041. model.setDataList(dataList);
  2042. model.setUserInfo(userInfo);
  2043. model.setParentId(FlowNature.ParentId);
  2044. model.setTaskId(taskEntity.getId());
  2045. model.setInstanceId(taskEntity.getInstanceId());
  2046. model.setGroupId(nodeModel.getGroupId());
  2047. model.setNodeCode(nodeCode);
  2048. model.setNodeId(operatorEntity.getNodeId());
  2049. model.setTriggerKey(key);
  2050. model.setIsAsync(nodeModel.getIsAsync());
  2051. if (ObjectUtil.equals(action, 3) || rejectTrigger) {
  2052. try {
  2053. triggerUtil.execute(model);
  2054. } catch (Exception e) {
  2055. e.printStackTrace();
  2056. // TriggerRecordHolder.clear();
  2057. if (sync) {
  2058. taskService.cancel(taskEntity.getId(), flowModel, true);
  2059. }
  2060. }
  2061. flowModel.setBackId(model.getCurrentNodeId());
  2062. } else {
  2063. //flowAsyncUtil.execute(model, sync, operatorList, subTaskList, systemList, flowModel);
  2064. ExecuteAsyncModel asyncModel = new ExecuteAsyncModel();
  2065. asyncModel.setModel(model);
  2066. asyncModel.setSync(sync);
  2067. asyncModel.setOperatorList(operatorList);
  2068. asyncModel.setSubTaskList(subTaskList);
  2069. asyncModel.setSystemList(systemList);
  2070. asyncModel.setFlowModel(flowModel);
  2071. list.add(asyncModel);
  2072. }
  2073. }
  2074. try {
  2075. execute(list);
  2076. } catch (Exception e) {
  2077. e.printStackTrace();
  2078. // TriggerRecordHolder.clear();
  2079. }
  2080. SystemAuditHolder.clear();
  2081. }
  2082. public void execute(List<ExecuteAsyncModel> list) throws Exception {
  2083. for (ExecuteAsyncModel asyncModel : list) {
  2084. FlowModel flowModel = asyncModel.getFlowModel();
  2085. ExecuteModel model = asyncModel.getModel();
  2086. Boolean sync = asyncModel.getSync();
  2087. List<OperatorEntity> operatorList = asyncModel.getOperatorList();
  2088. List<SystemAuditModel> systemList = asyncModel.getSystemList();
  2089. List<TaskEntity> subTaskList = asyncModel.getSubTaskList();
  2090. this.execute(model, sync, operatorList, subTaskList, systemList, flowModel);
  2091. }
  2092. }
  2093. public void execute(ExecuteModel model, Boolean isAsync, List<OperatorEntity> operatorList, List<TaskEntity> subTaskList, List<SystemAuditModel> systemList, FlowModel flowModel) throws Exception {
  2094. try {
  2095. triggerUtil.execute(model);
  2096. } catch (Exception e) {
  2097. e.printStackTrace();
  2098. // 终止流程
  2099. if (isAsync) {
  2100. TaskEntity taskEntity = flowModel.getTaskEntity();
  2101. taskService.cancel(taskEntity.getId(), flowModel, true);
  2102. }
  2103. return;
  2104. }
  2105. // try {
  2106. // System.out.println("==================================================1");
  2107. // Thread.sleep(20000);
  2108. // System.out.println("==================================================2");
  2109. // } catch (InterruptedException e) {
  2110. // e.printStackTrace();
  2111. // }
  2112. if (isAsync) {
  2113. if (CollectionUtil.isNotEmpty(operatorList)) {
  2114. for (OperatorEntity operator : operatorList) {
  2115. operator.setStatus(OperatorStateEnum.Runing.getCode());
  2116. }
  2117. operatorService.updateBatchById(operatorList);
  2118. }
  2119. if (CollectionUtil.isNotEmpty(subTaskList)) {
  2120. for (TaskEntity taskEntity : subTaskList) {
  2121. Integer hisStatus = taskEntity.getHisStatus();
  2122. taskEntity.setStatus(hisStatus);
  2123. }
  2124. taskService.updateBatchById(subTaskList);
  2125. }
  2126. if (CollectionUtil.isNotEmpty(systemList)) {
  2127. for (SystemAuditModel systemAuditModel : systemList) {
  2128. try {
  2129. autoAudit(systemAuditModel.getOperator(), systemAuditModel.getFlowModel());
  2130. } catch (Exception e) {
  2131. e.printStackTrace();
  2132. }
  2133. }
  2134. }
  2135. try {
  2136. autoAudit(flowModel, false);
  2137. } catch (Exception e) {
  2138. e.printStackTrace();
  2139. }
  2140. }
  2141. }
  2142. /**
  2143. * 外部节点参数
  2144. */
  2145. public Map<String, String> outsideData(FlowModel flowModel, List<TemplateJsonModel> templateJsonModelList, Map<String, Map<String, Object>> allData, String resultNodeCode, String eventId) throws WorkFlowException {
  2146. TaskEntity taskEntity = flowModel.getTaskEntity();
  2147. List<TemplateNodeEntity> nodeEntityList = flowModel.getNodeEntityList();
  2148. TemplateNodeEntity startNode = nodeEntityList.stream()
  2149. .filter(e -> Objects.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  2150. String startNodeFormId = startNode.getFormId();
  2151. String taskId = taskEntity.getId();
  2152. Map<String, Object> formData = flowModel.getFormData();
  2153. formData.put(FlowConstant.StartNodeFormId, startNodeFormId);
  2154. TemplateNodeEntity prevNode = nodeEntityList.stream()
  2155. .filter(e -> Objects.equals(resultNodeCode, e.getNodeCode())).findFirst().orElse(new TemplateNodeEntity());
  2156. formData.put(FlowConstant.PREV_NODE_FORM_ID, prevNode.getFormId());
  2157. String nodeCode = flowModel.getNodeCode();
  2158. RecordEntity record = new RecordEntity();
  2159. record.setNodeCode(nodeCode);
  2160. record.setNodeId(eventId);
  2161. Map<String, Object> parameterData = new HashMap<>();
  2162. for (TemplateJsonModel templateJsonModel : templateJsonModelList) {
  2163. if (Objects.equals(FieldEnum.Field.getCode(), templateJsonModel.getSourceType())) {
  2164. String relationField = templateJsonModel.getRelationField();
  2165. String[] split = relationField.split("\\|");
  2166. String[] childTable = relationField.split("-");
  2167. if (split.length > 1) {
  2168. String formId = split[split.length - 1];
  2169. String field = split[0];
  2170. Map<String, Object> dataMap = allData.get(taskId + JnpfConst.SIDE_MARK + formId) != null ? allData.get(taskId + JnpfConst.SIDE_MARK + formId) : serviceUtil.infoData(formId, taskId);
  2171. parameterData.put(relationField, dataMap.get(field));
  2172. } else {
  2173. String field = split[split.length - 1];
  2174. parameterData.put(relationField, formData.get(field));
  2175. }
  2176. }
  2177. }
  2178. Map<String, Object> dataMap = new HashMap<>(formData);
  2179. dataMap.putAll(parameterData);
  2180. FlowModel parameterModel = new FlowModel();
  2181. parameterModel.setFormData(dataMap);
  2182. parameterModel.setRecordEntity(record);
  2183. parameterModel.setTaskEntity(taskEntity);
  2184. Map<String, String> data = msgUtil.parameterMap(parameterModel, templateJsonModelList);
  2185. return data;
  2186. }
  2187. }