package com.zt.modules.sys.service; 
 | 
  
 | 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 
 | 
import com.baomidou.mybatisplus.core.toolkit.IdWorker; 
 | 
import com.zt.common.constant.CacheKey; 
 | 
import com.zt.common.constant.Constant; 
 | 
import com.zt.common.exception.ErrorCode; 
 | 
import com.zt.common.exception.RenException; 
 | 
import com.zt.common.service.BaseService; 
 | 
import com.zt.common.utils.CacheUtils; 
 | 
import com.zt.common.utils.CommonUtils; 
 | 
import com.zt.common.utils.TreeUtils; 
 | 
import com.zt.core.context.User; 
 | 
import com.zt.core.context.UserContext; 
 | 
import com.zt.core.dictionary.DictionaryParser; 
 | 
import com.zt.core.shiro.ImportUtil; 
 | 
import com.zt.core.sys.dto.DictDto; 
 | 
import com.zt.core.sys.dto.DictItemDto; 
 | 
import com.zt.core.sys.dto.DictLeafDto; 
 | 
import com.zt.core.sys.service.IDictTypeService; 
 | 
import com.zt.modules.sys.dao.SysDictDataDao; 
 | 
import com.zt.modules.sys.dao.SysDictTypeDao; 
 | 
import com.zt.modules.sys.dto.DictTypeDto; 
 | 
import com.zt.modules.sys.model.SysDictData; 
 | 
import com.zt.modules.sys.model.SysDictType; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
 | 
import org.apache.poi.ss.usermodel.Row; 
 | 
import org.apache.poi.ss.usermodel.Sheet; 
 | 
import org.apache.poi.ss.usermodel.Workbook; 
 | 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
import org.springframework.web.multipart.MultipartFile; 
 | 
  
 | 
import javax.annotation.Resource; 
 | 
import java.util.*; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 数据字典 
 | 
 * 
 | 
 * @author Mark sunlightcs@gmail.com 
 | 
 */ 
 | 
@Service 
 | 
public class SysDictTypeService extends BaseService<SysDictTypeDao, SysDictType> implements IDictTypeService { 
 | 
    @Autowired 
 | 
    private SysDictDataService sysDictDataService; 
 | 
    @Resource 
 | 
    private DictionaryParser dictionaryParser; 
 | 
    @Autowired 
 | 
    private SysDictDataDao sysDictDataDao; 
 | 
  
 | 
    public List<SysDictType> tree() { 
 | 
        User user = UserContext.getUser(); 
 | 
        if (Constant.Sys.PLATFORM_TENANT_ID.equals(user.getTenantId())) {// 平台的 
 | 
            List<SysDictType> dictTypes = baseDao.selectList(new QueryWrapper<SysDictType>().eq( 
 | 
                    Constant.TableColumn.IS_DELETE, Constant.Bool.NO).eq(Constant.TableColumn.TENANT_ID, 
 | 
                    Constant.Sys.PLATFORM_TENANT_ID)); 
 | 
  
 | 
            // 这个地方有缓存 
 | 
            for (SysDictType dictType : dictTypes) { 
 | 
                dictType.getChildren().clear(); 
 | 
            } 
 | 
            return TreeUtils.build(dictTypes); 
 | 
        } else {// 租户的 
 | 
            // 查询租户和平台的 
 | 
            List<SysDictType> list = baseDao.selectList(new QueryWrapper<SysDictType>() 
 | 
                    .eq(Constant.TableColumn.IS_DELETE, Constant.Bool.NO) 
 | 
                    .eq("is_can_view", Constant.Bool.YES) 
 | 
/*                    .in(Constant.TableColumn.TENANT_ID, 
 | 
                            new Long[] { Constant.Sys.PLATFORM_TENANT_ID, user.getTenantId() })*/ 
 | 
                    .orderByAsc("sort", "dict_type", Constant.TableColumn.TENANT_ID)); 
 | 
            // 这个地方有缓存 
 | 
            for (SysDictType dictType : list) { 
 | 
                dictType.getChildren().clear(); 
 | 
            } 
 | 
            final List<SysDictType> tree = TreeUtils.build(list); 
 | 
            // 过滤:租户的;平台,不存在租户有相同字典类型的 
 | 
            return tree 
 | 
                    .stream() 
 | 
                    .filter(type -> !Constant.Sys.PLATFORM_TENANT_ID.equals(type.getTenantId()) 
 | 
                            || tree.stream() 
 | 
                            .filter(t -> !t.getId().equals(type.getId()) 
 | 
                                    && t.getDictType().equals(type.getDictType())).count() == 0) 
 | 
                    .collect(Collectors.toList()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public List<Map<String, Object>> importDataDictExcel(MultipartFile mutFile, String progressId) { 
 | 
        int count = 0; 
 | 
        Date beginDate = new Date(); 
 | 
        List<Map<String, Object>> list = new ArrayList<>();//存储所有的导入状态 
 | 
        Map<String, Object> map;//存储每一行的状态 
 | 
        Integer sum = 0; // 总共的条数 
 | 
        Integer suc = 0; // 成功的条数 
 | 
        Integer err = 0; // 失败的条数 
 | 
        int row1 = 0; 
 | 
        Map<String, Object> errMap = new HashMap<>(); 
 | 
        List<DictTypeDto> batchList = new ArrayList<>(); 
 | 
        ArrayList<DictTypeDto> batchUpdateList = new ArrayList<>(); 
 | 
        try { 
 | 
            // 获取导入文件的后缀名 
 | 
            String fileName = mutFile.getOriginalFilename(); 
 | 
            Workbook workbook = null; 
 | 
            //解决excel版本问题 
 | 
            if (fileName != null && fileName.endsWith(".xls")) { 
 | 
                workbook = new HSSFWorkbook(mutFile.getInputStream()); 
 | 
            } else if (fileName != null && fileName.endsWith(".xlsx")) { 
 | 
                workbook = new XSSFWorkbook(mutFile.getInputStream()); 
 | 
            } 
 | 
            assert workbook != null; //断言如果[boolean表达式]为true,则程序继续执行。 如果为false,则程序抛出AssertionError,并终止执行。 
 | 
            int sheets = workbook.getNumberOfSheets(); 
 | 
  
 | 
            //List<LifeManagement> lifeManagementList = new ArrayList<LifeManagement>(); 
 | 
            if (sheets == 1) { 
 | 
                Map<String, DictTypeDto> maxCodeMap = new HashMap<String, DictTypeDto>(); 
 | 
                List<DictTypeDto> listMaxCode = baseDao.getMaxSortList2(); 
 | 
                for (DictTypeDto item : listMaxCode 
 | 
                ) { 
 | 
                    String key = item.getDictType(); 
 | 
                    maxCodeMap.put(key, item); 
 | 
                } 
 | 
                int typeSort = 0; 
 | 
                for (int i = 0; i < sheets; i++) { 
 | 
                    Sheet sheet = workbook.getSheetAt(i); 
 | 
                    int num = sheet.getLastRowNum(); // 一共有多少行 
 | 
                    String sheetName = sheet.getSheetName(); //获取当前sheet名称 
 | 
                    for (int j = 1; j <= num; j++) { 
 | 
                        CacheUtils.put(progressId, "speed", CommonUtils.getPercent(j, num)); 
 | 
                        CacheUtils.put(progressId, "msg", "共" + num + "行,已完成第" + j + "行"); 
 | 
                        DictTypeDto lifeManagement = new DictTypeDto(); 
 | 
                        boolean isErr = false; 
 | 
                        row1 = j + 1; 
 | 
                        String pattern = "yyyy-MM-dd"; 
 | 
                        Row row = sheet.getRow(row1); 
 | 
                        String dictName = ImportUtil.getCellValue(row, 0, pattern); //字典名称 
 | 
                        String dictType = ImportUtil.getCellValue(row, 1, pattern); //字典类型 
 | 
                        String dictLabel = ImportUtil.getCellValue(row, 2, pattern); //字典标签 
 | 
  
 | 
                        if (StringUtils.isEmpty(dictName)) { 
 | 
                            ImportUtil.updateErrMap(errMap, "没有填写字典名称!", sheetName, row1); 
 | 
                            continue; 
 | 
                        } 
 | 
                        if (StringUtils.isEmpty(dictType)) { 
 | 
                            ImportUtil.updateErrMap(errMap, "没有填写字典类型!", sheetName, row1); 
 | 
                            continue; 
 | 
                        } 
 | 
                        if (StringUtils.isEmpty(dictLabel)) { 
 | 
                            ImportUtil.updateErrMap(errMap, "没有填写字典标签!", sheetName, row1); 
 | 
                            continue; 
 | 
                        } 
 | 
  
 | 
                        if (maxCodeMap.get(dictType) == null) { 
 | 
                            SysDictType typeEntity = new SysDictType(); 
 | 
                            typeEntity.setDictType(dictType); 
 | 
                            typeEntity.setDictName(dictName); 
 | 
                            typeSort++; 
 | 
                            typeEntity.setSort(typeSort); 
 | 
                            typeEntity.setDelete(false); 
 | 
                            typeEntity.setCanView(true); 
 | 
                            baseDao.insert(typeEntity); 
 | 
                            // 
 | 
                            DictTypeDto dm = new DictTypeDto(); 
 | 
                            dm.setDictName(dictName); 
 | 
                            dm.setDictType(dictType); 
 | 
                            dm.setDictTypeId(typeEntity.getId()); 
 | 
                            dm.setSort(0); 
 | 
                            maxCodeMap.put(dictType, dm); 
 | 
                        } else { 
 | 
                           System.out.println("已有数据"); 
 | 
                        } 
 | 
                        int itemSort = maxCodeMap.get(dictType).getSort() + 1; 
 | 
                        maxCodeMap.get(dictType).setSort(itemSort); 
 | 
  
 | 
                        SysDictData itemEntity = new SysDictData(); 
 | 
                        itemEntity.setDictTypeId(maxCodeMap.get(dictType).getDictTypeId()); 
 | 
                        itemEntity.setDictLabel(dictLabel); 
 | 
                        itemEntity.setDictValue(itemSort); 
 | 
                        itemEntity.setSort(itemSort); 
 | 
                        itemEntity.setDelete(false); 
 | 
                        sysDictDataDao.insert(itemEntity); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            e.printStackTrace(); 
 | 
            ImportUtil.updateErrMap(errMap, "导入异常" + e.getMessage(), "", row1); 
 | 
            //err++; 
 | 
        } 
 | 
      /*  if (batchList.size() > 0 && err == 0) { 
 | 
            super.insertBatch(batchList, 100); 
 | 
            baseDao.updateOldId(); 
 | 
        } 
 | 
        if (batchUpdateList.size() > 0) { 
 | 
            super.updateBatch(batchUpdateList, 100); 
 | 
        }*/ 
 | 
        Date nowDate = new Date(); 
 | 
        String msg = "字典导入时间:" + CommonUtils.getDatePoor(nowDate, beginDate) + "\r\n"; 
 | 
        System.out.println(msg); 
 | 
        suc = sum - err; 
 | 
        map = new HashMap<>(); 
 | 
        map.put("sum", sum + ""); // 所有导入的条数 
 | 
        map.put("suc", suc + ""); // 成功的条数 
 | 
        map.put("err", err + ""); // 失败的条数 
 | 
        list.add(map); 
 | 
        list.add(errMap); 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void insert(SysDictType entity) { 
 | 
        // 判断父节点不允许拥有字典列表 
 | 
        if (sysDictDataService.getByType(entity.getPid()).size() > 0) { 
 | 
            throw new RenException("请先删除父节点字典列表!"); 
 | 
        } 
 | 
        if (entity.getPid() == null) {// 根节点,同一个租户下同一个父类型下不能重复 
 | 
            entity.setPid(Constant.Sys.DICT_ROOT); 
 | 
        } 
 | 
  
 | 
        this.validateCode(entity); // code校验 
 | 
  
 | 
        if (!UserContext.getUser().isPlatform()) {// 租户 
 | 
            // 租户新增根类型,判断是否存在平台定义了不能重载的 
 | 
            if (Constant.Sys.DICT_ROOT.equals(entity.getPid())) { 
 | 
                if (baseDao.selectList( 
 | 
                        new QueryWrapper<SysDictType>().eq(Constant.TableColumn.IS_DELETE, Constant.Bool.NO) 
 | 
                                .eq("is_can_view", Constant.Bool.YES).eq("is_can_overload", Constant.Bool.NO).lambda() 
 | 
                                .eq(SysDictType::getTenantId, Constant.Sys.PLATFORM_TENANT_ID) 
 | 
                                .eq(SysDictType::getPid, Constant.Sys.DICT_ROOT) 
 | 
                                .eq(SysDictType::getDictType, entity.getDictType())).size() > 0) { 
 | 
                    throw new RenException("该字典类型不允许重载"); 
 | 
                } 
 | 
            } 
 | 
            entity.setCanView(true);// 租户添加的,设置为可见 
 | 
        } else {// 平台 
 | 
            if (!entity.isCanView()) {// 租户不可见 
 | 
                entity.setCanOverload(false); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        super.insert(entity); 
 | 
  
 | 
        CacheUtils.remove(Constant.Cache.SYS, CacheKey.SYS_DICT);// 清除缓存 
 | 
    } 
 | 
  
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void update(SysDictType entity) { 
 | 
        SysDictType tmp = baseDao.selectById(entity.getId()); 
 | 
        if (tmp == null) { 
 | 
            throw new RenException("查询信息失败"); 
 | 
        } 
 | 
        List<SysDictType> all = baseDao.selectList(new QueryWrapper<SysDictType>().eq(Constant.TableColumn.IS_DELETE, 
 | 
                Constant.Bool.NO)); 
 | 
        TreeUtils.updateValidate(all, entity, tmp); 
 | 
        if (!entity.getPid().equals(tmp.getPid())) { 
 | 
            // 判断父节点不允许拥有字典列表 
 | 
            if (sysDictDataService.getByType(entity.getPid()).size() > 0) { 
 | 
                throw new RenException("请先删除父节点字典列表!"); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        this.validateCode(entity); // code校验 
 | 
  
 | 
        if (UserContext.getUser().isPlatform() && !entity.isCanView()) {// 平台,租户不可见,设置为不可重载 
 | 
            entity.setCanOverload(false); 
 | 
        } 
 | 
  
 | 
        super.update(entity); 
 | 
  
 | 
        CacheUtils.remove(Constant.Cache.SYS, CacheKey.SYS_DICT);// 清除缓存 
 | 
    } 
 | 
  
 | 
    private void validateCode(SysDictType entity) { 
 | 
        if (Constant.Sys.DICT_ROOT.equals(entity.getPid())) { 
 | 
            // 同一个租户下同一个父类型下不能重复 
 | 
            LambdaQueryWrapper<SysDictType> queryWrapper = new QueryWrapper<SysDictType>() 
 | 
                    .eq(Constant.TableColumn.IS_DELETE, Constant.Bool.NO).lambda() 
 | 
                    .eq(SysDictType::getTenantId, UserContext.getUser().getTenantId()) 
 | 
                    .eq(SysDictType::getPid, entity.getPid()).eq(SysDictType::getDictType, entity.getDictType()); 
 | 
            if (entity.getId() != null && entity.getId() > 0) { // 修改 
 | 
                queryWrapper.ne(SysDictType::getId, entity.getId()); 
 | 
            } 
 | 
            if (baseDao.selectList(queryWrapper).size() > 0) { 
 | 
                throw new RenException("字典类型重复"); 
 | 
            } 
 | 
        } else { 
 | 
            List<SysDictType> tree = this.tree(); 
 | 
            SysDictType root = TreeUtils.getTreeRoot(TreeUtils.toList(tree), entity.getPid(), Constant.Sys.DICT_ROOT); 
 | 
            if (root == null) { 
 | 
                throw new RenException("获取字典类型失败"); 
 | 
            } 
 | 
            List<SysDictType> treeList = TreeUtils.toList(tree.stream() 
 | 
                    .filter(type -> type.getId().equals(root.getId())).collect(Collectors.toList()).get(0)); 
 | 
            if (treeList 
 | 
                    .stream() 
 | 
                    .filter(type -> !type.getId().equals(entity.getId()) 
 | 
                            && type.getDictType().equals(entity.getDictType())).count() > 0) { 
 | 
                throw new RenException("字典类型重复"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void delete(Long id) { 
 | 
        // 字典类型只支持单个删除 
 | 
        if (baseDao.selectList( 
 | 
                new QueryWrapper<SysDictType>().eq(Constant.TableColumn.IS_DELETE, Constant.Bool.NO).lambda() 
 | 
                        .eq(SysDictType::getPid, id)).size() > 0) { 
 | 
            throw new RenException("请先删除下级节点!"); 
 | 
        } 
 | 
        super.deleteLogic(id); 
 | 
  
 | 
        CacheUtils.remove(Constant.Cache.SYS, CacheKey.SYS_DICT);// 清除缓存 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 用户字典 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public List<DictDto> getUserDicts() { 
 | 
        Map<Long, List<DictDto>> cache = (Map<Long, List<DictDto>>) CacheUtils.get(Constant.Cache.SYS, 
 | 
                CacheKey.SYS_DICT); 
 | 
  
 | 
        Long tenantId = UserContext.getUser().getTenantId(); 
 | 
        if (cache != null && cache.containsKey(tenantId)) { 
 | 
            return cache.get(tenantId); 
 | 
        } else { 
 | 
            List<DictDto> typeList = new ArrayList<>(); 
 | 
            typeList.addAll(this.getChildren(this.tree())); 
 | 
            typeList.addAll(this.getChildren2(this.tree())); 
 | 
            if (cache == null) { 
 | 
                cache = new HashMap<>(); 
 | 
            } 
 | 
            cache.put(tenantId, typeList); 
 | 
            CacheUtils.put(Constant.Cache.SYS, CacheKey.SYS_DICT, cache); 
 | 
  
 | 
            return typeList; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private List<DictDto> getChildren2(List<SysDictType> children) { 
 | 
        List<DictDto> list = new ArrayList<>(); 
 | 
        for (SysDictType type1 : children) { 
 | 
            if (type1.getChildren().size() > 0) {// 存在子类型 
 | 
                for (SysDictType type : type1.getChildren()) { 
 | 
                    DictDto dto; 
 | 
                    dto = new DictLeafDto(type.getDictType(), type.getDictName()); 
 | 
                    List<SysDictData> datas = sysDictDataService.getByType(type.getId()); 
 | 
                    if (datas.size() > 0) { 
 | 
                        for (SysDictData data : datas) { 
 | 
                            DictItemDto itemDto = new DictItemDto(data.getDictLabel(), String.valueOf(data.getDictValue()), data.getRemark()); 
 | 
                            ((DictLeafDto) dto).getDataList().add(itemDto); 
 | 
                        } 
 | 
                        list.add(dto); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    private List<DictDto> getChildren(List<SysDictType> children) { 
 | 
        List<DictDto> list = new ArrayList<>(); 
 | 
  
 | 
        for (SysDictType type : children) { 
 | 
            DictDto dto; 
 | 
            if (type.getChildren().size() > 0) {// 存在子类型 
 | 
                dto = new DictDto(type.getDictType(), type.getDictName()); 
 | 
                dto.getChildren().addAll(getChildren(type.getChildren()));// 设置子类型 
 | 
            } else {// 叶子节点 
 | 
                dto = new DictLeafDto(type.getDictType(), type.getDictName()); 
 | 
                List<SysDictData> datas = sysDictDataService.getByType(type.getId()); 
 | 
                for (SysDictData data : datas) { 
 | 
                    DictItemDto itemDto = new DictItemDto(data.getDictLabel(), String.valueOf(data.getDictValue()),data.getRemark()); 
 | 
                    ((DictLeafDto) dto).getDataList().add(itemDto); 
 | 
                } 
 | 
            } 
 | 
            list.add(dto); 
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取字段,包括常量字典 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public List<DictDto> getDicts() { 
 | 
        List<DictDto> list = new ArrayList<>(); 
 | 
        list.addAll(this.getUserDicts()); 
 | 
        list.addAll(dictionaryParser.getConstantDicts()); 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 租户拷贝 
 | 
     * 
 | 
     * @param id 
 | 
     */ 
 | 
    public void copyData(Long id) { 
 | 
        SysDictType dictType = this.tree().stream().filter(type -> type.getId().equals(id)).findFirst().get(); 
 | 
        if (!Constant.Sys.PLATFORM_TENANT_ID.equals(dictType.getTenantId())) { 
 | 
            throw new RenException(ErrorCode.DATA_ERROR); 
 | 
        } 
 | 
        if (!dictType.isCanOverload()) { 
 | 
            throw new RenException("该字典类型不能重载"); 
 | 
        } 
 | 
        // 这里不会和自己定义的重复 
 | 
        if (baseDao.selectList( 
 | 
                new QueryWrapper<SysDictType>().eq(Constant.TableColumn.IS_DELETE, Constant.Bool.NO).lambda() 
 | 
                        .eq(SysDictType::getTenantId, UserContext.getUser().getTenantId()) 
 | 
                        .eq(SysDictType::getPid, dictType.getPid()) 
 | 
                        .eq(SysDictType::getDictType, dictType.getDictType())).size() > 0) { 
 | 
            throw new RenException(ErrorCode.DATA_ERROR); 
 | 
        } 
 | 
  
 | 
        List<SysDictType> list = TreeUtils.toList(dictType); 
 | 
        // 1、修改id 
 | 
        Map<Long, Long> idMap = new HashMap<>(); 
 | 
        for (SysDictType type : list) { 
 | 
            Long oldId = type.getId(); 
 | 
            type.setId(IdWorker.getId());// 设置新的id 
 | 
            idMap.put(oldId, type.getId()); 
 | 
        } 
 | 
        // 2、修改父Id、租户 
 | 
        User user = UserContext.getUser(); 
 | 
        for (SysDictType type : list) { 
 | 
            if (!Constant.Sys.DICT_ROOT.equals(type.getPid())) { 
 | 
                Long pid = idMap.get(type.getPid()); 
 | 
                if (pid == null) { 
 | 
                    throw new RenException(ErrorCode.DATA_ERROR); 
 | 
                } 
 | 
                type.setPid(pid);// 设置新的pid 
 | 
            } 
 | 
            type.setTenantId(user.getTenantId()); 
 | 
            type.getChildren().clear(); 
 | 
        } 
 | 
        // 3、保存字段类型 
 | 
        super.insertBatch(list, 100); 
 | 
  
 | 
        // 4、拷贝字段值 
 | 
        List<SysDictData> datas = sysDictDataService.getByTypes(idMap.keySet()); 
 | 
        for (SysDictData data : datas) { 
 | 
            Long dictTypeId = idMap.get(data.getDictTypeId()); 
 | 
            if (dictTypeId == null) { 
 | 
                throw new RenException(ErrorCode.DATA_ERROR); 
 | 
            } 
 | 
            data.setId(null); 
 | 
            data.setDictTypeId(dictTypeId);// 设置新的id 
 | 
            data.setTenantId(user.getTenantId()); 
 | 
        } 
 | 
        sysDictDataService.insertBatch(datas, 100); 
 | 
  
 | 
        CacheUtils.remove(Constant.Cache.SYS, CacheKey.SYS_DICT);// 清除缓存 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取字典类型 
 | 
     * 
 | 
     * @param dictType 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public DictDto getByDictType(String dictType) { 
 | 
        List<DictDto> list = this.getDicts().stream().filter(dict -> dict.getDictType().equals(dictType)) 
 | 
                .collect(Collectors.toList()); 
 | 
        return list.size() > 0 ? list.get(0) : null; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取字典值 
 | 
     * 
 | 
     * @param dictType 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public List<DictItemDto> getDictItemsByDictType(String dictType) { 
 | 
        List<DictItemDto> list = new ArrayList<>(); 
 | 
        DictDto dict = this.getByDictType(dictType); 
 | 
        if (dict != null) { 
 | 
            if (dict instanceof DictLeafDto) { 
 | 
                list.addAll(((DictLeafDto) dict).getDataList()); 
 | 
            } else { 
 | 
                List<DictDto> treeList = TreeUtils.toList(dict.getChildren()); 
 | 
                for (DictDto dto : treeList) { 
 | 
                    if (dto instanceof DictLeafDto) { 
 | 
                        list.addAll(((DictLeafDto) dto).getDataList()); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return list; 
 | 
    } 
 | 
  
 | 
    public Map<String, String> getMapDict(Boolean idToNme, String dictType) { 
 | 
        List<DictItemDto> list = getDictItemsByDictType(dictType); 
 | 
  
 | 
        Map<String, String> result = new HashMap<>(); 
 | 
        for (DictItemDto item : list) { 
 | 
            if (idToNme) 
 | 
                result.put(item.getDictValue().toString(), item.getDictLabel()); 
 | 
            else 
 | 
                result.put(item.getDictLabel(), item.getDictValue().toString()); 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 获取字典(树)的所有字典值 
 | 
     * 
 | 
     * @param dictTypeId 
 | 
     * @return 
 | 
     */ 
 | 
    public List<DictItemDto> getDictItemsOfDictTree(Long dictTypeId) { 
 | 
        SysDictType type = TreeUtils.getTreeRoot(TreeUtils.toList(this.tree()), dictTypeId, Constant.Sys.DICT_ROOT); 
 | 
        if (type == null) { 
 | 
            throw new RenException("字典类型不存在!"); 
 | 
        } 
 | 
        return this.getDictItemsByDictType(type.getDictType()); 
 | 
    } 
 | 
} 
 |