Page:
T-004
Pages
00-ai-start-here
01-vision
02-requirements
03-tech-stack
04-architecture
05-coding-rules
06-tasks
07-user-stories
08-interaction-checklist
Design
Home
Integrations-shunyunbao-contract
PPT
T-001
T-002
T-003
T-004
T-101
T-102
T-103
T-104
T-201
T-202
T-203
T-204
T-205
T-206
T-207
T-208
T-209
T-210
T-211
T-212
T-213
T-214
T-215
T-216
T-217
T-218
T-219
T-220
T-221
T-222
T-223
T-224
T-225
T-226
T-227
T-228
T-229
T-230
T-231
T-232
T-233
T-234
T-235
T-236
T-237
T-238
T-239
T-240
T-241
T-242
T-243
T-244
T-245
T-246
T-247
T-248
T-249
T-250
T-251
T-252
T-253
T-254
T-255
T-256
T-257
T-258
T-259
T-260
T-261
T-262
T-263
T-264
T-265
T-266
T-267
T-268
T-269
T-270
T-271
T-272
T-273
T-274
T-275
T-276
T-277
T-278
T-279
T-280
T-281
Task-Template
Tasks
agent-context
api
clean-state-checklist
current-state
routes
Clone
Table of Contents
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
同步来源:
docs/tasks/T-004.md· commitafc651f75a3a
id: T-004
title: 导入本机蝦皮订单验证样本
phase: 0
deps: [T-001]
status: DONE
created: 2026-07-25
context_ref: d57c4ae2d4
work_branch: main
write_paths:
- docs/tasks/T-004.md
- android-buyer/build.gradle.kts
- android-buyer/settings.gradle.kts
- android-buyer/task-contract/**
- android-buyer/tools/**
- android-buyer/app/build.gradle.kts
- android-buyer/app/src/main/java/com/roubao/autopilot/workflow/**
- android-buyer/app/src/debug/**
- android-buyer/app/src/test/**
- .gitignore
- README.md
- docs/00-ai-start-here.md
- docs/02-requirements.md
- docs/03-tech-stack.md
- docs/04-architecture.md
- docs/05-coding-rules.md
- docs/current-state.md
- progress.md
问题 / 背景
第一层技术探针需要使用用户已有的蝦皮订单资料,而不是在 Android 代码里硬编码虚构 需求。本机目录中一份文本和一份参考图以蝦皮订单号同名;文本包含自己的店铺名、 待采集商品标题、SKU 和数量。Android 设备不能直接读取 Windows 绝对路径,需要一个 Debug/测试专用导入边界。
首份同名样例已在 2026-07-25 完成非业务内容核实:文本是可按 UTF-8 解码的无 BOM
四行格式,标签为 店铺名:、商品标题:、SKU:、数量:;参考图是可解码的
JPEG。正式私有目录、额外图片类型和一单多 SKU 规则仍未固定。
关联需求与交互
- 功能:为 F-004 提供第一层原始输入,不改变正式 F-001 创建任务流程。
- 用户故事:US-004。
- 交互:无生产 UI;导入失败通过开发命令和测试报告返回。
- 架构/API:
04-architecture.md3.1;不调用正式后台 API。
方案
- 正式私有目录约定为仓库根目录
private-fixtures/shopee/,工具仍要求显式--input;当前根目录样例保持原位并继续通过本地 exclude 隔离。 - 以已核实的 UTF-8 四行标签和 JPEG 内容为首版契约;允许
.jpg/.jpeg扩展名, 一张订单只允许一行 SKU 和一张参考图。 - 实现开发机导入工具,按文件主名精确配对文本和唯一参考图。
- 校验订单号、店铺名、标题、SKU、正整数数量、图片存在且可解码。
- 生成与未来 HTTP
TaskSource同构的ProbeTask,输出到被 Git 忽略的.local/目录,供 Debug 构建和测试装载。 - 为有效样本、缺图、多图、重复订单号、未知编码/格式、非法数量和敏感日志编写测试。
验收要点
- 一组合法脱敏文本和参考图能稳定生成一个
ProbeTask。 source_order_no来自文件主名;标题、SKU 和数量与原文完全一致。- 缺失或匹配到多张参考图、必填字段缺失、数量非法时导入明确失败。
- Android workflow 通过
TaskSource消费结果,不依赖 Windows 路径或导入器类型。 - 真实订单文件、图片、生成物和本机绝对路径均未进入 Git。
- 日志不包含完整订单号、店铺名或原图绝对路径。
- 普通自动化测试不调用真实付费 VLM。
边界
- 不实现 Go-Gin、SQLite、任务领取、鉴权或管理 Web。
- 不实现拼多多自动化和 VLM 供应商调用。
- 不把模糊文本解析结果当成成功,不静默选择重名图片。
- 不处理未经确认的一单多 SKU 格式。
执行记录
2026-07-25:任务开始
- 基于 T-003 提交
d57c4ae开始,依赖 T-001 已满足。 - 前置检查确认一组同名文本/JPEG 存在,文本字段结构和图片解码有效;未记录或提交 实际订单号、店铺名、商品内容及图片。
- 固定首版规则:推荐私有目录为
private-fixtures/shopee/;只接收实际内容为 JPEG 的.jpg/.jpeg;一张订单只有一个 SKU 和一张参考图,多 SKU 必须先扩展契约。
2026-07-25:实现和验证完成
- 新增纯 Kotlin
task-contract模块,统一定义ProbeTask、ProbeReferenceImage、TaskSource和版本化 JSON codec;Android 与开发机工具使用同一模型。 - 新增
tools:shopee-importerCLI。它要求显式输入/输出目录,严格解析 UTF-8 无 BOM 四行标签,只接受唯一且可解码的 JPEG,限制文本 64 KiB、图片 20 MiB,并为错误 返回稳定 code。 - 生成物使用匿名
probe_id和匿名图片文件名,但私有 JSON 内保留权威source_order_no、店铺名、标题、SKU、数量;参考图保存大小和 SHA-256。 - 输出目录必须为空或带工具 marker,避免清理任意目录;CLI 普通输出只有导入数量, 不打印完整订单号、店铺名或源路径。
- 新增 Debug
FixtureTaskSource和ProbeWorkflowCoordinator。workflow 只依赖TaskSource,不知道任务来自文件还是未来 HTTP。 syncProbeFixtures仅在显式传入-PprobeFixturesDir时把私有生成物放入 Debug 构建资产;不带属性的普通构建会清空先前生成资产。- 脱敏测试覆盖 JSON round-trip、合法导入、缺图、多图、未知图片类型、非法 UTF-8、 缺字段、非法数量、损坏 JPEG、大小写重复订单号、敏感 CLI 输出和 Android TaskSource/workflow 边界。
- 真实本地样本运行成功并生成 1 个任务;自动比较确认订单号、店铺名、标题、SKU、 数量逐字段相等,参考图复制前后 SHA-256 相等。比较结果只记录布尔值,未输出内容。
- 带私有属性的 Debug APK 包含 1 个任务文档和 1 张匿名 JPEG;随后默认重建确认 APK
中
probe-fixtures条目为 0,生成资产也已清除。 - 全量
lintDebug test assembleDebug成功;三个模块共 38 次测试执行, 0 failure、0 error、0 skipped。