【新增】机构过多后一个个添加麻烦,新增批量复制一批到另一个机构下的功能

This commit is contained in:
俞宝山
2025-12-24 11:33:14 +08:00
parent 5869bad091
commit 89ef7fe062
16 changed files with 502 additions and 9 deletions

View File

@@ -143,6 +143,22 @@ public class BizOrgController {
return CommonResult.data(bizOrgService.detail(bizOrgIdParam));
}
/**
* 复制机构
*
* @author yubaoshan
* @date 2025/12/24 01:30
*/
@ApiOperationSupport(order = 7)
@Operation(summary = "复制机构")
@CommonLog("复制机构")
@SaCheckPermission("/biz/org/copy")
@PostMapping("/biz/org/copy")
public CommonResult<String> copy(@RequestBody @Valid BizOrgCopyParam bizOrgCopyParam) {
bizOrgService.copy(bizOrgCopyParam);
return CommonResult.ok();
}
/* ====机构部分所需要用到的选择器==== */
/**
@@ -151,7 +167,7 @@ public class BizOrgController {
* @author xuyuxiang
* @date 2022/4/24 20:00
*/
@ApiOperationSupport(order = 7)
@ApiOperationSupport(order = 8)
@Operation(summary = "获取机构树选择器")
@SaCheckPermission("/biz/org/orgTreeSelector")
@GetMapping("/biz/org/orgTreeSelector")
@@ -165,7 +181,7 @@ public class BizOrgController {
* @author xuyuxiang
* @date 2022/4/24 20:00
*/
@ApiOperationSupport(order = 8)
@ApiOperationSupport(order = 9)
@Operation(summary = "获取人员选择器")
@SaCheckPermission("/biz/org/userSelector")
@GetMapping("/biz/org/userSelector")

View File

@@ -0,0 +1,42 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package vip.xiaonuo.biz.modular.org.param;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 机构复制参数
*
* @author yubaoshan
* @date 2025/12/24 01:30
**/
@Getter
@Setter
public class BizOrgCopyParam {
/** 目标父id */
@Schema(description = "目标父id")
@NotBlank(message = "targetParentId不能为空")
private String targetParentId;
/** 机构id集合 */
@Schema(description = "机构id集合")
@NotEmpty(message = "ids不能为空")
private List<String> ids;
}

View File

@@ -172,4 +172,12 @@ public interface BizOrgService extends IService<BizOrg> {
* @date 2022/4/24 20:08
*/
Page<BizUser> userSelector(BizOrgSelectorUserParam bizOrgSelectorUserParam);
/**
* 复制机构
*
* @author yubaoshan
* @date 2025/12/24 01:30
*/
void copy(BizOrgCopyParam bizOrgCopyParam);
}

View File

@@ -34,6 +34,7 @@ import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
import vip.xiaonuo.biz.core.enums.BizDataTypeEnum;
import vip.xiaonuo.biz.modular.org.entity.BizOrg;
import vip.xiaonuo.biz.modular.org.enums.BizOrgCategoryEnum;
import vip.xiaonuo.biz.modular.org.enums.BizOrgSourceFromTypeEnum;
import vip.xiaonuo.biz.modular.org.mapper.BizOrgMapper;
import vip.xiaonuo.biz.modular.org.param.*;
import vip.xiaonuo.biz.modular.org.service.BizOrgExtService;
@@ -395,6 +396,63 @@ public class BizOrgServiceImpl extends ServiceImpl<BizOrgMapper, BizOrg> impleme
return bizUserService.page(CommonPageRequest.defaultPage(), queryWrapper.lambda());
}
@Transactional(rollbackFor = Exception.class)
@Override
public void copy(BizOrgCopyParam bizOrgCopyParam) {
// 获取目标父id
String targetParentId = bizOrgCopyParam.getTargetParentId();
// 获取机构id集合
List<String> orgIdList = bizOrgCopyParam.getIds();
if(ObjectUtil.isNotEmpty(orgIdList)) {
// 校验数据范围
List<String> loginUserDataScope = StpLoginUserUtil.getLoginUserDataScope();
if(ObjectUtil.isNotEmpty(loginUserDataScope)) {
// 如果有数据范围限制则校验目标父id是否有权限
if(!loginUserDataScope.contains(targetParentId)) {
throw new CommonException("您没有权限在该机构下增加机构机构id{}", targetParentId);
}
// 再校验源ID权限
if(!new HashSet<>(loginUserDataScope).containsAll(orgIdList)) {
throw new CommonException("您没有权限复制这些机构机构id{}", orgIdList);
}
} else {
throw new CommonException("您没有权限复制机构");
}
// 遍历复制
orgIdList.forEach(orgId -> {
BizOrg bizOrg = this.getById(orgId);
if(ObjectUtil.isNotEmpty(bizOrg)) {
// 查询是否有重复名称
boolean repeatName = this.count(new LambdaQueryWrapper<BizOrg>()
.eq(BizOrg::getParentId, targetParentId)
.eq(BizOrg::getName, bizOrg.getName())) > 0;
// 如果有重复名称则跳过
if(!repeatName) {
BizOrg copyBizOrg = new BizOrg();
// 复制部分字段
copyBizOrg.setName(bizOrg.getName());
copyBizOrg.setCategory(bizOrg.getCategory());
copyBizOrg.setSortCode(bizOrg.getSortCode());
copyBizOrg.setExtJson(bizOrg.getExtJson());
// 设置父id
copyBizOrg.setParentId(targetParentId);
// 重新生成code
copyBizOrg.setCode(RandomUtil.randomString(10));
// 主管置空
copyBizOrg.setDirectorId(null);
// 保存
this.save(copyBizOrg);
// 插入扩展信息
bizOrgExtService.createExtInfo(copyBizOrg.getId(), BizOrgSourceFromTypeEnum.SYSTEM_ADD.getValue());
// 发布增加事件
CommonDataChangeEventCenter.doAddWithData(BizDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(copyBizOrg));
}
}
});
}
}
/* ====以下为各种递归方法==== */
@Override

View File

@@ -136,6 +136,21 @@ public class SysOrgController {
return CommonResult.data(sysOrgService.detail(sysOrgIdParam));
}
/**
* 复制组织
*
* @author yubaoshan
* @date 2025/12/24 01:10
*/
@ApiOperationSupport(order = 7)
@Operation(summary = "复制组织")
@CommonLog("复制组织")
@PostMapping("/sys/org/copy")
public CommonResult<String> copy(@RequestBody @Valid SysOrgCopyParam sysOrgCopyParam) {
sysOrgService.copy(sysOrgCopyParam);
return CommonResult.ok();
}
/* ====组织部分所需要用到的选择器==== */
/**
@@ -144,7 +159,7 @@ public class SysOrgController {
* @author xuyuxiang
* @date 2022/4/24 20:00
*/
@ApiOperationSupport(order = 7)
@ApiOperationSupport(order = 8)
@Operation(summary = "获取组织树选择器")
@GetMapping("/sys/org/orgTreeSelector")
public CommonResult<List<Tree<String>>> orgTreeSelector() {
@@ -157,7 +172,7 @@ public class SysOrgController {
* @author xuyuxiang
* @date 2022/4/24 20:00
*/
@ApiOperationSupport(order = 8)
@ApiOperationSupport(order = 9)
@Operation(summary = "获取用户选择器")
@GetMapping("/sys/org/userSelector")
public CommonResult<Page<SysUser>> userSelector(SysOrgSelectorUserParam sysOrgSelectorUserParam) {

View File

@@ -0,0 +1,42 @@
/*
* Copyright [2022] [https://www.xiaonuo.vip]
*
* Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
*
* 1.请不要删除和修改根目录下的LICENSE文件。
* 2.请不要删除和修改Snowy源码头部的版权声明。
* 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
* 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
* 5.不可二次分发开源参与同类竞品如有想法可联系团队xiaonuobase@qq.com商议合作。
* 6.若您的项目无法满足以上几点需要更多功能代码获取Snowy商业授权许可请在官网购买授权地址为 https://www.xiaonuo.vip
*/
package vip.xiaonuo.sys.modular.org.param;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 组织复制参数
*
* @author xuyuxiang
* @date 2022/8/15 14:32
**/
@Getter
@Setter
public class SysOrgCopyParam {
/** 目标父id */
@Schema(description = "目标父id")
@NotBlank(message = "targetParentId不能为空")
private String targetParentId;
/** 组织id集合 */
@Schema(description = "组织id集合")
@NotEmpty(message = "ids不能为空")
private List<String> ids;
}

View File

@@ -77,6 +77,14 @@ public interface SysOrgService extends IService<SysOrg> {
*/
SysOrg detail(SysOrgIdParam sysOrgIdParam);
/**
* 复制组织
*
* @author yubaoshan
* @date 2025/12/24 01:10
*/
void copy(SysOrgCopyParam sysOrgCopyParam);
/**
* 获取组织详情
*

View File

@@ -205,6 +205,49 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
return this.queryEntity(sysOrgIdParam.getId());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void copy(SysOrgCopyParam sysOrgCopyParam) {
// 获取目标父id
String targetParentId = sysOrgCopyParam.getTargetParentId();
// 获取组织id集合
List<String> orgIdList = sysOrgCopyParam.getIds();
if(ObjectUtil.isNotEmpty(orgIdList)) {
// 遍历复制
orgIdList.forEach(orgId -> {
SysOrg sysOrg = this.getById(orgId);
if(ObjectUtil.isNotEmpty(sysOrg)) {
// 查询是否有重复名称
boolean repeatName = this.count(new LambdaQueryWrapper<SysOrg>()
.eq(SysOrg::getParentId, targetParentId)
.eq(SysOrg::getName, sysOrg.getName())) > 0;
// 如果有重复名称则跳过
if(!repeatName) {
SysOrg copySysOrg = new SysOrg();
// 复制部分字段
copySysOrg.setName(sysOrg.getName());
copySysOrg.setCategory(sysOrg.getCategory());
copySysOrg.setSortCode(sysOrg.getSortCode());
copySysOrg.setExtJson(sysOrg.getExtJson());
// 设置父id
copySysOrg.setParentId(targetParentId);
// 重新生成code
copySysOrg.setCode(RandomUtil.randomString(10));
// 主管置空
copySysOrg.setDirectorId(null);
// 保存
this.save(copySysOrg);
// 插入扩展信息
sysOrgExtService.createExtInfo(copySysOrg.getId(), SysOrgSourceFromTypeEnum.SYSTEM_ADD.getValue());
// 发布增加事件
CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(copySysOrg));
}
}
});
}
}
@Override
public SysOrg queryEntity(String id) {
SysOrg sysOrg = this.getById(id);