kd-curve-v2 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -1,14 +1,11 @@
1
- import { cloneDeep, debounce, merge } from 'lodash-es';
1
+ import { cloneDeep, debounce } from 'lodash-es';
2
2
  import * as echarts from 'echarts';
3
- import { InputNumber, DatePicker, Tabs, TabPane } from 'element-ui';
3
+ import { InputNumber, DatePicker, Tabs, TabPane, Icon } from 'element-ui';
4
4
  import draggable from 'vuedraggable';
5
5
  import vClickOutside from 'v-click-outside';
6
6
  import Vue from 'vue';
7
7
  import { addListener, removeListener } from 'resize-detector';
8
8
 
9
- function isNumeric(val) {
10
- return val != null && val !== "" && !Number.isNaN(Number(val));
11
- }
12
9
  function pxToNumber(pxStr) {
13
10
  if (!pxStr || typeof pxStr !== "string") return 0;
14
11
  return parseFloat(pxStr.replace("px", "")) || 0;
@@ -281,6 +278,56 @@ const getCssVariable = name => {
281
278
  return getComputedStyle(document.body).getPropertyValue(name).trim();
282
279
  };
283
280
 
281
+ /**
282
+ * 对数组按depth进行拆分,当遇到不是递增的点时进行拆分
283
+ * @param {Array} arr - 要拆分的数组
284
+ * @param {string} key - 要检查的字段名,默认为'depth'
285
+ * @returns {Array} 拆分后的数组,每个子数组内的元素都保持递增
286
+ */
287
+ function splitArrayByDepth(arr, key = "depth") {
288
+ if (!arr || !Array.isArray(arr)) {
289
+ return [];
290
+ }
291
+ if (arr.length < 2) {
292
+ return [arr];
293
+ }
294
+ const result = [];
295
+ function processSegment(segment) {
296
+ if (segment.length < 2) {
297
+ if (segment.length === 1) {
298
+ result.push([segment[0]]);
299
+ }
300
+ return;
301
+ }
302
+ const splitIndices = [];
303
+ for (let i = 1; i < segment.length; i++) {
304
+ const prevDepth = Number(segment[i - 1][key]);
305
+ const currDepth = Number(segment[i][key]);
306
+ if (currDepth < prevDepth) {
307
+ splitIndices.push(i);
308
+ }
309
+ }
310
+ if (splitIndices.length === 0) {
311
+ result.push(segment);
312
+ return;
313
+ }
314
+ let startIndex = 0;
315
+ for (const splitIndex of splitIndices) {
316
+ const subSegment = segment.slice(startIndex, splitIndex);
317
+ if (subSegment.length > 0) {
318
+ result.push(subSegment);
319
+ }
320
+ startIndex = splitIndex;
321
+ }
322
+ const lastSegment = segment.slice(startIndex);
323
+ if (lastSegment.length > 0) {
324
+ result.push(lastSegment);
325
+ }
326
+ }
327
+ processSegment(arr);
328
+ return result;
329
+ }
330
+
284
331
  /**
285
332
  * 计算数组对象中某个数值属性的 最小间隔、最大间隔、最值
286
333
  * @param {Array} arr 目标数组
@@ -295,7 +342,10 @@ const getAttrGap = (arr, key) => {
295
342
  max: null,
296
343
  minGap: null,
297
344
  maxGap: null,
298
- sortedList: arr || []
345
+ avgGap: null,
346
+ // 新增:平均间隔(去除离群值后)
347
+ sortedList: arr || [],
348
+ gaps: []
299
349
  };
300
350
  }
301
351
 
@@ -307,7 +357,9 @@ const getAttrGap = (arr, key) => {
307
357
  max: null,
308
358
  minGap: null,
309
359
  maxGap: null,
310
- sortedList: validList
360
+ avgGap: null,
361
+ sortedList: validList,
362
+ gaps: []
311
363
  };
312
364
  }
313
365
 
@@ -325,24 +377,58 @@ const getAttrGap = (arr, key) => {
325
377
  gaps.push(gap < 0 ? -gap : gap); // 取绝对值
326
378
  }
327
379
 
328
- // 6. 最小/最大间隔
329
- const minGap = Math.min(...gaps);
330
- const maxGap = Math.max(...gaps);
380
+ // 6. 移除离群值并计算平均间隔
381
+ let filteredGaps = [...gaps];
382
+ let avgGap = null;
383
+ if (filteredGaps.length > 1) {
384
+ // 计算平均值
385
+ const mean = filteredGaps.reduce((sum, gap) => sum + gap, 0) / filteredGaps.length;
386
+
387
+ // 计算标准差
388
+ const variance = filteredGaps.reduce((sum, gap) => sum + Math.pow(gap - mean, 2), 0) / filteredGaps.length;
389
+ const stdDev = Math.sqrt(variance);
390
+
391
+ // 使用3倍标准差作为阈值移除离群值
392
+ const threshold = 3 * stdDev;
393
+ filteredGaps = filteredGaps.filter(gap => Math.abs(gap - mean) <= threshold);
394
+
395
+ // 重新计算过滤后的平均间隔
396
+ if (filteredGaps.length > 0) {
397
+ avgGap = filteredGaps.reduce((sum, gap) => sum + gap, 0) / filteredGaps.length;
398
+ }
399
+ } else if (filteredGaps.length === 1) {
400
+ avgGap = filteredGaps[0];
401
+ }
402
+
403
+ // 7. 最小/最大间隔(使用过滤后的数据)
404
+ const minGap = filteredGaps.length > 0 ? Math.min(...filteredGaps) : null;
405
+ const maxGap = filteredGaps.length > 0 ? Math.max(...filteredGaps) : null;
331
406
  return {
332
407
  min,
333
408
  // 属性最小值
334
409
  max,
335
410
  // 属性最大值
336
411
  minGap,
337
- // 相邻最小间隔
412
+ // 相邻最小间隔(去除离群值后)
338
413
  maxGap,
339
- // 相邻最大间隔
414
+ // 相邻最大间隔(去除离群值后)
415
+ avgGap,
416
+ // 平均间隔(去除离群值后)
340
417
  sortedList,
341
418
  // 排序后的属性值
342
- gaps // 所有间隔(可选)
419
+ gaps: filteredGaps // 过滤后的所有间隔
343
420
  };
344
421
  };
345
422
 
423
+ // 判断是否为数字
424
+ const isNumeric = value => {
425
+ // 第一步:先转数字
426
+ const num = Number(value);
427
+
428
+ // 第二步:必须是数字 && 不是 NaN && 不是无穷大
429
+ return typeof num === "number" && !isNaN(num) && isFinite(num);
430
+ };
431
+
346
432
  //
347
433
  const SLIDER_GROUP_ID = "depthSliderGroup";
348
434
 
@@ -451,6 +537,10 @@ var script$b = {
451
537
  type: String,
452
538
  default: "gray",
453
539
  },
540
+ cachedCurveDatas: {
541
+ type: Object,
542
+ default: () => {},
543
+ },
454
544
  },
455
545
 
456
546
  data() {
@@ -486,11 +576,40 @@ var script$b = {
486
576
  // 滑块平滑动画相关
487
577
  targetSliderIndex: 0,
488
578
  sliderAnimationId: null,
579
+ // 缓存的曲线数据
580
+ cachedCurveData: [],
489
581
  };
490
582
  },
491
583
 
492
584
  computed: {
493
585
  currentModeData() {
586
+ // 如果有curveDatas数据,优先使用
587
+ if (this.cachedCurveData && this.cachedCurveData.length > 0) {
588
+ const modeConfig = this.getCurrentModeConfig();
589
+ if (modeConfig && modeConfig.datas && modeConfig.datas.length > 0) {
590
+ // 根据xCode和yCode构建series数据
591
+ return {
592
+ mode: this.mode,
593
+ axisType: modeConfig.axisType,
594
+ datas: modeConfig.datas.map((curveConfig) => {
595
+ const xCode = curveConfig.xCode || "timestamp";
596
+ const yCode = curveConfig.yCode;
597
+ return {
598
+ xName: curveConfig.xName,
599
+ yName: curveConfig.yName,
600
+ xCode: xCode,
601
+ yCode: yCode,
602
+ data: this.cachedCurveData.map((item) => ({
603
+ time: item[xCode] || item.timestamp,
604
+ value: item[yCode] || 0,
605
+ })),
606
+ };
607
+ }),
608
+ };
609
+ }
610
+ }
611
+
612
+ // 降级到原始的depthTimeChartData
494
613
  const modeData = this.depthTimeChartData.find((item) => item.mode === this.mode);
495
614
  return modeData || { datas: [] };
496
615
  },
@@ -527,6 +646,81 @@ var script$b = {
527
646
  });
528
647
  },
529
648
  },
649
+ cachedCurveDatas: {
650
+ deep: true,
651
+ immediate:true,
652
+ async handler(newVal) {
653
+ if (!newVal) return;
654
+ await this.$nextTick();
655
+
656
+ const data = newVal && newVal.data ? (Array.isArray(newVal.data) ? newVal.data : [newVal.data]) : [];
657
+ const direction = newVal.direction || "bottom";
658
+
659
+ if (newVal.type === "replace") {
660
+ // 替换模式:直接替换所有数据
661
+ let processedData = data.map((item) => {
662
+ const modeConfig = this.getCurrentModeConfig();
663
+ if (modeConfig && modeConfig.datas && modeConfig.datas.length > 0) {
664
+ const xCode = modeConfig.datas[0].xCode || "timestamp";
665
+ return {
666
+ ...item,
667
+ [xCode]: this.toMillisecondTimestamp(item[xCode] || item.timestamp),
668
+ };
669
+ }
670
+ return {
671
+ ...item,
672
+ timestamp: this.toMillisecondTimestamp(item.timestamp),
673
+ };
674
+ });
675
+
676
+ this.cachedCurveData = processedData;
677
+
678
+ // 当获取replace数据时,将页面定位到最后一条数据
679
+ if (this.cachedCurveData.length > 0) {
680
+ this.sliderIndex = this.cachedCurveData.length - 1;
681
+ this.startIndex = Math.max(0, this.cachedCurveData.length - this.windowSize);
682
+ this.targetStartIndex = this.startIndex;
683
+ }
684
+ } else {
685
+ // 添加模式:根据direction插入数据
686
+ let processedData = data.map((item) => {
687
+ const modeConfig = this.getCurrentModeConfig();
688
+ if (modeConfig && modeConfig.datas && modeConfig.datas.length > 0) {
689
+ const xCode = modeConfig.datas[0].xCode || "timestamp";
690
+ return {
691
+ ...item,
692
+ [xCode]: this.toMillisecondTimestamp(item[xCode] || item.timestamp),
693
+ };
694
+ }
695
+ return {
696
+ ...item,
697
+ timestamp: this.toMillisecondTimestamp(item.timestamp),
698
+ };
699
+ });
700
+
701
+ const modeConfig = this.getCurrentModeConfig();
702
+ const uniqueKey = modeConfig && modeConfig.datas && modeConfig.datas.length > 0
703
+ ? (modeConfig.datas[0].xCode || "timestamp")
704
+ : "timestamp";
705
+
706
+ if (direction === "top") {
707
+ const tempData = [...processedData, ...this.cachedCurveData];
708
+ this.cachedCurveData = this.deduplicateByUniqueKey([], tempData, uniqueKey);
709
+ } else {
710
+ this.cachedCurveData = this.deduplicateByUniqueKey(this.cachedCurveData, processedData, uniqueKey);
711
+ }
712
+ }
713
+ console.log(this.cachedCurveData, 'cachedCurveData');
714
+ // 更新滑块位置
715
+ if (this.cachedCurveData.length > 0 && newVal.type !== "replace") {
716
+ this.sliderIndex = this.cachedCurveData.length - 1;
717
+ this.startIndex = Math.max(0, this.cachedCurveData.length - this.windowSize);
718
+ this.targetStartIndex = this.startIndex;
719
+ }
720
+
721
+ this.renderChart();
722
+ },
723
+ },
530
724
  depthTimeChartData: {
531
725
  deep: true,
532
726
  handler() {
@@ -603,6 +797,33 @@ var script$b = {
603
797
  }
604
798
  },
605
799
  methods: {
800
+ // 获取当前mode的配置
801
+ getCurrentModeConfig() {
802
+ if (!this.mode) return null;
803
+ return this.depthTimeChartData.find((item) => item.mode === this.mode);
804
+ },
805
+
806
+ deduplicateByUniqueKey(existingData, newData, uniqueKey) {
807
+ const newDataArr = Array.isArray(newData) ? newData : [newData];
808
+
809
+ let resultData = JSON.parse(JSON.stringify(existingData));
810
+
811
+ const existingKeys = new Set(resultData.map((item) => item[uniqueKey]));
812
+
813
+ newDataArr.forEach((newItem) => {
814
+ if (!newItem || !newItem[uniqueKey]) return;
815
+
816
+ if (!existingKeys.has(newItem[uniqueKey])) {
817
+ resultData.push(newItem);
818
+ existingKeys.add(newItem[uniqueKey]);
819
+ }
820
+ });
821
+
822
+ resultData.sort((a, b) => a[uniqueKey] - b[uniqueKey]);
823
+
824
+ return resultData;
825
+ },
826
+
606
827
  handleModeChange() {
607
828
  this.resetData();
608
829
  this.visibleDataRangeChange({ firstValue: this.topValue, lastValue: this.bottomValue });
@@ -631,7 +852,7 @@ var script$b = {
631
852
  // lastValue 大于最大值,停留在底部
632
853
  targetIndex = rows.length - 1;
633
854
  } else {
634
- let averageTs = (firstTs+lastTs)/2;
855
+ let averageTs = (firstTs + lastTs) / 2;
635
856
  // 在范围内,找最接近的位置
636
857
  let minDiff = Infinity;
637
858
  for (let i = 0; i < rows.length; i++) {
@@ -657,7 +878,7 @@ var script$b = {
657
878
  // lastValue 大于最大值,停留在底部
658
879
  targetIndex = rows.length - 1;
659
880
  } else {
660
- let averageValue = (firstValue+lastValue)/2;
881
+ let averageValue = (firstValue + lastValue) / 2;
661
882
  // 在范围内,找最接近的位置
662
883
  let minDiff = Infinity;
663
884
  for (let i = 0; i < rows.length; i++) {
@@ -684,8 +905,8 @@ var script$b = {
684
905
  this.labelPos.line1 = line1;
685
906
  this.labelPos.line2 = line2;
686
907
  } else {
687
- let firstIndex = rows.findIndex(item => item.raw.value === data.firstValue);
688
- let lastIndex = rows.findIndex(item => item.raw.value === data.lastValue);
908
+ let firstIndex = rows.findIndex((item) => item.raw.value === data.firstValue);
909
+ let lastIndex = rows.findIndex((item) => item.raw.value === data.lastValue);
689
910
  let firstValue = firstIndex !== -1 ? rows[firstIndex].raw.time : "";
690
911
  let lastValue = lastIndex !== -1 ? rows[lastIndex].raw.time : "";
691
912
  const dt1 = parseTimeLabel(firstValue);
@@ -695,7 +916,7 @@ var script$b = {
695
916
  this.labelPos.line1 = line1;
696
917
  this.labelPos.line2 = line2;
697
918
  }
698
-
919
+
699
920
  // 重新绘制滑块,根据顶部和底部时间调整高度
700
921
  this.redrawSliderWithRange(data.firstValue, data.lastValue);
701
922
  },
@@ -1018,16 +1239,34 @@ var script$b = {
1018
1239
  this.emitSliderPoint();
1019
1240
  this.showTooltipBySlider(true);
1020
1241
  };
1242
+ this._onZrClick = (e) => {
1243
+ // 点击时移动滑块到点击位置
1244
+ const g = this.findSliderGroup(e.target);
1245
+ if (g) return; // 点击在滑块上,不处理
1246
+
1247
+ const rect = this.getGridRect();
1248
+ const y = e.offsetY;
1249
+ if (y < 0 || y > rect.height) return;
1250
+
1251
+ const idx = this.nearestIndexByPixelY(y);
1252
+ if (idx !== this.sliderIndex) {
1253
+ this.sliderIndex = idx;
1254
+ this.smoothMoveSlider(idx);
1255
+ this.emitSliderChanging();
1256
+ this.refreshOverlayGeometry();
1257
+ this.emitSliderPoint();
1258
+ this.showTooltipBySlider(true);
1259
+ }
1260
+ };
1021
1261
  zr.on("drag", this._onZrDrag);
1022
1262
  zr.on("dragend", this._onZrDragEnd);
1263
+ zr.on("click", this._onZrClick);
1023
1264
  this.zrDragBound = true;
1024
1265
  },
1025
1266
  emitSliderChanging() {
1026
- console.log(this.sliderIndex,'this.sliderIndex');
1027
1267
  const row = this.resolvedRows[this.sliderIndex];
1028
1268
  if (!row) return;
1029
1269
 
1030
- // Get values for all series at the current index
1031
1270
  const allValues = this.currentModeData.datas.map((series) => {
1032
1271
  const seriesData = series.data[this.sliderIndex];
1033
1272
  return {
@@ -1048,6 +1287,7 @@ var script$b = {
1048
1287
  const zr = this.chart.getZr();
1049
1288
  zr.off("drag", this._onZrDrag);
1050
1289
  zr.off("dragend", this._onZrDragEnd);
1290
+ zr.off("click", this._onZrClick);
1051
1291
  this.zrDragBound = false;
1052
1292
  },
1053
1293
 
@@ -1131,7 +1371,7 @@ var script$b = {
1131
1371
  // 时间轴模式
1132
1372
  const topTs = toMillisecondTimestamp(this.topValue);
1133
1373
  const bottomTs = toMillisecondTimestamp(this.bottomValue);
1134
-
1374
+
1135
1375
  // 找最接近的顶部索引
1136
1376
  let minTopDiff = Infinity;
1137
1377
  for (let i = 0; i < rows.length; i++) {
@@ -1142,7 +1382,7 @@ var script$b = {
1142
1382
  topIndex = i;
1143
1383
  }
1144
1384
  }
1145
-
1385
+
1146
1386
  // 找最接近的底部索引
1147
1387
  let minBottomDiff = Infinity;
1148
1388
  for (let i = 0; i < rows.length; i++) {
@@ -1157,7 +1397,7 @@ var script$b = {
1157
1397
  // 数值轴模式
1158
1398
  const topValue = Number(this.topValue);
1159
1399
  const bottomValue = Number(this.bottomValue);
1160
-
1400
+
1161
1401
  // 找最接近的顶部索引
1162
1402
  let minTopDiff = Infinity;
1163
1403
  for (let i = 0; i < rows.length; i++) {
@@ -1168,7 +1408,7 @@ var script$b = {
1168
1408
  topIndex = i;
1169
1409
  }
1170
1410
  }
1171
-
1411
+
1172
1412
  // 找最接近的底部索引
1173
1413
  let minBottomDiff = Infinity;
1174
1414
  for (let i = 0; i < rows.length; i++) {
@@ -1269,22 +1509,19 @@ var script$b = {
1269
1509
  { replaceMerge: ["graphic"] }, // ⭐关键
1270
1510
  );
1271
1511
  },
1272
-
1512
+
1273
1513
  // 快速重新绘制滑块,高度根据 topValue 和 bottomValue 计算
1274
1514
  redrawSliderWithRange(topValue, bottomValue) {
1275
1515
  if (!this.chart) return;
1276
-
1516
+
1277
1517
  // 更新顶部和底部值
1278
1518
  this.topValue = topValue;
1279
1519
  this.bottomValue = bottomValue;
1280
-
1520
+
1281
1521
  // 重新构建并同步滑块图形
1282
1522
  const graphic = this.buildSliderGraphic();
1283
-
1284
- this.chart.setOption(
1285
- { graphic },
1286
- { replaceMerge: ["graphic"] },
1287
- );
1523
+
1524
+ this.chart.setOption({ graphic }, { replaceMerge: ["graphic"] });
1288
1525
  },
1289
1526
 
1290
1527
  emitSliderPoint() {
@@ -1292,9 +1529,9 @@ var script$b = {
1292
1529
  const row = rows[this.sliderIndex];
1293
1530
  if (!row) return;
1294
1531
 
1295
- // Get values for all series at the current index
1296
- const allValues = this.currentModeData.datas.map((series) => {
1297
- const seriesData = series.data[this.sliderIndex];
1532
+ const datas = this.currentModeData.datas || [];
1533
+ const allValues = datas.map((series) => {
1534
+ const seriesData = series.data && series.data[this.sliderIndex];
1298
1535
  return {
1299
1536
  name: series.yName,
1300
1537
  value: seriesData ? seriesData.value : null,
@@ -1324,7 +1561,7 @@ var script$b = {
1324
1561
  const seriesData = this.currentModeData.datas.map((series) => {
1325
1562
  return {
1326
1563
  name: series.yName,
1327
- data: series.data.slice(this.startIndex, endIndex).map((item) => [item.value, item.time]),
1564
+ data: (series.data || []).slice(this.startIndex, endIndex).map((item) => [item.value, item.time]),
1328
1565
  };
1329
1566
  });
1330
1567
 
@@ -1564,7 +1801,7 @@ function styleInject(css, ref) {
1564
1801
  }
1565
1802
  }
1566
1803
 
1567
- var css_248z$c = "@charset \"UTF-8\";\n.wrap[data-v-b8062dec] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.header[data-v-b8062dec] {\n flex-shrink: 0;\n padding: 12px 14px 14px 10px;\n display: flex;\n gap: 10px;\n border-bottom: 1px solid var(--split-line-color);\n}\n.header .radio-group[data-v-b8062dec] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.chart-wrap[data-v-b8062dec] {\n flex: 1;\n min-height: 200px;\n position: relative;\n overflow: hidden;\n}\n.chart[data-v-b8062dec] {\n width: 100%;\n height: 100%;\n}\n.label-float[data-v-b8062dec] {\n width: calc(100% - 10px) !important;\n position: absolute;\n z-index: 20;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.label-card[data-v-b8062dec] {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n.label-row[data-v-b8062dec] {\n min-width: 176px;\n font-size: 12px;\n height: 23px;\n /* 与 JS rowH 保持一致 */\n line-height: 23px;\n color: var(--text-color);\n font-family: \"Microsoft YaHei\", \"PingFang SC\", sans-serif;\n white-space: nowrap;\n}";
1804
+ var css_248z$c = "@charset \"UTF-8\";\n.wrap[data-v-450f5f1f] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.header[data-v-450f5f1f] {\n flex-shrink: 0;\n padding: 12px 14px 14px 10px;\n display: flex;\n gap: 10px;\n border-bottom: 1px solid var(--split-line-color);\n}\n.header .radio-group[data-v-450f5f1f] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.chart-wrap[data-v-450f5f1f] {\n flex: 1;\n min-height: 200px;\n position: relative;\n overflow: hidden;\n}\n.chart[data-v-450f5f1f] {\n width: 100%;\n height: 100%;\n}\n.label-float[data-v-450f5f1f] {\n width: calc(100% - 10px) !important;\n position: absolute;\n z-index: 20;\n pointer-events: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.label-card[data-v-450f5f1f] {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n.label-row[data-v-450f5f1f] {\n min-width: 176px;\n font-size: 12px;\n height: 23px;\n /* 与 JS rowH 保持一致 */\n line-height: 23px;\n color: var(--text-color);\n font-family: \"Microsoft YaHei\", \"PingFang SC\", sans-serif;\n white-space: nowrap;\n}";
1568
1805
  styleInject(css_248z$c);
1569
1806
 
1570
1807
  function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {
@@ -1718,7 +1955,7 @@ __vue_render__$b._withStripped = true;
1718
1955
  /* style */
1719
1956
  const __vue_inject_styles__$b = undefined;
1720
1957
  /* scoped */
1721
- const __vue_scope_id__$b = "data-v-b8062dec";
1958
+ const __vue_scope_id__$b = "data-v-450f5f1f";
1722
1959
  /* module identifier */
1723
1960
  const __vue_module_identifier__$b = undefined;
1724
1961
  /* functional template */
@@ -1762,6 +1999,7 @@ var script$a = {
1762
1999
  DatePicker,
1763
2000
  Tabs,
1764
2001
  TabPane,
2002
+ Icon,
1765
2003
  },
1766
2004
  provide() {
1767
2005
  return {
@@ -1817,13 +2055,32 @@ var script$a = {
1817
2055
  end: null,
1818
2056
  },
1819
2057
  depthDialog: {
1820
- value: null, // single depth value
2058
+ start: null, // 起始井深
2059
+ end: null, // 结束井深
1821
2060
  },
1822
2061
  //数据导出选择的tab
1823
2062
  exportName: "time",
2063
+ // 新增:井段查询输入框
2064
+ wellSectionQuery: null,
1824
2065
  };
1825
2066
  },
1826
2067
  methods: {
2068
+ // 新增:井段查询
2069
+ searchWellSection() {
2070
+ console.log(this.wellSectionQuery, "wellSectionQuery");
2071
+ if (this.wellSectionQuery == null || !isNumeric(this.wellSectionQuery)) {
2072
+ this.$message.error("请输入有效的数字");
2073
+ return;
2074
+ } else {
2075
+ if (this.wellSectionQuery < 0) {
2076
+ this.$message.error("输入的井段不能小于0m");
2077
+ return;
2078
+ }
2079
+ this.$message.success("查询成功");
2080
+ this.$emit("searchWellSection", this.wellSectionQuery);
2081
+ this.wellSectionQuery = null;
2082
+ }
2083
+ },
1827
2084
  // 新增:刷新数据,重置为初始化时的数据
1828
2085
  refresh() {
1829
2086
  Object.keys(this.initialFormCache).forEach((key) => {
@@ -1832,7 +2089,8 @@ var script$a = {
1832
2089
  console.log(this.form, this.initialFormCache);
1833
2090
  this.$emit("refresh");
1834
2091
  },
1835
- handleToolBarDataChange(data) {
2092
+ handleToolBarDataChange(content) {
2093
+ let data = cloneDeep(content);
1836
2094
  if (this.form.axisType === "depth") {
1837
2095
  let depth = Number((data.lastValue - data.firstValue).toFixed(2));
1838
2096
  let depthList = [500, 1000, 2000, 3000, 4000, 5000, 10000];
@@ -1984,7 +2242,8 @@ var script$a = {
1984
2242
  });
1985
2243
  },
1986
2244
  resetDepthDialog() {
1987
- this.depthDialog.value = null;
2245
+ this.depthDialog.start = null;
2246
+ this.depthDialog.end = null;
1988
2247
  this.$nextTick(() => {
1989
2248
  if (this.$refs.DepthFormRef) {
1990
2249
  this.$refs.DepthFormRef.clearValidate();
@@ -2056,6 +2315,14 @@ var script$a = {
2056
2315
  callback();
2057
2316
  }
2058
2317
  },
2318
+ // 验证井深段弹窗中的起始井深值大于等于0
2319
+ validateStartDepth(rule, value, callback) {
2320
+ if (value < 0) {
2321
+ callback(new Error("起始井深值不能小于0"));
2322
+ } else {
2323
+ callback();
2324
+ }
2325
+ },
2059
2326
  // 验证导出弹窗中的起始井深值大于等于0
2060
2327
  validateExportStartDepth(rule, value, callback) {
2061
2328
  if (value < 0) {
@@ -2074,8 +2341,21 @@ var script$a = {
2074
2341
  },
2075
2342
  // 验证终止井深大于起始井深
2076
2343
  validateEndDepth(rule, value, callback) {
2077
- if (value <= this.exportDepthDialog.start) {
2078
- callback(new Error("终止井深必须大于起始井深"));
2344
+ // 检查是井深段弹窗还是导出弹窗
2345
+ if (this.depthDialog.start !== null && this.depthDialog.end !== null) {
2346
+ // 井深段弹窗
2347
+ if (value <= this.depthDialog.start) {
2348
+ callback(new Error("结束井深必须大于起始井深"));
2349
+ } else {
2350
+ callback();
2351
+ }
2352
+ } else if (this.exportDepthDialog.start !== null && this.exportDepthDialog.end !== null) {
2353
+ // 导出弹窗
2354
+ if (value <= this.exportDepthDialog.start) {
2355
+ callback(new Error("终止井深必须大于起始井深"));
2356
+ } else {
2357
+ callback();
2358
+ }
2079
2359
  } else {
2080
2360
  callback();
2081
2361
  }
@@ -2085,12 +2365,17 @@ var script$a = {
2085
2365
  if (this.$refs.DepthFormRef) {
2086
2366
  this.$refs.DepthFormRef.validate((valid) => {
2087
2367
  if (valid) {
2088
- const v = Number(this.depthDialog.value);
2089
- if (isNaN(v)) {
2368
+ const start = Number(this.depthDialog.start);
2369
+ const end = Number(this.depthDialog.end);
2370
+ if (isNaN(start) || isNaN(end)) {
2090
2371
  this.$message && this.$message.warning ? this.$message.warning("请填写有效的井深值") : alert("请填写有效的井深值");
2091
2372
  return;
2092
2373
  }
2093
- const emitData = { type: 1, value: v };
2374
+ if (end <= start) {
2375
+ this.$message && this.$message.warning ? this.$message.warning("结束井深必须大于起始井深") : alert("结束井深必须大于起始井深");
2376
+ return;
2377
+ }
2378
+ const emitData = { type: 1, start, end };
2094
2379
  this.depthDialogVisible = false;
2095
2380
  // 在对话框关闭后再发射事件,避免潜在的冲突
2096
2381
  this.$nextTick(() => {
@@ -2099,12 +2384,10 @@ var script$a = {
2099
2384
  }
2100
2385
  });
2101
2386
  } else {
2102
- // 没有表单引用时的备用校验
2387
+ // 兼容旧版本,当表单不存在时的处理
2103
2388
  const v = Number(this.depthDialog.value);
2104
- if (isNaN(v) || v <= 0) {
2105
- this.$message && this.$message.warning
2106
- ? this.$message.warning(v <= 0 ? "井深值必须大于0" : "请填写有效的井深值")
2107
- : alert(v <= 0 ? "井深值必须大于0" : "请填写有效的井深值");
2389
+ if (isNaN(v)) {
2390
+ this.$message && this.$message.warning ? this.$message.warning("请填写有效的井深值") : alert("请填写有效的井深值");
2108
2391
  return;
2109
2392
  }
2110
2393
  const emitData = { type: 1, value: v };
@@ -2154,6 +2437,18 @@ var script$a = {
2154
2437
  return "深度轴类型不支持设置时间范围";
2155
2438
  }
2156
2439
  return "";
2440
+ } else if (type == "wellSectionQuery") {
2441
+ // if (this.form.axisType === "depth" && this.form.dataType === "real") {
2442
+ // return "深度轴类型+实时数据不支持设置时间范围";
2443
+ // } else if (this.form.axisType === "depth") {
2444
+ // return "深度轴类型不支持设置时间范围";
2445
+ // } else if (this.form.dataType === "real") {
2446
+ // return "实时数据不支持设置时间范围";
2447
+ // }
2448
+ if (this.form.axisType === "depth") {
2449
+ return "深度轴类型不支持井段查询";
2450
+ }
2451
+ return "";
2157
2452
  } else if (type == "depthRange") {
2158
2453
  // if (this.form.axisType === "time" && this.form.dataType === "real") {
2159
2454
  // return "时间轴类型+实时数据不支持设置井深范围";
@@ -2175,7 +2470,7 @@ var script$a = {
2175
2470
  },
2176
2471
  };
2177
2472
 
2178
- var css_248z$b = "@charset \"UTF-8\";\n.function-control-panel[data-v-9e2c85ea] {\n width: 100%;\n height: 100%;\n color: var(--text-color);\n font-size: 14px;\n overflow-x: hidden;\n overflow-y: auto;\n /* 隐藏滚动条 */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.function-control-panel[data-v-9e2c85ea]::-webkit-scrollbar {\n display: none;\n}\n.function-control-panel .radio-group[data-v-9e2c85ea] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-bottom: 8px;\n}\n.el-select-disabled[data-v-9e2c85ea] {\n opacity: 0.5;\n}\n\n/*/* 分割线 */\n.divider[data-v-9e2c85ea] {\n height: 1px;\n background: var(--border-color);\n margin-bottom: 8px;\n}\n\n/* label */\n.label[data-v-9e2c85ea] {\n color: #aaa;\n margin-bottom: 2px;\n}\n\n/* 操作按钮 */\n.actions[data-v-9e2c85ea] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.btn[data-v-9e2c85ea] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n text-align: center;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-weight: 400;\n cursor: pointer;\n}\n.btn .icon[data-v-9e2c85ea] {\n width: 54px;\n height: 54px;\n}\n.btn.disabled[data-v-9e2c85ea] {\n color: #666;\n cursor: not-allowed;\n}\n.btn.disabled .icon[data-v-9e2c85ea] {\n opacity: 0.5;\n}\n.fontColor[data-v-9e2c85ea] {\n color: var(--default-text-color);\n}";
2473
+ var css_248z$b = "@charset \"UTF-8\";\n.function-control-panel[data-v-d5ece4de] {\n width: 100%;\n height: 100%;\n color: var(--text-color);\n font-size: 14px;\n overflow-x: hidden;\n overflow-y: auto;\n /* 隐藏滚动条 */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.function-control-panel[data-v-d5ece4de]::-webkit-scrollbar {\n display: none;\n}\n.function-control-panel .radio-group[data-v-d5ece4de] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding-bottom: 8px;\n}\n.function-control-panel .elTooltipArea[data-v-d5ece4de] {\n width: 100%;\n display: flex;\n align-items: center;\n}\n.function-control-panel .elTooltipArea .searchArea[data-v-d5ece4de] {\n width: 28px;\n height: 32px;\n margin-bottom: 8px;\n background: var(--slider-gradient-color);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n}\n.function-control-panel .elTooltipArea .searchArea .searchArea-icon[data-v-d5ece4de] {\n font-size: 14px;\n color: var(--slider-content-color);\n}\n.el-select-disabled[data-v-d5ece4de] {\n opacity: 0.5;\n cursor: not-allowed !important;\n}\n\n/* 分割线 */\n.divider[data-v-d5ece4de] {\n height: 1px;\n background: var(--border-color);\n margin-bottom: 8px;\n}\n\n/* label */\n.label[data-v-d5ece4de] {\n color: #aaa;\n margin-bottom: 2px;\n}\n\n/* 操作按钮 */\n.actions[data-v-d5ece4de] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.btn[data-v-d5ece4de] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n text-align: center;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-weight: 400;\n cursor: pointer;\n}\n.btn .icon[data-v-d5ece4de] {\n width: 54px;\n height: 54px;\n}\n.btn.disabled[data-v-d5ece4de] {\n color: #666;\n cursor: not-allowed;\n}\n.btn.disabled .icon[data-v-d5ece4de] {\n opacity: 0.5;\n}\n.fontColor[data-v-d5ece4de] {\n color: var(--default-text-color);\n}";
2179
2474
  styleInject(css_248z$b);
2180
2475
 
2181
2476
  /* script */
@@ -2347,39 +2642,45 @@ var __vue_render__$a = function () {
2347
2642
  },
2348
2643
  [
2349
2644
  _c(
2350
- "el-select",
2351
- {
2352
- class: {
2353
- "el-select-disabled": _vm.form.axisType !== "depth",
2354
- },
2355
- staticStyle: { "margin-bottom": "8px" },
2356
- attrs: {
2357
- "popper-class": "kd-curve-2d-select-popup",
2358
- disabled: _vm.form.axisType !== "depth",
2359
- },
2360
- on: {
2361
- change: function ($event) {
2362
- return _vm.changeForm($event, "scale")
2363
- },
2364
- },
2365
- model: {
2366
- value: _vm.form.scale,
2367
- callback: function ($$v) {
2368
- _vm.$set(_vm.form, "scale", $$v);
2645
+ "div",
2646
+ { staticClass: "elTooltipArea" },
2647
+ [
2648
+ _c(
2649
+ "el-select",
2650
+ {
2651
+ class: {
2652
+ "el-select-disabled": _vm.form.axisType !== "depth",
2653
+ },
2654
+ staticStyle: { "margin-bottom": "8px", width: "100%" },
2655
+ attrs: {
2656
+ "popper-class": "kd-curve-2d-select-popup",
2657
+ disabled: _vm.form.axisType !== "depth",
2658
+ },
2659
+ on: {
2660
+ change: function ($event) {
2661
+ return _vm.changeForm($event, "scale")
2662
+ },
2663
+ },
2664
+ model: {
2665
+ value: _vm.form.scale,
2666
+ callback: function ($$v) {
2667
+ _vm.$set(_vm.form, "scale", $$v);
2668
+ },
2669
+ expression: "form.scale",
2670
+ },
2369
2671
  },
2370
- expression: "form.scale",
2371
- },
2372
- },
2373
- _vm._l(_vm.toolBarConfig.scaleList, function (item) {
2374
- return _c("el-option", {
2375
- key: item.value,
2376
- attrs: { label: item.label, value: item.value },
2377
- })
2378
- }),
2672
+ _vm._l(_vm.toolBarConfig.scaleList, function (item) {
2673
+ return _c("el-option", {
2674
+ key: item.value,
2675
+ attrs: { label: item.label, value: item.value },
2676
+ })
2677
+ }),
2678
+ 1
2679
+ ),
2680
+ ],
2379
2681
  1
2380
2682
  ),
2381
- ],
2382
- 1
2683
+ ]
2383
2684
  )
2384
2685
  : _vm._e(),
2385
2686
  _vm._v(" "),
@@ -2400,37 +2701,45 @@ var __vue_render__$a = function () {
2400
2701
  },
2401
2702
  [
2402
2703
  _c(
2403
- "el-select",
2404
- {
2405
- class: { "el-select-disabled": _vm.form.axisType == "depth" },
2406
- staticStyle: { "margin-bottom": "8px" },
2407
- attrs: {
2408
- "popper-class": "kd-curve-2d-select-popup",
2409
- disabled: _vm.form.axisType == "depth",
2410
- },
2411
- on: {
2412
- change: function ($event) {
2413
- return _vm.changeForm($event, "timeRange")
2414
- },
2415
- },
2416
- model: {
2417
- value: _vm.form.timeRange,
2418
- callback: function ($$v) {
2419
- _vm.$set(_vm.form, "timeRange", $$v);
2704
+ "div",
2705
+ { staticClass: "elTooltipArea" },
2706
+ [
2707
+ _c(
2708
+ "el-select",
2709
+ {
2710
+ class: {
2711
+ "el-select-disabled": _vm.form.axisType == "depth",
2712
+ },
2713
+ staticStyle: { "margin-bottom": "8px", width: "100%" },
2714
+ attrs: {
2715
+ "popper-class": "kd-curve-2d-select-popup",
2716
+ disabled: _vm.form.axisType == "depth",
2717
+ },
2718
+ on: {
2719
+ change: function ($event) {
2720
+ return _vm.changeForm($event, "timeRange")
2721
+ },
2722
+ },
2723
+ model: {
2724
+ value: _vm.form.timeRange,
2725
+ callback: function ($$v) {
2726
+ _vm.$set(_vm.form, "timeRange", $$v);
2727
+ },
2728
+ expression: "form.timeRange",
2729
+ },
2420
2730
  },
2421
- expression: "form.timeRange",
2422
- },
2423
- },
2424
- _vm._l(_vm.toolBarConfig.timeRangeList, function (item) {
2425
- return _c("el-option", {
2426
- key: item.value,
2427
- attrs: { label: item.label, value: item.value },
2428
- })
2429
- }),
2731
+ _vm._l(_vm.toolBarConfig.timeRangeList, function (item) {
2732
+ return _c("el-option", {
2733
+ key: item.value,
2734
+ attrs: { label: item.label, value: item.value },
2735
+ })
2736
+ }),
2737
+ 1
2738
+ ),
2739
+ ],
2430
2740
  1
2431
2741
  ),
2432
- ],
2433
- 1
2742
+ ]
2434
2743
  )
2435
2744
  : _vm._e(),
2436
2745
  _vm._v(" "),
@@ -2451,48 +2760,116 @@ var __vue_render__$a = function () {
2451
2760
  },
2452
2761
  [
2453
2762
  _c(
2454
- "el-select",
2455
- {
2456
- class: { "el-select-disabled": _vm.form.axisType == "time" },
2457
- staticStyle: { "margin-bottom": "8px" },
2458
- attrs: {
2459
- "popper-class": "kd-curve-2d-select-popup",
2460
- disabled: _vm.form.axisType == "time",
2461
- },
2462
- on: {
2463
- change: function ($event) {
2464
- return _vm.changeForm($event, "depthRange")
2465
- },
2466
- },
2467
- model: {
2468
- value: _vm.form.depthRange,
2469
- callback: function ($$v) {
2470
- _vm.$set(_vm.form, "depthRange", $$v);
2763
+ "div",
2764
+ { staticClass: "elTooltipArea" },
2765
+ [
2766
+ _c(
2767
+ "el-select",
2768
+ {
2769
+ class: {
2770
+ "el-select-disabled": _vm.form.axisType == "time",
2771
+ },
2772
+ staticStyle: { "margin-bottom": "8px", width: "100%" },
2773
+ attrs: {
2774
+ "popper-class": "kd-curve-2d-select-popup",
2775
+ disabled: _vm.form.axisType == "time",
2776
+ },
2777
+ on: {
2778
+ change: function ($event) {
2779
+ return _vm.changeForm($event, "depthRange")
2780
+ },
2781
+ },
2782
+ model: {
2783
+ value: _vm.form.depthRange,
2784
+ callback: function ($$v) {
2785
+ _vm.$set(_vm.form, "depthRange", $$v);
2786
+ },
2787
+ expression: "form.depthRange",
2788
+ },
2471
2789
  },
2472
- expression: "form.depthRange",
2473
- },
2474
- },
2475
- _vm._l(_vm.toolBarConfig.depthRangeList, function (item) {
2476
- return _c("el-option", {
2477
- key: item.value,
2478
- attrs: { label: item.label, value: item.value },
2479
- })
2480
- }),
2790
+ _vm._l(_vm.toolBarConfig.depthRangeList, function (item) {
2791
+ return _c("el-option", {
2792
+ key: item.value,
2793
+ attrs: { label: item.label, value: item.value },
2794
+ })
2795
+ }),
2796
+ 1
2797
+ ),
2798
+ ],
2481
2799
  1
2482
2800
  ),
2483
- ],
2484
- 1
2801
+ ]
2485
2802
  )
2486
2803
  : _vm._e(),
2487
2804
  _vm._v(" "),
2488
- _c(
2489
- "div",
2490
- { staticClass: "actions" },
2491
- [
2492
- _vm.toolBarConfig.timeRangeBtnShow !== false
2493
- ? _c(
2494
- "el-tooltip",
2495
- {
2805
+ _vm.toolBarConfig.wellSectionQueryShow !== false
2806
+ ? _c("div", { staticClass: "label" }, [_vm._v("井段查询(m):")])
2807
+ : _vm._e(),
2808
+ _vm._v(" "),
2809
+ _vm.toolBarConfig.wellSectionQueryShow !== false
2810
+ ? _c(
2811
+ "el-tooltip",
2812
+ {
2813
+ staticStyle: { position: "relative" },
2814
+ attrs: {
2815
+ disabled: !(_vm.form.axisType == "depth"),
2816
+ content: _vm.getDisableTip("wellSectionQuery"),
2817
+ placement: "right",
2818
+ effect: "dark",
2819
+ },
2820
+ },
2821
+ [
2822
+ _c(
2823
+ "div",
2824
+ { staticClass: "elTooltipArea" },
2825
+ [
2826
+ _c("el-input", {
2827
+ staticStyle: { "margin-bottom": "8px", flex: "1" },
2828
+ attrs: { disabled: _vm.form.axisType == "depth" },
2829
+ model: {
2830
+ value: _vm.wellSectionQuery,
2831
+ callback: function ($$v) {
2832
+ _vm.wellSectionQuery = $$v;
2833
+ },
2834
+ expression: "wellSectionQuery",
2835
+ },
2836
+ }),
2837
+ _vm._v(" "),
2838
+ _c(
2839
+ "div",
2840
+ {
2841
+ staticClass: "searchArea",
2842
+ class: {
2843
+ "el-select-disabled": _vm.form.axisType == "depth",
2844
+ },
2845
+ on: {
2846
+ click: function ($event) {
2847
+ return _vm.searchWellSection()
2848
+ },
2849
+ },
2850
+ },
2851
+ [
2852
+ _c("Icon", {
2853
+ staticClass: "el-icon-search searchArea-icon",
2854
+ }),
2855
+ ],
2856
+ 1
2857
+ ),
2858
+ ],
2859
+ 1
2860
+ ),
2861
+ ]
2862
+ )
2863
+ : _vm._e(),
2864
+ _vm._v(" "),
2865
+ _c(
2866
+ "div",
2867
+ { staticClass: "actions" },
2868
+ [
2869
+ _vm.toolBarConfig.timeRangeBtnShow !== false
2870
+ ? _c(
2871
+ "el-tooltip",
2872
+ {
2496
2873
  attrs: {
2497
2874
  placement: "right",
2498
2875
  effect: "dark",
@@ -2777,7 +3154,7 @@ var __vue_render__$a = function () {
2777
3154
  "el-dialog",
2778
3155
  {
2779
3156
  attrs: {
2780
- title: "设置井深",
3157
+ title: "设置井深段",
2781
3158
  visible: _vm.depthDialogVisible,
2782
3159
  width: "420px",
2783
3160
  },
@@ -2805,11 +3182,11 @@ var __vue_render__$a = function () {
2805
3182
  "el-form-item",
2806
3183
  {
2807
3184
  attrs: {
2808
- prop: "value",
3185
+ prop: "start",
2809
3186
  rules: [
2810
3187
  {
2811
3188
  required: true,
2812
- message: "请输入井深",
3189
+ message: "请输入起始井深",
2813
3190
  trigger: "blur",
2814
3191
  },
2815
3192
  {
@@ -2817,7 +3194,7 @@ var __vue_render__$a = function () {
2817
3194
  message: "请输入有效的数字",
2818
3195
  trigger: "blur",
2819
3196
  },
2820
- { validator: _vm.validateDepth, trigger: "blur" },
3197
+ { validator: _vm.validateStartDepth, trigger: "blur" },
2821
3198
  ],
2822
3199
  },
2823
3200
  },
@@ -2838,13 +3215,90 @@ var __vue_render__$a = function () {
2838
3215
  {
2839
3216
  staticClass: "fontColor",
2840
3217
  staticStyle: {
2841
- width: "50px",
3218
+ width: "80px",
3219
+ display: "flex",
3220
+ "align-items": "center",
3221
+ height: "100%",
3222
+ },
3223
+ },
3224
+ [_vm._v("起始井深:")]
3225
+ ),
3226
+ _vm._v(" "),
3227
+ _c(
3228
+ "div",
3229
+ {
3230
+ staticClass: "input-number-container",
3231
+ staticStyle: {
3232
+ flex: "1",
3233
+ height: "100%",
3234
+ display: "flex",
3235
+ "align-items": "center",
3236
+ },
3237
+ },
3238
+ [
3239
+ _c("InputNumber", {
3240
+ staticStyle: { width: "100%", height: "100%" },
3241
+ attrs: { min: 0, step: 1 },
3242
+ model: {
3243
+ value: _vm.depthDialog.start,
3244
+ callback: function ($$v) {
3245
+ _vm.$set(_vm.depthDialog, "start", $$v);
3246
+ },
3247
+ expression: "depthDialog.start",
3248
+ },
3249
+ }),
3250
+ ],
3251
+ 1
3252
+ ),
3253
+ ]
3254
+ ),
3255
+ ]
3256
+ ),
3257
+ _vm._v(" "),
3258
+ _c(
3259
+ "el-form-item",
3260
+ {
3261
+ attrs: {
3262
+ prop: "end",
3263
+ rules: [
3264
+ {
3265
+ required: true,
3266
+ message: "请输入结束井深",
3267
+ trigger: "blur",
3268
+ },
3269
+ {
3270
+ type: "number",
3271
+ message: "请输入有效的数字",
3272
+ trigger: "blur",
3273
+ },
3274
+ { validator: _vm.validateEndDepth, trigger: "blur" },
3275
+ ],
3276
+ },
3277
+ },
3278
+ [
3279
+ _c(
3280
+ "div",
3281
+ {
3282
+ staticStyle: {
3283
+ display: "flex",
3284
+ "align-items": "center",
3285
+ gap: "12px",
3286
+ height: "32px",
3287
+ },
3288
+ },
3289
+ [
3290
+ _c(
3291
+ "div",
3292
+ {
3293
+ staticClass: "fontColor",
3294
+ staticStyle: {
3295
+ width: "80px",
2842
3296
  display: "flex",
2843
3297
  "align-items": "center",
2844
3298
  height: "100%",
2845
3299
  },
2846
3300
  },
2847
- [_vm._v("井深:")]
3301
+ [_vm._v("结束井深:")]
2848
3302
  ),
2849
3303
  _vm._v(" "),
2850
3304
  _c(
@@ -2863,11 +3317,11 @@ var __vue_render__$a = function () {
2863
3317
  staticStyle: { width: "100%", height: "100%" },
2864
3318
  attrs: { min: 0, step: 1 },
2865
3319
  model: {
2866
- value: _vm.depthDialog.value,
3320
+ value: _vm.depthDialog.end,
2867
3321
  callback: function ($$v) {
2868
- _vm.$set(_vm.depthDialog, "value", $$v);
3322
+ _vm.$set(_vm.depthDialog, "end", $$v);
2869
3323
  },
2870
- expression: "depthDialog.value",
3324
+ expression: "depthDialog.end",
2871
3325
  },
2872
3326
  }),
2873
3327
  ],
@@ -3275,7 +3729,7 @@ __vue_render__$a._withStripped = true;
3275
3729
  /* style */
3276
3730
  const __vue_inject_styles__$a = undefined;
3277
3731
  /* scoped */
3278
- const __vue_scope_id__$a = "data-v-9e2c85ea";
3732
+ const __vue_scope_id__$a = "data-v-d5ece4de";
3279
3733
  /* module identifier */
3280
3734
  const __vue_module_identifier__$a = undefined;
3281
3735
  /* functional template */
@@ -3491,7 +3945,9 @@ var script$8 = {
3491
3945
  },
3492
3946
  watch: {
3493
3947
  group(group) {
3494
- this.chart.group = group;
3948
+ if (this.chart) {
3949
+ this.chart.group = group;
3950
+ }
3495
3951
  },
3496
3952
  },
3497
3953
  methods: {
@@ -3745,7 +4201,7 @@ var script$8 = {
3745
4201
  },
3746
4202
  };
3747
4203
 
3748
- var css_248z$9 = ".echarts[data-v-3120322a] {\n width: 100%;\n height: 100%;\n position: relative;\n}";
4204
+ var css_248z$9 = ".echarts[data-v-53fe628e] {\n width: 100%;\n height: 100%;\n position: relative;\n}";
3749
4205
  styleInject(css_248z$9);
3750
4206
 
3751
4207
  /* script */
@@ -3763,7 +4219,7 @@ __vue_render__$8._withStripped = true;
3763
4219
  /* style */
3764
4220
  const __vue_inject_styles__$8 = undefined;
3765
4221
  /* scoped */
3766
- const __vue_scope_id__$8 = "data-v-3120322a";
4222
+ const __vue_scope_id__$8 = "data-v-53fe628e";
3767
4223
  /* module identifier */
3768
4224
  const __vue_module_identifier__$8 = undefined;
3769
4225
  /* functional template */
@@ -5052,7 +5508,7 @@ var script$7 = {
5052
5508
  },
5053
5509
  };
5054
5510
 
5055
- var css_248z$8 = ".kd-lane-lane-content[data-v-80e79186] {\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-lane-content .template-buttons[data-v-80e79186] {\n text-align: center;\n}\n.kd-lane-lane-content .el-form-item__content[data-v-80e79186] {\n align-items: center;\n display: flex;\n}";
5511
+ var css_248z$8 = ".kd-lane-lane-content[data-v-33f93a60] {\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-lane-content .template-buttons[data-v-33f93a60] {\n text-align: center;\n}\n.kd-lane-lane-content .el-form-item__content[data-v-33f93a60] {\n align-items: center;\n display: flex;\n}";
5056
5512
  styleInject(css_248z$8);
5057
5513
 
5058
5514
  /* script */
@@ -5105,7 +5561,7 @@ var __vue_render__$7 = function () {
5105
5561
  {
5106
5562
  staticStyle: {
5107
5563
  "margin-left": "40px",
5108
- height: "40px",
5564
+ height: "32px",
5109
5565
  display: "flex",
5110
5566
  "align-items": "center",
5111
5567
  "line-height": "40px",
@@ -5169,7 +5625,7 @@ __vue_render__$7._withStripped = true;
5169
5625
  /* style */
5170
5626
  const __vue_inject_styles__$7 = undefined;
5171
5627
  /* scoped */
5172
- const __vue_scope_id__$7 = "data-v-80e79186";
5628
+ const __vue_scope_id__$7 = "data-v-33f93a60";
5173
5629
  /* module identifier */
5174
5630
  const __vue_module_identifier__$7 = undefined;
5175
5631
  /* functional template */
@@ -6107,6 +6563,7 @@ var script$4 = {
6107
6563
  },
6108
6564
  setTargetData(targetData) {
6109
6565
  this.targetData = targetData;
6566
+ console.log(targetData,'333333333');
6110
6567
  this.setExpanded();
6111
6568
  const dataType = judgeRawDataType(targetData);
6112
6569
  switch (dataType) {
@@ -6341,6 +6798,7 @@ var script$4 = {
6341
6798
  // 数据补全id label等信息
6342
6799
  const treeData = [];
6343
6800
  this.inputTempates.forEach((template) => {
6801
+ console.log(template,'template');
6344
6802
  const tData = { ...template, id: template.templateId, label: template.templateName };
6345
6803
  tData.children = [];
6346
6804
  if (!template.lanes) {
@@ -6386,7 +6844,7 @@ var script$4 = {
6386
6844
  beforeDestroy() {},
6387
6845
  };
6388
6846
 
6389
- var css_248z$5 = ".kd-lane-el-container[data-v-6e18dde4] {\n height: 60vh;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n width: 100%;\n}\n@media screen and (max-width: 1024px) {\n.kd-lane-el-container[data-v-6e18dde4] {\n height: 70vh;\n}\n}\n.kd-lane-el-container .custom-tree-node[data-v-6e18dde4] {\n width: 100%;\n}\n.kd-lane-el-container .rtd-config-side[data-v-6e18dde4] {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-el-container .rtd-config-side-tree[data-v-6e18dde4] {\n height: 90%;\n overflow: auto;\n}\n.kd-lane-el-container .rtd-config-side-option[data-v-6e18dde4] {\n text-align: center;\n}\n.kd-lane-el-container .rtd-config-main[data-v-6e18dde4] {\n display: flex;\n align-content: center;\n justify-content: center;\n width: 100%;\n}";
6847
+ var css_248z$5 = ".kd-lane-el-container[data-v-24c206f8] {\n height: 60vh;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n width: 100%;\n}\n@media screen and (max-width: 1024px) {\n.kd-lane-el-container[data-v-24c206f8] {\n height: 70vh;\n}\n}\n.kd-lane-el-container .custom-tree-node[data-v-24c206f8] {\n width: 100%;\n}\n.kd-lane-el-container .rtd-config-side[data-v-24c206f8] {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-el-container .rtd-config-side-tree[data-v-24c206f8] {\n height: 90%;\n overflow: auto;\n}\n.kd-lane-el-container .rtd-config-side-option[data-v-24c206f8] {\n text-align: center;\n}\n.kd-lane-el-container .rtd-config-main[data-v-24c206f8] {\n display: flex;\n align-content: center;\n justify-content: center;\n width: 100%;\n}";
6390
6848
  styleInject(css_248z$5);
6391
6849
 
6392
6850
  /* script */
@@ -6578,7 +7036,7 @@ __vue_render__$4._withStripped = true;
6578
7036
  /* style */
6579
7037
  const __vue_inject_styles__$4 = undefined;
6580
7038
  /* scoped */
6581
- const __vue_scope_id__$4 = "data-v-6e18dde4";
7039
+ const __vue_scope_id__$4 = "data-v-24c206f8";
6582
7040
  /* module identifier */
6583
7041
  const __vue_module_identifier__$4 = undefined;
6584
7042
  /* functional template */
@@ -6609,38 +7067,30 @@ const ACTION_TYPE = {
6609
7067
  DELETE_LINE: "delLine"
6610
7068
  };
6611
7069
 
6612
- //
6613
- //
6614
- //
6615
- //
6616
- //
6617
- //
6618
- //
6619
- //
6620
- //
6621
- //
6622
- //
6623
- //
6624
- //
6625
- //
6626
- //
6627
- //
6628
- //
6629
7070
  //
6630
7071
 
6631
7072
  var script$3 = {
7073
+ name: "HeaderItem",
6632
7074
  props: {
6633
- itemHeight: {
6634
- type: Number,
6635
- default: 42,
7075
+ lineRange: {
7076
+ type: Object,
7077
+ default: () => ({}),
7078
+ },
7079
+ currentHeaderStyle: {
7080
+ type: Object,
7081
+ default: () => ({
7082
+ headerPadding: 4,
7083
+ headerItemHeight: 42,
7084
+ itemGap: 4,
7085
+ }),
6636
7086
  },
6637
7087
  line: {
6638
7088
  type: Object,
6639
- default: () => {},
7089
+ default: () => ({}),
6640
7090
  },
6641
7091
  paramsNameMap: {
6642
7092
  type: Object,
6643
- default: () => {},
7093
+ default: () => ({}),
6644
7094
  required: true,
6645
7095
  },
6646
7096
  themeName: {
@@ -6653,14 +7103,28 @@ var script$3 = {
6653
7103
  },
6654
7104
  formCache: {
6655
7105
  type: Object,
6656
- default: () => {},
7106
+ default: () => ({}),
6657
7107
  },
6658
7108
  headerData: {
6659
7109
  type: Object,
6660
- default: () => {},
7110
+ default: () => ({}),
6661
7111
  },
6662
7112
  },
6663
7113
  methods: {
7114
+ // 获取字体大小类名
7115
+ getFontSize(type) {
7116
+ if (type == "label" && Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, `headerLabelFontSize`)) {
7117
+ return {
7118
+ fontSize: `${isNumeric(this.currentHeaderStyle[`headerLabelFontSize`]) ? this.currentHeaderStyle[`headerLabelFontSize`] + `px` : this.currentHeaderStyle[`headerLabelFontSize`]}`,
7119
+ };
7120
+ }
7121
+
7122
+ if (type == "data" && Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, `headerDataFontSize`)) {
7123
+ return {
7124
+ fontSize: `${isNumeric(this.currentHeaderStyle[`headerDataFontSize`]) ? this.currentHeaderStyle[`headerDataFontSize`] + `px` : this.currentHeaderStyle[`headerDataFontSize`]}`,
7125
+ };
7126
+ }
7127
+ },
6664
7128
  // 是否显示警告背景
6665
7129
  isShowWarning() {
6666
7130
  // 超找对应数组中的最大值
@@ -6671,13 +7135,19 @@ var script$3 = {
6671
7135
  },
6672
7136
  // 显示当前数据最新值
6673
7137
  getCurrentData() {
6674
- if(this.formCache.displayType == 'float'){
7138
+ if (this.formCache.displayType == "float") {
6675
7139
  return "";
6676
7140
  }
6677
7141
  if (!Object.prototype.hasOwnProperty.call(this.headerData, this.line.paramId)) {
6678
- return '--';
7142
+ return "--";
6679
7143
  }
6680
- return this.headerData[this.line.paramId] !== null && this.headerData[this.line.paramId] !== undefined && this.headerData[this.line.paramId] !== '' ? typeof +this.headerData[this.line.paramId] === 'number' ? Number(Number(this.headerData[this.line.paramId]).toFixed(2)) : this.headerData[this.line.paramId] : '--';
7144
+ return this.headerData[this.line.paramId] !== null &&
7145
+ this.headerData[this.line.paramId] !== undefined &&
7146
+ this.headerData[this.line.paramId] !== ""
7147
+ ? typeof +this.headerData[this.line.paramId] === "number"
7148
+ ? Number(Number(this.headerData[this.line.paramId]).toFixed(2))
7149
+ : this.headerData[this.line.paramId]
7150
+ : "--";
6681
7151
  },
6682
7152
  getParamName(line) {
6683
7153
  const nameConfig = this.paramsNameMap[line.paramId];
@@ -6737,17 +7207,16 @@ var script$3 = {
6737
7207
  lineType = { "border-bottom": `2px ${this.line.lineType} ${lineColor || this.line.lineColor}` };
6738
7208
  }
6739
7209
  return {
6740
- height: `${ this.formCache.displayType == 'header' ? this.itemHeight : this.itemHeight * 0.8 }px`,
7210
+ height: `${this.formCache.displayType == "header" ? this.currentHeaderStyle.headerItemHeight : this.currentHeaderStyle.headerItemHeight * 0.8}px`,
6741
7211
  opacity: this.line.isUsed == "1" ? 1 : 0.5,
6742
7212
  ...lineType,
6743
7213
  };
6744
7214
  },
6745
7215
  },
6746
- watch: {
6747
- },
7216
+ watch: {},
6748
7217
  };
6749
7218
 
6750
- var css_248z$4 = "@charset \"UTF-8\";\n.kd-lane-chart-container-header-item[data-v-5e4488b8] {\n height: 42px;\n flex-shrink: 0;\n background: var(--kd-lane-container-header-bg);\n border-radius: 0px 0px 0px 0px;\n color: var(--kd-lane-container-header-item-color, #333);\n border: unset;\n position: relative;\n cursor: pointer;\n}\n.kd-lane-chart-container-header-item_warning[data-v-5e4488b8] {\n background: var(--kd-lane-container-header-item-warning-color, rgba(248, 108, 89, 0.6));\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container[data-v-5e4488b8] {\n height: 100%;\n width: 100%;\n position: relative;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-weight: 400;\n font-size: 10px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .left[data-v-5e4488b8] {\n position: absolute;\n left: 2px;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center[data-v-5e4488b8] {\n position: absolute;\n left: 50%;\n top: 50%;\n font-size: 14px;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center .paramsTitle[data-v-5e4488b8] {\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-weight: 400;\n font-size: 12px;\n color: var(--kd-lane-container-header-item-color, #333);\n text-align: center;\n font-style: normal;\n text-transform: none;\n margin-bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center .paramsData[data-v-5e4488b8] {\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-weight: bold;\n font-size: 14px;\n text-align: center;\n font-style: normal;\n text-transform: none;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .right[data-v-5e4488b8] {\n position: absolute;\n right: 2px;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .gradient-display[data-v-5e4488b8] {\n position: absolute;\n height: 2px;\n left: 0;\n bottom: 0;\n right: 0;\n}";
7219
+ var css_248z$4 = "@charset \"UTF-8\";\n.kd-lane-chart-container-header-item[data-v-8f345c72] {\n flex-shrink: 0;\n background: var(--kd-lane-container-header-bg);\n border-radius: 0px 0px 0px 0px;\n color: var(--kd-lane-container-header-item-color, #333);\n border: unset;\n position: relative;\n cursor: pointer;\n}\n.kd-lane-chart-container-header-item_warning[data-v-8f345c72] {\n background: var(--kd-lane-container-header-item-warning-color, rgba(248, 108, 89, 0.6));\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container[data-v-8f345c72] {\n height: 100%;\n width: 100%;\n position: relative;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-weight: 400;\n font-size: 10px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .left[data-v-8f345c72] {\n position: absolute;\n left: 2px;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center[data-v-8f345c72] {\n position: absolute;\n left: 50%;\n top: 50%;\n font-size: 14px;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n height: 100%;\n align-items: center;\n justify-content: center;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center .paramsTitle[data-v-8f345c72] {\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-weight: 400;\n font-size: 12px;\n color: var(--kd-lane-container-header-item-color, #333);\n text-align: center;\n font-style: normal;\n text-transform: none;\n margin-bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center .paramsData[data-v-8f345c72] {\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-size: 12px;\n font-weight: bold;\n text-align: center;\n font-style: normal;\n text-transform: none;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .right[data-v-8f345c72] {\n position: absolute;\n right: 2px;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .gradient-display[data-v-8f345c72] {\n position: absolute;\n height: 2px;\n left: 0;\n bottom: 0;\n right: 0;\n}";
6751
7220
  styleInject(css_248z$4);
6752
7221
 
6753
7222
  /* script */
@@ -6769,19 +7238,41 @@ var __vue_render__$3 = function () {
6769
7238
  },
6770
7239
  [
6771
7240
  _c("div", { staticClass: "kd-lane-chart-container-text-container" }, [
6772
- _c("span", { staticClass: "left" }, [_vm._v(_vm._s(_vm.line.min))]),
7241
+ _c("span", { staticClass: "left" }, [
7242
+ _vm._v(
7243
+ _vm._s(
7244
+ _vm.line.min ||
7245
+ (_vm.lineRange[_vm.line.lineId] &&
7246
+ _vm.lineRange[_vm.line.lineId].min) ||
7247
+ 0
7248
+ )
7249
+ ),
7250
+ ]),
6773
7251
  _vm._v(" "),
6774
7252
  _c("div", { staticClass: "center" }, [
6775
- _c("div", { staticClass: "paramsTitle" }, [
6776
- _vm._v(_vm._s(_vm.getParamName(_vm.line))),
6777
- ]),
7253
+ _c(
7254
+ "div",
7255
+ { staticClass: "paramsTitle", style: _vm.getFontSize("label") },
7256
+ [_vm._v(_vm._s(_vm.getParamName(_vm.line)))]
7257
+ ),
6778
7258
  _vm._v(" "),
6779
- _c("div", { staticClass: "paramsData" }, [
6780
- _vm._v(_vm._s(_vm.getCurrentData())),
6781
- ]),
7259
+ _c(
7260
+ "div",
7261
+ { staticClass: "paramsData", style: _vm.getFontSize("data") },
7262
+ [_vm._v(_vm._s(_vm.getCurrentData()))]
7263
+ ),
6782
7264
  ]),
6783
7265
  _vm._v(" "),
6784
- _c("span", { staticClass: "right" }, [_vm._v(_vm._s(_vm.line.max))]),
7266
+ _c("span", { staticClass: "right" }, [
7267
+ _vm._v(
7268
+ _vm._s(
7269
+ _vm.line.max ||
7270
+ (_vm.lineRange[_vm.line.lineId] &&
7271
+ _vm.lineRange[_vm.line.lineId].max) ||
7272
+ 0
7273
+ )
7274
+ ),
7275
+ ]),
6785
7276
  _vm._v(" "),
6786
7277
  _c("div", {
6787
7278
  staticClass: "gradient-display",
@@ -6797,7 +7288,7 @@ __vue_render__$3._withStripped = true;
6797
7288
  /* style */
6798
7289
  const __vue_inject_styles__$3 = undefined;
6799
7290
  /* scoped */
6800
- const __vue_scope_id__$3 = "data-v-5e4488b8";
7291
+ const __vue_scope_id__$3 = "data-v-8f345c72";
6801
7292
  /* module identifier */
6802
7293
  const __vue_module_identifier__$3 = undefined;
6803
7294
  /* functional template */
@@ -6853,17 +7344,13 @@ var script$2 = {
6853
7344
  required: true,
6854
7345
  validator: strategyValidator,
6855
7346
  },
6856
- headerPadding: {
6857
- type: Number,
6858
- default: 4,
6859
- },
6860
- headerItemHeight: {
6861
- type: Number,
6862
- default: 42,
6863
- },
6864
- itemGap: {
6865
- type: Number,
6866
- default: 4,
7347
+ currentHeaderStyle: {
7348
+ type: Object,
7349
+ default: () => ({
7350
+ headerPadding: 4,
7351
+ headerItemHeight: 42,
7352
+ itemGap: 4,
7353
+ }),
6867
7354
  },
6868
7355
  customMenuList: {
6869
7356
  type: Array,
@@ -6897,11 +7384,21 @@ var script$2 = {
6897
7384
  type: Array,
6898
7385
  default: () => [],
6899
7386
  },
7387
+ // 预警区域数据
7388
+ warningAreaData: {
7389
+ type: Array,
7390
+ default: () => [],
7391
+ },
6900
7392
  // 自定义tooltip formatter
6901
7393
  tooltipFormatter: {
6902
7394
  type: Function,
6903
7395
  default: null,
6904
7396
  },
7397
+ // 实时曲线menu右击是否开启
7398
+ showContextMenuStatus: {
7399
+ type: Boolean,
7400
+ default: true,
7401
+ },
6905
7402
  },
6906
7403
  data() {
6907
7404
  return {
@@ -6969,6 +7466,9 @@ var script$2 = {
6969
7466
  headerWidthCache: {},
6970
7467
  // 上次触发 visibleDataChange 的参数,用于比较是否发生变化
6971
7468
  lastVisibleDataChangeParams: null,
7469
+ // 当前线段所有数据的最小值和最大值
7470
+ lineRange: {},
7471
+ markAreaLineData: [],
6972
7472
  };
6973
7473
  },
6974
7474
  created() {
@@ -7008,6 +7508,15 @@ var script$2 = {
7008
7508
  }
7009
7509
  },
7010
7510
  methods: {
7511
+ initWindowSizeRange() {
7512
+ const scaleValues = this.toolBarConfig?.scaleList?.map((item) => item.value) || [];
7513
+ if (scaleValues.length === 0) return;
7514
+
7515
+ const minScale = Math.min(...scaleValues);
7516
+ const maxScale = Math.max(...scaleValues);
7517
+ this.minWindowSize = Math.round(this.pxToCm() * (+minScale / this.depthInterval));
7518
+ this.maxWindowSize = Math.round(this.pxToCm() * (+maxScale / this.depthInterval));
7519
+ },
7011
7520
  jumpToPosition(data) {
7012
7521
  if (!this.realTimeData || this.realTimeData.length === 0) return;
7013
7522
 
@@ -7071,68 +7580,25 @@ var script$2 = {
7071
7580
  getXAxisRangeByHeader(lineInfo, validData = []) {
7072
7581
  let headerMin = 0;
7073
7582
  let headerMax = 1;
7074
- if(lineInfo && Object.prototype.hasOwnProperty.call(lineInfo, "min")){
7583
+ if (lineInfo && Object.prototype.hasOwnProperty.call(lineInfo, "min")) {
7075
7584
  headerMin = Number(lineInfo.min);
7076
- }else {
7077
- headerMin = Math.floor(Math.min(...validData));
7585
+ } else {
7586
+ headerMin = Math.floor(Math.min(...validData.map((item) => item[0])));
7078
7587
  }
7079
- if(lineInfo && Object.prototype.hasOwnProperty.call(lineInfo, "max")){
7588
+ if (lineInfo && Object.prototype.hasOwnProperty.call(lineInfo, "max")) {
7080
7589
  headerMax = Number(lineInfo.max);
7081
- }else {
7082
- headerMax = Math.ceil(Math.max(...validData));
7083
- }
7084
-
7085
- const min = headerMin > 0 ? headerMin : 0;
7086
- const max = headerMax > 0 ? headerMax : 1;
7590
+ } else {
7591
+ headerMax = Math.ceil(Math.max(...validData.map((item) => item[0])));
7592
+ }
7593
+ const min = headerMin;
7594
+ const max = headerMax;
7595
+ // 更新当前线的范围
7596
+ this.lineRange[lineInfo.lineId] = {
7597
+ min,
7598
+ max,
7599
+ };
7087
7600
  return { min, max };
7088
7601
  },
7089
- // 通过 laneId 切换指定泳道 x 轴类型(value/log)
7090
- toggleLaneXAxisType(laneId, axisType) {
7091
- const targetLane =
7092
- this.currentTemplate &&
7093
- this.currentTemplate.lanes &&
7094
- this.currentTemplate.lanes.find((lane) => String(lane.laneId) === String(laneId));
7095
- if (!targetLane) return;
7096
-
7097
- const optionIndex = this.allOptions.findIndex((item) => String(item.lineId) === String(laneId));
7098
- if (optionIndex < 0) return;
7099
-
7100
- const laneOption = this.allOptions[optionIndex] && this.allOptions[optionIndex].option;
7101
- if (!laneOption || !Array.isArray(laneOption.xAxis) || laneOption.xAxis.length === 0) return;
7102
-
7103
- const nextType =
7104
- axisType === "log" || axisType === "value"
7105
- ? axisType
7106
- : laneOption.xAxis && laneOption.xAxis[0] && laneOption.xAxis[0].type === "log"
7107
- ? "value"
7108
- : "log";
7109
-
7110
- laneOption.xAxis = laneOption.xAxis.map((axisItem, index) => {
7111
- const lineInfo = (targetLane.lines && targetLane.lines[index]) || {};
7112
- const { min, max } = this.getXAxisRangeByHeader(lineInfo);
7113
- if (nextType === "log") {
7114
- return {
7115
- ...axisItem,
7116
- type: "log",
7117
- logBase: axisItem.logBase || 2,
7118
- min: min > 0 ? min : 1,
7119
- max: max > 0 ? max : 1,
7120
- };
7121
- }
7122
- return {
7123
- ...axisItem,
7124
- type: "value",
7125
- min,
7126
- max,
7127
- };
7128
- });
7129
-
7130
- this.$set(this.allOptions, optionIndex, {
7131
- ...this.allOptions[optionIndex],
7132
- option: laneOption,
7133
- });
7134
- this.$forceUpdate();
7135
- },
7136
7602
  judgeScrollEdge() {
7137
7603
  const dataLen = this.realTimeData.length;
7138
7604
  if (!dataLen || !this.visibleData.length) return;
@@ -7309,6 +7775,13 @@ var script$2 = {
7309
7775
  const delta = Math.sign(e.deltaY);
7310
7776
  // ===== Ctrl:缩放 =====
7311
7777
  if (this.isCtrlPressed) {
7778
+ // 检查是否已经在缩放边界
7779
+ // delta < 0 表示向上滚动 = 缩小 windowSize
7780
+ // delta > 0 表示向下滚动 = 放大 windowSize
7781
+ if ((delta < 0 && this.windowSize <= this.minWindowSize) || (delta > 0 && this.windowSize >= this.maxWindowSize)) {
7782
+ return;
7783
+ }
7784
+
7312
7785
  let anchorIndex = this.getAnchorIndexFromEvent(e);
7313
7786
  // 如果获取不到鼠标位置的数据,则使用中间数据
7314
7787
  if (anchorIndex === null) {
@@ -7326,15 +7799,30 @@ var script$2 = {
7326
7799
  } else {
7327
7800
  if (this.isScrollingToHeader(e)) return;
7328
7801
  const speed = Math.max(1, this.windowSize / 100);
7329
- this.targetStartIndex = Math.floor(this.startIndex + delta * speed * 8);
7802
+
7803
+ // 检查是否已经在滚动边界
7804
+ // delta < 0 表示向上滚动
7805
+ // delta > 0 表示向下滚动
7806
+ const maxStart = Math.max(0, dataLength - this.windowSize);
7807
+ if ((delta < 0 && this.startIndex <= 0) || (delta > 0 && this.startIndex >= maxStart)) {
7808
+ return;
7809
+ }
7810
+
7811
+ this.targetStartIndex = Math.floor(this.startIndex + delta * speed * 10);
7330
7812
  this.targetWindowSize = this.windowSize; // 滚动时不变,已是整数
7331
7813
  if (this.formCache.dataType == "history") {
7332
7814
  this.debounceJudgeEdge();
7333
7815
  }
7334
7816
  }
7335
- const maxStart = Math.max(0, dataLength - this.targetWindowSize);
7336
- this.targetStartIndex = Math.max(0, Math.min(this.targetStartIndex, maxStart));
7817
+ const maxStartFinal = Math.max(0, dataLength - this.targetWindowSize);
7818
+ this.targetStartIndex = Math.max(0, Math.min(this.targetStartIndex, maxStartFinal));
7337
7819
  this.targetStartIndex = Math.floor(this.targetStartIndex);
7820
+
7821
+ // 检查是否有变化,没有变化则不渲染
7822
+ if (Math.abs(this.targetStartIndex - this.startIndex) < 0.5 && Math.abs(this.targetWindowSize - this.windowSize) < 0.5) {
7823
+ return;
7824
+ }
7825
+
7338
7826
  this.smoothRender();
7339
7827
  },
7340
7828
  smoothRender() {
@@ -7362,20 +7850,94 @@ var script$2 = {
7362
7850
  animate();
7363
7851
  },
7364
7852
  jumpToNextMarkLine() {
7365
- if (!this.markLineData || this.markLineData.length == 0) {
7853
+ const axisKey = this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType];
7854
+ if (!axisKey) return;
7855
+
7856
+ // 获取当前图表的markLine数据
7857
+ let markLineYValues = [];
7858
+ const chartRef = this.$refs.refResizeChart && this.$refs.refResizeChart[0];
7859
+ if (chartRef && chartRef.chart) {
7860
+ const chartOption = chartRef.chart.getOption();
7861
+ if (chartOption && chartOption.series) {
7862
+ chartOption.series.forEach((series) => {
7863
+ if (series.markLine && series.markLine.data) {
7864
+ series.markLine.data.forEach((markData) => {
7865
+ if (markData.yAxis !== null && markData.yAxis !== undefined) {
7866
+ markLineYValues.push(markData.yAxis);
7867
+ }
7868
+ });
7869
+ }
7870
+ });
7871
+ }
7872
+ }
7873
+
7874
+ // 如果没有获取到markLine数据,尝试使用this.markLineData
7875
+ if (markLineYValues.length === 0 && this.markLineData && this.markLineData.length > 0) {
7876
+ markLineYValues = this.markLineData
7877
+ .map((item) => {
7878
+ if (this.formCache.axisType === "depth") {
7879
+ return Number(item.data?.depth || item.depth || item);
7880
+ } else if (this.formCache.axisType === "time") {
7881
+ return this.toMillisecondTimestamp(item.data?.time || item.time || item);
7882
+ }
7883
+ return Number(item);
7884
+ })
7885
+ .filter((val) => val !== null && !isNaN(val));
7886
+ }
7887
+
7888
+ if (markLineYValues.length === 0) {
7366
7889
  return;
7367
7890
  }
7368
- let findIndex = this.realTimeData.findIndex(
7369
- (item) => item[this.toolBarConfig.axisTypeList[this.formCache.axisType]] == this.markLineData[this.currentMarkLineIndex],
7370
- );
7371
- if (findIndex != -1) {
7372
- this.startIndex = findIndex + 1 - this.windowSize / 2 > 0 ? findIndex + 1 - this.windowSize / 2 : 0;
7891
+
7892
+ // 保存markLineYValues以便后续使用
7893
+ this.cachedMarkLineYValues = markLineYValues;
7894
+
7895
+ // 获取当前需要跳转的markLine值
7896
+ const targetValue = markLineYValues[this.currentMarkLineIndex % markLineYValues.length];
7897
+
7898
+ // 找到目标值在realTimeData中的索引
7899
+ let findIndex = -1;
7900
+ let closestIndex = -1;
7901
+ let minDiff = Infinity;
7902
+
7903
+ if (this.formCache.axisType === "time") {
7904
+ const targetValueMs = this.toMillisecondTimestamp(targetValue);
7905
+ this.realTimeData.forEach((item, index) => {
7906
+ const itemValueMs = this.toMillisecondTimestamp(item[axisKey]);
7907
+ const diff = Math.abs(itemValueMs - targetValueMs);
7908
+ if (diff < minDiff) {
7909
+ minDiff = diff;
7910
+ closestIndex = index;
7911
+ }
7912
+ if (itemValueMs === targetValueMs) {
7913
+ findIndex = index;
7914
+ }
7915
+ });
7916
+ } else {
7917
+ this.realTimeData.forEach((item, index) => {
7918
+ const itemValue = Number(item[axisKey]);
7919
+ const diff = Math.abs(itemValue - Number(targetValue));
7920
+ if (diff < minDiff) {
7921
+ minDiff = diff;
7922
+ closestIndex = index;
7923
+ }
7924
+ if (itemValue === Number(targetValue)) {
7925
+ findIndex = index;
7926
+ }
7927
+ });
7928
+ }
7929
+
7930
+ // 如果没有精确匹配,使用最接近的值
7931
+ const targetIndex = findIndex !== -1 ? findIndex : closestIndex;
7932
+
7933
+ if (targetIndex !== -1) {
7934
+ this.startIndex = targetIndex + 1 - this.windowSize / 2 > 0 ? targetIndex + 1 - this.windowSize / 2 : 0;
7373
7935
  this.updateLanesChartOption();
7374
7936
  }
7375
7937
 
7376
7938
  // 更新索引(循环)
7377
- this.currentMarkLineIndex++; // 更新索引(循环)
7378
- if (this.currentMarkLineIndex >= this.markLineData.length) {
7939
+ this.currentMarkLineIndex++;
7940
+ if (this.currentMarkLineIndex >= markLineYValues.length) {
7379
7941
  this.currentMarkLineIndex = 0;
7380
7942
  }
7381
7943
  },
@@ -7414,7 +7976,7 @@ var script$2 = {
7414
7976
 
7415
7977
  if (hasHeaderChange) {
7416
7978
  // 重新绘制图表
7417
- this.updateLanesChartOption(null, "series");
7979
+ this.updateLanesChartOption();
7418
7980
  }
7419
7981
  }, 100);
7420
7982
  });
@@ -7784,6 +8346,7 @@ var script$2 = {
7784
8346
  });
7785
8347
  },
7786
8348
  onParentContextMenu(event) {
8349
+ if (!this.showContextMenuStatus) return;
7787
8350
  const itemClassName = ".kd-lane-chart-lane-header";
7788
8351
  const lineContext = event.target && (event.target.classList.contains(itemClassName) || event.target.closest(itemClassName));
7789
8352
  if (!lineContext) {
@@ -7795,7 +8358,7 @@ var script$2 = {
7795
8358
  }
7796
8359
  },
7797
8360
  // 处理工具栏设置变更
7798
- updateSettings(settings) {
8361
+ async updateSettings(settings) {
7799
8362
  // 处理displayType变更
7800
8363
  if (settings.key === "displayType") {
7801
8364
  this.toggleTooltip(settings.value == "float");
@@ -7804,11 +8367,10 @@ var script$2 = {
7804
8367
  // 处理比例尺变化
7805
8368
  if (settings.key === "scale") {
7806
8369
  this.scaleToDataSize(settings.value);
7807
- this.startIndex = 0;
7808
- this.$nextTick(() => {
7809
- this.updateLanesChartOption("", "series");
7810
- });
7811
- }
8370
+ // this.startIndex = 0;
8371
+ await this.$nextTick();
8372
+ this.updateLanesChartOption();
8373
+ }
7812
8374
 
7813
8375
  // 处理井深范围或时间范围的变化
7814
8376
  if (settings.key === "depthRange" || settings.key === "timeRange") {
@@ -7913,17 +8475,17 @@ var script$2 = {
7913
8475
  this.startIndex = startIndex;
7914
8476
 
7915
8477
  this.$nextTick(() => {
7916
- this.updateLanesChartOption("", "series");
8478
+ this.updateLanesChartOption();
7917
8479
  });
7918
8480
  }
7919
8481
  }
7920
8482
  }
7921
8483
  },
7922
- showContextMenu(event, item) {
8484
+ showContextMenu(event, item) {
8485
+ if (!this.showContextMenuStatus) return;
7923
8486
  event.stopPropagation();
7924
8487
  this.$emit("showContextMenu", item);
7925
8488
  this.$refs.vueSimpleContextMenu.showMenu(event, item);
7926
-
7927
8489
  },
7928
8490
  optionClicked(event) {
7929
8491
  const { option, item } = event;
@@ -7970,7 +8532,7 @@ var script$2 = {
7970
8532
  onLineChange(line, type) {
7971
8533
  console.log("notify line change", line, type);
7972
8534
  this.$emit("line-change", { ...line, actionType: type });
7973
- this.updateLanesChartOption("", "series");
8535
+ this.updateLanesChartOption();
7974
8536
  },
7975
8537
  async setDefaultAndNotify() {
7976
8538
  const prevTemplateId = this.currentTemplate && this.currentTemplate.templateId;
@@ -8023,12 +8585,18 @@ var script$2 = {
8023
8585
  show: false,
8024
8586
  containLabel: false,
8025
8587
  },
8588
+ emphasis: {
8589
+ disabled: true,
8590
+ },
8026
8591
  animation: false,
8027
8592
  legend: { show: false },
8028
8593
  xAxis: [
8029
8594
  {
8030
8595
  show: false,
8031
8596
  type: "value",
8597
+ min: 0,
8598
+ max: 10,
8599
+ splitNumber: 5,
8032
8600
  splitLine: {
8033
8601
  show: false,
8034
8602
  showMinLine: false,
@@ -8103,37 +8671,17 @@ var script$2 = {
8103
8671
  formatter: (params) => {
8104
8672
  if (this.formCache.displayType == "header") {
8105
8673
  let dataIndexItem = (params.seriesData && params.seriesData[0] && params.seriesData[0].dataIndex) || null;
8106
- // let dataIndexItem = this.getFirstDataIndexItem(params.seriesData);
8107
8674
  if (dataIndexItem !== null) {
8108
8675
  this.headerData = this.visibleData[dataIndexItem];
8109
- // this.headerData = this.visibleData[dataIndexItem.dataIndex];
8110
8676
  } else {
8111
8677
  this.headerData = {};
8112
8678
  }
8113
8679
  }
8114
8680
  if (this.formCache.axisType == "time") {
8115
- return this.timestampToHms(params.value);
8681
+ return this.timestampToYMDHMS(params.value);
8116
8682
  } else {
8117
8683
  return params.value.toString();
8118
8684
  }
8119
- // if (this.formCache.axisType == "time") {
8120
- // // 时间轴模式:params.value 是时间戳
8121
- // this.headerData =
8122
- // this.visibleData.find(
8123
- // (item) =>
8124
- // this.toMillisecondTimestamp(item && item[this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]]) == params.value,
8125
- // ) || {};
8126
- // } else {
8127
- // this.headerData =
8128
- // this.visibleData.find((item) => item && item[this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]] == params.value) ||
8129
- // {};
8130
- // }
8131
- // }
8132
- // // 时间轴模式:格式化时间戳为可读时间
8133
- // if (this.formCache.axisType == "time") {
8134
- // return this.timestampToHms(params.value);
8135
- // }
8136
- // return params.value;
8137
8685
  },
8138
8686
  },
8139
8687
  },
@@ -8274,42 +8822,22 @@ var script$2 = {
8274
8822
  }
8275
8823
  return fallback;
8276
8824
  },
8277
- async updateLanesChartOption(transferData, type = "all") {
8278
- // 如果正在更新,直接返回,避免重复调用
8825
+ async updateLanesChartOption(transferData) {
8279
8826
  if (this.isUpdatingChart) return;
8827
+ this.isUpdatingChart = true;
8280
8828
 
8281
- let realTimeData = [];
8282
- if (transferData && transferData.length > 0) {
8283
- realTimeData = transferData;
8284
- } else {
8285
- realTimeData = this.getVisibleData();
8286
- }
8829
+ let realTimeData = transferData && transferData.length > 0 ? transferData : this.getVisibleData();
8287
8830
  const lanes = cloneDeep(this.currentTemplate.lanes);
8288
8831
 
8289
- if (!lanes || lanes.length === 0) return;
8290
-
8291
- let depthData = [];
8292
- let timestamps = [];
8293
-
8294
- let yAxisMin = 0;
8295
- let yAxisMax = 0;
8832
+ if (!lanes || lanes.length === 0) {
8833
+ this.isUpdatingChart = false;
8834
+ return;
8835
+ }
8296
8836
 
8297
- // 获取当前轴类型的键
8298
8837
  const axisKey =
8299
8838
  (this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]) ||
8300
8839
  (this.formCache.axisType === "time" ? "time" : "depth");
8301
8840
 
8302
- if (this.formCache.axisType == "time") {
8303
- // 时间轴模式:使用毫秒时间戳
8304
- timestamps = realTimeData.map((item) => this.toMillisecondTimestamp(item[axisKey]));
8305
- yAxisMin = Math.min(...timestamps);
8306
- yAxisMax = Math.max(...timestamps);
8307
- } else {
8308
- depthData = realTimeData.map((i) => +i[axisKey]);
8309
- yAxisMin = Math.min(...depthData);
8310
- yAxisMax = Math.max(...depthData);
8311
- }
8312
-
8313
8841
  const paramNameMap = {};
8314
8842
  this.params.forEach((p) => {
8315
8843
  paramNameMap[p.paramId] = p.paramName;
@@ -8318,516 +8846,768 @@ var script$2 = {
8318
8846
  try {
8319
8847
  for (let laneIndex = 0; laneIndex < lanes.length; laneIndex++) {
8320
8848
  const lane = lanes[laneIndex];
8321
- // 获取轴类型列表
8322
8849
  const axisTypeList = this.toolBarConfig.axisTypeList || { depth: "depth", time: "time" };
8323
- // 深度轴数据
8324
8850
  const isDepthLane = Object.prototype.hasOwnProperty.call(axisTypeList, "depth") && axisTypeList.depth == lane.laneKey;
8325
- // 时间轴数据
8326
8851
  const isTimeLane = Object.prototype.hasOwnProperty.call(axisTypeList, "time") && axisTypeList.time == lane.laneKey;
8327
8852
 
8328
8853
  const option = this.getDefaultLaneChartOption();
8854
+ const dataGroups = splitArrayByDepth(realTimeData, axisKey);
8855
+
8856
+ if (dataGroups.length > 0) {
8857
+ option.yAxis = [];
8858
+ option.series = [];
8859
+ option.grid = [];
8860
+ option.xAxis = [];
8861
+
8862
+ let totalHeight = 0;
8863
+ const groupHeights = [];
8864
+
8865
+ dataGroups.forEach((group) => {
8866
+ const groupDepths = group.map((item) => +item[axisKey]);
8867
+ const groupRange = Math.max(...groupDepths) - Math.min(...groupDepths);
8868
+ groupHeights.push(groupRange);
8869
+ totalHeight += groupRange;
8870
+ });
8329
8871
 
8330
- if (this.formCache.axisType == "time") {
8331
- // 时间轴模式:设置 min 和 max,不设置 data
8332
- if (yAxisMin === yAxisMax) {
8333
- yAxisMin = yAxisMin - 1;
8334
- yAxisMax = yAxisMax + 1;
8335
- }
8336
- option.yAxis[0].min = yAxisMin;
8337
- option.yAxis[0].max = yAxisMax;
8338
- // 时间轴不需要 data 属性
8339
- delete option.yAxis[0].data;
8340
-
8341
- // 时间轴自适应间隔:根据数据量计算合适的间隔
8342
- const dataCount = realTimeData.length;
8343
- if (dataCount > 0) {
8344
- const timeRange = yAxisMax - yAxisMin;
8345
- // 根据数据量设置合适的间隔
8346
- if (dataCount < 10) {
8347
- // 数据量较少,间隔可以小一些
8348
- option.yAxis[0].interval = timeRange / 1;
8349
- } else if (dataCount < 50) {
8350
- // 数据量中等
8351
- option.yAxis[0].interval = timeRange / 5;
8352
- } else if (dataCount < 100) {
8353
- // 数据量较多
8354
- option.yAxis[0].interval = timeRange / 10;
8355
- } else {
8356
- // 数据量很多
8357
- option.yAxis[0].interval = timeRange / 15;
8872
+ const allValues = [];
8873
+ dataGroups.forEach((group) => {
8874
+ group.forEach((item) => {
8875
+ allValues.push(+item[axisKey]);
8876
+ });
8877
+ });
8878
+
8879
+ allValues.sort((a, b) => a - b);
8880
+
8881
+ const allIntervals = [];
8882
+ for (let i = 1; i < allValues.length; i++) {
8883
+ const interval = Math.abs(allValues[i] - allValues[i - 1]);
8884
+ if (interval > 0) {
8885
+ allIntervals.push(interval);
8358
8886
  }
8359
8887
  }
8360
- } else {
8361
- if (yAxisMin === yAxisMax) {
8362
- yAxisMin = yAxisMin - 1;
8363
- yAxisMax = yAxisMax + 1;
8364
- }
8365
- option.yAxis[0].min = yAxisMin;
8366
- option.yAxis[0].max = yAxisMax;
8367
- // 深度轴不需要 data 属性
8368
- delete option.yAxis[0].data;
8369
-
8370
- // 深度轴自适应间隔:根据数据量计算合适的间隔
8371
- const depthRange = yAxisMax - yAxisMin;
8372
- const dataCount = realTimeData.length;
8373
- if (dataCount > 0) {
8374
- // 根据数据量设置合适的间隔
8375
- if (dataCount < 10) {
8376
- // 数据量较少,间隔可以小一些
8377
- option.yAxis[0].interval = depthRange / 5;
8378
- } else if (dataCount < 50) {
8379
- // 数据量中等
8380
- option.yAxis[0].interval = depthRange / 10;
8381
- } else if (dataCount < 100) {
8382
- // 数据量较多
8383
- option.yAxis[0].interval = depthRange / 15;
8384
- } else {
8385
- // 数据量很多
8386
- option.yAxis[0].interval = depthRange / 20;
8387
- }
8888
+
8889
+ let unifiedInterval = 5;
8890
+ if (allIntervals.length > 0) {
8891
+ const minInterval = Math.min(...allIntervals);
8892
+ const totalRange = Math.max(...allValues) - Math.min(...allValues);
8893
+ const intervalCount = Math.max(1, Math.min(12, Math.ceil(totalRange / minInterval)));
8894
+ unifiedInterval = Math.ceil(totalRange / Math.min(12, intervalCount));
8895
+ unifiedInterval = Math.max(minInterval, Math.ceil(unifiedInterval / minInterval) * minInterval);
8388
8896
  }
8389
- }
8390
8897
 
8391
- if (isDepthLane) {
8392
- await this.$nextTick();
8393
- let clientWidth = this.getLaneHeaderClientWidth(lane, laneIndex);
8394
- Object.assign(option.yAxis[0], {
8395
- splitLine: { show: false },
8396
- axisPointer: { show: false },
8397
- boundaryGap: false,
8398
- axisLabel: {
8399
- show: true,
8400
- width: clientWidth,
8401
- showMinLabel: false,
8402
- showMaxLabel: false,
8403
- align: "left",
8404
- color: getCssVariable("--default-text-color"),
8405
- rich: {
8406
- verticalAlign: "center",
8407
- center: { align: "center", fontSize: 12, width: clientWidth },
8898
+ let currentTop = 0;
8899
+
8900
+ dataGroups.forEach(async (group, groupIndex) => {
8901
+ const groupDepths = group.map((item) => +item[axisKey]);
8902
+ const groupMin = Math.min(...groupDepths);
8903
+ const groupMax = Math.max(...groupDepths);
8904
+ const groupHeight = (groupHeights[groupIndex] / totalHeight) * 100;
8905
+ const gridIndex = option.grid.length;
8906
+
8907
+ option.grid.push({
8908
+ top: `${currentTop}%`,
8909
+ left: 2,
8910
+ right: 2,
8911
+ height: `${groupHeight}%`,
8912
+ show: false,
8913
+ containLabel: true,
8914
+ });
8915
+ currentTop += groupHeight;
8916
+
8917
+ option.yAxis.push({
8918
+ gridIndex: gridIndex,
8919
+ type: "value",
8920
+ min: groupMin,
8921
+ max: groupMax,
8922
+ inverse: true,
8923
+ boundaryGap: false,
8924
+ splitLine: {
8925
+ show: true,
8926
+ showMinLine: false,
8927
+ showMaxLine: false,
8928
+ lineStyle: {
8929
+ color: getCssVariable("--kd-lane-container-item-line-color"),
8930
+ type: "dashed",
8931
+ },
8408
8932
  },
8409
- formatter: (value) => {
8410
- return `{center|${typeof +value === "number" ? Number(Number(value).toFixed(2)) : value}}`;
8933
+ axisLine: { show: false, onZero: false },
8934
+ axisTick: { show: false },
8935
+ axisLabel: {
8936
+ show: false,
8937
+ fontSize: 12,
8938
+ color: getCssVariable("--default-text-color"),
8411
8939
  },
8412
- },
8940
+ axisPointer: { show: true },
8941
+ interval: unifiedInterval,
8942
+ });
8943
+
8944
+ if (isDepthLane || isTimeLane) {
8945
+ await this.$nextTick();
8946
+ const clientWidth = this.getLaneHeaderClientWidth(lane, laneIndex);
8947
+ option.xAxis.push({
8948
+ gridIndex: gridIndex,
8949
+ type: "value",
8950
+ min: 0,
8951
+ max: 10,
8952
+ splitLine: { show: false },
8953
+ axisLabel: { show: false },
8954
+ axisLine: { show: false },
8955
+ axisTick: { show: false },
8956
+ });
8957
+ option.series.push({
8958
+ type: "line",
8959
+ xAxisIndex: groupIndex,
8960
+ yAxisIndex: gridIndex,
8961
+ nameIndex: groupIndex,
8962
+ });
8963
+ Object.assign(option.yAxis[gridIndex], {
8964
+ splitLine: { show: false },
8965
+ axisPointer: { show: false },
8966
+ alignTicks: true,
8967
+ boundaryGap: false,
8968
+ axisLabel: {
8969
+ show: true,
8970
+ width: clientWidth,
8971
+ hideOverlap: true,
8972
+ height: 14,
8973
+ verticalAlign: "middle",
8974
+ color: getCssVariable("--default-text-color"),
8975
+ overflow: "truncate",
8976
+ rich: {
8977
+ center: {
8978
+ align: "center",
8979
+ fontSize: 12,
8980
+ verticalAlign: "middle",
8981
+ width: clientWidth - 6 ,
8982
+ height: 14,
8983
+ textBaseline: "middle",
8984
+ lineHeight: 14,
8985
+ },
8986
+ center2: {
8987
+ align: "center",
8988
+ fontSize: 12,
8989
+ backgroundColor: "red",
8990
+ verticalAlign: "middle",
8991
+ width: clientWidth - 6,
8992
+ height: 14,
8993
+ textBaseline: "middle",
8994
+ lineHeight: 14,
8995
+ },
8996
+ },
8997
+ formatter: this.getYAxisLabelFormatter(isTimeLane, dataGroups, groupIndex, groupMin, groupMax, axisKey),
8998
+ },
8999
+ });
9000
+ option.backgroundColor = "transparent";
9001
+ delete option.tooltip;
9002
+ }
9003
+
9004
+ const allSeriesData = {};
9005
+ if (lane && lane.lines) {
9006
+ lane.lines.forEach((lineInfo) => {
9007
+ allSeriesData[lineInfo.lineId] = this.generateSeriesData(realTimeData, lineInfo, axisKey);
9008
+ });
9009
+ }
9010
+
9011
+ const isLogScale = lane.isLogScale === "1";
9012
+ let laneMin = 0,
9013
+ laneMax = 0;
9014
+ if (lane && lane.lines) {
9015
+ lane.lines.forEach((lineInfo) => {
9016
+ const range = this.getXAxisRangeByHeader(lineInfo, allSeriesData[lineInfo.lineId]);
9017
+ if (lineInfo.min) laneMin = Math.min(laneMin, range.min);
9018
+ if (lineInfo.max) laneMax = Math.max(laneMax, range.max);
9019
+ });
9020
+ }
9021
+
9022
+ lane &&
9023
+ lane.lines &&
9024
+ lane.lines.forEach((lineInfo) => {
9025
+ const seriesData = this.generateSeriesData(group, lineInfo, axisKey);
9026
+ const allValidData = allSeriesData[lineInfo.lineId];
9027
+ const { min, max } = this.getXAxisRangeByHeader(lineInfo, allValidData);
9028
+ const xAxisIndex = option.xAxis.length;
9029
+
9030
+ option.xAxis.push({
9031
+ interval: isLogScale ? "auto" : (max - min) / 5,
9032
+ splitNumber: isLogScale ? "auto" : 5,
9033
+ gridIndex: gridIndex,
9034
+ show: !isDepthLane,
9035
+ type: isLogScale ? "log" : "value",
9036
+ min: isLogScale ? (laneMin > 0 ? laneMin : 0.1) : min,
9037
+ max: isLogScale ? (laneMax > 0 ? laneMax : 1) : max,
9038
+ splitLine: {
9039
+ show: !isDepthLane,
9040
+ showMaxLine: false,
9041
+ showMinLine: false,
9042
+ lineStyle: { color: getCssVariable("--kd-lane-container-item-line-color"), type: "dashed" },
9043
+ },
9044
+ axisLabel: { show: false },
9045
+ axisLine: { show: false },
9046
+ axisTick: { show: false },
9047
+ });
9048
+
9049
+ const baseSeries = {
9050
+ laneId: lineInfo.paramId,
9051
+ data: lineInfo.isUsed === "1" ? seriesData : [],
9052
+ type: "line",
9053
+ xAxisIndex: xAxisIndex,
9054
+ yAxisIndex: gridIndex,
9055
+ name: paramNameMap[lineInfo.paramId] || "",
9056
+ symbol: lineInfo.symbol || "none",
9057
+ color: lineInfo.themeConfig
9058
+ ? lineInfo.isGradient
9059
+ ? this.linearGradientLineColor[this.nowTheme][lineInfo.paramId]
9060
+ : lineInfo.themeConfig[this.nowTheme].lineColor
9061
+ : lineInfo.lineColor,
9062
+ symbolSize: getAdaptedFontSize(lineInfo.symbolSize || 6),
9063
+ lineStyle: {
9064
+ width: getAdaptedFontSize(+lineInfo.lineSize || 1.5),
9065
+ type: lineInfo.lineType,
9066
+ },
9067
+ clip: false,
9068
+ z: lineInfo.lineSort,
9069
+ };
9070
+
9071
+ this.addMarkLineToSeries(baseSeries, lineInfo, realTimeData, axisKey);
9072
+ this.addMarkAreaToSeries(baseSeries, lineInfo, realTimeData, axisKey, min, max);
9073
+ this.addAreaStyleToSeries(baseSeries, lineInfo, seriesData, min);
9074
+
9075
+ option.series.push(baseSeries);
9076
+ });
9077
+
9078
+ if (!isDepthLane && !isTimeLane && lane && lane.lines) {
9079
+ const min = Math.max(...lane.lines.map((item) => this.lineRange[item.lineId].min));
9080
+ option.series.unshift({
9081
+ name: "helper",
9082
+ type: "line",
9083
+ xAxisIndex: lane.lines.length * groupIndex,
9084
+ yAxisIndex: gridIndex,
9085
+ data: realTimeData.map((item) => [min, +item[axisKey]]),
9086
+ lineStyle: { opacity: 0 },
9087
+ symbol: "none",
9088
+ });
9089
+ }
8413
9090
  });
8414
- option.backgroundColor = "transparent";
8415
- delete option.tooltip;
8416
9091
  }
8417
- if (isTimeLane) {
8418
- await this.$nextTick();
8419
- let clientWidth = this.getLaneHeaderClientWidth(lane, laneIndex);
8420
- Object.assign(option.yAxis[0], {
8421
- splitLine: { show: false },
8422
- axisPointer: { show: false },
8423
- boundaryGap: false,
8424
- axisLabel: {
8425
- show: true,
8426
- width: clientWidth,
8427
- showMinLabel: false,
8428
- showMaxLabel: false,
8429
- align: "left",
8430
- color: getCssVariable("--default-text-color"),
8431
- rich: {
8432
- verticalAlign: "center",
8433
- center: { align: "center", fontSize: 12, width: clientWidth },
8434
- },
8435
- formatter: (value) => {
8436
- // 时间轴格式化:将时间戳格式化为可读时间
8437
- const timeStr = this.timestampToHms(value);
8438
- return `{center|${timeStr}}`;
8439
- },
8440
- },
8441
- });
8442
- option.backgroundColor = "transparent";
8443
- delete option.tooltip;
9092
+
9093
+ await this.$nextTick();
9094
+ this.updateOptionsByLineId(lane.laneId, option);
9095
+ this.$refs.refResizeChart && this.$refs.refResizeChart[laneIndex] && this.$refs.refResizeChart[laneIndex].connect(this.group);
9096
+ }
9097
+ } catch (error) {
9098
+ console.error("updateLanesChartOption error:", error);
9099
+ } finally {
9100
+ this.isUpdatingChart = false;
9101
+ }
9102
+ },
9103
+
9104
+ generateSeriesData(data, lineInfo, axisKey) {
9105
+ return data.map((item) => {
9106
+ let value = null;
9107
+ if (Object.prototype.hasOwnProperty.call(item, lineInfo.paramId)) {
9108
+ value = item[lineInfo.paramId];
9109
+ } else {
9110
+ const currentParam = this.params.find((p) => p.paramId == lineInfo.paramId);
9111
+ if (currentParam && currentParam.paramCode) {
9112
+ const codes = currentParam.paramCode.split(",");
9113
+ for (const code of codes) {
9114
+ if (Object.prototype.hasOwnProperty.call(item, code)) {
9115
+ value = item[code];
9116
+ break;
9117
+ }
9118
+ }
8444
9119
  }
8445
- const xAxis = [];
8446
- const series = [];
8447
- const colors = [];
8448
-
8449
- // line
8450
- lane &&
8451
- lane.lines &&
8452
- lane.lines.forEach((lineInfo, lineIndex) => {
8453
- let seriesData = [];
8454
- let validData = [];
8455
- // 获取当前轴类型的键
8456
- const axisKey =
8457
- (this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]) ||
8458
- (this.formCache.axisType === "time" ? "time" : "depth");
8459
-
8460
- if (this.formCache.axisType == "time") {
8461
- // 时间轴模式:数据格式为 [x, y],其中 y 是时间戳
8462
- let currentParam = this.params.find((p) => p.paramId == lineInfo.paramId);
8463
- seriesData = realTimeData.map((item) => {
8464
- let value = null;
8465
- if (Object.prototype.hasOwnProperty.call(item, lineInfo.paramId)) {
8466
- value = item && item[lineInfo.paramId];
8467
- } else {
8468
- if (Object.prototype.hasOwnProperty.call(currentParam, "paramCode") && currentParam.paramCode !== "") {
8469
- let codes = currentParam.paramCode.split(",");
8470
- codes.forEach((code) => {
8471
- if (Object.prototype.hasOwnProperty.call(item, code)) {
8472
- value = item && item[code];
8473
- return;
8474
- }
8475
- });
8476
- }
8477
- }
8478
- // 返回 [x, y] 格式,y 是时间戳
8479
- return [value, this.toMillisecondTimestamp(item[axisKey])];
8480
- });
8481
- validData = seriesData.filter((v) => Number.isFinite(+v[0]));
8482
- } else {
8483
- // 深度轴模式:数据格式为 [x, y],其中 y 是深度值
8484
- let currentParam = this.params.find((p) => p.paramId == lineInfo.paramId);
8485
- seriesData = realTimeData.map((item) => {
8486
- let value = null;
8487
- if (Object.prototype.hasOwnProperty.call(item, lineInfo.paramId)) {
8488
- value = item && item[lineInfo.paramId];
8489
- } else {
8490
- if (Object.prototype.hasOwnProperty.call(currentParam, "paramCode") && currentParam.paramCode !== "") {
8491
- let codes = currentParam.paramCode.split(",");
8492
- codes.forEach((code) => {
8493
- if (Object.prototype.hasOwnProperty.call(item, code)) {
8494
- value = item && item[code];
8495
- return;
8496
- }
8497
- });
8498
- }
8499
- }
8500
- // 返回 [x, y] 格式,y 是深度值
8501
- return [value, +item[axisKey]];
8502
- });
8503
- validData = seriesData.filter((v) => Number.isFinite(+v[0]));
9120
+ }
9121
+ return [value, +item[axisKey]];
9122
+ });
9123
+ },
9124
+
9125
+ getYAxisLabelFormatter(isTimeLane, dataGroups, groupIndex, groupMin, groupMax, axisKey) {
9126
+ return (value) => {
9127
+ if (isTimeLane) {
9128
+ return `{center|${this.timestampToHms(value)}}`;
9129
+ }
9130
+ if (groupIndex > 0 && value === groupMin) {
9131
+ const prevGroup = dataGroups[groupIndex - 1];
9132
+ const prevGroupMax = Math.max(...prevGroup.map((item) => +item[axisKey]));
9133
+ if (Math.abs(prevGroupMax - groupMin) < 1) return `{center2|${prevGroupMax}/${value}}`;
9134
+ return `{center2|${prevGroupMax.toFixed(0)}/${value.toFixed(0)}}`;
9135
+ }
9136
+ if (groupIndex <= dataGroups.length - 1 && value === groupMax) {
9137
+ return `{center|}`;
9138
+ }
9139
+ if (groupIndex === 0 && value === groupMin) {
9140
+ return `{center|}`;
9141
+ }
9142
+ return `{center|${typeof +value === "number" ? Number(Number(value).toFixed(0)) : value}}`;
9143
+ };
9144
+ },
9145
+
9146
+ addMarkLineToSeries(baseSeries, lineInfo, realTimeData, axisKey) {
9147
+ if (!this.markLineData || this.markLineData.length === 0) return;
9148
+
9149
+ baseSeries.markLine = {
9150
+ symbol: "none",
9151
+ label: { show: false },
9152
+ emphasis: { disabled: true },
9153
+ data: this.markLineData
9154
+ .map((item) => {
9155
+ if (this.formCache.axisType === "depth") {
9156
+ const markDepth = item.data?.depth || item.depth || item;
9157
+ const markTime = item.data?.timestamp || item.timestamp || 0;
9158
+ const markTimeMs = this.toMillisecondTimestamp(markTime);
9159
+
9160
+ const findItem = realTimeData.find((d) => d[axisKey] == markDepth);
9161
+ if (findItem) {
9162
+ return { yAxis: Number(markDepth), lineStyle: { color: item.color || "red", type: "dashed", width: 2 } };
8504
9163
  }
8505
- const { min, max } = this.getXAxisRangeByHeader(lineInfo, validData);
8506
9164
 
8507
- // X轴
8508
- xAxis.push({
8509
- show: !isDepthLane,
8510
- type: "value",
8511
- min,
8512
- max,
8513
- splitLine: {
8514
- show: !isDepthLane,
8515
- showMaxLine: false,
8516
- showMinLine: false,
8517
- lineStyle: { color: getCssVariable("--kd-lane-container-item-line-color"), type: "dashed" },
8518
- },
8519
- axisLabel: { show: false },
8520
- axisLine: { show: false },
8521
- axisTick: { show: false },
9165
+ let closestItem = null,
9166
+ minDiff = Infinity;
9167
+ realTimeData.forEach((d) => {
9168
+ const diff = Math.abs(Number(d[axisKey]) - Number(markDepth));
9169
+ if (diff < minDiff) {
9170
+ minDiff = diff;
9171
+ closestItem = d;
9172
+ }
8522
9173
  });
8523
- // series
8524
- const baseSeries = {
8525
- laneId: lineInfo.paramId,
8526
- data: lineInfo.isUsed === "1" ? seriesData : [],
8527
- type: "line",
8528
- xAxisIndex: lineIndex,
8529
- name: paramNameMap[lineInfo.paramId] || "",
8530
- symbol: lineInfo.symbol || "none",
8531
- symbolSize: getAdaptedFontSize(lineInfo.symbolSize || 6),
8532
- lineStyle: {
8533
- width: getAdaptedFontSize(+lineInfo.lineSize || 1.5),
8534
- type: lineInfo.lineType,
8535
- },
8536
- clip: false,
8537
- z: lineInfo.lineSort,
8538
- };
8539
9174
 
8540
- // 加标记线(
8541
- baseSeries.markLine = {
8542
- symbol: "none",
8543
- lineStyle: {
8544
- color: getCssVariable("--default-text-color"),
8545
- type: "dashed",
8546
- width: 1,
8547
- },
8548
- label: {
8549
- show: false,
8550
- },
8551
- emphasis: {
8552
- disabled: true,
8553
- },
8554
- data: this.markLineData
8555
- .map((item, index) => {
8556
- // 尝试精确匹配
8557
- const findItem = this.realTimeData.find((d) => d[this.toolBarConfig.axisTypeList[this.formCache.axisType]] == item);
8558
- if (findItem) {
8559
- if (this.formCache.axisType == "time") {
8560
- return { yAxis: this.toMillisecondTimestamp(findItem[this.toolBarConfig.axisTypeList[this.formCache.axisType]]) };
8561
- } else {
8562
- return { yAxis: Number(findItem[this.toolBarConfig.axisTypeList[this.formCache.axisType]]) };
8563
- }
8564
- } else {
8565
- // 精确匹配失败,找到最接近的深度值
8566
- let closestItem = null;
8567
- let minDiff = Infinity;
8568
- if (this.formCache.axisType == "time") minDiff = 5 * 1000;
8569
- if (this.formCache.axisType == "depth") minDiff = 5;
8570
- this.realTimeData.forEach((d) => {
8571
- const diff = Math.abs(Number(d[this.toolBarConfig.axisTypeList[this.formCache.axisType]]) - Number(item));
8572
- if (diff < minDiff) {
8573
- minDiff = diff;
8574
- closestItem = d;
8575
- }
8576
- });
8577
- if (closestItem) {
8578
- this.markLineData[index] = closestItem[this.toolBarConfig.axisTypeList[this.formCache.axisType]];
8579
- if (this.formCache.axisType == "time") {
8580
- return {
8581
- yAxis: this.toMillisecondTimestamp(closestItem[this.toolBarConfig.axisTypeList[this.formCache.axisType]]),
8582
- };
8583
- } else {
8584
- return { yAxis: closestItem[this.toolBarConfig.axisTypeList[this.formCache.axisType]] + "" };
8585
- }
8586
- }
8587
- return { yAxis: closestItem };
8588
- }
8589
- })
8590
- .filter((item) => item.yAxis !== null),
8591
- };
9175
+ if (closestItem) {
9176
+ const dataTime = closestItem.timestamp || 0;
9177
+ const dataTimeMs = this.toMillisecondTimestamp(dataTime);
9178
+ if (markTimeMs >= dataTimeMs) {
9179
+ return { yAxis: Number(markDepth), lineStyle: { color: item.color || "red", type: "dashed", width: 2 } };
9180
+ }
9181
+ }
9182
+ return { yAxis: null };
9183
+ } else if (this.formCache.axisType === "time") {
9184
+ const markTime = item.data?.time || item.time || item;
9185
+ const markTimeMs = this.toMillisecondTimestamp(markTime);
9186
+
9187
+ const findItem = realTimeData.find((d) => d[axisKey] == markTime);
9188
+ if (findItem) {
9189
+ return { yAxis: markTimeMs, lineStyle: { color: item.color || "red", type: "dashed", width: 2 } };
9190
+ }
8592
9191
 
8593
- // ===== 面积图 =====
8594
- if (lineInfo.lineType === "area") {
8595
- // 只对时间轴模式生效
8596
- if (seriesData.length > 0) {
8597
- // 找到第一个有效的数据点
8598
- const firstValidPoint = seriesData.find((point) => Number.isFinite(+point[0]));
8599
- if (firstValidPoint) {
8600
- // 在数据开始处添加一个辅助点,x 值为 x 轴的最小值,y 值与第一个数据点的 y 值相同
8601
- seriesData.unshift([min, firstValidPoint[1]]);
8602
- // 在数据结束处添加一个辅助点,x 值为 x 轴的最小值,y 值与最后一个数据点的 y 值相同
8603
- const lastValidPoint = seriesData[seriesData.length - 1];
8604
- if (lastValidPoint && Number.isFinite(+lastValidPoint[0])) {
8605
- seriesData.push([min, lastValidPoint[1]]);
8606
- }
8607
- }
9192
+ let closestItem = null,
9193
+ minDiff = Infinity;
9194
+ realTimeData.forEach((d) => {
9195
+ const diff = Math.abs(this.toMillisecondTimestamp(d[axisKey]) - markTimeMs);
9196
+ if (diff < minDiff) {
9197
+ minDiff = diff;
9198
+ closestItem = d;
8608
9199
  }
9200
+ });
8609
9201
 
8610
- baseSeries.areaStyle = {
8611
- origin: "start",
8612
- opacity: 1,
8613
- };
8614
- // 隐藏辅助点在 tooltip 中的显示
8615
- baseSeries.itemStyle = {
8616
- opacity: 0,
8617
- };
8618
- } else {
8619
- baseSeries.areaStyle = { opacity: 0 };
9202
+ if (closestItem) {
9203
+ return { yAxis: markTimeMs, lineStyle: { color: item.color || "red", type: "dashed", width: 2 } };
8620
9204
  }
9205
+ return { yAxis: null };
9206
+ }
9207
+ return { yAxis: Number(item.data || item), lineStyle: { color: item.color || "red", type: "dashed", width: 2 } };
9208
+ })
9209
+ .filter((item) => item.yAxis !== null),
9210
+ };
9211
+ },
9212
+
9213
+ addMarkAreaToSeries(baseSeries, lineInfo, realTimeData, axisKey, min, max) {
9214
+ if (!this.markAreaLineData || this.markAreaLineData.length === 0) return;
9215
+
9216
+ const currentMarkAreaData = this.markAreaLineData.filter((item) => item.paramsId === lineInfo.paramId);
9217
+ if (currentMarkAreaData.length === 0) return;
9218
+
9219
+ const markAreaData = [];
9220
+ currentMarkAreaData.forEach((areaItem) => {
9221
+ if (!areaItem.data || areaItem.data.length < 2) return;
8621
9222
 
8622
- series.push(baseSeries);
9223
+ const startData = areaItem.data[0];
9224
+ const endData = areaItem.data[1];
9225
+ let startY, endY;
8623
9226
 
8624
- const color = lineInfo.themeConfig
8625
- ? lineInfo.isGradient
8626
- ? this.linearGradientLineColor[this.nowTheme][lineInfo.paramId]
8627
- : lineInfo.themeConfig[this.nowTheme].lineColor
8628
- : lineInfo.lineColor;
9227
+ if (this.formCache.axisType === "depth") {
9228
+ const startDepth = startData.depth;
9229
+ const startTime = this.toMillisecondTimestamp(startData.timestamp || 0);
9230
+ const endDepth = endData.depth;
9231
+ const endTime = this.toMillisecondTimestamp(endData.timestamp || 0);
8629
9232
 
8630
- colors.push(color);
9233
+ const startFindItem = realTimeData.find((d) => d[axisKey] == startDepth && d.timestamp == startData.timestamp);
9234
+ if (startFindItem) {
9235
+ startY = Number(startDepth);
9236
+ } else {
9237
+ let closestStartItem = null,
9238
+ minStartDiff = Infinity;
9239
+ realTimeData.forEach((d) => {
9240
+ const diff = Math.abs(Number(d[axisKey]) - Number(startDepth));
9241
+ if (diff < minStartDiff) {
9242
+ minStartDiff = diff;
9243
+ closestStartItem = d;
9244
+ }
8631
9245
  });
8632
- // 获取当前轴类型的键
8633
- const axisKey =
8634
- (this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]) ||
8635
- (this.formCache.axisType === "time" ? "time" : "depth");
8636
-
8637
- if (series.length > 0 && this.formCache.axisType == "depth") {
8638
- let min = Math.max(...lane.lines.map((item) => this.getXAxisRangeByHeader(item).min));
8639
- // 兜底:深度轴模式使用 [x, y] 格式
8640
- series.unshift({
8641
- name: "helper",
8642
- type: "line",
8643
- data: realTimeData.map((item) => [min, +item[axisKey]]),
8644
- lineStyle: {
8645
- opacity: 0,
8646
- },
8647
- symbol: "none",
9246
+ if (closestStartItem) {
9247
+ const dataTimeMs = this.toMillisecondTimestamp(closestStartItem.timestamp || 0);
9248
+ startY = startTime >= dataTimeMs && closestStartItem[axisKey] >= startDepth ? Number(startDepth) : null;
9249
+ } else {
9250
+ startY = null;
9251
+ }
9252
+ }
9253
+
9254
+ const endFindItem = realTimeData.find((d) => d[axisKey] == endDepth && d.timestamp == endData.timestamp);
9255
+ if (endFindItem) {
9256
+ endY = Number(endDepth);
9257
+ } else {
9258
+ let closestEndItem = null,
9259
+ minEndDiff = Infinity;
9260
+ realTimeData.forEach((d) => {
9261
+ const diff = Math.abs(Number(d[axisKey]) - Number(endDepth));
9262
+ if (diff < minEndDiff) {
9263
+ minEndDiff = diff;
9264
+ closestEndItem = d;
9265
+ }
8648
9266
  });
8649
- colors.unshift("transparent");
9267
+ if (closestEndItem) {
9268
+ const dataTimeMs = this.toMillisecondTimestamp(closestEndItem.timestamp || 0);
9269
+ endY = endTime >= dataTimeMs && closestEndItem[axisKey] <= endDepth ? Number(endDepth) : null;
9270
+ } else {
9271
+ endY = null;
9272
+ }
8650
9273
  }
8651
- if (series.length > 0 && this.formCache.axisType == "time") {
8652
- let min = Math.max(...lane.lines.map((item) => this.getXAxisRangeByHeader(item).min));
8653
- series.unshift({
8654
- name: "helper",
8655
- type: "line",
8656
- data: realTimeData.map((item) => [min, this.toMillisecondTimestamp(item[axisKey])]),
8657
- lineStyle: {
8658
- opacity: 0,
8659
- },
8660
- symbol: "none",
9274
+ } else if (this.formCache.axisType === "time") {
9275
+ const startTime = startData.time;
9276
+ const endTime = endData.time;
9277
+ const startTimeMs = this.toMillisecondTimestamp(startTime);
9278
+ const endTimeMs = this.toMillisecondTimestamp(endTime);
9279
+
9280
+ const startFindItem = realTimeData.find((d) => d[axisKey] == startTime);
9281
+ startY = startFindItem ? startTimeMs : null;
9282
+ if (!startY) {
9283
+ let closestStartItem = null,
9284
+ minStartDiff = Infinity;
9285
+ realTimeData.forEach((d) => {
9286
+ const diff = Math.abs(this.toMillisecondTimestamp(d[axisKey]) - startTimeMs);
9287
+ if (diff < minStartDiff) {
9288
+ minStartDiff = diff;
9289
+ closestStartItem = d;
9290
+ }
8661
9291
  });
8662
- colors.unshift("transparent");
9292
+ startY = closestStartItem ? startTimeMs : null;
8663
9293
  }
8664
- merge(option, {
8665
- xAxis,
8666
- series,
8667
- color: colors,
8668
- });
8669
- await this.$nextTick();
8670
- if (type === "all") {
8671
- this.updateOptionsByLineId(lane.laneId, option);
8672
- this.$refs.refResizeChart[laneIndex] && this.$refs.refResizeChart[laneIndex].connect(this.group);
8673
- } else if (type === "series") {
8674
- this.updateOptionsByLineId2(lane.laneId, option);
9294
+
9295
+ const endFindItem = realTimeData.find((d) => d[axisKey] == endTime);
9296
+ endY = endFindItem ? endTimeMs : null;
9297
+ if (!endY) {
9298
+ let closestEndItem = null,
9299
+ minEndDiff = Infinity;
9300
+ realTimeData.forEach((d) => {
9301
+ const diff = Math.abs(this.toMillisecondTimestamp(d[axisKey]) - endTimeMs);
9302
+ if (diff < minEndDiff) {
9303
+ minEndDiff = diff;
9304
+ closestEndItem = d;
9305
+ }
9306
+ });
9307
+ endY = closestEndItem ? endTimeMs : null;
8675
9308
  }
9309
+ } else {
9310
+ startY = Number(startData.depth || startData.y);
9311
+ endY = Number(endData.depth || endData.y);
8676
9312
  }
8677
- this.$forceUpdate();
8678
- } catch (e) {
8679
- console.error(e);
8680
- this.clearEcharts();
9313
+
9314
+ if (startY !== null && endY !== null) {
9315
+ markAreaData.push([
9316
+ { xAxis: min, yAxis: startY },
9317
+ { xAxis: max, yAxis: endY },
9318
+ ]);
9319
+ }
9320
+ });
9321
+
9322
+ if (markAreaData.length > 0) {
9323
+ baseSeries.markArea = {
9324
+ silent: true,
9325
+ itemStyle: {
9326
+ color: currentMarkAreaData[0]?.color || "rgba(255, 0, 0, 0.1)",
9327
+ borderWidth: 0,
9328
+ },
9329
+ data: markAreaData,
9330
+ };
8681
9331
  }
8682
9332
  },
8683
- async clearEcharts() {
8684
- const lanes = cloneDeep(this.currentTemplate.lanes);
8685
- this.lineData = [];
8686
- for (let laneIndex = 0; laneIndex < lanes.length; ++laneIndex) {
8687
- const kdLaneChartOption = this.getDefaultLaneChartOption();
8688
- const optionFromRealTimeData = {
8689
- xAxis: [],
8690
- series: [],
8691
- color: [],
8692
- };
8693
- for (let lineIndex = 0; lineIndex < lanes[laneIndex].length; ++lineIndex) {
8694
- const seriesData = [];
8695
- optionFromRealTimeData.xAxis.push({
8696
- show: laneIndex !== 0,
8697
- type: "value",
8698
- splitLine: {
8699
- show: laneIndex !== 0,
8700
- showMinLine: false,
8701
- showMaxLine: false,
8702
- lineStyle: {
8703
- color: getCssVariable("--default-text-color"),
8704
- type: "dashed",
8705
- opacity: 0.1,
8706
- },
8707
- },
8708
- axisLabel: {
8709
- show: false,
8710
- },
8711
- axisLine: {
8712
- show: false,
8713
- onZero: false,
8714
- },
8715
- axisTick: {
8716
- show: false,
8717
- },
8718
- min: 0,
8719
- max: 0,
9333
+
9334
+ addAreaStyleToSeries(baseSeries, lineInfo, seriesData, min) {
9335
+ if (lineInfo.lineType !== "area") {
9336
+ baseSeries.areaStyle = { opacity: 0 };
9337
+ return;
9338
+ }
9339
+
9340
+ if (seriesData.length > 0) {
9341
+ const firstValidPoint = seriesData.find((point) => Number.isFinite(+point[0]));
9342
+ if (firstValidPoint) {
9343
+ seriesData.unshift([min, firstValidPoint[1]]);
9344
+ const lastValidPoint = seriesData[seriesData.length - 1];
9345
+ if (lastValidPoint && Number.isFinite(+lastValidPoint[0])) {
9346
+ seriesData.push([min, lastValidPoint[1]]);
9347
+ }
9348
+ }
9349
+ }
9350
+
9351
+ baseSeries.areaStyle = {
9352
+ origin: "start",
9353
+ emphasis: { disabled: true },
9354
+ color: lineInfo.themeConfig
9355
+ ? lineInfo.isGradient
9356
+ ? this.linearGradientLineColor[this.nowTheme][lineInfo.paramId]
9357
+ : lineInfo.themeConfig[this.nowTheme].lineColor
9358
+ : lineInfo.lineColor,
9359
+ opacity: 1,
9360
+ };
9361
+ baseSeries.itemStyle = { opacity: 0 };
9362
+ },
9363
+
9364
+ async updateLanesChartOptionIncremental(transferData) {
9365
+ if (this.isUpdatingChart) return;
9366
+ this.isUpdatingChart = true;
9367
+
9368
+ let realTimeData = transferData && transferData.length > 0 ? transferData : this.getVisibleData();
9369
+ const lanes = this.currentTemplate && this.currentTemplate.lanes;
9370
+
9371
+ if (!lanes || lanes.length === 0) {
9372
+ this.isUpdatingChart = false;
9373
+ return;
9374
+ }
9375
+
9376
+ const axisKey =
9377
+ (this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]) ||
9378
+ (this.formCache.axisType === "time" ? "time" : "depth");
9379
+
9380
+ try {
9381
+ for (let laneIndex = 0; laneIndex < lanes.length; laneIndex++) {
9382
+ const lane = lanes[laneIndex];
9383
+ const chartRef = this.$refs.refResizeChart && this.$refs.refResizeChart[laneIndex];
9384
+ if (!chartRef || !chartRef.chart) continue;
9385
+
9386
+ const chart = chartRef.chart;
9387
+ const currentOption = chart.getOption();
9388
+
9389
+ const axisTypeList = this.toolBarConfig.axisTypeList || { depth: "depth", time: "time" };
9390
+ const isDepthLane = Object.prototype.hasOwnProperty.call(axisTypeList, "depth") && axisTypeList.depth == lane.laneKey;
9391
+
9392
+ const dataGroups = splitArrayByDepth(realTimeData, axisKey);
9393
+ if (dataGroups.length === 0) continue;
9394
+
9395
+ const updates = {};
9396
+ const needUpdate = {
9397
+ grid: false,
9398
+ yAxis: false,
9399
+ xAxis: false,
9400
+ series: false,
9401
+ };
9402
+
9403
+ const newGrid = [];
9404
+ const newYAxis = [];
9405
+ const newXAxis = [];
9406
+ const newSeriesData = [];
9407
+
9408
+ let totalHeight = 0;
9409
+ const groupHeights = [];
9410
+ dataGroups.forEach((group) => {
9411
+ const groupDepths = group.map((item) => +item[axisKey]);
9412
+ const groupRange = Math.max(...groupDepths) - Math.min(...groupDepths);
9413
+ groupHeights.push(groupRange);
9414
+ totalHeight += groupRange;
8720
9415
  });
8721
- if (laneIndex !== 0) {
8722
- if (!lanes[laneIndex][lineIndex].titleLineColor.includes("linear-gradient")) {
8723
- optionFromRealTimeData.series.push({
8724
- laneId: lanes[laneIndex][lineIndex].laneId,
8725
- data: lanes[laneIndex][lineIndex].visible ? seriesData : [],
8726
- type: lanes[laneIndex][lineIndex].lineType,
8727
- showAllSymbol: true,
8728
- symbol: lanes[laneIndex][lineIndex].symbol || "none",
8729
- symbolSize: getAdaptedFontSize(lanes[laneIndex][lineIndex].symbolSize || 6),
8730
- name: `${lanes[laneIndex][lineIndex].paramName}${lanes[laneIndex][lineIndex].unit}`,
8731
- xAxisIndex: lineIndex,
8732
- lineStyle: {
8733
- width: getAdaptedFontSize(lanes[laneIndex][lineIndex].curveSize || 1.5),
8734
- type: lanes[laneIndex][lineIndex].curveType,
8735
- },
8736
- // areaStyle: {
8737
- // color: {
8738
- // type: "linear", // 线性渐变
8739
- // x: 0,
8740
- // y: 0, // 渐变起点:图形顶部
8741
- // x2: 0,
8742
- // y2: 1, // 渐变终点:图形底部(垂直方向渐变)
8743
- // colorStops: seriesData.map(() => {
8744
- // return {
8745
- // offset: 1,
8746
- // color: lanes[laneIndex][lineIndex].color,
8747
- // };
8748
- // }),
8749
- // },
8750
- // },
8751
- });
9416
+
9417
+ const allValues = [];
9418
+ dataGroups.forEach((group) => {
9419
+ group.forEach((item) => {
9420
+ allValues.push(+item[axisKey]);
9421
+ });
9422
+ });
9423
+
9424
+ allValues.sort((a, b) => a - b);
9425
+ const allIntervals = [];
9426
+ for (let i = 1; i < allValues.length; i++) {
9427
+ const interval = Math.abs(allValues[i] - allValues[i - 1]);
9428
+ if (interval > 0) {
9429
+ allIntervals.push(interval);
9430
+ }
9431
+ }
9432
+
9433
+ let unifiedInterval = 5;
9434
+ if (allIntervals.length > 0) {
9435
+ const minInterval = Math.min(...allIntervals);
9436
+ const totalRange = Math.max(...allValues) - Math.min(...allValues);
9437
+ const intervalCount = Math.max(1, Math.min(12, Math.ceil(totalRange / minInterval)));
9438
+ unifiedInterval = Math.ceil(totalRange / Math.min(12, intervalCount));
9439
+ unifiedInterval = Math.max(minInterval, Math.ceil(unifiedInterval / minInterval) * minInterval);
9440
+ }
9441
+
9442
+ let currentTop = 0;
9443
+ let seriesIndex = 0;
9444
+
9445
+ dataGroups.forEach((group, groupIndex) => {
9446
+ const groupDepths = group.map((item) => +item[axisKey]);
9447
+ const groupMin = Math.min(...groupDepths);
9448
+ const groupMax = Math.max(...groupDepths);
9449
+ const groupHeight = (groupHeights[groupIndex] / totalHeight) * 100;
9450
+ const gridIndex = newYAxis.length;
9451
+
9452
+ const gridItem = {
9453
+ top: `${currentTop}%`,
9454
+ left: 2,
9455
+ right: 2,
9456
+ height: `${groupHeight}%`,
9457
+ show: false,
9458
+ containLabel: false,
9459
+ };
9460
+
9461
+ const currentGrid = currentOption.grid && currentOption.grid[gridIndex];
9462
+ if (!currentGrid || currentGrid.top !== gridItem.top || currentGrid.height !== gridItem.height) {
9463
+ needUpdate.grid = true;
9464
+ }
9465
+ newGrid.push(gridItem);
9466
+
9467
+ const yAxisItem = {
9468
+ gridIndex: gridIndex,
9469
+ type: "value",
9470
+ min: groupMin,
9471
+ max: groupMax,
9472
+ inverse: true,
9473
+ boundaryGap: false,
9474
+ interval: unifiedInterval,
9475
+ };
9476
+
9477
+ const currentYAxis = currentOption.yAxis && currentOption.yAxis[gridIndex];
9478
+ if (
9479
+ !currentYAxis ||
9480
+ currentYAxis.min !== groupMin ||
9481
+ currentYAxis.max !== groupMax ||
9482
+ currentYAxis.interval !== unifiedInterval
9483
+ ) {
9484
+ needUpdate.yAxis = true;
9485
+ }
9486
+ newYAxis.push(yAxisItem);
9487
+
9488
+ if (isDepthLane) {
9489
+ const xAxisItem = {
9490
+ gridIndex: gridIndex,
9491
+ type: "value",
9492
+ min: 0,
9493
+ max: 10,
9494
+ };
9495
+ const currentXAxis = currentOption.xAxis && currentOption.xAxis[groupIndex];
9496
+ if (!currentXAxis || currentXAxis.min !== 0 || currentXAxis.max !== 10) {
9497
+ needUpdate.xAxis = true;
9498
+ }
9499
+ newXAxis.push(xAxisItem);
9500
+ seriesIndex++;
8752
9501
  } else {
8753
- optionFromRealTimeData.series.push({
8754
- laneId: lanes[laneIndex][lineIndex].laneId,
8755
- data: lanes[laneIndex][lineIndex].visible ? seriesData : [],
8756
- type: lanes[laneIndex][lineIndex].lineType,
8757
- showAllSymbol: true,
8758
- symbol: lanes[laneIndex][lineIndex].symbol || "none",
8759
- symbolSize: getAdaptedFontSize(lanes[laneIndex][lineIndex].symbolSize || 6),
8760
- name: `${lanes[laneIndex][lineIndex].paramName}${lanes[laneIndex][lineIndex].unit}`,
8761
- xAxisIndex: lineIndex,
8762
- lineStyle: {
8763
- width: getAdaptedFontSize(lanes[laneIndex][lineIndex].curveSize || 1.5),
8764
- type: lanes[laneIndex][lineIndex].curveType,
9502
+ if (lane && lane.lines) {
9503
+ lane.lines.forEach((lineInfo) => {
9504
+ const allSeriesData = this.generateSeriesData(realTimeData, lineInfo, axisKey);
9505
+ const { min, max } = this.getXAxisRangeByHeader(lineInfo, allSeriesData);
9506
+ const isLogScale = lane.isLogScale === "1";
9507
+
9508
+ const xAxisItem = {
9509
+ gridIndex: gridIndex,
9510
+ type: isLogScale ? "log" : "value",
9511
+ min: isLogScale ? (this.lineRange[lineInfo.lineId]?.min > 0 ? this.lineRange[lineInfo.lineId].min : 0.1) : min,
9512
+ max: isLogScale ? (this.lineRange[lineInfo.lineId]?.max > 0 ? this.lineRange[lineInfo.lineId].max : 1) : max,
9513
+ };
9514
+
9515
+ const currentXAxis = currentOption.xAxis && currentOption.xAxis[seriesIndex];
9516
+ if (!currentXAxis || currentXAxis.min !== xAxisItem.min || currentXAxis.max !== xAxisItem.max) {
9517
+ needUpdate.xAxis = true;
9518
+ }
9519
+ newXAxis.push(xAxisItem);
9520
+
9521
+ const seriesData = this.generateSeriesData(group, lineInfo, axisKey);
9522
+ const finalSeriesData = lineInfo.isUsed === "1" ? seriesData : [];
9523
+
9524
+ const currentSeries = currentOption.series && currentOption.series[seriesIndex];
9525
+ if (!currentSeries || JSON.stringify(currentSeries.data) !== JSON.stringify(finalSeriesData)) {
9526
+ needUpdate.series = true;
9527
+ newSeriesData.push({ index: seriesIndex, data: finalSeriesData });
9528
+ }
9529
+
9530
+ seriesIndex++;
9531
+ });
9532
+ }
9533
+ }
9534
+
9535
+ currentTop += groupHeight;
9536
+ });
9537
+
9538
+ if (needUpdate.grid) {
9539
+ updates.grid = newGrid;
9540
+ }
9541
+ if (needUpdate.yAxis) {
9542
+ updates.yAxis = newYAxis;
9543
+ }
9544
+ if (needUpdate.xAxis) {
9545
+ updates.xAxis = newXAxis;
9546
+ }
9547
+ if (needUpdate.series) {
9548
+ updates.series = [];
9549
+ newSeriesData.forEach((item) => {
9550
+ updates.series.push({
9551
+ update: {
9552
+ index: item.index,
9553
+ data: item.data,
8765
9554
  },
8766
- // areaStyle: {
8767
- // color: {
8768
- // type: "linear", // 线性渐变
8769
- // x: 0,
8770
- // y: 0, // 渐变起点:图形顶部
8771
- // x2: 0,
8772
- // y2: 1, // 渐变终点:图形底部(垂直方向渐变)
8773
- // colorStops: seriesData.map((item, index) => {
8774
- // return {
8775
- // offset: Math.max(0, Math.min(1, index / (seriesData.length - 1 || 1))),
8776
- // color: this.getFixedColorFromGradient(
8777
- // lanes[laneIndex][lineIndex].titleLineColor,
8778
- // item,
8779
- // lanes[laneIndex][lineIndex].paramId,
8780
- // 0,
8781
- // ),
8782
- // };
8783
- // }),
8784
- // },
8785
- // opacity: 1,
8786
- // },
8787
9555
  });
8788
- }
9556
+ });
9557
+ }
9558
+
9559
+ if (Object.keys(updates).length > 0) {
9560
+ chart.setOption(updates, { notMerge: false, lazyUpdate: true });
8789
9561
  }
8790
- optionFromRealTimeData.selectList.push(lanes[laneIndex][lineIndex].visible);
8791
- optionFromRealTimeData.titleLineColor.push(lanes[laneIndex][lineIndex].titleLineColor);
8792
- optionFromRealTimeData.color.push(lanes[laneIndex][lineIndex].color);
8793
9562
  }
8794
- merge(kdLaneChartOption, optionFromRealTimeData);
9563
+ } catch (error) {
9564
+ console.error("updateLanesChartOptionIncremental error:", error);
9565
+ } finally {
9566
+ this.isUpdatingChart = false;
9567
+ }
9568
+ },
9569
+ async clearEcharts() {
9570
+ try {
9571
+ this.allOptions = [];
9572
+
9573
+ // 强制更新视图
8795
9574
  await this.$nextTick();
8796
- this.currentTemplate.lanes[laneIndex].option = kdLaneChartOption;
9575
+ this.$forceUpdate();
9576
+ } catch (e) {
9577
+ console.error("清空图表失败:", e);
8797
9578
  }
8798
9579
  },
8799
9580
  // 数据去重
8800
- deduplicateAndSort(existingData, newData, uniqueKey, options = {}) {
8801
- // 处理默认配置
8802
- const { sortOrder = "asc" } = options;
8803
- const newDataArr = Array.isArray(newData) ? newData : [newData];
8804
- let resultData = JSON.parse(JSON.stringify(existingData));
8805
- newDataArr.forEach((newItem) => {
8806
- if (!newItem || !newItem[uniqueKey]) return;
8807
- const duplicateIndex = resultData.findIndex((item) => item[uniqueKey] === newItem[uniqueKey]);
8808
- if (duplicateIndex > -1) {
8809
- resultData[duplicateIndex] = newItem;
8810
- } else {
8811
- resultData.push(newItem);
8812
- }
8813
- });
8814
- resultData.sort((a, b) => {
8815
- const valA = a[uniqueKey];
8816
- const valB = b[uniqueKey];
9581
+ uniqueByKeys(arr, keys) {
9582
+ // 非数组直接返回空
9583
+ if (!Array.isArray(arr)) return [];
8817
9584
 
8818
- if (typeof valA === "string" && typeof valB === "string") {
8819
- return sortOrder === "asc" ? valA.localeCompare(valB) : valB.localeCompare(valA);
9585
+ // 把单个属性转为数组,统一处理
9586
+ const keyList = Array.isArray(keys) ? keys : [keys];
9587
+
9588
+ // 用于记录已经出现过的组合标识
9589
+ const seen = new Set();
9590
+
9591
+ return arr.filter((item) => {
9592
+ // 过滤非对象元素
9593
+ if (typeof item !== "object" || item === null) return false;
9594
+
9595
+ // 生成唯一标识:多属性用 | 拼接,避免属性值冲突
9596
+ const identifier = keyList.map((key) => item[key]).join("|");
9597
+
9598
+ // 已经存在 → 过滤掉;不存在 → 保留并加入Set
9599
+ if (seen.has(identifier)) {
9600
+ return false;
8820
9601
  } else {
8821
- return sortOrder === "asc" ? valA - valB : valB - valA;
9602
+ seen.add(identifier);
9603
+ return true;
8822
9604
  }
8823
9605
  });
8824
-
8825
- return resultData;
8826
9606
  },
8827
- // 根据 uniqueKey 去重并排序(只考虑 uniqueKey)
9607
+ // 根据 uniqueKey 去重并排序(只考虑 uniqueKey)
8828
9608
  deduplicateByUniqueKey(existingData, newData, uniqueKey, options = {}) {
8829
9609
  // 处理默认配置
8830
- const { sortOrder = "asc" } = options;
9610
+ const { sortOrder = "asc", isSort = true } = options;
8831
9611
  const newDataArr = Array.isArray(newData) ? newData : [newData];
8832
9612
 
8833
9613
  // 合并数据并去重(只根据 uniqueKey)
@@ -8846,17 +9626,19 @@ var script$2 = {
8846
9626
  }
8847
9627
  });
8848
9628
 
8849
- // 排序
8850
- resultData.sort((a, b) => {
8851
- const valA = a[uniqueKey];
8852
- const valB = b[uniqueKey];
9629
+ // 排序(根据 uniqueKey)
9630
+ if (isSort) {
9631
+ resultData.sort((a, b) => {
9632
+ const valA = a[uniqueKey];
9633
+ const valB = b[uniqueKey];
8853
9634
 
8854
- if (typeof valA === "string" && typeof valB === "string") {
8855
- return sortOrder === "asc" ? valA.localeCompare(valB) : valB.localeCompare(valA);
8856
- } else {
8857
- return sortOrder === "asc" ? valA - valB : valB - valA;
8858
- }
8859
- });
9635
+ if (typeof valA === "string" && typeof valB === "string") {
9636
+ return sortOrder === "asc" ? valA.localeCompare(valB) : valB.localeCompare(valA);
9637
+ } else {
9638
+ return sortOrder === "asc" ? valA - valB : valB - valA;
9639
+ }
9640
+ });
9641
+ }
8860
9642
 
8861
9643
  return resultData;
8862
9644
  },
@@ -8929,6 +9711,16 @@ var script$2 = {
8929
9711
  this.startX = event.clientX;
8930
9712
  this.startWidth = this.getEffectiveLaneWidthPx(lane);
8931
9713
  },
9714
+ timestampToYMDHMS(timestamp) {
9715
+ const date = new Date(timestamp);
9716
+ const h = String(date.getHours()).padStart(2, "0");
9717
+ const m = String(date.getMinutes()).padStart(2, "0");
9718
+ const s = String(date.getSeconds()).padStart(2, "0");
9719
+ const y = date.getFullYear();
9720
+ const month = String(date.getMonth() + 1).padStart(2, "0");
9721
+ const day = String(date.getDate()).padStart(2, "0");
9722
+ return `${y}-${month}-${day} ${h}:${m}:${s}`;
9723
+ },
8932
9724
  resize(event) {
8933
9725
  if (!this.isResizing || !this.currentLane) return;
8934
9726
 
@@ -9039,10 +9831,9 @@ var script$2 = {
9039
9831
  } else {
9040
9832
  this.windowSize = maxSize;
9041
9833
  let newsize = Math.round((maxSize / this.pxToCm()) * this.depthInterval);
9042
- let data = [1, 2, 5, 10, 20];
9834
+ let data = this.toolBarConfig?.scaleList?.map((item) => item.value) || [];
9043
9835
  this.$emit("updateScale", data.includes(newsize) ? newsize : `1:${newsize * 100}`);
9044
9836
  }
9045
- console.log(this.windowSize, "windowSize");
9046
9837
  },
9047
9838
  },
9048
9839
  computed: {
@@ -9078,37 +9869,116 @@ var script$2 = {
9078
9869
  return lineCount;
9079
9870
  },
9080
9871
  headerStyle() {
9081
- const common = { gap: `${this.itemGap}px`, padding: `${this.headerPadding}px` };
9872
+ const common = { gap: `${this.currentHeaderStyle.itemGap}px`, padding: `${this.currentHeaderStyle.headerPadding}px` };
9082
9873
  if (!this.currentTemplate) {
9083
- return { ...common, height: "30%", "min-height": "60px" };
9874
+ let data = {
9875
+ ...common,
9876
+ height: "30%",
9877
+ "min-height": "60px",
9878
+ };
9879
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "headerHeight")) {
9880
+ data.height = isNumeric(this.currentHeaderStyle.headerHeight)
9881
+ ? this.currentHeaderStyle.headerHeight + "px"
9882
+ : this.currentHeaderStyle.headerHeight;
9883
+ }
9884
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "maxHeaderHeight")) {
9885
+ data["max-height"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)
9886
+ ? this.currentHeaderStyle.maxHeaderHeight + "px"
9887
+ : this.currentHeaderStyle.maxHeaderHeight;
9888
+ }
9889
+ return data;
9084
9890
  } else {
9085
9891
  const { lanes = [] } = this.currentTemplate;
9086
9892
  if (!lanes || lanes.length == 0) {
9087
- return { ...common, height: "30%", "min-height": "60px" };
9893
+ let data = {
9894
+ ...common,
9895
+ height: "30%",
9896
+ "min-height": "60px",
9897
+ };
9898
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "headerHeight")) {
9899
+ data.height = isNumeric(this.currentHeaderStyle.headerHeight)
9900
+ ? this.currentHeaderStyle.headerHeight + "px"
9901
+ : this.currentHeaderStyle.headerHeight;
9902
+ }
9903
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "maxHeaderHeight")) {
9904
+ data["max-height"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)
9905
+ ? this.currentHeaderStyle.maxHeaderHeight + "px"
9906
+ : this.currentHeaderStyle.maxHeaderHeight;
9907
+ }
9908
+ return data;
9088
9909
  } else {
9089
9910
  const gapCount = Math.max(0, this.lineCount - 1);
9090
- return {
9911
+ let data = {
9091
9912
  ...common,
9092
- height: `${this.lineCount * (this.formCache.displayType == "header" ? this.headerItemHeight : this.headerItemHeight * 0.8) + this.headerPadding * 2 + gapCount * this.itemGap}px`,
9913
+ height: `${this.lineCount * (this.formCache.displayType == "header" ? this.currentHeaderStyle.headerItemHeight : this.currentHeaderStyle.headerItemHeight * 0.8) + this.currentHeaderStyle.headerPadding * 2 + gapCount * this.currentHeaderStyle.itemGap}px`,
9093
9914
  "min-height": "60px",
9094
9915
  };
9916
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "headerHeight")) {
9917
+ data.height = isNumeric(this.currentHeaderStyle.headerHeight)
9918
+ ? this.currentHeaderStyle.headerHeight + "px"
9919
+ : this.currentHeaderStyle.headerHeight;
9920
+ }
9921
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "maxHeaderHeight")) {
9922
+ data["max-height"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)
9923
+ ? this.currentHeaderStyle.maxHeaderHeight + "px"
9924
+ : this.currentHeaderStyle.maxHeaderHeight;
9925
+ }
9926
+ return data;
9095
9927
  }
9096
9928
  }
9097
9929
  },
9098
9930
  slotHeaderStyle() {
9099
- // return { height: "30%", "min-height": "60px" };
9100
9931
  if (!this.currentTemplate) {
9101
- return { height: "30%", "min-height": "60px" };
9932
+ let data = {
9933
+ height: "30%",
9934
+ "min-height": "60px",
9935
+ };
9936
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "headerHeight")) {
9937
+ data.height = isNumeric(this.currentHeaderStyle.headerHeight)
9938
+ ? this.currentHeaderStyle.headerHeight + "px"
9939
+ : this.currentHeaderStyle.headerHeight;
9940
+ }
9941
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "maxHeaderHeight")) {
9942
+ data["max-height"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)
9943
+ ? this.currentHeaderStyle.maxHeaderHeight + "px"
9944
+ : this.currentHeaderStyle.maxHeaderHeight;
9945
+ }
9946
+ return data;
9102
9947
  } else {
9103
9948
  const { lanes = [] } = this.currentTemplate;
9104
9949
  if (!lanes || lanes.length == 0) {
9105
- return { height: "30%", "min-height": "60px" };
9950
+ let data = {
9951
+ height: "30%",
9952
+ "min-height": "60px",
9953
+ };
9954
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "headerHeight")) {
9955
+ data.height = isNumeric(this.currentHeaderStyle.headerHeight)
9956
+ ? this.currentHeaderStyle.headerHeight + "px"
9957
+ : this.currentHeaderStyle.headerHeight;
9958
+ }
9959
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "maxHeaderHeight")) {
9960
+ data["max-height"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)
9961
+ ? this.currentHeaderStyle.maxHeaderHeight + "px"
9962
+ : this.currentHeaderStyle.maxHeaderHeight;
9963
+ }
9964
+ return data;
9106
9965
  } else {
9107
9966
  const gapCount = Math.max(0, this.lineCount - 1);
9108
- return {
9109
- height: `${this.lineCount * (this.formCache.displayType == "header" ? this.headerItemHeight : this.headerItemHeight * 0.8) + this.headerPadding * 2 + gapCount * this.itemGap}px`,
9967
+ let data = {
9968
+ height: `${this.lineCount * (this.formCache.displayType == "header" ? this.currentHeaderStyle.headerItemHeight : this.currentHeaderStyle.headerItemHeight * 0.8) + this.currentHeaderStyle.headerPadding * 2 + gapCount * this.currentHeaderStyle.itemGap}px`,
9110
9969
  "min-height": "60px",
9111
9970
  };
9971
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "headerHeight")) {
9972
+ data.height = isNumeric(this.currentHeaderStyle.headerHeight)
9973
+ ? this.currentHeaderStyle.headerHeight + "px"
9974
+ : this.currentHeaderStyle.headerHeight;
9975
+ }
9976
+ if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, "maxHeaderHeight")) {
9977
+ data["max-height"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)
9978
+ ? this.currentHeaderStyle.maxHeaderHeight + "px"
9979
+ : this.currentHeaderStyle.maxHeaderHeight;
9980
+ }
9981
+ return data;
9112
9982
  }
9113
9983
  }
9114
9984
  },
@@ -9126,7 +9996,17 @@ var script$2 = {
9126
9996
  handler(newVal) {
9127
9997
  this.$nextTick(() => {
9128
9998
  this.markLineData = newVal;
9129
- this.updateLanesChartOption(null , 'series');
9999
+ this.updateLanesChartOption();
10000
+ });
10001
+ },
10002
+ deep: true,
10003
+ immediate: true,
10004
+ },
10005
+ warningAreaData: {
10006
+ handler(newVal) {
10007
+ this.$nextTick(() => {
10008
+ this.markAreaLineData = newVal;
10009
+ this.updateLanesChartOption();
9130
10010
  });
9131
10011
  },
9132
10012
  deep: true,
@@ -9147,7 +10027,7 @@ var script$2 = {
9147
10027
  }
9148
10028
  if (newVal && this.formCache.axisType == "depth") {
9149
10029
  let size = Math.round((newVal * this.depthInterval) / this.pxToCm());
9150
- let data = [1, 2, 5, 10, 20];
10030
+ let data = this.toolBarConfig?.scaleList?.map((item) => item.value) || [];
9151
10031
  this.$emit("updateScale", data.includes(size) ? size : `1:${size * 100}`);
9152
10032
  }
9153
10033
  },
@@ -9157,27 +10037,49 @@ var script$2 = {
9157
10037
  handler(val) {
9158
10038
  if (!val || val.length === 0) return;
9159
10039
 
9160
- const first = val[0];
9161
- const last = val[val.length - 1];
9162
-
9163
10040
  const axisKey = this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType];
9164
- // depth 或 timeStamp
9165
10041
 
9166
- const firstValue = first && first[axisKey];
9167
- const lastValue = last && last[axisKey];
10042
+ if (this.formCache.axisType === "depth") {
10043
+ // 按grid分组传递visibleData
10044
+ const dataGroups = splitArrayByDepth(val, axisKey);
10045
+ const first = val[0];
10046
+ const last = val[val.length - 1];
10047
+ const firstValue = first && first[axisKey];
10048
+ const lastValue = last && last[axisKey];
10049
+ const newParams = { firstValue, lastValue, settings: cloneDeep(this.formCache), dataGroups };
9168
10050
 
9169
- const newParams = { firstValue, lastValue, settings: cloneDeep(this.formCache) };
10051
+ // 比较是否与上次触发时的参数相同
10052
+ if (
10053
+ this.lastVisibleDataChangeParams &&
10054
+ this.lastVisibleDataChangeParams.firstValue === firstValue &&
10055
+ this.lastVisibleDataChangeParams.lastValue === lastValue &&
10056
+ JSON.stringify(this.lastVisibleDataChangeParams.settings) === JSON.stringify(newParams.settings)
10057
+ ) {
10058
+ return;
10059
+ }
10060
+
10061
+ this.lastVisibleDataChangeParams = newParams;
10062
+ this.$emit("visibleDataChange", { firstValue, lastValue, settings: this.formCache, dataGroups });
10063
+ } else {
10064
+ const first = val[0];
10065
+ const last = val[val.length - 1];
10066
+ const firstValue = first && first[axisKey];
10067
+ const lastValue = last && last[axisKey];
10068
+ const newParams = { firstValue, lastValue, settings: cloneDeep(this.formCache) };
9170
10069
 
9171
- // 比较是否与上次触发时的参数相同
9172
- if (this.lastVisibleDataChangeParams &&
9173
- this.lastVisibleDataChangeParams.firstValue === firstValue &&
10070
+ // 比较是否与上次触发时的参数相同
10071
+ if (
10072
+ this.lastVisibleDataChangeParams &&
10073
+ this.lastVisibleDataChangeParams.firstValue === firstValue &&
9174
10074
  this.lastVisibleDataChangeParams.lastValue === lastValue &&
9175
- JSON.stringify(this.lastVisibleDataChangeParams.settings) === JSON.stringify(newParams.settings)) {
9176
- return;
9177
- }
10075
+ JSON.stringify(this.lastVisibleDataChangeParams.settings) === JSON.stringify(newParams.settings)
10076
+ ) {
10077
+ return;
10078
+ }
9178
10079
 
9179
- this.lastVisibleDataChangeParams = newParams;
9180
- this.$emit("visibleDataChange", { firstValue, lastValue, settings: this.formCache });
10080
+ this.lastVisibleDataChangeParams = newParams;
10081
+ this.$emit("visibleDataChange", { firstValue, lastValue, settings: this.formCache });
10082
+ }
9181
10083
  },
9182
10084
  immediate: true,
9183
10085
  deep: true,
@@ -9189,9 +10091,26 @@ var script$2 = {
9189
10091
  if (JSON.stringify(this.initialRealTimeData || {}) === "{}") {
9190
10092
  this.initialRealTimeData = cloneDeep(newVal || {});
9191
10093
  }
9192
- this.realTimeData = (newVal && newVal.data) || [];
10094
+ let processedData = cloneDeep(newVal && newVal.data) || [];
10095
+ if (this.formCache.axisType == "time") {
10096
+ const axisKey = (this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]) || "time";
10097
+ processedData = processedData.map((item) => ({
10098
+ ...item,
10099
+ [axisKey]: this.toMillisecondTimestamp(item[axisKey]),
10100
+ }));
10101
+
10102
+ this.realTimeData = this.deduplicateByUniqueKey(this.realTimeData, processedData, axisKey);
10103
+ this.realTimeData = processedData;
10104
+ console.log(this.realTimeData, "this.realTimeData");
10105
+ } else {
10106
+ processedData = processedData.map((item) => ({
10107
+ ...item,
10108
+ timestamp: this.toMillisecondTimestamp(item.timestamp),
10109
+ }));
10110
+ this.realTimeData = processedData;
10111
+ }
9193
10112
  if (this.formCache.axisType == "depth") {
9194
- this.updateSettings({ key: "depthRange", value: this.toolBarConfig.form.depthRange });
10113
+ this.updateSettings({ key: "scale", value: this.toolBarConfig.form.scale });
9195
10114
  } else {
9196
10115
  this.updateSettings({ key: "timeRange", value: this.toolBarConfig.form.timeRange });
9197
10116
  }
@@ -9202,23 +10121,49 @@ var script$2 = {
9202
10121
  this.realTimeData,
9203
10122
  (this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]) || "depth",
9204
10123
  );
9205
- if (data.minGap && data.maxGap) {
9206
- this.depthInterval = (data.maxGap + data.minGap) / 2;
10124
+ if (data && data.avgGap !== undefined && data.avgGap !== null) {
10125
+ this.depthInterval = data.avgGap;
9207
10126
  } else {
9208
10127
  this.depthInterval = 1;
9209
10128
  }
10129
+ // 从scaleList计算minWindowSize和maxWindowSize
10130
+ this.initWindowSizeRange();
10131
+ console.log(this.depthInterval, "当前深度间隔", data);
9210
10132
  }
9211
10133
  this.updateLanesChartOption();
9212
10134
  } else {
9213
- let data = (newVal && newVal.data) || [];
10135
+ let data = cloneDeep(newVal && newVal.data) || [];
9214
10136
  if (!Array.isArray(data)) {
9215
10137
  data = [data];
9216
10138
  }
9217
- this.realTimeData = this.realTimeData = this.deduplicateByUniqueKey(
9218
- this.realTimeData,
9219
- data,
9220
- this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType],
9221
- );
10139
+ const direction = newVal.direction || "bottom";
10140
+
10141
+ if (this.formCache.axisType == "time") {
10142
+ const axisKey = (this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType]) || "time";
10143
+ data = data.map((item) => ({
10144
+ ...item,
10145
+ [axisKey]: this.toMillisecondTimestamp(item[axisKey]),
10146
+ }));
10147
+
10148
+ this.realTimeData = this.deduplicateByUniqueKey(
10149
+ this.realTimeData,
10150
+ data,
10151
+ this.toolBarConfig.axisTypeList && this.toolBarConfig.axisTypeList[this.formCache.axisType],
10152
+ );
10153
+ } else {
10154
+ data = data.map((item) => ({
10155
+ ...item,
10156
+ timestamp: this.toMillisecondTimestamp(item.timestamp),
10157
+ }));
10158
+
10159
+ // 深度轴模式:根据direction插入数据
10160
+ if (direction === "top") {
10161
+ this.realTimeData = this.uniqueByKeys([...data, ...this.realTimeData], "timestamp");
10162
+ } else {
10163
+ this.realTimeData = this.uniqueByKeys([...this.realTimeData, ...data], "timestamp");
10164
+ }
10165
+ }
10166
+
9222
10167
  if (this.formCache.dataType == "history") {
9223
10168
  let findIndex = this.realTimeData.findIndex(
9224
10169
  (item) =>
@@ -9229,7 +10174,7 @@ var script$2 = {
9229
10174
  if (findIndex > -1) {
9230
10175
  this.startIndex = findIndex;
9231
10176
  }
9232
- this.updateLanesChartOption("", "series");
10177
+ this.updateLanesChartOption();
9233
10178
  } else {
9234
10179
  this.checkReachBottom();
9235
10180
  }
@@ -9241,7 +10186,7 @@ var script$2 = {
9241
10186
  },
9242
10187
  };
9243
10188
 
9244
- var css_248z$3 = ".kd-lane-chart-container[data-v-5a97fc52] {\n height: 100%;\n width: 100%;\n overflow: hidden;\n position: relative;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n display: flex;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container[data-v-5a97fc52],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container[data-v-5a97fc52] {\n height: 100%;\n min-width: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle[data-v-5a97fc52],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle[data-v-5a97fc52] {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 4px;\n cursor: col-resize;\n z-index: 10;\n background-color: transparent;\n transition: background-color 0.2s;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle[data-v-5a97fc52]:hover,\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle[data-v-5a97fc52]:hover {\n background-color: var(--resizer-bg-color);\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle.kd-lane-resize-handle-left[data-v-5a97fc52],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle.kd-lane-resize-handle-left[data-v-5a97fc52] {\n left: 0;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle.kd-lane-resize-handle-right[data-v-5a97fc52],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle.kd-lane-resize-handle-right[data-v-5a97fc52] {\n right: -2px;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header[data-v-5a97fc52],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header[data-v-5a97fc52] {\n max-height: 30%;\n overflow: hidden;\n z-index: 2;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header .header-list-gap[data-v-5a97fc52],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header .header-list-gap[data-v-5a97fc52] {\n display: flex;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header .header-list-gap[data-v-5a97fc52] ::-webkit-scrollbar,\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header .header-list-gap[data-v-5a97fc52] ::-webkit-scrollbar {\n display: none;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header .header-list-gap[data-v-5a97fc52],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header .header-list-gap[data-v-5a97fc52] {\n flex-direction: column;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container-echart[data-v-5a97fc52] {\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container-echart .kd-lane-chart-lane-container-echart-content[data-v-5a97fc52] {\n height: 100%;\n overflow: hidden;\n}\n.kd-lane-chart-container .border-left[data-v-5a97fc52] {\n border-left: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .border-bottom[data-v-5a97fc52] {\n border-bottom: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .border-right[data-v-5a97fc52] {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .kd-lane-chart-container-draw-area[data-v-5a97fc52] {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n border: none;\n}";
10189
+ var css_248z$3 = ".kd-lane-chart-container[data-v-6801b46d] {\n height: 100%;\n width: 100%;\n overflow: hidden;\n position: relative;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n display: flex;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container[data-v-6801b46d],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container[data-v-6801b46d] {\n height: 100%;\n min-width: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle[data-v-6801b46d],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle[data-v-6801b46d] {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 4px;\n cursor: col-resize;\n z-index: 10;\n background-color: transparent;\n transition: background-color 0.2s;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle[data-v-6801b46d]:hover,\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle[data-v-6801b46d]:hover {\n background-color: var(--resizer-bg-color);\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle.kd-lane-resize-handle-left[data-v-6801b46d],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle.kd-lane-resize-handle-left[data-v-6801b46d] {\n left: 0;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-resize-handle.kd-lane-resize-handle-right[data-v-6801b46d],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-resize-handle.kd-lane-resize-handle-right[data-v-6801b46d] {\n right: -2px;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header[data-v-6801b46d],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header[data-v-6801b46d] {\n max-height: 30%;\n overflow: hidden;\n z-index: 2;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header .header-list-gap[data-v-6801b46d],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header .header-list-gap[data-v-6801b46d] {\n display: flex;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header .header-list-gap[data-v-6801b46d] ::-webkit-scrollbar,\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header .header-list-gap[data-v-6801b46d] ::-webkit-scrollbar {\n display: none;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header .header-list-gap[data-v-6801b46d],\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header .header-list-gap[data-v-6801b46d] {\n flex-direction: column;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container-echart[data-v-6801b46d] {\n flex: 1;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container-echart .kd-lane-chart-lane-container-echart-content[data-v-6801b46d] {\n height: 100%;\n overflow: hidden;\n}\n.kd-lane-chart-container .border-left[data-v-6801b46d] {\n border-left: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .border-bottom[data-v-6801b46d] {\n border-bottom: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .border-right[data-v-6801b46d] {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .kd-lane-chart-container-draw-area[data-v-6801b46d] {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n border: none;\n}\n.kd-lane-chart-container .kd-lane-chart-container-draw-area[data-v-6801b46d] {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n border: none;\n}";
9245
10190
  styleInject(css_248z$3);
9246
10191
 
9247
10192
  /* script */
@@ -9326,7 +10271,10 @@ var __vue_render__$2 = function () {
9326
10271
  staticClass:
9327
10272
  "kd-lane-chart-lane-container-echart",
9328
10273
  style: {
9329
- padding: "0 " + _vm.itemGap + "px",
10274
+ padding:
10275
+ "0 " +
10276
+ _vm.currentHeaderStyle.itemGap +
10277
+ "px",
9330
10278
  },
9331
10279
  },
9332
10280
  [
@@ -9342,7 +10290,10 @@ var __vue_render__$2 = function () {
9342
10290
  staticClass:
9343
10291
  "kd-lane-chart-lane-container-echart",
9344
10292
  style: {
9345
- padding: "0 " + _vm.itemGap + "px",
10293
+ padding:
10294
+ "0 " +
10295
+ _vm.currentHeaderStyle.itemGap +
10296
+ "px",
9346
10297
  },
9347
10298
  },
9348
10299
  [
@@ -9416,7 +10367,10 @@ var __vue_render__$2 = function () {
9416
10367
  "draggable",
9417
10368
  {
9418
10369
  staticClass: "header-list-gap",
9419
- style: { gap: _vm.itemGap + "px" },
10370
+ style: {
10371
+ gap:
10372
+ _vm.currentHeaderStyle.itemGap + "px",
10373
+ },
9420
10374
  attrs: {
9421
10375
  animation: 200,
9422
10376
  fallbackOnBody: true,
@@ -9443,6 +10397,7 @@ var __vue_render__$2 = function () {
9443
10397
  paramsNameMap: _vm.paramsNameMap,
9444
10398
  visibleData: _vm.visibleData,
9445
10399
  headerData: _vm.headerData,
10400
+ lineRange: _vm.lineRange,
9446
10401
  },
9447
10402
  on: { updateLine: _vm.upsertLine },
9448
10403
  nativeOn: {
@@ -9475,7 +10430,10 @@ var __vue_render__$2 = function () {
9475
10430
  staticClass:
9476
10431
  "kd-lane-chart-lane-container-echart",
9477
10432
  style: {
9478
- padding: "0 " + _vm.itemGap + "px",
10433
+ padding:
10434
+ "0 " +
10435
+ _vm.currentHeaderStyle.itemGap +
10436
+ "px",
9479
10437
  },
9480
10438
  },
9481
10439
  [_vm._t("content" + lane.laneId)],
@@ -9487,7 +10445,10 @@ var __vue_render__$2 = function () {
9487
10445
  staticClass:
9488
10446
  "kd-lane-chart-lane-container-echart",
9489
10447
  style: {
9490
- padding: "0 " + _vm.itemGap + "px",
10448
+ padding:
10449
+ "0 " +
10450
+ _vm.currentHeaderStyle.itemGap +
10451
+ "px",
9491
10452
  },
9492
10453
  },
9493
10454
  [
@@ -9609,7 +10570,7 @@ __vue_render__$2._withStripped = true;
9609
10570
  /* style */
9610
10571
  const __vue_inject_styles__$2 = undefined;
9611
10572
  /* scoped */
9612
- const __vue_scope_id__$2 = "data-v-5a97fc52";
10573
+ const __vue_scope_id__$2 = "data-v-6801b46d";
9613
10574
  /* module identifier */
9614
10575
  const __vue_module_identifier__$2 = undefined;
9615
10576
  /* functional template */
@@ -9673,7 +10634,7 @@ var script$1 = {
9673
10634
  },
9674
10635
  };
9675
10636
 
9676
- var css_248z$2 = "@charset \"UTF-8\";\n.panel-list[data-v-680bb547] {\n width: 100%; /* 可调 */\n display: grid;\n gap: 8px;\n}\n\n/* 每一项 */\n.panel-item[data-v-680bb547] {\n border: 1px solid var(--card-border-color);\n padding: 10px 6px;\n text-align: center;\n background: var(--card-color);\n}\n\n/* label */\n.label[data-v-680bb547] {\n font-size: 12px;\n color: var(--card-label-color);\n margin-bottom: 6px;\n /* 单行省略 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* value */\n.value[data-v-680bb547] {\n font-size: 18px;\n font-weight: bold;\n color: var(--card-value-color);\n /* 单行省略 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}";
10637
+ var css_248z$2 = "@charset \"UTF-8\";\n.panel-list[data-v-511db0de] {\n width: 100%; /* 可调 */\n display: grid;\n gap: 8px;\n}\n\n/* 每一项 */\n.panel-item[data-v-511db0de] {\n border: 1px solid var(--card-border-color);\n padding: 10px 6px;\n text-align: center;\n background: var(--card-color);\n}\n\n/* label */\n.label[data-v-511db0de] {\n font-size: 12px;\n color: var(--card-label-color);\n margin-bottom: 6px;\n /* 单行省略 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* value */\n.value[data-v-511db0de] {\n font-size: 18px;\n font-weight: bold;\n color: var(--card-value-color);\n /* 单行省略 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}";
9677
10638
  styleInject(css_248z$2);
9678
10639
 
9679
10640
  /* script */
@@ -9701,7 +10662,7 @@ var __vue_render__$1 = function () {
9701
10662
  item.value !== ""
9702
10663
  ? !isNaN(Number(item.value))
9703
10664
  ? Number(item.value.toFixed(2))
9704
- : "--"
10665
+ : item.value
9705
10666
  : "--"
9706
10667
  ) +
9707
10668
  "\n "
@@ -9718,7 +10679,7 @@ __vue_render__$1._withStripped = true;
9718
10679
  /* style */
9719
10680
  const __vue_inject_styles__$1 = undefined;
9720
10681
  /* scoped */
9721
- const __vue_scope_id__$1 = "data-v-680bb547";
10682
+ const __vue_scope_id__$1 = "data-v-511db0de";
9722
10683
  /* module identifier */
9723
10684
  const __vue_module_identifier__$1 = undefined;
9724
10685
  /* functional template */
@@ -9766,17 +10727,14 @@ var script = {
9766
10727
  type: Object,
9767
10728
  default: () => ({}),
9768
10729
  },
9769
- headerPadding: {
9770
- type: Number,
9771
- default: 4,
9772
- },
9773
- headerItemHeight: {
9774
- type: Number,
9775
- default: 42,
9776
- },
9777
- itemGap: {
9778
- type: Number,
9779
- default: 4,
10730
+ // 头部样式
10731
+ headerStyle: {
10732
+ type: Object,
10733
+ default: () => ({
10734
+ headerPadding: 4,
10735
+ headerItemHeight: 42,
10736
+ itemGap:4
10737
+ }),
9780
10738
  },
9781
10739
  customMenuList: {
9782
10740
  type: Array,
@@ -9825,10 +10783,20 @@ var script = {
9825
10783
  type: Array,
9826
10784
  default: () => [],
9827
10785
  },
10786
+ // 预警区域数据
10787
+ warningAreaData: {
10788
+ type: Array,
10789
+ default: () => [],
10790
+ },
9828
10791
  // 自定义tooltip formatter
9829
10792
  tooltipFormatter: {
9830
10793
  type: Function,
9831
10794
  },
10795
+ // 实时曲线menu右击是否开启
10796
+ showContextMenuStatus: {
10797
+ type: Boolean,
10798
+ default: true,
10799
+ },
9832
10800
  },
9833
10801
  data() {
9834
10802
  return {
@@ -9887,10 +10855,34 @@ var script = {
9887
10855
  // 缓存初始化时的curveDatas
9888
10856
  this.initialCurveDatas = cloneDeep(this.curveDatas || {});
9889
10857
  },
10858
+ computed: {
10859
+ currentHeaderStyle() {
10860
+ let data = {
10861
+ headerPadding: this.headerStyle.headerPadding || 4,
10862
+ headerItemHeight: this.headerStyle.headerItemHeight || 42,
10863
+ itemGap: this.headerStyle.itemGap || 4,
10864
+ };
10865
+ if(Object.prototype.hasOwnProperty.call(this.headerStyle, 'headerHeight')){
10866
+ data.headerHeight = this.headerStyle.headerHeight || 'auto';
10867
+ }
10868
+ if(Object.prototype.hasOwnProperty.call(this.headerStyle, 'maxHeaderHeight')){
10869
+ data.maxHeaderHeight = this.headerStyle.maxHeaderHeight || 'auto';
10870
+ }
10871
+ if(Object.prototype.hasOwnProperty.call(this.headerStyle, 'headerLabelFontSize')){
10872
+ data.headerLabelFontSize = this.headerStyle.headerLabelFontSize || 'auto';
10873
+ }
10874
+ if(Object.prototype.hasOwnProperty.call(this.headerStyle, 'headerDataFontSize')){
10875
+ data.headerDataFontSize = this.headerStyle.headerDataFontSize || 'auto';
10876
+ }
10877
+ return data;
10878
+ },
10879
+ },
9890
10880
  mounted() {
9891
10881
  let form = cloneDeep((this.toolBarConfig && this.toolBarConfig.form) || {});
9892
10882
  this.config = form.axisType === "depth" ? this.depthConfig : this.timeConfig;
9893
- this.showChartContainer = true;
10883
+ if(JSON.stringify(this.config) !== '{}'){
10884
+ this.showChartContainer = true;
10885
+ }
9894
10886
  // 初始化:获取容器宽度并转换百分比为像素
9895
10887
  this.$nextTick(() => {
9896
10888
  this.containerWidth = (this.$refs.container && this.$refs.container.offsetWidth) || 800;
@@ -9954,7 +10946,9 @@ var script = {
9954
10946
  this.enableCurveDatasWatch = false;
9955
10947
  setTimeout(() => {
9956
10948
  this.config = this.formCache.axisType === "depth" ? this.depthConfig : this.timeConfig;
9957
- this.showChartContainer = true;
10949
+ if(JSON.stringify(this.config) !== '{}'){
10950
+ this.showChartContainer = true;
10951
+ }
9958
10952
  this.cachedCurveDatas = cloneDeep(this.initialCurveDatas || {});
9959
10953
  this.enableCurveDatasWatch = true;
9960
10954
  }, 0);
@@ -9974,12 +10968,14 @@ var script = {
9974
10968
  this.showChartContainer = false;
9975
10969
  setTimeout(() => {
9976
10970
  this.config = this.formCache.axisType === "depth" ? this.depthConfig : this.timeConfig;
9977
- this.showChartContainer = true;
10971
+ if(JSON.stringify(this.config) !== '{}'){
10972
+ this.showChartContainer = true;
10973
+ }
9978
10974
  }, 0);
9979
- this.$emit("updateSettings", { key: key, value: value, settings: value });
10975
+ this.$emit("updateSettings", { key: key, value: value, settings: cloneDeep(this.formCache) });
9980
10976
  }
9981
10977
  if (key === "dataType") {
9982
- this.$emit("updateSettings", { key: key, value: value, settings: value });
10978
+ this.$emit("updateSettings", { key: key, value: value, settings: cloneDeep(this.formCache) });
9983
10979
  }
9984
10980
  },
9985
10981
  // 新增:更新scale缓存
@@ -10205,10 +11201,10 @@ var script = {
10205
11201
  },
10206
11202
  };
10207
11203
 
10208
- var css_248z$1 = "@charset \"UTF-8\";\n[data-theme=dark] {\n --bg-color: #1e1e1e;\n --card-color: #252526;\n --card-border-color: #4b4b4b;\n --card-label-color: #d6d6d6;\n --card-value-color: #ffffff;\n --panel-item-bg-color: #1e1e1e;\n --resizer-bg-color: rgb(177, 177, 177, 0.4);\n --panel-item-border-color: #4b4b4b;\n --default-text-color: #ffffff;\n --radio-border-color: #4b4b4b;\n --radio-checked-border-color: #f86c59;\n --radio-checked-color: #f86c59;\n --radio-checked-text-color: #ffffff;\n --radio-checked-border-color: #f86c59;\n --split-line-color: #4b4b4b;\n /* 边框颜色 */\n --border-color: #4b4b4b;\n --label-float-bg-color: rgba(255, 255, 255, 0.1);\n --slider-gradient-start: #333333;\n --slider-gradient-end: #656668;\n --slider-gradient-color: linear-gradient(0deg, #333333 0%, #656668 100%);\n --slider-content-color: #f86c59;\n --tooltip-bg-color: rgb(51, 51, 51,0.8);\n --kd-lane-container-border-color: #4b4b4b;\n --kd-lane-container-header-item-color: #ffffff;\n --kd-lane-container-header-item-warning-color: rgba(248, 108, 89, 0.6);\n --kd-lane-container-header-bg: #333333;\n --kd-lane-container-item-bg: #252526;\n --kd-lane-container-item-line-color: #4b4b4b66;\n --select-hover-bg-color: #333333;\n --select-selected-text-color: #ffcc33;\n --dialog-header: #333333;\n --dialog-button-default: #252526;\n --dialog-button-disabled-text: #ffffff;\n --in-range-text-color: #ffffff;\n --dialog-tree-text-color: #ffffff;\n}\n[data-theme=white] {\n --bg-color: #ffffff;\n --card-color: #ffffff;\n --card-border-color: #C9C9C9;\n --card-label-color: #666666;\n --card-value-color: #333333;\n --panel-item-bg-color: #ffffff;\n --resizer-bg-color: rgb(177, 177, 177,.4);\n --panel-item-border-color: #C9C9C9;\n --default-text-color: #333333;\n --radio-border-color: #C9C9C9;\n --radio-checked-border-color: #EC4521;\n --radio-checked-color: #EC4521;\n --radio-checked-text-color: #000000;\n --radio-checked-border-color: #EC4521;\n --split-line-color: #C9C9C9;\n /* 边框颜色 */\n --border-color: #C9C9C9;\n --label-float-bg-color: rgba(27, 79, 217, 0.1);\n --slider-gradient-start: #B0C2F5;\n --slider-gradient-end: #DBE5FF;\n --slider-gradient-color: linear-gradient(0deg, #B0C2F5 0%, #DBE5FF 100%);\n --slider-content-color: #EC4521;\n --tooltip-bg-color: rgba(246, 247, 248, 0.8);\n --kd-lane-container-border-color: #C9C9C9;\n --kd-lane-container-header-item-color: #333333;\n --kd-lane-container-header-item-warning-color: rgba(200, 23, 29, 0.6);\n --kd-lane-container-header-bg: #ecf4ff;\n --kd-lane-container-item-bg: #eff3ff;\n --kd-lane-container-item-line-color: #dddddd;\n --select-hover-bg-color: #E0E9FE;\n --select-selected-text-color: #1B4FD9;\n --dialog-header:#1B4FD9;\n --dialog-header-text-color: #ffffff;\n --dialog-button-default:#ffffff;\n --dialog-button-disabled-text: #FFFFFF;\n --in-range-text-color: #ffffff;\n --dialog-tree-text-color: #ffffff;\n}\n[data-theme=gray] {\n --bg-color: #ffffff;\n --card-color: #f6f7f8;\n --card-border-color: #b1b1b1;\n --card-label-color: #666666;\n --card-value-color: #333333;\n --panel-item-bg-color: #ffffff;\n --resizer-bg-color: rgb(177, 177, 177,.4);\n --panel-item-border-color: #b1b1b1;\n --default-text-color: #333333;\n --radio-border-color: #b1b1b1;\n --radio-checked-border-color: #f86c59;\n --radio-checked-color: #f86c59;\n --radio-checked-text-color: #000000;\n --radio-checked-border-color: #f86c59;\n --split-line-color: #b1b1b1;\n /* 边框颜色 */\n --border-color: #b1b1b1;\n --label-float-bg-color: rgba(128, 128, 128, 0.1);\n --slider-gradient-start: #a6a6a6;\n --slider-gradient-end: #dfdfdf;\n --slider-gradient-color: linear-gradient(0deg, #a6a6a6 0%, #dfdfdf 100%);\n --slider-content-color: #f86c59;\n --tooltip-bg-color: rgba(246, 247, 248, 0.8);\n --kd-lane-container-border-color: #b1b1b1;\n --kd-lane-container-header-item-color: #333333;\n --kd-lane-container-header-item-warning-color: rgba(177, 42, 39,0.6);\n --kd-lane-container-header-bg: #eeeeee;\n --kd-lane-container-item-bg: #f6f7f8;\n --kd-lane-container-item-line-color: #dddddd;\n --select-hover-bg-color: #dfdfdf;\n --select-selected-text-color: #ffcc33;\n --dialog-header:#EBEBEB;\n --dialog-button-default:#f6f7f8;\n --dialog-button-disabled-text: #ffffff;\n --in-range-text-color: #333333;\n --dialog-tree-text-color: #333333;\n}\n\n/* 下拉框 */\n.kd-curve-2d-select-popup {\n background: var(--bg-color) !important;\n border: 1px solid var(--border-color) !important;\n /* 列表容器(关键) */\n}\n.kd-curve-2d-select-popup .el-scrollbar__wrap {\n margin-bottom: 0 !important;\n margin-right: 0 !important;\n background: var(--bg-color) !important;\n /* 隐藏滚动条 */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-curve-2d-select-popup .el-scrollbar__wrap::-webkit-scrollbar {\n display: none;\n}\n.kd-curve-2d-select-popup {\n /* 每一项(默认) */\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item {\n background: var(--bg-color) !important;\n color: var(--default-text-color) !important;\n /* hover */\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item.hover, .kd-curve-2d-select-popup .el-select-dropdown__item:hover {\n background: var(--select-hover-bg-color) !important;\n color: var(--default-text-color) !important;\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item.selected {\n background: var(--bg-color) !important; /* 不要灰色 */\n color: var(--select-selected-text-color) !important; /* 高亮文字(可选) */\n font-weight: bold;\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item.selected.hover, .kd-curve-2d-select-popup .el-select-dropdown__item.selected:hover {\n background: var(--select-hover-bg-color) !important;\n}\n.kd-curve-2d-select-popup {\n /* 三角箭头 */\n}\n.kd-curve-2d-select-popup[x-placement^=bottom] .popper__arrow {\n border-bottom-color: var(--border-color) !important;\n}\n.kd-curve-2d-select-popup[x-placement^=bottom] .popper__arrow::after {\n border-bottom-color: var(--bg-color) !important;\n}\n.kd-curve-2d-select-popup[x-placement^=top] .popper__arrow {\n border-top-color: var(--border-color) !important;\n}\n.kd-curve-2d-select-popup[x-placement^=top] .popper__arrow::after {\n border-top-color: var(--bg-color) !important;\n}\n.kd-curve-2d-select-popup .el-time-panel {\n background: var(--bg-color) !important;\n box-shadow: 0 2px 12px 0 transparent;\n border: 1px solid var(--border-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-panel__btn {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-spinner__item {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-spinner__item.active:not(.disabled) {\n color: var(--select-selected-text-color);\n font-weight: bold;\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-panel__footer {\n border-top: 1px solid var(--border-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-spinner__item:hover:not(.disabled):not(.active) {\n background: var(--select-hover-bg-color);\n}\n.kd-curve-2d-select-popup .el-color-picker__trigger {\n border: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-color-picker__panel {\n background: var(--bg-color) !important;\n border: 1px solid var(--dialog-header);\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-color-picker__panel .el-button--text {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-color-picker__panel .el-button--default {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n border: none;\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-color-picker__panel .el-button.is-plain:hover {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper {\n background: var(--bg-color);\n border: 1px solid var(--dialog-header);\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-input__inner {\n background: var(--bg-color) !important;\n border: 1px solid var(--border-color) !important;\n color: var(--text-color) !important;\n height: 32px !important;\n line-height: 32px !important;\n box-sizing: border-box;\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-picker__header-label {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-picker__header-label:hover {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-range-picker__time-header > .el-icon-arrow-right {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-button--text {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-picker-panel__icon-btn {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-range-picker__time-header {\n border-bottom: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-range-picker__content.is-left {\n border-right: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table th {\n border-bottom: 1px solid var(--dialog-header);\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.today span {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.available:hover {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.next-month,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.prev-month {\n color: var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.available {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.available.in-range {\n color: var(--in-range-text-color) !important;\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.end-date span,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.start-date span {\n background: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.in-range div,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.in-range div:hover,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table.is-week-mode .el-date-table__row.current div,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table.is-week-mode .el-date-table__row:hover div {\n background: var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer {\n background: var(--bg-color);\n border-top: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button--default {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n border: none;\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain,\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain:focus,\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain:hover {\n background: var(--dialog-button-default);\n color: var(--dialog-button-disabled-text);\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain {\n background: var(--dialog-button-default);\n color: var(--dialog-button-disabled-text) !important;\n}\n.kd-curve-2d-select-popup .el-popper[x-placement^=bottom] .popper__arrow::after {\n border-bottom-color: var(--bg-color) !important;\n}\n.kd-curve-2d-container {\n /* radio 自定义样式 */\n}\n.kd-curve-2d-container .el-radio {\n display: flex;\n align-items: center;\n vertical-align: middle;\n color: var(--radio-default-text-color);\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-size: 14px;\n}\n.kd-curve-2d-container .el-radio__inner {\n width: 14px;\n height: 14px;\n background: transparent;\n border: 1px solid var(--radio-border-color);\n}\n.kd-curve-2d-container .el-radio__input.is-checked .el-radio__inner {\n border-color: var(--radio-checked-border-color);\n background: transparent;\n}\n.kd-curve-2d-container .el-radio__input.is-disabled .el-radio__inner {\n background-color: transparent;\n border-color: var(--radio-border-color);\n}\n.kd-curve-2d-container .el-radio__inner::after {\n width: 7px;\n height: 7px;\n background: var(--radio-checked-color);\n}\n.kd-curve-2d-container .el-radio.is-checked .el-radio__label {\n color: var(--radio-checked-text-color);\n font-weight: bold;\n}\n.kd-curve-2d-container {\n /* select */\n}\n.kd-curve-2d-container .el-input__inner {\n background: var(--bg-color) !important;\n border: 1px solid var(--border-color) !important;\n color: var(--text-color) !important;\n height: 32px !important;\n line-height: 32px !important;\n box-sizing: border-box;\n border-radius: 0px;\n}\n.kd-curve-2d-container {\n /* 下拉箭头 */\n}\n.kd-curve-2d-container .el-select .el-input__suffix i {\n display: none !important;\n}\n.kd-curve-2d-container .el-select .el-input__suffix {\n right: 0;\n width: 28px;\n height: 32px !important;\n line-height: 32px !important;\n background: var(--slider-gradient-color);\n display: flex;\n align-items: center;\n justify-content: center;\n border-left: 1px solid var(--border-color);\n}\n.kd-curve-2d-container .el-select .el-input__suffix::after {\n content: \"\";\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 6px solid var(--slider-content-color); /* 橙色三角 */\n}\n.kd-curve-2d-container .el-select .el-input__suffix::after {\n transition: transform 0.2s ease;\n}\n.kd-curve-2d-container .el-select .el-input.is-focus .el-input__suffix::after {\n transform: rotate(180deg);\n}\n.kd-curve-2d-container .el-dialog {\n border: 1px solid var(--card-border-color);\n}\n.kd-curve-2d-container .el-dialog .el-form-item__label {\n color: var(--default-text-color);\n font-size: 14px;\n}\n.kd-curve-2d-container .el-dialog .el-dialog__headerbtn {\n top: 11px;\n width: 24px;\n height: 24px;\n background: linear-gradient(270deg, #c73521 0%, #f86c59 100%);\n border-radius: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.kd-curve-2d-container .el-dialog .el-dialog__headerbtn .el-dialog__close {\n color: #fff;\n font-size: 14px;\n font-weight: 700;\n}\n.kd-curve-2d-container .el-button {\n border-radius: 0px;\n border: none;\n}\n.kd-curve-2d-container .el-button--primary {\n background-image: linear-gradient(to bottom, #2057ea, #12338d);\n}\n.kd-curve-2d-container .el-button--default {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n}\n.kd-curve-2d-container .el-button--primary.is-disabled {\n background-image: linear-gradient(to bottom, #2f5ede, #1e3677);\n color: var(--dialog-button-disabled-text);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__nav-wrap::after {\n background-color: var(--card-border-color);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__item {\n color: var(--default-text-color);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__item.is-active {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__active-bar {\n background: var(--select-selected-text-color);\n}\n.kd-curve-2d-container .el-tree {\n background: var(--bg-color) !important;\n color: var(--default-text-color);\n font-size: 14px;\n}\n.kd-curve-2d-container .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {\n background: var(--dialog-header) !important;\n color: var(--dialog-tree-text-color);\n}\n.kd-curve-2d-container .el-tree-node__content:hover,\n.kd-curve-2d-container .el-upload-list__item:hover {\n background: var(--dialog-header) !important;\n color: var(--dialog-tree-text-color);\n}\n.kd-curve-2d-container .vue-simple-context-menu__item,\n.kd-curve-2d-container .vue-simple-context-menu__item {\n font-size: 14px !important;\n}\n.kd-curve-2d-container .kd-lane-el-container {\n border: 1px solid var(--card-border-color);\n}\n.kd-curve-2d-container .kd-lane-el-container .rtd-config-side {\n border-right: 1px solid var(--card-border-color);\n}\n.kd-curve-2d-container .el-dialog__header {\n background: var(--dialog-header);\n text-align: center;\n}\n.kd-curve-2d-container .el-dialog__header .el-dialog__title {\n color: var(--dialog-header-text-color);\n}\n.kd-curve-2d-container .el-dialog__header {\n padding: 10px 10px 10px;\n}\n.kd-curve-2d-container .el-dialog__body {\n background: var(--bg-color);\n padding: 30px 30px 10px 30px;\n}\n.kd-curve-2d-container .el-dialog__body .input-number-container .el-input__inner {\n width: calc(100% - 80px) !important;\n margin-left: 40px !important;\n}\n.kd-curve-2d-container .el-dialog__body .el-input__inner {\n color: var(--default-text-color) !important;\n}\n.kd-curve-2d-container .el-dialog__body .el-input-number__decrease,\n.kd-curve-2d-container .el-dialog__body .el-input-number__increase {\n color: var(--default-text-color);\n}\n.kd-curve-2d-container .el-dialog__body .el-input-number__increase {\n background: var(--card-color);\n color: var(--default-text-color);\n border-radius: 0px 0px 0px 0px;\n border: 1px solid var(--card-border-color);\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.kd-curve-2d-container .el-dialog__body .el-input-number__decrease {\n background: var(--card-color);\n border-radius: 0px 0px 0px 0px;\n border: 1px solid var(--card-border-color);\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.kd-curve-2d-container .el-dialog__footer {\n text-align: center;\n background: var(--bg-color);\n}\n.kd-curve-2d-container .el-date-editor {\n background: var(--bg-color) !important;\n}\n.kd-curve-2d-container .el-date-editor .el-range-input {\n background: var(--bg-color) !important;\n border-top: 1px solid var(--border-color) !important;\n border-bottom: 1px solid var(--border-color) !important;\n color: var(--text-color) !important;\n height: 32px !important;\n line-height: 32px !important;\n box-sizing: border-box;\n border-radius: 0px;\n}\n.kd-curve-2d-container .el-date-editor .el-range-separator {\n color: var(--default-text-color);\n}";
11204
+ var css_248z$1 = "@charset \"UTF-8\";\n[data-theme=dark] {\n --bg-color: #1e1e1e;\n --card-color: #252526;\n --card-border-color: #4b4b4b;\n --card-label-color: #d6d6d6;\n --card-value-color: #ffffff;\n --panel-item-bg-color: #1e1e1e;\n --resizer-bg-color: rgb(177, 177, 177, 0.4);\n --panel-item-border-color: #4b4b4b;\n --default-text-color: #ffffff;\n --radio-border-color: #4b4b4b;\n --radio-checked-border-color: #f86c59;\n --radio-checked-color: #f86c59;\n --radio-checked-text-color: #ffffff;\n --radio-checked-border-color: #f86c59;\n --split-line-color: #4b4b4b;\n /* 边框颜色 */\n --border-color: #4b4b4b;\n --label-float-bg-color: rgba(255, 255, 255, 0.1);\n --slider-gradient-start: #333333;\n --slider-gradient-end: #656668;\n --slider-gradient-color: linear-gradient(0deg, #333333 0%, #656668 100%);\n --slider-content-color: #f86c59;\n --tooltip-bg-color: rgb(51, 51, 51,0.8);\n --kd-lane-container-border-color: #4b4b4b;\n --kd-lane-container-header-item-color: #ffffff;\n --kd-lane-container-header-item-warning-color: rgba(248, 108, 89, 0.6);\n --kd-lane-container-header-bg: #333333;\n --kd-lane-container-item-bg: #252526;\n --kd-lane-container-item-line-color: #4b4b4b66;\n --select-hover-bg-color: #333333;\n --select-selected-text-color: #ffcc33;\n --dialog-header: #333333;\n --dialog-button-default: #252526;\n --dialog-button-disabled-text: #ffffff;\n --in-range-text-color: #ffffff;\n --dialog-tree-text-color: #ffffff;\n}\n[data-theme=white] {\n --bg-color: #ffffff;\n --card-color: #ffffff;\n --card-border-color: #C9C9C9;\n --card-label-color: #666666;\n --card-value-color: #333333;\n --panel-item-bg-color: #ffffff;\n --resizer-bg-color: rgb(177, 177, 177,.4);\n --panel-item-border-color: #C9C9C9;\n --default-text-color: #333333;\n --radio-border-color: #C9C9C9;\n --radio-checked-border-color: #EC4521;\n --radio-checked-color: #EC4521;\n --radio-checked-text-color: #000000;\n --radio-checked-border-color: #EC4521;\n --split-line-color: #C9C9C9;\n /* 边框颜色 */\n --border-color: #C9C9C9;\n --label-float-bg-color: rgba(27, 79, 217, 0.1);\n --slider-gradient-start: #B0C2F5;\n --slider-gradient-end: #DBE5FF;\n --slider-gradient-color: linear-gradient(0deg, #B0C2F5 0%, #DBE5FF 100%);\n --slider-content-color: #EC4521;\n --tooltip-bg-color: rgba(246, 247, 248, 0.8);\n --kd-lane-container-border-color: #C9C9C9;\n --kd-lane-container-header-item-color: #333333;\n --kd-lane-container-header-item-warning-color: rgba(200, 23, 29, 0.6);\n --kd-lane-container-header-bg: #ecf4ff;\n --kd-lane-container-item-bg: #eff3ff;\n --kd-lane-container-item-line-color: #dddddd;\n --select-hover-bg-color: #E0E9FE;\n --select-selected-text-color: #1B4FD9;\n --dialog-header:#1B4FD9;\n --dialog-header-text-color: #ffffff;\n --dialog-button-default:#ffffff;\n --dialog-button-disabled-text: #FFFFFF;\n --in-range-text-color: #ffffff;\n --dialog-tree-text-color: #ffffff;\n}\n[data-theme=gray] {\n --bg-color: #ffffff;\n --card-color: #f6f7f8;\n --card-border-color: #b1b1b1;\n --card-label-color: #666666;\n --card-value-color: #333333;\n --panel-item-bg-color: #ffffff;\n --resizer-bg-color: rgb(177, 177, 177,.4);\n --panel-item-border-color: #b1b1b1;\n --default-text-color: #333333;\n --radio-border-color: #b1b1b1;\n --radio-checked-border-color: #f86c59;\n --radio-checked-color: #f86c59;\n --radio-checked-text-color: #000000;\n --radio-checked-border-color: #f86c59;\n --split-line-color: #b1b1b1;\n /* 边框颜色 */\n --border-color: #b1b1b1;\n --label-float-bg-color: rgba(128, 128, 128, 0.1);\n --slider-gradient-start: #a6a6a6;\n --slider-gradient-end: #dfdfdf;\n --slider-gradient-color: linear-gradient(0deg, #a6a6a6 0%, #dfdfdf 100%);\n --slider-content-color: #f86c59;\n --tooltip-bg-color: rgba(246, 247, 248, 0.8);\n --kd-lane-container-border-color: #b1b1b1;\n --kd-lane-container-header-item-color: #333333;\n --kd-lane-container-header-item-warning-color: rgba(177, 42, 39,0.6);\n --kd-lane-container-header-bg: #eeeeee;\n --kd-lane-container-item-bg: #f6f7f8;\n --kd-lane-container-item-line-color: #dddddd;\n --select-hover-bg-color: #dfdfdf;\n --select-selected-text-color: #ffcc33;\n --dialog-header:#EBEBEB;\n --dialog-button-default:#f6f7f8;\n --dialog-button-disabled-text: #ffffff;\n --in-range-text-color: #333333;\n --dialog-tree-text-color: #333333;\n}\n\n/* 下拉框 */\n.kd-curve-2d-select-popup {\n background: var(--bg-color) !important;\n border: 1px solid var(--border-color) !important;\n /* 列表容器(关键) */\n}\n.kd-curve-2d-select-popup .el-scrollbar__wrap {\n margin-bottom: 0 !important;\n margin-right: 0 !important;\n background: var(--bg-color) !important;\n /* 隐藏滚动条 */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-curve-2d-select-popup .el-scrollbar__wrap::-webkit-scrollbar {\n display: none;\n}\n.kd-curve-2d-select-popup {\n /* 每一项(默认) */\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item {\n background: var(--bg-color) !important;\n color: var(--default-text-color) !important;\n /* hover */\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item.hover, .kd-curve-2d-select-popup .el-select-dropdown__item:hover {\n background: var(--select-hover-bg-color) !important;\n color: var(--default-text-color) !important;\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item.selected {\n background: var(--bg-color) !important; /* 不要灰色 */\n color: var(--select-selected-text-color) !important; /* 高亮文字(可选) */\n font-weight: bold;\n}\n.kd-curve-2d-select-popup .el-select-dropdown__item.selected.hover, .kd-curve-2d-select-popup .el-select-dropdown__item.selected:hover {\n background: var(--select-hover-bg-color) !important;\n}\n.kd-curve-2d-select-popup {\n /* 三角箭头 */\n}\n.kd-curve-2d-select-popup[x-placement^=bottom] .popper__arrow {\n border-bottom-color: var(--border-color) !important;\n}\n.kd-curve-2d-select-popup[x-placement^=bottom] .popper__arrow::after {\n border-bottom-color: var(--bg-color) !important;\n}\n.kd-curve-2d-select-popup[x-placement^=top] .popper__arrow {\n border-top-color: var(--border-color) !important;\n}\n.kd-curve-2d-select-popup[x-placement^=top] .popper__arrow::after {\n border-top-color: var(--bg-color) !important;\n}\n.kd-curve-2d-select-popup .el-time-panel {\n background: var(--bg-color) !important;\n box-shadow: 0 2px 12px 0 transparent;\n border: 1px solid var(--border-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-panel__btn {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-spinner__item {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-spinner__item.active:not(.disabled) {\n color: var(--select-selected-text-color);\n font-weight: bold;\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-panel__footer {\n border-top: 1px solid var(--border-color);\n}\n.kd-curve-2d-select-popup .el-time-panel .el-time-spinner__item:hover:not(.disabled):not(.active) {\n background: var(--select-hover-bg-color);\n}\n.kd-curve-2d-select-popup .el-color-picker__trigger {\n border: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-color-picker__panel {\n background: var(--bg-color) !important;\n border: 1px solid var(--dialog-header);\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-color-picker__panel .el-button--text {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-color-picker__panel .el-button--default {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n border: none;\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-color-picker__panel .el-button.is-plain:hover {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper {\n background: var(--bg-color);\n border: 1px solid var(--dialog-header);\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-input__inner {\n background: var(--bg-color) !important;\n border: 1px solid var(--border-color) !important;\n color: var(--text-color) !important;\n height: 32px !important;\n line-height: 32px !important;\n box-sizing: border-box;\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-picker__header-label {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-picker__header-label:hover {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-range-picker__time-header > .el-icon-arrow-right {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-button--text {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-picker-panel__icon-btn {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-range-picker__time-header {\n border-bottom: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-range-picker__content.is-left {\n border-right: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table th {\n border-bottom: 1px solid var(--dialog-header);\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.today span {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.available:hover {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.next-month,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.prev-month {\n color: var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.available {\n color: var(--default-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.available.in-range {\n color: var(--in-range-text-color) !important;\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.end-date span,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.start-date span {\n background: var(--select-selected-text-color);\n}\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.in-range div,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table td.in-range div:hover,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table.is-week-mode .el-date-table__row.current div,\n.kd-curve-2d-select-popup .el-picker-panel__body-wrapper .el-date-table.is-week-mode .el-date-table__row:hover div {\n background: var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer {\n background: var(--bg-color);\n border-top: 1px solid var(--dialog-header);\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button--default {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n border: none;\n border-radius: 0px;\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain,\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain:focus,\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain:hover {\n background: var(--dialog-button-default);\n color: var(--dialog-button-disabled-text);\n}\n.kd-curve-2d-select-popup .el-picker-panel__footer .el-button.is-disabled.is-plain {\n background: var(--dialog-button-default);\n color: var(--dialog-button-disabled-text) !important;\n}\n.kd-curve-2d-select-popup .el-popper[x-placement^=bottom] .popper__arrow::after {\n border-bottom-color: var(--bg-color) !important;\n}\n.kd-curve-2d-container {\n /* radio 自定义样式 */\n}\n.kd-curve-2d-container .el-radio {\n display: flex;\n align-items: center;\n vertical-align: middle;\n color: var(--radio-default-text-color);\n font-family: Microsoft YaHei UI, Microsoft YaHei UI;\n font-size: 14px;\n}\n.kd-curve-2d-container .el-radio__inner {\n width: 14px !important;\n height: 14px !important;\n background: transparent;\n border: 1px solid var(--radio-border-color);\n}\n.kd-curve-2d-container .el-radio__input.is-checked .el-radio__inner {\n border-color: var(--radio-checked-border-color);\n background: transparent;\n}\n.kd-curve-2d-container .el-radio__input.is-disabled .el-radio__inner {\n background-color: transparent;\n border-color: var(--radio-border-color);\n}\n.kd-curve-2d-container .el-radio__inner::after {\n width: 7px !important;\n height: 7px !important;\n background: var(--radio-checked-color);\n}\n.kd-curve-2d-container .el-radio.is-checked .el-radio__label {\n color: var(--radio-checked-text-color);\n font-weight: bold;\n}\n.kd-curve-2d-container {\n /* select */\n}\n.kd-curve-2d-container .el-input__inner {\n background: var(--bg-color) !important;\n border: 1px solid var(--border-color) !important;\n color: var(--text-color) !important;\n height: 32px !important;\n line-height: 32px !important;\n box-sizing: border-box;\n border-radius: 0px;\n}\n.kd-curve-2d-container {\n /* 下拉箭头 */\n}\n.kd-curve-2d-container .el-select .el-input__suffix i {\n display: none !important;\n}\n.kd-curve-2d-container .el-select .el-input__suffix {\n right: 0;\n width: 28px !important;\n height: 32px !important;\n line-height: 32px !important;\n background: var(--slider-gradient-color);\n display: flex;\n align-items: center;\n justify-content: center;\n border-left: 1px solid var(--border-color);\n}\n.kd-curve-2d-container .el-select .el-input__suffix::after {\n content: \"\";\n width: 0 !important;\n height: 0 !important;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 6px solid var(--slider-content-color); /* 橙色三角 */\n}\n.kd-curve-2d-container .el-select .el-input__suffix::after {\n transition: transform 0.2s ease;\n}\n.kd-curve-2d-container .el-select .el-input.is-focus .el-input__suffix::after {\n transform: rotate(180deg);\n}\n.kd-curve-2d-container .el-dialog {\n border: 1px solid var(--card-border-color);\n}\n.kd-curve-2d-container .el-dialog .el-form-item__label {\n color: var(--default-text-color);\n font-size: 14px;\n}\n.kd-curve-2d-container .el-dialog .el-dialog__headerbtn {\n top: 11px !important;\n width: 24px !important;\n height: 24px !important;\n background: linear-gradient(270deg, #c73521 0%, #f86c59 100%);\n border-radius: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.kd-curve-2d-container .el-dialog .el-dialog__headerbtn .el-dialog__close {\n color: #fff;\n font-size: 14px;\n font-weight: 700;\n}\n.kd-curve-2d-container .el-button {\n border-radius: 0px;\n border: none;\n}\n.kd-curve-2d-container .el-button--primary {\n background-image: linear-gradient(to bottom, #2057ea, #12338d);\n}\n.kd-curve-2d-container .el-button--default {\n background: var(--dialog-button-default);\n color: var(--default-text-color);\n}\n.kd-curve-2d-container .el-button--primary.is-disabled {\n background-image: linear-gradient(to bottom, #2f5ede, #1e3677);\n color: var(--dialog-button-disabled-text);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__nav-wrap::after {\n background-color: var(--card-border-color);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__item {\n color: var(--default-text-color);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__item.is-active {\n color: var(--select-selected-text-color);\n}\n.kd-curve-2d-container .el-tabs .el-tabs__active-bar {\n background: var(--select-selected-text-color);\n}\n.kd-curve-2d-container .el-tree {\n background: var(--bg-color) !important;\n color: var(--default-text-color);\n font-size: 14px;\n}\n.kd-curve-2d-container .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {\n background: var(--dialog-header) !important;\n color: var(--dialog-tree-text-color);\n}\n.kd-curve-2d-container .el-tree-node__content:hover,\n.kd-curve-2d-container .el-upload-list__item:hover {\n background: var(--dialog-header) !important;\n color: var(--dialog-tree-text-color);\n}\n.kd-curve-2d-container .vue-simple-context-menu__item,\n.kd-curve-2d-container .vue-simple-context-menu__item {\n font-size: 14px !important;\n}\n.kd-curve-2d-container .kd-lane-el-container {\n border: 1px solid var(--card-border-color);\n}\n.kd-curve-2d-container .kd-lane-el-container .rtd-config-side {\n border-right: 1px solid var(--card-border-color);\n}\n.kd-curve-2d-container .el-dialog__header {\n background: var(--dialog-header);\n text-align: center;\n}\n.kd-curve-2d-container .el-dialog__header .el-dialog__title {\n color: var(--dialog-header-text-color);\n}\n.kd-curve-2d-container .el-dialog__header {\n padding: 10px 10px 10px;\n}\n.kd-curve-2d-container .el-dialog__body {\n background: var(--bg-color);\n padding: 30px 30px 10px 30px;\n}\n.kd-curve-2d-container .el-dialog__body .input-number-container .el-input__inner {\n width: calc(100% - 80px) !important;\n margin-left: 40px !important;\n}\n.kd-curve-2d-container .el-dialog__body .el-input__inner {\n color: var(--default-text-color) !important;\n}\n.kd-curve-2d-container .el-dialog__body .el-input-number__decrease,\n.kd-curve-2d-container .el-dialog__body .el-input-number__increase {\n color: var(--default-text-color);\n}\n.kd-curve-2d-container .el-dialog__body .el-input-number__increase {\n background: var(--card-color);\n color: var(--default-text-color);\n border-radius: 0px 0px 0px 0px;\n border: 1px solid var(--card-border-color);\n width: 30px !important;\n height: 30px !important;\n line-height: 30px !important;\n}\n.kd-curve-2d-container .el-dialog__body .el-input-number__decrease {\n background: var(--card-color);\n border-radius: 0px 0px 0px 0px;\n border: 1px solid var(--card-border-color);\n width: 30px !important;\n height: 30px !important;\n line-height: 30px !important;\n}\n.kd-curve-2d-container .el-dialog__footer {\n text-align: center;\n background: var(--bg-color);\n}\n.kd-curve-2d-container .el-date-editor {\n background: var(--bg-color) !important;\n}\n.kd-curve-2d-container .el-date-editor .el-range-input {\n background: var(--bg-color) !important;\n border-top: 1px solid var(--border-color) !important;\n border-bottom: 1px solid var(--border-color) !important;\n color: var(--text-color) !important;\n height: 32px !important;\n line-height: 32px !important;\n box-sizing: border-box;\n border-radius: 0px;\n}\n.kd-curve-2d-container .el-date-editor .el-range-separator {\n color: var(--default-text-color);\n}";
10209
11205
  styleInject(css_248z$1);
10210
11206
 
10211
- var css_248z = "@charset \"UTF-8\";\n.kd-curve-2d-resize-container[data-v-815b84b2] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--bg-color);\n color: var(--default-text-color);\n overflow: hidden;\n /* 主容器 */\n}\n.kd-curve-2d-resize-container .container[data-v-815b84b2] {\n display: flex;\n flex: 1;\n width: 100%;\n overflow: hidden;\n}\n.kd-curve-2d-resize-container[data-v-815b84b2] {\n /* 面板通用样式 */\n}\n.kd-curve-2d-resize-container .panel[data-v-815b84b2] {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n flex-shrink: 0;\n background: var(--panel-item-bg-color);\n border: 1px solid var(--panel-item-border-color);\n padding: 8px;\n /* 隐藏滚动条 */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-curve-2d-resize-container .panel[data-v-815b84b2]::-webkit-scrollbar {\n display: none;\n}\n.kd-curve-2d-resize-container .panel-3[data-v-815b84b2] {\n flex: 1;\n min-width: 100px;\n}\n.kd-curve-2d-resize-container[data-v-815b84b2] {\n /* 拖拽条样式 */\n}\n.kd-curve-2d-resize-container .resizer[data-v-815b84b2] {\n width: 6px;\n cursor: col-resize;\n}\n.kd-curve-2d-resize-container .resizer[data-v-815b84b2]:hover {\n background-color: var(--resizer-bg-color);\n transition: background-color 0.2s ease;\n}";
11207
+ var css_248z = "@charset \"UTF-8\";\n.kd-curve-2d-resize-container[data-v-00924900] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--bg-color);\n color: var(--default-text-color);\n overflow: hidden;\n /* 主容器 */\n}\n.kd-curve-2d-resize-container .container[data-v-00924900] {\n display: flex;\n flex: 1;\n width: 100%;\n overflow: hidden;\n}\n.kd-curve-2d-resize-container[data-v-00924900] {\n /* 面板通用样式 */\n}\n.kd-curve-2d-resize-container .panel[data-v-00924900] {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n flex-shrink: 0;\n background: var(--panel-item-bg-color);\n border: 1px solid var(--panel-item-border-color);\n padding: 8px;\n /* 隐藏滚动条 */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n.kd-curve-2d-resize-container .panel[data-v-00924900]::-webkit-scrollbar {\n display: none;\n}\n.kd-curve-2d-resize-container .panel-3[data-v-00924900] {\n flex: 1;\n min-width: 100px;\n}\n.kd-curve-2d-resize-container[data-v-00924900] {\n /* 拖拽条样式 */\n}\n.kd-curve-2d-resize-container .resizer[data-v-00924900] {\n width: 6px;\n cursor: col-resize;\n}\n.kd-curve-2d-resize-container .resizer[data-v-00924900]:hover {\n background-color: var(--resizer-bg-color);\n transition: background-color 0.2s ease;\n}";
10212
11208
  styleInject(css_248z);
10213
11209
 
10214
11210
  /* script */
@@ -10270,6 +11266,7 @@ var __vue_render__ = function () {
10270
11266
  ref: "depthTimeChart",
10271
11267
  attrs: {
10272
11268
  formCache: _vm.formCache,
11269
+ cachedCurveDatas: _vm.cachedCurveDatas,
10273
11270
  depthTimeChartData: _vm.depthTimeChartData,
10274
11271
  },
10275
11272
  on: { depthTimeChange: _vm.handleDepthTimeChange },
@@ -10313,6 +11310,7 @@ var __vue_render__ = function () {
10313
11310
  config: _vm.config,
10314
11311
  formCache: _vm.formCache,
10315
11312
  cachedCurveDatas: _vm.cachedCurveDatas,
11313
+ currentHeaderStyle: _vm.currentHeaderStyle,
10316
11314
  },
10317
11315
  on: {
10318
11316
  updateScale: _vm.updateScale,
@@ -10406,7 +11404,7 @@ __vue_render__._withStripped = true;
10406
11404
  /* style */
10407
11405
  const __vue_inject_styles__ = undefined;
10408
11406
  /* scoped */
10409
- const __vue_scope_id__ = "data-v-815b84b2";
11407
+ const __vue_scope_id__ = "data-v-00924900";
10410
11408
  /* module identifier */
10411
11409
  const __vue_module_identifier__ = undefined;
10412
11410
  /* functional template */