Files
atlas-seller-kit/docs/Atlas-ERP-深度审查报告-2026-10-08.md
2026-10-08 17:37:10 +08:00

212 lines
29 KiB
Markdown
Raw Permalink Blame History

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.
# Atlas Seller Kit 深度审查报告
审查日期:2026-10-08。项目:`/Users/joey-xd/sites/seller-store/atlas-seller-kit`。审查版本:`06dbd81`(2026-10-07),审查前后 Git 工作区均干净,未修改项目。
## 结论与下一步选择
**建议现在进入小批量上品运营,只修影响首批可售、价格正确和收费安全的问题。不要再以“完善 ERP”为开始经营的前提。**
代码已具备完整的商品准备工作台:浏览器采集 → 采集箱 → SPU/SKU 草稿 → AI 文案与类目建议 → 图片处理/生图 → 定价确认 → 发布预检 → Ozon 导入与图片状态确认 → 在线商品同步。工程基础明显超过“前端页面加几个模型 API”的阶段,能够作为 AI 全栈项目经历。
但它的准确定位是**商品采集、编辑和首次发布工具**。当前没有完整的选品决策、库存写入、订单履约、退款和实际利润闭环。商品导入成功并不意味着可售,也不能证明能够盈利。继续打磨界面和生图功能不会解决这些经营不确定性。
对个人自用:已适合受控的小批量验证。对公开收费 SaaS:任务恢复、费用控制、安全与部署仍有明显缺口,不建议直接开放注册并推广。
不提供一个笼统的“完成度 85%”:商品准备、可售状态、商业验证和生产运维的分母不同,合成数字容易误导。
## 1. 本次实际验证范围
已读取根 README、工作约定、交接记录、协作契约、依赖与配置、路由与关键页面、采集扩展、认证/权限、商品与定价服务、AI 与图片 Worker、发布/同步、数据库迁移、任务调度和测试。核对真实 `.env` 时仅检查配置项是否存在及少量非秘密枚举;没有输出密钥值。未进行依赖漏洞联网审计。
所有编译与测试在当前会话 `work/` 下的隔离副本执行,复用本机已安装依赖,没有复制真实 `.env`、安装新依赖或修改原项目。默认 Node 为 22.15.0;检查改用本机自带 Node 24.19.0,略低于仓库声明的 24.20.0 下限。因此这些结果不是对严格声明运行时的一次完整验收。没有升级运行时。
| 实际检查 | 结果 | 边界 |
|---|---|---|
| contracts / database 编译 | 通过 | 先构建共享包,再检查应用 |
| API 源码与测试类型检查、Worker/Web/扩展类型检查 | 全部通过 | 不代表数据库与远端配置有效 |
| API / Worker / Web / Chrome MV3 扩展构建 | 全部通过 | Web 有大包告警 |
| API 单元测试 | 17 文件、77 项通过 | 未运行数据库集成与 HTTP 端到端测试 |
| Worker 离线测试 | 67 项通过 | 排除数据库集成文件;模型/平台使用模拟调用 |
| 扩展解析与载荷测试 | 22 项通过 | 不是当前真实网站登录态采集验收 |
| 针对恢复/脱敏的额外模拟 | 3 项复现 | 文案 running 重投、队列丢失后投递、供应商原文 |
合计 166 项既有离线测试通过。额外 3 项模拟确认了报告中的缺口,不表示缺陷已修复。
没有连接真实数据库进行迁移或修改数据;没有启动/重启 API、Worker、Web,没有浏览器登录验收;没有调用收费模型、写入 Ozon 或变更七牛。历史文档中的真实验收记录单独标为历史证据。
检查中曾遇到共享包旧产物与隔离副本缓存目录权限问题,调整副本依赖及缓存目录后通过,不能把这些中间失败算作现行源码编译缺陷。`commission-import.test.ts` 顶层强制读取真实 `.env`,包含数据库集成,首次尝试因隔离副本无 `.env` 而失败;随后明确排除,77 项单元测试独立通过。
## 2. 功能清单:已实现、有限实现与未实现
| 能力 | 代码状态 | 关键证据与限制 |
|---|---|---|
| 注册/登录/刷新/资料/密码 | 已实现 | `apps/api/src/auth/`、Web settings 与 session;短期令牌、刷新轮换、认证限流 |
| 个人工作空间、多店铺 | 已实现 | Workspace Guard、stores 服务;首期每用户选一个个人空间,不是完整团队协作产品 |
| 1688、淘宝、天猫、Ozon 采集 | 已实现 | `apps/extension/lib/source-parsers.ts:15`、后台与 content scripts;依赖页面结构,淘宝/天猫样本覆盖弱于 1688 |
| 采集箱、来源资料、素材转存 | 已实现 | `apps/api/src/collection/collection.service.ts`、`apps/worker/src/collection-assets.ts`;不支持 HLS 转存 |
| 商品/SKU 草稿与平台属性 | 已实现 | 商品编辑页面、商品服务、contracts;SPU/SKU 继承、属性 schema、版本冲突和人工确认 |
| DeepSeek 文案与类目建议 | 已实现 | `product-ai.service.ts` 创建任务/快照/Outbox;Worker 生成俄文及中文对照、类目选择、货号规则、包装证据验证 |
| Ozon 必填属性全自动填写 | 未完整实现 | 动态属性加载与人工填写已实现;不能把 AI 类目/标题生成宣传成全部属性自动完成 |
| 单图编辑、扩图、水印、套图 | 已实现 | API media 模块、Worker `media-ai-edit.ts`、`image-suite-plan.ts`;套图支持规划、逐张任务、取消和失败部分重试 |
| GPT-Image-2 接入 | 已实现供应商适配 | `media-ai-edit.ts:212` 使用模型字符串,通过 **Pcore** 异步接口调用;不是直接验证了 OpenAI 官方接口或供应商底层模型身份 |
| SKU 试算、利润预估、确认报价 | 已实现 | 服务端 Decimal 引擎、不可变报价、保存确认、佣金导入、费率审核;试算输入与真实账单一致性仍待业务核对 |
| 首次 Ozon 发布 | 已实现 | 发布操作、不可变快照、预检、Outbox、Worker import/poll/reconcile;每批最多 50 SKU |
| 图片交付与缺图提示 | 已实现 | checksum 校验、独立发布副本、私有 HTTPS、图片状态查询;支持 imported 后继续检查图片 |
| 在线商品同步/状态浏览 | 已实现 | `online-products` API/Web、Worker 同步与映射;失败不冒充成功全量,连续未见归档 |
| 在线商品全面更新、库存写入、订单履约 | 未发现完整实现 | 当前同步与详情主要读取;首次发布明确要求到 Ozon 后台设置库存 |
| 选品研究、需求/竞争/销售验证 | 未发现完整实现 | 采集是资料输入工具,缺少销量需求、供应链质量和毛利实证闭环 |
| 多平台发布、团队协作、计费 SaaS | 架构预留/未完整实现 | 通用模型存在,现行发布具体落到 Ozon;没有证据支持这些能力已经上线 |
当前路由直接连接真实业务页面,`PagePlaceholder.tsx` 没有发现业务调用。**不能沿用根 README 的“其余页面占位”结论**;README 明显落后于现行代码。[路由证据](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/web/src/router/index.tsx:50)、[旧 README](/Users/joey-xd/sites/seller-store/atlas-seller-kit/README.md:7)。
## 3. 关键链路与质量判断
### 3.1 数据与权限:基础扎实,仍须数据库实测
API 先验证用户,再从 membership 确认个人工作空间,不信任客户端随意传入租户 ID;每个工作空间事务设置 `app.workspace_id`,应用事务降权为 `atlas_app`。迁移中大量业务表使用复合外键、唯一约束及 FORCE RLS。系统管理员权限实时查库,撤销不依赖 JWT 到期。
这比仅在请求中增加 `workspace_id` 更完整。但本次没有验证实际数据库角色、当前迁移账本和跨租户运行结果,不能宣布所有表均已安全验收。
证据:[数据库事务](/Users/joey-xd/sites/seller-store/atlas-seller-kit/packages/database/src/pool.ts:15)、[工作空间 Guard](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/workspace/workspace-context.guard.ts:47)、[管理员 Guard](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/platform-catalog-admin/system-admin.guard.ts:17)、[发布 RLS](/Users/joey-xd/sites/seller-store/atlas-seller-kit/packages/database/migrations/055_product_first_publish.sql:64)。
仓库有 62 个 SQL 迁移。执行器按文件 checksum 防止历史迁移被改写、单文件原子提交,方向正确;没有看到跨迁移进程的全局锁。单机串行部署可暂不改,未来多人/自动部署时要限制并行迁移。
### 3.2 前后端与商品保存:边界清晰,维护成本正在上升
共享 contracts 使用 Zod、严格 TypeScript;API/Worker 与 Web 分离,耗时任务不直接压在 HTTP 上。商品、SKU、平台 profile 和报价分别建模,草稿保存与 AI 回填不是同一次写入。发布任务冻结输入,后续页面编辑不会悄悄改写已经排队的发布内容。版本冲突与幂等机制有实现。
但商品服务约 2,588 行,商品编辑页约 1,814 行,定价服务约 867 行。现阶段改动涉及大量表单继承/轮询/保存状态,回归成本高。建议只随具体缺陷提取保存、AI 回填、发布状态等独立职责,不做一次性重构。
证据:[编辑页](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/web/src/pages/products/ProductEditPage.tsx:470)、[商品服务](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/product-editor/product-editor.service.ts:1)、[AI 快照创建](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/product-editor/product-ai.service.ts:20)。
### 3.3 AI:是有工程边界的工作流,可靠性与费用仍未闭环
DeepSeek 请求要求 JSON,设超时、有限重试,关闭思考以保留输出预算;对文案语言/标签、候选类目和包装证据有业务校验。模型没有获得直接改价或上架权限。套图规划与生图异步执行,重试代次防止旧结果污染新任务。这些均有实际代码及离线测试支持。
业务质量仍不能用“JSON 合法”或“含俄文字母”证明:标题是否地道、分类是否正确、卖点是否真实、图片是否改变实物、SKU 是否串款,需要标注样本和人工验收。目前更适合描述为 **AI 商品工作流/AI 应用系统**;没有必要为了履历重新包装成自主 Agent。
DeepSeek 返回 usage,但普通文案任务没有把它写入已有 `token_usage` 字段;套图规划会保存总 token,生图费用和全链路预算没有看到闭环。图像单次任务 20 张的上限不能替代按人/工作空间的费用上限。
证据:[生成与任务保存](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/product-ai.ts:60)、[模型调用](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/product-ai.ts:638)、[token 字段](/Users/joey-xd/sites/seller-store/atlas-seller-kit/packages/database/migrations/029_product_ai_autofill.sql:24)、[套图用量保存](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/image-suite-plan.ts:284)。
### 3.4 任务与容错:发布谨慎,所有任务未达到同一恢复水平
Outbox 在业务事务中创建,Dispatcher 用 `SKIP LOCKED` 与租期认领,BullMQ jobId 固定为 event ID,最多 5 次指数退避。发布 Worker 有独立租期、提交前货号查询、受理不确定时对账,避免盲目重新导入。图片查询与商品导入分开确认,能保留缺图警告。
但是“使用了 Outbox/BullMQ”不能等于“任意崩溃都能恢复”。具体缺口见下一节。当前公共业务队列 concurrency 为 5,目录有独立队列;没有看到店铺/API 维度完整的主动限速,仅处理平台 429 等响应。首批少量 SKU 可控,暂不需要拆更多队列或服务。
证据:[Dispatcher](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/outbox-dispatcher.ts:36)、[发布租期](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/product-publish.ts:167)、[图片结果确认](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/product-publish.ts:321)、[队列分工](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/main.ts:90)。
### 3.5 密钥、日志与存储:有保护设计,也存在具体遗漏
门店 API Key 使用 AES-256-GCM 密文、随机 nonce 和 HMAC 指纹;Outbox 通常只带任务/记录 ID。refresh Cookie 为 HttpOnly,生产 Secure,令牌可轮换。`.env` 被忽略且当前未跟踪。API 有 Helmet、请求大小限制、请求 ID、字段名递归日志脱敏与认证限流。
需要区分:`AppLogger` 的对象字段脱敏不会自动清洗任意字符串/URL;HTTP 日志记录 `originalUrl`,未来一旦查询参数携带秘密会被直接记录。Worker 日志也没有完全统一为相同的结构化脱敏管道。
扩展为登录互操作把短期 access token 镜像到 Web localStorage,这是项目已明确接受的取舍,不是误读为全部令牌都仅在内存。当前不应扩大它;公开部署前验证前端 CSP 和 XSS 防护,API 的 Helmet 配置不能替代 Web 静态站点的响应头。
证据:[凭据加密](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/stores/store-secret.crypto.ts:22)、[日志器](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/logging/app-logger.ts:1)、[请求日志](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/main.ts:106)、[token 镜像](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/web/src/services/authToken.ts:1)。
## 4. 具体问题、证据与影响
### A. 首单前必须确认的经营与配置问题(P0)
**A1:首次导入不提交库存,实际可售闭环需人工完成。** Worker 的发布字段明确不包含库存/仓库;界面也写明库存在 Ozon 后台设置。没有库存、审核或可见性条件未满足时,导入成功无法产生订单。最小方案是每批上品后按后台清单补库存、配送与售价,检查实际可见性;暂不开发库存模块。[请求映射](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/product-publish.ts:51)、[界面说明](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/web/src/pages/products/components/ProductPublishActions.tsx:409)。
**A2:按划线价提交 `price`,预期实际售价依赖后续后台操作。** API 明确使用 `listing.list_price`;10 月 4 日交接说明这是维护者已确认的业务规则,不能把它当作未经授权的程序 bug。其后果是忘记调整/配置实际成交价时,预估利润和转化依据可能与线上不一致。首批必须核对买家端价格或后台生效售价,不必先改公式。[冻结价格](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/product-editor/product-editor.publish.ts:393)、[提示](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/web/src/pages/products/components/ProductPublishActions.tsx:536)。
**A3:草稿费率默认允许生产报价,报价确认不等于费率已审核。** `draftPricingEnabled` 在 auto 时仅排除 test,production 同样允许;这是现有业务选择。首批可以人工保守报价,但必须核对选用物流、佣金档位、重量尺寸、汇率和其他扣费,把不确定成本显式预留。无法取得真实费用依据的商品不要批量铺货。本次未读真实账单或当前费率数据,不能确定哪些卡已审核。[默认行为](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/config/app-config.module.ts:116)、[定价引擎](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/pricing/pricing-engine.ts:1)。
**A4:根 `.env` 与历史七牛发布验收存在配置差异,需要核实真实进程配置来源。** 静态根 `.env` 为 development;未显式设置七牛 provider/交付域名或首次发布开关,AI 相关 key 已存在。代码 fallback 是本地 MinIO,但发布图片必须走七牛。实际进程可能有外部环境变量覆盖;本次未读取运行进程环境,不能断言现有服务配置错误。最小方案是只读展示有效 provider、发布开关、下载域名与环境名称,不展示密钥;确认使用七牛的商品素材和当前 Worker 配置一致。[Worker 配置](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/config.ts:36)、[交付硬约束](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/ozon-publish-media.ts:53)。
### B. 可靠性、费用与安全缺口(P1;公开提供服务前提升为阻断项)
**B1:文案任务在 Worker 中断后可能永久 running。已离线复现。** 任务先提交 running,再远端调用;重复执行只接受 queued,遇到 running 直接返回。进程在两步之间崩溃,BullMQ 重投也不会恢复;主 Worker 终态失败处理未覆盖文案任务。素材转存同样只认领 queued,部分中断状态需要检查。最小修复:领取租期/attempt 标识、过期任务允许重新认领或明确失败、结果回写校验处理权;先保障状态可解释,不必承诺恰好一次收费。[文案门槛](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/product-ai.ts:72)、[素材认领](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/collection-assets.ts:20)、[失败处理](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/main.ts:190)。
**B2:Redis 丢失后,已 dispatched 事件没有完整恢复路径。模拟复现。** Dispatcher 只选 pending/过期 dispatching,入队后标 dispatched;若队列丢失而业务未终态,启动代码没看到扫描此类业务任务重新投递的机制。Compose 也未给 Redis 配持久卷/AOF。最小修复:Redis 持久化 + 受控未完成任务对账/重投;重投必须尊重发布的 submitting/reconciling 与生图供应商 ID,不能把所有任务简单重置 queued。[认领过滤](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/outbox-dispatcher.ts:36)、[标记已投递](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/outbox-dispatcher.ts:75)、[启动流程](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/main.ts:426)、[Redis 配置](/Users/joey-xd/sites/seller-store/atlas-seller-kit/infra/compose.yaml:28)。
**B3:生图在供应商受理、任务 ID 落库之间存在重复收费窗口。静态推断,未触发真实调用。** 外部 POST 成功后才保存 provider_task_id;响应丢失或保存失败,自动重试仍见空 ID,会重新提交。没有看到供应商幂等键、提交租期或“不确定受理”对账状态。并发事件也没有跨外部调用的独占处理权。最小修复:记录提交 attempt;支持供应商幂等键时复用稳定 key,否则受理不确定进入显式状态,避免自动重复 POST,提示人工核对。不要为了此事改成 Agent。[提交与保存](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/media-ai-edit.ts:410)。
**B4:供应商错误原文未脱敏,并可返回页面。已用虚假 token 复现。** rawResponse 仅截断长度;failure_detail 的脱敏不覆盖 provider_error_raw。原文落入 operations,任务列表 API 返回,Web 以 pre 展示。若供应商回显凭据或签名链接,就扩大秘密暴露面。没有证据证明当前真实密钥已泄露,也不是已证明的跨租户越权。最小修复:解析并白名单提取错误 code/message、清洗 URL/Bearer/敏感字段;删除安全需求之外的原文,旧数据按受控方式清理。[原文保存](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/media-ai-edit.ts:83)、[数据库写入](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/media-ai-edit.ts:503)、[API 返回](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/media/product-image-task.service.ts:95)、[页面展示](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/web/src/pages/products/components/ProductImageTaskCenter.tsx:129)。
**B5:采集素材下载存在 DNS 校验与实际连接分离的 SSRF 风险。静态风险,未进行攻击验证。** 先 lookup 检查,再 fetch 重新解析,且 IPv6 映射/保留地址分类不完整。相比之下,网络图片导入用固定已校验地址连接。最小修复是复用该下载边界,让校验地址与连接地址一致,每次重定向重新校验;公开接受用户输入 URL 前处理。[采集下载](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/collection-assets.ts:61)、[更严谨下载实现](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/media/product-image-download.ts:39)。
**B6:用量、预算、取消的经营语义不完整。** 普通文案 usage 未持久化;没有完整生图成本账本/每 workspace 额度。取消主要改变本地状态并停止应用结果,不代表供应商取消或退款。先做按任务记录用量/估算成本、提交前张数×估算费用确认、日预算和供应商余额提醒。估算不能写成实际结算金额。[文案保存](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/product-ai.ts:100)、[取消实现](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/media/media-ai-edit.service.ts:145)。
### C. 可在运营之后做的改进(P2)
- README 和待决列表存在旧状态,交接记录很长、同能力描述前后不一致。只更新一份当前能力表、配置说明和待验收列表,不继续堆新文档。
- 根 `lint` 运行 Turbo,但应用未定义 lint 脚本;不能把执行成功解释成代码经过 lint。Web 无成体系的自动交互回归;建议针对“保存后刷新仍在、AI 不覆盖未确认值、报价失效、发布结果恢复”补 3–5 条关键测试。
- Web 构建主包约 1,971 kB、gzip 621 kB;路由静态导入较多。先按系统管理与商品编辑路由延迟加载,是否继续优化取决于实际网络下首屏表现。构建告警不是首单阻断。
- 素材转存先上传,再按 checksum 查询重复项,发现已有素材时新上传对象未关联,可能产生孤儿对象。先查已有对象、冲突后清理或安排孤儿清理;单人小量暂不紧急。[去重位置](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/worker/src/collection-assets.ts:39)。
- 本地 Compose 发布 PostgreSQL/Redis/MinIO 端口,没有限定 loopback,Redis 无密码;文件明确属于开发环境,不应直接用于公网。云端应用编排、备份恢复演练和 CI 在仓库未发现完整实现。公开服务前补齐,个人本地运营先确认端口不外露即可。
- `/ready` 只测数据库,无法反映队列/Worker 是否健康。先监控最老 queued/running 任务年龄、最近 Worker 心跳和失败数,不引入大型观测平台。[ready](/Users/joey-xd/sites/seller-store/atlas-seller-kit/apps/api/src/app.module.ts:33)。
## 5. 商业完成度与真实证据
| 层次 | 判断 |
|---|---|
| 商品准备和编辑 | 实现较完整,已具备受控试用条件 |
| 首次平台导入 | 代码链路完整,仓库有真实 SKU 导入的历史记录 |
| 跨境图片交付 | 10 月 7 日记录了真实失败、全球加速调整与三图恢复;不是本次在线重验 |
| 审核通过、有效库存、配送和实际售价 | 需逐商品后台/买家端确认,本次未验证 |
| 首单、履约、真实毛利与复购 | 没有本次可核验数据,不能由工程质量推导 |
| 多用户稳定生产运行 | 尚缺费用、故障恢复与部署验收 |
关键历史材料:[2026-10-07 图片交付诊断](/Users/joey-xd/sites/seller-store/atlas-seller-kit/docs/reviews/ozon-image-delivery-diagnosis.md:1)。它记载 Ozon imported 后出现图片抓取失败,调整七牛全球覆盖后,通过专用图片接口恢复一主图加两附图并核对顺序和像素。这比“接口返回成功”更有价值,也说明问题来自真实集成。但单 SKU 修复不能推广为所有商品、所有区域或当前配置均已通过。
接近首单时,最可能需要处理的是:库存/审核/可见性、成交价、物流与佣金依据、供应链交期和商品资料真实性。选品销量、采购与履约经验不能由增加技术模块替代。
## 6. 最小改进计划与预计投入
投入按你熟悉现有代码、AI 辅助实现估计,单位为工程工作日(约 6–8 小时),不包含平台审核、实际成交或结算等待;不同风险可能共用实现,勿机械累加工期。
| 优先级 | 最小交付 | 预计投入 | 验收条件 |
|---|---|---:|---|
| P0 | 首批 3–5 SKU 的可售核对清单、配置核实、价格/成本人工复核 | 0.5–1.5 天,主要是业务操作 | 后台库存/配送/审核/有效售价与目标一致,图片完整可见 |
| P1 优先 | 生图原文脱敏和提交不确定时禁止盲目重复收费 | 1–2 天 | 假 token 不出 API/数据库结果;模拟 POST 后断连不会自动再付费提交 |
| P1 | 文案任务过期恢复、终态收尾;顺带检查素材 running | 1–2 天 | 在模型调用前后模拟中断,任务可恢复或明确失败,无永久 running |
| P1 | 用量记录、生成前估算、每日软预算/硬上限 | 0.5–1.5 天 | 能回答每个商品用了多少、失败重试用了多少;超预算不提交 |
| P1 | Redis 持久化和最小未完成任务对账 | 1–2 天 | 隔离环境清空队列后可恢复,已导入商品不会重复创建 |
| P1 公开前 | 固定 DNS 下载、公开部署配置、备份恢复 | 1.5–3 天 | 私网/映射地址与重绑定被拒绝,依赖端口受限,恢复数据演练通过 |
| P2 | 文档现状表、关键页面回归、路由拆包 | 1–2 天 | 新人能启动;关键保存/发布交互可重复检查;首屏包减小 |
| P2 | 20–30 个商品的 AI 标注样本集与指标 | 0.5–1 天起步,随后持续 | 类目修正率、文案修改率、图片可用率、耗时与费用有数据 |
**不要把整张表变成开店前置条件。** 对个人小批量自用,先完成 P0,并优先处理当前会碰到的收费风险;可用人工核对和少量任务运行控制其余风险。公开服务前则必须提升恢复、安全和预算控制标准。
## 7. 建议的两周工作分配
将可用于此项目的业余时间约 70% 用在商品与运营,30% 用在修阻塞和记录工程证据。这个比例是试验建议,不是市场统计或收益保证。
1. 第一轮只选一个类目、3–5 个 SKU;供应链、包装、进货成本和物流可人工核实。图片够用即可,先避免为了每个商品生成完整套图。
2. 逐条走现有链路,记录每个步骤耗时、失败原因和人工修改;发现阻塞只修当前阻塞。
3. 导入后到 Ozon 后台完成库存、配送与实际售价,检查审核/可见性与图片。需要手工补的操作记录到一页清单,暂不开发新模块。
4. 成为可售商品后,再观察曝光、点击、成交及可用平台经营数据;有订单时跟踪发货、退款和实际费用。没有订单时先核对需求、价格、交付和商品呈现,不能默认 ERP 自动化不足。
5. 只有某个手工动作频繁发生,且明显占用时间或造成损失,再自动化它。没有复现需求就不开发自主 Agent、多平台、微服务或更多生图样式。
两周产出应是“一小批真实可售商品 + 真实耗时/失败/经营记录”,而不只是更多组件。不能承诺两周出单,成交取决于尚未验证的市场与供应链。
## 8. 如何变成 AI 全栈工程经历
你已经具备可讲述的技术范围:React/TypeScript、NestJS、PostgreSQL/RLS、BullMQ/Outbox、对象存储与签名交付、第三方平台集成、LLM 结构化生成和异步图片任务。下一步提高职业价值的方式是掌握设计与故障处理,并留下可核验成果。
可在简历中写:
> 独立开发 Ozon 商品采集与 AI 编辑工作台,采用 React/TypeScript、NestJS、PostgreSQL 和 BullMQ;实现工作空间隔离、SPU/SKU 编辑、结构化文案与类目建议、异步图片任务、定价快照及首次发布流程,并设计幂等、提交不确定时对账和图片交付校验。
如果大量代码由 AI 生成,面试时坦诚说明,并证明你能解释/维护关键设计。没有确认的性能、成功率、节省工时和收入数字不要写入简历。
建议整理 3 个脱敏案例:
- **真实集成故障**:商品 imported 后缺图,如何分离商品/图片状态、检查跨境 CDN、确认真正恢复。
- **分布式与收费边界**:模型已受理但本地未落库,为什么不能简单重试;如何做租期、代次、对账和人工处置。
- **业务正确性**:SPU/SKU 继承、报价变更失效、快照发布、RLS 与跨租户约束,怎样用测试证明。
每个案例保留架构图、问题复现、关键决策、测试结果和最终限制。再用运营样本补充“人工上品平均耗时、AI 人工修改率、单商品费用、发布成功/缺图率”,这比再学一个 Agent 框架更能证明工程能力。
## 9. 未验证清单
本次未确认:真实进程有效环境变量、数据库所有迁移/角色/RLS 实际状态、店铺 VAT 与账户适用规则、当前佣金/物流费率、全部来源网页实时解析、真实 DeepSeek/生图服务质量和价格、真实 Ozon 新商品发布/审核/库存/可见性、当前 CDN 海外抓图、订单与净利润、部署与备份恢复、多用户压力与外部安全性。
结论来自静态证据、离线测试、额外模拟和明确标注的历史验收记录。**静态代码存在、测试通过、历史单 SKU 验收,都不等于本次已真实线上跑通。**