Files
WCTDataMiner/docs/architecture/数据处理流程.md
Scottxjw 2b031995e1 docs: 更新项目架构与数据模型文档
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-13 15:01:32 +08:00

3.9 KiB
Raw Blame History

数据处理流程

所属模块:架构概览


1. 完整流程

log 文件
  → parse
  → local.db
  → aggregate
  → release.db
  → export
  → WCT-ChargingParameterDatabase.csv

2. 阶段一parse → local.db

sequenceDiagram
    participant CLI as CLI
    participant PS as ParseService
    participant SS as ScenarioService
    participant FNP as FileNameParser
    participant QP as QfodParser
    participant PP as PlossParser
    participant DB as local.db

    CLI->>PS: ParseFileAsync(filePath)
    PS->>FNP: 解析文件名
    FNP-->>PS: ScenarioInfo
    PS->>SS: GetOrCreateScenarioAsync
    SS->>DB: 维度 upsert + 场景 upsert
    SS-->>PS: TestScenario
    PS->>PS: 逐行读取文件

    loop 每行
        alt Qfod 行
            PS->>QP: Parse(line)
            QP-->>PS: QfodRecord
        else Ploss 行
            PS->>PP: Parse(line)
            PP-->>PS: PlossRecord
        end
    end

    PS->>DB: BatchInsert QfodRecords
    PS->>DB: BatchInsert PlossRecords
    PS->>DB: UpdateScenarioStats
    PS-->>CLI: ParseReport

关键点:

  • 文件名格式: TxPanel-TxHardware-TxSoftware-RxType-Purpose-Date-Seq.log
  • 支持两行 Ploss 格式header 行 + 数据行)
  • 事务批量写入,读取 Parser:BatchSize 配置分批
  • 解析错误记录到 Serilog不阻断流程

3. 阶段二aggregate → release.db

sequenceDiagram
    participant CLI as CLI
    participant AS as AggregationService
    participant LDB as local.db
    participant RDB as release.db

    CLI->>AS: AggregateAsync()
    AS->>LDB: 读取所有 PlossRecord + 关联维度
    AS->>AS: 按 (车厂, 车型, 手机厂商, 型号) 分组
    AS->>AS: 计算 9 个功率列平均值
    AS->>AS: 计算 Q值/Q基值/P-Q系数
    AS->>RDB: DELETE + INSERT (事务)
    AS-->>CLI: AggregationReport

聚合规则:

字段 来源 计算方式
车厂 (CarFactory) 配置映射 Aggregation:TxPanelMappings 找不到映射时 fallback 为 TxPanel.Name
车型 (CarModel) 配置映射 Aggregation:CarModelMappings fallback 为 TxHardware.Version
手机厂商 (PhoneBrand) RxType.Name 拆分 取第一个分隔符前部分
型号 (PhoneModel) RxType.Name 拆分 取第一个分隔符后部分
350mW2250mW9列 PlossRecord.Field7 按功率匹配后取平均值
Q值 (QValue) QfodRecord.CurrentQ 平均值
Q基值 (QBaseValue) QfodRecord.RawQ 平均值
P-Q值系数 (PqCoefficient) PlossRecord.DeltaP 平均值
谐振频率 (ResonanceFrequency) 暂无 允许为空

替代配置:

配置文件 appsettings.json 中可添加映射:

{
  "Aggregation": {
    "TxPanelMappings": {
      "single-mold": "奇瑞",
      "dual-rapid": "智己"
    },
    "CarModelMappings": {
      "L6": "L6",
      "CM3": "CM3"
    }
  }
}

4. 阶段三export → CSV

sequenceDiagram
    participant CLI as CLI
    participant ES as ExportService
    participant RDB as release.db
    participant FS as Filesystem

    CLI->>ES: ExportChargingParametersToCsvAsync(outputDir)
    ES->>RDB: 读取 ChargingParameters (排序)
    ES->>FS: 写入 WCT-ChargingParameterDatabase.csv
    ES-->>CLI: 文件路径

导出规格:

  • 固定文件名: WCT-ChargingParameterDatabase.csv
  • 固定 17 列 UTF-8 BOM
  • RFC 4180 转义
  • 数字使用 invariant culture

5. 数据库隔离

local.db                          release.db
─────────                         ──────────
tx_panel                          charging_parameter
tx_hardware                       (独立实体,无外键)
tx_software
rx_type
test_scenario
qfod_record
ploss_record

无关联 ←→ 无关联
  • 代码中不存在 local entity 到 release entity 的导航属性
  • 数据库中没有跨库外键
  • export 不读 local.dbaggregate 不写 local.db