字典类型加上组织字段

This commit is contained in:
秦鸿展
2026-05-14 14:18:51 +08:00
parent c7c536782f
commit f8c6be9db8
11 changed files with 289 additions and 35 deletions
@@ -15,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mhd.common.core.constant.UserConstants;
import com.mhd.common.core.domain.po.UserPo;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.core.utils.poi.ExcelUtil;
import com.mhd.common.core.web.controller.BaseController;
import com.mhd.common.core.web.domain.AjaxResult;
@@ -23,6 +25,7 @@ import com.mhd.common.log.annotation.Log;
import com.mhd.common.log.enums.BusinessType;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.domain.SysDictType;
import com.mhd.system.api.model.LoginUser;
/**
* 数据字典信息
@@ -73,6 +76,7 @@ public class SysDictTypeController extends BaseController
@PostMapping
public AjaxResult add(@Validated @RequestBody SysDictType dict)
{
fillDictTypeOrganization(dict);
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
{
return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
@@ -81,6 +85,47 @@ public class SysDictTypeController extends BaseController
return toAjax(dictTypeService.insertDictType(dict));
}
/**
* 写入组织维度:优先使用请求体中选择的组织;未传时使用当前登录用户所属组织;无登录上下文时按平台(0)处理。
*/
private void fillDictTypeOrganization(SysDictType dict)
{
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser == null || loginUser.getUserPo() == null)
{
if (dict.getOrganizationId() == null)
{
dict.setOrganizationId(0L);
}
return;
}
UserPo userPo = loginUser.getUserPo();
if (dict.getOrganizationId() == null)
{
dict.setOrganizationId(userPo.getOrganizationId());
if (StringUtils.isEmpty(dict.getOrganizationName()))
{
dict.setOrganizationName(userPo.getOrganizationName());
}
if (dict.getTopOrganizationId() == null)
{
dict.setTopOrganizationId(userPo.getTopOrganizationId());
}
}
else
{
if (dict.getTopOrganizationId() == null)
{
dict.setTopOrganizationId(userPo.getTopOrganizationId());
}
if (StringUtils.isEmpty(dict.getOrganizationName())
&& dict.getOrganizationId().equals(userPo.getOrganizationId()))
{
dict.setOrganizationName(userPo.getOrganizationName());
}
}
}
/**
* 修改字典类型
*/
@@ -89,6 +134,7 @@ public class SysDictTypeController extends BaseController
@PutMapping
public AjaxResult edit(@Validated @RequestBody SysDictType dict)
{
fillDictTypeOrganization(dict);
if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
{
return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
@@ -56,7 +56,7 @@ public interface SysDictDataMapper extends BaseMapper<SysDictData>
* @param dictType 字典类型
* @return 字典数据
*/
public int countDictDataByType(String dictType);
int countDictDataByType(@Param("dictType") String dictType, @Param("organizationId") Long organizationId);
/**
* 通过字典ID删除字典数据信息
@@ -97,5 +97,15 @@ public interface SysDictDataMapper extends BaseMapper<SysDictData>
* @param newDictType 新旧字典类型
* @return 结果
*/
public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType);
int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType,
@Param("organizationId") Long organizationId);
/**
* 按字典类型批量同步字典数据的组织信息(与字典类型归属一致)
*/
int updateDictDataOrganizationByDictType(@Param("dictType") String dictType,
@Param("organizationId") Long organizationId,
@Param("organizationName") String organizationName,
@Param("topOrganizationId") Long topOrganizationId,
@Param("scopeOrganizationId") Long scopeOrganizationId);
}
@@ -79,5 +79,5 @@ public interface SysDictTypeMapper
* @param dictType 字典类型
* @return 结果
*/
public SysDictType checkDictTypeUnique(String dictType);
public SysDictType checkDictTypeUnique(SysDictType dictType);
}
@@ -107,8 +107,11 @@ public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDi
dictDataMapper.deleteDictDataById(dictCode);
SysDictData dictData = new SysDictData();
dictData.setDictType(data.getDictType());
Long oid = data.getOrganizationId() != null ? data.getOrganizationId() : 0L;
dictData.setOrganizationId(oid);
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictData);
DictUtils.setDictCache(data.getDictType(), dictDatas);
DictUtils.setDictCache(DictUtils.dictTypeOrgCacheKey(data.getDictType(), oid), dictDatas);
DictUtils.removeDictCache(data.getDictType());
}
}
@@ -135,8 +138,11 @@ public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDi
{
SysDictData dictData = new SysDictData();
dictData.setDictType(data.getDictType());
Long oid = data.getOrganizationId() != null ? data.getOrganizationId() : 0L;
dictData.setOrganizationId(oid);
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictData);
DictUtils.setDictCache(data.getDictType(), dictDatas);
DictUtils.setDictCache(DictUtils.dictTypeOrgCacheKey(data.getDictType(), oid), dictDatas);
DictUtils.removeDictCache(data.getDictType());
}
return row;
}
@@ -180,13 +186,20 @@ public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDi
}
}
data.setUpdateBy(loginUser.getUserPo().getUserName());
Long oldOid = sysDictData.getOrganizationId() != null ? sysDictData.getOrganizationId() : 0L;
int row = dictDataMapper.updateDictData(data);
if (row > 0)
{
DictUtils.removeDictCache(DictUtils.dictTypeOrgCacheKey(sysDictData.getDictType(), oldOid));
SysDictData dictData = new SysDictData();
dictData.setDictType(data.getDictType());
Long oid = data.getOrganizationId() != null ? data.getOrganizationId()
: (sysDictData.getOrganizationId() != null ? sysDictData.getOrganizationId() : 0L);
dictData.setOrganizationId(oid);
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictData);
DictUtils.setDictCache(data.getDictType(), dictDatas);
DictUtils.setDictCache(DictUtils.dictTypeOrgCacheKey(data.getDictType(), oid), dictDatas);
DictUtils.removeDictCache(data.getDictType());
DictUtils.removeDictCache(sysDictData.getDictType());
}
return row;
}
@@ -16,8 +16,10 @@ import com.mhd.common.core.constant.UserConstants;
import com.mhd.common.core.exception.ServiceException;
import com.mhd.common.core.utils.StringUtils;
import com.mhd.common.security.utils.DictUtils;
import com.mhd.common.security.utils.SecurityUtils;
import com.mhd.system.api.domain.SysDictData;
import com.mhd.system.api.domain.SysDictType;
import com.mhd.system.api.model.LoginUser;
/**
* 字典 业务层处理
@@ -74,22 +76,47 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
@Override
public List<SysDictData> selectDictDataByType(String dictType)
{
List<SysDictData> dictDatas = DictUtils.getDictCache(dictType);
Long orgId = resolveLoginOrganizationIdForDict();
String cacheKey = DictUtils.dictTypeOrgCacheKey(dictType, orgId);
List<SysDictData> dictDatas = DictUtils.getDictCache(cacheKey);
if (StringUtils.isEmpty(dictDatas))
{
dictDatas = DictUtils.getDictCache(dictType);
}
if (StringUtils.isNotEmpty(dictDatas))
{
return dictDatas;
}
SysDictData dictData = new SysDictData();
dictData.setDictType(dictType);
dictData.setOrganizationId(orgId);
dictDatas = dictDataMapper.selectDictDataByType(dictData);
if (StringUtils.isNotEmpty(dictDatas))
{
DictUtils.setDictCache(dictType, dictDatas);
DictUtils.setDictCache(cacheKey, dictDatas);
return dictDatas;
}
return null;
}
/** 字典数据按组织隔离;未登录按平台 0 */
private Long resolveLoginOrganizationIdForDict()
{
try
{
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null
&& loginUser.getUserPo().getOrganizationId() != null)
{
return loginUser.getUserPo().getOrganizationId();
}
}
catch (Exception ignored)
{
}
return 0L;
}
/**
* 根据字典类型ID查询信息
*
@@ -125,11 +152,13 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
for (Long dictId : dictIds)
{
SysDictType dictType = selectDictTypeById(dictId);
if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0)
Long typeOrgId = dictType.getOrganizationId() != null ? dictType.getOrganizationId() : 0L;
if (dictDataMapper.countDictDataByType(dictType.getDictType(), typeOrgId) > 0)
{
throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName()));
}
dictTypeMapper.deleteDictTypeById(dictId);
DictUtils.removeDictCache(DictUtils.dictTypeOrgCacheKey(dictType.getDictType(), typeOrgId));
DictUtils.removeDictCache(dictType.getDictType());
}
}
@@ -142,7 +171,8 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
{
SysDictData dictData = new SysDictData();
dictData.setStatus("0");
Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType));
Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream()
.collect(Collectors.groupingBy(d -> DictUtils.dictTypeOrgCacheKey(d.getDictType(), d.getOrganizationId())));
for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet())
{
DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
@@ -180,7 +210,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
int row = dictTypeMapper.insertDictType(dict);
if (row > 0)
{
DictUtils.setDictCache(dict.getDictType(), null);
Long oid = dict.getOrganizationId() != null ? dict.getOrganizationId() : 0L;
DictUtils.removeDictCache(DictUtils.dictTypeOrgCacheKey(dict.getDictType(), oid));
DictUtils.removeDictCache(dict.getDictType());
}
return row;
}
@@ -196,14 +228,27 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
public int updateDictType(SysDictType dict)
{
SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId());
dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType());
Long oldTypeOrgId = oldDict.getOrganizationId() != null ? oldDict.getOrganizationId() : 0L;
dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType(), oldTypeOrgId);
int row = dictTypeMapper.updateDictType(dict);
if (row > 0)
{
if (dictDataMapper.countDictDataByType(dict.getDictType(), oldTypeOrgId) > 0)
{
dictDataMapper.updateDictDataOrganizationByDictType(dict.getDictType(),
dict.getOrganizationId(), dict.getOrganizationName(), dict.getTopOrganizationId(),
oldTypeOrgId);
}
DictUtils.removeDictCache(DictUtils.dictTypeOrgCacheKey(oldDict.getDictType(), oldTypeOrgId));
DictUtils.removeDictCache(DictUtils.dictTypeOrgCacheKey(dict.getDictType(), dict.getOrganizationId()));
DictUtils.removeDictCache(oldDict.getDictType());
DictUtils.removeDictCache(dict.getDictType());
SysDictData dictData = new SysDictData();
dictData.setDictType(dict.getDictType());
Long newOrgId = dict.getOrganizationId() != null ? dict.getOrganizationId() : 0L;
dictData.setOrganizationId(newOrgId);
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictData);
DictUtils.setDictCache(dict.getDictType(), dictDatas);
DictUtils.setDictCache(DictUtils.dictTypeOrgCacheKey(dict.getDictType(), newOrgId), dictDatas);
}
return row;
}
@@ -218,7 +263,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
public String checkDictTypeUnique(SysDictType dict)
{
Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId();
SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType());
SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict);
if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue())
{
return UserConstants.NOT_UNIQUE;