Merge branch 'feature/REQ-1212' into feature/REQ-1102

# Conflicts:
#	tyr-server/pom.xml
#	tyr-server/src/main/java/cn/axzo/tyr/server/controller/app/package-info.java
This commit is contained in:
chenwenjian 2023-09-08 16:05:38 +08:00
commit 6a6416d073
33 changed files with 735 additions and 167 deletions

View File

@ -0,0 +1,28 @@
package cn.axzo.tyr.client.common.annotation;
import cn.axzo.tyr.client.common.validator.EnumValueValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* @author chenwenjian
* @date 2023/8/29 18:31
* @description
* @modifiedBy
* @version: 1.0
*/
@Documented
@Constraint(validatedBy = EnumValueValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumValidator {
String message() default "Value is not valid";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<? extends Enum<?>> enumClass();
}

View File

@ -0,0 +1,57 @@
package cn.axzo.tyr.client.common.enums;
import java.util.Arrays;
/**
* @author chenwenjian
* @date 2023/9/8 15:12
* @description 字典type字段枚举
* @modifiedBy
* @version: 1.0
*/
public enum DictTypeFiledEnum {
/**
* 企业类型
*/
OUTYPE("ou_type","企业类型"),
/**
*
*/
TERMINAL("terminal",""),
/**
* 工作台
*/
WORKSPACE("workspace","工作台")
;
private final String value;
private final String description;
public String getValue() {
return value;
}
public String getDescription() {
return description;
}
DictTypeFiledEnum(String value, String description) {
this.value = value;
this.description = description;
}
/**
* 通过value值获取枚举类型
*
* @param value value值
* @return
*/
public static DictTypeFiledEnum getByValue(String value) {
return Arrays.stream(values()).filter(l -> l.getValue().equals(value)).findFirst().orElse(null);
}
}

View File

@ -0,0 +1,55 @@
package cn.axzo.tyr.client.common.enums;
import java.util.Arrays;
/**
* @author chenwenjian
* @date 2023/9/8 14:21
* @description 字典工作台类型枚举
* @modifiedBy
* @version: 1.0
*/
public enum DictWorkSpaceTypeEnum {
/**
* 企业工作台
*/
ENT("ent", "企业工作台"),
/**
* 项目部工作台
*/
PROJ("proj", "项目部工作台"),
/**
* OMS工作台
*/
OMS("oms", "OMS工作台");
private final String value;
private final String description;
public String getValue() {
return value;
}
public String getDescription() {
return description;
}
DictWorkSpaceTypeEnum(String value, String description) {
this.value = value;
this.description = description;
}
/**
* 通过value值获取枚举类型
*
* @param value value值
* @return
*/
public static DictWorkSpaceTypeEnum getByValue(String value) {
return Arrays.stream(values()).filter(l -> l.getValue().equals(value)).findFirst().orElse(null);
}
}

View File

@ -0,0 +1 @@
package cn.axzo.tyr.client.common.util;

View File

@ -0,0 +1,34 @@
package cn.axzo.tyr.client.common.validator;
import cn.axzo.tyr.client.common.annotation.EnumValidator;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @author chenwenjian
* @date 2023/8/29 18:24
* @description
* @modifiedBy
* @version: 1.0
*/
public class EnumValueValidator implements ConstraintValidator<EnumValidator, Enum<?>> {
@Override
public boolean isValid(Enum<?> value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
Class<? extends Enum<?>> enumClass = value.getDeclaringClass();
Enum<?>[] enumValues = enumClass.getEnumConstants();
for (Enum<?> enumValue : enumValues) {
if (enumValue.name().equals(value.name())) {
// 找到匹配的枚举值
return true;
}
}
// 未找到匹配的枚举值
return false;
}
}

View File

@ -0,0 +1,62 @@
package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.dict.request.BasicDictCreateReq;
import cn.axzo.tyr.client.model.dict.request.BasicDictQueryReq;
import cn.axzo.tyr.client.model.dict.request.BasicDictUpdateReq;
import cn.axzo.tyr.client.model.dict.request.BasicDictUpdateStatusReq;
import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* @author chenwenjian
* @date 2023/9/6 15:33
* @description 企业字典api
* @modifiedBy
* @version: 1.0
*/
@FeignClient(name = "tyr", url = "http://tyr:8080")
public interface SaasBasicDictApi {
/**
* 获取字典树所有节点
*
* @param req 根据自身需求传入参数
* @return
*/
@PostMapping("api/dict/node-list")
ApiResult<List<BasicDictNodeResp>> getBasicDictNodeList(@RequestBody BasicDictQueryReq req);
/**
* 添加字典
*
* @param req 其中name同一个父级节点名称不能重复codeMap全局唯一
* @return
*/
@PostMapping("api/dict/create")
ApiResult<Long> create(@RequestBody @Validated BasicDictCreateReq req);
/**
* 编辑字典
*
* @param req
* @return
*/
@PostMapping("api/dict/update")
ApiResult<Boolean> update(@RequestBody @Validated BasicDictUpdateReq req);
/**
* 更新字典状态
*
* @param req
* @return
*/
@PostMapping("/update-status")
ApiResult<Boolean> updateStatus(@RequestBody @Validated BasicDictUpdateStatusReq req);
}

View File

@ -0,0 +1,47 @@
package cn.axzo.tyr.client.model.dict.request;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
/**
* @author chenwenjian
* @date 2023/9/6 14:44
* @description 添加字典请求入参
* @modifiedBy
* @version: 1.0
*/
@Data
public class BasicDictCreateReq {
/**
* 工作台类型"ent", "proj", "oms"
*/
@NotBlank(message = "工作台类型不能为空")
private String workspaceType;
/**
* 类型"ouType", "terminal"
*/
private String type;
/**
* 所属上级节点id
*/
private Long parentId;
/**
* 字典名称
*/
@NotBlank(message = "字典名称不能为空")
@Length(max = 35, message = "字典名称长度不能超过35字符")
private String name;
/**
* 编码code
*/
@NotBlank(message = "code不能为空")
private String code;
}

View File

@ -0,0 +1,29 @@
package cn.axzo.tyr.client.model.dict.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author chenwenjian
* @date 2023/9/6 15:46
* @description
* @modifiedBy
* @version: 1.0
*/
@Data
public class BasicDictNodeReq {
/**
* 工作台类型
*/
@NotBlank(message = "工作台类型不能为空")
private String workspaceType;
/**
* 类型
*/
@NotBlank(message = "类型不能为空")
private String type;
}

View File

@ -0,0 +1,47 @@
package cn.axzo.tyr.client.model.dict.request;
import cn.axzo.tyr.client.common.annotation.EnumValidator;
import cn.axzo.tyr.client.common.enums.DictTypeFiledEnum;
import cn.axzo.tyr.client.common.enums.DictWorkSpaceTypeEnum;
import lombok.Data;
/**
* @author chenwenjian
* @date 2023/9/6 14:02
* @description 获取企业字典树请求入参
* @modifiedBy
* @version: 1.0
*/
@Data
public class BasicDictQueryReq {
private Long parentId;
/**
* workspace
*/
@EnumValidator(enumClass = DictWorkSpaceTypeEnum.class, message = "枚举类型错误")
private DictWorkSpaceTypeEnum workspaceType;
/**
* type
*/
@EnumValidator(enumClass = DictTypeFiledEnum.class, message = "枚举类型错误")
private DictTypeFiledEnum type;
/**
* 字典名称
*/
private String name;
/**
* 字典code
*/
private String code;
/**
* 状态
*/
private Boolean status;
}

View File

@ -0,0 +1,27 @@
package cn.axzo.tyr.client.model.dict.request;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
/**
* @author chenwenjian
* @date 2023/9/6 15:00
* @description 编辑请求入参
* @modifiedBy
* @version: 1.0
*/
@Data
public class BasicDictUpdateReq {
private Long id;
/**
* 字典名称
*/
@NotBlank(message = "字典名称不能为空")
@Length(max = 35, message = "字典名称长度不能超过35字符")
private String name;
}

View File

@ -0,0 +1,29 @@
package cn.axzo.tyr.client.model.dict.request;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author chenwenjian
* @date 2023/9/6 15:04
* @description 状态更改请求入参
* @modifiedBy
* @version: 1.0
*/
@Data
public class BasicDictUpdateStatusReq {
/**
* 节点id
*/
@NotNull(message = "节点id不能为空")
private Long id;
/**
* 状态true启用false禁用
*/
@NotNull(message = "状态不能为空")
private Boolean status;
}

View File

@ -0,0 +1,64 @@
package cn.axzo.tyr.client.model.dict.response;
import lombok.Data;
/**
* @author chenwenjian
* @date 2023/9/6 15:39
* @description
* @modifiedBy
* @version: 1.0
*/
@Data
public class BasicDictNodeResp {
private Long id;
private Long parentId;
/**
* 工作台类型"ent", "proj", "oms"
*/
private String workspaceType;
/**
* 类型"ouType", "terminal"
*/
private String type;
/**
* 字典名称
*/
private String name;
/**
* 字典code
*/
private String code;
/**
* 唯一code
*/
private String uniqueCode;
/**
* 状态
*/
private Boolean status;
/**
* 路径
*/
private String path;
/**
* 层级
*/
private Integer level;
/**
* 扩展字段
*/
private String ext;
}

View File

@ -0,0 +1,39 @@
package cn.axzo.tyr.client.model.dict.response;
import lombok.Data;
import java.util.List;
/**
* @author chenwenjian
* @date 2023/9/6 14:08
* @description
* @modifiedBy
* @version: 1.0
*/
@Data
public class BasicDictTreeResp {
private Long id;
/**
* 字典名称
*/
private String name;
/**
* 字典code
*/
private String code;
/**
* 状态
*/
private Boolean status;
/**
* 当前节点下子节点
*/
private List<BasicDictTreeResp> children;
}

View File

@ -1,14 +0,0 @@
package cn.axzo.maven.archetype.client;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* Unit test for simple App.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest {
}

View File

@ -1,27 +0,0 @@
package cn.axzo.tyr.server.common.enums;
import cn.axzo.framework.domain.web.code.IProjectRespCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description: 响应码规范一共8位取值范围0~93位项目编号(首位不能为0)+2位模块编号+3位自定义编号
*/
@Getter
@AllArgsConstructor
public enum ErrorCode implements IProjectRespCode {
USER_NOT_EXISTS("01001", "用户不存在id=%s"),
USER_PHONE_EMAIL_IS_NULL("01002", "电话和邮箱不能都为空");
private String code;
private String message;
@Override
public String getProjectCode() {
// 根据不同项目进行项目编码调整可联系框架组获取项目编号(首位不能为0)
return "100";
}
}

View File

@ -1,88 +0,0 @@
package cn.axzo.tyr.server.common.enums;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
public enum ResultCode {
/**
* 成功 [GET]
*/
SUCCESS(200),
/**
* [POST/PUT/PATCH] 用户新建或修改数据成功
*/
CREATED(201),
/**
* [*] 标识一个请求已经进入后台排队 (异步任务)
*/
ACCEPTED(202),
/**
* [DELETE]: 用户删除数据成功
*/
NO_CONTENT(204),
/**
* [POST/PUT/PATCH] 用户发出的请求有错误, 服务器没有进行新建或修改数据的操作, 该操作是幂等的.
*/
FAIL(400),
/**
* [*] 标识没有权限 (令牌用户名密码错误)
*/
UNAUTHORIZED(401),
/**
* [*] 标识用户得到授权(与401错误相对), 但是访问是被禁止的
*/
FORBIDDEN(403),
/**
* [*] 用户发出的请求针对的是不存在的记录, 服务器没有进行操作
*/
NOT_FOUND(404),
/**
* [GET] 用户请求的格式不可得 (比如用户请求JSON格式, 但是只有XML格式)
*/
NOT_ACCEPTABLE(406),
/**
* [GET] 用户请求的资源被永久删除, 且不会再得到
*/
GONE(410),
/**
* [POST/PUT/PATCH] 当创建一个对象时, 发生一个验证错误646
*/
UNPROCESSABLE_ENTITY(422),
/**
* 服务器内部错误
*/
INTERNAL_SERVER_ERROR(9999),
/**
* 通用业务异常
*/
SERVICE_EXCEPTION_ERROR(9998),
/**
* ####业务的响应码####
* 按业务依次划分 :
* 一共6位, 第6位是业务代码 第1-5位响应码, 按业务不同码不同
* #100000 全局级别
*/
/**
* 100001 当前用户被强制下线
*/
CUSTOM_100001(100001),
/**
* 确认弹窗响应码
*/
CUSTOM_100002(100002);
public int code;
ResultCode(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.common.util;

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.consumer;

View File

@ -0,0 +1,50 @@
package cn.axzo.tyr.server.controller;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.SaasBasicDictApi;
import cn.axzo.tyr.client.model.dict.request.BasicDictCreateReq;
import cn.axzo.tyr.client.model.dict.request.BasicDictQueryReq;
import cn.axzo.tyr.client.model.dict.request.BasicDictUpdateReq;
import cn.axzo.tyr.client.model.dict.request.BasicDictUpdateStatusReq;
import cn.axzo.tyr.client.model.dict.response.BasicDictNodeResp;
import cn.axzo.tyr.server.service.SaasBasicDictService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author chenwenjian
* @date 2023/9/8 14:32
* @description
* @modifiedBy
* @version: 1.0
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class SaasBasicDictController implements SaasBasicDictApi {
private final SaasBasicDictService saasBasicDictService;
@Override
public ApiResult<List<BasicDictNodeResp>> getBasicDictNodeList(BasicDictQueryReq req) {
return null;
}
@Override
public ApiResult<Long> create(BasicDictCreateReq req) {
return null;
}
@Override
public ApiResult<Boolean> update(BasicDictUpdateReq req) {
return null;
}
@Override
public ApiResult<Boolean> updateStatus(BasicDictUpdateStatusReq req) {
return null;
}
}

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.job;

View File

@ -0,0 +1,18 @@
package cn.axzo.tyr.server.repository;
import cn.axzo.tyr.server.repository.entity.SaasBasicDict;
import cn.axzo.tyr.server.repository.mapper.SaasBasicDictMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author chenwenjian
* @date 2023/9/7 17:43
* @description
* @modifiedBy
* @version: 1.0
*/
@Service
public class SaasBasicDictDao extends ServiceImpl<SaasBasicDictMapper, SaasBasicDict> {
}

View File

@ -0,0 +1,97 @@
package cn.axzo.tyr.server.repository.entity;
import cn.axzo.framework.data.mybatisplus.model.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Map;
/**
* @author chenwenjian
* @date 2023/9/7 17:39
* @description 字典实体类
* @modifiedBy
* @version: 1.0
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("saas_basic_dict")
public class SaasBasicDict extends BaseEntity<SaasBasicDict> implements Serializable {
private static final long serialVersionUID = 100L;
/**
* 父节点id
*/
@TableField(value = "parent_id")
private Long parentId;
/**
* 工作台类型"ent", "proj", "oms"
*/
@TableField(value = "workspace_type")
private String workspaceType;
/**
* 类型"ouType", "terminal"
*/
@TableField(value = "type")
private String type;
/**
* 名称
*/
@TableField(value = "name")
private String name;
/**
* code
*/
@TableField(value = "code")
private String code;
/**
* 唯一code
*/
@TableField(value = "unique_code")
private String uniqueCode;
/**
* 状态0禁用1启用
*/
@TableField(value = "status")
private Integer status;
/**
* 排序
*/
@TableField(value = "sort")
private Integer sort;
/**
* 层级
*/
@TableField(value = "level")
private Integer level;
/**
* 路径
*/
@TableField(value = "path")
private String path;
/**
* 扩展信息
*/
@TableField(value = "ex", typeHandler = JacksonTypeHandler.class)
private Map<String, String> ext;
}

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.repository.entity;

View File

@ -0,0 +1,17 @@
package cn.axzo.tyr.server.repository.mapper;
import cn.axzo.tyr.server.repository.entity.SaasBasicDict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author chenwenjian
* @date 2023/9/7 17:41
* @description
* @modifiedBy
* @version: 1.0
*/
@Mapper
public interface SaasBasicDictMapper extends BaseMapper<SaasBasicDict> {
}

View File

@ -0,0 +1,11 @@
package cn.axzo.tyr.server.service;
/**
* @author chenwenjian
* @date 2023/9/7 17:54
* @description
* @modifiedBy
* @version: 1.0
*/
public interface SaasBasicDictService {
}

View File

@ -1,15 +0,0 @@
package cn.axzo.tyr.server.service.converter;
import java.util.List;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
public interface EntityConverter<V, E>{
V toVo(E var);
List<V> toVo(List<E> var);
}

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.service.dto.request;

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.service.dto.response;

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.service.event;

View File

@ -0,0 +1,23 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.tyr.server.repository.SaasBasicDictDao;
import cn.axzo.tyr.server.service.SaasBasicDictService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author chenwenjian
* @date 2023/9/8 15:40
* @description
* @modifiedBy
* @version: 1.0
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class SaasBasicDictServiceImpl implements SaasBasicDictService {
private final SaasBasicDictDao saasBasicDictDao;
}

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.service.manager;

View File

@ -1 +0,0 @@
package cn.axzo.tyr.server.service.validator;

View File

@ -1,14 +0,0 @@
package cn.axzo.tyr.server;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* Unit test for simple App.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest {
}