123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- 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;
- }
- }
|