TemplateJsonServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. package jnpf.flowable.service.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import jnpf.base.entity.VisualdevEntity;
  7. import jnpf.base.service.SuperServiceImpl;
  8. import jnpf.constant.MsgCode;
  9. import jnpf.exception.WorkFlowException;
  10. import jnpf.flowable.entity.TemplateEntity;
  11. import jnpf.flowable.entity.TemplateJsonEntity;
  12. import jnpf.flowable.entity.TemplateNodeEntity;
  13. import jnpf.flowable.enums.NodeEnum;
  14. import jnpf.flowable.enums.TemplateStatueEnum;
  15. import jnpf.flowable.job.QuartzJobUtil;
  16. import jnpf.flowable.job.TimeTriggerJob;
  17. import jnpf.flowable.job.TriggerJobUtil;
  18. import jnpf.flowable.mapper.TemplateJsonMapper;
  19. import jnpf.flowable.model.flowable.FlowAbleUrl;
  20. import jnpf.flowable.model.template.FlowConfigModel;
  21. import jnpf.flowable.model.templatejson.TemplateJsonInfoVO;
  22. import jnpf.flowable.model.templatenode.TemplateNodeUpFrom;
  23. import jnpf.flowable.model.templatenode.nodejson.NodeModel;
  24. import jnpf.flowable.model.trigger.TimeTriggerModel;
  25. import jnpf.flowable.service.TemplateJsonService;
  26. import jnpf.flowable.service.TemplateNodeService;
  27. import jnpf.flowable.service.TemplateService;
  28. import jnpf.flowable.util.ServiceUtil;
  29. import jnpf.util.*;
  30. import org.quartz.JobDataMap;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. @Service
  36. public class TemplateJsonServiceImpl extends SuperServiceImpl<TemplateJsonMapper, TemplateJsonEntity> implements TemplateJsonService {
  37. @Autowired
  38. private FlowAbleUrl flowAbleUrl;
  39. @Autowired
  40. private TemplateService templateService;
  41. @Autowired
  42. private TemplateNodeService templateNodeService;
  43. @Autowired
  44. private ServiceUtil serviceUtil;
  45. @Autowired
  46. private RedisUtil redisUtil;
  47. @Override
  48. public List<TemplateJsonEntity> getListByTemplateIds(List<String> id) {
  49. List<TemplateJsonEntity> list = new ArrayList<>();
  50. if (!id.isEmpty()) {
  51. QueryWrapper<TemplateJsonEntity> queryWrapper = new QueryWrapper<>();
  52. queryWrapper.lambda().in(TemplateJsonEntity::getTemplateId, id);
  53. list.addAll(this.list(queryWrapper));
  54. }
  55. return list;
  56. }
  57. @Override
  58. public List<TemplateJsonEntity> getList(String templateId) {
  59. QueryWrapper<TemplateJsonEntity> queryWrapper = new QueryWrapper<>();
  60. queryWrapper.lambda().eq(TemplateJsonEntity::getTemplateId, templateId);
  61. List<TemplateJsonEntity> list = this.list(queryWrapper);
  62. List<TemplateJsonEntity> resList = new ArrayList<>();
  63. if (CollectionUtil.isNotEmpty(list)) {
  64. // 启用中
  65. List<TemplateJsonEntity> enableList = list.stream().filter(e -> ObjectUtil.equals(e.getState(), 1))
  66. .sorted(Comparator.comparing(TemplateJsonEntity::getCreatorTime).reversed()).collect(Collectors.toList());
  67. // 已归档
  68. List<TemplateJsonEntity> historicList = list.stream().filter(e -> ObjectUtil.equals(e.getState(), 2))
  69. .sorted(Comparator.comparing(TemplateJsonEntity::getCreatorTime).reversed()).collect(Collectors.toList());
  70. // 设计中
  71. List<TemplateJsonEntity> designList = list.stream().filter(e -> ObjectUtil.equals(e.getState(), 0))
  72. .sorted(Comparator.comparing(TemplateJsonEntity::getCreatorTime).reversed()).collect(Collectors.toList());
  73. resList.addAll(enableList);
  74. resList.addAll(historicList);
  75. resList.addAll(designList);
  76. }
  77. return resList;
  78. }
  79. @Override
  80. public List<TemplateJsonEntity> getListOfEnable() {
  81. QueryWrapper<TemplateJsonEntity> queryWrapper = new QueryWrapper<>();
  82. queryWrapper.lambda().eq(TemplateJsonEntity::getState, 1);
  83. return this.list(queryWrapper);
  84. }
  85. @Override
  86. public TemplateJsonEntity getInfo(String id) throws WorkFlowException {
  87. QueryWrapper<TemplateJsonEntity> queryWrapper = new QueryWrapper<>();
  88. queryWrapper.lambda().eq(TemplateJsonEntity::getId, id);
  89. TemplateJsonEntity jsonEntity = this.getOne(queryWrapper);
  90. if (jsonEntity == null) {
  91. throw new WorkFlowException(MsgCode.FA001.get());
  92. }
  93. return jsonEntity;
  94. }
  95. @Override
  96. public boolean update(String id, TemplateJsonEntity entity) {
  97. entity.setId(id);
  98. return this.updateById(entity);
  99. }
  100. @DSTransactional
  101. @Override
  102. public void save(TemplateNodeUpFrom from) throws WorkFlowException {
  103. String templateJsonId = from.getFlowId();
  104. String id = from.getId();
  105. String flowXml = from.getFlowXml();
  106. Map<String, Map<String, Object>> flowNodes = from.getFlowNodes();
  107. TemplateJsonEntity jsonEntity = getInfo(templateJsonId);
  108. jsonEntity.setFlowXml(flowXml);
  109. TemplateEntity entity = templateService.getInfo(id);
  110. String flowConfig = from.getFlowConfig();
  111. entity.setFlowConfig(flowConfig);
  112. FlowConfigModel config = JsonUtil.getJsonToBean(flowConfig, FlowConfigModel.class);
  113. config = config == null ? new FlowConfigModel() : config;
  114. entity.setVisibleType(config.getVisibleType());
  115. //发布流程
  116. if (Objects.equals(from.getType(), 1)) {
  117. if (StringUtil.isEmpty(jsonEntity.getFlowableId())) {
  118. String deploymentId = flowAbleUrl.deployFlowAble(flowXml, templateJsonId);
  119. jsonEntity.setFlowableId(deploymentId);
  120. }
  121. //改流程版本
  122. if (StringUtil.isNotEmpty(id)) {
  123. TemplateJsonEntity info = getList(id).stream().filter(t -> Objects.equals(t.getState(), 1)).findFirst().orElse(null);
  124. int state = jsonEntity.getState();
  125. if (info != null) {
  126. // 变更归档状态,排序码
  127. //info.setSortCode(0L);
  128. info.setState(2);
  129. this.update(info.getId(), info);
  130. }
  131. jsonEntity.setState(1);
  132. //jsonEntity.setSortCode(1L);
  133. entity.setFlowId(templateJsonId);
  134. entity.setFlowableId(jsonEntity.getFlowableId());
  135. entity.setVersion(jsonEntity.getVersion());
  136. entity.setEnabledMark(1);
  137. entity.setStatus(TemplateStatueEnum.up.getCode());
  138. // 归档状态的仅启用
  139. if (Objects.equals(2, state)) {
  140. templateService.update(entity.getId(), entity);
  141. this.update(jsonEntity.getId(), jsonEntity);
  142. // this.timeTrigger(jsonEntity.getId());
  143. return;
  144. }
  145. }
  146. }
  147. templateService.update(entity.getId(), entity);
  148. TemplateNodeEntity timeTriggerNode = null;
  149. if (ObjectUtil.isNotEmpty(flowNodes)) {
  150. List<TemplateNodeEntity> list = templateNodeService.getList(jsonEntity.getId());
  151. List<String> deleteList = list.stream().map(TemplateNodeEntity::getId).collect(Collectors.toList());
  152. templateNodeService.delete(deleteList);
  153. // 开始节点的表单
  154. String startFormId = null;
  155. for (String key : flowNodes.keySet()) {
  156. NodeModel startNode = JsonUtil.getJsonToBean(flowNodes.get(key), NodeModel.class);
  157. if (ObjectUtil.equals(startNode.getType(), NodeEnum.start.getType())) {
  158. startFormId = startNode.getFormId();
  159. break;
  160. }
  161. }
  162. String formId = null;
  163. for (String key : flowNodes.keySet()) {
  164. NodeModel nodeModel = JsonUtil.getJsonToBean(flowNodes.get(key), NodeModel.class);
  165. if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.global.getType())) {
  166. formId = nodeModel.getFormId();
  167. }
  168. TemplateNodeEntity nodeEntity = list.stream().filter(t -> ObjectUtil.equals(t.getNodeCode(), key)).findFirst().orElse(new TemplateNodeEntity());
  169. nodeEntity.setId(StringUtil.isNotEmpty(nodeEntity.getId()) ? nodeEntity.getId() : RandomUtil.uuId());
  170. nodeEntity.setFlowId(jsonEntity.getId());
  171. nodeEntity.setNodeCode(key);
  172. nodeEntity.setNodeJson(JsonUtil.getObjectToString(flowNodes.get(key)));
  173. nodeEntity.setNodeType(nodeModel.getType());
  174. if (StringUtil.isNotEmpty(nodeModel.getFormId())) {
  175. nodeEntity.setFormId(nodeModel.getFormId());
  176. } else {
  177. nodeEntity.setFormId(startFormId);
  178. }
  179. // 触发节点:定时、webhook 将flowId设置到formId字段 通知将msgId设置到formId
  180. if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.timeTrigger.getType())) {
  181. nodeEntity.setFormId(nodeEntity.getFlowId());
  182. if (Objects.equals(from.getType(), 1)) {
  183. timeTriggerNode = nodeEntity;
  184. }
  185. } else if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.webhookTrigger.getType())) {
  186. nodeEntity.setFormId(nodeEntity.getFlowId());
  187. } else if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.noticeTrigger.getType())) {
  188. nodeEntity.setFormId(nodeModel.getNoticeId());
  189. }
  190. templateNodeService.setIgnoreLogicDelete().removeById(nodeEntity.getId());
  191. templateNodeService.setIgnoreLogicDelete().saveOrUpdate(nodeEntity);
  192. templateNodeService.clearIgnoreLogicDelete();
  193. }
  194. // 保存表单关联
  195. if (null != formId) {
  196. List<String> formIds = new ArrayList<>();
  197. formIds.add(formId);
  198. }
  199. }
  200. this.update(jsonEntity.getId(), jsonEntity);
  201. if (null != timeTriggerNode) {
  202. this.timeTrigger(timeTriggerNode);
  203. }
  204. }
  205. public void timeTrigger(String flowId) {
  206. List<TemplateNodeEntity> list = templateNodeService.getList(flowId);
  207. List<TemplateNodeEntity> timeTriggerList = list.stream()
  208. .filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.timeTrigger.getType())).collect(Collectors.toList());
  209. if (CollectionUtil.isNotEmpty(timeTriggerList)) {
  210. for (TemplateNodeEntity nodeEntity : timeTriggerList) {
  211. this.timeTrigger(nodeEntity);
  212. }
  213. }
  214. }
  215. public void timeTrigger(TemplateNodeEntity nodeEntity) {
  216. NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
  217. String id = RandomUtil.uuId();
  218. TimeTriggerModel model = new TimeTriggerModel();
  219. model.setId(id);
  220. model.setFlowId(nodeEntity.getFlowId());
  221. model.setUserInfo(UserProvider.getUser());
  222. model.setCron(nodeModel.getCron());
  223. model.setEndLimit(nodeModel.getEndLimit());
  224. model.setEndTimeType(nodeModel.getEndTimeType());
  225. String start = nodeModel.getStartTime();
  226. String end = nodeModel.getEndTime();
  227. Date startTime = ObjectUtil.isNotEmpty(start) ? new Date(Long.parseLong(start)) : new Date();
  228. Date endTime = ObjectUtil.equals(nodeModel.getEndTimeType(), 2) ? new Date(Long.parseLong(end)) : null;
  229. model.setStartTime(startTime.getTime());
  230. model.setEndTime(endTime != null ? endTime.getTime() : null);
  231. JobDataMap jobDataMap = new JobDataMap();
  232. jobDataMap.putAll(JsonUtil.entityToMap(model));
  233. redisUtil.removeHash(TriggerJobUtil.TRIGGER_MODEL, model.getId());
  234. boolean isAdd = endTime == null || endTime.getTime() > System.currentTimeMillis();
  235. if (isAdd) {
  236. QuartzJobUtil.addJob(id, nodeModel.getCron(), TimeTriggerJob.class, jobDataMap, startTime, endTime);
  237. }
  238. }
  239. @DSTransactional
  240. @Override
  241. public void create(TemplateNodeUpFrom from) {
  242. Map<String, Map<String, Object>> flowNodes = from.getFlowNodes();
  243. String flowXml = from.getFlowXml();
  244. String templateJsonId = from.getFlowId();
  245. String id = from.getId();
  246. List<TemplateJsonEntity> jsonList = getList(id);
  247. int version = jsonList.stream().map(TemplateJsonEntity::getVersion).mapToInt(Integer::parseInt).max().orElse(0) + 1;
  248. TemplateJsonEntity entity = new TemplateJsonEntity();
  249. entity.setId(StringUtil.isNotEmpty(templateJsonId) ? templateJsonId : RandomUtil.uuId());
  250. entity.setTemplateId(id);
  251. entity.setFlowXml(flowXml);
  252. NodeModel startNode = JsonUtil.getJsonToList(new ArrayList<>(flowNodes.values()), NodeModel.class).stream().filter(t -> NodeEnum.start.getType().equals(t.getType())).findFirst().orElse(null);
  253. entity.setVersion(String.valueOf(version));
  254. entity.setState(0);
  255. entity.setSortCode(0L);
  256. String formId = null != startNode ? startNode.getFormId() : null;
  257. for (String key : flowNodes.keySet()) {
  258. NodeModel nodeModel = JsonUtil.getJsonToBean(flowNodes.get(key), NodeModel.class);
  259. TemplateNodeEntity nodeEntity = new TemplateNodeEntity();
  260. nodeEntity.setId(StringUtil.isNotEmpty(nodeEntity.getId()) ? nodeEntity.getId() : RandomUtil.uuId());
  261. nodeEntity.setFlowId(entity.getId());
  262. nodeEntity.setNodeCode(key);
  263. nodeEntity.setNodeJson(JsonUtil.getObjectToString(flowNodes.get(key)));
  264. nodeEntity.setNodeType(nodeModel.getType());
  265. nodeEntity.setFormId(StringUtil.isBlank(nodeModel.getFormId()) ? formId : nodeModel.getFormId());
  266. templateNodeService.setIgnoreLogicDelete().removeById(nodeEntity.getId());
  267. templateNodeService.setIgnoreLogicDelete().saveOrUpdate(nodeEntity);
  268. templateNodeService.clearIgnoreLogicDelete();
  269. }
  270. this.setIgnoreLogicDelete().removeById(entity.getId());
  271. this.setIgnoreLogicDelete().saveOrUpdate(entity);
  272. this.clearIgnoreLogicDelete();
  273. }
  274. @Override
  275. public void delete(TemplateJsonEntity entity) {
  276. if (entity != null) {
  277. this.removeById(entity.getId());
  278. }
  279. }
  280. @Override
  281. public void delete(List<String> idList) {
  282. if (idList.size() > 0) {
  283. QueryWrapper<TemplateJsonEntity> queryWrapper = new QueryWrapper<>();
  284. queryWrapper.lambda().in(TemplateJsonEntity::getId, idList);
  285. this.remove(queryWrapper);
  286. templateNodeService.delete(idList);
  287. }
  288. }
  289. @Override
  290. public void copy(TemplateJsonEntity entity, String flowId) {
  291. List<TemplateNodeEntity> list = templateNodeService.getList(entity.getId());
  292. Map<String, Map<String, Object>> flowNodes = new HashMap<>();
  293. for (TemplateNodeEntity nodeEntity : list) {
  294. Map<String, Object> map = JsonUtil.stringToMap(nodeEntity.getNodeJson());
  295. if (ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.webhookTrigger.getType())) {
  296. map.put("webhookUrl", "");
  297. }
  298. flowNodes.put(nodeEntity.getNodeCode(), map);
  299. }
  300. TemplateNodeUpFrom from = new TemplateNodeUpFrom();
  301. from.setId(entity.getTemplateId());
  302. from.setFlowXml(entity.getFlowXml());
  303. from.setFlowNodes(flowNodes);
  304. from.setFlowId(flowId);
  305. create(from);
  306. }
  307. @Override
  308. public TemplateJsonInfoVO getInfoVo(String id) throws WorkFlowException {
  309. TemplateJsonEntity jsonEntity = this.getInfo(id);
  310. TemplateEntity entity = templateService.getInfo(jsonEntity.getTemplateId());
  311. TemplateJsonInfoVO vo = JsonUtil.getJsonToBean(entity, TemplateJsonInfoVO.class);
  312. vo.setFlowXml(jsonEntity.getFlowXml());
  313. List<TemplateNodeEntity> templateNodeList = templateNodeService.getList(jsonEntity.getId());
  314. Map<String, Map<String, Object>> flowNodes = new HashMap<>();
  315. for (TemplateNodeEntity nodeEntity : templateNodeList) {
  316. flowNodes.put(nodeEntity.getNodeCode(), JsonUtil.stringToMap(nodeEntity.getNodeJson()));
  317. }
  318. vo.setFlowableId(jsonEntity.getFlowableId());
  319. vo.setFlowNodes(flowNodes);
  320. vo.setFlowId(jsonEntity.getId());
  321. return vo;
  322. }
  323. @Override
  324. public VisualdevEntity getFormInfo(String id) throws WorkFlowException {
  325. TemplateEntity template = templateService.getInfo(id);
  326. String flowId = template.getFlowId();
  327. TemplateJsonEntity jsonEntity = this.getInfo(flowId);
  328. List<TemplateNodeEntity> templateNodeList = templateNodeService.getList(jsonEntity.getId());
  329. TemplateNodeEntity global = templateNodeList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.global.getType())).findFirst().orElse(null);
  330. if (null != global) {
  331. return serviceUtil.getFormInfo(global.getFormId());
  332. }
  333. return null;
  334. }
  335. }