package jnpf.integrate.util; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.Method; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import jnpf.base.ActionResult; import jnpf.base.UserInfo; import jnpf.base.entity.VisualdevEntity; import jnpf.base.model.VisualDevJsonModel; import jnpf.base.model.VisualLogModel; import jnpf.base.model.flow.DataModel; import jnpf.base.service.DataInterfaceService; import jnpf.base.service.VisualdevService; import jnpf.base.util.SentMessageUtil; import jnpf.config.ConfigValueUtil; import jnpf.constant.DataInterfaceVarConst; import jnpf.constant.JnpfConst; import jnpf.constant.MsgCode; import jnpf.database.model.superQuery.SuperJsonModel; import jnpf.database.model.superQuery.SuperQueryJsonModel; import jnpf.emnus.TemplateEnum; import jnpf.exception.WorkFlowException; import jnpf.flowable.entity.TaskEntity; import jnpf.flowable.entity.TemplateEntity; import jnpf.flowable.entity.TemplateJsonEntity; import jnpf.flowable.enums.TaskStatusEnum; import jnpf.flowable.model.task.FlowModel; import jnpf.flowable.model.templatejson.FlowFormModel; import jnpf.flowable.model.trigger.TriggerDataFo; import jnpf.flowable.model.trigger.TriggerDataModel; import jnpf.flowable.model.trigger.TriggerModel; import jnpf.flowable.service.TaskService; import jnpf.flowable.service.TemplateJsonService; import jnpf.flowable.service.TemplateService; import jnpf.integrate.entity.IntegrateEntity; import jnpf.integrate.entity.IntegrateNodeEntity; import jnpf.integrate.entity.IntegrateQueueEntity; import jnpf.integrate.entity.IntegrateTaskEntity; import jnpf.integrate.model.childnode.*; import jnpf.integrate.model.integrate.IntegratePagination; import jnpf.integrate.model.nodeJson.IntegrateChildNodeList; import jnpf.integrate.model.nodeJson.IntegrateChildNodeModel; import jnpf.integrate.service.IntegrateNodeService; import jnpf.integrate.service.IntegrateQueueService; import jnpf.integrate.service.IntegrateService; import jnpf.integrate.service.IntegrateTaskService; import jnpf.message.model.SentMessageForm; import jnpf.model.visualJson.FieLdsModel; import jnpf.onlinedev.model.AsyncExecuteModel; import jnpf.onlinedev.model.OnlineInfoModel; import jnpf.onlinedev.model.PaginationModel; import jnpf.base.model.OnlineImport.VisualdevModelDataInfoVO; import jnpf.onlinedev.model.VisualParamModel; import jnpf.onlinedev.service.VisualDevInfoService; import jnpf.onlinedev.service.VisualDevListService; import jnpf.onlinedev.service.VisualdevModelDataService; import jnpf.onlinedev.util.onlineDevUtil.OnlinePublicUtils; import jnpf.permission.entity.UserEntity; import jnpf.permission.model.authorize.AuthorizeConditionEnum; import jnpf.permission.service.OrganizeAdministratorService; import jnpf.permission.service.OrganizeService; import jnpf.permission.service.UserService; import jnpf.util.*; import jnpf.workflow.service.TriggerApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.*; import java.util.stream.Collectors; @Component public class IntegrateUtil { @Autowired private UserService userService; @Autowired private SentMessageUtil sentMessageUtil; @Autowired private DataInterfaceService dataInterfaceService; @Autowired private VisualDevListService visualDevListService; @Autowired private IntegrateService integrateService; @Autowired private IntegrateQueueService integrateQueueService; @Autowired private VisualdevService visualdevService; @Autowired private VisualDevInfoService visualDevInfoService; @Autowired private IntegrateTaskService integrateTaskService; @Autowired private IntegrateNodeService integrateNodeService; @Autowired private VisualdevModelDataService visualdevModelDataService; @Autowired private TaskService taskService; @Autowired private TemplateService templateService; @Autowired private TemplateJsonService templateJsonService; @Autowired private OrganizeService organizeService; @Autowired private OrganizeAdministratorService organizeAdministratorService; @Autowired private ConfigValueUtil configValueUtil; @Autowired private TriggerApi triggerApi; //------------------------------------------事件------------------------------------------------------ @Async public void asyncList(List resultData, UserInfo userInfo) { if (!resultData.isEmpty()) { String url = configValueUtil.getApiDomain() + "/api/visualdev/Integrate/execute"; IntegrateHttpModel model = new IntegrateHttpModel(); model.setUserInfo(userInfo); model.setDataInfoVOList(resultData); HttpRequest request = HttpRequest.of(url).method(Method.POST).body(JsonUtil.getObjectToString(model)); request.header(Constants.AUTHORIZATION, userInfo.getToken()); request.execute().body(); } } public List asyncDelExecute(AsyncExecuteModel executeModel) { String modelId = executeModel.getModelId(); Integer trigger = executeModel.getTrigger(); List dataId = executeModel.getDataId(); DataModel dataModel = executeModel.getDataModel(); List> dataMap = executeModel.getDataMap(); TriggerDataFo fo = new TriggerDataFo(); fo.setModelId(modelId); fo.setTrigger(trigger); fo.setDataId(dataId); fo.setDataMap(dataMap); if (dataModel != null) { List listLog = dataModel.getListLog(); if (CollectionUtil.isNotEmpty(listLog)) { List updateFields = this.getUpdateFields(listLog); fo.setUpdateFields(updateFields); } } List resultData = triggerApi.getTriggerDataModel(fo); return resultData; } @Async public void asyncExecute(AsyncExecuteModel executeModel) { String modelId = executeModel.getModelId(); Integer trigger = executeModel.getTrigger(); List dataId = executeModel.getDataId(); UserInfo userInfo = executeModel.getUserInfo(); DataModel dataModel = executeModel.getDataModel(); List> dataMap = executeModel.getDataMap(); TriggerDataFo fo = new TriggerDataFo(); fo.setModelId(modelId); fo.setTrigger(trigger); fo.setDataId(dataId); fo.setDataMap(dataMap); if (dataModel != null) { List listLog = dataModel.getListLog(); if (CollectionUtil.isNotEmpty(listLog)) { List updateFields = this.getUpdateFields(listLog); fo.setUpdateFields(updateFields); } } List resultData = triggerApi.getTriggerDataModel(fo); if (!resultData.isEmpty()) { String url = configValueUtil.getApiDomain() + "/api/workflow/trigger/Execute"; TriggerModel model = new TriggerModel(); model.setUserInfo(userInfo); model.setDataList(resultData); HttpRequest request = HttpRequest.of(url).method(Method.POST).body(JsonUtil.getObjectToString(model)); request.header(Constants.AUTHORIZATION, userInfo.getToken()); request.execute().body(); } } private List getUpdateFields(List listLog) { List updateFields = new ArrayList<>(); if (CollectionUtil.isNotEmpty(listLog)) { for (VisualLogModel logModel : listLog) { String field = logModel.getField(); List> chidField = logModel.getChidField(); List> chidData = logModel.getChidData(); if (CollectionUtil.isNotEmpty(chidField) && CollectionUtil.isNotEmpty(chidData)) { // 子表 for (Map map : chidField) { String key = (String) map.get("prop"); for (Map child : chidData) { if (!ObjectUtil.equals(child.get(key), child.get("jnpf_old_" + key))) { updateFields.add(field + "-" + key); break; } } } } else { updateFields.add(field); } } } return updateFields; } public void integrates(List dataInfoVOList, UserInfo userInfo) { for (VisualdevModelDataInfoVO infoVO : dataInfoVOList) { String integrateId = infoVO.getIntegrateId(); List> dataList = JsonUtil.getJsonToListMap(infoVO.getData()); integrate(integrateId, dataList, userInfo); } } public List dataList(String modelId, Integer trigger, List dataId) { List resultData = new ArrayList<>(); List list = integrateList(modelId, trigger); for (IntegrateEntity entity : list) { //数据 IntegrateChildNodeList childNodeModel = JsonUtil.getJsonToBean(entity.getTemplateJson(), IntegrateChildNodeList.class); List> dataList = dataList(childNodeModel, new HashMap<>(16), dataId); if (dataList.size() > 0) { VisualdevModelDataInfoVO vo = new VisualdevModelDataInfoVO(); vo.setData(JsonUtil.getObjectToString(dataList)); vo.setIntegrateId(entity.getId()); resultData.add(vo); } } return resultData; } private List integrateList(String modelId, Integer trigger) { IntegratePagination pagination = new IntegratePagination(); pagination.setFormId(modelId); pagination.setType(1); pagination.setTrigger(trigger); pagination.setEnabledMark(1); List list = integrateService.getList(pagination, false); return list; } //------------------------------------------定时------------------------------------------------------ //重试 public void integrate(String taskId, String parentId, String taskNodeId) { IntegrateTaskEntity taskEntity = integrateTaskService.getInfo(taskId); if (taskEntity != null) { List> dataList = new ArrayList<>(); try { dataList.addAll(JsonUtil.getJsonToListMap(taskEntity.getData())); } catch (Exception e) { dataList.add(JsonUtil.stringToMap(taskEntity.getData())); } integrate(taskEntity.getIntegrateId(), dataList, UserProvider.getUser(), parentId, taskNodeId); } } //定时执行 public void integrate(IntegrateQueueEntity queueEntity, UserInfo userInfo) { queueEntity.setState(1); integrateQueueService.update(queueEntity.getId(), queueEntity); String integrateId = queueEntity.getIntegrateId(); List> dataList = new ArrayList<>(); IntegrateEntity entity = integrateService.getInfo(integrateId); if (entity != null) { IntegrateChildNode childNode = JsonUtil.getJsonToBean(entity.getTemplateJson(), IntegrateChildNode.class); IntegrateChildNode getDataChildNode = childNode.getChildNode(); IntegrateChildNodeList dataListNodeMode = JsonUtil.getJsonToBean(getDataChildNode, IntegrateChildNodeList.class); IntegrateProperties properties = dataListNodeMode.getProperties(); Integer formType = properties.getFormType(); //远端节点 if (Objects.equals(formType, 3)) { dataListNodeMode.getProperties().setTemplateJson(dataListNodeMode.getProperties().getInterfaceTemplateJson()); try { ActionResult result = interfaceTemplateJson(dataListNodeMode, new HashMap<>(), userInfo); if (result.getData() instanceof List) { dataList.addAll((List) result.getData()); } } catch (Exception e) { } } else { dataList.addAll(dataList(dataListNodeMode, new HashMap<>(16), new ArrayList<>())); } integrate(integrateId, dataList, userInfo); integrateQueueService.delete(queueEntity); } } //集成执行逻辑 private void integrate(String integrateId, List> dataList, UserInfo userInfo) { integrate(integrateId, dataList, userInfo, "0", "0"); } //集成执行逻辑 private void integrate(String integrateId, List> dataList, UserInfo userInfo, String parentId, String taskNodeId) { if (dataList.isEmpty()) { return; } IntegrateEntity entity = integrateService.getInfo(integrateId); if (entity != null) { //获取实例重试数据 IntegrateTaskEntity parentTask = integrateTaskService.getInfo(parentId); boolean isParentId = parentTask != null; //获取节点重试数据 IntegrateNodeEntity info = integrateNodeService.getInfo(taskNodeId); boolean isTaskNodeId = info != null; String retryNodeCode = isTaskNodeId ? info.getNodeCode() : ""; Date time = new Date(); //判断是节点重试还是实例重试 String json = isParentId ? entity.getTemplateJson() : entity.getTemplateJson(); IntegrateChildNode childNode = JsonUtil.getJsonToBean(json, IntegrateChildNode.class); IntegrateChildNode getDataChildNode = childNode.getChildNode(); IntegrateChildNodeList dataListNodeMode = JsonUtil.getJsonToBean(getDataChildNode, IntegrateChildNodeList.class); dataListNodeMode.setStartTime(time); List childNodeListAll = new ArrayList<>(); childList(childNode, childNodeListAll); IntegrateChildNodeList startNode = childNodeListAll.stream().filter(t -> "start".equals(t.getType())).findFirst().orElse(null); if (startNode != null) { List idAll = new ArrayList<>(); IntegrateTaskEntity taskEntity = new IntegrateTaskEntity(); List errNodeList = new ArrayList<>(); String msg = ""; Map errMsg = new HashMap<>(); try { for (int i = 0; i < dataList.size(); i++) { Map objectMap = dataList.get(i); errMsg.putAll(objectMap); String id = String.valueOf(objectMap.get(FlowFormConstant.ID)); List nodeList = new ArrayList<>(); taskEntity.setIntegrateId(entity.getId()); taskEntity.setType(entity.getType()); taskEntity.setTemplateJson(entity.getTemplateJson()); taskEntity.setDataId(id); taskEntity.setParentId(isParentId ? parentTask.getId() : parentId); taskEntity.setParentTime(isParentId ? parentTask.getExecutionTime() : null); taskEntity.setResultType(isParentId ? parentTask.getResultType() : 1); taskEntity.setExecutionTime(new Date()); taskEntity.setId(isTaskNodeId ? info.getTaskId() : RandomUtil.uuId()); taskEntity.setData(dataList.size() > 0 ? JsonUtil.getObjectToString(dataList) : JsonUtil.getObjectToString(objectMap)); taskEntity.setProcessId(taskEntity.getId()); idAll.add(taskEntity.getId()); if (i == 0 && !isParentId) { IntegrateTaskEntity taskEntitys = JsonUtil.getJsonToBean(taskEntity, IntegrateTaskEntity.class); integrateTaskService.saveOrUpdate(taskEntitys); } //节点 List nodeListAll = new ArrayList<>(childNodeListAll); for (int k = 0; k < nodeListAll.size(); k++) { IntegrateChildNodeList childNodeList = nodeListAll.get(k); childNodeList.setIntegrateType(taskEntity.getType()); IntegrateProperties childProperties = childNodeList.getProperties(); IntegrateNodeEntity nodeEntity = new IntegrateNodeEntity(); nodeEntity.setResultType(0); nodeEntity.setParentId(taskNodeId); nodeEntity.setNodeType(childNodeList.getType()); nodeEntity.setNodeNext(childNodeList.getNextId()); nodeEntity.setStartTime(time); nodeEntity.setEndTime(time); nodeEntity.setTaskId(taskEntity.getId()); nodeEntity.setNodeCode(childNodeList.getNodeId()); nodeEntity.setFormId(childProperties.getFormId()); nodeEntity.setNodeName(childProperties.getTitle()); nodeEntity.setNodePropertyJson(JsonUtil.getObjectToString(childNodeList)); nodeEntity.setSortCode(Long.parseLong(k + "")); nodeList.add(nodeEntity); } errNodeList = nodeList; IntegrateChildNodeModel childNodeModel = IntegrateChildNodeModel.builder().dataListAll(dataList).data(objectMap) .nodeList(nodeList).node(startNode.getNodeId()).entity(entity).retryNodeCode(retryNodeCode).userInfo(userInfo).num(0).build(); childNode(childNodeModel); boolean failSum = nodeList.stream().filter(t -> t.getResultType() == 0).count() > 0; taskEntity.setResultType(failSum ? 0 : 1); integrateTaskService.update(taskEntity.getId(), taskEntity); } } catch (Exception e) { msg = e.getMessage(); taskEntity.setResultType(0); } integrateTaskService.saveOrUpdate(taskEntity); idAll.remove(taskEntity.getId()); if (!idAll.isEmpty()) { QueryWrapper wrapper = new QueryWrapper(); wrapper.lambda().in(IntegrateTaskEntity::getId, idAll); integrateTaskService.remove(wrapper); QueryWrapper nodeWrapper = new QueryWrapper(); nodeWrapper.lambda().in(IntegrateNodeEntity::getTaskId, idAll); integrateNodeService.remove(nodeWrapper); } if (StringUtil.isNotEmpty(msg)) { end(entity, new HashMap<>(errMsg), errNodeList, "end", false, userInfo); } } } } private void childList(IntegrateChildNode childNodeAll, List listAll) { if (childNodeAll != null) { IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(childNodeAll, IntegrateChildNodeList.class); boolean isNext = childNodeAll.getChildNode() != null; String nextId = isNext ? childNodeAll.getChildNode().getNodeId() : "end"; childNodeList.setNextId(nextId); listAll.add(childNodeList); if (isNext) { childList(childNodeAll.getChildNode(), listAll); } if ("end".equals(nextId)) { IntegrateChildNodeList endChildNodeList = listAll.stream().filter(t -> "start".equals(t.getType())).findFirst().orElse(null); IntegrateChildNodeList endNode = JsonUtil.getJsonToBean(endChildNodeList, IntegrateChildNodeList.class); endNode.setNodeId(nextId); endNode.setType(nextId); endNode.setNextId(""); endNode.getProperties().setTitle("结束"); listAll.add(endNode); } } } private void childNode(IntegrateChildNodeModel childNodeModel) throws WorkFlowException { Map data = childNodeModel.getData(); List> dataList = childNodeModel.getDataListAll(); List nodeList = childNodeModel.getNodeList(); String node = childNodeModel.getNode(); IntegrateEntity entity = childNodeModel.getEntity(); String retryNodeCode = childNodeModel.getRetryNodeCode(); UserInfo userInfo = childNodeModel.getUserInfo(); IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { String nodeType = nodeEntity.getNodeType(); String nodeCode = nodeEntity.getNodeCode(); String[] nextCodeAll = nodeEntity.getNodeNext().split(","); switch (nodeType) { case "addData": addData(new HashMap<>(data), nodeList, nodeCode, retryNodeCode); break; case "updateData": updateData(new HashMap<>(data), nodeList, nodeCode, retryNodeCode); break; case "deleteData": deleteData(new HashMap<>(data), new ArrayList<>(dataList), nodeList, nodeCode, retryNodeCode); break; case "message": message(new HashMap<>(data), nodeList, nodeCode, userInfo); break; case "dataInterface": dataInterface(new HashMap<>(data), nodeList, nodeCode, userInfo, retryNodeCode); break; case "getData": getData(entity, nodeList, nodeCode); break; case "launchFlow": launchFlow(new HashMap<>(data), nodeList, nodeCode, retryNodeCode); break; case "end": end(entity, new HashMap<>(data), nodeList, nodeCode, true, userInfo); break; case "start": start(entity, new HashMap<>(data), nodeList, nodeCode, true, userInfo, childNodeModel.getNum()); break; default: break; } for (String nextCode : nextCodeAll) { childNodeModel.setNode(nextCode); childNode(childNodeModel); } } } //-----------------------------------事件----------------------------------------------- private void getData(IntegrateEntity entity, List nodeList, String node) { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { nodeEntity.setResultType(1); List list = nodeList(nodeEntity); if (list.size() == 0) { integrateNodeService.create(nodeEntity); } } } private void start(IntegrateEntity entity, Map data, List nodeList, String node, boolean isAdd, UserInfo userInfo, int num) { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { List list = nodeList(nodeEntity); String templeId = "PZXTJC002"; if (list.size() == 0) { nodeEntity.setStartTime(nodeEntity.getStartTime()); boolean failSum = num == 0; IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeEntity.getNodePropertyJson(), IntegrateChildNodeList.class); IntegrateProperties properties = childNodeList.getProperties(); IntegrateMsgModel msgConfig = properties.getStartMsgConfig(); Integer on = msgConfig.getOn(); boolean acquiesce = on == 3; String msgId = on == 0 ? "" : acquiesce ? templeId : msgConfig.getMsgId(); List msgUserType = properties.getMsgUserType(); List msgUserIds = properties.getMsgUserIds(); Set userIdList = new HashSet<>(); for (String type : msgUserType) { switch (type) { case "1": userIdList.add(entity.getCreatorUserId()); break; case "2": List adminList = userService.getAdminList().stream().map(UserEntity::getId).collect(Collectors.toList()); userIdList.addAll(adminList); break; case "3": List userList = userService.getUserIdList(msgUserIds); userIdList.addAll(userList); break; default: break; } } Map dataMap = new HashMap() {{ put("@Title", entity.getFullName()); put("@CreatorUserName", ""); }}; List templateJson = msgConfig.getTemplateJson(); try { if (StringUtil.isNotEmpty(msgId) && userIdList.size() > 0 && failSum) { Map parameterMap = acquiesce ? dataMap : templateJson(templateJson, data, userInfo); message(msgId, new ArrayList<>(userIdList), parameterMap, userInfo); } nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); } nodeEntity.setEndTime(nodeEntity.getEndTime()); if (isAdd) { integrateNodeService.create(nodeEntity); } } } } private void end(IntegrateEntity entity, Map data, List nodeList, String node, boolean isAdd, UserInfo userInfo) { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { List list = nodeList(nodeEntity); if (list.size() == 0) { String templeId = "PZXTJC001"; nodeEntity.setStartTime(new Date()); boolean failSum = !isAdd; IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeEntity.getNodePropertyJson(), IntegrateChildNodeList.class); IntegrateProperties properties = childNodeList.getProperties(); IntegrateMsgModel msgConfig = properties.getFailMsgConfig(); Integer on = msgConfig.getOn(); boolean acquiesce = on == 3; String msgId = on == 0 ? "" : acquiesce ? templeId : msgConfig.getMsgId(); List msgUserType = properties.getMsgUserType(); List msgUserIds = properties.getMsgUserIds(); Set userIdList = new HashSet<>(); for (String type : msgUserType) { switch (type) { case "1": userIdList.add(entity.getCreatorUserId()); break; case "2": List adminList = userService.getAdminList().stream().map(UserEntity::getId).collect(Collectors.toList()); userIdList.addAll(adminList); break; case "3": List userList = userService.getUserIdList(msgUserIds); userIdList.addAll(userList); break; default: break; } } Map dataMap = new HashMap() {{ put("@Title", entity.getFullName()); put("@CreatorUserName", ""); }}; List templateJson = msgConfig.getTemplateJson(); try { if (StringUtil.isNotEmpty(msgId) && userIdList.size() > 0 && failSum) { Map parameterMap = acquiesce ? dataMap : templateJson(templateJson, data, userInfo); message(msgId, new ArrayList<>(userIdList), parameterMap, userInfo); } nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); } nodeEntity.setEndTime(new Date()); if (isAdd) { integrateNodeService.create(nodeEntity); } } } } private void addData(Map data, List nodeList, String node, String retryNodeCode) throws WorkFlowException { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { List list = nodeList(nodeEntity); boolean isRetry = nodeEntity.getNodeCode().equals(retryNodeCode); if (list.size() == 0 || isRetry) { nodeEntity.setStartTime(new Date()); IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeEntity.getNodePropertyJson(), IntegrateChildNodeList.class); IntegrateProperties properties = childNodeList.getProperties(); boolean isAdd = Objects.equals(childNodeList.getIntegrateType(), 1); if (!isAdd) { List> dataList = dataList(childNodeList, data, new ArrayList<>()); Integer addRule = properties.getAddRule(); isAdd = (dataList.size() > 0 && addRule == 1) || dataList.size() == 0; } String msg = ""; try { if (isAdd) { String formId = properties.getFormId(); String flowId = properties.getFlowId(); if (ObjectUtil.isNotEmpty(flowId)) { TemplateEntity template = templateService.getInfo(flowId); flowId = template.getFlowId(); } VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(formId); List transferList = properties.getTransferList(); Map saveData = formData(data, transferList); saveData.put(FlowFormConstant.FLOWID, flowId); visualdevModelDataService.visualCreate(VisualParamModel.builder().visualdevEntity(visualdevEntity).data(saveData).build()); } nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); msg = e.getMessage(); } nodeEntity.setEndTime(new Date()); if (isRetry) { integrateNodeService.update(nodeEntity.getTaskId(), nodeEntity.getNodeCode()); } integrateNodeService.create(nodeEntity); if (StringUtil.isNotEmpty(msg)) { throw new WorkFlowException(msg); } } } } private void updateData(Map data, List nodeList, String node, String retryNodeCode) throws WorkFlowException { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { List list = nodeList(nodeEntity); boolean isRetry = nodeEntity.getNodeCode().equals(retryNodeCode); if (list.size() == 0 || isRetry) { nodeEntity.setStartTime(new Date()); IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeEntity.getNodePropertyJson(), IntegrateChildNodeList.class); IntegrateProperties properties = childNodeList.getProperties(); String formId = properties.getFormId(); VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(formId); List transferList = properties.getTransferList(); List> dataList = dataList(childNodeList, data, new ArrayList<>()); Integer unFoundRule = properties.getUnFoundRule(); String msg = ""; boolean isAdd = dataList.size() == 0 && unFoundRule == 1; try { String flowId = properties.getFlowId(); if (ObjectUtil.isNotEmpty(flowId)) { TemplateEntity template = templateService.getInfo(flowId); flowId = template.getFlowId(); } if (isAdd) { Map saveData = formData(data, transferList); saveData.put(FlowFormConstant.FLOWID, flowId); dataList.add(saveData); } for (Map objectMap : dataList) { if (isAdd) { visualdevModelDataService.visualCreate(VisualParamModel.builder().visualdevEntity(visualdevEntity).data(objectMap).build()); } else { String id = String.valueOf(objectMap.get(FlowFormConstant.ID)); Map saveData = formData(data, objectMap, transferList); Map dataObject = new HashMap<>(saveData); visualdevModelDataService.visualUpdate(VisualParamModel.builder().visualdevEntity(visualdevEntity).data(dataObject).id(id).build()); } } nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); msg = e.getMessage(); } nodeEntity.setEndTime(new Date()); if (isRetry) { integrateNodeService.update(nodeEntity.getTaskId(), nodeEntity.getNodeCode()); } integrateNodeService.create(nodeEntity); if (StringUtil.isNotEmpty(msg)) { throw new WorkFlowException(msg); } } } } private void deleteData(Map data, List> dataListAll, List nodeList, String node, String retryNodeCode) throws WorkFlowException { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { List list = nodeList(nodeEntity); boolean isRetry = nodeEntity.getNodeCode().equals(retryNodeCode); if (list.size() == 0 || isRetry) { nodeEntity.setStartTime(new Date()); String nodeJson = nodeEntity.getNodePropertyJson(); IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeJson, IntegrateChildNodeList.class); IntegrateProperties properties = childNodeList.getProperties(); String formId = properties.getFormId(); String menuId = properties.getId(); String flowId = properties.getFlowId(); //条件的数据 Integer deleteRule = Objects.equals(childNodeList.getIntegrateType(), 1) ? 1 : properties.getDeleteRule(); IntegrateChildNodeList dataChildNode = new IntegrateChildNodeList(); dataChildNode.setType(childNodeList.getType()); IntegrateProperties dataChildProperties = dataChildNode.getProperties(); dataChildProperties.setFormId(formId); dataChildProperties.setId(menuId); dataChildProperties.setFlowId(flowId); boolean delete = Objects.equals(deleteRule, 1); List> dataList = dataList(delete ? childNodeList : dataChildNode, data, new ArrayList<>()); List idList = dataList.stream().filter(t -> ObjectUtil.isNotEmpty(t.get(FlowFormConstant.ID))).map(t -> String.valueOf(t.get(FlowFormConstant.ID))).collect(Collectors.toList()); List deleteList = new ArrayList<>(); if (delete) { deleteList.addAll(idList); } else { List addList = new ArrayList<>(); for (Map objectMap : dataListAll) { List idAll = dataList(JsonUtil.getJsonToBean(nodeJson, IntegrateChildNodeList.class), objectMap, new ArrayList<>()).stream().filter(t -> ObjectUtil.isNotEmpty(t.get(FlowFormConstant.ID))).map(t -> String.valueOf(t.get(FlowFormConstant.ID))).collect(Collectors.toList()); addList.addAll(idAll); } idList.removeAll(addList); deleteList.addAll(idList); } String msg = ""; try { if (deleteList.size() > 0) { List> deleteDataList = dataList.stream().filter(t -> deleteList.contains(String.valueOf(t.get(FlowFormConstant.ID)))).collect(Collectors.toList()); VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(formId); visualdevModelDataService.visualDelete(visualdevEntity, deleteDataList); } nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); msg = e.getMessage(); } nodeEntity.setEndTime(new Date()); if (isRetry) { integrateNodeService.update(nodeEntity.getTaskId(), nodeEntity.getNodeCode()); } integrateNodeService.create(nodeEntity); if (StringUtil.isNotEmpty(msg)) { throw new WorkFlowException(msg); } } } } private void message(Map data, List nodeList, String node, UserInfo userInfo) throws WorkFlowException { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { String msg = ""; List list = nodeList(nodeEntity); if (list.size() == 0) { nodeEntity.setStartTime(new Date()); IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeEntity.getNodePropertyJson(), IntegrateChildNodeList.class); IntegrateProperties properties = childNodeList.getProperties(); List userIdList = userService.getUserIdList(properties.getMsgUserIds()); String msgId = properties.getMsgId(); List templateJson = properties.getTemplateJson(); try { Map parameterMap = templateJson(templateJson, data, userInfo); if (userIdList.size() > 0) { message(msgId, userIdList, parameterMap, userInfo); } nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); msg = e.getMessage(); } nodeEntity.setEndTime(new Date()); integrateNodeService.create(nodeEntity); if (StringUtil.isNotEmpty(msg)) { throw new WorkFlowException(msg); } } } } private void dataInterface(Map data, List nodeList, String node, UserInfo userInfo, String retryNodeCode) throws WorkFlowException { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { String msg = ""; List list = nodeList(nodeEntity); boolean isRetry = nodeEntity.getNodeCode().equals(retryNodeCode); if (list.size() == 0 || isRetry) { nodeEntity.setStartTime(new Date()); try { IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeEntity.getNodePropertyJson(), IntegrateChildNodeList.class); interfaceTemplateJson(childNodeList, data, userInfo); nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); msg = e.getMessage(); } nodeEntity.setEndTime(new Date()); if (isRetry) { integrateNodeService.update(nodeEntity.getTaskId(), nodeEntity.getNodeCode()); } integrateNodeService.create(nodeEntity); if (StringUtil.isNotEmpty(msg)) { throw new WorkFlowException(msg); } } } } private Map formData(Map formData, List transferList) throws WorkFlowException { return formData(formData, new HashMap<>(), transferList); } private Map formData(Map formData, Map resultData, List transferList) throws WorkFlowException { Map result = new HashMap<>(resultData); Map oldData = new HashMap<>(formData); Set msg = new HashSet<>(); for (TransferModel assignMode : transferList) { //子表处理规则 Boolean required = assignMode.getRequired(); String targetFieldLabel = assignMode.getTargetFieldLabel(); Integer sourceType = assignMode.getSourceType(); boolean isData = ObjectUtil.equals(sourceType, TemplateEnum.Custom.getCode()); String parentField = assignMode.getSourceValue(); String[] parentFieldList = isData ? new String[]{parentField} : parentField.split("-"); String childField = assignMode.getTargetField(); String[] childFieldList = childField.split("-"); Object childData = isData ? parentField : DataInterfaceVarConst.FORM_ID.equals(parentField) ? formData.get(FlowFormConstant.ID) : formData.get(parentField); if (childFieldList.length > 1) { List> childMapAll = new ArrayList<>(); if (result.get(childFieldList[0]) instanceof List) { List> childList = (List>) result.get(childFieldList[0]); for (Map objectMap : childList) { Map childMap = new HashMap<>(objectMap); childMapAll.add(childMap); } } if (parentFieldList.length > 1) { if (oldData.get(parentFieldList[0]) instanceof List) { List> parentList = (List>) oldData.get(parentFieldList[0]); int num = parentList.size() - childMapAll.size(); for (int i = 0; i < num; i++) { childMapAll.add(new HashMap<>()); } for (int i = 0; i < parentList.size(); i++) { Map parentMap = parentList.get(i); Map childMap = childMapAll.get(i); if (required && ObjectUtil.isEmpty(parentMap.get(parentFieldList[1]))) { msg.add(targetFieldLabel); } childMap.put(childFieldList[1], parentMap.get(parentFieldList[1])); } } } else { if (1 > childMapAll.size()) { childMapAll.add(new HashMap<>()); } Map childMap = childMapAll.get(0); if (required && ObjectUtil.isEmpty(childData)) { msg.add(targetFieldLabel); } childMap.put(childFieldList[1], childData); } result.put(childFieldList[0], childMapAll); } else { if (parentFieldList.length > 1) { if (oldData.get(parentFieldList[0]) instanceof List) { List> parentList = (List>) oldData.get(parentFieldList[0]); for (int i = 0; i < parentList.size(); i++) { Map parentMap = parentList.get(i); if (i == 0) { childData = parentMap.get(parentFieldList[1]); } } } } if (required && ObjectUtil.isEmpty(childData)) { msg.add(targetFieldLabel); } result.put(childField, childData); } } errRequiredMsg(msg); return result; } private List> dataList(IntegrateChildNodeList childNodeList, Map data, List dataId) { boolean idDelete = Objects.equals(childNodeList.getType(), "deleteData"); IntegrateProperties properties = childNodeList.getProperties(); String formId = properties.getFormId(); List ruleList = properties.getRuleList(); String ruleMatchLogic = properties.getRuleMatchLogic(); String menuId = properties.getId(); String flowId = properties.getFlowId(); boolean isFlow = StringUtil.isNotEmpty(flowId); for (SuperQueryJsonModel superQueryJsonModel : ruleList) { List groups = superQueryJsonModel.getGroups(); for (FieLdsModel fieLdsModel : groups) { boolean valueType = "1".equals(fieLdsModel.getFieldValueType()); String fieldValue = data.get(fieLdsModel.getFieldValue()) != null ? String.valueOf(data.get(fieLdsModel.getFieldValue())) : null; if (DataInterfaceVarConst.FORM_ID.equals(fieLdsModel.getFieldValue())) { fieldValue = String.valueOf(data.get(FlowFormConstant.ID)); } fieLdsModel.setFieldValue(valueType ? fieldValue : fieLdsModel.getFieldValue()); } } SuperJsonModel superJsonModel = new SuperJsonModel(); superJsonModel.setConditionList(ruleList); superJsonModel.setMatchLogic(StringUtil.isNotEmpty(ruleMatchLogic) ? ruleMatchLogic : superJsonModel.getMatchLogic()); PaginationModel paginationModel = new PaginationModel(); paginationModel.setPageSize(10000L); paginationModel.setMenuId(menuId); paginationModel.setSuperQueryJson(ruleList.size() > 0 ? JsonUtil.getObjectToString(superJsonModel) : ""); VisualdevEntity visualdevEntity = visualdevService.getReleaseInfo(formId); VisualDevJsonModel visualJsonModel = OnlinePublicUtils.getVisualJsonModel(visualdevEntity); List idAll = new ArrayList<>(); List idList = new ArrayList<>(); try { if (ruleList.size() > 0) { visualJsonModel.setSuperQuery(superJsonModel); } if (isFlow) { List flowVersionIds = templateJsonService.getListByTemplateIds(ImmutableList.of(flowId)).stream().map(TemplateJsonEntity::getId).collect(Collectors.toList()); visualJsonModel.setFlowVersionIds(flowVersionIds); visualJsonModel.setEnableFlow(flowVersionIds.size() > 0); } List> dataList = visualDevListService.getListWithTableList(visualJsonModel, paginationModel, UserProvider.getUser()); idList.addAll(dataList.stream().map(t -> String.valueOf(t.get(FlowFormConstant.ID))).collect(Collectors.toList())); } catch (Exception e) { } List intersection = idList.stream().filter(item -> dataId.contains(item)).collect(Collectors.toList()); if (dataId.size() > 0) { idAll.addAll(intersection); } else { idAll.addAll(idList); } List> dataList = new ArrayList<>(); for (String id : idAll) { VisualdevModelDataInfoVO infoVO = visualDevInfoService.getEditDataInfo(id, visualdevEntity, OnlineInfoModel.builder().build()); if (StringUtil.isNotEmpty(infoVO.getData())) { Map map = JsonUtil.stringToMap(infoVO.getData()); map.put(FlowFormConstant.ID, infoVO.getId()); boolean isAdd = true; if (isFlow && !idDelete) { TaskEntity infoSubmit = taskService.getInfoSubmit(String.valueOf(map.get(FlowFormConstant.FLOWTASKID)), TaskEntity::getEndTime); isAdd = infoSubmit != null && infoSubmit.getEndTime() != null; } if (isAdd) { dataList.add(map); } } } return dataList; } private void message(String msgId, List userIdList, Map parameterMap, UserInfo userInfo) { SentMessageForm sentMessageForm = new SentMessageForm(); sentMessageForm.setUserInfo(userInfo); sentMessageForm.setTemplateId(msgId); sentMessageForm.setToUserIds(userIdList); sentMessageForm.setParameterMap(parameterMap); sentMessageForm.setType(3); sentMessageForm.setContentMsg(new HashMap<>()); sentMessageForm.setId(msgId); sentMessageUtil.sendDelegateMsg(sentMessageForm); } private List nodeList(IntegrateNodeEntity nodeEntity) { List list = integrateNodeService.getList(new ArrayList() {{ add(nodeEntity.getTaskId()); }}, nodeEntity.getNodeCode(), 1); IntegrateNodeEntity integrateNode = list.stream().filter(t -> t.getNodeCode().equals(nodeEntity.getNodeCode()) && t.getResultType() == 1).findFirst().orElse(null); nodeEntity.setResultType(integrateNode != null ? integrateNode.getResultType() : nodeEntity.getResultType()); return list; } private Map templateJson(List templateJson, Map data, UserInfo userInfo) throws WorkFlowException { Map parameterMap = new HashMap<>(); Set msg = new HashSet<>(); for (IntegrateTemplateModel templateJsonModel : templateJson) { List paramJson = templateJsonModel.getParamJson(); for (IntegrateParamModel integrateParamModel : paramJson) { Boolean required = integrateParamModel.getRequired(); String fieldId = integrateParamModel.getField(); String relationField = integrateParamModel.getRelationField(); String[] model = StringUtil.isNotEmpty(relationField) ? relationField.split("-") : new String[]{}; String dataValue = data.get(relationField) != null ? String.valueOf(data.get(relationField)) : ""; if (DataInterfaceVarConst.FORM_ID.equals(relationField)) { dataValue = data.get(FlowFormConstant.ID) != null ? String.valueOf(data.get(FlowFormConstant.ID)) : ""; } if (model.length > 1) { Object dataList = data.get(model[0]); if (dataList instanceof List) { List> listAll = (List>) dataList; List dataListAll = new ArrayList<>(); for (Map objectMap : listAll) { dataListAll.add(objectMap.get(model[1])); } if (required && ObjectUtil.isEmpty(dataListAll)) { msg.add(fieldId); } dataValue = String.valueOf(dataListAll); } } if (required && ObjectUtil.isEmpty(dataValue)) { msg.add(fieldId); } parameterMap.put(integrateParamModel.getMsgTemplateId() + fieldId, dataValue); } Map paramMap = ImmutableMap.of("@CreatorUserName", userInfo.getUserName(), "@SendTime", DateUtil.getNow().substring(11)); for (String key : paramMap.keySet()) { parameterMap.put(templateJsonModel.getId() + key, paramMap.get(key)); } } errRequiredMsg(msg); return parameterMap; } private void errMsg(IntegrateNodeEntity nodeEntity, Exception e) { ActionResult result = new ActionResult(); result.setCode(400); result.setMsg(e.getMessage()); if (nodeEntity != null) { nodeEntity.setErrorMsg(JsonUtil.getObjectToString(result)); } } private ActionResult interfaceTemplateJson(IntegrateChildNodeList childNodeList, Map data, UserInfo userInfo) throws WorkFlowException { IntegrateProperties properties = childNodeList.getProperties(); String interId = properties.getFormId(); Map parameterMap = new HashMap<>(); List templateJson = properties.getTemplateJson(); Set msg = new HashSet<>(); for (IntegrateTemplateModel templateJsonModel : templateJson) { String fieldId = templateJsonModel.getField(); Boolean required = templateJsonModel.getRequired(); String relationField = templateJsonModel.getRelationField(); String dataValue = data.get(relationField) != null ? String.valueOf(data.get(relationField)) : null; if (AuthorizeConditionEnum.FORMID.getCondition().equals(relationField)) { dataValue = String.valueOf(data.get(FlowFormConstant.ID)); } else if (AuthorizeConditionEnum.USER.getCondition().equals(relationField)) { dataValue = userInfo.getUserId(); } else if (AuthorizeConditionEnum.USERANDUNDER.getCondition().equals(relationField)) { List subOrganizeIds = new ArrayList<>(); subOrganizeIds.addAll(userService.getListByManagerId(userInfo.getUserId(), null).stream().map(UserEntity::getId).collect(Collectors.toList())); subOrganizeIds.add(userInfo.getUserId()); dataValue = subOrganizeIds.stream().collect(Collectors.joining(",")); } else if (AuthorizeConditionEnum.ORGANIZE.getCondition().equals(relationField)) { String orgId = userInfo.getOrganizeId(); if (StringUtil.isNotEmpty(userInfo.getDepartmentId())) { orgId = userInfo.getDepartmentId(); } dataValue = orgId; } else if (AuthorizeConditionEnum.ORGANDSUB.getCondition().equals(relationField)) { String orgId = userInfo.getOrganizeId(); if (StringUtil.isNotEmpty(userInfo.getDepartmentId())) { orgId = userInfo.getDepartmentId(); } List underOrganizations = organizeService.getUnderOrganizations(orgId, false); underOrganizations.add(orgId); dataValue = underOrganizations.stream().collect(Collectors.joining(",")); } String dataFieldValue = relationField; String dataJson = !ObjectUtil.equals(templateJsonModel.getSourceType(), TemplateEnum.Custom.getCode()) ? dataValue : dataFieldValue; String[] model = StringUtil.isNotEmpty(relationField) ? relationField.split("-") : new String[]{}; if (model.length > 1) { Object dataList = data.get(model[0]); if (dataList instanceof List) { List> listAll = (List>) dataList; List dataListAll = new ArrayList<>(); for (Map objectMap : listAll) { dataListAll.add(objectMap.get(model[1])); } if (required && ObjectUtil.isEmpty(dataListAll)) { msg.add(fieldId); } dataJson = String.valueOf(dataListAll); } } if (required && ObjectUtil.isEmpty(dataJson)) { msg.add(fieldId); } parameterMap.put(fieldId, dataJson); } errRequiredMsg(msg); ActionResult dataInterfaceInfo = dataInterfaceService.infoToId(interId, userInfo.getTenantId(), parameterMap, userInfo.getToken(), null, null, null, null); if (dataInterfaceInfo.getCode() != 200) { throw new WorkFlowException(dataInterfaceInfo.getMsg()); } return dataInterfaceInfo; } private void errRequiredMsg(Set msg) throws WorkFlowException { if (msg.size() > 0) { throw new WorkFlowException(new ArrayList(msg).get(0) + MsgCode.VS015.get()); } } /** * 发起审批 * * @param data 数据 * @param nodeList 节点数组 * @param node 当前节点 * @param retryNodeCode 日志失败重试 * @throws WorkFlowException 异常 */ private void launchFlow(Map data, List nodeList, String node, String retryNodeCode) throws WorkFlowException { IntegrateNodeEntity nodeEntity = nodeList.stream().filter(t -> t.getNodeCode().equals(node)).findFirst().orElse(null); if (nodeEntity != null) { List list = nodeList(nodeEntity); boolean isRetry = nodeEntity.getNodeCode().equals(retryNodeCode); if (list.size() == 0 || isRetry) { nodeEntity.setStartTime(new Date()); IntegrateChildNodeList childNodeList = JsonUtil.getJsonToBean(nodeEntity.getNodePropertyJson(), IntegrateChildNodeList.class); IntegrateProperties properties = childNodeList.getProperties(); String msg = ""; try { String flowId = properties.getFlowId(); FlowFormModel formIdAndFlowId = templateService.getFormIdAndFlowId(properties.getInitiator(), flowId); List userList = formIdAndFlowId.getUserId(); List userName = userService.getUserName(userList, true); if(userName.isEmpty()){ throw new WorkFlowException(MsgCode.VS025.get()); } for (UserEntity entity : userName) { UserInfo userInfo = new UserInfo(); userInfo.setUserId(entity.getId()); userInfo.setUserName(entity.getRealName()); List transferList = properties.getTransferList(); Map saveData = formData(data, transferList); FlowModel flowModel = new FlowModel(); flowModel.setUserInfo(userInfo); flowModel.setFlowId(flowId); flowModel.setStatus(TaskStatusEnum.RUNNING.getCode()); flowModel.setFormData(saveData); taskService.saveOrSubmit(flowModel); } nodeEntity.setResultType(1); } catch (Exception e) { errMsg(nodeEntity, e); msg = e.getMessage(); } nodeEntity.setEndTime(new Date()); if (isRetry) { integrateNodeService.update(nodeEntity.getTaskId(), nodeEntity.getNodeCode()); } integrateNodeService.create(nodeEntity); if (StringUtil.isNotEmpty(msg)) { throw new WorkFlowException(msg); } } } } //------------------------------------------webhook触发------------------------------------------------------ public void integrate(String id, String tenantId, Map body) throws WorkFlowException { IntegrateEntity entity = integrateService.getInfo(id); if (entity == null) { throw new WorkFlowException(MsgCode.VS016.get()); } if (Objects.equals(entity.getEnabledMark(), 0)) { throw new WorkFlowException(MsgCode.VS017.get()); } IntegrateChildNode childNode = JsonUtil.getJsonToBean(entity.getTemplateJson(), IntegrateChildNode.class); IntegrateProperties properties = childNode.getProperties(); List formFieldList = properties.getFormFieldList(); List> dataList = new ArrayList<>(); Map map = new HashMap<>(); for (FieLdsModel fieLdsModel : formFieldList) { map.put(fieLdsModel.getId(), body.get(fieLdsModel.getId())); } dataList.add(map); //登录一个临时用户 String token = AuthUtil.loginTempUser(entity.getCreatorUserId(), tenantId); UserInfo userInfo = UserProvider.getUser(token); UserProvider.setLocalLoginUser(userInfo); integrate(entity.getId(), dataList, userInfo); } }