package jnpf.flowable.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.google.common.collect.ImmutableList; import jnpf.base.UserInfo; import jnpf.base.service.SuperServiceImpl; import jnpf.constant.MsgCode; import jnpf.exception.WorkFlowException; import jnpf.flowable.entity.*; import jnpf.flowable.enums.*; import jnpf.flowable.mapper.*; import jnpf.flowable.model.templatejson.TemplateJsonInfoVO; import jnpf.flowable.model.templatenode.ButtonModel; import jnpf.flowable.model.templatenode.TaskNodeModel; import jnpf.flowable.model.templatenode.nodejson.NodeModel; import jnpf.flowable.model.trigger.*; import jnpf.flowable.model.util.FlowNature; import jnpf.flowable.service.TriggerTaskService; import jnpf.flowable.util.FlowUtil; import jnpf.flowable.util.OperatorUtil; import jnpf.util.JsonUtil; import jnpf.util.UserProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 类的描述 * * @author JNPF@YinMai Info. Co., Ltd * @version 5.0.x * @since 2024/9/10 17:13 */ @Service public class TriggerTaskServiceImpl extends SuperServiceImpl implements TriggerTaskService { @Autowired private FlowUtil flowUtil; @Autowired private OperatorUtil operatorUtil; @Autowired private TriggerRecordMapper triggerRecordMapper; @Autowired private TemplateMapper templateMapper; @Autowired private TemplateJsonMapper templateJsonMapper; @Autowired private TemplateNodeMapper templateNodeMapper; @Override public List getListByTaskId(String taskId, String nodeCode) { List list = this.baseMapper.getListByTaskId(taskId,nodeCode); List modelList = new ArrayList<>(); if (CollectionUtil.isNotEmpty(list)) { for (TriggerTaskEntity triggerTask : list) { TriggerInfoListModel model = JsonUtil.getJsonToBean(triggerTask, TriggerInfoListModel.class); List recordList = triggerRecordMapper.getList(triggerTask.getId()); model.setRecordList(recordList); modelList.add(model); } } return modelList; } @Override public boolean existTriggerTask(String taskId, String nodeId) { return this.baseMapper.existTriggerTask(taskId, nodeId); } @Override public List getList(TriggerPagination pagination) { return this.baseMapper.getList(pagination); } @Override public TriggerInfoModel getInfo(String id) throws WorkFlowException { TriggerTaskEntity triggerTask = this.getById(id); if (null == triggerTask) { throw new WorkFlowException(MsgCode.FA001.get()); } TriggerInfoModel model = new TriggerInfoModel(); model.setTaskInfo(JsonUtil.getJsonToBean(triggerTask, TriggerTaskModel.class)); TemplateJsonInfoVO jsonInfoVO = flowUtil.getInfoVo(triggerTask.getFlowId()); model.setFlowInfo(jsonInfoVO); List recordList = triggerRecordMapper.getList(triggerTask.getId()); List nodeList = this.getNodeList(triggerTask, recordList); model.setNodeList(nodeList); recordList = recordList.stream().filter(e -> e.getStatus() != null).collect(Collectors.toList()); model.setRecordList(recordList); ButtonModel btnInfo = model.getBtnInfo(); if (ObjectUtil.equals(triggerTask.getStatus(), TaskStatusEnum.RUNNING.getCode())) { btnInfo.setHasCancelBtn(true); } return model; } public List getNodeList(TriggerTaskEntity triggerTask, List recordList) { List list = new ArrayList<>(); if (ObjectUtil.equals(triggerTask.getStatus(), TaskStatusEnum.CANCEL.getCode())) { return list; } String flowId = triggerTask.getFlowId(); List nodeEntityList = templateNodeMapper.getList(flowId); List typeList = ImmutableList.of(NodeEnum.global.getType(), NodeEnum.connect.getType(), "confluence", "gateway"); List divideList = Arrays.stream(DivideRuleEnum.values()).map(DivideRuleEnum::getType).collect(Collectors.toList()); divideList.addAll(typeList); for (TemplateNodeEntity node : nodeEntityList) { if (divideList.contains(node.getNodeType())) { continue; } TaskNodeModel model = new TaskNodeModel(); NodeModel nodeModel = JsonUtil.getJsonToBean(node.getNodeJson(), NodeModel.class); model.setNodeName(nodeModel.getNodeName()); model.setNodeCode(nodeModel.getNodeId()); model.setNodeType(nodeModel.getType()); String nodeCode = node.getNodeCode(); if (ObjectUtil.equals(node.getNodeType(), NodeEnum.start.getType())) { nodeCode = FlowNature.START_CODE; } else if (ObjectUtil.equals(node.getNodeType(), NodeEnum.end.getType())) { nodeCode = FlowNature.END_CODE; } String finalNodeCode = nodeCode; TriggerRecordEntity record = recordList.stream().filter(e -> ObjectUtil.equals(e.getNodeCode(), finalNodeCode)).findFirst().orElse(null); if (null != record) { String type = NodeTypeEnum.current.getType(); if (ObjectUtil.equals(record.getStatus(), TriggerRecordEnum.PASSED.getCode())) { type = NodeTypeEnum.pass.getType(); } else if (ObjectUtil.equals(record.getStatus(), TriggerRecordEnum.EXCEPTION.getCode())) { type = NodeTypeEnum.exception.getType(); } model.setType(type); } list.add(model); } return list; } @Override public void retry(String id) throws Exception { TriggerTaskEntity triggerTask = this.getById(id); if (null == triggerTask) { throw new WorkFlowException(MsgCode.FA001.get()); } TemplateJsonEntity jsonEntity = templateJsonMapper.getInfo(triggerTask.getFlowId()); TemplateEntity template = templateMapper.getInfo(jsonEntity.getTemplateId()); if (!ObjectUtil.equals(template.getStatus(), TemplateStatueEnum.up.getCode())) { throw new WorkFlowException(MsgCode.WF146.get()); } ExecuteModel model = new ExecuteModel(); model.setFlowId(triggerTask.getFlowId()); List> dataList = JsonUtil.getJsonToListMap(triggerTask.getData()); model.setDataList(dataList); UserInfo userInfo = UserProvider.getUser(); model.setUserInfo(userInfo); model.setParentId(triggerTask.getId()); operatorUtil.execute(model); } @Override public void saveTriggerTask(TriggerTaskEntity entity) { this.save(entity); } @Override public void updateTriggerTask(TriggerTaskEntity entity) { this.updateById(entity); } @Override public void batchDelete(List ids) { if (ids.isEmpty()) { return; } this.removeByIds(ids); triggerRecordMapper.delete(ids); } @Override public boolean checkByFlowIds(List flowIds) { return this.baseMapper.checkByFlowIds(flowIds); } }