自动化立体仓库 - WCS系统
野心家
2024-08-26 3b37c4f47d9ad74a8fa0f21bdb366b3633014f76
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -46,6 +46,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import springfox.documentation.spring.web.json.Json;
import java.util.ArrayList;
import java.util.Date;
@@ -117,7 +118,7 @@
                String barcode = barcodeThread.getBarcode();
//                barcode="ILY0127 0001";
                if(!Cools.isEmpty(barcode)) {
                    News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                    log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                    if("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                        continue;
                    }
@@ -286,6 +287,7 @@
//                        }
                    } catch (Exception e) {
                        News.error("扫码入库报错,错误信息",e);
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
@@ -856,62 +858,12 @@
                    continue;
                }
                // 判断堆垛机出库站状态
                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y")
                        && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                    //测试库位出库必须要按启动按钮才能出库
                    if((wrkMast.getStaNo()==206 || wrkMast.getStaNo()==1000)&& locMast.getCtnKind()==0){
                        News.error("出库 ===>> 等待启动出库按钮",wrkMast);
                        continue;
                    }
                    // 命令下发区 --------------------------------------------------------------------------
                //消防报警出库
                if(wrkMast.getStaNo()==1000&& locMast.getCtnKind()==1){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                    if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) {
                        String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo());
                        LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                        // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                        if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                            if (null == waitWrkMast) {
                                News.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                            } else {
                                if(waitWrkMast.getWrkSts() == 11) {
                                    waitWrkMast.setIoPri(15D);
                                    waitWrkMast.setModiTime(new Date());
                                    if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                        News.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                                    }
                                    continue;
                                } else {
                                }
                            }
                        } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                            // 此标记避免多次执行移库任务
                            if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())
                                || Cools.isEmpty(waitWrkMast)) {
                                wrkMast.setUpdMk("Y");
                                wrkMastMapper.updateById(wrkMast);
                                // 生成工作档,将浅库位移转到新的库位中
                                moveLocForDeepLoc(slave, shallowLoc);
                            }
                            News.error("{}任务出库失败,浅库位堵塞!", wrkMast.getWrkNo());
                            continue;
                        } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")){
                            WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                            if (null != waitWrkMast && waitWrkMast.getWrkSts()==4) {
                                continue;
                            }
                        }
                    }
                    // 已经存在吊车执行任务时,则过滤
@@ -919,7 +871,6 @@
                        break;
//                        return;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
@@ -946,6 +897,98 @@
                            News.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                        break;
                    }
                }else {
                    // 判断堆垛机出库站状态
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y")
                            && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                        //测试库位出库必须要按启动按钮才能出库
                        if((wrkMast.getStaNo()==206 || wrkMast.getStaNo()==1000)&& locMast.getCtnKind()==0){
                            News.error("出库 ===>> 等待启动出库按钮",wrkMast);
                            continue;
                        }
                        // 命令下发区 --------------------------------------------------------------------------
                        // 堆垛机控制过滤
                        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                            break;
                        }
                        // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                        if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) {
                            String shallowLocNo = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo());
                            LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                            // O.空库位、Q.拣料/盘点/并板再入库、S.入库预约、X.禁用 直接搬!
                            if (shallowLoc.getLocSts().equals("P") || shallowLoc.getLocSts().equals("R")) {
                                WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                                if (null == waitWrkMast) {
                                    News.error("{}库位异常,未检索到相应工作档!", shallowLocNo);
                                } else {
                                    if(waitWrkMast.getWrkSts() == 11) {
                                        waitWrkMast.setIoPri(15D);
                                        waitWrkMast.setModiTime(new Date());
                                        if (wrkMastMapper.updateById(waitWrkMast) == 0) {
                                            News.error("调整工作档优先级失败!工作号={}", waitWrkMast.getWrkNo());
                                        }
                                        continue;
                                    } else {
                                    }
                                }
                            } else if (shallowLoc.getLocSts().equals("F") || shallowLoc.getLocSts().equals("D")) {
                                WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                                // 此标记避免多次执行移库任务
                                if (Cools.isEmpty(wrkMast.getUpdMk()) || "N".equals(wrkMast.getUpdMk())
                                        || Cools.isEmpty(waitWrkMast)) {
                                    wrkMast.setUpdMk("Y");
                                    wrkMastMapper.updateById(wrkMast);
                                    // 生成工作档,将浅库位移转到新的库位中
                                    moveLocForDeepLoc(slave, shallowLoc);
                                }
                                News.error("{}任务出库失败,浅库位堵塞!", wrkMast.getWrkNo());
                                continue;
                            } else if (shallowLoc.getLocSts().equals("Q") || shallowLoc.getLocSts().equals("S")){
                                WrkMast waitWrkMast = wrkMastMapper.selectByLocNo(shallowLocNo);
                                if (null != waitWrkMast && waitWrkMast.getWrkSts()==4) {
                                    continue;
                                }
                            }
                        }
                        // 已经存在吊车执行任务时,则过滤
                        if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                            break;
//                        return;
                        }
                        // 1.堆垛机开始移动
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                        crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                        crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                        crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                        crnCommand.setSourcePosX(sourceSta.getRow1().shortValue());     // 源库位排
                        crnCommand.setSourcePosY(sourceSta.getBay1().shortValue());     // 源库位列
                        crnCommand.setSourcePosZ(sourceSta.getLev1().shortValue());     // 源库位层
                        crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                        crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                        crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                        crnCommand.setBarcode(wrkMast.getBarcode());
                        if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                            News.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                        } else {
                            // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                            Date now = new Date();
                            wrkMast.setWrkSts(12L);
                            wrkMast.setCrnStrTime(now);
                            wrkMast.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast) == 0) {
                                News.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                            break;
                        }
                    }
                }
            }
@@ -1077,15 +1120,13 @@
        //获取所有移库任务
        List<WrkMast> wrkMasts=wrkMastMapper.selectLocMoves(slave.getId());
        // 获取工作档信息
        WrkMast wrkMast = wrkMastMapper.selectLocMove(slave.getId());
        WrkMast wrkMast =null;
        if(Cools.isEmpty(wrkMasts)){
            return;
        }
        if (null == wrkMast) {
            return;
        }
        //先查测试库位转OK或者NG库位按了按钮的
        for (WrkMast wm: wrkMasts) {
            LocMast sourceSta1 = locMastService.selectById(wm.getSourceLocNo());
            LocMast sourceSta1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",wm.getSourceLocNo()));
            if (!Cools.isEmpty(sourceSta1.getCtnKind())){
                if(sourceSta1.getCtnKind()==1){
                    wrkMast=wm;
@@ -1093,6 +1134,20 @@
                }
            }
        }
        //后查等待库位转测试库位
        if(Cools.isEmpty(wrkMast)){
            for (WrkMast wm: wrkMasts) {
                LocMast sourceSta1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",wm.getSourceLocNo()));
                if (sourceSta1.getLocType1()==3){
                        wrkMast=wm;
                }
            }
        }
        //都没有满足条件的,跳过移库
        if(Cools.isEmpty(wrkMast)){
            return;
        }
        // 获取源库位信息
        LocMast sourceSta = locMastService.selectById(wrkMast.getSourceLocNo());
        if (null == sourceSta) {
@@ -2402,41 +2457,41 @@
                            //testMast.setStatus
                            //"状态 0: 待申请  1: 申请中  2: 已复核 3:测试中 4:完成 5:移库 6:火警"
                            if(devpThread.startSignal[i][0]==8){
                                News.info("2390行程序开始运行,修改测试档状态为 1、申请中,开始修改前:"+testMast);
                                News.info("2390行程序开始运行,修改测试档状态为 1、申请中,开始修改前:"+ JSON.toJSONString(testMast));
                                testMast.setStatus(1);
                                locMast.setPackStatus(1);
                                testMast.setModiTime(new Date());
                                log.info("2394行程序开始运行,修改测试档状态为 1、申请中,修改数据后、未更新"+testMast);
                                log.info("2394行程序开始运行,修改测试档状态为 1、申请中,修改数据后、未更新"+JSON.toJSONString(testMast));
                            }else if(devpThread.startSignal[i][0]==2 && locMast.getPackStatus()!=2){
                                News.info("2396行程序开始运行,修改测试档状态为 3、测试中,开始修改前:"+testMast);
                                News.info("2396行程序开始运行,修改测试档状态为 3、测试中,开始修改前:"+JSON.toJSONString(testMast));
                                testMast.setStatus(3);
                                locMast.setPackStatus(2);
                                testMast.setModiTime(new Date());
                                log.info("2400,修改测试档状态为 3、测试中,修改数据后、未更新"+testMast);
                                log.info("2400,修改测试档状态为 3、测试中,修改数据后、未更新"+JSON.toJSONString(testMast));
                                //NG转OK需要还原源库位和目标库位状态,OK转NG 删除任务档
                                WrkMast wrkMast=wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                                        .eq("source_loc_no",locMast.getLocNo())
                                        .eq("wrk_sts",11));
                                News.info("2405,查询状态为生成出库id的测试完成(NG或OK)任务档,"+wrkMast);
                                News.info("2405,查询状态为生成出库id的测试完成(NG或OK)任务档,"+JSON.toJSONString(wrkMast));
                                if(!Cools.isEmpty(wrkMast)){
                                    if(wrkMast.getWrkSts()==11){
                                        if(wrkMast.getIoType()==11){
                                            log.info("2409,删除任务档为移库的,"+wrkMast);
                                            log.info("2409,删除任务档为移库的,"+JSON.toJSONString(wrkMast));
                                            LocMast locMast1=locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no",wrkMast.getLocNo()));
                                            locMast1.setLocSts("O");
                                            locMastService.update(locMast1,new EntityWrapper<LocMast>().eq("loc_no",wrkMast.getLocNo()));
                                        }
                                        wrkMastMapper.deleteById(wrkMast);
                                        log.info("2415,删除工作档"+wrkMast);
                                        log.info("2415,删除工作档"+JSON.toJSONString(wrkMast)+JSON.toJSONString(locMast));
                                        locMast.setLocSts("F");
                                        log.info("2417,删除工作档"+wrkMast);
                                        log.info("2417,删除工作档"+JSON.toJSONString(wrkMast)+JSON.toJSONString(locMast));
                                        wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no",wrkMast.getWrkNo()));
                                        log.info("2419,删除工作明细"+wrkMast.getWrkNo());
                                        if(!locMastService.update(locMast,new EntityWrapper<LocMast>()
                                                .eq("channel",i+1))){
                                            log.error("2422修改测试库位状态失败"+locMast.getLocNo(),locMast);
                                            log.error("2422修改测试库位状态失败"+locMast.getLocNo()+JSON.toJSONString(locMast));
                                        }else{
                                            log.error("2424"+locMast.getLocNo(),locMast);
                                            log.error("2424修改测试库位状态成功"+locMast.getLocNo()+JSON.toJSONString(locMast));
                                            fig=true;
                                        }
                                    }