#
Junjie
2025-11-27 9e715c16b49a066e627d150fb2d973a8562db8dc
#
2个文件已修改
94 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConsoleController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/watch/console.html 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -148,7 +148,8 @@
            CrnLatestDataVo vo = new CrnLatestDataVo();
            vo.setCrnId(crnProtocol.getCrnNo()); // 堆垛机编号
            vo.setOffset((double) new Random().nextInt(560)); // 堆垛机偏移量
            // 使用实际列值作为偏移参考,避免随机坐标导致界面漂移
            vo.setOffset(Double.valueOf(crnProtocol.getBay()));
            vo.setBay(crnProtocol.getBay()); // 当前列
            /**
             * 堆垛机状态判断
src/main/webapp/views/watch/console.html
@@ -65,8 +65,8 @@
                                </div>
                                <div v-else-if="col.type == 'crn'">
                                    <div class="crn-item" v-if="getDeviceNo(col.value) != -1" :style="{width: col.width}" :id="'crn-' + getDeviceNo(col.value)" @click="openCrn(getDeviceNo(col.value))">{{getDeviceNo(col.value)}}</div>
                                    <div class="track-item" v-if="getTrackSiteNo(col.value) == -1"></div>
                                    <div class="track-item" v-else :id="'crnTrackSiteNo-' + getTrackSiteNo(col.value)"></div>
                                    <div class="track-item track-crn" v-if="getTrackSiteNo(col.value) == -1"></div>
                                    <div class="track-item track-crn" v-else :id="'crnTrackSiteNo-' + getTrackSiteNo(col.value)"></div>
                                </div>
                            </td>
@@ -90,7 +90,6 @@
                    currentLev: 1,
                    systemStatus: true,//系统运行状态
                    consoleInterval: null,//定时器存储变量
                    crnInitPosition: [],
                    rgvPosition: [],
                    activateCard: 'crn',
                    crnParam: {
@@ -224,43 +223,39 @@
                                if (res.code === 200) {
                                    var crns = res.data;
                                    if (that.crnInitPosition.length == 0) {
                                        let position = []
                                        for (var i = 0; i < crns.length; i++) {
                                            var crnEl = $("#crn-" + crns[i].crnId);
                                            if(crnEl.offset() == undefined) {
                                                continue;
                                            }
                                            position.push({
                                                id: crns[i].crnId,
                                                left: crnEl.offset().left + crnEl.width()
                                            })
                                        }
                                        that.crnInitPosition = position
                                        return;
                                    }
                                    let crnList = []
                                    for (var i = 0; i < crns.length; i++) {
                                        var crnEl = $("#crn-" + crns[i].crnId);
                                        crnEl.attr("class", "crn-item " + crns[i].crnStatus);
                                        if (crns[i].bay < 0 || crns[i].bay === -2) {
                                            crns[i].bay = 1
                                        let bay = parseInt(crns[i].bay, 10);
                                        if (isNaN(bay) || bay < 1 || bay === -2) {
                                            bay = 1;
                                        }
                                        let basePosition = 0;
                                        that.crnInitPosition.forEach((item) => {
                                            if (item.id == crns[i].crnId) {
                                                basePosition = item.left
                                            }
                                        })
                                        var offSet = crns[i].offset;
                                        let finalOffset = basePosition + offSet;
                                        if (finalOffset < basePosition) {
                                            finalOffset = basePosition;
                                        // 根据列值定位到当前行的目标单元格,避免随机偏移导致的误差
                                        let targetCell = that.getCrnTargetCell(crnEl, bay);
                                        if (!targetCell || targetCell.length === 0) {
                                            continue;
                                        }
                                        if (targetCell.offset() == undefined) {
                                            continue;
                                        }
                                        if (crnEl.offsetParent().offset() == undefined) {
                                            continue;
                                        }
                                        let parentLeft = crnEl.offsetParent().offset().left;
                                        let cellLeft = targetCell.offset().left - parentLeft;
                                        let offsetWithinCell = (targetCell.outerWidth() - crnEl.outerWidth()) / 2;
                                        let zoomFactor = that.mapSettingParam.zoom ? (that.mapSettingParam.zoom / 100) : 1;
                                        if (zoomFactor <= 0) { zoomFactor = 1; }
                                        let finalOffset = (cellLeft + offsetWithinCell) / zoomFactor;
                                        if(finalOffset < 0) {
                                            finalOffset = 0;
                                        }
                                        crnEl.animate({left: finalOffset + 'px'}, 1000);
                                        crnList.push({
@@ -426,6 +421,38 @@
                            }
                        });
                    },
                    getCrnTargetCell(crnEl, bay) {
                        if (!crnEl || bay == null) {
                            return null;
                        }
                        let rowEl = crnEl.closest('tr');
                        if (!rowEl || rowEl.length === 0) {
                            return null;
                        }
                        let targetCell = null;
                        let colCounter = 0;
                        let startCount = false;
                        rowEl.find('td').each(function () {
                            // 以当前行中首次出现的track-item为起点进行列计数
                            const isTrackCrn = $(this).find('.track-crn').length > 0;
                            if (!startCount && !isTrackCrn) {
                                return;
                            }
                            let span = parseInt($(this).attr('colspan'), 10);
                            if (isNaN(span) || span < 1) {
                                span = 1;
                            }
                            if (!startCount && isTrackCrn) {
                                startCount = true;
                            }
                            colCounter += span;
                            if (targetCell == null && colCounter >= bay) {
                                targetCell = $(this);
                                return false;
                            }
                        });
                        return targetCell;
                    },
                    getDeviceNo(obj) {
                        if (this.isJson(obj)) {
                            let data = JSON.parse(obj)