Browse Source

栋舍管理

Newspaper 1 year ago
parent
commit
ae121dde56

+ 72 - 0
admin/src/main/java/com/your/packages/pigpen/controller/BasePigpenController.java

@@ -0,0 +1,72 @@
+package com.your.packages.pigpen.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.hccake.ballcat.common.model.result.BaseResultCode;
+import com.hccake.ballcat.common.model.result.R;
+import com.hccake.ballcat.system.model.dto.SysOrganizationDTO;
+import com.your.packages.pigpen.entity.BasePigpen;
+import com.your.packages.pigpen.entity.Vo.BasePigpenTree;
+import com.your.packages.pigpen.service.IBasePigpenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.parameters.P;
+import org.springframework.web.bind.annotation.*;
+
+import javax.xml.ws.Action;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-23
+ */
+@RestController
+@RequestMapping("/base-pigpen")
+@CrossOrigin
+public class BasePigpenController {
+
+	@Autowired
+	private IBasePigpenService basePigpenService;
+
+	@PostMapping("/list")
+	public R list(@RequestBody Map<String, String> paramsMap) {
+		String organizationId = paramsMap.get("organizationId");
+		List<BasePigpen> basePigpenList = basePigpenService
+			.list(new QueryWrapper<BasePigpen>().eq("organization_id", organizationId));
+		if (CollUtil.isEmpty(basePigpenList)) {
+			return R.ok(new ArrayList());
+		}
+		else {
+			basePigpenList.stream().sorted(Comparator.comparingInt(BasePigpen::getSort));
+			return R.ok(basePigpenList);
+		}
+	}
+
+	@PostMapping("/tree")
+	public R<List<BasePigpenTree>> tree(@RequestBody Map<String, String> paramsMap) {
+		String organizationId = paramsMap.get("organizationId");
+		return R.ok();
+	}
+
+	@PostMapping("/update")
+	public R updete(@RequestBody BasePigpen basePigpen) {
+		return basePigpenService.updatePigpen(basePigpen);
+	}
+
+	@PostMapping("/delete")
+	public R delete(@RequestBody Map<String, String> paramsMap) {
+		return basePigpenService.delete(paramsMap);
+	}
+
+	@PostMapping("/save")
+	public R save(@RequestBody BasePigpen basePigpen) {
+		return basePigpenService.create(basePigpen);
+	}
+
+}

+ 52 - 0
admin/src/main/java/com/your/packages/pigpen/entity/BasePigpen.java

@@ -0,0 +1,52 @@
+package com.your.packages.pigpen.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-23
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_pigpen")
+public class BasePigpen implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	@TableId(value = "id", type = IdType.AUTO)
+	private Long id;
+
+	@TableField("build_name")
+	private String buildName;
+
+	@TableField("parent_id")
+	private Long parentId;
+
+	@TableField("hierarchy")
+	private String hierarchy;
+
+	@TableField("depth")
+	private Integer depth;
+
+	@TableField("remarks")
+	private String remarks;
+
+	@TableField("organization_id")
+	private Integer organizationId;
+
+	@TableField("sort")
+	private Integer sort;
+
+}

+ 20 - 0
admin/src/main/java/com/your/packages/pigpen/entity/Vo/BasePigpenMoveChildParam.java

@@ -0,0 +1,20 @@
+package com.your.packages.pigpen.entity.Vo;
+
+import lombok.Data;
+
+@Data
+public class BasePigpenMoveChildParam {
+
+	private Long parentId;
+
+	private String originParentHierarchy;
+
+	private int originParentHierarchyLengthPlusOne;
+
+	private String targetParentHierarchy;
+
+	private Integer depthDiff;
+
+	private String grandsonConditionalStatement;
+
+}

+ 52 - 0
admin/src/main/java/com/your/packages/pigpen/entity/Vo/BasePigpenTree.java

@@ -0,0 +1,52 @@
+package com.your.packages.pigpen.entity.Vo;
+
+import com.hccake.ballcat.common.util.tree.TreeNode;
+import com.hccake.ballcat.system.model.vo.SysOrganizationTree;
+import com.your.packages.pigpen.entity.BasePigpen;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class BasePigpenTree implements TreeNode<Long> {
+
+	private Long id;
+
+	private String name;
+
+	private Long parentId;
+
+	private String hierarchy;
+
+	private Integer depth;
+
+	private String remarks;
+
+	private Integer organizationId;
+
+	private Integer sort;
+
+	List<BasePigpen> children = new ArrayList<>();
+
+	@Override
+	public Long getKey() {
+		return this.id;
+	}
+
+	@Override
+	public Long getParentKey() {
+		return this.parentId;
+	}
+
+	@Override
+	public <T extends TreeNode<Long>> void setChildren(List<T> list) {
+		this.children = children;
+	}
+
+	@Override
+	public List<BasePigpen> getChildren() {
+		return this.children;
+	}
+
+}

+ 19 - 0
admin/src/main/java/com/your/packages/pigpen/mapper/BasePigpenMapper.java

@@ -0,0 +1,19 @@
+package com.your.packages.pigpen.mapper;
+
+import com.your.packages.pigpen.entity.BasePigpen;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.your.packages.pigpen.entity.Vo.BasePigpenMoveChildParam;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-23
+ */
+public interface BasePigpenMapper extends BaseMapper<BasePigpen> {
+
+	void followMoveChildNode(BasePigpenMoveChildParam param);
+
+}

+ 25 - 0
admin/src/main/java/com/your/packages/pigpen/service/IBasePigpenService.java

@@ -0,0 +1,25 @@
+package com.your.packages.pigpen.service;
+
+import com.hccake.ballcat.common.model.result.R;
+import com.your.packages.pigpen.entity.BasePigpen;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-23
+ */
+public interface IBasePigpenService extends IService<BasePigpen> {
+
+	R create(BasePigpen basePigpen);
+
+	R delete(Map<String, String> paramsMap);
+
+	R updatePigpen(BasePigpen basePigpen);
+
+}

+ 119 - 0
admin/src/main/java/com/your/packages/pigpen/service/impl/BasePigpenServiceImpl.java

@@ -0,0 +1,119 @@
+package com.your.packages.pigpen.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ArrayUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
+import com.hccake.ballcat.common.core.constant.GlobalConstants;
+import com.hccake.ballcat.common.model.result.BaseResultCode;
+import com.hccake.ballcat.common.model.result.R;
+import com.your.packages.pigpen.entity.BasePigpen;
+import com.your.packages.pigpen.entity.Vo.BasePigpenMoveChildParam;
+import com.your.packages.pigpen.mapper.BasePigpenMapper;
+import com.your.packages.pigpen.service.IBasePigpenService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-23
+ */
+@Service
+public class BasePigpenServiceImpl extends ServiceImpl<BasePigpenMapper, BasePigpen> implements IBasePigpenService {
+
+	@Autowired
+	private BasePigpenMapper basePigpenMapper;
+
+	@Override
+	public R create(BasePigpen basePigpen) {
+		Long count = basePigpenMapper
+			.selectCount(new QueryWrapper<BasePigpen>().eq("build_name", basePigpen.getBuildName())
+				.eq("organization_id", basePigpen.getOrganizationId()));
+		if (count > 0) {
+			return R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "该栋舍名称已存在");
+		}
+		fillDepthAndHierarchy(basePigpen, basePigpen.getParentId());
+		return SqlHelper.retBool(basePigpenMapper.insert(basePigpen)) ? R.ok()
+				: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "新增栋舍失败");
+	}
+
+	@Override
+	public R delete(Map<String, String> paramsMap) {
+		String id = paramsMap.get("id");
+		List<BasePigpen> basePigpenList = basePigpenMapper
+			.selectList(new QueryWrapper<BasePigpen>().eq("parent_id", id));
+		if (CollUtil.isNotEmpty(basePigpenList)) {
+			return R.failed(BaseResultCode.LOGIC_CHECK_ERROR.getCode(), "该栋舍拥有下级栋舍,不能删除!");
+		}
+		return SqlHelper.retBool(basePigpenMapper.deleteById(id)) ? R.ok()
+				: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除栋舍失败");
+	}
+
+	@Override
+	public R updatePigpen(BasePigpen newBasePigpen) {
+		Long id = newBasePigpen.getId();
+		BasePigpen originBasePigpen = basePigpenMapper.selectById(id);
+		Long targetParentId = originBasePigpen.getParentId();
+		if (originBasePigpen.getParentId().equals(targetParentId)) {
+			return SqlHelper.retBool(basePigpenMapper.updateById(newBasePigpen)) ? R.ok()
+					: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "更新栋舍失败");
+		}
+		else {
+			if (targetParentId.equals(id)) {
+				return R.failed(BaseResultCode.LOGIC_CHECK_ERROR.getCode(), "父节点不能是自己!");
+			}
+			if (!GlobalConstants.TREE_ROOT_ID_LONG.equals(targetParentId)) {
+				BasePigpen targetBasePigpen = basePigpenMapper.selectById(targetParentId);
+				String[] targetParentHierarchy = targetBasePigpen.getHierarchy().split("-");
+				if (ArrayUtil.contains(targetParentHierarchy, String.valueOf(id))) {
+					return R.failed(BaseResultCode.LOGIC_CHECK_ERROR.getCode(), "父节点不能是自己的子节点!");
+				}
+			}
+			fillDepthAndHierarchy(newBasePigpen, targetParentId);
+			BasePigpenMoveChildParam param = getBasePigpenMoveChildParam(newBasePigpen, originBasePigpen);
+			basePigpenMapper.followMoveChildNode(param);
+			return SqlHelper.retBool(basePigpenMapper.updateById(newBasePigpen)) ? R.ok()
+					: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "更新栋舍失败");
+		}
+
+	}
+
+	private BasePigpenMoveChildParam getBasePigpenMoveChildParam(BasePigpen newBasePigpen,
+			BasePigpen originBasePigpen) {
+		Long parentId = newBasePigpen.getId();
+		String originParentHierarchy = originBasePigpen.getHierarchy();
+		String targetParentHierarchy = newBasePigpen.getHierarchy();
+		int depthDiff = originBasePigpen.getDepth() - newBasePigpen.getDepth();
+		BasePigpenMoveChildParam param = new BasePigpenMoveChildParam();
+		param.setParentId(parentId);
+		param.setOriginParentHierarchy(originParentHierarchy);
+		param.setOriginParentHierarchyLengthPlusOne(originParentHierarchy.length() + 1);
+		param.setTargetParentHierarchy(targetParentHierarchy);
+		param.setDepthDiff(depthDiff);
+		param.setGrandsonConditionalStatement(originParentHierarchy + "-" + parentId + "-%");
+		return param;
+	}
+
+	private void fillDepthAndHierarchy(BasePigpen basePigpen, Long parentId) {
+		if (GlobalConstants.TREE_ROOT_ID_LONG.equals(parentId)) {
+			basePigpen.setDepth(1);
+			basePigpen.setHierarchy(GlobalConstants.TREE_ROOT_ID_LONG.toString());
+		}
+		else {
+			BasePigpen parentPigpen = basePigpenMapper.selectById(parentId);
+			Assert.notNull(parentPigpen, "不存在的父级栋舍!", new Object[0]);
+			basePigpen.setDepth(parentPigpen.getDepth() + 1);
+			basePigpen.setHierarchy(parentPigpen.getHierarchy() + "-" + parentPigpen.getId());
+		}
+	}
+
+}

+ 26 - 0
admin/src/main/resources/mapper/BasePigpenMapper.xml

@@ -0,0 +1,26 @@
+<?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.your.packages.pigpen.mapper.BasePigpenMapper">
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, name, parent_id, hierarchy, depth, remarks, organization_id, sort
+    </sql>
+
+
+	<update id="followMoveChildNode">
+		UPDATE
+			base_pigpen
+		SET
+		    hierarchy = CONCAT(#{param.targetParentHierarchy},
+		    SUBSTR(hierarchy, ${param.originParentHierarchyLengthPlusOne})),
+			depth = depth - #{param.depthDiff}
+		WHERE
+		    deleted = 0
+		    AND  (
+				parent_id = #{param.parentId}  -- 儿子节点
+				OR
+				hierarchy like #{param.grandsonConditionalStatement} -- 孙子节点
+			)
+	</update>
+</mapper>