#
Junjie
4 天以前 691f0d4c4836c75fefa1d3b7fba4a72153751dd4
src/main/java/com/zy/core/dispatcher/ShuttleDispatchUtils.java
@@ -1,8 +1,16 @@
package com.zy.core.dispatcher;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.domain.ShuttleGatherResult;
import com.zy.asrs.domain.param.ShuttleGatherParam;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.DeviceConfig;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.BasShuttleService;
import com.zy.asrs.service.DeviceConfigService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.NavigateNode;
@@ -13,11 +21,11 @@
import com.zy.core.News;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.enums.WrkIoType;
import com.zy.core.enums.WrkStsType;
import com.zy.core.model.ForkLiftSlave;
import com.zy.core.model.ShuttleSlave;
import com.zy.core.model.protocol.*;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.ForkLiftThread;
import com.zy.core.thread.ShuttleThread;
import com.zy.system.entity.Config;
@@ -35,8 +43,6 @@
public class ShuttleDispatchUtils {
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private CommonService commonService;
@@ -44,47 +50,48 @@
    private NavigateUtils navigateUtils;
    @Autowired
    private ConfigService configService;
    @Autowired
    private BasShuttleService basShuttleService;
    @Autowired
    private DeviceConfigService deviceConfigService;
    /**
     * 调度车辆-调度指定穿梭车
     */
    public boolean dispatchShuttle(Integer wrkNo, String locNo, Integer shuttleNo) {
    public synchronized boolean dispatchShuttle(Integer wrkNo, String locNo, Integer shuttleNo) {
        return shuttleMoveGenerate(wrkNo, locNo, shuttleNo);
    }
    /**
     * 调度车辆
     */
    public boolean dispatchShuttle(Integer wrkNo, String locNo) {
        //检测目标库位组是否存在小车,如存在小车则直接指定该车
        WrkMast wrkMast = wrkMastService.selectByWorkNo(wrkNo);
        if (wrkMast != null) {
            String targetLocNo = wrkMast.getIoType() < 100 ? wrkMast.getLocNo() : wrkMast.getSourceLocNo();
            List<String> groupLoc = Utils.getGroupLoc(targetLocNo);
            Integer groupShuttleNo = Utils.checkGroupLocHasShuttle(groupLoc);
            if (groupShuttleNo != null) {
                //存在小车,直接调度该车
                return shuttleMoveGenerate(wrkNo, locNo, groupShuttleNo);
            }
        }
    public synchronized boolean dispatchShuttle(Integer wrkNo, String locNo) {
        ArrayList<ShuttleThread> sameLev = new ArrayList<>();//相同楼层的穿梭车
        ArrayList<ShuttleThread> diffLev = new ArrayList<>();//不同楼层的穿梭车
        for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        for (DeviceConfig device : shuttleList) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
                continue;
            }
            if (checkChargeWrk(shuttle.getId())) {
            if (checkChargeWrk(device.getDeviceNo())) {
                continue;//存在充电任务,过滤小车
            }
            if (!shuttleThread.isIdle()) {
                continue;//小车忙碌中
            }
            BasShuttle basShuttle = basShuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", device.getDeviceNo()));
            if (basShuttle != null) {
                if (basShuttle.getStatus() == 0) {
                    continue;//小车被禁用
                }
            }
            int currentLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//小车当前层高
@@ -164,7 +171,8 @@
                    //当前穿梭车库位号
                    String currentLocNo = shuttleProtocol.getCurrentLocNo();
                    int currentLev = Utils.getLev(currentLocNo);
                    List<WrkMast> wrkMasts1 = wrkMastService.selectNoShuttleWrkByLev(currentLev);//判断当前穿梭车楼层是否有待分配车辆的任务,如果有则不分配这辆车
                    //判断当前楼层是否有任务,如果有则不分配这辆车
                    List<WrkMast> wrkMasts1 = wrkMastService.selectWrkByLev(currentLev);
                    int shuttleCount = this.getShuttleCountByLev(currentLev);//获取穿梭车楼层车辆数量
                    if (!wrkMasts1.isEmpty() && shuttleCount <= 1) {
                        //存在其他任务且可用小车数量小于等于1,跳过这辆车
@@ -198,7 +206,7 @@
     * 小车迁移任务生成
     */
    @Transactional
    public boolean shuttleMoveGenerate(Integer wrkNo, String locNo, Integer shuttleNo) {
    public synchronized boolean shuttleMoveGenerate(Integer wrkNo, String locNo, Integer shuttleNo) {
        Date now = new Date();
        //获取四向穿梭车线程
        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleNo);
@@ -225,11 +233,21 @@
            return false;
        }
        //获取主工作档信息
        WrkMast mainWrkMast = wrkMastService.selectByWorkNo(wrkNo);
        //判断是否有其他任务正在使用穿梭车
        WrkMast wrkMast2 = wrkMastService.selectShuttleWorking(shuttleNo);
        if (wrkMast2 != null) {//小车存在其他工作档任务,等待执行完成后再生成新的任务
            News.info("{}号小车,存在其他工作档任务,等待执行完成再生成新的任务", shuttleNo);
            return false;
            if (mainWrkMast == null) {
                News.info("{}号小车,存在其他工作档任务,等待执行完成再生成新的任务", shuttleNo);
                return false;
            }else {
                if (!shuttleNo.equals(mainWrkMast.getShuttleNo())) {
                    News.info("{}号小车,存在其他工作档任务,等待执行完成再生成新的任务", shuttleNo);
                    return false;
                }
            }
        }
        Integer sourceStaNo = null;//小车换层源站点
@@ -243,19 +261,25 @@
                return false;//没有可用且空闲的输送站点
            }
            sourceStaNo = liftSta.getStaNo();//源站点
            //提升机号*100+目标楼层=目标站点
            staNo = liftSta.getLiftNo() * 100 + Utils.getLev(locNo);//目标站
            ForkLiftStaProtocol targetLiftSta = ForkLiftUtils.getLiftStaByLev(liftSta.getLiftNo(), Utils.getLev(locNo));
            if (targetLiftSta == null) {
                News.info("{}号小车,{}目标库位,没有目标站点", shuttleNo, locNo);
                return false;//没有找到目标站点
            }
            //目标站点
            staNo = targetLiftSta.getStaNo();//目标站
        }
        // 获取工作号
        int workNo = commonService.getWorkNo(0);
        int workNo = commonService.getWorkNo(WrkIoType.SHUTTLE_MOVE.id);
        // 保存工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(WrkStsType.NEW_MOVE.sts); // 工作状态:301.生成迁移任务
        wrkMast.setIoType(200); // 入出库状态: 200.小车迁移
        wrkMast.setIoPri(20D);
        wrkMast.setIoType(WrkIoType.SHUTTLE_MOVE.id); // 入出库状态: 200.小车迁移
        wrkMast.setIoPri(800D);
        wrkMast.setShuttleNo(shuttleNo);//穿梭车号
        wrkMast.setSourceLocNo(shuttleProtocol.getCurrentLocNo()); // 源库位 => 小车当前库位号
        wrkMast.setLocNo(locNo); // 目标库位
@@ -270,13 +294,42 @@
        }
        //给工作档绑定小车号
        WrkMast wrkMast1 = wrkMastService.selectByWorkNo(wrkNo);
        if (wrkMast1 != null) {
            wrkMast1.setShuttleNo(shuttleNo);
            wrkMastService.updateById(wrkMast1);
        if (mainWrkMast != null) {
            mainWrkMast.setShuttleNo(shuttleNo);
            wrkMastService.updateById(mainWrkMast);
        }
        return true;
    }
    /**
     * 小车集合
     */
    public List<ShuttleGatherResult> shuttleGather(ShuttleGatherParam param) {
        Wrapper<BasShuttle> wrapper = new EntityWrapper<BasShuttle>().eq("status", 1);
        if (param != null) {
            if (!param.getShuttleNos().isEmpty()) {
                wrapper.in("shuttle_no", param.getShuttleNos());
            }
        }
        List<BasShuttle> basShuttles = basShuttleService.selectList(wrapper);
        List<ShuttleGatherResult> list = new ArrayList<>();
        for (BasShuttle basShuttle : basShuttles) {
            String idleLoc = basShuttle.getIdleLoc();
            if(Cools.isEmpty(idleLoc)) {
                continue;
            }
            boolean result = shuttleMoveGenerate(null, idleLoc, basShuttle.getShuttleNo());
            ShuttleGatherResult gatherResult = new ShuttleGatherResult();
            gatherResult.setShuttleNo(basShuttle.getShuttleNo());
            gatherResult.setIdleLoc(idleLoc);
            gatherResult.setResult(result);
            list.add(gatherResult);
        }
        return list;
    }
    /**
@@ -291,12 +344,24 @@
            return false;
        }
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        int levCount = 0;//目标楼层车辆数量
        for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
        for (DeviceConfig device : shuttleList) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
            if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
                continue;
            }
            //小车有充电任务
            if (shuttleThread.isCharging()) {
                continue;
            }
            //小车故障跳过
            if (shuttleThread.isFault()) {
                continue;
            }
@@ -350,11 +415,14 @@
            return null;
        }
        List<DeviceConfig> forkliftList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.ForkLift)));
        //获取小车同一楼层的站点
        ArrayList<ForkLiftStaProtocol> list = new ArrayList<>();
        int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//小车楼层
        for (ForkLiftSlave slave : slaveProperties.getForkLift()) {
            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, slave.getId());
        for (DeviceConfig device : forkliftList) {
            ForkLiftThread forkLiftThread = (ForkLiftThread) SlaveConnection.get(SlaveType.ForkLift, device.getDeviceNo());
            if (forkLiftThread == null) {
                continue;
            }
@@ -366,19 +434,32 @@
                continue;
            }
            ForkLiftStaProtocol forkLiftStaProtocol = ForkLiftUtils.getLiftStaByLev(slave.getId(), lev);
            ForkLiftStaProtocol forkLiftStaProtocol = ForkLiftUtils.getLiftStaByLev(device.getDeviceNo(), lev);
            if (forkLiftStaProtocol == null) {
                continue;
            }
            //判断当前层是否无托盘
            if (forkLiftStaProtocol.getHasTray()) {
                continue;
            }
            if (forkLiftStaProtocol.getHasCar()) {
                continue;
            }
            //判断目标楼层站点是否无托盘
            ForkLiftStaProtocol targetLiftStaProtocol = ForkLiftUtils.getLiftStaByLev(slave.getId(), targetLev);
            ForkLiftStaProtocol targetLiftStaProtocol = ForkLiftUtils.getLiftStaByLev(device.getDeviceNo(), targetLev);
            if (targetLiftStaProtocol == null) {
                continue;
            }
            if (targetLiftStaProtocol.getHasTray()) {
                continue;//有托盘跳过
            }
            if (targetLiftStaProtocol.getHasCar()) {
                continue;
            }
            list.add(forkLiftStaProtocol);
@@ -428,10 +509,12 @@
     * 获取楼层可用小车数量
     */
    public int getShuttleCountByLev(int lev) {
        List<DeviceConfig> shuttleList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                .eq("device_type", String.valueOf(SlaveType.Shuttle)));
        int count = 0;
        for (ShuttleSlave slave : slaveProperties.getShuttle()) {
        for (DeviceConfig device : shuttleList) {
            //获取四向穿梭车线程
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId());
            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getDeviceNo());
            if (shuttleThread == null) {
                continue;
            }
@@ -441,7 +524,7 @@
                continue;
            }
            if (checkChargeWrk(slave.getId())) {
            if (checkChargeWrk(device.getDeviceNo())) {
                continue;//存在充电任务,过滤小车
            }