feat:策略
This commit is contained in:
@@ -1,47 +1,49 @@
|
||||
package cn.code.nl.module.wms.controller.admin.warehousestrategy.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import cn.idev.excel.annotation.*;
|
||||
|
||||
@Schema(description = "管理后台 - 出入库策略 Response VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class WarehouseStrategyRespVO {
|
||||
|
||||
@Schema(description = "库区编码", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("库区编码")
|
||||
private String sectionCode;
|
||||
|
||||
@Schema(description = "规则", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("规则")
|
||||
private String strategy;
|
||||
|
||||
@Schema(description = "策略类型", example = "1入库2出库")
|
||||
@ExcelProperty("策略类型")
|
||||
private String strategyType;
|
||||
|
||||
@Schema(description = "描述")
|
||||
@ExcelProperty("描述")
|
||||
private String description;
|
||||
|
||||
@Schema(description = "创建者")
|
||||
@ExcelProperty("创建者")
|
||||
private String creator;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "更新者", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("更新者")
|
||||
private String updater;
|
||||
|
||||
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("更新时间")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
||||
package cn.code.nl.module.wms.controller.admin.warehousestrategy.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import cn.idev.excel.annotation.*;
|
||||
|
||||
@Schema(description = "管理后台 - 出入库策略 Response VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class WarehouseStrategyRespVO {
|
||||
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "库区编码", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("库区编码")
|
||||
private String sectionCode;
|
||||
|
||||
@Schema(description = "规则", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("规则")
|
||||
private String strategy;
|
||||
|
||||
@Schema(description = "策略类型", example = "1入库2出库")
|
||||
@ExcelProperty("策略类型")
|
||||
private String strategyType;
|
||||
|
||||
@Schema(description = "描述")
|
||||
@ExcelProperty("描述")
|
||||
private String description;
|
||||
|
||||
@Schema(description = "创建者")
|
||||
@ExcelProperty("创建者")
|
||||
private String creator;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "更新者", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("更新者")
|
||||
private String updater;
|
||||
|
||||
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("更新时间")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
||||
|
||||
@@ -88,6 +88,14 @@ public class WarehouseStrategyConfigController {
|
||||
return success(BeanUtils.toBean(pageResult, WarehouseStrategyConfigRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping(value = {"/list-all-simple", "/simple-list"})
|
||||
@Operation(summary = "获得仓储策略配置精简列表")
|
||||
@PreAuthorize("@ss.hasPermission('wms:warehouse-strategy-config:query')")
|
||||
public CommonResult<List<WarehouseStrategyConfigSimpleRespVO>> getSimpleWarehouseStrategyConfigList() {
|
||||
List<WarehouseStrategyConfigDO> list = warehouseStrategyConfigService.getWarehouseStrategyConfigList();
|
||||
return success(BeanUtils.toBean(list, WarehouseStrategyConfigSimpleRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出仓储策略配置 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('wms:warehouse-strategy-config:export')")
|
||||
|
||||
@@ -1,67 +1,69 @@
|
||||
package cn.code.nl.module.wms.controller.admin.warehousestrategyconfig.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import cn.idev.excel.annotation.*;
|
||||
|
||||
@Schema(description = "管理后台 - 仓储策略配置 Response VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class WarehouseStrategyConfigRespVO {
|
||||
|
||||
@Schema(description = "策略编码", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("策略编码")
|
||||
private String strategyCode;
|
||||
|
||||
@Schema(description = "策略名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
|
||||
@ExcelProperty("策略名称")
|
||||
private String strategyName;
|
||||
|
||||
@Schema(description = "策略类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@ExcelProperty("策略类型")
|
||||
private String strategyType;
|
||||
|
||||
@Schema(description = "类处理类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
||||
@ExcelProperty("类处理类型")
|
||||
private String classType;
|
||||
|
||||
@Schema(description = "处理类", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("处理类")
|
||||
private String param;
|
||||
|
||||
@Schema(description = "描述", example = "你说的对")
|
||||
@ExcelProperty("描述")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "是否启用")
|
||||
@ExcelProperty("是否启用")
|
||||
private Boolean isUsed;
|
||||
|
||||
@Schema(description = "禁止操作")
|
||||
@ExcelProperty("禁止操作")
|
||||
private Boolean ban;
|
||||
|
||||
@Schema(description = "限定参数")
|
||||
@ExcelProperty("限定参数")
|
||||
private String formData;
|
||||
|
||||
@Schema(description = "创建者")
|
||||
@ExcelProperty("创建者")
|
||||
private String creator;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "更新者")
|
||||
@ExcelProperty("更新者")
|
||||
private String updater;
|
||||
|
||||
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("更新时间")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
||||
package cn.code.nl.module.wms.controller.admin.warehousestrategyconfig.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import cn.idev.excel.annotation.*;
|
||||
|
||||
@Schema(description = "管理后台 - 仓储策略配置 Response VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class WarehouseStrategyConfigRespVO {
|
||||
|
||||
private String id;
|
||||
|
||||
@Schema(description = "策略编码", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("策略编码")
|
||||
private String strategyCode;
|
||||
|
||||
@Schema(description = "策略名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
|
||||
@ExcelProperty("策略名称")
|
||||
private String strategyName;
|
||||
|
||||
@Schema(description = "策略类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@ExcelProperty("策略类型")
|
||||
private String strategyType;
|
||||
|
||||
@Schema(description = "类处理类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
|
||||
@ExcelProperty("类处理类型")
|
||||
private String classType;
|
||||
|
||||
@Schema(description = "处理类", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("处理类")
|
||||
private String param;
|
||||
|
||||
@Schema(description = "描述", example = "你说的对")
|
||||
@ExcelProperty("描述")
|
||||
private String remark;
|
||||
|
||||
@Schema(description = "是否启用")
|
||||
@ExcelProperty("是否启用")
|
||||
private Boolean isUsed;
|
||||
|
||||
@Schema(description = "禁止操作")
|
||||
@ExcelProperty("禁止操作")
|
||||
private Boolean ban;
|
||||
|
||||
@Schema(description = "限定参数")
|
||||
@ExcelProperty("限定参数")
|
||||
private String formData;
|
||||
|
||||
@Schema(description = "创建者")
|
||||
@ExcelProperty("创建者")
|
||||
private String creator;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "更新者")
|
||||
@ExcelProperty("更新者")
|
||||
private String updater;
|
||||
|
||||
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("更新时间")
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package cn.code.nl.module.wms.controller.admin.warehousestrategyconfig.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Schema(description = "管理后台 - 仓储策略配置精简 Response VO")
|
||||
@Data
|
||||
public class WarehouseStrategyConfigSimpleRespVO {
|
||||
|
||||
@Schema(description = "策略编码", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String strategyCode;
|
||||
|
||||
@Schema(description = "策略名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String strategyName;
|
||||
|
||||
}
|
||||
@@ -17,6 +17,12 @@ import cn.code.nl.module.wms.controller.admin.warehousestrategyconfig.vo.*;
|
||||
@Mapper
|
||||
public interface WarehouseStrategyConfigMapper extends BaseMapperX<WarehouseStrategyConfigDO> {
|
||||
|
||||
default List<WarehouseStrategyConfigDO> selectList() {
|
||||
return selectList(new LambdaQueryWrapperX<WarehouseStrategyConfigDO>()
|
||||
.eq(WarehouseStrategyConfigDO::getIsUsed, true)
|
||||
.orderByDesc(WarehouseStrategyConfigDO::getId));
|
||||
}
|
||||
|
||||
default PageResult<WarehouseStrategyConfigDO> selectPage(WarehouseStrategyConfigPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<WarehouseStrategyConfigDO>()
|
||||
.eqIfPresent(WarehouseStrategyConfigDO::getStrategyCode, reqVO.getStrategyCode())
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
package cn.code.nl.module.wms.manage;
|
||||
|
||||
import cn.code.nl.framework.common.exception.ServiceException;
|
||||
import cn.code.nl.module.wms.dal.dataobject.warehousestrategyconfig.WarehouseStrategyConfigDO;
|
||||
import cn.code.nl.module.wms.dal.mysql.warehousestrategyconfig.WarehouseStrategyConfigMapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.jspecify.annotations.NonNull;
|
||||
import org.springframework.beans.factory.BeanNameAware;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 仓储策略决策器抽象基类
|
||||
* <p>
|
||||
* 子类通过 {@code @Service("策略编码")} 注册为 Spring Bean,
|
||||
* 启动时根据 Bean 名称自动从数据库加载对应的策略配置。
|
||||
*
|
||||
* @param <T> 货位/库存数据类型
|
||||
* @param <P> 决策参数类型
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/7/18 11:03
|
||||
*/
|
||||
@Slf4j
|
||||
public abstract class DecisionManage<T, P> implements InitializingBean, BeanNameAware {
|
||||
|
||||
/**
|
||||
* 当前策略的数据库配置,子类通过此字段读取策略参数
|
||||
*/
|
||||
public WarehouseStrategyConfigDO strategyConfig;
|
||||
|
||||
/**
|
||||
* Spring Bean 名称,即策略编码,对应 {@link WarehouseStrategyConfigDO#getStrategyCode()}
|
||||
*/
|
||||
private String beanName;
|
||||
|
||||
@Resource
|
||||
private WarehouseStrategyConfigMapper warehouseStrategyConfigMapper;
|
||||
|
||||
/**
|
||||
* 策略执行入口,由子类实现具体的货位分配逻辑
|
||||
*
|
||||
* @param list 候选货位/库存列表
|
||||
* @param param 决策参数(物料信息、出入库类型等)
|
||||
* @return 筛选/排序后的货位/库存列表
|
||||
*/
|
||||
public abstract List<T> handler(List<T> list, P param);
|
||||
|
||||
@Override
|
||||
public void setBeanName(@NonNull String name) {
|
||||
this.beanName = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Spring Bean 初始化时自动加载策略配置
|
||||
* <p>
|
||||
* 通过 BeanNameAware 获取策略编码,从数据库查询对应的策略配置记录。
|
||||
* 若数据库中无对应记录则抛出异常阻止启动,避免运行时才发现配置缺失。
|
||||
*/
|
||||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
this.strategyConfig = warehouseStrategyConfigMapper.selectOne(
|
||||
WarehouseStrategyConfigDO::getStrategyCode, beanName);
|
||||
if (this.strategyConfig == null) {
|
||||
log.error("策略 [{}] 初始化失败:数据库中未找到对应的策略配置记录", beanName);
|
||||
throw new ServiceException(500, "启动失败:当前策略 " + beanName + " 没有实例信息");
|
||||
}
|
||||
log.info("策略 [{}] 初始化成功,策略名称:{}", beanName, strategyConfig.getStrategyName());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package cn.code.nl.module.wms.manage.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
*
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/7/18 13:41
|
||||
*/
|
||||
@Data
|
||||
public class DemoDTO {
|
||||
private String id;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package cn.code.nl.module.wms.manage.handle;
|
||||
|
||||
import cn.code.nl.module.wms.manage.DecisionManage;
|
||||
import cn.code.nl.module.wms.manage.dto.DemoDTO;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @Author: liyongde
|
||||
* @Date: 2026/7/18 13:39
|
||||
*/
|
||||
@Slf4j
|
||||
@Service("alleyAve")
|
||||
public class AlleyAveRuleHandler extends DecisionManage<DemoDTO, JSONObject> {
|
||||
@Override
|
||||
public List<DemoDTO> handler(List<DemoDTO> list, JSONObject param) {
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
@@ -59,4 +59,11 @@ public interface WarehouseStrategyConfigService {
|
||||
*/
|
||||
PageResult<WarehouseStrategyConfigDO> getWarehouseStrategyConfigPage(WarehouseStrategyConfigPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 获得仓储策略配置列表(仅启用的)
|
||||
*
|
||||
* @return 仓储策略配置列表
|
||||
*/
|
||||
List<WarehouseStrategyConfigDO> getWarehouseStrategyConfigList();
|
||||
|
||||
}
|
||||
@@ -77,4 +77,9 @@ public class WarehouseStrategyConfigServiceImpl implements WarehouseStrategyConf
|
||||
return warehouseStrategyConfigMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WarehouseStrategyConfigDO> getWarehouseStrategyConfigList() {
|
||||
return warehouseStrategyConfigMapper.selectList();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user