feat:策略

This commit is contained in:
2026-07-18 13:58:29 +08:00
parent 90f3aa4261
commit e827d1cb07
17 changed files with 442 additions and 183 deletions

View File

@@ -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;
}

View File

@@ -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')")

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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())

View File

@@ -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());
}
}

View File

@@ -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;
}

View File

@@ -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();
}
}

View File

@@ -59,4 +59,11 @@ public interface WarehouseStrategyConfigService {
*/
PageResult<WarehouseStrategyConfigDO> getWarehouseStrategyConfigPage(WarehouseStrategyConfigPageReqVO pageReqVO);
/**
* 获得仓储策略配置列表(仅启用的)
*
* @return 仓储策略配置列表
*/
List<WarehouseStrategyConfigDO> getWarehouseStrategyConfigList();
}

View File

@@ -77,4 +77,9 @@ public class WarehouseStrategyConfigServiceImpl implements WarehouseStrategyConf
return warehouseStrategyConfigMapper.selectPage(pageReqVO);
}
@Override
public List<WarehouseStrategyConfigDO> getWarehouseStrategyConfigList() {
return warehouseStrategyConfigMapper.selectList();
}
}