Commit Graph
44 Commits
Author SHA1 Message Date
yml2213 7542d547bf feat: 新增客服备用金台账与后台用户中文显示名
- 新增备用金账户、流水、支出、对账与权限
- 后台用户支持中文显示名并同步备用金姓名
- 审计、登录记录、任务及工单操作人优先展示中文名
- 补充备用金与人工支出方案文档
2026-10-18 13:55:24 +08:00
yml2213 412d219cca feat(claim): 支持固定H5订单号领取与订单兑换有效性后台控制
- 数据库新增 099_order_claim_status.sql 迁移,扩展 claim_status、claim_status_reason 等字段
- 后端新增 /claims/h5/:orderNo、UID提交、分销提交接口,保留原有 token 接口双轨兼容
- 增加兑换有效性强拦截:暂停/关闭/退款/取消订单精准阻断并返回友好提示
- 后台新增 POST /admin/orders/:orderId/claim-status 接口与审计日志记录
- 前端管理后台(订单列表、详情页)支持 H5 兑换状态展示、一键复制链接及暂停/关闭/启用弹窗
- 前端领取页面适配 /h5/:orderNo 路由及暂停/关闭等状态的异常展示
- 验证方式:运行前后端类型检查、全量单元测试(后端 674、前端 132)及全量构建编译均通过
2026-10-10 18:05:46 +08:00
yml2213 4fce07a621 refactor(douyin-mashida)!: 纠偏——删掉自建的皮肤通道,改回复用 affiliate_dash
上一轮我把皮肤交付做成了「另建一套执行器 + 独立领取接口 + 只提交账号就结束」,
跟买家实际要走的过程不一致(真正的完成信号是「扫码绑定后的 UID == 买家填的 UID」),
而且核销还触发了老通知逻辑,给买家**又发了一条 /redeem** —— 买家收到两条链接。
本次按用户要求改回**完全复用仓库现成的 affiliate_dash 通道**(= 旧的快手皮肤自动发货)。

**删掉**
- 执行器 `douyin_mashida_skin`(含 registry/types/planner/bootstrap/路由白名单注册)
- `services/claim/claim-skin-service.ts`、`routes/claim-skin.ts`、`/api/v1/claim-skin` 挂载
- 迁移 096 的 `claim_submission_json` 全链路(task-repo / rows / inputs / task-detail /
  admin-read-service 的 claimSubmission),并新增 **097 兜底迁移**把该列 DROP 掉
- 顺带清掉上一轮专为已删接口加的死代码(utils/http.ts 的 buildMessageSuccessPayload 等)

**改回复用**
- `resolveOrderItemClaimLink`:通用解析(只看订单项、不看执行器)→
  `buildConfiguredClaimUrl(claimLinkBase, token)`;多履约单元取 task id 最小并告警;
  **绝不回退** hash 形态的 `buildClaimUrl`
- `cert_link` 与付款后那条**唯一**消息共用同一个解析结果
- **核销后不再给抖音买家发第二条消息**(`shouldNotifyBuyerAfterVerify` 只放行非抖音 provider)
- 买家侧走既有流程:输 UID → 二维码 → 扫码绑定 → 比对 UID → delivered/REDEEMED;
  在 delivered 分支 best-effort 核销平台券(幂等、失败只 warn,不拖慢买家响应)
- 后台回显链接改按 **order.provider** 判断(抖音用 `claimLinkBase`)

**SQL 守卫**:允许「删除历史迁移」,但强制要求「同时新增兜底迁移」配对
(修改历史迁移仍禁止),并把改动来源换成 `git status --porcelain`(否则未跟踪的新迁移看不见)

`npm run check`:tests 671 / pass 668 / fail 0 / skipped 3(含新增的物品图回退用例)
2026-10-09 16:13:39 +08:00
yml2213 56a8184576 feat(douyin-mashida): 皮肤自动发货(按内部 SKU 分流 + 领取链接 + 买家领取接口)
抖音码速达的皮肤类商品改为「自动发货 + 领取链接」:买家不用输订单号,点链接直接领。

**分流(按内部 SKU)**
- 平台闸门放行 `provider='douyin_mashida' && platform='doudian'`,走**独立分支**
  (原有 91/快手路径一行未动,避免外溢)
- 判据:内部 SKU(`sku_order_list[].code`,即 order_items.sku_code)命中权威表
  `AFFILIATE_DASH_SKU_MAPPING` → 新执行器 `douyin_mashida_skin`;未命中 → `manual_dispatch`
- 皮肤判定与商品图同源(都用那张权威表),保证「能路由 ⇒ 有图」
- 履约路由新增 `internal_sku` 匹配维度(`rules[].internalSku`,NFKC+去空白+小写,exact/contains);
  旧规则缺 `matchField` 时默认 `product_name`,**归一化/优先级/回退顺序完全不变**

**执行器与领取 token**
- 新增 `douyin-mashida-skin-executor`:建 claim token、置 `link_generated/pending_claim`,
  `resolveDeliveryLink` 返回本站路径式领取链接;注册进 registry、planner 分支、
  bootstrap 种子 profile(`抖音皮肤自动发货`);进 `ROUTABLE_EXECUTOR_KEYS`
- token 粒度 = 一个履约单元一个(`claim_tokens.task_id` 唯一);一单多项时
  cert_link/买家消息取 task id 最小的那个并告警

**cert_link 与发消息**
- 皮肤订单且该订单项已有 token 且配了 `claimLinkBase` → `cert_link = claimLinkBase/token`;
  其它情况一律用 `certLink`(老行为不变)
- 领取链接**只认** `claimLinkBase`,绝不回退 `buildClaimUrl`/`orders.claimBaseUrl`
  (那是 hash 形式的打手领取页,语义不同)
- 付款建单+发券成功后按 `messageTemplate`(`{link}/{sku}/{orderNo}/{productTitle}`)
  经 `order.message` 发给买家;best-effort,失败只记 warn

**买家领取接口**
- `GET/POST /api/v1/claim-skin/:token`(限流、公开);详情含内部SKU/引流标题/商品图/
  数量/金额/支付时间/动态表单字段;token 失效给明确 errorCode(404/410/409),不打 500
- 提交账号:先核销平台券再落记录(避免「记账了但券没核销」的资损),已提交幂等

**隐私**
- 买家游戏账号落 `fulfillment_tasks.claim_submission_json`(迁移 096),
  **不进** `work_orders.material_json`(那是发给打手的素材);详情接口不返回券码明文/手机号/地址/open_id
2026-10-09 15:06:43 +08:00
yml2213 c115f5e944 fix(claim): 修复后台手动关闭任务后领取链接未失效的缺陷
1. 鉴权层激活 CLAIM_TERMINAL_STATUSES:在 getClaimContext 中增加 task 状态校验,对 closed 与 expired 终态任务实施 410 拦截并自愈更新关联 Token;
2. 仓储层新增 closeClaimTokensByTaskId():支持按 taskId 批量更新所有非 closed 状态的 Token 为 closed,彻底杜绝多 Token 或重发链接导致的历史活跃残留;
3. 后台关闭任务流程闭环:closeAdminTask 显式触发 closeClaimTokensByTaskId,确保任务关闭时关联领取链接立即失效;
4. 补充 CLAIM_TERMINAL_STATUSES 单元测试与完整排查分析方案文档。
2026-09-20 14:06:48 +08:00
yml2213andCursor e20505bc8e style: 修复 pre-push Prettier 格式检查失败
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-15 10:47:38 +08:00
yml2213andCursor 745eeaee35 fix(admin): 恢复任务重试/转人工/人工完结等后台写接口
删除咸鱼链路时误删了 retry、mark-manual-review、complete-manual-dispatch、regenerate-claim-link;现按 affiliate_dash + manual_dispatch 语义恢复,历史下线通道可人工完结但不可自动重试。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 17:32:26 +08:00
yml2213andCursor b3aad0044c refactor(fulfillment): 移除飞飞/乐玩通道,仅保留 affiliate_dash
新单只路由 affiliate_dash(未命中走 manual_dispatch);历史飞飞/乐玩任务保留只读 stub,避免订单重同步失败。同步清理 cloudtentacles 调度、Admin 写路径与相关 env。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 17:29:47 +08:00
yml2213 5c7c3e14e3 统一前后端代码格式化配置 2026-08-16 17:27:12 +08:00
yml2213 b0c77e5842 修复 lewan 换绑:旧号被 CT 回收时自动新取号出链
退号失败(含权限不足)不再卡住换绑,默认跳过并重新取号生成绑链;
CT 错误返回补充账号/vn 诊断信息,避免误判为后台角色权限问题。
2026-07-11 12:13:07 +08:00
yml2213 792680bd19 重构 lewan 履约:拆分发货模块并统一 registry 入口
将 task-finalization 拆为 dispatch/stock/return/redeem/confirm 等用例,
claim 与 admin 经 executor registry 调用;admin 退号仅清理虚拟号不核销。
2026-07-10 22:23:26 +08:00
yml2213 2fade9aba9 开放客服 kuaishou-lewan 换绑角色权限
与刷新角色一致,换绑改用 canOperateAssistedTask,
不开放重试/发货/退号等完整任务生命周期能力。
2026-07-10 18:30:50 +08:00
yml2213 042574dea3 继续收紧 TypeScript:ClaimIdentity 契约与 flow 出口类型
- 新增 types/claim-identity,统一 ClaimIdentity / Payload / AdminSummary
- 导出 KuaishouCloudFlow、KuaishouFeifeiFlow 作为 normalize 出口
- 生产路径 JsonObject 统一从 types/json 导入,去掉 rebind as any
- 前后端 claimIdentity 类型字段对齐
2026-07-10 15:56:25 +08:00
yml2213 8bcd9bbd81 收紧后端 TypeScript:统一 Json 类型与 TaskContext 契约
关闭 allowJs;集中 JsonObject 定义并替换分散 any 别名;parseTaskContext 返回 TaskContext;任务详情 API 标注 AdminTaskDetailView;测试减少 as any。
2026-07-10 15:52:05 +08:00
yml2213 ca5433ada4 优化客服权限 2026-07-10 12:00:23 +08:00
yml2213 90fe910d1c 统一自动发货逻辑
后台准备和发货复用统一履约服务,更新提示文案。
2026-07-09 21:12:23 +08:00
yml2213 ffbc19a9db 移除快手小店以及 api 2026-07-09 21:03:39 +08:00
yml2213 01171c1761 修正快手行业电子凭证核销参数 2026-07-09 19:46:40 +08:00
yml2213 4d5b0d6fc6 优化履约路由并重命名乐玩通道 2026-07-09 10:49:33 +08:00
yml2213 9a6d083096 修复历史电子凭证任务操作入口 2026-07-08 17:44:32 +08:00
yml2213 3ad7c2e50e 优化快手电子凭证发码和手动处理 2026-07-08 17:28:01 +08:00
yml2213 904ecc9303 修改领取顺序,先核销 2026-05-31 11:58:12 +08:00
yml 1c50569ea9 添加快手 Cloud 换绑角色功能 2026-05-30 11:23:52 +08:00
yml ccc350cfea 优化任务状态投影和部署文档 2026-05-28 11:12:40 +08:00
yml dd6776c4e4 简化履约匹配并支持mock订单测试 2026-05-27 12:55:44 +08:00
yml2213 dfcc8982c6 优化快手云领取发货校验 2026-05-26 16:24:50 +08:00
yml2213 fb89110ff1 优化订单列表ui, 增加任务关闭 2026-05-26 13:34:12 +08:00
yml2213 6e85002724 优化履约账号优先级配置 2026-05-26 12:44:01 +08:00
yml2213 5c7e145766 完成后端类型与平台配置目录分组 2026-05-26 09:10:11 +08:00
yml2213 36dfc46884 优化后端目录命名与模块归位 2026-05-26 08:57:19 +08:00
yml2213 dea3023825 优化后端鉴权与日志安全 2026-05-26 08:21:11 +08:00
yml 2c7464b1eb 删除库存和旧回调管理 2026-05-25 23:07:19 +08:00
yml 2103416c7b 中性化库存凭据类型 2026-05-25 22:11:30 +08:00
yml 0caa38e690 清理旧消息和历史命名 2026-05-25 22:03:07 +08:00
yml e7aa194dde 删除咸鱼旧链路 2026-05-25 21:46:39 +08:00
yml 17a615b8de deduplicate task parsing and masking helpers 2026-05-21 18:50:07 +08:00
yml 16200b422b 后端迁移后台管理快手Cloud写侧 2026-05-21 17:05:54 +08:00
yml cbf6b90313 后端迁移后台管理任务写操作 2026-05-21 17:02:50 +08:00
yml 41a2360adf 后端迁移后台管理共享读辅助 2026-05-21 16:55:42 +08:00
yml 2d3a279805 后端迁移后台管理库存写操作 2026-05-21 16:53:08 +08:00
yml a27467bfad 后端迁移后台管理写侧基础工具 2026-05-21 16:51:32 +08:00
yml2213 91d74b3e59 修复小店核销bug, 链接10分钟 2026-05-14 16:31:56 +08:00
yml2213 486ba14dc4 优化连接过期验证与戒色信息-1 2026-05-14 14:42:30 +08:00
yml a27b772b79 拆分后台写操作服务模块 2026-05-04 16:27:07 +08:00