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;
|
}
|
}
|