*
L
3 天以前 b050b0ef27649165992c264f63042d339d86a4f3
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -703,12 +703,16 @@
                        } else {
                            staProtocol = staProtocol.clone();
                        }
                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                        if (!staProtocol.isAutoing() || !staProtocol.isLoading()) {
                            continue;
                        }
                        TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                        if (taskWrk == null) {
                            log.info("堆垛机出库站到出库站:未查询到状态为13的任务信息,站点号:" + staDesc.getStnNo().toString());
                            continue;
                        }
                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0 || staProtocol.getWorkNo().equals(taskWrk.getWrkNo()))) {
                            // 查询工作档
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnProtocol.getLaneNo(), staDesc.getStnNo().toString());
                            if (taskWrk == null) {
                                continue;
                            }
                            log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk));
//                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false);
                            staProtocol.setWorkNo(taskWrk.getWrkNo());
@@ -724,7 +728,11 @@
                            if (offer) {
                                log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk));
                                Date now = new Date();
                                taskWrk.setStatus(TaskStatusType.OVER3.id);
                                if (taskWrk.getTargetPoint().equals(staProtocol.getSiteId().toString())){
                                    taskWrk.setStatus(TaskStatusType.OVER.id);
                                } else {
                                    taskWrk.setStatus(TaskStatusType.OVER3.id);
                                }
                                taskWrk.setWrkSts(14);
                                taskWrk.setModiTime(now);
                                taskWrk.setCompleteTime(now);
@@ -1761,7 +1769,7 @@
        ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
        if (!allTaskProtocol.isEmpty()) {
            for (TaskProtocol taskProtocol : allTaskProtocol.values()) {
                if (taskProtocol.getTaskNo() != 0) {
                if (taskProtocol.getTaskNo() != 0 && taskProtocol.getTaskNo()!=32222L) {
                    return taskProtocol.getTaskNo().toString();
                }
            }
@@ -2040,6 +2048,16 @@
        }
        return null;
    }
    public TaskWrk deviceDetectionGetWrkNo(RgvSlave.RgvStn inSta) {
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId());
        StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
        if (staProtocol == null || Cools.isEmpty(staProtocol.getWorkNo())) {
            return null;
        }
        TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo());
        return taskWrk;
    }
    public boolean deviceDetection(RgvSlave.RgvStn inSta,Integer rgvNo) {
        ArrayList<Integer> arrayList = new ArrayList<Integer>() {{
            add(1009);
@@ -2103,6 +2121,7 @@
    public synchronized void taskStart() {
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            try {
                Thread.sleep(101);
                if (rgvDetection(rgvSlave)) {
                    String taskNoNow = rgvOtherTaskWrk(rgvSlave);
                    List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("PLC_POSITION", true));
@@ -2118,10 +2137,12 @@
                    }
                    List<TaskWrk> taskWrkList = new ArrayList<>();
                    List<Integer> staList = new ArrayList<>();
                    List<String> taskNoList = taskStartRepel();
                    for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()) {
                        TaskWrk taskWrk = deviceDetection(inSta);
                        if (taskWrk != null) {
                            if (taskWrk.getWrkNo().toString().equals(taskNoNow)) continue;
                            if (!taskNoList.contains(taskWrk.getWrkNo().toString())) continue;
                            taskWrkList.add(taskWrk);
                            staList.add(inSta.getStaNo());
                        }
@@ -2153,9 +2174,10 @@
                            if (rgvOtherIDLEOther(rgvSlave)){
                                if (!rgvOtherIDLE(rgvSlave,staList.get(0))){
                                    System.out.println("空闲就近跳过==="+rgvSlave.getId()+"===");
                                    RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"空闲就近跳过");
                                    sign=true;
                                    if (itSmall){
                                        RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"空闲就近跳过");
                                        sign=true;
                                    }
                                }
                            }
                            if (sign){
@@ -2234,9 +2256,10 @@
                            if (rgvOtherIDLEOther2(rgvSlave)){
                                if (!rgvOtherIDLE2(rgvSlave,staList.get(0))){
                                    System.out.println("运行就近跳过==="+rgvSlave.getId()+"===");
                                    RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"运行就近跳过");
                                    sign=true;
                                    if (itSmall){
                                        RgvErrCache.updateRgvErr(rgvSlave.getId(),staList.get(0)+"运行就近跳过");
                                        sign=true;
                                    }
                                }
                            }
                            if (sign){
@@ -2437,6 +2460,145 @@
                }
            }
        }
    }
    public List<String> taskStartRepel() {
        ArrayList<String> arrayListOld = new ArrayList<>();
        ArrayList<String> arrayListNew = new ArrayList<>();
        ArrayList<Integer> arrayListAllP = new ArrayList<>();
        ArrayList<Long[]> arrayListAll = new ArrayList<>();
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            try{
                boolean itSmall = new TrackRangeUtils().IsItSmall(rgvSlave);
                String taskNoNow = rgvOtherTaskWrk(rgvSlave);
                if (taskNoNow.equals("无")){
                    continue;
                }
                if (!arrayListOld.contains(taskNoNow)){
                    arrayListOld.add(taskNoNow);
                }
                TaskWrk taskWrk = taskWrkMapper.selectByTaskNo(taskNoNow);
                if (taskWrk != null) {
                    if (!arrayListAllP.contains(taskWrk.getWrkNo())) {
                        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
                        arrayListAllP.add(taskWrk.getWrkNo());
                        long startP = 0;
                        if (!itSmall){
                            startP = System.currentTimeMillis();
                        }
                        long endP = 0;
                        long endP1 = 0;
                        long endP2 = 0;
                        ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
                        for (TaskProtocol taskProtocol : allTaskProtocol.values()){
                            if (taskProtocol.getTaskStatus() == 2){//取
                                endP1 = taskProtocol.getTargetPosition();
                            } else if (taskProtocol.getTaskStatus() == 3){//放
                                endP2 = taskProtocol.getTargetPosition();
                            }
                        }
                        if (endP1 > endP2){
                            if (itSmall){
                                endP = endP1;
                            } else {
                                endP = endP2;
                            }
                        }
                        if (endP == 0){
                            if (itSmall){
                                endP = System.currentTimeMillis();
                            }
                        }
                        Long[] longList = {taskWrk.getWrkNo().longValue(),startP,endP};
                        arrayListAll.add(longList);
                    }
                } else {
                    RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                    TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
                    try {
                        long startP = 0;
                        long endP = 0;
                        ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
                        for (TaskProtocol taskProtocol : allTaskProtocol.values()){
                            if (taskProtocol.getTaskStatus() == 2){//取
                                startP = taskProtocol.getTargetPosition();
                            } else if (taskProtocol.getTaskStatus() == 3){//放
                                endP = taskProtocol.getTargetPosition();
                            }
                        }
                        if (startP == 0 ){
                            if (!itSmall){
                                startP = System.currentTimeMillis();
                            }
                        }
                        if (endP == 0){
                            if (itSmall){
                                endP = System.currentTimeMillis();
                            }
                        }
//                        taskNoNow
                        long parseLong = Long.parseLong(taskNoNow);
                        Long[] longList = {parseLong,startP,endP};
                        arrayListAll.add(longList);
                    } catch (Exception e) {
                        log.error("任务过滤查询小车执行任务异常:"+e.getMessage());
                        return new ArrayList<>();
                    }
                }
            } catch (Exception e) {
            }
        }
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            if (rgvDetection(rgvSlave)) {
                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()) {
                    TaskWrk taskWrk = deviceDetectionGetWrkNo(rgvStn);
                    if (taskWrk != null) {
                        if (!arrayListAllP.contains(taskWrk.getWrkNo())) {
                            arrayListAllP.add(taskWrk.getWrkNo());
                            BasDevpPosition basDevpPositionSta = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStn.getStaNo()));
                            BasDevpPosition basDevpPositionEnd = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", BarcodeUtils.getOutStaNo(taskWrk.getOriginTargetPoint())));
                            Long[] longList = {taskWrk.getWrkNo().longValue(),basDevpPositionSta.getPlcPosition(),basDevpPositionEnd.getPlcPosition()};
                            arrayListAll.add(longList);
                        }
                    }
                }
            }
        }
        List<Long[]> crossingPathsW = TrackUtils.findCrossingPathsW(arrayListAll);
        List<Long> wrkNoList = new ArrayList<>();
        List<Long> signWrk = new ArrayList<>();
        for (Long[] longList : crossingPathsW) {
            if (arrayListOld.contains(longList[0].toString()) || arrayListOld.contains(longList[1].toString())){
                signWrk.add(longList[0]);
                signWrk.add(longList[1]);
                continue;
            }
            if (!wrkNoList.contains(longList[0]) && !signWrk.contains(longList[0])) {
                if (!wrkNoList.contains(longList[1]) && !signWrk.contains(longList[1])) {
                    wrkNoList.add(longList[0]);
                }
            }
            signWrk.add(longList[0]);
            signWrk.add(longList[1]);
        }
        for (Integer str : arrayListAllP) {
            if (!signWrk.contains(str.longValue())) {
                arrayListNew.add(str.toString());
            }
        }
        for (Long wrk : wrkNoList) {
            arrayListNew.add(wrk.toString());
        }
        return arrayListNew;
    }
    //获取起点与终点对象
@@ -2816,21 +2978,53 @@
                // 如果最近一次是入库模式
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLocDemo(crnSlave, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                        boolean crnStnToLocDemo = this.crnStnToLocDemo(crnSlave, crnProtocol);//  入库
                        if (crnStnToLocDemo){
                            crnProtocol.setSignIntOut(true);
                            crnProtocol.setLastIo("O");
                        } else if (!crnProtocol.isSignIntOut()){
                            crnProtocol.setLastIo("O");
                        }
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrnStnDemo(crnSlave, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                        if (!crnProtocol.isSignIntOut()){
                            crnProtocol.setLastIo("I");
                        } else {
                            boolean locToCrnStnDemo = this.locToCrnStnDemo(crnSlave, crnProtocol);//  出库
                            if (locToCrnStnDemo && crnProtocol.isSignIntOut()){
                                crnProtocol.setLastIo("I");
                            } else if (locToCrnStnDemo){
                                crnProtocol.setLastIo("I");
                                crnProtocol.setSignIntOut(true);
                            } else if (!crnProtocol.isSignIntOut()){
                                crnProtocol.setLastIo("I");
                            }
                        }
                    }
                }
                // 如果最近一次是出库模式
                else if (crnProtocol.getLastIo().equals("O")) {
                    if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrnStnDemo(crnSlave, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                        if (!crnProtocol.isSignIntOut()) {
                            crnProtocol.setLastIo("I");
                        } else {
                            boolean locToCrnStnDemo = this.locToCrnStnDemo(crnSlave, crnProtocol);//  出库
                            if (locToCrnStnDemo && crnProtocol.isSignIntOut()){
                                crnProtocol.setLastIo("I");
                            } else if (locToCrnStnDemo){
                                crnProtocol.setLastIo("I");
                                crnProtocol.setSignIntOut(true);
                            } else if (!crnProtocol.isSignIntOut()){
                                crnProtocol.setLastIo("I");
                            }
                        }
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLocDemo(crnSlave, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                        boolean crnStnToLocDemo = this.crnStnToLocDemo(crnSlave, crnProtocol);//  入库
                        if (crnStnToLocDemo){
                            crnProtocol.setSignIntOut(true);
                            crnProtocol.setLastIo("O");
                        } else if (!crnProtocol.isSignIntOut()){
                            crnProtocol.setLastIo("O");
                        }
                    }
                }
            }  else {
@@ -2852,7 +3046,8 @@
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public void crnStnToLocDemo(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
    public boolean crnStnToLocDemo(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
        boolean result = false;
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
@@ -2884,11 +3079,11 @@
                // 获取工作状态为2(设备上走)的入库工作档
                TaskWrk taskWrk = null;
                for (String locNo : crnProtocol.getLocMastDemoList()) {
                    TaskWrk taskWrk1 = taskWrkService.selectByTaskNo(locNo);
                    TaskWrk taskWrk1 = taskWrkService.selectByTaskNo(locNo+"r");
                    if (Cools.isEmpty(taskWrk1)){
                        continue;
                    }
                    if (taskWrk1.getIoType() == 3 && taskWrk1.getWrkSts()<3){
                    if (taskWrk1.getIoType() == 1 && taskWrk1.getWrkSts()<3){
                        taskWrk = taskWrk1;
                        break;
                    }
@@ -2944,6 +3139,7 @@
                    throw new CoolException("堆垛机命令生成失败");
                } else {
                    result = true;
                    try {
                        devpThread.setErrorDev(staProtocol.getSiteId(), "-");
                        CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "-");
@@ -2956,16 +3152,18 @@
                }
            }
        }
        return result;
    }
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public void locToCrnStnDemo(CrnSlave slave, CrnProtocol crnProtocol) {
    public boolean locToCrnStnDemo(CrnSlave slave, CrnProtocol crnProtocol) {
        boolean result = false;
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(crnProtocol.getLaneNo(), null);
        if (taskWrksInitial.size() == 0) {
            return;
            return result;
        }
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("CRN_NO", crnProtocol.getLaneNo()).eq("CRN_STN", crnStn.getStaNo()));
@@ -2998,7 +3196,7 @@
                    }
                    // 判断堆垛机出库站状态
                    if (staProtocol.isAutoing() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) {
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")) {
                        // 堆垛机控制过滤
                        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE)) {
                            devpThread.setErrorDev(staProtocol.getSiteId(), "堆垛机非空闲");
@@ -3038,6 +3236,7 @@
                            CrnErrCache.updateCrnErr(crnProtocol.getCrnNo(), "运行命令下发失败");
                            throw new CoolException("堆垛机命令生成失败");
                        } else {
                            result = true;
                            try {
                                // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                                Date now = new Date();
@@ -3051,39 +3250,11 @@
                                if (taskWrkMapper.updateById(taskWrk) == 0) {
                                    log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                                }
                            } catch (Exception e) {
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e);
                            }
                            try {
                                HashMap<String, Object> headParam = new HashMap<>();
                                headParam.put("taskNo",taskWrk.getTaskNo());
                                headParam.put("taskStatus",taskWrk.getStatusWms());
                                headParam.put("ioType",taskWrk.getIoTypeWms());
                                headParam.put("barCode",taskWrk.getBarcode());
                                headParam.put("reportTime", LocalDateTime.now());
                                headParam.put("weight",taskWrk.getScWeight().doubleValue());
                                String response;
                                response = new HttpHandler.Builder()
                                        // .setHeaders(headParam)
                                        .setUri(wmsUrl)
                                        .setPath(taskStatusFeedbackPath)
                                        .setJson(JSON.toJSONString(headParam))
                                        .build()
                                        .doPost();
                                JSONObject jsonObject = JSON.parseObject(response);
                                apiLogService.save("wcs派发出库任务上报wms"
                                        , wmsUrl + taskStatusFeedbackPath
                                        , null
                                        , "127.0.0.1"
                                        , JSON.toJSONString(headParam)
                                        , response
                                        , true
                                );
                            } catch (Exception e) {
                                log.error("wcs派发出库任务上报wms失败", JSON.toJSONString(taskWrk));
//                                throw new CoolException("wcs派发入库任务上报wms失败");
                            }
                        }
                    } else {
@@ -3108,6 +3279,7 @@
                }
            }
        }
        return result;
    }
    /**
@@ -3307,30 +3479,59 @@
                    if (Cools.isEmpty(basCrnp.getHpMk()) || !basCrnp.getHpMk().equals("Y")){
                        continue;
                    }
                    for (String locNo : crnProtocol.getLocMastDemoList()){
                        LocMast locMast = locMastService.selectByLocNo(locNo);
                        if (locMast.getLocSts().equals("F")){
                            CarryParam carryParam = new CarryParam();
                            carryParam.setTaskNo(locNo);
                            carryParam.setBarcode(locNo);
                            carryParam.setIoType(1);//任务类型=》1:出库、2:移库、3:入库   ====转换为====>  1:入库,2:出库,3:移库
                            carryParam.setTaskPriority(1);
                            carryParam.setTargetPoint("1012");
                            carryParam.setStartPoint(BarcodeUtils.formatCode(locNo));
                            carryParam.setMeno("Demo");
                            taskWrkController.addTaskPoint(carryParam);
                            Thread.sleep(50);
                        } else if (locMast.getLocSts().equals("O")){
                            CarryParam carryParam = new CarryParam();
                            carryParam.setTaskNo(locNo);
                            carryParam.setBarcode(locNo);
                            carryParam.setIoType(3);//任务类型=》1:出库、2:移库、3:入库   ====转换为====>  1:入库,2:出库,3:移库
                            carryParam.setTaskPriority(1);
                            carryParam.setStartPoint("1012");
                            carryParam.setTargetPoint(BarcodeUtils.formatCode(locNo));
                            carryParam.setMeno("Demo");
                            taskWrkController.addTaskPoint(carryParam);
                            Thread.sleep(50);
                    boolean signIn = false;
                    for (String[] locS : crnProtocol.getLocMastDemoListSign()){
                        if (locS[3].equals(String.valueOf(crnProtocol.getLocMastDemoListSign().size()))){
                            String locNo1 = locS[0];
                            String locNo2 = locS[2];
                            ArrayList<String> locNoList = new ArrayList<>();
                            locNoList.add(locNo1);
                            locNoList.add(locNo2);
                            for (String locNo : locNoList) {
                                TaskWrk taskWrk1 = taskWrkService.selectByTaskNo(locNo+"r");
                                if (Cools.isEmpty(taskWrk1)){
                                    continue;
                                }
                                signIn = true;
                                break;
                            }
                        }
                    }
                    if (signIn){
                        continue;
                    }
                    for (String[] locS : crnProtocol.getLocMastDemoListSign()){
                        if (locS[3].equals("1")){
                            String locNo1 = locS[0];
                            String locNo2 = locS[2];
                            ArrayList<String> locNoList = new ArrayList<>();
                            locNoList.add(locNo1);
                            locNoList.add(locNo2);
                            for (String locNo : locNoList) {
                                LocMast locMast = locMastService.selectByLocNo(locNo);
                                if (locMast.getLocSts().equals("F")){
                                    CarryParam carryParam = new CarryParam();
                                    carryParam.setTaskNo(locNo);
                                    carryParam.setBarcode(locNo);
                                    carryParam.setIoType(1);//任务类型=》1:出库、2:移库、3:入库   ====转换为====>  1:入库,2:出库,3:移库
                                    carryParam.setTaskPriority(1);
                                    carryParam.setTargetPoint("1012");
                                    carryParam.setStartPoint(BarcodeUtils.formatCode(locNo));
                                    carryParam.setMeno("Demo");
                                    taskWrkController.addTaskPoint(carryParam);
                                } else if (locMast.getLocSts().equals("O")){
                                    CarryParam carryParam = new CarryParam();
                                    carryParam.setTaskNo(locNo+"r");
                                    carryParam.setBarcode(locNo);
                                    carryParam.setIoType(3);//任务类型=》1:出库、2:移库、3:入库   ====转换为====>  1:入库,2:出库,3:移库
                                    carryParam.setTaskPriority(1);
                                    carryParam.setStartPoint("1012");
                                    carryParam.setTargetPoint(BarcodeUtils.formatCode(locNo));
                                    carryParam.setMeno("Demo");
                                    taskWrkController.addTaskPoint(carryParam);
                                    LocFCSUtils.updateLocSInPlace(crnProtocol.getLocMastDemoListSign());
                                }
                            }
                        }
                    }