diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java index 67c1f5133..1eb3a2fe6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -1,18 +1,29 @@ package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.R; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.bo.SysDictDataBo; import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysDictDataVo; import org.dromara.system.domain.vo.SysDictTypeVo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysDictDataService; import org.dromara.system.service.ISysDictTypeService; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import org.dromara.system.service.ISysTenantService; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -30,6 +41,8 @@ import java.util.List; public class SysDictTypeController extends BaseController { private final ISysDictTypeService dictTypeService; + private final ISysDictDataService dictDataService; + private final ISysTenantService tenantService; /** * 查询字典类型列表 @@ -122,4 +135,36 @@ public class SysDictTypeController extends BaseController { List dictTypes = dictTypeService.selectDictTypeAll(); return R.ok(dictTypes); } + + /** + * 同步租户字典 + */ + @GetMapping("syncTenantDict") + @Log(title = "同步租户字典", businessType = BusinessType.INSERT) + @Transactional(rollbackFor = Exception.class) + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + public R syncTenantDict(String tenantId) { + if (!TenantHelper.isEnable()) { + return R.fail("当前未开启租户模式"); + } + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + return R.fail("超级管理员无须同步字典"); + } + //查询超管所有字典类型 + List typeVos = TenantHelper.dynamic(TenantConstants.DEFAULT_TENANT_ID, dictTypeService::selectDictTypeAll); + //查询超管所有字典data + List dictDataVos = TenantHelper.dynamic(TenantConstants.DEFAULT_TENANT_ID, () -> dictDataService.selectDictDataList(new SysDictDataBo())); + SysTenantBo sysTenantBo = new SysTenantBo(); + sysTenantBo.setTenantId(tenantId); + List sysTenantVos = tenantService.queryList(sysTenantBo); + for (SysTenantVo sysTenantVo : sysTenantVos) { + for (SysDictTypeVo typeVo : typeVos) { + TenantHelper.dynamic(sysTenantVo.getTenantId(), () -> { + //如果不存在则插入 + dictTypeService.insertIfNotExist(typeVo, dictDataVos); + }); + } + } + return R.ok("同步租户字典成功"); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java index 3b32d6cbb..9b02d9747 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -92,4 +92,12 @@ public interface ISysDictTypeService { * @return 结果 */ boolean checkDictTypeUnique(SysDictTypeBo dictType); + + /** + * 如果不存在则插入类型和数据 + * + * @param typeVo 字典类型 + * @param dictDataVos 字典数据 + */ + void insertIfNotExist(SysDictTypeVo typeVo, List dictDataVos); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index 1be0b7f40..661483655 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -255,4 +256,25 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService return StreamUtils.toMap(list, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); } + @Override + public void insertIfNotExist(SysDictTypeVo typeVo, List dictDataVos) { + SysDictTypeVo sysDictTypeVo = selectDictTypeByType(typeVo.getDictType()); + if (ObjectUtil.isNull(sysDictTypeVo)) { + SysDictTypeBo typeBo = BeanUtil.toBean(typeVo, SysDictTypeBo.class); + typeBo.setDictId(null); + typeBo.setCreateTime(null); + typeBo.setUpdateTime(null); + insertDictType(typeBo); + //筛选出dictType对应的data + List dataVos = StreamUtils.toList(StreamUtils.filter(dictDataVos, + sysDictDataVo -> typeVo.getDictType().equals(sysDictDataVo.getDictType())), + sysDictDataVo -> { + //设置字典编码为null + sysDictDataVo.setDictCode(null); + sysDictDataVo.setCreateTime(null); + return MapstructUtils.convert(sysDictDataVo, SysDictData.class); + }); + dictDataMapper.insertBatch(dataVos); + } + } }