若依(微服务版)导入导出关联动态字典值
前言
需求背景:
业务系统需要做EXCEL的导入和导出功能,某些字段是系统字典值,改造之前只能应用@Excel注解的combo属性来做下拉限制,用readConverterExp属性来做表达式实际值和显示值的转换。
每当运维人员在系统增加一个字典值的时候,都要来修改代码,太麻烦了。
期望效果:
能够根据系统字典值,动态限制下拉框内容,动态进行实际值和显示值的转换,无需每次都修改代码。同时保留readConverterExp和combo属性的效果
单体版若依
单体版若依网上有很多,这里不在赘述,上连接
-
文章1:
-
文章2:
https://blog.csdn.net/wcnmbbbb/article/details/117952232
两个文章内容基本一样,下边的微服务版,也是这种思路,不过需要做一点特殊处理
微服务版若依
在网上找了很多都是单体版的解决方式,微服务版目前,官方目前还没有给出解决思路,这里就套用一下单体版的修改做一点修改
整体思路
-
修改或者新建一个新的@Excel进行修改
-
转移或者新建ExcelUtil.java,并进行修改
-
新建DictUtils.java
-
想办法让ExcelUtil.java中可以调用DictUtils.java(坑点)
-
修改RedisService.java,添加方法(坑点)
套用单体版修改会有两大坑:
坑一
这里主要是针对上述中的第4点( 想办法让ExcelUtil.java中可以调用DictUtils.java )
若依(微服务版)把@Excel注解写在了[ruoyi-common-core] 模块,这是一个底层模块,但是我们需要拿缓存,即需要操作redis,
把单体版的操作,转移到[ruoyi-common-redis]模块
所以我们有两种思路解决
-
思路一: 不如大胆的在别的模块再搞一个@Excel
优点:不影响原来的注解,完全独立,改动小
缺点: 以后使用注解的时候要注意导包不要导错,使用ExcelUtil也要注意要使用自己新创建的
-
思路二: 转移 [ExcelUtil.java]文件位置到可以操作的转移到[ruoyi-common-redis]模块下
优点:直接在原注解上进行操作,不会出现两个@Excel注解
缺点:需要把我们之前所有引用过ExcelUtil.java的包都改成自己的,改动文件很多
选什么自己决定把,这里就不做推荐了,最后的完整代码是使用的思路一
坑二
这里针对的上述的第5点(修改RedisService.java,添加方法(坑点))
当我们解决完坑一的时候,就遇到了坑二
其中DictUtils.java有一个方法
/**
* 获取字典缓存
*
* @param key 参数键
* @return dictDatas 字典数据列表
*/
public static List<SysDictData> getDictCache(String key)
{
Object cacheObj = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key));
if (StringUtils.isNotNull(cacheObj))
{
// 这一步在转类型 会报转换异常 失败原因主要是redis里有一个 @type 会规定必须转换的包一致
List<SysDictData> dictDatas = StringUtils.cast(cacheObj);
return dictDatas;
}
return null;
}
知道了原因,就好搞了,具体解决办法网上有很多
https://blog.csdn.net/weixin_42169734/article/details/119609957
// 修改getDictCache
public static List<SysDictData> getDictCache(String key)
{
List<JSONArray> cacheListString = SpringUtils.getBean(RedisService.class).getCacheListString(getCacheKey(key));
if (StringUtils.isNotNull(cacheListString)){
JSONArray objects = cacheListString.get(0);
List<SysDictData> sysDictData = JSONArray.parseArray(objects.toJSONString(), SysDictData.class);
return sysDictData;
}
return null;
}
// 在RedisService类中方法中添加getCacheListString方法
public List<JSONArray> getCacheListString(final String key)
{
return redisTemplate.opsForValue().multiGet(Arrays.asList(key));
}
完整代码
Excel注解
/**
* 自定义导出Excel数据注解
*
*/