|
|
@ -24,6 +24,7 @@ import com.gaotao.modules.autoWareHourceHaian.api.entity.HaiAnRobotErrorRequest; |
|
|
import com.gaotao.modules.autoWareHourceHaian.api.entity.HaiAnWcsInboundCallbackRequest; |
|
|
import com.gaotao.modules.autoWareHourceHaian.api.entity.HaiAnWcsInboundCallbackRequest; |
|
|
import com.gaotao.modules.autoWareHourceHaian.api.service.HaiAnWmsMessageService; |
|
|
import com.gaotao.modules.autoWareHourceHaian.api.service.HaiAnWmsMessageService; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnCountResultInsertData; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnCountResultInsertData; |
|
|
|
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnTransportTaskDetailLockParam; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.pda.HaiAnAreaOption; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.pda.HaiAnAreaOption; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.pda.HaiAnHandlingUnitLabelRow; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.pda.HaiAnHandlingUnitLabelRow; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.pda.HaiAnPalletDetailRow; |
|
|
import com.gaotao.modules.autoWareHourceHaian.entity.pda.HaiAnPalletDetailRow; |
|
|
@ -205,11 +206,8 @@ public class HaiAnWmsMessageServiceImpl implements HaiAnWmsMessageService { |
|
|
throw new RuntimeException("RFID复核taskNo或palletId超过运输明细字段长度"); |
|
|
throw new RuntimeException("RFID复核taskNo或palletId超过运输明细字段长度"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 与原AGV回调使用同一事务级任务锁;只串行化同site+taskNo的写入,不查询或要求运输主表存在。- rqrq |
|
|
|
|
|
Integer lockResult = haiAnAgvTaskMapper.lockTransportTaskDetailInsert(site, taskNo); |
|
|
|
|
|
if (lockResult == null || lockResult < 0) { |
|
|
|
|
|
throw new RuntimeException("RFID复核取得运输明细写入锁失败,taskNo=" + taskNo + ",lockResult=" + lockResult); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 与AGV回调共用事务级任务锁;锁失败中断首次复核写入,不查询或要求运输主表存在。- rqrq |
|
|
|
|
|
acquireTransportTaskDetailInsertLock(site, taskNo); |
|
|
// 锁内先读取历史及在线首条;重复请求直接返回首轮响应,禁止用本次扫描覆盖复核事实。- rqrq |
|
|
// 锁内先读取历史及在线首条;重复请求直接返回首轮响应,禁止用本次扫描覆盖复核事实。- rqrq |
|
|
HaiAnWmsTransportTaskDetail firstDetail = haiAnAgvTaskMapper.getFirstRfidVerifyDetail( |
|
|
HaiAnWmsTransportTaskDetail firstDetail = haiAnAgvTaskMapper.getFirstRfidVerifyDetail( |
|
|
site, taskNo, HaiAnAgvCallbackTypeStaticData.RFID_CHECK); |
|
|
site, taskNo, HaiAnAgvCallbackTypeStaticData.RFID_CHECK); |
|
|
@ -333,6 +331,25 @@ public class HaiAnWmsMessageServiceImpl implements HaiAnWmsMessageService { |
|
|
return result; |
|
|
return result; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* @Description 通过单次Callable取得同site+taskNo的事务级应用锁;两入口共用锁键并在锁内分配明细序号。- rqrq |
|
|
|
|
|
* @param site 请求大site,必须已按入口规则校验,不能取登录态。- rqrq |
|
|
|
|
|
* @param taskNo 搬运任务号,直接对应明细task_no,不要求主任务存在。- rqrq |
|
|
|
|
|
*/ |
|
|
|
|
|
private void acquireTransportTaskDetailInsertLock(String site, String taskNo) { |
|
|
|
|
|
if (!StringUtils.hasText(site) || !StringUtils.hasText(taskNo)) { |
|
|
|
|
|
throw new RuntimeException("运输明细写入锁缺少site或taskNo"); |
|
|
|
|
|
} |
|
|
|
|
|
HaiAnTransportTaskDetailLockParam lockParam = new HaiAnTransportTaskDetailLockParam(site, taskNo); |
|
|
|
|
|
// 单次调用SQL Server sp_getapplock并读取返回码;数据库异常或负码须回滚,禁止无锁写入首次复核。- rqrq |
|
|
|
|
|
haiAnAgvTaskMapper.lockTransportTaskDetailInsert(lockParam); |
|
|
|
|
|
Integer lockResult = lockParam.getLockResult(); |
|
|
|
|
|
if (lockResult == null || lockResult < 0) { |
|
|
|
|
|
throw new RuntimeException("取得运输明细写入锁失败,site=" + site + ",taskNo=" + taskNo |
|
|
|
|
|
+ ",lockResult=" + lockResult); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @author rqrq |
|
|
* @author rqrq |
|
|
* @Description 处理海安立库出入库回调:按事务类型分流落库,到达出库口(原取货通知)执行幂等校验,目标区域固定A01并映射仓库/库位;仅认新中文 - rqrq |
|
|
* @Description 处理海安立库出入库回调:按事务类型分流落库,到达出库口(原取货通知)执行幂等校验,目标区域固定A01并映射仓库/库位;仅认新中文 - rqrq |
|
|
@ -1512,10 +1529,7 @@ public class HaiAnWmsMessageServiceImpl implements HaiAnWmsMessageService { |
|
|
|
|
|
|
|
|
// 2. 只写haian_wms_transport_task_detail:task_no用wmsId,状态统一“已录入”,targetArea落to_area,不校验主记录存在 - rqrq |
|
|
// 2. 只写haian_wms_transport_task_detail:task_no用wmsId,状态统一“已录入”,targetArea落to_area,不校验主记录存在 - rqrq |
|
|
// 与同步RFID复核共用事务级任务锁;失败中断,避免两入口并发分到同一seqNo或产生两条首次复核。- rqrq |
|
|
// 与同步RFID复核共用事务级任务锁;失败中断,避免两入口并发分到同一seqNo或产生两条首次复核。- rqrq |
|
|
Integer lockResult = haiAnAgvTaskMapper.lockTransportTaskDetailInsert(site, wmsId); |
|
|
|
|
|
if (lockResult == null || lockResult < 0) { |
|
|
|
|
|
throw new RuntimeException("AGV反馈取得运输明细写入锁失败,taskNo=" + wmsId + ",lockResult=" + lockResult); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
acquireTransportTaskDetailInsertLock(site, wmsId); |
|
|
// 旧AGV接口的RFID动作也须遵守首次结果;历史或在线已有复核时直接幂等返回,不在归档后补写第二条。- rqrq |
|
|
// 旧AGV接口的RFID动作也须遵守首次结果;历史或在线已有复核时直接幂等返回,不在归档后补写第二条。- rqrq |
|
|
if (HaiAnAgvCallbackTypeStaticData.RFID_CHECK.equals(normalizedType)) { |
|
|
if (HaiAnAgvCallbackTypeStaticData.RFID_CHECK.equals(normalizedType)) { |
|
|
HaiAnWmsTransportTaskDetail firstRfidDetail = haiAnAgvTaskMapper.getFirstRfidVerifyDetail( |
|
|
HaiAnWmsTransportTaskDetail firstRfidDetail = haiAnAgvTaskMapper.getFirstRfidVerifyDetail( |
|
|
|