From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/service/impl/TemplateJsonServiceImpl.java |  270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 270 insertions(+), 0 deletions(-)

diff --git a/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/service/impl/TemplateJsonServiceImpl.java b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/service/impl/TemplateJsonServiceImpl.java
new file mode 100644
index 0000000..52c2db2
--- /dev/null
+++ b/jnpf-flowable/jnpf-flowable-biz/src/main/java/jnpf/flowable/service/impl/TemplateJsonServiceImpl.java
@@ -0,0 +1,270 @@
+package jnpf.flowable.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import jnpf.base.entity.VisualdevEntity;
+import jnpf.base.service.SuperServiceImpl;
+import jnpf.exception.WorkFlowException;
+import jnpf.flowable.entity.TemplateEntity;
+import jnpf.flowable.entity.TemplateJsonEntity;
+import jnpf.flowable.entity.TemplateNodeEntity;
+import jnpf.flowable.enums.NodeEnum;
+import jnpf.flowable.enums.TemplateJsonStatueEnum;
+import jnpf.flowable.enums.TemplateStatueEnum;
+import jnpf.flowable.job.QuartzJobUtil;
+import jnpf.flowable.job.TimeTriggerJob;
+import jnpf.flowable.job.TriggerJobUtil;
+import jnpf.flowable.mapper.TemplateJsonMapper;
+import jnpf.flowable.mapper.TemplateMapper;
+import jnpf.flowable.mapper.TemplateNodeMapper;
+import jnpf.flowable.model.flowable.FlowAbleUrl;
+import jnpf.flowable.model.template.FlowConfigModel;
+import jnpf.flowable.model.templatejson.TemplateJsonInfoVO;
+import jnpf.flowable.model.templatenode.TemplateNodeUpFrom;
+import jnpf.flowable.model.templatenode.nodejson.NodeModel;
+import jnpf.flowable.model.trigger.TimeTriggerModel;
+import jnpf.flowable.service.TemplateJsonService;
+import jnpf.flowable.util.FlowUtil;
+import jnpf.flowable.util.ServiceUtil;
+import jnpf.util.*;
+import lombok.RequiredArgsConstructor;
+import org.quartz.JobDataMap;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class TemplateJsonServiceImpl extends SuperServiceImpl<TemplateJsonMapper, TemplateJsonEntity> implements TemplateJsonService {
+
+
+    private final FlowAbleUrl flowAbleUrl;
+
+    private final ServiceUtil serviceUtil;
+
+    private final RedisUtil redisUtil;
+
+    private final FlowUtil flowUtil;
+
+
+    private final TemplateMapper templateMapper;
+
+    private final TemplateNodeMapper templateNodeMapper;
+
+    @Override
+    public List<TemplateJsonEntity> getListByTemplateIds(List<String> id) {
+        return this.baseMapper.getListByTemplateIds(id);
+    }
+
+    @Override
+    public List<TemplateJsonEntity> getList(String templateId) {
+        return this.baseMapper.getList(templateId);
+    }
+
+    @Override
+    public List<TemplateJsonEntity> getListOfEnable() {
+        return this.baseMapper.getListOfEnable();
+    }
+
+    @Override
+    public TemplateJsonEntity getInfo(String id) throws WorkFlowException {
+        return this.baseMapper.getInfo(id);
+    }
+
+    @Override
+    public boolean update(String id, TemplateJsonEntity entity) {
+        return this.baseMapper.update(id, entity);
+    }
+
+    @DSTransactional
+    @Override
+    public void save(TemplateNodeUpFrom from) throws WorkFlowException {
+        String templateJsonId = from.getFlowId();
+        String id = from.getId();
+        String flowXml = from.getFlowXml();
+        Map<String, Map<String, Object>> flowNodes = from.getFlowNodes();
+        TemplateJsonEntity jsonEntity = getInfo(templateJsonId);
+        jsonEntity.setFlowXml(flowXml);
+        TemplateEntity entity = templateMapper.getInfo(id);
+        String flowConfig = from.getFlowConfig();
+        entity.setFlowConfig(flowConfig);
+        FlowConfigModel config = JsonUtil.getJsonToBean(flowConfig, FlowConfigModel.class);
+        config = config == null ? new FlowConfigModel() : config;
+        entity.setVisibleType(config.getVisibleType());
+        //鍙戝竷娴佺▼
+        if (Objects.equals(from.getType(), 1)) {
+            if (StringUtil.isEmpty(jsonEntity.getFlowableId())) {
+                String deploymentId = flowAbleUrl.deployFlowAble(flowXml, templateJsonId);
+                jsonEntity.setFlowableId(deploymentId);
+            }
+            //鏀规祦绋嬬増鏈�
+            if (StringUtil.isNotEmpty(id)) {
+                TemplateJsonEntity info = getList(id).stream().filter(t -> Objects.equals(t.getState(), TemplateJsonStatueEnum.START.getCode())).findFirst().orElse(null);
+                int state = jsonEntity.getState();
+                if (info != null) {
+                    // 鍙樻洿褰掓。鐘舵�侊紝鎺掑簭鐮�
+                    info.setState(TemplateJsonStatueEnum.HISTORY.getCode());
+                    this.update(info.getId(), info);
+                }
+                jsonEntity.setState(TemplateJsonStatueEnum.START.getCode());
+                entity.setFlowId(templateJsonId);
+                entity.setFlowableId(jsonEntity.getFlowableId());
+                entity.setVersion(jsonEntity.getVersion());
+                entity.setEnabledMark(1);
+                entity.setStatus(TemplateStatueEnum.UP.getCode());
+                // 褰掓。鐘舵�佺殑浠呭惎鐢�
+                if (Objects.equals(2, state)) {
+                    if (StringUtil.isEmpty(entity.getEnCode())) {
+                        entity.setEnCode(flowUtil.getEnCode(entity));
+                    }
+                    templateMapper.update(entity.getId(), entity);
+                    this.update(jsonEntity.getId(), jsonEntity);
+                    return;
+                }
+            }
+        }
+        if (StringUtil.isEmpty(entity.getEnCode())) {
+            entity.setEnCode(flowUtil.getEnCode(entity));
+        }
+        templateMapper.update(entity.getId(), entity);
+
+        TemplateNodeEntity timeTriggerNode = null;
+        if (ObjectUtil.isNotEmpty(flowNodes)) {
+            List<TemplateNodeEntity> list = templateNodeMapper.getList(jsonEntity.getId());
+            List<String> deleteList = list.stream().map(TemplateNodeEntity::getId).collect(Collectors.toList());
+            templateNodeMapper.delete(deleteList);
+            // 寮�濮嬭妭鐐圭殑琛ㄥ崟
+            String startFormId = null;
+            for (Map.Entry<String, Map<String, Object>> stringMapEntry : flowNodes.entrySet()) {
+                String key = stringMapEntry.getKey();
+                NodeModel startNode = JsonUtil.getJsonToBean(flowNodes.get(key), NodeModel.class);
+                if (ObjectUtil.equals(startNode.getType(), NodeEnum.START.getType())) {
+                    startFormId = startNode.getFormId();
+                    break;
+                }
+            }
+            for (Map.Entry<String, Map<String, Object>> stringMapEntry : flowNodes.entrySet()) {
+                String key = stringMapEntry.getKey();
+                NodeModel nodeModel = JsonUtil.getJsonToBean(flowNodes.get(key), NodeModel.class);
+                TemplateNodeEntity nodeEntity = list.stream().filter(t -> ObjectUtil.equals(t.getNodeCode(), key)).findFirst().orElse(new TemplateNodeEntity());
+                nodeEntity.setId(RandomUtil.uuId());
+                nodeEntity.setFlowId(jsonEntity.getId());
+                nodeEntity.setNodeCode(key);
+                nodeEntity.setNodeJson(JsonUtil.getObjectToString(flowNodes.get(key)));
+                nodeEntity.setNodeType(nodeModel.getType());
+                if (StringUtil.isNotEmpty(nodeModel.getFormId())) {
+                    nodeEntity.setFormId(nodeModel.getFormId());
+                } else {
+                    nodeEntity.setFormId(startFormId);
+                }
+                // 瑙﹀彂鑺傜偣锛氬畾鏃躲�亀ebhook 灏唂lowId璁剧疆鍒癴ormId瀛楁   閫氱煡灏唌sgId璁剧疆鍒癴ormId
+                if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.TIME_TRIGGER.getType())) {
+                    nodeEntity.setFormId(nodeEntity.getFlowId());
+                    if (Objects.equals(from.getType(), 1)) {
+                        timeTriggerNode = nodeEntity;
+                    }
+                } else if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.WEBHOOK_TRIGGER.getType())) {
+                    nodeEntity.setFormId(nodeEntity.getFlowId());
+                } else if (ObjectUtil.equals(nodeModel.getType(), NodeEnum.NOTICE_TRIGGER.getType())) {
+                    nodeEntity.setFormId(nodeModel.getNoticeId());
+                }
+                templateNodeMapper.insertOrUpdate(nodeEntity);
+            }
+
+        }
+        this.update(jsonEntity.getId(), jsonEntity);
+        if (null != timeTriggerNode) {
+            this.timeTrigger(timeTriggerNode);
+        }
+    }
+
+    public void timeTrigger(TemplateNodeEntity nodeEntity) {
+        NodeModel nodeModel = JsonUtil.getJsonToBean(nodeEntity.getNodeJson(), NodeModel.class);
+        String id = RandomUtil.uuId();
+        TimeTriggerModel model = new TimeTriggerModel();
+        model.setId(id);
+        model.setFlowId(nodeEntity.getFlowId());
+        model.setUserInfo(UserProvider.getUser());
+        model.setCron(nodeModel.getCron());
+        model.setEndLimit(nodeModel.getEndLimit());
+        model.setEndTimeType(nodeModel.getEndTimeType());
+
+        String start = nodeModel.getStartTime();
+        String end = nodeModel.getEndTime();
+        Date startTime = ObjectUtil.isNotEmpty(start) ? new Date(Long.parseLong(start)) : new Date();
+        Date endTime = ObjectUtil.equals(nodeModel.getEndTimeType(), 2) ? new Date(Long.parseLong(end)) : null;
+        model.setStartTime(startTime.getTime());
+        model.setEndTime(endTime != null ? endTime.getTime() : null);
+
+        JobDataMap jobDataMap = new JobDataMap();
+        jobDataMap.putAll(JsonUtil.entityToMap(model));
+
+        redisUtil.removeHash(TriggerJobUtil.TRIGGER_MODEL, model.getId());
+        boolean isAdd = endTime == null || endTime.getTime() > System.currentTimeMillis();
+        if (isAdd) {
+            QuartzJobUtil.addJob(id, nodeModel.getCron(), TimeTriggerJob.class, jobDataMap, startTime, endTime);
+        }
+    }
+
+    @DSTransactional
+    @Override
+    public void create(TemplateNodeUpFrom from) {
+        flowUtil.create(from);
+    }
+
+    @Override
+    public void delete(List<String> idList) {
+        this.baseMapper.delete(idList);
+        templateNodeMapper.delete(idList);
+    }
+
+    @Override
+    public void copy(TemplateJsonEntity entity, String flowId) {
+        List<TemplateNodeEntity> list = templateNodeMapper.getList(entity.getId());
+        Map<String, Map<String, Object>> flowNodes = new HashMap<>();
+        for (TemplateNodeEntity nodeEntity : list) {
+            Map<String, Object> map = JsonUtil.stringToMap(nodeEntity.getNodeJson());
+            if (ObjectUtil.equals(nodeEntity.getNodeType(), NodeEnum.WEBHOOK_TRIGGER.getType())) {
+                map.put("webhookUrl", "");
+            }
+            flowNodes.put(nodeEntity.getNodeCode(), map);
+        }
+        TemplateNodeUpFrom from = new TemplateNodeUpFrom();
+        from.setId(entity.getTemplateId());
+        from.setFlowXml(entity.getFlowXml());
+        from.setFlowNodes(flowNodes);
+        from.setFlowId(flowId);
+        create(from);
+    }
+
+    @Override
+    public TemplateJsonInfoVO getInfoVo(String id) throws WorkFlowException {
+        TemplateJsonEntity jsonEntity = this.getInfo(id);
+        TemplateEntity entity = templateMapper.getInfo(jsonEntity.getTemplateId());
+        TemplateJsonInfoVO vo = JsonUtil.getJsonToBean(entity, TemplateJsonInfoVO.class);
+        vo.setFlowXml(jsonEntity.getFlowXml());
+        List<TemplateNodeEntity> templateNodeList = templateNodeMapper.getList(jsonEntity.getId());
+        Map<String, Map<String, Object>> flowNodes = new HashMap<>();
+        for (TemplateNodeEntity nodeEntity : templateNodeList) {
+            flowNodes.put(nodeEntity.getNodeCode(), JsonUtil.stringToMap(nodeEntity.getNodeJson()));
+        }
+        vo.setFlowableId(jsonEntity.getFlowableId());
+        vo.setFlowNodes(flowNodes);
+        vo.setFlowId(jsonEntity.getId());
+        return vo;
+    }
+
+    @Override
+    public VisualdevEntity getFormInfo(String id) throws WorkFlowException {
+        TemplateEntity template = templateMapper.getInfo(id);
+        String flowId = template.getFlowId();
+        TemplateJsonEntity jsonEntity = this.getInfo(flowId);
+        List<TemplateNodeEntity> templateNodeList = templateNodeMapper.getList(jsonEntity.getId());
+        TemplateNodeEntity global = templateNodeList.stream().filter(e -> ObjectUtil.equals(e.getNodeType(), NodeEnum.GLOBAL.getType())).findFirst().orElse(null);
+        if (null != global) {
+            return serviceUtil.getFormInfo(global.getFormId());
+        }
+        return null;
+    }
+}

--
Gitblit v1.8.0