自动化立体仓库 - WCS系统
#
Junjie
2025-03-26 80fd27b5ab9f34f1ed3e7a2c357fb1d36a3ac711
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -74,6 +74,8 @@
    private ForkLiftAction forkLiftAction;
    @Autowired
    private NotifyUtils notifyUtils;
    @Autowired
    private BasShuttleChargeService basShuttleChargeService;
    /**
     * 初始化实时地图
@@ -1082,6 +1084,12 @@
     */
    public synchronized void loopShuttleCharge() {
        try {
            List<BasShuttleCharge> charges = basShuttleChargeService.selectList(new EntityWrapper<BasShuttleCharge>().orderBy("charge_id", true));
            if (charges.isEmpty()) {
                return;//无充电桩
            }
            for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
                //获取四向穿梭车线程
                ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
@@ -1102,17 +1110,21 @@
                //小车所在楼层
                int lev = Utils.getLev(shuttleProtocol.getCurrentLocNo());
                ShuttleChargeType shuttleCharge = null;
                BasShuttleCharge shuttleCharge = null;
                //搜索小车所在楼层有没有充电桩
                for (ShuttleChargeType chargeType : ShuttleChargeType.values()) {
                    if (lev != Utils.getLev(chargeType.locNo)) {
                for (BasShuttleCharge charge : charges) {
                    if (lev != Utils.getLev(charge.getLocNo())) {
                        continue;//小车和充电桩不在同一层
                    }
                    if (charge.getStatus() == 0) {
                        continue;//充电桩被禁用
                    }
                    //小车和充电桩在同一层
                    if (wrkMastService.selectChargeWorkingByChargeSta(chargeType.id) == null) {
                        shuttleCharge = chargeType;
                    if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) {
                        shuttleCharge = charge;
                        break;
                    }
                }
@@ -1120,17 +1132,22 @@
                if (shuttleCharge == null) {
                    //同楼层没有找到充电桩,找可用充电桩
                    //小车同楼层没有充电桩,只要充电桩可用就生成充电任务
                    for (ShuttleChargeType chargeType : ShuttleChargeType.values()) {
                        if (wrkMastService.selectChargeWorkingByChargeSta(chargeType.id) == null) {
                            //判断当前充电桩楼层是否有小车,如有小车,不分配该充电桩
                            int chargeLev = Utils.getLev(chargeType.locNo);//充电桩楼层
                            boolean checkLevHasShuttle = Utils.checkLevHasShuttle(chargeLev);//检测楼层是否有穿梭车
                            if (checkLevHasShuttle) {
                                //当前充电桩楼层有穿梭车,不分配该充电桩
                    for (BasShuttleCharge charge : charges) {
                        if (wrkMastService.selectChargeWorkingByChargeSta(charge.getChargeId()) == null) {
                            //判断当前充电桩是否有小车,如有小车,不分配该充电桩
                            ArrayList<String> locs = new ArrayList<>();
                            locs.add(charge.getLocNo());
                            Integer checkHasShuttle = Utils.checkGroupLocHasShuttle(locs);
                            if(checkHasShuttle != null) {
                                //当前充电桩有穿梭车,不分配该充电桩
                                continue;
                            }
                            shuttleCharge = chargeType;
                            if (charge.getStatus() == 0) {
                                continue;//充电桩被禁用
                            }
                            shuttleCharge = charge;
                            break;
                        }
                    }
@@ -1140,9 +1157,9 @@
                    continue;
                }
                String chargeLocNo = shuttleCharge.locNo;
                String chargeLocNo = shuttleCharge.getLocNo();
                wrkMast = new WrkMast();
                wrkMast.setMk(String.valueOf(shuttleCharge.id));
                wrkMast.setMk(String.valueOf(shuttleCharge.getChargeId()));
                wrkMast.setWrkNo(commonService.getWorkNo(WrkIoType.SHUTTLE_CHARGE.id));
                wrkMast.setWrkSts(WrkStsType.NEW_CHARGE.sts);
                wrkMast.setIoType(WrkIoType.SHUTTLE_CHARGE.id);//300.充电
@@ -1357,13 +1374,13 @@
                return false;
            }
            ShuttleChargeType chargeType = ShuttleChargeType.get(Integer.parseInt(wrkMast.getMk()));
            if(chargeType == null) {
            BasShuttleCharge basShuttleCharge = basShuttleChargeService.selectOne(new EntityWrapper<BasShuttleCharge>().eq("charge_id", wrkMast.getMk()));
            if(basShuttleCharge == null) {
                return false;
            }
            //调度小车去待机位
            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), chargeType.waitLocNo, wrkMast.getShuttleNo());
            boolean dispatched = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), basShuttleCharge.getWaitLocNo(), wrkMast.getShuttleNo());
            if (!dispatched) {
                return false;
            }
@@ -1456,11 +1473,19 @@
                return false;//找不到站点
            }
            //判断提升机是否有其他任务(该任务需要换层必须提前独占提升机)
            WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo());
            if (liftWrkMast != null) {
                News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), liftSta.getLiftNo());
                return false;//当前提升机存在未完成任务,等待下一次轮询
            if (wrkMast.getLiftNo() == null) {
                //判断提升机是否有其他任务(该任务需要换层必须提前独占提升机)
                WrkMast liftWrkMast = wrkMastService.selectLiftWrkMast(liftSta.getLiftNo());
                if (liftWrkMast != null) {
                    News.taskInfo(wrkMast.getWrkNo(), "{}任务,{}号提升机,提升机存在未完成任务,禁止派发", wrkMast.getWrkNo(), liftSta.getLiftNo());
                    return false;//当前提升机存在未完成任务,等待下一次轮询
                }
                wrkMast.setModiTime(now);
                wrkMast.setLiftNo(liftSta.getLiftNo());//提前锁定提升机
                wrkMast.setSystemMsg("");//清空消息
                wrkMastService.updateById(wrkMast);
                return false;
            }
            //*************尝试锁定目标站路径***************
@@ -1501,9 +1526,7 @@
            wrkMast.setWrkSts(WrkStsType.MOVE_SITE.sts);//小车移动到提升机中  301.生成小车移库任务 ==> 302.小车移动至站点
            wrkMast.setModiTime(now);
            wrkMast.setLiftNo(liftSta.getLiftNo());//提前锁定提升机
            wrkMast.setSystemMsg("");//清空消息
//            shuttleProtocol.setToken(wrkMast.getWrkNo());//独占该小车令牌
            if (wrkMastService.updateById(wrkMast)) {
                //下发任务
                shuttleAction.assignWork(shuttleProtocol.getShuttleNo(), assignCommand);
@@ -1687,6 +1710,10 @@
            List<ShuttleCommand> commands = null;
            //跨楼层移动任务
            if (Utils.getLev(wrkMast.getSourceLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
                if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) != Utils.getLev(wrkMast.getLocNo())) {
                    return false;//小车未到达目标层
                }
                //需要将前两个节点作为白名单节点传入
                List<NavigateNode> targetNodes = ForkLiftUtils.getLiftStaNodes(wrkMast.getStaNo());
                if (targetNodes == null) {