1
zhang
1 天以前 5d8216a8d79aeb7b22a86478580018a3d9628406
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
import com.zy.acs.charge.ChargeCoreService;
import com.zy.acs.common.constant.RedisConstant;
import com.zy.acs.common.enums.AgvStatusType;
@@ -10,8 +9,8 @@
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.common.DateUtils;
import com.zy.acs.manager.common.config.UplinkProperties;
import com.zy.acs.manager.core.integrate.wms.TaskReportService;
import com.zy.acs.manager.core.integrate.wms.FaultReportService;
import com.zy.acs.manager.core.integrate.wms.TaskReportService;
import com.zy.acs.manager.core.service.ChargeService;
import com.zy.acs.manager.core.service.MainLockWrapService;
import com.zy.acs.manager.manager.entity.*;
@@ -71,8 +70,10 @@
    @Scheduled(cron = "0/5 * * * * ? ")
    private synchronized void autoCharge(){
        if (!configService.getVal("TaskAssignMode", Boolean.class)) { return; }
    private synchronized void autoCharge() {
        if (!configService.getVal("TaskAssignMode", Boolean.class)) {
            return;
        }
        List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
        for (Agv agv : agvList) {
            AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
@@ -87,19 +88,19 @@
                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());
                            i.eq(Task::getTaskSts, TaskStsType.WAITING.val())
                                    .or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val())
                                    .or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val());
                        })
                )) {
                    continue;
                }
                if (0 < segmentService.count(new LambdaQueryWrapper<Segment>()
                        .eq(Segment::getAgvId, agv.getId())
                        .and( i -> {
                                .eq(Segment::getAgvId, agv.getId())
                                .and(i -> {
//                                i.eq(Segment::getState, SegmentStateType.WAITING.toString()).or()
                                i.eq(Segment::getState, SegmentStateType.RUNNING.toString());
                        })
                                    i.eq(Segment::getState, SegmentStateType.RUNNING.toString());
                                })
                )) {
                    continue;
                }
@@ -112,9 +113,13 @@
    @Scheduled(cron = "0/1 * * * * ? ")
//    @Scheduled(cron = "0 */2 * * * ? ")
    private synchronized void autoStandby(){
        if (!configService.getVal("TaskAssignMode", Boolean.class)) { return; }
        if (!configService.getVal("automaticStandbyPosition", Boolean.class)) { return; }
    private synchronized void autoStandby() {
        if (!configService.getVal("TaskAssignMode", Boolean.class)) {
            return;
        }
        if (!configService.getVal("automaticStandbyPosition", Boolean.class)) {
            return;
        }
        List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
        for (Agv agv : agvList) {
@@ -148,28 +153,30 @@
            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());
                        i.eq(Task::getTaskSts, TaskStsType.WAITING.val())
                                .or().eq(Task::getTaskSts, TaskStsType.ASSIGN.val())
                                .or().eq(Task::getTaskSts, TaskStsType.PROGRESS.val());
                    })
            )) {
                continue;
            }
            // the time between the latest task and now that be must more that @{param} seconds
//            if (!Optional.ofNullable((Boolean) redis.getObject(RedisConstant.AGV_TO_STANDBY_FLAG, agv.getUuid())).orElse(false)) {
                Integer intervalOfAutoStandby = configService.getVal("intervalOfAutoStandby", Integer.class);
                if (null != intervalOfAutoStandby && intervalOfAutoStandby > 0) {
                    Task latestTask = taskService.findLatestTask(agv.getId(), null);
                    if (null != latestTask) {
                        long seconds = DateUtils.diffToSeconds(
                                Optional.ofNullable(latestTask.getEndTime()).orElse(latestTask.getUpdateTime())
                                , new Date()
                        );
                        if (seconds < intervalOfAutoStandby) { continue; }
            Integer intervalOfAutoStandby = configService.getVal("intervalOfAutoStandby", Integer.class);
            if (null != intervalOfAutoStandby && intervalOfAutoStandby > 0) {
                Task latestTask = taskService.findLatestTask(agv.getId(), null);
                if (null != latestTask) {
                    long seconds = DateUtils.diffToSeconds(
                            Optional.ofNullable(latestTask.getEndTime()).orElse(latestTask.getUpdateTime())
                            , new Date()
                    );
                    if (seconds < intervalOfAutoStandby) {
                        continue;
                    }
                } else {
                    continue;
                }
            } else {
                continue;
            }
//            }
            mainLockWrapService.buildMinorTask(agv.getId(), TaskTypeType.TO_STANDBY, null, null);
@@ -178,13 +185,17 @@
    @Scheduled(cron = "0/3 * * * * ? ")
    private void reportTaskToUplink() {
        if (!uplinkProperties.getEnabled()) { return; }
        if (!uplinkProperties.getEnabled()) {
            return;
        }
        List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>()
                .in(Task::getUplinkSts, TaskUplinkStateType.PENDING.toString(), TaskUplinkStateType.FAILED.toString())
                .eq(Task::getTaskSts, TaskStsType.COMPLETE.val())
                .isNotNull(Task::getBusId)
        );
        if (Cools.isEmpty(taskList)) { return; }
        if (Cools.isEmpty(taskList)) {
            return;
        }
        for (Task task : taskList) {
            boolean finished = taskReportService.reportFinished(task);
            if (finished) {
@@ -217,11 +228,15 @@
    @Scheduled(cron = "0/3 * * * * ? ")
    private void reportFault() {
        String reportFaultUrl = configService.getVal("reportFaultUrl", String.class);
        if (Cools.isEmpty(reportFaultUrl)) { return; }
        if (Cools.isEmpty(reportFaultUrl)) {
            return;
        }
        List<VehFaultRec> vehFaultRecList = vehFaultRecService.list((new LambdaQueryWrapper<VehFaultRec>().eq(VehFaultRec::getState, VehFaultRecStateType.PENDING).ge(VehFaultRec::getHappenTime, Instant.now().minusSeconds(3).atZone(ZoneId.systemDefault()).toLocalDateTime())));
        if (Cools.isEmpty(vehFaultRecList)) { return; }
        if (Cools.isEmpty(vehFaultRecList)) {
            return;
        }
        for (VehFaultRec vehFaultRec : vehFaultRecList) {
            boolean finished = faultReportService.reportFinished(vehFaultRec,reportFaultUrl);
            boolean finished = faultReportService.reportFinished(vehFaultRec, reportFaultUrl);
            if (finished) {
                vehFaultRec.setState(VehFaultRecStateType.REPORT_SUCCESS.name());
            } else {
@@ -241,38 +256,52 @@
        Set<String> mapKeys = redis.getMapKeys(RedisConstant.AGV_CHARGE_FLAG);
        for (String key : mapKeys) {
            Integer status = redis.getMap(RedisConstant.AGV_CHARGE_FLAG, key);
            if (null == status) {
                continue;
            }
            AgvDetail agvDetail = agvDetailService.selectByAgvNo(key);
            FuncSta funcSta = funcStaService.getByCodeAndType(agvDetail.getCode(), FuncStaType.CHARGE.toString());
            ModbusRtuOverTcp modbusTcp = chargeService.get(funcSta.getUuid());
            if (status != null && status == 1) {
                // 后退信号消失,说明马达正在前进
                if (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
                    chargeCoreService.startCharging(modbusTcp);
                }
                while (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
                    double current = chargeCoreService.getCurrent(modbusTcp);
                    double voltage = chargeCoreService.getVoltage(modbusTcp);
                    if (current > 0 && voltage > 0) {
                        redis.setMap(RedisConstant.AGV_CHARGE_FLAG, key, 2);
                        log.info("charge complete");
                    }else {
                        log.info("read charge current and voltage: {},{}", current, voltage);
            if (null == agvDetail || null == agvDetail.getSoc() || null == agvDetail.getAgvStatus() || funcSta == null || null == modbusTcp) {
                continue;
            }
            switch (status) {
                case 1:
                    // 后退信号消失,说明马达正在前进
                    if (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
                        chargeCoreService.startCharging(modbusTcp);
                    }
                }
            } else if (status != null && status == 2) {
                // 后退信号消失,说明马达正在前进
                if (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
                    chargeCoreService.startCharging(modbusTcp);
                }
                while (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
                    redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
                    log.info("charge over");
                }
                    if (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
                        double current = chargeCoreService.getCurrent(modbusTcp);
                        double voltage = chargeCoreService.getVoltage(modbusTcp);
                        if (current > 0 && voltage > 0) {
                            redis.setMap(RedisConstant.AGV_CHARGE_FLAG, key, 2);
                            log.info("charge complete");
                        } else {
                            log.info("read charge current and voltage: {},{}", current, voltage);
                        }
                    }
                    break;
                case 2:
                    AgvModel agvModel = agvModelService.getByAgvId(agvDetail.getAgvId());
                    if (agvDetail.getSoc() >= agvModel.getQuaBattery()) {
                        // 前进信号存在,说明机械臂未伸回
                        if (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
                            chargeCoreService.stopCharging(modbusTcp);
                        }
                        if (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
                            redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
                            log.info("charge over");
                        }
                    }
                    break;
                default:
                    log.error("charge status error: {}", status);
                    break;
            }
        }
    }
}