#
luxiaotao1123
2024-11-13 48eefc082760c3f859656e5375f5a71b04f38054
#
10个文件已修改
1个文件已添加
165 ■■■■ 已修改文件
zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvStatusType.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/constants.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-flow/src/map/tool.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-common/src/main/java/com/zy/acs/common/enums/AgvStatusType.java
@@ -15,6 +15,19 @@
    IMU_ERROR(0xF1, "IMU异常状态"),
    ERROR(0xFF, "故障状态"),
    ;
//    IDLE(0x00, "IDLE"),
//    STRAIGHT(0x01, "直行状态"),
//    TURN(0x03, "TURN"),
//    CHARGE(0x07, "CHARGE"),
//    LOW_POWER(0x08, "低功耗状态"),
//    PAUSE(0x09, "定时暂停状态"),
//    ROTATE(0x0A, "旋转标定状态"),
//    MOTION(0x0B, "取放货状态"),
//    TEMP(0x0C, "预留"),
//    LOST(0xF0, "丢失地址码状态"),
//    IMU_ERROR(0xF1, "IMU异常状态"),
//    ERROR(0xFF, "故障状态"),
//    ;
    public Integer val;
zy-acs-flow/src/map/constants.js
@@ -1,4 +1,5 @@
export const ANIMATE_DURING_TIME = 1000;
export const MAP_MODE = Object.freeze({
    OBSERVER_MODE: "1",
zy-acs-flow/src/map/tool.js
@@ -9,6 +9,7 @@
    DEVICE_SELECTED_EFFECT_COLOR,
    POINT_ROUTE_DIRECTION,
    DEVICE_SPRITE_TINT_DARK,
    ANIMATE_DURING_TIME,
} from './constants';
import { getRouteList } from './http';
import PointRoute from "./PointRoute";
@@ -564,7 +565,7 @@
    const endRotation = sprite.rotation + rotationDifference;
    new TWEEDLE.Tween(sprite)
        .to({ rotation: endRotation }, 1000)
        .to({ rotation: endRotation }, ANIMATE_DURING_TIME)
        .easing(TWEEDLE.Easing.Linear.None)
        .onUpdate(() => {
            // agv
@@ -721,7 +722,7 @@
        .to({
            x: codeSprite.position.x,
            y: codeSprite.position.y
        }, 1000)
        }, ANIMATE_DURING_TIME)
        .easing(TWEEDLE.Easing.Linear.None)
        .start();
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
@@ -47,6 +47,8 @@
    @Autowired
    private MainService mainService;
    @Autowired
    private MainLockWrapService mainLockWrapService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private CodeService codeService;
@@ -110,13 +112,13 @@
                if (null == endCode) {
                    return R.error();
                }
                if (!mainService.buildMinorTask(agv, agvDetail, param.getTaskMode(), endCode.getData())) {
                if (!mainLockWrapService.buildMinorTask(agv, agvDetail, param.getTaskMode(), endCode.getData())) {
                    return R.error();
                }
                break;
            case TO_CHARGE:
            case TO_STANDBY:
                if (!mainService.buildMinorTask(agv, agvDetail, param.getTaskMode(), null)) {
                if (!mainLockWrapService.buildMinorTask(agv, agvDetail, param.getTaskMode(), null)) {
                    return R.error();
                }
                break;
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.acs.manager.core.domain.AgvTaskDto;
import com.zy.acs.manager.core.service.MainLockWrapService;
import com.zy.acs.manager.core.service.MainService;
import com.zy.acs.manager.core.service.TrafficService;
import com.zy.acs.manager.manager.entity.Bus;
@@ -44,6 +45,8 @@
    @Autowired
    private MainService mainService;
    @Autowired
    private MainLockWrapService mainLockWrapService;
    @Autowired
    private ActionService actionService;
    @Autowired
    private SegmentService segmentService;
@@ -81,7 +84,7 @@
        }
        for (AgvTaskDto dto : taskDtoList) {
            mainService.buildMajorTask(dto.getAgvId(), dto.getTaskList());
            mainLockWrapService.buildMajorTask(dto.getAgvId(), dto.getTaskList());
        }
        this.lock.unlock();
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -4,6 +4,7 @@
import com.zy.acs.common.enums.AgvStatusType;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.framework.common.DateUtils;
import com.zy.acs.manager.core.service.MainLockWrapService;
import com.zy.acs.manager.core.service.MainService;
import com.zy.acs.manager.manager.entity.*;
import com.zy.acs.manager.manager.enums.*;
@@ -37,6 +38,8 @@
    private FuncStaService funcStaService;
    @Autowired
    private MainService mainService;
    @Autowired
    private MainLockWrapService mainLockWrapService;
    @Autowired
    private TaskService taskService;
    @Autowired
@@ -79,7 +82,7 @@
                    continue;
                }
                mainService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_CHARGE, null);
                mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_CHARGE, null);
            }
        }
    }
@@ -142,7 +145,7 @@
                }
//            }
            mainService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_STANDBY, null);
            mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.TO_STANDBY, null);
        }
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainLockWrapService.java
New file
@@ -0,0 +1,72 @@
package com.zy.acs.manager.core.service;
import com.zy.acs.framework.exception.CoolException;
import com.zy.acs.manager.manager.entity.Agv;
import com.zy.acs.manager.manager.entity.AgvDetail;
import com.zy.acs.manager.manager.entity.Task;
import com.zy.acs.manager.manager.enums.TaskTypeType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
 * Created by vincent on 11/12/2024
 */
@Slf4j
@Service
public class MainLockWrapService {
    private static final int LOCK_TIMEOUT = 5;
    private final ReentrantLock lock = new ReentrantLock(Boolean.TRUE);
    @Autowired
    private MainService mainService;
    public void buildMajorTask(Long agvId, List<Task> taskList) {
        boolean lockAcquired = false;
        try {
            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
                throw new CoolException("failed to generate [major task] action, cause can not acquire lock ...");
            }
            mainService.buildMajorTask(agvId, taskList);
        } catch (Exception e) {
            log.error("MainLockWrapService.buildMajorTask[task]", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        } finally {
            if (lockAcquired) {
                this.lock.unlock();
            }
        }
    }
    public boolean buildMinorTask(Agv agv, AgvDetail agvDetail, TaskTypeType taskType, String destination) {
        boolean lockAcquired = false;
        try {
            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
                throw new CoolException("failed to generate [minor task] actions, cause can not acquire lock ...");
            }
//            log.info("buildMinorTask AGV[{}] lock time: {}", agv.getUuid(), System.currentTimeMillis());
            return mainService.buildMinorTask(agv, agvDetail, taskType, destination);
        } catch (Exception e) {
            log.error("MainLockWrapService.buildMinorTask[task]", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        } finally {
            if (lockAcquired) {
                this.lock.unlock();
            }
//            log.info("buildMinorTask AGV[{}] unlock time: {}", agv.getUuid(), System.currentTimeMillis());
        }
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -21,6 +21,7 @@
import com.zy.acs.framework.common.SnowflakeIdWorker;
import com.zy.acs.framework.exception.CoolException;
import com.zy.acs.manager.common.domain.TaskDto;
import com.zy.acs.manager.common.domain.param.HandlerPublishParam;
import com.zy.acs.manager.common.exception.BusinessException;
import com.zy.acs.manager.common.utils.CommonUtil;
import com.zy.acs.manager.core.domain.AgvBackpackDto;
@@ -35,11 +36,11 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@@ -271,16 +272,12 @@
    /**
     * 解析取放货集合任务,进行最优的排列组合顺序 ( 车辆此时是空闲且静止的 )
     * todo: {@link com.zy.acs.manager.core.HandlerController#controlAgv(String, HandlerPublishParam)}
     */
    @Transactional
    public synchronized void buildMajorTask(Long agvId, List<Task> taskList) {
        if (Cools.isEmpty(taskList)) { return; }
        boolean lockAcquired = false;
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void buildMajorTask(Long agvId, List<Task> taskList) {
        if (Cools.isEmpty(agvId, taskList)) { return; }
        try {
            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
                throw new CoolException("generate [task] action fail, cause can not acquire lock ...");
            }
            // valid -----------------------------------------------
            Agv agv = agvService.getById(agvId);
            if (!agvService.judgeEnable(agv.getId(), true)) {
@@ -516,28 +513,19 @@
        } catch (Exception e) {
            log.error("mainService.mergeMajorTask[task]", e);
            log.error("mainService.buildMajorTask[task]", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        } finally {
        }
    }
            if (lockAcquired) {
                this.lock.unlock();
            }
        }
    }
    /**
     * 充电 回待机位任务
     */
    @Transactional
    public synchronized boolean buildMinorTask(Agv agv, AgvDetail agvDetail, TaskTypeType taskType, String destination) {
    @Transactional(propagation = Propagation.REQUIRES_NEW) // although there is a Transactional here that the lock is isolated, but we can't join the caller's Transactional
    public boolean buildMinorTask(Agv agv, AgvDetail agvDetail, TaskTypeType taskType, String destination) {
        if (Cools.isEmpty(agv, taskType)) { return false; }
        boolean lockAcquired = false;
        try {
            if (!(lockAcquired = this.lock.tryLock(LOCK_TIMEOUT, TimeUnit.SECONDS))) {
                throw new CoolException("generate [task] action fail, cause can not acquire lock ...");
            }
            if (null == agvDetail) {
                agvDetail = agvDetailService.selectByAgvId(agv.getId());
            }
@@ -668,11 +656,6 @@
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        } finally {
            if (lockAcquired) {
                this.lock.unlock();
            }
        }
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/PatrolService.java
@@ -47,8 +47,10 @@
    private AgvDetailService agvDetailService;
    @Autowired
    private TaskService taskService;
//    @Autowired
//    private MainService mainService;
    @Autowired
    private MainService mainService;
    private MainLockWrapService mainLockWrapService;
    @Autowired
    private CodeService codeService;
    @Autowired
@@ -77,7 +79,7 @@
        if (null == randomCode) {
            return;
        }
        if (mainService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, randomCode.getData())) {
        if (mainLockWrapService.buildMinorTask(agv, agvDetail, TaskTypeType.MOVE, randomCode.getData())) {
            log.info(agv.getUuid() + "开始走行演示...");
        }
    }
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -55,6 +55,8 @@
    @Autowired
    private MainService mainService;
    @Autowired
    private MainLockWrapService mainLockWrapService;
    @Autowired
    private MapService mapService;
    @Autowired
    private MapDataDispatcher mapDataDispatcher;
@@ -91,6 +93,7 @@
            if (!Cools.isEmpty(waitingSegList)) {
                for (Segment waitingSeg : waitingSegList) {
                    if (!waitingSeg.getId().equals(segment.getId())) {
                        log.error("AGV[{}] 任务异常,服务器错误!!!", agv.getUuid());
                        return;
                    }
                }
@@ -441,7 +444,7 @@
        } else {
            return mainService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData);
            return mainLockWrapService.buildMinorTask(agv, null, TaskTypeType.MOVE, endCodeData);
        }
        return true;
zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
@@ -27,6 +27,8 @@
@Slf4j
public class AgvSimulatorTask implements Runnable {
    public static final int ACTION_DURING_TIME = 1000;
    private final Agv agv;
    private final AgvDetailService agvDetailService;
    private final ActionService actionService;
@@ -114,7 +116,7 @@
        // 模拟电量消耗
//        agvDetail.setVol(agvDetail.getVol() - 0.1 * distanceToMove); // 根据距离消耗电量
        Thread.sleep(1000);
        Thread.sleep(ACTION_DURING_TIME);
        agvDetailService.updateById(agvDetail);
@@ -138,7 +140,7 @@
        // 模拟电量消耗?
//        agvDetail.setVol(agvDetail.getVol() - 0.05 * (angleToRotate / 15.0)); // 根据角度消耗电量
        Thread.sleep(1000);
        Thread.sleep(ACTION_DURING_TIME);
        agvDetailService.updateById(agvDetail);
        action.setActionSts(ActionStsType.FINISH.val());
        actionService.updateById(action);