Browse Source

乐观锁

master
常熟吴彦祖 3 months ago
parent
commit
663d1ec7cd
  1. 13
      src/main/java/com/gaotao/modules/automatedWarehouse/mapper/WcsIntegrationMapper.java
  2. 31
      src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/WcsTaskServiceImpl.java
  3. 10
      src/main/resources/mapper/automatedWarehouse/WcsIntegrationMapper.xml

13
src/main/java/com/gaotao/modules/automatedWarehouse/mapper/WcsIntegrationMapper.java

@ -238,6 +238,19 @@ public interface WcsIntegrationMapper {
@Param("processEndTime") Date processEndTime,
@Param("errorMsg") String errorMsg);
/**
* 原子性更新WCS回调任务状态乐观锁防止重复处理 - AI制作
* @param id 任务ID
* @param oldStatus 原状态必须匹配才能更新
* @param newStatus 新状态
* @param processStartTime 处理开始时间
* @return 影响的行数0=更新失败1=更新成功
*/
int updateWcsCallbackTaskStatusWithLock(@Param("id") Long id,
@Param("oldStatus") String oldStatus,
@Param("newStatus") String newStatus,
@Param("processStartTime") Date processStartTime);
void updatePalletWcsLocation(@Param("site") String site, @Param("palletId") String palletId, @Param("location") String location);
/**
* 更新WCS回调任务重试次数 - AI制作

31
src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/WcsTaskServiceImpl.java

@ -39,20 +39,35 @@ public class WcsTaskServiceImpl implements WcsTaskService {
@Override
public void processWcsCallbackTask(WcsCallbackTask callbackTask) {
try {
log.info("处理WCS回调任务:palletId={}, transType={}", callbackTask.getPalletId(), callbackTask.getTransTypeDesc());
log.info("处理WCS回调任务:palletId={}, transType={}, currentStatus={}",
callbackTask.getPalletId(), callbackTask.getTransTypeDesc(), callbackTask.getStatus());
// 1. 使用乐观锁更新状态为处理中防止重复处理
int updateCount = wcsIntegrationMapper.updateWcsCallbackTaskStatusWithLock(
callbackTask.getId(),
callbackTask.getStatus(), // 原状态已录入 or 处理失败
"处理中",
new Date()
);
// 2. 如果更新失败说明已被其他线程处理直接返回
if (updateCount == 0) {
log.warn("任务已被其他线程处理,跳过:id={}, palletId={}, status={}",
callbackTask.getId(), callbackTask.getPalletId(), callbackTask.getStatus());
return; // 跳过不抛异常
}
// 1. 更新状态为处理中
wcsIntegrationMapper.updateWcsCallbackTaskStatus(callbackTask.getId(), "处理中", new Date(), null, null);
log.info("成功锁定任务,开始处理:palletId={}", callbackTask.getPalletId());
// 2. 构建移库请求参数
// 3. 构建移库请求参数
WareHouseTransferRequest request = buildWareHouseTransferRequest(callbackTask);
// 3. 调用通用移库方法原样调用不修改
// 4. 调用通用移库方法原样调用不修改
String result = wmsMessageService.doWareHouseForPallet(request);
log.info("WCS回调任务处理成功:palletId={}, result={}", callbackTask.getPalletId(), result);
// 4. 如果是入库更新对应的wms_order_task状态
// 5. 如果是入库更新对应的wms_order_task状态
if ("入库".equals(callbackTask.getTransTypeDesc())) {
updateOrderTaskStatusForInbound(callbackTask);
//如果更新wcs库位
@ -62,11 +77,11 @@ public class WcsTaskServiceImpl implements WcsTaskService {
wcsIntegrationMapper.updatePalletWcsLocation(callbackTask.getSite(), callbackTask.getPalletId(), "");
}
// 5. 更新任务状态为已完成
// 6. 更新任务状态为已完成
wcsIntegrationMapper.updateWcsCallbackTaskStatus(callbackTask.getId(), "已完成", null, new Date(), null);
} catch (Exception e) {
log.error("处理WCS回调任务失败:palletId={}, error={}", callbackTask.getPalletId(), e.getMessage());
log.error("处理WCS回调任务失败:palletId={}", callbackTask.getPalletId(), e); // 记录完整堆栈
// 更新重试次数
int newRetryCount = (callbackTask.getRetryCount() == null ? 0 : callbackTask.getRetryCount()) + 1;

10
src/main/resources/mapper/automatedWarehouse/WcsIntegrationMapper.xml

@ -551,6 +551,16 @@
</if>
where id = #{id}
</update>
<!-- 原子性更新WCS回调任务状态(乐观锁版本,防止重复处理) - AI制作 -->
<update id="updateWcsCallbackTaskStatusWithLock">
UPDATE wcs_callback_task
SET status = #{newStatus},
process_start_time = #{processStartTime}
WHERE id = #{id}
AND status = #{oldStatus}
</update>
<update id="updatePalletWcsLocation" >
update pallet set location_code = #{location},updated_by='wms_sys',updated_time=getdate()
where site = #{site} and pallet_id = #{palletId}

Loading…
Cancel
Save