52ad49fed7108445edc8178a98cf4cca36fe0eb0..917a8fae43c303f0efb8e8d7317a7694aaf9bb15
2025-12-30 zhou zhou
#
917a8f 对比 | 目录
2025-12-30 zhou zhou
#
ad8faf 对比 | 目录
2025-12-30 zhou zhou
#
f3500b 对比 | 目录
2025-12-30 zhou zhou
#
69dfa4 对比 | 目录
2025-12-30 zhou zhou
#
b12670 对比 | 目录
2025-12-30 chen.llin
宜和WCS配置初始化
2989aa 对比 | 目录
2025-12-30 chen.llin
配置文件
2aa39d 对比 | 目录
2个文件已添加
7个文件已修改
1872 ■■■■■ 已修改文件
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 154 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/MainServiceImpl.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 539 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 539 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -185,7 +185,7 @@
    </dependencies>
    <build>
        <finalName>yhfzwcs</finalName>
        <finalName>wcs</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -88,7 +88,7 @@
    private boolean barcodeErr = false;
    // 货物高度 1.低 2.中 3.高
    private short goodsHeight;
    private short goodsHeight = 0;
    //故障-----------------------------------------------------------------------
    private Boolean breakerErr = false; //断路器故障
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -244,35 +244,25 @@
            News.error("堆垛机写入命令为空");
            return false;
        }
        // 向堆垛机发任务前的堆垛机状态
        try{
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
            if (resultRead.IsSuccess) {
                CrnCommand one = new CrnCommand();
                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                ){
                    News.error("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                } else {
                    News.info("下发前:[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
        int writeAck = 0;
        do {
            OperateResult resultAck = siemensNet.Write("DB100.0", (short) 0);
            if (resultAck.IsSuccess){
                Thread.sleep(200);
                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 2);
                short ack = siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                if (ack != 0) {
                    writeAck++;
                }else {
                    News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), "ack复位完成");
                    break;
                }
            }
        }catch (Exception e){
            News.error("堆垛机命令地址写入后回读出错");
        }
        }while (writeAck <5);
        command.setCrnNo(slave.getId());
//        short[] array = new short[10];
        short[] array = new short[10];
        array[0] = command.getAckFinish(); // 任务完成确认位
        array[1] = command.getTaskNo();  // 任务号
@@ -284,61 +274,71 @@
        array[7] = command.getDestinationPosY(); // 目标位置列号
        array[8] = command.getDestinationPosZ(); // 目标位置层号
        array[9] = command.getCommand();
//        array[10] = 0;   //备用1
        OperateResult result = siemensNet.Write("DB100.0", array);
        News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
        if (!result.IsSuccess) {
            News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        try{
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
            if (resultRead.IsSuccess) {
                CrnCommand one = new CrnCommand();
                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22));
                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
        int writeCount1 = 1;
                ){
                    try{
                        News.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
                        try{
                            News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                        }catch (Exception e1){
                            News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                        }
                    }
                    News.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
        do {
            try{
                if(!result.IsSuccess ){
                    News.error("写入堆垛机plc数据失败,重新下发任务  写入直接失败 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount1);
//                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
                    result = siemensNet.Write("DB100.0", array);
                    Thread.sleep(100);
                    readStatus();
                    return false;
                } else {
                    News.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    writeCount1++;
                    continue;
                }
                OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
                if (resultRead.IsSuccess) {
                    CrnCommand one = new CrnCommand();
                    one.setAckFinish(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                    one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                    one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                    one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                    one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                    one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                    one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                    one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                    one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                    one.setCommand(siemensNet.getByteTransform().TransInt16(resultRead.Content, 18));
                    if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                            || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                            || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                            || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                            || !command.getCommand().equals(one.getCommand())
                            || !command.getAckFinish().equals(one.getAckFinish())
                    ){
                        try{
                            News.error("堆垛机命令地址写入后回读失败==>不一致[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                        }catch (Exception e){
                            try{
                                News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                            }catch (Exception e1){
                                News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                            }
                        }
                        News.error("写入堆垛机plc数据失败,重新下发任务  回读不一致 ===>> [id:{}],{},[写入次数:{}]", slave.getId(), JSON.toJSON(command),writeCount1);
                        result = siemensNet.Write("DB100.0", array);
                        writeCount1++;
                        continue;
                    } else {
                        News.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                        break;
                    }
                }
            }catch (Exception e){
                News.error("堆垛机命令地址写入后回读出错,异常:"+e);
            }
        }catch (Exception e){
            News.error("堆垛机命令地址写入后回读出错");
        }
            writeCount1++;
        } while (writeCount1<6);
        if (command.getAckFinish() == 0) {
@@ -354,6 +354,7 @@
                    if(result.IsSuccess){
                        //堆垛机任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        log.info("堆垛机任务完成复位,此时堆垛机状态:"+crnProtocol.getStatusType()+",堆垛机id:"+crnProtocol.getCrnNo());
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
@@ -361,7 +362,7 @@
                                News.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                News.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
//                                News.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
@@ -372,12 +373,8 @@
                    }
                }while (writeCount2<5);
            }
        } else {
            BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
            BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
            basCrnp.setModiTime(new Date());
            basCrnpService.updateById(basCrnp);
        }
        try {
            // 日志记录
@@ -402,9 +399,10 @@
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        if (result.IsSuccess) {
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
//            News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -41,32 +41,27 @@
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    private short heartBeatVal = 1;
    private StaError1 staError1;
    public static final ArrayList<Integer> staNos;
    static {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 48; i++) {
            list.add(1000 + i);
        }
        for (int i = 9; i <= 40; i++) {
            list.add(1100 + i);
        }
        list.add(1701);
        list.add(1702);
        staNos = list; // 不可修改,安全
    }
    public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{
        add(1); add(2);add(3); add(4);add(5); add(6);add(7); add(8);
    public static final ArrayList<Integer> staNos1= new ArrayList<Integer>() {{
        add(1001);add(1002);add(1003);add(1004);add(1005);add(1006);add(1007);add(1008);add(1009);add(1010);
        add(1011);add(1012);add(1013);add(1014);add(1015);add(1016);add(1017);add(1018);add(1019);
        add(1020);add(1021);add(1022);add(1023);add(1024);add(1071);
    }};
    public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{
        add(104); add(106);
    public static final ArrayList<Integer> staNos2= new ArrayList<Integer>() {{
        add(1025);add(1026);add(1027);add(1028);add(1029);add(1030);add(1031);add(1032);add(1033);
        add(1034);add(1035);add(1036);add(1037);add(1039);add(1040);add(1041);add(1042);add(1043);
        add(1044);add(1045);add(1046);add(1047);add(1048);
    }};
    /**
     * 条码数量
     */
    private int barcodeSize = 2;
    public static final ArrayList<Integer> BarcodeList1 = new ArrayList<Integer>() {{
        add(1002); add(1004);add(1006); add(1008);
    }};
    public static final ArrayList<Integer> BarcodeList2 = new ArrayList<Integer>() {{
        add(1041); add(1043);add(1045); add(1047);
    }};
    /**
     * 入出库模式
@@ -83,7 +78,20 @@
    }
    private ArrayList<Integer> getStaNo() {
        return staNos;
        if (slave.getId() == 1){
            return staNos2;
        }else {
            return staNos1;
        }
    }
    private ArrayList<Integer> getBarcodeList() {
        if (slave.getId() == 1){
            return BarcodeList2;
        }else {
            return BarcodeList1;
        }
    }
    @Override
@@ -189,9 +197,9 @@
     * 读取状态 ====> 整块plc
     */
    private void read() {
        ArrayList<Integer> staNos = getStaNo();
        // 站点信息
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (8*8));
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (staNos.size()*8));
        if (result.IsSuccess) {
            for (int i = 0; i < staNos.size(); i++) {
                Integer siteId = staNos.get(i); // 站点编号
@@ -226,13 +234,13 @@
            News.error("SiemensCrn"+" - 4"+" - 读取输送线plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            return;
        }
        ArrayList<Integer> barcodeList = getBarcodeList();
        // 条码扫描器
        OperateResultExOne<byte[]> barcodeResult = siemensS7Net.Read("DB101.400", (short) (BarcodeList.size() * 10));
        OperateResultExOne<byte[]> barcodeResult = siemensS7Net.Read("DB101.860", (short) (barcodeList.size() * 8));
        if (barcodeResult.IsSuccess) {
            for (int i = 0; i < BarcodeList.size(); i++) {
                String barcode = siemensS7Net.getByteTransform().TransString(barcodeResult.Content,i*10 + 2,8, "UTF-8");
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, BarcodeList.get(i));
            for (int i = 0; i < barcodeList.size(); i++) {
                String barcode = siemensS7Net.getByteTransform().TransString(barcodeResult.Content,i*8 ,8, "UTF-8");
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeList.get(i));
                if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                    barcodeThread.setBarcode(barcode);
                }
@@ -240,11 +248,13 @@
        }
        // 外形检测
        OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.430", (short) (staNosErrList.size() *4)); // 不连续,多读中间一个
        OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.800", (short) (barcodeList.size() *6)); // 不连续,多读中间一个
        if (resultErr.IsSuccess){
            for (int i = 0;i<staNosErrList.size();i++){
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4, 1);
                StaProtocol staProtocol = station.get(staNosErrList.get(i));
            for (int i = 0;i<barcodeList.size();i++){
                StaProtocol staProtocol = station.get(barcodeList.get(i));
                short goodsHeight = siemensS7Net.getByteTransform().TransInt16(resultErr.Content, i * 4);
                staProtocol.setGoodsHeight(goodsHeight);
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i*4+2, 1);
                staProtocol.setFrontErr(status[0]);
                staProtocol.setBackErr(status[1]);
                staProtocol.setHighErr(status[2]);
@@ -253,8 +263,7 @@
                staProtocol.setGroupSupportErr(status[5]);
                staProtocol.setBarcodeErr(status[6]);
                staProtocol.setWeightErr(status[7]);
                short goodsHeight = siemensS7Net.getByteTransform().TransInt16(resultErr.Content, i * 4 + 2);
                staProtocol.setGoodsHeight(goodsHeight);
            }
        }
@@ -312,15 +321,15 @@
        if (null == staProtocol) {
            return;
        }
        int address = staNos.indexOf(staProtocol.getSiteId()) * 4;
        ArrayList<Integer> staNos = getStaNo();
        int address = staNos.indexOf(staProtocol.getSiteId()) * 6;
        OperateResult write;
        OperateResult write1;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100." + address, staProtocol.getWorkNo().shortValue());    // 工作号
            write = siemensS7Net.Write("DB100." + address, staProtocol.getWorkNo());    // 工作号
            write1 = siemensS7Net.Write("DB100." + (address + 2), staProtocol.getStaNo());    // 目标站
            Thread.sleep(200);
            if(write.IsSuccess && write1.IsSuccess){
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -36,6 +36,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;
@@ -96,7 +97,10 @@
    @Value("${wms.url}")
    private String wmsUrl;
    public Integer wrkNo = 9997;
    @Autowired
    private MainServiceImpl mainService;
    public Integer wrkNo = 10000;
    /**
     * 组托
@@ -158,6 +162,7 @@
                if (back && (staProtocol.getWorkNo() == 9999 || staProtocol.getWorkNo() == 9998)  && staProtocol.isInEnable() && staProtocol.isLoading() && staProtocol.isPakMk()) {
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                    staProtocol.setWorkNo(wrkNo);
                    wrkNo++;
                    News.info("{}入库回退:{},任务号:{}", inSta.getStaNo(), errMsg,wrkNo);
                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
@@ -217,6 +222,7 @@
                            }
                        } else {
                            staProtocol.setWorkNo(wrkNo);
                            wrkNo++;
                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -289,6 +295,7 @@
                    if (Cools.isEmpty(staDesc)) {
                        News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
                        staProtocol.setWorkNo(wrkNo);
                        wrkNo++;
                        staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1));
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -1068,7 +1075,7 @@
                            // 更新站点信息 且 下发plc命令
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(staProtocol.getSiteId().shortValue());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发6:"+dto.getWorkNo()+","+staProtocol.getSiteId());
@@ -1093,6 +1100,7 @@
                            }
                        } else {
                            staProtocol.setWorkNo(wrkNo);
                            wrkNo++;
                            staProtocol.setStaNo(emptyInSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -1448,10 +1456,14 @@
     * 因双深库位阻塞,对浅库位进行移转(立即执行版)
     * tip:同步
     */
    private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc,Integer mark) {
    /**
     * 因双深库位阻塞,对浅库位进行移转(立即执行版)
     * tip:同步
     */
    private synchronized void moveLocForDeepLoc(CrnSlave crn, LocMast shallowLoc, Integer mark) {
        try {
            News.warnNoLog(""+mark+"moveLocForDeepLoc"+" - 0"+" - 开始执行:因双深库位阻塞,对浅库位进行移转(立即执行版)");
            News.warnNoLog("" + mark + "moveLocForDeepLoc" + " - 0" + " - 开始执行:因双深库位阻塞,对浅库位进行移转(立即执行版)");
            List<Integer> rows = locMastService.queryDistinctRow(crn.getId());
            LocMast loc = null;
            for (Integer row : rows) {
@@ -1493,81 +1505,86 @@
            }
            if (null == loc) {
                News.error(""+mark+"moveLocForDeepLoc"+" - 1"+" - 双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
                News.error("" + mark + "moveLocForDeepLoc" + " - 1" + " - 双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
//                throw new CoolException("双深库位 --- 浅库位阻塞异常! 待移转浅库位:" + shallowLoc.getLocNo());
            } else {
            }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);
        }
    }
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    public synchronized 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.getLocSts().equals("F") ? "Y" : "N"); // 满板:Y
        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("保存工作档明细失败");
                }
            }
        } catch (Exception e) {
            News.error(""+mark+"moveLocForDeepLoc"+" - 8"+" - 双深库位阻塞,对浅库位进行移转失败", e);
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        // 修改源库位状态
        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("移转失败");
        }
    }
src/main/resources/application-dev.yml
New file
@@ -0,0 +1,539 @@
server:
  port: 9090
  servlet:
    context-path: /@pom.build.finalName@
spring:
  application:
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=yhfzasrs
    username: sa
    password: sa@12345
  mvc:
    static-path-pattern: /**
  redis:
    host: localhost
    port: 6379
    database: 0
#    password: xltys1995
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
#  global-config:
#    field-strategy: 0
logging:
  path: /stock/out/@pom.build.finalName@/logs
super:
  pwd: xltys1995
swagger:
  enable: false
wms:
  url: 127.0.0.1:8080/wms
# 下位机配置
wcs-slave:
  # 双深
  doubleDeep: true
  # 双深库位排号
  doubleLocs: 1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32
  # 一个堆垛机负责的货架排数
  groupCount: 4
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 10.10.10.10
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 104
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 2
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 104
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 2
      bay: 1
      lev: 1
  # 堆垛机2
  crn[1]:
    id: 2
    ip: 10.10.10.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机3
  crn[2]:
    id: 3
    ip: 10.10.10.30
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机4
  crn[3]:
    id: 4
    ip: 10.10.10.40
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1032
      row: 15
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1031
      row: 14
      bay: 1
      lev: 1
  # 堆垛机5
  crn[4]:
    id: 5
    ip: 10.10.10.50
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机6
  crn[5]:
    id: 6
    ip: 10.10.10.60
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机7
  crn[6]:
    id: 7
    ip: 10.10.10.70
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机8
  crn[7]:
    id: 8
    ip: 10.10.10.80
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 输送线1 原点侧输送线
  devp[0]:
    id: 1
    ip: 10.10.10.120
    port: 102
    rack: 0
    slot: 0
    #西面
    # 入库口1
    inSta[0]:
      staNo: 1026
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1041
      led: ${wcs-slave.led[1].id}
    # 出库口1
    outSta[0]:
      staNo: 1042
      led: ${wcs-slave.led[1].id}
    # 入库口2
    inSta[1]:
      staNo: 1028
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1043
      led: ${wcs-slave.led[1].id}
    # 出库口2
    outSta[1]:
      staNo: 1044
      led: ${wcs-slave.led[1].id}
    # 入库口3
    inSta[2]:
      staNo: 1038
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1045
      led: ${wcs-slave.led[2].id}
    # 出库口3
    outSta[2]:
      staNo: 1046
      led: ${wcs-slave.led[2].id}
    # 入库口4
    inSta[3]:
      staNo: 1040
      barcode: ${wcs-slave.barcode[3].id}
      backSta: 1047
      led: ${wcs-slave.led[3].id}
    # 出库口4
    outSta[3]:
      staNo: 1048
      led: ${wcs-slave.led[3].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 1026
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1041
      led: ${wcs-slave.led[1].id}
    # 空板入库口2
    emptyInSta[1]:
      staNo: 1028
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1043
      led: ${wcs-slave.led[1].id}
    # 空板入库口3
    emptyInSta[2]:
      staNo: 1038
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1045
      led: ${wcs-slave.led[2].id}
    # 空板入库口4
    emptyInSta[3]:
      staNo: 1040
      barcode: ${wcs-slave.barcode[3].id}
      backSta: 1047
      led: ${wcs-slave.led[3].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 1026
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1041
      led: ${wcs-slave.led[1].id}
    # 拣料入库口2
    pickSta[1]:
      staNo: 1028
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1043
      led: ${wcs-slave.led[1].id}
    # 拣料入库口3
    pickSta[2]:
      staNo: 1038
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1045
      led: ${wcs-slave.led[2].id}
    # 拣料入库口4
    pickSta[3]:
      staNo: 1040
      barcode: ${wcs-slave.barcode[3].id}
      backSta: 1047
      led: ${wcs-slave.led[3].id}
  # 输送线2 反原点侧输送线
  #东面
  devp[1]:
    id: 2
    ip: 10.10.10.140
    port: 102
    rack: 0
    slot: 0
    #东面
    # 入库口5
    inSta[0]:
      staNo: 1015
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1002
      led: ${wcs-slave.led[5].id}
    # 出库口5
    outSta[0]:
      staNo: 1001
      led: ${wcs-slave.led[5].id}
    # 入库口6
    inSta[1]:
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1004
      led: ${wcs-slave.led[5].id}
    # 出库口6
    outSta[1]:
      staNo: 1003
      led: ${wcs-slave.led[5].id}
    # 入库口7
    inSta[2]:
      staNo: 1019
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1006
      led: ${wcs-slave.led[4].id}
    # 出库口7
    outSta[2]:
      staNo: 1005
      led: ${wcs-slave.led[4].id}
    # 入库口8
    inSta[3]:
      staNo: 1021
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1008
      led: ${wcs-slave.led[3].id}
    # 出库口8
    outSta[3]:
      staNo: 1007
      led: ${wcs-slave.led[3].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 1015
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1002
      led: ${wcs-slave.led[5].id}
    # 空板入库口2
    emptyInSta[1]:
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1004
      led: ${wcs-slave.led[5].id}
    # 空板入库口3
    emptyInSta[2]:
      staNo: 1019
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1006
      led: ${wcs-slave.led[4].id}
    # 空板入库口4
    emptyInSta[3]:
      staNo: 1021
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1008
      led: ${wcs-slave.led[3].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 1015
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1002
      led: ${wcs-slave.led[5].id}
    # 拣料入库口2
    pickSta[1]:
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1004
      led: ${wcs-slave.led[5].id}
    # 拣料入库口3
    pickSta[2]:
      staNo: 1019
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1006
      led: ${wcs-slave.led[4].id}
    # 拣料入库口4
    pickSta[3]:
      staNo: 1021
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1008
      led: ${wcs-slave.led[3].id}
  # 条码扫描仪1
  barcode[0]:
    id: 1
    ip: 10.10.10.122
    port: 51236
  # 条码扫描仪2
  barcode[1]:
    id: 2
    ip: 10.10.10.123
    port: 51236
  # 条码扫描仪3
  barcode[2]:
    id: 3
    ip: 10.10.10.124
    port: 51236
  # 条码扫描仪4
  barcode[3]:
    id: 4
    ip: 10.10.10.125
    port: 51236
  # 条码扫描仪5
  barcode[4]:
    id: 5
    ip: 10.10.10.142
    port: 51236
  # 条码扫描仪6
  barcode[5]:
    id: 6
    ip: 10.10.10.143
    port: 51236
  # 条码扫描仪7
  barcode[6]:
    id: 7
    ip: 10.10.10.144
    port: 51236
  # 条码扫描仪8
  barcode[7]:
    id: 8
    ip: 10.10.10.145
    port: 51236
  # LED1
  led[0]:
    id: 1
    ip: 10.10.10.160
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 101
    crnId: 1
  # LED2
  led[1]:
    id: 2
    ip: 10.10.10.161
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 104
    crnId: 1
  # LED3
  led[2]:
    id: 3
    ip: 10.10.10.162
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 106
    crnId: 2
  # LED4
  led[3]:
    id: 4
    ip: 10.10.10.163
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 107
    crnId: 2
  # LED5
  led[4]:
    id: 5
    ip: 10.10.10.164
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 107
    crnId: 2
  # LED6
  led[5]:
    id: 6
    ip: 10.10.10.165
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 107
    crnId: 2
src/main/resources/application-prod.yml
New file
@@ -0,0 +1,539 @@
server:
  port: 9090
  servlet:
    context-path: /@pom.build.finalName@
spring:
  application:
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=yhfzasrs
    username: sa
    password: sa@12345
  mvc:
    static-path-pattern: /**
  redis:
    host: localhost
    port: 6379
    database: 0
#    password: xltys1995
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
#  global-config:
#    field-strategy: 0
logging:
  path: /stock/out/@pom.build.finalName@/logs
super:
  pwd: xltys1995
swagger:
  enable: false
wms:
  url: 127.0.0.1:8080/wms
# 下位机配置
wcs-slave:
  # 双深
  doubleDeep: true
  # 双深库位排号
  doubleLocs: 1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32
  # 一个堆垛机负责的货架排数
  groupCount: 4
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 10.10.10.10
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 104
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 2
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 104
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 102
      row: 2
      bay: 1
      lev: 1
  # 堆垛机2
  crn[1]:
    id: 2
    ip: 10.10.10.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机3
  crn[2]:
    id: 3
    ip: 10.10.10.30
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机4
  crn[3]:
    id: 4
    ip: 10.10.10.40
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机5
  crn[4]:
    id: 5
    ip: 10.10.10.50
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机6
  crn[5]:
    id: 6
    ip: 10.10.10.60
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机7
  crn[6]:
    id: 7
    ip: 10.10.10.70
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机8
  crn[7]:
    id: 8
    ip: 10.10.10.80
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 输送线1 原点侧输送线
  devp[0]:
    id: 1
    ip: 10.10.10.120
    port: 102
    rack: 0
    slot: 0
    #西面
    # 入库口1
    inSta[0]:
      staNo: 1026
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1041
      led: ${wcs-slave.led[1].id}
    # 出库口1
    outSta[0]:
      staNo: 1042
      led: ${wcs-slave.led[1].id}
    # 入库口2
    inSta[1]:
      staNo: 1028
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1043
      led: ${wcs-slave.led[1].id}
    # 出库口2
    outSta[1]:
      staNo: 1044
      led: ${wcs-slave.led[1].id}
    # 入库口3
    inSta[2]:
      staNo: 1038
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1045
      led: ${wcs-slave.led[2].id}
    # 出库口3
    outSta[2]:
      staNo: 1046
      led: ${wcs-slave.led[2].id}
    # 入库口4
    inSta[3]:
      staNo: 1040
      barcode: ${wcs-slave.barcode[3].id}
      backSta: 1047
      led: ${wcs-slave.led[3].id}
    # 出库口4
    outSta[3]:
      staNo: 1048
      led: ${wcs-slave.led[3].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 1026
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1041
      led: ${wcs-slave.led[1].id}
    # 空板入库口2
    emptyInSta[1]:
      staNo: 1028
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1043
      led: ${wcs-slave.led[1].id}
    # 空板入库口3
    emptyInSta[2]:
      staNo: 1038
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1045
      led: ${wcs-slave.led[2].id}
    # 空板入库口4
    emptyInSta[3]:
      staNo: 1040
      barcode: ${wcs-slave.barcode[3].id}
      backSta: 1047
      led: ${wcs-slave.led[3].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 1026
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1041
      led: ${wcs-slave.led[1].id}
    # 拣料入库口2
    pickSta[1]:
      staNo: 1028
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1043
      led: ${wcs-slave.led[1].id}
    # 拣料入库口3
    pickSta[2]:
      staNo: 1038
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1045
      led: ${wcs-slave.led[2].id}
    # 拣料入库口4
    pickSta[3]:
      staNo: 1040
      barcode: ${wcs-slave.barcode[3].id}
      backSta: 1047
      led: ${wcs-slave.led[3].id}
  # 输送线2 反原点侧输送线
  #东面
  devp[1]:
    id: 2
    ip: 10.10.10.140
    port: 102
    rack: 0
    slot: 0
    #东面
    # 入库口5
    inSta[0]:
      staNo: 1015
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1002
      led: ${wcs-slave.led[5].id}
    # 出库口5
    outSta[0]:
      staNo: 1001
      led: ${wcs-slave.led[5].id}
    # 入库口6
    inSta[1]:
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1004
      led: ${wcs-slave.led[5].id}
    # 出库口6
    outSta[1]:
      staNo: 1003
      led: ${wcs-slave.led[5].id}
    # 入库口7
    inSta[2]:
      staNo: 1019
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1006
      led: ${wcs-slave.led[4].id}
    # 出库口7
    outSta[2]:
      staNo: 1005
      led: ${wcs-slave.led[4].id}
    # 入库口8
    inSta[3]:
      staNo: 1021
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1008
      led: ${wcs-slave.led[3].id}
    # 出库口8
    outSta[3]:
      staNo: 1007
      led: ${wcs-slave.led[3].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 1015
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1002
      led: ${wcs-slave.led[5].id}
    # 空板入库口2
    emptyInSta[1]:
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1004
      led: ${wcs-slave.led[5].id}
    # 空板入库口3
    emptyInSta[2]:
      staNo: 1019
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1006
      led: ${wcs-slave.led[4].id}
    # 空板入库口4
    emptyInSta[3]:
      staNo: 1021
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1008
      led: ${wcs-slave.led[3].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 1015
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1002
      led: ${wcs-slave.led[5].id}
    # 拣料入库口2
    pickSta[1]:
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1004
      led: ${wcs-slave.led[5].id}
    # 拣料入库口3
    pickSta[2]:
      staNo: 1019
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1006
      led: ${wcs-slave.led[4].id}
    # 拣料入库口4
    pickSta[3]:
      staNo: 1021
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1008
      led: ${wcs-slave.led[3].id}
  # 条码扫描仪1
  barcode[0]:
    id: 1
    ip: 10.10.10.122
    port: 51236
  # 条码扫描仪2
  barcode[1]:
    id: 2
    ip: 10.10.10.123
    port: 51236
  # 条码扫描仪3
  barcode[2]:
    id: 3
    ip: 10.10.10.124
    port: 51236
  # 条码扫描仪4
  barcode[3]:
    id: 4
    ip: 10.10.10.125
    port: 51236
  # 条码扫描仪5
  barcode[4]:
    id: 5
    ip: 10.10.10.142
    port: 51236
  # 条码扫描仪6
  barcode[5]:
    id: 6
    ip: 10.10.10.143
    port: 51236
  # 条码扫描仪7
  barcode[6]:
    id: 7
    ip: 10.10.10.144
    port: 51236
  # 条码扫描仪8
  barcode[7]:
    id: 8
    ip: 10.10.10.145
    port: 51236
  # LED1
  led[0]:
    id: 1
    ip: 10.10.10.160
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 101
    crnId: 1
  # LED2
  led[1]:
    id: 2
    ip: 10.10.10.161
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 104
    crnId: 1
  # LED3
  led[2]:
    id: 3
    ip: 10.10.10.162
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 106
    crnId: 2
  # LED4
  led[3]:
    id: 4
    ip: 10.10.10.163
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 107
    crnId: 2
  # LED5
  led[4]:
    id: 5
    ip: 10.10.10.164
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 107
    crnId: 2
  # LED6
  led[5]:
    id: 6
    ip: 10.10.10.165
    port: 5005
    devpPlcId: ${wcs-slave.devp[1].id}
    staArr: 107
    crnId: 2
src/main/resources/application.yml
@@ -1,381 +1,3 @@
server:
  port: 9090
  servlet:
    context-path: /@pom.build.finalName@
spring:
  application:
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=yhfzasrs
    username: sa
    password: sa@123
  mvc:
    static-path-pattern: /**
  redis:
    host: localhost
    port: 6379
    database: 0
#    password: xltys1995
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
#  global-config:
#    field-strategy: 0
logging:
  path: /stock/out/@pom.build.finalName@/logs
super:
  pwd: xltys1995
swagger:
  enable: false
wms:
  url: 127.0.0.1:8080/yhfzwms
# 下位机配置
wcs-slave:
  # 双深
  doubleDeep: true
  # 双深库位排号
  doubleLocs: 1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32
  # 一个堆垛机负责的货架排数
  groupCount: 4
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 192.168.5.10
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 104
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 2
      bay: 1
      lev: 1
  # 堆垛机2
  crn[1]:
    id: 2
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机3
  crn[2]:
    id: 3
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机4
  crn[3]:
    id: 4
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机5
  crn[4]:
    id: 5
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机6
  crn[5]:
    id: 6
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机7
  crn[6]:
    id: 7
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 堆垛机8
  crn[7]:
    id: 8
    ip: 192.168.5.20
    port: 102
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 108
      row: 7
      bay: 1
      lev: 1
  # 输送线1
  devp[0]:
    id: 1
    ip: 192.168.5.40
    port: 102
    rack: 0
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 104
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 103
      led: ${wcs-slave.led[1].id}
    # 入库口2
    inSta[1]:
      staNo: 106
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 105
      led: ${wcs-slave.led[2].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 104
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 103
      led: ${wcs-slave.led[1].id}
    # 空板入库口2
    emptyInSta[1]:
      staNo: 106
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 105
      led: ${wcs-slave.led[2].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 104
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 103
      led: ${wcs-slave.led[1].id}
    # 拣料入库口2
    pickSta[1]:
      staNo: 106
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 105
      led: ${wcs-slave.led[2].id}
    # 出库口1
    outSta[0]:
      staNo: 101
      led: ${wcs-slave.led[0].id}
    # 出库口2
    outSta[1]:
      staNo: 107
      led: ${wcs-slave.led[3].id}
  # 条码扫描仪1
  barcode[0]:
    id: 1
    ip: 192.168.5.42
    port: 51236
  # 条码扫描仪2
  barcode[1]:
    id: 2
    ip: 192.168.5.43
    port: 51236
  # 条码扫描仪3
  barcode[2]:
    id: 3
    ip: 192.168.5.43
    port: 51236
  # 条码扫描仪4
  barcode[3]:
    id: 4
    ip: 192.168.5.43
    port: 51236
  # 条码扫描仪5
  barcode[4]:
    id: 5
    ip: 192.168.5.43
    port: 51236
  # 条码扫描仪6
  barcode[5]:
    id: 6
    ip: 192.168.5.43
    port: 51236
  # 条码扫描仪7
  barcode[6]:
    id: 7
    ip: 192.168.5.43
    port: 51236
  # 条码扫描仪8
  barcode[7]:
    id: 8
    ip: 192.168.5.43
    port: 51236
  # LED1
  led[0]:
    id: 1
    ip: 192.168.5.104
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 101
    crnId: 1
  # LED2
  led[1]:
    id: 2
    ip: 192.168.5.105
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 104
    crnId: 1
  # LED3
  led[2]:
    id: 3
    ip: 192.168.5.106
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 106
    crnId: 2
  # LED4
  led[3]:
    id: 4
    ip: 192.168.5.107
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 107
    crnId: 2
  # LED5
  led[4]:
    id: 5
    ip: 192.168.5.107
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 107
    crnId: 2
  # LED6
  led[5]:
    id: 6
    ip: 192.168.5.107
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 107
    crnId: 2
  profiles:
    active: dev
src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/yhfzwcs";
var baseUrl = "/wcs";
// 赋值
function setVal(el, val) {