kd-lane-chart-v3 0.0.1
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/README.md +170 -0
- package/dist/esm/index.js +10248 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/kd-lane-chart-v3.css +1532 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/util/index.js","../../../src/components/kdLaneChart/context-menu/index.vue","../../../src/components/kdLaneChart/strategies/CustomStrategy.js","../../../src/components/kdLaneChart/store/db-manager.js","../../../src/components/kdLaneChart/strategies/DefaultLocalStrategy.js","../../../src/components/kdLaneChart/strategies/StrategyFactory.js","../../../src/components/kdLaneChart/kd-lane/config/LaneEdit.vue","../../../src/components/kdLaneChart/kd-lane/config/LineEdit.vue","../../../src/components/kdLaneChart/kd-lane/config/TemplateEdit.vue","../../../src/components/kdLaneChart/kd-lane/config/RealTimeCurveConfig.vue","../../../src/components/kdLaneChart/kd-lane/const/action-type.js","../../../src/components/kdLaneChart/kd-lane/header-item.vue","../../../src/components/kdLaneChart/kd-lane/chart-container.vue","../../../src/components/kdCurveV2/depth-time-chart/index.vue","../../../src/assets/images/curveExport.png","../../../src/assets/images/depthSlot.png","../../../src/assets/images/refresh.png","../../../src/assets/images/timeSlot.png","../../../src/assets/images/warningPosition.png","../../../src/components/kdCurveV2/function-control-panel/index.vue","../../../src/components/kdCurveV2/resizeEcharts/index.vue","../../../src/components/kdCurveV2/line-chart-container/index.vue","../../../src/components/kdCurveV2/parameter-panel/index.vue","../../../src/components/util/faultParameters.js","../../../src/components/kdCurveV2/frame-layout/index.vue","../../index.js"],"sourcesContent":["import { depthtestDatas } from \"../../mock/testData\";\n\nexport function pxToNumber(pxStr) {\n if (!pxStr || typeof pxStr !== \"string\") return 0;\n return parseFloat(pxStr.replace(\"px\", \"\")) || 0;\n}\n/**\n * 【原地排序】对单个泳道(lane)的lines数组按lineSort升序排序\n * @param {Object} lane - 单个泳道对象(直接修改原对象的lines)\n */\nexport function sortLaneLines(lane) {\n // 边界保护:lane不存在/无lines字段则不处理\n if (!lane || !Array.isArray(lane.lines)) return;\n\n // 直接对原lines数组原地排序(无拷贝)\n lane.lines.sort((a, b) => {\n const lineSortA = a.lineSort ?? 0;\n const lineSortB = b.lineSort ?? 0;\n return lineSortA - lineSortB;\n });\n}\n\n/**\n * 【原地排序】对lanes数组按sort升序排序,并原地处理每条lane的lines\n * @param {Array} lanes - 泳道数组(直接修改原数组)\n */\nexport function sortLanes(lanes) {\n // 边界保护:非数组则不处理\n if (!Array.isArray(lanes)) return;\n\n // 1. 直接对原lanes数组原地排序(无拷贝)\n lanes.sort((a, b) => {\n const sortA = a.sort ?? 0;\n const sortB = b.sort ?? 0;\n return sortA - sortB;\n });\n\n // 2. 遍历每条lane,原地排序其lines\n lanes.forEach((lane) => sortLaneLines(lane));\n}\n\n/**\n * 【原地排序】完整的模板排序逻辑(直接修改原templates数组)\n * @param {Array} templates - 模板数组(直接修改原数组)\n * @returns {Array} 返回原数组(方便链式调用,本质已原地修改)\n */\nexport function sortTemplates(templates) {\n // 边界保护:非数组/空数组直接返回\n if (!Array.isArray(templates) || templates.length === 0) {\n return templates;\n }\n\n // 1. 直接对原templates数组原地排序(无拷贝)\n templates.sort((a, b) => {\n const sortA = a.sort ?? 0;\n const sortB = b.sort ?? 0;\n return sortA - sortB;\n });\n\n // 2. 遍历每个模板,原地排序其lanes\n templates.forEach((template) => sortLanes(template.lanes));\n\n // 返回原数组(方便调用方链式操作,比如 sortTemplates(arr).filter(...))\n return templates;\n}\n\n/**\n * 判断RQW数据类型\n * @param {Object} data - 待判断的数据对象\n * @returns {string|null} - 返回数据类型('line'|'lane'|'template')或null\n *\n * 类型判断规则:\n * - 同时包含lineId和laneId时,返回'line'(线路类型)\n * - 包含laneId和templateId但不包含lineId时,返回'lane'(车道类型)\n * - 只包含templateId时,返回'template'(模板类型)\n * - 不满足以上条件时,返回null\n */\nexport function judgeRawDataType(data) {\n // 如果数据为空,直接返回null\n if (!data) return null;\n\n // 判断是否为线路类型(同时包含lineId和laneId)\n if (data.lineId && data.laneId) {\n return \"line\";\n }\n // 判断是否为车道类型(包含laneId和templateId,但不包含lineId)\n else if (data.laneId && data.templateId && !data.lineId) {\n return \"lane\";\n }\n // 判断是否为模板类型(只包含templateId)\n else if (data.templateId) {\n return \"template\";\n }\n // 其他情况返回null\n else {\n return null;\n }\n}\nexport function strategyValidator(config) {\n // 1. 必须是对象\n if (typeof config !== \"object\" || config === null) {\n throw new Error(\"配置必须是一个对象\");\n }\n\n // 2. 必须有 type 属性\n if (!(\"type\" in config)) {\n throw new Error(\"配置必须包含 type 属性\");\n }\n\n // 通用参数校验\n if (!(\"caseId\" in config) || !(\"versionCode\" in config)) {\n throw new Error(\"配置必须包含 caseId, versionCode 属性\");\n }\n\n const { type } = config;\n\n // 3. 根据 type 的值进一步校验\n if (type === \"local\") {\n if (!(\"dataSource\" in config) || config.dataSource == null) {\n throw new Error(\"local 类型的配置必须包含 dataSource 属性\");\n }\n\n if (!(\"params\" in config.dataSource)) {\n throw new Error(\"local 类型的配置 dataSource 必须包含 params 属性\");\n }\n } else if (type === \"custom\") {\n // 校验增删改查方法是否为函数\n const crudMethods = [\"getUserTemplates\", \"upsertTemplate\", \"delTemplate\", \"upsertLane\", \"delLane\", \"upsertLine\", \"delLine\"];\n for (const method of crudMethods) {\n if (typeof config[method] !== \"function\") {\n throw new Error(`${method} 必须是一个函数`);\n }\n }\n } else {\n throw new Error('type 必须是 \"local\" 或 \"custom\"');\n }\n\n return true; // 校验通过\n}\n\n/**\n * 数据归一化:将任意输入结构转为树形结构\n * @param {*} data 外部传入的数据源(扁平结构/树形结构)\n * @returns {Array} 统一的树形templates数组\n */\nexport function normalizeData(data) {\n // 容错:空数据返回空数组\n if (!data) return [];\n\n // 情况1:扁平结构 → 转换\n if (isFlatStructure(data)) {\n return flattenToTree(data.templates, data.lanes, data.lines);\n }\n\n // 情况2:树形结构 → 直接提取templates(兼容两种传入形式:{templates:[]} 或 直接传templates数组)\n if (isTreeStructure(data)) {\n return Array.isArray(data) ? data : data.templates;\n }\n\n // 情况3:非法结构 → 报错并返回空数组\n console.error(\"传入的数据源结构不支持,请检查格式!\");\n return [];\n}\n\n/**\n * 判断是否为扁平结构\n * @param {*} data 传入的数据源\n * @returns {boolean}\n */\nexport function isFlatStructure(data) {\n // 扁平结构特征:包含templates、lanes、lines三个数组,且templates第一项无lanes属性\n return (\n !!data &&\n Array.isArray(data.templates) &&\n Array.isArray(data.lanes) &&\n Array.isArray(data.lines) &&\n (data.templates.length === 0 || !data.templates[0].lanes)\n );\n}\n\n/**\n * 判断是否为树形结构(第二种)\n * @param {*} data 传入的数据源\n * @returns {boolean}\n */\nexport function isTreeStructure(data) {\n // 树形结构特征:直接是templates数组,或包含templates数组且templates项有lanes数组\n if (Array.isArray(data)) {\n // 外部直接传templates数组的情况\n return data.length === 0 || (!!data[0] && Array.isArray(data[0].lanes));\n }\n return !!data && Array.isArray(data.templates) && (data.templates.length === 0 || Array.isArray(data.templates[0].lanes));\n}\n\n/**\n * 将扁平数据转换为树形结构\n * {templates : [], lanes : [], lines : []}\n */\nexport function flattenToTree(templates = [], lanes = [], lines = []) {\n const laneMap = new Map();\n for (const lane of lanes) {\n if (laneMap.has(lane.templateId)) {\n laneMap.get(lane.templateId).push(lane);\n } else {\n laneMap.set(lane.templateId, [lane]);\n }\n }\n const lineMap = new Map();\n for (const line of lines) {\n if (lineMap.has(line.laneId)) {\n lineMap.get(line.laneId).push(line);\n } else {\n lineMap.set(line.laneId, [line]);\n }\n }\n\n const result = [];\n\n for (const template of templates) {\n const tempT = { ...template };\n const tId = tempT.templateId;\n tempT.lanes = laneMap.get(tId) || [];\n\n for (const lane of tempT.lanes) {\n const laneId = lane.laneId;\n lane.lines = lineMap.get(laneId) || [];\n }\n result.push(tempT);\n }\n return result;\n}\n\n/**\n * 将树形结构数据转换为扁平数据\n */\nexport function treeToFlatten(treeData) {\n const templates = [];\n const lanes = [];\n const lines = [];\n\n for (const template of treeData) {\n // 未被显式提取的其他所有属性 收集到一个新的对象 templateData 中\n const { lanes: templateLanes, ...templateData } = template;\n\n // 如果template没有templateId属性,则调用generateUUID为其生成\n if (!templateData.templateId) {\n templateData.templateId = generateUUID();\n }\n\n templates.push(templateData);\n\n for (const lane of templateLanes || []) {\n const { lines: laneLines, ...laneData } = lane;\n\n // lane中的templateId属性,确保等于他所在template对象中的templateId属性\n laneData.templateId = templateData.templateId;\n\n // 如果没有laneId属性,则调用generateUUID为其生成\n if (!laneData.laneId) {\n laneData.laneId = generateUUID();\n }\n\n lanes.push(laneData);\n\n for (const line of laneLines || []) {\n // 确保line中的laneId等于他所在对象的laneId属性\n line.laneId = laneData.laneId;\n\n // 如果没有lineId,则调用generateUUID方法为其生成\n if (!line.lineId) {\n line.lineId = generateUUID();\n }\n\n lines.push(line);\n }\n }\n }\n return { templates, lanes, lines };\n}\n\nexport function generateUUID(simple = true) {\n // 优先使用现代浏览器的原生方法\n let uuid = \"\";\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n uuid = crypto.randomUUID();\n } else {\n uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n if (simple) {\n // 替换掉-号, 生成的UUID更短\n return uuid.replace(/-/g, \"\");\n } else {\n return uuid;\n }\n}\n\nexport const getAdaptedFontSize = (size) => {\n // 基准分辨率(宽×高)\n const BASE_WIDTH = 1920;\n // 基准分辨率下的目标字体大小\n\n // 获取当前屏幕/视口的实际宽度和高度\n // 优先取视口尺寸(适配移动端/iframe),无则取屏幕尺寸\n const currentWidth = window.innerWidth || screen.width;\n\n // 计算宽高比例(取最小值,避免字体过大/过小)\n const widthRatio = currentWidth / BASE_WIDTH;\n // const scaleRatio = Math.min(widthRatio, heightRatio);\n const scaleRatio = widthRatio;\n\n // 计算适配后的字体大小(保留2位小数,避免精度问题)\n const adaptedFontSize = Number((size * scaleRatio).toFixed(2));\n\n return adaptedFontSize;\n};\nexport const colorToRGBA = (color, alpha = 1) => {\n // 处理颜色名(如 red → rgb(255,0,0))\n const tempEl = document.createElement(\"div\");\n tempEl.style.color = color;\n document.body.appendChild(tempEl);\n const computedColor = getComputedStyle(tempEl).color;\n document.body.removeChild(tempEl);\n\n // 匹配 RGB/RGBA 格式\n const rgbMatch = computedColor.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n const rgbaMatch = computedColor.match(/rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*(\\d+(\\.\\d+)?)\\)/);\n\n if (rgbMatch) {\n return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${alpha})`;\n } else if (rgbaMatch) {\n return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${alpha})`;\n }\n // 兜底(默认黑色)\n return `rgba(0, 0, 0, ${alpha})`;\n};\nexport const getCssVariable = (name) => {\n return getComputedStyle(document.body).getPropertyValue(name).trim();\n};\n// 生成初始颜色\nexport const generateUniqueBrightColor = () => {\n // 定义颜色生成范围(HSL 模式,保证深色)\n const getValidHSL = () => {\n // 色相:0-360 全范围,保证颜色丰富\n const hue = Math.floor(Math.random() * 360);\n // 饱和度:70-100%,保证颜色浓郁(深色需要足够饱和度)\n const saturation = Math.floor(Math.random() * 30) + 70;\n // 亮度:20-45%(降低亮度,生成深色;原 55-85% 是亮色)\n const lightness = Math.floor(Math.random() * 20) + 45;\n return { hue, saturation, lightness };\n };\n\n // 【核心修复】HSL 转换标准十六进制(强制补零,保证 #XXXXXX 格式)\n const hslToStandardHex = (h, s, l) => {\n s = s / 100;\n l = l / 100;\n\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n let r, g, b;\n if (s === 0) {\n r = g = b = l; // 灰度(饱和度范围已限制,几乎不会触发)\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h / 360 + 1 / 3);\n g = hue2rgb(p, q, h / 360);\n b = hue2rgb(p, q, h / 360 - 1 / 3);\n }\n\n // 强制转2位十六进制,不足补零(核心修复点)\n const formatHex = (val) => {\n const hex = Math.round(val * 255)\n .toString(16)\n .toUpperCase();\n return hex.padStart(2, \"0\"); // 确保是2位,比如 5 → 05,F → 0F\n };\n\n const red = formatHex(r);\n const green = formatHex(g);\n const blue = formatHex(b);\n return `#${red}${green}${blue}`; // 严格返回 #XXXXXX 格式\n };\n\n // 循环生成,直到得到未重复的颜色\n let finalColor;\n do {\n const { hue, saturation, lightness } = getValidHSL();\n finalColor = hslToStandardHex(hue, saturation, lightness);\n // 极端情况:生成超1800个唯一色时,放宽限制避免死循环\n if (this.generatedColors.length > 1800) {\n break;\n }\n } while (Object.prototype.hasOwnProperty.call(this.generatedColors, finalColor));\n\n this.generatedColors.push(finalColor);\n return finalColor;\n};\n// 判断数字保留一定位数\nexport const formatNumber = (value, n = 2) => {\n // 1. 校验小数位数参数的合法性\n if (!Number.isInteger(n) || n < 0) {\n throw new Error(\"小数位数n必须是非负整数\");\n }\n\n // 2. 定义有效数字判断逻辑(排除布尔值、NaN、Infinity)\n const isEffectiveNumber = (val) => {\n return typeof val === \"number\" && !isNaN(val) && isFinite(val) && typeof val !== \"boolean\";\n };\n\n // 3. 判断是否为有效数字\n if (isEffectiveNumber(value)) {\n // 保留指定小数位(四舍五入),toFixed返回字符串,转回数字避免末尾多余0(如123.00→123)\n const formatted = Number(value.toFixed(n));\n // 特殊处理:保留0位小数时返回整数,其他情况返回浮点数\n return n === 0 ? Math.floor(formatted) : formatted;\n }\n\n // 4. 非数字类型直接返回原值\n return value;\n};\n/**\n * 将 RGBA 颜色转换为 HSLA 颜色\n * @param {number} r - 红色通道值 (0-255)\n * @param {number} g - 绿色通道值 (0-255)\n * @param {number} b - 蓝色通道值 (0-255)\n * @param {number} a - 透明度 (0-1,可选,默认 1)\n * @returns {string} 标准的 HSLA 字符串(如 \"hsla(180, 50%, 50%, 0.8)\")\n */\nfunction rgbaToHsla(r, g, b, a = 1) {\n // 1. 校验输入值的合法性\n if (\n typeof r !== \"number\" ||\n typeof g !== \"number\" ||\n typeof b !== \"number\" ||\n r < 0 ||\n r > 255 ||\n g < 0 ||\n g > 255 ||\n b < 0 ||\n b > 255 ||\n a < 0 ||\n a > 1\n ) {\n throw new Error(\"输入参数不合法:RGB 需为 0-255 的数字,透明度需为 0-1 的数字\");\n }\n\n // 2. 将 RGB 值归一化为 0-1 的小数\n const red = r / 255;\n const green = g / 255;\n const blue = b / 255;\n\n // 3. 计算 RGB 中的最大值、最小值\n const max = Math.max(red, green, blue);\n const min = Math.min(red, green, blue);\n\n // 初始化色相(H)、饱和度(S)、亮度(L)\n let h = 0,\n s = 0,\n l = (max + min) / 2;\n\n // 4. 计算色相和饱和度(如果 max === min,说明是灰度色,H=0,S=0)\n if (max !== min) {\n const delta = max - min;\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n // 根据最大值所在通道计算色相\n switch (max) {\n case red:\n h = (green - blue) / delta + (green < blue ? 6 : 0);\n break;\n case green:\n h = (blue - red) / delta + 2;\n break;\n case blue:\n h = (red - green) / delta + 4;\n break;\n }\n // 将色相转换为 0-360°\n h = Math.round(h * 60);\n }\n\n // 5. 饱和度和亮度转换为百分比(保留1位小数),色相取整\n s = Math.round(s * 100 * 10) / 10;\n l = Math.round(l * 100 * 10) / 10;\n\n // 6. 返回标准 HSLA 格式字符串\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n}\n\n// 额外:支持解析 RGBA 字符串(如 \"rgba(255, 0, 0, 0.5)\")的辅助函数\nexport const parseRgbaString = (rgbaStr) => {\n // 匹配 rgba(R, G, B, A) 格式\n const match = rgbaStr.match(/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([0-9.]+)\\s*\\)$/);\n if (!match) {\n throw new Error('请输入合法的 RGBA 字符串,如 \"rgba(255, 0, 0, 0.5)\"');\n }\n const [, r, g, b, a] = match;\n return rgbaToHsla(Number(r), Number(g), Number(b), Number(a));\n};\n// if (ratios < 0.2) {\n// ratio = 0.2;\n// } else if (ratios < 0.4) {\n// ratio = 0.4;\n// } else if (ratios < 0.6) {\n// ratio = 0.6;\n// } else if (ratios < 0.8) {\n// ratio = 0.8;\n// } else if (ratios < 1) {\n// ratio = 1;\n// }\n\n/**\n * 十六进制颜色转 HLS 格式\n * @param {string} hex - 十六进制颜色,支持 #xxx 或 #xxxxxx 格式\n * @returns {Array<number>} HLS 数组 [hue(0-360), lightness(0-100), saturation(0-100)]\n */\nfunction hexToHls(hex) {\n // 去除 # 号,统一处理\n hex = hex.replace(/^#/, \"\");\n\n // 处理 3 位简写(如 #FCA)转 6 位\n if (hex.length === 3) {\n hex = hex\n .split(\"\")\n .map((char) => char + char)\n .join(\"\");\n }\n\n // 转 RGB 数值(0-255)\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n\n // 计算 RGB 最大值、最小值\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0,\n l = (max + min) / 2,\n s = 0;\n\n if (max !== min) {\n // 计算饱和度\n s = l > 0.5 ? (max - min) / (2 - max - min) : (max - min) / (max + min);\n\n // 计算色相\n switch (max) {\n case r:\n h = (g - b) / (max - min) + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / (max - min) + 2;\n break;\n case b:\n h = (r - g) / (max - min) + 4;\n break;\n }\n h *= 60; // 转角度(0-360)\n }\n\n // 转成百分比/角度范围(h:0-360, l/s:0-100)\n return [\n Math.round(h * 100) / 100, // 保留两位小数\n Math.round(l * 10000) / 100, // 亮度 0-100\n Math.round(s * 10000) / 100, // 饱和度 0-100\n ];\n}\n\n/**\n * HLS 格式转十六进制颜色\n * @param {Array<number>} hls - HLS 数组 [hue(0-360), lightness(0-100), saturation(0-100)]\n * @returns {string} 十六进制颜色 #xxxxxx\n */\nfunction hlsToHex(hls) {\n let [h, l, s] = hls;\n // 转换为 0-1 范围\n h = h / 360;\n l = l / 100;\n s = s / 100;\n\n let r, g, b;\n\n if (s === 0) {\n // 饱和度为 0 时是灰度\n r = g = b = l;\n } else {\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n // 转 0-255 并补零,拼接成 #xxxxxx 格式\n const toHex = (x) => {\n const hex = Math.round(x * 255).toString(16);\n return hex.length === 1 ? \"0\" + hex : hex;\n };\n\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`.toUpperCase();\n}\n\n/**\n * 根据数据占比调整十六进制颜色\n * @param {string} hexColor - 原始十六进制颜色(#xxxxxx 或 #xxx)\n * @param {number} ratio - 数据占比(0-1)\n * @param {string} [adjustDim='lightness'] - 调整维度:hue/lightness/saturation\n * @returns {string} 调整后的十六进制颜色 #xxxxxx\n */\nexport const adjustColorByRatio = (hexColor, ratios, adjustDim = \"lightness\") => {\n let ratio = 0;\n\n // 1. 校验占比范围\n // if (ratio < 0 || ratio > 1) {\n // throw new Error('数据占比必须在 0 到 1 之间');\n // }\n\n // 2. 十六进制转 HLS\n const baseHls = hexToHls(hexColor);\n const [h, l, s] = baseHls;\n\n // 3. 根据占比调整 HLS 颜色\n let newHls = [h, l, s];\n switch (adjustDim) {\n case \"lightness\": {\n // 亮度调整:占比 0.5 保持原亮度,越接近 1 越亮,越接近 0 越暗\n const newLightness = 50 + (l - 50) * (1 - Math.abs(ratio - 0.5) * 2);\n newHls[1] = Math.max(0, Math.min(100, newLightness));\n break;\n }\n\n case \"saturation\": {\n // 饱和度调整:占比越高,饱和度越高\n const newSaturation = s * ratio * 2;\n newHls[2] = Math.max(0, Math.min(100, newSaturation));\n break;\n }\n\n case \"hue\": {\n // 色相调整:占比对应色相环偏移\n const hueOffset = 360 * ratio;\n newHls[0] = (h + hueOffset) % 360;\n break;\n }\n default: {\n throw new Error(\"调整维度只能是 'hue'/'lightness'/'saturation'\");\n }\n }\n\n // 4. 调整后的 HLS 转回十六进制\n return hlsToHex(newHls);\n};\n// 生成模拟数据\nexport const createMockDataGenerator = (dataSource, options = {}) => {\n const { startDepth = 2199, depthStep = 1, startTime = Math.floor(Date.now() / 1000), timeStep = 1 } = options;\n\n let currentDepth = startDepth;\n let currentTime = startTime;\n\n // 👉 1. 提取所有 paramId + min/max\n const paramConfig = {};\n\n dataSource.templates.forEach((template) => {\n template.lanes.forEach((lane) => {\n if (!lane.lines) return;\n\n lane.lines.forEach((line) => {\n const { paramId, min = 0, max = 100 } = line;\n\n paramConfig[paramId] = { min, max };\n });\n });\n });\n\n // 👉 2. 工具函数:生成区间随机数(带平滑)\n const lastValues = {};\n\n function getNextValue(paramId) {\n const randomIndex = Math.floor(Math.random() * depthtestDatas.length);\n\n lastValues[paramId] = depthtestDatas[randomIndex][paramId];\n\n return Number(lastValues[paramId].toFixed(2));\n }\n\n // 👉 3. 返回生成函数\n return function generate() {\n const result = {\n depth: currentDepth,\n timestamp: currentTime,\n };\n\n Object.keys(paramConfig).forEach((paramId) => {\n result[paramId] = getNextValue(paramId);\n });\n\n // 👉 自增\n currentDepth += depthStep;\n currentTime += timeStep;\n\n return result;\n };\n};\n\n/**\n * 对数组按depth进行拆分,当遇到不是递增的点时进行拆分\n * @param {Array} arr - 要拆分的数组\n * @param {string} key - 要检查的字段名,默认为'depth'\n * @returns {Array} 拆分后的数组,每个子数组内的元素都保持递增\n */\nexport function splitArrayByDepth(arr, key = \"depth\") {\n if (!arr || !Array.isArray(arr)) {\n return [];\n }\n\n if (arr.length < 2) {\n return [arr];\n }\n\n const result = [];\n\n function processSegment(segment) {\n if (segment.length < 2) {\n if (segment.length === 1) {\n result.push([segment[0]]);\n }\n return;\n }\n\n const splitIndices = [];\n for (let i = 1; i < segment.length; i++) {\n const prevDepth = Number(segment[i - 1][key]);\n const currDepth = Number(segment[i][key]);\n if (currDepth < prevDepth) {\n splitIndices.push(i);\n }\n }\n\n if (splitIndices.length === 0) {\n result.push(segment);\n return;\n }\n\n let startIndex = 0;\n for (const splitIndex of splitIndices) {\n const subSegment = segment.slice(startIndex, splitIndex);\n if (subSegment.length > 0) {\n result.push(subSegment);\n }\n startIndex = splitIndex;\n }\n\n const lastSegment = segment.slice(startIndex);\n if (lastSegment.length > 0) {\n result.push(lastSegment);\n }\n }\n\n processSegment(arr);\n return result;\n}\n\n/**\n * 计算数组对象中某个数值属性的 最小间隔、最大间隔、最值\n * @param {Array} arr 目标数组\n * @param {String} key 要计算的属性名(如 'depth'、'paramId'、'time')\n * @returns {Object} { min, max, minGap, maxGap, sortedList }\n */\nexport const getAttrGap = (arr, key) => {\n // 1. 空值判断\n if (!arr || !Array.isArray(arr) || arr.length < 2) {\n return {\n min: null,\n max: null,\n minGap: null,\n maxGap: null,\n avgGap: null, // 新增:平均间隔(去除离群值后)\n sortedList: arr || [],\n gaps: [],\n };\n }\n\n // 2. 深拷贝 + 过滤有效数字(排除undefined、null、非数字)\n const validList = arr.map((item) => Number(item[key])).filter((val) => !isNaN(val) && val !== null && val !== undefined);\n\n if (validList.length < 2) {\n return {\n min: null,\n max: null,\n minGap: null,\n maxGap: null,\n avgGap: null,\n sortedList: validList,\n gaps: [],\n };\n }\n\n // 3. 排序(必须排序才能算正确间隔)\n const sortedList = [...validList].sort((a, b) => a - b);\n\n // 4. 计算最值\n const min = sortedList[0];\n const max = sortedList[sortedList.length - 1];\n\n // 5. 计算所有相邻间隔\n const gaps = [];\n for (let i = 1; i < sortedList.length; i++) {\n const gap = sortedList[i] - sortedList[i - 1];\n gaps.push(gap < 0 ? -gap : gap); // 取绝对值\n }\n\n // 6. 移除离群值并计算平均间隔\n let filteredGaps = [...gaps];\n let avgGap = null;\n \n if (filteredGaps.length > 1) {\n // 计算平均值\n const mean = filteredGaps.reduce((sum, gap) => sum + gap, 0) / filteredGaps.length;\n \n // 计算标准差\n const variance = filteredGaps.reduce((sum, gap) => sum + Math.pow(gap - mean, 2), 0) / filteredGaps.length;\n const stdDev = Math.sqrt(variance);\n \n // 使用3倍标准差作为阈值移除离群值\n const threshold = 3 * stdDev;\n filteredGaps = filteredGaps.filter(gap => Math.abs(gap - mean) <= threshold);\n \n // 重新计算过滤后的平均间隔\n if (filteredGaps.length > 0) {\n avgGap = filteredGaps.reduce((sum, gap) => sum + gap, 0) / filteredGaps.length;\n }\n } else if (filteredGaps.length === 1) {\n avgGap = filteredGaps[0];\n }\n\n // 7. 最小/最大间隔(使用过滤后的数据)\n const minGap = filteredGaps.length > 0 ? Math.min(...filteredGaps) : null;\n const maxGap = filteredGaps.length > 0 ? Math.max(...filteredGaps) : null;\n\n return {\n min, // 属性最小值\n max, // 属性最大值\n minGap, // 相邻最小间隔(去除离群值后)\n maxGap, // 相邻最大间隔(去除离群值后)\n avgGap, // 平均间隔(去除离群值后)\n sortedList, // 排序后的属性值\n gaps: filteredGaps, // 过滤后的所有间隔\n };\n};\n\n// 判断是否为数字\nexport const isNumeric = (value) => {\n // 第一步:先转数字\n const num = Number(value);\n\n // 第二步:必须是数字 && 不是 NaN && 不是无穷大\n return typeof num === \"number\" && !isNaN(num) && isFinite(num);\n};\n","<template>\n <div>\n <ul ref=\"refUl\" class=\"vue-simple-context-menu\" v-click-outside=\"onClickOutside\">\n <li\n v-for=\"(option, index) in options\"\n :key=\"index\"\n @click.stop=\"optionClicked(option)\"\n class=\"vue-simple-context-menu__item\"\n :class=\"[option.class, option.type === 'divider' ? 'vue-simple-context-menu__divider' : '']\"\n >\n <span v-html=\"option.name\"></span>\n </li>\n </ul>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"VueSimpleContextMenu\",\n props: {\n options: {\n type: Array,\n required: true,\n },\n positionInfo: {\n type: Object,\n default: () => ({\n left: 0,\n top: 0,\n }),\n },\n },\n data() {\n return {\n item: null,\n menuWidth: null,\n menuHeight: null,\n };\n },\n methods: {\n showMenu(event, item) {\n this.item = item;\n\n const menu = this.$refs.refUl;\n if (!menu) {\n return;\n }\n console.log(this.positionInfo);\n const { left = 0, top = 0 } = this.positionInfo;\n\n if (!this.menuWidth || !this.menuHeight) {\n menu.style.visibility = \"hidden\";\n menu.style.display = \"block\";\n this.menuWidth = menu.offsetWidth;\n this.menuHeight = menu.offsetHeight;\n menu.removeAttribute(\"style\");\n }\n\n if (this.menuWidth + event.pageX >= window.innerWidth) {\n menu.style.left = event.pageX - this.menuWidth - left + 2 + \"px\";\n } else {\n menu.style.left = event.pageX - left + 2 + \"px\";\n }\n\n if (this.menuHeight + event.pageY >= window.innerHeight) {\n menu.style.top = event.pageY - this.menuHeight - top + 2 + \"px\";\n } else {\n menu.style.top = event.pageY - top + 2 + \"px\";\n }\n menu.classList.add(\"vue-simple-context-menu--active\");\n },\n hideContextMenu() {\n const element = this.$refs.refUl;\n if (element) {\n element.classList.remove(\"vue-simple-context-menu--active\");\n this.$emit(\"menu-closed\");\n }\n },\n onClickOutside() {\n this.hideContextMenu();\n },\n optionClicked(option) {\n this.hideContextMenu();\n this.$emit(\"option-clicked\", {\n item: this.item,\n option: option,\n });\n },\n onEscKeyRelease(event) {\n if (event.keyCode === 27) {\n this.hideContextMenu();\n }\n },\n },\n mounted() {\n document.body.addEventListener(\"keyup\", this.onEscKeyRelease);\n },\n beforeUnmount() {\n document.removeEventListener(\"keyup\", this.onEscKeyRelease);\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.vue-simple-context-menu {\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n display: none;\n list-style: none;\n position: fixed;\n z-index: 999;\n background-color: var(--kd-lane-container-context-background-color, #ecf0f1);\n border-bottom-width: 0px;\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n box-shadow: 0 3px 6px 0 rgba(var(--kd-lane-container-context-item-color, #333), 0.2);\n border-radius: 4px;\n\n &--active {\n display: block;\n }\n\n &__item {\n display: flex;\n color: var(--kd-lane-container-context-item-color, #333);\n cursor: pointer;\n padding: 5px 15px;\n align-items: center;\n\n &:hover {\n background-color: var(--kd-lane-container-context-hover-background-color, #007aff);\n color: var(--kd-lane-container-context-hover-item-color, #fff);\n }\n }\n\n &__divider {\n box-sizing: content-box;\n height: 2px;\n background-color: var(--kd-lane-container-context-divider-color, #595a5a);\n padding: 4px 0;\n background-clip: content-box;\n pointer-events: none;\n }\n\n li {\n &:first-of-type {\n margin-top: 4px;\n }\n\n &:last-of-type {\n margin-bottom: 4px;\n }\n }\n}\n</style>\n","export class CustomStrategy {\n constructor(strategy) {\n this.strategy = strategy;\n }\n\n /**\n * 加载配置\n * @returns {Promise<Object>} - 返回配置对象,包含所有模板、泳道和线条数据\n * @example\n * {\n * caseVersion: { caseId: \"case123\", versionCode: \"v1.0\", createDate: \"2023-01-01\" },\n * templates: [\n * {\n * templateId: \"tpl123\",\n * templateName: \"模板1\",\n * isPublic: \"1\",\n * lanes: [\n * {\n * laneId: \"lane123\",\n * laneName: \"泳道1\",\n * lines: [\n * { lineId: \"line123\", lineName: \"线条1\", laneId: \"lane123\", color: \"#ff0000\" },\n * { lineId: \"line456\", lineName: \"线条2\", laneId: \"lane123\", color: \"#00ff00\" }\n * ]\n * }\n * ]\n * }\n * ],\n * params: []\n * }\n */\n getUserTemplates() {\n return this.strategy.getUserTemplates();\n }\n\n /**\n * 新增或更新模板\n * @param {Object} data - 模板数据\n * @returns {Promise<Object>} - 返回插入或更新后的完整模板对象\n * @example\n * {\n * templateId: \"tpl123\",\n * templateName: \"模板1\",\n * isPublic: \"1\",\n * createDate: \"2023-01-01\",\n * updateDate: \"2023-01-02\"\n * }\n */\n upsertTemplate(data) {\n return this.strategy.upsertTemplate(data);\n }\n\n /**\n * 删除模板\n * @param {Object} data - 模板数据(需包含templateId)\n * @returns {Promise<void>} - 不携带任何数据,仅表示操作成功或失败\n */\n delTemplate(data) {\n return this.strategy.deleteTemplate(data);\n }\n\n /**\n * 新增或更新泳道\n * @param {Object} data - 泳道数据\n * @returns {Promise<Object>} - 返回插入或更新后的完整泳道对象\n * @example\n * {\n * laneId: \"lane123\",\n * laneName: \"泳道1\",\n * templateId: \"tpl123\",\n * createDate: \"2023-01-01\"\n * }\n */\n upsertLane(data) {\n return this.strategy.upsertLane(data);\n }\n\n /**\n * 删除泳道\n * @param {Object} lane - 泳道数据(需包含laneId和lines数组)\n * @returns {Promise<void>} - 不携带任何数据,仅表示操作成功或失败\n */\n delLane(lane) {\n return this.strategy.deleteLane(lane);\n }\n\n /**\n * 新增或更新线条\n * @param {Object} data - 线条数据\n * @returns {Promise<Object>} - 返回插入或更新后的完整线条对象\n * @example\n * {\n * lineId: \"line123\",\n * lineName: \"线条1\",\n * laneId: \"lane123\",\n * templateId: \"tpl123\",\n * color: \"#ff0000\",\n * createDate: \"2023-01-01\"\n * }\n */\n upsertLine(data) {\n return this.strategy.upsertLine(data);\n }\n\n /**\n * 删除线条\n * @param {Object} data - 线条数据(需包含lineId和laneId)\n * @returns {Promise<void>} - 不携带任何数据,仅表示操作成功或失败\n */\n delLine(data) {\n return this.strategy.delLine(data);\n }\n\n /**\n * 恢复默认设置\n * @returns {Promise<void>} - 不携带任何数据,仅表示操作成功或失败\n */\n restoreSetting() {\n if (this.strategy.restoreSetting) {\n return this.strategy.restoreSetting();\n }\n return Promise.resolve();\n }\n}\n","import { cloneDeep } from \"lodash-es\";\nimport { toRaw } from \"vue\";\n\n/**\n * Vue 3 响应式对象为 Proxy,无法直接写入 IndexedDB,需转为普通对象\n */\nfunction toPlainData(data) {\n if (data === null || data === undefined) {\n return data;\n }\n const raw = toRaw(data);\n if (typeof raw !== \"object\") {\n return raw;\n }\n try {\n return JSON.parse(JSON.stringify(raw));\n } catch {\n return cloneDeep(raw);\n }\n}\n\n/**\n * 配置管理 IndexedDB 工具类(版本号归属场景)\n * 核心 Store:templates/lanes/lines/case_versions/params\n * 设计原则:ES6 + Promise 链式调用 + 低冗余 + 索引优化\n *\n * case_versions(caseId → versionCode)\n * ↓(通过caseId关联)\n * templates(caseId + templateId → 模板列表)\n * ↓(通过templateId关联)\n * lanes(caseId + laneId → 泳道列表)\n * ↓(通过laneId关联)\n * lines(caseId + lineId → 线条列表)\n *\n */\nclass ConfigDBManager {\n // 数据库常量配置(升级版本号到2)\n static DB_NAME = \"KDLaneChartContainerConfigDB\";\n static MAX_UNICODE_CHAR = \"\\uffff\";\n static DB_VERSION = 2;\n static STORE_NAMES = {\n TEMPLATES: \"templates\",\n LANES: \"lanes\",\n LINES: \"lines\",\n PARAMS: \"params\",\n CASE_VERSIONS: \"case_versions\",\n };\n\n // 私有变量:数据库实例\n _db = null;\n\n /**\n * 私有方法:打开/创建数据库(核心基础方法)\n * @returns {Promise<IDBDatabase>} 数据库实例Promise\n */\n _openDB() {\n return new Promise((resolve, reject) => {\n if (this._db) {\n resolve(this._db);\n return;\n }\n\n const request = indexedDB.open(ConfigDBManager.DB_NAME, ConfigDBManager.DB_VERSION);\n\n // 数据库版本升级/首次创建时执行(创建Store和索引)\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n const { STORE_NAMES } = ConfigDBManager;\n\n // 1. 创建 case_versions Store(场景版本,主键caseId)\n if (!db.objectStoreNames.contains(STORE_NAMES.CASE_VERSIONS)) {\n db.createObjectStore(STORE_NAMES.CASE_VERSIONS, {\n keyPath: \"caseId\",\n });\n }\n\n // 2. 重建 templates Store(复合主键:caseId + templateId)\n if (!db.objectStoreNames.contains(STORE_NAMES.TEMPLATES)) {\n // eslint-disable-next-line\n const templateStore = db.createObjectStore(STORE_NAMES.TEMPLATES, {\n keyPath: [\"caseId\", \"templateId\"],\n });\n }\n\n // 3. 重建 lanes Store(复合主键:caseId + laneId)\n if (!db.objectStoreNames.contains(STORE_NAMES.LANES)) {\n // eslint-disable-next-line\n const laneStore = db.createObjectStore(STORE_NAMES.LANES, {\n keyPath: [\"caseId\", \"laneId\"],\n });\n }\n\n // 4. 重建 lines Store(复合主键:caseId + lineId)\n if (!db.objectStoreNames.contains(STORE_NAMES.LINES)) {\n // eslint-disable-next-line\n const lineStore = db.createObjectStore(STORE_NAMES.LINES, {\n keyPath: [\"caseId\", \"lineId\"],\n });\n }\n\n // 5. 重建 params Store(复合主键:caseId + paramId)\n if (!db.objectStoreNames.contains(STORE_NAMES.PARAMS)) {\n // eslint-disable-next-line\n const paramStore = db.createObjectStore(STORE_NAMES.PARAMS, {\n keyPath: [\"caseId\", \"paramId\"],\n });\n }\n };\n\n // 打开成功\n request.onsuccess = (event) => {\n this._db = event.target.result;\n this._db.onclose = () => {\n this._db = null;\n };\n resolve(this._db);\n };\n\n // 打开失败\n request.onerror = (event) => {\n reject(new Error(`打开数据库失败:${event.target.error.message}`));\n };\n\n request.onblocked = () => {\n reject(new Error(\"数据库操作被阻塞,请关闭其他标签页后重试\"));\n };\n });\n }\n\n /**\n * 关闭数据库\n * @returns {Promise<void>}\n */\n closeDB() {\n return new Promise((resolve) => {\n if (this._db) {\n this._db.close();\n this._db = null;\n }\n resolve();\n });\n }\n\n /**\n * 私有工具方法:版本号比较\n * @param {string|number} newVersion - 新版本号\n * @param {string|number} oldVersion - 旧版本号\n * @returns {number} 比较结果\n */\n _compareVersion(newVersion, oldVersion) {\n const parseVersion = (v) => String(v).split(\".\").map(Number);\n const newV = parseVersion(newVersion);\n const oldV = parseVersion(oldVersion);\n const maxLen = Math.max(newV.length, oldV.length);\n for (let i = 0; i < maxLen; i++) {\n const newSeg = newV[i] || 0;\n const oldSeg = oldV[i] || 0;\n if (newSeg > oldSeg) return 1;\n if (newSeg < oldSeg) return -1;\n }\n return 0;\n }\n\n /**\n * 私有方法:清除指定场景下的所有数据\n * @param {string} caseId - 场景ID\n * @returns {Promise<void>}\n */\n _clearSceneData(caseId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(\n [\n ConfigDBManager.STORE_NAMES.CASE_VERSIONS,\n ConfigDBManager.STORE_NAMES.TEMPLATES,\n ConfigDBManager.STORE_NAMES.LANES,\n ConfigDBManager.STORE_NAMES.LINES,\n ConfigDBManager.STORE_NAMES.PARAMS,\n ],\n \"readwrite\"\n );\n\n const tStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.TEMPLATES);\n const lStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.LANES);\n const lineStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.LINES);\n const cvStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.CASE_VERSIONS);\n const paramsStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.PARAMS);\n\n const bound = IDBKeyRange.bound([caseId], [caseId, ConfigDBManager.MAX_UNICODE_CHAR]);\n tStore.delete(bound);\n lStore.delete(bound);\n lineStore.delete(bound);\n paramsStore.delete(bound);\n cvStore.delete(caseId);\n\n transaction.oncomplete = () => resolve();\n transaction.onerror = (e) => reject(new Error(`事务失败:${e.target.error.message}`));\n });\n });\n }\n\n /**\n * 私有工具:将 IDBRequest 转为 Promise\n * @param {IDBRequest} request - IndexedDB 请求对象\n * @returns {Promise<any>}\n */\n _promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * 强制初始化场景配置\n * @param {string} caseId - 场景ID\n * @param {string|number} versionCode - 版本号\n * @param {Object} dataSource - 数据源 {templates, lanes, lines, params}\n * @returns {Promise<Object>} 写入后的完整配置\n */\n forceInitSceneConfig(caseId, versionCode, dataSource) {\n if (!caseId || !versionCode) {\n return Promise.reject(new Error(\"caseId和versionCode为强制初始化的必传参数\"));\n }\n return this._clearSceneData(caseId)\n .then(() => {\n const config = this.setUpData(caseId, versionCode, dataSource);\n return this.batchAddConfig(config);\n })\n .catch((err) => {\n throw new Error(`强制初始化场景配置失败:${err.message}`);\n });\n }\n\n /**\n * 组装配置数据(自动为子项添加caseId)\n * @param {string} caseId - 场景ID\n * @param {string|number} versionCode - 版本号\n * @param {Object} dataSource - 数据源\n * @returns {Object} 完整配置\n */\n setUpData(caseId, versionCode, dataSource) {\n const plain = toPlainData(dataSource);\n // 为所有子项添加caseId\n const templates = plain.templates.map((t) => ({ ...t, caseId }));\n const lanes = plain.lanes.map((l) => ({ ...l, caseId }));\n const lines = plain.lines.map((line) => ({ ...line, caseId }));\n const params = plain.params.map((p) => ({ ...p, caseId }));\n\n return {\n caseVersion: { caseId, versionCode, updateTime: new Date() },\n templates,\n lanes,\n lines,\n params,\n };\n }\n\n /**\n * 校验场景配置完整性\n * @param {string} caseId - 场景ID\n * @param {string|number} versionCode - 版本号\n * @returns {Promise<boolean>} true=异常,false=正常\n */\n checkConfigIntegrity(caseId, versionCode) {\n return this.getCaseVersionByCaseId(caseId).then((caseVersion) => {\n if (!caseVersion || caseVersion.versionCode !== versionCode) return false;\n return this.getTemplatesByCaseId(caseId).then((templates) => {\n if (templates.length === 0) return true;\n const randomTplId = templates[0].templateId;\n return this.getLanesByTemplateId(caseId, randomTplId).then((lanes) => {\n if (lanes.length === 0) return true;\n const randomLaneId = lanes[0].laneId;\n return this.getLinesByLaneId(caseId, randomLaneId).then((lines) => lines.length === 0);\n });\n });\n });\n }\n\n /**\n * 私有核心方法:初始化场景配置\n * @param {Object} config - 完整配置\n * @returns {Promise<Object>}\n */\n _initSceneConfig(config) {\n const { caseVersion } = config;\n const { caseId, versionCode } = caseVersion;\n\n return this.getCaseVersionByCaseId(caseId).then((oldCaseVersion) => {\n if (!oldCaseVersion) {\n return this.batchAddConfig(config);\n }\n\n const compareResult = this._compareVersion(versionCode, oldCaseVersion.versionCode);\n if (compareResult > 0) {\n return this._clearSceneData(caseId).then(() => this.batchAddConfig(config));\n } else if (compareResult === 0) {\n console.log(`场景${caseId}已存在版本${versionCode},无需重复创建`);\n return Promise.resolve(oldCaseVersion);\n } else {\n throw new Error(`场景${caseId}当前版本${oldCaseVersion.versionCode}高于待创建版本${versionCode}。`);\n }\n });\n }\n\n /**\n * 对外暴露的便捷入口方法\n * @param {string} caseId - 场景ID\n * @param {string|number} versionCode - 版本号\n * @param {Object} dataSource - 数据源\n * @returns {Promise<Object>} 初始化后的配置\n */\n saveSceneConfig(caseId, versionCode, dataSource) {\n if (!caseId || !versionCode) {\n return Promise.reject(new Error(\"caseId和versionCode为必传参数\"));\n }\n if (!Array.isArray(dataSource.templates) || !Array.isArray(dataSource.lanes) || !Array.isArray(dataSource.lines)) {\n return Promise.reject(new Error(\"templates/lanes/lines必须为数组\"));\n }\n\n const config = this.setUpData(caseId, versionCode, dataSource);\n return this._initSceneConfig(config);\n }\n\n /**\n * 批量添加配置(内部使用)\n * @param {Object} config - 完整配置\n * @returns {Promise<Object>}\n */\n batchAddConfig(config) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(\n [\n ConfigDBManager.STORE_NAMES.CASE_VERSIONS,\n ConfigDBManager.STORE_NAMES.TEMPLATES,\n ConfigDBManager.STORE_NAMES.LANES,\n ConfigDBManager.STORE_NAMES.LINES,\n ConfigDBManager.STORE_NAMES.PARAMS,\n ],\n \"readwrite\"\n );\n\n // 保存场景版本\n transaction.objectStore(ConfigDBManager.STORE_NAMES.CASE_VERSIONS).put(toPlainData(config.caseVersion));\n\n // 保存模板(已包含caseId)\n const tStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.TEMPLATES);\n config.templates.forEach((tpl) => tStore.put(toPlainData(tpl)));\n\n // 保存泳道(已包含caseId)\n const lStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.LANES);\n config.lanes.forEach((lane) => lStore.put(toPlainData(lane)));\n\n // 保存线条(已包含caseId)\n const lineStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.LINES);\n config.lines.forEach((line) => lineStore.put(toPlainData(line)));\n\n // 保存参数(已包含caseId)\n const pStore = transaction.objectStore(ConfigDBManager.STORE_NAMES.PARAMS);\n config.params.forEach((param) => pStore.put(toPlainData(param)));\n\n transaction.oncomplete = () => resolve(config);\n transaction.onerror = (e) => reject(new Error(`批量添加配置失败:${e.target.error.message}`));\n });\n });\n }\n\n // ====================== case_versions 操作 ======================\n /**\n * 新增/更新场景版本\n * @param {Object} caseVersion - { caseId, versionCode, updateTime: Date }\n * @returns {Promise<Object>}\n */\n upsertCaseVersion(caseVersion) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.CASE_VERSIONS], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.CASE_VERSIONS);\n\n const versionData = {\n updateTime: new Date(),\n ...caseVersion,\n };\n\n this._promisifyRequest(store.put(toPlainData(versionData)))\n .then(() => resolve(versionData))\n .catch((error) => reject(new Error(`更新场景版本失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId查询场景版本\n * @param {string} caseId - 场景ID\n * @returns {Promise<Object|null>}\n */\n getCaseVersionByCaseId(caseId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.CASE_VERSIONS], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.CASE_VERSIONS);\n\n this._promisifyRequest(store.get(caseId))\n .then((result) => resolve(result || null))\n .catch((error) => reject(new Error(`查询场景版本失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId查询完整配置信息(含模板、泳道、线条、参数)\n * @param {string} caseId - 场景ID\n * @returns {Promise<Object>} 完整配置对象 { caseVersion, templates: [{...tpl, lanes: [{...lane, lines: [...]}]}], params }\n */\n getConfigByCaseId(caseId) {\n if (!caseId) {\n return Promise.reject(new Error(\"caseId为必传参数\"));\n }\n\n // 并行查询基础数据(场景版本、模板、参数)\n return Promise.all([this.getCaseVersionByCaseId(caseId), this.getTemplatesByCaseId(caseId), this.getParamsByCaseId(caseId)])\n .then(([caseVersion, templates, params]) => {\n // 遍历模板,为每个模板查询关联的泳道及线条\n const templatePromises = templates.map((tpl) => {\n return this.getLanesByTemplateId(caseId, tpl.templateId).then((lanes) => {\n // 遍历泳道,为每个泳道查询关联的线条\n const lanePromises = lanes.map((lane) => {\n return this.getLinesByLaneId(caseId, lane.laneId).then((lines) => ({ ...lane, lines }));\n });\n return Promise.all(lanePromises).then((lanesWithLines) => ({\n ...tpl,\n lanes: lanesWithLines,\n }));\n });\n });\n\n return Promise.all(templatePromises).then((templatesWithLanes) => ({\n caseVersion,\n templates: templatesWithLanes,\n params,\n }));\n })\n .catch((err) => {\n throw new Error(`查询场景配置失败:${err.message}`);\n });\n }\n\n getConfigByTemplateId(caseId, templateId) {\n if (!caseId || !templateId) {\n return Promise.reject(new Error(\"caseId为必传参数\"));\n }\n const template = {};\n return this.getLanesByTemplateId(caseId, templateId)\n .then((lanes) => {\n const lineTasks = lanes.map((lane) => {\n return this.getLinesByLaneId(caseId, lane.laneId);\n });\n\n return Promise.all(lineTasks).then((linesArray) => {\n linesArray.forEach((lines, index) => {\n lanes[index].lines = lines;\n });\n template.lanes = lanes;\n });\n })\n .then(() => {\n return this.getTemplateById(caseId, templateId);\n })\n .then((result) => {\n result.lanes = template.lanes;\n return Promise.resolve(result);\n });\n }\n\n /**\n * 删除场景版本\n * @param {string} caseId - 场景ID\n * @returns {Promise<void>}\n */\n deleteCaseVersion(caseId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.CASE_VERSIONS], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.CASE_VERSIONS);\n\n this._promisifyRequest(store.delete(caseId))\n .then(() => resolve())\n .catch((error) => reject(new Error(`删除场景版本失败:${error.message}`)));\n });\n });\n }\n\n // ====================== templates 操作 ======================\n /**\n * 新增/更新模板(自动携带caseId)\n * @param {Object} template - 模板数据(含caseId、templateId等)\n * @returns {Promise<Object>}\n */\n upsertTemplate(template) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n if (!template.caseId) {\n reject(new Error(\"模板数据必须包含caseId\"));\n return;\n }\n\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.TEMPLATES], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.TEMPLATES);\n const templateData = {\n ...template,\n createDate: template.createDate ? new Date(template.createDate) : new Date(),\n updateDate: template.updateDate ? new Date(template.updateDate) : null,\n };\n delete templateData.lanes;\n return this._promisifyRequest(store.put(toPlainData(templateData)))\n .then(() => resolve(templateData))\n .catch((error) => reject(new Error(`更新模板失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId和templateId查询模板\n * @param {string} caseId - 场景ID\n * @param {string} templateId - 模板ID\n * @returns {Promise<Object|null>}\n */\n getTemplateById(caseId, templateId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.TEMPLATES], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.TEMPLATES);\n\n this._promisifyRequest(store.get([caseId, templateId]))\n .then((result) => resolve(result || null))\n .catch((error) => reject(new Error(`查询模板失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId查询所有模板\n * @param {string} caseId - 场景ID\n * @returns {Promise<Array>} 模板列表\n */\n getTemplatesByCaseId(caseId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.TEMPLATES], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.TEMPLATES);\n // 通过复合主键前缀查询(caseId匹配)\n const range = IDBKeyRange.bound([caseId], [caseId, ConfigDBManager.MAX_UNICODE_CHAR]);\n this._promisifyRequest(store.getAll(range))\n .then((result) => {\n resolve(result || []);\n })\n .catch((error) => reject(new Error(`查询场景下模板失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 删除模板\n * @param {string} caseId - 场景ID\n * @param {string} templateId - 模板ID\n * @returns {Promise<void>}\n */\n deleteTemplate(caseId, templateId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.TEMPLATES], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.TEMPLATES);\n\n this._promisifyRequest(store.delete([caseId, templateId]))\n .then(() => resolve())\n .catch((error) => reject(new Error(`删除模板失败:${error.message}`)));\n });\n });\n }\n\n // ====================== lanes 操作 ======================\n /**\n * 新增/更新泳道(自动携带caseId)\n * @param {Object} lane - 泳道数据(含caseId、laneId、templateId等)\n * @returns {Promise<Object>}\n */\n upsertLane(caseId, lane) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n if (!caseId || !lane.templateId) {\n reject(new Error(\"泳道数据必须包含caseId和templateId\"));\n return;\n }\n\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LANES], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LANES);\n\n const laneData = {\n ...lane,\n caseId: caseId,\n updateDate: lane.updateDate ? new Date(lane.updateDate) : new Date(),\n };\n\n this._promisifyRequest(store.put(toPlainData(laneData)))\n .then(() => resolve(laneData))\n .catch((error) => reject(new Error(`更新泳道失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId和laneId查询泳道\n * @param {string} caseId - 场景ID\n * @param {string} laneId - 泳道ID\n * @returns {Promise<Object|null>}\n */\n getLaneById(caseId, laneId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LANES], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LANES);\n\n this._promisifyRequest(store.get([caseId, laneId]))\n .then((result) => resolve(result || null))\n .catch((error) => reject(new Error(`查询泳道失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId和templateId查询泳道\n * @param {string} caseId - 场景ID\n * @param {string} templateId - 模板ID\n * @returns {Promise<Array>} 泳道列表\n */\n getLanesByTemplateId(caseId, templateId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LANES], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LANES);\n // 原索引查询修改为:查询该场景下所有泳道后过滤templateId\n const range = IDBKeyRange.bound([caseId], [caseId, ConfigDBManager.MAX_UNICODE_CHAR]);\n\n this._promisifyRequest(store.getAll(range))\n .then((lanes) => lanes.filter((lane) => lane.templateId === templateId))\n .then((result) => resolve(result || []))\n .catch((error) => reject(new Error(`查询模板下泳道失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 删除泳道\n * @param {string} caseId - 场景ID\n * @param {Array} laneIds - 泳道ID数组\n * @returns {Promise<void>}\n */\n deleteLaneByLaneIds(caseId, laneIds) {\n if (!Array.isArray(laneIds) || laneIds.length === 0) {\n return Promise.resolve();\n }\n\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LANES], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LANES);\n\n laneIds.map((laneId) => this._promisifyRequest(store.delete([caseId, laneId])));\n\n transaction.oncomplete = () => resolve();\n transaction.onerror = (e) => reject(new Error(`删除泳道失败:${e.target.error.message}`));\n });\n });\n }\n\n // ====================== lines 操作 ======================\n /**\n * 新增/更新线条(自动携带caseId)\n * @param {Object} line - 线条数据(含caseId、lineId、laneId等)\n * @returns {Promise<Object>}\n */\n upsertLine(caseId, line) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n if (!caseId || !line.laneId) {\n reject(new Error(\"线条数据必须包含caseId和laneId\"));\n return;\n }\n\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LINES], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LINES);\n\n const lineData = {\n ...line,\n caseId: caseId,\n updateDate: line.updateDate ? new Date(line.updateDate) : new Date(),\n };\n\n this._promisifyRequest(store.put(toPlainData(lineData)))\n .then(() => resolve(lineData))\n .catch((error) => reject(new Error(`更新线条失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId和lineId查询线条\n * @param {string} caseId - 场景ID\n * @param {string} lineId - 线条ID\n * @returns {Promise<Object|null>}\n */\n getLineById(caseId, lineId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LINES], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LINES);\n\n this._promisifyRequest(store.get([caseId, lineId]))\n .then((result) => resolve(result || null))\n .catch((error) => reject(new Error(`查询线条失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId和laneId查询线条\n * @param {string} caseId - 场景ID\n * @param {string} laneId - 泳道ID\n * @returns {Promise<Array>} 线条列表\n */\n getLinesByLaneId(caseId, laneId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LINES], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LINES);\n // 原索引查询修改为:查询该场景下所有线条后过滤laneId\n const range = IDBKeyRange.bound([caseId], [caseId, ConfigDBManager.MAX_UNICODE_CHAR]);\n\n this._promisifyRequest(store.getAll(range))\n .then((lines) => lines.filter((line) => line.laneId === laneId))\n .then((result) => resolve(result || []))\n .catch((error) => reject(new Error(`查询泳道下线条失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 删除线条\n * @param {string} caseId - 场景ID\n * @param {Array} lineIds - 线条ID数组\n * @returns {Promise<void>}\n */\n deleteLineByIds(caseId, lineIds) {\n // 边界处理:空数组直接resolve,避免无意义的事务操作\n if (!Array.isArray(lineIds) || lineIds.length === 0) {\n return Promise.resolve();\n }\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.LINES], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.LINES);\n\n // 批量执行delete,复用同一个事务\n lineIds.map((lineId) => this._promisifyRequest(store.delete([caseId, lineId])));\n // 监听事务完成/错误\n transaction.oncomplete = () => resolve();\n transaction.onerror = (e) => reject(new Error(`批量删除线条失败:${e.target.error.message}`));\n });\n });\n }\n\n // ====================== params 操作 ======================\n /**\n * 新增/更新参数(自动携带caseId)\n * @param {Object} param - 参数数据(含caseId、paramId等)\n * @returns {Promise<Object>}\n */\n upsertParam(param) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n if (!param.caseId) {\n reject(new Error(\"参数数据必须包含caseId\"));\n return;\n }\n\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.PARAMS], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.PARAMS);\n\n const paramData = {\n ...param,\n updateDate: param.updateDate ? new Date(param.updateDate) : new Date(),\n };\n\n this._promisifyRequest(store.put(toPlainData(paramData)))\n .then(() => resolve(paramData))\n .catch((error) => reject(new Error(`更新参数失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId和paramId查询参数\n * @param {string} caseId - 场景ID\n * @param {string} paramId - 参数ID\n * @returns {Promise<Object|null>}\n */\n getParamById(caseId, paramId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.PARAMS], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.PARAMS);\n\n this._promisifyRequest(store.get([caseId, paramId]))\n .then((result) => resolve(result || null))\n .catch((error) => reject(new Error(`查询参数失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 根据caseId查询所有参数\n * @param {string} caseId - 场景ID\n * @returns {Promise<Array>} 参数列表\n */\n getParamsByCaseId(caseId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.PARAMS], \"readonly\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.PARAMS);\n // 通过复合主键前缀查询\n const range = IDBKeyRange.bound([caseId], [caseId, ConfigDBManager.MAX_UNICODE_CHAR]);\n\n this._promisifyRequest(store.getAll(range))\n .then((result) => resolve(result || []))\n .catch((error) => reject(new Error(`查询场景下参数失败:${error.message}`)));\n });\n });\n }\n\n /**\n * 删除参数\n * @param {string} caseId - 场景ID\n * @param {string} paramId - 参数ID\n * @returns {Promise<void>}\n */\n deleteParamById(caseId, paramId) {\n return this._openDB().then((db) => {\n return new Promise((resolve, reject) => {\n const transaction = db.transaction([ConfigDBManager.STORE_NAMES.PARAMS], \"readwrite\");\n const store = transaction.objectStore(ConfigDBManager.STORE_NAMES.PARAMS);\n\n this._promisifyRequest(store.delete([caseId, paramId]))\n .then(() => resolve())\n .catch((error) => reject(new Error(`删除参数失败:${error.message}`)));\n });\n });\n }\n}\nexport const dbHelper = new ConfigDBManager();\n","import { cloneDeep } from \"lodash-es\";\nimport { flattenToTree, generateUUID } from \"../../util/index.js\";\nimport { dbHelper } from \"../store/db-manager.js\";\n\nexport class DefaultLocalStrategy {\n constructor(caseId, versionCode, dataSource, flatData = true) {\n this.caseId = caseId;\n this.versionCode = versionCode;\n this.dataSource = cloneDeep(dataSource);\n this.flatData = flatData;\n this.useMemoryOnly = false;\n this.memoryTemplates = [];\n this.memoryParams = [];\n\n this.ready = dbHelper\n .saveSceneConfig(caseId, versionCode, this.dataSource)\n .catch((e) => {\n console.warn(`初始化数据库出错,直接重置:${e.message}`);\n return dbHelper.forceInitSceneConfig(caseId, versionCode, this.dataSource);\n })\n .catch((e) => {\n console.warn(`IndexedDB 不可用,使用内存配置:${e.message}`);\n this.useMemoryOnly = true;\n this.initMemoryConfig();\n });\n }\n\n initMemoryConfig() {\n const { templates = [], lanes = [], lines = [], params = [] } = this.dataSource;\n this.memoryTemplates = flattenToTree(cloneDeep(templates), cloneDeep(lanes), cloneDeep(lines));\n this.memoryParams = cloneDeep(params);\n }\n\n /**\n * 加载配置\n * @returns {Promise<Object>} - 返回配置对象,包含所有模板、泳道和线条数据\n */\n getUserTemplates() {\n return this.ready.then(() => {\n if (this.useMemoryOnly) {\n return {\n templates: cloneDeep(this.memoryTemplates),\n params: cloneDeep(this.memoryParams),\n };\n }\n return dbHelper.getConfigByCaseId(this.caseId);\n });\n }\n\n /**\n * 新增或更新模板\n */\n upsertTemplate(template) {\n if (this.useMemoryOnly) {\n return Promise.resolve(cloneDeep(template));\n }\n\n let p;\n if (!template.templateId) {\n const newTemplateId = generateUUID();\n template.templateId = newTemplateId;\n if (template.baseTemplate) {\n const dataSource = {};\n p = dbHelper\n .getLanesByTemplateId(this.caseId, template.baseTemplate)\n .then((lanes) => {\n dataSource.lanes = lanes;\n\n const lineTasks = lanes.map((lane) => {\n return dbHelper.getLinesByLaneId(this.caseId, lane.laneId);\n });\n return Promise.all(lineTasks).then((results) => {\n const allLines = [];\n const linesByLane = results;\n linesByLane.forEach((lines, index) => {\n const newLaneId = generateUUID();\n dataSource.lanes[index].laneId = newLaneId;\n dataSource.lanes[index].templateId = newTemplateId;\n dataSource.lanes[index].createUser = undefined;\n lines.forEach((line) => {\n line.lineId = generateUUID();\n line.laneId = newLaneId;\n line.createUser = undefined;\n allLines.push(line);\n });\n });\n dataSource.lines = allLines;\n });\n })\n .then(() => {\n dataSource.templates = [template];\n })\n .then(() => {\n dataSource.params = [];\n const config = dbHelper.setUpData(this.caseId, this.versionCode, dataSource);\n return dbHelper.batchAddConfig(config);\n })\n .then(() => {\n return dbHelper.getTemplateById(this.caseId, newTemplateId);\n });\n } else {\n p = dbHelper.upsertTemplate(template);\n }\n } else {\n p = dbHelper.upsertTemplate(template);\n }\n\n if (template.isPublic === \"1\") {\n return p.then(() => {\n return dbHelper\n .getTemplatesByCaseId(this.caseId)\n .then((templates) => {\n return templates.filter((t) => {\n return t.templateId !== template.templateId;\n });\n })\n .then((allT) => {\n allT.forEach((t) => {\n t.isPublic = \"0\";\n });\n const PArray = allT.map((t) => {\n return dbHelper.upsertTemplate(t);\n });\n return Promise.all(PArray);\n })\n .then(() => {\n return dbHelper.getConfigByTemplateId(this.caseId, template.templateId);\n });\n });\n } else {\n return p;\n }\n }\n\n deleteTemplate(data) {\n if (this.useMemoryOnly) {\n return Promise.resolve(data);\n }\n return dbHelper\n .getLanesByTemplateId(this.caseId, data.templateId)\n .then((lanes) => {\n const allLaneIds = lanes.map((lane) => lane.laneId);\n\n const linesP = allLaneIds.map((laneId) => {\n return dbHelper.getLinesByLaneId(this.caseId, laneId);\n });\n\n return Promise.all(linesP)\n .then((results) => {\n const allLineIds = results\n .reduce((previousValue, currentValue) => {\n return previousValue.concat(currentValue);\n }, [])\n .map((line) => line.lineId);\n return dbHelper.deleteLineByIds(this.caseId, allLineIds);\n })\n .then(() => {\n return Promise.resolve(allLaneIds);\n });\n })\n .then((allLaneIds) => {\n return dbHelper.deleteLaneByLaneIds(this.caseId, allLaneIds);\n })\n .then(() => {\n return dbHelper.deleteTemplate(this.caseId, data.templateId);\n })\n .then(() => {\n return Promise.resolve(data);\n });\n }\n\n upsertLane(lane) {\n if (!lane.laneId) {\n lane.laneId = generateUUID();\n }\n if (!lane.lines) {\n lane.lines = [];\n }\n if (this.useMemoryOnly) {\n return Promise.resolve(cloneDeep(lane));\n }\n return dbHelper.upsertLane(this.caseId, lane);\n }\n\n delLane(lane) {\n if (this.useMemoryOnly) {\n return Promise.resolve(lane);\n }\n const { lines, laneId } = lane;\n const allLineIds = lines.map((line) => line.lineId);\n return dbHelper\n .deleteLineByIds(this.caseId, allLineIds)\n .then(() => {\n return dbHelper.deleteLaneByLaneIds(this.caseId, [laneId]);\n })\n .then(() => {\n return Promise.resolve(lane);\n });\n }\n\n upsertLine(line) {\n if (!line.lineId) {\n line.lineId = generateUUID();\n }\n if (!line.laneId) {\n return Promise.reject(new Error(\"更新线条数据的时候,必须laneId不能为空!\"));\n }\n if (this.useMemoryOnly) {\n return Promise.resolve(cloneDeep(line));\n }\n return dbHelper.upsertLine(this.caseId, line);\n }\n\n delLine(line) {\n if (!line.laneId) {\n return Promise.reject(new Error(\"更新线条数据的时候,必须laneId不能为空!\"));\n }\n if (this.useMemoryOnly) {\n return Promise.resolve(line);\n }\n return dbHelper.deleteLineByIds(this.caseId, [line.lineId]);\n }\n\n restoreSetting() {\n if (this.useMemoryOnly) {\n this.initMemoryConfig();\n return Promise.resolve();\n }\n return dbHelper.forceInitSceneConfig(this.caseId, this.versionCode, this.dataSource);\n }\n\n getType() {\n return this.useMemoryOnly ? \"local-memory\" : \"local-default\";\n }\n}\n","import { isFlatStructure, isTreeStructure, treeToFlatten } from \"../../util/index.js\";\nimport { CustomStrategy } from \"./CustomStrategy.js\";\nimport { DefaultLocalStrategy } from \"./DefaultLocalStrategy.js\";\n\nexport class StrategyFactory {\n static createStrategy(strategy) {\n // 本地策略默认实现\n if (strategy.type === \"local\") {\n let option;\n if (isFlatStructure(strategy.dataSource)) {\n option = { ...strategy };\n } else if (isTreeStructure(strategy.dataSource)) {\n const flatedData = treeToFlatten(strategy.dataSource.templates);\n option = { ...strategy, dataSource: { ...flatedData, params: strategy.dataSource.params } };\n } else {\n throw new Error(\"策略数据源格式不匹配\");\n }\n const { caseId, versionCode, dataSource } = option;\n return new DefaultLocalStrategy(caseId, versionCode, dataSource, false);\n } else {\n return new CustomStrategy(strategy);\n }\n }\n}\n","<template>\n <div class=\"kd-lane-lane-content\">\n <el-form :rules=\"rules\" ref=\"template\" :model=\"formData\" label-width=\"120px\">\n <el-form-item label=\"泳道顺序\" prop=\"sort\">\n <el-input v-model=\"formData.sort\" :disabled=\"formDisable\"></el-input>\n </el-form-item>\n <el-form-item label=\"对数轴\" prop=\"isLogScale\" v-if=\"formData.createUser !== 'SYSTEM_USER'\">\n <el-radio-group v-model=\"formData.isLogScale\" :disabled=\"formDisable\" style=\"margin-left: 40px;height: 32px; display: flex; align-items: center; line-height: 40px;\">\n <el-radio value=\"1\">是</el-radio>\n <el-radio value=\"0\">否</el-radio>\n </el-radio-group>\n </el-form-item>\n </el-form>\n <div class=\"template-buttons\">\n <el-button @click=\"editable\">编辑</el-button>\n <el-button type=\"primary\" :disabled=\"formDisable\" @click=\"submitForm('template')\" :loading=\"saving\">保存</el-button>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n inject: [\"upsertLane\", \"setTargetData\", \"setExpanded\"],\n props: {\n laneInfo: {\n type: Object,\n },\n caseId: {\n type: String,\n default: \"\",\n },\n formDisable: {\n type: Boolean,\n },\n },\n data() {\n return {\n formData: Object.assign(this.laneInfo),\n rules: {\n sort: [{ required: true, message: \"请输入泳道顺序\", trigger: \"blur\" }],\n },\n saving: false,\n };\n },\n methods: {\n editable() {\n this.$emit(\"editable\");\n },\n submitForm(formName) {\n this.$refs[formName].validate((valid) => {\n if (!valid) {\n return;\n }\n if (typeof this.upsertLane !== \"function\") {\n this.$message({ type: \"error\", message: \"没有配置泳道管理方法\" });\n return;\n }\n this.saving = true;\n const payload = { ...this.formData };\n if (!payload.caseId) {\n payload.caseId = this.caseId;\n }\n const result = this.upsertLane(payload);\n if (result instanceof Promise) {\n result\n .then((res) => {\n this.setTargetData(res);\n })\n .then(() => {\n this.$message({\n type: \"success\",\n message: \"保存成功\",\n });\n })\n .finally(() => {\n this.saving = false;\n });\n } else {\n this.saving = false;\n }\n });\n },\n },\n computed: {},\n watch: {\n laneInfo: {\n deep: true,\n handler: function (newV) {\n this.formData = Object.assign({}, newV);\n },\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.kd-lane-lane-content {\n display: flex;\n flex-direction: column;\n align-content: center;\n .template-buttons {\n text-align: center;\n }\n .el-form-item__content{\n align-items: center;\n display: flex;\n }\n}\n</style>\n","<template>\n <div class=\"kd-lane-line-content\" >\n <el-form :rules=\"rules\" ref=\"template\" :model=\"formData\" :disabled=\"formDisable\">\n <el-form-item label=\"参数名称\" prop=\"paramId\" label-width=\"120px\">\n <el-select v-model=\"formData.paramId\" filterable placeholder=\"请选择\" popper-class=\"kd-curve-2d-select-popup\">\n <el-option v-for=\"item in params\" :key=\"item.paramId\" :label=\"item.paramName\" :value=\"item.paramId\"> </el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"最小值\" prop=\"min\" label-width=\"120px\">\n <el-input v-model=\"formData.min\"></el-input>\n </el-form-item>\n <el-form-item label=\"最大值\" prop=\"max\" label-width=\"120px\">\n <el-input v-model=\"formData.max\"></el-input>\n </el-form-item>\n <el-form-item label=\"曲线粗细\" prop=\"lineSize\" label-width=\"120px\">\n <el-input v-model=\"formData.lineSize\" :max=\"4\" :min=\"1\" type=\"number\"></el-input>\n </el-form-item>\n <el-form-item label=\"曲线颜色\" prop=\"lineColor\" label-width=\"120px\">\n <el-color-picker v-model=\"formData.lineColor\" :disabled=\"formData.isGradient\" class=\"kd-color-picker-wrapper\" popper-class=\"kd-color-picker\"></el-color-picker>\n </el-form-item>\n <el-form-item label=\"线型\" prop=\"lineType\" label-width=\"120px\">\n <el-select v-model=\"formData.lineType\" placeholder=\"请选择\" :disabled=\"formData.isGradient\" popper-class=\"kd-curve-2d-select-popup\">\n <el-option v-for=\"item in lines\" :key=\"item.value\" :label=\"item.name\" :value=\"item.value\"> </el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"曲线顺序\" prop=\"lineSort\" label-width=\"120px\">\n <el-input v-model.number=\"formData.lineSort\"></el-input>\n </el-form-item>\n <el-form-item v-if=\"false\" label=\"是否启用\" prop=\"isUsed\" label-width=\"120px\">\n <el-radio-group v-model=\"formData.isUsed\">\n <el-radio value=\"1\">是</el-radio>\n <el-radio value=\"0\">否</el-radio>\n </el-radio-group>\n </el-form-item>\n </el-form>\n <div class=\"template-buttons\" v-show=\"template.createUser != 'SYSTEM_USER'\">\n <el-button @click=\"editable\">编辑</el-button>\n <el-button type=\"primary\" :disabled=\"formDisable\" @click=\"submitForm('template')\">保存</el-button>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n inject: [\"upsertLine\", \"setTargetData\", \"setExpanded\", \"getThemeName\"],\n props: {\n template: {\n type: Object,\n },\n formDisable: {\n type: Boolean,\n },\n params: {\n type: Array,\n },\n },\n mounted() {},\n data() {\n const validatorNumber = (rule, value, callback) => {\n if (isNaN(value)) {\n callback(new Error(\"请输入数字值\"));\n } else {\n callback();\n }\n };\n return {\n formData: Object.assign({}, this.template),\n lines: [\n {\n name: \"直线\",\n value: \"solid\",\n },\n {\n name: \"虚线\",\n value: \"dashed\",\n },\n {\n name: \"点线\",\n value: \"dotted\",\n },\n {\n name: \"面积\",\n value: \"area\",\n },\n ],\n lineWidthSliderMarks: {\n 1: \"1\",\n 2: \"2\",\n 3: \"3\",\n 4: \"4\",\n },\n rules: {\n min: [\n { required: true, message: \"请输入最小值\", trigger: \"blur\" },\n { validator: validatorNumber, trigger: \"blur\" },\n ],\n lineSort: [\n {\n required: true,\n message: \"请输入曲线顺序(1-10)\",\n trigger: \"blur\",\n },\n { type: \"number\", message: \"顺序必须为数字值\" },\n ],\n max: [\n { required: true, message: \"请输入最大值\", trigger: \"blur\" },\n { validator: validatorNumber, trigger: \"blur\" },\n ],\n lineSize: [{ required: true, message: \"请选择曲线粗细\", trigger: \"blur\" }],\n lineColor: [{ required: true, message: \"请选择曲线颜色\", trigger: \"blur\" }],\n lineType: [{ required: true, message: \"请选择线型\", trigger: \"blur\" }],\n paramId: [{ required: true, message: \"请选择参数名称\", trigger: \"blur\" }],\n },\n };\n },\n methods: {\n editable() {\n this.$emit(\"editable\");\n },\n submitForm(formName) {\n this.$refs[formName]\n .validate()\n .then(() => {\n if (this.upsertLine instanceof Function) {\n // 检查是否有主题配置\n const themeName = this.getThemeName();\n const themeConfig = this.formData.themeConfig;\n if (themeName && themeConfig && themeConfig[themeName]) {\n const theme = themeConfig[themeName];\n theme.lineColor = this.formData.lineColor;\n }\n this.saving = true;\n const result = this.upsertLine(this.formData);\n if (result instanceof Promise) {\n result\n .then((res) => {\n this.setTargetData(res);\n })\n .then(() => {\n this.$message({\n type: \"success\",\n message: \"保存成功\",\n });\n })\n .finally(() => {\n this.saving = false;\n });\n } else {\n this.saving = false;\n }\n } else {\n return Promise.reject(new Error(\"未配置线条设置函数\"));\n }\n })\n .catch((e) => {\n console.log(e);\n });\n },\n },\n watch: {\n template: {\n immediate: true,\n deep: true,\n handler(newD) {\n // 检查是否有主题配置\n const themeName = this.getThemeName();\n const themeConfig = newD.themeConfig;\n let themeLineColor;\n if (themeName && themeConfig && themeConfig[themeName]) {\n const theme = themeConfig[themeName];\n const lineColor = theme.lineColor;\n if (lineColor) {\n themeLineColor = lineColor;\n }\n }\n console.log(themeLineColor,'2222222222222');\n if (themeLineColor) {\n this.formData = Object.assign({}, newD, { lineColor: themeLineColor });\n } else {\n this.formData = Object.assign({}, newD);\n }\n },\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.kd-lane-line-content {\n width: 95%;\n display: flex;\n flex-direction: column;\n align-content: center;\n .template-buttons {\n text-align: center;\n }\n}\n</style>\n","<template>\n <div class=\"kd-lane-template-content\">\n <el-form :rules=\"rules\" ref=\"template\" :model=\"formData\" label-width=\"120px\">\n <el-form-item label=\"模板名称\" prop=\"templateName\">\n <el-input v-model=\"formData.templateName\" :disabled=\"currentTemplate.createUser == 'SYSTEM_USER' || formDisable\"></el-input>\n </el-form-item>\n <el-form-item label=\"默认模板\" prop=\"isPublic\">\n <el-radio-group v-model=\"formData.isPublic\" :disabled=\"formDisable\" style=\"margin-left: 40px;height: 40px; display: flex; align-items: center; line-height: 40px;\">\n <el-radio value=\"1\">是</el-radio>\n <el-radio value=\"0\">否</el-radio>\n </el-radio-group>\n </el-form-item>\n <el-form-item label=\"曲线高度占比\" prop=\"col1\">\n <el-select v-model=\"formData.col1\" :disabled=\"formDisable\" popper-class=\"kd-curve-2d-select-popup\">\n <el-option value=\"0.5\" label=\"50%\"></el-option>\n <el-option value=\"0.6\" label=\"60%\"></el-option>\n <el-option value=\"0.7\" label=\"70%\"></el-option>\n <el-option value=\"0.8\" label=\"80%\"></el-option>\n <el-option value=\"0.9\" label=\"90%\"></el-option>\n <el-option value=\"1\" label=\"全屏\"></el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"选择基础模板\" prop=\"lineType\" v-show=\"!currentTemplate.templateId\" :disabled=\"formDisable\">\n <el-select v-model=\"formData.baseTemplate\" placeholder=\"请选择\" popper-class=\"kd-curve-2d-select-popup\">\n <el-option v-for=\"item in baseTemplate\" :key=\"item.value\" :label=\"item.name\" :value=\"item.value\"> </el-option>\n </el-select>\n </el-form-item>\n <el-form-item label=\"顺序\" prop=\"sort\" label-width=\"120px\">\n <el-input v-model.number=\"formData.sort\" :disabled=\"formDisable\"></el-input>\n </el-form-item>\n </el-form>\n <div class=\"template-buttons\">\n <el-button @click=\"editable\">编辑</el-button>\n <el-button type=\"primary\" :disabled=\"formDisable\" @click=\"submitForm('template')\" :loading=\"saving\">保存</el-button>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n inject: [\"upsertTemplate\", \"setTargetData\", \"setExpanded\"],\n props: {\n currentTemplate: {\n type: Object,\n },\n formDisable: {\n type: Boolean,\n },\n userTemplate: {\n type: Array,\n },\n caseId: {\n type: String,\n default: \"\",\n },\n },\n data() {\n return {\n formData: Object.assign({ sort: undefined }, this.currentTemplate),\n rules: {\n templateName: [{ required: true, message: \"请输入模板名称\", trigger: \"blur\" }],\n },\n saving: false,\n };\n },\n methods: {\n editable() {\n this.$emit(\"editable\");\n },\n submitForm(formName) {\n this.$refs[formName].validate((valid) => {\n if (!valid) {\n return;\n }\n if (typeof this.upsertTemplate !== \"function\") {\n this.$message({ type: \"error\", message: \"没有配置模板管理方法\" });\n return;\n }\n this.saving = true;\n const payload = { ...this.formData };\n if (!payload.caseId) {\n payload.caseId = this.caseId;\n }\n const result = this.upsertTemplate(payload);\n if (result instanceof Promise) {\n result\n .then((res) => {\n this.setTargetData(res);\n })\n .then(() => {\n this.$message({\n type: \"success\",\n message: \"保存成功\",\n });\n })\n .finally(() => {\n this.saving = false;\n });\n } else {\n this.saving = false;\n }\n });\n },\n },\n computed: {\n baseTemplate() {\n if (!this.userTemplate) {\n return [{ name: \"空白模板\", value: \"\" }];\n } else {\n return [\n { name: \"空白模板\", value: \"\" },\n ...this.userTemplate.map((item) => {\n return {\n name: item.templateName,\n value: item.templateId,\n };\n }),\n ];\n }\n },\n },\n watch: {\n currentTemplate: {\n deep: true,\n handler: function (newV) {\n this.formData = Object.assign({}, newV);\n },\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.kd-lane-template-content {\n display: flex;\n flex-direction: column;\n align-content: center;\n .template-buttons {\n text-align: center;\n }\n}\n</style>\n","<template>\n <el-container ref=\"containerRef\" class=\"kd-lane-el-container\" v-loading=\"curveConfigLoading\">\n <!-- 左边栏 -->\n <el-aside width=\"20%\" class=\"rtd-config-side\">\n <el-tree\n :key=\"treeKey\"\n ref=\"refTree\"\n :data=\"treeData\"\n class=\"rtd-config-side-tree\"\n :expand-on-click-node=\"false\"\n :current-node-key=\"currentNodeKey\"\n :default-expanded-keys=\"expandedKeys\"\n node-key=\"id\"\n highlight-current\n @node-click=\"handleNodeClick\"\n @node-expand=\"hideContextMenu\"\n @node-collapse=\"hideContextMenu\"\n >\n <template #default=\"{ node, data }\">\n <span class=\"custom-tree-node\" @contextmenu.prevent=\"showRightWindows($event, data, node)\">\n <span>{{ node.label }}</span>\n <span style=\"padding-left: 5px\" v-show=\"data.isPublic == '1'\">\n <el-icon><Star /></el-icon>\n </span>\n </span>\n </template>\n </el-tree>\n <div class=\"rtd-config-side-option\">\n <el-button @click=\"addTemplate\">新增模板</el-button>\n </div>\n </el-aside>\n\n <!-- 编辑区域 -->\n <el-main class=\"rtd-config-main\">\n <!-- 模板配置 -->\n <TemplateEdit\n v-show=\"templateContentShow\"\n :currentTemplate=\"templateInfo\"\n :form-disable=\"templateDisable\"\n :userTemplate=\"userTemplate\"\n :caseId=\"caseId\"\n @editable=\"editable\"\n v-bind=\"$attrs\"\n >\n </TemplateEdit>\n <!-- 泳道配置 -->\n <LaneEdit\n v-show=\"laneContentShow\"\n :laneInfo=\"laneInfo\"\n :form-disable=\"templateDisable\"\n @editable=\"editable\"\n v-bind=\"$attrs\"\n ></LaneEdit>\n\n <!-- 曲线配置 -->\n <LineEdit\n v-show=\"lineContentShow\"\n :template=\"lineInfo\"\n :params=\"params\"\n :form-disable=\"templateDisable\"\n @editable=\"editable\"\n v-bind=\"$attrs\"\n ></LineEdit>\n </el-main>\n <VueSimpleContextMenu :options=\"contextMenuOptions\" :positionInfo=\"positionInfo\" ref=\"vueSimpleContextMenu\" @option-clicked=\"optionClicked\" />\n </el-container>\n</template>\n\n<script>\nimport { Star } from \"@element-plus/icons-vue\";\nimport { judgeRawDataType } from \"../../../util/index.js\";\nimport VueSimpleContextMenu from \"../../context-menu/index.vue\";\nimport LaneEdit from \"./LaneEdit.vue\";\nimport LineEdit from \"./LineEdit.vue\";\nimport TemplateEdit from \"./TemplateEdit.vue\";\n\nexport default {\n inject: [\"delTemplate\", \"delLane\", \"delLine\"],\n provide() {\n return {\n setTargetData: this.setTargetData,\n setExpanded: this.setExpanded,\n };\n },\n components: { LineEdit, TemplateEdit, LaneEdit, VueSimpleContextMenu, Star },\n props: {\n contextItem: {\n type: Object,\n default: () => undefined,\n },\n expended: {\n type: Object,\n },\n caseId: {\n type: String,\n default: \"\",\n },\n inputTempates: {\n type: Array,\n default: () => {\n return [];\n },\n },\n params: {\n type: Array,\n required: true,\n default: () => [],\n },\n paramsNameMap: {\n type: Object,\n default: () => {},\n required: true,\n },\n positionInfo: {\n type: Object,\n default: () => ({\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n }),\n },\n },\n data() {\n return {\n templateContentShow: false,\n templateDisable: false,\n laneContentShow: false,\n lineContentShow: false,\n templateInfo: {},\n laneInfo: {},\n lineInfo: {},\n dataType: \"\",\n curveConfigLoading: false,\n expandedKeys: [],\n currentNodeKey: \"\",\n targetData: undefined,\n treeKey: \"\",\n };\n },\n methods: {\n getLineDataLabel(line) {\n if (!line) {\n return \"\";\n }\n const nameConfig = this.paramsNameMap[line.paramId];\n if (!nameConfig) {\n return line.paramId;\n }\n return nameConfig.paramName;\n },\n setTargetData(targetData) {\n this.targetData = targetData;\n console.log(targetData,'333333333');\n this.setExpanded();\n const dataType = judgeRawDataType(targetData);\n switch (dataType) {\n case \"template\":\n // 显示模板录入信息\n this.templateContentShow = true;\n this.laneContentShow = false;\n this.lineContentShow = false;\n this.templateDisable = true;\n this.templateInfo = targetData;\n break;\n case \"lane\":\n this.templateContentShow = false;\n this.laneContentShow = true;\n this.lineContentShow = false;\n this.templateDisable = true;\n this.laneInfo = targetData;\n break;\n case \"line\":\n // 显示模板录入信息\n this.templateContentShow = false;\n this.laneContentShow = false;\n this.lineContentShow = true;\n this.templateDisable = true;\n this.lineInfo = targetData;\n break;\n }\n },\n setExpanded() {\n const val = this.targetData;\n if (val) {\n const type = judgeRawDataType(val);\n switch (type) {\n case \"template\":\n this.expandedKeys = [val.templateId];\n this.currentNodeKey = val.templateId;\n break;\n case \"lane\":\n this.expandedKeys = [val.laneId];\n this.currentNodeKey = val.laneId;\n break;\n case \"line\":\n this.expandedKeys = [val.lineId];\n this.currentNodeKey = val.lineId;\n break;\n default:\n this.expandedKeys = [];\n this.currentNodeKey = \"\";\n break;\n }\n } else {\n this.expandedKeys = [];\n this.currentNodeKey = \"\";\n }\n if (this.$refs.refTree) {\n this.$refs.refTree.setCurrentKey(this.currentNodeKey);\n }\n // fixme: 给el-tree设置新的default-expanded-keys后,新设置的节点,确实展开了,但是之前展开的,却没有关闭的问题\n this.treeKey = `treeKey${new Date().getTime()}`;\n },\n optionClicked(event) {\n const { option = {}, item } = event;\n switch (option.key) {\n case \"delTemplate\":\n this.askForDelTemplate(item);\n break;\n case \"addLane\":\n this.addLane(item);\n break;\n case \"delLane\":\n this.askForDelLane(item);\n break;\n case \"addParam\":\n this.addParam(item);\n break;\n case \"delParam\":\n this.delParam(item);\n break;\n }\n },\n hideContextMenu() {\n const ctxRef = this.$refs.vueSimpleContextMenu;\n if (ctxRef) {\n ctxRef.hideContextMenu();\n }\n },\n // eslint-disable-next-line no-unused-vars\n showRightWindows(event, data, node) {\n const dataType = this.judgeDataType(node);\n this.dataType = dataType;\n if (data.createUser == \"SYSTEM_USER\") {\n this.$message.warning(\"系统模板不能编辑\");\n return;\n }\n this.$refs.vueSimpleContextMenu.showMenu(event, data);\n },\n clear() {\n // 初始化数据, 不可编辑、展开的节点、内容隐藏\n this.expandedKeys = [];\n this.templateDisable = true;\n this.templateContentShow = false;\n },\n editable() {\n this.templateDisable = false;\n },\n handleNodeClick(data) {\n this.setTargetData(data);\n },\n judgeDataType(node) {\n const { level, data = {} } = node;\n if (level == 1 && data.templateId) {\n return \"template\";\n } else if (level == 2 && data.laneId && data.templateId) {\n return \"lane\";\n } else if (level == 3 && data.lineId) {\n return \"line\";\n }\n return null;\n },\n addTemplate() {\n // 显示模板录入信息\n this.templateContentShow = true;\n this.laneContentShow = false;\n this.lineContentShow = false;\n this.templateDisable = false;\n this.templateInfo = { isPublic: \"0\", baseTemplate: \"\", col1: \"1\" };\n },\n addLane(nodeData) {\n // 显示参数录入信息\n this.templateContentShow = false;\n this.laneContentShow = true;\n this.lineContentShow = false;\n this.templateDisable = false;\n this.laneInfo = { templateId: nodeData.templateId, isUsed: \"1\", sort: nodeData.lanes.length + 1, isLogScale: \"0\" };\n },\n addParam(nodeData) {\n // 显示参数录入信息\n this.templateContentShow = false;\n this.laneContentShow = false;\n this.lineContentShow = true;\n this.templateDisable = false;\n this.lineInfo = { laneId: nodeData.laneId, isUsed: \"1\", lineSize: 2 };\n },\n\n askForDelTemplate(nodeData) {\n this.$confirm(\"此操作将删除该模板, 是否继续?\", \"提示\", {\n confirmButtonText: \"确定\",\n cancelButtonText: \"取消\",\n type: \"warning\",\n })\n .then(() => {\n nodeData.bsflag = \"1\";\n this.curveConfigLoading = true;\n if (this.delTemplate instanceof Function) {\n return this.delTemplate(nodeData);\n } else {\n return Promise.reject(new Error(\"未配置删除模板函数\"));\n }\n })\n .catch((e) => {\n this.$message.error(e.message || \"删除失败\");\n })\n .finally(() => {\n this.curveConfigLoading = false;\n });\n },\n askForDelLane(nodeData) {\n this.$confirm(\"此操作将删除该泳道, 是否继续?\", \"提示\", {\n confirmButtonText: \"确定\",\n cancelButtonText: \"取消\",\n type: \"warning\",\n })\n .then(() => {\n nodeData.bsflag = \"1\";\n this.curveConfigLoading = true;\n if (this.delLane instanceof Function) {\n return this.delLane(nodeData);\n } else {\n return Promise.reject(new Error(\"未配置删除模板函数\"));\n }\n })\n .catch(() => {\n this.$message.error(\"删除失败\");\n })\n .finally(() => {\n this.curveConfigLoading = false;\n });\n },\n delParam(nodeData) {\n this.$confirm(\"此操作将删除该参数, 是否继续?\", \"提示\", {\n confirmButtonText: \"确定\",\n cancelButtonText: \"取消\",\n type: \"warning\",\n })\n .then(() => {\n nodeData.bsflag = \"1\";\n if (this.delLine instanceof Function) {\n return this.delLine(nodeData);\n } else {\n return Promise.reject(new Error(\"未配置删除线条函数\"));\n }\n })\n .catch((e) => {\n this.$message.error(e.message || \"删除失败\");\n });\n },\n },\n computed: {\n contextMenuOptions() {\n switch (this.dataType) {\n case \"template\":\n return [\n { name: \"新增泳道\", key: \"addLane\" },\n // { name: \"删除模板\", key: \"delTemplate\" },\n ];\n case \"lane\":\n return [\n { name: \"新增参数\", key: \"addParam\" },\n { name: \"删除泳道\", key: \"delLane\" },\n ];\n case \"line\":\n return [{ name: \"删除参数\", key: \"delParam\" }];\n\n default:\n return [];\n }\n },\n treeData() {\n if (!this.inputTempates) {\n return [];\n } else {\n // 数据补全id label等信息\n const treeData = [];\n this.inputTempates.forEach((template) => {\n console.log(template,'template');\n const tData = { ...template, id: template.templateId, label: template.templateName };\n tData.children = [];\n if (!template.lanes) {\n template.lanes = [];\n }\n\n template.lanes.forEach((lane, index) => {\n const laneData = { ...lane, id: lane.laneId, label: `泳道${index + 1}` };\n tData.children.push(laneData);\n if (!laneData.lines) {\n laneData.lines = [];\n }\n laneData.children = [];\n lane.lines.forEach((line) => {\n const lineData = { ...line, id: line.lineId, label: line.lineName || line.paramId };\n lineData.label = this.getLineDataLabel(line);\n laneData.children.push(lineData);\n });\n });\n treeData.push(tData);\n });\n return treeData;\n }\n },\n userTemplate() {\n if (!this.treeData) {\n return [];\n } else {\n return [...this.treeData];\n }\n },\n },\n watch: {\n // 默认展开选中的泳道\n contextItem: {\n immediate: true,\n deep: true,\n handler(val) {\n this.setTargetData(Object.assign({}, val));\n },\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.kd-lane-el-container {\n height: 60vh;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n width: 100%;\n @media screen and (max-width: 1024px) {\n height: 70vh;\n }\n\n .custom-tree-node {\n width: 100%;\n }\n\n .rtd-config-side {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n &-tree {\n height: 90%;\n overflow: auto;\n }\n\n &-option {\n text-align: center;\n }\n }\n\n .rtd-config-main {\n display: flex;\n align-content: center;\n justify-content: center;\n width: 100%;\n }\n}\n</style>\n","export const ACTION_TYPE = {\n UPSERT_LINE: \"upsertLine\",\n DELETE_LINE: \"delLine\",\n};","<template>\n <div\n class=\"kd-lane-chart-container-header-item\"\n :style=\"headerItemStyle\"\n @click=\"toggleIsUsed\"\n :class=\"{ 'kd-lane-chart-container-header-item_warning': isShowWarning() }\"\n >\n <div class=\"kd-lane-chart-container-text-container\">\n <span class=\"left\">{{ line.min || (lineRange[line.lineId] && lineRange[line.lineId].min || 0) }}</span>\n <div class=\"center\">\n <div class=\"paramsTitle\" :style=\"getFontSize('label')\">{{ getParamName(line) }}</div>\n <div class=\"paramsData\" :style=\"getFontSize('data')\">{{ getCurrentData() }}</div>\n </div>\n <span class=\"right\">{{ line.max || (lineRange[line.lineId] && lineRange[line.lineId].max || 0) }}</span>\n <div class=\"gradient-display\" :style=\"gradientDisplay\"></div>\n </div>\n </div>\n</template>\n<script>\nimport { isNumeric } from \"../../util/index.js\";\n\nexport default {\n name: \"HeaderItem\",\n props: {\n lineRange: {\n type: Object,\n default: () => ({}),\n },\n itemHeight: {\n type: Number,\n default: 20,\n },\n isKdCurveV2: {\n type: Boolean,\n default: false,\n },\n currentHeaderStyle: {\n type: Object,\n default: () => ({\n headerPadding: 4,\n headerItemHeight: 42,\n itemGap: 4,\n }),\n },\n line: {\n type: Object,\n default: () => ({}),\n },\n paramsNameMap: {\n type: Object,\n default: () => ({}),\n required: true,\n },\n themeName: {\n type: String,\n default: undefined,\n },\n visibleData: {\n type: Array,\n default: () => [],\n },\n formCache: {\n type: Object,\n default: () => ({}),\n },\n headerData: {\n type: Object,\n default: () => ({}),\n },\n },\n methods: {\n // 获取字体大小类名\n getFontSize(type) {\n if (type == \"label\" && Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, `headerLabelFontSize`)) {\n return {\n fontSize: `${isNumeric(this.currentHeaderStyle[`headerLabelFontSize`]) ? this.currentHeaderStyle[`headerLabelFontSize`] + `px` : this.currentHeaderStyle[`headerLabelFontSize`]}`,\n };\n }\n\n if (type == \"data\" && Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, `headerDataFontSize`)) {\n return {\n fontSize: `${isNumeric(this.currentHeaderStyle[`headerDataFontSize`]) ? this.currentHeaderStyle[`headerDataFontSize`] + `px` : this.currentHeaderStyle[`headerDataFontSize`]}`,\n };\n }\n },\n // 是否显示警告背景\n isShowWarning() {\n // 超找对应数组中的最大值\n const max = Math.max(...this.visibleData.map((item) => item[this.line.paramId])) || 0;\n // 找到对应数组中最小值\n const min = Math.min(...this.visibleData.map((item) => item[this.line.paramId])) || 0;\n return max > this.line.max || min < this.line.min;\n },\n // 显示当前数据最新值\n getCurrentData() {\n if (this.formCache.displayType == \"float\") {\n return \"\";\n }\n if (!Object.prototype.hasOwnProperty.call(this.headerData, this.line.paramId)) {\n return \"--\";\n }\n return this.headerData[this.line.paramId] !== null &&\n this.headerData[this.line.paramId] !== undefined &&\n this.headerData[this.line.paramId] !== \"\"\n ? typeof +this.headerData[this.line.paramId] === \"number\"\n ? Number(Number(this.headerData[this.line.paramId]).toFixed(2))\n : this.headerData[this.line.paramId]\n : \"--\";\n },\n getParamName(line) {\n const nameConfig = this.paramsNameMap[line.paramId];\n if (!nameConfig) {\n return \"\";\n }\n return `${nameConfig.paramName}${nameConfig.paramUnit ? `(${nameConfig.paramUnit})` : \"\"}`;\n },\n toggleIsUsed() {\n const temp = { ...this.line };\n if (temp.isUsed == \"1\" || temp.isUsed == 1) {\n temp.isUsed = \"0\";\n } else {\n temp.isUsed = \"1\";\n }\n this.$emit(\"updateLine\", temp);\n },\n },\n computed: {\n gradientDisplay() {\n let lineColor;\n if (this.themeName && this.line.themeConfig) {\n lineColor = this.line.themeConfig[this.themeName] && this.line.themeConfig[this.themeName].lineColor;\n }\n let result;\n if (this.line.isGradient) {\n result = { background: `${lineColor || this.line.lineColor}` };\n } else {\n result = {};\n }\n return result;\n },\n textColor() {\n let lineColor;\n // 只有不是渐变色时,才从主题配置中获取文字颜色\n if (this.themeName && this.line.themeConfig && !this.line.isGradient) {\n lineColor = this.line.themeConfig[this.themeName] && this.line.themeConfig[this.themeName].lineColor;\n }\n return {\n color: lineColor || this.line.lineColor,\n };\n },\n headerItemStyle() {\n let lineColor;\n if (this.themeName && this.line.themeConfig) {\n lineColor = this.line.themeConfig[this.themeName] && this.line.themeConfig[this.themeName].lineColor;\n }\n\n let lineType;\n if (this.line.lineType == \"area\") {\n if (this.line.isGradient) {\n lineType = {};\n } else {\n lineType = { \"box-shadow\": `inset 0 0 8px 0px ${lineColor || this.line.lineColor}` };\n }\n } else {\n lineType = { \"border-bottom\": `2px ${this.line.lineType} ${lineColor || this.line.lineColor}` };\n }\n let backgroundColor = {};\n let headerHeight = {};\n\n if (!this.isKdCurveV2) {\n backgroundColor = {\n background: `transparent !important`,\n }\n headerHeight = {\n height: `${this.itemHeight}px`,\n };\n }else{\n headerHeight = {\n height: `${this.formCache.displayType == \"header\" ? this.currentHeaderStyle.headerItemHeight : this.currentHeaderStyle.headerItemHeight * 0.8}px`,\n }\n }\n\n return {\n ...headerHeight,\n opacity: this.line.isUsed == \"1\" ? 1 : 0.5,\n ...lineType,\n ...backgroundColor,\n };\n },\n },\n watch: {},\n};\n</script>\n<style lang=\"scss\" scoped>\n.kd-lane-chart-container-header-item {\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 &_warning {\n background: var(--kd-lane-container-header-item-warning-color, rgba(248, 108, 89, 0.6));\n }\n\n .kd-lane-chart-container-text-container {\n height: 100%;\n width: 100%;\n position: relative;\n font-family:\n Microsoft YaHei UI,\n Microsoft YaHei UI;\n font-weight: 400;\n font-size: 10px;\n .left {\n position: absolute;\n left: 2px;\n bottom: 2px;\n }\n .center {\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 .paramsTitle {\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family:\n Microsoft YaHei UI,\n 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 .paramsData {\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family:\n Microsoft YaHei UI,\n 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 }\n .right {\n position: absolute;\n right: 2px;\n bottom: 2px;\n }\n .gradient-display {\n position: absolute;\n height: 2px;\n left: 0;\n bottom: 0;\n right: 0;\n }\n }\n}\n</style>\n","<template>\n <div class=\"kd-lane-chart-container\" @contextmenu=\"onParentContextMenu\" ref=\"targetDom\">\n <template v-if=\"currentTemplate && currentTemplate.lanes && currentTemplate.lanes.length > 0\">\n <VueDraggable\n class=\"kd-lane-chart-container\"\n @start=\"onLaneDragStart\"\n @end=\"onLaneDragEnd\"\n v-model=\"currentTemplate.lanes\"\n :animation=\"200\"\n :fallbackOnBody=\"true\"\n :swapThreshold=\"0.65\"\n :group=\"{ name: 'laneGroup', pull: false, put: false }\"\n item-key=\"laneId\"\n >\n <div\n v-for=\"(lane, index) in currentTemplate.lanes || []\"\n :key=\"lane.laneId\"\n :id=\"`lane-header-${lane.laneId}`\"\n :class=\"[\n $slots[`lane${lane.laneId}`] ? 'kd-lane-chart-lane-slot-container' : 'kd-lane-chart-lane-container',\n {\n 'border-left': $slots[`lane${lane.laneId}`]\n ? isKdCurveV2 || (!isKdCurveV2 && index !== 0)\n : !isKdCurveV2 && index !== 0,\n 'border-top': $slots[`lane${lane.laneId}`] && isKdCurveV2,\n 'border-right': $slots[`lane${lane.laneId}`] && isKdCurveV2,\n },\n ]\"\n :lane-id=\"lane.laneId\"\n :style=\"laneContainerStyle(lane, $slots[`lane${lane.laneId}`] ? 'slot' : 'lane')\"\n ref=\"refLaneDiv\"\n >\n <template v-if=\"$slots[`lane${lane.laneId}`]\">\n <div class=\"kd-lane-chart-lane-header\" :style=\"slotHeaderStyle\" :class=\"{ 'border-bottom': true }\">\n <slot :name=\"`lane${lane.laneId}`\" :lane=\"lane\"></slot>\n </div>\n <div\n v-if=\"index < currentTemplate.lanes.length - 1\"\n class=\"kd-lane-resize-handle kd-lane-resize-handle-right\"\n @mousedown=\"startResize($event, lane, 'right')\"\n ></div>\n <div v-if=\"isKdCurveV2\" class=\"kd-lane-chart-lane-container-echart\">\n <slot :name=\"`slotheader-content-${lane.laneId}`\" :lane=\"lane\"></slot>\n </div>\n </template>\n <template v-else>\n <div\n class=\"kd-lane-chart-lane-header\"\n :class=\"{ 'border-bottom': !isKdCurveV2 }\"\n :style=\"headerStyle\"\n @contextmenu.prevent=\"showContextMenu($event, lane)\"\n >\n <VueDraggable\n v-model=\"lane.lines\"\n :animation=\"200\"\n :fallbackOnBody=\"true\"\n :swapThreshold=\"0.65\"\n :group=\"{ name: 'lineGroup', pull: true, put: ['lineGroup'] }\"\n @start=\"onLineDragStart\"\n @end=\"onLineDragEnd\"\n class=\"header-list-gap\"\n :style=\"{ gap: (isKdCurveV2 ? currentHeaderStyle.itemGap : itemGap) + 'px' }\"\n item-key=\"lineId\"\n >\n <HeaderItem\n v-for=\"line in lane.lines || []\"\n :key=\"line.lineId\"\n :line=\"line\"\n :paramsNameMap=\"paramsNameMap\"\n v-bind=\"$props\"\n @contextmenu.prevent=\"showContextMenu($event, line)\"\n @updateLine=\"upsertLine\"\n ></HeaderItem>\n </VueDraggable>\n </div>\n <div v-if=\"isKdCurveV2\" class=\"kd-lane-chart-lane-container-echart\">\n <slot :name=\"`content-${lane.laneId}`\" :lane=\"lane\"></slot>\n </div>\n <div\n v-if=\"index < currentTemplate.lanes.length - 1\"\n class=\"kd-lane-resize-handle kd-lane-resize-handle-right\"\n @mousedown=\"startResize($event, lane, 'right')\"\n ></div>\n </template>\n </div>\n </VueDraggable>\n </template>\n <template v-else>\n <div class=\"kd-lane-chart-lane-container\" ref=\"refLaneDiv\">\n <div class=\"kd-lane-chart-lane-header\" :style=\"headerStyle\" @contextmenu.prevent=\"showContextMenu\">\n <!-- 空泳道,只是为了占位 -->\n </div>\n </div>\n </template>\n\n <!-- 画布部分 -->\n <div class=\"kd-lane-chart-container-draw-area\" :style=\"darwAreaStyle\" v-if=\"!isKdCurveV2\">\n <slot name=\"draw-slot\"></slot>\n </div>\n <VueSimpleContextMenu :options=\"contextMenuOptions\" ref=\"vueSimpleContextMenu\" @option-clicked=\"optionClicked\" />\n <div\n v-if=\"curveConfigVisible || curveConfigClosing\"\n class=\"custom-dialog-mask\"\n :class=\"{ closing: curveConfigClosing }\"\n @click.self=\"closeCurveConfigDialog\"\n >\n <div class=\"custom-dialog function-control-panel-dialog\" :class=\"{ closing: curveConfigClosing }\" ref=\"containerRef\">\n <div class=\"custom-dialog__header\">\n <span class=\"custom-dialog__title\">泳道模板设置</span>\n <button class=\"custom-dialog__close\" @click=\"closeCurveConfigDialog\">×</button>\n </div>\n <div class=\"custom-dialog__body RealTimeCurveConfig_area\">\n <RealTimeCurveConfig\n ref=\"curveConfig\"\n :inputTempates=\"treeTemplates\"\n :caseId=\"strategy.caseId\"\n :params=\"params\"\n :paramsNameMap=\"paramsNameMap\"\n v-bind=\"$attrs\"\n :contextItem=\"contextItem\"\n :positionInfo=\"positionInfo\"\n >\n <!-- v-on=\"$listeners\":将父组件传递给子组件的所有事件监听器绑定到子组件的根元素上。 -->\n <!-- 这样做的好处是:子组件可以自动继承父组件的事件监听器,而无需在子组件中逐个声明这些监听器 -->\n </RealTimeCurveConfig>\n </div>\n <div class=\"custom-dialog__footer\">\n <el-button @click=\"closeCurveConfigDialog\">取消</el-button>\n <el-button type=\"primary\" @click=\"confirmCurveConfigDialog\">确定</el-button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport { cloneDeep } from \"lodash-es\";\nimport { VueDraggable } from \"vue-draggable-plus\";\nimport { isNumeric, pxToNumber, sortLaneLines, sortLanes, sortTemplates, strategyValidator } from \"../../util/index.js\";\nimport VueSimpleContextMenu from \"../context-menu/index.vue\";\nimport { StrategyFactory } from \"../strategies/StrategyFactory.js\";\nimport RealTimeCurveConfig from \"./config/RealTimeCurveConfig.vue\";\nimport { ACTION_TYPE } from \"./const/action-type.js\";\nimport HeaderItem from \"./header-item.vue\";\n\nexport default {\n name: \"KdLaneContainer\",\n provide() {\n return {\n upsertTemplate: this.upsertTemplate,\n delTemplate: this.delTemplate,\n upsertLane: this.upsertLane,\n delLane: this.delLane,\n upsertLine: this.upsertLine,\n delLine: this.delLine,\n getThemeName: () => {\n return this.themeName;\n },\n };\n },\n components: {\n HeaderItem,\n RealTimeCurveConfig,\n VueSimpleContextMenu,\n VueDraggable,\n },\n props: {\n headerPadding: {\n type: Number,\n default: 4,\n },\n headerItemHeight: {\n type: Number,\n default: 20,\n },\n itemGap: {\n type: Number,\n default: 2,\n },\n visibleData: {\n type: Array,\n default: () => [],\n },\n headerData: {\n type: Object,\n default: () => ({}),\n },\n lineRange: {\n type: Object,\n default: () => ({}),\n },\n // 特定模式kd-curve-v2\n isKdCurveV2: {\n type: Boolean,\n default: false,\n },\n config: {\n type: Object,\n required: true,\n validator: strategyValidator,\n },\n currentHeaderStyle: {\n type: Object,\n default: () => ({\n headerPadding: 4,\n headerItemHeight: 42,\n itemGap: 4,\n }),\n },\n customMenuList: {\n type: Array,\n default: () => {\n return [];\n },\n },\n themeName: {\n type: String,\n default: undefined,\n },\n formCache: {\n type: Object,\n default: () => ({}),\n },\n showContextMenuStatus: {\n type: Boolean,\n default: true,\n },\n },\n data() {\n return {\n treeTemplates: null,\n isLoading: false,\n strategy: null,\n currentTemplate: {},\n curveConfigVisible: false,\n curveConfigClosing: false,\n params: [],\n contextItem: undefined,\n laneWidthOverrides: {},\n isResizing: false,\n isLineDragging: false,\n isLaneDragging: false,\n resizeTimer: null,\n currentLane: {},\n resizeDirection: undefined,\n startX: 0,\n startWidth: 0,\n domHeight: 0,\n positionInfo: {},\n resizeObserver: null,\n resizeObserverContainer: null,\n };\n },\n created() {\n this.initStrategy();\n },\n watch: {\n \"config.caseId\"(newVal, oldVal) {\n if (newVal && oldVal && newVal !== oldVal) {\n this.initStrategy();\n }\n },\n curveConfigVisible(val) {\n if (val) {\n this.$nextTick(() => {\n this.setupResizeObserverContainer();\n });\n } else if (this.resizeObserverContainer) {\n this.resizeObserverContainer.disconnect();\n this.resizeObserverContainer = null;\n }\n },\n },\n mounted() {\n window.addEventListener(\"mousemove\", this.resize);\n window.addEventListener(\"mouseup\", this.stopResize);\n this.updateDomHeight();\n this.updateLaneWidthOverrides();\n this.setupResizeObserver();\n this.$nextTick(() => {\n this.setupResizeObserverContainer();\n });\n },\n beforeUnmount() {\n window.removeEventListener(\"mousemove\", this.resize);\n window.removeEventListener(\"mouseup\", this.stopResize);\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.resizeObserverContainer) {\n this.resizeObserverContainer.disconnect();\n }\n },\n methods: {\n initStrategy() {\n if (!this.config || !this.config.caseId) {\n return;\n }\n this.strategy = StrategyFactory.createStrategy(this.config);\n this.loadConfig();\n },\n setupResizeObserverContainer() {\n if (this.resizeObserverContainer) {\n this.resizeObserverContainer.disconnect();\n this.resizeObserverContainer = null;\n }\n\n if (!this.curveConfigVisible && !this.curveConfigClosing) {\n return;\n }\n\n this.$nextTick(() => {\n const containerRef = this.$refs.containerRef;\n if (!containerRef) {\n return;\n }\n\n const container = containerRef.$el || containerRef;\n if (!container || container.nodeType !== 1) {\n return;\n }\n\n this.resizeObserverContainer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const rect = entry.target.getBoundingClientRect();\n const contentBoxSize = entry.contentBoxSize && entry.contentBoxSize[0];\n const contentRect = entry.contentRect;\n let width = contentBoxSize ? contentBoxSize.inlineSize : contentRect ? contentRect.width : rect.width;\n let height = contentBoxSize ? contentBoxSize.blockSize : contentRect ? contentRect.height : rect.height;\n // 获取当前显示区域大小\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n console.log(windowWidth, windowHeight);\n this.positionInfo.top = (windowHeight - height) / 2;\n this.positionInfo.left = (windowWidth - width) / 2;\n this.positionInfo.width = width;\n this.positionInfo.height = height;\n }\n });\n\n this.resizeObserverContainer.observe(container);\n });\n },\n setupResizeObserver() {\n const container = this.$refs.targetDom;\n if (container) {\n this.resizeObserver = new ResizeObserver(() => {\n this.handleResize();\n });\n this.resizeObserver.observe(container);\n }\n },\n // 获取泳道的高度\n getLaneHeightPx() {\n // 画布大小\n const headerStyle = this.headerStyle;\n const heightNum = pxToNumber(headerStyle.height);\n const minHeightNum = pxToNumber(headerStyle[\"min-height\"]);\n const maxHeightNum = this.percentorpxToNumber(headerStyle[\"max-height\"] || \"40%\");\n // 取较大值作为实际高度\n const actualHeight = Math.max(Math.min(heightNum, maxHeightNum), minHeightNum);\n return actualHeight;\n },\n handleResize() {\n if (this.isLineDragging || this.isLaneDragging || this.isResizing) return;\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n }\n this.resizeTimer = setTimeout(() => {\n this.laneWidthOverrides = {};\n this.$nextTick(() => {\n this.updateDomHeight();\n this.updateLaneWidthOverrides();\n });\n }, 100);\n },\n updateDomHeight() {\n const container = this.$refs.targetDom;\n if (container) {\n this.domHeight = container.clientHeight;\n }\n },\n updateLaneWidthOverrides() {\n if (this.isLineDragging || this.isLaneDragging || this.isResizing) return;\n const { lanes = [] } = this.currentTemplate;\n let hasChanged = false;\n lanes.forEach((lane) => {\n const headerEl = document.getElementById(`lane-header-${lane.laneId}`);\n if (headerEl) {\n const id = String(lane.laneId);\n const newWidth = headerEl.clientWidth;\n const oldWidth = this.laneWidthOverrides[id];\n console.log(id, oldWidth, newWidth);\n if (oldWidth !== newWidth) {\n this.setLaneWidthOverride(lane.laneId, newWidth);\n hasChanged = true;\n }\n }\n });\n console.log(this.laneWidthOverrides, hasChanged);\n if (hasChanged) {\n this.$emit(\"lane-width-change\", this.laneWidthOverrides);\n }\n },\n // 开启缩放宽度\n startResize(event, lane, direction) {\n event.preventDefault();\n this.isResizing = true;\n this.currentLane = lane;\n this.resizeDirection = direction;\n this.startX = event.clientX;\n this.startWidth = this.getEffectiveLaneWidthPx(lane);\n },\n // 缩放宽度中\n resize(event) {\n if (!this.isResizing || !this.currentLane) return;\n const deltaX = event.clientX - this.startX;\n if (deltaX === 0) return;\n const lanes = this.currentTemplate.lanes;\n const laneIndex = lanes.findIndex((l) => l.laneId === this.currentLane.laneId);\n if (laneIndex === -1) return;\n const minWidth = 40;\n const getWidth = (lane) => this.getEffectiveLaneWidthPx(lane);\n const currentLane = lanes[laneIndex];\n let currentWidth = getWidth(currentLane);\n // 向右拖(右侧整体缩)\n if (deltaX > 0) {\n const rightLanes = lanes.slice(laneIndex + 1);\n if (rightLanes.length === 0) return;\n let totalShrinkable = rightLanes.reduce((sum, l) => sum + (getWidth(l) - minWidth), 0);\n let actualDelta = Math.min(deltaX, totalShrinkable);\n if (actualDelta <= 0) return;\n // 当前变大\n this.setLaneWidthOverride(currentLane.laneId, currentWidth + actualDelta);\n // 右侧按比例缩小\n rightLanes.forEach((lane) => {\n let w = getWidth(lane);\n let reducible = w - minWidth;\n let reduce = totalShrinkable > 0 ? (reducible / totalShrinkable) * actualDelta : 0;\n this.setLaneWidthOverride(lane.laneId, Math.max(minWidth, w - reduce));\n });\n }\n // 向左拖(左侧整体缩 + 右1变大)\n else {\n const rightLane = lanes[laneIndex + 1];\n if (!rightLane) return;\n const leftLanes = lanes.slice(0, laneIndex);\n let rightWidth = getWidth(rightLane);\n // 当前减少\n let shrinkAmount = Math.abs(deltaX);\n // 左侧可压缩空间\n let leftShrinkable = leftLanes.reduce((sum, l) => sum + (getWidth(l) - minWidth), 0);\n // 当前可压缩\n let currentShrinkable = currentWidth - minWidth;\n let totalShrinkable = leftShrinkable + currentShrinkable;\n let actualShrink = Math.min(shrinkAmount, totalShrinkable);\n if (actualShrink <= 0) return;\n // 当前减少部分\n let currentReduce = Math.min(currentShrinkable, actualShrink);\n this.setLaneWidthOverride(currentLane.laneId, currentWidth - currentReduce);\n let remain = actualShrink - currentReduce;\n // 左侧按比例缩小\n if (remain > 0 && leftLanes.length > 0) {\n leftLanes.forEach((lane) => {\n let w = getWidth(lane);\n let reducible = w - minWidth;\n let reduce = leftShrinkable > 0 ? (reducible / leftShrinkable) * remain : 0;\n this.setLaneWidthOverride(lane.laneId, Math.max(minWidth, w - reduce));\n });\n }\n // 右侧第一个变大(吃掉所有减少的空间)\n this.setLaneWidthOverride(rightLane.laneId, rightWidth + actualShrink);\n }\n // 防止抖动(关键)\n this.startX = event.clientX;\n this.$forceUpdate();\n },\n // 结束缩放宽度\n stopResize() {\n this.isResizing = false;\n this.currentLane = null;\n this.resizeDirection = null;\n this.startX = 0;\n this.startWidth = 0;\n // 停止缩放时不调用 updateLaneWidthOverrides,避免宽度不断缩小\n this.$emit(\"lane-width-change\", this.laneWidthOverrides);\n },\n // 获取指定泳道的DOM元素\n getLaneElement(laneId) {\n if (!this.$refs.refLaneDiv) return null;\n const id = laneId != null ? String(laneId) : \"\";\n // 检查 refLaneDiv 是否为数组\n if (Array.isArray(this.$refs.refLaneDiv)) {\n return this.$refs.refLaneDiv.find((el) => el.getAttribute(\"lane-id\") === id);\n }\n return this.$refs.refLaneDiv.getAttribute(\"lane-id\") === id ? this.$refs.refLaneDiv : null;\n },\n hiddenContextMenu() {\n const ctxRef = this.$refs.vueSimpleContextMenu;\n if (ctxRef) {\n ctxRef.hideContextMenu();\n }\n },\n // 将当前模板中的泳道/曲线顺序同步到 treeTemplates,避免拖拽后图表仍用旧结构\n syncTreeTemplateFromCurrent() {\n if (!this.currentTemplate || !this.treeTemplates) return;\n const tpl = this.treeTemplates.find((t) => t.templateId === this.currentTemplate.templateId);\n if (tpl && tpl !== this.currentTemplate) {\n tpl.lanes = this.currentTemplate.lanes;\n }\n sortLanes(this.currentTemplate.lanes);\n },\n notifyTemplateChangeImmediately() {\n this.syncTreeTemplateFromCurrent();\n this.$emit(\"template-change\", cloneDeep(this.currentTemplate));\n },\n syncLinesLaneIdsFromCurrent() {\n (this.currentTemplate.lanes || []).forEach((lane) => {\n (lane.lines || []).forEach((line, index) => {\n line.laneId = lane.laneId;\n line.lineSort = index + 1;\n });\n sortLaneLines(lane);\n });\n },\n collectAllLinesFromCurrent() {\n const lines = [];\n (this.currentTemplate.lanes || []).forEach((lane) => {\n (lane.lines || []).forEach((line) => {\n lines.push({ ...line, laneId: lane.laneId, lineSort: line.lineSort });\n });\n });\n return lines;\n },\n onLineDragStart() {\n this.isLineDragging = true;\n },\n onLaneDragStart() {\n this.isLaneDragging = true;\n },\n onLineDragEnd() {\n // vue-draggable-plus 的 @change 不含 added/removed/moved,需在 @end 时同步\n this.syncLinesLaneIdsFromCurrent();\n this.notifyTemplateChangeImmediately();\n \n const lines = this.collectAllLinesFromCurrent();\n if (lines.length === 0) return;\n \n Promise.all(lines.map((line) => this.dragUpdateLine(line))).then(() => {\n this.setDefaultAndNotify();\n this.isLineDragging = false;\n });\n },\n onLaneDragEnd() {\n const lanes = this.currentTemplate.lanes || [];\n lanes.forEach((lane, index) => {\n lane.sort = index;\n });\n sortLanes(lanes);\n this.notifyTemplateChangeImmediately();\n \n Promise.all(lanes.map((lane) => this.dragUpdateLane(lane))).then(() => {\n this.setDefaultAndNotify();\n this.isLaneDragging = false;\n });\n },\n // 拖拽更新曲线\n dragUpdateLine(data) {\n return this.strategy.upsertLine(data).then((savedData) => {\n const currentLanes = this.currentTemplate.lanes;\n // 跨泳道拖拽时,确保曲线不会残留在原泳道\n currentLanes.forEach((lane) => {\n if (lane.laneId != savedData.laneId) {\n const staleIndex = (lane.lines || []).findIndex((line) => line.lineId == savedData.lineId);\n if (staleIndex >= 0) {\n lane.lines.splice(staleIndex, 1);\n }\n }\n });\n const laneIndex = currentLanes.findIndex((lane) => {\n return lane.laneId == savedData.laneId;\n });\n if (laneIndex < 0) {\n // 收说明不是更新的当前模板 替换内存中的数据\n for (const template of this.treeTemplates) {\n const { lanes } = template;\n for (const lane of lanes) {\n if (lane.laneId == savedData.laneId) {\n const { lines } = lane;\n const lineIndex = lines.findIndex((line) => {\n return line.lineId == savedData.lineId;\n });\n if (lineIndex < 0) {\n lines.push(savedData);\n } else {\n lines[lineIndex] = savedData;\n }\n sortLaneLines(lane);\n break;\n }\n }\n }\n } else {\n const lane = currentLanes[laneIndex];\n const currentLines = lane.lines;\n const lineIndex = currentLines.findIndex((line) => {\n return line.lineId == savedData.lineId;\n });\n if (lineIndex < 0) {\n currentLines.push(savedData);\n } else {\n currentLines[lineIndex] = savedData;\n }\n currentLanes[laneIndex] = lane;\n sortLaneLines(lane);\n return savedData;\n }\n });\n },\n // 拖拽更新泳道\n dragUpdateLane(data) {\n return this.strategy.upsertLane(data).then((savedData) => {\n const index = this.treeTemplates.findIndex((template) => {\n return template.templateId == savedData.templateId;\n });\n if (index < 0) {\n console.warn(\"template not found\");\n } else {\n const template = this.treeTemplates[index];\n const lanes = template.lanes || [];\n const laneIndex = lanes.findIndex((lane) => lane.laneId == savedData.laneId);\n if (laneIndex < 0) {\n lanes.push(savedData);\n } else {\n lanes[laneIndex] = savedData;\n }\n sortLanes(template.lanes);\n }\n return savedData;\n });\n },\n getGridSize() {\n if (!this.$refs.refLaneDiv) return [];\n const isArray = Array.isArray(this.$refs.refLaneDiv);\n if (isArray) {\n return this.$refs.refLaneDiv.map((item) => {\n const { x, y, width, height, top, right, bottom, left } = item.getBoundingClientRect();\n return { x, y, width, height, top, bottom, right, left, \"lane-id\": item.getAttribute(\"lane-id\") };\n });\n } else {\n return [this.$refs.refLaneDiv.getBoundingClientRect()];\n }\n },\n /** 展示用宽度:优先拖拽覆盖,其次模板里的 lane.width */\n getLaneWidthPxForLayout(lane) {\n const id = String(lane.laneId);\n const o = this.laneWidthOverrides[id];\n if (o != null) {\n const w = parseFloat(o);\n if (Number.isFinite(w) && w > 0) return w;\n }\n return isNumeric(lane.width) ? lane.width : null;\n },\n /** resize 计算用:覆盖 > lane.width > DOM */\n getEffectiveLaneWidthPx(lane) {\n const id = String(lane.laneId);\n const o = this.laneWidthOverrides[id];\n if (o != null) {\n const w = parseFloat(o);\n if (Number.isFinite(w) && w > 0) return w;\n }\n let w = parseFloat(lane.width);\n if (Number.isFinite(w) && w > 0) return w;\n const el = this.getLaneElement(lane.laneId);\n return el ? el.clientWidth : 100;\n },\n setLaneWidthOverride(laneId, px) {\n const id = String(laneId);\n const minPx = 40;\n const w = Math.max(minPx, px);\n this.laneWidthOverrides[id] = w;\n },\n laneContainerStyle(lane, type) {\n const widthPx = this.getLaneWidthPxForLayout(lane);\n const isWidthNumeric = widthPx != null && isNumeric(widthPx);\n if (type === \"slot\") {\n return isWidthNumeric ? { width: `${widthPx}px` } : { width: \"auto\" };\n } else {\n return isWidthNumeric ? { width: `${widthPx}px` } : { flex: \"1\" };\n }\n },\n setExpanded() {\n this.$refs.curveConfig.setExpanded();\n },\n closeCurveConfigDialog() {\n this.curveConfigClosing = true;\n setTimeout(() => {\n this.curveConfigVisible = false;\n this.curveConfigClosing = false;\n }, 300);\n },\n confirmCurveConfigDialog() {\n this.closeCurveConfigDialog();\n this.$emit(\"confirm\");\n },\n delLine(data) {\n return this.strategy.delLine(data).then(() => {\n const currentLanes = this.currentTemplate.lanes;\n const laneIndex = currentLanes.findIndex((lane) => {\n return lane.laneId == data.laneId;\n });\n if (laneIndex < 0) {\n // 收说明不是更新的当前模板 替换内存中的数据\n for (const template of this.treeTemplates) {\n const { lanes } = template;\n for (const lane of lanes) {\n if (lane.laneId == data.laneId) {\n const { lines } = lane;\n const lineIndex = lines.findIndex((line) => {\n return line.lineId == data.lineId;\n });\n if (lineIndex < 0) {\n console.warn(\"要删除的线条在当前泳道中不存在?\");\n } else {\n lines.splice(lineIndex, 1);\n }\n break;\n }\n }\n }\n } else {\n const currentLines = currentLanes[laneIndex].lines;\n const lineIndex = currentLines.findIndex((line) => {\n return line.lineId == data.lineId;\n });\n if (lineIndex < 0) {\n console.warn(\"要删除的线条在当前泳道中不存在?\");\n } else {\n currentLanes[laneIndex].lines.splice(lineIndex, 1);\n }\n // 以免每次保存都重新渲染\n this.onLineChange(data, ACTION_TYPE.DELETE_LINE);\n }\n });\n },\n upsertLine(data) {\n return this.strategy.upsertLine(data).then((savedData) => {\n const currentLanes = this.currentTemplate.lanes;\n const laneIndex = currentLanes.findIndex((lane) => {\n return lane.laneId == savedData.laneId;\n });\n if (laneIndex < 0) {\n // 收说明不是更新的当前模板 替换内存中的数据\n for (const template of this.treeTemplates) {\n const { lanes } = template;\n for (const lane of lanes) {\n if (lane.laneId == savedData.laneId) {\n const { lines } = lane;\n const lineIndex = lines.findIndex((line) => {\n return line.lineId == savedData.lineId;\n });\n if (lineIndex < 0) {\n lines.push(savedData);\n } else {\n lines[lineIndex] = savedData;\n }\n sortLaneLines(lane);\n break;\n }\n }\n }\n } else {\n const lane = currentLanes[laneIndex];\n const currentLines = lane.lines;\n const lineIndex = currentLines.findIndex((line) => {\n return line.lineId == savedData.lineId;\n });\n if (lineIndex < 0) {\n currentLines.push(savedData);\n } else {\n currentLines[lineIndex] = savedData;\n }\n currentLanes[laneIndex] = lane;\n sortLaneLines(lane);\n // 以免每次保存都重新渲染\n this.onLineChange(savedData, ACTION_TYPE.UPSERT_LINE);\n return savedData;\n }\n });\n },\n delLane(data) {\n return this.strategy.delLane(data).then((delLane) => {\n // 删除内存中数据\n const { templateId } = delLane;\n const index = this.treeTemplates.findIndex((template) => {\n return template.templateId == templateId;\n });\n if (index < 0) {\n console.warn(`template_id not found: '${templateId}'`);\n return;\n }\n const template = this.treeTemplates[index];\n const laneIndex = template.lanes.findIndex((lane) => lane.laneId == delLane.laneId);\n template.lanes.splice(laneIndex, 1);\n // 判断泳道是否在当前模板中\n if (this.currentTemplate.templateId == templateId) {\n // 是,则通知数据变更\n this.setDefaultAndNotify(\"changeNumber\");\n }\n });\n },\n upsertLane(data) {\n return this.strategy.upsertLane(data).then((savedData) => {\n const index = this.treeTemplates.findIndex((template) => {\n return template.templateId == savedData.templateId;\n });\n if (index < 0) {\n console.warn(\"template not found\");\n } else {\n const template = this.treeTemplates[index];\n const lanes = template.lanes || [];\n const laneIndex = lanes.findIndex((lane) => lane.laneId == savedData.laneId);\n if (laneIndex < 0) {\n lanes.push(savedData);\n } else {\n lanes[laneIndex] = savedData;\n }\n sortLanes(template.lanes);\n if (template.templateId === this.currentTemplate.templateId) {\n this.setDefaultAndNotify(\"changeNumber\");\n }\n }\n return savedData;\n });\n },\n delTemplate(data) {\n return this.strategy.deleteTemplate(data).then(() => {\n const index = this.treeTemplates.findIndex((item) => {\n return item.templateId === data.templateId;\n });\n this.treeTemplates.splice(index, 1);\n if (data.templateId == this.currentTemplate.templateId) {\n // 刷新当前模板\n this.setDefaultAndNotify();\n }\n });\n },\n upsertTemplate(data) {\n return this.strategy.upsertTemplate(data).then((savedData) => {\n if (savedData.isPublic == \"1\") {\n this.treeTemplates.forEach((template) => {\n template.isPublic = \"0\";\n });\n }\n // 发生了模板变更 更新内存数据\n const index = this.treeTemplates.findIndex((item) => {\n return item.templateId === savedData.templateId;\n });\n\n if (index >= 0) {\n const newTemplate = this.treeTemplates[index];\n const temp = Object.assign({}, newTemplate, savedData);\n this.treeTemplates[index] = temp;\n } else {\n this.treeTemplates.push(savedData);\n }\n sortTemplates(this.treeTemplates);\n this.setDefaultAndNotify();\n return savedData;\n });\n },\n onParentContextMenu(event) {\n if (!this.showContextMenuStatus) return;\n const itemClassName = \".kd-lane-chart-lane-header\";\n const lineContext = event.target && (event.target.classList.contains(itemClassName) || event.target.closest(itemClassName));\n if (!lineContext) {\n event.preventDefault();\n const ctxRef = this.$refs.vueSimpleContextMenu;\n if (ctxRef) {\n ctxRef.hideContextMenu();\n }\n }\n },\n showContextMenu(event, item) {\n if (!this.showContextMenuStatus) return;\n event.stopPropagation();\n this.$emit(\"showContextMenu\", item);\n this.$refs.vueSimpleContextMenu.showMenu(event, item);\n },\n optionClicked(event) {\n const { option, item } = event;\n this.contextItem = item;\n\n const itemIndex = this.customMenuList.findIndex((item) => {\n return item.key == option.key;\n });\n\n if (itemIndex < 0) {\n if (option.key == \"editTemplate\") {\n this.curveConfigVisible = true;\n } else if (option.key == \"restoreSetting\") {\n return this.restoreSetting();\n }\n } else {\n // 自定义菜单按钮\n this.$emit(\"onCustomMenuClicked\", event);\n }\n },\n restoreSetting() {\n return this.strategy.restoreSetting().then(() => {\n this.loadConfig();\n });\n },\n loadConfig() {\n this.isLoading = true;\n this.strategy\n .getUserTemplates()\n .then((dbDatas) => {\n const { templates = [], params = [] } = dbDatas;\n this.params = params;\n sortTemplates(templates);\n this.treeTemplates = templates;\n this.setDefaultAndNotify();\n })\n .catch((e) => {\n console.error(`加载配置失败: ${this.config?.caseId},${this.config?.versionCode},${e.message}`);\n })\n .finally(() => {\n this.isLoading = false;\n });\n },\n onLineChange(line, type) {\n console.log(\"notify line change\", line, type);\n this.$emit(\"line-change\", { ...line, actionType: type });\n },\n async setDefaultAndNotify(type) {\n const prevTemplateId = this.currentTemplate && this.currentTemplate.templateId;\n const draggedLanes = this.currentTemplate && this.currentTemplate.lanes;\n if (!this.treeTemplates || this.treeTemplates.length === 0) {\n console.warn(\"未加载到泳道模板配置,图表将无法渲染曲线\");\n return;\n }\n const publicTemplates = this.treeTemplates.find((template) => template.isPublic === \"1\");\n if (publicTemplates) {\n if (prevTemplateId === publicTemplates.templateId && draggedLanes) {\n publicTemplates.lanes = draggedLanes;\n }\n this.currentTemplate = publicTemplates;\n } else {\n const sysTemplate = this.treeTemplates.find((template) => template.createUser == \"SYSTEM_USER\");\n if (sysTemplate) {\n sysTemplate.isPublic = \"1\";\n this.currentTemplate = sysTemplate;\n this.strategy.upsertTemplate(sysTemplate);\n } else {\n this.treeTemplates[0].isPublic = \"1\";\n this.currentTemplate = this.treeTemplates[0];\n this.strategy.upsertTemplate(this.currentTemplate);\n }\n }\n if (prevTemplateId != null && this.currentTemplate && this.currentTemplate.templateId !== prevTemplateId || type === \"changeNumber\") {\n this.laneWidthOverrides = {};\n }\n sortLanes(this.currentTemplate.lanes);\n this.$emit(\"template-change\", this.currentTemplate);\n this.$emit(\"params-change\", this.params);\n this.$nextTick(() => {\n // 只有在没有已有宽度时才从 DOM 获取\n const { lanes = [] } = this.currentTemplate || {};\n const needsUpdate = lanes.some((lane) => !this.laneWidthOverrides[String(lane.laneId)]);\n console.log(needsUpdate,'needsUpdate');\n if (needsUpdate) {\n this.updateLaneWidthOverrides();\n } else {\n // 如果有已保存的宽度,直接 emit 事件\n this.$emit(\"lane-width-change\", this.laneWidthOverrides);\n }\n });\n },\n // px以及百分比转换\n percentorpxToNumber(percent) {\n if (percent && percent.includes(\"%\")) {\n return (Number(percent.replace(\"%\", \"\")) * this.domHeight) / 100;\n }\n return Number(percent);\n },\n },\n computed: {\n contextMenuOptions() {\n if (this.config.type == \"local\") {\n return [{ name: \"编辑模板\", key: \"editTemplate\" }, { name: \"恢复默认\", key: \"restoreSetting\" }, ...this.customMenuList];\n } else {\n return [{ name: \"编辑模板\", key: \"editTemplate\" }, ...this.customMenuList];\n }\n },\n paramsNameMap() {\n const result = {};\n for (const param of this.params) {\n result[param.paramId] = {\n paramName: param.paramName,\n paramUnit: param.paramUnit,\n };\n }\n return result;\n },\n /**\n * 计算当前模板中所有车道(lane)的最大行数。\n * @returns {number} 返回所有车道中的最大行数,如果没有车道则返回0。\n **/\n lineCount() {\n const { lanes = [] } = this.currentTemplate || {};\n const lineCount = Math.max(\n ...lanes.map((lane) => {\n return (lane.lines && lane.lines.length) || 0;\n }),\n );\n\n return lineCount;\n },\n headerStyle() {\n if (!this.isKdCurveV2) {\n const common = { gap: `${this.itemGap}px`, padding: `${this.headerPadding}px`, \"max-height\": \"40%\" };\n if (!this.currentTemplate) {\n return { ...common, height: \"30%\", \"min-height\": \"60px\" };\n } else {\n const { lanes = [] } = this.currentTemplate;\n if (!lanes || lanes.length == 0) {\n return { ...common, height: \"30%\", \"min-height\": \"60px\" };\n } else {\n const gapCount = Math.max(0, this.lineCount - 1);\n return {\n ...common,\n height: `${this.lineCount * this.headerItemHeight + this.headerPadding * 2 + gapCount * this.itemGap + 1}px`, // 1px 为下边框宽度\n \"min-height\": \"60px\",\n };\n }\n }\n }\n const common = { gap: `${this.currentHeaderStyle.itemGap}px`, padding: `${this.currentHeaderStyle.headerPadding}px` };\n if (!this.currentTemplate) {\n let data = {\n ...common,\n height: \"30%\",\n \"min-height\": \"60px\",\n \"max-height\": \"30%\",\n };\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"headerHeight\")) {\n data.height = isNumeric(this.currentHeaderStyle.headerHeight)\n ? this.currentHeaderStyle.headerHeight + \"px\"\n : this.currentHeaderStyle.headerHeight;\n }\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"maxHeaderHeight\")) {\n data[\"max-height\"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)\n ? this.currentHeaderStyle.maxHeaderHeight + \"px\"\n : this.currentHeaderStyle.maxHeaderHeight;\n }\n return data;\n } else {\n const { lanes = [] } = this.currentTemplate;\n if (!lanes || lanes.length == 0) {\n let data = {\n ...common,\n height: \"30%\",\n \"min-height\": \"60px\",\n \"max-height\": \"30%\",\n };\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"headerHeight\")) {\n data.height = isNumeric(this.currentHeaderStyle.headerHeight)\n ? this.currentHeaderStyle.headerHeight + \"px\"\n : this.currentHeaderStyle.headerHeight;\n }\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"maxHeaderHeight\")) {\n data[\"max-height\"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)\n ? this.currentHeaderStyle.maxHeaderHeight + \"px\"\n : this.currentHeaderStyle.maxHeaderHeight;\n }\n return data;\n } else {\n const gapCount = Math.max(0, this.lineCount - 1);\n let data = {\n ...common,\n height: `${this.lineCount * (this.formCache?.displayType == \"header\" ? this.currentHeaderStyle.headerItemHeight : this.currentHeaderStyle.headerItemHeight * 0.8) + this.currentHeaderStyle.headerPadding * 2 + gapCount * this.currentHeaderStyle.itemGap}px`,\n \"min-height\": \"60px\",\n \"max-height\": \"30%\",\n };\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"headerHeight\")) {\n data.height = isNumeric(this.currentHeaderStyle.headerHeight)\n ? this.currentHeaderStyle.headerHeight + \"px\"\n : this.currentHeaderStyle.headerHeight;\n }\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"maxHeaderHeight\")) {\n data[\"max-height\"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)\n ? this.currentHeaderStyle.maxHeaderHeight + \"px\"\n : this.currentHeaderStyle.maxHeaderHeight;\n }\n return data;\n }\n }\n },\n slotHeaderStyle() {\n if (!this.isKdCurveV2) {\n if (!this.currentTemplate) {\n return { height: \"30%\", \"min-height\": \"60px\", \"max-height\": \"40%\" };\n } else {\n const { lanes = [] } = this.currentTemplate;\n if (!lanes || lanes.length == 0) {\n return { height: \"30%\", \"min-height\": \"60px\", \"max-height\": \"40%\" };\n } else {\n const gapCount = Math.max(0, this.lineCount - 1);\n return {\n height: `${this.lineCount * this.headerItemHeight + this.headerPadding * 2 + gapCount * this.itemGap + 1}px`, // 1px 为下边框宽度\n \"min-height\": \"60px\",\n \"max-height\": \"40%\",\n };\n }\n }\n }\n if (!this.currentTemplate) {\n let data = {\n height: \"30%\",\n \"min-height\": \"60px\",\n \"max-height\": \"30%\",\n };\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"headerHeight\")) {\n data.height = isNumeric(this.currentHeaderStyle.headerHeight)\n ? this.currentHeaderStyle.headerHeight + \"px\"\n : this.currentHeaderStyle.headerHeight;\n }\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"maxHeaderHeight\")) {\n data[\"max-height\"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)\n ? this.currentHeaderStyle.maxHeaderHeight + \"px\"\n : this.currentHeaderStyle.maxHeaderHeight;\n }\n return data;\n } else {\n const { lanes = [] } = this.currentTemplate;\n if (!lanes || lanes.length == 0) {\n let data = {\n height: \"30%\",\n \"min-height\": \"60px\",\n \"max-height\": \"30%\",\n };\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"headerHeight\")) {\n data.height = isNumeric(this.currentHeaderStyle.headerHeight)\n ? this.currentHeaderStyle.headerHeight + \"px\"\n : this.currentHeaderStyle.headerHeight;\n }\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"maxHeaderHeight\")) {\n data[\"max-height\"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)\n ? this.currentHeaderStyle.maxHeaderHeight + \"px\"\n : this.currentHeaderStyle.maxHeaderHeight;\n }\n return data;\n } else {\n const gapCount = Math.max(0, this.lineCount - 1);\n let data = {\n height: `${this.lineCount * (this.formCache?.displayType == \"header\" ? this.currentHeaderStyle.headerItemHeight : this.currentHeaderStyle.headerItemHeight * 0.8) + this.currentHeaderStyle.headerPadding * 2 + gapCount * this.currentHeaderStyle.itemGap}px`,\n \"min-height\": \"60px\",\n \"max-height\": \"30%\",\n };\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"headerHeight\")) {\n data.height = isNumeric(this.currentHeaderStyle.headerHeight)\n ? this.currentHeaderStyle.headerHeight + \"px\"\n : this.currentHeaderStyle.headerHeight;\n }\n if (Object.prototype.hasOwnProperty.call(this.currentHeaderStyle, \"maxHeaderHeight\")) {\n data[\"max-height\"] = isNumeric(this.currentHeaderStyle.maxHeaderHeight)\n ? this.currentHeaderStyle.maxHeaderHeight + \"px\"\n : this.currentHeaderStyle.maxHeaderHeight;\n }\n return data;\n }\n }\n },\n darwAreaStyle() {\n // 画布大小\n const headerStyle = this.headerStyle;\n const heightNum = pxToNumber(headerStyle.height);\n const minHeightNum = pxToNumber(headerStyle[\"min-height\"]);\n const maxHeightNum = this.percentorpxToNumber(headerStyle[\"max-height\"] || \"40%\");\n\n // 取较大值作为实际高度\n const actualHeight = Math.max(Math.min(heightNum, maxHeightNum), minHeightNum);\n return { top: `${actualHeight}px` };\n },\n },\n};\n</script>\n<style lang=\"scss\" scoped>\n.kd-lane-chart-container {\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 %common-lane-style {\n height: 100%;\n min-width: 0;\n flex-shrink: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n\n .kd-lane-resize-handle {\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 &:hover {\n background-color: var(--resizer-bg-color);\n }\n\n &.kd-lane-resize-handle-left {\n left: 0;\n }\n\n &.kd-lane-resize-handle-right {\n right: -2px;\n }\n }\n\n .kd-lane-chart-lane-header {\n overflow: hidden;\n z-index: 2;\n display: flex;\n flex-direction: column;\n justify-content: center;\n\n .header-list-gap {\n display: flex;\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n ::-webkit-scrollbar {\n display: none;\n }\n flex-direction: column;\n }\n }\n }\n\n .kd-lane-chart-lane-container,\n .kd-lane-chart-lane-slot-container {\n @extend %common-lane-style;\n }\n\n .kd-lane-chart-lane-container-echart {\n flex: 1;\n flex-shrink: 0;\n overflow: hidden;\n }\n\n .border-left {\n border-left: 1px solid var(--kd-lane-container-border-color, #333);\n }\n\n .border-bottom {\n border-bottom: 1px solid var(--kd-lane-container-border-color, #333);\n }\n\n .border-right {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n }\n\n .border-top {\n // border-top: 1px solid var(--kd-lane-container-border-color, #333);\n }\n\n .kd-lane-chart-container-draw-area {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n border: none;\n // background-color: #333;\n }\n}\n\n.custom-dialog-mask {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 999;\n opacity: 0;\n transition: opacity 0.3s ease;\n animation: fadeIn 0.3s ease forwards;\n}\n\n.custom-dialog {\n width: 50%;\n min-width: 800px;\n height: calc(100vh - 200px);\n background: var(--bg-color, #1e1e1e);\n border: 1px solid var(--card-border-color, #4b4b4b);\n border-radius: 0;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n opacity: 0;\n transform: scale(0.9);\n animation: zoomIn 0.3s ease forwards;\n}\n\n.custom-dialog.closing {\n animation: zoomOut 0.3s ease forwards;\n}\n\n.custom-dialog-mask.closing {\n animation: fadeOut 0.3s ease forwards;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n background-color: transparent;\n }\n to {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.5);\n }\n}\n\n@keyframes zoomIn {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes fadeOut {\n from {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.5);\n }\n to {\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes zoomOut {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.9);\n }\n}\n\n.custom-dialog__header {\n background: var(--dialog-header, #333333);\n padding: 10px 10px 10px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.custom-dialog__title {\n color: var(--dialog-header-text-color, #ffffff);\n font-size: 14px;\n font-weight: bold;\n}\n\n.custom-dialog__close {\n width: 24px;\n height: 24px;\n background: linear-gradient(270deg, #c73521 0%, #f86c59 100%);\n border: none;\n border-radius: 50%;\n color: #fff;\n font-size: 14px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.custom-dialog__body {\n padding: 30px 30px 10px 30px;\n max-height: calc(100vh - 200px);\n height: 100%;\n overflow-y: auto;\n}\n\n.custom-dialog__footer {\n padding: 10px 30px 15px;\n text-align: center;\n border-top: 1px solid var(--card-border-color, #4b4b4b);\n}\n</style>\n","<template>\n <div class=\"wrap\" ref=\"wrap\">\n <div class=\"header\">\n <el-radio-group v-model=\"mode\" class=\"radio-group\" @change=\"handleModeChange\">\n <el-radio v-for=\"item in radioList\" :key=\"item.mode\" :value=\"item.mode\">{{ item.modeName }}</el-radio>\n </el-radio-group>\n </div>\n <!-- @wheel=\"handleWheel\" -->\n <div class=\"chart-wrap\" ref=\"chartWrap\">\n <div ref=\"chart\" class=\"chart\"></div>\n <div v-show=\"overlayReady\" class=\"label-float\" :style=\"labelFloatStyle\">\n <div class=\"label-card\">\n <div class=\"label-row\">{{ labelPos.line1 }}</div>\n <div class=\"label-row\">{{ labelPos.line2 }}</div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport * as echarts from \"echarts\";\nimport { cloneDeep } from \"lodash-es\";\nimport { colorToRGBA, getCssVariable } from \"../../util/index.js\";\nconst SLIDER_GROUP_ID = \"depthSliderGroup\";\n\nfunction pad2(n) {\n return n < 10 ? \"0\" + n : \"\" + n;\n}\n\nfunction formatDateTime(d) {\n if (!(d instanceof Date) || isNaN(d.getTime())) return \"\";\n return (\n d.getFullYear() +\n \"-\" +\n pad2(d.getMonth() + 1) +\n \"-\" +\n pad2(d.getDate()) +\n \" \" +\n pad2(d.getHours()) +\n \":\" +\n pad2(d.getMinutes()) +\n \":\" +\n pad2(d.getSeconds())\n );\n}\n\nfunction parseTimeLabel(s) {\n if (!s) return null;\n if (typeof s === \"string\") {\n const t = Date.parse(s.replace(/-/g, \"/\"));\n if (!isNaN(t)) return new Date(t);\n } else if (typeof s === \"number\" && !isNaN(s)) {\n // 判断是否为毫秒级时间戳\n if (s < 1000000000000) {\n s *= 1000;\n }\n return new Date(s);\n }\n return null;\n}\n\nfunction toMillisecondTimestamp(time) {\n if (!time && time !== 0) return null;\n\n // 处理 Date 对象\n if (time instanceof Date) {\n const ts = time.getTime();\n return !isNaN(ts) ? ts : null;\n }\n\n // 处理数字类型(时间戳)\n if (typeof time === \"number\" && !isNaN(time)) {\n let ts = time;\n // 判断是否为秒级时间戳(小于 1000000000000)\n if (ts < 1000000000000) {\n ts *= 1000;\n }\n // 验证时间戳是否合理(不早于 1970 年,不晚于 2100 年)\n if (ts >= 0 && ts <= 4102444800000) {\n return ts;\n }\n }\n\n // 处理字符串类型\n if (typeof time === \"string\") {\n // 尝试直接解析为数字\n const numTime = Number(time);\n if (!isNaN(numTime)) {\n return toMillisecondTimestamp(numTime);\n }\n\n // 尝试处理各种日期格式\n let formattedTime = time;\n\n // 处理 ISO 8601 格式\n // 处理 \"YYYY-MM-DD\" 或 \"YYYY-MM-DD HH:mm:ss\" 等\n formattedTime = formattedTime.replace(/-/g, \"/\");\n\n // 尝试用 Date.parse 解析\n const parsed = Date.parse(formattedTime);\n if (!isNaN(parsed)) {\n return parsed;\n }\n\n // 尝试用 new Date 直接解析\n const date = new Date(time);\n const ts = date.getTime();\n if (!isNaN(ts)) {\n return ts;\n }\n }\n\n return null;\n}\n\nexport default {\n name: \"DepthTimeChart\",\n props: {\n depthTimeChartData: {\n type: Array,\n default: () => [],\n },\n formCache: {\n type: Object,\n default: () => {},\n },\n themeName: {\n type: String,\n default: \"gray\",\n },\n cachedCurveDatas: {\n type: Object,\n default: () => {},\n },\n },\n\n data() {\n return {\n chart: null,\n mode: \"\",\n sliderIndex: 0,\n zrDragBound: false,\n resizeHandler: null,\n overlayReady: false,\n labelPos: { line1: \"\", line2: \"\", left: 0, top: 0 },\n // 是否在滑动\n isDragging: false,\n // 滚动相关\n startIndex: 0,\n windowSize: 100000,\n targetStartIndex: 0,\n targetWindowSize: 30,\n minWindowSize: 10,\n maxWindowSize: 100,\n animationId: null,\n isCtrlPressed: false,\n wheelDelta: 0,\n // 滚动触底最新信息\n bottomInfo: {},\n // 滚动顶部最新信息\n topInfo: {},\n radioList: [],\n // 当前topValue\n topValue: null,\n // 当前bottomValue\n bottomValue: null,\n // 滑块平滑动画相关\n targetSliderIndex: 0,\n sliderAnimationId: null,\n // 缓存的曲线数据\n cachedCurveData: [],\n };\n },\n\n computed: {\n currentModeData() {\n // 如果有curveDatas数据,优先使用\n if (this.cachedCurveData && this.cachedCurveData.length > 0) {\n const modeConfig = this.getCurrentModeConfig();\n if (modeConfig && modeConfig.datas && modeConfig.datas.length > 0) {\n // 根据xCode和yCode构建series数据\n return {\n mode: this.mode,\n axisType: modeConfig.axisType,\n datas: modeConfig.datas.map((curveConfig) => {\n const xCode = curveConfig.xCode || \"timestamp\";\n const yCode = curveConfig.yCode;\n return {\n xName: curveConfig.xName,\n yName: curveConfig.yName,\n xCode: xCode,\n yCode: yCode,\n data: this.cachedCurveData.map((item) => ({\n time: item[xCode] || item.timestamp,\n value: item[yCode] || 0,\n })),\n };\n }),\n };\n }\n }\n\n // 降级到原始的depthTimeChartData\n const modeData = this.depthTimeChartData.find((item) => item.mode === this.mode);\n return modeData || { datas: [] };\n },\n resolvedRows() {\n const firstSeries = this.currentModeData.datas[0];\n const src = firstSeries && firstSeries.data ? firstSeries.data : [];\n if (!src.length) {\n return this.buildDefaultRows();\n }\n return this.mapRawToRows(src);\n },\n allSeriesData() {\n return this.currentModeData.datas.map((series) => {\n return {\n name: series.yName,\n data: series.data.map((item) => item.value),\n };\n });\n },\n labelFloatStyle() {\n return {\n left: `${this.labelPos.left}px`,\n top: `${this.labelPos.top}px`,\n };\n },\n },\n\n watch: {\n themeName: {\n handler() {\n this.$nextTick(() => {\n // this.clampSliderIndex();\n this.renderChart();\n });\n },\n },\n cachedCurveDatas: {\n deep: true,\n immediate:true,\n async handler(newVal) {\n if (!newVal) return;\n await this.$nextTick();\n\n const data = newVal && newVal.data ? (Array.isArray(newVal.data) ? newVal.data : [newVal.data]) : [];\n const direction = newVal.direction || \"bottom\";\n\n if (newVal.type === \"replace\") {\n // 替换模式:直接替换所有数据\n let processedData = data.map((item) => {\n const modeConfig = this.getCurrentModeConfig();\n if (modeConfig && modeConfig.datas && modeConfig.datas.length > 0) {\n const xCode = modeConfig.datas[0].xCode || \"timestamp\";\n return {\n ...item,\n [xCode]: this.toMillisecondTimestamp(item[xCode] || item.timestamp),\n };\n }\n return {\n ...item,\n timestamp: this.toMillisecondTimestamp(item.timestamp),\n };\n });\n\n this.cachedCurveData = processedData;\n\n // 当获取replace数据时,将页面定位到最后一条数据\n if (this.cachedCurveData.length > 0) {\n this.sliderIndex = this.cachedCurveData.length - 1;\n this.startIndex = Math.max(0, this.cachedCurveData.length - this.windowSize);\n this.targetStartIndex = this.startIndex;\n }\n } else {\n // 添加模式:根据direction插入数据\n let processedData = data.map((item) => {\n const modeConfig = this.getCurrentModeConfig();\n if (modeConfig && modeConfig.datas && modeConfig.datas.length > 0) {\n const xCode = modeConfig.datas[0].xCode || \"timestamp\";\n return {\n ...item,\n [xCode]: this.toMillisecondTimestamp(item[xCode] || item.timestamp),\n };\n }\n return {\n ...item,\n timestamp: this.toMillisecondTimestamp(item.timestamp),\n };\n });\n\n const modeConfig = this.getCurrentModeConfig();\n const uniqueKey = modeConfig && modeConfig.datas && modeConfig.datas.length > 0 \n ? (modeConfig.datas[0].xCode || \"timestamp\") \n : \"timestamp\";\n\n if (direction === \"top\") {\n const tempData = [...processedData, ...this.cachedCurveData];\n this.cachedCurveData = this.deduplicateByUniqueKey([], tempData, uniqueKey);\n } else {\n this.cachedCurveData = this.deduplicateByUniqueKey(this.cachedCurveData, processedData, uniqueKey);\n }\n }\n console.log(this.cachedCurveData, 'cachedCurveData');\n // 更新滑块位置\n if (this.cachedCurveData.length > 0 && newVal.type !== \"replace\") {\n this.sliderIndex = this.cachedCurveData.length - 1;\n this.startIndex = Math.max(0, this.cachedCurveData.length - this.windowSize);\n this.targetStartIndex = this.startIndex;\n }\n\n this.renderChart();\n },\n },\n depthTimeChartData: {\n deep: true,\n handler() {\n this.$nextTick(() => {\n // 数据变化时,滑块定位到最新数据\n const dataLength = this.resolvedRows.length;\n if (dataLength > 0) {\n this.sliderIndex = dataLength - 1;\n // 调整startIndex,使最新数据显示在视图底部\n this.startIndex = Math.max(0, dataLength - this.windowSize);\n this.targetStartIndex = this.startIndex;\n }\n // this.clampSliderIndex();\n this.renderChart();\n });\n },\n },\n },\n created() {},\n mounted() {\n this.radioList = this.depthTimeChartData.filter((item) => item.axisType === this.formCache.axisType);\n const target = this.depthTimeChartData.find((item) => item.axisType === this.formCache.axisType);\n this.mode = target ? target.mode : \"\";\n this.chart = echarts.init(this.$refs.chart);\n this.resizeHandler = new ResizeObserver(() => {\n if (this.chart) {\n this.chart.resize();\n }\n this.$nextTick(() => {\n this.refreshOverlayGeometry();\n this.syncSliderGraphicLayout();\n });\n });\n\n this.resizeHandler.observe(this.$refs.chartWrap);\n // this.chart.on(\"datazoom\", this.onDataZoom);\n\n // Add keyboard event listeners for Ctrl key\n window.addEventListener(\"keydown\", this.handleKeyDown);\n window.addEventListener(\"keyup\", this.handleKeyUp);\n\n this.$nextTick(() => {\n // 初始化滑块到最新数据\n const dataLength = this.resolvedRows.length;\n if (dataLength > 0) {\n this.sliderIndex = dataLength - 1;\n // 调整startIndex,使最新数据显示在视图底部\n this.startIndex = Math.max(0, dataLength - this.windowSize);\n this.targetStartIndex = this.startIndex;\n }\n this.renderChart();\n this.bindZrDrag();\n });\n },\n\n beforeUnmount() {\n this.unbindZrDrag();\n if (this.resizeHandler) {\n this.resizeHandler.disconnect();\n this.resizeHandler = null;\n }\n\n // 清理动画\n cancelAnimationFrame(this.animationId);\n cancelAnimationFrame(this.sliderAnimationId);\n\n // Remove keyboard event listeners\n window.removeEventListener(\"keydown\", this.handleKeyDown);\n window.removeEventListener(\"keyup\", this.handleKeyUp);\n\n if (this.chart) {\n this.chart.dispose();\n this.chart = null;\n }\n },\n methods: {\n // 获取当前mode的配置\n getCurrentModeConfig() {\n if (!this.mode) return null;\n return this.depthTimeChartData.find((item) => item.mode === this.mode);\n },\n\n deduplicateByUniqueKey(existingData, newData, uniqueKey) {\n const newDataArr = Array.isArray(newData) ? newData : [newData];\n\n let resultData = JSON.parse(JSON.stringify(existingData));\n\n const existingKeys = new Set(resultData.map((item) => item[uniqueKey]));\n\n newDataArr.forEach((newItem) => {\n if (!newItem || !newItem[uniqueKey]) return;\n\n if (!existingKeys.has(newItem[uniqueKey])) {\n resultData.push(newItem);\n existingKeys.add(newItem[uniqueKey]);\n }\n });\n\n resultData.sort((a, b) => a[uniqueKey] - b[uniqueKey]);\n\n return resultData;\n },\n\n handleModeChange() {\n this.resetData();\n this.visibleDataRangeChange({ firstValue: this.topValue, lastValue: this.bottomValue });\n },\n visibleDataRangeChange(data) {\n if (!data.firstValue && !data.lastValue) return;\n this.topValue = data.firstValue;\n this.bottomValue = data.lastValue;\n\n const rows = this.resolvedRows;\n if (!rows.length) return;\n\n let targetIndex = 0;\n\n if (this.formCache.axisType === \"time\") {\n // 时间轴模式\n const lastTs = toMillisecondTimestamp(data.lastValue);\n const firstTs = toMillisecondTimestamp(data.firstValue);\n const minTs = toMillisecondTimestamp(rows[0].raw.time);\n const maxTs = toMillisecondTimestamp(rows[rows.length - 1].raw.time);\n\n if (lastTs < minTs) {\n // lastValue 小于最小值,停留在顶部\n targetIndex = 0;\n } else if (lastTs > maxTs) {\n // lastValue 大于最大值,停留在底部\n targetIndex = rows.length - 1;\n } else {\n let averageTs = (firstTs + lastTs) / 2;\n // 在范围内,找最接近的位置\n let minDiff = Infinity;\n for (let i = 0; i < rows.length; i++) {\n const itemTs = toMillisecondTimestamp(rows[i].raw.time);\n const diff = Math.abs(itemTs - averageTs);\n if (diff < minDiff) {\n minDiff = diff;\n targetIndex = i;\n }\n }\n }\n } else {\n // 数值轴模式\n const lastValue = Number(data.lastValue);\n const firstValue = Number(data.firstValue);\n const minValue = rows[0].raw.value;\n const maxValue = rows[rows.length - 1].raw.value;\n\n if (lastValue < minValue) {\n // lastValue 小于最小值,停留在顶部\n targetIndex = 0;\n } else if (lastValue > maxValue) {\n // lastValue 大于最大值,停留在底部\n targetIndex = rows.length - 1;\n } else {\n let averageValue = (firstValue + lastValue) / 2;\n // 在范围内,找最接近的位置\n let minDiff = Infinity;\n for (let i = 0; i < rows.length; i++) {\n const itemValue = rows[i].raw.value;\n const diff = Math.abs(itemValue - averageValue);\n if (diff < minDiff) {\n minDiff = diff;\n targetIndex = i;\n }\n }\n }\n }\n\n // 将滑块定位到目标位置\n this.sliderIndex = targetIndex;\n this.smoothMoveSlider(targetIndex);\n\n // 更新标签\n if (this.formCache.axisType === \"time\") {\n const dt1 = parseTimeLabel(data.firstValue);\n const line1 = dt1 ? formatDateTime(dt1) : \"\";\n const dt2 = parseTimeLabel(data.lastValue);\n const line2 = dt2 ? formatDateTime(dt2) : \"\";\n this.labelPos.line1 = line1;\n this.labelPos.line2 = line2;\n } else {\n let firstIndex = rows.findIndex((item) => item.raw.value === data.firstValue);\n let lastIndex = rows.findIndex((item) => item.raw.value === data.lastValue);\n let firstValue = firstIndex !== -1 ? rows[firstIndex].raw.time : \"\";\n let lastValue = lastIndex !== -1 ? rows[lastIndex].raw.time : \"\";\n const dt1 = parseTimeLabel(firstValue);\n const line1 = dt1 ? formatDateTime(dt1) : \"\";\n const dt2 = parseTimeLabel(lastValue);\n const line2 = dt2 ? formatDateTime(dt2) : \"\";\n this.labelPos.line1 = line1;\n this.labelPos.line2 = line2;\n }\n\n // 重新绘制滑块,根据顶部和底部时间调整高度\n this.redrawSliderWithRange(data.firstValue, data.lastValue);\n },\n updateSettings(content) {\n let key = cloneDeep(content.key);\n if (key === \"axisType\") {\n this.radioList = this.depthTimeChartData.filter((item) => item.axisType === this.formCache.axisType);\n const target = this.depthTimeChartData.find((item) => item.axisType === this.formCache.axisType);\n this.mode = target ? target.mode : \"\";\n this.$nextTick(() => {\n this.resetData();\n });\n }\n },\n handleKeyDown(e) {\n if (e.ctrlKey && !this.isCtrlPressed) {\n this.isCtrlPressed = true;\n }\n },\n\n handleKeyUp(e) {\n if (!e.ctrlKey && this.isCtrlPressed) {\n this.isCtrlPressed = false;\n }\n },\n resetData() {\n this.isDragging = false;\n this.zrDragBound = false;\n this.resizeHandler = null;\n this.overlayReady = false;\n this.labelPos = { line1: \"\", line2: \"\", left: 0, top: 0 };\n this.isDragging = false;\n // 重置后将滑块定位到最新数据\n const dataLength = this.resolvedRows.length;\n if (dataLength > 0) {\n this.sliderIndex = dataLength - 1;\n // 调整startIndex,使最新数据显示在视图底部\n this.startIndex = Math.max(0, dataLength - this.windowSize);\n this.targetStartIndex = this.startIndex;\n } else {\n this.sliderIndex = 0;\n }\n // this.clampSliderIndex();\n this.renderChart();\n },\n handleWheel(e) {\n e.preventDefault();\n const dataLength = this.resolvedRows.length;\n this.wheelDelta = Math.sign(e.deltaY);\n const delta = Math.sign(e.deltaY);\n // ===== Ctrl:缩放 =====\n if (this.isCtrlPressed) {\n const anchorIndex = this.getAnchorIndexFromEvent(e);\n if (anchorIndex === null) return;\n const ratio = (anchorIndex - this.startIndex) / this.windowSize;\n const scale = 1 + delta * 0.2;\n let newWindowSize = this.windowSize * scale;\n newWindowSize = Math.max(this.minWindowSize, Math.min(newWindowSize, dataLength, this.maxWindowSize));\n\n // 赋值给 targetWindowSize\n this.targetWindowSize = Math.floor(newWindowSize);\n let calcStartIndex = anchorIndex - this.targetWindowSize * ratio;\n this.targetStartIndex = Math.floor(calcStartIndex);\n } else {\n const speed = Math.max(1, this.windowSize / 100);\n this.targetStartIndex = Math.floor(this.startIndex + delta * speed * 8);\n this.targetWindowSize = this.windowSize; // 滚动时不变,已是整数\n this.judgeScrollEdge();\n }\n const maxStart = Math.max(0, dataLength - this.targetWindowSize);\n this.targetStartIndex = Math.max(0, Math.min(this.targetStartIndex, maxStart));\n this.targetStartIndex = Math.floor(this.targetStartIndex);\n this.smoothRender();\n },\n getAnchorIndexFromEvent(e) {\n const container = this.$refs.chartWrap;\n if (!container) return null;\n const rect = container.getBoundingClientRect();\n\n let y = e.clientY - rect.top;\n const chartHeight = rect.height;\n\n if (y < 0 || y > chartHeight) return null;\n const ratio = y / chartHeight;\n const indexInWindow = ratio * this.windowSize;\n const anchorIndex = this.startIndex + indexInWindow;\n return Math.max(0, Math.min(anchorIndex, this.resolvedRows.length - 1));\n },\n judgeScrollEdge() {\n const dataLen = this.resolvedRows.length;\n if (!dataLen) return;\n\n // 方向:-1=向上,1=向下\n const delta = Math.sign(this.wheelDelta);\n\n if (this.startIndex <= 0 && delta === -1) {\n // 触顶\n let data = {\n currentData: this.resolvedRows[0],\n direction: \"top\",\n };\n if (JSON.stringify(data) !== JSON.stringify(this.topInfo)) {\n this.topInfo = data;\n this.$emit(\"depth-time-chart-scroll\", data);\n }\n return;\n }\n\n if (this.startIndex + this.windowSize >= dataLen && delta === 1) {\n // 触底\n const lastData = this.resolvedRows[dataLen - 1];\n let data = {\n currentData: lastData,\n direction: \"bottom\",\n };\n if (JSON.stringify(data) !== JSON.stringify(this.bottomInfo)) {\n this.bottomInfo = data;\n this.$emit(\"depth-time-chart-scroll\", data);\n }\n return;\n }\n },\n smoothRender() {\n cancelAnimationFrame(this.animationId);\n const animate = () => {\n const lerp = 0.5; // ⭐ 手感关键参数\n this.startIndex += (this.targetStartIndex - this.startIndex) * lerp;\n this.windowSize += (this.targetWindowSize - this.windowSize) * lerp;\n if (Math.abs(this.startIndex - this.targetStartIndex) < 0.5 && Math.abs(this.windowSize - this.targetWindowSize) < 0.5) {\n this.startIndex = this.targetStartIndex;\n this.windowSize = this.targetWindowSize;\n this.$nextTick(() => {\n this.resetData();\n });\n return;\n }\n this.$nextTick(() => {\n this.renderChart();\n });\n this.animationId = requestAnimationFrame(animate);\n };\n animate();\n },\n handleZrMouseMove(e) {\n if (!this.overlayReady) return;\n\n const { left, top } = this.labelPos;\n\n const labelWidth = this.$refs.chartWrap.offsetWidth; // 你是 100% 宽\n const rowH = 20;\n const gap = 2;\n const totalH = rowH * 2 + gap;\n\n const x = e.offsetX;\n const y = e.offsetY;\n\n const inX = x >= left && x <= left + labelWidth;\n const inY = y >= top && y <= top + totalH;\n if (inX && inY) {\n // 在 label 上\n this.showTooltipBySlider(false);\n } else {\n // 离开 label\n if (!this.isDragging) {\n this.showTooltipBySlider(true);\n }\n }\n },\n showTooltipBySlider(content) {\n if (!this.chart) return;\n\n this.chart.setOption({\n tooltip: {\n show: content,\n },\n });\n },\n onDataZoom() {\n this.$nextTick(() => {\n this.ensureVisible();\n this.refreshOverlayGeometry();\n this.syncSliderGraphicLayout();\n });\n },\n mapRawToRows(src) {\n return src.map((item) => {\n let yLabel;\n if (item.time != null) {\n // Convert timestamp to date string for yLabel\n if (typeof item.time === \"number\" || !isNaN(Number(item.time))) {\n const date = new Date(Number(item.time));\n yLabel = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")}`;\n } else {\n yLabel = String(item.time);\n }\n } else if (item.bitPos != null) {\n yLabel = String(item.bitPos);\n } else {\n yLabel = \"\";\n }\n return {\n yLabel,\n value: Number(item.value),\n raw: item,\n };\n });\n },\n\n buildDefaultRows() {\n const rows = [];\n const start = new Date(\"2026-02-02T12:00:00\");\n for (let i = 0; i < 100; i++) {\n const d = new Date(start.getTime() + i * 86400000);\n const y = d.getFullYear() + \"-\" + pad2(d.getMonth() + 1) + \"-\" + pad2(d.getDate());\n let v = 3600 + Math.sin(i / 8) * 280;\n if (i === 55) v = 520;\n rows.push({ yLabel: y, value: v, raw: { time: d.getTime(), value: v } });\n }\n return rows;\n },\n\n clampSliderIndex() {\n const n = this.resolvedRows.length;\n if (n === 0) {\n this.sliderIndex = 0;\n return;\n }\n // Ensure slider index is within the visible range\n const endIndex = Math.min(this.startIndex + this.windowSize, n);\n if (this.sliderIndex < this.startIndex) this.sliderIndex = this.startIndex;\n if (this.sliderIndex >= endIndex) this.sliderIndex = endIndex - 1;\n // Also ensure it's within overall bounds\n if (this.sliderIndex < 0) this.sliderIndex = 0;\n if (this.sliderIndex >= n) this.sliderIndex = n - 1;\n },\n\n getGridRect() {\n if (!this.chart) {\n return { x: 60, y: 40, width: 300, height: 400 };\n }\n try {\n const grid = this.chart.getModel().getComponent(\"grid\", 0);\n if (grid && grid.coordinateSystem && grid.coordinateSystem.getRect) {\n return grid.coordinateSystem.getRect();\n }\n } catch (e) {\n /* ignore */\n }\n const w = this.chart.getWidth();\n const h = this.chart.getHeight();\n return { x: 78, y: 12, width: Math.max(80, w - 96), height: Math.max(80, h - 48) };\n },\n\n pixelYForIndex(index) {\n const rows = this.resolvedRows;\n if (!this.chart || !rows.length) return null;\n const row = rows[index];\n if (!row) return null;\n const p = this.chart.convertToPixel({ gridIndex: 0 }, [row.value, row.raw.time]);\n return p ? p[1] : null;\n },\n\n nearestIndexByPixelY(py) {\n const rows = this.resolvedRows;\n if (!this.chart || !rows.length) return 0;\n let best = 0;\n let bestD = Infinity;\n for (let i = 0; i < rows.length; i++) {\n const y = this.pixelYForIndex(i);\n if (y == null) continue;\n const d = Math.abs(y - py);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n },\n\n findSliderGroup(el) {\n let cur = el;\n while (cur) {\n if (cur.id === SLIDER_GROUP_ID) return cur;\n cur = cur.parent;\n }\n return null;\n },\n\n bindZrDrag() {\n if (!this.chart || this.zrDragBound) return;\n const zr = this.chart.getZr();\n this._onZrDrag = (e) => {\n this.isDragging = true;\n const g = this.findSliderGroup(e.target);\n if (!g) return;\n const rect = this.getGridRect();\n if (typeof g.x === \"number\") g.x = rect.x;\n const idx = this.nearestIndexByPixelY(e.offsetY);\n const py = this.pixelYForIndex(idx);\n if (py != null && typeof g.y === \"number\") g.y = py;\n if (idx !== this.sliderIndex) {\n this.sliderIndex = idx;\n this.refreshOverlayGeometry();\n this.emitSliderPoint();\n }\n this.showTooltipBySlider(false);\n };\n this._onZrDragEnd = (e) => {\n this.isDragging = false;\n const g = this.findSliderGroup(e.target);\n if (!g) return;\n const rect = this.getGridRect();\n g.x = rect.x;\n const idx = this.nearestIndexByPixelY(e.offsetY);\n const py = this.pixelYForIndex(idx);\n if (py != null) g.y = py;\n this.sliderIndex = idx;\n this.emitSliderChanging();\n this.refreshOverlayGeometry();\n this.emitSliderPoint();\n this.showTooltipBySlider(true);\n };\n this._onZrClick = (e) => {\n // 点击时移动滑块到点击位置\n const g = this.findSliderGroup(e.target);\n if (g) return; // 点击在滑块上,不处理\n\n const rect = this.getGridRect();\n const y = e.offsetY;\n if (y < 0 || y > rect.height) return;\n\n const idx = this.nearestIndexByPixelY(y);\n if (idx !== this.sliderIndex) {\n this.sliderIndex = idx;\n this.smoothMoveSlider(idx);\n this.emitSliderChanging();\n this.refreshOverlayGeometry();\n this.emitSliderPoint();\n this.showTooltipBySlider(true);\n }\n };\n zr.on(\"drag\", this._onZrDrag);\n zr.on(\"dragend\", this._onZrDragEnd);\n zr.on(\"click\", this._onZrClick);\n this.zrDragBound = true;\n },\n emitSliderChanging() {\n const row = this.resolvedRows[this.sliderIndex];\n if (!row) return;\n\n const allValues = this.currentModeData.datas.map((series) => {\n const seriesData = series.data[this.sliderIndex];\n return {\n name: series.yName,\n value: seriesData ? seriesData.value : null,\n };\n });\n\n this.$emit(\"depthTimeChange\", {\n x: row.value,\n y: row.raw.time,\n allValues,\n });\n },\n\n unbindZrDrag() {\n if (!this.chart || !this.zrDragBound) return;\n const zr = this.chart.getZr();\n zr.off(\"drag\", this._onZrDrag);\n zr.off(\"dragend\", this._onZrDragEnd);\n zr.off(\"click\", this._onZrClick);\n this.zrDragBound = false;\n },\n\n labelTexts(index) {\n const rows = this.resolvedRows;\n const row = rows[index];\n if (!row) return { line1: \"\", line2: \"\" };\n const dt = parseTimeLabel(row.raw.time);\n const timeStr = dt ? formatDateTime(dt) : row.yLabel;\n return { line1: timeStr, line2: timeStr };\n },\n ensureVisible() {\n const rows = this.resolvedRows;\n if (!rows.length) return;\n\n const option = this.chart.getOption();\n const dz = option.dataZoom && option.dataZoom[0] ? option.dataZoom[0] : null;\n if (!dz) return;\n\n const total = rows.length;\n const start = dz.start ?? 0;\n const end = dz.end ?? 100;\n\n const visibleStart = Math.floor((start / 100) * total);\n const visibleEnd = Math.ceil((end / 100) * total);\n\n if (this.sliderIndex < visibleStart || this.sliderIndex > visibleEnd) {\n const percent = (this.sliderIndex / total) * 100;\n this.chart.dispatchAction({\n type: \"dataZoom\",\n start: percent - 5,\n end: percent + 5,\n });\n }\n },\n\n refreshOverlayGeometry() {\n if (!this.chart) return;\n\n const rect = this.getGridRect();\n const py = this.pixelYForIndex(this.sliderIndex);\n\n // const { line1, line2 } = this.labelTexts(this.sliderIndex);\n\n const rowH = 23;\n const gap = 2;\n const totalH = rowH * 2 + gap;\n\n const top = py != null ? py - totalH / 2 : rect.y;\n\n // this.labelPos = {\n // line1,\n // line2,\n // left: rect.x,\n // top: top,\n // };\n this.labelPos.top = top;\n this.labelPos.left = rect.x;\n },\n\n buildSliderGraphic() {\n const rows = this.resolvedRows;\n const rect = this.getGridRect();\n if (!rows.length || !this.chart) {\n return [];\n }\n this.clampSliderIndex();\n const py = this.pixelYForIndex(this.sliderIndex);\n if (py == null) return [];\n const lineW = rect.width;\n const handleW = 20;\n const handleH = 28;\n\n // 计算滑块高度 - 根据顶部时间和底部时间\n let sliderHeight = 0; // 默认高度\n if (this.topValue && this.bottomValue) {\n let topIndex = -1;\n let bottomIndex = -1;\n\n if (this.formCache.axisType === \"time\") {\n // 时间轴模式\n const topTs = toMillisecondTimestamp(this.topValue);\n const bottomTs = toMillisecondTimestamp(this.bottomValue);\n\n // 找最接近的顶部索引\n let minTopDiff = Infinity;\n for (let i = 0; i < rows.length; i++) {\n const itemTs = toMillisecondTimestamp(rows[i].raw.time);\n const diff = Math.abs(itemTs - topTs);\n if (diff < minTopDiff) {\n minTopDiff = diff;\n topIndex = i;\n }\n }\n\n // 找最接近的底部索引\n let minBottomDiff = Infinity;\n for (let i = 0; i < rows.length; i++) {\n const itemTs = toMillisecondTimestamp(rows[i].raw.time);\n const diff = Math.abs(itemTs - bottomTs);\n if (diff < minBottomDiff) {\n minBottomDiff = diff;\n bottomIndex = i;\n }\n }\n } else {\n // 数值轴模式\n const topValue = Number(this.topValue);\n const bottomValue = Number(this.bottomValue);\n\n // 找最接近的顶部索引\n let minTopDiff = Infinity;\n for (let i = 0; i < rows.length; i++) {\n const itemValue = rows[i].raw.value;\n const diff = Math.abs(itemValue - topValue);\n if (diff < minTopDiff) {\n minTopDiff = diff;\n topIndex = i;\n }\n }\n\n // 找最接近的底部索引\n let minBottomDiff = Infinity;\n for (let i = 0; i < rows.length; i++) {\n const itemValue = rows[i].raw.value;\n const diff = Math.abs(itemValue - bottomValue);\n if (diff < minBottomDiff) {\n minBottomDiff = diff;\n bottomIndex = i;\n }\n }\n }\n\n // 如果找到顶部和底部索引,计算高度\n if (topIndex !== -1 && bottomIndex !== -1) {\n const topY = this.pixelYForIndex(topIndex);\n const bottomY = this.pixelYForIndex(bottomIndex);\n if (topY != null && bottomY != null) {\n // 计算两个点之间的像素差\n const height = Math.abs(bottomY - topY);\n // 确保高度合理\n if (height > 10) {\n sliderHeight = height;\n }\n }\n }\n }\n return [\n {\n type: \"group\",\n id: SLIDER_GROUP_ID,\n name: \"depthSlider\",\n draggable: true,\n z: 120,\n x: rect.x,\n y: py,\n children: [\n {\n type: \"rect\",\n position: [0, -Math.max(48, sliderHeight) / 2],\n shape: { width: lineW + handleW, height: Math.max(48, sliderHeight) },\n style: { fill: \"rgba(255,255,255,.1)\" },\n z: 1,\n silent: false,\n },\n {\n type: \"line\",\n shape: { x1: 0, y1: 0, x2: lineW, y2: 0 },\n style: { stroke: getCssVariable(\"--split-line-color\"), lineWidth: 1 },\n z: 2,\n silent: true,\n },\n {\n type: \"group\",\n position: [lineW, -handleH / 2],\n z: 15,\n silent: true,\n children: [\n {\n type: \"rect\",\n shape: { width: handleW, height: handleH, r: 1 },\n style: {\n fill: new echarts.graphic.LinearGradient(0, 1, 0, 0, [\n { offset: 0, color: getCssVariable(\"--slider-gradient-start\") },\n { offset: 1, color: getCssVariable(\"--slider-gradient-end\") },\n ]),\n lineWidth: 1,\n },\n },\n {\n type: \"line\",\n shape: { x1: 3, y1: 7, x2: handleW - 3, y2: 7 },\n style: { fill: getCssVariable(\"--slider-content-color\"), stroke: getCssVariable(\"--slider-content-color\"), lineWidth: 1 },\n },\n {\n type: \"line\",\n shape: { x1: 3, y1: 13, x2: handleW - 3, y2: 13 },\n style: { fill: getCssVariable(\"--slider-content-color\"), stroke: getCssVariable(\"--slider-content-color\"), lineWidth: 1 },\n },\n {\n type: \"line\",\n shape: { x1: 3, y1: 19, x2: handleW - 3, y2: 19 },\n style: { fill: getCssVariable(\"--slider-content-color\"), stroke: getCssVariable(\"--slider-content-color\"), lineWidth: 1 },\n },\n ],\n },\n ],\n },\n ];\n },\n\n syncSliderGraphicLayout() {\n if (!this.chart) return;\n\n const graphic = this.buildSliderGraphic();\n\n this.chart.setOption(\n { graphic },\n { replaceMerge: [\"graphic\"] }, // ⭐关键\n );\n },\n\n // 快速重新绘制滑块,高度根据 topValue 和 bottomValue 计算\n redrawSliderWithRange(topValue, bottomValue) {\n if (!this.chart) return;\n\n // 更新顶部和底部值\n this.topValue = topValue;\n this.bottomValue = bottomValue;\n\n // 重新构建并同步滑块图形\n const graphic = this.buildSliderGraphic();\n\n this.chart.setOption({ graphic }, { replaceMerge: [\"graphic\"] });\n },\n\n emitSliderPoint() {\n const rows = this.resolvedRows;\n const row = rows[this.sliderIndex];\n if (!row) return;\n\n const datas = this.currentModeData.datas || [];\n const allValues = datas.map((series) => {\n const seriesData = series.data && series.data[this.sliderIndex];\n return {\n name: series.yName,\n value: seriesData ? seriesData.value : null,\n raw: seriesData ? seriesData : null,\n };\n });\n\n const payload = {\n index: this.sliderIndex,\n mode: this.mode,\n yLabel: row.yLabel,\n value: row.value,\n raw: row.raw,\n allValues,\n };\n this.$emit(\"slider-point\", payload);\n },\n\n renderChart() {\n if (!this.chart) return;\n\n const rows = this.resolvedRows;\n const endIndex = Math.min(this.startIndex + this.windowSize, rows.length);\n // const visibleRows = rows.slice(this.startIndex, endIndex);\n\n // Slice series data based on startIndex and windowSize\n const seriesData = this.currentModeData.datas.map((series) => {\n return {\n name: series.yName,\n data: (series.data || []).slice(this.startIndex, endIndex).map((item) => [item.value, item.time]),\n };\n });\n\n // this.clampSliderIndex();\n\n // Calculate max value from all series data\n let maxValue = 0;\n seriesData.forEach((series) => {\n if (series.data.length > 0) {\n const seriesMax = Math.max(...series.data.map((item) => item[0]));\n if (seriesMax > maxValue) {\n maxValue = seriesMax;\n }\n }\n });\n maxValue = Math.ceil(maxValue * 1.1);\n\n const colors = [\"#ffd54f\", \"#4caf50\", \"#2196f3\", \"#f44336\", \"#9c27b0\"];\n\n const option = {\n animation: false,\n grid: {\n left: 10,\n right: 20,\n top: 0,\n bottom: 0,\n containLabel: true,\n },\n tooltip: {\n show: true,\n extraCssText: \"pointer-events: none;\",\n trigger: \"axis\",\n appendTo: this.$refs.wrap,\n axisPointer: {\n show: false,\n type: \"line\",\n lineStyle: { color: getCssVariable(\"--split-line-color\"), width: 1 },\n },\n borderWidth: 0,\n backgroundColor: getCssVariable(\"--tooltip-bg-color\"),\n textStyle: { color: getCssVariable(\"--default-text-color\"), fontSize: 12 },\n formatter: (params) => {\n const axis = \"时间\";\n let result = `<div>${axis}:${formatDateTime(parseTimeLabel(params[0].axisValue))}</div>`;\n params.forEach((param) => {\n result += `<div>${param.seriesName}:${param.data[0]}</div>`;\n });\n return result;\n },\n },\n xAxis: {\n type: \"value\",\n min: 0,\n max: maxValue,\n splitNumber: 10,\n axisLine: {\n show: true,\n lineStyle: { color: getCssVariable(\"--split-line-color\"), width: 1 },\n },\n axisLabel: {\n fontSize: 12,\n color: getCssVariable(\"--default-text-color\"),\n margin: 10,\n formatter(value) {\n if (value === 0 || value === maxValue) return String(value);\n return \"\";\n },\n },\n splitLine: {\n show: false,\n },\n },\n yAxis: {\n type: \"time\",\n boundaryGap: false,\n inverse: true,\n axisLine: { show: false },\n axisLabel: {\n fontSize: 12,\n color: colorToRGBA(getCssVariable(\"--default-text-color\"), 0.8),\n margin: 12,\n inside: true,\n showMinLabel: false,\n showMaxLabel: false,\n formatter: function (value) {\n const date = new Date(value);\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}-${String(date.getDate()).padStart(2, \"0\")}`;\n },\n },\n axisTick: {\n show: true,\n length: 4,\n inside: true,\n lineStyle: { color: \"#3a3a3a\", width: 1 },\n },\n splitLine: {\n show: false,\n lineStyle: {\n color: \"rgba(255,255,255,0.055)\",\n width: 1,\n },\n },\n },\n series: seriesData.map((series, index) => {\n return {\n type: \"line\",\n name: series.name,\n data: series.data,\n smooth: 0.12,\n symbol: \"none\",\n lineStyle: {\n color: colors[index % colors.length],\n width: 2,\n },\n areaStyle: {\n color: `rgba(${this.hexToRgb(colors[index % colors.length])}, 0.1)`,\n },\n };\n }),\n graphic: [],\n };\n\n this.$nextTick(() => {\n if (this.chart) {\n this.chart.setOption(option, { notMerge: true, lazyUpdate: true });\n this.overlayReady = false;\n this.chart.off(\"finished\", this._onChartFinished);\n this.chart.on(\"finished\", this._onChartFinished);\n }\n });\n },\n hexToRgb(hex) {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? `${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)}` : \"255, 202, 40\";\n },\n\n _onChartFinished() {\n this.chart.off(\"finished\", this._onChartFinished);\n const graphic = this.buildSliderGraphic();\n this.$nextTick(() => {\n if (this.chart) {\n this.chart.setOption({ graphic }, { replaceMerge: [\"graphic\"] });\n this.refreshOverlayGeometry();\n this.overlayReady = true;\n this.emitSliderPoint();\n }\n });\n },\n smoothMoveSlider(data) {\n if (!this.resolvedRows.length) return;\n\n let targetIndex = null;\n\n // 根据传入的不同数据类型确定目标索引\n if (typeof data === \"number\") {\n // 如果是数字,直接作为索引\n targetIndex = data;\n } else if (data.time !== undefined || data.value !== undefined) {\n // 如果是对象,根据 time 或 value 查找\n if (data.time !== undefined) {\n const timeTs = toMillisecondTimestamp(data.time);\n targetIndex = this.resolvedRows.findIndex((item) => {\n const itemTs = toMillisecondTimestamp(item.raw.time);\n return Math.abs(itemTs - timeTs) < 1000; // 1秒容差\n });\n }\n if (targetIndex === -1 && data.value !== undefined) {\n targetIndex = this.resolvedRows.findIndex((item) => item.raw.value === data.value);\n }\n }\n\n // 如果没找到索引,使用默认值\n if (targetIndex === null || targetIndex === -1) {\n targetIndex = 0;\n }\n\n // 确保索引在有效范围内\n targetIndex = Math.max(0, Math.min(targetIndex, this.resolvedRows.length - 1));\n\n this.targetSliderIndex = targetIndex;\n this.smoothSliderRender();\n },\n smoothSliderRender() {\n cancelAnimationFrame(this.sliderAnimationId);\n const animate = () => {\n const lerp = 0.3; // 滑块平滑系数,越小越平滑\n this.sliderIndex += (this.targetSliderIndex - this.sliderIndex) * lerp;\n\n // 当接近目标时,直接设置为目标值\n if (Math.abs(this.sliderIndex - this.targetSliderIndex) < 0.01) {\n this.sliderIndex = this.targetSliderIndex;\n this.$nextTick(() => {\n this.syncSliderGraphicLayout();\n this.refreshOverlayGeometry();\n this.emitSliderPoint();\n });\n return;\n }\n\n this.$nextTick(() => {\n this.syncSliderGraphicLayout();\n this.refreshOverlayGeometry();\n });\n\n this.sliderAnimationId = requestAnimationFrame(animate);\n };\n animate();\n },\n toMillisecondTimestamp,\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.wrap {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.header {\n flex-shrink: 0;\n padding: 4px 6px 8px 2px;\n display: flex;\n border-bottom: 1px solid var(--split-line-color);\n\n :deep(.radio-group) {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n row-gap: 8px;\n width: 100%;\n }\n\n :deep(.el-radio) {\n display: inline-flex;\n align-items: center;\n height: 22px;\n margin-right: 0;\n }\n\n :deep(.el-radio__input) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: 14px;\n width: 14px;\n }\n\n :deep(.el-radio__label) {\n display: inline-flex;\n align-items: center;\n line-height: 14px;\n height: 14px;\n padding-left: 8px;\n }\n}\n\n.chart-wrap {\n flex: 1;\n min-height: 200px;\n position: relative;\n overflow: hidden;\n}\n\n.chart {\n width: 100%;\n height: 100%;\n}\n\n.label-float {\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 // background-color: var(--label-float-bg-color);\n gap: 2px;\n}\n\n.label-card {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.label-row {\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}\n</style>\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2CAYAAACMRWrdAAAFnUlEQVRo3u1ZTWxUVRT+zptOp51pZZpOaWlGCgIFFIRgiCsNJi6MbFyyMRqgPygmJhrXNbJgQQQTSf9mGhaEuGkCK/9iMkhAoxAoJCIBTZEWO0Ch03ZsZzpzPxf3venr0JoZ7LzOkJ7Mz3v3vfvuO/ec7zvn3Assy7IUhUihB9h74MBGI8099jblkq/6OjtvFHLcskIrZii1KVFZ3zEW2AEFYc39S1KRiF4BUNqKAUCiciVGVr/BFAWVk0OoSEQLPqbhlM/TYYyVOYVkIUUc1M5w0lxOquaMYiJOEPBSWIyAOAszZzAGcdgRHWNFghDSQasZTllMtH7ylJEHtameOlZ0Ojo7mXmIw4oVhBX3t7YdFYofAKiwJlstUXKwpaX9LZNWpm/dvPFBJBJJlQDdy/SUf/07sYadUIRMe2ppUX501at8UPPi6wrCVdHzqI7/+cViK1UwV2Ta1eWJD6cnA1sQq9+J+Ip10PQhjK1oxr2VL3PUv1W8U8MJqPThksFYOHz8tjEzddI/9CMIzYRCiGYR7ZYN939CWTp5OhQKRUuKPETUIf/dCwKmrcxD/5NiqBSCIz8gnebhQo1fMMV6enr+cM2Mf+OPXhKQYo9hDdFzUp4cP93X1z1QknQvNA7X3vkeAkUb77Mheh5KyZGSjWO9vZ1ny6ceRKpHr4mFrZqH11AxHb0YDnedL+kALcCXtX+fy6QfwTtfCxQOlXzZcvPm72c2bMAtX+zWOkVIZXzoSijUfaYoFGtpbTsHSNCW+k2Gerq25tI3Eomkmps3H2q4892JtOEBRbryymJa2i6L6CwGABQ5FO7tfmWRLCbB4e0H18x4/JR0AmsvHZkguSXXl4vH4wOfHz02CvzDAx9/djHU3Zlz3/b299b98vwn1akyL8uTY9hx/ejiumKqws9UeY1IetqKsp5c+/p8Pqysq+t3u90TgUAA+fQFgOmKWqZclQAphcGYCJ+0Btm9+81T/68ykLwWF3JXjBRrVeZJJBgMThZ1PeZ0XWWbVAhyd8WcFdPJrCxFMZyZTiuhXlTFBBSQsiQWM6dTCkIeIoQImMfDF00tMb1FCmCxDNU6uuw564jMEwRGXhYDl8gTTQgULI7Neryrv7+/2SF0uSxXLGASLKQYmPI1es9cuH4qC9vZh/PAP7tBSBNFgPYIZo2HykYBXHknBnkGaJAuD/566SOCEEUCYpCk0HxJQodxmqGBBGjjaWUeZt2n+ypo7jWXEJR1TT9Y8KSZx7597zcZhlpjnacNNdbXbZbvIpxT4pMZIuFjFtEvlsGlxWqKIqAo61kwUzTqPU+xlnvMiZpdBNIK20fY29a2zaWM2axfGYPh8PHb8yomrvS7SV+yY6YqASPpQsVDbwTAawDgiQ1KmXsUFGtKYR0DJDQIRO+qMONSYk22FV0tyiZpntC0GoUwiDl9xTI4QIo7OT7LekqOxXwPdyVdM/AmfPAmfR0APl3QFR+tH0V02136Rqrw3Lcbreaf6387OYgiEAWMWMfXmgZw75koNw+9gE3DW3LAmJmWiWBXS2u7uVGCohAB0NLavkd7DCkLJEMLkkd81QQH3r4IpikUkiSgIAqk/sz9AgCVdiwqitlGRQWLAax2ivZdKgqhn23vk7kP5lWTPZTKjDPnes4BWgzR9xMCYxa0NFGdsaoZXAQi9nOdfmnwiBV/aO7+yQIxQfuITtnEgl0mOTD/ZJ5uMm/RUTY/sxOVj7xo/PVZ2MBsiz8UW2zK8JW1vWe7D8w6N3/tHKe3BZkV4Gy5r/VS2VH6atNlxLxjecQxQlwJF6pGqq4AxocoSlHH3Kny7cT8rviYYr6RKtSjEe7JchAyFurtPFuMau1vaR9bfb+JgYk6BMbr/lsxoUR80eoOX7TaKhcGUaRCkROrH6yN2N8dy7IsxSf/Avx35qhCwuXeAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2CAYAAACMRWrdAAAN3UlEQVRo3u1aeVCV1xXPH51pZ5qZthHZHjs8VmXfBEXkqaAgoPBAdng7rlFcWCQKbokQUKlLXUBAFgMugCu4RI11pk5jlqk2YxOScdIkzSSktZW2zJzTc+7jwZMgD6Om2vrNnLn3u9/97vf97jn3nHPPuS+99OJ6cf1/XLm5ub9UaXTrjUmj0fzi+Qem0znkLVLirIrZRLOA60rlYvvnkUM/U6t10Wq1dqNKoz2jUuvuZC3PQdcOF5CecAauqzXaXmrvIu5tVWo0sXK5/OVnFpBanT9drdG1KLWa/pSihRBdFQ3hB8LBr9kXPds9hoC5tUth0mEvCN4bjFHbZLigUI4KnbqfwB7XaPJjnyFAgjs3M1ZlYdSeKPTumASep93B46QbenS5oXuXK7h1SNH1hAsSMHQ57gTOxxzB+agjOrY7gGObPUibnWHKjimQujINeSyVSpvwXwOkUqlsCFRXZkE2RhyKgElnPQV5nfEAz1PuOKnDC0JrQzFqhwxlVTNhEBhEVcowsjoSgvYFgWurCwNDhzY7sD9iC/atthhYE4AEEGjsS7m5Oocfm0tJynx1X/SuaPA5Nxm8z01CBuXTMRmjdkVhamEa0tph8bpK66xRrLFBYFznNlpjl1Ra7T35mhSMqIxAlyYntDtiA7atErBrtoEplWGg0JKIqnUZPwoojUZXkv1qLoa1TQHfHm/06Z6Mfid9YE7VHMxbrBrgn2aFsHTp0p8atOJI5WHQigZFo1Tr6hjE7PJodGlwBtsWCdi0WIPbfilkLM0GJSmipyt+ZIPS12Zi8KlA8D3vTcAmQ2RtJOYsUwzwz5F9ch5N3Q8CQ+lxZzQGNkKbWpLyqclenNsftD0IbZqtQdJsBQ519pi8Ss5crn5qoDLWZGFgtz/4XvABvx4fiH8jAVmd52k0IWPZMUW+CueVx8O8snjk+lh2TKHQ+pAI355TOhdsG23AutES7eptIGmV/MlzjjgRm70iD0NPBYP/BV/07/aFlNcWMqguUzZIvmjRy8UFOb2de6OhY080Fq3KvpuVlfVzU7aQx05cOx9tGiVg1WgB9rW2kL4sE5/YmmPNxIoiom0a+l/yhYBuPyRQQB9ui4yM/Ml4xqjZlHxz4LorMHF9PO/w2Cx+Aly9NVjWm6N0jwvbvHujifyja0AynHE18zDgkh/6X/TFxIpElvczI0HxBGi1WtloY1RvSL75zQV3ZOL6aH343ZHqnb/B348ujUHLegu0bDCHsM1hzLWex7RV2oTMNdkYfDEQAt72g5mHZpI7pOsdKX78Q9tKU3obKueweo4eZX0WaGj2mbg+mpFvrJx7n8cYCU5oTlpzQRVBaHnInAlSXl3I4JIew15pb85slkHg2/4YdD4Ac5cpcKSi4B95o1Te++VZKfadd4TGypj7xuDUarUXTZCSzQSTUpOfo1Dkuz0IKrq/74IjfHVWCm+UyL8HTqHV+uQsUg7YHpSgRf1E8NzhwUvhzg8CpdTpwjPXZmPQ5QAIvOwP8VWkAVW6/d/rRxrutdXpt3s73ejHHKGmPKFf72bpMnimC1fm4IFtiXB8dwwc2xWDtRUJyG08aaIP9eV3+N1POtywdHVG72hak02BbIMMGJj5ITNIXpGKo0nHeLyLurn75jIwDOkJAjK+/eRGWTxEi1mWrkq/vX1D4j3iSCy7WptL0vDW8WD4929dceC6FAzKw0AftIdgeWEGu049xNHUqvXz+3mMh5kC/oZSpx6QHLQWwAJfD+TJOf7IWw92d6b0hELQlQCI2R9jchDxYVIAzKW2nTHwjyuu+M93pPDPd1xAX0rF/b+uEVHZf1WK96+6wls1MUDr7kN+92ETZzzZYVvCwLzODK33WwL94wBvZMcNjDVUegl5GFcCBcfSSjLGxXbetjRVz4X7V1wGyVlQdVkyLlusEsT14ecuNAHO0PBmLHOuZTw7CTmJIAObWDcB4leThn6UnQB7GQk7EhkYhFwI5pnpZy6a2o8VrsyGb89L8d7bzvB3Ii7/dskZX1+XgrzXYuK6of3eYJ++C1Kgd5HHMGnb1No+m30SnFg7AcM3TmVubzWtMEi+9RtG7dXZh2dh8NVAkLVEsRjeFu2DxCLDImCgReRd0Gy2ndkXgd9dcMI+or9edAKuf0flVgJjeHdrSYro852hDxGX3QemAYs7j2U8tvAhjb7NSse7yhsYmOd2oR2vc/uY4QbmVA65TmmlGTDtdDiwKMpaZLBwXToaiFU+q+y1r6bjrvKZ8Ouymbg4X9FFYnjv89NS4pgjfNMjCL/tcYBvqc5gjIFxH27Xlw7U1wHunnIDHmPZ4rwuw7hrlmcwp3PIMcYFq5Nx/qokQX4VvkIUbffYYGLBAkxfkoX872MCi9+dACHvBAlixcFrjNU9G+iAi364YGuSAFa5bg7eJNVLhKuXp98oWJ6LX59zgL+cdUAmruvJHrYWp4AB2JbiFPz6gedDhCuW5omx9OOaAX+DgcWUzhVeB5PFoYlDa8ys9hUwO/gKTC2bOg5guxIw9FrwMLArejvGwNhXNACrKInBG7UT4EatGaxcmtFbUpCBX52xB6YvT9vjl0bl5uJhjm0ulou2Lwx9Bvvxe6TuoWBZ5idi3IMTsKI4Rg9s3RywatC7VAY7xqI4kYBNOPir8QEjcWC3CRkYK4+k15PR0GYgBqbW6uoMRO/tp5/Cz0/aCfrzKTswps1F8mFgVNf3sTXqo6/zGLyvMx6bgY38fmxhHIEyQ+ZYnk4l2sYEZqS27025FAKsPBKr5rPyWD6mDVOrfdfRT93ttIG7XbbD1KmnTUbAuC76ddoakY0gHoPdpzE1tlarjCZpMYgig3oEj17XO/VsuBDD2D2xJlWqAFaQjp+dsIFPj0sGSxv89IQEuL6xkIHp2pg2FSbDp9T2mSDJYKmncQFT6dZHbogU6t5mr4Q59cX47RgFWmRtUQLYzMMy014HASspSMOPj0oEfXJMAkwfH7UW9dN7AqG1aioynd4dOPiM+1mDoS9TSYFpYOwEBFQEiDUm3enMW6gbj8KxmtjfxApRDD8dBqZmRQCjkNmddmv4E9GdNmscqrdbwY0GF7hW5w7Xat3xd/VS5LY74pmhj74fjzEOYL3Ou52ARTF4SzBPet34OaZdlJqycaEw0OzdZ6/MJdclP2AsYMUU7PzoiBX88YglfvSWJZVWSHW+h7I1ySI2wlS+Jhk+estKkP4596N6qxXyGGMB451z5pLsIa0YUzyHXSrluIGlaTRmiiXqgZDLQQJYAm1ZaGYqTAG71WoJt1os4A/NlnirxVKUTGWrk4fsGIEE/TML1Pcb7m8amK5kxoYoZGDmZGayF+U9eoKD3SpZswx5nYWfDAOKyfc9zF80APuwyRw+OGxOpYWo6+8tCFgSO7l3mDasTkJu0z+3AH3dQtSLVjwcmNhx0JKQ7nZh7x48t3sKd+oHRKbyc1LXpw1tNOVlqQ+ofeYgbyMGqatoxUJ8v9Ec3iMjepMCL1Tie4P3l/c5wvk9UkFcF/2I3h8k0Zf68Rgc4xged1hKiFvauMJ4PbeI4tbOA1NmaIw9maYv/FSYCA2Ed4Rx2LqPxdSwiGtpb9S0LRCbiY5VTcZ36YPvHpoIvye3h+uiJE/h3XpuH0H13M9suB+V7W96i7GatgUgj83fMEoefuFKE8MuldNuR+Ksuu8Hp59oRtbKN6UIYET68IBa22YA1lrhC53kYXdUu2MnxSE6tnsg3aMo+b6a6tX6e0PZud1dvDNM7jD8jO4Hx2nd5ocGYMy9Wa/NFiE4BjanKJbtV8njJvHuRDVFIfuKgef9kaLBrP4L2J6IxMJTJHKvWlgEOVAqqbdiYOC105OXxF1T+0PTezTaHOYsV2Bwd6BwgkO7giF7uWKAok9JLz3li3fMOYvy+p0POArP3rrOEjOWZqHicUJvDyoSbXXKhlSkbQv4XfSFKSdCIWeZcoBn09S7vA7YaTam8awNjhuSg9vvtdtThLhZDOcVxpMm1O55YjMnIrIUTZpXHc/RYPCjpERIRxBSOonVeM1YYjGUlNhISYly00kJ/be0FRnLstGV0kiSw1bIiYnIjTN4fV96bBEcbeY5mhS7Iw4ZGKeR/M/S/mwj2yjt7YcFVQbTSDBafmzUPDaNlVA0Hx0POaCkyQqsD1vC9E2RbAZuGzTyE794YJ61pE3J6H/OVyT9mKbXRUD66kx2m64zQONZfSDxN0p+jDnE2RxWFhnLszB4Z5A+8ddkjXYNNkhxe2BH11Ro7okcd+CsJefKprSFgnf3JJjc7SXyzxEHI1Beksoi08fhNJVKs5j9zu8dh6AIsEpDz0TKVtvH6VpOrtu32oFdK6VrmyXovt8V5QU8lq7tRz0uwc4nRWb7Y9+MQ58zk2HyOQJ3Rp9c9znqjdP3RmDs1jiQF6WivDB1iGPJa1NQviYVY8vjIHxnOHocdoPB5DoSKHRqdMAZW2agUqehqLJp5fS0uGfJxjNnqQI5B+133BfFqYHTHuBBUaeh4xCdUjA6DoHiOASRU7sDHYmwF8Ccm5wgamsUZi3JE2lfnU4neQbOeiz24iQdz3IyxRBlNTIMaPFnYODWJTUGBi7HCBid8XBud4RJDV4wtXoaJhYvEO7aw/LYz8RxI1YeHNxhDarIV2PGiiyML0vQH4cgUZy3PgHTVmaSqKmFy8Qc56TEc3VwTBhnygOIQ2KVs4EPinGdPQrDcYnn9vqfPdb34npxje/6D2tGiPklmyCBAAAAAElFTkSuQmCC\"","<template>\n <div class=\"function-control-panel\">\n <!-- 单选1 -->\n <el-radio-group\n v-model=\"form.axisType\"\n class=\"radio-group\"\n @change=\"changeForm($event, 'axisType')\"\n v-if=\"currentToolBarConfig.timeDepthRadioShow !== false\"\n >\n <el-radio value=\"time\" :disabled=\"!currentToolBarConfig || !currentToolBarConfig.axisTypeList || !currentToolBarConfig.axisTypeList.time\">时间</el-radio>\n <el-radio value=\"depth\" :disabled=\"!currentToolBarConfig || !currentToolBarConfig.axisTypeList || !currentToolBarConfig.axisTypeList.depth\">深度</el-radio>\n </el-radio-group>\n\n <div class=\"divider\" v-if=\"currentToolBarConfig.timeDepthRadioShow !== false\" />\n\n <!-- 单选2 -->\n <el-radio-group\n v-model=\"form.dataType\"\n class=\"radio-group\"\n @change=\"changeForm($event, 'dataType')\"\n v-if=\"currentToolBarConfig.realHistoryRadioShow !== false\"\n >\n <el-radio value=\"real\" :disabled=\"!currentToolBarConfig || !currentToolBarConfig.dataTypeList || !currentToolBarConfig.dataTypeList.real\"\n >实时数据</el-radio\n >\n <el-radio value=\"history\" :disabled=\"!currentToolBarConfig || !currentToolBarConfig.dataTypeList || !currentToolBarConfig.dataTypeList.history\"\n >历史数据</el-radio\n >\n </el-radio-group>\n\n <div class=\"divider\" v-if=\"currentToolBarConfig.realHistoryRadioShow !== false\" />\n\n <!-- 单选3 -->\n <el-radio-group\n v-model=\"form.displayType\"\n class=\"radio-group\"\n @change=\"changeForm($event, 'displayType')\"\n v-if=\"currentToolBarConfig.headerFloatRadioShow !== false\"\n >\n <el-radio value=\"header\">表头数据</el-radio>\n <el-radio value=\"float\">悬浮数据</el-radio>\n </el-radio-group>\n\n <!-- select -->\n <div class=\"label\" v-if=\"currentToolBarConfig.scaleSelectShow !== false\">比例尺:</div>\n <el-tooltip\n :disabled=\"form.axisType === 'depth'\"\n content=\"时间轴类型下不支持设置比例尺\"\n placement=\"right\"\n effect=\"dark\"\n v-if=\"currentToolBarConfig.scaleSelectShow !== false\"\n >\n <div class=\"elTooltipArea\">\n <el-select\n v-model=\"form.scale\"\n popper-class=\"kd-curve-2d-select-popup\"\n :disabled=\"form.axisType !== 'depth'\"\n :class=\"{ 'el-select-disabled': form.axisType !== 'depth' }\"\n @change=\"changeForm($event, 'scale')\"\n style=\"margin-bottom: 8px; width: 100%\"\n >\n <el-option v-for=\"item in currentToolBarConfig.scaleList\" :key=\"item.value\" :label=\"item.label\" :value=\"item.value\" />\n </el-select>\n </div>\n </el-tooltip>\n\n <div class=\"label\" v-if=\"currentToolBarConfig.timeRangeSelectShow !== false\">时间范围:</div>\n <el-tooltip\n :disabled=\"!(form.axisType == 'depth')\"\n :content=\"getDisableTip('timeRange')\"\n placement=\"right\"\n effect=\"dark\"\n v-if=\"currentToolBarConfig.timeRangeSelectShow !== false\"\n >\n <div class=\"elTooltipArea\">\n <el-select\n v-model=\"form.timeRange\"\n popper-class=\"kd-curve-2d-select-popup\"\n :disabled=\"form.axisType == 'depth'\"\n :class=\"{ 'el-select-disabled': form.axisType == 'depth' }\"\n @change=\"changeForm($event, 'timeRange')\"\n style=\"margin-bottom: 8px; width: 100%\"\n >\n <el-option v-for=\"item in currentToolBarConfig.timeRangeList\" :key=\"item.value\" :label=\"item.label\" :value=\"item.value\" />\n </el-select>\n </div>\n </el-tooltip>\n\n <div class=\"label\" v-if=\"currentToolBarConfig.depthRangeSelectShow !== false\">井深范围(m):</div>\n <el-tooltip\n :disabled=\"!(form.axisType == 'time')\"\n :content=\"getDisableTip('depthRange')\"\n placement=\"right\"\n effect=\"dark\"\n v-if=\"currentToolBarConfig.depthRangeSelectShow !== false\"\n >\n <div class=\"elTooltipArea\">\n <el-select\n v-model=\"form.depthRange\"\n popper-class=\"kd-curve-2d-select-popup\"\n :disabled=\"form.axisType == 'time'\"\n :class=\"{ 'el-select-disabled': form.axisType == 'time' }\"\n @change=\"changeForm($event, 'depthRange')\"\n style=\"margin-bottom: 8px; width: 100%\"\n >\n <el-option v-for=\"item in currentToolBarConfig.depthRangeList\" :key=\"item.value\" :label=\"item.label\" :value=\"item.value\" />\n </el-select>\n </div>\n </el-tooltip>\n\n <div class=\"label\" v-if=\"currentToolBarConfig.wellSectionQueryShow !== false\">井段查询(m):</div>\n <el-tooltip\n v-if=\"currentToolBarConfig.wellSectionQueryShow !== false\"\n style=\"position: relative\"\n :disabled=\"!(form.axisType == 'depth')\"\n :content=\"getDisableTip('wellSectionQuery')\"\n placement=\"right\"\n effect=\"dark\"\n >\n <div class=\"elTooltipArea\">\n <el-input v-model=\"wellSectionQuery\" :disabled=\"form.axisType == 'depth'\" style=\"margin-bottom: 8px; flex: 1\"> </el-input>\n <div class=\"searchArea\" :class=\"{ 'el-select-disabled': form.axisType == 'depth' }\" @click=\"searchWellSection()\">\n <el-icon class=\"searchArea-icon\"><Search /></el-icon>\n </div>\n </div>\n </el-tooltip>\n\n <!-- 操作 -->\n <div class=\"actions\">\n <!-- 时间段按钮(打开弹窗) -->\n <!-- <el-tooltip\n :content=\"getDisableTip('timeSegment')\"\n :disabled=\"!(form.axisType == 'depth' || form.dataType == 'real')\"\n placement=\"right\"\n effect=\"dark\"\n > -->\n <el-tooltip placement=\"right\" effect=\"dark\" :disabled=\"true\" :content=\"''\" v-if=\"currentToolBarConfig.timeRangeBtnShow !== false\">\n <!-- <div\n class=\"btn\"\n @click=\"form.axisType == 'depth' || form.dataType == 'real' ? null : openTimeDialog()\"\n :class=\"{ disabled: form.axisType == 'depth' || form.dataType == 'real' }\"\n > -->\n <div class=\"btn\" @click=\"openTimeDialog()\">\n <!-- <SvgIcon iconClass=\"time-slot\" class=\"icon\" /> -->\n <img :src=\"timeSlotIcon\" alt=\"\" class=\"icon\" />\n <span>时间段</span>\n </div>\n </el-tooltip>\n\n <!-- 井深段按钮(打开弹窗) -->\n <!-- <el-tooltip\n placement=\"right\"\n effect=\"dark\"\n :disabled=\"!(form.axisType == 'time' || form.dataType == 'real')\"\n :content=\"getDisableTip('depthSegment')\"\n > -->\n <el-tooltip placement=\"right\" effect=\"dark\" :disabled=\"true\" :content=\"''\" v-if=\"currentToolBarConfig.depthRangeBtnShow !== false\">\n <!-- <div\n class=\"btn\"\n @click=\"form.axisType == 'time' || form.dataType == 'real' ? null : openDepthDialog()\"\n :class=\"{ disabled: form.axisType == 'time' || form.dataType == 'real' }\"\n > -->\n <div class=\"btn\" @click=\"openDepthDialog()\">\n <img :src=\"depthSlotIcon\" alt=\"井深段\" class=\"icon\" />\n <span>井深段</span>\n </div>\n </el-tooltip>\n <div\n class=\"divider\"\n style=\"margin-bottom: 0\"\n v-if=\"currentToolBarConfig.depthRangeBtnShow !== false || currentToolBarConfig.timeRangeBtnShow !== false\"\n />\n\n <div class=\"btn\" @click=\"emit('jumpToNextMarkLine')\" v-if=\"currentToolBarConfig.alertBtnShow !== false\">\n <img :src=\"warningPositioningIcon\" alt=\"预警定位\" class=\"icon\" />\n <span>预警定位</span>\n </div>\n\n <div class=\"divider\" style=\"margin-bottom: 0\" v-if=\"currentToolBarConfig.alertBtnShow !== false\" />\n\n <div class=\"btn\" @click=\"refresh\" v-if=\"currentToolBarConfig.refreshBtnShow !== false\">\n <img :src=\"refreshIcon\" alt=\"刷新\" class=\"icon\" />\n <span>刷新</span>\n </div>\n\n <div class=\"btn\" @click=\"exportData()\" v-if=\"currentToolBarConfig.exportBtnShow !== false\">\n <img :src=\"curveExportIcon\" alt=\"导出\" class=\"icon\" />\n <span>导出</span>\n </div>\n </div>\n\n <!-- 时间段弹窗 -->\n <div v-if=\"timeDialogVisible || timeDialogClosing\" class=\"custom-dialog-mask\" :class=\"{ closing: timeDialogClosing }\" @click.self=\"closeTimeDialog\">\n <div class=\"custom-dialog\" :class=\"{ closing: timeDialogClosing }\" style=\"width: 420px\">\n <div class=\"custom-dialog__header\">\n <span class=\"custom-dialog__title\">设置时间段</span>\n <button class=\"custom-dialog__close\" @click=\"closeTimeDialog\">×</button>\n </div>\n <div class=\"custom-dialog__body\">\n <el-form :model=\"timeDialog\" ref=\"TimeFormRef\" style=\"display: flex; flex-direction: column; gap: 16px\">\n <el-form-item prop=\"value\" :rules=\"[{ required: true, message: '请选择时间', trigger: 'change' }]\">\n <div style=\"display: flex; align-items: center; gap: 12px; height: 32px ; width: 100%;\">\n <div style=\"min-width: 50px; display: flex; align-items: center; height: 100% ; white-space: nowrap;\" class=\"fontColor\">时间:</div>\n <div style=\"flex: 1; height: 100%; display: flex; align-items: center\">\n <DatePicker\n v-model=\"timeDialog.value\"\n popper-class=\"kd-curve-2d-select-popup\"\n type=\"datetime\"\n placeholder=\"选择时间\"\n value-format=\"yyyy-MM-dd HH:mm:ss\"\n style=\"width: 100%; height: 100%\"\n />\n </div>\n </div>\n </el-form-item>\n </el-form>\n </div>\n <div class=\"custom-dialog__footer\">\n <el-button @click=\"closeTimeDialog\">取消</el-button>\n <el-button type=\"primary\" @click=\"confirmTimeDialog\">确定</el-button>\n </div>\n </div>\n </div>\n\n <!-- 井深段弹窗 -->\n <div v-if=\"depthDialogVisible || depthDialogClosing\" class=\"custom-dialog-mask\" :class=\"{ closing: depthDialogClosing }\" @click.self=\"closeDepthDialog\">\n <div class=\"custom-dialog\" :class=\"{ closing: depthDialogClosing }\" style=\"width: 420px\">\n <div class=\"custom-dialog__header\">\n <span class=\"custom-dialog__title\">设置井深段</span>\n <button class=\"custom-dialog__close\" @click=\"closeDepthDialog\">×</button>\n </div>\n <div class=\"custom-dialog__body\">\n <el-form :model=\"depthDialog\" ref=\"DepthFormRef\" style=\"display: flex; flex-direction: column; gap: 16px\">\n <el-form-item\n prop=\"start\"\n :rules=\"[\n { required: true, message: '请输入起始井深', trigger: 'blur' },\n { type: 'number', message: '请输入有效的数字', trigger: 'blur' },\n { validator: validateStartDepth, trigger: 'blur' },\n ]\"\n >\n <div style=\"display: flex; align-items: center; gap: 12px; height: 32px ; width: 100%;\">\n <div style=\"min-width: 80px; display: flex; align-items: center; height: 100% ; white-space: nowrap;\" class=\"fontColor\">起始井深:</div>\n <div style=\"flex: 1; height: 100%; display: flex; align-items: center\" class=\"input-number-container\">\n <InputNumber v-model=\"depthDialog.start\" :min=\"0\" :step=\"1\" style=\"width: 100%; height: 100%\" />\n </div>\n </div>\n </el-form-item>\n <el-form-item\n prop=\"end\"\n :rules=\"[\n { required: true, message: '请输入结束井深', trigger: 'blur' },\n { type: 'number', message: '请输入有效的数字', trigger: 'blur' },\n { validator: validateEndDepth, trigger: 'blur' },\n ]\"\n >\n <div style=\"display: flex; align-items: center; gap: 12px; height: 32px ; width: 100%;\">\n <div style=\"min-width: 80px; display: flex; align-items: center; height: 100% ; white-space: nowrap;\" class=\"fontColor\">结束井深:</div>\n <div style=\"flex: 1; height: 100%; display: flex; align-items: center\" class=\"input-number-container\">\n <InputNumber v-model=\"depthDialog.end\" :min=\"0\" :step=\"1\" style=\"width: 100%; height: 100%\" />\n </div>\n </div>\n </el-form-item>\n </el-form>\n </div>\n <div class=\"custom-dialog__footer\">\n <el-button @click=\"closeDepthDialog\">取消</el-button>\n <el-button type=\"primary\" @click=\"confirmDepthDialog\">确定</el-button>\n </div>\n </div>\n </div>\n\n <!-- 导出弹框 -->\n <div v-if=\"exportDialogVisible || exportDialogClosing\" class=\"custom-dialog-mask\" :class=\"{ closing: exportDialogClosing }\" @click.self=\"closeExportDialog\">\n <div class=\"custom-dialog\" :class=\"{ closing: exportDialogClosing }\" style=\"width: 500px\">\n <div class=\"custom-dialog__header\">\n <span class=\"custom-dialog__title\">数据导出</span>\n <button class=\"custom-dialog__close\" @click=\"closeExportDialog\">×</button>\n </div>\n <div class=\"custom-dialog__body\">\n <Tabs v-model=\"exportName\" @tab-click=\"handleClickExport\" style=\"margin-top: -20px\">\n <TabPane label=\"时间\" name=\"time\"> </TabPane>\n <TabPane label=\"深度\" name=\"depth\"> </TabPane>\n </Tabs>\n <el-form\n v-if=\"exportName == 'time'\"\n :model=\"exportTimeDialog\"\n ref=\"ExportTimeFormRef\"\n style=\"display: flex; flex-direction: column; gap: 16px; margin-top: 16px\"\n >\n <el-form-item prop=\"range\" :rules=\"[{ required: true, message: '请选择时间范围', trigger: 'change' }]\">\n <div style=\"display: flex; align-items: center; gap: 12px; height: 32px\">\n <div style=\"min-width: 80px; display: flex; align-items: center; height: 100% ; white-space: nowrap;\" class=\"fontColor\">时间范围:</div>\n <div style=\"flex: 1; height: 100%; display: flex; align-items: center\">\n <DatePicker\n v-model=\"exportTimeDialog.range\"\n popper-class=\"kd-curve-2d-select-popup\"\n type=\"datetimerange\"\n range-separator=\"至\"\n start-placeholder=\"开始时间\"\n end-placeholder=\"结束时间\"\n value-format=\"yyyy-MM-dd HH:mm:ss\"\n style=\"width: 100%; height: 100%\"\n />\n </div>\n </div>\n </el-form-item>\n </el-form>\n <el-form\n v-if=\"exportName == 'depth'\"\n :model=\"exportDepthDialog\"\n ref=\"ExportDepthFormRef\"\n style=\"display: flex; flex-direction: column; gap: 16px; margin-top: 16px\"\n >\n <el-form-item\n prop=\"start\"\n :rules=\"[\n { required: true, message: '请输入起始井深', trigger: 'blur' },\n { type: 'number', message: '请输入有效的数字', trigger: 'blur' },\n { validator: validateExportStartDepth, trigger: 'blur' },\n ]\"\n >\n <div style=\"display: flex; align-items: center; gap: 12px; height: 32px ; width: 100%;\">\n <div style=\"min-width: 80px; display: flex; align-items: center; height: 100% ; white-space: nowrap;\" class=\"fontColor\">起始井深:</div>\n <div style=\"flex: 1; height: 100%; display: flex; align-items: center\" class=\"input-number-container\">\n <InputNumber v-model=\"exportDepthDialog.start\" :min=\"0\" :step=\"1\" style=\"width: 100%; height: 100%\" />\n </div>\n </div>\n </el-form-item>\n <el-form-item\n prop=\"end\"\n :rules=\"[\n { required: true, message: '请输入终止井深', trigger: 'blur' },\n { type: 'number', message: '请输入有效的数字', trigger: 'blur' },\n { validator: validateExportDepth, trigger: 'blur' },\n { validator: validateEndDepth, trigger: 'blur' },\n ]\"\n >\n <div style=\"display: flex; align-items: center; gap: 12px; height: 32px ; width: 100%;\">\n <div style=\"min-width: 80px; display: flex; align-items: center; height: 100% ; white-space: nowrap;\" class=\"fontColor\">终止井深:</div>\n <div style=\"flex: 1; height: 100%; display: flex; align-items: center\" class=\"input-number-container\">\n <InputNumber v-model=\"exportDepthDialog.end\" :min=\"0\" :step=\"1\" style=\"width: 100%; height: 100%\" />\n </div>\n </div>\n </el-form-item>\n </el-form>\n </div>\n <div class=\"custom-dialog__footer\">\n <el-button @click=\"closeExportDialog\">取消</el-button>\n <el-button type=\"primary\" @click=\"confirmExportDialog\">确定</el-button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport { Search } from \"@element-plus/icons-vue\";\nimport { ElDatePicker, ElInputNumber, ElTabPane, ElTabs } from \"element-plus\";\nimport { cloneDeep } from \"lodash-es\";\nimport curveExportIcon from \"../../../assets/images/curveExport.png\";\nimport depthSlotIcon from \"../../../assets/images/depthSlot.png\";\nimport refreshIcon from \"../../../assets/images/refresh.png\";\nimport timeSlotIcon from \"../../../assets/images/timeSlot.png\";\nimport warningPositioningIcon from \"../../../assets/images/warningPosition.png\";\nimport { isNumeric } from \"../../util/index.js\";\nexport default {\n name: \"ControlPanelDark\",\n components: {\n InputNumber: ElInputNumber,\n DatePicker: ElDatePicker,\n Tabs: ElTabs,\n TabPane: ElTabPane,\n Search,\n },\n provide() {\n return {\n handleToolBarDataChange: this.handleToolBarDataChange,\n };\n },\n props: {\n axisTypeList: {\n type: Object,\n default: () => ({}),\n },\n currentToolBarConfig: {\n type: Object,\n default: () => ({\n show: false,\n form: {},\n }),\n },\n initialFormCache: {\n type: Object,\n default: () => ({}),\n },\n },\n data() {\n return {\n // 图标\n timeSlotIcon,\n depthSlotIcon,\n warningPositioningIcon,\n refreshIcon,\n curveExportIcon,\n form: {\n axisType: \"\",\n dataType: \"\",\n displayType: \"\",\n scale: null,\n timeRange: null,\n depthRange: null,\n },\n // 弹窗状态与临时数据\n timeDialogVisible: false,\n depthDialogVisible: false,\n exportDialogVisible: false,\n // 弹窗关闭动画状态\n timeDialogClosing: false,\n depthDialogClosing: false,\n exportDialogClosing: false,\n timeDialog: {\n value: null, // single datetime value,value-format 为字符串\n },\n exportTimeDialog: {\n range: null,\n },\n exportDepthDialog: {\n start: null,\n end: null,\n },\n depthDialog: {\n start: null, // 起始井深\n end: null, // 结束井深\n },\n //数据导出选择的tab\n exportName: \"time\",\n // 新增:井段查询输入框\n wellSectionQuery: null,\n };\n },\n methods: {\n // 新增:井段查询\n searchWellSection() {\n console.log(this.wellSectionQuery, \"wellSectionQuery\");\n if (this.wellSectionQuery == null || !isNumeric(this.wellSectionQuery)) {\n this.$message.error(\"请输入有效的数字\");\n return;\n } else {\n if (this.wellSectionQuery < 0) {\n this.$message.error(\"输入的井段不能小于0m\");\n return;\n }\n this.$message.success(\"查询成功\");\n this.$emit(\"searchWellSection\", this.wellSectionQuery);\n this.wellSectionQuery = null;\n }\n },\n // 新增:刷新数据,重置为初始化时的数据\n refresh() {\n Object.keys(this.initialFormCache).forEach((key) => {\n this.form[key] = this.initialFormCache[key];\n });\n console.log(this.form, this.initialFormCache);\n this.$emit(\"refresh\");\n },\n handleToolBarDataChange(content) {\n let data = cloneDeep(content);\n if (this.form.axisType === \"depth\") {\n let depth = Number((data.lastValue - data.firstValue).toFixed(2));\n let depthList = this.currentToolBarConfig.depthRangeList.map((item) => item.value);\n this.form.depthRange = depthList.includes(depth) ? depth : depth + \"m\";\n } else if (this.form.axisType === \"time\") {\n // 判断传入时间戳是否为毫秒级时间戳\n if (data.lastValue > 1000000000000) {\n // 毫秒级时间戳,转换为秒级\n data.lastValue = data.lastValue / 1000;\n data.firstValue = data.firstValue / 1000;\n }\n let range = Number(((data.lastValue - data.firstValue) / 60).toFixed(2));\n let rangeList = this.currentToolBarConfig.timeRangeList.map((item) => item.value);\n this.form.timeRange = rangeList.includes(range) ? range : range > 60 ? Number((range / 60).toFixed(2)) + \"h\" : range + \"min\";\n }\n },\n\n // 修改表单\n changeForm(e, type) {\n console.log(\"表单修改\", e, type);\n this.$emit(\"updateForm\", {\n key: type,\n value: e,\n });\n },\n // 更新表单数据\n updateForm(form) {\n let oldVal = cloneDeep(form);\n this.form.axisType = oldVal.axisType || \"depth\";\n this.form.dataType = oldVal.dataType || \"history\";\n this.form.displayType = oldVal.displayType || \"header\";\n this.form.scale = oldVal.scale || 100;\n this.form.timeRange = oldVal.timeRange || 5;\n this.form.depthRange = oldVal.depthRange || 1000;\n },\n //这是数据导出\n exportData() {\n // 可根据需要预填充:这里示例不预填充(如需用 form 的值解析请在此处处理)\n this.exportDialogVisible = true;\n },\n confirmExportDialog() {\n // 表单校验\n const formRef = this.exportName === \"time\" ? this.$refs.ExportTimeFormRef : this.$refs.ExportDepthFormRef;\n if (formRef) {\n formRef.validate((valid) => {\n if (valid) {\n let emitData = null;\n if (this.exportName === \"time\") {\n if (!this.exportTimeDialog.range || this.exportTimeDialog.range.length !== 2) {\n this.$message && this.$message.warning ? this.$message.warning(\"请选择有效的时间范围\") : alert(\"请选择有效的时间范围\");\n return;\n }\n emitData = {\n type: 3,\n value: {\n start: this.toMsTimestamp(this.exportTimeDialog.range[0]),\n end: this.toMsTimestamp(this.exportTimeDialog.range[1]),\n },\n };\n } else if (this.exportName === \"depth\") {\n const s = Number(this.exportDepthDialog.start);\n const e = Number(this.exportDepthDialog.end);\n if (isNaN(s) || isNaN(e)) {\n this.$message && this.$message.warning ? this.$message.warning(\"请填写有效的井深值\") : alert(\"请填写有效的井深值\");\n return;\n }\n if (s >= e) {\n this.$message && this.$message.warning\n ? this.$message.warning(\"起始井深必须小于终止井深\")\n : alert(\"起始井深必须小于终止井深\");\n return;\n }\n emitData = { type: 4, value: { start: s, end: e } };\n }\n this.exportDialogVisible = false;\n // 在对话框关闭后再发射事件,避免潜在的冲突\n if (emitData) {\n this.$nextTick(() => {\n this.$emit(\"dialogFunction\", emitData);\n });\n }\n }\n });\n } else {\n // 没有表单引用时的备用校验\n let emitData = null;\n if (this.exportName === \"time\") {\n if (!this.exportTimeDialog.range || this.exportTimeDialog.range.length !== 2) {\n this.$message && this.$message.warning ? this.$message.warning(\"请选择有效的时间范围\") : alert(\"请选择有效的时间范围\");\n return;\n }\n emitData = {\n type: 3,\n value: {\n start: this.toMsTimestamp(this.exportTimeDialog.range[0]),\n end: this.toMsTimestamp(this.exportTimeDialog.range[1]),\n },\n };\n } else if (this.exportName === \"depth\") {\n const s = Number(this.exportDepthDialog.start);\n const e = Number(this.exportDepthDialog.end);\n if (isNaN(s) || isNaN(e)) {\n this.$message && this.$message.warning ? this.$message.warning(\"请填写有效的井深值\") : alert(\"请填写有效的井深值\");\n return;\n }\n if (s >= e) {\n this.$message && this.$message.warning ? this.$message.warning(\"起始井深必须小于终止井深\") : alert(\"起始井深必须小于终止井深\");\n return;\n }\n emitData = { type: 4, value: { start: s, end: e } };\n }\n this.exportDialogVisible = false;\n // 在对话框关闭后再发射事件,避免潜在的冲突\n if (emitData) {\n this.$nextTick(() => {\n this.$emit(\"dialogFunction\", emitData);\n });\n }\n }\n },\n handleClickExport(data) {\n this.exportName = data.name;\n // 切换tab时清空错误校验\n if (this.$refs.ExportTimeFormRef) {\n this.$refs.ExportTimeFormRef.clearValidate();\n }\n if (this.$refs.ExportDepthFormRef) {\n this.$refs.ExportDepthFormRef.clearValidate();\n }\n },\n emit(type, payload) {\n this.$emit(type, payload ?? this.form);\n },\n openTimeDialog() {\n // 可根据需要预填充:这里示例不预填充(如需用 form 的值解析请在此处处理)\n this.timeDialogVisible = true;\n },\n openDepthDialog() {\n // 可根据需要预填充:这里示例不预填充(如需用 form 的值解析请在此处处理)\n this.depthDialogVisible = true;\n },\n resetTimeDialog() {\n this.timeDialog.value = null;\n this.$nextTick(() => {\n if (this.$refs.TimeFormRef) {\n this.$refs.TimeFormRef.clearValidate();\n this.$refs.TimeFormRef.resetFields();\n }\n });\n },\n resetDepthDialog() {\n this.depthDialog.start = null;\n this.depthDialog.end = null;\n this.$nextTick(() => {\n if (this.$refs.DepthFormRef) {\n this.$refs.DepthFormRef.clearValidate();\n this.$refs.DepthFormRef.resetFields();\n }\n });\n },\n resetExportDialog() {\n this.exportTimeDialog.range = null;\n this.exportDepthDialog.start = null;\n this.exportDepthDialog.end = null;\n this.$nextTick(() => {\n // 使用 $nextTick 确保 DOM 更新后再操作表单\n if (this.$refs.ExportTimeFormRef) {\n this.$refs.ExportTimeFormRef.clearValidate();\n this.$refs.ExportTimeFormRef.resetFields();\n }\n if (this.$refs.ExportDepthFormRef) {\n this.$refs.ExportDepthFormRef.clearValidate();\n this.$refs.ExportDepthFormRef.resetFields();\n }\n });\n },\n toMsTimestamp(timeStr) {\n return new Date(timeStr).getTime();\n },\n confirmTimeDialog() {\n // 表单校验\n if (this.$refs.TimeFormRef) {\n this.$refs.TimeFormRef.validate((valid) => {\n if (valid) {\n if (!this.timeDialog.value) {\n this.$message && this.$message.warning ? this.$message.warning(\"请选择有效的时间\") : alert(\"请选择有效的时间\");\n return;\n }\n const emitData = {\n type: 2,\n value: this.toMsTimestamp(this.timeDialog.value),\n };\n this.timeDialogVisible = false;\n // 在对话框关闭后再发射事件,避免潜在的冲突\n this.$nextTick(() => {\n this.$emit(\"dialogFunction\", emitData);\n });\n }\n });\n } else {\n // 没有表单引用时的备用校验\n if (!this.timeDialog.value) {\n this.$message && this.$message.warning ? this.$message.warning(\"请选择有效的时间\") : alert(\"请选择有效的时间\");\n return;\n }\n const emitData = {\n type: 2,\n value: this.toMsTimestamp(this.timeDialog.value),\n };\n this.timeDialogVisible = false;\n // 在对话框关闭后再发射事件,避免潜在的冲突\n this.$nextTick(() => {\n this.$emit(\"dialogFunction\", emitData);\n });\n }\n },\n // 验证井深值大于0\n validateDepth(rule, value, callback) {\n if (value <= 0) {\n callback(new Error(\"井深值必须大于0\"));\n } else {\n callback();\n }\n },\n // 验证井深段弹窗中的起始井深值大于等于0\n validateStartDepth(rule, value, callback) {\n if (value < 0) {\n callback(new Error(\"起始井深值不能小于0\"));\n } else {\n callback();\n }\n },\n // 验证导出弹窗中的起始井深值大于等于0\n validateExportStartDepth(rule, value, callback) {\n if (value < 0) {\n callback(new Error(\"起始井深值不能小于0\"));\n } else {\n callback();\n }\n },\n // 验证导出弹窗中的终止井深值大于0\n validateExportDepth(rule, value, callback) {\n if (value <= 0) {\n callback(new Error(\"终止井深值必须大于0\"));\n } else {\n callback();\n }\n },\n // 验证终止井深大于起始井深\n validateEndDepth(rule, value, callback) {\n // 检查是井深段弹窗还是导出弹窗\n if (this.depthDialog.start !== null && this.depthDialog.end !== null) {\n // 井深段弹窗\n if (value <= this.depthDialog.start) {\n callback(new Error(\"结束井深必须大于起始井深\"));\n } else {\n callback();\n }\n } else if (this.exportDepthDialog.start !== null && this.exportDepthDialog.end !== null) {\n // 导出弹窗\n if (value <= this.exportDepthDialog.start) {\n callback(new Error(\"终止井深必须大于起始井深\"));\n } else {\n callback();\n }\n } else {\n callback();\n }\n },\n confirmDepthDialog() {\n // 表单校验\n if (this.$refs.DepthFormRef) {\n this.$refs.DepthFormRef.validate((valid) => {\n if (valid) {\n const start = Number(this.depthDialog.start);\n const end = Number(this.depthDialog.end);\n if (isNaN(start) || isNaN(end)) {\n this.$message && this.$message.warning ? this.$message.warning(\"请填写有效的井深值\") : alert(\"请填写有效的井深值\");\n return;\n }\n if (end <= start) {\n this.$message && this.$message.warning ? this.$message.warning(\"结束井深必须大于起始井深\") : alert(\"结束井深必须大于起始井深\");\n return;\n }\n const emitData = { type: 1, start, end };\n this.depthDialogVisible = false;\n // 在对话框关闭后再发射事件,避免潜在的冲突\n this.$nextTick(() => {\n this.$emit(\"dialogFunction\", emitData);\n });\n }\n });\n } else {\n // 兼容旧版本,当表单不存在时的处理\n const v = Number(this.depthDialog.value);\n if (isNaN(v)) {\n this.$message && this.$message.warning ? this.$message.warning(\"请填写有效的井深值\") : alert(\"请填写有效的井深值\");\n return;\n }\n const emitData = { type: 1, value: v };\n this.depthDialogVisible = false;\n // 在对话框关闭后再发射事件,避免潜在的冲突\n this.$nextTick(() => {\n this.$emit(\"dialogFunction\", emitData);\n });\n }\n },\n\n closeTimeDialog() {\n this.timeDialogClosing = true;\n setTimeout(() => {\n this.timeDialogVisible = false;\n this.timeDialogClosing = false;\n this.resetTimeDialog();\n }, 300);\n },\n closeDepthDialog() {\n this.depthDialogClosing = true;\n setTimeout(() => {\n this.depthDialogVisible = false;\n this.depthDialogClosing = false;\n this.resetDepthDialog();\n }, 300);\n },\n closeExportDialog() {\n this.exportDialogClosing = true;\n setTimeout(() => {\n this.exportDialogVisible = false;\n this.exportDialogClosing = false;\n this.resetExportDialog();\n }, 300);\n },\n // 获取禁用提示文本\n getDisableTip(type) {\n if (type === \"timeSegment\") {\n // if (this.form.axisType === \"depth\" && this.form.dataType === \"real\") {\n // return \"深度轴类型+实时数据不支持设置时间段\";\n // } else if (this.form.axisType === \"depth\") {\n // return \"深度轴类型不支持设置时间段\";\n // } else if (this.form.dataType === \"real\") {\n // return \"实时数据不支持设置时间段\";\n // }\n if (this.form.dataType === \"real\") {\n return \"实时数据不支持设置时间段\";\n }\n return \"\";\n } else if (type === \"depthSegment\") {\n // if (this.form.axisType === \"time\" && this.form.dataType === \"real\") {\n // return \"时间轴类型+实时数据不支持设置井深段\";\n // } else if (this.form.axisType === \"time\") {\n // return \"时间轴类型不支持设置井深段\";\n // } else if (this.form.dataType === \"real\") {\n // return \"实时数据不支持设置井深段\";\n // }\n if (this.form.dataType === \"real\") {\n return \"实时数据不支持设置井深段\";\n }\n return \"\";\n } else if (type == \"timeRange\") {\n // if (this.form.axisType === \"depth\" && this.form.dataType === \"real\") {\n // return \"深度轴类型+实时数据不支持设置时间范围\";\n // } else if (this.form.axisType === \"depth\") {\n // return \"深度轴类型不支持设置时间范围\";\n // } else if (this.form.dataType === \"real\") {\n // return \"实时数据不支持设置时间范围\";\n // }\n if (this.form.axisType === \"depth\") {\n return \"深度轴类型不支持设置时间范围\";\n }\n return \"\";\n } else if (type == \"wellSectionQuery\") {\n // if (this.form.axisType === \"depth\" && this.form.dataType === \"real\") {\n // return \"深度轴类型+实时数据不支持设置时间范围\";\n // } else if (this.form.axisType === \"depth\") {\n // return \"深度轴类型不支持设置时间范围\";\n // } else if (this.form.dataType === \"real\") {\n // return \"实时数据不支持设置时间范围\";\n // }\n if (this.form.axisType === \"depth\") {\n return \"深度轴类型不支持井段查询\";\n }\n return \"\";\n } else if (type == \"depthRange\") {\n // if (this.form.axisType === \"time\" && this.form.dataType === \"real\") {\n // return \"时间轴类型+实时数据不支持设置井深范围\";\n // } else if (this.form.axisType === \"time\") {\n // return \"时间轴类型不支持设置井深范围\";\n // } else if (this.form.dataType === \"real\") {\n // return \"实时数据不支持设置井深范围\";\n // }\n if (this.form.axisType === \"time\") {\n return \"时间轴类型不支持设置井深范围\";\n }\n return \"\";\n }\n return \"\";\n },\n },\n created() {\n this.form = cloneDeep(this.currentToolBarConfig.form);\n },\n};\n</script>\n<style lang=\"scss\" scoped>\n.function-control-panel {\n width: 100%;\n height: 100%;\n color: var(--text-color);\n font-size: 14px;\n padding: 4px 6px 8px 2px;\n box-sizing: border-box;\n overflow-x: hidden;\n overflow-y: auto;\n /* 隐藏滚动条 */\n scrollbar-width: none;\n -ms-overflow-style: none;\n &::-webkit-scrollbar {\n display: none;\n }\n\n :deep(.radio-group) {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n row-gap: 8px;\n width: 100%;\n padding-bottom: 8px;\n }\n\n :deep(.el-radio) {\n display: inline-flex;\n align-items: center;\n height: 22px;\n margin-right: 0;\n }\n\n :deep(.el-radio__input) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: 14px;\n width: 14px;\n }\n\n :deep(.el-radio__label) {\n display: inline-flex;\n align-items: center;\n line-height: 14px;\n height: 14px;\n padding-left: 8px;\n }\n\n :deep(.el-select) {\n width: 100%;\n // margin-bottom: 8px;\n }\n\n :deep(.el-input) {\n // margin-bottom: 8px;\n }\n\n .elTooltipArea {\n width: 100%;\n display: flex;\n align-items: stretch;\n\n :deep(.el-select),\n :deep(.el-input) {\n flex: 1;\n min-width: 0;\n }\n\n :deep(.el-select .el-select__wrapper) {\n width: 100%;\n }\n\n :deep(.el-input .el-input__wrapper) {\n border-right: none !important;\n border-radius: 0 !important;\n }\n\n .searchArea {\n flex-shrink: 0;\n width: 28px;\n height: 32px;\n margin-bottom: 8px;\n background: var(--slider-gradient-color);\n border: 1px solid var(--border-color);\n border-left: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-sizing: border-box;\n\n .searchArea-icon {\n font-size: 14px;\n color: var(--slider-content-color);\n }\n }\n }\n}\n.el-select-disabled {\n opacity: 0.5;\n cursor: not-allowed !important;\n}\n/* 分割线 */\n.divider {\n height: 1px;\n background: var(--border-color);\n margin-bottom: 8px;\n}\n\n/* label */\n.label {\n color: var(--card-label-color, #aaa);\n margin-bottom: 2px;\n font-size: 14px;\n line-height: 1.4;\n}\n\n/* 操作按钮 */\n.actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n text-align: center;\n font-family:\n Microsoft YaHei UI,\n Microsoft YaHei UI;\n font-weight: 400;\n cursor: pointer;\n .icon {\n width: 54px;\n height: 54px;\n }\n // 禁用状态样式\n &.disabled {\n color: #666;\n cursor: not-allowed;\n .icon {\n opacity: 0.5;\n }\n }\n}\n.fontColor {\n color: var(--default-text-color);\n}\n\n.custom-dialog-mask {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 999;\n opacity: 0;\n transition: opacity 0.3s ease;\n animation: fadeIn 0.3s ease forwards;\n}\n\n.custom-dialog {\n background: var(--bg-color);\n border: 1px solid var(--card-border-color);\n border-radius: 0;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n opacity: 0;\n transform: scale(0.9);\n animation: zoomIn 0.3s ease forwards;\n position: relative;\n z-index: 999;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n background-color: transparent;\n }\n to {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.5);\n }\n}\n\n@keyframes zoomIn {\n from {\n opacity: 0;\n transform: scale(0.9);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.custom-dialog-mask.closing {\n animation: fadeOut 0.3s ease forwards;\n}\n\n.custom-dialog.closing {\n animation: zoomOut 0.3s ease forwards;\n}\n\n@keyframes fadeOut {\n from {\n opacity: 1;\n background-color: rgba(0, 0, 0, 0.5);\n }\n to {\n opacity: 0;\n background-color: transparent;\n }\n}\n\n@keyframes zoomOut {\n from {\n opacity: 1;\n transform: scale(1);\n }\n to {\n opacity: 0;\n transform: scale(0.9);\n }\n}\n\n.custom-dialog__header {\n background: var(--dialog-header);\n padding: 10px 10px 10px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.custom-dialog__title {\n color: var(--dialog-header-text-color);\n font-size: 14px;\n font-weight: bold;\n}\n\n.custom-dialog__close {\n width: 24px;\n height: 24px;\n background: linear-gradient(270deg, #c73521 0%, #f86c59 100%);\n border: none;\n border-radius: 50%;\n color: #fff;\n font-size: 14px;\n font-weight: 700;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.custom-dialog__body {\n padding: 30px 30px 10px 30px;\n}\n\n.custom-dialog__footer {\n padding: 10px 30px 15px;\n text-align: center;\n border-top: 1px solid var(--card-border-color);\n}\n</style>\n","<template>\n <div class=\"echarts\"></div>\n</template>\n\n<style lang=\"scss\" scoped>\n.echarts {\n width: 100%;\n height: 100%;\n position: relative;\n}\n</style>\n\n<script>\n// eisc\nimport * as echarts from \"echarts\";\nimport { cloneDeep, debounce } from \"lodash-es\";\nimport { addListener, removeListener } from \"resize-detector\";\n\nconst INIT_TRIGGERS = [\"theme\", \"initOptions\", \"autoresize\"];\nconst REWATCH_TRIGGERS = [\"manualUpdate\", \"watchShallow\"];\n\nexport default {\n name: \"resizeEcharts\",\n props: {\n options: Object,\n theme: [String, Object],\n initOptions: Object,\n group: String,\n autoresize: Boolean,\n watchShallow: Boolean,\n manualUpdate: Boolean,\n enableCustomTheme: {\n type: Boolean,\n default: true,\n },\n skipClone: Boolean,\n },\n data() {\n return {\n lastArea: 0,\n graphic: echarts.graphic,\n _skipWatcher: false,\n };\n },\n watch: {\n group(group) {\n if (this.chart) {\n this.chart.group = group;\n }\n },\n },\n methods: {\n // provide an explicit merge option method\n mergeOptions(options, notMerge, lazyUpdate, skipClone) {\n if (this.manualUpdate) {\n this.manualOptions = options;\n }\n\n if (!this.chart) {\n this.init(options);\n } else {\n this._skipWatcher = true;\n this.delegateMethod(\"setOption\", this.getOptionsWithTheme(options, skipClone), notMerge, lazyUpdate);\n this.$nextTick(() => {\n this._skipWatcher = false;\n });\n }\n },\n // just delegates ECharts methods to Vue component\n // use explicit params to reduce transpiled size for now\n appendData(params) {\n this.delegateMethod(\"appendData\", params);\n },\n resize(options) {\n this.delegateMethod(\"resize\", options);\n },\n dispatchAction(payload) {\n this.delegateMethod(\"dispatchAction\", payload);\n },\n convertToPixel(finder, value) {\n return this.delegateMethod(\"convertToPixel\", finder, value);\n },\n convertFromPixel(finder, value) {\n return this.delegateMethod(\"convertFromPixel\", finder, value);\n },\n containPixel(finder, value) {\n return this.delegateMethod(\"containPixel\", finder, value);\n },\n showLoading(type, options) {\n this.delegateMethod(\"showLoading\", type, options);\n },\n hideLoading() {\n this.delegateMethod(\"hideLoading\");\n },\n getDataURL(options) {\n return this.delegateMethod(\"getDataURL\", options);\n },\n getConnectedDataURL(options) {\n return this.delegateMethod(\"getConnectedDataURL\", options);\n },\n clear() {\n this.delegateMethod(\"clear\");\n },\n dispose() {\n this.delegateMethod(\"dispose\");\n },\n delegateMethod(name, ...args) {\n if (!this.chart) {\n this.init();\n }\n return this.chart[name](...args);\n },\n delegateGet(methodName) {\n if (!this.chart) {\n this.init();\n }\n return this.chart[methodName]();\n },\n getArea() {\n return this.$el.offsetWidth * this.$el.offsetHeight;\n },\n getOptionsWithTheme(options, skipClone) {\n if (skipClone || this.skipClone) {\n return options;\n }\n return cloneDeep(options);\n },\n\n init(options) {\n if (this.chart) {\n return;\n }\n\n const chart = echarts.init(this.$el, this.theme, this.initOptions);\n\n if (this.group) {\n chart.group = this.group;\n }\n\n chart.setOption(this.getOptionsWithTheme(options || this.manualOptions || this.options || {}), true);\n\n Object.keys(this.$attrs).forEach((key) => {\n if (!key.startsWith(\"on\") || typeof this.$attrs[key] !== \"function\") {\n return;\n }\n const event = key.charAt(2).toLowerCase() + key.slice(3);\n const handler = this.$attrs[key];\n\n if (event.indexOf(\"zr:\") === 0) {\n chart.getZr().on(event.slice(3), handler);\n } else {\n chart.on(event, handler);\n }\n });\n\n if (this.autoresize) {\n this.lastArea = this.getArea();\n this.__resizeHandler = debounce(\n () => {\n if (this.lastArea === 0) {\n // emulate initial render for initially hidden charts\n this.mergeOptions({}, true);\n this.resize();\n this.mergeOptions(this.options || this.manualOptions || {}, true);\n } else {\n this.resize();\n }\n this.lastArea = this.getArea();\n this.notifySizeChange();\n },\n 100,\n { leading: true },\n );\n addListener(this.$el, this.__resizeHandler);\n }\n\n Object.defineProperties(this, {\n // Only recalculated when accessed from JavaScript.\n // Won't update DOM on value change because getters\n // don't depend on reactive values\n width: {\n configurable: true,\n get: () => {\n return this.delegateGet(\"getWidth\");\n },\n },\n height: {\n configurable: true,\n get: () => {\n return this.delegateGet(\"getHeight\");\n },\n },\n isDisposed: {\n configurable: true,\n get: () => {\n return !!this.delegateGet(\"isDisposed\");\n },\n },\n computedOptions: {\n configurable: true,\n get: () => {\n return this.delegateGet(\"getOption\");\n },\n },\n });\n\n this.chart = chart;\n this.$emit(\"chart-inited\", chart);\n },\n initOptionsWatcher() {\n if (this.__unwatchOptions) {\n this.__unwatchOptions();\n this.__unwatchOptions = null;\n }\n\n if (!this.manualUpdate) {\n this.__unwatchOptions = this.$watch(\n \"options\",\n (val, oldVal) => {\n if (!val || this._skipWatcher) {\n return;\n }\n if (!this.chart) {\n this.init(val);\n } else {\n this.chart.setOption(this.getOptionsWithTheme(val), val !== oldVal);\n if (this.group) {\n this.chart.group = this.group;\n }\n }\n },\n { deep: !this.watchShallow },\n );\n }\n },\n destroy() {\n if (this.autoresize) {\n removeListener(this.$el, this.__resizeHandler);\n }\n this.dispose();\n this.chart = null;\n },\n refresh() {\n if (this.chart) {\n this.destroy();\n this.init();\n }\n },\n notifySizeChange() {\n this.$emit(\"onSizeChange\", { width: this.$el.offsetWidth, height: this.$el.offsetHeight });\n },\n connect(group) {\n if (typeof group !== \"string\") {\n group = group.map((chart) => chart.chart);\n }\n echarts.connect(group);\n },\n disconnect(group) {\n echarts.disConnect(group);\n },\n getMap(mapName) {\n return echarts.getMap(mapName);\n },\n registerMap(mapName, geoJSON, specialAreas) {\n echarts.registerMap(mapName, geoJSON, specialAreas);\n },\n registerTheme(name, theme) {\n echarts.registerTheme(name, theme);\n },\n },\n created() {\n this.initOptionsWatcher();\n\n INIT_TRIGGERS.forEach((prop) => {\n this.$watch(\n prop,\n () => {\n this.refresh();\n },\n { deep: true },\n );\n });\n\n REWATCH_TRIGGERS.forEach((prop) => {\n this.$watch(prop, () => {\n this.initOptionsWatcher();\n this.refresh();\n });\n });\n },\n mounted() {\n // auto init if `options` is already provided\n if (this.options) {\n this.init();\n }\n this.notifySizeChange();\n },\n\n activated() {\n if (this.autoresize) {\n this.chart && this.chart.resize();\n }\n },\n unmounted() {\n if (this.chart) {\n this.destroy();\n }\n },\n};\n</script>\n","<template>\n <div\n class=\"kd-lane-chart-lane-container-echart\"\n ref=\"chartAreaWrap\"\n >\n <div class=\"kd-lane-chart-container\" ref=\"targetDom\">\n <chartContainer\n v-bind=\"{ ...$props, ...$attrs }\"\n ref=\"chartContainer\"\n @template-change=\"templateChange\"\n @line-change=\"lineChange\"\n @lane-width-change=\"laneWidthChange\"\n @params-change=\"paramsChange\"\n :visibleData=\"visibleData\"\n :headerData=\"headerData\"\n :lineRange=\"lineRange\"\n >\n <template v-for=\"lane in headerSlotName\" :key=\"lane.laneId\" v-slot:[lane.laneId]>\n <slot :name=\"lane.laneId\"></slot>\n </template>\n <template\n v-for=\"lane in currentTemplate && currentTemplate.lanes ? currentTemplate.lanes : []\"\n :key=\"`slotheader-${lane.laneId}`\"\n v-slot:[`slotheader-content-${lane.laneId}`]\n >\n <div\n v-if=\"$slots[`content${lane.laneId}`]\"\n @wheel=\"handleWheel\"\n class=\"kd-lane-chart-lane-container-echart-content\"\n :style=\"getLaneChartContentStyle(lane.laneId)\"\n >\n <slot :name=\"`content${lane.laneId}`\" :lane=\"lane\"></slot>\n </div>\n <div\n v-else\n @wheel=\"handleWheel\"\n class=\"kd-lane-chart-lane-container-echart-content\"\n :style=\"getLaneChartContentStyle(lane.laneId)\"\n >\n <resizeEcharts\n :key=\"lane.laneId\"\n :ref=\"(el) => setChartRef(lane.laneId, el)\"\n autoresize\n :options=\"getOptionsByLineId(lane.laneId)\"\n :group=\"group\"\n ></resizeEcharts>\n </div>\n </template>\n <template\n v-for=\"lane in currentTemplate && currentTemplate.lanes ? currentTemplate.lanes : []\"\n :key=\"`content-${lane.laneId}`\"\n v-slot:[`content-${lane.laneId}`]\n >\n <div\n v-if=\"$slots[`content${lane.laneId}`]\"\n @wheel=\"handleWheel\"\n class=\"kd-lane-chart-lane-container-echart-content\"\n :style=\"getLaneChartContentStyle(lane.laneId)\"\n >\n <slot :name=\"`content${lane.laneId}`\" :lane=\"lane\"></slot>\n </div>\n <div\n v-else\n @wheel=\"handleWheel\"\n class=\"kd-lane-chart-lane-container-echart-content\"\n :style=\"getLaneChartContentStyle(lane.laneId)\"\n >\n <resizeEcharts\n :key=\"lane.laneId\"\n :ref=\"(el) => setChartRef(lane.laneId, el)\"\n autoresize\n :options=\"getOptionsByLineId(lane.laneId)\"\n :group=\"group\"\n ></resizeEcharts>\n </div>\n </template>\n </chartContainer>\n </div>\n <div\n v-show=\"crosshairVisible\"\n class=\"kd-lane-crosshair-line\"\n :style=\"{ top: `${crosshairTop}px` }\"\n ></div>\n </div>\n</template>\n\n<script>\nimport * as echarts from \"echarts\";\nimport { cloneDeep, debounce } from \"lodash-es\";\nimport chartContainer from \"../../kdLaneChart/kd-lane/chart-container.vue\";\nimport { getAdaptedFontSize, getAttrGap, getCssVariable, splitArrayByDepth } from \"../../util/index.js\";\nimport resizeEcharts from \"../resizeEcharts/index.vue\";\nexport default {\n name: \"LineChartContainer\",\n components: {\n resizeEcharts,\n chartContainer,\n },\n props: {\n config: {\n type: Object,\n default: () => ({}),\n },\n formCache: {\n type: Object,\n default: () => ({}),\n },\n isKdCurveV2: {\n type: Boolean,\n default: false,\n },\n itemGap: {\n type: Number,\n default: 4,\n },\n cachedCurveDatas: {\n type: Object,\n default: () => ({}),\n },\n // 头部样式\n currentHeaderStyle: {\n type: Object,\n default: () => ({\n headerPadding: 4,\n headerItemHeight: 42,\n itemGap: 4,\n }),\n },\n customMenuList: {\n type: Array,\n default: () => [],\n },\n themeName: {\n type: String,\n default: \"\",\n },\n headerSlotName: {\n type: Array,\n default: () => [],\n },\n contentSlotName: {\n type: Array,\n default: () => [],\n },\n currentToolBarConfig: {\n type: Object,\n default: () => ({}),\n },\n parameterPanelConfig: {\n type: Object,\n default: () => ({\n show: false,\n columns: 1,\n data: [],\n }),\n },\n WellBitDepthTimePlotConfig: {\n type: Object,\n default: () => ({\n show: false,\n data: [],\n }),\n },\n // 预警数据\n warningData: {\n type: Array,\n default: () => [],\n },\n // 预警区域数据\n warningAreaData: {\n type: Array,\n default: () => [],\n },\n // 自定义tooltip formatter\n tooltipFormatter: {\n type: Function,\n },\n // 实时曲线menu右击是否开启\n showContextMenuStatus: {\n type: Boolean,\n default: true,\n },\n },\n data() {\n return {\n laneWidthMap: null,\n treeTemplates: null,\n isLoading: false,\n strategy: null,\n currentTemplate: {},\n curveConfigVisible: false,\n params: [],\n contextItem: undefined,\n realTimeData: [],\n nowTheme: \"dark\",\n group: \"echartsGroup\",\n isCtrlPressed: false, // 是否按住 Ctrl\n startIndex: 0,\n windowSize: 10,\n\n minWindowSize: 10,\n maxWindowSize: 2000,\n\n // 当前显示的数据\n visibleData: [],\n // 目标值(用于动画)\n targetStartIndex: 0,\n targetWindowSize: 200,\n animationId: null,\n // 是否显示tooltip\n showTooltip: true,\n // 标记线数据\n markLineData: [],\n // 当前标记线索引\n currentMarkLineIndex: 0,\n // 所有的Option\n allOptions: [],\n // 头部显示数据\n headerData: {},\n // 滚轮滚动方向\n wheelDelta: 0,\n // 调整大小相关\n isResizing: false,\n currentLane: null,\n resizeDirection: null,\n startX: 0,\n startWidth: 0,\n minLaneWidth: 10,\n /** 拖拽调整的泳道宽度(px),按 laneId 存,不写入 lane 配置对象 */\n laneWidthOverrides: {},\n // 最新触底信息\n latestBottomInfo: { data: {}, timestamp: 0 },\n // 最新触顶信息\n latestTopInfo: { data: {}, timestamp: 0 },\n // 井深平均间隔\n depthInterval: 1,\n // 控制时间轴是否显示年月日\n showDateTime: false,\n // 初始化数据\n initialRealTimeData: {},\n // 标记是否正在更新图表,避免在主渲染过程中调用setOption\n isUpdatingChart: false,\n pendingChartUpdate: false,\n // 用于监听车道头部大小变化\n resizeObserver: null,\n // 用于防抖处理的定时器\n resizeTimeout: null,\n // 用于缓存车道头部宽度,避免无限循环\n headerWidthCache: {},\n // 上次触发 visibleDataChange 的参数,用于比较是否发生变化\n lastVisibleDataChangeParams: null,\n // 当前线段所有数据的最小值和最大值\n lineRange: {},\n markAreaLineData: [],\n // 待处理的数据请求信息\n pendingRequestData: null,\n // 按 laneId 收集图表组件引用(避免重复 ref 导致联动失效)\n chartRefMap: {},\n // 贯穿所有泳道的十字准线\n crosshairVisible: false,\n crosshairTop: 0,\n _pointerSyncHandlers: [],\n cssVarCache: {},\n seriesDataCache: {},\n lastChartUpdateTime: 0,\n tooltipContainerMap: {},\n };\n },\n created() {\n // 防抖:停止滚动 200ms 后只执行一次判断\n this.debounceJudgeEdge = debounce(() => {\n this.judgeScrollEdge();\n }, 200);\n this.scheduleConnectAllCharts = debounce(() => {\n this.connectAllCharts();\n }, 50);\n this.getCssVar = (key) => {\n if (!this.cssVarCache[key]) {\n this.cssVarCache[key] = getCssVariable(key);\n }\n return this.cssVarCache[key];\n };\n },\n mounted() {\n this.showDateTime =\n Object.prototype.hasOwnProperty.call(this.currentToolBarConfig, \"showDateTime\") && this.currentToolBarConfig.showDateTime == true;\n window.addEventListener(\"keydown\", this.handleKeyDown);\n window.addEventListener(\"keyup\", this.handleKeyUp);\n // 初始化tooltip显示隐藏\n this.showTooltip = this.formCache.displayType == \"float\";\n },\n beforeUnmount() {\n window.removeEventListener(\"keydown\", this.handleKeyDown);\n window.removeEventListener(\"keyup\", this.handleKeyUp);\n this.unbindChartPointerSync();\n echarts.disConnect(this.group);\n this.clearEcharts();\n // 清理大小变化监听器\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n // 清理定时器\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n },\n methods: {\n // 参数变化\n paramsChange(params) {\n this.params = params;\n },\n // 泳道宽度变化\n async laneWidthChange(widthMap) {\n this.laneWidthMap = widthMap || {};\n await this.$nextTick();\n this.updateLanesChartOption();\n },\n getLaneChartContentStyle(laneId) {\n const width = this.laneWidthMap && this.laneWidthMap[laneId];\n const gap = this.currentHeaderStyle.itemGap || 0;\n if (width && Number(width) > 0) {\n return { width: `${width}px`, padding: `0 ${gap}px`, height: \"100%\" };\n }\n return { width: \"100%\", height: \"100%\", padding: `0 ${gap}px`, flex: \"1\" };\n },\n setChartRef(laneId, el) {\n if (el) {\n this.chartRefMap[laneId] = el;\n } else if (this.chartRefMap[laneId]) {\n delete this.chartRefMap[laneId];\n }\n },\n getConnectedCharts() {\n return Object.values(this.chartRefMap)\n .map((item) => item?.chart)\n .filter((chart) => chart && !chart.isDisposed());\n },\n getChartRefByLaneId(laneId) {\n return this.chartRefMap[laneId] || null;\n },\n getYValueFromChart(chart, x, y) {\n const option = chart.getOption();\n const gridCount = (option.grid && option.grid.length) || 1;\n for (let gridIndex = 0; gridIndex < gridCount; gridIndex++) {\n try {\n const val = chart.convertFromPixel({ gridIndex }, [x, y]);\n if (val && val.length >= 2 && Number.isFinite(val[1])) {\n return val[1];\n }\n } catch (e) {\n // 忽略无效 grid\n }\n }\n return null;\n },\n getPixelFromYValue(chart, yValue) {\n const option = chart.getOption();\n const gridCount = (option.grid && option.grid.length) || 1;\n for (let gridIndex = 0; gridIndex < gridCount; gridIndex++) {\n try {\n const pixel = chart.convertToPixel({ gridIndex }, [0, yValue]);\n if (pixel && pixel.length >= 2 && Number.isFinite(pixel[1])) {\n return pixel;\n }\n } catch (e) {\n // 忽略无效 grid\n }\n }\n return null;\n },\n onChartAreaMouseMove(event) {\n const charts = this.getConnectedCharts();\n for (let i = 0; i < charts.length; i++) {\n const chart = charts[i];\n const dom = chart.getDom();\n if (!dom) continue;\n const rect = dom.getBoundingClientRect();\n if (\n event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom\n ) {\n this.syncAxisPointerAcrossCharts(chart, event.clientX - rect.left, event.clientY - rect.top);\n return;\n }\n }\n },\n updateCrosshairLine(sourceChart, offsetY) {\n const wrap = this.$refs.chartAreaWrap;\n const chartDom = sourceChart.getDom();\n if (!wrap || !chartDom) return;\n const wrapRect = wrap.getBoundingClientRect();\n const chartRect = chartDom.getBoundingClientRect();\n this.crosshairTop = chartRect.top - wrapRect.top + offsetY;\n this.crosshairVisible = true;\n },\n syncAxisPointerAcrossCharts(sourceChart, offsetX, offsetY) {\n const yValue = this.getYValueFromChart(sourceChart, offsetX, offsetY);\n if (yValue === null) {\n this.crosshairVisible = false;\n return;\n }\n this.updateCrosshairLine(sourceChart, offsetY);\n const charts = this.getConnectedCharts();\n charts.forEach((chart) => {\n const pos = this.getPixelFromYValue(chart, yValue);\n if (!pos) return;\n chart.dispatchAction({\n type: \"updateAxisPointer\",\n currTrigger: \"mousemove\",\n x: pos[0],\n y: pos[1],\n });\n if (this.showTooltip) {\n chart.dispatchAction({\n type: \"showTip\",\n x: pos[0],\n y: pos[1],\n });\n }\n });\n },\n hideAxisPointerAcrossCharts() {\n this.crosshairVisible = false;\n this.getConnectedCharts().forEach((chart) => {\n chart.dispatchAction({ type: \"hideTip\" });\n chart.dispatchAction({ type: \"updateAxisPointer\", currTrigger: \"leave\" });\n });\n },\n unbindChartPointerSync() {\n if (!this._pointerSyncHandlers || this._pointerSyncHandlers.length === 0) return;\n this._pointerSyncHandlers.forEach(({ zr, onMove }) => {\n if (zr) {\n zr.off(\"mousemove\", onMove);\n }\n });\n this._pointerSyncHandlers = [];\n },\n bindChartPointerSync() {\n this.unbindChartPointerSync();\n Object.values(this.chartRefMap).forEach((item) => {\n const chart = item?.chart;\n if (!chart || chart.isDisposed()) return;\n const zr = chart.getZr();\n const onMove = (e) => {\n this.syncAxisPointerAcrossCharts(chart, e.offsetX, e.offsetY);\n };\n zr.on(\"mousemove\", onMove);\n this._pointerSyncHandlers.push({ zr, onMove });\n });\n },\n\n // 联动所有泳道图表的十字准线与 tooltip(贯穿整个泳道区域)\n connectAllCharts() {\n this.$nextTick(() => {\n requestAnimationFrame(() => {\n const charts = this.getConnectedCharts();\n if (charts.length === 0) return;\n\n charts.forEach((chart) => {\n chart.group = this.group;\n });\n\n echarts.disConnect(this.group);\n if (charts.length > 1) {\n echarts.connect(this.group);\n }\n // this.bindChartPointerSync();\n });\n });\n },\n // 模板变化\n async templateChange(template) {\n this.currentTemplate = template;\n await this.$nextTick();\n this.updateLanesChartOption();\n },\n // 线段变化\n async lineChange() {\n await this.$nextTick();\n this.updateLanesChartOption();\n },\n // 初始化窗口大小范围以及windowSize默认值\n initWindowSizeRange() {\n if (this.formCache.axisType == \"depth\") {\n const scaleValues = this.currentToolBarConfig?.scaleList?.map((item) => item.value) || [];\n if (scaleValues.length === 0) return;\n\n const minScale = Math.min(...scaleValues);\n const maxScale = Math.max(...scaleValues);\n this.minWindowSize = Math.round(this.pxToCm() * (+minScale / this.depthInterval));\n this.maxWindowSize = Math.round(this.pxToCm() * (+maxScale / this.depthInterval));\n\n this.updateSettings({ key: \"scale\", value: this.currentToolBarConfig.form.scale });\n } else {\n this.minWindowSize = 10;\n this.maxWindowSize = 1000000;\n this.updateSettings({ key: \"timeRange\", value: this.currentToolBarConfig.form.timeRange });\n }\n // 当获取replace数据时,将页面定位到最后一条数据\n this.startIndex = this.realTimeData.length > this.windowSize ? this.realTimeData.length - this.windowSize : 0;\n },\n // 跳转到指定位置\n jumpToPosition(data) {\n if (!this.realTimeData || this.realTimeData.length === 0) return;\n\n const axisKey = this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType];\n if (!axisKey) return;\n\n // 获取目标值\n let targetValue;\n if (this.formCache.axisType === \"time\") {\n targetValue = this.toMillisecondTimestamp(data.y);\n } else {\n targetValue = Number(data.x);\n }\n\n if (targetValue === null || targetValue === undefined || isNaN(targetValue)) return;\n\n // 查找目标值在 realTimeData 中的索引\n let targetIndex = -1;\n let minDiff = Infinity;\n\n for (let i = 0; i < this.realTimeData.length; i++) {\n let itemValue = this.realTimeData[i][axisKey];\n // 确保时间值为毫秒级\n if (this.formCache.axisType !== \"depth\") {\n itemValue = this.toMillisecondTimestamp(itemValue);\n } else {\n itemValue = Number(itemValue);\n }\n\n const diff = Math.abs(itemValue - targetValue);\n if (diff < minDiff) {\n minDiff = diff;\n targetIndex = i;\n }\n }\n // console.log(targetIndex);\n // 判断是否有足够的数据\n if (targetIndex < this.windowSize / 2 || targetIndex > this.realTimeData.length - this.windowSize / 2 - 1) {\n return;\n }\n // 如果找到索引,跳转到该位置\n this.startIndex = targetIndex - Math.ceil(this.windowSize / 2);\n this.updateLanesChartOption();\n },\n // 将当前页面px转换为cm\n pxToCm() {\n const container = this.$refs.targetDom;\n const rect = container.getBoundingClientRect();\n const headerHeight = (this.$refs.chartContainer && this.$refs.chartContainer.getLaneHeightPx()) || 0;\n const px = rect.height - headerHeight;\n const cm = px / 25;\n return cm;\n },\n // 获取当前可见数据的x轴范围\n getXAxisRangeByHeader(lineInfo, validData = []) {\n let headerMin = 0;\n let headerMax = 1;\n const numericValues = (validData || [])\n .map((item) => Number(item[0]))\n .filter((v) => !Number.isNaN(v) && v !== null && v !== undefined);\n if (lineInfo && Object.prototype.hasOwnProperty.call(lineInfo, \"min\")) {\n headerMin = Number(lineInfo.min);\n } else if (numericValues.length > 0) {\n headerMin = Math.floor(Math.min(...numericValues));\n }\n if (lineInfo && Object.prototype.hasOwnProperty.call(lineInfo, \"max\")) {\n headerMax = Number(lineInfo.max);\n } else if (numericValues.length > 0) {\n headerMax = Math.ceil(Math.max(...numericValues));\n }\n const min = headerMin;\n const max = headerMax;\n // 更新当前线的范围\n this.lineRange[lineInfo.lineId] = {\n min,\n max,\n };\n return { min, max };\n },\n // 判断滚动是否到达边界\n judgeScrollEdge() {\n const dataLen = this.realTimeData.length;\n if (!dataLen || !this.visibleData.length) return;\n\n // 方向:-1=向上,1=向下\n const delta = Math.sign(this.wheelDelta);\n const now = Date.now();\n const oneMinute = 60 * 1000;\n\n if (this.startIndex <= 0 && delta === -1) {\n let data = {\n settings: this.formCache,\n currentData: this.visibleData[0],\n direction: \"top\",\n };\n // 检查时间是否超过1分钟或数据是否不同\n if (now - this.latestTopInfo.timestamp > oneMinute || JSON.stringify(data) !== JSON.stringify(this.latestTopInfo.data)) {\n this.latestTopInfo = { data, timestamp: now };\n this.$emit(\"chart-scroll\", data);\n }\n return;\n }\n\n const lastVisible = this.visibleData.at(-1);\n const findIndex = this.realTimeData.findIndex(\n (item) =>\n item[this.currentToolBarConfig.axisTypeList[this.formCache.axisType]] ===\n lastVisible[this.currentToolBarConfig.axisTypeList[this.formCache.axisType]],\n );\n if (findIndex !== -1 && Math.abs(dataLen - (findIndex + 1)) <= 2 && delta === 1) {\n let data = {\n settings: this.formCache,\n currentData: this.visibleData[this.visibleData.length - 1],\n direction: \"bottom\",\n };\n // 检查时间是否超过1分钟或数据是否不同\n if (now - this.latestBottomInfo.timestamp > oneMinute || JSON.stringify(data) !== JSON.stringify(this.latestBottomInfo.data)) {\n this.latestBottomInfo = { data, timestamp: now };\n this.$emit(\"chart-scroll\", data);\n }\n }\n },\n // 更新所有泳道的图表选项\n updateOptionsByLineId(lineId, option) {\n let index = this.allOptions.findIndex((lane) => lane.lineId == lineId);\n if (Object.prototype.hasOwnProperty.call(option, \"xAxis\") && option.xAxis.length === 0) {\n option.xAxis = [{}];\n }\n if (Object.prototype.hasOwnProperty.call(option, \"yAxis\") && option.yAxis.length === 0) {\n option.yAxis = [{}];\n }\n const cachedOption = cloneDeep(option);\n if (index != -1) {\n this.allOptions.splice(index, 1, { lineId, option: cachedOption });\n } else {\n this.allOptions.push({\n lineId,\n option: cachedOption,\n });\n }\n },\n // 控制tooltip显示隐藏\n toggleTooltip(enable) {\n // if (enable) this.headerData = {};\n // const lanes = (this.currentTemplate && this.currentTemplate.lanes) || [];\n // this.showTooltip = enable;\n // lanes.forEach((lane) => {\n // const chartRef = this.getChartRefByLaneId(lane.laneId);\n // if (!chartRef || !chartRef.chart) return;\n\n // const chart = chartRef.chart;\n\n // chart.setOption({\n // tooltip: {\n // ...chart.getOption().tooltip,\n // showContent: enable,\n // },\n // });\n // });\n },\n // 获取当前可见数据\n getVisibleData(startIndex = this.startIndex) {\n const end = startIndex + this.windowSize;\n this.visibleData = this.realTimeData.slice(startIndex, end);\n return this.visibleData;\n },\n // 处理键盘按下事件\n handleKeyDown(e) {\n if (e.ctrlKey && !this.isCtrlPressed) {\n this.isCtrlPressed = true;\n }\n },\n // 处理键盘释放事件\n handleKeyUp(e) {\n if (!e.ctrlKey && this.isCtrlPressed) {\n this.isCtrlPressed = false;\n }\n },\n // 获取当前滚动位置对应的索引\n getAnchorIndexFromEvent(e) {\n const container = this.$refs.targetDom;\n if (!container) return null;\n const rect = container.getBoundingClientRect();\n const headerHeight = (this.$refs.chartContainer && this.$refs.chartContainer.getLaneHeightPx()) || 0;\n\n let y = e.clientY - rect.top - headerHeight;\n\n const chartHeight = rect.height - headerHeight;\n\n if (y < 0 || y > chartHeight) return null;\n const ratio = y / chartHeight;\n const indexInWindow = ratio * this.windowSize;\n const anchorIndex = this.startIndex + indexInWindow;\n return Math.max(0, Math.min(anchorIndex, this.realTimeData.length - 1));\n },\n // 判断是否滚动位置在顶部标题\n isScrollingToHeader(e) {\n const container = this.$refs.targetDom;\n if (!container) return false;\n const rect = container.getBoundingClientRect();\n const headerHeight = (this.$refs.chartContainer && this.$refs.chartContainer.getLaneHeightPx()) || 0;\n let y = e.clientY - rect.top - headerHeight;\n const chartHeight = rect.height - headerHeight;\n return y < 0 || y > chartHeight;\n },\n // 判断是否触底(展示数据最后一条与最新数据depth差值≤10)\n checkReachBottom() {\n if (!this.realTimeData || this.realTimeData.length === 0) {\n console.warn(\"暂无新数据!\");\n return false;\n }\n if (!this.visibleData || this.visibleData.length === 0) {\n this.startIndex = 0;\n this.updateLanesChartOption(\"\", \"series\");\n return;\n }\n\n const lastVisibleItem = this.visibleData[this.visibleData.length - 1];\n const lastVisibleValue = Number(\n lastVisibleItem[this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]],\n );\n const latestIndex = this.realTimeData.findIndex(\n (item) =>\n item[this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]] ===\n lastVisibleValue,\n );\n\n if (latestIndex === -1) {\n console.warn(\"depth字段非有效数字,无法判断触底\");\n return false;\n }\n const isReachBottom = this.realTimeData.length - (latestIndex + this.windowSize * 0.1) <= 1;\n if (isReachBottom) {\n this.startIndex = this.realTimeData.length - this.windowSize > 0 ? this.realTimeData.length - this.windowSize : 0;\n }\n this.updateLanesChartOption(\"\", \"series\");\n },\n // 处理鼠标滚轮事件\n handleWheel(e) {\n // if (this.isScrollingToHeader(e)) return;\n e.preventDefault();\n const dataLength = (this.realTimeData && this.realTimeData.length) || 0;\n this.wheelDelta = Math.sign(e.deltaY);\n const delta = Math.sign(e.deltaY);\n // ===== Ctrl:缩放 =====\n if (this.isCtrlPressed) {\n // 检查是否已经在缩放边界\n // delta < 0 表示向上滚动 = 缩小 windowSize\n // delta > 0 表示向下滚动 = 放大 windowSize\n if ((delta < 0 && this.windowSize <= this.minWindowSize) || (delta > 0 && this.windowSize >= this.maxWindowSize)) {\n return;\n }\n\n let anchorIndex = this.getAnchorIndexFromEvent(e);\n // 如果获取不到鼠标位置的数据,则使用中间数据\n if (anchorIndex === null) {\n anchorIndex = this.startIndex + this.windowSize / 2;\n }\n const ratio = (anchorIndex - this.startIndex) / this.windowSize;\n const scale = 1 + delta * 0.2;\n let newWindowSize = this.windowSize * scale;\n newWindowSize = Math.max(this.minWindowSize, Math.min(newWindowSize, dataLength, this.maxWindowSize));\n\n // 赋值给 targetWindowSize\n this.targetWindowSize = Math.floor(newWindowSize);\n let calcStartIndex = anchorIndex - this.targetWindowSize * ratio;\n this.targetStartIndex = Math.floor(calcStartIndex);\n } else {\n const speed = Math.max(1, this.windowSize / 100);\n\n // 检查是否已经在滚动边界\n // delta < 0 表示向上滚动\n // delta > 0 表示向下滚动\n // const maxStart = Math.max(0, dataLength - this.windowSize);\n // if ((delta < 0 && this.startIndex <= 0) || (delta > 0 && this.startIndex >= maxStart)) {\n // return;\n // }\n\n this.targetStartIndex = Math.floor(this.startIndex + delta * speed * 10);\n this.targetWindowSize = this.windowSize; // 滚动时不变,已是整数\n if (this.formCache.dataType == \"history\") {\n this.debounceJudgeEdge();\n }\n }\n const maxStartFinal = Math.max(0, dataLength - this.targetWindowSize);\n this.targetStartIndex = Math.max(0, Math.min(this.targetStartIndex, maxStartFinal));\n this.targetStartIndex = Math.floor(this.targetStartIndex);\n\n // 检查是否有变化,没有变化则不渲染\n if (Math.abs(this.targetStartIndex - this.startIndex) < 0.5 && Math.abs(this.targetWindowSize - this.windowSize) < 0.5) {\n return;\n }\n\n this.smoothRender();\n },\n // 平滑渲染\n smoothRender() {\n cancelAnimationFrame(this.animationId);\n const animate = () => {\n const lerp = 0.5;\n this.startIndex += (this.targetStartIndex - this.startIndex) * lerp;\n this.windowSize += (this.targetWindowSize - this.windowSize) * lerp;\n\n if (Math.abs(this.startIndex - this.targetStartIndex) < 0.5 && Math.abs(this.windowSize - this.targetWindowSize) < 0.5) {\n this.startIndex = this.targetStartIndex;\n this.windowSize = this.targetWindowSize;\n if (!this.isUpdatingChart) {\n this.updateLanesChartOption();\n }\n return;\n }\n\n if (!this.isUpdatingChart) {\n this.updateLanesChartOption();\n }\n this.animationId = requestAnimationFrame(animate);\n };\n animate();\n },\n // 跳转到下一个markLine\n jumpToNextMarkLine() {\n const axisKey = this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType];\n if (!axisKey) return;\n\n // 获取当前图表的markLine数据\n let markLineYValues = [];\n const firstChart = this.getConnectedCharts()[0];\n if (firstChart) {\n const chartOption = firstChart.getOption();\n if (chartOption && chartOption.series) {\n chartOption.series.forEach((series) => {\n if (series.markLine && series.markLine.data) {\n series.markLine.data.forEach((markData) => {\n if (markData.yAxis !== null && markData.yAxis !== undefined) {\n markLineYValues.push(markData.yAxis);\n }\n });\n }\n });\n }\n }\n\n // 如果没有获取到markLine数据,尝试使用this.markLineData\n if (markLineYValues.length === 0 && this.markLineData && this.markLineData.length > 0) {\n markLineYValues = this.markLineData\n .map((item) => {\n if (this.formCache.axisType === \"depth\") {\n return Number(item.data?.depth || item.depth || item);\n } else if (this.formCache.axisType === \"time\") {\n return this.toMillisecondTimestamp(item.data?.time || item.time || item);\n }\n return Number(item);\n })\n .filter((val) => val !== null && !isNaN(val));\n }\n\n if (markLineYValues.length === 0) {\n return;\n }\n\n // 保存markLineYValues以便后续使用\n this.cachedMarkLineYValues = markLineYValues;\n\n // 获取当前需要跳转的markLine值\n const targetValue = markLineYValues[this.currentMarkLineIndex % markLineYValues.length];\n\n // 找到目标值在realTimeData中的索引\n let findIndex = -1;\n let closestIndex = -1;\n let minDiff = Infinity;\n\n if (this.formCache.axisType === \"time\") {\n const targetValueMs = this.toMillisecondTimestamp(targetValue);\n this.realTimeData.forEach((item, index) => {\n const itemValueMs = this.toMillisecondTimestamp(item[axisKey]);\n const diff = Math.abs(itemValueMs - targetValueMs);\n if (diff < minDiff) {\n minDiff = diff;\n closestIndex = index;\n }\n if (itemValueMs === targetValueMs) {\n findIndex = index;\n }\n });\n } else {\n this.realTimeData.forEach((item, index) => {\n const itemValue = Number(item[axisKey]);\n const diff = Math.abs(itemValue - Number(targetValue));\n if (diff < minDiff) {\n minDiff = diff;\n closestIndex = index;\n }\n if (itemValue === Number(targetValue)) {\n findIndex = index;\n }\n });\n }\n\n // 如果没有精确匹配,使用最接近的值\n const targetIndex = findIndex !== -1 ? findIndex : closestIndex;\n\n if (targetIndex !== -1) {\n this.startIndex = targetIndex + 1 - this.windowSize / 2 > 0 ? targetIndex + 1 - this.windowSize / 2 : 0;\n this.updateLanesChartOption();\n }\n\n // 更新索引(循环)\n this.currentMarkLineIndex++;\n if (this.currentMarkLineIndex >= markLineYValues.length) {\n this.currentMarkLineIndex = 0;\n }\n },\n // 根据lineId获取图表选项\n getOptionsByLineId(lineId) {\n if (!this.allOptions || this.allOptions.length == 0) {\n return {};\n }\n const lane = this.allOptions.find((l) => l.lineId == lineId);\n return lane ? lane.option : {};\n },\n // 处理工具栏设置变更\n async updateSettings(settings) {\n // 处理displayType变更\n if (settings.key === \"displayType\") {\n this.toggleTooltip(settings.value == \"float\");\n }\n\n // 处理比例尺变化\n if (settings.key === \"scale\") {\n this.scaleToDataSize(settings.value);\n await this.$nextTick();\n this.updateLanesChartOption();\n }\n\n // 处理井深范围或时间范围的变化\n if (settings.key === \"depthRange\" || settings.key === \"timeRange\") {\n if (this.realTimeData.length > 0) {\n const axisType = this.formCache.axisType;\n const axisKey = this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[axisType];\n if (axisKey) {\n // 获取visibleData的最后一条数据作为结束值\n const lastVisibleItem = this.visibleData[this.visibleData.length - 1] || this.realTimeData[this.realTimeData.length - 1];\n let endValue = Number(lastVisibleItem[axisKey]);\n\n // 计算范围值(时间范围或深度范围)\n let rangeValue;\n if (axisType === \"depth\") {\n rangeValue = settings.value || 1000;\n } else {\n const timeRange = settings.value || 5;\n rangeValue = timeRange * 60 * 1000;\n // 如果时间值小于1e12,认为是秒级,转换为毫秒\n if (String(endValue).length < 13 && endValue < 1e12) {\n endValue = endValue * 1000;\n }\n }\n\n // 计算开始值\n const startValue = endValue - rangeValue;\n\n // 在realTimeData中查找第一个大于等于startValue的数据索引\n let startIndex = 0;\n let foundMatch = false;\n for (let i = 0; i < this.realTimeData.length; i++) {\n let itemValue = Number(this.realTimeData[i][axisKey]);\n // 确保itemValue也是毫秒级\n if (axisType !== \"depth\") {\n if (String(itemValue).length < 13 && itemValue < 1e12) {\n itemValue = itemValue * 1000;\n }\n }\n if (itemValue <= startValue) {\n startIndex = i;\n foundMatch = true;\n }\n }\n if (foundMatch) {\n this.$emit(\"loadingChange\", false);\n // 计算新的windowSize,确保能显示整个range范围的数据\n const endIndex = this.realTimeData.findIndex((item, index) => index >= startIndex && Number(item[axisKey]) > endValue);\n const actualEndIndex = endIndex === -1 ? this.realTimeData.length : endIndex;\n const newWindowSize = actualEndIndex - startIndex;\n\n this.startIndex = startIndex;\n this.windowSize = Math.max(1, newWindowSize);\n\n this.$nextTick(() => {\n this.updateLanesChartOption();\n });\n } else {\n // 未找到匹配的数据,计算需要获取的数据范围\n const minDataValue = Number(this.realTimeData[0][axisKey]);\n let adjustedMinDataValue = minDataValue;\n let needRequestStart = startValue;\n let needRequestEnd = adjustedMinDataValue;\n\n if (axisType !== \"depth\") {\n if (String(minDataValue).length < 13 && minDataValue < 1e12) {\n adjustedMinDataValue = minDataValue * 1000;\n }\n if (String(startValue).length < 13 && startValue < 1e12) {\n needRequestStart = startValue * 1000;\n }\n }\n\n if (adjustedMinDataValue > startValue) {\n needRequestEnd = adjustedMinDataValue;\n } else {\n needRequestStart = adjustedMinDataValue;\n needRequestEnd = endValue;\n }\n \n this.$emit(\"loadingChange\", true);\n\n this.pendingRequestData = {\n startValue: needRequestStart,\n endValue: needRequestEnd,\n axisType: axisType,\n // 当前显示最后一条数据作为结束值,作为请求的开始始值\n showLastValue: endValue,\n };\n\n if (this.$emit) {\n this.$emit(\"supplementaryData\", {\n startValue: needRequestStart - (axisType === \"depth\" ? 100 : 10 * 60 * 1000) || 0, //如果是时间多加10分钟,如果是深度多加100米,深度需要大于0\n endValue: needRequestEnd,\n axisType: axisType,\n direction: \"top\",\n });\n }\n return;\n }\n }\n }\n }\n },\n handleDataLoaded(newData) {\n if (!this.pendingRequestData) {\n return;\n }\n\n const { showLastValue, axisType, startValue } = this.pendingRequestData;\n const axisKey = this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[axisType];\n\n if (!axisKey) {\n this.$emit(\"loadingChange\", false);\n this.pendingRequestData = null;\n return;\n }\n\n // 合并新旧数据(确保去重)\n const existingKeys = new Set(this.realTimeData.map((item) => item[axisKey]));\n const newItems = newData.filter((item) => !existingKeys.has(item[axisKey]));\n this.realTimeData = [...this.realTimeData, ...newItems];\n\n // 按轴类型排序数据\n this.realTimeData.sort((a, b) => {\n const valA = Number(a[axisKey]);\n const valB = Number(b[axisKey]);\n return valA - valB;\n });\n\n // 在合并后的数据中查找新的起始索引\n let targetStartValue = Number(startValue);\n if (axisType !== \"depth\") {\n const str = String(targetStartValue);\n if (str.length < 13 && targetStartValue < 1e12) {\n targetStartValue = targetStartValue * 1000;\n }\n }\n\n let startIndex = 0;\n // let foundMatch = false;\n\n for (let i = 0; i < this.realTimeData.length; i++) {\n let itemValue = Number(this.realTimeData[i][axisKey]);\n if (axisType !== \"depth\") {\n const str = String(itemValue);\n if (str.length < 13 && itemValue < 1e12) {\n itemValue = itemValue * 1000;\n }\n }\n if (itemValue <= targetStartValue) {\n startIndex = i;\n // foundMatch = true;\n }\n }\n // 计获取新的结束索引\n let targetEndValue = Number(showLastValue);\n if (axisType !== \"depth\") {\n const str = String(targetEndValue);\n if (str.length < 13 && targetEndValue < 1e12) {\n targetEndValue = targetEndValue * 1000;\n }\n }\n\n const endIndex = this.realTimeData.findIndex((item, index) => index >= startIndex && Number(item[axisKey]) >= targetEndValue);\n const actualEndIndex = endIndex === -1 ? this.realTimeData.length : endIndex;\n const newWindowSize = actualEndIndex - startIndex;\n this.startIndex = startIndex;\n this.windowSize = Math.max(1, newWindowSize);\n\n // if (foundMatch) {\n this.$emit(\"loadingChange\", false);\n this.pendingRequestData = null;\n\n this.$nextTick(() => {\n this.updateLanesChartOption();\n });\n // } else {\n // // 未找到满足的开始值,再次发送请求获取缺失的时间段\n // const minDataValue = Number(this.realTimeData[0][axisKey]);\n // let adjustedMinDataValue = minDataValue;\n\n // // 确保时间值统一为毫秒级\n // if (axisType !== \"depth\") {\n // if (String(minDataValue).length < 13 && minDataValue < 1e12) {\n // adjustedMinDataValue = minDataValue * 1000;\n // }\n // }\n\n // // 计算缺失的范围:从目标开始值到当前最小数据值\n // let needRequestStart = targetStartValue;\n // let needRequestEnd = adjustedMinDataValue;\n\n // if (this.$emit) {\n // this.$emit(\"supplementaryData\", {\n // startValue: needRequestStart - (axisType === \"depth\" ? 100 : 10 * 60 * 1000) || 0, //如果是时间多加10分钟,如果是深度多加100米,深度需要大于0\n // endValue: needRequestEnd,\n // axisType: axisType,\n // });\n // }\n // }\n },\n // 获取第一个包含 dataIndex 的项\n getFirstDataIndexItem(seriesData) {\n // 入参校验:确保是数组且非空\n if (!Array.isArray(seriesData) || seriesData.length === 0) {\n return null;\n }\n\n // 遍历数组,找到第一个包含 dataIndex 的项\n for (const item of seriesData) {\n if (typeof item.dataIndex !== \"undefined\" && item.dataIndex !== null) {\n return item;\n }\n }\n\n // 无匹配项返回 null\n return null;\n },\n // 获取默认的泳道图表选项\n getDefaultLaneChartOption() {\n const option = {\n backgroundColor: this.getCssVar(\"--kd-lane-container-item-bg\"),\n grid: {\n top: 0,\n left: 2,\n right: 2,\n bottom: 0,\n show: false,\n containLabel: false,\n },\n emphasis: {\n disabled: true,\n },\n animation: false,\n legend: { show: false },\n xAxis: [\n {\n show: false,\n type: \"value\",\n min: 0,\n max: 10,\n splitNumber: 5,\n splitLine: {\n show: false,\n showMinLine: false,\n showMaxLine: false,\n lineStyle: {\n color: this.getCssVar(\"--kd-lane-container-item-line-color\"),\n type: \"dashed\",\n },\n },\n axisLabel: {\n show: false,\n },\n axisLine: {\n show: false,\n onZero: false,\n },\n axisTick: {\n show: false,\n },\n },\n ],\n yAxis: [\n {\n type: \"value\",\n inverse: true,\n boundaryGap: false,\n scale: true,\n splitLine: {\n show: true,\n showMinLine: false,\n showMaxLine: false,\n lineStyle: {\n color: this.getCssVar(\"--kd-lane-container-item-line-color\"),\n type: \"dashed\",\n },\n },\n axisLine: {\n show: false,\n onZero: false,\n },\n axisLabel: {\n show: false,\n fontSize: 12,\n color: this.getCssVar(\"--default-text-color\"),\n },\n axisTick: {\n show: false,\n },\n axisPointer: {\n show: true,\n },\n },\n ],\n dataZoom: [\n {\n type: \"inside\",\n orient: \"vertical\",\n filterMode: \"none\",\n disabled: true,\n },\n ],\n tooltip: {\n show: true,\n showContent: this.showTooltip,\n trigger: \"axis\",\n axisPointer: {\n type: \"line\",\n axis: \"y\",\n snap: true,\n label: {\n show: true,\n formatter: (params) => {\n if (this.formCache.displayType == \"header\") {\n let dataIndexItem = (params.seriesData && params.seriesData[0] && params.seriesData[0].dataIndex) || null;\n if (dataIndexItem !== null) {\n this.headerData = this.visibleData[dataIndexItem];\n } else {\n this.headerData = {};\n }\n }\n if (this.formCache.axisType == \"time\") {\n return this.timestampToYMDHMS(params.value);\n } else {\n return params.value.toString();\n }\n },\n },\n },\n confine: true,\n appendTo: document.querySelector(\".kd-curve-2d-container\"),\n backgroundColor: this.getCssVar(\"--tooltip-bg-color\"),\n borderWidth: 0,\n textStyle: {\n color: this.getCssVar(\"---default-text-color\"),\n },\n formatter: (series) => {\n // 根据seriesName去重,保留数值最大的项,或者在有缺失值时保留缺失值的项\n const uniqueSeries = series\n .filter((item) => item.seriesName !== \"helper\")\n .reduce((acc, current) => {\n const existingIndex = acc.findIndex((item) => item.seriesName === current.seriesName);\n if (existingIndex === -1) {\n // 不存在相同seriesName的项,直接添加\n acc.push(current);\n } else {\n // 存在相同seriesName的项,比较数值大小\n const existingItem = acc[existingIndex];\n const existingValue = Array.isArray(existingItem.value) ? existingItem.value[0] : existingItem.value;\n const currentValue = Array.isArray(current.value) ? current.value[0] : current.value;\n\n // 判断是否有缺失值\n const existingHasValue = existingValue !== undefined && existingValue !== null && existingValue !== \"\";\n const currentHasValue = currentValue !== undefined && currentValue !== null && currentValue !== \"\";\n\n if (!existingHasValue && currentHasValue) {\n // 现有项无值,当前项有值,保留现有项\n // 不做任何操作\n } else if (existingHasValue && !currentHasValue) {\n // 现有项有值,当前项无值,替换为当前项\n acc[existingIndex] = current;\n } else if (existingHasValue && currentHasValue) {\n // 两者都有值,保留数值较大的\n if (Number(currentValue) > Number(existingValue)) {\n acc[existingIndex] = current;\n }\n } else {\n // 两者都无值,保留最后一个\n acc[existingIndex] = current;\n }\n }\n return acc;\n }, []);\n\n // 如果用户提供了自定义formatter,则使用用户的formatter\n if (this.tooltipFormatter && typeof this.tooltipFormatter === \"function\") {\n // 获取鼠标所在位置的数据点\n let mousePositionData = null;\n if (uniqueSeries.length > 0) {\n // 找到第一个有dataIndex的项\n const firstItem = this.getFirstDataIndexItem(uniqueSeries);\n if (firstItem && firstItem.dataIndex !== undefined) {\n // 根据dataIndex获取对应的数据\n mousePositionData = this.visibleData[firstItem.dataIndex];\n }\n }\n // 传递更多数据给用户的formatter\n return this.tooltipFormatter({\n series: uniqueSeries, // 原始数据\n mousePositionData: mousePositionData, // 鼠标所在位置的数据\n });\n }\n // 默认formatter\n const outerDiv = document.createElement(\"div\");\n uniqueSeries.forEach((params) => {\n const { seriesName, value, color } = params;\n const innerDiv = document.createElement(\"div\");\n innerDiv.style = \"display: flex; align-items: center;\";\n const markerDiv = document.createElement(\"div\");\n markerDiv.style = `height: 10px; width:10px;font-size:10px; border-radius:8px; gap: 5px; background-color:${color}`;\n const textSpan = document.createElement(\"span\");\n let xValue = value;\n // 时间轴和深度轴模式:value 是 [x, y] 格式,取 x 值\n if (Array.isArray(value)) {\n xValue = value[0];\n }\n if (xValue == undefined || xValue == null) {\n textSpan.innerText = `${seriesName}:--`;\n } else {\n textSpan.innerText = `${seriesName}:${typeof +xValue === \"number\" ? Number(Number(xValue).toFixed(2)) : xValue}`;\n }\n textSpan.style = `margin-left:8px;font-size:12px;`;\n innerDiv.appendChild(markerDiv);\n innerDiv.appendChild(textSpan);\n\n outerDiv.appendChild(innerDiv);\n });\n return outerDiv;\n },\n // ...getBaseTooltip(),\n },\n };\n return option;\n },\n // 时间戳转换为 HH:mm:ss 格式\n timestampToHms(timestamp) {\n const date = new Date(timestamp);\n const h = String(date.getHours()).padStart(2, \"0\");\n const m = String(date.getMinutes()).padStart(2, \"0\");\n const s = String(date.getSeconds()).padStart(2, \"0\");\n\n if (this.showDateTime) {\n const y = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${month}-${day} ${h}:${m}:${s}`;\n }\n\n return `${h}:${m}:${s}`;\n },\n // 时间戳转换为毫秒级\n toMillisecondTimestamp(time) {\n if (time === null || time === undefined) return Date.now();\n let timestamp = new Date(time).getTime();\n if (isNaN(timestamp)) return Date.now();\n const str = String(timestamp);\n if (str.length === 13 || timestamp > 1e12) {\n return timestamp;\n }\n return timestamp * 1000;\n },\n // 更新泳道图表选项\n async updateLanesChartOption(transferData) {\n if (this.isUpdatingChart) {\n this.pendingChartUpdate = true;\n return;\n }\n this.isUpdatingChart = true;\n\n let realTimeData = transferData && transferData.length > 0 ? transferData : this.getVisibleData();\n\n const lanes = this.currentTemplate.lanes;\n\n if (!lanes || lanes.length === 0) {\n this.isUpdatingChart = false;\n return;\n }\n\n const axisKey =\n (this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]) ||\n (this.formCache.axisType === \"time\" ? \"time\" : \"depth\");\n\n const paramNameMap = {};\n const paramCodeMap = new Map();\n this.params.forEach((p) => {\n paramNameMap[p.paramId] = p.paramName;\n if (p.paramCode) {\n paramCodeMap.set(p.paramId, p.paramCode.split(\",\"));\n }\n });\n\n const dataGroups = splitArrayByDepth(realTimeData, axisKey);\n\n const dataIndexMap = new Map();\n for (let i = 0; i < realTimeData.length; i++) {\n dataIndexMap.set(String(realTimeData[i][axisKey]), realTimeData[i]);\n }\n\n try {\n for (let laneIndex = 0; laneIndex < lanes.length; laneIndex++) {\n const lane = lanes[laneIndex];\n const axisTypeList = this.currentToolBarConfig.axisTypeList || { depth: \"depth\", time: \"time\" };\n const isDepthLane = Object.prototype.hasOwnProperty.call(axisTypeList, \"depth\") && axisTypeList.depth == lane.laneKey;\n const isTimeLane = Object.prototype.hasOwnProperty.call(axisTypeList, \"time\") && axisTypeList.time == lane.laneKey;\n\n const option = this.getDefaultLaneChartOption();\n\n let hasValidLineData = false;\n const seriesDataCache = {};\n if (lane && lane.lines && lane.lines.length > 0) {\n for (const lineInfo of lane.lines) {\n if (lineInfo.isUsed !== \"1\") continue;\n const seriesData = this.generateSeriesDataCached(realTimeData, lineInfo, axisKey, paramCodeMap);\n seriesDataCache[lineInfo.lineId] = { full: seriesData };\n if (!hasValidLineData) {\n hasValidLineData = seriesData.some((point) => point[0] !== null && point[0] !== undefined && point[0] !== \"\");\n }\n }\n }\n\n if (dataGroups.length > 0) {\n option.yAxis = [];\n option.series = [];\n option.grid = [];\n option.xAxis = [];\n\n if (!hasValidLineData) {\n option.tooltip = {\n show: false,\n showContent: false,\n };\n }\n\n let totalHeight = 0;\n const groupHeights = [];\n\n for (let i = 0; i < dataGroups.length; i++) {\n const group = dataGroups[i];\n const groupDepths = group.map((item) => +item[axisKey]);\n const groupRange = Math.max(...groupDepths) - Math.min(...groupDepths);\n groupHeights.push(groupRange);\n totalHeight += groupRange;\n }\n\n const allValues = [];\n for (let i = 0; i < dataGroups.length; i++) {\n const group = dataGroups[i];\n for (let j = 0; j < group.length; j++) {\n allValues.push(+group[j][axisKey]);\n }\n }\n\n allValues.sort((a, b) => a - b);\n\n const allIntervals = [];\n for (let i = 1; i < allValues.length; i++) {\n const interval = Math.abs(allValues[i] - allValues[i - 1]);\n if (interval > 0) {\n allIntervals.push(interval);\n }\n }\n\n let unifiedInterval = 5;\n if (allIntervals.length > 0) {\n const minInterval = Math.min(...allIntervals);\n const totalRange = Math.max(...allValues) - Math.min(...allValues);\n const intervalCount = Math.max(1, Math.min(12, Math.ceil(totalRange / minInterval)));\n unifiedInterval = Math.ceil(totalRange / Math.min(12, intervalCount));\n unifiedInterval = Math.max(minInterval, Math.ceil(unifiedInterval / minInterval) * minInterval);\n }\n\n let currentTop = 0;\n\n for (let groupIndex = 0; groupIndex < dataGroups.length; groupIndex++) {\n const group = dataGroups[groupIndex];\n const groupDepths = group.map((item) => +item[axisKey]);\n const groupMin = Math.min(...groupDepths);\n const groupMax = Math.max(...groupDepths);\n const groupHeight = (groupHeights[groupIndex] / totalHeight) * 100;\n const gridIndex = option.grid.length;\n\n option.grid.push({\n top: `${currentTop}%`,\n left: 2,\n right: 2,\n height: `${groupHeight}%`,\n show: false,\n containLabel: true,\n });\n currentTop += groupHeight;\n\n option.yAxis.push({\n gridIndex: gridIndex,\n type: \"value\",\n min: groupMin,\n max: groupMax,\n inverse: true,\n boundaryGap: false,\n splitLine: {\n show: true,\n showMinLine: false,\n showMaxLine: false,\n lineStyle: {\n color: this.getCssVar(\"--kd-lane-container-item-line-color\"),\n type: \"dashed\",\n },\n },\n axisLine: { show: false, onZero: false },\n axisTick: { show: false },\n axisLabel: {\n show: false,\n fontSize: 12,\n color: this.getCssVar(\"--default-text-color\"),\n },\n axisPointer: { show: hasValidLineData },\n interval: unifiedInterval,\n });\n\n if (isDepthLane || isTimeLane) {\n const clientWidth = this.laneWidthMap[lane.laneId];\n option.xAxis.push({\n gridIndex: gridIndex,\n type: \"value\",\n min: 0,\n max: 10,\n splitLine: { show: false },\n axisLabel: { show: false },\n axisLine: { show: false },\n axisTick: { show: false },\n });\n option.series.push({\n type: \"line\",\n xAxisIndex: groupIndex,\n yAxisIndex: gridIndex,\n nameIndex: groupIndex,\n });\n Object.assign(option.yAxis[gridIndex], {\n splitLine: { show: false },\n axisPointer: { show: false },\n alignTicks: true,\n boundaryGap: false,\n axisLabel: {\n show: true,\n width: clientWidth,\n hideOverlap: true,\n height: 14,\n verticalAlign: \"middle\",\n color: this.getCssVar(\"--default-text-color\"),\n overflow: \"truncate\",\n rich: {\n center: {\n align: \"center\",\n fontSize: 12,\n verticalAlign: \"middle\",\n width: clientWidth - 6,\n height: 14,\n textBaseline: \"middle\",\n lineHeight: 14,\n },\n center2: {\n align: \"center\",\n fontSize: 12,\n backgroundColor: \"red\",\n verticalAlign: \"middle\",\n width: clientWidth - 6,\n height: 14,\n textBaseline: \"middle\",\n lineHeight: 14,\n },\n },\n formatter: this.getYAxisLabelFormatter(isTimeLane, dataGroups, groupIndex, groupMin, groupMax, axisKey),\n },\n });\n option.backgroundColor = \"transparent\";\n delete option.tooltip;\n }\n\n const isLogScale = lane.isLogScale === \"1\";\n let laneMin = 0,\n laneMax = 0;\n if (lane && lane.lines) {\n for (const lineInfo of lane.lines) {\n const allValidData = seriesDataCache[lineInfo.lineId]?.full || [];\n const range = this.getXAxisRangeByHeader(lineInfo, allValidData);\n if (lineInfo.min) laneMin = Math.min(laneMin, range.min);\n if (lineInfo.max) laneMax = Math.max(laneMax, range.max);\n }\n }\n\n if (lane && lane.lines) {\n for (const lineInfo of lane.lines) {\n if (!seriesDataCache[lineInfo.lineId]) {\n seriesDataCache[lineInfo.lineId] = {\n full: this.generateSeriesDataCached(realTimeData, lineInfo, axisKey, paramCodeMap),\n };\n }\n const groupSeriesData = this.generateSeriesDataCached(group, lineInfo, axisKey, paramCodeMap);\n const allValidData = seriesDataCache[lineInfo.lineId].full;\n const { min, max } = this.getXAxisRangeByHeader(lineInfo, allValidData);\n const xAxisIndex = option.xAxis.length;\n\n option.xAxis.push({\n interval: isLogScale ? \"auto\" : (max - min) / 5,\n splitNumber: isLogScale ? \"auto\" : 5,\n gridIndex: gridIndex,\n show: !isDepthLane,\n type: isLogScale ? \"log\" : \"value\",\n min: isLogScale ? (laneMin > 0 ? laneMin : 0.1) : min,\n max: isLogScale ? (laneMax > 0 ? laneMax : 1) : max,\n splitLine: {\n show: !isDepthLane,\n showMaxLine: false,\n showMinLine: false,\n lineStyle: { color: this.getCssVar(\"--kd-lane-container-item-line-color\"), type: \"dashed\" },\n },\n axisLabel: { show: false },\n axisLine: { show: false },\n axisTick: { show: false },\n });\n const baseSeries = {\n laneId: lineInfo.paramId,\n data: lineInfo.isUsed === \"1\" ? groupSeriesData : [],\n type: \"line\",\n xAxisIndex: xAxisIndex,\n yAxisIndex: gridIndex,\n name: paramNameMap[lineInfo.paramId] || \"\",\n symbol: lineInfo.symbol || \"none\",\n color: lineInfo.themeConfig\n ? lineInfo.isGradient && this.linearGradientLineColor?.[this.nowTheme]?.[lineInfo.paramId]\n ? this.linearGradientLineColor[this.nowTheme][lineInfo.paramId]\n : lineInfo.themeConfig[this.nowTheme].lineColor\n : lineInfo.lineColor,\n symbolSize: getAdaptedFontSize(lineInfo.symbolSize || 6),\n lineStyle: {\n width: getAdaptedFontSize(+lineInfo.lineSize || 1.5),\n type: lineInfo.lineType,\n },\n clip: true,\n z: lineInfo.lineSort,\n };\n\n this.addMarkLineToSeries(baseSeries, lineInfo, realTimeData, axisKey, dataIndexMap);\n this.addMarkAreaToSeries(baseSeries, lineInfo, realTimeData, axisKey, min, max, dataIndexMap);\n this.addAreaStyleToSeries(baseSeries, lineInfo, groupSeriesData, min);\n\n option.series.push(baseSeries);\n }\n }\n\n if (!isDepthLane && !isTimeLane && lane && lane.lines && lane.lines.length > 0) {\n const rangeMins = lane.lines\n .map((item) => this.lineRange[item.lineId]?.min)\n .filter((v) => v !== undefined && v !== null && !Number.isNaN(v));\n if (rangeMins.length > 0) {\n const min = Math.max(...rangeMins);\n option.series.unshift({\n name: \"helper\",\n type: \"line\",\n xAxisIndex: lane.lines.length * groupIndex,\n yAxisIndex: gridIndex,\n data: realTimeData.map((item) => [min, +item[axisKey]]),\n lineStyle: { opacity: 0 },\n symbol: \"none\",\n });\n }\n }\n }\n }\n\n this.updateOptionsByLineId(lane.laneId, option);\n const chartRef = this.getChartRefByLaneId(lane.laneId);\n if (chartRef && chartRef.chart) {\n chartRef.chart.group = this.group;\n }\n }\n } catch (error) {\n console.error(\"updateLanesChartOption error:\", error);\n } finally {\n this.isUpdatingChart = false;\n this.scheduleConnectAllCharts();\n if (this.pendingChartUpdate) {\n this.pendingChartUpdate = false;\n this.$nextTick(() => {\n this.updateLanesChartOption(transferData);\n });\n }\n }\n },\n // 生成泳道图表数据\n generateSeriesData(data, lineInfo, axisKey) {\n return data.map((item) => {\n let value = null;\n if (Object.prototype.hasOwnProperty.call(item, lineInfo.paramId)) {\n value = item[lineInfo.paramId];\n } else {\n const currentParam = this.params.find((p) => p.paramId == lineInfo.paramId);\n if (currentParam && currentParam.paramCode) {\n const codes = currentParam.paramCode.split(\",\");\n for (const code of codes) {\n if (Object.prototype.hasOwnProperty.call(item, code)) {\n value = item[code];\n break;\n }\n }\n }\n }\n return [value, +item[axisKey]];\n });\n },\n generateSeriesDataCached(data, lineInfo, axisKey, paramCodeMap) {\n const paramId = lineInfo.paramId;\n const codes = paramCodeMap.get(paramId);\n return data.map((item) => {\n let value = null;\n if (Object.prototype.hasOwnProperty.call(item, paramId)) {\n value = item[paramId];\n } else if (codes) {\n for (let i = 0; i < codes.length; i++) {\n if (Object.prototype.hasOwnProperty.call(item, codes[i])) {\n value = item[codes[i]];\n break;\n }\n }\n }\n return [value, +item[axisKey]];\n });\n },\n // 获取Y轴标签格式化函数\n getYAxisLabelFormatter(isTimeLane, dataGroups, groupIndex, groupMin, groupMax, axisKey) {\n return (value) => {\n if (isTimeLane) {\n return `{center|${this.timestampToHms(value)}}`;\n }\n if (groupIndex > 0 && value === groupMin) {\n const prevGroup = dataGroups[groupIndex - 1];\n const prevGroupMax = Math.max(...prevGroup.map((item) => +item[axisKey]));\n if (Math.abs(prevGroupMax - groupMin) < 1) return `{center2|${prevGroupMax}/${value}}`;\n return `{center2|${prevGroupMax.toFixed(0)}/${value.toFixed(0)}}`;\n }\n if (groupIndex <= dataGroups.length - 1 && value === groupMax) {\n return `{center|}`;\n }\n if (groupIndex === 0 && value === groupMin) {\n return `{center|}`;\n }\n return `{center|${typeof +value === \"number\" ? Number(Number(value).toFixed(0)) : value}}`;\n };\n },\n // 添加标记线到泳道图表\n addMarkLineToSeries(baseSeries, lineInfo, realTimeData, axisKey, dataIndexMap) {\n if (!this.markLineData || this.markLineData.length === 0) return;\n\n baseSeries.markLine = {\n symbol: \"none\",\n label: { show: false },\n emphasis: { disabled: true },\n data: this.markLineData\n .map((item) => {\n if (this.formCache.axisType === \"depth\") {\n const markDepth = item.data?.depth || item.depth || item;\n const markTime = item.data?.timestamp || item.timestamp || 0;\n const markTimeMs = this.toMillisecondTimestamp(markTime);\n\n const findItem = dataIndexMap.get(String(markDepth)) || realTimeData.find((d) => d[axisKey] == markDepth);\n if (findItem) {\n return { yAxis: Number(markDepth), lineStyle: { color: item.color || \"red\", type: \"dashed\", width: 2 } };\n }\n\n let closestItem = null,\n minDiff = Infinity;\n realTimeData.forEach((d) => {\n const diff = Math.abs(Number(d[axisKey]) - Number(markDepth));\n if (diff < minDiff) {\n minDiff = diff;\n closestItem = d;\n }\n });\n\n if (closestItem) {\n const dataTime = closestItem.timestamp || 0;\n const dataTimeMs = this.toMillisecondTimestamp(dataTime);\n if (markTimeMs >= dataTimeMs) {\n return { yAxis: Number(markDepth), lineStyle: { color: item.color || \"red\", type: \"dashed\", width: 2 } };\n }\n }\n return { yAxis: null };\n } else if (this.formCache.axisType === \"time\") {\n const markTime = item.data?.time || item.time || item;\n const markTimeMs = this.toMillisecondTimestamp(markTime);\n\n const findItem = dataIndexMap.get(String(markTime)) || realTimeData.find((d) => d[axisKey] == markTime);\n if (findItem) {\n return { yAxis: markTimeMs, lineStyle: { color: item.color || \"red\", type: \"dashed\", width: 2 } };\n }\n\n let closestItem = null,\n minDiff = Infinity;\n realTimeData.forEach((d) => {\n const diff = Math.abs(this.toMillisecondTimestamp(d[axisKey]) - markTimeMs);\n if (diff < minDiff) {\n minDiff = diff;\n closestItem = d;\n }\n });\n\n if (closestItem) {\n return { yAxis: markTimeMs, lineStyle: { color: item.color || \"red\", type: \"dashed\", width: 2 } };\n }\n return { yAxis: null };\n }\n return { yAxis: Number(item.data || item), lineStyle: { color: item.color || \"red\", type: \"dashed\", width: 2 } };\n })\n .filter((item) => item.yAxis !== null),\n };\n },\n // 添加标记区域到泳道图表\n addMarkAreaToSeries(baseSeries, lineInfo, realTimeData, axisKey, min, max, dataIndexMap) {\n if (!this.markAreaLineData || this.markAreaLineData.length === 0) return;\n\n const currentMarkAreaData = this.markAreaLineData.filter((item) => item.paramsId === lineInfo.paramId);\n if (currentMarkAreaData.length === 0) return;\n\n const markAreaData = [];\n for (let i = 0; i < currentMarkAreaData.length; i++) {\n const areaItem = currentMarkAreaData[i];\n if (!areaItem.data || areaItem.data.length < 2) continue;\n\n const startData = areaItem.data[0];\n const endData = areaItem.data[1];\n let startY, endY;\n\n if (this.formCache.axisType === \"depth\") {\n const startDepth = startData.depth;\n const startTime = this.toMillisecondTimestamp(startData.timestamp || 0);\n const endDepth = endData.depth;\n const endTime = this.toMillisecondTimestamp(endData.timestamp || 0);\n\n let startFindItem = dataIndexMap.get(String(startDepth));\n if (!startFindItem) {\n startFindItem = realTimeData.find((d) => d[axisKey] == startDepth && d.timestamp == startData.timestamp);\n }\n if (startFindItem) {\n startY = Number(startDepth);\n } else {\n let closestStartItem = null,\n minStartDiff = Infinity;\n for (let j = 0; j < realTimeData.length; j++) {\n const d = realTimeData[j];\n const diff = Math.abs(Number(d[axisKey]) - Number(startDepth));\n if (diff < minStartDiff) {\n minStartDiff = diff;\n closestStartItem = d;\n }\n }\n if (closestStartItem) {\n const dataTimeMs = this.toMillisecondTimestamp(closestStartItem.timestamp || 0);\n startY = startTime >= dataTimeMs && closestStartItem[axisKey] >= startDepth ? Number(startDepth) : null;\n } else {\n startY = null;\n }\n }\n\n let endFindItem = dataIndexMap.get(String(endDepth));\n if (!endFindItem) {\n endFindItem = realTimeData.find((d) => d[axisKey] == endDepth && d.timestamp == endData.timestamp);\n }\n if (endFindItem) {\n endY = Number(endDepth);\n } else {\n let closestEndItem = null,\n minEndDiff = Infinity;\n for (let j = 0; j < realTimeData.length; j++) {\n const d = realTimeData[j];\n const diff = Math.abs(Number(d[axisKey]) - Number(endDepth));\n if (diff < minEndDiff) {\n minEndDiff = diff;\n closestEndItem = d;\n }\n }\n if (closestEndItem) {\n const dataTimeMs = this.toMillisecondTimestamp(closestEndItem.timestamp || 0);\n endY = endTime >= dataTimeMs && closestEndItem[axisKey] <= endDepth ? Number(endDepth) : null;\n } else {\n endY = null;\n }\n }\n } else if (this.formCache.axisType === \"time\") {\n const startTime = startData.time;\n const endTime = endData.time;\n const startTimeMs = this.toMillisecondTimestamp(startTime);\n const endTimeMs = this.toMillisecondTimestamp(endTime);\n\n let startFindItem = dataIndexMap.get(String(startTime));\n if (!startFindItem) {\n startFindItem = realTimeData.find((d) => d[axisKey] == startTime);\n }\n startY = startFindItem ? startTimeMs : null;\n if (!startY) {\n let closestStartItem = null,\n minStartDiff = Infinity;\n for (let j = 0; j < realTimeData.length; j++) {\n const d = realTimeData[j];\n const diff = Math.abs(this.toMillisecondTimestamp(d[axisKey]) - startTimeMs);\n if (diff < minStartDiff) {\n minStartDiff = diff;\n closestStartItem = d;\n }\n }\n startY = closestStartItem ? startTimeMs : null;\n }\n\n let endFindItem = dataIndexMap.get(String(endTime));\n if (!endFindItem) {\n endFindItem = realTimeData.find((d) => d[axisKey] == endTime);\n }\n endY = endFindItem ? endTimeMs : null;\n if (!endY) {\n let closestEndItem = null,\n minEndDiff = Infinity;\n for (let j = 0; j < realTimeData.length; j++) {\n const d = realTimeData[j];\n const diff = Math.abs(this.toMillisecondTimestamp(d[axisKey]) - endTimeMs);\n if (diff < minEndDiff) {\n minEndDiff = diff;\n closestEndItem = d;\n }\n }\n endY = closestEndItem ? endTimeMs : null;\n }\n } else {\n startY = Number(startData.depth || startData.y);\n endY = Number(endData.depth || endData.y);\n }\n\n if (startY !== null && endY !== null) {\n markAreaData.push([\n { xAxis: min, yAxis: startY },\n { xAxis: max, yAxis: endY },\n ]);\n }\n }\n\n if (markAreaData.length > 0) {\n baseSeries.markArea = {\n silent: true,\n itemStyle: {\n color: currentMarkAreaData[0]?.color || \"rgba(255, 0, 0, 0.1)\",\n borderWidth: 0,\n },\n data: markAreaData,\n };\n }\n },\n // 添加区域样式到泳道图表\n addAreaStyleToSeries(baseSeries, lineInfo, seriesData, min) {\n if (lineInfo.lineType !== \"area\") {\n baseSeries.areaStyle = { opacity: 0 };\n return;\n }\n\n if (seriesData.length > 0) {\n const firstValidPoint = seriesData.find((point) => Number.isFinite(+point[0]));\n if (firstValidPoint) {\n seriesData.unshift([min, firstValidPoint[1]]);\n const lastValidPoint = seriesData[seriesData.length - 1];\n if (lastValidPoint && Number.isFinite(+lastValidPoint[0])) {\n seriesData.push([min, lastValidPoint[1]]);\n }\n }\n }\n\n baseSeries.areaStyle = {\n origin: \"start\",\n emphasis: { disabled: true },\n color: lineInfo.themeConfig\n ? lineInfo.isGradient && this.linearGradientLineColor?.[this.nowTheme]?.[lineInfo.paramId]\n ? this.linearGradientLineColor[this.nowTheme][lineInfo.paramId]\n : lineInfo.themeConfig[this.nowTheme].lineColor\n : lineInfo.lineColor,\n opacity: 1,\n };\n baseSeries.itemStyle = { opacity: 0 };\n },\n // 更新泳道图表选项(增量更新)\n async updateLanesChartOptionIncremental(transferData) {\n if (this.isUpdatingChart) return;\n this.isUpdatingChart = true;\n\n let realTimeData = transferData && transferData.length > 0 ? transferData : this.getVisibleData();\n const lanes = this.currentTemplate && this.currentTemplate.lanes;\n\n if (!lanes || lanes.length === 0) {\n this.isUpdatingChart = false;\n return;\n }\n\n const axisKey =\n (this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]) ||\n (this.formCache.axisType === \"time\" ? \"time\" : \"depth\");\n\n try {\n for (let laneIndex = 0; laneIndex < lanes.length; laneIndex++) {\n const lane = lanes[laneIndex];\n const chartRef = this.getChartRefByLaneId(lane.laneId);\n if (!chartRef || !chartRef.chart) continue;\n\n const chart = chartRef.chart;\n const currentOption = chart.getOption();\n\n const axisTypeList = this.currentToolBarConfig.axisTypeList || { depth: \"depth\", time: \"time\" };\n const isDepthLane = Object.prototype.hasOwnProperty.call(axisTypeList, \"depth\") && axisTypeList.depth == lane.laneKey;\n\n const dataGroups = splitArrayByDepth(realTimeData, axisKey);\n if (dataGroups.length === 0) continue;\n\n const updates = {};\n const needUpdate = {\n grid: false,\n yAxis: false,\n xAxis: false,\n series: false,\n };\n\n const newGrid = [];\n const newYAxis = [];\n const newXAxis = [];\n const newSeriesData = [];\n\n let totalHeight = 0;\n const groupHeights = [];\n dataGroups.forEach((group) => {\n const groupDepths = group.map((item) => +item[axisKey]);\n const groupRange = Math.max(...groupDepths) - Math.min(...groupDepths);\n groupHeights.push(groupRange);\n totalHeight += groupRange;\n });\n\n const allValues = [];\n dataGroups.forEach((group) => {\n group.forEach((item) => {\n allValues.push(+item[axisKey]);\n });\n });\n\n allValues.sort((a, b) => a - b);\n const allIntervals = [];\n for (let i = 1; i < allValues.length; i++) {\n const interval = Math.abs(allValues[i] - allValues[i - 1]);\n if (interval > 0) {\n allIntervals.push(interval);\n }\n }\n\n let unifiedInterval = 5;\n if (allIntervals.length > 0) {\n const minInterval = Math.min(...allIntervals);\n const totalRange = Math.max(...allValues) - Math.min(...allValues);\n const intervalCount = Math.max(1, Math.min(12, Math.ceil(totalRange / minInterval)));\n unifiedInterval = Math.ceil(totalRange / Math.min(12, intervalCount));\n unifiedInterval = Math.max(minInterval, Math.ceil(unifiedInterval / minInterval) * minInterval);\n }\n\n let currentTop = 0;\n let seriesIndex = 0;\n\n dataGroups.forEach((group, groupIndex) => {\n const groupDepths = group.map((item) => +item[axisKey]);\n const groupMin = Math.min(...groupDepths);\n const groupMax = Math.max(...groupDepths);\n const groupHeight = (groupHeights[groupIndex] / totalHeight) * 100;\n const gridIndex = newYAxis.length;\n\n const gridItem = {\n top: `${currentTop}%`,\n left: 2,\n right: 2,\n height: `${groupHeight}%`,\n show: false,\n containLabel: false,\n };\n\n const currentGrid = currentOption.grid && currentOption.grid[gridIndex];\n if (!currentGrid || currentGrid.top !== gridItem.top || currentGrid.height !== gridItem.height) {\n needUpdate.grid = true;\n }\n newGrid.push(gridItem);\n\n const yAxisItem = {\n gridIndex: gridIndex,\n type: \"value\",\n min: groupMin,\n max: groupMax,\n inverse: true,\n boundaryGap: false,\n interval: unifiedInterval,\n };\n\n const currentYAxis = currentOption.yAxis && currentOption.yAxis[gridIndex];\n if (\n !currentYAxis ||\n currentYAxis.min !== groupMin ||\n currentYAxis.max !== groupMax ||\n currentYAxis.interval !== unifiedInterval\n ) {\n needUpdate.yAxis = true;\n }\n newYAxis.push(yAxisItem);\n\n if (isDepthLane) {\n const xAxisItem = {\n gridIndex: gridIndex,\n type: \"value\",\n min: 0,\n max: 10,\n };\n const currentXAxis = currentOption.xAxis && currentOption.xAxis[groupIndex];\n if (!currentXAxis || currentXAxis.min !== 0 || currentXAxis.max !== 10) {\n needUpdate.xAxis = true;\n }\n newXAxis.push(xAxisItem);\n seriesIndex++;\n } else {\n if (lane && lane.lines) {\n lane.lines.forEach((lineInfo) => {\n const allSeriesData = this.generateSeriesData(realTimeData, lineInfo, axisKey);\n const { min, max } = this.getXAxisRangeByHeader(lineInfo, allSeriesData);\n const isLogScale = lane.isLogScale === \"1\";\n\n const xAxisItem = {\n gridIndex: gridIndex,\n type: isLogScale ? \"log\" : \"value\",\n min: isLogScale ? (this.lineRange[lineInfo.lineId]?.min > 0 ? this.lineRange[lineInfo.lineId].min : 0.1) : min,\n max: isLogScale ? (this.lineRange[lineInfo.lineId]?.max > 0 ? this.lineRange[lineInfo.lineId].max : 1) : max,\n };\n\n const currentXAxis = currentOption.xAxis && currentOption.xAxis[seriesIndex];\n if (!currentXAxis || currentXAxis.min !== xAxisItem.min || currentXAxis.max !== xAxisItem.max) {\n needUpdate.xAxis = true;\n }\n newXAxis.push(xAxisItem);\n\n const seriesData = this.generateSeriesData(group, lineInfo, axisKey);\n const finalSeriesData = lineInfo.isUsed === \"1\" ? seriesData : [];\n\n const currentSeries = currentOption.series && currentOption.series[seriesIndex];\n if (!currentSeries || JSON.stringify(currentSeries.data) !== JSON.stringify(finalSeriesData)) {\n needUpdate.series = true;\n newSeriesData.push({ index: seriesIndex, data: finalSeriesData });\n }\n\n seriesIndex++;\n });\n }\n }\n\n currentTop += groupHeight;\n });\n\n if (needUpdate.grid) {\n updates.grid = newGrid;\n }\n if (needUpdate.yAxis) {\n updates.yAxis = newYAxis;\n }\n if (needUpdate.xAxis) {\n updates.xAxis = newXAxis;\n }\n if (needUpdate.series) {\n updates.series = [];\n newSeriesData.forEach((item) => {\n updates.series.push({\n update: {\n index: item.index,\n data: item.data,\n },\n });\n });\n }\n\n if (Object.keys(updates).length > 0) {\n chart.setOption(updates, { notMerge: false, lazyUpdate: true });\n }\n }\n } catch (error) {\n console.error(\"updateLanesChartOptionIncremental error:\", error);\n } finally {\n this.isUpdatingChart = false;\n this.scheduleConnectAllCharts();\n }\n },\n // 清空所有图表实例\n async clearEcharts() {\n try {\n this.allOptions = [];\n\n // 强制更新视图\n await this.$nextTick();\n this.$forceUpdate();\n } catch (e) {\n console.error(\"清空图表失败:\", e);\n }\n },\n // 清空当前图表显示的数据\n async clearChartData() {\n try {\n // 清空实时数据\n this.realTimeData = [];\n // 清空可见数据\n this.visibleData = [];\n // 清空所有图表选项\n this.allOptions = [];\n // 重置起始索引和窗口大小\n this.startIndex = 0;\n this.windowSize = this.targetWindowSize;\n // 重置头部数据\n this.headerData = {};\n // 重置标记线数据\n this.markLineData = [];\n // 重置标记区域数据\n this.markAreaLineData = [];\n // 重置数据范围\n this.lineRange = {};\n // 重置待处理数据请求\n this.pendingRequestData = null;\n // 重置初始数据缓存\n this.initialRealTimeData = {};\n // 重置最后可见数据变化参数\n this.lastVisibleDataChangeParams = null;\n\n // 强制更新视图\n await this.$nextTick();\n this.$forceUpdate();\n\n } catch (e) {\n console.error(\"清空图表数据失败:\", e);\n }\n },\n // 数据去重(根据多个属性)\n uniqueByKeys(arr, keys) {\n // 非数组直接返回空\n if (!Array.isArray(arr)) return [];\n\n // 把单个属性转为数组,统一处理\n const keyList = Array.isArray(keys) ? keys : [keys];\n\n // 用于记录已经出现过的组合标识\n const seen = new Set();\n\n return arr.filter((item) => {\n // 过滤非对象元素\n if (typeof item !== \"object\" || item === null) return false;\n\n // 生成唯一标识:多属性用 | 拼接,避免属性值冲突\n const identifier = keyList.map((key) => item[key]).join(\"|\");\n\n // 已经存在 → 过滤掉;不存在 → 保留并加入Set\n if (seen.has(identifier)) {\n return false;\n } else {\n seen.add(identifier);\n return true;\n }\n });\n },\n // 根据 uniqueKey 去重并排序(只考虑 uniqueKey)\n deduplicateByUniqueKey(existingData, newData, uniqueKey, options = {}) {\n // 处理默认配置\n const { sortOrder = \"asc\", isSort = true } = options;\n const newDataArr = Array.isArray(newData) ? newData : [newData];\n\n // 合并数据并去重(只根据 uniqueKey)\n let resultData = JSON.parse(JSON.stringify(existingData));\n\n // 创建一个 Set 来存储已存在的 uniqueKey\n const existingKeys = new Set(resultData.map((item) => item[uniqueKey]));\n\n // 添加新数据(只添加 uniqueKey 不存在的项)\n newDataArr.forEach((newItem) => {\n if (!newItem || !newItem[uniqueKey]) return;\n\n if (!existingKeys.has(newItem[uniqueKey])) {\n resultData.push(newItem);\n existingKeys.add(newItem[uniqueKey]);\n }\n });\n\n // 排序(根据 uniqueKey)\n if (isSort) {\n resultData.sort((a, b) => {\n const valA = a[uniqueKey];\n const valB = b[uniqueKey];\n\n if (typeof valA === \"string\" && typeof valB === \"string\") {\n return sortOrder === \"asc\" ? valA.localeCompare(valB) : valB.localeCompare(valA);\n } else {\n return sortOrder === \"asc\" ? valA - valB : valB - valA;\n }\n });\n }\n\n return resultData;\n },\n // 生成泳道图表的对数X轴选项\n generateLogXAxisForLane(laneData) {\n if (!laneData || laneData.length === 0) {\n return {\n type: \"value\",\n min: 0,\n max: 100,\n };\n }\n\n const xValues = laneData.map((item) => Number(item.x)).filter((v) => !isNaN(v));\n let minX = Math.min(...xValues);\n minX = Math.max(minX, 1);\n let maxX = Math.max(...xValues);\n const range = maxX / minX;\n let logBase = 10;\n if (range < 10) {\n logBase = 3;\n } else if (range < 100) {\n logBase = 5;\n } else if (range < 1000) {\n logBase = 10;\n } else {\n logBase = 10;\n }\n return {\n type: \"log\",\n logarithm: logBase, // 自动最优底数\n min: minX, // 数据最小值(≥1)\n max: maxX, // 数据最大值\n minorSplitLine: {\n // 辅助刻度,让曲线更清晰\n show: true,\n lineStyle: {\n color: \"#444\",\n width: 0.5,\n },\n },\n axisLabel: {\n formatter: \"{value}\",\n color: \"#ccc\",\n fontSize: 11,\n },\n axisLine: {\n lineStyle: { color: \"#aaa\" },\n },\n splitLine: {\n lineStyle: { color: \"#555\" },\n },\n };\n },\n // 时间戳转换为YYYY-MM-DD HH:mm:ss格式\n timestampToYMDHMS(timestamp) {\n const date = new Date(timestamp);\n const h = String(date.getHours()).padStart(2, \"0\");\n const m = String(date.getMinutes()).padStart(2, \"0\");\n const s = String(date.getSeconds()).padStart(2, \"0\");\n const y = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${month}-${day} ${h}:${m}:${s}`;\n },\n // scale转换数据量\n scaleToDataSize(scale) {\n if (typeof scale == \"string\") {\n scale = +scale.replace(\"1:\", \"\") / 100;\n }\n let size = Math.round(this.pxToCm() * (+scale / this.depthInterval));\n let maxSize = Math.max(Math.round(this.pxToCm() * (1 / this.depthInterval)), this.realTimeData.length);\n if (size < maxSize) {\n this.windowSize = size;\n } else {\n this.windowSize = maxSize;\n let newsize = Math.round((maxSize / this.pxToCm()) * this.depthInterval);\n let data = this.currentToolBarConfig?.scaleList?.map((item) => item.value) || [];\n this.$emit(\"updateScale\", data.includes(newsize) ? newsize : `1:${newsize * 100}`);\n }\n },\n },\n watch: {\n warningData: {\n handler(newVal) {\n this.$nextTick(() => {\n this.markLineData = newVal;\n this.updateLanesChartOption();\n });\n },\n deep: true,\n immediate: true,\n },\n warningAreaData: {\n handler(newVal) {\n this.$nextTick(() => {\n this.markAreaLineData = newVal;\n this.updateLanesChartOption();\n });\n },\n deep: true,\n immediate: true,\n },\n themeName: {\n handler() {\n this.$nextTick(() => {\n this.updateLanesChartOption();\n });\n },\n },\n windowSize: {\n handler(newVal) {\n if (!newVal) {\n this.scaleToDataSize(1);\n return;\n }\n if (newVal && this.formCache.axisType == \"depth\") {\n let data = this.currentToolBarConfig?.scaleList?.map((item) => item.value) || [];\n let size =\n Math.round((newVal * this.depthInterval) / this.pxToCm()) < Math.max(...data)\n ? Math.round((newVal * this.depthInterval) / this.pxToCm())\n : Math.max(...data);\n this.$emit(\"updateScale\", data.includes(size) ? size : `1:${size * 100}`);\n }\n },\n },\n visibleData: {\n handler(val) {\n if (!val || val.length === 0) return;\n\n const axisKey = this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType];\n\n const first = val[0];\n const last = val[val.length - 1];\n const firstValue = first && first[axisKey];\n const lastValue = last && last[axisKey];\n\n if (\n this.lastVisibleDataChangeParams &&\n this.lastVisibleDataChangeParams.firstValue === firstValue &&\n this.lastVisibleDataChangeParams.lastValue === lastValue\n ) {\n return;\n }\n\n this.lastVisibleDataChangeParams = { firstValue, lastValue };\n\n if (this.formCache.axisType === \"depth\") {\n const dataGroups = splitArrayByDepth(val, axisKey);\n this.$emit(\"visibleDataChange\", { firstValue, lastValue, settings: this.formCache, dataGroups });\n } else {\n this.$emit(\"visibleDataChange\", { firstValue, lastValue, settings: this.formCache });\n }\n },\n immediate: true,\n },\n cachedCurveDatas: {\n async handler(newVal) {\n await this.$nextTick();\n if (newVal.type === \"replace\") {\n // 清空realTimeData以及visibleData\n this.realTimeData = [];\n this.visibleData = [];\n if (JSON.stringify(this.initialRealTimeData || {}) === \"{}\") {\n this.initialRealTimeData = cloneDeep(newVal || {});\n }\n let processedData = cloneDeep(newVal && newVal.data) || [];\n if (this.formCache.axisType == \"time\") {\n const axisKey =\n (this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]) || \"time\";\n processedData = processedData.map((item) => ({\n ...item,\n [axisKey]: this.toMillisecondTimestamp(item[axisKey]),\n }));\n\n this.realTimeData = this.deduplicateByUniqueKey(this.realTimeData, processedData, axisKey);\n this.realTimeData = processedData;\n } else {\n processedData = processedData.map((item) => ({\n ...item,\n timestamp: this.toMillisecondTimestamp(item.timestamp),\n }));\n this.realTimeData = processedData;\n }\n if (this.formCache.axisType == \"depth\") {\n let data = getAttrGap(\n this.realTimeData,\n (this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]) || \"depth\",\n );\n if (data && data.avgGap !== undefined && data.avgGap !== null) {\n this.depthInterval = data.avgGap;\n } else {\n this.depthInterval = 1;\n }\n }\n console.log(this.realTimeData,'当前数据');\n // 从scaleList计算minWindowSize和maxWindowSize\n this.initWindowSizeRange();\n await this.$nextTick();\n // if (this.$refs.chartContainer && this.$refs.chartContainer.updateLaneWidthOverrides) {\n // this.$refs.chartContainer.updateLaneWidthOverrides();\n // }\n await this.$nextTick();\n this.updateLanesChartOption();\n } else if (newVal.type === \"supplementaryData\") {\n let data = cloneDeep(newVal && newVal.data) || [];\n if (!Array.isArray(data)) {\n data = [data];\n }\n this.handleDataLoaded(data);\n } else {\n let data = cloneDeep(newVal && newVal.data) || [];\n if (!Array.isArray(data)) {\n data = [data];\n }\n const direction = newVal.direction || \"bottom\";\n\n if (this.formCache.axisType == \"time\") {\n const axisKey =\n (this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]) || \"time\";\n data = data.map((item) => ({\n ...item,\n [axisKey]: this.toMillisecondTimestamp(item[axisKey]),\n }));\n\n this.realTimeData = this.deduplicateByUniqueKey(\n this.realTimeData,\n data,\n this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType],\n );\n } else {\n data = data.map((item) => ({\n ...item,\n timestamp: this.toMillisecondTimestamp(item.timestamp),\n }));\n\n // 深度轴模式:根据direction插入数据\n if (direction === \"top\") {\n this.realTimeData = this.uniqueByKeys([...data, ...this.realTimeData], \"timestamp\");\n } else {\n this.realTimeData = this.uniqueByKeys([...this.realTimeData, ...data], \"timestamp\");\n }\n }\n\n if (this.formCache.dataType == \"history\") {\n let findIndex = this.realTimeData.findIndex(\n (item) =>\n item[this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]] ==\n (this.visibleData[0] &&\n this.visibleData[0][\n this.currentToolBarConfig.axisTypeList && this.currentToolBarConfig.axisTypeList[this.formCache.axisType]\n ]) || 0,\n );\n if (findIndex > -1) {\n this.startIndex = findIndex;\n }\n this.updateLanesChartOption();\n } else {\n this.checkReachBottom();\n }\n }\n },\n immediate: true,\n deep: true,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.kd-lane-chart-lane-container-echart {\n width: 100%;\n height: 100%;\n overflow: hidden;\n position: relative;\n}\n.kd-lane-chart-container {\n width: 100%;\n height: 100%;\n overflow: hidden;\n position: relative;\n}\n.kd-lane-chart-lane-container-echart-content {\n width: 100%;\n height: 100%;\n flex-shrink: 0;\n overflow: hidden;\n}\n.kd-lane-crosshair-line {\n position: absolute;\n left: 0;\n right: 0;\n height: 0;\n border-top: 1px dashed var(--kd-lane-container-item-line-color, rgba(255, 255, 255, 0.55));\n pointer-events: none;\n z-index: 100;\n}\n</style>\n","<template>\n <div class=\"panel-list\" :style=\"gridStyle\">\n <div v-for=\"(item, index) in parameterPanelConfig.data\" :key=\"index\" class=\"panel-item\">\n <!-- label -->\n <div class=\"label\" :title=\"item.label\">\n {{ item.label }}\n </div>\n\n <!-- value -->\n <div class=\"value\" :title=\"item.value\">\n {{ item.value !== undefined && item.value !== null && item.value !== '' ? (!isNaN(Number(item.value)) ? Number(item.value.toFixed(2)) : item.value) : \"--\" }}\n </div>\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"ParameterPanel\",\n props: {\n parameterPanelConfig: {\n type: Object,\n default: () => ({\n show: false,\n columns: 1,\n data: [],\n }),\n },\n },\n computed: {\n gridStyle() {\n const columns = this.parameterPanelConfig.columns || 1;\n return {\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n };\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.panel-list {\n width: 100%; /* 可调 */\n display: grid;\n gap: 8px;\n}\n\n/* 每一项 */\n.panel-item {\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 {\n font-size: 12px;\n color: var(--card-label-color);\n margin-bottom: 6px;\n\n /* 单行省略 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* value */\n.value {\n font-size: 18px;\n font-weight: bold;\n color: var(--card-value-color);\n\n /* 单行省略 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n</style>\n","export const faultParameters = [\n {\n paramName: \"大钩高度m\",\n lineColor: \"#FF2637\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8008\", \"8008end\"],\n },\n {\n paramName: \"转盘转速RPM\",\n lineColor: \"#FF50D4\",\n max: 150,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8012\",\"zs\"],\n },\n {\n paramName: \"扭矩kN·m\",\n lineColor: \"#FEFD24\",\n max: 40,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8013\",\"nj\"],\n },\n {\n paramName: \"大钩负荷kN\",\n lineColor: \"#3DE375\",\n max: 8000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8010\",\"dgfh\"],\n },\n {\n paramName: \"出口温度℃\",\n lineColor: \"#FFCA28\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8107\",\"ckwd\"],\n },\n {\n paramName: \"入口温度℃\",\n lineColor: \"#67E0F6\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8106\",\"rkwd\"],\n },\n {\n paramName: \"套压MPa\",\n lineColor: \"#AE64FD\",\n max: 30,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8019\"],\n },\n {\n paramName: \"总池体积m³\",\n lineColor: \"#C9FF19\",\n max: 500,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8112\",\"cztj\"],\n },\n {\n paramName: \"出口流量%\",\n lineColor: \"#17EAAC\",\n max: 100,\n min: 0,\n lineType: \"dashed\",\n paramId: [\"8137\"],\n },\n {\n paramName: \"出口流量L/s\",\n lineColor: \"#17EAAC\",\n max: 80,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8111\",\"ckll\"],\n },\n {\n paramName: \"入口流量L/s\",\n lineColor: \"#F86C59\",\n max: 80,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8110\",\"rkll\"],\n },\n {\n paramName: \"出口密度g/cm³\",\n lineColor: \"#A37CFF\",\n max: 4,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8105\",\"ckmd\"],\n },\n {\n paramName: \"入口密度g/cm³\",\n lineColor: \"#EE7821\",\n max: 4,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8104\",\"rkmd\"],\n },\n {\n paramName: \"出口电导S/m\",\n lineColor: \"#FEFD24\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8109\"],\n },\n {\n paramName: \"进口电导S/m\",\n lineColor: \"#ACF336\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8108\"],\n },\n {\n paramName: \"全烃%\",\n lineColor: \"#2BDBED\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8219\",\"8219max\"],\n },\n {\n paramName: \"C1%\",\n lineColor: \"#3DE375\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8212\",\"8212max\"],\n },\n {\n paramName: \"C2%\",\n lineColor: \"#F9B53E\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8213\",\"8213max\"],\n },\n {\n paramName: \"C3%\",\n lineColor: \"#D854DE\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8214\",\"8214max\"],\n },\n {\n paramName: \"iC4%\",\n lineColor: \"#7EA7FF\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8216\",\"8216max\"],\n },\n {\n paramName: \"NC4%\",\n lineColor: \"#47EBDD\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8215\",\"8215max\"],\n },\n {\n paramName: \"钻压kN\",\n lineColor: \"#7BFFF3\",\n max: 300,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8011\",\"zy\"],\n },\n {\n paramName: \"立压MPa\",\n lineColor: \"#FD599B\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8018\"],\n },\n {\n paramName: \"H2Sppm\",\n lineColor: \"#40DBC9\",\n max: 1000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8221\",\"8207\",\"H2Smax\"],\n },\n {\n paramName: \"CO2%\",\n lineColor: \"#C9FF19\",\n max: 10,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8204\",\"8205max\"],\n },\n {\n paramName: \"H2%\",\n lineColor: \"#F76A1B\",\n max: 10,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8205\",\"8204max\"],\n },\n {\n paramName: \"dc指数(录井)\",\n lineColor: \"#17EAAC\",\n max: 4,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8023\"],\n },\n {\n paramName: \"dc指数(模型)\",\n lineColor: \"#6CC9FF\",\n max: 4,\n min: 0,\n lineType: \"solid\",\n paramId: [\"1023\"],\n },\n {\n paramName: \"ddc指数\",\n lineColor: \"#86A6FF\",\n max: 4,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8023\", \"ddc\"],\n },\n {\n paramName: \"sigma指数\",\n lineColor: \"#EE49C5\",\n max: 10,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8024\", \"sigma\"],\n },\n {\n paramName: \"孔隙压力g/cm³\",\n lineColor: \"#FFD978\",\n max: 3,\n min: 0,\n lineType: \"solid\",\n paramId: [\"pore_pressure\",\"porePressure\"],\n },\n {\n paramName: \"坍塌压力g/cm³\",\n lineColor: \"#B5FFD0\",\n max: 3,\n min: 0,\n lineType: \"solid\",\n paramId: [\"collapse_pressure\",\"collapsePressure\"],\n },\n {\n paramName: \"破裂压力g/cm³\",\n lineColor: \"#F57263\",\n max: 3,\n min: 0,\n lineType: \"solid\",\n paramId: [\"rupture_pressure\",\"rupturePressure\"],\n },\n {\n paramName: \"机械钻速(m/h)\",\n lineColor: \"#ACF336\",\n max: 200,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8032\",\"rop\"],\n },\n {\n paramName: \"井漏风险系数\",\n lineColor: \"#CDBCFB\",\n max: 1,\n min: 0,\n lineType: \"solid\",\n paramId: [\"lsfxz\"],\n },\n {\n paramName: \"机械比能\",\n lineColor: \"#38C437\",\n max: 2000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"mse\"],\n },\n {\n paramName: \"瞬时钻速(m/hr)\",\n lineColor: \"#F86C59\",\n max: 200,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8032\", \"1004\"],\n },\n {\n paramName: \"ECD(g/cm³)\",\n lineColor: \"#C9E5F8\",\n max: 3,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8026\", \"ECD\"],\n },\n {\n paramName: \"地面转速(RPM)\",\n lineColor: \"#FF50D4\",\n max: 150,\n min: 0,\n lineType: \"solid\",\n paramId: [8012],\n },\n {\n paramName: \"理论立压(MPa)\",\n lineColor: \"#80C7FF\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"re_spp\"],\n },\n {\n paramName: \"立压偏差(MPa)\",\n lineColor: \"#FAC488\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"offset_spp\"],\n },\n {\n paramName: \"理论扭矩(kN·m)\",\n lineColor: \"#F5E86C\",\n max: 40,\n min: 0,\n lineType: \"solid\",\n paramId: [\"simtorque\"],\n },\n {\n paramName: \"扭矩偏差(kN·m)\",\n lineColor: \"#B0DE99\",\n max: 40,\n min: 0,\n lineType: \"solid\",\n paramId: [\"offset_torque\"],\n },\n {\n paramName: \"卡钻风险\",\n lineColor: \"#E98990\",\n max: 1,\n min: 0,\n lineType: \"solid\",\n paramId: [\"stuckrisk\"],\n },\n {\n paramName: \"理论负荷(kN)\",\n lineColor: \"#F2A6D7\",\n max: 8000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"simhookload\"],\n },\n {\n paramName: \"负荷偏差(kN)\",\n lineColor: \"#C2EFE0\",\n max: 1000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"offset_hookload\"],\n },\n {\n paramName: \"井深(m)\",\n lineColor: \"#4957E9\",\n max: 12000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8004\"],\n },\n {\n paramName: \"钻头位置(m)\",\n lineColor: \"#FFCA28\",\n max: 12000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8005\"],\n },\n {\n paramName: \"钻头进尺(m)\",\n lineColor: \"#98CDFF\",\n max: 2000,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8021\"],\n },\n {\n paramName: \"预测立压(MPa)\",\n lineColor: \"#F0AB84\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"re_spp\"],\n },\n {\n paramName: \"实际立压(MPa)\",\n lineColor: \"#FD599B\",\n max: 50,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8018\",\"lgyl\"],\n },\n {\n paramName: \"立压变化率(%)\",\n lineColor: \"#A1F986\",\n max: 100,\n min: 0,\n lineType: \"dashed\",\n paramId: [\"spp_rate\"],\n },\n {\n paramName: \"管内压力(MPa)\",\n lineColor: \"#FAC6F0\",\n max: 50,\n min: 0,\n lineType: \"dashed\",\n paramId: [\"8019\"],\n },\n {\n paramName: \"环空压力(MPa)\",\n lineColor: \"#8FE9E2\",\n max: 50,\n min: 0,\n lineType: \"dashed\",\n paramId: [\"annularPressure\"],\n },\n {\n paramName: \"刺漏指数\",\n lineColor: \"#B1E7FF\",\n max: 1,\n min: 0,\n lineType: \"dashed\",\n paramId: [\"leakage_risk\"],\n },\n {\n paramName: \"泵冲1(stk)\",\n lineColor: \"#67E0F6\",\n max: 120,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8014\", \"8059\"],\n },\n {\n paramName: \"泵冲2(stk)\",\n lineColor: \"#9488FF\",\n max: 120,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8015\", \"8060\"],\n },\n {\n paramName: \"泵冲3(stk)\",\n lineColor: \"#5BEB59\",\n max: 120,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8016\", \"8061\"],\n },\n {\n paramName: \"拉伸余量(kN)\",\n lineColor: \"#FF2637\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0001\"],\n },\n {\n paramName: \"拉断风险等级\",\n lineColor: \"#FF50D4\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0002\"],\n },\n {\n paramName: \"扭矩余量\",\n lineColor: \"#FEFD24\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0003\"],\n },\n {\n paramName: \"扭断风险等级\",\n lineColor: \"#3DE375\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0004\"],\n },\n {\n paramName: \"发生正弦屈曲\",\n lineColor: \"#FFCA28\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0005\"],\n },\n {\n paramName: \"发生螺旋屈曲(%)\",\n lineColor: \"#67E0F6\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0006\"],\n },\n {\n paramName: \"钻柱剩余寿命\",\n lineColor: \"#AE64FD\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0007\"],\n },\n {\n paramName: \"疲劳风险等级\",\n lineColor: \"#C9FF19\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0008\"],\n },\n {\n paramName: \"本体探伤间隔\",\n lineColor: \"#17EAAC\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0009\"],\n },\n {\n paramName: \"接头探伤间隔\",\n lineColor: \"#F86C59\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0010\"],\n },\n {\n paramName: \"总体失效风险\",\n lineColor: \"#A37CFF\",\n max: 100,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0011\"],\n },\n {\n paramName: \"等级色标\",\n lineColor: \"#EE7821\",\n max: 1,\n min: 0,\n lineType: \"solid\",\n paramId: [\"0012\"],\n },\n {\n paramName: \"每冲立压\",\n lineColor: \"#2BDBED\",\n max: 0.5,\n min: 0,\n lineType: \"solid\",\n paramId: [\"each_pumpFlushing_pressure\"],\n },\n {\n paramName: \"每吨立压\",\n lineColor: \"#F96C45\",\n max: 5,\n min: 0,\n lineType: \"solid\",\n paramId: [\"each_ton_pressure\"],\n },\n {\n paramName: \"起下钻罐\",\n lineColor: \"#EE49C5\",\n max: 30,\n min: 0,\n lineType: \"solid\",\n paramId: [\"8034\"],\n },\n];\n","<template>\n <div class=\"kd-curve-2d-resize-container kd-curve-2d-container\">\n <!-- 容器 -->\n <div class=\"container\" ref=\"container\">\n <!-- panel1 -->\n <div v-if=\"showPanel1\" class=\"panel panel-1\" :style=\"{ width: panel1Width + 'px' }\">\n <DataPanelList :parameterPanelConfig=\"parameterPanelConfig\" />\n </div>\n\n <!-- resizer1 -->\n <div v-if=\"showPanel1 && (showPanel2 || showPanel3 || showPanel4)\" class=\"resizer\" @mousedown=\"(e) => startResize(1, e)\"></div>\n\n <!-- panel2 -->\n <div v-if=\"showPanel2\" class=\"panel panel-2\" :style=\"{ width: panel2Width + 'px' }\">\n <DepthTimeChart\n ref=\"depthTimeChart\"\n v-bind=\"{ ...$props, ...$attrs }\"\n :currentToolBarConfig=\"currentToolBarConfig\"\n :formCache=\"formCache\"\n :cachedCurveDatas=\"cachedCurveDatas\"\n :depthTimeChartData=\"depthTimeChartData\"\n @depthTimeChange=\"handleDepthTimeChange\"\n />\n </div>\n\n <!-- resizer2 -->\n <div v-if=\"showPanel2 && (showPanel3 || showPanel4)\" class=\"resizer\" @mousedown=\"(e) => startResize(2, e)\"></div>\n\n <!-- panel3 (自适应) -->\n <div v-if=\"showPanel3\" class=\"panel panel-3\">\n <chartContainer\n v-if=\"showChartContainer\"\n :config=\"config\"\n :isKdCurveV2=\"isKdCurveV2\"\n v-bind=\"{ ...$props, ...$attrs }\"\n :currentToolBarConfig=\"currentToolBarConfig\"\n :formCache=\"formCache\"\n ref=\"chartContainer\"\n @updateScale=\"updateScale\"\n @visibleDataChange=\"visibleDataChange\"\n @loadingChange=\"handleLoadingChange\"\n @template-change=\"$emit('template-change', $event)\"\n @line-change=\"$emit('line-change', $event)\"\n @chart-scroll=\"$emit('chart-scroll', $event)\"\n @showContextMenu=\"$emit('showContextMenu', $event)\"\n @onCustomMenuClicked=\"$emit('onCustomMenuClicked', $event)\"\n :cachedCurveDatas=\"cachedCurveDatas\"\n :currentHeaderStyle=\"currentHeaderStyle\"\n >\n <template v-for=\"lane in headerSlotName\" :key=\"lane.laneId\" v-slot:[lane.laneId]>\n <slot :name=\"lane.laneId\"></slot>\n </template>\n\n <template v-for=\"lane in contentSlotName\" :key=\"lane.laneId\" v-slot:[lane.laneId]>\n <slot :name=\"lane.laneId\"></slot>\n </template>\n </chartContainer>\n </div>\n\n <!-- resizer3 (新增) -->\n <div v-show=\"showPanel3 && showPanel4\" class=\"resizer\" @mousedown=\"(e) => startResize(3, e)\"></div>\n\n <!-- panel4 (固定宽度可拖拽) -->\n <div v-show=\"showPanel4\" class=\"panel panel-4\" :style=\"{ width: panel4Width + 'px' }\">\n <FunctionControlPanel\n ref=\"functionControlPanel\"\n :initialFormCache=\"initialFormCache\"\n :currentToolBarConfig=\"currentToolBarConfig\"\n @updateForm=\"updateForm\"\n @jumpToNextMarkLine=\"jumpToNextMarkLine\"\n @refresh=\"refresh\"\n @dialogFunction=\"dialogFunction\"\n />\n </div>\n </div>\n\n <!-- 加载动画遮罩 -->\n <div v-if=\"isLoading\" class=\"kd-curve-loading-overlay\">\n <div class=\"kd-curve-loading-spinner\">\n <div class=\"kd-curve-loading-ring\"></div>\n <div class=\"kd-curve-loading-ring kd-curve-loading-ring-delay\"></div>\n </div>\n <div class=\"kd-curve-loading-text\">加载中...</div>\n </div>\n </div>\n</template>\n\n<script>\nimport { cloneDeep } from \"lodash-es\";\nimport DepthTimeChart from \"../depth-time-chart/index.vue\";\nimport FunctionControlPanel from \"../function-control-panel/index.vue\";\nimport chartContainer from \"../line-chart-container/index.vue\";\n// import chartContainer from \"../kd-lane/chart-container.vue\";\nimport DataPanelList from \"../parameter-panel/index.vue\";\nimport { faultParameters } from \"../../util/faultParameters.js\";\nexport default {\n name: \"frameLayout\",\n components: {\n DataPanelList,\n FunctionControlPanel,\n DepthTimeChart,\n chartContainer,\n },\n props: {\n timeConfig: {\n type: Object,\n default: () => ({}),\n },\n depthConfig: {\n type: Object,\n default: () => ({}),\n },\n curveDatas: {\n type: Object,\n default: () => ({}),\n },\n // 头部样式\n headerStyle: {\n type: Object,\n default: () => ({\n headerPadding: 4,\n headerItemHeight: 42,\n itemGap: 4,\n headerHeight: \"auto\",\n maxHeaderHeight: \"auto\",\n headerLabelFontSize: \"auto\",\n headerDataFontSize: \"auto\",\n }),\n },\n customMenuList: {\n type: Array,\n default: () => [],\n },\n themeName: {\n type: String,\n default: \"\",\n },\n headerSlotName: {\n type: Array,\n default: () => [],\n },\n contentSlotName: {\n type: Array,\n default: () => [],\n },\n toolBarConfig: {\n type: Object,\n default: () => ({}),\n },\n parameterPanelConfig: {\n type: Object,\n default: () => ({}),\n },\n WellBitDepthTimePlotConfig: {\n type: Object,\n default: () => ({}),\n },\n // 预警数据\n warningData: {\n type: Array,\n default: () => [],\n },\n // 预警区域数据\n warningAreaData: {\n type: Array,\n default: () => [],\n },\n // 自定义tooltip formatter\n tooltipFormatter: {\n type: Function,\n default: null,\n },\n // 实时曲线menu右击是否开启\n showContextMenuStatus: {\n type: Boolean,\n default: true,\n },\n },\n data() {\n return {\n isKdCurveV2: true,\n showPanel1: true,\n showPanel2: true,\n showPanel3: true,\n showPanel4: true,\n\n // 初始宽度(支持百分比字符串/数字像素)\n panel1Width: 140, // 默认15%\n panel2Width: 280, // 默认40%\n panel4Width: 120, // 默认25%\n\n isResizing: false,\n currentResizer: null,\n\n // 拖拽优化关键\n startX: 0,\n startPanel1: 0,\n startPanel2: 0,\n startPanel4: 0, // 拖拽起始时panel4宽度\n // 最小宽度\n minWidth: 100,\n\n // 性能优化\n pendingEvent: null,\n frameRequested: false,\n\n // 缓存容器宽度\n containerWidth: 0,\n\n // 新增:缓存form数据\n formCache: {},\n // 拖拽线宽度\n lineWidth: 0,\n depthTimeChartData: [],\n config: {},\n showChartContainer: false,\n // 初始化设置\n initialFormCache: {},\n // 存储curveDatas的副本\n cachedCurveDatas: {},\n // 控制是否开启curveDatas监听\n enableCurveDatasWatch: true,\n // 缓存初始化时的curveDatas\n initialCurveDatas: {},\n // 加载状态\n isLoading: false,\n };\n },\n created() {\n this.depthTimeChartData = (this.WellBitDepthTimePlotConfig && this.WellBitDepthTimePlotConfig.data) || [];\n // 初始化数据\n this.initialFormCache = cloneDeep((this.currentToolBarConfig && this.currentToolBarConfig.form) || {});\n this.formCache = cloneDeep((this.currentToolBarConfig && this.currentToolBarConfig.form) || {});\n // 初始化curveDatas副本\n this.cachedCurveDatas = cloneDeep(this.curveDatas || {});\n // 缓存初始化时的curveDatas\n this.initialCurveDatas = cloneDeep(this.curveDatas || {});\n let form = cloneDeep((this.currentToolBarConfig && this.currentToolBarConfig.form) || {});\n // 处理depthConfig和timeConfig,补充lineColor、max、min\n const processedDepthConfig = this.processConfig(this.depthConfig);\n const processedTimeConfig = this.processConfig(this.timeConfig);\n this.config = form.axisType === \"depth\" ? processedDepthConfig : processedTimeConfig;\n this.$nextTick(() => {\n this.containerWidth = (this.$refs.container && this.$refs.container.offsetWidth) || 800;\n this.initWidth();\n });\n },\n computed: {\n currentHeaderStyle() {\n let data = {\n headerPadding: this.headerStyle.headerPadding || 4,\n headerItemHeight: this.headerStyle.headerItemHeight || 42,\n itemGap: this.headerStyle.itemGap || 4,\n };\n if (Object.prototype.hasOwnProperty.call(this.headerStyle, \"headerHeight\")) {\n data.headerHeight = this.headerStyle.headerHeight || \"auto\";\n }\n if (Object.prototype.hasOwnProperty.call(this.headerStyle, \"maxHeaderHeight\")) {\n data.maxHeaderHeight = this.headerStyle.maxHeaderHeight || \"auto\";\n }\n if (Object.prototype.hasOwnProperty.call(this.headerStyle, \"headerLabelFontSize\")) {\n data.headerLabelFontSize = this.headerStyle.headerLabelFontSize || \"auto\";\n }\n if (Object.prototype.hasOwnProperty.call(this.headerStyle, \"headerDataFontSize\")) {\n data.headerDataFontSize = this.headerStyle.headerDataFontSize || \"auto\";\n }\n return data;\n },\n currentToolBarConfig() {\n const defaultForm = {\n axisType: \"depth\",\n dataType: \"history\",\n displayType: \"float\",\n scale: 20,\n timeRange: 10,\n depthRange: 1000,\n };\n const defaultConfig = {\n show: true,\n width: 120,\n showDateTime: false,\n dataTypeList: {\n history: \"history\",\n real: \"real\",\n },\n axisTypeList: {\n time: \"timestamp\",\n depth: \"wellDepth\",\n },\n timeRangeList: [\n { label: \"5min\", value: 5 },\n { label: \"10min\", value: 10 },\n { label: \"30min\", value: 30 },\n { label: \"1h\", value: 60 },\n { label: \"2h\", value: 120 },\n { label: \"4h\", value: 240 },\n { label: \"6h\", value: 360 },\n { label: \"8h\", value: 480 },\n { label: \"10h\", value: 600 },\n { label: \"12h\", value: 720 },\n { label: \"24h\", value: 1440 },\n ],\n depthRangeList: [\n { label: \"1000m\", value: 1000 },\n { label: \"2000m\", value: 2000 },\n { label: \"3000m\", value: 3000 },\n { label: \"4000m\", value: 4000 },\n { label: \"5000m\", value: 5000 },\n { label: \"6000m\", value: 6000 },\n { label: \"7000m\", value: 7000 },\n { label: \"8000m\", value: 8000 },\n { label: \"9000m\", value: 9000 },\n { label: \"10000m\", value: 10000 },\n ],\n scaleList: [\n { label: \"1:100\", value: 1 },\n { label: \"1:200\", value: 2 },\n { label: \"1:300\", value: 2.5 },\n { label: \"1:500\", value: 5 },\n { label: \"1:1000\", value: 10 },\n { label: \"1:1500\", value: 15 },\n { label: \"1:2000\", value: 20 },\n ],\n timeRangeBtnShow: true,\n depthRangeBtnShow: true,\n alertBtnShow: true,\n refreshBtnShow: true,\n exportBtnShow: true,\n scaleSelectShow: true,\n timeRangeSelectShow: true,\n depthRangeSelectShow: false,\n wellSectionQueryShow: true,\n timeDepthRadioShow: true,\n realHistoryRadioShow: true,\n headerFloatRadioShow: true,\n form: defaultForm,\n };\n const toolBarConfig = this.toolBarConfig || {};\n const result = {};\n for (const key of Object.keys(defaultConfig)) {\n if (key === \"form\") {\n result.form = {};\n const sourceForm = toolBarConfig.form || {};\n for (const formKey of Object.keys(defaultForm)) {\n result.form[formKey] = Object.prototype.hasOwnProperty.call(sourceForm, formKey) ? sourceForm[formKey] : defaultForm[formKey];\n }\n } else if (key === \"dataTypeList\" || key === \"axisTypeList\") {\n const defaultObj = defaultConfig[key];\n result[key] = {};\n const sourceObj = toolBarConfig[key] || {};\n for (const objKey of Object.keys(defaultObj)) {\n result[key][objKey] = Object.prototype.hasOwnProperty.call(sourceObj, objKey) ? sourceObj[objKey] : defaultObj[objKey];\n }\n } else if (key === \"timeRangeList\" || key === \"depthRangeList\" || key === \"scaleList\") {\n result[key] =\n toolBarConfig[key] && Array.isArray(toolBarConfig[key]) && toolBarConfig[key].length > 0\n ? toolBarConfig[key]\n : defaultConfig[key];\n } else {\n result[key] = Object.prototype.hasOwnProperty.call(toolBarConfig, key) ? toolBarConfig[key] : defaultConfig[key];\n }\n }\n return result;\n },\n },\n mounted() {\n if (JSON.stringify(this.config) !== \"{}\") {\n this.showChartContainer = true;\n }\n // 初始化:获取容器宽度并转换百分比为像素\n this.$nextTick(() => {\n this.containerWidth = (this.$refs.container && this.$refs.container.offsetWidth) || 800;\n this.initWidth(); // 转换百分比为像素\n });\n\n // 监听窗口大小变化,更新容器宽度\n window.addEventListener(\"resize\", () => {\n this.$nextTick(() => {\n this.containerWidth = (this.$refs.container && this.$refs.container.offsetWidth) || 800;\n });\n });\n },\n\n methods: {\n // 处理单个对象,根据paramId匹配faultParameters并补充lineColor、max、min\n processSingleItem(item) {\n if (!item || !item.paramId) return;\n // 在faultParameters中查找匹配项\n const matchedParam = faultParameters.find(\n (param) => {\n param.paramId = param.paramId.map((id) => String(id));\n return param.paramId.includes(String(item.paramId));\n }\n );\n if (matchedParam) {\n // 如果原对象不包含lineType属性,就直接赋值\n if (!Object.prototype.hasOwnProperty.call(item, \"lineType\")) {\n item.lineType = matchedParam.lineType;\n }\n // 如果原对象不包含这些属性,就直接赋值\n if (!Object.prototype.hasOwnProperty.call(item, \"lineColor\")) {\n item.lineColor = matchedParam.lineColor;\n }\n // 如果原对象不包含max、min属性,就直接赋值\n if (!Object.prototype.hasOwnProperty.call(item, \"max\")) {\n item.max = matchedParam.max;\n }\n if (!Object.prototype.hasOwnProperty.call(item, \"min\")) {\n item.min = matchedParam.min;\n }\n }\n },\n // 处理配置对象,根据paramId匹配faultParameters并补充lineColor、max、min\n processConfig(config) {\n if (!config) return config;\n const processedConfig = cloneDeep(config);\n \n // 处理 dataSource 下的 templates\n if (processedConfig.dataSource && Array.isArray(processedConfig.dataSource.templates)) {\n for (const template of processedConfig.dataSource.templates) {\n if (Array.isArray(template.lanes)) {\n for (const lane of template.lanes) {\n if (Array.isArray(lane.lines)) {\n for (const line of lane.lines) {\n this.processSingleItem(line);\n }\n }\n }\n }\n }\n }\n \n // 处理 dataSource 下的 params\n if (processedConfig.dataSource && Array.isArray(processedConfig.dataSource.params)) {\n for (const param of processedConfig.dataSource.params) {\n this.processSingleItem(param);\n }\n }\n \n return processedConfig;\n },\n hiddenContextMenu() {\n if (this.$refs.chartContainer) {\n this.$refs.chartContainer.hiddenContextMenu();\n }\n },\n dialogFunction(data) {\n if (data.type === 1) {\n // 井深段\n if (this.$refs.functionControlPanel) {\n this.$refs.functionControlPanel.form.dataType = \"history\";\n }\n this.formCache.dataType = \"history\";\n } else if (data.type === 2) {\n // 时间段\n if (this.$refs.functionControlPanel) {\n this.$refs.functionControlPanel.form.dataType = \"history\";\n }\n this.formCache.dataType = \"history\";\n } else if (data.type === 3) {\n // 导出\n }\n },\n // 新增:处理图表可见数据变化\n visibleDataChange(data) {\n if (this.$refs.functionControlPanel) {\n this.$refs.functionControlPanel.handleToolBarDataChange(data);\n }\n if (this.$refs.depthTimeChart) {\n this.$refs.depthTimeChart.visibleDataRangeChange(data);\n }\n },\n // 新增:处理深度时间图表滑块变化\n handleDepthTimeChange(data) {\n if (this.$refs.chartContainer) {\n this.$refs.chartContainer.jumpToPosition(data);\n }\n },\n // 新增:跳转到下一个标记线\n jumpToNextMarkLine() {\n if (this.$refs.chartContainer) {\n this.$refs.chartContainer.jumpToNextMarkLine();\n }\n },\n // 新增:刷新数据,重置为初始化时的数据\n refresh() {\n this.formCache = cloneDeep(this.initialFormCache);\n this.showChartContainer = false;\n this.enableCurveDatasWatch = false;\n setTimeout(() => {\n const processedDepthConfig = this.processConfig(this.depthConfig);\n const processedTimeConfig = this.processConfig(this.timeConfig);\n this.config = this.formCache.axisType === \"depth\" ? processedDepthConfig : processedTimeConfig;\n if (JSON.stringify(this.config) !== \"{}\") {\n this.showChartContainer = true;\n }\n this.cachedCurveDatas = cloneDeep(this.initialCurveDatas || {});\n this.enableCurveDatasWatch = true;\n }, 0);\n },\n // 清空图表数据\n clearChartData() {\n if (this.$refs.chartContainer) {\n this.$refs.chartContainer.clearChartData();\n }\n },\n // 新增:更新form数据缓存\n updateForm(content) {\n let key = cloneDeep(content.key);\n let value = cloneDeep(content.value);\n this.formCache[key] = value;\n if (this.$refs.chartContainer) {\n this.$refs.chartContainer.updateSettings(content);\n }\n if (this.$refs.depthTimeChart) {\n this.$refs.depthTimeChart.updateSettings(content);\n }\n if (key === \"axisType\") {\n this.showChartContainer = false;\n setTimeout(() => {\n const processedDepthConfig = this.processConfig(this.depthConfig);\n const processedTimeConfig = this.processConfig(this.timeConfig);\n this.config = this.formCache.axisType === \"depth\" ? processedDepthConfig : processedTimeConfig;\n if (JSON.stringify(this.config) !== \"{}\") {\n this.showChartContainer = true;\n }\n }, 0);\n this.$emit(\"updateSettings\", { key: key, value: value, settings: cloneDeep(this.formCache) });\n }\n if (key === \"dataType\") {\n this.$emit(\"updateSettings\", { key: key, value: value, settings: cloneDeep(this.formCache) });\n }\n },\n // 新增:更新scale缓存\n updateScale(newVal) {\n this.formCache.scale = newVal;\n if (this.$refs.functionControlPanel) {\n this.$refs.functionControlPanel.form.scale = newVal;\n }\n },\n /**\n * 工具函数:百分比转像素\n * @param {String/Number} value - 百分比字符串(如'15%')或数字像素\n * @returns {Number} 转换后的像素值\n */\n percentToPx(value) {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\") return this.minWidth; // 非法值返回最小宽度\n\n // 匹配百分比字符串(如 '15%' → 15)\n const percentMatch = value.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percentMatch) {\n const percent = parseFloat(percentMatch[1]);\n return Math.max(this.minWidth, (this.containerWidth * percent) / 100);\n }\n\n // 纯数字字符串(如 '500' → 500)\n const numValue = parseFloat(value);\n return isNaN(numValue) ? this.minWidth : Math.max(this.minWidth, numValue);\n },\n\n /**\n * 初始化宽度:统一转换为像素值\n */\n initWidth() {\n // 根据配置判断是否显示各面板(仅 show === false 时隐藏)\n this.showPanel1 = this.parameterPanelConfig?.show !== false;\n this.showPanel2 = this.WellBitDepthTimePlotConfig?.show !== false;\n this.showPanel4 = this.currentToolBarConfig?.show !== false;\n\n this.lineWidth = 0;\n document.querySelectorAll(\".resizer\").forEach((item) => {\n this.lineWidth += item.offsetWidth;\n });\n this.panel1Width = this.showPanel1 ? this.percentToPx(this.parameterPanelConfig?.width ?? 140) : 0;\n this.panel2Width = this.showPanel2 ? this.percentToPx(this.WellBitDepthTimePlotConfig?.width ?? 280) : 0;\n this.panel4Width = this.showPanel4 ? this.percentToPx(this.currentToolBarConfig?.width ?? 120) : 0;\n },\n\n startResize(type, e) {\n this.isResizing = true;\n this.currentResizer = type;\n\n this.startX = e.clientX;\n this.startPanel1 = this.panel1Width;\n this.startPanel2 = this.panel2Width;\n this.startPanel4 = this.panel4Width; // 记录panel4起始宽度\n\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n\n document.addEventListener(\"mousemove\", this.handleMove);\n document.addEventListener(\"mouseup\", this.stopResize);\n },\n\n handleMove(e) {\n if (!this.isResizing) return;\n\n this.pendingEvent = e;\n\n if (!this.frameRequested) {\n this.frameRequested = true;\n requestAnimationFrame(this.updateSize);\n }\n },\n\n updateSize() {\n const e = this.pendingEvent;\n if (!e) return;\n\n const dx = e.clientX - this.startX;\n const min = this.minWidth;\n\n const containerWidth = (this.$refs.container && this.$refs.container.offsetWidth - this.lineWidth) || 0;\n\n // ✅ 拖拽第1条分隔线(panel1 和 panel2)\n if (this.currentResizer === 1) {\n let new1 = this.startPanel1 + dx;\n let new2 = this.showPanel2 ? this.startPanel2 - dx : 0;\n\n // 计算panel3和panel4的宽度(用于最小值校验)\n const new4 = this.showPanel4 ? this.panel4Width : 0;\n const new3 = this.showPanel3 ? containerWidth - new1 - new2 - new4 : 0;\n\n // 所有显示的面板都要满足最小值\n if (new1 < min || (this.showPanel2 && new2 < min) || (this.showPanel3 && new3 < min) || (this.showPanel4 && new4 < min)) {\n this.frameRequested = false;\n return;\n }\n\n this.panel1Width = new1;\n this.panel2Width = new2;\n }\n\n // ✅ 拖拽第2条分隔线(panel2 和 panel3)\n if (this.currentResizer === 2) {\n let new2 = this.startPanel2 + dx;\n const new1 = this.panel1Width;\n const new4 = this.panel4Width;\n const new3 = containerWidth - new1 - new2 - new4;\n\n // 确保panel2和panel3都满足最小宽度\n if (new2 < min || (this.showPanel3 && new3 < min) || (this.showPanel4 && new4 < min)) {\n this.frameRequested = false;\n return;\n }\n\n this.panel2Width = new2;\n }\n\n // ✅ 拖拽第3条分隔线(panel3 和 panel4)\n if (this.currentResizer === 3) {\n let new4 = this.startPanel4 - dx; // 反向计算:鼠标右移→panel4变宽,panel3变窄\n const new1 = this.panel1Width;\n const new2 = this.panel2Width;\n const new3 = containerWidth - new1 - new2 - new4;\n\n // 确保panel3和panel4都满足最小宽度\n if ((this.showPanel3 && new3 < min) || new4 < min) {\n this.frameRequested = false;\n return;\n }\n\n this.panel4Width = new4;\n }\n\n this.frameRequested = false;\n },\n\n stopResize() {\n this.isResizing = false;\n this.currentResizer = null;\n\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n\n document.removeEventListener(\"mousemove\", this.handleMove);\n document.removeEventListener(\"mouseup\", this.stopResize);\n },\n // 开启加载动画\n startLoading() {\n this.isLoading = true;\n },\n // 关闭加载动画\n stopLoading() {\n this.isLoading = false;\n },\n // 处理子组件的加载状态变化\n handleLoadingChange(isLoading) {\n this.isLoading = isLoading;\n },\n },\n // 组件销毁时移除事件监听,防止内存泄漏\n beforeUnmount() {\n document.removeEventListener(\"mousemove\", this.handleMove);\n document.removeEventListener(\"mouseup\", this.stopResize);\n },\n watch: {\n timeConfig: {\n handler(newVal) {\n if (this.formCache.axisType == \"time\") {\n this.showChartContainer = false;\n const processedConfig = this.processConfig(newVal);\n this.config = processedConfig;\n setTimeout(() => {\n this.showChartContainer = true;\n }, 0);\n }\n },\n deep: true,\n immediate: true,\n },\n depthConfig: {\n handler(newVal) {\n if (this.formCache.axisType == \"depth\") {\n this.showChartContainer = false;\n const processedConfig = this.processConfig(newVal);\n this.config = processedConfig;\n setTimeout(() => {\n this.showChartContainer = true;\n }, 0);\n console.log(this.config, \"depthConfig\");\n }\n },\n deep: true,\n immediate: true,\n },\n currentToolBarConfig: {\n handler() {\n this.$nextTick(() => this.initWidth());\n },\n deep: true,\n immediate: true,\n },\n parameterPanelConfig: {\n handler() {\n this.$nextTick(() => this.initWidth());\n },\n deep: true,\n immediate: true,\n },\n WellBitDepthTimePlotConfig: {\n handler(newVal, oldVal) {\n if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) {\n this.depthTimeChartData = newVal?.data || [];\n }\n this.$nextTick(() => this.initWidth());\n },\n deep: true,\n immediate: true,\n },\n // 监听curveDatas的变化\n curveDatas: {\n handler(newVal) {\n if (this.enableCurveDatasWatch) {\n if (JSON.stringify(this.initialCurveDatas) === \"{}\") {\n this.initialCurveDatas = cloneDeep(newVal || {});\n }\n if (\n Object.prototype.hasOwnProperty.call(newVal, \"dataType\") &&\n newVal.dataType !== this.formCache.dataType &&\n newVal.dataType !== \"\" &&\n newVal.dataType !== undefined &&\n newVal.dataType !== null\n ) {\n this.formCache.dataType = newVal.dataType;\n if (this.$refs.functionControlPanel) {\n this.$refs.functionControlPanel.form.dataType = newVal.dataType;\n }\n }\n this.cachedCurveDatas = cloneDeep(newVal || {});\n }\n },\n deep: true,\n },\n themeName: {\n handler(newVal) {\n document.body.setAttribute(\"data-theme\", newVal);\n },\n deep: true,\n immediate: true,\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@use \"../styles/theme/index.scss\";\n</style>\n\n<style lang=\"scss\" scoped>\n.kd-curve-2d-resize-container {\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 .container {\n display: flex;\n flex: 1;\n width: 100%;\n overflow: hidden;\n }\n\n /* 面板通用样式 */\n .panel {\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 &::-webkit-scrollbar {\n display: none;\n }\n }\n\n // panel3 自适应剩余宽度\n .panel-3 {\n flex: 1;\n min-width: 100px; // 最小宽度限制\n }\n\n /* 拖拽条样式 */\n .resizer {\n width: 6px;\n cursor: col-resize;\n &:hover {\n background-color: var(--resizer-bg-color);\n transition: background-color 0.2s ease;\n }\n }\n\n /* 加载动画遮罩 */\n .kd-curve-loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--loading-bg-color, rgba(255, 255, 255, 0.8));\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n }\n\n .kd-curve-loading-spinner {\n position: relative;\n width: 48px;\n height: 48px;\n }\n\n .kd-curve-loading-ring {\n position: absolute;\n width: 100%;\n height: 100%;\n border: 3px solid transparent;\n border-top-color: var(--loading-color, #EC4521);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n .kd-curve-loading-ring-delay {\n animation-delay: 0.5s;\n border-top-color: var(--loading-color, #EC4521);\n opacity: 0.5;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .kd-curve-loading-text {\n margin-top: 16px;\n color: var(--loading-color, #EC4521);\n font-size: 14px;\n }\n}\n</style>\n","import KdLaneContainerComponent from \"../src/components/kdLaneChart/kd-lane/chart-container.vue\";\nimport FrameLayoutComponent from \"../src/components/kdCurveV2/frame-layout/index.vue\";\n\n// Vue 3 插件 install 方法(签名为 app,而非 Vue)\nKdLaneContainerComponent.install = function (app) {\n app.component(KdLaneContainerComponent.name, KdLaneContainerComponent);\n};\nFrameLayoutComponent.install = function (app) {\n app.component(\"FrameLayout\", FrameLayoutComponent);\n app.component(\"frameLayout\", FrameLayoutComponent);\n};\n\nexport const KdLaneContainer = KdLaneContainerComponent;\nexport const FrameLayout = FrameLayoutComponent;\n// 向后兼容:旧的小写驼峰具名导出\nexport const frameLayout = FrameLayoutComponent;\nexport default { KdLaneContainer, FrameLayout, frameLayout };\n"],"names":["_sfc_main","_createElementBlock","_withDirectives","_openBlock","_hoisted_1","_Fragment","_renderList","index","_withModifiers","_normalizeClass","_createElementVNode","_hoisted_2","_createVNode","_createBlock","_vShow","_hoisted_3","_withCtx","_toDisplayString","_mergeProps","_hoisted_4","w","template","item","common","_hoisted_8","_hoisted_9","_hoisted_10","_normalizeStyle","_renderSlot","_hoisted_5","_hoisted_7","modeConfig","_hoisted_6","_createTextVNode","chartContainer","_a"],"mappings":"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"}
|