whycq
2023-12-08 d52f307dd07cd6c2c33fa2154935402556d5ea7c
Merge remote-tracking branch 'origin/tzskwcs_3' into tzskwcs_3

# Conflicts:
# src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
8个文件已修改
234 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -61,6 +61,8 @@
    List<WrkMast> selectShuttleWrkByLev(String lev);
    List<WrkMast> selectShuttleOutWrkByLev(String lev);
    WrkMast selectLiftWrkMast(Integer liftNo);
    List<WrkMast> selectInOutWrkMast();//查询出入库工作档
src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -20,4 +20,7 @@
    //查询指定楼层已分配车辆的任务
    List<WrkMast> selectShuttleWrkByLev(Integer lev);
    //查询指定楼层已分配车辆的出库任务
    List<WrkMast> selectShuttleOutWrkByLev(Integer lev);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -405,6 +405,7 @@
     */
    @Transactional
    public synchronized void stnToCrnStnPick(){
        try {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
@@ -511,6 +512,9 @@
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
@@ -518,6 +522,7 @@
     */
    @Transactional
    public synchronized void stnToCrnStnPick2(){
        try {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
@@ -614,6 +619,9 @@
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
@@ -621,6 +629,7 @@
     */
    @Transactional
    public synchronized void stnToCrnStnPlate(){
        try {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickInSta()) {
@@ -734,6 +743,9 @@
                }
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
@@ -975,6 +987,7 @@
     * 初始化实时地图
     */
    public synchronized void initRealtimeBasMap() {
        try {
        for (int i = 1; i <= 10; i++) {//总共四层楼
            Object data = redisUtil.get(RedisKeyType.MAP.key + i);
            if (data == null) {//redis地图数据为空,从数据库中获取
@@ -1000,6 +1013,9 @@
                //将数据库地图数据存入redis
                redisUtil.set(RedisKeyType.MAP.key + i, JSON.toJSONString(basMap));
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
@@ -1063,6 +1079,7 @@
     * 入库  ===>>  四向穿梭车入库作业下发
     */
    public synchronized void shuttleInExecute() {
        try {
        List<WrkMast> wrkMasts = wrkMastMapper.selectInStep4();
        for (WrkMast wrkMast : wrkMasts) {
            //获取源站
@@ -1087,6 +1104,9 @@
            if (!step1) {
                continue;
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
@@ -1212,11 +1232,15 @@
     * 出库  ===>>  四向穿梭车出库作业下发
     */
    public synchronized void shuttleOutExecute() {
        try {
        for (WrkMast wrkMast : wrkMastMapper.selectBy2125()) {
            boolean step1 = this.shuttleOutExecuteStep1(wrkMast);//小车搬出库中
            if (!step1) {
                continue;
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
@@ -1280,6 +1304,25 @@
            }
            if (wrkMast.getShuttleNo() == null) {//没有绑定小车,进行调度
                //强制预留一台小车给入库任务
                int lev = Utils.getLev(wrkMast.getSourceLocNo());
                //获取当前楼层有几台可用小车
                int shuttleCount = shuttleDispatchUtils.getShuttleCountByLev(lev);
                if (shuttleCount >= 2) {//只有可用小车数量大于2,才进行入库任务预留小车
                    int shuttleWrkInObligateCount = 1;//预留小车数量
                    Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "shuttleWrkInObligateCount").eq("status", 1));
                    if (config != null) {
                        shuttleWrkInObligateCount = Integer.parseInt(config.getValue());
                    }
                    //可用出库小车数量(给入库任务预留一台车)
                    int useShuttleCount = shuttleCount - shuttleWrkInObligateCount;
                    //查询楼层已分配车辆的出库任务数量
                    List<WrkMast> wrkMasts = wrkMastService.selectShuttleOutWrkByLev(lev);
                    if (wrkMasts.size() >= useShuttleCount) {
                        News.info("{}任务,当前楼层可用小车{}台,出库任务已分配{}台,系统等待中。", wrkMast.getWrkNo(), useShuttleCount, wrkMasts.size());
                        return false;
                    }
                }
                boolean result = shuttleDispatchUtils.dispatchShuttle(wrkMast.getWrkNo(), wrkMast.getSourceLocNo());//调度小车到货物所在库位进行取货
                News.info("{}任务,调度小车{}系统等待中。", wrkMast.getWrkNo(), result ? "成功" : "失败");
                return false;
@@ -1344,6 +1387,7 @@
     * 四向穿梭车任务完成
     */
    public synchronized void shuttleFinished() {
        try {
        for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
            //获取四向穿梭车信息
            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
@@ -1445,12 +1489,16 @@
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 提升机任务
     */
    public synchronized void liftIoExecute() {
        try {
        for (LiftSlave liftSlave : slaveProperties.getLift()) {
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
            if (liftThread == null) {
@@ -1497,6 +1545,9 @@
                }
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
@@ -1756,6 +1807,7 @@
     * 提升机任务完成
     */
    public synchronized void liftFinished() {
        try {
        for (LiftSlave liftSlave : slaveProperties.getLift()) {
            //获取提升机信息
            LiftThread liftThread = (LiftThread) SlaveConnection.get(SlaveType.Lift, liftSlave.getId());
@@ -1836,12 +1888,16 @@
                }
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 库位移转
     */
    public synchronized void locToLocExecute() {
        try {
        //获取出入库工作档
//        List<WrkMast> wrkMasts = wrkMastMapper.selectInOutWrkMast();
//        if (wrkMasts.size() > 0) {
@@ -1876,6 +1932,9 @@
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
@@ -2388,6 +2447,7 @@
     * 空栈板初始化入库,叉车入库站放货
     */
    public void storeEmptyPlt(){
        try {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历空板入库口
            for (DevpSlave.Sta emptyInSta : devp.getEmptyInSta()) {
@@ -2477,12 +2537,16 @@
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * AGV补货 => 生成入库通知档
     */
    public void robotGenerateAgvTask() {
        try {
//检测300站是否自动、有物、工作号
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 获取入库站信息
@@ -2573,12 +2637,16 @@
                }
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * AGV补货 => 机械臂拣料
     */
    public void agvRestockByRobot() {
        try {
        //检测300站是否自动、有物、工作号
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 获取入库站信息
@@ -2628,12 +2696,16 @@
                }
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * AGV补货(通知AGV取货)
     */
    public void agvRestockInto() {
        try {
        //检测309和312站是否自动、有物
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 获取入库站信息
@@ -2672,6 +2744,9 @@
                }
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //通知AGV取货
@@ -2703,6 +2778,7 @@
     * AGV补货(悬挂线通知AGV取货)
     */
    public void agvRestockIntoByHangingWire() {
        try {
        //检测350和351扫码器
        int[] barcodeStaNo = {11, 12};//11 => 350站扫码器,12 => 351站扫码器
        for (int staNo : barcodeStaNo) {
@@ -2731,10 +2807,14 @@
                log.info(barcodeThread.getSlave().getId() + "号扫码器,通知AGV取货,条码号:" + barcode);
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 300站拣料
    public void pick300() {
        try {
        //检测300站是否自动、有物、工作号
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 获取入库站信息
@@ -2775,12 +2855,16 @@
                }
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 出库  ===>> 工作档信息写入led显示器
     */
    public void ledExecute() {
        try {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
@@ -2798,7 +2882,9 @@
                }
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
                    if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) {
                        continue;
                    }
                wrkMasts.add(wrkMast);
                // 组装命令
                LedCommand ledCommand = new LedCommand();
@@ -2829,7 +2915,7 @@
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10 && wrkMast.getIoType() != 107) {
                    if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                    List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getSourceLocNo()));
                    locDetls.forEach(locDetl -> {
                        Wrapper<WrkDetl> wrapper = new EntityWrapper<WrkDetl>().eq("matnr", locDetl.getMatnr()).eq("wrk_no", wrkMast.getWrkNo());
@@ -2851,24 +2937,26 @@
                            if (detl.getSuppCode() != null) {
                                suppCode = detl.getSuppCode();
                            }
                            try {
                                if (isJson(orderNo)) {
                                JSONArray orders = JSON.parseArray(orderNo);
                                for (Object order : orders) {
                                    JSONObject order1 = (JSONObject) order;
                                    ledCommand.getMatDtos().add(new MatDto(detl.getMatnr(), detl.getMaktx(), (Double) order1.get("anfme"), (locDetl.getAnfme() - detl.getAnfme()), detl.getSpecs(), suppCode,(String) order1.get("orderNo")));
                                }
                            } catch (Exception e) {
                                } else {
                                ledCommand.getMatDtos().add(new MatDto(detl.getMatnr(), detl.getMaktx(), detl.getAnfme(), (locDetl.getAnfme() - detl.getAnfme()), detl.getSpecs(), suppCode,detl.getOrderNo()));
                            }
                        }
                    });
                }
                if (wrkMast.getIoType() == 107) {
                        if (locDetls.isEmpty()) {
                    List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    wrkDetls.forEach(wrkDetl -> {
                        ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(), wrkDetl.getAnfme(), wrkDetl.getSpecs(), wrkDetl.getSuppCode()));
                    });
                        }
                }
                commands.add(ledCommand);
@@ -2909,12 +2997,16 @@
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 其他  ===>> LED显示器复位,显示默认信息
     */
    public void ledReset() {
        try {
//        for (LedSlave led : slaveProperties.getLed()) {
//
//            // 获取输送线plc线程
@@ -2971,12 +3063,16 @@
                }
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 四向穿梭车电量检测 ===>> 发起充电
     */
    public synchronized void loopShuttleCharge() {
        try {
        for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
            //获取四向穿梭车线程
            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId());
@@ -3052,12 +3148,16 @@
            News.info("保存{}号四向穿梭车充电任务成功!!!", shuttle.getId());
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 执行四向穿梭车充电任务
     */
    public synchronized void executeShuttleCharge() {
        try {
        for (ShuttleSlave shuttle : slaveProperties.getShuttle()) {
            WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttle.getId());
            if (wrkCharge == null) {
@@ -3076,6 +3176,10 @@
            if (wrkCharge.getWrkSts() == 51) {
                if (!shuttleProtocol.isIdleNoCharge()) {
                    continue;
                    }
                    if (shuttleProtocol.getSuspendState() == 1) {
                        continue;//管制中
                }
                if (!shuttleProtocol.getCurrentLocNo().equals(wrkCharge.getLocNo())) {
@@ -3174,13 +3278,16 @@
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 执行小车移库任务
     */
    public synchronized void shuttleMoveExecute() {
        try {
        //查询小车移库任务
        List<WrkMast> wrkMasts = wrkMastMapper.selectShuttleMoveWrk();
        for (WrkMast wrkMast : wrkMasts) {
@@ -3210,6 +3317,9 @@
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -37,4 +37,9 @@
    public List<WrkMast> selectShuttleWrkByLev(Integer lev) {
        return this.baseMapper.selectShuttleWrkByLev("%" + lev);
    }
    @Override
    public List<WrkMast> selectShuttleOutWrkByLev(Integer lev) {
        return this.baseMapper.selectShuttleOutWrkByLev("%" + lev);
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -454,12 +454,22 @@
        NavigateMapData mapData = new NavigateMapData(z);//获取地图数据
        int[][] data = mapData.getData(-1, null, currentShuttleId == null ? null : Utils.getShuttlePoints(0, z));//载入全部车辆
        int moveBay = 23;//避让起始列
        int bay = Utils.getBay(shuttleProtocol.getCurrentLocNo());//小车当前列
        if (bay > 1 && bay <= 30) {
            moveBay = 23;
        } else if (bay > 30 && bay <= 45) {
            moveBay = 39;
        } else if (bay > 45) {
            moveBay = 50;
        }
        int distY = -1;
        int distX = -1;
        int distZ = -1;
        //获取避让库位
        String distLocNo = null;
        for (int y = 23; y <= 56; y++) {
        for (int y = moveBay; y <= 56; y++) {
            boolean searchFlag = true;
            for (int x = 10; x <= 11; x++) {
                if (data[x][y] < 0 || data[x][y] == 66) {
src/main/java/com/zy/common/utils/ShuttleDispatchUtils.java
@@ -467,4 +467,43 @@
        return true;//无充电任务放行 || 去充电桩中放行
    }
    /**
     * 获取楼层可用小车数量
     */
    public int getShuttleCountByLev(int lev) {
        int count = 0;
        for (ShuttleSlave slave : slaveProperties.getShuttle()) {
            //获取四向穿梭车线程
            NyShuttleThread shuttleThread = (NyShuttleThread) SlaveConnection.get(SlaveType.Shuttle, slave.getId());
            if (shuttleThread == null) {
                continue;
            }
            NyShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol();
            if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
                continue;
            }
            if (checkChargeWrk(slave.getId())) {
                continue;//存在充电任务,过滤小车
            }
            if (shuttleProtocol.getWorkingMode() == 0) {
                continue;//手动状态
            }
            if (shuttleProtocol.getSuspendState() == 1) {
                //小车处于管制中
                continue;
            }
            if (shuttleProtocol.getPoint().getZ() == lev) {
                //同一楼层可用小车
                count++;
                continue;
            }
        }
        return count;
    }
}
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -58,6 +58,26 @@
        add(309);add(312);
    }};
    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
        add(302);add(304);
        add(305);add(306);
        add(307);add(308);
        add(310);add(311);
        add(312);add(313);
        add(314);add(315);
        add(316);add(318);
        add(319);add(320);
        add(321);add(322);
        add(323);add(324);
        add(326);add(327);
        add(328);add(329);
        add(330);add(332);
        add(334);add(335);
        add(336);add(337);
        add(338);add(342);
        add(343);add(344);
    }};
    //高低信号站点
    public static final ArrayList<Integer> locType1StaNos = new ArrayList<Integer>() {{
        add(100);add(103);
@@ -250,6 +270,26 @@
            }
        }
//        Thread.sleep(100);
//        for (Integer staNo : staNos2) {
//            OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB" + staNo + ".0", (short) 48);
//            if (result5.IsSuccess) {
//                StaProtocol staProtocol = station.get(staNo);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(staNo);
//                    station.put(staNo, staProtocol);
//                }
//
//                boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result5.Content, 8, 1);
//                boolean[] status2 = siemensS7Net.getByteTransform().TransBool(result5.Content, 21, 1);
//                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 34));     // 工作号
//                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, 40));   // 目标站
//                staProtocol.setAutoing(status1[0]);  // 自动
//                staProtocol.setLoading(status2[2]);  // 有物
//            }
//        }
        if (result.IsSuccess && result1.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
src/main/resources/mapper/WrkMastMapper.xml
@@ -161,7 +161,14 @@
    <select id="selectShuttleWrkByLev" resultMap="BaseResultMap">
        select * from dbo.asr_wrk_mast
        where shuttle_no is not null
        and ((wrk_sts not in (14,15)  and loc_no like #{lev}) or (wrk_sts not in (34,35) and source_loc_no like #{lev}))
        and ((wrk_sts not in (9,10)  and loc_no like #{lev}) or (wrk_sts not in (29,30) and source_loc_no like #{lev}))
        order by io_pri desc,wrk_sts desc
    </select>
    <select id="selectShuttleOutWrkByLev" resultMap="BaseResultMap">
        select * from dbo.asr_wrk_mast
        where shuttle_no is not null
        and (wrk_sts not in (29,30) and source_loc_no like #{lev})
        order by io_pri desc,wrk_sts desc
    </select>