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; /** *

* 字典表 服务实现类 *

* * @author moral * @since 2021-04-13 */ @Service public class SysDictDataServiceImpl extends ServiceImpl implements SysDictDataService { @Autowired SysDictTypeService sysDictTypeService; @Autowired SysDictDataMapper sysDictDataMapper; @Autowired RedisTemplate redisTemplate; @Autowired LogUtils logUtils; @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 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 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 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 queryDataByTypeName(String typeName) { Map> datas = getAllDictData(); //获取字典数据 List sysDictData = datas.get(typeName); //将字典数据进行封装 Map key:dataKey value:dataValue Map result = new HashMap<>(); for (SysDictData data : sysDictData) { result.put(data.getDataKey(), data.getDataValue()); } return result; } @Override public Map> getAllDictData() { Map> datas = new HashMap<>(); //从缓存中读取 datas = (Map>) 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 getDictDatasByType(String type) { Map> allDictData = getAllDictData(); List sysDictDatas = allDictData.get(type); Map 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> datas = getDictDataFromDB(); redisTemplate.opsForValue().set(RedisConstants.DICT_DATA_KEY, datas); } /** * @Description: 从数据库中根据字典类型读取字典数据,返回Map Key:类型名称 value:数据集合 * @Param: [] * @return: java.util.Map> * @Author: 陈凯裕 * @Date: 2021/4/14 */ private Map> getDictDataFromDB() { Map> result = new HashMap<>(); List types = sysDictTypeService.getAllDictType(); for (SysDictType type : types) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("is_delete", Constants.NOT_DELETE); wrapper.eq("dict_type_id", type.getId()); List datas = sysDictDataMapper.selectList(wrapper); result.put(type.getName(), datas); } return result; } }