#
Junjie
2025-11-27 9e715c16b49a066e627d150fb2d973a8562db8dc
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)