# 08 — 客户导入 **What to build:** 用户能上传 Excel 异步导入客户主数据 + 联系人子表,三选一导入方式(仅新增/仅更新/新增或更新),行级处理允许部分成功,导入前预校验展示预计数、导入后出结果页与失败明细下载。 **Blocked by:** 02 — 客户主表 CRUD + 查重校验;03 — 联系人子表 **Status:** ready-for-agent **Spec 依据(详见 issues/09-answer.md)**:D16 三模式导入 + 异步 + 行级部分成功;OCR 快捷新增划出(Out-of-scope)。D26 翻案后联系人电话口径。 - [ ] 三导入方式(票 09 §B):仅新增/仅更新/新增或更新;匹配顺序=① 客户编号完全一致 → ② 统一社会信用代码完全一致 - [ ] 匹配边界:编号与信用代码均缺失/均未匹配→不凭名称自动覆盖(名称相似列"疑似重复"本次不写入);分别匹配到不同客户→该行冲突禁止导入;文件内多行匹配同一客户→覆盖/不导入互斥(默认不导入) - [ ] 字段语义(票 09 §C):新增导入必填空→行失败;更新导入空白单元格=不修改(V1 不支持清空);`customer_stage` 固定=潜在不得指定;禁止导入改负责人/协同人/阶段回退/工商字段/战略协议/汇总字段 - [ ] **联系人子表口径(D26 翻案后)**:电话匹配本客户→更新;匹配他客户→**软提示疑似重复、不禁止导入**(跟随「联系电话」开关,关则不提示)、**不做跨客户电话唯一硬拦**;电话空→按"客户+姓名+职务"疑似重复不自动覆盖;同文件内同客户电话相同两行→该行失败 - [ ] 原子单元=单条客户主记录/单条联系人子记录;联系人失败不回滚已成功客户主记录 - [ ] 任务模型(票 09 §D,对称商机/线索导入范式):异步任务;预校验(文件类型.xls/.xlsx、≤20MB、模板版本、表头无空、单sheet≤50000行、忽略公式/图片);行级部分成功 - [ ] 结果页:任务状态/总行数/新增成功/更新成功/未变化/失败/提交人/时间;失败明细(sheet/行号/客户识别/失败字段/原因)可下载、敏感值按权限脱敏 - [ ] 操作日志:记任务ID/方式/模板版本/文件哈希/成功失败数;**不记文件名/内容/敏感原值**;超时异常→标失败不让重复提交 - [ ] 契约(票 09 §D):upload / {taskId}/confirm / {taskId} / {taskId}/failures / import/page / import/template