kaiyu
2021-04-16 895136cb544ae2f46cd76d184ec14760e82353a7
screen-manage/src/main/java/com/moral/api/service/impl/SysDictDataServiceImpl.java
@@ -1,10 +1,30 @@
package com.moral.api.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.moral.api.entity.SysDictData;
import com.moral.api.entity.SysDictType;
import com.moral.api.mapper.SysDictDataMapper;
import com.moral.api.pojo.dto.sysDictData.SysDictDataDTO;
import com.moral.api.pojo.form.sysDictData.SysDictDataDeleteForm;
import com.moral.api.pojo.form.sysDictData.SysDictDataInsertForm;
import com.moral.api.pojo.form.sysDictData.SysDictDataUpdateForm;
import com.moral.api.service.SysDictDataService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.service.SysDictTypeService;
import com.moral.api.util.CacheUtils;
import com.moral.constant.Constants;
import com.moral.constant.RedisConstants;
import com.moral.constant.ResponseCodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -12,9 +32,159 @@
 * </p>
 *
 * @author moral
 * @since 2021-03-09
 * @since 2021-04-13
 */
@Service
public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDictData> implements SysDictDataService {
    @Autowired
    SysDictTypeService sysDictTypeService;
    @Autowired
    SysDictDataMapper sysDictDataMapper;
    @Autowired
    RedisTemplate redisTemplate;
    @Override
    @Transactional
    public SysDictDataDTO deleteData(SysDictDataDeleteForm form) {
        //创建返回对象
        SysDictDataDTO dto = new SysDictDataDTO();
        //取参
        Integer id = form.getId();
        //判断是否存在
        QueryWrapper existWrapper = new QueryWrapper();
        existWrapper.eq("is_delete",Constants.NOT_DELETE);
        existWrapper.eq("id",id);
        SysDictData existData = sysDictDataMapper.selectOne(existWrapper);
        //执行删除
        UpdateWrapper deleteWrapper = new UpdateWrapper();
        deleteWrapper.set("is_delete",Constants.DELETE);
        deleteWrapper.eq("id",id);
        sysDictDataMapper.update(null,deleteWrapper);
        //删除缓存
        CacheUtils.clearDictionariesCache();
        //封装返回对象
        dto.setSysDictData(existData);
        dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
        dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
        return dto;
    }
    @Override
    public SysDictDataDTO updateData(SysDictDataUpdateForm form) {
        SysDictDataDTO dto = new SysDictDataDTO();
        //取参
        SysDictData sysDictData = form.formConvertEntity();
        //查询数据是否存在
        QueryWrapper<SysDictData> existWrapper = new QueryWrapper<>();
        existWrapper.eq("is_delete", Constants.NOT_DELETE);
        existWrapper.eq("id", sysDictData.getId());
        SysDictData existData = sysDictDataMapper.selectOne(existWrapper);
        //执行更新
        sysDictDataMapper.updateById(sysDictData);
        //清除缓存
        CacheUtils.clearDictionariesCache();
        //封装返回结果
        dto.setSysDictData(sysDictData);
        dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
        dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
        return dto;
    }
    /**
     * @Description: 根据字典类型id插入字典类型数据
     * @Param: [form]
     * @return: com.moral.api.pojo.dto.sysDictData.SysDictDataDTO
     * @Author: 陈凯裕
     * @Date: 2021/4/16
     */
    @Override
    public SysDictDataDTO insertData(SysDictDataInsertForm form) {
        SysDictDataDTO dto = new SysDictDataDTO();
        //取参
        SysDictData sysDictData = form.formConvertEntity();
        //判断类型是否存在
        SysDictType type = sysDictTypeService.getDictTypeById(sysDictData.getDictTypeId());
        if (ObjectUtils.isEmpty(type)) {
            dto.setCode(ResponseCodeEnum.DICTTYPE_NOT_EXIST.getCode());
            dto.setMsg(ResponseCodeEnum.DICTTYPE_NOT_EXIST.getMsg());
            return dto;
        }
        //判断Key是否重复
        String key = sysDictData.getDataKey();
        QueryWrapper<SysDictData> wrapper = new QueryWrapper<>();
        wrapper.eq("is_delete", Constants.NOT_DELETE);
        wrapper.eq("dataKey", key);
        wrapper.eq("dict_type_id", type.getId());
        SysDictData existKeyData = sysDictDataMapper.selectOne(wrapper);
        if (!ObjectUtils.isEmpty(existKeyData)) {
            dto.setCode(ResponseCodeEnum.DICTDATA_KEY_EXIST.getCode());
            dto.setMsg(ResponseCodeEnum.DICTDATA_KEY_EXIST.getMsg());
            return dto;
        }
        //执行插入
        sysDictDataMapper.insert(sysDictData);
        //清除缓存
        CacheUtils.clearDictionariesCache();
        //封装返回结果
        dto.setSysDictData(sysDictData);
        dto.setSysDictType(type);
        dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
        dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
        return dto;
    }
    /**
     * @Description: 根据类型名字查询对应字典的数据
     * @Param: [typeName]
     * @return: java.util.Map<java.lang.String       ,       java.lang.Object>
     * @Author: 陈凯裕
     * @Date: 2021/4/16
     */
    @Override
    public Map<String, Object> queryDataByTypeName(String typeName) {
        Map<String, List<SysDictData>> datas = getAllDictData();
        //获取字典数据
        List<SysDictData> sysDictData = datas.get(typeName);
        //将字典数据进行封装 Map  key:dataKey  value:dataValue
        Map<String, Object> result = new HashMap<>();
        for (SysDictData data : sysDictData) {
            result.put(data.getDataKey(), data.getDataValue());
        }
        return result;
    }
    @Override
    public Map<String, List<SysDictData>> getAllDictData() {
        Map<String, List<SysDictData>> datas = new HashMap<>();
        //从缓存中读取
        datas = (Map<String, List<SysDictData>>) redisTemplate.opsForValue().get(RedisConstants.DICT_DATA_KEY);
        if (ObjectUtils.isEmpty(datas)) {//从数据库中读取
            datas = getDictDataFromDB();
            //插入缓存
            redisTemplate.opsForValue().set(RedisConstants.DICT_DATA_KEY, datas);
        }
        return datas;
    }
    /**
     * @Description: 从数据库中根据字典类型读取字典数据,返回Map  Key:类型名称 value:数据集合
     * @Param: []
     * @return: java.util.Map<java.lang.String               ,               java.util.List               <               com.moral.api.entity.sysDictData>>
     * @Author: 陈凯裕
     * @Date: 2021/4/14
     */
    private Map<String, List<SysDictData>> getDictDataFromDB() {
        Map<String, List<SysDictData>> result = new HashMap<>();
        List<SysDictType> types = sysDictTypeService.getAllDictType();
        for (SysDictType type : types) {
            QueryWrapper<SysDictData> wrapper = new QueryWrapper<>();
            wrapper.eq("is_delete", Constants.NOT_DELETE);
            wrapper.eq("dict_type_id", type.getId());
            List<SysDictData> datas = sysDictDataMapper.selectList(wrapper);
            result.put(type.getName(), datas);
        }
        return result;
    }
}