Commit Graph
94 Commits
Author SHA1 Message Date
yml2213 0a595acfa9 feat(fulfillment): 增加未命中渠道兜底核销 2026-11-06 19:21:41 +08:00
yml2213 33d7c6597c fix(worker-platform): 优化接单工单筛选布局 2026-11-06 17:43:55 +08:00
yml2213 a333c05df4 fix(fulfillment): 收口渠道商品与统一结算边界 2026-11-06 17:12:44 +08:00
yml2213 e6b3835c9f feat(cost-center): 收敛第三方卡券商品与成本链路 2026-11-06 16:47:45 +08:00
yml2213 974044a4c6 refactor(cost-center): 收敛人工 SKU 自动创建流程 2026-11-06 16:37:29 +08:00
yml2213 eef4cc1673 feat(fulfillment): 自动核销任务展示并搜索核销码 2026-11-06 10:47:45 +08:00
yml2213 398eafa911 feat(kuaishou): 增加历史电子券补发并核销 2026-11-06 10:38:26 +08:00
yml2213 1bf1280877 feat(consignment): 寄售仓库增加入库时间筛选 2026-11-05 21:19:28 +08:00
yml2213 ed450fac79 feat(fulfillment): 建立履约统一状态视图与分类队列 2026-11-05 20:13:34 +08:00
yml2213 e8b76b3b73 fix(fulfillment): 修复载体重试并完善核销任务列表 2026-11-05 18:36:10 +08:00
yml2213 8b9b4fc4ad refactor(cost-center): 统一人工标准商品与成本配置 2026-11-05 17:58:57 +08:00
yml2213 a6fbb43955 feat(cost-center): 支持删除第三方卡券商品 2026-11-05 17:48:24 +08:00
yml2213 fc928c6b18 feat(worker-platform): 支持客户退款冲正并关闭订单 2026-11-05 17:15:41 +08:00
yml2213 4e83dbb84c feat(fulfillment): 增加统一结算与多渠道人工履约 2026-11-05 16:14:56 +08:00
zhaoxing f94b914ab1 fix(worker-platform): 修复售后两次点击并支持拼单份数联动追缴 2026-11-05 12:51:49 +08:00
yml2213 9f14e8de7a feat(order-service): 重构分类资料收集与订单状态链路 2026-11-03 19:46:49 +08:00
zhaoxing c2cc37b232 Merge branch 'main' into dev 2026-11-03 10:33:10 +08:00
zhaoxing 96676841b5 feat: 支持待分配/待抢单修改付款金额并增加价格历史 2026-11-03 10:31:46 +08:00
yml2213 4dc2f5ca90 fix(claim): 统一所有买家领取链接为 H5 订单号格式 2026-11-02 22:11:22 +08:00
zhaoxing 13869d345f feat(worker-platform): 商品名按来源追加可配置后缀
- 新增来源后缀配置(来源下拉、启停、备注,同一时间仅启用一个)
- 管理端列表/详情与打手端列表/详情/大厅展示「商品名(后缀)」
- 打手端 DTO 透出 sourceProvider,仅展示,不改写商品名
- 新增来源选项接口与前后端单测
2026-11-02 14:25:53 +08:00
zhaoxing db3f477ab3 fix(worker): 整单指派拼单订单无法验收
- 前端:拼单订单整单指派给本人时放行验收
- 后端:整单指派清掉 sharing_enabled;已有有效份额则拒绝
2026-11-02 12:02:24 +08:00
zhaoxing a2cf48f5fc feat(collect): 补资料改为订单号直连并按状态一次性提交
- 公开补资料页 /supplement/:订单号 直接按平台订单号查询,不再依赖链接记录;旧 token 链接一律 404
- 仅「待完善 + 未指派 + 无拼单份额」可提交,提交后状态变为待分配,重复提交返回 409
- 非可编辑工单只返回商品、工单号、状态与客服提示,不返回已填资料和截图
- 管理端新增「重置补资料」:待分配且未指派、无份额、未发布时一键重置回待完善
- 新增 canResetMaterial 能力与 material_reset 流转事件,工单状态文案统一为「待分配」
2026-11-01 18:12:44 +08:00
zhaoxing 5879568ad0 fix(worker): 用户付款金额仅待完善可修改并补后端校验 2026-11-01 16:22:45 +08:00
zhaoxing c1dd2ee632 feat(work-order): 后台支持修改用户付款金额并留痕 2026-11-01 14:14:23 +08:00
zhaoxing da16e8cf75 Merge branch 'dev' 2026-11-01 12:30:02 +08:00
zhaoxing 15956e704f feat(work-order): 新增一次性补资料链接 2026-11-01 10:46:31 +08:00
yml2213 96ae744dbb fix(worker): 验收重复提交幂等,修复卡待验收与手动验收 500 2026-10-30 21:33:56 +08:00
zhaoxing 2ddc26091c feat:寄卖增加对接客服,页面移动到接单平台 2026-10-27 18:49:39 +08:00
zhaoxing a53321ef30 feat:寄卖增加对接客服,db脚本迁移修复 2026-10-27 13:56:08 +08:00
zhaoxing 622bd779dd feat:寄卖增加对接客服,db脚本迁移修复 2026-10-27 13:39:48 +08:00
zhaoxing 919e228452 fix:拼单明细状态补齐中文映射 2026-10-27 10:34:21 +08:00
zhaoxing 7743d2019c fix:优化再拼一次bug,优化打手端移动端拼单列表显示 2026-10-26 16:36:26 +08:00
yml2213 31a8b6fc65 Merge branch 'dev1023' into dev
解决 9 个冲突文件,并修复合并后遗留问题:

- 大厅候选集:采用 FIFO 窗口 + 全部置顶单 UNION(列表与抢单/拼单复核同源)
- 拼单份额:采用多次参与模型(每次参与 INSERT 新份额、requestId 幂等),
  取消后可重新参与;移除 HEAD 已废弃的单行 rejoin 逻辑与对应测试
- 工单迁移与成本中心 103–108 编号撞车:合并重写为
  109_work_order_share_participation / 110_work_order_hall_and_shop_indexes;
  临时库全量执行与重跑幂等验证通过(10 列、唯一键已删、7 个索引)
- 实时补丁:保留个性化字段、置顶重排、分页总数同步;补回 orderTimelineVisible 类型
- 打手大厅:保留 memo 组件化,移植「再拼一次」多份额按钮逻辑
- 全项目表格统一 PercentTable:WorkerOrderShareTable 改造

验证:backend typecheck/lint/check:sql/test(833 pass)、
frontend typecheck/lint/test(172 pass)/build 全绿。
2026-10-26 12:10:53 +08:00
yml2213 ccc71e0aab Merge branch 'main' into dev 2026-10-25 13:33:05 +08:00
yml2213 81edf530db fix(worker-platform): 拼单取消后可重入,大厅置顶始终优先 2026-10-25 13:08:19 +08:00
zhaoxing a7a8634a96 feat:加一个网站发布公告会弹出来点确定我已知晓的弹窗;mock数据自动匹配接单模板;本地访问模式修改 2026-10-25 12:27:32 +08:00
yml2213 465a9f65dc Merge remote-tracking branch 'gitea-aliyun/main' into dev 2026-10-25 11:14:12 +08:00
yml2213 7fdef88ba6 perf(worker-hall): 优化百单大厅加载与渲染性能 2026-10-24 20:41:58 +08:00
zhaoxing 0d3dd3eacd add:如果打手端使用的设备是移动端,验证图片和验证视频上传的时候加个调用相机的功能 2026-10-24 17:03:57 +08:00
zhaoxing 0ee5554f57 add:新增验证视频可选上传功能 2026-10-24 16:12:56 +08:00
yml2213 9f2206430f style(frontend): 表格首列左对齐其余列居中 2026-10-24 15:49:51 +08:00
yml2213 8991263d25 fix(frontend): 修复百分比表格列宽与单元格居中 2026-10-24 15:13:05 +08:00
yml2213 ce8efa6bad style(frontend): 全项目表格统一百分比布局并居中 2026-10-24 14:49:23 +08:00
zhaoxing 25756901cc add:新增同一个工单同一人可以多次拼单:抢单大厅优化 2026-10-24 13:44:34 +08:00
zhaoxing 7e1e1f7075 add:新增同一个工单同一人可以多次拼单:拼单后按钮固定显示「再拼一次」 2026-10-23 16:37:59 +08:00
zhaoxing 1d5615f1ae add:新增同一个工单同一人可以多次拼单 2026-10-23 15:14:07 +08:00
zhaoxing 067d54fdd8 接单平台:新增店铺筛选条件 2026-10-22 14:45:40 +08:00
yml2213 7e197c9413 fix(frontend): H5 领取前缀整段接管,/h5 裸链接不再跳后台登录
根因:公开路径判定原先只认「带参数」形态(isH5ClaimPath 只认 /h5/<orderNo>),
裸前缀 https://<域名>/h5(后台 claimLinkBase / certLink 的基址)判定不命中,
于是落回主站 HashRouter 被后台路由接管成
https://<域名>/h5/#/admin/dashboard 后台登录页。

- utils/claim-path.ts:isClaimPath / isH5ClaimPath 改为命名空间级判定(含裸前缀与多段路径),
  参数解析仍严格;新增 resolveH5ClaimOrderNoFromInput(纯订单号 / 整条链接 / 缺协议 /
  带后台残留 hash 都能取出订单号,只有前缀时返回空串)
- pages/claim/H5ClaimEntryPage.tsx:新增 /h5 领取入口页,买家输订单号或粘贴完整链接后
  跳 /h5/<订单号>,走与分享链接同一套领取流程
- App.tsx:H5ClaimApplication 接管 /h5 整段前缀(/h5 入口页、/h5/:orderNo 领取页、
  其它子路径回入口页);useClearStrayHash 抹掉历史残留的 #/admin/dashboard
- tests/claim-path.test.ts:补齐裸前缀、相邻前缀 /h5x、粘贴链接解析等回归用例

验证:npm run check 全绿(prettier + eslint + tsc + 143 单测 + vite build)
2026-10-13 13:42:06 +08:00
yml2213 cb064d7cd5 fix(worker-platform): 工单号前缀改 WK 并在检索侧容错 O/0,彻底解决「按工单号搜不到」
## 线上定位到的真正根因

客服搜 `WO26101213031939` 搜不到,但用同单的平台号 `2628501763808879` 搜得到。
到生产库核对后确认:

- 库里真实值 `work_order_no = WO26101213031939`(hex 574f… = 字母 O),状态 pending_acceptance;
- 用字母 O 的 SQL 分支 → 1 行;用数字 0(`W026101213031939`)→ 0 行;
- 全库 127,906 单**全部**以 `WO` 开头、`W0` 开头 0 单、字母 `o` 只出现在第 2 位。

即:前缀里的字母 O 被输成数字 0(`WO` / `W0` 在界面字体里几乎无法区分),
落进通配符分支后必然为空 —— 与前面几轮的「筛选把单藏起来」是两个独立成因,
这也解释了为什么改筛选逻辑一直没解决。

## 修法

1. 生成端换前缀:generateWorkOrderNo 产出 `WK…`(K 与 0 不会看混),从源头消掉歧义;
2. 检索端同时兼容三种写法(历史 WO 号无需迁移):
   - isWorkOrderNoLookupKeyword 放宽为 `^W[oOkK0]…`;
   - 新增 buildWorkOrderNoKeywordVariants:W0→[W0, WO, WK]、WO→[WO, W0]、WK→[WK],
     SQL 分支对每个候选下发「等值 + 前缀」条件(仍是索引条件,不会退化成全表扫);
   - 前端 isExplicitOrderNoSearch 同步(否则面板不清理筛选、实时补丁护栏也不生效);
3. 顺手加一层归一化:NFKC(全角→半角)+ 去零宽字符,前后端同一口径
   (normalizeLookupKeyword / normalizeSearchText),覆盖「粘贴带不可见字符」这类同族问题;
4. 寄卖匹配弹窗的占位提示更新为 WK... / WO...。

## 验证

- 后端 npm run check 全绿:692 tests(689 pass / 3 skip),新增
  work-order-keyword-lookup.test.ts 直接断言 SQL 参数与「不得出现前置通配符」;
- 前端 npm run check 全绿:139 tests;
- 既有用例 worker-platform-repo.test.ts 的期望值同步为新形态(两条候选条件)。
2026-10-12 16:51:08 +08:00
yml2213 fe4d02d136 fix(worker-platform): 按工单号搜不到彻底收口 —— 显式单号检索不再被任何排他筛选吞掉
## 修的是什么

线上反复复发的「后台接单平台按工单号搜不到、某些状态尤其明显」,根因不是一处,
而是同一类问题在 5 个地方各留了一半(历次修复都只补了一处,所以总复发):

1. 状态筛选走运营态派生:拼单母单一旦有人参与,open → in_progress /
   pending_acceptance,于是「单号 + 待接单」永远为空(没人参与时反而搜得到),
   这正是「有人接单后就搜不到」;非拼单单子被接单后同理。
2. 「单号 + 接单人员 / 分类 / 打手等级 / 创建时间」照样过滤掉目标单
   (接单人员是 INNER JOIN 可见集合,不在集合里整行消失)。
   d6523635 只在面板查询按钮里清了 状态/赠送阶段/验收模式,这三个没清。
3. 待办通知跳转(buildNotificationActionPath 带 ?workOrderId=)设下的
   「定位工单」是 wo.id = X 排他条件,不手点「取消定位」就一直生效,
   之后搜任何别的单号都是空 —— 这条路径历次修复从未涉及。
4. AdminLayout 把服务端 operation='remove' 直接判成 mismatch,
   绕过了「显式单号不删行」的护栏。
5. 打手端「我的订单」默认页签固定「代练中」,搜索不联动页签、
   实时补丁又拿状态当可证伪条件删行 → 打手端同类问题(此前只修了关键词匹配)。

## 修法(收口到单一真源,不再按按钮打补丁)

后端:
- 新增 isExplicitOrderNoLookupKeyword()(工单号 / 平台单号 / SUB·INV·AS·DT);
- 后台列表筛选抽成纯函数 resolveAdminWorkOrderListFilters():显式单号检索时
  不下推 状态/VIP待补图/验收模式/赠送阶段/接单人员/分类/打手等级/创建时间/定位工单;
- 打手端 resolveWorkerMyOrderStatusFilter():只放掉状态与 VIP 待补图,
  **严格保留 workerSharingId 可见范围**(否则打手能搜到别人的单)。

前端:
- admin-realtime-work-orders.ts:显式单号检索直接判 unknown(含服务端 remove),
  remove 的短路移交给判定函数;
- WorkOrdersPanel:单号检索时清空全部排他筛选并提示「已按单号精准检索,自动忽略…」,
  通知定位工单时也清掉其它筛选,避免残留;
- WorkerOrdersPage:单号检索自动切「全部订单」;WorkerLayout 走新的
  resolveWorkerMyOrderRealtimeVerdict(),与后台同策。

刻意不改(避免越权/召回不可用单):抢单大厅(候选必须是 open)、
寄卖手动匹配候选(只做未接单整单)。

## 验证

后端 npm run check 全绿:682 pass / 3 skip(新增 6 项);
前端 npm run check 全绿:138 pass(新增 6 项,含「单号检索 + 实时事件不得删行」,
以及「服务端 remove 不得绕过单号护栏」的回归);format/lint/typecheck/build 通过。
无数据库迁移。
2026-10-12 15:48:30 +08:00