no message

main
huojin\hj 2025-08-13 14:27:14 +08:00
parent e3b87d1423
commit c406d91b57
4 changed files with 22 additions and 33 deletions

View File

@ -21,10 +21,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.HashSet; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@ -37,6 +34,7 @@ public class NioF3AppServiceImpl implements NioF3AppService {
private final AgvTaskService agvTaskService; private final AgvTaskService agvTaskService;
private final KMReService kmReService; private final KMReService kmReService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void bindSmallItemPicking(BindSmall bindSmall) { public void bindSmallItemPicking(BindSmall bindSmall) {
@ -47,22 +45,17 @@ public class NioF3AppServiceImpl implements NioF3AppService {
List<Les> lesList = validateLes(bindSmall.getSrcPositionCode(), bindSmall.getOnlineNo()); List<Les> lesList = validateLes(bindSmall.getSrcPositionCode(), bindSmall.getOnlineNo());
List<Long> lesIds = lesList.stream().map(Les::getId).collect(Collectors.toList()); List<Long> lesIds = lesList.stream().map(Les::getId).collect(Collectors.toList());
//验证起点是否有Agv任务
validateAgvTask(bindSmall.getSrcPositionCode());
// 获取目标点位 // 获取目标点位
String endPointCode = getEndPointCode(lesList); String endPointCode = getEndPointCode(lesList);
// 4. 仅对关键更新操作加锁
String lockKey = bindSmall.getSrcPositionCode().intern();
AgvTask agvTask; AgvTask agvTask;
synchronized (lockKey) { synchronized (bindSmall.getSrcPositionCode().intern()) {
//生成Agv任务 // 验证起点是否有Agv任务
validateAgvTask(bindSmall.getSrcPositionCode());
// 生成任务
agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindSmall.getSrcPositionCode(), endPointCode, "TUGGER"); agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindSmall.getSrcPositionCode(), endPointCode, "TUGGER");
// 绑定任务 // 绑定任务
bindLesAgvTask(agvTask.getId(), lesIds); bindLesAgvTask(agvTask.getId(), lesIds);
} }
// 下发任务 // 下发任务
kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskQYCJson(agvTask, bindSmall.getShooter(), null)); kmReService.sendAgvTask(agvTask, kmReService.sendAgvTaskQYCJson(agvTask, bindSmall.getShooter(), null));
} }
@ -100,8 +93,8 @@ public class NioF3AppServiceImpl implements NioF3AppService {
} }
private void validateAgvTask(String pointCode) { private void validateAgvTask(String pointCode) {
Boolean bool = agvTaskService.findByStartSlotCode(pointCode, "MOVE", "TUGGER"); Long taskCount = agvTaskService.findByStartSlotCode(pointCode, "MOVE", "TUGGER");
if (bool) { if (taskCount > 0) {
throw new BadRequestException(pointCode + "点位有任务,请勿重复下发"); throw new BadRequestException(pointCode + "点位有任务,请勿重复下发");
} }
} }
@ -135,19 +128,15 @@ public class NioF3AppServiceImpl implements NioF3AppService {
//验证料箱号 //验证料箱号
validateBoxNos(lesList, boxNos); validateBoxNos(lesList, boxNos);
//验证起点是否有Agv任务
validateAgvTask(bindLarge.getSrcPositionCode());
//获取目标点位 //获取目标点位
String endPointCode = getEndPointCode(lesList); String endPointCode = getEndPointCode(lesList);
// 4. 仅对关键更新操作加锁
String lockKey = bindLarge.getSrcPositionCode().intern();
AgvTask agvTask; AgvTask agvTask;
synchronized (lockKey) { synchronized (bindLarge.getSrcPositionCode().intern()) {
//生成Agv任务 // 验证起点是否有Agv任务
validateAgvTask(bindLarge.getSrcPositionCode());
// 生成任务
agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindLarge.getSrcPositionCode(), endPointCode, "TUGGER"); agvTask = agvTaskService.createAgvTask(BizStatus.OPEN, null, bindLarge.getSrcPositionCode(), endPointCode, "TUGGER");
// 绑定任务 // 绑定任务
bindLesAgvTask(agvTask.getId(), lesIds); bindLesAgvTask(agvTask.getId(), lesIds);
} }

View File

@ -42,6 +42,5 @@ public interface AgvTaskRepository extends JpaRepository<AgvTask, Long>, 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') ") @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); Long findByEndSlotCode(String endSlotCode, String type, String jobType);
} }

View File

@ -115,7 +115,7 @@ public interface AgvTaskService {
* @param type * @param type
* @param jobType * @param jobType
*/ */
Boolean findByStartSlotCode(String startSlotCode, String type, String jobType); Long findByStartSlotCode(String startSlotCode, String type, String jobType);
/** /**
* *

View File

@ -18,6 +18,7 @@ package com.youchain.businessdata.service.impl;
import com.youchain.basicdata.domain.Stock; import com.youchain.basicdata.domain.Stock;
import com.youchain.businessdata.domain.*; import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.service.*; import com.youchain.businessdata.service.*;
import com.youchain.exception.BadRequestException;
import com.youchain.utils.*; import com.youchain.utils.*;
import com.youchain.businessdata.repository.AgvTaskRepository; import com.youchain.businessdata.repository.AgvTaskRepository;
import com.youchain.businessdata.service.dto.AgvTaskDto; import com.youchain.businessdata.service.dto.AgvTaskDto;
@ -143,8 +144,8 @@ public class AgvTaskServiceImpl implements AgvTaskService {
} }
@Override @Override
public Boolean findByStartSlotCode(String startSlotCode, String type, String jobType) { public Long findByStartSlotCode(String startSlotCode, String type, String jobType) {
return agvTaskRepository.findByStartSlotCode(startSlotCode, type, jobType)>0; return agvTaskRepository.findByStartSlotCode(startSlotCode, type, jobType);
} }
@Override @Override