zhang
13 小时以前 70930071a49190f414c8d8bc9c9e9795a4096739
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/GuaranteeRuntimeService.java
@@ -8,9 +8,11 @@
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 com.zy.acs.common.utils.News;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -24,26 +26,19 @@
    @Autowired
    private SegmentService segmentService;
    private final AgvService agvService;
    private final AgvDetailService agvDetailService;
    private final TaskService taskService;
    private final MainLockWrapService mainLockWrapService;
    public GuaranteeRuntimeService(AgvService agvService,
                                   AgvDetailService agvDetailService,
                                   TaskService taskService,
                                   MainLockWrapService mainLockWrapService) {
        this.agvService = agvService;
        this.agvDetailService = agvDetailService;
        this.taskService = taskService;
        this.mainLockWrapService = mainLockWrapService;
    }
    @Autowired
    private AgvService agvService;
    @Autowired
    private AgvDetailService agvDetailService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private MainLockWrapService mainLockWrapService;
    public void prepare(Guarantee plan, LocalDateTime targetTime) {
        int requiredCount = plan.getRequiredCount() == null ? 0 : plan.getRequiredCount();
        if (requiredCount <= 0) {
            log.warn("Guarantee[{}] requiredCount is not configured, skip", plan.getName());
            News.warn("Guarantee[{}] requiredCount is not configured, skip", plan.getName());
            return;
        }
        int minSoc = plan.getMinSoc();
@@ -69,23 +64,22 @@
            }
        }
        if (available >= requiredCount) {
//            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;
            }
            log.info("Guarantee[{}] schedule AGV {} charging (soc={}%) for target {}",
            News.info("Guarantee[{}] schedule AGV {} charging (soc={}%) for target {}",
                    plan.getName(), candidate.getAgv().getName(), candidate.getSoc(), targetTime);
            mainLockWrapService.buildMinorTask(candidate.getAgv().getId(), TaskTypeType.TO_CHARGE, null, null);
            scheduled++;
        }
        if (scheduled < shortage) {
            log.warn("Guarantee[{}] still short of {} vehicles for {} (only {} idle low-soc AGVs)",
            News.warn("Guarantee[{}] still short of {} vehicles for {} (only {} idle low-soc AGVs)",
                    plan.getName(), shortage - scheduled, targetTime, candidates.size());
        }
    }
@@ -95,6 +89,9 @@
            return false;
        }
        if (detail.getAgvStatus() != null && detail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
            return false;
        }
        if (!agvService.judgeOnline(agv.getId())) {
            return false;
        }
@@ -131,12 +128,13 @@
            try {
                wrapper.eq(Agv::getAgvModel, Long.valueOf(plan.getScopeValue()));
            } catch (NumberFormatException ignore) {
                log.warn("Guarantee[{}] invalid scopeValue {}", plan.getName(), plan.getScopeValue());
                News.warn("Guarantee[{}] invalid scopeValue {}", plan.getName(), plan.getScopeValue());
            }
        }
        return agvService.list(wrapper);
    }
    @Data
    private static class ChargeCandidate {
        private final Agv agv;
        private final int soc;
@@ -146,12 +144,5 @@
            this.soc = soc;
        }
        public Agv getAgv() {
            return agv;
        }
        public int getSoc() {
            return soc;
        }
    }
}
}