TriggerTaskServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package jnpf.flowable.service.impl;
  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.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.github.yulichang.toolkit.JoinWrappers;
  7. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  8. import com.google.common.collect.ImmutableList;
  9. import jnpf.base.UserInfo;
  10. import jnpf.base.service.SuperServiceImpl;
  11. import jnpf.constant.MsgCode;
  12. import jnpf.exception.WorkFlowException;
  13. import jnpf.flowable.entity.*;
  14. import jnpf.flowable.enums.*;
  15. import jnpf.flowable.mapper.TriggerTaskMapper;
  16. import jnpf.flowable.model.templatejson.TemplateJsonInfoVO;
  17. import jnpf.flowable.model.templatenode.ButtonModel;
  18. import jnpf.flowable.model.templatenode.TaskNodeModel;
  19. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  20. import jnpf.flowable.model.trigger.*;
  21. import jnpf.flowable.model.util.FlowNature;
  22. import jnpf.flowable.service.*;
  23. import jnpf.flowable.util.TriggerUtil;
  24. import jnpf.util.JsonUtil;
  25. import jnpf.util.StringUtil;
  26. import jnpf.util.UserProvider;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.stereotype.Service;
  29. import java.util.*;
  30. import java.util.stream.Collectors;
  31. /**
  32. * 类的描述
  33. *
  34. * @author JNPF@YinMai Info. Co., Ltd
  35. * @version 5.0.x
  36. * @since 2024/9/10 17:13
  37. */
  38. @Service
  39. public class TriggerTaskServiceImpl extends SuperServiceImpl<TriggerTaskMapper, TriggerTaskEntity> implements TriggerTaskService {
  40. @Autowired
  41. private TriggerRecordService triggerRecordService;
  42. @Autowired
  43. private TemplateService templateService;
  44. @Autowired
  45. private TemplateJsonService templateJsonService;
  46. @Autowired
  47. private TemplateNodeService templateNodeService;
  48. @Autowired
  49. private TriggerUtil triggerUtil;
  50. @Override
  51. public List<TriggerInfoListModel> getListByTaskId(String taskId, String nodeCode) {
  52. QueryWrapper<TriggerTaskEntity> queryWrapper = new QueryWrapper<>();
  53. if (StringUtil.isNotBlank(taskId)) {
  54. queryWrapper.lambda().eq(TriggerTaskEntity::getTaskId, taskId);
  55. }
  56. if (StringUtil.isNotBlank(nodeCode)) {
  57. queryWrapper.lambda().eq(TriggerTaskEntity::getNodeId, nodeCode);
  58. }
  59. queryWrapper.lambda().orderByDesc(TriggerTaskEntity::getStartTime);
  60. List<TriggerTaskEntity> list = this.list(queryWrapper);
  61. List<TriggerInfoListModel> modelList = new ArrayList<>();
  62. if (CollectionUtil.isNotEmpty(list)) {
  63. for (TriggerTaskEntity triggerTask : list) {
  64. TriggerInfoListModel model = JsonUtil.getJsonToBean(triggerTask, TriggerInfoListModel.class);
  65. List<TriggerRecordEntity> recordList = triggerRecordService.getList(triggerTask.getId());
  66. model.setRecordList(recordList);
  67. modelList.add(model);
  68. }
  69. }
  70. return modelList;
  71. }
  72. @Override
  73. public boolean existTriggerTask(String taskId, String nodeId) {
  74. if (StringUtil.isBlank(taskId) || StringUtil.isBlank(nodeId)) {
  75. return false;
  76. }
  77. QueryWrapper<TriggerTaskEntity> queryWrapper = new QueryWrapper<>();
  78. queryWrapper.lambda().eq(TriggerTaskEntity::getTaskId, taskId)
  79. .eq(TriggerTaskEntity::getNodeId, nodeId);
  80. return this.count(queryWrapper) > 0;
  81. }
  82. @Override
  83. public List<TriggerTaskModel> getList(TriggerPagination pagination) {
  84. MPJLambdaWrapper<TriggerTaskEntity> wrapper = JoinWrappers.lambda(TriggerTaskEntity.class)
  85. .select(TriggerTaskEntity::getId, TriggerTaskEntity::getFullName,
  86. TriggerTaskEntity::getParentId, TriggerTaskEntity::getParentTime,
  87. TriggerTaskEntity::getStatus, TriggerTaskEntity::getStartTime
  88. )
  89. .selectAs(TemplateEntity::getStatus, TriggerTaskModel::getTemplateStatus)
  90. .selectAs(TemplateEntity::getSystemId, TriggerTaskModel::getSystemName)
  91. .leftJoin(TemplateJsonEntity.class, TemplateJsonEntity::getId, TriggerTaskEntity::getFlowId)
  92. .leftJoin(TemplateEntity.class, TemplateEntity::getId, TemplateJsonEntity::getTemplateId)
  93. .isNull(TriggerTaskEntity::getTaskId);
  94. String keyword = pagination.getKeyword();
  95. if (StringUtil.isNotEmpty(keyword)) {
  96. wrapper.and(e -> e.like(TriggerTaskEntity::getFullName, keyword)
  97. .or().like(TriggerTaskEntity::getId, keyword));
  98. }
  99. if (ObjectUtil.isNotEmpty(pagination.getStartTime()) && ObjectUtil.isNotEmpty(pagination.getEndTime())) {
  100. wrapper.between(TriggerTaskEntity::getStartTime, new Date(pagination.getStartTime()), new Date(pagination.getEndTime()));
  101. }
  102. String systemId = pagination.getSystemId();
  103. if (ObjectUtil.isNotEmpty(systemId)) {
  104. wrapper.eq(TemplateEntity::getSystemId, systemId);
  105. }
  106. wrapper.orderByDesc(TriggerTaskEntity::getCreatorTime);
  107. Page<TriggerTaskModel> page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize());
  108. Page<TriggerTaskModel> iPage = this.selectJoinListPage(page, TriggerTaskModel.class, wrapper);
  109. return pagination.setData(iPage.getRecords(), page.getTotal());
  110. }
  111. @Override
  112. public TriggerInfoModel getInfo(String id) throws WorkFlowException {
  113. TriggerTaskEntity triggerTask = this.getById(id);
  114. if (null == triggerTask) {
  115. throw new WorkFlowException(MsgCode.FA001.get());
  116. }
  117. TriggerInfoModel model = new TriggerInfoModel();
  118. model.setTaskInfo(JsonUtil.getJsonToBean(triggerTask, TriggerTaskModel.class));
  119. TemplateJsonInfoVO jsonInfoVO = templateJsonService.getInfoVo(triggerTask.getFlowId());
  120. model.setFlowInfo(jsonInfoVO);
  121. List<TriggerRecordEntity> recordList = triggerRecordService.getList(triggerTask.getId());
  122. List<TaskNodeModel> nodeList = this.getNodeList(triggerTask, recordList);
  123. model.setNodeList(nodeList);
  124. recordList = recordList.stream().filter(e -> e.getStatus() != null).collect(Collectors.toList());
  125. model.setRecordList(recordList);
  126. ButtonModel btnInfo = model.getBtnInfo();
  127. if (ObjectUtil.equals(triggerTask.getStatus(), TaskStatusEnum.RUNNING.getCode())) {
  128. btnInfo.setHasCancelBtn(true);
  129. }
  130. return model;
  131. }
  132. public List<TaskNodeModel> getNodeList(TriggerTaskEntity triggerTask, List<TriggerRecordEntity> recordList) {
  133. List<TaskNodeModel> list = new ArrayList<>();
  134. if (ObjectUtil.equals(triggerTask.getStatus(), TaskStatusEnum.CANCEL.getCode())) {
  135. return list;
  136. }
  137. String flowId = triggerTask.getFlowId();
  138. List<TemplateNodeEntity> nodeEntityList = templateNodeService.getList(flowId);
  139. List<String> typeList = ImmutableList.of(NodeEnum.global.getType(), NodeEnum.connect.getType(), "confluence", "gateway");
  140. List<String> divideList = Arrays.stream(DivideRuleEnum.values()).map(DivideRuleEnum::getType).collect(Collectors.toList());
  141. divideList.addAll(typeList);
  142. for (TemplateNodeEntity node : nodeEntityList) {
  143. if (divideList.contains(node.getNodeType())) {
  144. continue;
  145. }
  146. TaskNodeModel model = new TaskNodeModel();
  147. NodeModel nodeModel = JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class);
  148. model.setNodeName(nodeModel.getNodeName());
  149. model.setNodeCode(nodeModel.getNodeId());
  150. model.setNodeType(nodeModel.getType());
  151. String nodeCode = node.getNodeCode();
  152. if (ObjectUtil.equals(node.getNodeType(), NodeEnum.start.getType())) {
  153. nodeCode = FlowNature.START_CODE;
  154. } else if (ObjectUtil.equals(node.getNodeType(), NodeEnum.end.getType())) {
  155. nodeCode = FlowNature.END_CODE;
  156. }
  157. String finalNodeCode = nodeCode;
  158. TriggerRecordEntity record = recordList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), finalNodeCode)).findFirst().orElse(null);
  159. if (null != record) {
  160. String type = NodeTypeEnum.current.getType();
  161. if (ObjectUtil.equals(record.getStatus(), TriggerRecordEnum.PASSED.getCode())) {
  162. type = NodeTypeEnum.pass.getType();
  163. } else if (ObjectUtil.equals(record.getStatus(), TriggerRecordEnum.EXCEPTION.getCode())) {
  164. type = NodeTypeEnum.exception.getType();
  165. }
  166. model.setType(type);
  167. }
  168. list.add(model);
  169. }
  170. return list;
  171. }
  172. @Override
  173. // @DSTransactional
  174. public void retry(String id) throws Exception {
  175. TriggerTaskEntity triggerTask = this.getById(id);
  176. if (null == triggerTask) {
  177. throw new WorkFlowException(MsgCode.FA001.get());
  178. }
  179. TemplateJsonEntity jsonEntity = templateJsonService.getInfo(triggerTask.getFlowId());
  180. TemplateEntity template = templateService.getInfo(jsonEntity.getTemplateId());
  181. if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) {
  182. throw new WorkFlowException(MsgCode.WF146.get());
  183. }
  184. ExecuteModel model = new ExecuteModel();
  185. model.setFlowId(triggerTask.getFlowId());
  186. List<Map> jsonToList = JsonUtil.getJsonToList(triggerTask.getData(), Map.class);
  187. List<Map<String, Object>> dataList = triggerUtil.castListMap(jsonToList);
  188. model.setDataList(dataList);
  189. UserInfo userInfo = UserProvider.getUser();
  190. model.setUserInfo(userInfo);
  191. model.setParentId(triggerTask.getId());
  192. triggerUtil.execute(model);
  193. }
  194. @Override
  195. public void saveTriggerTask(TriggerTaskEntity entity) {
  196. this.save(entity);
  197. }
  198. @Override
  199. public void updateTriggerTask(TriggerTaskEntity entity) {
  200. this.updateById(entity);
  201. }
  202. @Override
  203. public void batchDelete(List<String> ids) {
  204. if (ids.isEmpty()) {
  205. return;
  206. }
  207. this.removeByIds(ids);
  208. triggerRecordService.delete(ids);
  209. }
  210. @Override
  211. public void deleteByTaskId(List<String> taskId) {
  212. if (CollectionUtil.isEmpty(taskId)) {
  213. return;
  214. }
  215. QueryWrapper<TriggerTaskEntity> queryWrapper = new QueryWrapper<>();
  216. queryWrapper.lambda().in(TriggerTaskEntity::getTaskId, taskId);
  217. List<TriggerTaskEntity> list = this.list(queryWrapper);
  218. if (CollectionUtil.isEmpty(list)) {
  219. return;
  220. }
  221. List<String> ids = list.stream().map(TriggerTaskEntity::getId).collect(Collectors.toList());
  222. this.setIgnoreLogicDelete().removeByIds(ids);
  223. this.clearIgnoreLogicDelete();
  224. QueryWrapper<TriggerRecordEntity> wrapper = new QueryWrapper<>();
  225. wrapper.lambda().select(TriggerRecordEntity::getId);
  226. wrapper.lambda().in(TriggerRecordEntity::getTriggerId, ids);
  227. triggerRecordService.setIgnoreLogicDelete().removeByIds(triggerRecordService.list(wrapper));
  228. triggerRecordService.clearIgnoreLogicDelete();
  229. }
  230. @Override
  231. public boolean checkByFlowIds(List<String> flowIds) {
  232. if (CollectionUtil.isNotEmpty(flowIds)) {
  233. QueryWrapper<TriggerTaskEntity> queryWrapper = new QueryWrapper<>();
  234. queryWrapper.lambda().in(TriggerTaskEntity::getFlowId, flowIds);
  235. return this.count(queryWrapper) > 0;
  236. }
  237. return false;
  238. }
  239. }