package com.gkhy.exam.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.common.api.CommonPage;
import com.gkhy.exam.common.constant.UserConstant;
import com.gkhy.exam.common.domain.entity.SysDictData;
import com.gkhy.exam.common.domain.entity.SysDictType;
import com.gkhy.exam.common.exception.ApiException;
import com.gkhy.exam.common.utils.DictUtils;
import com.gkhy.exam.common.utils.PageUtils;
import com.gkhy.exam.common.utils.SecurityUtils;
import com.gkhy.exam.system.mapper.SysDictDataMapper;
import com.gkhy.exam.system.mapper.SysDictTypeMapper;
import com.gkhy.exam.system.service.SysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
*
* 字典类型表 服务实现类
*
*
* @author kzy
* @since 2023-11-01 15:37:51
*/
@Service
public class SysDictTypeServiceImpl extends ServiceImpl implements SysDictTypeService {
@Autowired
private SysDictDataMapper dictDataMapper;
@PostConstruct
public void init(){
loadingDictCache();
}
@Override
public CommonPage selectDictTypeList(SysDictType dict) {
PageUtils.startPage();
List dictTypeList= baseMapper.selectDictTypeList(dict);
return CommonPage.restPage(dictTypeList);
}
@Override
public List selectDictTypeAll() {
return list();
}
@Override
public List selectDictDataByType(String dictType) {
List dictDatas= DictUtils.getDictCache(dictType);
if(!Objects.isNull(dictDatas)&&dictDatas.size()>0){
return dictDatas;
}
dictDatas=dictDataMapper.selectDictDataByType(dictType);
if(!Objects.isNull(dictDatas)){
DictUtils.setDictCache(dictType,dictDatas);
return dictDatas;
}
return null;
}
@Override
public SysDictType selectDictTypeById(Long dictId) {
return getById(dictId);
}
@Override
public SysDictType selectDictTypeByType(String dictType) {
return baseMapper.selectDictTypeByType(dictType);
}
@Override
public void deleteDictTypeByIds(Long[] dictIds) {
for (Long dictId : dictIds)
{
SysDictType dictType = selectDictTypeById(dictId);
if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0)
{
throw new ApiException(String.format("%1$s已分配,不能删除", dictType.getName()));
}
removeById(dictId);
DictUtils.removeDictCache(dictType.getDictType());
}
}
@Override
public void loadingDictCache() {
SysDictData dictData = new SysDictData();
dictData.setStatus(0);
List sysDictDataList = dictDataMapper.selectDictDataList(dictData);
Map> dictDataMap = sysDictDataList.stream().collect(Collectors.groupingBy(SysDictData::getDictType));
for (Map.Entry> entry : dictDataMap.entrySet())
{
DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getSort)).collect(Collectors.toList()));
}
}
@Override
public void clearDictCache() {
DictUtils.clearDictCache();
}
@Override
public void resetDictCache() {
clearDictCache();
loadingDictCache();
}
@Override
public int insertDictType(SysDictType dict) {
if(!checkDictTypeUnique(dict)){
throw new ApiException("新增字典类型已存在");
}
dict.setCreateBy(SecurityUtils.getUsername());
int row = baseMapper.insert(dict);
if (row > 0)
{
DictUtils.setDictCache(dict.getDictType(), null);
}
return row;
}
@Override
public int updateDictType(SysDictType dict) {
if(!checkDictTypeUnique(dict)){
throw new ApiException("新增字典类型已存在");
}
SysDictType oldDict = selectDictTypeById(dict.getId());
dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType());
dict.setUpdateBy(SecurityUtils.getUsername());
int row = baseMapper.updateById(dict);
if (row > 0)
{
List dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType());
DictUtils.setDictCache(dict.getDictType(), dictDatas);
}
return row;
}
@Override
public boolean checkDictTypeUnique(SysDictType dict) {
Long dictId =dict.getId()==null ? -1L : dict.getId();
SysDictType dictType = baseMapper.checkDictTypeUnique(dict.getDictType());
if (!Objects.isNull(dictType) && dictType.getId().longValue() != dictId.longValue())
{
return UserConstant.NOT_UNIQUE;
}
return UserConstant.UNIQUE;
}
}