pjb
20 小时以前 c4b2cfbdc4b31a6e37a9b51c5f69620bd5e7841f
wcs功能完善
7个文件已修改
218 ■■■■■ 已修改文件
src/main/java/com/zy/common/model/MatDto.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/mapper/WrkMastMapper.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/MainServiceImpl.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java
@@ -41,6 +41,12 @@
    private Double total;
    // 总出库数
    private int outTotal;
    // 已出库数
    private int isOutCount;
    public MatDto() {
    }
    public MatDto(String matnr,String batch,String specs,String manuDate,String model,double weight, double length,double volume) {
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -46,6 +46,9 @@
    // 低
    private boolean low;
    // 出入库模式
    private int inOrOutMode;
    // 锁定标记
    private boolean pakMk = true;
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -111,6 +111,7 @@
            crnProtocol = new CrnProtocol();
        }
        crnProtocol.setMode((short) -1);
        crnProtocol.setCrnNo(slave.getId());
//        crnProtocol.setTaskNo((short)0);
        crnProtocol.setStatus((short)-1);
        crnProtocol.setBay((short)0);
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -5,6 +5,7 @@
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
@@ -18,6 +19,8 @@
import com.zy.core.model.protocol.StaProtocol;
import com.zy.entity.BasDevp;
import com.zy.service.BasDevpService;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import com.zy.utils.News;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -369,6 +372,35 @@
            }
        }
        // 读1号输送线出入库模式
        if (slave.getId() == 1) {
            OperateResultExOne<byte[]> inOrOutBoundModeResult = siemensS7Net.Read("DB101.1480", (short) 2);
            if (inOrOutBoundModeResult.IsSuccess) {
                // 出入库模式
                int inOrOutMode = siemensS7Net.getByteTransform().TransInt16(inOrOutBoundModeResult.Content, 0);
                // 更新出入库模式值
                ConfigService configService = SpringUtils.getBean(ConfigService.class);
                Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "inOrOutBoundMode"));
                if (config != null) {
                    config.setValue(String.valueOf(inOrOutMode));
                    configService.updateById(config);
                }
                StaProtocol staProtocol1016 = station.get(1016);
                StaProtocol staProtocol1043 = station.get(1016);
                StaProtocol staProtocol1019 = station.get(1019);
                if(staProtocol1016 != null) {
                    staProtocol1016.setInOrOutMode(inOrOutMode);
                }
                if(staProtocol1043 != null) {
                    staProtocol1043.setInOrOutMode(inOrOutMode);
                }
                if(staProtocol1019 != null) {
                    staProtocol1019.setInOrOutMode(inOrOutMode);
                }
//                log.info("读取到出入库模式值为:{}",inOrOutMode);
            }
        }
        // 读空桶信息反馈
        if (slave.getId() == 1) {
            OperateResultExOne<byte[]> emptyBucketsResult = siemensS7Net.Read("DB101.1320", (short) (staNosErrList1.size() * 6));
src/main/java/com/zy/mapper/WrkMastMapper.java
@@ -2,9 +2,13 @@
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.entity.WrkMast;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Mapper
@@ -127,4 +131,7 @@
    WrkMast selectBy104();
    int selectCountByKb();
    // 根据出入库类型和工作时间,查询历史表记录数量
    int selectCountHisByIoTypeAndIoTime(@Param("ioType") Integer IoType,@Param("ioType") Date ioTime);
}
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -108,7 +108,7 @@
        crnOutSiteToRgvSite.put(1093, (short) 1091);crnOutSiteToRgvSite.put(1099, (short) 1097);crnOutSiteToRgvSite.put(1107, (short) 1105);
        crnOutSiteToRgvSite2.put(1087, (short) 1089);crnOutSiteToRgvSite2.put(1084, (short) 1086);crnOutSiteToRgvSite2.put(1081, (short) 1083);
        crnOutSiteToRgvSite2.put(1043, (short) 1041);crnOutSiteToRgvSite2.put(1016, (short) 1018);
        crnOutSiteToRgvSite2.put(1043, (short) 1041);crnOutSiteToRgvSite2.put(1016, (short) 1018);crnOutSiteToRgvSite2.put(1008, (short) 1006);
    }
    @Autowired
@@ -696,7 +696,12 @@
                // 判断1050是否有货
                StaProtocol staProtocol1 = devpThread.getStation().get(1050);
                if(staProtocol1.isAutoing() && staProtocol1.isLoading() && staProtocol1.isInEnable() && staProtocol1.getWorkNo() != 0) {
                    // 分配库位
                    boolean isContinue =getLocNoNew(staProtocol1.getWorkNo(),wrkMast);
                    // 是否不继续往下执行
                    if (isContinue) {
                        continue;
                    }
                } else {
                    continue;
                }
@@ -789,8 +794,8 @@
            if(crnStn.getStaNo() == 1050 && locMast.getRow1() == 10) {
                crnCommand.setDestinationPosX((short) 9);
            }
            if(crnStn.getStaNo() == 1049 && locMast.getRow1() == 11) {
                crnCommand.setDestinationPosX((short) 12);
            if(crnStn.getStaNo() == 1049 && locMast.getRow1() == 10) {
                crnCommand.setDestinationPosX((short) 9);
            }
            crnCommand.setDestinationPosY(locMast.getBay1().shortValue());     // 目标库位列
            crnCommand.setDestinationPosZ(locMast.getLev1().shortValue());     // 目标库位层
@@ -832,6 +837,115 @@
        News.infoNoLog(""+mark+" - 1"+" - 0"+" - 堆垛机入出库作业下发 : 入库执行完毕");
    }
    private boolean getLocNoNew(Integer workNo1050, WrkMast wrkMast1049) {
        if(!wrkMast1049.getLocNo().isEmpty()) {
            return false;
        }
        WrkMast wrkMast1050 = wrkMastMapper.selectPakInStep2(4, workNo1050);
        // 判断1050没有被堆垛机取,并且没有尾拖信号
        if(wrkMast1050 != null && wrkMast1050.getCtnType() != 1) {
            // 判断这两个货是不是一种类型,不是给1050分配库位,给尾拖标识,是则给两个货分配库位
             if(wrkMast1050.getPdcType().equals(wrkMast1049.getPdcType())) {
                 // 取新库位组的第一个库位
                 List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("crn_no", 4).eq("loc_sts", "O"));
                 List<LocMast> collect = locMasts.stream().filter(locMast1 -> locMast1.getRow1() == 9 || locMast1.getRow1() == 11).collect(Collectors.toList());
                 List<LocMast> collect1 = locMasts.stream().filter(locMast1 -> locMast1.getRow1() == 10 || locMast1.getRow1() == 12).collect(Collectors.toList());
                 if (collect.size() <= 0 && collect1.size()  <= 0) {
                     News.error("站点:{},任务号{}:入库空桶库无空库位",1050,workNo1050);
                     return true;
                 }
                 // 可用库位组
                 List<LocMast> locMastList = new ArrayList<>();
                 for(LocMast locMast1:collect) {
                     Optional<LocMast> first = collect1.stream().filter(locMast2 -> locMast1.getRow1() + 1 == locMast2.getRow1() && Objects.equals(locMast1.getLev1(), locMast2.getLev1())
                             && Objects.equals(locMast1.getBay1(), locMast2.getBay1())).findFirst();
                     first.ifPresent(locMastList::add);
                 }
                 if (locMastList.size() == 0) {
                     News.error("站点:{},任务号{}:入库空桶库无对应空空桶组",1050,workNo1050);
                     return true;
                 }
                 WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", workNo1050));
                 if (wrkDetl.getModel().equals("208L") && locMastList.size() <= 40 * 2 * 2) { // 最上面一层只能放208L,库位剩余量不多时,如果是208L桶入库,则先从最顶层放
                     locMastList = locMastList.stream().sorted(Comparator.comparing(LocMast::getLev1).reversed().thenComparing(LocMast::getBay1).thenComparing(LocMast::getRow1)).collect(Collectors.toList());
                 } else {
                     locMastList = locMastList.stream().sorted(Comparator.comparing(LocMast::getLev1).thenComparing(LocMast::getBay1).thenComparing(LocMast::getRow1)).collect(Collectors.toList());
                 }
                 // 1049对应库位
                 LocMast locMast = locMastList.get(0);
                 wrkMast1049.setLocNo(locMast.getLocNo());
                 wrkMastService.updateById(wrkMast1049);
                 if (locMast.getLocSts().equals("O")){
                     locMast.setLocSts("S"); // S.入库预约
                     locMast.setModiTime(new Date());
                     if (!locMastService.updateById(locMast)){
                         News.error("站点:{},任务号{}:改变库位{}状态{}失败",1049,wrkMast1049.getWrkNo(),locMast.getLocNo(),locMast.getLocSts());
                     } else {
                         // 给1050分配对应库位
                         Optional<LocMast> first = collect.stream().filter(locMast1 -> locMast1.getLocNo().equals((locMast.getRow1() == 10 ? "09" : "11") + locMast.getLocNo().substring(2))).findFirst();
                         if(first.isPresent()) {
                             LocMast locMast1 = first.get();
                             wrkMast1050.setLocNo(locMast1.getLocNo());
                             locMast1.setLocSts("S"); // S.入库预约
                             locMast1.setModiTime(new Date());
                             wrkMastService.updateById(wrkMast1050); // 更新分配的库位
                             locMastService.updateById(locMast1); // 更新库位状态
                             return false;
                         } else {
                             News.error("站点:{},任务号{}:空库位组{}无对应空库位",1050,workNo1050,locMast.getLocNo());
                         }
                     }
                 } else {
                     News.error("站点:{},任务号{}:目标库位:{}已被占用",1049,wrkMast1049.getWrkNo(),locMast.getLocNo());
                 }
             } else {
                 // 取新库位组的第一个库位
                 List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("crn_no", 4).eq("loc_sts", "O"));
                 List<LocMast> collect = locMasts.stream().filter(locMast1 -> locMast1.getRow1() == 9 || locMast1.getRow1() == 11).collect(Collectors.toList());
                 List<LocMast> collect1 = locMasts.stream().filter(locMast1 -> locMast1.getRow1() == 10 || locMast1.getRow1() == 12).collect(Collectors.toList()); // 第一个先放这两排
                 if (collect.size() <= 0 && collect1.size()  <= 0) {
                     News.error("站点:{},任务号{}:入库空桶库无空库位",1050,workNo1050);
                     return true;
                 }
                // 可用库位组
                List<LocMast> locMastList = new ArrayList<>();
                for(LocMast locMast1:collect) {
                    Optional<LocMast> first = collect1.stream().filter(locMast2 -> locMast1.getRow1() + 1 == locMast2.getRow1() && Objects.equals(locMast1.getLev1(), locMast2.getLev1())
                            && Objects.equals(locMast1.getBay1(), locMast2.getBay1())).findFirst();
                    first.ifPresent(locMastList::add);
                }
                if (locMastList.size() == 0) {
                    News.error("站点:{},任务号{}:入库空桶库无对应空空桶组",1050,workNo1050);
                    return true;
                }
                 WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", workNo1050));
                if (wrkDetl.getModel().equals("208L") && locMastList.size() <= 40 * 2 * 2) { // 最上面一层只能放208L,库位剩余量不多时,如果是208L桶入库,则先从最顶层放
                    locMastList = locMastList.stream().sorted(Comparator.comparing(LocMast::getLev1).reversed().thenComparing(LocMast::getBay1).thenComparing(LocMast::getRow1)).collect(Collectors.toList());
                } else {
                    locMastList = locMastList.stream().sorted(Comparator.comparing(LocMast::getLev1).thenComparing(LocMast::getBay1).thenComparing(LocMast::getRow1)).collect(Collectors.toList());
                }
                 LocMast locMast = locMastList.get(0);
                 wrkMast1050.setLocNo(locMast.getLocNo());
                 wrkMast1050.setCtnType(1); // 尾托标识
                 wrkMastService.updateById(wrkMast1050);
                 if (locMast.getLocSts().equals("O")){
                     locMast.setLocSts("S"); // S.入库预约
                     locMast.setModiTime(new Date());
                     if (!locMastService.updateById(locMast)){
                         News.error("站点:{},任务号{}:改变库位{}状态{}失败",1050,workNo1050,locMast.getLocNo(),locMast.getLocSts());
                     }
                 } else {
                     News.error("站点:{},任务号{}:目标库位:{}已被占用",1050,workNo1050,locMast.getLocNo());
                 }
             }
        }
        return true;
    }
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
@@ -858,6 +972,15 @@
            for (WrkMast wrkMast : wrkMasts) {
                if (wrkMast == null) {
                    continue;
                }
                // 判断任务目标站点是否是出库模式
                if(wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043) {
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                    StaProtocol staProtocol = devpThread.getStation().get(wrkMast.getStaNo());
                    if(staProtocol.getInOrOutMode() != 2) {
                        News.error("{}任务目标站点:{},当前模式:{}不是出库模式,无法出库",wrkMast.getWrkNo(),wrkMast.getStaNo(),staProtocol.getInOrOutMode());
                        continue;
                    }
                }
                if (wrkMast.getStaNo() == 1031) {
                    // 获取1033无状态时任务数+1
@@ -1193,16 +1316,16 @@
                    if(wrkMast.getWorkNoOther() != 0 ){
                        WrkMast wrkMast1 = wrkMastService.selectByWrkNo(wrkMast.getWorkNoOther());
                        if (wrkMast1 != null) {
                            // 交换库位号
//                            // 交换库位号
                            String locNo = wrkMast.getLocNo();
                            wrkMast.setLocNo(wrkMast1.getLocNo());
//                            wrkMast.setLocNo(wrkMast1.getLocNo());
                            // 交换入库时间,提取库存时按顺序先浅后深
                            Date ioTime = wrkMast.getIoTime();
                            if(locNo.startsWith("10")) {
                                wrkMast.setIoTime(wrkMast1.getIoTime());
                                wrkMast1.setIoTime(ioTime);
                            }
                            wrkMast1.setLocNo(locNo);
//                            wrkMast1.setLocNo(locNo);
                            wrkMast1.setCrnEndTime(now);
                            wrkMast1.setModiTime(now);
                            wrkMast1.setWrkSts(4L);
@@ -1648,6 +1771,13 @@
                // 明细
                WrkDetl wrkDetl1 = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                if (wrkDetl1 != null) {
                    // 出库任务的四个出库站点,判断当前物料一批出库的时间 获取当前已完成 / 总数
                    if(wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 1024 ||wrkMast.getStaNo() == 1040 ||wrkMast.getStaNo() == 1043 ||wrkMast.getStaNo() == 1016) ) {
                        int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101).eq("io_time", wrkMast.getIoTime()));
                        int countHis = wrkMastMapper.selectCountHisByIoTypeAndIoTime(101, wrkMast.getIoTime());
                        matDto.setOutTotal(count+countHis);
                        matDto.setIsOutCount(countHis + 1);
                    }
                    ledCommand.setOrderNo(wrkDetl1.getOrderNo());
                    matDto.setMaknx(wrkDetl1.getMaktx());
                    matDto.setMatnr(wrkDetl1.getMatnr());
@@ -1716,6 +1846,14 @@
                if (staProtocol.getWorkNo() != 0) {
                    reset = false;
                    break;
                } else {
                    // 入库在无物的时候才清除异常
                    if(staNo == 1006 || staNo == 1012 || staNo == 1018 || staNo == 1041) {
                        if(staProtocol.isLoading()) {
                            reset = false;
                            break;
                        }
                    }
                }
            }
            // 获取led线程
@@ -2079,6 +2217,12 @@
                    wrkMast.setWrkSts(15L);
                    wrkMast.setModiTime(new Date());
                    wrkMastService.updateById(wrkMast);
                    // 1020切换出库模式,如果有托盘入拆盘机,不给输送线下发命令
                    if(wrkMast.getStaNo() == 1020) {
                        if(staProtocol.getInOrOutMode() != 1) {
                            continue;
                        }
                    }
                } else if(wrkMast.getIoType() == 120) {
                    if(wrkMast.getWrkSts() != 53 ){
                        log.warn("rgv放货完成120,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
@@ -2596,7 +2740,7 @@
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWorkNo() != 0) {
                // 查询工作档
                WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo());
                if (wrkMast != null && wrkMast.getWhsType() == null) {
                if (wrkMast != null && wrkMast.getWhsType() == null && wrkMast.getIoType() != 120) {
                    WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    staProtocol.setBucketType(wrkDetl.getMatnr());
                    staProtocol.setBucketCount(wrkDetl.getAnfme().intValue());
@@ -2671,10 +2815,10 @@
                StaProtocol staProtocolNew = new StaProtocol();
                staProtocolNew.setSiteId(staProtocol.getSiteId());
                staProtocolNew.setWorkNo(wrkMast.getWrkNo());
                staProtocolNew.setStaNo(crnOutSiteToRgvSite2.get(wrkMast.getSourceStaNo()));
                staProtocolNew.setStaNo(crnOutSiteToRgvSite2.get(wrkMast.getSourceStaNo()) != null ? crnOutSiteToRgvSite2.get(wrkMast.getSourceStaNo()) :wrkMast.getSourceStaNo().shortValue());
                devpThread.setPakMk(staProtocol.getSiteId(), false);
                boolean result = MessageQueue.offer(SlaveType.Devp, devpId, new Task(2, staProtocolNew));
                log.info("手动站位转移输送线下发:" + staProtocolNew.getWrkNo() + "," + staProtocolNew.getSiteId());
                log.info("手动站位转移输送线下发:" + staProtocolNew.getWorkNo() + "," + staProtocolNew.getSiteId() + "->" + staProtocolNew.getStaNo());
                if (!result) {
                    News.errorNoLog("" + " - 1" + " - 更新plc站点信息失败");
                    throw new CoolException("更新plc站点信息失败");
src/main/resources/mapper/WrkMastMapper.xml
@@ -237,4 +237,7 @@
    )
)
    </select>
    <select id="selectCountHisByIoTypeAndIoTime" resultType="java.lang.Integer">
         select count (*) from asr_wrk_mast_log where io_type = #{ioType} and io_time = #{ioTime}
    </select>
</mapper>