SysDictServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. package com.xy.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.util.BooleanUtil;
  5. import cn.hutool.core.util.CharsetUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import cn.hutool.http.HttpRequest;
  8. import cn.hutool.http.HttpResponse;
  9. import cn.hutool.json.JSONUtil;
  10. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  11. import com.baomidou.mybatisplus.core.metadata.IPage;
  12. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  13. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  14. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  15. import com.xy.annotate.Runners;
  16. import com.xy.collections.list.JArrayList;
  17. import com.xy.collections.list.JList;
  18. import com.xy.dto.SysDictDto;
  19. import com.xy.entity.SysDict;
  20. import com.xy.entity.SysDictLog;
  21. import com.xy.entity.SysDictRedis;
  22. import com.xy.error.CommRuntimeException;
  23. import com.xy.mapper.SysDictMapper;
  24. import com.xy.sys.EnumSysDictOperateType;
  25. import com.xy.utils.*;
  26. import io.swagger.annotations.Api;
  27. import io.swagger.annotations.ApiOperation;
  28. import lombok.AllArgsConstructor;
  29. import lombok.extern.slf4j.Slf4j;
  30. import org.springframework.scheduling.annotation.Async;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import org.springframework.validation.annotation.Validated;
  34. import org.springframework.web.bind.annotation.PostMapping;
  35. import org.springframework.web.bind.annotation.RequestBody;
  36. import org.springframework.web.bind.annotation.RequestHeader;
  37. import java.time.LocalDateTime;
  38. import java.util.ArrayList;
  39. import java.util.List;
  40. import static com.xy.utils.Beans.copy;
  41. import static com.xy.utils.PlusBeans.toIPage;
  42. import static com.xy.utils.PlusBeans.toPageBean;
  43. /**
  44. * <p>
  45. * 字典表 服务实现类
  46. * </p>
  47. *
  48. * @author lijin
  49. * @since 2022-12-09
  50. */
  51. @Slf4j
  52. @Service
  53. @AllArgsConstructor
  54. @Api(tags = "系统字典")
  55. public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements SysDictService {
  56. private static final String SYNC_DICT_URL = "https://api.mxrvending.com/sys/sys-dict/syncProd";
  57. // private static final String SYNC_DICT_URL = "http://119.96.194.20:9050/sys/sys-dict/syncProd";
  58. private RedisService<SysDictRedis> redisService;
  59. private SysDictLogServiceImpl sysDictLogService;
  60. /**
  61. * post请求
  62. *
  63. * @param url url
  64. * @param body spi参数
  65. * @return {@link String}
  66. */
  67. static String sendPost(String url, String body) {
  68. HttpResponse resultStr = HttpRequest.post(url)
  69. .header("Content-Type", "application/json") // 修改为 JSON 格式
  70. .charset(CharsetUtil.UTF_8)
  71. .body(body) // 使用 JSON 字符串作为请求体
  72. .timeout(30 * 1000)
  73. .execute();
  74. String responseBody = resultStr.body();
  75. if (resultStr.getStatus() != 200) {
  76. log.error("字典同步到生产环境异常: 状态码: {}, 响应体: {},appId:{},notifyId:{}", resultStr.getStatus(), responseBody);
  77. return "fail";
  78. }
  79. return responseBody;
  80. }
  81. /**
  82. * 全量刷新redis字典数据
  83. */
  84. @Async
  85. public void refreshAll() {
  86. List<SysDict> SysDicts = this.list();
  87. SysDicts.forEach(sysDict -> refuRedis(sysDict));
  88. }
  89. /**
  90. * 同步到生产环境,处理接收到的字典数据 nacos加白名单
  91. *
  92. * @param syncProd 目标字典数据
  93. * @return 响应结果
  94. */
  95. @ApiOperation("同步到生产环境-接收处理")
  96. @PostMapping("syncProd")
  97. public R syncProd(@RequestBody SysDictDto.SyncProd syncProd) {
  98. log.info("字典同步数据: {}", JSONUtil.toJsonPrettyStr(syncProd));
  99. String paterCode = syncProd.getPaterCode();
  100. String code = syncProd.getCode();
  101. Integer operateType = syncProd.getOperateType();
  102. if (!SysDictDto.SYNC_PWD.equals(syncProd.getPwd())) {
  103. throw new CommRuntimeException("非法请求!");
  104. }
  105. try {
  106. if (StrUtil.isEmpty(paterCode)) {
  107. //根字典
  108. handleRootDict(syncProd, code, operateType);
  109. } else {
  110. //子字典
  111. handleChildDict(syncProd, paterCode, operateType);
  112. }
  113. } catch (Exception e) {
  114. log.error("同步到生产环境失败", e);
  115. return R.fail("同步失败,请稍后重试");
  116. }
  117. return R.ok();
  118. }
  119. /**
  120. * 处理根字典的操作,根据操作类型决定增加、更新或删除
  121. *
  122. * @param syncProd 目标字典数据
  123. * @param code 字典代码
  124. * @param operateType 操作类型
  125. */
  126. private void handleRootDict(SysDictDto.SyncProd syncProd, String code, Integer operateType) {
  127. switch (operateType) {
  128. case 1:
  129. addRootDict(syncProd, code);
  130. break;
  131. case 2:
  132. updateRootDict(syncProd);
  133. break;
  134. case 3:
  135. deleteRootDict(syncProd.getCode());
  136. break;
  137. default:
  138. log.warn("未知操作类型: {}", operateType);
  139. }
  140. }
  141. /**
  142. * 处理子字典的操作,根据操作类型决定增加、更新或删除
  143. *
  144. * @param syncProd 目标字典数据
  145. * @param paterCode 父级字典代码
  146. * @param operateType 操作类型
  147. */
  148. private void handleChildDict(SysDictDto.SyncProd syncProd, String paterCode, Integer operateType) {
  149. switch (operateType) {
  150. case 1:
  151. addChildDict(syncProd, paterCode);
  152. break;
  153. case 2:
  154. updateChildDict(syncProd, paterCode);
  155. break;
  156. case 3:
  157. deleteChildDict(syncProd, paterCode);
  158. break;
  159. default:
  160. log.warn("未知操作类型: {}", operateType);
  161. }
  162. }
  163. /**
  164. * 添加根字典,如果字典代码不存在则创建新的字典
  165. *
  166. * @param syncProd 目标字典数据
  167. * @param code 字典代码
  168. */
  169. private void addRootDict(SysDictDto.SyncProd syncProd, String code) {
  170. long count = count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, code));
  171. if (count <= 0) {
  172. SysDict sysDict = createSysDict(syncProd);
  173. save(sysDict);
  174. refuRedis(sysDict);
  175. }
  176. }
  177. /**
  178. * 更新根字典,若不存在则调用添加方法
  179. *
  180. * @param syncProd 目标字典数据
  181. */
  182. private void updateRootDict(SysDictDto.SyncProd syncProd) {
  183. SysDict sysP = getOne(Wrappers.lambdaQuery(SysDict.class).eq(SysDict::getCode, syncProd.getCode()));
  184. if (sysP == null) {
  185. addRootDict(syncProd, syncProd.getCode());
  186. } else {
  187. updateSysDict(sysP, syncProd);
  188. }
  189. }
  190. /**
  191. * 删除根字典及其相关的子字典
  192. *
  193. * @param code 字典代码
  194. */
  195. private void deleteRootDict(String code) {
  196. List<SysDict> sysDicts = getRelatedDicts(code);
  197. remove(Wrappers.lambdaQuery(SysDict.class).eq(SysDict::getCode, code));
  198. remove(Wrappers.lambdaQuery(SysDict.class).eq(SysDict::getPaterCode, code));
  199. sysDicts.forEach(this::refuRedis);
  200. }
  201. /**
  202. * 添加子字典,如果代码不存在则创建新的字典
  203. *
  204. * @param syncProd 目标字典数据
  205. * @param paterCode 父级字典代码
  206. */
  207. private void addChildDict(SysDictDto.SyncProd syncProd, String paterCode) {
  208. long count = count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, syncProd.getCode()).eq(SysDict::getPaterCode, paterCode));
  209. if (count <= 0) {
  210. SysDict sysDict = createSysDict(syncProd);
  211. save(sysDict);
  212. refuRedis(sysDict);
  213. }
  214. }
  215. /**
  216. * 更新子字典,若不存在则调用添加方法
  217. *
  218. * @param syncProd 目标字典数据
  219. * @param paterCode 父级字典代码
  220. */
  221. private void updateChildDict(SysDictDto.SyncProd syncProd, String paterCode) {
  222. SysDict sysP = getOne(Wrappers.lambdaQuery(SysDict.class)
  223. .eq(SysDict::getCode, syncProd.getCode())
  224. .eq(SysDict::getPaterCode, paterCode));
  225. if (sysP == null) {
  226. addChildDict(syncProd, paterCode);
  227. } else {
  228. updateSysDict(sysP, syncProd);
  229. }
  230. }
  231. /**
  232. * 删除子字典
  233. *
  234. * @param syncProd 目标字典数据
  235. * @param paterCode 父级字典代码
  236. */
  237. private void deleteChildDict(SysDictDto.SyncProd syncProd, String paterCode) {
  238. List<SysDict> list = new ArrayList<>();
  239. SysDict sysDict = getOne(Wrappers.lambdaQuery(SysDict.class)
  240. .eq(SysDict::getCode, syncProd.getCode())
  241. .eq(SysDict::getPaterCode, paterCode));
  242. if (sysDict != null) {
  243. list.add(sysDict);
  244. remove(Wrappers.lambdaQuery(SysDict.class).eq(SysDict::getPaterCode, syncProd.getCode()).eq(SysDict::getCode, syncProd.getCode()));
  245. list.forEach(this::refuRedis);
  246. }
  247. }
  248. /**
  249. * 创建新的字典对象
  250. *
  251. * @param syncProd 目标字典数据
  252. * @return 新创建的字典对象
  253. */
  254. private SysDict createSysDict(SysDictDto.SyncProd syncProd) {
  255. SysDict sysDict = BeanUtil.copyProperties(syncProd, SysDict.class);
  256. sysDict.setCreateTime(LocalDateTime.now());
  257. sysDict.setCreateUser(1L);
  258. return sysDict;
  259. }
  260. /**
  261. * 更新字典对象的属性
  262. *
  263. * @param sysDict 需要更新的字典对象
  264. * @param syncProd 目标字典数据
  265. */
  266. private void updateSysDict(SysDict sysDict, SysDictDto.SyncProd syncProd) {
  267. sysDict.setValue(syncProd.getValue());
  268. sysDict.setMsg(syncProd.getMsg());
  269. sysDict.setUpdateTime(LocalDateTime.now());
  270. updateById(sysDict);
  271. refuRedis(sysDict);
  272. }
  273. /**
  274. * 根据字典代码获取相关的字典
  275. *
  276. * @param code 字典代码
  277. * @return 相关字典列表
  278. */
  279. private List<SysDict> getRelatedDicts(String code) {
  280. List<SysDict> list = new ArrayList<>();
  281. SysDict sysDict = getOne(Wrappers.lambdaQuery(SysDict.class).eq(SysDict::getCode, code));
  282. if (sysDict != null) {
  283. list.add(sysDict);
  284. LambdaQueryWrapper<SysDict> lqw = Wrappers.lambdaQuery(SysDict.class).eq(SysDict::getPaterCode, code);
  285. List<SysDict> sysDicts = list(lqw);
  286. if (CollUtil.isNotEmpty(sysDicts)) {
  287. list.addAll(sysDicts);
  288. }
  289. }
  290. return list;
  291. }
  292. @ApiOperation("手动同步到生产环境")
  293. @PostMapping("syncToProd")
  294. public R syncToProd(@RequestBody @Validated SysDictDto.SyncToProd syncToProd) {
  295. Long id = syncToProd.getId();
  296. SysDictLog sysDictLog = sysDictLogService.getById(id);
  297. // 确保获取到的字典日志不为空
  298. if (sysDictLog == null) {
  299. return R.fail("字典日志不存在");
  300. }
  301. Boolean isSync = sysDictLog.getIsSync();
  302. if (BooleanUtil.isTrue(isSync)) {
  303. return R.fail("已同步,请勿重复操作");
  304. }
  305. Integer sysDictId = sysDictLog.getSysDictId();
  306. SysDict sysDict = getById(sysDictId);
  307. SysDictDto.SyncProd syncProd = BeanUtil.copyProperties(sysDictLog, SysDictDto.SyncProd.class);
  308. syncProd.setValue(sysDictLog.getValue());
  309. if (sysDict != null) {
  310. //非删除
  311. syncProd.setCssClass(sysDict.getCssClass());
  312. syncProd.setListClass(sysDict.getListClass());
  313. syncProd.setOrders(sysDict.getOrders());
  314. }
  315. syncProd.setPwd(SysDictDto.SYNC_PWD);
  316. String body = JSONUtil.toJsonStr(syncProd);
  317. log.info("字典同步数据: {}", body);
  318. String res = sendPost(SYNC_DICT_URL, body);
  319. if ("fail".equals(res)) {
  320. return R.fail("同步失败,请稍后重试");
  321. } else {
  322. sysDictLog.setIsSync(true);
  323. sysDictLogService.updateById(sysDictLog);
  324. }
  325. return R.ok();
  326. }
  327. @ApiOperation("添加")
  328. @PostMapping("save")
  329. public R save(@RequestBody @Validated SysDictDto.Save save) {
  330. //添加字典
  331. long count = !Emptys.check(save.getPaterCode()) ? count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, save.getCode()))
  332. : count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, save.getCode()).eq(SysDict::getPaterCode, save.getPaterCode()));
  333. if (count > 0) {
  334. return R.fail("code已存在");
  335. }
  336. SysDict sysDict = copy(SysDict.class, save)
  337. .createUserTime(AuthorizeUtils.getLoginId(Long.class));
  338. save(sysDict);
  339. //日志
  340. SysDictLog sysDictLog = BeanUtil.copyProperties(sysDict, SysDictLog.class);
  341. sysDictLogService.handleLog(sysDict, sysDictLog, EnumSysDictOperateType.ADD);
  342. //刷新redis
  343. refuRedis(sysDict);
  344. return R.ok();
  345. }
  346. @ApiOperation("修改")
  347. @PostMapping("update")
  348. public R update(@RequestBody @Validated SysDictDto.Update update) {
  349. SysDict sysDict = getById(update.getId());
  350. if (!sysDict.getCode().equals(update.getCode())) {
  351. long count = !Emptys.check(update.getPaterCode()) ? count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, update.getCode()))
  352. : count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, update.getCode()).eq(SysDict::getPaterCode, update.getPaterCode()));
  353. if (count > 0) {
  354. return R.fail("code已存在");
  355. }
  356. }
  357. //如果根字典code修改,则 子字典也要记录日志(作为新增)
  358. if (StrUtil.isEmpty(sysDict.getPaterCode()) && !sysDict.getCode().equals(update.getCode())) {
  359. LambdaQueryWrapper<SysDict> lambdaQueryWrapper = new LambdaQueryWrapper<SysDict>().eq(SysDict::getPaterCode, sysDict.getCode());
  360. List<SysDict> sysDicts = list(lambdaQueryWrapper);
  361. if (CollUtil.isNotEmpty(sysDicts)) {
  362. //存在子字典,修改日志记录
  363. sysDicts.forEach(sd -> {
  364. sd.setPaterCode(update.getCode());
  365. SysDictLog sysDictLog = BeanUtil.copyProperties(sd, SysDictLog.class);
  366. sysDictLogService.handleLog(sysDict, sysDictLog, EnumSysDictOperateType.ADD);
  367. });
  368. }
  369. }
  370. //修改字典
  371. SysDict obj = copy(SysDict.class, update)
  372. .update(AuthorizeUtils.getLoginId(Long.class));
  373. updateById(obj);
  374. //修改子字典
  375. update(new SysDict().setPaterCode(obj.getCode()), new LambdaQueryWrapper<SysDict>().eq(SysDict::getPaterCode, sysDict.getCode()));
  376. //日志
  377. SysDictLog sysDictLog = BeanUtil.copyProperties(sysDict, SysDictLog.class);
  378. sysDictLogService.handleLog(sysDict, sysDictLog, EnumSysDictOperateType.UPDATE);
  379. //刷新redis
  380. refuRedis(obj);
  381. return R.ok();
  382. }
  383. @ApiOperation("删除")
  384. @PostMapping("del")
  385. @Transactional(rollbackFor = Exception.class)
  386. public R del(@RequestBody @Validated SysDictDto.Del del) {
  387. //删除字典
  388. List<Integer> ids = del.getId();
  389. List<SysDict> list = list(new LambdaQueryWrapper<SysDict>().in(SysDict::getId, ids));
  390. removeBatchByIds(ids);
  391. //日志
  392. if (CollUtil.isNotEmpty(list)) {
  393. list.forEach(sysDict -> {
  394. SysDictLog sysDictLog = BeanUtil.copyProperties(sysDict, SysDictLog.class);
  395. sysDictLogService.handleLog(sysDict, sysDictLog, EnumSysDictOperateType.DEL);
  396. });
  397. }
  398. //删除子字典
  399. JList<SysDict> paters = new JArrayList<>(list).filter().isNull(SysDict::getPaterCode).list();
  400. JList<SysDict> paters2 = new JArrayList<>(list).filter().eq(SysDict::getPaterCode, "").list();
  401. if (Emptys.check(paters2)) {
  402. paters.addAll(paters2);
  403. }
  404. if (Emptys.check(paters)) {
  405. JList<String> codes = paters.getProperty(SysDict::getCode);
  406. LambdaQueryWrapper<SysDict> lqw = new LambdaQueryWrapper<SysDict>().in(SysDict::getPaterCode, codes);
  407. List<SysDict> sysDicts = list(lqw);
  408. if (CollUtil.isNotEmpty(sysDicts)) {
  409. removeBatchByIds(sysDicts);
  410. sysDicts.forEach(sysDict -> {
  411. SysDictLog sysDictLog = BeanUtil.copyProperties(sysDict, SysDictLog.class);
  412. sysDictLogService.handleLog(sysDict, sysDictLog, EnumSysDictOperateType.DEL);
  413. });
  414. }
  415. }
  416. //刷新redis
  417. list.forEach(sysDict -> refuRedis(sysDict));
  418. return R.ok();
  419. }
  420. @ApiOperation("分页查询")
  421. @PostMapping("page")
  422. public R<PageBean<SysDictDto.Vo>> page(@RequestBody SysDictDto.Page pageInfo) {
  423. PageBean<SysDict> page = pageInfo.getPage();
  424. LambdaQueryWrapper<SysDict> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(pageInfo, SysDict.class)
  425. .ge(SysDict::getCreateTime, pageInfo.getBeginCreateTime())
  426. .le(SysDict::getCreateTime, pageInfo.getEndCreateTime())
  427. .like(SysDict::getMsg)
  428. .like(SysDict::getValue)
  429. .build()
  430. .orderByAsc(!Emptys.check(page.getOrders()), SysDict::getOrders)
  431. .and(StringUtils.isEmpty(pageInfo.getPaterCode()), sysDictLambdaQueryWrapper -> sysDictLambdaQueryWrapper
  432. .isNull(SysDict::getPaterCode)
  433. .or()
  434. .eq(SysDict::getPaterCode, "")
  435. );
  436. IPage<SysDict> iPage = page(toIPage(page), lambdaQueryWrapper);
  437. return R.ok(toPageBean(SysDictDto.Vo.class, iPage));
  438. }
  439. @ApiOperation("集合查询")
  440. @PostMapping("list")
  441. public R<List<SysDictDto.Vo>> list(@RequestHeader(value = "lang", required = false) String lang, @RequestBody SysDictDto.SelectList selectList) {
  442. LambdaQueryWrapper<SysDict> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, SysDict.class)
  443. .in(SysDict::getId, selectList.getIds())
  444. .in(SysDict::getCode, selectList.getCodes())
  445. .in(SysDict::getPaterCode, selectList.getPaterCodes())
  446. .like(SysDict::getMsg)
  447. .like(SysDict::getValue)
  448. .build()
  449. .orderByAsc(SysDict::getOrders);
  450. List<SysDict> list = list(lambdaQueryWrapper);
  451. List<SysDictDto.Vo> voList = copy(SysDictDto.Vo.class, list);
  452. // if ("en".equals(lang)) {
  453. // //英文菜单
  454. // voList.forEach(v -> {
  455. // String enName = v.getEnMsg();
  456. // if (StrUtil.isNotEmpty(enName)) {
  457. // v.setMsg(enName);
  458. // }
  459. // });
  460. //
  461. // }
  462. return R.ok(voList);
  463. }
  464. @ApiOperation("集合查询(无需授权)")
  465. @PostMapping("list2")
  466. public R<List<SysDictDto.Vo>> list2(@RequestHeader(value = "lang", required = false) String lang, @RequestBody SysDictDto.SelectList selectList) {
  467. return list(lang, selectList);
  468. }
  469. /**
  470. * 刷新redis
  471. *
  472. * @param sysDict
  473. */
  474. public void refuRedis(SysDict sysDict) {
  475. List<SysDict> list;
  476. String key = sysDict.getPaterCode();
  477. if (!Emptys.check(key)) {
  478. //父字典
  479. list = list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getPaterCode, sysDict.getCode()).eq(SysDict::getStatus, true));
  480. key = sysDict.getCode();
  481. } else {
  482. //子字典
  483. list = list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getPaterCode, key).eq(SysDict::getStatus, true));
  484. }
  485. redisService.removeMap(SysDictUtils.getKey(key));
  486. for (SysDict dict : list) {
  487. redisService.setMap(SysDictUtils.getKey(key), dict.getCode(), copy(SysDictRedis.class, dict));
  488. }
  489. log.info("字典刷新redis完成~");
  490. }
  491. /**
  492. * 全量加载字典到redis
  493. */
  494. @Runners
  495. public void loadRedis() {
  496. List<SysDict> sysDicts = list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getStatus, true));
  497. List<SysDictRedis> sysDictRedis = Beans.copy(SysDictRedis.class, sysDicts);
  498. JList<SysDictRedis> list = new JArrayList<>(sysDictRedis);
  499. //父字典
  500. JList<SysDictRedis> paters = list.filter().isNull(SysDictRedis::getPaterCode).list();
  501. JList<SysDictRedis> paters2 = list.filter().eq(SysDictRedis::getPaterCode, "").list();
  502. if (Emptys.check(paters2)) {
  503. paters.addAll(paters2);
  504. }
  505. redisService.removeLikeMap(SysDictUtils.SYS_DICT_REDIS_PREFIX);
  506. //[父code -> 子列表]数据结构写入redis
  507. paters.forEach(sysDict -> {
  508. JList<SysDictRedis> sysDictJList = list.filter().eq(SysDictRedis::getPaterCode, sysDict.getCode()).list();
  509. sysDictJList.forEach(sysDictRediss -> redisService.setMap(SysDictUtils.getKey(sysDict.getCode()), sysDictRediss.getCode(), sysDictRediss));
  510. });
  511. log.info("字典写入redis完成~");
  512. }
  513. }