Files
huachuang/docs/superpowers/plans/2026-08-22-acs-empty-box-inbound.md
2026-08-22 11:31:21 +08:00

7.1 KiB
Raw Blame History

ACS 申请空木箱入库实现计划

面向 AI 代理的工作者: 必需子技能:使用 superpowers:subagent-driven-development推荐或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(- [ ])语法来跟踪进度。

目标: 在 WMS 中为 ACS 新增独立外部服务和空木箱入库申请接口,复用现有空木箱任务全链路。

架构: CallTaskController 只接收和校验 ACS 协议,委托 service/external/acs 下的服务校验业务类型并调用现有 EmptyBoxService.createInbound。虚拟箱号、箱型校验、仓位选择与锁定、任务创建下发、完成入账和取消回滚仍由现有空木箱领域服务负责。

技术栈: Java 17、Spring Boot、Jakarta Validation、MyBatis、现有 WMS/Task RPC。


文件结构

  • 创建 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/enums/acs/AcsInboundTaskTypeEnum.java:统一定义 1/2/3/4 四类 ACS 入库业务。
  • 创建 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsEmptyBoxInboundApplyReqVO.javaACS 空木箱入库请求。
  • 创建 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsEmptyBoxInboundApplyRespVO.javaACS 空木箱入库响应。
  • 创建 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/external/acs/AcsExternalService.javaACS 外部服务接口。
  • 创建 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/external/acs/AcsExternalServiceImpl.java:业务类型校验和现有空木箱服务编排。
  • 修改 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/CallTaskController.java:暴露 ACS 申请接口并修正旧类型注释。

任务 1定义 ACS 协议与业务类型

文件:

  • 创建:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/enums/acs/AcsInboundTaskTypeEnum.java

  • 创建:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsEmptyBoxInboundApplyReqVO.java

  • 创建:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsEmptyBoxInboundApplyRespVO.java

  • 修改:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsApplyInboundReqVO.java

  • 步骤 1增加入库业务类型枚举

枚举定义 EMPTY_PALLET(1)EMPTY_BOX(2)RETURNED_GOODS(3)FINISHED_GOODS(4),只保留 Integer code 字段,并使用中文注释说明用途。

  • 步骤 2增加请求对象
@Data
public class AcsEmptyBoxInboundApplyReqVO {
    @NotBlank(message = "设备号不能为空")
    private String deviceCode;
    @NotBlank(message = "木箱类型不能为空")
    private String materialCode;
    @NotNull(message = "任务类型不能为空")
    private Integer taskType;
}
  • 步骤 3增加响应对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AcsEmptyBoxInboundApplyRespVO {
    private Long taskId;
    private String boxNo;
    private String targetStructCode;
}
  • 步骤 4修正旧通用请求注释

AcsApplyInboundReqVO 中 6/7/8/9 的说明统一改为 1/2/3/4但不改变该接口当前的空实现行为。

任务 2实现 ACS 外部服务

文件:

  • 创建:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/external/acs/AcsExternalService.java

  • 创建:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/external/acs/AcsExternalServiceImpl.java

  • 步骤 1定义外部服务接口

public interface AcsExternalService {
    /** 申请空木箱入库任务。 */
    AcsEmptyBoxInboundApplyRespVO applyEmptyBoxInbound(AcsEmptyBoxInboundApplyReqVO reqVO);
}
  • 步骤 2实现业务类型校验和领域服务调用

实现类使用 @Service@Resource 注入 EmptyBoxService。先校验 reqVO.getTaskType() 等于 AcsInboundTaskTypeEnum.EMPTY_BOX.getCode(),不匹配时抛出 ServiceException(500, "当前接口仅支持申请空木箱入库")

随后逐字段构造 EmptyBoxInboundCreateReq

EmptyBoxInboundCreateReq request = new EmptyBoxInboundCreateReq();
request.setDeviceCode(reqVO.getDeviceCode());
request.setMaterialCode(reqVO.getMaterialCode());
EmptyBoxInboundCreateResp result = emptyBoxService.createInbound(request);
return new AcsEmptyBoxInboundApplyRespVO(
        result.getTaskId(), result.getBoxNo(), result.getTargetStructCode());

不复制 EmptyBoxServiceImpl 内部的箱型查询、编码生成、仓位锁定和任务逻辑。

任务 3暴露 ACS 接口

文件:

  • 修改:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/CallTaskController.java

  • 步骤 1注入 ACS 外部服务

使用 @Resource private AcsExternalService acsExternalService;,保留现有 ShippingAreaService

  • 步骤 2增加接口方法
@PostMapping("/applyEmptyBoxInbound")
@Operation(summary = "申请空木箱入库")
@PermitAll
public CommonResult<AcsEmptyBoxInboundApplyRespVO> applyEmptyBoxInbound(
        @Valid @RequestBody AcsEmptyBoxInboundApplyReqVO reqVO) {
    return success(acsExternalService.applyEmptyBoxInbound(reqVO));
}

最终地址为 POST /acs/call/applyEmptyBoxInbound。不修改现有 /inbound/apply 的空实现行为。

任务 4验证完整链路

文件:

  • 核对:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/emptybox/EmptyBoxServiceImpl.java

  • 核对:nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/task/EmptyBoxTask.java

  • 步骤 1执行格式和占位符检查

rg -n "FIXME|待补充" \
  nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/external/acs \
  nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs
git diff --check

预期:新增代码无占位符,git diff --check 无输出。

  • 步骤 2编译 WMS 及依赖模块
mvn -pl nl-module-wms/nl-module-wms-server -am -DskipTests compile

预期Reactor Summary 中所有模块为 SUCCESS,最终输出 BUILD SUCCESS

  • 步骤 3静态核对任务完成和取消链路

确认新接口调用 EmptyBoxService.createInbound;运输任务仍使用 HANDLE_CODE = "EMPTYBOXTASK"EmptyBoxTask.complete 调用 completeTask 更新仓位库存和木箱状态;EmptyBoxTask.cancel 调用 cancelTask 释放仓位并删除待入库木箱。

  • 步骤 4提交实现
git add \
  nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/enums/acs \
  nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs \
  nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/external/acs
git commit -m "feat: 增加ACS空木箱入库申请接口"

不暂存工作区内与本需求无关的用户改动。