TriggerUtil.java 83 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711
  1. package jnpf.flowable.util;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.google.common.collect.ImmutableList;
  6. import com.google.common.collect.ImmutableMap;
  7. import jnpf.base.ActionResult;
  8. import jnpf.base.UserInfo;
  9. import jnpf.base.entity.VisualdevEntity;
  10. import jnpf.base.model.ColumnDataModel;
  11. import jnpf.base.model.VisualDevJsonModel;
  12. import jnpf.base.model.VisualWebTypeEnum;
  13. import jnpf.base.model.flow.FlowFormDataModel;
  14. import jnpf.base.model.schedule.ScheduleNewCrForm;
  15. import jnpf.constant.DataInterfaceVarConst;
  16. import jnpf.constant.MsgCode;
  17. import jnpf.database.model.superQuery.SuperJsonModel;
  18. import jnpf.database.model.superQuery.SuperQueryJsonModel;
  19. import jnpf.exception.WorkFlowException;
  20. import jnpf.flowable.entity.*;
  21. import jnpf.flowable.enums.*;
  22. import jnpf.flowable.model.flowable.*;
  23. import jnpf.flowable.model.task.FlowMethod;
  24. import jnpf.flowable.model.task.FlowModel;
  25. import jnpf.flowable.model.templatejson.FlowFormModel;
  26. import jnpf.flowable.model.templatenode.nodejson.*;
  27. import jnpf.flowable.model.trigger.ExecuteModel;
  28. import jnpf.flowable.model.trigger.TriggerDataFo;
  29. import jnpf.flowable.model.trigger.TriggerDataModel;
  30. import jnpf.flowable.model.trigger.TriggerModel;
  31. import jnpf.flowable.model.util.FlowConstant;
  32. import jnpf.flowable.model.util.FlowNature;
  33. import jnpf.flowable.model.util.TriggerHolder;
  34. import jnpf.flowable.model.util.TriggerRecordHolder;
  35. import jnpf.flowable.service.*;
  36. import jnpf.message.model.SentMessageForm;
  37. import jnpf.model.visualJson.FieLdsModel;
  38. import jnpf.model.visualJson.FormDataModel;
  39. import jnpf.model.visualJson.TableModel;
  40. import jnpf.onlinedev.model.PaginationModel;
  41. import jnpf.permission.entity.UserEntity;
  42. import jnpf.util.*;
  43. import jnpf.util.visiual.JnpfKeyConsts;
  44. import lombok.extern.slf4j.Slf4j;
  45. import org.springframework.beans.factory.annotation.Autowired;
  46. import org.springframework.stereotype.Component;
  47. import java.util.*;
  48. import java.util.stream.Collectors;
  49. /**
  50. * 类的描述
  51. *
  52. * @author JNPF@YinMai Info. Co., Ltd
  53. * @version 5.0.x
  54. * @since 2024/9/9 9:51
  55. */
  56. @Component
  57. @Slf4j
  58. public class TriggerUtil {
  59. @Autowired
  60. private ServiceUtil serviceUtil;
  61. @Autowired
  62. private TaskService taskService;
  63. @Autowired
  64. private TemplateService templateService;
  65. @Autowired
  66. private TemplateJsonService templateJsonService;
  67. @Autowired
  68. private TemplateNodeService templateNodeService;
  69. @Autowired
  70. private TriggerTaskService triggerTaskService;
  71. @Autowired
  72. private TriggerRecordService triggerRecordService;
  73. @Autowired
  74. private FlowAbleUrl flowAbleUrl;
  75. @Autowired
  76. private TaskUtil taskUtil;
  77. @Autowired
  78. private OperatorUtil operatorUtil;
  79. @Autowired
  80. private ConditionService conditionService;
  81. public List<TriggerDataModel> getTriggerDataModel(TriggerDataFo fo) {
  82. String modelId = fo.getModelId();
  83. Integer trigger = fo.getTrigger();
  84. List<String> dataId = fo.getDataId();
  85. List<Map<String, Object>> dataMap = fo.getDataMap();
  86. List<String> updateFields = fo.getUpdateFields();
  87. List<TriggerDataModel> res = new ArrayList<>();
  88. Map<String, NodeModel> triggerMap = this.getTriggerNode(modelId, trigger);
  89. if (CollectionUtil.isNotEmpty(triggerMap)) {
  90. for (String key : triggerMap.keySet()) {
  91. NodeModel nodeModel = triggerMap.get(key);
  92. // 判断指定字段修改
  93. if (this.checkUpdateField(trigger, nodeModel, updateFields)) {
  94. continue;
  95. }
  96. if (CollectionUtil.isNotEmpty(dataMap)) {
  97. TriggerDataModel model = new TriggerDataModel();
  98. model.setData(JsonUtil.getObjectToString(dataMap));
  99. model.setFlowId(key);
  100. res.add(model);
  101. continue;
  102. }
  103. List<Map<String, Object>> dataList = this.getDataList(nodeModel, new HashMap<>(), dataId);
  104. if (!dataList.isEmpty()) {
  105. TriggerDataModel model = new TriggerDataModel();
  106. model.setData(JsonUtil.getObjectToString(dataList));
  107. model.setFlowId(key);
  108. res.add(model);
  109. }
  110. }
  111. }
  112. return res;
  113. }
  114. // true表示 指定字段没有发生修改
  115. public boolean checkUpdateField(Integer trigger, NodeModel nodeModel, List<String> updateFields) {
  116. List<String> updateFieldList = nodeModel.getUpdateFieldList();
  117. if (CollectionUtil.isEmpty(updateFieldList)) {
  118. return false;
  119. }
  120. if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.eventTrigger.getType()) && ObjectUtil.equals(trigger, 2)) {
  121. // 任意字段发生修改,结果集合为空 说明指定字段(updateFieldList)不存在发生修改的字段(updateFields)中
  122. List<String> list = updateFieldList.stream().filter(updateFields::contains).collect(Collectors.toList());
  123. return CollectionUtil.isEmpty(list);
  124. }
  125. return false;
  126. }
  127. public Map<String, NodeModel> getTriggerNode(String formId, Integer trigger) {
  128. QueryWrapper<TemplateNodeEntity> queryWrapper = new QueryWrapper<>();
  129. List<String> typeList = ImmutableList.of(NodeEnum.eventTrigger.getType());
  130. queryWrapper.lambda().in(TemplateNodeEntity::getNodeType, typeList)
  131. .eq(TemplateNodeEntity::getFormId, formId);
  132. List<TemplateNodeEntity> nodeEntityList = templateNodeService.list(queryWrapper);
  133. List<String> flowIds = new ArrayList<>();
  134. for (TemplateNodeEntity nodeEntity : nodeEntityList) {
  135. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  136. if (ObjectUtil.equals(nodeModel.getTriggerFormEvent(), trigger)) {
  137. flowIds.add(nodeEntity.getFlowId());
  138. }
  139. }
  140. flowIds = flowIds.stream().distinct().collect(Collectors.toList());
  141. // 获取启用的任务流程id,用于过滤节点
  142. List<String> filterFlowIds = new ArrayList<>();
  143. if (CollectionUtil.isNotEmpty(flowIds)) {
  144. QueryWrapper<TemplateEntity> wrapper = new QueryWrapper<>();
  145. wrapper.lambda().in(TemplateEntity::getFlowId, flowIds).eq(TemplateEntity::getType, FlowNature.Quest);
  146. List<TemplateEntity> templateList = templateService.list(wrapper);
  147. filterFlowIds = templateList.stream().map(TemplateEntity::getFlowId).collect(Collectors.toList());
  148. }
  149. // Map<flowId, 触发节点>
  150. Map<String, NodeModel> map = new HashMap<>();
  151. for (String flowId : filterFlowIds) {
  152. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  153. .filter(e -> ObjectUtil.equals(e.getFlowId(), flowId)).findFirst().orElse(null);
  154. if (null != nodeEntity) {
  155. map.put(flowId, JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class));
  156. }
  157. }
  158. return map;
  159. }
  160. // @DSTransactional
  161. public void handleTimeTrigger(TriggerModel triggerModel) throws Exception {
  162. String flowId = triggerModel.getId();
  163. UserInfo userInfo = triggerModel.getUserInfo();
  164. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(flowId);
  165. TemplateNodeEntity timeTrigger = nodeEntityList.stream()
  166. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.timeTrigger.getType())).findFirst().orElse(null);
  167. if (null == timeTrigger) {
  168. return;
  169. }
  170. // TemplateJsonEntity jsonEntity = templateJsonService.getById(flowId);
  171. // NextOrPrevFo fo = new NextOrPrevFo();
  172. // fo.setDeploymentId(jsonEntity.getFlowableId());
  173. // fo.setTaskKey(timeTrigger.getNodeCode());
  174. // List<FlowableNodeModel> next = flowAbleUrl.getNext(fo);
  175. // if (CollectionUtil.isEmpty(next)) {
  176. // return;
  177. // }
  178. // String nodeCode = next.get(0).getId();
  179. // TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), nodeCode)).findFirst().orElse(null);
  180. // ExecuteModel executeModel = new ExecuteModel();
  181. // executeModel.setNodeModel(JsonUtil.getJsonToBean(nodeEntity, NodeModel.class));
  182. // executeModel.setUserInfo(userInfo);
  183. // List<Map<String, Object>> dataList = this.getData(executeModel);
  184. ExecuteModel model = new ExecuteModel();
  185. model.setFlowId(flowId);
  186. model.setUserInfo(userInfo);
  187. // model.setDataList(dataList);
  188. this.execute(model);
  189. }
  190. // @DSTransactional
  191. public void handleTrigger(TriggerDataModel dataModel, UserInfo userInfo) throws Exception {
  192. List<Map<String, Object>> dataList = JsonUtil.getJsonToListMap(dataModel.getData());
  193. ExecuteModel model = new ExecuteModel();
  194. model.setFlowId(dataModel.getFlowId());
  195. model.setDataList(dataList);
  196. model.setUserInfo(userInfo);
  197. model.setParentId(FlowNature.ParentId);
  198. this.execute(model);
  199. }
  200. // 执行
  201. public void execute(ExecuteModel model) throws Exception {
  202. String flowId = model.getFlowId();
  203. List<Map<String, Object>> dataList = model.getDataList();
  204. String parentId = model.getParentId();
  205. // if (dataList.isEmpty()) {
  206. // return;
  207. // }
  208. TemplateJsonEntity jsonEntity = templateJsonService.getById(flowId);
  209. if (null != jsonEntity) {
  210. TemplateEntity template = templateService.getById(jsonEntity.getTemplateId());
  211. if (template == null) {
  212. return;
  213. }
  214. if (model.getTaskId() == null && !ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  215. return;
  216. }
  217. TaskEntity taskEntity = StringUtil.isNotEmpty(model.getTaskId()) ? taskService.getById(model.getTaskId()) : null;
  218. if (taskEntity != null) {
  219. model.setTaskEntity(taskEntity);
  220. }
  221. model.setJsonEntity(jsonEntity);
  222. // 重试判断
  223. TriggerTaskEntity parentTask = triggerTaskService.getById(parentId);
  224. boolean isParentId = parentTask != null;
  225. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(flowId);
  226. model.setNodeEntityList(nodeEntityList);
  227. // 保存触发任务
  228. TriggerTaskEntity entity = new TriggerTaskEntity();
  229. entity.setId(RandomUtil.uuId());
  230. entity.setFullName(template.getFullName());
  231. entity.setParentId(isParentId ? parentTask.getId() : parentId);
  232. entity.setParentTime(isParentId ? parentTask.getStartTime() : null);
  233. entity.setFlowId(flowId);
  234. entity.setStartTime(new Date());
  235. entity.setData(JsonUtil.getObjectToString(dataList));
  236. entity.setStatus(TaskStatusEnum.RUNNING.getCode());
  237. entity.setTaskId(StringUtil.isNotEmpty(model.getTaskId()) ? model.getTaskId() : null);
  238. entity.setNodeCode(StringUtil.isNotEmpty(model.getNodeCode()) ? model.getNodeCode() : null);
  239. entity.setNodeId(StringUtil.isNotEmpty(model.getNodeId()) ? model.getNodeId() : null);
  240. TemplateNodeEntity start = nodeEntityList.stream()
  241. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(new TemplateNodeEntity());
  242. String deploymentId = jsonEntity.getFlowableId();
  243. Map<String, Object> variables = this.getVariables(deploymentId, start.getNodeCode());
  244. String instanceId = model.getInstanceId();
  245. if (StringUtil.isEmpty(model.getInstanceId())) {
  246. instanceId = flowAbleUrl.startInstance(deploymentId, variables);
  247. entity.setInstanceId(instanceId);
  248. model.setInstanceId(instanceId);
  249. }
  250. if (null != model.getIsAsync()) {
  251. entity.setIsAsync(model.getIsAsync());
  252. }
  253. entity.setEngineType(1);
  254. UserInfo userInfo = model.getUserInfo();
  255. if (null != userInfo) {
  256. entity.setCreatorUserId(userInfo.getUserId());
  257. }
  258. triggerTaskService.saveTriggerTask(entity);
  259. model.setTriggerTask(entity);
  260. if (StringUtil.isEmpty(entity.getTaskId())) {
  261. triggerRecordService.createStart(entity.getId());
  262. }
  263. this.globalMsg(model, 1);
  264. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
  265. // 触发节点
  266. List<String> typeList = ImmutableList.of(NodeEnum.eventTrigger.getType(), NodeEnum.timeTrigger.getType(),
  267. NodeEnum.noticeTrigger.getType(), NodeEnum.webhookTrigger.getType(), NodeEnum.trigger.getType());
  268. String triggerKey = model.getTriggerKey();
  269. TemplateNodeEntity triggerNode = null;
  270. if (StringUtil.isNotEmpty(triggerKey)) {
  271. triggerNode = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), triggerKey)).findFirst().orElse(null);
  272. } else {
  273. triggerNode = nodeEntityList.stream().filter(e -> typeList.contains(e.getNodeType())).findFirst().orElse(null);
  274. }
  275. if (null != triggerNode) {
  276. for (Map<String, Object> map : dataList) {
  277. map.put(DataInterfaceVarConst.FORM_ID, map.get(FlowFormConstant.ID));
  278. }
  279. TriggerHolder.addData(triggerNode.getNodeCode(), dataList);
  280. NodeModel nodeModel = JsonUtil.getJsonToBean(triggerNode.getNodeJson(), NodeModel.class);
  281. TemplateNodeEntity finalTriggerNode = triggerNode;
  282. FlowableTaskModel taskModel = taskModelList.stream()
  283. .filter(e -> ObjectUtil.equals(e.getTaskKey(), finalTriggerNode.getNodeCode())).findFirst().orElse(null);
  284. if (null == taskModel) {
  285. return;
  286. }
  287. triggerRecordService.create(entity, nodeModel, taskModel);
  288. Map<String, Object> variableMap = this.getVariables(deploymentId, taskModel.getTaskKey());
  289. this.complete(taskModel.getTaskId(), variableMap);
  290. this.executeNode(model);
  291. TriggerHolder.clear();
  292. }
  293. }
  294. }
  295. public Map<String, Object> getVariables(String deploymentId, String nodeCode) throws WorkFlowException {
  296. OutgoingFlowsFo flowsFo = new OutgoingFlowsFo();
  297. flowsFo.setDeploymentId(deploymentId);
  298. flowsFo.setTaskKey(nodeCode);
  299. List<String> outgoingFlows = flowAbleUrl.getOutgoingFlows(flowsFo);
  300. Map<String, Object> variables = new HashMap<>();
  301. for (String line : outgoingFlows) {
  302. variables.put(line, true);
  303. }
  304. return variables;
  305. }
  306. public void complete(String id, Map<String, Object> variables) throws WorkFlowException {
  307. CompleteFo fo = new CompleteFo();
  308. fo.setTaskId(id);
  309. fo.setVariables(variables);
  310. flowAbleUrl.complete(fo);
  311. }
  312. public void executeNode(ExecuteModel model) throws WorkFlowException {
  313. TemplateJsonEntity jsonEntity = model.getJsonEntity();
  314. String deploymentId = jsonEntity.getFlowableId();
  315. String instanceId = model.getInstanceId();
  316. List<TemplateNodeEntity> nodeEntityList = model.getNodeEntityList();
  317. TriggerTaskEntity triggerTask = model.getTriggerTask();
  318. String groupId = model.getGroupId();
  319. String taskId = model.getTaskId();
  320. FlowableInstanceModel instance = flowAbleUrl.getInstance(instanceId);
  321. if (null != instance && null != instance.getEndTime()) {
  322. triggerRecordService.createEnd(triggerTask.getId());
  323. triggerTask.setStatus(TaskStatusEnum.PASSED.getCode());
  324. triggerTaskService.updateTriggerTask(triggerTask);
  325. return;
  326. }
  327. List<FlowableTaskModel> taskModelList = flowAbleUrl.getCurrentTask(instanceId);
  328. if (CollectionUtil.isNotEmpty(taskModelList)) {
  329. // 统计执行节点的数量
  330. int count = 0;
  331. int executedCount = 0;
  332. boolean multiple = taskModelList.size() > 1;
  333. List<TriggerRecordEntity> recordList = triggerRecordService.getList(triggerTask.getId());
  334. List<String> codeList = recordList.stream().map(TriggerRecordEntity::getNodeCode).collect(Collectors.toList());
  335. List<String> nodeTypes = ImmutableList.of(NodeEnum.getData.getType(), NodeEnum.addData.getType(), NodeEnum.updateData.getType(), NodeEnum.deleteData.getType()
  336. , NodeEnum.dataInterface.getType(), NodeEnum.message.getType(), NodeEnum.launchFlow.getType(), NodeEnum.schedule.getType());
  337. for (FlowableTaskModel taskModel : taskModelList) {
  338. // 任务流程的状态为终止,则结束
  339. TriggerTaskEntity entity = triggerTaskService.getById(triggerTask.getId());
  340. if (null != entity && ObjectUtil.equals(entity.getStatus(), TaskStatusEnum.CANCEL.getCode())) {
  341. return;
  342. }
  343. if (codeList.contains(taskModel.getTaskKey())) {
  344. executedCount++;
  345. continue;
  346. }
  347. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  348. .filter(e -> ObjectUtil.equals(e.getNodeCode(), taskModel.getTaskKey())).findFirst().orElse(null);
  349. if (null != nodeEntity && nodeTypes.contains(nodeEntity.getNodeType())) {
  350. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  351. if (StringUtil.isNotBlank(groupId)) {
  352. if (!ObjectUtil.equals(nodeModel.getGroupId(), groupId)) {
  353. continue;
  354. }
  355. count++;
  356. }
  357. model.setNodeModel(nodeModel);
  358. model.setCurrentNodeId(taskModel.getTaskId());
  359. TriggerRecordEntity record = new TriggerRecordEntity();
  360. record.setStartTime(new Date());
  361. record.setNodeId(taskModel.getTaskId());
  362. record.setNodeCode(taskModel.getTaskKey());
  363. record.setNodeName(nodeModel.getNodeName());
  364. record.setTriggerId(triggerTask.getId());
  365. if (StringUtil.isNotEmpty(triggerTask.getTaskId())) {
  366. record.setTaskId(triggerTask.getTaskId());
  367. }
  368. triggerRecordService.create(record);
  369. NodeEnum node = NodeEnum.getNode(nodeEntity.getNodeType());
  370. try {
  371. switch (node) {
  372. case getData:
  373. List<Map<String, Object>> data = this.getData(model);
  374. TriggerHolder.addData(nodeEntity.getNodeCode(), data);
  375. break;
  376. case addData:
  377. this.addData(model);
  378. break;
  379. case updateData:
  380. this.updateData(model);
  381. break;
  382. case deleteData:
  383. this.deleteData(model);
  384. break;
  385. case message:
  386. this.message(model);
  387. break;
  388. case launchFlow:
  389. this.launchFlow(model);
  390. break;
  391. case dataInterface:
  392. List<Map<String, Object>> maps = this.dataInterface(model);
  393. //TriggerHolder.addData(nodeEntity.getNodeCode(), maps);
  394. break;
  395. case schedule:
  396. this.createSchedule(model);
  397. break;
  398. }
  399. } catch (Exception e) {
  400. String msg = this.getErrMsg(e);
  401. String errorMsg = msg;
  402. if (e instanceof WorkFlowException) {
  403. WorkFlowException workException = ((WorkFlowException) e);
  404. errorMsg = workException.getDataMsg() != null ? workException.getDataMsg() : errorMsg;
  405. }
  406. record.setErrorTip(msg);
  407. record.setErrorData(errorMsg);
  408. record.setStatus(TriggerRecordEnum.EXCEPTION.getCode());
  409. this.globalMsg(model, 2);
  410. log.error("执行异常", e);
  411. }
  412. if (record.getStatus() == null) {
  413. record.setStatus(TriggerRecordEnum.PASSED.getCode());
  414. }
  415. record.setEndTime(new Date());
  416. triggerRecordService.updateById(record);
  417. if (ObjectUtil.equals(record.getStatus(), TriggerRecordEnum.EXCEPTION.getCode())) {
  418. if (!ObjectUtil.equals(triggerTask.getStatus(), TaskStatusEnum.EXCEPTION.getCode())) {
  419. triggerTask.setStatus(TaskStatusEnum.EXCEPTION.getCode());
  420. triggerTaskService.updateTriggerTask(triggerTask);
  421. model.setTriggerTask(triggerTask);
  422. }
  423. if (multiple) {
  424. continue;
  425. } else {
  426. throw new WorkFlowException(record.getErrorTip());
  427. }
  428. // triggerTask.setStatus(TaskStatusEnum.EXCEPTION.getCode());
  429. // TriggerRecordHolder.addData(triggerTask, record);
  430. // throw new WorkFlowException(record.getErrorTip());
  431. }
  432. if (StringUtil.isBlank(taskId)) {
  433. Map<String, Object> variables = this.getVariables(deploymentId, taskModel.getTaskKey());
  434. this.complete(taskModel.getTaskId(), variables);
  435. } else {
  436. // 嵌入的任务流程,最后的执行节点不能通过,否则退回会有问题
  437. NextOrPrevFo fo = new NextOrPrevFo();
  438. fo.setDeploymentId(deploymentId);
  439. fo.setTaskKey(taskModel.getTaskKey());
  440. List<FlowableNodeModel> next = flowAbleUrl.getNext(fo);
  441. if (CollectionUtil.isNotEmpty(next)) {
  442. Map<String, Object> variables = this.getVariables(deploymentId, taskModel.getTaskKey());
  443. this.complete(taskModel.getTaskId(), variables);
  444. }
  445. }
  446. }
  447. }
  448. if (executedCount == taskModelList.size()) {
  449. return;
  450. }
  451. // 嵌入的任务流程可能存在多个,需要区分组别
  452. if (StringUtil.isNotBlank(groupId) && count == 0) {
  453. return;
  454. }
  455. this.executeNode(model);
  456. }
  457. }
  458. private String getErrMsg(Exception e) {
  459. ActionResult result = new ActionResult();
  460. result.setCode(400);
  461. result.setMsg(e.getMessage());
  462. return JsonUtil.getObjectToString(result);
  463. }
  464. // -----------------------------------------------------------------------------
  465. // 获取数据
  466. public List<Map<String, Object>> getData(ExecuteModel model) throws WorkFlowException {
  467. List<Map<String, Object>> dataList = new ArrayList<>();
  468. NodeModel nodeModel = model.getNodeModel();
  469. Integer formType = nodeModel.getFormType();
  470. switch (formType) {
  471. case 1:
  472. case 2:
  473. List<Map<String, Object>> list = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>());
  474. dataList.addAll(list);
  475. break;
  476. case 3:
  477. List<ActionResult> resultList = this.interfaceTemplateJson(model, new HashMap<>());
  478. List<String> errList = new ArrayList<>();
  479. for (ActionResult result : resultList) {
  480. if (!ObjectUtil.equals(result.getCode(), 200)) {
  481. errList.add(result.getMsg());
  482. continue;
  483. }
  484. if (result.getData() instanceof List) {
  485. List<Map<String, Object>> maps = this.castListMap(result.getData());
  486. if (CollectionUtil.isNotEmpty(maps)) {
  487. dataList.addAll(maps);
  488. }
  489. }
  490. }
  491. if (CollectionUtil.isNotEmpty(errList)) {
  492. throw new WorkFlowException(errList.get(0));
  493. }
  494. break;
  495. case 4:
  496. List<Map<String, Object>> data = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>(), true);
  497. String subTable = nodeModel.getSubTable();
  498. for (Map<String, Object> map : data) {
  499. Object obj = map.get(subTable);
  500. if (null != obj) {
  501. List<Map<String, Object>> mapList = this.castListMap(obj);
  502. List<Map<String, Object>> resList = new ArrayList<>();
  503. for (Map<String, Object> objectMap : mapList) {
  504. Map<String, Object> resMap = new HashMap<>();
  505. for (String key : objectMap.keySet()) {
  506. if (ObjectUtil.equals(key, FlowFormConstant.ID)) {
  507. resMap.put(key, objectMap.get(key));
  508. } else {
  509. resMap.put(subTable + "-" + key, objectMap.get(key));
  510. }
  511. }
  512. resMap.put(FlowNature.SUB_TABLE, subTable);
  513. resList.add(resMap);
  514. }
  515. dataList.addAll(resList);
  516. }
  517. }
  518. break;
  519. }
  520. for (Map<String, Object> map : dataList) {
  521. map.put(DataInterfaceVarConst.FORM_ID, map.get(FlowFormConstant.ID));
  522. }
  523. return dataList;
  524. }
  525. public List<Map<String, Object>> castListMap(Object obj) {
  526. return this.castListMap(obj, String.class, Object.class);
  527. }
  528. // 对象转Map类型的List
  529. public <K, V> List<Map<K, V>> castListMap(Object obj, Class<K> kClazz, Class<V> vClazz) {
  530. List<Map<K, V>> result = new ArrayList<>();
  531. if (obj instanceof List<?>) {
  532. for (Object o : (List<?>) obj) {
  533. if (o instanceof Map<?, ?>) {
  534. Map<K, V> map = new HashMap<>(16);
  535. for (Map.Entry<?, ?> entry : ((Map<?, ?>) o).entrySet()) {
  536. map.put(kClazz.cast(entry.getKey()), vClazz.cast(entry.getValue()));
  537. }
  538. result.add(map);
  539. }
  540. }
  541. }
  542. return result;
  543. }
  544. // 接口获取数据
  545. public List<ActionResult> interfaceTemplateJson(ExecuteModel executeModel, Map<String, Object> data) throws WorkFlowException {
  546. UserInfo userInfo = executeModel.getUserInfo();
  547. NodeModel nodeModel = executeModel.getNodeModel();
  548. TaskEntity taskEntity = executeModel.getTaskEntity();
  549. String globalParameter = taskEntity.getGlobalParameter();
  550. Map<String, Object> parameterData = StringUtil.isNotEmpty(globalParameter) ? JsonUtil.stringToMap(globalParameter) : new HashMap<>();
  551. String interId = nodeModel.getFormId();
  552. List<IntegrateTplModel> templateJson = nodeModel.getTemplateJson();
  553. boolean isGetData = ObjectUtil.equals(nodeModel.getType(), NodeEnum.getData.getType());
  554. if (isGetData) {
  555. templateJson = nodeModel.getInterfaceTemplateJson();
  556. }
  557. Map<String, String> parameterMap = new HashMap<>();
  558. Set<String> msg = new HashSet<>();
  559. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  560. String dataSourceForm = nodeModel.getDataSourceForm();
  561. List<Map<String, Object>> maps = allData.get(dataSourceForm);
  562. List<ActionResult> resultList = new ArrayList<>();
  563. if (StringUtil.isBlank(dataSourceForm)) {
  564. maps = new ArrayList<>();
  565. maps.add(new HashMap<>());
  566. }
  567. if (CollectionUtil.isNotEmpty(maps)) {
  568. List<String> paramList = ImmutableList.of(
  569. DataInterfaceVarConst.USER,
  570. DataInterfaceVarConst.USERANDSUB,
  571. DataInterfaceVarConst.USERANDPROGENY,
  572. DataInterfaceVarConst.ORG,
  573. DataInterfaceVarConst.ORGANDSUB,
  574. DataInterfaceVarConst.ORGANIZEANDPROGENY,
  575. DataInterfaceVarConst.POSITIONID,
  576. DataInterfaceVarConst.POSITIONANDSUB,
  577. DataInterfaceVarConst.POSITIONANDPROGENY);
  578. Map<String, String> paramDataMap = serviceUtil.getSystemFieldValue();
  579. for (Map<String, Object> map : maps) {
  580. Map<String, Object> tempMap = new HashMap<>(data);
  581. tempMap.putAll(map);
  582. for (IntegrateTplModel tpl : templateJson) {
  583. String fieldId = tpl.getField();
  584. Boolean required = tpl.getRequired();
  585. Integer sourceType = tpl.getSourceType();
  586. String relationField = tpl.getRelationField();
  587. Map<String, Object> dataMap = new HashMap<>(tempMap);
  588. String[] split = relationField.split("\\|");
  589. String dataValue;
  590. if (isGetData) {
  591. dataValue = this.getFieldValue(relationField, FieldEnum.Field.getCode(), allData);
  592. } else {
  593. dataValue = this.getStrData(dataMap, split[0]);
  594. }
  595. if (DataInterfaceVarConst.FORM_ID.equals(relationField)) {
  596. dataValue = String.valueOf(dataMap.get(FlowFormConstant.ID));
  597. } else if (paramList.contains(relationField)) {
  598. List<String> dataList = new ArrayList<>();
  599. String value = paramDataMap.get(relationField);
  600. if (StringUtil.isNotEmpty(value)) {
  601. try {
  602. List<String> list = JsonUtil.getJsonToList(value, String.class);
  603. dataList.addAll(list);
  604. } catch (Exception e) {
  605. dataList.add(value);
  606. }
  607. }
  608. dataValue = String.join(",",dataList);
  609. }
  610. String dataFieldValue = split[0];
  611. String parameterValue = parameterData.get(relationField) != null ? String.valueOf(parameterData.get(relationField)) : null;
  612. String dataJson = !ObjectUtil.equals(tpl.getSourceType(), FieldEnum.Custom.getCode()) ? Objects.equals(FieldEnum.Global.getCode(), sourceType) ? parameterValue : dataValue : dataFieldValue;
  613. String[] model = StringUtil.isNotEmpty(split[0]) ? split[0].split("-") : new String[]{};
  614. if (model.length > 1) {
  615. Object dataList = dataMap.get(model[0]);
  616. if (dataList instanceof List) {
  617. List<Map<String, Object>> listAll = (List<Map<String, Object>>) dataList;
  618. List<Object> dataListAll = new ArrayList<>();
  619. for (Map<String, Object> objectMap : listAll) {
  620. dataListAll.add(objectMap.get(model[1] + FlowNature.FORM_FIELD_SUFFIX));
  621. }
  622. if (required && ObjectUtil.isEmpty(dataListAll)) {
  623. msg.add(fieldId);
  624. }
  625. dataJson = String.valueOf(dataListAll);
  626. } else {
  627. // 子表数据的处理
  628. String oneData = this.getStrData(dataMap, split[0]);
  629. dataJson = oneData;
  630. }
  631. }
  632. if (required && ObjectUtil.isEmpty(dataJson)) {
  633. msg.add(fieldId);
  634. }
  635. parameterMap.put(fieldId, dataJson);
  636. }
  637. this.errRequiredMsg(msg);
  638. ActionResult result = serviceUtil.infoToId(interId, parameterMap);
  639. if (!ObjectUtil.equals(result.getCode(), 200)) {
  640. resultList.add(result);
  641. return resultList;
  642. }
  643. if (result.getData() instanceof Map) {
  644. Map<String, Object> dataMap = (Map<String, Object>) result.getData();
  645. Integer code = (Integer) dataMap.get("code");
  646. if (ObjectUtil.equals(code, 400)) {
  647. ActionResult ar = new ActionResult<>();
  648. ar.setCode(code);
  649. ar.setMsg((String) dataMap.get("msg"));
  650. resultList.add(ar);
  651. return resultList;
  652. }
  653. }
  654. resultList.add(result);
  655. }
  656. }
  657. return resultList;
  658. }
  659. private void errRequiredMsg(Set<String> msg) throws WorkFlowException {
  660. if (!msg.isEmpty()) {
  661. throw new WorkFlowException(new ArrayList<>(msg).get(0) + MsgCode.VS015.get());
  662. }
  663. }
  664. public List<Map<String, Object>> getDataList(NodeModel nodeModel, Map<String, Object> data, List<String> dataId) {
  665. return this.getDataList(nodeModel, data, dataId, false);
  666. }
  667. private List<Map<String, Object>> getDataList(NodeModel nodeModel, Map<String, Object> data, List<String> dataId, Boolean isSub) {
  668. boolean idDelete = Objects.equals(nodeModel.getType(), NodeEnum.deleteData.getType());
  669. String formId = nodeModel.getFormId();
  670. List<SuperQueryJsonModel> ruleList = JsonUtil.getJsonToList(nodeModel.getRuleList(), SuperQueryJsonModel.class);
  671. String ruleMatchLogic = nodeModel.getRuleMatchLogic();
  672. String flowId = "";
  673. boolean isFlow = false;
  674. if (ObjectUtil.equals(nodeModel.getFormType(), 2)) {
  675. isFlow = true;
  676. flowId = formId;
  677. TemplateEntity template = templateService.getById(flowId);
  678. if (null != template) {
  679. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(template.getFlowId());
  680. TemplateNodeEntity startNode = nodeEntityList.stream()
  681. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.start.getType())).findFirst().orElse(null);
  682. if (null != startNode) {
  683. formId = startNode.getFormId();
  684. }
  685. }
  686. }
  687. VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
  688. if (Objects.equals(visualdevEntity.getType(), 2)) {
  689. return new ArrayList<>();
  690. }
  691. // 条件选择
  692. for (SuperQueryJsonModel superQueryJsonModel : ruleList) {
  693. List<FieLdsModel> groups = superQueryJsonModel.getGroups();
  694. for (FieLdsModel fieLdsModel : groups) {
  695. if (ObjectUtil.equals(fieLdsModel.getFieldValueType(), "1")) {
  696. // 字段名 | 节点编码
  697. if (null != fieLdsModel.getFieldValue()) {
  698. String[] split = fieLdsModel.getFieldValue().split("\\|");
  699. if (split.length > 1) {
  700. if (CollectionUtil.isNotEmpty(data)) {
  701. String obj = this.getStrData(data, split[0]);
  702. if (null != obj) {
  703. fieLdsModel.setFieldValue(obj);
  704. }
  705. } else {
  706. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  707. List<Map<String, Object>> maps = allData.get(split[1]);
  708. if (CollectionUtil.isNotEmpty(maps)) {
  709. Map<String, Object> map = maps.get(0);
  710. String oneData = this.getStrData(map, split[0]);
  711. fieLdsModel.setFieldValue(oneData);
  712. }
  713. }
  714. }
  715. }
  716. } else {
  717. boolean valueType = "1".equals(fieLdsModel.getFieldValueType());
  718. String fieldValue = data.get(fieLdsModel.getFieldValue()) != null ? String.valueOf(data.get(fieLdsModel.getFieldValue())) : null;
  719. if (DataInterfaceVarConst.FORM_ID.equals(fieLdsModel.getFieldValue())) {
  720. fieldValue = String.valueOf(data.get(FlowFormConstant.ID));
  721. }
  722. fieLdsModel.setFieldValue(valueType ? fieldValue : fieLdsModel.getFieldValue());
  723. }
  724. }
  725. }
  726. SuperJsonModel superJsonModel = new SuperJsonModel();
  727. superJsonModel.setConditionList(ruleList);
  728. superJsonModel.setMatchLogic(StringUtil.isNotEmpty(ruleMatchLogic) ? ruleMatchLogic : superJsonModel.getMatchLogic());
  729. PaginationModel paginationModel = new PaginationModel();
  730. paginationModel.setDataType("1");
  731. paginationModel.setSuperQueryJson(ruleList.size() > 0 ? JsonUtil.getObjectToString(superJsonModel) : "");
  732. String sidx = this.handleSort(nodeModel.getSortList());
  733. paginationModel.setSidx(sidx);
  734. VisualDevJsonModel visualJsonModel = this.getVisualJsonModel(visualdevEntity);
  735. List<String> idAll = new ArrayList<>();
  736. List<String> idList = new ArrayList<>();
  737. List<Map<String, Object>> dataList = new ArrayList<>();
  738. try {
  739. if (ruleList.size() > 0) {
  740. visualJsonModel.setSuperQuery(superJsonModel);
  741. }
  742. if (isFlow) {
  743. List<String> flowVersionIds = templateJsonService.getListByTemplateIds(ImmutableList.of(flowId)).stream().map(TemplateJsonEntity::getId).collect(Collectors.toList());
  744. visualJsonModel.setFlowVersionIds(flowVersionIds);
  745. visualJsonModel.setEnableFlow(flowVersionIds.size() > 0);
  746. }
  747. dataList.addAll(serviceUtil.getListWithTableList(visualJsonModel, paginationModel, UserProvider.getUser()));
  748. if (isSub) {
  749. return dataList;
  750. }
  751. idList.addAll(dataList.stream().map(t -> String.valueOf(t.get(FlowFormConstant.ID))).collect(Collectors.toList()));
  752. } catch (Exception e) {
  753. log.error("数据获取异常", e);
  754. }
  755. List<String> intersection = idList.stream().filter(item -> dataId.contains(item)).collect(Collectors.toList());
  756. if (dataId.size() > 0) {
  757. idAll.addAll(intersection);
  758. } else {
  759. idAll.addAll(idList);
  760. }
  761. List<Map<String, Object>> result = new ArrayList<>();
  762. for (String id : idAll) {
  763. List<Map<String, Object>> collect = dataList.stream().filter(t -> Objects.equals(String.valueOf(t.get(FlowFormConstant.ID)), id)).collect(Collectors.toList());
  764. for (Map<String, Object> map : collect) {
  765. boolean isAdd = true;
  766. if (isFlow && !idDelete) {
  767. TaskEntity infoSubmit = taskService.getInfoSubmit(String.valueOf(map.get(FlowFormConstant.FLOWTASKID)), TaskEntity::getEndTime);
  768. isAdd = infoSubmit != null && infoSubmit.getEndTime() != null;
  769. }
  770. if (isAdd) {
  771. result.add(map);
  772. }
  773. }
  774. }
  775. return result;
  776. }
  777. public VisualDevJsonModel getVisualJsonModel(VisualdevEntity entity) {
  778. VisualDevJsonModel jsonModel = new VisualDevJsonModel();
  779. if (entity == null) {
  780. return jsonModel;
  781. }
  782. if (entity.getColumnData() != null) {
  783. jsonModel.setColumnData(JsonUtil.getJsonToBean(entity.getColumnData(), ColumnDataModel.class));
  784. }
  785. if (entity.getAppColumnData() != null) {
  786. jsonModel.setAppColumnData(JsonUtil.getJsonToBean(entity.getAppColumnData(), ColumnDataModel.class));
  787. }
  788. FormDataModel formDataModel = JsonUtil.getJsonToBean(entity.getFormData(), FormDataModel.class);
  789. jsonModel.setFormData(formDataModel);
  790. if (!VisualWebTypeEnum.DATA_VIEW.getType().equals(entity.getWebType())) {
  791. jsonModel.setFormListModels(JsonUtil.getJsonToList(formDataModel.getFields(), FieLdsModel.class));
  792. }
  793. jsonModel.setVisualTables(JsonUtil.getJsonToList(entity.getVisualTables(), TableModel.class));
  794. jsonModel.setId(entity.getId());
  795. jsonModel.setDbLinkId(entity.getDbLinkId());
  796. jsonModel.setFullName(entity.getFullName());
  797. jsonModel.setType(entity.getType());
  798. jsonModel.setWebType(entity.getWebType());
  799. return jsonModel;
  800. }
  801. private String handleSort(List<SortModel> sortList) {
  802. List<String> list = new ArrayList<>();
  803. for (SortModel sortModel : sortList) {
  804. String field = sortModel.getField();
  805. String sortType = sortModel.getSortType();
  806. if (!ObjectUtil.equals(sortType, "asc")) {
  807. field = "-" + field;
  808. }
  809. list.add(field);
  810. }
  811. return String.join(",", list);
  812. }
  813. public String getStrData(Map<String, Object> map, String key) {
  814. Object oneData = taskUtil.getOneData(map, key);
  815. if (null != oneData) {
  816. if (oneData instanceof String) {
  817. return oneData.toString();
  818. } else {
  819. return JsonUtil.getObjectToString(oneData);
  820. }
  821. }
  822. return null;
  823. }
  824. // 数据接口 --------------------------
  825. public List<Map<String, Object>> dataInterface(ExecuteModel model) throws WorkFlowException {
  826. List<Map<String, Object>> dataList = new ArrayList<>();
  827. List<ActionResult> resultList = this.interfaceTemplateJson(model, new HashMap<>());
  828. List<String> errList = new ArrayList<>();
  829. for (ActionResult result : resultList) {
  830. if (!ObjectUtil.equals(result.getCode(), 200)) {
  831. errList.add(result.getMsg());
  832. continue;
  833. }
  834. if (result.getData() instanceof List) {
  835. List<Map<String, Object>> maps = this.castListMap(result.getData());
  836. if (CollectionUtil.isNotEmpty(maps)) {
  837. dataList.addAll(maps);
  838. }
  839. }
  840. }
  841. if (CollectionUtil.isNotEmpty(errList)) {
  842. throw new WorkFlowException(errList.get(0));
  843. }
  844. return dataList;
  845. }
  846. // 消息 -----------------------------
  847. public void message(ExecuteModel model) throws WorkFlowException {
  848. NodeModel nodeModel = model.getNodeModel();
  849. if (null != nodeModel) {
  850. String msgId = nodeModel.getMsgId();
  851. List<IntegrateTplModel> templateJson = nodeModel.getMsgTemplateJson();
  852. UserInfo userInfo = model.getUserInfo();
  853. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  854. Map<String, Object> parameterMap = this.templateJson(templateJson, allData, userInfo);
  855. List<String> userIds = this.getUserList(nodeModel.getMsgUserIds(), nodeModel.getMsgUserIdsSourceType(), allData);
  856. this.message(msgId, userIds, parameterMap, userInfo);
  857. }
  858. }
  859. private void message(String msgId, List<String> userIdList, Map<String, Object> parameterMap, UserInfo userInfo) throws WorkFlowException {
  860. List<SentMessageForm> formList = new ArrayList<>();
  861. SentMessageForm sentMessageForm = new SentMessageForm();
  862. sentMessageForm.setUserInfo(userInfo);
  863. sentMessageForm.setTemplateId(msgId);
  864. sentMessageForm.setToUserIds(userIdList);
  865. sentMessageForm.setParameterMap(parameterMap);
  866. sentMessageForm.setType(3);
  867. sentMessageForm.setContentMsg(new HashMap<>());
  868. sentMessageForm.setId(msgId);
  869. sentMessageForm.setSysMessage(true);
  870. formList.add(sentMessageForm);
  871. List<String> errList = serviceUtil.sendDelegateMsg(formList);
  872. if (CollectionUtil.isNotEmpty(errList)) {
  873. throw new WorkFlowException(errList.get(0));
  874. }
  875. }
  876. private Map<String, Object> templateJson(List<IntegrateTplModel> templateJson, Map<String, List<Map<String, Object>>> data, UserInfo userInfo) throws WorkFlowException {
  877. Map<String, Object> parameterMap = new HashMap<>();
  878. Set<String> msg = new HashSet<>();
  879. for (IntegrateTplModel tplModel : templateJson) {
  880. List<IntegrateParamModel> paramJson = tplModel.getParamJson();
  881. for (IntegrateParamModel paramModel : paramJson) {
  882. String field = paramModel.getField();
  883. String relationField = paramModel.getRelationField() == null ? "" : paramModel.getRelationField();
  884. if (ObjectUtil.equals(paramModel.getSourceType(), FieldEnum.Custom.getCode())) {
  885. // 参数来源为自定义
  886. parameterMap.put(paramModel.getMsgTemplateId() + field, relationField);
  887. continue;
  888. }
  889. Boolean required = paramModel.getRequired();
  890. String[] split = relationField.split("\\|");
  891. if (split.length < 2) {
  892. continue;
  893. }
  894. List<Map<String, Object>> mapList = data.get(split[1]);
  895. Map<String, Object> map = CollectionUtil.isNotEmpty(mapList) ? mapList.get(0) : new HashMap<>();
  896. if (map == null) {
  897. map = new HashMap<>();
  898. }
  899. String dataValue = "";
  900. if (DataInterfaceVarConst.FORM_ID.equals(split[0])) {
  901. dataValue = map.get(FlowFormConstant.ID) != null ? String.valueOf(map.get(FlowFormConstant.ID)) : "";
  902. } else {
  903. if (map.get(split[0]) != null) {
  904. dataValue = String.valueOf(map.get(split[0]));
  905. }
  906. }
  907. if (required && ObjectUtil.isEmpty(dataValue)) {
  908. msg.add(field);
  909. }
  910. parameterMap.put(paramModel.getMsgTemplateId() + field, dataValue);
  911. }
  912. Map<String, String> paramMap = ImmutableMap.of(FlowConstant.CREATORUSERNAME, userInfo.getUserName(), FlowConstant.SENDTIME, DateUtil.getNow().substring(11));
  913. for (String key : paramMap.keySet()) {
  914. parameterMap.put(tplModel.getId() + key, paramMap.get(key));
  915. }
  916. }
  917. this.errRequiredMsg(msg);
  918. return parameterMap;
  919. }
  920. // 新增数据 -------------------
  921. public void addData(ExecuteModel model) throws Exception {
  922. NodeModel nodeModel = model.getNodeModel();
  923. if (null == nodeModel) {
  924. return;
  925. }
  926. String formId = nodeModel.getFormId();
  927. List<TemplateJsonModel> transferList = nodeModel.getTransferList();
  928. String dataSourceForm = nodeModel.getDataSourceForm();
  929. List<SuperQueryJsonModel> ruleList = nodeModel.getRuleList();
  930. VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
  931. if (StringUtil.isBlank(dataSourceForm)) {
  932. // 数据源没有数据时,将字段设置中的自定义添加到数据中
  933. transferList = transferList.stream().filter(e -> ObjectUtil.equals(e.getSourceType(), 2)).collect(Collectors.toList());
  934. Map<String, Object> data = new HashMap<>();
  935. for (TemplateJsonModel TemplateJsonModel : transferList) {
  936. data.put(TemplateJsonModel.getTargetField(), TemplateJsonModel.getSourceValue());
  937. }
  938. if (CollectionUtil.isNotEmpty(data)) {
  939. serviceUtil.visualCreate(visualdevEntity, data);
  940. }
  941. return;
  942. }
  943. // 数据源的数据
  944. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  945. List<Map<String, Object>> maps = allData.get(dataSourceForm) != null ? allData.get(dataSourceForm) : new ArrayList<>();
  946. for (Map<String, Object> map : maps) {
  947. List<Map<String, Object>> dataList = new ArrayList<>();
  948. if (CollectionUtil.isNotEmpty(ruleList)) {
  949. dataList = this.getDataList(nodeModel, map, new ArrayList<>());
  950. }
  951. if (dataList.isEmpty()) {
  952. List<Map<String, Object>> list = this.handleAddData(map, transferList);
  953. if (CollectionUtil.isNotEmpty(list)) {
  954. for (Map<String, Object> saveData : list) {
  955. serviceUtil.visualCreate(visualdevEntity, saveData);
  956. }
  957. }
  958. }
  959. }
  960. }
  961. public List<Map<String, Object>> handleAddData(Map<String, Object> data, List<TemplateJsonModel> transferList) {
  962. return this.handleData(data, new ArrayList<>(), transferList);
  963. }
  964. // 将后缀为_jnpfId的值赋给原字段
  965. public Map<String, Object> setData(Map<String, Object> data) {
  966. data = CollectionUtil.isNotEmpty(data) ? data : new HashMap<>();
  967. for (String key : data.keySet()) {
  968. Object o = data.get(key);
  969. Object o1 = data.get(key + FlowNature.FORM_FIELD_SUFFIX);
  970. if (o != null && o1 != null) {
  971. data.put(key, o1);
  972. }
  973. if (o != null && key.toLowerCase().startsWith(JnpfKeyConsts.CHILD_TABLE_PREFIX)) {
  974. // 处理子表
  975. if (o instanceof List) {
  976. List<Map<String, Object>> subList = (List<Map<String, Object>>) o;
  977. for (Map<String, Object> map : subList) {
  978. this.setData(map);
  979. }
  980. }
  981. }
  982. }
  983. return data;
  984. }
  985. /**
  986. * 字段设置
  987. *
  988. * @param data 数据源
  989. * @param dataList 目标数据
  990. * @param transferList 传递规则
  991. */
  992. public List<Map<String, Object>> handleData(Map<String, Object> data, List<Map<String, Object>> dataList, List<TemplateJsonModel> transferList) {
  993. boolean isAdd = CollectionUtil.isEmpty(dataList);
  994. List<Map<String, Object>> list = new ArrayList<>(dataList);
  995. Map<String, Object> oldData = new HashMap<>(data != null ? data : new HashMap<>());
  996. int max = 1;
  997. for (TemplateJsonModel TemplateJsonModel : transferList) {
  998. Integer sourceType = TemplateJsonModel.getSourceType();
  999. String sourceValue = TemplateJsonModel.getSourceValue();
  1000. String targetField = TemplateJsonModel.getTargetField();
  1001. if (ObjectUtil.equals(sourceType, FieldEnum.Field.getCode())) {
  1002. String[] sourceFieldList = sourceValue.split("-");
  1003. String[] targetFieldList = targetField.split("-");
  1004. if (sourceFieldList.length > 1 && targetFieldList.length == 1) {
  1005. if (oldData.get(sourceFieldList[0]) instanceof List) {
  1006. List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
  1007. if (parentList.size() > max) {
  1008. max = parentList.size();
  1009. }
  1010. }
  1011. }
  1012. }
  1013. }
  1014. // 更新或新增的数据条数 小于 结果的最大数
  1015. int size = dataList.size();
  1016. if (size < max) {
  1017. for (int i = 0; i < max - size; i++) {
  1018. list.add(new HashMap<>());
  1019. }
  1020. }
  1021. if (isAdd) {
  1022. for (TemplateJsonModel TemplateJsonModel : transferList) {
  1023. Integer sourceType = TemplateJsonModel.getSourceType();
  1024. String sourceValue = TemplateJsonModel.getSourceValue();
  1025. String targetField = TemplateJsonModel.getTargetField();
  1026. if (ObjectUtil.equals(sourceType, FieldEnum.Field.getCode())) {
  1027. String[] sourceFieldList = sourceValue.split("-");
  1028. String[] targetFieldList = targetField.split("-");
  1029. if (sourceFieldList.length > 1) {
  1030. // 目标数据 大于 源数据 补差集
  1031. if (targetFieldList.length > 1) {
  1032. int diff = 0;
  1033. // 源数据
  1034. if (oldData.get(sourceFieldList[0]) instanceof List) {
  1035. List<Map<String, Object>> sourceList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
  1036. diff = sourceList.size();
  1037. }
  1038. for (Map<String, Object> map : list) {
  1039. if (map.get(targetFieldList[0]) instanceof List) {
  1040. List<Map<String, Object>> targetList = (List<Map<String, Object>>) map.get(targetFieldList[0]);
  1041. int max1 = targetList.size() - diff;
  1042. for (int i = 0; i < max1; i++) {
  1043. targetList.add(new HashMap<>());
  1044. }
  1045. } else {
  1046. List<Map<String, Object>> childList = new ArrayList<>();
  1047. for (int i = 0; i < diff; i++) {
  1048. childList.add(new HashMap<>());
  1049. }
  1050. map.put(targetFieldList[0], childList);
  1051. }
  1052. }
  1053. }
  1054. }
  1055. }
  1056. }
  1057. }
  1058. // for (Map<String, Object> map : list) {
  1059. // this.setData(map);
  1060. // }
  1061. for (TemplateJsonModel TemplateJsonModel : transferList) {
  1062. Integer sourceType = TemplateJsonModel.getSourceType();
  1063. String[] split = TemplateJsonModel.getSourceValue().split("\\|");
  1064. String sourceValue = split.length > 0 ? split[0] : TemplateJsonModel.getSourceValue();
  1065. boolean isData = ObjectUtil.equals(sourceType, FieldEnum.Custom.getCode());
  1066. String[] sourceFieldList = isData ? new String[]{sourceValue} : sourceValue.split("-");
  1067. Object o = taskUtil.getOneData(data, sourceValue);
  1068. String targetField = TemplateJsonModel.getTargetField();
  1069. String[] targetFieldList = targetField.split("-");
  1070. Object childData = isData ? sourceValue : DataInterfaceVarConst.FORM_ID.equals(sourceValue)
  1071. ? data.get(FlowFormConstant.ID) : o;
  1072. // 目标字段为子表
  1073. if (targetFieldList.length > 1) {
  1074. if (sourceFieldList.length > 1) {
  1075. // 来源是子表、目标是子表
  1076. if (oldData.get(sourceFieldList[0]) instanceof List) {
  1077. // 源数据
  1078. List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
  1079. for (int i = 0; i < list.size(); i++) {
  1080. Map<String, Object> targetMap = list.get(i);
  1081. List<Map<String, Object>> childList = (List<Map<String, Object>>) targetMap.get(targetFieldList[0]);
  1082. if (CollectionUtil.isNotEmpty(childList)) {
  1083. for (int j = 0; j < parentList.size(); j++) {
  1084. Map<String, Object> sourceMap = parentList.get(j);
  1085. // this.setData(sourceMap);
  1086. if (childList.size() > j) {
  1087. Map<String, Object> map = childList.get(j);
  1088. Object oneData = taskUtil.getOneData(sourceMap, sourceFieldList[1]);
  1089. map.put(targetFieldList[1], oneData);
  1090. }
  1091. }
  1092. targetMap.put(targetFieldList[0], childList);
  1093. }
  1094. }
  1095. } else if (oldData.get(FlowNature.SUB_TABLE) != null) {
  1096. // this.setData(oldData);
  1097. for (Map<String, Object> map : list) {
  1098. Object obj = taskUtil.getOneData(oldData, split[0]);
  1099. if (map.get(targetFieldList[0]) instanceof List) {
  1100. List<Map<String, Object>> childList = (List<Map<String, Object>>) map.get(targetFieldList[0]);
  1101. if (CollectionUtil.isEmpty(childList)) {
  1102. childList.add(new HashMap<>());
  1103. }
  1104. for (Map<String, Object> objectMap : childList) {
  1105. objectMap.put(targetFieldList[1], obj);
  1106. }
  1107. map.put(targetFieldList[0], childList);
  1108. }
  1109. }
  1110. }
  1111. } else {
  1112. // 来源不是子表、目标是子表
  1113. for (Map<String, Object> map : list) {
  1114. if (null == map.get(targetFieldList[0])) {
  1115. List<Map<String, Object>> childList = new ArrayList<>();
  1116. Map<String, Object> child = new HashMap<>();
  1117. child.put(targetFieldList[1], childData);
  1118. childList.add(child);
  1119. map.put(targetFieldList[0], childList);
  1120. continue;
  1121. }
  1122. if (map.get(targetFieldList[0]) instanceof List) {
  1123. // 目标子表数据进行赋值
  1124. List<Map<String, Object>> childList = (List<Map<String, Object>>) map.get(targetFieldList[0]);
  1125. for (Map<String, Object> childMap : childList) {
  1126. childMap.put(targetFieldList[1], childData);
  1127. }
  1128. }
  1129. }
  1130. }
  1131. } else {
  1132. if (sourceFieldList.length > 1) {
  1133. // 来源是子表、目标不是子表
  1134. if (oldData.get(sourceFieldList[0]) instanceof List) {
  1135. List<Map<String, Object>> parentList = (List<Map<String, Object>>) oldData.get(sourceFieldList[0]);
  1136. // 新增时,一一对应;更新时,取子表第一条数据
  1137. if (isAdd) {
  1138. for (int i = 0; i < parentList.size(); i++) {
  1139. if (list.size() > i) {
  1140. Map<String, Object> parentMap = parentList.get(i);
  1141. // this.setData(parentMap);
  1142. Map<String, Object> map = list.get(i);
  1143. Object oneData = taskUtil.getOneData(parentMap, sourceFieldList[1]);
  1144. map.put(targetField, oneData);
  1145. }
  1146. }
  1147. } else {
  1148. if (CollectionUtil.isNotEmpty(parentList)) {
  1149. Map<String, Object> parentMap = parentList.get(0);
  1150. // this.setData(parentMap);
  1151. for (Map<String, Object> map : list) {
  1152. Object oneData = taskUtil.getOneData(parentMap, sourceFieldList[1]);
  1153. map.put(targetField, oneData);
  1154. }
  1155. }
  1156. }
  1157. } else if (oldData.get(FlowNature.SUB_TABLE) != null) {
  1158. for (Map<String, Object> map : list) {
  1159. Object obj = taskUtil.getOneData(oldData, split[0]);
  1160. map.put(targetFieldList[0], obj);
  1161. }
  1162. }
  1163. } else {
  1164. // 来源不是子表、目标不是子表
  1165. for (Map<String, Object> map : list) {
  1166. map.put(targetField, childData);
  1167. }
  1168. }
  1169. }
  1170. }
  1171. return list;
  1172. }
  1173. // 更新数据 -------------------------------
  1174. public void updateData(ExecuteModel model) throws Exception {
  1175. NodeModel nodeModel = model.getNodeModel();
  1176. String formId = nodeModel.getFormId();
  1177. VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
  1178. String dataSourceForm = nodeModel.getDataSourceForm();
  1179. List<TemplateJsonModel> transferList = nodeModel.getTransferList();
  1180. // 没有可修改的数据时,向对应表单中新增一条数据
  1181. boolean unFoundRule = nodeModel.getUnFoundRule();
  1182. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  1183. List<Map<String, Object>> maps = allData.get(dataSourceForm);
  1184. // 数据源可以不选,不选则直接更新目标表单的某些数据
  1185. if (StringUtil.isBlank(dataSourceForm)) {
  1186. transferList = transferList.stream().filter(e -> ObjectUtil.equals(e.getSourceType(), 2)).collect(Collectors.toList());
  1187. Map<String, Object> map = new HashMap<>();
  1188. for (TemplateJsonModel TemplateJsonModel : transferList) {
  1189. map.put(TemplateJsonModel.getTargetField(), TemplateJsonModel.getSourceValue());
  1190. }
  1191. maps = new ArrayList<>();
  1192. maps.add(map);
  1193. }
  1194. // 更新数据
  1195. if (CollectionUtil.isNotEmpty(maps)) {
  1196. for (Map<String, Object> map : maps) {
  1197. List<Map<String, Object>> tempList = this.getDataList(nodeModel, map, new ArrayList<>());
  1198. for (Map<String, Object> tempMap : tempList) {
  1199. this.setData(tempMap);
  1200. }
  1201. List<Map<String, Object>> list = this.handleData(map, tempList, transferList);
  1202. if (CollectionUtil.isNotEmpty(list)) {
  1203. for (Map<String, Object> data : list) {
  1204. if (null != data.get(FlowFormConstant.ID)) {
  1205. String id = data.get(FlowFormConstant.ID).toString();
  1206. serviceUtil.visualUpdate(visualdevEntity, data, id);
  1207. } else {
  1208. if (unFoundRule) {
  1209. serviceUtil.visualCreate(visualdevEntity, data);
  1210. }
  1211. }
  1212. }
  1213. }
  1214. }
  1215. }
  1216. }
  1217. // 删除数据 -------------------------------
  1218. public void deleteData(ExecuteModel model) throws Exception {
  1219. NodeModel nodeModel = model.getNodeModel();
  1220. Integer deleteType = nodeModel.getDeleteType();
  1221. String formId = nodeModel.getFormId();
  1222. VisualdevEntity visualdevEntity = serviceUtil.getReleaseInfo(formId);
  1223. // 直接删除表
  1224. if (ObjectUtil.equals(deleteType, 0)) {
  1225. Integer tableType = nodeModel.getTableType();
  1226. if (ObjectUtil.equals(tableType, 0)) {
  1227. // 删除主表
  1228. List<Map<String, Object>> dataList = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>());
  1229. if (CollectionUtil.isNotEmpty(dataList)) {
  1230. serviceUtil.visualDelete(visualdevEntity, dataList);
  1231. }
  1232. } else {
  1233. // 删除子表
  1234. // List<Map<String, Object>> mapList = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>(), true);
  1235. FlowFormDataModel formDataModel = new FlowFormDataModel();
  1236. formDataModel.setTableName(nodeModel.getSubTable());
  1237. formDataModel.setFormId(nodeModel.getFormId());
  1238. formDataModel.setRuleMatchLogic(nodeModel.getRuleMatchLogic());
  1239. List<SuperQueryJsonModel> ruleList = nodeModel.getRuleList();
  1240. List<Map<String, Object>> list = JsonUtil.getJsonToListMap(JsonUtil.getObjectToString(ruleList));
  1241. formDataModel.setRuleList(list);
  1242. serviceUtil.deleteSubTable(formDataModel);
  1243. }
  1244. } else {
  1245. // 按节点删除
  1246. Integer condition = nodeModel.getDeleteCondition();
  1247. String dataSourceForm = nodeModel.getDataSourceForm();
  1248. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  1249. List<Map<String, Object>> maps = allData.get(dataSourceForm) != null ? allData.get(dataSourceForm) : new ArrayList<>();
  1250. // 获取条件过滤的目标数据
  1251. List<Map<String, Object>> dataList = new ArrayList<>();
  1252. for (Map<String, Object> map : maps) {
  1253. List<Map<String, Object>> data = this.getDataList(nodeModel, map, new ArrayList<>());
  1254. dataList.addAll(data);
  1255. }
  1256. // 全部目标数据
  1257. nodeModel.setRuleList(new ArrayList<>());
  1258. List<Map<String, Object>> targetData = this.getDataList(nodeModel, new HashMap<>(), new ArrayList<>());
  1259. List<Map<String, Object>> intersection = new ArrayList<>();
  1260. List<Map<String, Object>> differentSet = new ArrayList<>();
  1261. if (ObjectUtil.equals(condition, 1)) {
  1262. // 存在,删除交集
  1263. intersection = dataList;
  1264. if (CollectionUtil.isNotEmpty(intersection)) {
  1265. serviceUtil.visualDelete(visualdevEntity, intersection);
  1266. }
  1267. } else {
  1268. // 不存在,删除差集
  1269. for (Map<String, Object> map : targetData) {
  1270. String sourceId = map.get(FlowFormConstant.ID).toString();
  1271. for (Map<String, Object> data : dataList) {
  1272. String targetId = data.get(FlowFormConstant.ID).toString();
  1273. if (!ObjectUtil.equals(sourceId, targetId)) {
  1274. differentSet.add(map);
  1275. }
  1276. }
  1277. }
  1278. if (CollectionUtil.isNotEmpty(differentSet)) {
  1279. serviceUtil.visualDelete(visualdevEntity, differentSet);
  1280. }
  1281. }
  1282. }
  1283. }
  1284. // 发起审批 -------------------------------
  1285. public void launchFlow(ExecuteModel model) throws Exception {
  1286. NodeModel nodeModel = model.getNodeModel();
  1287. String flowId = nodeModel.getFlowId();
  1288. List<TemplateJsonModel> transferList = nodeModel.getTransferList();
  1289. TemplateEntity template = templateService.getById(flowId);
  1290. if (null == template) {
  1291. return;
  1292. }
  1293. if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  1294. throw new WorkFlowException(MsgCode.WF140.get());
  1295. }
  1296. TemplateJsonEntity jsonEntity = templateJsonService.getById(template.getFlowId());
  1297. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(jsonEntity.getId());
  1298. Map<String, NodeModel> nodes = new HashMap<>();
  1299. for (TemplateNodeEntity node : nodeEntityList) {
  1300. nodes.put(node.getNodeCode(), JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class));
  1301. }
  1302. FlowMethod method = new FlowMethod();
  1303. method.setDeploymentId(jsonEntity.getFlowableId());
  1304. TemplateNodeEntity startNode = nodeEntityList.stream()
  1305. .filter(e -> StringUtil.equals(NodeEnum.start.getType(), e.getNodeType())).findFirst().orElse(new TemplateNodeEntity());
  1306. if (taskUtil.checkBranch(startNode)) {
  1307. throw new WorkFlowException(MsgCode.WF147.get());
  1308. }
  1309. method.setNodeCode(startNode.getNodeCode());
  1310. method.setNodes(nodes);
  1311. method.setNodeEntityList(nodeEntityList);
  1312. Map<String, Boolean> resMap = conditionService.handleCondition(method);
  1313. // 判断条件、候选人
  1314. try {
  1315. conditionService.checkCondition(resMap, nodes);
  1316. } catch (WorkFlowException e) {
  1317. throw new WorkFlowException(MsgCode.WF133.get());
  1318. }
  1319. method.setNextSubFlow(true);
  1320. List<NodeModel> nextApprover = taskUtil.getNextApprover(method);
  1321. if (!taskUtil.checkNextCandidates(nextApprover)) {
  1322. throw new WorkFlowException(MsgCode.WF134.get());
  1323. }
  1324. // 数据源数据
  1325. String dataSourceForm = nodeModel.getDataSourceForm();
  1326. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  1327. List<Map<String, Object>> maps = allData.get(dataSourceForm) != null ? allData.get(dataSourceForm) : new ArrayList<>();
  1328. List<Map<String, Object>> mapList = new ArrayList<>();
  1329. for (Map<String, Object> map : maps) {
  1330. List<Map<String, Object>> list = this.handleAddData(map, transferList);
  1331. mapList.addAll(list);
  1332. }
  1333. // 不选数据源的处理
  1334. if (StringUtil.isEmpty(dataSourceForm)) {
  1335. transferList = transferList.stream().filter(e -> ObjectUtil.equals(e.getSourceType(), FieldEnum.Custom.getCode())).collect(Collectors.toList());
  1336. Map<String, Object> map = new HashMap<>();
  1337. for (TemplateJsonModel TemplateJsonModel : transferList) {
  1338. map.put(TemplateJsonModel.getTargetField(), TemplateJsonModel.getSourceValue());
  1339. }
  1340. mapList = new ArrayList<>();
  1341. mapList.add(map);
  1342. }
  1343. if (CollectionUtil.isEmpty(mapList)) {
  1344. return;
  1345. }
  1346. Set<String> userListAll = new HashSet<>();
  1347. if (OperatorEnum.Nominator.getCode().equals(nodeModel.getAssigneeType())) {
  1348. userListAll.addAll(serviceUtil.getUserListAll(nodeModel.getInitiator()));
  1349. } else {
  1350. //表单数据用户
  1351. for (Map<String, Object> map : maps) {
  1352. Object data = taskUtil.getOneData(map, nodeModel.getFormField());
  1353. userListAll.addAll(taskUtil.getUserId(data));
  1354. }
  1355. }
  1356. // 判断流程权限
  1357. FlowFormModel formIdAndFlowId = templateService.getFormIdAndFlowId(new ArrayList<>(userListAll), flowId);
  1358. List<UserEntity> userList = serviceUtil.getUserName(nodeModel.getHasPermission() ? formIdAndFlowId.getUserId() : formIdAndFlowId.getUserIdAll(), true);
  1359. if (CollectionUtil.isEmpty(userList)) {
  1360. throw new WorkFlowException(MsgCode.WF136.get());
  1361. }
  1362. for (UserEntity user : userList) {
  1363. UserInfo userInfo = new UserInfo();
  1364. userInfo.setUserId(user.getId());
  1365. userInfo.setUserName(user.getRealName());
  1366. FlowModel flowModel = new FlowModel();
  1367. flowModel.setUserInfo(userInfo);
  1368. flowModel.setFlowId(flowId);
  1369. flowModel.setStatus(TaskStatusEnum.RUNNING.getCode());
  1370. flowModel.setDeploymentId(jsonEntity.getFlowableId());
  1371. flowModel.setNodeEntityList(nodeEntityList);
  1372. for (Map<String, Object> map : mapList) {
  1373. flowModel.setFormData(map);
  1374. if (taskUtil.checkNextError(flowModel, nextApprover, false, false) != 0) {
  1375. throw new WorkFlowException(MsgCode.WF135.get());
  1376. }
  1377. taskService.batchSaveOrSubmit(flowModel);
  1378. TaskEntity taskEntity = flowModel.getTaskEntity();
  1379. if (taskEntity.getRejectDataId() == null) {
  1380. operatorUtil.autoAudit(flowModel);
  1381. operatorUtil.handleEvent();
  1382. }
  1383. operatorUtil.handleTaskStatus();
  1384. }
  1385. }
  1386. }
  1387. // 创建日程 --------------------------
  1388. public void createSchedule(ExecuteModel model) throws WorkFlowException {
  1389. ScheduleNewCrForm fo = new ScheduleNewCrForm();
  1390. NodeModel nodeModel = model.getNodeModel();
  1391. Map<String, List<Map<String, Object>>> allData = TriggerHolder.getData();
  1392. List<String> list = ImmutableList.of(nodeModel.getCreatorUserId());
  1393. List<String> creatorUserIds = this.getUserList(list, nodeModel.getCreatorUserIdSourceType(), allData);
  1394. if (CollectionUtil.isEmpty(creatorUserIds)) {
  1395. throw new WorkFlowException("找不到创建人");
  1396. }
  1397. Integer titleSourceType = nodeModel.getTitleSourceType();
  1398. String title = this.getFieldValue(nodeModel.getTitle(), titleSourceType, allData);
  1399. fo.setTitle(title);
  1400. String contents = this.getFieldValue(nodeModel.getContents(), nodeModel.getContentsSourceType(), allData);
  1401. fo.setContent(contents);
  1402. String startDay = this.getFieldValue(nodeModel.getStartDay(), nodeModel.getStartDaySourceType(), allData);
  1403. if (StringUtil.isBlank(startDay)) {
  1404. throw new WorkFlowException("开始时间不能为空");
  1405. }
  1406. fo.setStartDay(Long.valueOf(StringUtil.isBlank(startDay) ? new Date().getTime() + "" : startDay));
  1407. fo.setStartTime(nodeModel.getStartTime());
  1408. String endDay = this.getFieldValue(nodeModel.getEndDay(), nodeModel.getEndDaySourceType(), allData);
  1409. if (ObjectUtil.equals(nodeModel.getDuration(), -1) || ObjectUtil.equals(nodeModel.getAllDay(), 1)) {
  1410. if (StringUtil.isBlank(endDay)) {
  1411. throw new WorkFlowException("结束时间不能为空");
  1412. }
  1413. }
  1414. fo.setEndDay(Long.valueOf(StringUtil.isBlank(endDay) ? new Date().getTime() + "" : endDay));
  1415. fo.setEndTime(nodeModel.getEndTime());
  1416. String category = nodeModel.getCategory();
  1417. fo.setCategory(StringUtil.isNotEmpty(category) ? category : "391233231405462789");
  1418. fo.setDuration(nodeModel.getDuration());
  1419. fo.setAllDay(nodeModel.getAllDay());
  1420. fo.setFiles(nodeModel.getFiles());
  1421. List<String> value = this.getUserList(nodeModel.getToUserIds(), nodeModel.getToUserIdsSourceType(), allData);
  1422. fo.setToUserIds(value);
  1423. fo.setColor(nodeModel.getColor());
  1424. fo.setReminderType(nodeModel.getReminderType());
  1425. fo.setReminderTime(nodeModel.getReminderTime());
  1426. fo.setSend(nodeModel.getSend());
  1427. fo.setSendName(nodeModel.getSendName());
  1428. fo.setRepetition(nodeModel.getRepetition());
  1429. fo.setRepeatTime(nodeModel.getRepeatTime());
  1430. for (String creatorUserId : creatorUserIds) {
  1431. ScheduleNewCrForm jsonToBean = JsonUtil.getJsonToBean(fo, ScheduleNewCrForm.class);
  1432. jsonToBean.setCreatorUserId(creatorUserId);
  1433. serviceUtil.createSchedule(jsonToBean);
  1434. }
  1435. }
  1436. public String getFieldValue(String value, Integer sourceType, Map<String, List<Map<String, Object>>> allData) {
  1437. if (ObjectUtil.equals(sourceType, FieldEnum.Field.getCode())) {
  1438. String[] split = value.split("\\|");
  1439. if (split.length > 1) {
  1440. List<Map<String, Object>> data = allData.get(split[1]);
  1441. if (CollectionUtil.isNotEmpty(data)) {
  1442. Map<String, Object> map = data.get(0);
  1443. if (ObjectUtil.equals(split[0], DataInterfaceVarConst.FORM_ID)) {
  1444. value = map.get(FlowFormConstant.ID) + "";
  1445. } else {
  1446. value = this.getStrData(map, split[0]);
  1447. }
  1448. return value;
  1449. }
  1450. }
  1451. return null;
  1452. }
  1453. return value;
  1454. }
  1455. public List<String> getUserList(List<String> value, Integer sourceType, Map<String, List<Map<String, Object>>> allData) {
  1456. if (ObjectUtil.equals(sourceType, FieldEnum.Field.getCode()) && CollectionUtil.isNotEmpty(value)) {
  1457. List<String> userIdList = new ArrayList<>();
  1458. String str = value.get(0);
  1459. String[] split = str.split("\\|");
  1460. if (split.length > 1) {
  1461. List<Map<String, Object>> dataList = allData.get(split[1]);
  1462. if (ObjectUtil.isNotEmpty(dataList)) {
  1463. Object obj = taskUtil.getOneData(dataList.get(0), split[0]);
  1464. userIdList.addAll(taskUtil.getUserId(obj));
  1465. }
  1466. }
  1467. List<String> ids = serviceUtil.getUserName(userIdList, true).stream().map(UserEntity::getId).collect(Collectors.toList());
  1468. return ids;
  1469. }
  1470. return value == null ? new ArrayList<>() : serviceUtil.getUserListAll(value);
  1471. }
  1472. // webhook触发--------------------------------------------
  1473. // @DSTransactional
  1474. public void handleWebhookTrigger(String id, String tenantId, Map<String, Object> body) throws Exception {
  1475. TemplateJsonEntity jsonEntity = templateJsonService.getById(id);
  1476. if (null == jsonEntity) {
  1477. throw new WorkFlowException(MsgCode.VS016.get());
  1478. }
  1479. if (!ObjectUtil.equals(jsonEntity.getState(), 1)) {
  1480. throw new WorkFlowException("版本未启用");
  1481. }
  1482. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(jsonEntity.getId());
  1483. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  1484. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.webhookTrigger.getType())).findFirst().orElse(null);
  1485. if (null != nodeEntity) {
  1486. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1487. List<Map<String, Object>> dataList = new ArrayList<>();
  1488. Map<String, Object> map = new HashMap<>();
  1489. List<FieLdsModel> formFieldList = nodeModel.getFormFieldList();
  1490. for (FieLdsModel fieLdsModel : formFieldList) {
  1491. map.put(fieLdsModel.getId(), body.get(fieLdsModel.getId()));
  1492. }
  1493. dataList.add(map);
  1494. String token = AuthUtil.loginTempUser(jsonEntity.getCreatorUserId(), tenantId);
  1495. UserInfo userInfo = UserProvider.getUser(token);
  1496. UserProvider.setLoginUser(userInfo);
  1497. UserProvider.setLocalLoginUser(userInfo);
  1498. ExecuteModel model = new ExecuteModel();
  1499. model.setFlowId(jsonEntity.getId());
  1500. model.setDataList(dataList);
  1501. model.setUserInfo(userInfo);
  1502. this.execute(model);
  1503. }
  1504. }
  1505. // 通知触发---------------------------------------------------------
  1506. // @DSTransactional
  1507. public void msgTrigger(TemplateNodeEntity triggerNode, UserInfo userInfo) throws Exception {
  1508. String flowId = triggerNode.getFlowId();
  1509. ExecuteModel model = new ExecuteModel();
  1510. model.setFlowId(flowId);
  1511. model.setUserInfo(userInfo);
  1512. this.execute(model);
  1513. }
  1514. // 获取触发节点之后的获取数据节点的数据
  1515. public List<Map<String, Object>> getDataListAfterTriggerNode(String flowId, String triggerNode, List<TemplateNodeEntity> nodeEntityList, UserInfo userInfo) throws WorkFlowException {
  1516. TemplateJsonEntity jsonEntity = templateJsonService.getById(flowId);
  1517. NextOrPrevFo fo = new NextOrPrevFo();
  1518. fo.setDeploymentId(jsonEntity.getFlowableId());
  1519. fo.setTaskKey(triggerNode);
  1520. List<FlowableNodeModel> next = flowAbleUrl.getNext(fo);
  1521. if (CollectionUtil.isEmpty(next)) {
  1522. return new ArrayList<>();
  1523. }
  1524. String nodeCode = next.get(0).getId();
  1525. TemplateNodeEntity nodeEntity = nodeEntityList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), nodeCode)).findFirst().orElse(null);
  1526. ExecuteModel executeModel = new ExecuteModel();
  1527. executeModel.setNodeModel(JsonUtil.getJsonToBean(nodeEntity, NodeModel.class));
  1528. executeModel.setUserInfo(userInfo);
  1529. List<Map<String, Object>> dataList = this.getData(executeModel);
  1530. return dataList;
  1531. }
  1532. // 全局属性配置的消息通知,mark 1.开始执行 2.执行失败
  1533. public void globalMsg(ExecuteModel model, Integer mark) throws WorkFlowException {
  1534. TriggerTaskEntity triggerTask = model.getTriggerTask();
  1535. UserInfo userInfo = model.getUserInfo();
  1536. List<TemplateNodeEntity> nodeEntityList = model.getNodeEntityList();
  1537. TemplateNodeEntity nodeEntity = nodeEntityList.stream()
  1538. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.global.getType())).findFirst().orElse(null);
  1539. if (null == nodeEntity) {
  1540. return;
  1541. }
  1542. NodeModel global = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  1543. String code = ObjectUtil.equals(mark, 1) ? "PZXTJC002" : "PZXTJC001";
  1544. MsgConfig msgConfig;
  1545. if (ObjectUtil.equals(mark, 1)) {
  1546. msgConfig = global.getStartMsgConfig();
  1547. } else {
  1548. msgConfig = global.getFailMsgConfig();
  1549. }
  1550. Integer on = msgConfig.getOn();
  1551. boolean acquiesce = ObjectUtil.equals(on, 3);
  1552. String msgId = ObjectUtil.equals(on, 0) ? "" : acquiesce ? code : msgConfig.getMsgId();
  1553. List<String> msgUserType = global.getMsgUserType();
  1554. List<String> msgUserIds = global.getMsgUserIds();
  1555. Set<String> userIdList = new HashSet<>();
  1556. for (String type : msgUserType) {
  1557. switch (type) {
  1558. case "1":
  1559. userIdList.add(triggerTask.getCreatorUserId());
  1560. break;
  1561. case "2":
  1562. userIdList.add(serviceUtil.getAdmin());
  1563. break;
  1564. case "3":
  1565. List<String> userList = serviceUtil.getUserListAll(msgUserIds);
  1566. userIdList.addAll(userList);
  1567. break;
  1568. }
  1569. }
  1570. Map<String, Object> dataMap = ImmutableMap.of(FlowConstant.TITLE, triggerTask.getFullName(), FlowConstant.CREATORUSERNAME, "");
  1571. List<SendConfigJson> templateJson = msgConfig.getTemplateJson();
  1572. List<IntegrateTplModel> jsonToList = JsonUtil.getJsonToList(templateJson, IntegrateTplModel.class);
  1573. if (StringUtil.isNotEmpty(msgId) && CollectionUtil.isNotEmpty(userIdList)) {
  1574. Map<String, Object> map = acquiesce ? dataMap : this.templateJson(jsonToList, new HashMap<>(), userInfo);
  1575. try {
  1576. this.message(msgId, new ArrayList<>(userIdList), map, userInfo);
  1577. } catch (WorkFlowException e) {
  1578. e.printStackTrace();
  1579. }
  1580. }
  1581. }
  1582. public void createErrorRecord() {
  1583. List<TriggerTaskEntity> taskList = TriggerRecordHolder.getTaskList();
  1584. for (TriggerTaskEntity triggerTask : taskList) {
  1585. triggerTaskService.save(triggerTask);
  1586. }
  1587. List<TriggerRecordEntity> recordList = TriggerRecordHolder.getRecordList();
  1588. for (TriggerRecordEntity record : recordList) {
  1589. triggerRecordService.create(record);
  1590. }
  1591. TriggerRecordHolder.clear();
  1592. }
  1593. }