SysDictServiceImpl.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package com.xy.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.xy.annotate.Runners;
  7. import com.xy.collections.list.JArrayList;
  8. import com.xy.collections.list.JList;
  9. import com.xy.dto.SysDictDto;
  10. import com.xy.entity.SysDict;
  11. import com.xy.entity.SysDictRedis;
  12. import com.xy.mapper.SysDictMapper;
  13. import com.xy.utils.*;
  14. import io.swagger.annotations.Api;
  15. import io.swagger.annotations.ApiOperation;
  16. import lombok.AllArgsConstructor;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import org.springframework.validation.annotation.Validated;
  21. import org.springframework.web.bind.annotation.PostMapping;
  22. import org.springframework.web.bind.annotation.RequestBody;
  23. import java.util.List;
  24. import static com.xy.utils.Beans.copy;
  25. import static com.xy.utils.PlusBeans.toIPage;
  26. import static com.xy.utils.PlusBeans.toPageBean;
  27. /**
  28. * <p>
  29. * 字典表 服务实现类
  30. * </p>
  31. *
  32. * @author lijin
  33. * @since 2022-12-09
  34. */
  35. @Slf4j
  36. @Service
  37. @AllArgsConstructor
  38. @Api(tags = "系统字典")
  39. public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements SysDictService {
  40. private RedisService<SysDictRedis> redisService;
  41. @ApiOperation("添加")
  42. @PostMapping("save")
  43. public R save(@RequestBody @Validated SysDictDto.Save save) {
  44. //添加字典
  45. long count = !Emptys.check(save.getPaterCode()) ? count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, save.getCode()))
  46. : count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, save.getCode()).eq(SysDict::getPaterCode, save.getPaterCode()));
  47. if (count > 0) {
  48. return R.fail("code已存在");
  49. }
  50. SysDict sysDict = copy(SysDict.class, save)
  51. .createUserTime(AuthorizeUtils.getLoginId(Long.class));
  52. save(sysDict);
  53. //刷新redis
  54. refuRedis(sysDict);
  55. return R.ok();
  56. }
  57. @ApiOperation("修改")
  58. @PostMapping("update")
  59. public R update(@RequestBody @Validated SysDictDto.Update update) {
  60. SysDict sysDict = getById(update.getId());
  61. if (!sysDict.getCode().equals(update.getCode())) {
  62. long count = !Emptys.check(update.getPaterCode()) ? count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, update.getCode()))
  63. : count(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCode, update.getCode()).eq(SysDict::getPaterCode, update.getPaterCode()));
  64. if (count > 0) {
  65. return R.fail("code已存在");
  66. }
  67. }
  68. //修改字典
  69. SysDict obj = copy(SysDict.class, update)
  70. .update(AuthorizeUtils.getLoginId(Long.class));
  71. updateById(obj);
  72. //修改子字典
  73. update(new SysDict().setPaterCode(obj.getCode()), new LambdaQueryWrapper<SysDict>().eq(SysDict::getPaterCode, sysDict.getCode()));
  74. //刷新redis
  75. refuRedis(obj);
  76. return R.ok();
  77. }
  78. @ApiOperation("删除")
  79. @PostMapping("del")
  80. @Transactional(rollbackFor = Exception.class)
  81. public R del(@RequestBody @Validated SysDictDto.Del del) {
  82. //删除字典
  83. List<Integer> ids = del.getId();
  84. List<SysDict> list = list(new LambdaQueryWrapper<SysDict>().in(SysDict::getId, ids));
  85. removeBatchByIds(ids);
  86. //删除子字典
  87. JList<SysDict> paters = new JArrayList<>(list).filter().isNull(SysDict::getPaterCode).list();
  88. JList<SysDict> paters2 = new JArrayList<>(list).filter().eq(SysDict::getPaterCode, "").list();
  89. if (Emptys.check(paters2)) {
  90. paters.addAll(paters2);
  91. }
  92. if (Emptys.check(paters)) {
  93. JList<String> codes = paters.getProperty(SysDict::getCode);
  94. remove(new LambdaQueryWrapper<SysDict>().in(SysDict::getPaterCode, codes));
  95. }
  96. //刷新redis
  97. list.forEach(sysDict -> refuRedis(sysDict));
  98. return R.ok();
  99. }
  100. @ApiOperation("分页查询")
  101. @PostMapping("page")
  102. public R<PageBean<SysDictDto.Vo>> page(@RequestBody SysDictDto.Page pageInfo) {
  103. PageBean<SysDict> page = pageInfo.getPage();
  104. LambdaQueryWrapper<SysDict> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(pageInfo, SysDict.class)
  105. .ge(SysDict::getCreateTime, pageInfo.getBeginCreateTime())
  106. .le(SysDict::getCreateTime, pageInfo.getEndCreateTime())
  107. .like(SysDict::getMsg)
  108. .like(SysDict::getValue)
  109. .build()
  110. .orderByAsc(!Emptys.check(page.getOrders()), SysDict::getOrders)
  111. .and(StringUtils.isEmpty(pageInfo.getPaterCode()), sysDictLambdaQueryWrapper -> sysDictLambdaQueryWrapper
  112. .isNull(SysDict::getPaterCode)
  113. .or()
  114. .eq(SysDict::getPaterCode, "")
  115. );
  116. IPage<SysDict> iPage = page(toIPage(page), lambdaQueryWrapper);
  117. return R.ok(toPageBean(SysDictDto.Vo.class, iPage));
  118. }
  119. @ApiOperation("集合查询")
  120. @PostMapping("list")
  121. public R<List<SysDictDto.Vo>> list(@RequestBody SysDictDto.SelectList selectList) {
  122. LambdaQueryWrapper<SysDict> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(selectList, SysDict.class)
  123. .in(SysDict::getId, selectList.getIds())
  124. .in(SysDict::getCode, selectList.getCodes())
  125. .in(SysDict::getPaterCode, selectList.getPaterCodes())
  126. .like(SysDict::getMsg)
  127. .like(SysDict::getValue)
  128. .build()
  129. .orderByAsc(SysDict::getOrders);
  130. List<SysDict> list = list(lambdaQueryWrapper);
  131. return R.ok(copy(SysDictDto.Vo.class, list));
  132. }
  133. /**
  134. * 刷新redis
  135. *
  136. * @param sysDict
  137. */
  138. public void refuRedis(SysDict sysDict) {
  139. List<SysDict> list;
  140. String key = sysDict.getPaterCode();
  141. if (!Emptys.check(sysDict.getPaterCode())) {
  142. //父字典
  143. list = list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getPaterCode, sysDict.getCode()).eq(SysDict::getStatus, true));
  144. key = sysDict.getCode();
  145. } else {
  146. //子字典
  147. list = list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getPaterCode, sysDict.getPaterCode()).eq(SysDict::getStatus, true));
  148. }
  149. redisService.removeMap(SysDictUtils.getKey(key));
  150. for (SysDict dict : list) {
  151. redisService.setMap(SysDictUtils.getKey(key), dict.getCode(), copy(SysDictRedis.class, dict));
  152. }
  153. log.info("字典刷新redis完成~");
  154. }
  155. /**
  156. * 全量加载字典到redis
  157. */
  158. @Runners
  159. public void loadRedis() {
  160. List<SysDict> sysDicts = list(new LambdaQueryWrapper<SysDict>().eq(SysDict::getStatus, true));
  161. List<SysDictRedis> sysDictRedis = Beans.copy(SysDictRedis.class, sysDicts);
  162. JList<SysDictRedis> list = new JArrayList<>(sysDictRedis);
  163. //父字典
  164. JList<SysDictRedis> paters = list.filter().isNull(SysDictRedis::getPaterCode).list();
  165. JList<SysDictRedis> paters2 = list.filter().eq(SysDictRedis::getPaterCode, "").list();
  166. if (Emptys.check(paters2)) {
  167. paters.addAll(paters2);
  168. }
  169. redisService.removeLikeMap(SysDictUtils.SYS_DICT_REDIS_PREFIX);
  170. //[父code -> 子列表]数据结构写入redis
  171. paters.forEach(sysDict -> {
  172. JList<SysDictRedis> sysDictJList = list.filter().eq(SysDictRedis::getPaterCode, sysDict.getCode()).list();
  173. sysDictJList.forEach(sysDictRediss -> redisService.setMap(SysDictUtils.getKey(sysDict.getCode()), sysDictRediss.getCode(), sysDictRediss));
  174. });
  175. log.info("字典写入redis完成~");
  176. }
  177. @ApiOperation("集合查询")
  178. @Override
  179. public R<List<SysDictDto.Vo>> dictList(SysDictDto.SelectList selectList) {
  180. return this.list(selectList);
  181. }
  182. }