From c7d7f9772bf41d667bb5e820b81062c8dcb3a3a5 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Tue, 22 Jul 2025 18:52:04 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E6=85=A2=E6=8E=A5=E5=8F=A3=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1471132643852288]工单详情页慢接口优化 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1471132643852288 --- .../processtask/ProcessTaskAuditListApi.java | 162 +++++++++++++++--- .../handler/FormAuditHandler.java | 19 +- .../dao/mapper/SelectContentByHashMapper.java | 3 + .../dao/mapper/SelectContentByHashMapper.xml | 14 +- .../process/ProcessStepHandlerMapper.xml | 2 +- .../ProcessTaskStaticDataMapper.java | 24 +++ .../ProcessTaskStaticDataMapper.xml | 35 ++++ 7 files changed, 225 insertions(+), 34 deletions(-) create mode 100644 src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.java create mode 100644 src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.xml diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskAuditListApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskAuditListApi.java index a37b8616d..6f2a45763 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskAuditListApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskAuditListApi.java @@ -12,12 +12,10 @@ import neatlogic.framework.process.audithandler.core.IProcessTaskStepAuditDetail import neatlogic.framework.process.audithandler.core.ProcessTaskAuditDetailTypeFactory; import neatlogic.framework.process.audithandler.core.ProcessTaskStepAuditDetailHandlerFactory; import neatlogic.framework.process.auth.PROCESS_BASE; +import neatlogic.framework.process.dto.*; import neatlogic.framework.process.operationauth.core.IOperationType; import neatlogic.framework.process.constvalue.ProcessTaskOperationType; import neatlogic.framework.process.constvalue.ProcessTaskStepOperationType; -import neatlogic.framework.process.dto.ProcessTaskStepAuditDetailVo; -import neatlogic.framework.process.dto.ProcessTaskStepAuditVo; -import neatlogic.framework.process.dto.ProcessTaskStepVo; import neatlogic.framework.process.operationauth.core.ProcessAuthManager; import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; @@ -65,9 +63,14 @@ public class ProcessTaskAuditListApi extends PrivateApiComponentBase { return null; } + @Override + public boolean disableReturnCircularReferenceDetect() { + return true; + } + @Input({ @Param(name = "processTaskId", type = ApiParamType.LONG, isRequired = true, desc = "工单id"), - @Param(name = "processTaskStepIdList", type = ApiParamType.JSONARRAY, desc = "工单步骤id列表") + @Param(name = "processTaskStepIdList", type = ApiParamType.JSONARRAY, desc = "工单步骤id列表"), }) @Output({ @Param(name = "Return", explode = ProcessTaskStepAuditVo[].class, desc = "工单活动列表"), @@ -101,6 +104,60 @@ public class ProcessTaskAuditListApi extends PrivateApiComponentBase { if (!operateMap.computeIfAbsent(processTaskId, k -> new HashSet<>()).contains(ProcessTaskOperationType.PROCESSTASK_VIEW)) { return resultList; } + Map hash2ConfigMap = new HashMap<>(); + List configHashList = processTaskStepList.stream().map(ProcessTaskStepVo::getConfigHash).filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(configHashList)) { + List configList = selectContentByHashMapper.getProcessTaskStepConfigListByHashList(configHashList); + for (ProcessTaskStepConfigVo processTaskStepConfigVo : configList) { + hash2ConfigMap.put(processTaskStepConfigVo.getHash(), processTaskStepConfigVo.getConfig()); + } + } + for (ProcessTaskStepVo processTaskStepVo : processTaskStepList) { + String stepConfig = hash2ConfigMap.get(processTaskStepVo.getConfigHash()); + if (StringUtils.isNotBlank(stepConfig)) { + JSONObject configObj = JSONObject.parseObject(stepConfig); + String formSceneUuid = configObj.getString("formSceneUuid"); + processTaskStepVo.setFormSceneUuid(formSceneUuid != null ? formSceneUuid : StringUtils.EMPTY); + } + } + Set contentHashSet = new HashSet<>(); + Set userUuidSet = new HashSet<>(); + for (ProcessTaskStepAuditVo processTaskStepAudit : processTaskStepAuditList) { + if (StringUtils.isNotBlank(processTaskStepAudit.getDescriptionHash())) { + contentHashSet.add(processTaskStepAudit.getDescriptionHash()); + } + if (!Objects.equals(processTaskStepAudit.getUserUuid(), SystemUser.SYSTEM.getUserUuid())) { + userUuidSet.add(processTaskStepAudit.getUserUuid()); + } + if (!Objects.equals(processTaskStepAudit.getOriginalUser(), SystemUser.SYSTEM.getUserUuid())) { + userUuidSet.add(processTaskStepAudit.getOriginalUser()); + } + List processTaskStepAuditDetailList = processTaskStepAudit.getAuditDetailList(); + for (ProcessTaskStepAuditDetailVo processTaskStepAuditDetailVo : processTaskStepAuditDetailList) { + if (ProcessTaskAuditDetailTypeFactory.getNeedCompression(processTaskStepAuditDetailVo.getType())) { + String oldContent = processTaskStepAuditDetailVo.getOldContent(); + if (StringUtils.isNotBlank(oldContent)) { + contentHashSet.add(oldContent); + } + String newContent = processTaskStepAuditDetailVo.getNewContent(); + if (StringUtils.isNotBlank(newContent)) { + contentHashSet.add(newContent); + } + } + } + } + Map userMap = new HashMap<>(); + Map hashToContentMap = new HashMap<>(); + List userUuidList = userUuidSet.stream().filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(userUuidList)) { + List userList = userMapper.getUserByUserUuidList(userUuidList); + userMap = userList.stream().collect(Collectors.toMap(UserVo::getUuid, e -> e)); + } + List contentHashList = contentHashSet.stream().filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(contentHashList)) { + List processTaskContentList = selectContentByHashMapper.getProcessTaskContentListByHashList(new ArrayList<>(contentHashSet)); + hashToContentMap = processTaskContentList.stream().collect(Collectors.toMap(ProcessTaskContentVo::getHash, ProcessTaskContentVo::getContent)); + } for (ProcessTaskStepAuditVo processTaskStepAudit : processTaskStepAuditList) { if (processTaskStepAudit.getProcessTaskStepId() != null) { @@ -113,26 +170,24 @@ public class ProcessTaskAuditListApi extends PrivateApiComponentBase { processTaskStepAudit.setFormSceneUuid(processTaskStepVo.getFormSceneUuid()); } } - - if(StringUtils.isNotBlank(processTaskStepAudit.getDescriptionHash())){ - String description = selectContentByHashMapper.getProcessTaskContentStringByHash(processTaskStepAudit.getDescriptionHash()); + if (StringUtils.isNotBlank(processTaskStepAudit.getDescriptionHash())) { + String description = hashToContentMap.get(processTaskStepAudit.getDescriptionHash()); processTaskStepAudit.setDescription(description); } - if(SystemUser.SYSTEM.getUserUuid().equals(processTaskStepAudit.getUserUuid())){ + if (SystemUser.SYSTEM.getUserUuid().equals(processTaskStepAudit.getUserUuid())) { processTaskStepAudit.setUserVo(new WorkAssignmentUnitVo(SystemUser.SYSTEM.getUserVo())); - }else { - UserVo userVo = userMapper.getUserBaseInfoByUuid(processTaskStepAudit.getUserUuid()); - if(userVo == null){ + } else { + UserVo userVo = userMap.get(processTaskStepAudit.getUserUuid()); + if (userVo == null) { userVo = new UserVo(processTaskStepAudit.getUserUuid()); } processTaskStepAudit.setUserVo(new WorkAssignmentUnitVo(userVo)); } - - if(SystemUser.SYSTEM.getUserUuid().equals(processTaskStepAudit.getOriginalUser())){ + if (SystemUser.SYSTEM.getUserUuid().equals(processTaskStepAudit.getOriginalUser())) { processTaskStepAudit.setOriginalUserVo(new WorkAssignmentUnitVo(SystemUser.SYSTEM.getUserVo())); - }else if(StringUtils.isNotBlank(processTaskStepAudit.getOriginalUser())) { - UserVo userVo = userMapper.getUserBaseInfoByUuid(processTaskStepAudit.getOriginalUser()); - if(userVo == null){ + } else if (StringUtils.isNotBlank(processTaskStepAudit.getOriginalUser())) { + UserVo userVo = userMap.get(processTaskStepAudit.getOriginalUser()); + if (userVo == null) { userVo = new UserVo(processTaskStepAudit.getOriginalUser()); } processTaskStepAudit.setOriginalUserVo(new WorkAssignmentUnitVo(userVo)); @@ -142,14 +197,14 @@ public class ProcessTaskAuditListApi extends PrivateApiComponentBase { Iterator iterator = processTaskStepAuditDetailList.iterator(); while (iterator.hasNext()) { ProcessTaskStepAuditDetailVo processTaskStepAuditDetailVo = iterator.next(); - if(ProcessTaskAuditDetailTypeFactory.getNeedCompression(processTaskStepAuditDetailVo.getType())){ + if (ProcessTaskAuditDetailTypeFactory.getNeedCompression(processTaskStepAuditDetailVo.getType())) { String oldContent = processTaskStepAuditDetailVo.getOldContent(); - if(StringUtils.isNotBlank(oldContent)) { - processTaskStepAuditDetailVo.setOldContent(selectContentByHashMapper.getProcessTaskContentStringByHash(oldContent)); + if (StringUtils.isNotBlank(oldContent)) { + processTaskStepAuditDetailVo.setOldContent(hashToContentMap.get(oldContent)); } String newContent = processTaskStepAuditDetailVo.getNewContent(); - if(StringUtils.isNotBlank(newContent)) { - processTaskStepAuditDetailVo.setNewContent(selectContentByHashMapper.getProcessTaskContentStringByHash(newContent)); + if (StringUtils.isNotBlank(newContent)) { + processTaskStepAuditDetailVo.setNewContent(hashToContentMap.get(newContent)); } } IProcessTaskStepAuditDetailHandler auditDetailHandler = ProcessTaskStepAuditDetailHandlerFactory.getHandler(processTaskStepAuditDetailVo.getType()); @@ -166,6 +221,71 @@ public class ProcessTaskAuditListApi extends PrivateApiComponentBase { resultList.sort((e1, e2) -> e2.getId().compareTo(e1.getId())); } return resultList; + +// for (ProcessTaskStepAuditVo processTaskStepAudit : processTaskStepAuditList) { +// if (processTaskStepAudit.getProcessTaskStepId() != null) { +// // 判断当前用户是否有权限查看该节点信息 +// if (!operateMap.computeIfAbsent(processTaskStepAudit.getProcessTaskStepId(), k -> new HashSet<>()).contains(ProcessTaskStepOperationType.STEP_VIEW)) { +// continue; +// } +// ProcessTaskStepVo processTaskStepVo = processTaskStepMap.get(processTaskStepAudit.getProcessTaskStepId()); +// if (processTaskStepVo != null) { +// processTaskStepAudit.setFormSceneUuid(processTaskStepVo.getFormSceneUuid()); +// } +// } +// +// if(StringUtils.isNotBlank(processTaskStepAudit.getDescriptionHash())){ +// String description = selectContentByHashMapper.getProcessTaskContentStringByHash(processTaskStepAudit.getDescriptionHash()); +// processTaskStepAudit.setDescription(description); +// } +// if(SystemUser.SYSTEM.getUserUuid().equals(processTaskStepAudit.getUserUuid())){ +// processTaskStepAudit.setUserVo(new WorkAssignmentUnitVo(SystemUser.SYSTEM.getUserVo())); +// }else { +// UserVo userVo = userMapper.getUserBaseInfoByUuid(processTaskStepAudit.getUserUuid()); +// if(userVo == null){ +// userVo = new UserVo(processTaskStepAudit.getUserUuid()); +// } +// processTaskStepAudit.setUserVo(new WorkAssignmentUnitVo(userVo)); +// } +// +// if(SystemUser.SYSTEM.getUserUuid().equals(processTaskStepAudit.getOriginalUser())){ +// processTaskStepAudit.setOriginalUserVo(new WorkAssignmentUnitVo(SystemUser.SYSTEM.getUserVo())); +// }else if(StringUtils.isNotBlank(processTaskStepAudit.getOriginalUser())) { +// UserVo userVo = userMapper.getUserBaseInfoByUuid(processTaskStepAudit.getOriginalUser()); +// if(userVo == null){ +// userVo = new UserVo(processTaskStepAudit.getOriginalUser()); +// } +// processTaskStepAudit.setOriginalUserVo(new WorkAssignmentUnitVo(userVo)); +// } +// List processTaskStepAuditDetailList = processTaskStepAudit.getAuditDetailList(); +// processTaskStepAuditDetailList.sort(ProcessTaskStepAuditDetailVo::compareTo); +// Iterator iterator = processTaskStepAuditDetailList.iterator(); +// while (iterator.hasNext()) { +// ProcessTaskStepAuditDetailVo processTaskStepAuditDetailVo = iterator.next(); +// if(ProcessTaskAuditDetailTypeFactory.getNeedCompression(processTaskStepAuditDetailVo.getType())){ +// String oldContent = processTaskStepAuditDetailVo.getOldContent(); +// if(StringUtils.isNotBlank(oldContent)) { +// processTaskStepAuditDetailVo.setOldContent(selectContentByHashMapper.getProcessTaskContentStringByHash(oldContent)); +// } +// String newContent = processTaskStepAuditDetailVo.getNewContent(); +// if(StringUtils.isNotBlank(newContent)) { +// processTaskStepAuditDetailVo.setNewContent(selectContentByHashMapper.getProcessTaskContentStringByHash(newContent)); +// } +// } +// IProcessTaskStepAuditDetailHandler auditDetailHandler = ProcessTaskStepAuditDetailHandlerFactory.getHandler(processTaskStepAuditDetailVo.getType()); +// if (auditDetailHandler != null) { +// int isShow = auditDetailHandler.handle(processTaskStepAuditDetailVo); +// if (isShow == 0) { +// iterator.remove(); +// } +// } +// } +// resultList.add(processTaskStepAudit); +// } +// if(CollectionUtils.isNotEmpty(resultList)){ +// resultList.sort((e1, e2) -> e2.getId().compareTo(e1.getId())); +// } +// return resultList; } } diff --git a/src/main/java/neatlogic/module/process/audithandler/handler/FormAuditHandler.java b/src/main/java/neatlogic/module/process/audithandler/handler/FormAuditHandler.java index 7271dc78d..a95526fa1 100644 --- a/src/main/java/neatlogic/module/process/audithandler/handler/FormAuditHandler.java +++ b/src/main/java/neatlogic/module/process/audithandler/handler/FormAuditHandler.java @@ -1,5 +1,8 @@ package neatlogic.module.process.audithandler.handler; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import neatlogic.framework.form.attribute.core.FormAttributeDataConversionHandlerFactory; import neatlogic.framework.form.attribute.core.FormAttributeHandlerFactory; import neatlogic.framework.form.attribute.core.IFormAttributeDataConversionHandler; @@ -8,23 +11,19 @@ import neatlogic.framework.form.dto.FormAttributeVo; import neatlogic.framework.form.dto.FormVersionVo; import neatlogic.framework.process.audithandler.core.IProcessTaskStepAuditDetailHandler; import neatlogic.framework.process.constvalue.ProcessTaskAuditDetailType; -import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; -import neatlogic.module.process.dao.mapper.SelectContentByHashMapper; import neatlogic.framework.process.dto.ProcessTaskAuditFormAttributeDataVo; import neatlogic.framework.process.dto.ProcessTaskFormAttributeDataVo; import neatlogic.framework.process.dto.ProcessTaskFormVo; import neatlogic.framework.process.dto.ProcessTaskStepAuditDetailVo; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import neatlogic.framework.util.FormUtil; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskStaticDataMapper; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; @@ -33,10 +32,8 @@ public class FormAuditHandler implements IProcessTaskStepAuditDetailHandler { private final static Logger logger = LoggerFactory.getLogger(FormAuditHandler.class); - @Autowired - private ProcessTaskMapper processTaskMapper; - @Autowired - private SelectContentByHashMapper selectContentByHashMapper; + @Resource + private ProcessTaskStaticDataMapper processTaskStaticDataMapper; @Override public String getType() { @@ -79,7 +76,7 @@ public class FormAuditHandler implements IProcessTaskStepAuditDetailHandler { return 0; } Long processTaskId = processTaskFormAttributeDataList.get(0).getProcessTaskId(); - ProcessTaskFormVo processTaskForm = processTaskMapper.getProcessTaskFormByProcessTaskId(processTaskId); + ProcessTaskFormVo processTaskForm = processTaskStaticDataMapper.getProcessTaskFormByProcessTaskId(processTaskId); if (processTaskForm == null || StringUtils.isBlank(processTaskForm.getFormContent())) { return 0; } diff --git a/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.java b/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.java index a272b1027..32d4b0e30 100644 --- a/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.java +++ b/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.java @@ -20,6 +20,7 @@ package neatlogic.module.process.dao.mapper; import neatlogic.framework.process.crossover.ISelectContentByHashCrossoverMapper; import neatlogic.framework.process.dto.ProcessTaskConfigVo; import neatlogic.framework.process.dto.ProcessTaskContentVo; +import neatlogic.framework.process.dto.ProcessTaskStepConfigVo; import java.util.List; @@ -27,6 +28,8 @@ public interface SelectContentByHashMapper extends ISelectContentByHashCrossover String getProcessTaskStepConfigByHash(String hash); + List getProcessTaskStepConfigListByHashList(List hashList); + ProcessTaskContentVo getProcessTaskContentByHash(String hash); List getProcessTaskContentListByHashList(List contentHashList); diff --git a/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.xml b/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.xml index 70675caf1..42f2f37be 100644 --- a/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.xml +++ b/src/main/java/neatlogic/module/process/dao/mapper/SelectContentByHashMapper.xml @@ -18,7 +18,7 @@ - + + + SELECT `handler`, diff --git a/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.java b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.java new file mode 100644 index 000000000..480a78667 --- /dev/null +++ b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2025 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.process.dao.mapper.processtask; + +import neatlogic.framework.process.dto.ProcessTaskFormVo; + +public interface ProcessTaskStaticDataMapper { + ProcessTaskFormVo getProcessTaskFormByProcessTaskId(Long processTaskId); +} diff --git a/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.xml b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.xml new file mode 100644 index 000000000..bab47f82e --- /dev/null +++ b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskStaticDataMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + \ No newline at end of file -- Gitee From d67f6dec2ae76b52b992ccf62479d18346892856 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Tue, 22 Jul 2025 19:13:00 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E6=85=A2=E6=8E=A5=E5=8F=A3=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1471132643852288]工单详情页慢接口优化 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1471132643852288 --- .../processtask/ProcessTaskFlowChartApi.java | 131 ++++++++++++++++-- .../ProcessTaskStepStatusListApi.java | 1 + .../process/service/ProcessTaskService.java | 6 + .../service/ProcessTaskServiceImpl.java | 66 ++++++++- 4 files changed, 187 insertions(+), 17 deletions(-) diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskFlowChartApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskFlowChartApi.java index ebb122c0e..f02d5254d 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskFlowChartApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskFlowChartApi.java @@ -1,18 +1,24 @@ package neatlogic.module.process.api.processtask; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import neatlogic.framework.asynchronization.threadlocal.UserContext; import neatlogic.framework.auth.core.AuthAction; import neatlogic.framework.common.constvalue.ApiParamType; +import neatlogic.framework.common.constvalue.GroupSearch; +import neatlogic.framework.dao.mapper.RoleMapper; +import neatlogic.framework.dao.mapper.TeamMapper; +import neatlogic.framework.dao.mapper.UserMapper; +import neatlogic.framework.dto.RoleVo; +import neatlogic.framework.dto.TeamVo; +import neatlogic.framework.dto.UserVo; +import neatlogic.framework.dto.WorkAssignmentUnitVo; import neatlogic.framework.exception.type.ParamNotExistsException; import neatlogic.framework.process.auth.PROCESS_BASE; import neatlogic.framework.process.constvalue.ProcessTaskStepStatus; import neatlogic.framework.process.constvalue.ProcessTaskStepUserStatus; import neatlogic.framework.process.constvalue.ProcessUserType; -import neatlogic.module.process.dao.mapper.catalog.ChannelMapper; -import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; -import neatlogic.module.process.dao.mapper.processtask.ProcessTaskStepTaskMapper; -import neatlogic.module.process.dao.mapper.SelectContentByHashMapper; -import neatlogic.module.process.dao.mapper.task.TaskMapper; import neatlogic.framework.process.dto.*; import neatlogic.framework.process.exception.channel.ChannelNotFoundException; import neatlogic.framework.process.exception.process.ProcessNotFoundException; @@ -21,11 +27,13 @@ import neatlogic.framework.process.stephandler.core.ProcessStepHandlerFactory; import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.module.process.dao.mapper.SelectContentByHashMapper; +import neatlogic.module.process.dao.mapper.catalog.ChannelMapper; import neatlogic.module.process.dao.mapper.process.ProcessMapper; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskStepTaskMapper; +import neatlogic.module.process.dao.mapper.task.TaskMapper; import neatlogic.module.process.service.ProcessTaskService; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.JSONPath; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -61,6 +69,15 @@ public class ProcessTaskFlowChartApi extends PrivateApiComponentBase { @Resource private ProcessTaskStepTaskMapper processTaskStepTaskMapper; + @Resource + private UserMapper userMapper; + + @Resource + private TeamMapper teamMapper; + + @Resource + private RoleMapper roleMapper; + @Override public String getToken() { return "processtask/flowchart"; @@ -76,6 +93,11 @@ public class ProcessTaskFlowChartApi extends PrivateApiComponentBase { return null; } + @Override + public boolean disableReturnCircularReferenceDetect() { + return true; + } + @Input({ @Param(name = "processTaskId", type = ApiParamType.LONG, desc = "工单id"), @Param(name = "channelUuid", type = ApiParamType.STRING, desc = "工单id") @@ -105,8 +127,86 @@ public class ProcessTaskFlowChartApi extends PrivateApiComponentBase { } List processTaskStepList = processTaskMapper.getProcessTaskStepListByProcessTaskId(processTaskId); if (CollectionUtils.isNotEmpty(processTaskStepList)) { + Set userUuidSet = new HashSet<>(); + Set teamUuidSet = new HashSet<>(); + Set roleUuidSet = new HashSet<>(); + ProcessTaskStepUserVo searchStepUserVo = new ProcessTaskStepUserVo(); + searchStepUserVo.setProcessTaskId(processTaskId); + List processTaskStepUserList = processTaskMapper.getProcessTaskStepUserList(searchStepUserVo); + for (ProcessTaskStepUserVo stepUserVo : processTaskStepUserList) { + userUuidSet.add(stepUserVo.getUserUuid()); + } + List processTaskStepWorkerList = processTaskMapper.getProcessTaskStepWorkerByProcessTaskIdAndProcessTaskStepId(processTaskId, null); + for (ProcessTaskStepWorkerVo workerVo : processTaskStepWorkerList) { + if (workerVo.getType().equals(GroupSearch.USER.getValue())) { + userUuidSet.add(workerVo.getUuid()); + } else if (workerVo.getType().equals(GroupSearch.TEAM.getValue())) { + teamUuidSet.add(workerVo.getUuid()); + } else if (workerVo.getType().equals(GroupSearch.ROLE.getValue())) { + roleUuidSet.add(workerVo.getUuid()); + } + } + Map userMap = new HashMap<>(); + Map teamMap = new HashMap<>(); + Map roleMap = new HashMap<>(); + List userUuidList = userUuidSet.stream().filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(userUuidList)) { + List userList = userMapper.getUserByUserUuidList(userUuidList); + userMap = userList.stream().collect(Collectors.toMap(UserVo::getUuid, e -> e)); + } + List teamUuidList = teamUuidSet.stream().filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(teamUuidList)) { + List teamList = teamMapper.getTeamByUuidList(teamUuidList); + teamMap = teamList.stream().collect(Collectors.toMap(TeamVo::getUuid, e -> e)); + } + List roleUuidList = roleUuidSet.stream().filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(roleUuidList)) { + List roleList = roleMapper.getRoleByUuidList(roleUuidList); + roleMap = roleList.stream().collect(Collectors.toMap(RoleVo::getUuid, e -> e)); + } + for (ProcessTaskStepUserVo stepUserVo : processTaskStepUserList) { + UserVo userVo = userMap.get(stepUserVo.getUserUuid()); + if (userVo != null) { + stepUserVo.setUserName(userVo.getUserName()); + } + } + for (ProcessTaskStepWorkerVo workerVo : processTaskStepWorkerList) { + if (workerVo.getType().equals(GroupSearch.USER.getValue())) { + UserVo userVo = userMap.get(workerVo.getUuid()); + if (userVo != null) { + workerVo.setWorker(new WorkAssignmentUnitVo(userVo)); + workerVo.setName(userVo.getUserName()); + } + } else if (workerVo.getType().equals(GroupSearch.TEAM.getValue())) { + TeamVo teamVo = teamMap.get(workerVo.getUuid()); + if (teamVo != null) { + workerVo.setWorker(new WorkAssignmentUnitVo(teamVo)); + workerVo.setName(teamVo.getName()); + } + } else if (workerVo.getType().equals(GroupSearch.ROLE.getValue())) { + RoleVo roleVo = roleMap.get(workerVo.getUuid()); + if (roleVo != null) { + workerVo.setWorker(new WorkAssignmentUnitVo(roleVo)); + workerVo.setName(roleVo.getName()); + } + } + } + Map hash2ConfigMap = new HashMap<>(); + List configHashList = processTaskStepList.stream().map(ProcessTaskStepVo::getConfigHash).filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(configHashList)) { + List configList = selectContentByHashMapper.getProcessTaskStepConfigListByHashList(configHashList); + for (ProcessTaskStepConfigVo processTaskStepConfigVo : configList) { + hash2ConfigMap.put(processTaskStepConfigVo.getHash(), processTaskStepConfigVo.getConfig()); + } + } for (ProcessTaskStepVo processTaskStepVo : processTaskStepList) { - processTaskService.setProcessTaskStepUser(processTaskStepVo); + String stepConfig = hash2ConfigMap.get(processTaskStepVo.getConfigHash()); + if (StringUtils.isNotBlank(stepConfig)) { + processTaskStepVo.setConfig(JSON.parseObject(stepConfig)); + } else { + processTaskStepVo.setConfig(new JSONObject()); + } + processTaskService.setProcessTaskStepUser(processTaskStepVo, processTaskStepUserList, processTaskStepWorkerList); List minorUserList = processTaskStepVo.getMinorUserList(); if (CollectionUtils.isNotEmpty(minorUserList)) { setMinorUserTaskType(processTaskStepVo, minorUserList); @@ -199,8 +299,17 @@ public class ProcessTaskFlowChartApi extends PrivateApiComponentBase { */ private void setMinorUserTaskType(ProcessTaskStepVo processTaskStepVo, List minorUserList) { Map> userUuidTaskConfigNameMap = new HashMap<>(); - String stepConfigStr = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); - JSONObject taskConfig = (JSONObject) JSONPath.read(stepConfigStr, "taskConfig"); + JSONObject stepConfigObj = processTaskStepVo.getConfig(); + if (stepConfigObj == null) { + String config = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); + if (StringUtils.isNotBlank(config)) { + stepConfigObj = JSONObject.parseObject(config); + } else { + stepConfigObj = new JSONObject(); + } + processTaskStepVo.setConfig(stepConfigObj); + } + JSONObject taskConfig = stepConfigObj.getJSONObject("taskConfig"); if (MapUtils.isNotEmpty(taskConfig)) { JSONArray idArray = taskConfig.getJSONArray("idList"); if (CollectionUtils.isNotEmpty(idArray)) { diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskStepStatusListApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskStepStatusListApi.java index 7e6862ae6..1a159214a 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskStepStatusListApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskStepStatusListApi.java @@ -18,6 +18,7 @@ import java.util.List; @Service @AuthAction(action = PROCESS_BASE.class) @OperationType(type = OperationTypeEnum.SEARCH) +@Deprecated public class ProcessTaskStepStatusListApi extends PrivateApiComponentBase { @Autowired diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskService.java b/src/main/java/neatlogic/module/process/service/ProcessTaskService.java index 66f5d64ba..66c6b297c 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskService.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskService.java @@ -146,6 +146,12 @@ public interface ProcessTaskService { */ public void setProcessTaskStepUser(ProcessTaskStepVo processTaskStepVo); + /** + * @param processTaskStepVo + * @Description: 设置步骤处理人、协助处理人、待办人等 + */ + void setProcessTaskStepUser(ProcessTaskStepVo processTaskStepVo, List processTaskStepUserList, List processTaskStepWorkerList); + /** * @param jsonObj * @param processTaskStepReplyVo 旧的回复数据 diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java b/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java index a654a7e58..9d9ddff7c 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskServiceImpl.java @@ -970,6 +970,33 @@ public class ProcessTaskServiceImpl implements ProcessTaskService, IProcessTaskC processTaskStepVo.setMinorUserList(minorUserList); } + @Override + public void setProcessTaskStepUser(ProcessTaskStepVo processTaskStepVo, List processTaskStepUserList, List processTaskStepWorkerList) { + List majorUserList = new ArrayList<>(); + List minorUserList = new ArrayList<>(); + for (ProcessTaskStepUserVo stepUserVo : processTaskStepUserList) { + if (Objects.equals(stepUserVo.getProcessTaskStepId(), processTaskStepVo.getId())) { + if (stepUserVo.getUserType().equals(ProcessUserType.MAJOR.getValue())) { + majorUserList.add(stepUserVo); + } else if (stepUserVo.getUserType().equals(ProcessUserType.MINOR.getValue())) { + minorUserList.add(stepUserVo); + } + } + } + if (CollectionUtils.isNotEmpty(majorUserList)) { + processTaskStepVo.setMajorUser(majorUserList.get(0)); + } else { + List workerList = new ArrayList<>(); + for (ProcessTaskStepWorkerVo workerVo : processTaskStepWorkerList) { + if (Objects.equals(workerVo.getProcessTaskStepId(), processTaskStepVo.getId())) { + workerList.add(workerVo); + } + } + processTaskStepVo.setWorkerList(workerList); + } + processTaskStepVo.setMinorUserList(minorUserList); + } + @Override public boolean saveProcessTaskStepReply(JSONObject jsonObj, ProcessTaskStepReplyVo oldReplyVo) { if (oldReplyVo == null) { @@ -1825,9 +1852,18 @@ public class ProcessTaskServiceImpl implements ProcessTaskService, IProcessTaskC @Override public JSONArray getReplaceableTextList(ProcessTaskStepVo processTaskStepVo) { - String config = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); + JSONObject stepConfigObj = processTaskStepVo.getConfig(); + if (stepConfigObj == null) { + String config = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); + if (StringUtils.isNotBlank(config)) { + stepConfigObj = JSONObject.parseObject(config); + } else { + stepConfigObj = new JSONObject(); + } + processTaskStepVo.setConfig(stepConfigObj); + } boolean stepLevelTakesEffect = false; - JSONArray replaceableTextList = (JSONArray) JSONPath.read(config, "replaceableTextList"); + JSONArray replaceableTextList = stepConfigObj.getJSONArray("replaceableTextList"); if (CollectionUtils.isNotEmpty(replaceableTextList)) { for (int i = 0; i < replaceableTextList.size(); i++) { JSONObject replaceableText = replaceableTextList.getJSONObject(i); @@ -1864,9 +1900,18 @@ public class ProcessTaskServiceImpl implements ProcessTaskService, IProcessTaskC @Override public JSONArray getCustomButtonList(ProcessTaskStepVo processTaskStepVo) { - String config = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); + JSONObject stepConfigObj = processTaskStepVo.getConfig(); + if (stepConfigObj == null) { + String config = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); + if (StringUtils.isNotBlank(config)) { + stepConfigObj = JSONObject.parseObject(config); + } else { + stepConfigObj = new JSONObject(); + } + processTaskStepVo.setConfig(stepConfigObj); + } boolean stepLevelTakesEffect = false; - JSONArray customButtonList = (JSONArray) JSONPath.read(config, "customButtonList"); + JSONArray customButtonList = stepConfigObj.getJSONArray("customButtonList"); if (CollectionUtils.isNotEmpty(customButtonList)) { for (int i = 0; i < customButtonList.size(); i++) { JSONObject customButton = customButtonList.getJSONObject(i); @@ -1893,9 +1938,18 @@ public class ProcessTaskServiceImpl implements ProcessTaskService, IProcessTaskC @Override public JSONArray getCustomStatusList(ProcessTaskStepVo processTaskStepVo) { - String config = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); + JSONObject stepConfigObj = processTaskStepVo.getConfig(); + if (stepConfigObj == null) { + String config = selectContentByHashMapper.getProcessTaskStepConfigByHash(processTaskStepVo.getConfigHash()); + if (StringUtils.isNotBlank(config)) { + stepConfigObj = JSONObject.parseObject(config); + } else { + stepConfigObj = new JSONObject(); + } + processTaskStepVo.setConfig(stepConfigObj); + } boolean stepLevelTakesEffect = false; - JSONArray customStatusList = (JSONArray) JSONPath.read(config, "customStatusList"); + JSONArray customStatusList = stepConfigObj.getJSONArray("customStatusList"); if (CollectionUtils.isNotEmpty(customStatusList)) { for (int i = 0; i < customStatusList.size(); i++) { JSONObject customStatus = customStatusList.getJSONObject(i); -- Gitee