#1
czkh
2 天以前 9f140c3a0ed4de378046781e185e97562da09d3a
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -24,6 +24,7 @@
import com.zy.common.utils.News;
import com.zy.core.CrnThread;
import com.zy.core.DevpThread;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
@@ -46,6 +47,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -59,7 +61,6 @@
 */
@Slf4j
@Service("mainService")
@Transactional
public class MainServiceImpl {
    public static final long COMMAND_TIMEOUT = 5 * 1000;
@@ -100,6 +101,8 @@
    private BasRgvMapService basRgvMapService;
    @Autowired
    private BasCrnOptService crnOptService;
    @Autowired
    private MainServiceImpl mainService;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -453,9 +456,11 @@
                    WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode);
                    if (wrkMast == null) {
                        // 无拣料数据
                        log.info("无拣料数据,托盘码:{}",barcode);
                        continue;
                    }
                    if ((wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) || Cools.isEmpty(wrkMast.getStaNo()) || Cools.isEmpty(wrkMast.getSourceStaNo())) {
                        log.info("工作档入出库类型不符合,入出库类型:{},工作档目标站{},工作档源站{}",wrkMast.getIoType(),wrkMast.getStaNo(),wrkMast.getSourceStaNo());
                        continue;
                    }
                    // 获取目标站
@@ -481,9 +486,10 @@
                    try {
                        // 保存工作明细档历史档
                        if (wrkMast.getIoType() != 104){
                        if (wrkMastMapper.saveWrkDetlLog(wrkMast.getWrkNo()) == 0) {
                            throw new CoolException("保存工作明细档历史档失败");
                        }
                        }}
                        // 保存工作主档历史档
                        if (wrkMastMapper.saveWrkMastLog(wrkMast.getWrkNo()) == 0) {
                            throw new CoolException("保存工作主档历史档失败");
@@ -736,6 +742,12 @@
                    if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue()) && crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.forkPosType == CrnForkPosType.HOME) {
                        log.info("堆垛机出库完成 - 开始执行");
                        Date date = new Date();
                        long diffInMillis = date.getTime() - wrkMast.getCrnStrTime().getTime();
                        if (!(diffInMillis >= 30000)){
                            continue;
                        }
                        // 命令下发区 --------------------------------------------------------------------------
                        // 下发站点信息
@@ -834,6 +846,9 @@
    public synchronized void crnIoExecute(Integer mark) {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            //获取堆垛机出库站的下一站信息
            SiemensDevpThread devpThread =(SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crn.getId());
            StaProtocol staProtocol = devpThread.getStation().get(1002);
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
@@ -852,7 +867,14 @@
//            }
            // 只有当堆垛机空闲 并且 无任务时才继续执行
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getModeType() == CrnModeType.AUTO && crnProtocol.getForkPos() == 0 && crnProtocol.getTaskNo() == 0 && crnProtocol.getTaskNoTwo() == 0) {
            if (
                    crnProtocol.getStatusType() == CrnStatusType.IDLE
                    && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getForkPos() == 0
                    && crnProtocol.getTaskNo() == 0
                    && crnProtocol.getStatusTypeTwo() == CrnStatusType.IDLE
                    && crnProtocol.getForkPosTwo() == 0
                    && crnProtocol.getTaskNoTwo() == 0) {
                News.warnNoLog("" + mark + " - 0" + " - 开始执行堆垛机入出库作业下发");
                if (crnProtocol.getLoaded() == 0 && crnProtocol.getLoadedTwo() == 0) {
                    //News.error("工位1无物,工位2无物");
@@ -903,7 +925,7 @@
                        if (wrkMast.getIoType() >= 100) {
                            WrkMast wrkMast1 = wrkMastMapper.selectPakOutStep1(crn.getId(), wrkMast.getSourceStaNo());
                            if (wrkMast1 != null) {
                                if (Integer.parseInt(wrkMast1.getSourceLocNo().substring(2,5)) == 1){
                                if (Integer.parseInt(wrkMast1.getSourceLocNo().substring(2,5)) == 1 || (staProtocol.isAutoing()&&staProtocol.isLoading())){
                                    this.outPut(crn, crnProtocol, mark);
                                    continue;
                                }
@@ -932,7 +954,7 @@
                        if (wrkMast.getIoType() >= 100) {
                            WrkMast wrkMast1 = wrkMastMapper.selectPakOutStep1(crn.getId(), wrkMast.getSourceStaNo());
                            if (wrkMast1 != null) {
                                if (Integer.parseInt(wrkMast1.getSourceLocNo().substring(2,5)) == 29){
                                if (Integer.parseInt(wrkMast1.getSourceLocNo().substring(2,5)) == 29 || (staProtocol.isAutoing()&&staProtocol.isLoading())){
                                    this.outPut(crn, crnProtocol, mark);
                                    continue;
                                }
@@ -969,16 +991,17 @@
     * @return
     */
    private Integer getCrnStation(String locNo) {
        String bay = locNo.substring(2, 5);
        String bay = locNo.substring(2, 5);//0100203
        if (Integer.parseInt(bay) == 1) {
            return 1;
        } else if (Integer.parseInt(bay) == 29) {
            return 2;
        }
        if (Integer.parseInt(locNo.substring(0, 2)) >= 14) {
            return 1;
        } else {
//        if (Integer.parseInt(locNo.substring(0, 2)) >= 14) {
        if (Integer.parseInt(bay) >= 14) {
            return 2;
        } else {
            return 1;
        }
    }
@@ -1194,9 +1217,20 @@
                    News.error("" + mark + " - 2" + " - 2" + " - 出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), sourceSta.getLocSts());
                    continue;
                }
                //获取浅库位信息
                if (Utils.isDeepLoc(slaveProperties, wrkMast.getSourceLocNo())) {
                    String shallowLoc1 = Utils.getShallowLoc(slaveProperties, wrkMast.getSourceLocNo());
                    LocMast locMast = locMastService.selectById(shallowLoc1);
                    if (shallowLoc1 != null && (locMast.getLocSts().equals("P") || locMast.getLocSts().equals("Q") || locMast.getLocSts().equals("R") || locMast.getLocSts().equals("S"))) {
                        News.error(wrkMast.getSourceLocNo() + "对应的浅库位为P/Q/R/S,暂时不出深库位");
                        continue;
                    }
                }
                // 获取堆垛机出库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                //堆垛机出库站点的下一站
                StaProtocol staProtocol1 = devpThread.getStation().get(1002);
                if (staProtocol == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol);
                    break;
@@ -1212,7 +1246,7 @@
                    break;
                }
                // 判断堆垛机出库站状态
                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y") && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()&&staProtocol1.isAutoing()&&!staProtocol1.isLoading()) {
                    // 命令下发区 --------------------------------------------------------------------------
                    // 堆垛机控制过滤
@@ -1991,11 +2025,6 @@
            return;
        }
        // 堆垛机控制过滤
        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
            return;
        }
        // 已经存在吊车执行任务时,则过滤
        if (wrkMastMapper.selectWorking(slave.getId()) != null) {
            return;
@@ -2027,7 +2056,20 @@
            }
        }
        if (crnStation == 0) {
            return;
        }else if(crnStation == 1) {
            // 堆垛机控制过滤
            if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                return;
            }
        }else if(crnStation == 2) {
            // 堆垛机控制过滤
            if (!crnProtocol.getStatusTypeTwo().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNoTwo() != 0) {
                return;
            }
        }else {
            }
        News.warnNoLog("" + mark + " - 3" + " - 3" + " - 命令下发 : 工作号={},源排={},源列={},源层={},目标排={},目标列={},目标层={}", wrkMast.getWrkNo().shortValue(), sourceSta.getRow1().shortValue(), sourceSta.getBay1().shortValue(), sourceSta.getLev1().shortValue(), sta.getRow1().shortValue(), sta.getBay1().shortValue(), sta.getLev1().shortValue());
@@ -2078,15 +2120,30 @@
            }
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo());
                if (crnProtocol.getTaskNo() == 9999) {
                    crnThread.setResetFlag(true);
                    continue;
                }
                if ((System.currentTimeMillis() - crnProtocol.getLastCommandTime()) < 1000 * 6) {
                    News.error("" + mark + " - 0" + " - 堆垛机指令等待确认完成过快异常,任务号:" + crnProtocol.getTaskNo());
                    continue;
                }
                News.warnNoLog("" + mark + " - 0" + " - 开始执行对工作档的完成操作,任务号:" + crnProtocol.getTaskNo());
//                if (crnProtocol.getTaskNo() == 9999) {
//                    crnThread.setResetFlag(true);
//                    continue;
//                }
                // 获取入库待确认工作档
                WrkMast wrkMast = wrkMastMapper.selectPakInStep3(crnProtocol.getTaskNo().intValue());
                if (wrkMast == null) {
                    News.error("" + mark + " - 1" + " - 堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                    continue;
                }
                Date date = new Date();
                long diffInMillis = date.getTime() - wrkMast.getCrnStrTime().getTime();
                if (!(diffInMillis >= 30000)){
                    continue;
                }
                // 入库 + 库位转移  ==> 4.入库完成
@@ -2675,7 +2732,7 @@
                if (Utils.isDeepLoc(slaveProperties, row)) {
                    if (shallowLoc.getBay1() == 1) {
                        loc = locMastService.queryFreeLocMast2(row, shallowLoc.getLocType1(), 29);
                    } else if (shallowLoc.getRow1() == 29) {
                    } else if (shallowLoc.getBay1() == 29) {
                        loc = locMastService.queryFreeLocMast2(row, shallowLoc.getLocType1(), 1);
                    } else {
                        loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1());
@@ -2701,7 +2758,7 @@
                    if (Utils.isShallowLoc(slaveProperties, row)) {
                        if (shallowLoc.getBay1() == 1) {
                            loc = locMastService.queryFreeLocMast2(row, shallowLoc.getLocType1(), 29);
                        } else if (shallowLoc.getRow1() == 29) {
                        } else if (shallowLoc.getBay1() == 29) {
                            loc = locMastService.queryFreeLocMast2(row, shallowLoc.getLocType1(), 1);
                        } else {
                            loc = locMastService.queryFreeLocMast(row, shallowLoc.getLocType1());
@@ -2725,79 +2782,85 @@
            if (null == loc) {
                News.error("" + mark + "moveLocForDeepLoc" + " - 1" + " - 双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
                throw new CoolException("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
//                throw new CoolException("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
            }else {
                mainService.createMoveWrkMast(crn, shallowLoc, loc);
            }
            // 获取工作号
            int workNo = commonService.getWorkNo(0);
            // 保存工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(new Date());
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(11); // 入出库状态: 11.库格移载
            wrkMast.setIoPri(13D);
            wrkMast.setCrnNo(crn.getId());
            wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 源库位
            wrkMast.setLocNo(loc.getLocNo()); // 目标库位
            wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 满板
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板
            wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码
            wrkMast.setLinkMis("N");
            wrkMast.setAppeTime(new Date());
            wrkMast.setModiTime(new Date());
            int res = wrkMastMapper.insert(wrkMast);
            if (res == 0) {
                News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 2" + " - 保存工作档失败");
                throw new CoolException("保存工作档失败");
            }
            // 工作档明细保存
            if (shallowLoc.getLocSts().equals("F")) {
                List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo()));
                for (LocDetl locDetl : locDetls) {
                    WrkDetl wrkDetl = new WrkDetl();
                    wrkDetl.setWrkNo(workNo);
                    wrkDetl.setIoTime(new Date());
                    wrkDetl.setAnfme(locDetl.getAnfme());
                    VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制
                    wrkDetl.setAppeTime(new Date());
                    wrkDetl.setModiTime(new Date());
                    if (!wrkDetlService.insert(wrkDetl)) {
                        News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 3" + " - 保存工作档明细失败");
                        throw new CoolException("保存工作档明细失败");
                    }
                }
            }
            // 修改源库位状态
            if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) {
                shallowLoc.setLocSts("R"); // R.出库预约
                shallowLoc.setModiTime(new Date());
                if (!locMastService.updateById(shallowLoc)) {
                    News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 4" + " - 更新源库位状态失败");
                    throw new CoolException("更新源库位状态失败");
                }
            } else {
                News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 5" + " - 源库位出库失败");
                throw new CoolException("源库位出库失败");
            }
            // 修改目标库位状态
            if (loc.getLocSts().equals("O")) {
                loc.setLocSts("S"); // S.入库预约
                loc.setModiTime(new Date());
                if (!locMastService.updateById(loc)) {
                    News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 6" + " - 更新目标库位状态失败");
                    throw new CoolException("更新目标库位状态失败");
                }
            } else {
                News.errorNoLog("" + mark + "moveLocForDeepLoc" + " - 7" + " - 移转失败");
                throw new CoolException("移转失败");
            }
        } catch (Exception e) {
            News.error("" + mark + "moveLocForDeepLoc" + " - 8" + " - 双深库位阻塞,对浅库位进行移转失败", e);
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public void createMoveWrkMast(CrnSlave crn, LocMast shallowLoc, LocMast loc) {
        // 获取工作号
        int workNo = commonService.getWorkNo(0);
        // 保存工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(11); // 入出库状态: 11.库格移载
        wrkMast.setIoPri(13D);
        wrkMast.setCrnNo(crn.getId());
        wrkMast.setSourceLocNo(shallowLoc.getLocNo()); // 源库位
        wrkMast.setLocNo(loc.getLocNo()); // 目标库位
        wrkMast.setFullPlt(shallowLoc.getFullPlt()); // 满板
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk(shallowLoc.getLocSts().equals("D") ? "Y" : "N"); // 空板
        wrkMast.setBarcode(shallowLoc.getBarcode()); // 托盘码
        wrkMast.setLinkMis("N");
        wrkMast.setAppeTime(new Date());
        wrkMast.setModiTime(new Date());
        int res = wrkMastMapper.insert(wrkMast);
        if (res == 0) {
            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 2" + " - 保存工作档失败");
            throw new CoolException("保存工作档失败");
        }
        // 工作档明细保存
        if (shallowLoc.getLocSts().equals("F")) {
            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", shallowLoc.getLocNo()));
            for (LocDetl locDetl : locDetls) {
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setIoTime(new Date());
                wrkDetl.setAnfme(locDetl.getAnfme());
                VersionUtils.setWrkDetl(wrkDetl, locDetl); // 版本控制
                wrkDetl.setAppeTime(new Date());
                wrkDetl.setModiTime(new Date());
                if (!wrkDetlService.insert(wrkDetl)) {
                    News.errorNoLog(""  + "moveLocForDeepLoc" + " - 3" + " - 保存工作档明细失败");
                    throw new CoolException("保存工作档明细失败");
                }
            }
        }
        // 修改源库位状态
        if (shallowLoc.getLocSts().equals("D") || shallowLoc.getLocSts().equals("F")) {
            shallowLoc.setLocSts("R"); // R.出库预约
            shallowLoc.setModiTime(new Date());
            if (!locMastService.updateById(shallowLoc)) {
                News.errorNoLog(""  + "moveLocForDeepLoc" + " - 4" + " - 更新源库位状态失败");
                throw new CoolException("更新源库位状态失败");
            }
        } else {
            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 5" + " - 源库位出库失败");
            throw new CoolException("源库位出库失败");
        }
        // 修改目标库位状态
        if (loc.getLocSts().equals("O")) {
            loc.setLocSts("S"); // S.入库预约
            loc.setModiTime(new Date());
            if (!locMastService.updateById(loc)) {
                News.errorNoLog(""  + "moveLocForDeepLoc" + " - 6" + " - 更新目标库位状态失败");
                throw new CoolException("更新目标库位状态失败");
            }
        } else {
            News.errorNoLog(""  + "moveLocForDeepLoc" + " - 7" + " - 移转失败");
            throw new CoolException("移转失败");
        }
    }