#
vincentlu
昨天 971560de6386d87ee9e05be038fd4571865a1def
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/GuaranteeRuntimeService.java
@@ -2,17 +2,15 @@
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.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@@ -24,6 +22,9 @@
@Slf4j
@Service
public class GuaranteeRuntimeService {
    @Autowired
    private SegmentService segmentService;
    private final AgvService agvService;
    private final AgvDetailService agvDetailService;
@@ -46,13 +47,16 @@
            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)) {
@@ -66,12 +70,12 @@
            }
        }
        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;
        int shortage = requiredCount - available;   // 还差多少辆
        candidates.sort(Comparator.comparingInt(ChargeCandidate::getSoc));
        int scheduled = 0;
        int scheduled = 0;  // 已经安排充电的AGV数量
        for (ChargeCandidate candidate : candidates) {
            if (scheduled >= shortage) {
                break;
@@ -94,19 +98,37 @@
        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) {
@@ -116,6 +138,7 @@
        return agvService.list(wrapper);
    }
    @Data
    private static class ChargeCandidate {
        private final Agv agv;
        private final int soc;
@@ -125,12 +148,5 @@
            this.soc = soc;
        }
        public Agv getAgv() {
            return agv;
        }
        public int getSoc() {
            return soc;
        }
    }
}