Browse Source

1、创建租户自动初始化预定义的租户字典数据

dongpo 6 months ago
parent
commit
17ec70dabe

+ 2 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/dicttenant/dto/DictDataTenantRespDTO.java

@@ -1,8 +1,10 @@
 package cn.iocoder.yudao.module.system.api.dicttenant.dto;
 
+import lombok.Builder;
 import lombok.Data;
 
 @Data
+@Builder
 public class DictDataTenantRespDTO {
 
     /**

+ 63 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/dicttenant/DictTypeTenantEnum.java

@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.system.enums.dicttenant;
+
+import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
+import cn.iocoder.yudao.module.system.api.dicttenant.dto.DictDataTenantRespDTO;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 租户字典类型枚举
+ */
+public enum DictTypeTenantEnum {
+
+    BPM_OA_LEAVE_TYPE_TENANT("bpm_oa_leave_type_tenant", "请假类型");
+
+    private final String type;
+    private final String label;
+
+    DictTypeTenantEnum(String type, String label) {
+        this.type = type;
+        this.label = label;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    /**
+     * 根据类型,获得字典标签
+     */
+    public static String getLabel(String type) {
+        for (DictTypeTenantEnum dictTypeEnum : values()) {
+            if (dictTypeEnum.getType().equals(type)) {
+                return dictTypeEnum.getLabel();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 根据类型,获得字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据
+     */
+    public static List<DictDataTenantRespDTO> getDictData(String dictType) {
+        List<DictDataTenantRespDTO> dictDataList = new ArrayList<>();
+        if (DictTypeTenantEnum.BPM_OA_LEAVE_TYPE_TENANT.getType().equals(dictType)) {
+            dictDataList.add(DictDataTenantRespDTO.builder().dictType(dictType).label("事假").build());
+            dictDataList.add(DictDataTenantRespDTO.builder().dictType(dictType).label("年假").build());
+            dictDataList.add(DictDataTenantRespDTO.builder().dictType(dictType).label("病假").build());
+            dictDataList.add(DictDataTenantRespDTO.builder().dictType(dictType).label("婚假").build());
+            dictDataList.add(DictDataTenantRespDTO.builder().dictType(dictType).label("产假").build());
+            dictDataList.add(DictDataTenantRespDTO.builder().dictType(dictType).label("陪产假").build());
+        }
+
+        return dictDataList;
+    }
+}

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/dicttenant/DictDataApiImpl.java

@@ -12,7 +12,7 @@ import java.util.Collections;
 import java.util.List;
 
 @Service
-public class DictDataApiImpl implements DictDataTenantApi {
+public class DictDataTenantApiImpl implements DictDataTenantApi {
 
     @Resource
     private DictDataTenantService dictDataTenantService;

+ 11 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dictTenant/DictTypeTenantController.java

@@ -104,10 +104,21 @@ public class DictTypeTenantController {
     }
 
     @GetMapping(value = {"/list-all-simple", "simple-list"})
+    @ApiOperationSupport(order = 7)
     @Operation(summary = "获得全部字典类型列表", description = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项")
     // 无需添加权限认证,因为前端全局都需要
     public CommonResult<List<DictTypeSimpleRespVO>> getSimpleDictTypeList() {
         List<DictTypeTenantDO> list = dictTypeTenantService.getDictTypeList();
         return success(BeanUtils.toBean(list, DictTypeSimpleRespVO.class));
     }
+
+    @GetMapping("/initDictTypeAndDataForTenant")
+    @Operation(summary = "初始化租户字典类型数据")
+    @Parameter(name = "dictType", description = "字典类型", required = false)
+    @ApiOperationSupport(order = 8)
+    public CommonResult<Map<String, String>> initDictTypeAndDataForTenant(@RequestParam(value = "dictType", required = false) String dictType) {
+        Map<String, String> result = dictTypeTenantService.initDictTypeAndDataForTenant(dictType);
+        return success(result);
+    }
+
 }

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dictTenant/DictDataTenantService.java

@@ -115,4 +115,9 @@ public interface DictDataTenantService {
      */
     List<DictDataTenantDO> getDictDataListByDictType(String dictType);
 
+    /**
+     * 批量插入字典数据
+     */
+    Integer insertBatch(List<DictDataTenantDO> dictDataTenantDOList);
+
 }

+ 18 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dictTenant/DictDataTenantServiceImpl.java

@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.system.controller.admin.dictTenant.vo.data.DictDa
 import cn.iocoder.yudao.module.system.dal.dataobject.dictTenant.DictDataTenantDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dictTenant.DictTypeTenantDO;
 import cn.iocoder.yudao.module.system.dal.mysql.dictTenant.DictDataTenantMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.annotations.VisibleForTesting;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -201,4 +202,21 @@ public class DictDataTenantServiceImpl implements DictDataTenantService {
         return list;
     }
 
+    @Override
+    public Integer insertBatch(List<DictDataTenantDO> dictDataTenantDOList) {
+        Integer count = 0;
+        for (DictDataTenantDO dictDataTenantDO : dictDataTenantDOList) {
+            LambdaQueryWrapper<DictDataTenantDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(DictDataTenantDO::getDictType, dictDataTenantDO.getDictType());
+            lambdaQueryWrapper.eq(DictDataTenantDO::getLabel, dictDataTenantDO.getLabel());
+            if (dictDataTenantMapper.selectCount(lambdaQueryWrapper) == 0) {
+                dictDataTenantMapper.insert(dictDataTenantDO);
+                dictDataTenantDO.setValue(String.valueOf(dictDataTenantDO.getId()));
+                dictDataTenantMapper.updateById(dictDataTenantDO);
+                count++;
+            }
+        }
+       return count;
+    }
+
 }

+ 8 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dictTenant/DictTypeTenantService.java

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dictTenant.DictTypeTenantDO;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 租户字典类型 Service 接口
@@ -70,4 +71,11 @@ public interface DictTypeTenantService {
      */
     List<DictTypeTenantDO> getDictTypeList();
 
+    /**
+     * 初始化租户字典类型数据
+     *
+     * @param dictType 字典类型
+     * @return 字典类型数据
+     */
+    Map<String, String> initDictTypeAndDataForTenant(String dictType);
 }

+ 71 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dictTenant/DictTypeTenantServiceImpl.java

@@ -2,21 +2,32 @@ package cn.iocoder.yudao.module.system.service.dictTenant;
 
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
+import cn.iocoder.yudao.module.system.api.dicttenant.dto.DictDataTenantRespDTO;
 import cn.iocoder.yudao.module.system.controller.admin.dictTenant.vo.type.DictTypeTenantPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.dictTenant.vo.type.DictTypeTenantSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.dictTenant.DictDataTenantDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dictTenant.DictTypeTenantDO;
 import cn.iocoder.yudao.module.system.dal.mysql.dictTenant.DictTypeTenantMapper;
+import cn.iocoder.yudao.module.system.enums.dicttenant.DictTypeTenantEnum;
 import com.google.common.annotations.VisibleForTesting;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
+
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
@@ -94,6 +105,66 @@ public class DictTypeTenantServiceImpl implements DictTypeTenantService {
         return dictTypeTenantMapper.selectList();
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, String> initDictTypeAndDataForTenant(String dictType) {
+
+        Map<String, String> result = new HashMap<>();
+
+        // 所有租户字典类型枚举
+        List<DictTypeTenantEnum> dictTypeTenantEnumList = Stream.of(DictTypeTenantEnum.values()).collect(Collectors.toList());
+        // 所有租户字典类型值
+        List<String> dictTypeList = dictTypeTenantEnumList.stream().map(DictTypeTenantEnum::getType).collect(Collectors.toList());
+
+        if (StrUtil.isNotBlank(dictType)) {
+            if (dictTypeList.contains(dictType)) {
+                // 查询当前租户有没有添加该类型
+                DictTypeTenantDO dictTypeTenantDO = dictTypeTenantMapper.selectByType(dictType);
+                if (dictTypeTenantDO == null) {
+                    // 添加类型和数据
+                    DictTypeTenantDO build = DictTypeTenantDO.builder()
+                            .type(dictType)
+                            .name(DictTypeTenantEnum.getLabel(dictType))
+                            .build();
+                    dictTypeTenantMapper.insert(build);
+
+                    List<DictDataTenantRespDTO> dictData = DictTypeTenantEnum.getDictData(dictType);
+                    List<DictDataTenantDO> dictDataTenantDOList = BeanUtils.toBean(dictData, DictDataTenantDO.class);
+                    dictDataTenantService.insertBatch(dictDataTenantDOList);
+                    result.put(dictType + ":" + TenantContextHolder.getTenantId(), "添加成功");
+                } else {
+                    result.put(dictType + ":" + TenantContextHolder.getTenantId(), "已存在");
+                }
+            } else {
+                result.put(dictType + ":" + TenantContextHolder.getTenantId(), "不是预定义的类型");
+            }
+        } else {
+            for (DictTypeTenantEnum dictTypeTenantEnum : dictTypeTenantEnumList) {
+                dictType = dictTypeTenantEnum.getType();
+                // 查询当前租户有没有添加该类型
+                DictTypeTenantDO dictTypeTenantDO = dictTypeTenantMapper.selectByType(dictType);
+                if (dictTypeTenantDO == null) {
+                    // 添加类型和数据
+                    DictTypeTenantDO build = DictTypeTenantDO.builder()
+                            .type(dictType)
+                            .name(DictTypeTenantEnum.getLabel(dictType))
+                            .build();
+                    dictTypeTenantMapper.insert(build);
+
+                    List<DictDataTenantRespDTO> dictData = DictTypeTenantEnum.getDictData(dictType);
+                    List<DictDataTenantDO> dictDataTenantDOList = BeanUtils.toBean(dictData, DictDataTenantDO.class);
+                    dictDataTenantService.insertBatch(dictDataTenantDOList);
+
+                    result.put(dictTypeTenantEnum.getType() + ":" + TenantContextHolder.getTenantId(), "添加成功");
+                } else {
+                    result.put(dictTypeTenantEnum.getType() + ":" + TenantContextHolder.getTenantId(), "已存在");
+                }
+            }
+        }
+
+        return result;
+    }
+
 
     @VisibleForTesting
     void validateDictTypeNameUnique(Long id, String name) {

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/tenant/TenantServiceImpl.java

@@ -50,6 +50,7 @@ import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;
 import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum;
 import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum;
 import cn.iocoder.yudao.module.system.service.auth.AdminAuthService;
+import cn.iocoder.yudao.module.system.service.dictTenant.DictTypeTenantService;
 import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
 import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
 import cn.iocoder.yudao.module.system.service.permission.MenuService;
@@ -122,6 +123,8 @@ public class TenantServiceImpl implements TenantService {
     private MenuTenantRelateService menuTenantRelateService;
     @Resource
     private BpmModelApi bpmModelApi;
+    @Resource
+    private DictTypeTenantService dictTypeTenantService;
 
     @Override
     public List<Long> getTenantIdList() {
@@ -201,6 +204,8 @@ public class TenantServiceImpl implements TenantService {
             tenantMapper.updateById(new TenantDO().setId(tenant.getId()).setContactUserId(user.getId()));
             // 复制部署流程(目前共12个)
             bpmModelApi.copyAndDeploy(null, null);
+            // 添加租户字典默认类型和数据
+            dictTypeTenantService.initDictTypeAndDataForTenant(null);
         });
         TenantSimpleRespVO tenantSimpleRespVO = new TenantSimpleRespVO();
         tenantSimpleRespVO.setId(tenant.getId());