yeg
2026-09-08 b14aed8081626b7b7426d1fb7323180b126bde59
集成拼接同名字段身份隔离
2个文件已修改
18 ■■■■■ 已修改文件
src/api/spliceReports.ts 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
tests/e2e/splice-battery-segments.spec.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/spliceReports.ts
@@ -46,11 +46,14 @@
export function spliceSourceValue(segment: SpliceSegment, settings: SpliceSettings, field: SpliceField) {
  const manual = settings.detailFieldValues?.[field.name]?.[spliceSourceKey(segment.source)]
  if (manual !== undefined) return manual
  // 控制台详情只有名称,没有共享字段身份;模板字段一旦带 ID,必须按 ID 取组值,不能被同名详情冒认。
  if (field.fieldDefinitionId) {
    return segment.businessFields?.find(value => value.fieldDefinitionId === field.fieldDefinitionId)?.fieldValue ?? ''
  }
  const detail = segment.consoleDetail?.fieldValues[field.name]
  if (detail !== undefined) return detail
  if (segment.consoleDetail?.batteryFields.includes(field.name) || segment.consoleDetail?.specialFields.includes(field.name)) return ''
  // 用户明确选择的共享字段仍按其身份提供组值,不冒充缺失的控制台人工字段。
  return field.fieldDefinitionId ? segment.businessFields?.find(value => value.fieldDefinitionId === field.fieldDefinitionId)?.fieldValue ?? '' : ''
  return ''
}
export function spliceExperiment(segment: SpliceSegment, settings: SpliceSettings) {
  return settings.sourceExperimentNames?.[spliceSourceKey(segment.source)] ?? segment.consoleDetail?.experimentName ?? ''
tests/e2e/splice-battery-segments.spec.ts
@@ -1,5 +1,6 @@
import { expect, test, type Page } from '@playwright/test'
import { Ticket04Stack } from './support/ticket04-stack'
import { spliceSourceValue } from '@/api/spliceReports'
const stack = new Ticket04Stack()
const selection = (testBatteryId: number) => ({ testId: testBatteryId < 9703 ? 9701 : 9702, testBatteryId })
@@ -25,6 +26,16 @@
  }
})
test.afterAll(async () => stack.stop())
test('同名控制台字段与共享字段按身份隔离', () => {
  const segment: any = {
    source: { selection: { testId: 1, testBatteryId: 2 }, batteryNo: '1号' },
    businessFields: [{ fieldDefinitionId: 10, fieldName: '质量', fieldValue: '共享值' }],
    consoleDetail: { batteryFields: ['质量'], specialFields: [], fieldValues: { 质量: '控制台值' } },
  }
  expect(spliceSourceValue(segment, {}, { name: '质量', category: 'battery', displayName: '质量', unit: 'kg', fieldDefinitionId: 10 })).toBe('共享值')
  expect(spliceSourceValue(segment, {}, { name: '质量', category: 'battery', displayName: '质量', unit: '', fieldDefinitionId: null })).toBe('控制台值')
})
async function login(page: Page) {
  await page.goto('/login')
  await page.locator('input[autocomplete="username"]').fill('admin')