| 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.api.util.LogUtils; | 
| 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> | 
|  * 字典表 服务实现类 | 
|  * </p> | 
|  * | 
|  * @author moral | 
|  * @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); | 
|         SysDictType type = sysDictTypeService.getDictTypeById(existData.getDictTypeId()); | 
|         //执行删除 | 
|         UpdateWrapper deleteWrapper = new UpdateWrapper(); | 
|         deleteWrapper.set("is_delete", Constants.DELETE); | 
|         deleteWrapper.eq("id", id); | 
|         sysDictDataMapper.update(null, deleteWrapper); | 
|         //插入日志 | 
|         StringBuilder content = new StringBuilder("删除了字典数据;"); | 
|         content.append("类型:" + type.getName() + "(" + type.getDesc() + ")" + ";"); | 
|         content.append("key:" + existData.getDataKey() + ";"); | 
|         content.append("value:" + existData.getDataValue() + ";"); | 
|         LogUtils.saveOperationForManage(content.toString(), Constants.DELETE_OPERATE_TYPE); | 
|         //刷新缓存 | 
|         refreshCache(); | 
|         //封装返回对象 | 
|         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); | 
|         SysDictType type = sysDictTypeService.getDictTypeById(existData.getDictTypeId()); | 
|         //判断key是否重复 | 
|         String key = sysDictData.getDataKey(); | 
|         if (!ObjectUtils.isEmpty(key)) { | 
|             QueryWrapper<SysDictData> wrapper = new QueryWrapper<>(); | 
|             wrapper.eq("is_delete", Constants.NOT_DELETE); | 
|             wrapper.eq("dataKey", key); | 
|             wrapper.eq("dict_type_id", existData.getDictTypeId()); | 
|             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.updateById(sysDictData); | 
|         //插入日志 | 
|         StringBuilder content = new StringBuilder("修改了字典数据;"); | 
|         content.append("类型:" + type.getName() + "(" + type.getDesc() + ")" + ";"); | 
|         content.append("key:" + existData.getDataKey() + ";"); | 
|         content.append("value:" + existData.getDataValue() + "->" + sysDictData.getDataValue() + ";"); | 
|         LogUtils.saveOperationForManage(content.toString(), Constants.UPDATE_OPERATE_TYPE); | 
|         //刷新缓存 | 
|         refreshCache(); | 
|         //封装返回结果 | 
|         dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); | 
|         dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); | 
|         return dto; | 
|     } | 
|   | 
|   | 
|     @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); | 
|         //插入日志 | 
|         StringBuilder content = new StringBuilder("添加了字典数据;"); | 
|         content.append("类型:" + type.getName() + "(" + type.getDesc() + ")" + ";"); | 
|         content.append("key:" + sysDictData.getDataKey() + ";"); | 
|         content.append("value:" + sysDictData.getDataValue() + ";"); | 
|         LogUtils.saveOperationForManage(content.toString(), Constants.INSERT_OPERATE_TYPE); | 
|         //刷新缓存 | 
|         refreshCache(); | 
|         //封装返回结果 | 
|         dto.setCode(ResponseCodeEnum.SUCCESS.getCode()); | 
|         dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg()); | 
|         return dto; | 
|     } | 
|   | 
|     @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; | 
|     } | 
|   | 
|   | 
|     @Override | 
|     public Map<String, SysDictData> getDictDatasByType(String type) { | 
|         Map<String, List<SysDictData>> allDictData = getAllDictData(); | 
|         List<SysDictData> sysDictDatas = allDictData.get(type); | 
|         Map<String, SysDictData> result = new HashMap<>(); | 
|         for (SysDictData sysDictData : sysDictDatas) { | 
|             result.put(sysDictData.getDataKey(), sysDictData); | 
|         } | 
|         return result; | 
|     } | 
|   | 
|     @Override | 
|     public void refreshCache() { | 
|         redisTemplate.delete(RedisConstants.DICT_DATA_KEY); | 
|         Map<String, List<SysDictData>> datas = getDictDataFromDB(); | 
|         redisTemplate.opsForValue().set(RedisConstants.DICT_DATA_KEY, 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()); | 
|             wrapper.orderByAsc("id"); | 
|             List<SysDictData> datas = sysDictDataMapper.selectList(wrapper); | 
|             result.put(type.getName(), datas); | 
|         } | 
|         return result; | 
|     } | 
| } |