目前 POST /syb-products/import 同步执行、跑完才响应。关掉页面后导入会继续跑完(各层都绑定了脱离请求的上下文),但结果报告彻底丢失:导了多少、成功还是中途失败,都看不到。30 分钟超时被切断时同样无声无息。
POST /syb-products/import
依赖 #49 的店铺跳过统计字段。
POST /syb-products/import → 立即返回 runId GET /syb-products/sync-runs/{runId} → 轮询进度与结果 GET /syb-products/sync-runs → 历史列表(分页)
关掉页面再回来能看到进度和结果;服务端重启后残留的 running 记录标记为 interrupted。
running
interrupted
syb_sync_run:
syb_sync_run
date_from
date_to
status
succeeded
failed
order_count
detail_count
accepted_count
shop_skipped
created
updated
shop_filter_hash
shop_breakdown_json
error_message
operator_id
operator_name
started_at
finished_at
[必须] shop_filter_hash 的作用:两次同步结果不同时,能分清是数据变了还是过滤规则变了。
[必须]
[必须] shop_breakdown_json 要按店铺列出接受/跳过条数,不能只存一个总数——否则新开的店铺永远不会被注意到。
[必须] 只保存统计和错误摘要,不保存 Cookie、验证码、原始响应或账号信息。
(order_code, detail_id)
[必须] 同步记录只读,所有角色可查看;发起导入仅管理员(与 #49 一致)。
6a869fc2191a826306a7efb1
v1
生产代码尚未开始;按双门禁规则,等待用户确认原型和覆盖范围后再进入 Stage B。
v1 使用固定 1440 × 900 画布。QuantUX 在线查看器自身还会占用浏览器区域,在常见桌面视口中导致画布右侧或底部被裁切;组件没有丢失,是画布超出可用显示区。
1440 × 900
同一 App 的 6 个页面统一调整为 1200 × 720。
1200 × 720
226 个组件的位置、宽高、字号和间距按比例调整。
每页重新执行边界检查:越界组件均为 0。
0
14 条点击连线全部保留。
QuantUX 导出验证:PASS,运行时错误 0。
PASS
App ID:6a869fc2191a826306a7efb1
版本:v2(草稿,等待用户确认)
v2
在线原型:https://qux.ilapage.cn/#/apps/6a869fc2191a826306a7efb1.html
确认人 / 确认时间:等待用户复核
生产代码仍未开始,等待用户确认 v2 原型。
再次复查确认,先前提供的 qux.ilapage.cn 地址是需要该域名登录会话的私有编辑器入口,无登录浏览器只会看到 Login;这才是“不能查看”的直接原因,不是画布内容丢失。
qux.ilapage.cn
已处理:
web
prototype
prototypes/50/v2/index.html
39d38e1
v2 仍为草稿,等待用户确认后才进入 Stage B。
原型双门禁已满足,开始 Stage B 实施;页面结构和主要流程不得脱离本确认版本。
原型已由用户确认,Stage B 已实现并推送。
POST /api/admin/v1/syb-products/import
202 + runId
1786701000000_syb_sync_run.go
active_slot
docs/
go test ./...
go build
pnpm run lint
pnpm run build:prod
syb-sync-run.spec.ts
check --strict
badb78f feat(#50): run SYB imports asynchronously
39d38e1 design(#50): add reviewable async import prototype
c94df94 docs(#50): document asynchronous SYB imports
工单保持开启,等待用户验收。
??? 2026-08-20 ???????????:Task-50-SYB-async-sync;Wiki revision:a627417c412e44fbc6b0816f15395e131760522f??????
No dependencies set.
The note is not visible to the blocked user.
背景
目前
POST /syb-products/import同步执行、跑完才响应。关掉页面后导入会继续跑完(各层都绑定了脱离请求的上下文),但结果报告彻底丢失:导了多少、成功还是中途失败,都看不到。30 分钟超时被切断时同样无声无息。依赖 #49 的店铺跳过统计字段。
改为异步 + 运行记录
关掉页面再回来能看到进度和结果;服务端重启后残留的
running记录标记为interrupted。数据模型
syb_sync_run:date_from/date_tostatusrunning/succeeded/failed/interruptedorder_count/detail_countaccepted_count/shop_skippedcreated/updatedshop_filter_hashshop_breakdown_jsonerror_messageoperator_id/operator_namestarted_at/finished_at[必须]shop_filter_hash的作用:两次同步结果不同时,能分清是数据变了还是过滤规则变了。[必须]shop_breakdown_json要按店铺列出接受/跳过条数,不能只存一个总数——否则新开的店铺永远不会被注意到。[必须]只保存统计和错误摘要,不保存 Cookie、验证码、原始响应或账号信息。行为约定
[必须]启动时把残留的running记录标为interrupted——进程重启后它们不可能再推进。[必须]单飞:已有running记录时拒绝新的导入,提示正在执行的范围。现有的内存锁保留(同进程内更快),运行记录负责跨重启的可见性。[必须]中途失败时已写入的数据保留(按(order_code, detail_id)幂等,重跑覆盖),记录里如实写明失败原因和已处理量。权限
[必须]同步记录只读,所有角色可查看;发起导入仅管理员(与 #49 一致)。页面
门禁
Stage A 原型已完成,等待用户确认
6a869fc2191a826306a7efb1v1(草稿,未确认)覆盖范围
权限与交互边界
生产代码尚未开始;按双门禁规则,等待用户确认原型和覆盖范围后再进入 Stage B。
Stage A 原型 v2:修复在线查看不完整
原因
v1 使用固定
1440 × 900画布。QuantUX 在线查看器自身还会占用浏览器区域,在常见桌面视口中导致画布右侧或底部被裁切;组件没有丢失,是画布超出可用显示区。修复
同一 App 的 6 个页面统一调整为
1200 × 720。226 个组件的位置、宽高、字号和间距按比例调整。
每页重新执行边界检查:越界组件均为
0。14 条点击连线全部保留。
QuantUX 导出验证:
PASS,运行时错误0。App ID:
6a869fc2191a826306a7efb1版本:
v2(草稿,等待用户确认)在线原型:https://qux.ilapage.cn/#/apps/6a869fc2191a826306a7efb1.html
确认人 / 确认时间:等待用户复核
生产代码仍未开始,等待用户确认 v2 原型。
Stage A 原型 v2:修正审核入口
再次复查确认,先前提供的
qux.ilapage.cn地址是需要该域名登录会话的私有编辑器入口,无登录浏览器只会看到 Login;这才是“不能查看”的直接原因,不是画布内容丢失。已处理:
web修正为与项目既有原型一致的prototype。prototypes/50/v2/index.html。PASS,0 个运行时错误;导出文件不含 API Key。39d38e1。v2 仍为草稿,等待用户确认后才进入 Stage B。
Stage A 原型已通过用户验收
6a869fc2191a826306a7efb1prototypes/50/v2/index.html原型双门禁已满足,开始 Stage B 实施;页面结构和主要流程不得脱离本确认版本。
#50 实施完成,等待验收
原型已由用户确认,Stage B 已实现并推送。
实现
POST /api/admin/v1/syb-products/import改为创建持久化后台任务并立即返回202 + runId;仅管理员可发起。syb_sync_run与版本迁移1786701000000_syb_sync_run.go,保存状态、处理进度、统计、店铺快照哈希、店铺接受/跳过明细、错误摘要和操作人。active_slot约束跨进程单任务执行;服务启动时将遗留running标记为interrupted。docs/镜像。验证
go test ./...:通过。go build:通过。pnpm run lint:0 error(仓库既有 30 warnings)。pnpm run build:prod:通过(仓库既有 CSS/chunk warnings)。syb-sync-run.spec.ts:3/3 通过,覆盖异步返回与轮询完成、失败详情/店铺统计、采购员只读权限。check --strict:通过;5 份改动镜像与 Wiki 正文逐行一致。提交与文档
badb78f feat(#50): run SYB imports asynchronously39d38e1 design(#50): add reviewable async import prototypec94df94 docs(#50): document asynchronous SYB imports未执行
工单保持开启,等待用户验收。
??? 2026-08-20 ???????????:Task-50-SYB-async-sync;Wiki revision:a627417c412e44fbc6b0816f15395e131760522f??????