Browse Source

组织新增

Gaokun Wang 1 month ago
parent
commit
d6655c771f

+ 32 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/constant/Constants.java

@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.orm.constant;
+
+
+/**
+ * @description Constants 全局常量
+ *
+ * @author GaoKunW
+ * @date 2025/7/2 11:04
+ */
+public class Constants {
+
+    /**
+     * 正常状态
+     */
+    public static final String NORMAL = "1";
+
+    /**
+     * 停用状态
+     */
+    public static final String DISABLE = "0";
+
+    /**
+     * 校验是否唯一的返回标识
+     */
+    public final static boolean UNIQUE = true;
+    public final static boolean NOT_UNIQUE = false;
+}

+ 8 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/pojo/CommonResult.java

@@ -14,6 +14,7 @@ import lombok.NoArgsConstructor;
 import org.eco.vip.orm.exception.BusinessException;
 import org.eco.vip.orm.exception.ErrorCode;
 import org.eco.vip.orm.exception.enums.GlobalErrorCode;
+import org.eco.vip.orm.utils.StrUtils;
 import org.springframework.util.Assert;
 
 import java.io.Serializable;
@@ -73,6 +74,13 @@ public class CommonResult<T> implements Serializable {
         return result;
     }
 
+    public static <T> CommonResult<T> fail(String message, Object... msgParams) {
+        CommonResult<T> result = new CommonResult<>();
+        result.code = GlobalErrorCode.INTERNAL_SERVER_ERROR.getCode();
+        result.msg = StrUtils.format(message, msgParams);
+        return result;
+    }
+
     public static <T> CommonResult<T> fail(ErrorCode errorCode) {
         return fail(errorCode.getCode(), errorCode.getMsg());
     }

+ 40 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/MapstructUtils.java

@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.orm.utils;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import io.github.linpeilie.Converter;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description MapstructUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/2 10:58
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class MapstructUtils {
+    private final static Converter CONVERTER = SpringUtils.getBean(Converter.class);
+
+    /**
+     * 将 T 类型对象,转换为 desc 类型的对象并返回
+     *
+     * @param source 数据来源实体
+     * @param desc   描述对象 转换后的对象
+     * @return desc
+     */
+    public static <T, V> V convert(T source, Class<V> desc) {
+        if (ObjectUtil.isNull(source)) {
+            return null;
+        }
+        if (ObjectUtil.isNull(desc)) {
+            return null;
+        }
+        return CONVERTER.convert(source, desc);
+    }
+}

+ 18 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/ObjUtils.java

@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.orm.utils;
+
+
+import cn.hutool.core.util.ObjUtil;
+
+/**
+ * @description ObjUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/2 11:15
+ */
+public class ObjUtils extends ObjUtil {
+}

+ 18 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/RandomUtils.java

@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.orm.utils;
+
+
+import cn.hutool.core.util.RandomUtil;
+
+/**
+ * @description RandomUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/2 13:45
+ */
+public class RandomUtils extends RandomUtil {
+}

+ 70 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/org/OrgController.java

@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.controller.org;
+
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
+import org.eco.vip.auth.domain.org.vo.OrgBO;
+import org.eco.vip.auth.domain.org.vo.OrgVO;
+import org.eco.vip.auth.service.org.IOrgService;
+import org.eco.vip.orm.pojo.CommonResult;
+import org.eco.vip.orm.pojo.PageResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static org.eco.vip.orm.pojo.CommonResult.fail;
+import static org.eco.vip.orm.pojo.CommonResult.success;
+
+/**
+ * @author GaoKunW
+ *
+ * @description OrgController
+ * @date 2025/3/10 20:59
+ */
+@RestController
+@RequestMapping("/system/org")
+@Validated
+public class OrgController {
+    @Resource
+    private IOrgService orgService;
+
+    @GetMapping("/page")
+    public CommonResult<PageResult<OrgVO>> page(OrgBO orgBO) {
+        return success(orgService.selectPage(orgBO));
+    }
+
+    @GetMapping("/list")
+    public CommonResult<PageResult<OrgVO>> list(OrgBO orgBO) {
+        return success(orgService.selectPage(orgBO));
+    }
+
+    @PostMapping("/add")
+    public CommonResult<String> add(@RequestBody @Valid OrgBO orgBO) {
+        if (!orgService.checkNameUnique(orgBO)) {
+            return fail("新增组织{}失败,组织名称已存在", orgBO.getName());
+        }
+        boolean result = orgService.insert(orgBO);
+        if (!result) {
+            return fail("新增组织失败!");
+        }
+        return success();
+    }
+
+    @DeleteMapping("/edit")
+    public CommonResult<String> edit(@RequestBody @Valid OrgBO orgBO) {
+        return success();
+    }
+
+    @PostMapping("/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空") List<String> orgIds) {
+        return success();
+    }
+
+}

+ 93 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/org/Org.java

@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.domain.org;
+
+
+import com.fhs.core.trans.anno.Trans;
+import com.fhs.core.trans.constant.TransType;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Id;
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.vip.orm.domain.BaseEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description Org
+ *
+ * @author GaoKunW
+ * @date 2025/3/10 20:57
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Table("system_org_t")
+public class Org extends BaseEntity {
+    /**
+     * 唯一标识
+     */
+    @Id
+    private String id;
+
+    /**
+     * 父组织ID
+     */
+    private String parentId;
+
+    /**
+     * 组织名称
+     */
+    private String name;
+
+    /**
+     * 组织编码
+     */
+    private String code;
+
+    /**
+     * 分类
+     */
+    private String category;
+
+    /**
+     * 显示顺序
+     */
+    private Integer orderNum;
+
+    /**
+     * 负责人
+     */
+    @Trans(type = TransType.SIMPLE, targetClassName = "org.eco.vip.auth.domain.user.User", fields = "userName", ref = "leader")
+    private Long leaderId;
+
+    /**
+     * 负责人
+     */
+    @Column(ignore = true)
+    private String leader;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 父部门名称
+     */
+    @Column(ignore = true)
+    private String parentName;
+
+    /**
+     * 子部门
+     */
+    private List<Org> children = new ArrayList<>();
+}

+ 76 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/org/vo/OrgBO.java

@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.domain.org.vo;
+
+
+import com.mybatisflex.annotation.Id;
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.vip.auth.domain.org.Org;
+import org.eco.vip.orm.domain.BaseEntity;
+
+/**
+ * @description OrgBO
+ *
+ * @author GaoKunW
+ * @date 2025/7/2 10:37
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Org.class, reverseConvertGenerate = false)
+public class OrgBO extends BaseEntity {
+
+    /**
+     * 组织id
+     */
+    @Id
+    private String orgId;
+    /**
+     * 父组织ID
+     */
+    @NotBlank(message = "parentId不能为空")
+    private String parentId;
+
+    /**
+     * 组织名称
+     */
+    @NotBlank(message = "name不能为空")
+    private String name;
+
+    /**
+     * 组织编码
+     */
+    private String code;
+
+    /**
+     * 分类
+     */
+    private String category;
+
+    /**
+     * 显示顺序
+     */
+    @NotNull(message = "orderNum不能为空")
+    private Integer orderNum;
+
+    /**
+     * 负责人
+     */
+    private Long leaderId;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+}

+ 73 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/org/vo/OrgVO.java

@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.auth.domain.org.vo;
+
+
+import com.fhs.core.trans.anno.Trans;
+import com.fhs.core.trans.constant.TransType;
+import com.mybatisflex.annotation.Id;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.eco.vip.auth.domain.org.Org;
+import org.eco.vip.orm.domain.BaseEntity;
+
+/**
+ * @description OrgVO
+ *
+ * @author GaoKunW
+ * @date 2025/7/1 23:22
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = Org.class, reverseConvertGenerate = false)
+public class OrgVO extends BaseEntity {
+    /**
+     * 部门ID
+     */
+    @Id
+    private String id;
+
+    /**
+     * 父部门ID
+     */
+    private String parentId;
+
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 显示顺序
+     */
+    private Integer orderNum;
+
+    /**
+     * 负责人
+     */
+    @Trans(type = TransType.SIMPLE, targetClassName = "org.eco.vip.auth.domain.user.User", fields = "userName", ref = "leader")
+    private Long leaderId;
+
+    /**
+     * 负责人
+     */
+    private String leader;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+}

+ 21 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/mapper/OrgMapper.java

@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.mapper;
+
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.vip.auth.domain.org.Org;
+
+/**
+ * @description OrgMapper
+ *
+ * @author GaoKunW
+ * @date 2025/3/10 21:00
+ */
+@Mapper
+public interface OrgMapper extends BaseMapper<Org> {
+}

+ 69 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/org/IOrgService.java

@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.service.org;
+
+
+import org.eco.vip.auth.domain.org.Org;
+import org.eco.vip.auth.domain.org.vo.OrgBO;
+import org.eco.vip.auth.domain.org.vo.OrgVO;
+import org.eco.vip.orm.pojo.PageResult;
+import org.eco.vip.orm.service.IBaseService;
+
+import java.util.List;
+
+/**
+ * @author GaoKunW
+ * @description IOrgService
+ * @date 2025/3/10 20:59
+ */
+public interface IOrgService extends IBaseService<Org> {
+
+    /**
+     * @description: 分页查询
+     * @param orgBO 参数
+     * @return PageResult<OrgVO>
+     **/
+    PageResult<OrgVO> selectPage(OrgBO orgBO);
+
+    /**
+     * @description: 新增
+     * @param orgBO 参数
+     * @return boolean 是否成功
+     **/
+    boolean insert(OrgBO orgBO);
+
+    /**
+     * @description: 删除
+     * @param orgIds 组织id
+     * @return boolean 是否成功
+     **/
+    boolean delete(List<String> orgIds);
+
+    /**
+     * 根据组织ID查询信息
+     *
+     * @param orgId 组织ID
+     * @return 组织信息
+     */
+    OrgVO selectById(String orgId);
+
+    /**
+     * 校验组织名称是否唯一
+     *
+     * @param orgBO 组织信息
+     * @return 结果
+     */
+    boolean checkNameUnique(OrgBO orgBO);
+
+    /**
+     * 是否存在组织子节点
+     *
+     * @param orgIds 组织ID
+     * @return 结果
+     */
+    boolean hasChildByDeptId(List<String> orgIds);
+
+}

+ 91 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/org/OrgService.java

@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.service.org;
+
+
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import org.eco.vip.auth.domain.org.Org;
+import org.eco.vip.auth.domain.org.vo.OrgBO;
+import org.eco.vip.auth.domain.org.vo.OrgVO;
+import org.eco.vip.auth.mapper.OrgMapper;
+import org.eco.vip.orm.constant.Constants;
+import org.eco.vip.orm.domain.PageQuery;
+import org.eco.vip.orm.exception.BusinessException;
+import org.eco.vip.orm.pojo.PageResult;
+import org.eco.vip.orm.service.BaseService;
+import org.eco.vip.orm.utils.MapstructUtils;
+import org.eco.vip.orm.utils.ObjUtils;
+import org.eco.vip.orm.utils.RandomUtils;
+import org.eco.vip.orm.utils.StrUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+import static org.eco.vip.auth.domain.org.table.OrgTableDef.ORG;
+
+/**
+ * @description OrgService
+ *
+ * @author GaoKunW
+ * @date 2025/3/10 21:01
+ */
+@Service
+public class OrgService extends BaseService<OrgMapper, Org> implements IOrgService {
+    private QueryWrapper buildQueryWrapper() {
+        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
+        return queryWrapper;
+    }
+
+    @Override
+    public PageResult<OrgVO> selectPage(OrgBO orgBO) {
+        QueryWrapper queryWrapper = buildQueryWrapper();
+        Page<OrgVO> page = this.pageAs(PageQuery.build(), queryWrapper, OrgVO.class);
+        return PageResult.build(page);
+    }
+
+    @Override
+    public boolean insert(OrgBO orgBO) {
+        OrgVO orgVO = selectById(orgBO.getParentId());
+        if (ObjUtils.isNotNull(orgVO) && StrUtils.equals(Constants.NORMAL, orgVO.getStatus())) {
+            throw new BusinessException("父组织停用,不允许新增");
+        }
+        Org org = MapstructUtils.convert(orgBO, Org.class);
+        if (ObjUtils.isNotNull(org)) {
+            org.setCode(RandomUtils.randomString(10));
+        }
+        return this.save(org);
+    }
+
+    @Override
+    public boolean delete(List<String> orgIds) {
+        return false;
+    }
+
+    @Override
+    public OrgVO selectById(String orgId) {
+        QueryWrapper queryWrapper = query().where(ORG.ID.eq(orgId));
+        return this.getOneAs(queryWrapper, OrgVO.class);
+    }
+
+    @Override
+    public boolean checkNameUnique(OrgBO orgBO) {
+        String orgId = StrUtils.isBlank(orgBO.getOrgId()) ? "-1" : orgBO.getOrgId();
+
+        QueryWrapper queryWrapper = query().where(ORG.NAME.eq(orgBO.getName()));
+        queryWrapper.and(ORG.PARENT_ID.eq(orgBO.getParentId()));
+        OrgVO orgVO = this.getOneAs(queryWrapper, OrgVO.class);
+        if (ObjUtils.isNotNull(orgVO) && !StrUtils.equals(orgVO.getId(), orgId)) {
+            return Constants.NOT_UNIQUE;
+        }
+        return Constants.UNIQUE;
+    }
+
+    @Override
+    public boolean hasChildByDeptId(List<String> orgIds) {
+        return false;
+    }
+}

+ 7 - 0
eco-nexus-core/auth-biz/src/main/resources/mapper/OrgMapper.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="org.eco.vip.auth.mapper.OrgMapper">
+
+</mapper>

+ 4 - 4
pom.xml

@@ -32,8 +32,8 @@
 
         <maven-compiler-plugin.version>3.14.0</maven-compiler-plugin.version>
         <maven-surefire-plugin.version>3.5.0</maven-surefire-plugin.version>
-        <mapstruct.version>1.6.3</mapstruct.version>
         <mybatis-flex.version>1.10.9</mybatis-flex.version>
+        <mapstruct-plus.version>1.4.8</mapstruct-plus.version>
     </properties>
 
     <!-- 依赖管理 -->
@@ -139,9 +139,9 @@
                                 <version>${lombok.version}</version>
                             </path>
                             <path>
-                                <groupId>org.mapstruct</groupId>
-                                <artifactId>mapstruct-processor</artifactId>
-                                <version>${mapstruct.version}</version>
+                                <groupId>io.github.linpeilie</groupId>
+                                <artifactId>mapstruct-plus-processor</artifactId>
+                                <version>${mapstruct-plus.version}</version>
                             </path>
                             <path>
                                 <groupId>com.mybatis-flex</groupId>