SysSceneServiceImpl.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package com.xy.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.lang.tree.Tree;
  4. import cn.hutool.core.lang.tree.TreeNode;
  5. import cn.hutool.core.lang.tree.TreeUtil;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import com.xy.dto.SysSceneDto;
  10. import com.xy.entity.SysScene;
  11. import com.xy.mapper.SysSceneMapper;
  12. import com.xy.utils.*;
  13. import io.swagger.annotations.Api;
  14. import io.swagger.annotations.ApiOperation;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.validation.annotation.Validated;
  18. import org.springframework.web.bind.annotation.PostMapping;
  19. import org.springframework.web.bind.annotation.RequestBody;
  20. import java.util.Comparator;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.stream.Collectors;
  25. import static com.xy.utils.Beans.copy;
  26. /**
  27. * <p>
  28. * 场景服务实现类
  29. * </p>
  30. *
  31. * @author hechunping
  32. * @since 2023/2/1
  33. */
  34. @Slf4j
  35. @Service
  36. @Api(tags = "场景")
  37. public class SysSceneServiceImpl extends ServiceImpl<SysSceneMapper, SysScene> implements SysSceneService {
  38. /**
  39. * 每层code长度
  40. */
  41. static final int CODE_LENGTH = 3;
  42. /**
  43. * code最大值
  44. */
  45. static final int CODE_MAX = 999;
  46. @ApiOperation("场景树")
  47. @Override
  48. public R<List<Tree<Long>>> tree(SysSceneDto.SceneListDto pater) {
  49. Long parentId = Emptys.check(pater.getPaterId()) ? pater.getPaterId() : 0L;
  50. List<SysSceneDto.Vo> list = copy(SysSceneDto.Vo.class, list(null));
  51. List<TreeNode<Long>> collect = list.stream()
  52. .filter(item -> !item.getId().equals(item.getPaterId()))
  53. .sorted(Comparator.comparingInt(SysSceneDto.Vo::getWeigh))
  54. .map(item -> {
  55. TreeNode<Long> treeNode = new TreeNode();
  56. treeNode.setId(item.getId());
  57. treeNode.setParentId(item.getPaterId());
  58. treeNode.setName(item.getName());
  59. treeNode.setWeight(item.getWeigh());
  60. Map<String, Object> extra = new HashMap<>(1);
  61. extra.put(LambdaUtils.getProperty(SysScene::getSceneCode), item.getSceneCode());
  62. if (Emptys.check(pater.getAllColumn()) && pater.getAllColumn()) {
  63. extra.put(LambdaUtils.getProperty(SysScene::getLevel), item.getLevel());
  64. extra.put(LambdaUtils.getProperty(SysScene::getWeigh), item.getWeigh());
  65. extra.put(LambdaUtils.getProperty(SysScene::getStatus), item.getStatus());
  66. extra.put(LambdaUtils.getProperty(SysScene::getCreateTime), item.getCreateTime());
  67. }
  68. treeNode.setExtra(extra);
  69. return treeNode;
  70. })
  71. .collect(Collectors.toList());
  72. return R.ok(TreeUtil.build(collect, parentId));
  73. }
  74. @Override
  75. @ApiOperation("查询下一级列表")
  76. public R<List<SysSceneDto.Vo>> nextList(@RequestBody @Validated SysSceneDto.SceneListDto pater) {
  77. Long parentId = Emptys.check(pater.getPaterId()) ? pater.getPaterId() : 0L;
  78. LambdaQueryWrapper<SysScene> lqw = new LambdaQueryWrapper<>();
  79. lqw.eq(SysScene::getPaterId, parentId);
  80. if (!Emptys.check(pater.getAllColumn()) || !pater.getAllColumn()) {
  81. lqw.select(SysScene::getId, SysScene::getSceneCode, SysScene::getName);
  82. }
  83. return R.ok(copy(SysSceneDto.Vo.class, list(lqw)));
  84. }
  85. @ApiOperation(value = "删除", notes = "有子类不能删除")
  86. @PostMapping("del")
  87. public R deleteById(@RequestBody @Validated SysSceneDto.IdListDto idListDto) {
  88. List<Long> idList = idListDto.getIdList();
  89. //判断是否有子类
  90. LambdaQueryWrapper<SysScene> lambdaQueryWrapper = Wrappers.<SysScene>lambdaQuery().in(SysScene::getPaterId, idList).last("limit 1");
  91. List<SysScene> list = list(lambdaQueryWrapper);
  92. if (CollUtil.isNotEmpty(list)) {
  93. return R.fail("有子类不能删除!");
  94. }
  95. return R.ok(removeBatchByIds(idList));
  96. }
  97. @ApiOperation("对象查询")
  98. @Override
  99. public R<SysSceneDto.Vo> obj(SysSceneDto.Vo vo) {
  100. LambdaQueryWrapper<SysScene> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(vo, SysScene.class).build()
  101. .last("limit 1");
  102. SysScene sysScene = baseMapper.selectOne(lambdaQueryWrapper);
  103. if (Emptys.check(sysScene)) {
  104. return R.ok(copy(SysSceneDto.Vo.class, sysScene));
  105. } else {
  106. return R.ok();
  107. }
  108. }
  109. @ApiOperation(value = "新增、更新场景", notes = "不传id为新增,传id为修改")
  110. @PostMapping("saveOrUpdate")
  111. public R saveOrUpdate(@Validated @RequestBody SysSceneDto.Save saveDto) {
  112. Long id = saveDto.getId();
  113. boolean isAdd = id == null || id == 0;
  114. LambdaQueryWrapper<SysScene> lambdaQueryWrapper = Wrappers.lambdaQuery();
  115. lambdaQueryWrapper.eq(SysScene::getName, saveDto.getName()).last("limit 1").select(SysScene::getId);
  116. SysScene existsSysScene = getOne(lambdaQueryWrapper);
  117. if (existsSysScene != null) {
  118. if (isAdd) {
  119. return R.fail("场景已存在");
  120. } else {
  121. if (existsSysScene.getId().longValue() != saveDto.getId().longValue()) {
  122. return R.fail("场景已存在");
  123. }
  124. }
  125. }
  126. SysScene paterSysScene = null;
  127. if (saveDto.getPaterId() != null && saveDto.getPaterId() > 0) {
  128. //查找父类
  129. paterSysScene = baseMapper.selectById(saveDto.getPaterId());
  130. if (paterSysScene == null) {
  131. return R.fail("父节点错误");
  132. }
  133. } else {
  134. saveDto.setPaterId(0L);
  135. }
  136. SysScene sysSceneSave = PlusBeans.copy(SysScene.class, saveDto);
  137. if (isAdd) {
  138. if (paterSysScene != null) {
  139. sysSceneSave.setLevel(paterSysScene.getLevel() + 1);
  140. } else {
  141. sysSceneSave.setLevel(1);
  142. }
  143. sysSceneSave.setSceneCode(maxCode(paterSysScene));
  144. sysSceneSave.createId().createUserTime(AuthorizeUtils.getLoginId(Long.class));
  145. baseMapper.insert(sysSceneSave);
  146. } else {
  147. //查询一下自己
  148. SysScene selfSysScene = getById(saveDto.getId());
  149. //判断是否更改了父类
  150. if (saveDto.getPaterId() != null && saveDto.getPaterId().longValue() != selfSysScene.getPaterId().longValue()) {
  151. //更改了父类,重新生成code
  152. sysSceneSave.setSceneCode(maxCode(paterSysScene));
  153. }
  154. sysSceneSave.updateUserTime(AuthorizeUtils.getLoginId(Long.class));
  155. baseMapper.updateById(sysSceneSave);
  156. }
  157. return R.ok();
  158. }
  159. /**
  160. * 生成级联CODE
  161. *
  162. * @param pater 父类实例
  163. * @return
  164. */
  165. private String maxCode(SysScene pater) {
  166. int level = 1;
  167. //父类目ID
  168. Long parentId = 0L;
  169. //父类目CODE,拼接用
  170. String parentCode = "";
  171. if (Emptys.check(pater)) {
  172. level = pater.getLevel().intValue() + 1;
  173. parentId = pater.getId();
  174. parentCode = pater.getSceneCode();
  175. }
  176. //查询最大code
  177. String maxCode = baseMapper.getMaxCode(parentId);
  178. Integer subCode = level == 1 ? 101 : 001;
  179. String code = level == 1 ? subCode.toString() : String.format("%0" + CODE_LENGTH + "d", subCode);
  180. if (Emptys.check(maxCode)) {
  181. subCode = Integer.parseInt(maxCode.substring(maxCode.length() - CODE_LENGTH)) + 1;
  182. //超过最大数量会有异常,直接返回NULL
  183. if (level > 1 && subCode > CODE_MAX) {
  184. return null;
  185. }
  186. //补0
  187. code = String.format("%0" + CODE_LENGTH + "d", subCode);
  188. }
  189. //拼接
  190. code = parentCode + code;
  191. return code;
  192. }
  193. }