From cef33d1fa8ddc035901f5d1204db6e48cac2ecfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=BA=E7=9C=8B=E5=A4=A9?= <2417266532@qq.com> Date: Wed, 6 Nov 2024 00:51:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=201.=20=E4=BA=A4=E4=BB=98=E7=89=A9?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=B6=EF=BC=8C=E9=99=90=E5=88=B6=E6=89=80?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E7=9A=84=E7=88=B6=E4=BA=A4=E4=BB=98=E7=89=A9?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E4=B8=BA=E8=87=AA=E8=BA=AB=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E5=AD=90=E4=BA=A4=E4=BB=98=E7=89=A9=202.=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BA=A4=E4=BB=98=E7=89=A9A=E6=97=B6=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0A=E5=AD=90=E4=BA=A4=E4=BB=98=E7=89=A9=E7=9A=84pid?= =?UTF-8?q?=E4=B8=BA=E9=A1=B6=E7=BA=A7=E4=BA=A4=E4=BB=98=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reason: 问题1:交付物修改时,如果以子交付物为新的父交付物,则会出现循环引用,导致界面不显示。 问题2:删除交付物A时,A的子交付物B的pid仍为A的id,因此在修改B时,前端会显示(unknown A的id) 。 createBy: grin 2417266532@qq.com --- .../src/main/resources/application-mysql.yml | 2 +- .../main/resources/i18n/messages.properties | 1 + .../resources/i18n/messages_en_US.properties | 1 + .../system/mapper/SysModuleMapper.java | 16 +++ .../service/impl/SysModuleServiceImpl.java | 114 +++++++++++++----- .../mapper/system/SysModuleMapper.xml | 28 ++++- 6 files changed, 130 insertions(+), 32 deletions(-) diff --git a/cat2bug-platform-admin/src/main/resources/application-mysql.yml b/cat2bug-platform-admin/src/main/resources/application-mysql.yml index b1dbf3cc..a480c5c8 100644 --- a/cat2bug-platform-admin/src/main/resources/application-mysql.yml +++ b/cat2bug-platform-admin/src/main/resources/application-mysql.yml @@ -30,7 +30,7 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://localhost:3306/cat2bug_platform?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/cat2bug_platform?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true username: root password: cat2bug_password # 从库数据源 diff --git a/cat2bug-platform-admin/src/main/resources/i18n/messages.properties b/cat2bug-platform-admin/src/main/resources/i18n/messages.properties index 42254b43..f40a790a 100644 --- a/cat2bug-platform-admin/src/main/resources/i18n/messages.properties +++ b/cat2bug-platform-admin/src/main/resources/i18n/messages.properties @@ -73,6 +73,7 @@ project.member_role_not_empty=成员角色不能为空! module=交付物 module.required=交付物(必填) module.insert-fail=新建交付物失败! +module.update_parent_module_fail=不能将父交付物设置为自身的子交付物 defect=缺陷 defect.assign_fail=指派操作失败 diff --git a/cat2bug-platform-admin/src/main/resources/i18n/messages_en_US.properties b/cat2bug-platform-admin/src/main/resources/i18n/messages_en_US.properties index d08f70da..33f35f66 100644 --- a/cat2bug-platform-admin/src/main/resources/i18n/messages_en_US.properties +++ b/cat2bug-platform-admin/src/main/resources/i18n/messages_en_US.properties @@ -74,6 +74,7 @@ project.member_role_not_empty=Member roles cannot be empty! module=Deliverable module.required=Deliverable(Required) module.insert-fail=Create deliverable failed! +module.update_parent_module_fail=Cannot set the parent deliverable to be its own child defect=Defect defect.assign_fail=Assign operation failed! diff --git a/cat2bug-platform-system/src/main/java/com/cat2bug/system/mapper/SysModuleMapper.java b/cat2bug-platform-system/src/main/java/com/cat2bug/system/mapper/SysModuleMapper.java index c3da8bed..5cc00909 100644 --- a/cat2bug-platform-system/src/main/java/com/cat2bug/system/mapper/SysModuleMapper.java +++ b/cat2bug-platform-system/src/main/java/com/cat2bug/system/mapper/SysModuleMapper.java @@ -42,6 +42,14 @@ public interface SysModuleMapper */ public List selectSysModulePathList(Long projectId); + /** + * 查询moduleIds为pid的交付物列表 + * + * @param pids 父id列表 + * @return 交付物列表 + */ + public List selectSysModuleByPids(Long[] pids); + /** * 新增模块 * @@ -58,6 +66,14 @@ public interface SysModuleMapper */ public int updateSysModule(SysModule sysModule); + /** + * 批量修改模块 + * + * @param sysModules + * @return 受影响行数 + */ + public int updateSysModules(List sysModules); + /** * 删除模块 * diff --git a/cat2bug-platform-system/src/main/java/com/cat2bug/system/service/impl/SysModuleServiceImpl.java b/cat2bug-platform-system/src/main/java/com/cat2bug/system/service/impl/SysModuleServiceImpl.java index c2279f92..239771b5 100644 --- a/cat2bug-platform-system/src/main/java/com/cat2bug/system/service/impl/SysModuleServiceImpl.java +++ b/cat2bug-platform-system/src/main/java/com/cat2bug/system/service/impl/SysModuleServiceImpl.java @@ -1,27 +1,26 @@ package com.cat2bug.system.service.impl; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - import com.cat2bug.common.utils.MessageUtils; +import com.cat2bug.system.domain.SysModule; +import com.cat2bug.system.mapper.SysModuleMapper; +import com.cat2bug.system.service.ISysModuleService; import com.google.common.base.Preconditions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.cat2bug.system.mapper.SysModuleMapper; -import com.cat2bug.system.domain.SysModule; -import com.cat2bug.system.service.ISysModuleService; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; + +import java.util.*; +import java.util.stream.Collectors; /** * 模块Service业务层处理 - * + * * @author yuzhantao * @date 2023-11-26 */ @Service -public class SysModuleServiceImpl implements ISysModuleService -{ +public class SysModuleServiceImpl implements ISysModuleService { @Autowired private SysModuleMapper sysModuleMapper; @@ -32,25 +31,23 @@ public class SysModuleServiceImpl implements ISysModuleService /** * 查询模块 - * + * * @param moduleId 模块主键 * @return 模块 */ @Override - public SysModule selectSysModuleByModuleId(Long moduleId) - { + public SysModule selectSysModuleByModuleId(Long moduleId) { return sysModuleMapper.selectSysModuleByModuleId(moduleId); } /** * 查询模块列表 - * + * * @param sysModule 模块 * @return 模块 */ @Override - public List selectSysModuleList(SysModule sysModule) - { + public List selectSysModuleList(SysModule sysModule) { return sysModuleMapper.selectSysModuleList(sysModule); } @@ -61,28 +58,27 @@ public class SysModuleServiceImpl implements ISysModuleService /** * 新增模块 - * + * * @param sysModule 模块 * @return 结果 */ @Override @Transactional - public List insertSysModule(SysModule sysModule) - { + public List insertSysModule(SysModule sysModule) { List ret = new ArrayList<>(); - if(sysModule.getBatchModuleNames()!=null && sysModule.getBatchModuleNames().size()>0) { - sysModule.getBatchModuleNames().forEach(m->{ + if (sysModule.getBatchModuleNames() != null && sysModule.getBatchModuleNames().size() > 0) { + sysModule.getBatchModuleNames().forEach(m -> { SysModule module = new SysModule(); module.setModuleName(m); module.setModulePid(sysModule.getModulePid()); module.setProjectId(sysModule.getProjectId()); int count = sysModuleMapper.insertSysModule(module); - Preconditions.checkState(count>0, MessageUtils.message("module.insert-fail")); + Preconditions.checkState(count > 0, MessageUtils.message("module.insert-fail")); ret.add(module); }); } else { - int count = sysModuleMapper.insertSysModule(sysModule); - Preconditions.checkState(count>0, MessageUtils.message("module.insert-fail")); + int count = sysModuleMapper.insertSysModule(sysModule); + Preconditions.checkState(count > 0, MessageUtils.message("module.insert-fail")); ret.add(sysModule); } return ret; @@ -90,25 +86,83 @@ public class SysModuleServiceImpl implements ISysModuleService /** * 修改模块 - * + * * @param sysModule 模块 * @return 结果 */ @Override - public int updateSysModule(SysModule sysModule) - { + public int updateSysModule(SysModule sysModule) { + // 根据ProjectId获取到所要交付物 + SysModule byProject = new SysModule(); + byProject.setProjectId(sysModule.getProjectId()); + List sysModules = sysModuleMapper.selectSysModuleList(byProject); + + // key是pid,即根据SysModule的pid进行分组 + Map> map = sysModules.stream().collect(Collectors + .groupingBy(SysModule::getModulePid)); + + // 当前交付物的id + Long currModuleId = sysModule.getModuleId(); + // 所要设置的新的父节点 + Long newModulePid = sysModule.getModulePid(); + + Preconditions.checkState(!isChildOfCurr(map, currModuleId, newModulePid), + MessageUtils.message("module.update_parent_module_fail")); return sysModuleMapper.updateSysModule(sysModule); } + private boolean isChildOfCurr(Map> map, Long currModuleId, Long newModulePid) { + // 新的父交付物id 不能为 自身 + if (currModuleId.equals(newModulePid)) { + return true; + } + LinkedList stack = new LinkedList<>(); + stack.push(currModuleId); + boolean isChild = false; + loop: + while (!stack.isEmpty()) { + Long pid = stack.pop(); + List list = map.get(pid); + + if (ObjectUtils.isEmpty(list)) { + continue; + } + + for (SysModule module : list) { + if (module.getModuleId().equals(newModulePid)) { + isChild = true; + break loop; + } + stack.push(module.getModuleId()); + } + } + return isChild; + } + /** * 批量删除模块 - * + * * @param moduleIds 需要删除的模块主键 * @return 结果 */ @Override - public int deleteSysModuleByModuleIds(Long[] moduleIds) - { + @Transactional(rollbackFor = Exception.class) + public int deleteSysModuleByModuleIds(Long[] moduleIds) { + // 找到所有以moduleIds为pid的交付物 + List children = sysModuleMapper.selectSysModuleByPids(moduleIds); + if (!ObjectUtils.isEmpty(children)) { + // 删除moduleId后,将以该moduleId为父id的交付物的父id置为0 + Long root = 0L; + List list = new ArrayList<>(); + for (SysModule child : children) { + SysModule module = new SysModule(); + module.setModuleId(child.getModuleId()); + module.setModulePid(root); + list.add(module); + } + // 批量更新 + sysModuleMapper.updateSysModules(list); + } return sysModuleMapper.deleteSysModuleByModuleIds(moduleIds); } diff --git a/cat2bug-platform-system/src/main/resources/mapper/system/SysModuleMapper.xml b/cat2bug-platform-system/src/main/resources/mapper/system/SysModuleMapper.xml index f7819f70..53953a7c 100644 --- a/cat2bug-platform-system/src/main/resources/mapper/system/SysModuleMapper.xml +++ b/cat2bug-platform-system/src/main/resources/mapper/system/SysModuleMapper.xml @@ -18,6 +18,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select m.module_id, m.module_pid, m.module_name, m.remark, m.project_id, mg.children_count from sys_module m + + select m.module_id, m.module_pid, m.module_name, m.remark, m.project_id + from sys_module m + + - + + + insert into sys_module @@ -87,6 +100,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where module_id = #{moduleId} + + + update sys_module + + module_pid = #{item.modulePid}, + module_name = #{item.moduleName}, + remark = #{item.remark}, + project_id = #{item.projectId}, + + WHERE module_id = #{item.moduleId} + + + delete from sys_module where module_id = #{moduleId} -- Gitee