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.SysDictTypeMapper;
import com.moral.api.pojo.dto.sysDictType.SysDictTypeDTO;
import com.moral.api.pojo.dto.sysDictType.SysDictTypeQueryDTO;
import com.moral.api.pojo.form.sysDictType.SysDictTypeDeleteForm;
import com.moral.api.pojo.form.sysDictType.SysDictTypeInsertForm;
import com.moral.api.pojo.form.sysDictType.SysDictTypeUpdateForm;
import com.moral.api.service.SysDictDataService;
import com.moral.api.service.SysDictTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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 org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
*
* 字典表 服务实现类
*
*
* @author moral
* @since 2021-03-09
*/
@Service
public class SysDictTypeServiceImpl extends ServiceImpl implements SysDictTypeService {
@Autowired
SysDictTypeMapper sysDictTypeMapper;
@Autowired
SysDictDataService sysDictDataService;
@Autowired
RedisTemplate redisTemplate;
@Override
@Transactional
public SysDictTypeDTO deleteType(SysDictTypeDeleteForm form) {
//创建返回对象
SysDictTypeDTO dto = new SysDictTypeDTO();
//获取Id
Integer typeId = form.getId();
//查询要删除的type用于插入日志
QueryWrapper existWrapper = new QueryWrapper<>();
existWrapper.eq("is_delete",Constants.NOT_DELETE);
existWrapper.eq("id",typeId);
SysDictType type = sysDictTypeMapper.selectOne(existWrapper);
if(ObjectUtils.isEmpty(type)){
dto.setCode(ResponseCodeEnum.DICTTYPE_NOT_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.DICTTYPE_NOT_EXIST.getMsg());
return dto;
}
//执行逻辑删除
UpdateWrapper deleteTypeWrapper = new UpdateWrapper();
deleteTypeWrapper.eq("id",typeId);
deleteTypeWrapper.set("is_delete",Constants.DELETE);
sysDictTypeMapper.update(null,deleteTypeWrapper);
//逻辑删除类型对应的数据
UpdateWrapper deleteDataWrapper = new UpdateWrapper();
deleteDataWrapper.eq("dict_type_id",typeId);
deleteDataWrapper.set("is_delete",Constants.DELETE);
sysDictDataService.update(null,deleteDataWrapper);
//插入日志
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
LogUtils.saveOperationForManage(request,"删除字典类型:"+type.getName(),Constants.DELETE_OPERATE_TYPE);
//刷新缓存数据
refreshCache();
//封装返回数据
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
@Transactional
public SysDictTypeDTO updateType(SysDictTypeUpdateForm form) {
//创建返回对象
SysDictTypeDTO dto = new SysDictTypeDTO();
//获取实体
SysDictType type = form.formConvertEntity();
//查询type用于插入日志
QueryWrapper existNameWrapper = new QueryWrapper<>();
existNameWrapper.eq("id",type.getId());
existNameWrapper.eq("is_delete",Constants.NOT_DELETE);
SysDictType existType = sysDictTypeMapper.selectOne(existNameWrapper);
if(ObjectUtils.isEmpty(existType)){
dto.setCode(ResponseCodeEnum.DICTTYPE_NOT_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.DICTTYPE_NOT_EXIST.getMsg());
return dto;
}
//执行更新
sysDictTypeMapper.updateById(type);
//获取更新后的对象
SysDictType sysDictType = sysDictTypeMapper.selectById(type.getId());
//刷新缓存
refreshCache();
//封装返回对象
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
@Transactional
public SysDictTypeDTO insertType(SysDictTypeInsertForm form) {
//创建返回对象
SysDictTypeDTO dto = new SysDictTypeDTO();
//获取要插入的实体
SysDictType sysDictType = form.formConvertEntity();
//判断name是否已经存在
SysDictType existType = sysDictTypeMapper.listOne(sysDictType.getName());
if(!ObjectUtils.isEmpty(existType)){
dto.setCode(ResponseCodeEnum.DICTTYPE_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.DICTTYPE_EXIST.getMsg());
return dto;
}
//插入类型
sysDictTypeMapper.insert(sysDictType);
//插入日志
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
LogUtils.saveOperationForManage(request,"添加字典类型:"+sysDictType.getName(),Constants.INSERT_OPERATE_TYPE);
//刷新缓存
refreshCache();
//封装返回对象
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
/**
* @Description: 获取所有字典类型和字典数据
* @Param: []
* @return: com.moral.api.pojo.dto.sysDictType.SysDictTypeQueryDTO
* @Author: 陈凯裕
* @Date: 2021/4/15
*/
@Override
public SysDictTypeQueryDTO queryTypeAndDatas() {
//创建返回对象
SysDictTypeQueryDTO queryDTO = new SysDictTypeQueryDTO();
List dtos = new ArrayList<>();
//获取所有类型
List types = getAllDictType();
//获取所有数据
Map> datas = sysDictDataService.getAllDictData();
for (SysDictType type : types) {
SysDictTypeDTO dto = new SysDictTypeDTO();
List typeDatas = (List) datas.get(type.getName());
dto.setSysDictType(type);
dto.setSysDictDatas(typeDatas);
dtos.add(dto);
}
//封装返回数据
queryDTO.setSysDictTypeDTOS(dtos);
queryDTO.setCode(ResponseCodeEnum.SUCCESS.getCode());
queryDTO.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return queryDTO;
}
/**
* @Description: 获取所有字典类型,没有字典数据
* @Param: []
* @return: java.util.List
* @Author: 陈凯裕
* @Date: 2021/4/15
*/
@Override
public List getAllDictType() {
//从缓存中取出
List types = (List) redisTemplate.opsForValue().get(RedisConstants.DICT_TYPE_KEY);
if(ObjectUtils.isEmpty(types)){//从数据库取出并且插入缓存
types = getAllDictTypeFromDB();
redisTemplate.opsForValue().set(RedisConstants.DICT_TYPE_KEY,types);
}
return types;
}
@Override
public SysDictType getDictTypeById(Integer id) {
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("is_delete",Constants.NOT_DELETE);
wrapper.eq("id",id);
return sysDictTypeMapper.selectOne(wrapper);
}
private List getAllDictTypeFromDB() {
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("is_delete", Constants.NOT_DELETE);
List sysDictTypes = sysDictTypeMapper.selectList(wrapper);
return sysDictTypes;
}
@Override
public void refreshCache(){
redisTemplate.delete(RedisConstants.DICT_TYPE_KEY);
List types = getAllDictTypeFromDB();
redisTemplate.opsForValue().set(RedisConstants.DICT_TYPE_KEY,types);
}
}