|
@@ -0,0 +1,203 @@
|
|
|
|
+package com.xy.service;
|
|
|
|
+
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
|
+import cn.hutool.core.lang.tree.Tree;
|
|
|
|
+import cn.hutool.core.lang.tree.TreeNode;
|
|
|
|
+import cn.hutool.core.lang.tree.TreeUtil;
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
+import com.xy.dto.SysSceneDto;
|
|
|
|
+import com.xy.entity.SysScene;
|
|
|
|
+import com.xy.mapper.SysSceneMapper;
|
|
|
|
+import com.xy.utils.*;
|
|
|
|
+import io.swagger.annotations.Api;
|
|
|
|
+import io.swagger.annotations.ApiOperation;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.validation.annotation.Validated;
|
|
|
|
+import org.springframework.web.bind.annotation.PostMapping;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestBody;
|
|
|
|
+
|
|
|
|
+import java.util.Comparator;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
+
|
|
|
|
+import static com.xy.utils.Beans.copy;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * <p>
|
|
|
|
+ * 场景服务实现类
|
|
|
|
+ * </p>
|
|
|
|
+ *
|
|
|
|
+ * @author hechunping
|
|
|
|
+ * @since 2023/2/1
|
|
|
|
+ */
|
|
|
|
+@Slf4j
|
|
|
|
+@Service
|
|
|
|
+@Api(tags = "场景")
|
|
|
|
+public class SysSceneServiceImpl extends ServiceImpl<SysSceneMapper, SysScene> implements SysSceneService {
|
|
|
|
+ /**
|
|
|
|
+ * 每层code长度
|
|
|
|
+ */
|
|
|
|
+ static final int CODE_LENGTH = 3;
|
|
|
|
+ /**
|
|
|
|
+ * code最大值
|
|
|
|
+ */
|
|
|
|
+ static final int CODE_MAX = 999;
|
|
|
|
+
|
|
|
|
+ @ApiOperation("场景树")
|
|
|
|
+ @Override
|
|
|
|
+ public R<List<Tree<Long>>> tree(SysSceneDto.SceneListDto pater) {
|
|
|
|
+ Long parentId = Emptys.check(pater.getPaterId()) ? pater.getPaterId() : 0L;
|
|
|
|
+ List<SysSceneDto.Vo> list = copy(SysSceneDto.Vo.class, list(null));
|
|
|
|
+ List<TreeNode<Long>> collect = list.stream()
|
|
|
|
+ .filter(item -> !item.getId().equals(item.getPaterId()))
|
|
|
|
+ .sorted(Comparator.comparingInt(SysSceneDto.Vo::getWeigh))
|
|
|
|
+ .map(item -> {
|
|
|
|
+ TreeNode<Long> treeNode = new TreeNode();
|
|
|
|
+ treeNode.setId(item.getId());
|
|
|
|
+ treeNode.setParentId(item.getPaterId());
|
|
|
|
+ treeNode.setName(item.getName());
|
|
|
|
+ treeNode.setWeight(item.getWeigh());
|
|
|
|
+ Map<String, Object> extra = new HashMap<>(1);
|
|
|
|
+ extra.put(LambdaUtils.getProperty(SysScene::getSceneCode), item.getSceneCode());
|
|
|
|
+ if (Emptys.check(pater.getAllColumn()) && pater.getAllColumn()) {
|
|
|
|
+ extra.put(LambdaUtils.getProperty(SysScene::getLevel), item.getLevel());
|
|
|
|
+ extra.put(LambdaUtils.getProperty(SysScene::getWeigh), item.getWeigh());
|
|
|
|
+ extra.put(LambdaUtils.getProperty(SysScene::getStatus), item.getStatus());
|
|
|
|
+ extra.put(LambdaUtils.getProperty(SysScene::getCreateTime), item.getCreateTime());
|
|
|
|
+ }
|
|
|
|
+ treeNode.setExtra(extra);
|
|
|
|
+ return treeNode;
|
|
|
|
+ })
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
+ return R.ok(TreeUtil.build(collect, parentId));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ @ApiOperation("查询下一级列表")
|
|
|
|
+ public R<List<SysSceneDto.Vo>> nextList(@RequestBody @Validated SysSceneDto.SceneListDto pater) {
|
|
|
|
+ Long parentId = Emptys.check(pater.getPaterId()) ? pater.getPaterId() : 0L;
|
|
|
|
+ LambdaQueryWrapper<SysScene> lqw = new LambdaQueryWrapper<>();
|
|
|
|
+ lqw.eq(SysScene::getPaterId, parentId);
|
|
|
|
+ if (!Emptys.check(pater.getAllColumn()) || !pater.getAllColumn()) {
|
|
|
|
+ lqw.select(SysScene::getId, SysScene::getSceneCode, SysScene::getName);
|
|
|
|
+ }
|
|
|
|
+ return R.ok(copy(SysSceneDto.Vo.class, list(lqw)));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @ApiOperation(value = "删除", notes = "有子类不能删除")
|
|
|
|
+ @PostMapping("del")
|
|
|
|
+ public R deleteById(@RequestBody @Validated SysSceneDto.IdListDto idListDto) {
|
|
|
|
+ List<Long> idList = idListDto.getIdList();
|
|
|
|
+ //判断是否有子类
|
|
|
|
+ LambdaQueryWrapper<SysScene> lambdaQueryWrapper = Wrappers.<SysScene>lambdaQuery().in(SysScene::getPaterId, idList).last("limit 1");
|
|
|
|
+ List<SysScene> list = list(lambdaQueryWrapper);
|
|
|
|
+ if (CollUtil.isNotEmpty(list)) {
|
|
|
|
+ return R.fail("有子类不能删除!");
|
|
|
|
+ }
|
|
|
|
+ return R.ok(removeBatchByIds(idList));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @ApiOperation("对象查询")
|
|
|
|
+ @Override
|
|
|
|
+ public R<SysSceneDto.Vo> obj(SysSceneDto.Vo vo) {
|
|
|
|
+ LambdaQueryWrapper<SysScene> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(vo, SysScene.class).build()
|
|
|
|
+ .last("limit 1");
|
|
|
|
+ SysScene sysScene = baseMapper.selectOne(lambdaQueryWrapper);
|
|
|
|
+ if (Emptys.check(sysScene)) {
|
|
|
|
+ return R.ok(copy(SysSceneDto.Vo.class, sysScene));
|
|
|
|
+ } else {
|
|
|
|
+ return R.ok();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @ApiOperation(value = "新增、更新场景", notes = "不传id为新增,传id为修改")
|
|
|
|
+ @PostMapping("saveOrUpdate")
|
|
|
|
+ public R saveOrUpdate(@Validated @RequestBody SysSceneDto.Save saveDto) {
|
|
|
|
+ Long id = saveDto.getId();
|
|
|
|
+ boolean isAdd = id == null || id == 0;
|
|
|
|
+ LambdaQueryWrapper<SysScene> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
|
|
|
+ lambdaQueryWrapper.eq(SysScene::getName, saveDto.getName()).last("limit 1").select(SysScene::getId);
|
|
|
|
+ SysScene existsSysScene = getOne(lambdaQueryWrapper);
|
|
|
|
+ if (existsSysScene != null) {
|
|
|
|
+ if (isAdd) {
|
|
|
|
+ return R.fail("场景已存在");
|
|
|
|
+ } else {
|
|
|
|
+ if (existsSysScene.getId().longValue() != saveDto.getId().longValue()) {
|
|
|
|
+ return R.fail("场景已存在");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ SysScene paterSysScene = null;
|
|
|
|
+ if (saveDto.getPaterId() != null && saveDto.getPaterId() > 0) {
|
|
|
|
+ //查找父类
|
|
|
|
+ paterSysScene = baseMapper.selectById(saveDto.getPaterId());
|
|
|
|
+ if (paterSysScene == null) {
|
|
|
|
+ return R.fail("父节点错误");
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ saveDto.setPaterId(0L);
|
|
|
|
+ }
|
|
|
|
+ SysScene sysSceneSave = PlusBeans.copy(SysScene.class, saveDto);
|
|
|
|
+ if (isAdd) {
|
|
|
|
+ if (paterSysScene != null) {
|
|
|
|
+ sysSceneSave.setLevel(paterSysScene.getLevel() + 1);
|
|
|
|
+ } else {
|
|
|
|
+ sysSceneSave.setLevel(1);
|
|
|
|
+ }
|
|
|
|
+ sysSceneSave.setSceneCode(maxCode(paterSysScene));
|
|
|
|
+ sysSceneSave.createId().createUserTime(AuthorizeUtils.getLoginId(Long.class));
|
|
|
|
+ baseMapper.insert(sysSceneSave);
|
|
|
|
+ } else {
|
|
|
|
+ //查询一下自己
|
|
|
|
+ SysScene selfSysScene = getById(saveDto.getId());
|
|
|
|
+ //判断是否更改了父类
|
|
|
|
+ if (saveDto.getPaterId() != null && saveDto.getPaterId().longValue() != selfSysScene.getPaterId().longValue()) {
|
|
|
|
+ //更改了父类,重新生成code
|
|
|
|
+ sysSceneSave.setSceneCode(maxCode(paterSysScene));
|
|
|
|
+ }
|
|
|
|
+ sysSceneSave.updateUserTime(AuthorizeUtils.getLoginId(Long.class));
|
|
|
|
+ baseMapper.updateById(sysSceneSave);
|
|
|
|
+ }
|
|
|
|
+ return R.ok();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 生成级联CODE
|
|
|
|
+ *
|
|
|
|
+ * @param pater 父类实例
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private String maxCode(SysScene pater) {
|
|
|
|
+ int level = 1;
|
|
|
|
+ //父类目ID
|
|
|
|
+ Long parentId = 0L;
|
|
|
|
+ //父类目CODE,拼接用
|
|
|
|
+ String parentCode = "";
|
|
|
|
+ if (Emptys.check(pater)) {
|
|
|
|
+ level = pater.getLevel().intValue() + 1;
|
|
|
|
+ parentId = pater.getId();
|
|
|
|
+ parentCode = pater.getSceneCode();
|
|
|
|
+ }
|
|
|
|
+ //查询最大code
|
|
|
|
+ String maxCode = baseMapper.getMaxCode(parentId);
|
|
|
|
+ Integer subCode = level == 1 ? 101 : 001;
|
|
|
|
+ String code = level == 1 ? subCode.toString() : String.format("%0" + CODE_LENGTH + "d", subCode);
|
|
|
|
+ if (Emptys.check(maxCode)) {
|
|
|
|
+ subCode = Integer.parseInt(maxCode.substring(maxCode.length() - CODE_LENGTH)) + 1;
|
|
|
|
+ //超过最大数量会有异常,直接返回NULL
|
|
|
|
+ if (level > 1 && subCode > CODE_MAX) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ //补0
|
|
|
|
+ code = String.format("%0" + CODE_LENGTH + "d", subCode);
|
|
|
|
+ }
|
|
|
|
+ //拼接
|
|
|
|
+ code = parentCode + code;
|
|
|
|
+ return code;
|
|
|
|
+ }
|
|
|
|
+}
|