diff --git a/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java index d282ff7..166933d 100644 --- a/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/appupdate/service/impl/NioF3AppServiceImpl.java @@ -21,10 +21,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -37,33 +34,29 @@ public class NioF3AppServiceImpl implements NioF3AppService { private final AgvTaskService agvTaskService; private final KMReService kmReService; + @Override @Transactional(rollbackFor = Exception.class) public void bindSmallItemPicking(BindSmall bindSmall) { - //验证参数 + // 验证参数 validateParams(bindSmall); - //验证Les任务 + // 验证Les任务 List lesList = validateLes(bindSmall.getSrcPositionCode(), bindSmall.getOnlineNo()); List lesIds = lesList.stream().map(Les::getId).collect(Collectors.toList()); - //验证起点是否有Agv任务 - validateAgvTask(bindSmall.getSrcPositionCode()); - - //获取目标点位 + // 获取目标点位 String endPointCode = getEndPointCode(lesList); - - // 4. 仅对关键更新操作加锁 - String lockKey = bindSmall.getSrcPositionCode().intern(); AgvTask agvTask; - synchronized (lockKey) { - //生成Agv任务 + synchronized (bindSmall.getSrcPositionCode().intern()) { + // 验证起点是否有Agv任务 + validateAgvTask(bindSmall.getSrcPositionCode()); + // 生成任务 agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindSmall.getSrcPositionCode(), endPointCode, "TUGGER"); - //绑定任务 + // 绑定任务 bindLesAgvTask(agvTask.getId(), lesIds); } - - //下发任务 + // 下发任务 kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskQYCJson(agvTask, bindSmall.getShooter(), null)); } @@ -100,8 +93,8 @@ public class NioF3AppServiceImpl implements NioF3AppService { } private void validateAgvTask(String pointCode) { - Boolean bool = agvTaskService.findByStartSlotCode(pointCode, "MOVE", "TUGGER"); - if (bool) { + Long taskCount = agvTaskService.findByStartSlotCode(pointCode, "MOVE", "TUGGER"); + if (taskCount > 0) { throw new BadRequestException(pointCode + "点位有任务,请勿重复下发"); } } @@ -135,20 +128,16 @@ public class NioF3AppServiceImpl implements NioF3AppService { //验证料箱号 validateBoxNos(lesList, boxNos); - //验证起点是否有Agv任务 - validateAgvTask(bindLarge.getSrcPositionCode()); - //获取目标点位 String endPointCode = getEndPointCode(lesList); - // 4. 仅对关键更新操作加锁 - String lockKey = bindLarge.getSrcPositionCode().intern(); AgvTask agvTask; - synchronized (lockKey) { - //生成Agv任务 + synchronized (bindLarge.getSrcPositionCode().intern()) { + // 验证起点是否有Agv任务 + validateAgvTask(bindLarge.getSrcPositionCode()); + // 生成任务 agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindLarge.getSrcPositionCode(), endPointCode, "TUGGER"); - - //绑定任务 + // 绑定任务 bindLesAgvTask(agvTask.getId(), lesIds); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java b/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java index a375b27..a070a46 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/repository/AgvTaskRepository.java @@ -42,6 +42,5 @@ public interface AgvTaskRepository extends JpaRepository, JpaSpec @Query(value = "select count(agv.id) from AgvTask agv where agv.endSlotCode=:endSlotCode and agv.type=:type and agv.jobType=:jobType and agv.status in ('OPEN','ATCALL','UP_CONTAINER') ") - @Lock(LockModeType.PESSIMISTIC_WRITE) Long findByEndSlotCode(String endSlotCode, String type, String jobType); } diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java b/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java index 399a239..4c9b68c 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/AgvTaskService.java @@ -115,7 +115,7 @@ public interface AgvTaskService { * @param type 任务类型 * @param jobType 作业类型 */ - Boolean findByStartSlotCode(String startSlotCode, String type, String jobType); + Long findByStartSlotCode(String startSlotCode, String type, String jobType); /** * 根据终点查询是否有重复任务 diff --git a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java index c412921..3cae0a8 100644 --- a/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java +++ b/youchain-system/src/main/java/com/youchain/businessdata/service/impl/AgvTaskServiceImpl.java @@ -18,6 +18,7 @@ package com.youchain.businessdata.service.impl; import com.youchain.basicdata.domain.Stock; import com.youchain.businessdata.domain.*; import com.youchain.businessdata.service.*; +import com.youchain.exception.BadRequestException; import com.youchain.utils.*; import com.youchain.businessdata.repository.AgvTaskRepository; import com.youchain.businessdata.service.dto.AgvTaskDto; @@ -143,8 +144,8 @@ public class AgvTaskServiceImpl implements AgvTaskService { } @Override - public Boolean findByStartSlotCode(String startSlotCode, String type, String jobType) { - return agvTaskRepository.findByStartSlotCode(startSlotCode, type, jobType)>0; + public Long findByStartSlotCode(String startSlotCode, String type, String jobType) { + return agvTaskRepository.findByStartSlotCode(startSlotCode, type, jobType); } @Override