1、新增系统配置管理接口;2、新增系统配置生成服务抽象规范;

This commit is contained in:
gaoqr
2024-11-08 17:56:34 +08:00
parent 1bc9119504
commit 11dad7c369
16 changed files with 683 additions and 0 deletions
@@ -338,4 +338,8 @@ public class ErrorCodeConstants {
//=========== 用户的系统配置 1-002-039-000 ============
public static final ErrorCode CURRENTLY_NO_CONFIGURATION_AVAILABLE = new ErrorCode(1_002_039_001, "当前没有{}配置信息,请前往设置配置");
//=========== 系统配置 1-002-040-000 ============
public static final ErrorCode SYSTEM_CONFIG_NOT_EXISTS = new ErrorCode(1_002_040_001, "系统配置不存在");
public static final ErrorCode SYSTEM_CONFIG_TYPE_NOT_SUPPORT = new ErrorCode(1_002_040_002, "不支持的系统配置类型");
}
@@ -0,0 +1,73 @@
package com.cf.imes.module.system.controller.admin.baseconfig;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigPageReqVO;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigRespVO;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigSaveReqVO;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigUpdateStatusReqVO;
import com.cf.imes.module.system.dal.dataobject.baseconfig.ConfigDO;
import com.cf.imes.module.system.service.config.ConfigService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
/**
* 系统配置管理控制器
*
* @author Gqr
* @since 2024/11/7 16:36
*/
@Tag(name = "管理后台 - 系统配置")
@RestController
@RequestMapping("/system/config")
@Validated
public class ConfigController {
@Resource
private ConfigService baseConfigService;
@GetMapping()
@Operation(summary = "获得系统配置的分页列表")
@PreAuthorize("@ss.hasPermission('baseconfig:query')")
public CommonResult<PageResult<ConfigRespVO>> getBaseConfigPage(@Valid ConfigPageReqVO pageReqVO) {
PageResult<ConfigDO> pageResult = baseConfigService.getBaseConfigPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ConfigRespVO.class));
}
@GetMapping("/{id}")
@Operation(summary = "根据id查询系统配置")
@PreAuthorize("@ss.hasPermission('baseconfig:query')")
public CommonResult<ConfigRespVO> getBaseConfig(@PathVariable Long id) {
ConfigDO baseConfig = baseConfigService.getBaseConfig(id);
return success(BeanUtils.toBean(baseConfig, ConfigRespVO.class));
}
@PostMapping("/status")
@Operation(summary = "修改系统配置状态")
@PreAuthorize("@ss.hasPermission('baseconfig:update')")
public CommonResult<Boolean> updateConfigStatus(@Valid @RequestBody ConfigUpdateStatusReqVO reqVO){
baseConfigService.updateStatus(reqVO);
return success(true);
}
@PostMapping()
@Operation(summary = "修改系统配置")
@PreAuthorize("@ss.hasPermission('baseconfig:update')")
public CommonResult<Boolean> modifyBaseConfig(@Valid @RequestBody ConfigSaveReqVO reqVO) {
baseConfigService.modifyBaseConfig(reqVO);
return success(true);
}
}
@@ -0,0 +1,28 @@
package com.cf.imes.module.system.controller.admin.baseconfig.vo;
import com.cf.imes.framework.common.pojo.PageParam;
import com.cf.imes.module.system.validation.common.CommonStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.Size;
/**
* 系统配置分页查询VO
* @author Gqr
* @since 2024/11/7 16:29
*/
@Schema(description = "管理后台 - 系统配置分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class ConfigPageReqVO extends PageParam {
@Schema(description = "配置项名称", example = "晨丰")
@Size(max = 64, message = "配置项名称长度不能超过64个字符")
private String name;
@Schema(description = "展示状态,参见 CommonStatusEnum 枚举类", example = "1")
@CommonStatus
private Integer status;
}
@@ -0,0 +1,29 @@
package com.cf.imes.module.system.controller.admin.baseconfig.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 系统配置respvo
*
* @author Gqr
* @since 2024/11/7 16:39
*/
@Schema(description = "管理后台 - 系统配置 Response VO")
@Data
public class ConfigRespVO {
@Schema(description = "配置编号")
private Long id;
@Schema(description = "配置项名称")
private String name;
@Schema(description = "配置规则")
private String setting;
@Schema(description = "状态")
private int status;
@Schema(description = "配置类型")
private int type;
}
@@ -0,0 +1,35 @@
package com.cf.imes.module.system.controller.admin.baseconfig.vo;
import com.cf.imes.module.system.validation.config.ConfigEnumValid;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* 基础配置创建/修改 vo
*
* @author Gqr
* @since 2024/11/7 17:09
*/
@Schema(description = "管理后台 - 基础配置创建/修改 Request VO")
@Data
public class ConfigSaveReqVO {
@Schema(description = "基础配置编号", example = "1")
private Long id;
@Schema(description = "基础配置名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "自定义编号")
@NotBlank(message = "基础配置名称不能为空")
@Size(max = 64, message = "基础配置名称长度不能超过 64 个字符")
private String name;
@Schema(description = "配置类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "配置类型不能为空")
@ConfigEnumValid
private Integer type;
@Schema(description = "配置规则")
private String setting;
}
@@ -0,0 +1,26 @@
package com.cf.imes.module.system.controller.admin.baseconfig.vo;
import com.cf.imes.module.system.validation.common.CommonStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 系统配置状态更新 reqvo
*
* @author Gqr
* @since 2024/11/8 10:41
*/
@Schema(description = "管理后台 - 系统配置状态更新 Request VO")
@Data
public class ConfigUpdateStatusReqVO {
@Schema(description = "系统配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "系统配置编号不能为空")
private Long id;
@Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态不能为空")
@CommonStatus
private Integer status;
}
@@ -0,0 +1,66 @@
package com.cf.imes.module.system.dal.dataobject.baseconfig;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
import com.cf.imes.framework.mybatis.core.type.CompressStringTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* 系统配置
*
* @author Gqr
* @since 2024/11/7 16:12
*/
@TableName(value = "config", autoResultMap = true)
@KeySequence("config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ConfigDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 配置项名称
*/
private String name;
/**
* 状态
*/
private int status;
/**
* 配置类型
*/
private int type;
/**
* 配置规则
*/
@TableField(typeHandler = CompressStringTypeHandler.class)
private String setting;
/**
* 组织id
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long organId;
}
@@ -0,0 +1,34 @@
package com.cf.imes.module.system.dal.mysql.config;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigPageReqVO;
import com.cf.imes.module.system.dal.dataobject.baseconfig.ConfigDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 系统配置 Mapper
*
* @author Gqr
* @since 2024/11/7 16:25
*/
@Mapper
public interface ConfigMapper extends BaseMapperX<ConfigDO> {
/**
* 分页查询
*
* @param reqVO
* @return
*/
default PageResult<ConfigDO> selectPage(ConfigPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ConfigDO>()
.likeIfPresent(ConfigDO::getName, reqVO.getName())
.eqIfPresent(ConfigDO::getStatus, reqVO.getStatus())
.eqIfPresent(ConfigDO::getOrganId, OrganContextHolder.getOrganId())
.select(ConfigDO::getId, ConfigDO::getName, ConfigDO::getStatus, ConfigDO::getType)
.orderByAsc(ConfigDO::getId));
}
}
@@ -0,0 +1,53 @@
package com.cf.imes.module.system.enums.config;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 系统配置类型枚举
*
* @author Gqr
* @since 2024/11/8 13:43
*/
@Getter
@AllArgsConstructor
public enum ConfigTypeEnum {
/**
* 自定义板编号
*/
CUSTOM_BOARD_NO(1, "自定义板编号"),
/**
* 智能分线
*/
INTELLIGENT_BRANCH(2, "智能分线"),
/**
* 高级筛选
*/
ADVANCED_SCREEN(3, "高级筛选");
/**
* 类型
*/
private final Integer type;
/**
* 配置项名称
*/
private final String name;
public static ConfigTypeEnum fromType(Integer type) {
if (type == null) {
return null;
}
for (ConfigTypeEnum value : values()) {
if (ObjectUtil.equal(value.getType(), type)) {
return value;
}
}
return null;
}
}
@@ -0,0 +1,45 @@
package com.cf.imes.module.system.service.config;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigPageReqVO;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigSaveReqVO;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigUpdateStatusReqVO;
import com.cf.imes.module.system.dal.dataobject.baseconfig.ConfigDO;
/**
* 系统配置接口
*
* @author Gqr
* @since 2024/11/7 16:27
*/
public interface ConfigService {
/**
* 分页查询系统配置管理列表
*
* @param reqVO
* @return
*/
PageResult<ConfigDO> getBaseConfigPage(ConfigPageReqVO reqVO);
/**
* 根据id查询基础配置
*
* @param id
* @return
*/
ConfigDO getBaseConfig(Long id);
/**
* 新增/修改基础配置
*
* @param reqVO
*/
void modifyBaseConfig(ConfigSaveReqVO reqVO);
/**
* 更新基础配置状态
*
* @param reqVO
*/
void updateStatus(ConfigUpdateStatusReqVO reqVO);
}
@@ -0,0 +1,114 @@
package com.cf.imes.module.system.service.config;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.system.controller.admin.baseconfig.ConfigController;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigPageReqVO;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigSaveReqVO;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigUpdateStatusReqVO;
import com.cf.imes.module.system.dal.dataobject.baseconfig.ConfigDO;
import com.cf.imes.module.system.dal.mysql.config.ConfigMapper;
import com.cf.imes.module.system.enums.config.ConfigTypeEnum;
import com.cf.imes.module.system.service.config.factory.ConfigServiceFactory;
import com.cf.imes.module.system.service.config.factory.service.AbstractConfigGenerateService;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.SYSTEM_CONFIG_NOT_EXISTS;
/**
* 系统配置接口实现类
*
* @author Gqr
* @since 2024/11/7 16:27
*/
@Slf4j
@Service
public class ConfigServiceImpl implements ConfigService {
@Resource
private ConfigMapper baseConfigMapper;
@Resource
private ConfigServiceFactory configServiceFactory;
@Override
public PageResult<ConfigDO> getBaseConfigPage(ConfigPageReqVO reqVO) {
PageResult<ConfigDO> configDOPageResult = baseConfigMapper.selectPage(reqVO);
// todo 后续所有configTypeEnum中的类型需要上到列表补全时通过遍历enum来补充
ConfigTypeEnum customBoardNoEnum = ConfigTypeEnum.CUSTOM_BOARD_NO;
CopyOnWriteArrayList<ConfigDO> configDOS = Lists.newCopyOnWriteArrayList(configDOPageResult.getList());
Optional<ConfigDO> configDOOptional = configDOS.stream().filter(c -> ObjectUtil.equal(customBoardNoEnum.getType(), c.getType())).findAny();
if (configDOOptional.isEmpty()) {
configDOS.add(new ConfigDO().builder().id(null).name(customBoardNoEnum.getName()).type(customBoardNoEnum.getType()).build());
configDOPageResult.setList(configDOS);
configDOPageResult.setTotal(configDOPageResult.getTotal() + 1);
}
return configDOPageResult;
}
@Override
public ConfigDO getBaseConfig(Long id) {
return validateBaseConfigExists(id);
}
@Override
public void modifyBaseConfig(ConfigSaveReqVO reqVO) {
Long id = reqVO.getId();
// 根据配置类型选择对应的service
AbstractConfigGenerateService configService = configServiceFactory.getConfigService(reqVO.getType());
// 校验规则
configService.checkValid(reqVO.getSetting());
// 系统配置保存前操作
configService.beforeSaveConfig(reqVO);
if (ObjectUtil.isNotNull(id)) {
ConfigDO baseConfigDO = validateBaseConfigExists(id);
// 覆盖配置
baseConfigDO.setSetting(reqVO.getSetting());
// 更新
baseConfigMapper.updateById(baseConfigDO);
} else {
// 新增
baseConfigMapper.insert(BeanUtils.toBean(reqVO, ConfigDO.class));
}
// 系统配置保存后操作
configService.afterSaveConfig(reqVO);
}
@Override
public void updateStatus(ConfigUpdateStatusReqVO reqVO) {
Long id = reqVO.getId();
// 校验存在
validateBaseConfigExists(id);
// 更新状态
baseConfigMapper.update(new LambdaUpdateWrapper<ConfigDO>().eq(ConfigDO::getId, id).set(ConfigDO::getStatus, reqVO.getStatus()));
}
/**
* 校验基础配置是否存在
*
* @param id
* @return
*/
private ConfigDO validateBaseConfigExists(Long id) {
ConfigDO baseConfigDO = baseConfigMapper.selectOne(new LambdaQueryWrapperX<ConfigDO>()
.eq(ConfigDO::getId, id)
.eq(ConfigDO::getOrganId, OrganContextHolder.getOrganId()));
if (ObjectUtil.isNull(baseConfigDO)) {
throw exception(SYSTEM_CONFIG_NOT_EXISTS);
}
return baseConfigDO;
}
}
@@ -0,0 +1,47 @@
package com.cf.imes.module.system.service.config.factory;
import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil;
import com.cf.imes.module.system.enums.config.ConfigTypeEnum;
import com.cf.imes.module.system.service.config.factory.service.AbstractConfigGenerateService;
import com.cf.imes.module.system.service.config.factory.service.impl.CustomBoardNoGenerateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.SYSTEM_CONFIG_TYPE_NOT_SUPPORT;
/**
* 系统配置服务分配工厂类
*
* @author Gqr
* @since 2024/11/8 16:40
*/
@Component
public class ConfigServiceFactory {
private final ApplicationContext applicationContext;
@Autowired
public ConfigServiceFactory(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
/**
* 根据类型获取对应的服务实现
*
* @param type
* @return
*/
public AbstractConfigGenerateService getConfigService(int type) {
switch (ConfigTypeEnum.fromType(type)) {
case CUSTOM_BOARD_NO:
return applicationContext.getBean(CustomBoardNoGenerateService.class);
case INTELLIGENT_BRANCH:
// todo 智能分线
case ADVANCED_SCREEN:
// todo 高级筛选
default:
throw ServiceExceptionUtil.exception(SYSTEM_CONFIG_TYPE_NOT_SUPPORT);
}
}
}
@@ -0,0 +1,34 @@
package com.cf.imes.module.system.service.config.factory.service;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigSaveReqVO;
/**
* 系统配置生成服务抽象类
*
* @author Gqr
* @since 2024/11/8 16:45
*/
public abstract class AbstractConfigGenerateService {
/**
* 校验配置的合法性
* 校验异常抛出ServiceException
*
* @param setting
*/
public abstract void checkValid(String setting);
/**
* 系统配置入库前操作
*
* @param reqVO
*/
public abstract void beforeSaveConfig(ConfigSaveReqVO reqVO);
/**
* 系统配置入库后操作
*
* @param reqVO
*/
public abstract void afterSaveConfig(ConfigSaveReqVO reqVO);
}
@@ -0,0 +1,30 @@
package com.cf.imes.module.system.service.config.factory.service.impl;
import com.cf.imes.module.system.controller.admin.baseconfig.vo.ConfigSaveReqVO;
import com.cf.imes.module.system.service.config.factory.service.AbstractConfigGenerateService;
import org.springframework.stereotype.Service;
/**
* 自定义板编号生成服务
*
* @author Gqr
* @since 2024/11/8 16:48
*/
@Service("customBoardNoGenerateService")
public class CustomBoardNoGenerateService extends AbstractConfigGenerateService {
@Override
public void checkValid(String setting) {
// todo checkValid
}
@Override
public void beforeSaveConfig(ConfigSaveReqVO reqVO) {
// todo beforeSaveConfig
}
@Override
public void afterSaveConfig(ConfigSaveReqVO reqVO) {
// todo afterSaveConfig
}
}
@@ -0,0 +1,32 @@
package com.cf.imes.module.system.validation.config;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 系统配置类型校验注解
*
* @author Gqr
* @since 2024/11/8 13:59
*/
@Target({
ElementType.FIELD,
ElementType.PARAMETER,
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = {ConfigEnumValidator.class}
)
public @interface ConfigEnumValid {
String message() default "配置类型非法输入,请检查";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@@ -0,0 +1,33 @@
package com.cf.imes.module.system.validation.config;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.module.system.enums.config.ConfigTypeEnum;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 系统配置类型校验器
*
* @author Gqr
* @since 2024/11/8 14:01
*/
public class ConfigEnumValidator implements ConstraintValidator<ConfigEnumValid, Integer> {
@Override
public void initialize(ConfigEnumValid constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (ObjectUtil.isNull(value)) {
return true;
}
ConfigTypeEnum configTypeEnum = ConfigTypeEnum.fromType(value);
if (ObjectUtil.isNotNull(configTypeEnum)) {
return true;
}
return false;
}
}