#
zjj
2023-12-14 45a87642e46c746802af13bf47bcd70e3b69277a
#
14个文件已修改
1个文件已添加
474 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/CrnController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocMast.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WmsLocStatus.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wcs/css/crn.css 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/js/locMast/locMast.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/crnOperate.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/locMast/locMast_detail.html 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/realtimeWatch/crn2.html 158 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -376,6 +376,10 @@
    @ManagerAuth(memo = "入库")
    @PostMapping("/crn/operator/put")
    public R crnPut(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
        command.setTaskNo((short) 0); // 工作号
@@ -394,6 +398,10 @@
    @ManagerAuth(memo = "出库")
    @PostMapping("/crn/operator/take")
    public R crnTake(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
        command.setTaskNo((short) 0); // 工作号
@@ -411,6 +419,10 @@
    @ManagerAuth(memo = "库位转移")
    @PostMapping("/crn/operator/stockMove")
    public R crnStockMove(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
        command.setTaskNo((short) 0); // 工作号
@@ -434,6 +446,10 @@
    @ManagerAuth(memo = "站到站")
    @PostMapping("/crn/operator/siteMove")
    public R crnSiteMove(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
        command.setTaskNo((short) 0); // 工作号
@@ -451,6 +467,10 @@
    @ManagerAuth(memo = "回原点")
    @PostMapping("/crn/operator/bacOrigin")
    public R crnBacOrigin(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
        command.setTaskNo((short) 0); // 工作号
@@ -468,6 +488,10 @@
    @ManagerAuth(memo = "反原点")
    @PostMapping("/crn/operator/reverseOrigin")
    public R reverseOrigin(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
        command.setTaskNo((short) 0); // 工作号
@@ -503,6 +527,10 @@
    @ManagerAuth(memo = "任务完成")
    @PostMapping("/crn/operator/taskComplete")
    public R crnTaskComplete(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
        command.setTaskNo((short) 0); // 工作号
@@ -532,6 +560,10 @@
    @ManagerAuth(memo = "清除命令")
    @PostMapping("/crn/operator/clearCommand")
    public R crnClearCommand(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        if (param.getCrnNo() == null) {
            throw new CoolException("请选择堆垛机");
        }
@@ -552,6 +584,10 @@
    @ManagerAuth(memo = "手动复位")
    @PostMapping("/crn/operator/handleReset")
    public R handleReset(CrnOperatorParam param) throws Exception {
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        if (param.getCrnNo() == null) {
            throw new CoolException("请选择堆垛机");
        }
@@ -590,6 +626,10 @@
    @ManagerAuth(memo = "切换联机模式")
    @PostMapping("/crn/operator/auto")
    public R crnAuto(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        short[] array = new short[9];
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -601,6 +641,10 @@
    @ManagerAuth(memo = "切换半手动模式")
    @PostMapping("/crn/operator/semiAutomatic")
    public R crnsemiAutomatic(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        short[] array = new short[9];
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -612,6 +656,10 @@
    @ManagerAuth(memo = "切换手动模式")
    @PostMapping("/crn/operator/hand")
    public R onlineWrk1(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        short[] array = new short[9];
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -623,6 +671,10 @@
    @ManagerAuth(memo = "申请完成任务")
    @PostMapping("/crn/operator/onlineWrk1")
    public R onlineWrk2(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        short[] array = new short[9];
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -634,6 +686,10 @@
    @ManagerAuth(memo = "申请取消任务")
    @PostMapping("/crn/operator/onlineWrk2")
    public R onlineWrk3(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        short[] array = new short[9];
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -645,6 +701,10 @@
    @ManagerAuth(memo = "清除联机任务")
    @PostMapping("/crn/operator/onlineWrk3")
    public R onlineWrk4(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        short[] array = new short[9];
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
@@ -656,6 +716,10 @@
    @ManagerAuth(memo = "恢复联机任务")
    @PostMapping("/crn/operator/onlineWrk4")
    public R crnHand(CrnOperatorParam param){
        // 系统运行状态判断
        if (SystemProperties.WCS_RUNNING_STATUS.get()) {
            return R.error("wcs系统状态为开启");
        }
        short[] array = new short[9];
        CrnCommand command = new CrnCommand();
        command.setCrnNo(param.getCrnNo()); // 堆垛机编号
src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -145,9 +145,19 @@
        if (Cools.isEmpty(locMast) || null==locMast.getLocNo()){
            return R.error();
        }
        if (!Cools.isEmpty(locMast.getContainerCode())){
            locMast.setBarcode(locMast.getContainerCode());
        }
        if (locMast.getEmptyContainer$().equals("N") ){
            if (locMast.getContainerCode().isEmpty() || locMast.getContainerTypeCode().isEmpty()){
                return R.error("容器编码或容器类型有误");
            }
        }
        locMast.setModiUser(getUserId());
        locMast.setModiTime(new Date());
        locMastService.updateById(locMast);
        locMastService.toWmsLocStatus(locMast);
        return R.ok();
    }
src/main/java/com/zy/asrs/entity/LocMast.java
@@ -178,6 +178,23 @@
    @ApiModelProperty(value= "")
    private String status;
    @TableField(exist = false)
    private String containerCode;
    @TableField(exist = false)
    private String containerTypeCode;
    @TableField(exist = false)
    private String emptyContainer;
    public String getEmptyContainer$(){
        if (Cools.isEmpty(this.emptyContainer)){
            return "";
        }
        if (this.emptyContainer.equals("1")){
            return "Y";
        }else {
            return "N";
        }
    }
    public String getIoTime$(){
        if (Cools.isEmpty(this.ioTime)){
            return "";
src/main/java/com/zy/asrs/entity/WmsLocStatus.java
New file
@@ -0,0 +1,13 @@
package com.zy.asrs.entity;
import lombok.Data;
@Data
public class WmsLocStatus {
    private String warehouseId;
    private String locationCode;
    private String status;
    private String containerCode;
    private String containerTypeCode;
    private String emptyContainer;
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -1,6 +1,7 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.core.common.R;
import com.zy.asrs.entity.LocMast;
import java.util.List;
@@ -49,4 +50,5 @@
    List<LocMast> selectLocByLev(Integer lev);
    R toWmsLocStatus(LocMast locMast);
}
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -1,16 +1,34 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WmsLocStatus;
import com.zy.asrs.entity.param.TaskOverToWms;
import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service("locMastService")
public class LocMastServiceImpl extends ServiceImpl<LocMastMapper, LocMast> implements LocMastService {
    @Value("${wms.url}")
    private String wmsUrl;
    @Autowired
    private ApiLogService apiLogService;
    @Override
    public List<Integer> queryDistinctRow(Integer crnNo) {
@@ -61,4 +79,52 @@
    public List<LocMast> selectLocByLev(Integer lev) {
        return this.baseMapper.selectLocByLev(lev);
    }
    @Override
    public R toWmsLocStatus(LocMast locMast) {
        String response = null;
        Map<String, Object> map = new HashMap<>();
        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
        WmsLocStatus param = new WmsLocStatus();
        param.setWarehouseId("1688469798893297665");
        param.setLocationCode(Utils.getWmsLocNo(locMast.getLocNo()));
        param.setEmptyContainer(locMast.getEmptyContainer$());
        if (locMast.getLocSts().equals("Z")){
            param.setStatus("JY");
        }else {
            param.setStatus("QY");
        }
        if (Cools.isEmpty(locMast.getBarcode()) || locMast.getLocSts().equals("O")){
            param.setContainerCode("");
            param.setContainerTypeCode("");
        }else {
            param.setContainerCode(locMast.getBarcode());
            param.setContainerTypeCode(locMast.getContainerTypeCode());
        }
        try {
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(wmsUrl)
                    .setPath("wcsManager/wcsInterface/locationUpdate")
                    .setJson(JSON.toJSONString(param))
                    .build()
                    .doPost();
        }catch (Exception e){
            log.error("堆垛机任务完成,请求wms任务完成接口失败");
        }
        JSONObject jsonObject = JSON.parseObject(response);
        apiLogService.save("Wms变更货位状态"
                ,wmsUrl+"wcsManager/wcsInterface/inboundTaskApply"
                ,null
                ,"127.0.0.1"
                ,JSON.toJSONString(param)
                ,response
                ,true
        );
        return null;
    }
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -109,11 +109,9 @@
                    staProtocol = staProtocol.clone();
                }
                Short workNo = staProtocol.getWorkNo();
                // 判断是否满足入库条件
                if (staProtocol.isAutoing() && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk() && (workNo >= 0)
                        && staProtocol.isPakMk()) {
                Short stano = staProtocol.getStaNo();
                    // 尺寸检测异常
                    boolean back = false;
@@ -148,6 +146,12 @@
                    }
                    // 退回
                    if (back) {
                        if (stano == inSta.getBackSta().shortValue()){
                            continue;
                        }
                        if (workNo == 0 && stano == 0){
                            continue;
                        }
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
@@ -161,6 +165,11 @@
                        }
                        continue;
                    }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing() && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk() && (workNo >= 0)
                        && staProtocol.isPakMk()) {
                    // 获取条码扫描仪信息
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                    if (barcodeThread == null) {
src/main/java/com/zy/asrs/utils/Utils.java
@@ -18,29 +18,49 @@
    private static final DecimalFormat fmt = new DecimalFormat("##0.00");
    public static String getWmsRow(String loc){
        String row = loc.substring(0, 2);
        String bay = loc.substring(3, 5);
        String lev = loc.substring(5, 7);
        String locNo = null;
    public static String getWmsLocNo(String locNo) {
        String loc = null;
        int row = Integer.parseInt(locNo.substring(0, 2));
        int bay = Integer.parseInt(locNo.substring(2, 5))-1;
        int lev = Integer.parseInt(locNo.substring(5, 7));
        Integer sssc = getRowZ(row);
        Integer fz = getFZ(row, sssc);
        Integer fz1 = getFZ1(row, sssc);
        ArrayList<String> list = new ArrayList<>();
        list.add("01");list.add("02");list.add("03");list.add("04");
        int i = list.indexOf(row);
        if (i != -1){
            if (i == 0){
                locNo = "01"+"-"+bay+"-"+lev+"-"+"01-02";
            }else if (i == 1) {
                locNo = "01"+"-"+bay+"-"+lev+"-"+"01-01";
            }else if (i == 2) {
                locNo = "01"+"-"+bay+"-"+lev+"-"+"02-01";
            }else if (i == 3) {
                locNo = "01"+"-"+bay+"-"+lev+"-"+"02-02";
            }
        }
        return locNo;
        //System.out.println(sssc + "-" + bay + "-" + lev + "-" + fz + "-" + fz1);
        loc = String.format("%02d",sssc) + "-" + String.format("%02d",bay) + "-" + String.format("%02d",lev) + "-" + String.format("%02d",fz) + "-" + String.format("%02d",fz1);
        return loc;
    }
    public static Integer getRowZ(int row) {
        return row < 5 ? 1 : (row + 1) / 4 + 1;
    }
    public static Integer getFZ(int row, int crnNo) {
        List<Integer> ii = new ArrayList<Integer>();
        if (crnNo == 1) {
            ii.add(3);
            ii.add(0);
        } else {
            ii.add(2);
            if (crnNo > 2) ii.add(1);
        }
        return ii.contains(row % 4) ? 2 : 1;
    }
    public static Integer getFZ1(int row, int crnNo) {
        if (crnNo == 2) return 1;
        List<Integer> ii = new ArrayList<Integer>();
        ii.add(2);
        ii.add(3);
        int s = 2;
        if (ii.contains(row % 4)) {
            s = 1;
        }
        return crnNo == 1 ? s : 3 - s;
    }
    //转换wms传输的库位号
@@ -354,7 +374,7 @@
//        slaveProperties.setGroupCount(4);
//        Integer deepRow = getDeepRow(slaveProperties, 6);
//        System.out.println(deepRow);
        CrnSlave.CrnStn crnStnByStaNo = getCrnStnByStaNo(235, true);
        System.out.println(crnStnByStaNo);
        System.out.println(getWmsLocNo("1900201"));
    }
}
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -235,7 +235,6 @@
                        taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码
                        taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位
                    }
                    taskOverToWms.setTaskStatus("location_done"); //任务状态
                    String response = null;
                    try {
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -124,9 +124,12 @@
                    // 写数据 ID+目标站
                    case 2:
                        write((StaProtocol)task.getData());
                        read();
                        break;
                    case 3:
                        write2((StaProtocol)task.getData());
                        read();
                        break;
                    default:
                        break;
                }
src/main/webapp/static/wcs/css/crn.css
@@ -14,7 +14,7 @@
    background-color: #fff;
    border-radius: 5px;
    box-shadow: 0 0 3px rgba(0,0,0,.3);
    height: 200px;
    height: 300px;
}
/* 左 */
@@ -232,7 +232,7 @@
/* -------------------- 第四模块 -------------------- */
.crn-output-board {
    margin-top: 10px;
    height: 200px;
    height: 350px;
    background-color: #fff;
    border-radius: 5px;
    box-shadow: 0 0 3px rgba(0,0,0,.3);
src/main/webapp/static/wms/js/locMast/locMast.js
@@ -459,6 +459,9 @@
            barcode: $('#barcode').val(),
            PdcType: $('#PdcType').val(),
            ctnNo: $('#ctnNo').val(),
            containerCode:$('#containerCode').val(),
            containerTypeCode:$('#containerTypeCode').val(),
            emptyContainer:$('#emptyContainer').val(),
        };
        $.ajax({
src/main/webapp/views/deviceOperate/crnOperate.html
@@ -79,7 +79,7 @@
                            <el-button @click="requestOperate('siteMove')" type="primary">站到站</el-button>
                            <el-button @click="requestOperate('taskComplete')" type="primary">任务完成</el-button>
                            <el-button @click="requestOperate('clearCommand')" type="primary">清除命令</el-button>
                            <el-button @click="requestOperate('handleReset')" type="primary">复位</el-button>
<!--                            <el-button @click="requestOperate('handleReset')" type="primary">复位</el-button>-->
                            <br/>
                            <br/>
                            <el-button @click="requestOperate('auto')" type="warning">联机</el-button>
src/main/webapp/views/locMast/locMast_detail.html
@@ -84,29 +84,45 @@
            </div>
        </div>
        <div class="layui-inline"  style="width:80%;">
            <label class="layui-form-label">排:</label>
            <label class="layui-form-label">容器编码:</label>
            <div class="layui-input-inline">
                <input id="row1" class="layui-input" type="text" autocomplete="off" disabled="disabled">
                <input id="containerCode" class="layui-input" type="text" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline"  style="width:80%;">
            <label class="layui-form-label">排:</label>
            <div class="layui-input-inline">
                <input id="row1" class="layui-input" type="text" autocomplete="off" disabled="disabled">
            </div>
            <label class="layui-form-label">容器类型:</label>
        <div class="layui-input-inline">
            <input id="containerTypeCode" class="layui-input" type="text" autocomplete="off" >
        </div>
        </div>
        <div class="layui-inline"  style="width:80%;">
            <label class="layui-form-label">列:</label>
            <label class="layui-form-label">空托盘:</label>
            <div class="layui-input-inline">
                <input id="bay1" class="layui-input" type="text" autocomplete="off" disabled="disabled">
                    <select id="emptyContainer" name="emptyContainer" lay-verify="required">
                        <option value="1" selected = "selected">是</option>
                        <option value="0">否</option>
                    </select>
            </div>
        </div>
        <div class="layui-inline"  style="width:80%;">
            <label class="layui-form-label">层:</label>
            <div class="layui-input-inline">
                <input id="lev1" class="layui-input" type="text" autocomplete="off" disabled="disabled">
            </div>
        </div>
<!--        <div class="layui-inline"  style="width:80%;">-->
<!--            <label class="layui-form-label">排:</label>-->
<!--            <div class="layui-input-inline">-->
<!--                <input id="row1" class="layui-input" type="text" autocomplete="off" disabled="disabled">-->
<!--            </div>-->
<!--        </div>-->
<!--        <div class="layui-inline"  style="width:80%;">-->
<!--            <label class="layui-form-label">列:</label>-->
<!--            <div class="layui-input-inline">-->
<!--                <input id="bay1" class="layui-input" type="text" autocomplete="off" disabled="disabled">-->
<!--            </div>-->
<!--        </div>-->
<!--        <div class="layui-inline"  style="width:80%;">-->
<!--            <label class="layui-form-label">层:</label>-->
<!--            <div class="layui-input-inline">-->
<!--                <input id="lev1" class="layui-input" type="text" autocomplete="off" disabled="disabled">-->
<!--            </div>-->
<!--        </div>-->
        <div class="layui-inline"  style="width:80%;display: none">
            <label class="layui-form-label">满  板:</label>
            <div class="layui-input-inline" style="text-align: left">
src/main/webapp/views/realtimeWatch/crn2.html
@@ -142,92 +142,92 @@
    <div class="crn-operation">
      <!-- 遮罩层 -->
      <div class="crn-operation-shade">
        <span class="crn-operation-shade-span">
            WCS 系统运行中,请停止后操作
        </span>
      </div>
<!--      <div class="crn-operation-shade">-->
<!--        <span class="crn-operation-shade-span">-->
<!--            WCS 系统运行中,请停止后操作-->
<!--        </span>-->
<!--      </div>-->
      <!-- 设备任务选择 -->
      <div class="task-select">
        <!-- 堆垛机选择 -->
        <div id="crn-select" class="operator-item" style="width: 55%">
          <span class="select-title">堆垛机号</span>
          <div class="select-container" style="padding: 20px 0;">
            <label><input type="radio" name="crnSelect" value="1" checked>&nbsp;1号堆垛机</label>
            <label><input type="radio" name="crnSelect" value="2">&nbsp;2号堆垛机</label>
            <label><input type="radio" name="crnSelect" value="3">&nbsp;3号堆垛机</label>
            <label><input type="radio" name="crnSelect" value="4">&nbsp;4号堆垛机</label>
            <label><input type="radio" name="crnSelect" value="5">&nbsp;5号堆垛机</label>
            <label><input type="radio" name="crnSelect" value="6">&nbsp;6号堆垛机</label>
          </div>
        </div>
<!--        <div id="crn-select" class="operator-item" style="width: 55%">-->
<!--          <span class="select-title">堆垛机号</span>-->
<!--          <div class="select-container" style="padding: 20px 0;">-->
<!--            <label><input type="radio" name="crnSelect" value="1" checked>&nbsp;1号堆垛机</label>-->
<!--            <label><input type="radio" name="crnSelect" value="2">&nbsp;2号堆垛机</label>-->
<!--            <label><input type="radio" name="crnSelect" value="3">&nbsp;3号堆垛机</label>-->
<!--            <label><input type="radio" name="crnSelect" value="4">&nbsp;4号堆垛机</label>-->
<!--            <label><input type="radio" name="crnSelect" value="5">&nbsp;5号堆垛机</label>-->
<!--            <label><input type="radio" name="crnSelect" value="6">&nbsp;6号堆垛机</label>-->
<!--          </div>-->
<!--        </div>-->
        <!-- 源站/源库位 选择 -->
        <div id="source-select" class="operator-item">
          <span class="select-title">源站/源库位</span>
          <div class="select-container">
            <div class="select-container-item">
              <span>站</span>
              <label><input id="sourceStaNo" type="number" name="points" min="0" /></label>
            </div>
            <div class="select-container-item">
              <span>排</span>
              <label><input id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>
            </div>
            <div class="select-container-item">
              <span>列</span>
              <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>
            </div>
            <div class="select-container-item">
              <span>层</span>
              <label><input id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>
            </div>
          </div>
        </div>
        <!-- 目标站/目标库位 选择 -->
        <div id="target-select" class="operator-item">
          <span class="select-title">目标站/目标库位</span>
          <div class="select-container">
            <div class="select-container-item">
              <span>站</span>
              <label><input id="staNo" type="number" name="points" min="0" /></label>
            </div>
            <div class="select-container-item">
              <span>排</span>
              <label><input id="row" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>
            </div>
            <div class="select-container-item">
              <span>列</span>
              <label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>
            </div>
            <div class="select-container-item">
              <span>层</span>
              <label><input id="lev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>
            </div>
          </div>
        </div>
<!--        <div id="source-select" class="operator-item">-->
<!--          <span class="select-title">源站/源库位</span>-->
<!--          <div class="select-container">-->
<!--            <div class="select-container-item">-->
<!--              <span>站</span>-->
<!--              <label><input id="sourceStaNo" type="number" name="points" min="0" /></label>-->
<!--            </div>-->
<!--            <div class="select-container-item">-->
<!--              <span>排</span>-->
<!--              <label><input id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
<!--            </div>-->
<!--            <div class="select-container-item">-->
<!--              <span>列</span>-->
<!--              <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>-->
<!--            </div>-->
<!--            <div class="select-container-item">-->
<!--              <span>层</span>-->
<!--              <label><input id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
<!--            </div>-->
<!--          </div>-->
<!--        </div>-->
<!--        &lt;!&ndash; 目标站/目标库位 选择 &ndash;&gt;-->
<!--        <div id="target-select" class="operator-item">-->
<!--          <span class="select-title">目标站/目标库位</span>-->
<!--          <div class="select-container">-->
<!--            <div class="select-container-item">-->
<!--              <span>站</span>-->
<!--              <label><input id="staNo" type="number" name="points" min="0" /></label>-->
<!--            </div>-->
<!--            <div class="select-container-item">-->
<!--              <span>排</span>-->
<!--              <label><input id="row" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
<!--            </div>-->
<!--            <div class="select-container-item">-->
<!--              <span>列</span>-->
<!--              <label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>-->
<!--            </div>-->
<!--            <div class="select-container-item">-->
<!--              <span>层</span>-->
<!--              <label><input id="lev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
<!--            </div>-->
<!--          </div>-->
<!--        </div>-->
      </div>
      <!-- 设备任务操作 -->
      <div class="task-operator">
        <fieldset>
          <legend>手动操作</legend>
          <div class="button-group">
            <button class="item" onclick="put()">入库</button>
            <button class="item" onclick="take()">出库</button>
            <button class="item" onclick="stockMove()">库位转移</button>
            <button class="item" onclick="siteMove()">站到站</button>
            <!--                <button class="item" onclick="bacOrigin()">回原点</button>-->
            <!--                <button class="item" onclick="reverseOrigin()">反原点</button>-->
            <button class="item" onclick="coorMove()">坐标移行</button>
            <button class="item" onclick="taskComplete()">任务完成</button>
            <!--                <button class="item" onclick="pause()">暂停</button>-->
            <!--                <button class="item" onclick="boot()">启动</button>-->
            <button class="item" onclick="clearCommand()">清除命令</button>
            <button class="item" onclick="handleReset()">复位</button>
          </div>
        </fieldset>
      </div>
<!--      &lt;!&ndash; 设备任务操作 &ndash;&gt;-->
<!--      <div class="task-operator">-->
<!--        <fieldset>-->
<!--          <legend>手动操作</legend>-->
<!--          <div class="button-group">-->
<!--            <button class="item" onclick="put()">入库</button>-->
<!--            <button class="item" onclick="take()">出库</button>-->
<!--            <button class="item" onclick="stockMove()">库位转移</button>-->
<!--            <button class="item" onclick="siteMove()">站到站</button>-->
<!--            &lt;!&ndash;                <button class="item" onclick="bacOrigin()">回原点</button>&ndash;&gt;-->
<!--            &lt;!&ndash;                <button class="item" onclick="reverseOrigin()">反原点</button>&ndash;&gt;-->
<!--            <button class="item" onclick="coorMove()">坐标移行</button>-->
<!--            <button class="item" onclick="taskComplete()">任务完成</button>-->
<!--            &lt;!&ndash;                <button class="item" onclick="pause()">暂停</button>&ndash;&gt;-->
<!--            &lt;!&ndash;                <button class="item" onclick="boot()">启动</button>&ndash;&gt;-->
<!--            <button class="item" onclick="clearCommand()">清除命令</button>-->
<!--            <button class="item" onclick="handleReset()">复位</button>-->
<!--          </div>-->
<!--        </fieldset>-->
<!--      </div>-->
    </div>
    <!-- 堆垛机日志输出 -->