From 802057a42167d8bd99be4d0b08c25cff422d1535 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 07 九月 2026 21:26:06 +0800
Subject: [PATCH] 修复拼接人工值清理和多电池来源分界

---
 tests/e2e/data-analysis-integrated-acceptance.spec.ts |   35 +++++++++++++++++++++++++++++++----
 1 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/tests/e2e/data-analysis-integrated-acceptance.spec.ts b/tests/e2e/data-analysis-integrated-acceptance.spec.ts
index a37f617..cf2e81f 100644
--- a/tests/e2e/data-analysis-integrated-acceptance.spec.ts
+++ b/tests/e2e/data-analysis-integrated-acceptance.spec.ts
@@ -321,6 +321,12 @@
   await expect(page.getByText('字段模板已保存', { exact: true })).toBeVisible()
   await page.getByRole('dialog', { name: '选择拼接字段模板', exact: true }).getByRole('button', { name: '应用模板', exact: true }).click()
   await page.getByRole('textbox', { name: '连续来源3 同名电池 循环3 最终电压1', exact: true }).fill('-1.25')
+  await page.getByRole('textbox', { name: '连续来源3 第二电池 循环3 最终电压1', exact: true }).fill('9')
+  await page.locator('.panel-actions .el-checkbox').filter({ hasText: '第二电池' }).click()
+  await expect(page.locator('.statistics-editor tbody tr')).toHaveCount(5)
+  await page.locator('.panel-actions .el-checkbox').filter({ hasText: '第二电池' }).click()
+  await expect(page.getByRole('textbox', { name: '连续来源3 第二电池 循环3 最终电压1', exact: true })).toHaveValue('')
+  await expect(page.getByRole('textbox', { name: '连续来源3 同名电池 循环3 最终电压1', exact: true })).toHaveValue('-1.25')
   for (const width of [1440, 390]) {
     await page.setViewportSize({ width, height: 900 })
     await expect.poll(() => page.evaluate(() => document.documentElement.scrollWidth <= innerWidth)).toBe(true)
@@ -392,12 +398,12 @@
     }
     await page.goto(`/report-${kind}`)
     await expect(page.getByRole('button', { name: /新建|新增/ })).toHaveCount(0)
-    await expect(page.locator('tbody').getByRole('button', { name: '编辑', exact: true })).toHaveCount(0)
+    await expect(page.locator('tbody').getByRole('button', { name: /^编辑(报表)?$/ })).toHaveCount(0)
     await expect(page.locator('tbody').getByRole('button', { name: '删除', exact: true })).toHaveCount(0)
   }
   for (const kind of kinds) {
     await login(page)
-    const username = `ticket13_actor_${kind}`
+    const username = `t13_${kind}_actor`
     const permissions = modules.find((module: any) => module.pageName === names[kind]).permissions
     await api(page, 'role', 'POST', { roleName: username, roleKey: 'common', roleSort: 1, status: '0', menuIds: permissions.map((item: any) => item.menuId) })
     const role = (await api(page, `role/list?roleName=${username}`)).rows[0]
@@ -425,7 +431,7 @@
     await page.goto(`/report-${kind}`)
     await expect(page.getByRole('button', { name: /新建|新增/ })).toBeVisible()
     const row = page.locator('tbody tr').filter({ hasText: `跨创建人-${kind}` })
-    await expect(row.getByRole('button', { name: '编辑', exact: true })).toBeVisible()
+    await expect(row.getByRole('button', { name: /^编辑(报表)?$/ })).toBeVisible()
     await expect(row.getByRole('button', { name: '删除', exact: true })).toBeVisible()
     await api(page, `${kind}-report/${first.id}`, 'DELETE')
     await api(page, `${kind}-report/${own.id}`, 'DELETE')
@@ -442,7 +448,7 @@
   await expect(page.getByText('测试详情已保存', { exact: true })).toBeVisible()
   await page.reload()
   await expect(page.locator('.detail-meta input')).toHaveValue('Ticket13 工步详情回归')
-  await page.locator('.data-select-panel .step-select').first().getByRole('combobox').click()
+  await page.locator('.data-select-panel .step-select').first().locator('.el-select').click()
   await page.getByRole('option', { name: '循环 3', exact: true }).click()
   await expect(page.locator('.battery-range-row .range-label').first()).toContainText('循环 3')
   await page.locator('.metric-switches label').filter({ hasText: '温度' }).click()
@@ -461,3 +467,24 @@
   await expect(page.locator('.project-chart canvas')).toHaveCount(3)
   expect((await api(page, 'test/9303/data/records')).data).toEqual(before)
 })
+
+test('多电池循环覆盖不同,图上来源分界仍位于该测试最早拼接循环', async ({ page }) => {
+  await login(page)
+  for (const table of ['t_test_realtime_record', 't_test_step_record', 't_test_cycle_record']) {
+    stack.executeIsolatedSql(`DELETE FROM ${table} WHERE (test_battery_id=9403 AND cycle_no=1) OR (test_battery_id=9402 AND cycle_no=5)`)
+  }
+  const saved = (await api(page, 'splice-report', 'POST', {
+    ...payload('splice', '不同循环覆盖的来源分界'),
+    selections: [selection(9303), selection(9303, 9403), selection(9302), selection(9302, 9402)],
+  })).data
+  expect(saved.segments.map((segment: any) => segment.originalCycleNos)).toEqual([[1, 3, 5], [3, 5], [5, 7], [7]])
+  expect(saved.segments.map((segment: any) => segment.offset)).toEqual([0, 0, 1, 1])
+  await page.goto(`/report-splice/${saved.id}/edit?mode=view`)
+  const lines = page.locator('.splice-chart').first().locator('svg path[stroke="#82909b"]')
+  await expect(lines).toHaveCount(2)
+  const positions = await lines.evaluateAll(lines => lines.map(line => (line as SVGPathElement).getPointAtLength(0).x))
+  // 固定900像素图中循环1、6位于122和622附近;允许描边对齐的半像素偏移。
+  expect(Math.abs(positions[0]! - 122)).toBeLessThanOrEqual(1)
+  expect(Math.abs(positions[1]! - 622)).toBeLessThanOrEqual(1)
+  await page.screenshot({ path: 'tests/e2e/.artifacts/ticket11-asymmetric-cycles.png', fullPage: true })
+})

--
Gitblit v1.7.1