diff --git a/src/main/java/com/gaotao/modules/automatedWarehouse/entity/AgvStation.java b/src/main/java/com/gaotao/modules/automatedWarehouse/entity/AgvStation.java index 2d19084..ee02f7b 100644 --- a/src/main/java/com/gaotao/modules/automatedWarehouse/entity/AgvStation.java +++ b/src/main/java/com/gaotao/modules/automatedWarehouse/entity/AgvStation.java @@ -33,6 +33,28 @@ import java.math.BigDecimal; * 3. 比对 handling_unit.warehouse_id(条码仓库) * 4. 如果相同则允许扫进,否则报错 * + * + *
⚠️ 特殊站点说明 - D1、D2立库站点:
+ *
+ * D1、D2是立库管理的特殊站点,与普通站点的处理逻辑不同:
+ *
+ * 1. 状态管理:
+ * - D1、D2的实际状态由立库PLC管理
+ * - WMS的status_db字段只做相对记录,不做严格校验
+ * - 不需要使用乐观锁严格校验状态
+ *
+ * 2. 动态分配机制:
+ * - AGV到达D1/D2旁边的等待位时,触发"等待询问"回调
+ * - WMS调用立库接口warehouseAskStation()询问实际可用站点
+ * - 立库PLC返回D1或D2(根据实际状态决定)
+ * - WMS通知AGV修改放货点到立库返回的站点
+ *
+ * 3. 代码处理:
+ * - 起始站点(from_location)如果是D1/D2:直接UPDATE状态,不使用乐观锁
+ * - 目标站点(to_location)如果是D1/D2:预约时使用乐观锁,等待询问时动态分配
+ * - 普通站点(其他站点):必须使用乐观锁严格校验
+ *
+
*/
@Data
@TableName("agv_station")
@@ -109,6 +131,11 @@ public class AgvStation {
/**
* 站点状态数据库值
* 值为0:空闲 1.有货 2.待放货 3.待取货
+ *
+ * ⚠️ 特殊说明 - D1、D2立库站点:
+ * - D1、D2的实际状态由立库PLC管理,WMS只做相对记录
+ * - WMS不对D1、D2的status_db做严格校验
+ * - 通过"等待询问"机制实现动态分配 - rqrq
*/
private Integer statusDb;
diff --git a/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AgvTaskServiceImpl.java b/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AgvTaskServiceImpl.java
index 3c9a620..e0f4c57 100644
--- a/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AgvTaskServiceImpl.java
+++ b/src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/AgvTaskServiceImpl.java
@@ -238,15 +238,19 @@ public class AgvTaskServiceImpl implements AgvTaskService {
String station = null;
log.info("开始处理等待询问回调 - rqrq:目标站点={}", checkTask.getToLocation());
- // 判断是否为立库站点D1或D2 - rqrq
+ // ⚠️ 判断是否为立库站点D1或D2 - rqrq
+ // D1、D2是立库管理的特殊站点,实际状态由立库PLC管理
+ // WMS通过"等待询问"机制实现动态分配 - rqrq
if(checkTask.getToLocation().equals("D1") || checkTask.getToLocation().equals("D2")){
log.info("目标站点为立库站点,询问立库分配放货点 - rqrq");
- // 更新原目标站点状态为空闲 - rqrq
+ // 1. 释放WMS的原目标站点状态记录 - rqrq
+ // 注:此处只是释放WMS的状态记录,不影响立库PLC的实际状态 - rqrq
wcsIntegrationMapper.updateAgvStationStatus(checkTask.getToLocation(), 0, "空闲");
- log.info("原目标站点{}状态已更新为空闲 - rqrq", checkTask.getToLocation());
+ log.info("原目标站点{}状态已更新为空闲(WMS相对记录)- rqrq", checkTask.getToLocation());
- // 询问立库分配放货点 - rqrq
+ // 2. 询问立库PLC分配实际可用的放货点 - rqrq
+ // 立库PLC根据实际状态返回D1或D2 - rqrq
WarehouseAskStation askStation = new WarehouseAskStation();
askStation.setTaskNo(checkTask.getTaskNo());
askStation.setItemNo(checkTask.getItemNo());
@@ -259,9 +263,9 @@ public class AgvTaskServiceImpl implements AgvTaskService {
throw new RuntimeException("立库返回放货点有误!!");
}
- // 更新立库返回的站点状态为待放货 - rqrq
+ // 3. 更新立库返回的站点状态为待放货(WMS相对记录)- rqrq
wcsIntegrationMapper.updateAgvStationStatus(station, 2, "待放货");
- log.info("立库返回站点{},状态已更新为待放货 - rqrq", station);
+ log.info("立库返回站点{},状态已更新为待放货(WMS相对记录)- rqrq", station);
} else {
// 非立库站点,查询原目标点状态 - rqrq