ソースを参照

Merge remote-tracking branch 'origin/master'

李进 2 年 前
コミット
695d141b4f

+ 0 - 2
sys-api-feign/src/main/java/com/xy/feign/AlgorithmFeign.java

@@ -3,7 +3,6 @@ package com.xy.feign;
 import com.xy.FeignInterceptor;
 import com.xy.consts.ServiceConsts;
 import com.xy.service.AlgorithmService;
-import io.swagger.annotations.Api;
 import org.springframework.cloud.openfeign.FeignClient;
 
 /**
@@ -14,7 +13,6 @@ import org.springframework.cloud.openfeign.FeignClient;
  * @author xy
  * @since 2023-01-12
  */
-@Api(tags = "算法平台feign")
 @FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
 public interface AlgorithmFeign extends AlgorithmService {
 

+ 11 - 0
sys-api-feign/src/main/java/com/xy/feign/SysSceneFeign.java

@@ -0,0 +1,11 @@
+package com.xy.feign;
+
+import com.xy.FeignInterceptor;
+import com.xy.consts.ServiceConsts;
+import com.xy.service.SysSceneService;
+import org.springframework.cloud.openfeign.FeignClient;
+
+@FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
+public interface SysSceneFeign extends SysSceneService {
+
+}

+ 57 - 0
sys-api-service/src/main/java/com/xy/entity/SysScene.java

@@ -0,0 +1,57 @@
+package com.xy.entity;
+
+import com.xy.base.BaseEntity2;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+
+/**
+ * <p>
+ * 场景表
+ * </p>
+ *
+ * @author lijin
+ * @since 2022-12-28
+ */
+@Data
+@Accessors(chain = true)
+public class SysScene extends BaseEntity2<SysScene> {
+
+    /**
+     * 父ID
+     */
+    @ApiModelProperty(value = "父ID")
+    private Long paterId;
+
+    /**
+     * 场景值
+     */
+    @ApiModelProperty(value = "场景值")
+    private String sceneCode;
+
+    /**
+     * 场景名称
+     */
+    @ApiModelProperty(value = "场景名称")
+    private String name;
+
+    /**
+     * 层级
+     */
+    @ApiModelProperty(value = "层级")
+    private Integer level;
+
+    /**
+     * 权重(排序)
+     */
+    @ApiModelProperty(value = "权重(排序)")
+    private Integer weigh;
+
+    /**
+     * 状态;0=隐藏,1=显示
+     */
+    @ApiModelProperty(value = "状态;0=隐藏,1=显示")
+    private Boolean status;
+
+}

+ 21 - 0
sys-api-service/src/main/java/com/xy/mapper/SysSceneMapper.java

@@ -0,0 +1,21 @@
+package com.xy.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xy.entity.SysScene;
+
+/**
+ * <p>
+ * 场景Mapper
+ * </p>
+ *
+ * @author hechunping
+ * @since 2023/2/1
+ */
+public interface SysSceneMapper extends BaseMapper<SysScene> {
+    /**
+     * 获取最大code
+     * @param parent_id
+     * @return 返回最大code
+     */
+    String getMaxCode(Long parent_id);
+}

+ 203 - 0
sys-api-service/src/main/java/com/xy/service/SysSceneServiceImpl.java

@@ -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;
+    }
+}

+ 7 - 0
sys-api-service/src/main/resources/mapper/SysSceneMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xy.mapper.SysSceneMapper">
+    <select id="getMaxCode" resultType="java.lang.String">
+        SELECT max(scene_code) as maxCode FROM sys_scene WHERE (pater_id = #{paterId})
+    </select>
+</mapper>

+ 94 - 0
sys-api/src/main/java/com/xy/dto/SysSceneDto.java

@@ -0,0 +1,94 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 场景DTO
+ * </p>
+ *
+ * @author hechunping
+ * @since 2023/2/1
+ */
+@Data
+@Accessors(chain = true)
+public class SysSceneDto {
+
+    @Data
+    public static class IdListDto {
+        @NotEmpty(message = "ID数组不可为空")
+        @ApiModelProperty(value = "ID数组", required = true)
+        private List<Long> idList;
+    }
+    @Data
+    @Accessors(chain = true)
+    public static class SceneListDto{
+        @ApiModelProperty(value = "父ID")
+        private Long paterId;
+
+        @ApiModelProperty(value = "显示全部列,默认为不显示")
+        private Boolean allColumn;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Save{
+        private Long id;
+
+        @ApiModelProperty(value = "父ID")
+        private Long paterId;
+
+        @ApiModelProperty(value = "场景值")
+        private String sceneCode;
+
+        @NotBlank(message = "场景名称不能为空")
+        @ApiModelProperty(value = "场景名称",required = true)
+        private String name;
+
+        @ApiModelProperty(value = "权重(排序)")
+        private Integer weigh;
+
+        @ApiModelProperty(value = "状态;0=隐藏,1=显示")
+        private Boolean status;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo{
+        private Long id;
+
+        @ApiModelProperty(value = "父ID")
+        private Long paterId;
+
+        @ApiModelProperty(value = "场景值")
+        private String sceneCode;
+
+        @ApiModelProperty(value = "场景名称")
+        private String name;
+
+        @ApiModelProperty(value = "层级")
+        private Integer level;
+
+        @ApiModelProperty(value = "权重(排序)")
+        private Integer weigh;
+
+        @ApiModelProperty(value = "状态;0=隐藏,1=显示")
+        private Boolean status;
+
+        @ApiModelProperty("创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty("更新时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
+    }
+}

+ 44 - 0
sys-api/src/main/java/com/xy/service/SysSceneService.java

@@ -0,0 +1,44 @@
+package com.xy.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.xy.annotate.RestMappingController;
+import com.xy.dto.SysSceneDto;
+import com.xy.utils.R;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 场景服务
+ * </p>
+ *
+ * @author hechunping
+ * @since 2023/2/1
+ */
+@RestMappingController("sys-scene")
+public interface SysSceneService {
+    /**
+     * 场景树
+     * @return
+     */
+    @PostMapping("tree")
+    R<List<Tree<Long>>> tree(@RequestBody SysSceneDto.SceneListDto Pater);
+
+    /**
+     * 对象查询
+     * @return
+     */
+    @PostMapping("obj")
+    R<SysSceneDto.Vo> obj(@RequestBody SysSceneDto.Vo vo);
+
+    /**
+     * 查询下一级列表
+     * @param pater
+     * @return
+     */
+    @PostMapping("nextList")
+    R<List<SysSceneDto.Vo>> nextList(@RequestBody @Validated SysSceneDto.SceneListDto pater);
+}