| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.zy.acs.common.enums.AgvStatusType; |
| | | import com.zy.acs.manager.manager.entity.Agv; |
| | | import com.zy.acs.manager.manager.entity.AgvDetail; |
| | | import com.zy.acs.manager.manager.entity.Guarantee; |
| | | import com.zy.acs.manager.manager.entity.Task; |
| | | import com.zy.acs.manager.manager.enums.StatusType; |
| | | import com.zy.acs.manager.manager.enums.TaskStsType; |
| | | import com.zy.acs.manager.manager.enums.TaskTypeType; |
| | | import com.zy.acs.manager.manager.entity.*; |
| | | import com.zy.acs.manager.manager.enums.*; |
| | | import com.zy.acs.manager.manager.service.AgvDetailService; |
| | | import com.zy.acs.manager.manager.service.AgvService; |
| | | import com.zy.acs.manager.manager.service.SegmentService; |
| | | import com.zy.acs.manager.manager.service.TaskService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.time.LocalDateTime; |
| | |
| | | @Slf4j |
| | | @Service |
| | | public class GuaranteeRuntimeService { |
| | | |
| | | @Autowired |
| | | private SegmentService segmentService; |
| | | |
| | | private final AgvService agvService; |
| | | private final AgvDetailService agvDetailService; |
| | |
| | | log.warn("Guarantee[{}] requiredCount is not configured, skip", plan.getName()); |
| | | return; |
| | | } |
| | | int minSoc = plan.getMinSoc() == null ? 50 : plan.getMinSoc(); |
| | | List<Agv> scopedAgvs = findScopedAgvs(plan); |
| | | int minSoc = plan.getMinSoc(); |
| | | List<Agv> scopedAgvList = findScopedAgvList(plan); |
| | | int available = 0; |
| | | List<ChargeCandidate> candidates = new ArrayList<>(); |
| | | for (Agv agv : scopedAgvs) { |
| | | AgvDetail detail = agvDetailService.selectByAgvId(agv.getId()); |
| | | if (detail == null || detail.getSoc() == null) { |
| | | for (Agv agv : scopedAgvList) { |
| | | AgvDetail detail = agvDetailService.selectMajorByAgvId(agv.getId()); |
| | | if (null == detail || null == detail.getSoc() || null == detail.getAgvStatus()) { |
| | | continue; |
| | | } |
| | | if (detail.getAgvStatus().equals(AgvStatusType.CHARGE)) { |
| | | continue; |
| | | } |
| | | if (!isIdle(agv, detail)) { |
| | |
| | | } |
| | | } |
| | | if (available >= requiredCount) { |
| | | log.debug("Guarantee[{}] already has {} vehicles >= {}% SOC for {}", plan.getName(), available, minSoc, targetTime); |
| | | // log.debug("Guarantee[{}] already has {} vehicles >= {}% SOC for {}", plan.getName(), available, minSoc, targetTime); |
| | | return; |
| | | } |
| | | int shortage = requiredCount - available; |
| | |
| | | if (detail.getAgvStatus() != null && detail.getAgvStatus().equals(AgvStatusType.CHARGE)) { |
| | | return false; |
| | | } |
| | | long busyCount = taskService.count(new LambdaQueryWrapper<Task>() |
| | | |
| | | if (0 < taskService.count(new LambdaQueryWrapper<Task>() |
| | | .eq(Task::getAgvId, agv.getId()) |
| | | // .and(i -> { |
| | | // i.eq(Task::getTaskSts, TaskStsType.WAITING.val()) |
| | | // .or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val()) |
| | | // .or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val()); |
| | | // }) |
| | | .in(Task::getTaskSts, |
| | | TaskStsType.WAITING.val(), |
| | | TaskStsType.ASSIGN.val(), |
| | | TaskStsType.PROGRESS.val())); |
| | | return busyCount == 0; |
| | | TaskStsType.PROGRESS.val()) |
| | | )) { |
| | | return false; |
| | | } |
| | | if (0 < segmentService.count(new LambdaQueryWrapper<Segment>() |
| | | .eq(Segment::getAgvId, agv.getId()) |
| | | .and( i -> { |
| | | // i.eq(Segment::getState, SegmentStateType.WAITING.toString()).or() |
| | | i.eq(Segment::getState, SegmentStateType.RUNNING.toString()); |
| | | }) |
| | | )) { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | private List<Agv> findScopedAgvs(Guarantee plan) { |
| | | private List<Agv> findScopedAgvList(Guarantee plan) { |
| | | LambdaQueryWrapper<Agv> wrapper = new LambdaQueryWrapper<Agv>() |
| | | .eq(Agv::getStatus, StatusType.ENABLE.val); |
| | | if ("MODEL".equalsIgnoreCase(plan.getScopeType()) && plan.getScopeValue() != null) { |
| | | if (GuaranteeScopeType.MODEL.toString().equalsIgnoreCase(plan.getScopeType()) && plan.getScopeValue() != null) { |
| | | try { |
| | | wrapper.eq(Agv::getAgvModel, Long.valueOf(plan.getScopeValue())); |
| | | } catch (NumberFormatException ignore) { |