野心家
2025-05-09 b1fe5e3f3eed2e4cf20a1ca2871db3f3f6576f2d
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -39,6 +39,7 @@
import com.zy.core.thread.SiemensDevpThread;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -112,95 +113,176 @@
    private CrnController crnController;
    @Autowired
    private SiteController siteController;
    //出库站点至112循环站点
    public synchronized void shiftTargetToCyclePoint() throws IOException, InterruptedException{
        try{
    /**
     * 堆垛机演示  ===>> 库位移转
     */
    public synchronized void crnDemoOfLocMove1() {
        try {
            List <BasCrnp> basCrnps =basCrnpService.selectList(new EntityWrapper<BasCrnp>());
            for (BasCrnp crn : basCrnps) {
                if (!crn.getEmpIn().equals("1")) {
                    continue;
                }   // 必须为演示状态
                CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getCrnNo());
                CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                if (crnProtocol == null) {
                    continue;
                }
                // 只有当堆垛机空闲 并且 无任务时才继续执行
                if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO) {
                    // 获取移库工作档信息
                    WrkMast wrkMast = wrkMastMapper.selectLocMove(crn.getCrnNo());
                    if (null != wrkMast) {
                        continue;
                    }
                    LocMast sourceLoc = locMastService.queryDemoSourceLoc(crn.getCrnNo());
                    LocMast loc = locMastService.queryDemoLoc(crn.getCrnNo(),sourceLoc.getLocType1());
                    if (null == sourceLoc || null == loc) {
                        continue;
                    }
                    String sourceLocNo = sourceLoc.getLocNo();
                    String locNo = loc.getLocNo();
                    // 获取工作号
                    int workNo = commonService.getWorkNo(0);
                    // 保存工作档
                    TaskWrk taskWrk = new TaskWrk();
                    taskWrk.setWrkNo(workNo);
                    taskWrk.setTaskNo(workNo+"");//任务号
                    taskWrk.setWrkSts(11); // 工作状态:11.生成出库ID
                    taskWrk.setIoType(3); // 入出库状态: 3.库格移载
                    taskWrk.setIoPri(13);
                    taskWrk.setCrnNo(crn.getCrnNo());
                    taskWrk.setStartPoint(sourceLocNo);//起点
                    taskWrk.setTargetPoint(locNo);
                    taskWrk.setBarcode(sourceLoc.getBarcode()); // 托盘码
                    taskWrk.setModiTime(new Date());
                    int res = taskWrkMapper.insert(taskWrk);
                    if (res == 0) {
                        throw new CoolException("保存工作档失败");
                    }else {
                        loc.setCtnKind(1);
                        locMastService.updateById(loc);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    @Synchronized
    public void shiftTargetToCyclePoint() throws IOException, InterruptedException {
        try {
            for (DevpSlave devp : slaveProperties.getDevp()) {
                for (DevpSlave.Sta outSta : devp.getOutSta()) {
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(outSta.getStaNo());
                    StaProtocol staProtocol1 = devpThread.getStation().get(1001);
                    StaProtocol staProtocol2 = devpThread.getStation().get(1002);
                    StaProtocol staProtocol3 = devpThread.getStation().get(1003);
                    StaProtocol staProtocol4 = devpThread.getStation().get(1004);
                    if (devpThread == null) {
                        continue;
                    }
                    StaProtocol staProtocol = getClonedStation(devpThread, outSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (staProtocol1 == null) {
                        continue;
                    } else {
                        staProtocol1 = staProtocol1.clone();
                    }
                    if (staProtocol2 == null) {
                        continue;
                    } else {
                        staProtocol2 = staProtocol2.clone();
                    }
                    if (staProtocol3 == null) {
                        continue;
                    } else {
                        staProtocol3 = staProtocol3.clone();
                    }
                    if (staProtocol4 == null) {
                        continue;
                    } else {
                        staProtocol4 = staProtocol4.clone();
                    }
                    boolean result = false;
                    switch(outSta.getStaNo()){
                        case 105: if (staProtocol1.isLoading()){
                            result = true;
                        }
                        case 107: if (staProtocol2.isLoading()){
                            result = true;
                        }
                        case 109: if (staProtocol3.isLoading()){
                            result = true;
                        }
                        case 110: if (staProtocol4.isLoading()){
                            result = true;
                        }
                        default: break;
                    // 获取其他相关站点
                    StaProtocol staProtocol1 = getClonedStation(devpThread, 1001);
                    StaProtocol staProtocol2 = getClonedStation(devpThread, 1002);
                    StaProtocol staProtocol3 = getClonedStation(devpThread, 1003);
                    StaProtocol staProtocol4 = getClonedStation(devpThread, 1004);
                    StaProtocol staProtocol6 = getClonedStation(devpThread, 111);
                    boolean result = false;
                    switch (outSta.getStaNo()) {
                        case 105:
                            result = (staProtocol1 != null && staProtocol1.isLoading() && staProtocol.isLoading() && staProtocol.getStaNo() == 105);
                            break;
                        case 107:
                            result = (staProtocol2 != null && staProtocol2.isLoading());
                            break;
                        case 109:
                            result = (staProtocol3 != null && staProtocol3.isLoading());
                            break;
                        case 110:
                            result = ((staProtocol4 != null && staProtocol4.isLoading() && staProtocol.isLoading() && staProtocol.getStaNo() == 110) ||
                                    (staProtocol6 != null && staProtocol6.isLoading() && staProtocol.isLoading() && staProtocol.getStaNo() == 111));
                            break;
                        default:
                            break;
                    }
                    if(result){
                        staProtocol.setStaNo((short) 112);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    if (result) {
                        if (staProtocol.getSiteId() == 107 || staProtocol.getSiteId() == 109) {
                            StaProtocol staProtocol5 = getClonedStation(devpThread, staProtocol.getSiteId() - 1);
                            if (staProtocol5 != null && (staProtocol5.isLoading() && (staProtocol5.getStaNo() == 107 || staProtocol5.getStaNo() == 109))) {
                                short workNo = staProtocol5.getWorkNo();
                                staProtocol5.setWorkNo(workNo);
                                staProtocol5.setStaNo((short) 112);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol5));
                            }
                        } else {
                            if (staProtocol.isLoading() && (staProtocol.getStaNo() == 105 || staProtocol.getStaNo() == 110 || staProtocol.getStaNo() == 111)) {
                                short workNo = staProtocol.getWorkNo();
                                staProtocol.setWorkNo(workNo);
                                staProtocol.setStaNo((short) 112);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol));
                            }
                        }
                    }
                }
            }
        }catch (Exception e) {
            log.error("generateStoreWrkFile e", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        } catch (Exception e) {
            log.error("shiftTargetToCyclePoint error", e);
        }
    }
    //112循环站点至出库站
    public synchronized void shiftCyclePointToTarget() throws IOException, InterruptedException{
        try{
    /**
     * 获取站点并克隆
     */
    private StaProtocol getClonedStation(DevpThread devpThread, int staNo) {
        StaProtocol staProtocol = devpThread.getStation().get(staNo);
        return (staProtocol != null) ? staProtocol.clone() : null;
    }
    // 112循环站点至出库站
    public synchronized void shiftCyclePointToTarget() throws IOException, InterruptedException {
        try {
            for (DevpSlave devp : slaveProperties.getDevp()) {
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(112);
                if (staProtocol == null) {
                if (devpThread == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
                if(wrkMast != null &&  wrkMast.getWrkNo() < 9000 && wrkMast.getWrkNo() > 7000){
                    staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                StaProtocol staProtocol = devpThread.getStation().get(112);
                if (staProtocol.getStaNo() != 112 || staProtocol.getWorkNo() == 0 || !staProtocol.isLoading() || staProtocol.getWorkNo() > 9000 || staProtocol.getWorkNo() < 6000) {
                    continue;
                }
                // 查询任务信息
                TaskWrk taskWrk = taskWrkMapper.selectStaWorking(Integer.valueOf(staProtocol.getWorkNo()));
                if (taskWrk == null || taskWrk.getWrkNo() < 6001 || taskWrk.getWrkNo() > 9000) {
                    continue;
                }
                short workNo = staProtocol.getWorkNo();
                // 再写入目标站点
                staProtocol.setWorkNo(workNo);
                staProtocol.setStaNo(Short.valueOf(taskWrk.getTargetPoint()));
                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(4, staProtocol));
                Thread.sleep(200);
                log.info("Shifted from cycle station 112 to target {}, workNo: {}", taskWrk.getTargetPoint(), workNo);
            }
        }catch (Exception e) {
            log.error("generateStoreWrkFile e", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        } catch (Exception e) {
            log.error("shiftCyclePointToTarget error", e);
        }
    }
    public synchronized void generateStoreWrkFile1() throws IOException, InterruptedException {
@@ -255,7 +337,7 @@
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && !staProtocol.isEmptyMk() && workNo >= 9790
                            && workNo >= 9990
                            && staProtocol.isPakMk()) {
                        // 获取条码扫描仪信息
                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
@@ -282,6 +364,10 @@
                        }
                        log.info("组托入库={}", storageEscalationParam);
                        storageEscalationParam.setBoxNo(BoxNo);
                        //是否满板 1满板  0空板
                        storageEscalationParam.setStaType(staProtocol.isEmptyMk()? 0:1);
                        //库位类型 1高库位 0低库位
                        storageEscalationParam.setLocType(staProtocol.isHigh()? 1:0);
                        String response = "";
                        Boolean success = false;
                        try {
@@ -292,20 +378,13 @@
                                    .build()
                                    .doPost();
                            JSONObject jsonObject = JSON.parseObject(response);
                            if(back){
                                if(staProtocol.getWorkNo()>=9801&&staProtocol.getWorkNo()<=9825){
                                    staProtocol.setStaNo((short)105);
                                } else if (staProtocol.getWorkNo()>=9826&&staProtocol.getWorkNo()<=9850) {
                                    staProtocol.setStaNo((short)107);
                                }else if (staProtocol.getWorkNo()>=9851&&staProtocol.getWorkNo()<=9875) {
                                    staProtocol.setStaNo((short)109);
                                }else{
                                    staProtocol.setStaNo((short)110);
                                }
                            if (back) {
                                staProtocol.setWorkNo((short) 9991);
                                staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            }else{
                                if (!Cools.isEmpty(response)&&!Cools.isEmpty(jsonObject.get("ReturnStatus"))&&jsonObject.get("ReturnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("Result").toString())) {
                            } else {
                                if (!Cools.isEmpty(response) && !Cools.isEmpty(jsonObject.get("ReturnStatus")) && jsonObject.get("ReturnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("Result").toString())) {
                                    Result result = JSON.parseObject(jsonObject.get("Result").toString(), Result.class);
                                    // 创新一个入库工作档
                                    TaskWrk taskWrk = taskWrkService.selectByTaskNo(result.getTaskNo());
@@ -321,7 +400,7 @@
                                            staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                            HashMap<String, Object> hashMap = new HashMap<>();
                                            hashMap.put("TaskNo",taskWrk.getTaskNo());
                                            hashMap.put("TaskNo", taskWrk.getTaskNo());
                                            try {
                                                //开始上报,任务开始时,WCS回调WMS
                                                response = new HttpHandler.Builder()
@@ -332,7 +411,7 @@
                                                        .doPost();
                                                JSONObject jsonObject1 = JSON.parseObject(response);
                                                Boolean bool = false;
                                                if(jsonObject1.get("ReturnStatus").equals(0)){
                                                if (jsonObject1.get("ReturnStatus").equals(0)) {
                                                    taskWrk.setStatus(2);//派发任务
                                                    bool = true;
                                                    taskWrkService.updateById(taskWrk);
@@ -350,22 +429,14 @@
                                            }
                                        }
                                    } else {
//                                    staProtocol.setWorkNo((short) 9991);
                                        if(staProtocol.getWorkNo()>=9801&&staProtocol.getWorkNo()<=9825){
                                            staProtocol.setStaNo((short)105);
                                        } else if (staProtocol.getWorkNo()>=9826&&staProtocol.getWorkNo()<=9850) {
                                            staProtocol.setStaNo((short)107);
                                        }else if (staProtocol.getWorkNo()>=9851&&staProtocol.getWorkNo()<=9875) {
                                            staProtocol.setStaNo((short)109);
                                        }else{
                                            staProtocol.setStaNo((short)110);
                                        }
                                        staProtocol.setWorkNo((short) 9991);
                                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                } else {
//                                staProtocol.setWorkNo((short) 9991);
                                    staProtocol.setWorkNo((short) 9991);
                                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -855,7 +926,7 @@
                crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位层
                crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位排
                crnCommand.setCommand((short) 1);
                log.info("堆垛机入库任务下发={}",crnCommand);
                log.info("堆垛机入库任务下发={}", crnCommand);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand), false)) {
                    log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                    throw new CoolException("堆垛机命令生成失败");
@@ -875,7 +946,7 @@
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public synchronized void  locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) {
    public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) {
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null);
        if (taskWrksInitial.size() == 0) {
            return;
@@ -895,24 +966,24 @@
                        continue;
                    }
                    LocMast locMast=locMastService.selectByLocNo(taskWrk.getStartPoint());
                    LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
                    //判断其库位是否为深库位,如果为深库位找其浅库位是都有货
                    if(locMast.getRow1()==1||locMast.getRow1()==5){
                        LocMast locMast1=locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("row1", (locMast.getRow1()+1))
                                .eq("bay1",locMast.getBay1())
                                .eq("lev1",locMast.getLev1()).eq("loc_sts","F"));
                        if (!Cools.isEmpty(locMast1)){
                            log.info(locMast.getLocNo()+"出深库位,浅库位有货");
                    if (locMast.getRow1() == 1 || locMast.getRow1() == 5) {
                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("row1", (locMast.getRow1() + 1))
                                .eq("bay1", locMast.getBay1())
                                .eq("lev1", locMast.getLev1()).eq("loc_sts", "F"));
                        if (!Cools.isEmpty(locMast1)) {
                            log.info(locMast.getLocNo() + "出深库位,浅库位有货");
                            continue;
                        }
                    }else if(locMast.getRow1()==4||locMast.getRow1()==8){
                        LocMast locMast1=locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("row1", (locMast.getRow1()-1))
                                .eq("bay1",locMast.getBay1())
                                .eq("lev1",locMast.getLev1()).eq("loc_sts","F"));
                        if (!Cools.isEmpty(locMast1)){
                            log.info(locMast.getLocNo()+"出深库位,浅库位有货");
                    } else if (locMast.getRow1() == 4 || locMast.getRow1() == 8) {
                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("row1", (locMast.getRow1() - 1))
                                .eq("bay1", locMast.getBay1())
                                .eq("lev1", locMast.getLev1()).eq("loc_sts", "F"));
                        if (!Cools.isEmpty(locMast1)) {
                            log.info(locMast.getLocNo() + "出深库位,浅库位有货");
                            continue;
                        }
                    }
@@ -942,9 +1013,9 @@
                        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                            break;
                        }
                        int storeCount = taskWrkService.getStoreCount(taskWrk.getCrnNo());
                        if(storeCount >= maxCount){
                            log.error("{}号堆垛机暂存数已满!", taskWrk.getCrnNo());
                        int storeCount = basDevpService.getStoreCount();
                        if (storeCount >= maxCount) {
                            log.error("输送线暂存数达到上限{}", storeCount);
                            break;
                        }
@@ -1083,7 +1154,7 @@
                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                    }
                    String response = "";
                    Boolean bool=false;
                    Boolean bool = false;
                    HashMap<String, Object> headParam = new HashMap<>();
                    headParam.put("TaskNo", taskWrk.getTaskNo());
                    try {
@@ -1095,7 +1166,7 @@
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if(jsonObject.get("ReturnStatus").equals(0)){
                        if (jsonObject.get("ReturnStatus").equals(0)) {
                            bool = true;
                            taskWrk.setStatus(2);
                            taskWrkMapper.updateById(taskWrk);
@@ -1104,7 +1175,7 @@
                    } catch (Exception e) {
                        log.error("wcs派发移库库任务上报wms失败", taskWrk);
//                        throw new CoolException("wcs派发移库库任务上报wms失败");
                    }finally {
                    } finally {
                        apiLogService.save("wcs派发移库任务上报wms"
                                , wmsUrl + taskStatusFeedbackPath
                                , null
@@ -1195,7 +1266,7 @@
                crnOperatorParam.setCrnNo(crn.getId());
                R r = crnController.crnTaskComplete(crnOperatorParam);
                Thread.sleep(1000);
                if(!r.get("code").equals(200)){
                if (!r.get("code").equals(200)) {
                    return;
                }
                if (!Cools.isEmpty(taskWrk)) {