From cc4e44f4e5ee1c0187e280114fb1c111c0074f5b Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Fri, 7 Aug 2026 13:48:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=8F=91=E8=B4=A7=E5=8C=BAAGV=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plans/2026-08-06-shipping-area-task.md | 65 +++++++++ .../controller/acs/CallTaskController.java | 18 +++ .../acs/vo/AcsShippingApplyReqVO.java | 17 +++ .../acs/vo/AcsShippingApplyRespVO.java | 20 +++ .../iostorinvdis/OutboundBillRef.java | 13 ++ .../point/ShippingPointRowCandidate.java | 12 ++ .../wms/dal/dataobject/point/WmsPointDO.java | 31 +++++ .../iostorinvdis/IostorinvDisMapper.java | 4 + .../wms/dal/mysql/point/WmsPointMapper.java | 42 ++++++ .../shippingarea/ShippingAreaService.java | 19 +++ .../shippingarea/ShippingAreaServiceImpl.java | 131 ++++++++++++++++++ .../code/nl/module/wms/task/ShipAreaTask.java | 29 ++++ .../iostorinvdis/IostorinvDisMapper.xml | 13 ++ .../resources/mapper/point/WmsPointMapper.xml | 110 +++++++++++++++ 14 files changed, 524 insertions(+) create mode 100644 docs/superpowers/plans/2026-08-06-shipping-area-task.md create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyReqVO.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyRespVO.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/OutboundBillRef.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/ShippingPointRowCandidate.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/WmsPointDO.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/point/WmsPointMapper.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaService.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaServiceImpl.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/task/ShipAreaTask.java create mode 100644 nl-module-wms/nl-module-wms-server/src/main/resources/mapper/point/WmsPointMapper.xml diff --git a/docs/superpowers/plans/2026-08-06-shipping-area-task.md b/docs/superpowers/plans/2026-08-06-shipping-area-task.md new file mode 100644 index 00000000..a34b7ce8 --- /dev/null +++ b/docs/superpowers/plans/2026-08-06-shipping-area-task.md @@ -0,0 +1,65 @@ +# 发货区 AGV 任务实现计划 + +> **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development(推荐)或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。 + +**目标:** 接收 AGV 对接位和木箱号,根据木箱最近未删除出库单分配发货区点位并创建、下发搬运任务。 + +**架构:** ACS Controller 接收请求,ShippingAreaService 负责出库单关联、同单同排选位、条件抢占和任务生命周期;WmsPointMapper XML 负责候选排及点位更新;ShipAreaTask 只转发完成和取消回调。 + +**技术栈:** Java 17、Spring Boot、MyBatis XML、MySQL、现有 TransportTaskApi。 + +--- + +### 任务 1:请求响应与出库单关联查询 + +**文件:** +- 创建:`controller/acs/vo/AcsShippingApplyReqVO.java` +- 创建:`controller/acs/vo/AcsShippingApplyRespVO.java` +- 修改:`IostorinvDisMapper.java`、`IostorinvDisMapper.xml` + +- [ ] 请求定义必填 `deviceCode`、`boxNo`;响应返回任务、木箱、点位和出库单信息。 +- [ ] Mapper 按木箱号关联主表,只筛选 `deleted = 0`,按创建时间和主键倒序返回最近一张。 +- [ ] 查询无结果时由 Service 抛出明确业务异常。 + +### 任务 2:发货点持久化与并发抢占 + +**文件:** +- 创建:`dal/dataobject/point/WmsPointDO.java` +- 创建:`dal/dataobject/point/ShippingPointRowCandidate.java` +- 创建:`dal/mysql/point/WmsPointMapper.java` +- 创建:`resources/mapper/point/WmsPointMapper.xml` + +- [ ] 同单候选排只按 `row_num` 分组,识别已到位木箱、已创建任务和 `B{billId}` 临时预占。 +- [ ] 空排要求该 `row_num` 下所有点位的载具和任务均为空。 +- [ ] 排内按 `col_num, point_code` 选择空闲点位。 +- [ ] 条件更新预占点位,创建任务后绑定任务 ID。 +- [ ] 完成写木箱号和数量并清任务;取消只清任务。 +- [ ] `xmllint --noout WmsPointMapper.xml` 退出码为 0。 + +### 任务 3:领域服务和任务创建 + +**文件:** +- 创建:`service/shippingarea/ShippingAreaService.java` +- 创建:`service/shippingarea/ShippingAreaServiceImpl.java` + +- [ ] 查询木箱最近出库单。 +- [ ] 先遍历同单排,再遍历空排,条件抢占点位。 +- [ ] 创建任务,起点为设备号、终点为点位,`bizId` 为出库单 ID,`handleCode` 为 `SHIPAREATASK`。 +- [ ] 将预占码替换为任务 ID 后下发。 +- [ ] 完成和取消按任务 ID 精确更新一个点位。 + +### 任务 4:ACS 接口和任务回调 + +**文件:** +- 修改:`controller/acs/CallTaskController.java` +- 创建:`task/ShipAreaTask.java` + +- [ ] 增加 `POST /acs/call/shipping/apply`,使用 `@PermitAll` 和参数校验。 +- [ ] `ShipAreaTask` 完成、取消事件转发到 ShippingAreaService。 + +### 任务 5:验证 + +- [ ] 检查无新增注解 SQL。 +- [ ] 校验 Mapper XML 和 `git diff --check`。 +- [ ] 编译 WMS Server 及依赖模块,预期 `BUILD SUCCESS`。 +- [ ] 核对 `row_num` 分组、`col_num` 排序、同单优先、空排回退和任务回调闭环。 diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/CallTaskController.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/CallTaskController.java index 336e138d..b033c80f 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/CallTaskController.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/CallTaskController.java @@ -4,6 +4,9 @@ import cn.code.nl.framework.common.pojo.CommonResult; import cn.code.nl.module.wms.controller.acs.vo.AcsApplyInboundReqVO; import cn.code.nl.module.wms.controller.acs.vo.AcsApplyInboundRespVO; import cn.code.nl.module.wms.controller.acs.vo.AcsCallTaskReqVO; +import cn.code.nl.module.wms.controller.acs.vo.AcsShippingApplyReqVO; +import cn.code.nl.module.wms.controller.acs.vo.AcsShippingApplyRespVO; +import cn.code.nl.module.wms.service.shippingarea.ShippingAreaService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.security.PermitAll; @@ -13,6 +16,7 @@ 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 jakarta.annotation.Resource; import static cn.code.nl.framework.common.pojo.CommonResult.success; @@ -27,6 +31,20 @@ import static cn.code.nl.framework.common.pojo.CommonResult.success; @Validated public class CallTaskController { + @Resource + private ShippingAreaService shippingAreaService; + + /** + * 申请发货区 AGV 任务。 + */ + @PostMapping("/shipping/apply") + @Operation(summary = "申请发货区任务") + @PermitAll + public CommonResult applyShippingTask( + @Valid @RequestBody AcsShippingApplyReqVO reqVO) { + return success(shippingAreaService.applyShippingTask(reqVO)); + } + @PostMapping("/inbound/apply") @Operation(summary = "请求入库") @PermitAll diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyReqVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyReqVO.java new file mode 100644 index 00000000..bbbc7a80 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyReqVO.java @@ -0,0 +1,17 @@ +package cn.code.nl.module.wms.controller.acs.vo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * AGV 发货区任务申请请求。 + */ +@Data +public class AcsShippingApplyReqVO { + + @NotBlank(message = "设备号不能为空") + private String deviceCode; + + @NotBlank(message = "木箱号不能为空") + private String boxNo; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyRespVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyRespVO.java new file mode 100644 index 00000000..9a5ea12c --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/acs/vo/AcsShippingApplyRespVO.java @@ -0,0 +1,20 @@ +package cn.code.nl.module.wms.controller.acs.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * AGV 发货区任务申请结果。 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AcsShippingApplyRespVO { + + private Long taskId; + private String boxNo; + private String pointCode; + private Long outboundBillId; + private String outboundBillCode; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/OutboundBillRef.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/OutboundBillRef.java new file mode 100644 index 00000000..c8fd94e1 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/iostorinvdis/OutboundBillRef.java @@ -0,0 +1,13 @@ +package cn.code.nl.module.wms.dal.dataobject.iostorinvdis; + +import lombok.Data; + +/** + * 木箱关联的出库单引用。 + */ +@Data +public class OutboundBillRef { + + private Long outboundBillId; + private String outboundBillCode; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/ShippingPointRowCandidate.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/ShippingPointRowCandidate.java new file mode 100644 index 00000000..649677b8 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/ShippingPointRowCandidate.java @@ -0,0 +1,12 @@ +package cn.code.nl.module.wms.dal.dataobject.point; + +import lombok.Data; + +/** + * 发货区候选排。 + */ +@Data +public class ShippingPointRowCandidate { + + private Integer rowNum; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/WmsPointDO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/WmsPointDO.java new file mode 100644 index 00000000..0cb6c9e0 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/point/WmsPointDO.java @@ -0,0 +1,31 @@ +package cn.code.nl.module.wms.dal.dataobject.point; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * WMS 点位数据对象。 + */ +@Data +@TableName("wms_point") +public class WmsPointDO { + + @TableId + private String pointCode; + private String pointName; + private String regionCode; + private String regionName; + private String pointType; + private String pointStatus; + private String vehicleCode; + private Integer vehicleQty; + private Integer rowNum; + private Integer colNum; + private String ingTaskCode; + private Boolean isUsed; + + @TableField(exist = false) + private String taskVehicleCode; +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java index 2bc43488..1b293993 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/iostorinvdis/IostorinvDisMapper.java @@ -6,6 +6,7 @@ import cn.code.nl.framework.common.pojo.PageResult; import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX; import cn.code.nl.module.wms.dal.dataobject.iostorinvdis.IostorinvDisDO; +import cn.code.nl.module.wms.dal.dataobject.iostorinvdis.OutboundBillRef; import org.apache.ibatis.annotations.Mapper; import cn.code.nl.module.wms.controller.admin.iostorinvdis.vo.*; import cn.code.nl.module.wms.controller.admin.iostorinv.vo.OutboundAllocationRespVO; @@ -19,6 +20,9 @@ import org.apache.ibatis.annotations.Param; @Mapper public interface IostorinvDisMapper extends BaseMapperX { + /** 根据木箱号查询最近一张未删除的出库单。 */ + OutboundBillRef selectLatestOutboundBillByBoxNo(@Param("boxNo") String boxNo); + List selectAllocationList( @Param("iostorinvId") Long iostorinvId, @Param("iostorinvdtlId") Long iostorinvdtlId, diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/point/WmsPointMapper.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/point/WmsPointMapper.java new file mode 100644 index 00000000..954de8f9 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/point/WmsPointMapper.java @@ -0,0 +1,42 @@ +package cn.code.nl.module.wms.dal.mysql.point; + +import cn.code.nl.module.wms.dal.dataobject.point.ShippingPointRowCandidate; +import cn.code.nl.module.wms.dal.dataobject.point.WmsPointDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * WMS 点位 Mapper。 + */ +@Mapper +public interface WmsPointMapper { + + /** 查询当前出库单已使用且仍有空位的排。 */ + List selectSameBillRows(@Param("billId") String billId); + + /** 查询整排为空的候选排。 */ + List selectEmptyRows(); + + /** 查询候选排内第一个空闲点位。 */ + WmsPointDO selectFreePointInRow(@Param("rowNum") Integer rowNum); + + /** 条件抢占发货点位。 */ + int reserveShippingPoint(@Param("pointCode") String pointCode, + @Param("reservationCode") String reservationCode); + + /** 将预占码替换为任务 ID。 */ + int bindShippingTask(@Param("pointCode") String pointCode, + @Param("reservationCode") String reservationCode, + @Param("taskId") String taskId); + + /** 查询任务占用的发货点位和任务木箱。 */ + WmsPointDO selectShippingTaskPoint(@Param("taskId") String taskId); + + /** 完成发货区任务。 */ + int completeShippingTask(@Param("taskId") String taskId, @Param("boxNo") String boxNo); + + /** 取消发货区任务。 */ + int cancelShippingTask(@Param("taskId") String taskId); +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaService.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaService.java new file mode 100644 index 00000000..fda74850 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaService.java @@ -0,0 +1,19 @@ +package cn.code.nl.module.wms.service.shippingarea; + +import cn.code.nl.module.wms.controller.acs.vo.AcsShippingApplyReqVO; +import cn.code.nl.module.wms.controller.acs.vo.AcsShippingApplyRespVO; + +/** + * 发货区任务服务。 + */ +public interface ShippingAreaService { + + /** 申请发货区 AGV 任务。 */ + AcsShippingApplyRespVO applyShippingTask(AcsShippingApplyReqVO reqVO); + + /** 完成发货区任务。 */ + void completeTask(Long taskId); + + /** 取消发货区任务。 */ + void cancelTask(Long taskId); +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaServiceImpl.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaServiceImpl.java new file mode 100644 index 00000000..cef90831 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/shippingarea/ShippingAreaServiceImpl.java @@ -0,0 +1,131 @@ +package cn.code.nl.module.wms.service.shippingarea; + +import cn.code.nl.framework.common.exception.ServiceException; +import cn.code.nl.module.task.api.TransportTaskApi; +import cn.code.nl.module.task.dto.TransportTaskCreateReqDTO; +import cn.code.nl.module.wms.controller.acs.vo.AcsShippingApplyReqVO; +import cn.code.nl.module.wms.controller.acs.vo.AcsShippingApplyRespVO; +import cn.code.nl.module.wms.dal.dataobject.iostorinvdis.OutboundBillRef; +import cn.code.nl.module.wms.dal.dataobject.point.ShippingPointRowCandidate; +import cn.code.nl.module.wms.dal.dataobject.point.WmsPointDO; +import cn.code.nl.module.wms.dal.mysql.iostorinvdis.IostorinvDisMapper; +import cn.code.nl.module.wms.dal.mysql.point.WmsPointMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 发货区任务服务实现。 + */ +@Service +public class ShippingAreaServiceImpl implements ShippingAreaService { + + private static final String SHIPPING_AREA_BIZ_TYPE = "SHIPPING_AREA"; + private static final String SHIPPING_AREA_HANDLE_CODE = "SHIPAREATASK"; + + @Resource + private IostorinvDisMapper iostorinvDisMapper; + @Resource + private WmsPointMapper wmsPointMapper; + @Resource + private TransportTaskApi transportTaskApi; + + /** + * 申请发货区 AGV 任务。 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public AcsShippingApplyRespVO applyShippingTask(AcsShippingApplyReqVO reqVO) { + OutboundBillRef bill = iostorinvDisMapper.selectLatestOutboundBillByBoxNo(reqVO.getBoxNo()); + if (bill == null) { + throw new ServiceException(500, "木箱未关联到未删除的出库单"); + } + String billId = String.valueOf(bill.getOutboundBillId()); + String reservationCode = "B" + billId; + WmsPointDO point = reserveShippingPoint(billId, reservationCode); + if (point == null) { + throw new ServiceException(500, "发货区没有符合条件的可用点位"); + } + Long taskId = createTransportTask(reqVO, point, billId); + if (wmsPointMapper.bindShippingTask(point.getPointCode(), reservationCode, + String.valueOf(taskId)) != 1) { + throw new ServiceException(500, "发货区点位预占状态异常,请重试"); + } + transportTaskApi.issueTransportTaskRollBack(taskId).getCheckedData(); + return new AcsShippingApplyRespVO(taskId, reqVO.getBoxNo(), point.getPointCode(), + bill.getOutboundBillId(), bill.getOutboundBillCode()); + } + + /** + * 完成发货区任务。 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void completeTask(Long taskId) { + String taskCode = String.valueOf(taskId); + WmsPointDO point = wmsPointMapper.selectShippingTaskPoint(taskCode); + if (point == null) { + throw new ServiceException(500, "未找到任务预占的发货区点位"); + } + if (wmsPointMapper.completeShippingTask(taskCode, point.getTaskVehicleCode()) != 1) { + throw new ServiceException(500, "发货区任务完成状态异常"); + } + } + + /** + * 取消发货区任务。 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelTask(Long taskId) { + if (wmsPointMapper.cancelShippingTask(String.valueOf(taskId)) != 1) { + throw new ServiceException(500, "未找到任务预占的发货区点位"); + } + } + + /** + * 按同单排、全空排的顺序抢占点位。 + */ + private WmsPointDO reserveShippingPoint(String billId, String reservationCode) { + WmsPointDO point = reserveFromRows(wmsPointMapper.selectSameBillRows(billId), reservationCode); + return point != null ? point : reserveFromRows(wmsPointMapper.selectEmptyRows(), reservationCode); + } + + /** + * 从候选排逐排尝试抢占空闲点位。 + */ + private WmsPointDO reserveFromRows(List rows, String reservationCode) { + for (ShippingPointRowCandidate row : rows) { + WmsPointDO point = wmsPointMapper.selectFreePointInRow(row.getRowNum()); + if (point != null && wmsPointMapper.reserveShippingPoint( + point.getPointCode(), reservationCode) == 1) { + return point; + } + } + return null; + } + + /** + * 创建搬运任务。 + */ + private Long createTransportTask(AcsShippingApplyReqVO reqVO, WmsPointDO point, String billId) { + TransportTaskCreateReqDTO task = new TransportTaskCreateReqDTO(); + task.setTaskName("发货区搬运任务"); + task.setOwnerService("WMS"); + task.setBizType(SHIPPING_AREA_BIZ_TYPE); + task.setBizId(billId); + task.setHandleCode(SHIPPING_AREA_HANDLE_CODE); + task.setTaskType("010503"); + task.setAcsTaskType("7"); + task.setAgvSystemType("1"); + task.setPointCode1(reqVO.getDeviceCode()); + task.setPointCode2(point.getPointCode()); + task.setVehicleCode(reqVO.getBoxNo()); + task.setIsAutoIssue("0"); + task.setProductArea("FH"); + task.setIsCreateFinish(true); + return transportTaskApi.createTransportTask(task).getCheckedData(); + } +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/task/ShipAreaTask.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/task/ShipAreaTask.java new file mode 100644 index 00000000..e3521623 --- /dev/null +++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/task/ShipAreaTask.java @@ -0,0 +1,29 @@ +package cn.code.nl.module.wms.task; + +import cn.code.nl.framework.execute.core.AbstractTask; +import cn.code.nl.framework.execute.core.dto.TaskExecuteDTO; +import cn.code.nl.module.wms.service.shippingarea.ShippingAreaService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +/** + * 发货区任务状态处理器。 + */ +@Component("SHIPAREATASK") +public class ShipAreaTask extends AbstractTask { + + @Resource + private ShippingAreaService shippingAreaService; + + /** 转发任务完成事件。 */ + @Override + public void doHandleFinish(TaskExecuteDTO dto) { + shippingAreaService.completeTask(dto.getTaskId()); + } + + /** 转发任务取消事件。 */ + @Override + public void doHandleCancel(TaskExecuteDTO dto) { + shippingAreaService.cancelTask(dto.getTaskId()); + } +} diff --git a/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml index 2c1d0d18..f0ce0423 100644 --- a/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml +++ b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/iostorinvdis/IostorinvDisMapper.xml @@ -2,6 +2,19 @@ + + + SELECT x.row_num + FROM () x + GROUP BY x.row_num + HAVING MAX(CASE WHEN (x.vehicle_code IS NOT NULL AND x.vehicle_code != '') + OR (x.ing_task_code IS NOT NULL AND x.ing_task_code != '') + THEN CASE WHEN x.outbound_bill_id = #{billId} THEN 1 ELSE 0 END + ELSE 0 END) = 1 + AND MAX(CASE WHEN ((x.vehicle_code IS NOT NULL AND x.vehicle_code != '') + OR (x.ing_task_code IS NOT NULL AND x.ing_task_code != '')) + AND (x.outbound_bill_id IS NULL OR x.outbound_bill_id != #{billId}) + THEN 1 ELSE 0 END) = 0 + AND MAX(CASE WHEN (x.vehicle_code IS NULL OR x.vehicle_code = '') + AND (x.ing_task_code IS NULL OR x.ing_task_code = '') + THEN 1 ELSE 0 END) = 1 + ORDER BY x.row_num + LIMIT 32 + + + + + + + + UPDATE wms_point + SET ing_task_code = #{reservationCode} + WHERE point_code = #{pointCode} AND region_code = 'FH' AND is_used = 1 + AND (vehicle_code IS NULL OR vehicle_code = '') + AND (ing_task_code IS NULL OR ing_task_code = '') + + + + UPDATE wms_point SET ing_task_code = #{taskId} + WHERE point_code = #{pointCode} AND region_code = 'FH' + AND ing_task_code = #{reservationCode} + + + + + + UPDATE wms_point + SET vehicle_code = #{boxNo}, vehicle_qty = 1, ing_task_code = NULL + WHERE region_code = 'FH' AND ing_task_code = #{taskId} + AND (vehicle_code IS NULL OR vehicle_code = '') + + + + UPDATE wms_point SET ing_task_code = NULL + WHERE region_code = 'FH' AND ing_task_code = #{taskId} + + +