From 3c8d864b5f68af5167199e0d5c9ff6c0c5852638 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 20 一月 2025 11:35:45 +0800 Subject: [PATCH] !639 发布 5.3.0-BETA 公测版本 Merge pull request !639 from 疯狂的狮子Li/dev --- ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java | 132 ++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 121 insertions(+), 11 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 0cd574a..f31bd30 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -1,6 +1,8 @@ package org.dromara.system.service.impl; import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; @@ -10,13 +12,19 @@ import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.WorkflowService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysTenantVo; @@ -27,10 +35,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; +import java.util.*; /** * 绉熸埛Service涓氬姟灞傚鐞� @@ -103,6 +108,7 @@ lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); + lqw.orderByAsc(SysTenant::getId); return lqw; } @@ -116,7 +122,9 @@ // 鑾峰彇鎵�鏈夌鎴风紪鍙� List<String> tenantIds = baseMapper.selectObjs( - new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), Convert::toStr); + new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId), x -> { + return Convert.toStr(x); + }); String tenantId = generateTenantId(tenantIds); add.setTenantId(tenantId); boolean flag = baseMapper.insert(add) > 0; @@ -132,7 +140,6 @@ SysDept dept = new SysDept(); dept.setTenantId(tenantId); dept.setDeptName(bo.getCompanyName()); - dept.setLeader(bo.getUsername()); dept.setParentId(Constants.TOP_PARENT_ID); dept.setAncestors(Constants.TOP_PARENT_ID.toString()); deptMapper.insert(dept); @@ -152,6 +159,11 @@ user.setPassword(BCrypt.hashpw(bo.getPassword())); user.setDeptId(deptId); userMapper.insert(user); + //鏂板绯荤粺鐢ㄦ埛鍚庯紝榛樿褰撳墠鐢ㄦ埛涓洪儴闂ㄧ殑璐熻矗浜� + SysDept sd = new SysDept(); + sd.setLeader(user.getUserId()); + sd.setDeptId(deptId); + deptMapper.updateById(sd); // 鐢ㄦ埛鍜岃鑹插叧鑱旇〃 SysUserRole userRole = new SysUserRole(); @@ -182,6 +194,13 @@ config.setTenantId(tenantId); } configMapper.insertBatch(sysConfigList); + + // 鏈紑鍚伐浣滄祦涓嶆墽琛屼笅鏂规搷浣� + if (SpringUtils.getProperty("warm-flow.enabled", Boolean.class, false)) { + WorkflowService workflowService = SpringUtils.getBean(WorkflowService.class); + // 鏂板绉熸埛娴佺▼瀹氫箟 + workflowService.syncDef(tenantId); + } return true; } @@ -196,7 +215,7 @@ String numbers = RandomUtil.randomNumbers(6); // 鍒ゆ柇鏄惁瀛樺湪锛屽鏋滃瓨鍦ㄥ垯閲嶆柊鐢熸垚 if (tenantIds.contains(numbers)) { - generateTenantId(tenantIds); + return generateTenantId(tenantIds); } return numbers; } @@ -223,7 +242,7 @@ role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); role.setRoleSort(1); - role.setStatus(TenantConstants.NORMAL); + role.setStatus(SystemConstants.NORMAL); roleMapper.insert(role); Long roleId = role.getRoleId(); @@ -261,7 +280,9 @@ @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") @Override public int updateTenantStatus(SysTenantBo bo) { - SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + SysTenant tenant = new SysTenant(); + tenant.setId(bo.getId()); + tenant.setStatus(bo.getStatus()); return baseMapper.updateById(tenant); } @@ -289,7 +310,7 @@ throw new ServiceException("瓒呯绉熸埛涓嶈兘鍒犻櫎"); } } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } /** @@ -337,7 +358,7 @@ */ @Override @Transactional(rollbackFor = Exception.class) - public Boolean syncTenantPackage(String tenantId, String packageId) { + public Boolean syncTenantPackage(String tenantId, Long packageId) { SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); List<SysRole> roles = roleMapper.selectList( new LambdaQueryWrapper<SysRole>().eq(SysRole::getTenantId, tenantId)); @@ -364,4 +385,93 @@ } return true; } + + /** + * 鍚屾绉熸埛瀛楀吀 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void syncTenantDict() { + // 鏌ヨ瓒呯 鎵�鏈夊瓧鍏告暟鎹� + List<SysDictType> dictTypeList = new ArrayList<>(); + List<SysDictData> dictDataList = new ArrayList<>(); + TenantHelper.ignore(() -> { + dictTypeList.addAll(dictTypeMapper.selectList()); + dictDataList.addAll(dictDataMapper.selectList()); + }); + Map<String, List<SysDictType>> typeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId); + Map<String, Map<String, List<SysDictData>>> typeDataMap = StreamUtils.groupBy2Key( + dictDataList, TenantEntity::getTenantId, SysDictData::getDictType); + // 绠$悊绉熸埛瀛楀吀鏁版嵁 + List<SysDictType> defaultTypeMap = typeMap.get(TenantConstants.DEFAULT_TENANT_ID); + Map<String, List<SysDictData>> defaultTypeDataMap = typeDataMap.get(TenantConstants.DEFAULT_TENANT_ID); + + // 鑾峰彇鎵�鏈夌鎴风紪鍙� + List<String> tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper<SysTenant>().select(SysTenant::getTenantId) + .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> { + return Convert.toStr(x); + }); + List<SysDictType> saveTypeList = new ArrayList<>(); + List<SysDictData> saveDataList = new ArrayList<>(); + Set<String> set = new HashSet<>(); + for (String tenantId : tenantIds) { + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + continue; + } + for (SysDictType dictType : defaultTypeMap) { + List<String> typeList = StreamUtils.toList(typeMap.get(tenantId), SysDictType::getDictType); + List<SysDictData> dataList = defaultTypeDataMap.get(dictType.getDictType()); + if (typeList.contains(dictType.getDictType())) { + List<SysDictData> dataListTenant = typeDataMap.get(tenantId).get(dictType.getDictType()); + Map<String, SysDictData> map = StreamUtils.toIdentityMap(dataListTenant, SysDictData::getDictValue); + for (SysDictData dictData : dataList) { + if (!map.containsKey(dictData.getDictValue())) { + SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); + // 璁剧疆瀛楀吀缂栫爜涓� null + data.setDictCode(null); + data.setTenantId(tenantId); + data.setCreateTime(null); + data.setUpdateTime(null); + set.add(tenantId); + saveDataList.add(data); + } + } + } else { + SysDictType type = BeanUtil.toBean(dictType, SysDictType.class); + type.setDictId(null); + type.setTenantId(tenantId); + type.setCreateTime(null); + type.setUpdateTime(null); + set.add(tenantId); + saveTypeList.add(type); + if (CollUtil.isNotEmpty(dataList)) { + // 绛涢�夊嚭 dictType 瀵瑰簲鐨� data + for (SysDictData dictData : dataList) { + SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); + // 璁剧疆瀛楀吀缂栫爜涓� null + data.setDictCode(null); + data.setTenantId(tenantId); + data.setCreateTime(null); + data.setUpdateTime(null); + set.add(tenantId); + saveDataList.add(data); + } + } + } + } + } + TenantHelper.ignore(() -> { + if (CollUtil.isNotEmpty(saveTypeList)) { + dictTypeMapper.insertBatch(saveTypeList); + } + if (CollUtil.isNotEmpty(saveDataList)) { + dictDataMapper.insertBatch(saveDataList); + } + }); + for (String tenantId : set) { + TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT)); + } + } + } -- Gitblit v1.9.3