yml2213
d262b22a41
fix(admin-worker): 实时补丁同步筛选统计,并锁住"按工单号搜索结果被删行"的回归
...
线上现象:按工单号搜到的那一单,状态一变(实时 SSE),列表就变成「暂无数据」,而上方
筛选统计仍显示「共 1 单」;整页刷新后才恢复。
成因在前端实时快照补丁:旧逻辑里的 matchesWorkOrderKeyword 只比对「商品名 + 平台单号」,
不比对「工单号」,所以按 WO… 搜出来的行一旦有实时变更就被判成不匹配,直接从缓存里删掉;
而 statistics 是首次响应里带出来的、没被同步,于是出现"统计说有、列表没有"的自相矛盾。
(删行本身已由上一条提交改为:关键词筛选归入「不可证真」→ 只原地更新。)
本条补齐剩下的一致性:
1. 实时补丁增删/原地更新行时,同步维护 data.statistics 的 totalCount 与 statusCounts
(statusCounts 按运营态口径记账,与后端 getWorkOrderStatistics 一致),列表与统计不再打架;
2. 补两个回归测试:按工单号搜到的行在状态变化后必须原地保留;插入/移除/原地改状态三种
情况下统计都要跟得上。
验证:前端 80 项单测全绿(新增 2 项),lint / typecheck / build 通过。
2026-10-01 12:35:59 +08:00
yml2213
40ee36d72a
fix(consignment): 修复寄卖取消解绑、SUB 单号写空、拼单门禁与后台工单列表实时乱跳
...
1. 问题单处置「取消」后打手信息不消失:resolveProblemWorkOrder 的取消分支从未解绑寄卖现货,现货永久停在 consumed 占库不还,工单 material 上的寄售标记残留又让列表继续显示「供货打手」。取消时补上解绑;调用必须排在状态 UPDATE 之前——那条 UPDATE 会清空 friend_added_at,清完再解绑会把已确认加好友的货误判成可回池(二次出货);
2. 解绑函数在没有现货可解绑时直接 return,跳过了摘标记,于是「库存行早已不存在」的老帖永远摘不掉寄售标记(列表一直显示供货打手)。现在无论是否解绑到现货都摘标记,痕迹保留在 material.consignmentHistory 的 detachReason 里;
3. 内部现货履约写入的 sourceSubmissionNo 恒为空:取的是占库 `UPDATE ... RETURNING *` 的行,只带回本表列,没有 join 出来的 submission_no,导致工单列表把所有寄卖单都显示成「老单无提报单号」,SUB 单号这个唯一锚点丢失。改取带 join 的预读库存(内部现货资料、指派工单资料、指派事件留痕三处)。存量老单按业务口径不回填;
4. 后台接单工单列表实时乱跳:SSE 快照补丁按数组下标读 queryKey,面板 key 加了字段后下标全错(page 被读成 targetWorkOrderId → 任何页都被当成第 1 页),且完全没判「内部寄售匹配」等筛选,于是任意一条不在当前页的老单只要发生变更就被插到列表顶部。改为结构化 queryKey + 三态判定(match 才允许插顶、mismatch 才允许移除、其余只原地更新),插入还要求 page===1 且工单 id 大于当前首行;状态比对改用 rawStatus(快照的 status 是运营态,拼单母单会被显示成 in_progress),分类筛选因快照不带 parentCategoryId 归入不可证伪;
5. 新增「寄卖只做整单」硬门禁:已有人参与的拼单工单不参与现货匹配与库存提醒,履约入口一律返回 work_order_sharing_not_consignable,前端「手动匹配寄卖」入口按同一口径收敛;开了拼单但无人参与的整单不受影响,避免过度拦截。
验证:后端 520 项单测(517 pass / 3 skip)、前端 78 项全绿;并对真实开发库跑通问题单取消三类场景(老帖无库存行 / 回库 / 已加好友作废)、退回打手与退回大厅的反向用例(不得解绑)、履约写入真实 SUB 单号、拼单门禁四入口 + 未过度拦截反向用例。
2026-10-01 12:17:00 +08:00
yml2213
1636616ec1
feat(worker-platform): 寄卖价格改由接单模板只读定价,我的寄卖支持服务端搜索与分页
...
1. 寄售价不再由卖家填写:打手端改为只读展示模板价(与履约押金同款只读框),服务端在发布时按同一套规则复算金额,保证展示口径与落库口径一致,直连接口也无法随意定价;
2. 模板缺档按「最接近的已配置档位」报价、距离相同取更低档:后台只配了 1/3/7 钻时,号主出 2 钻报 1 钻价、出 6 钻报 7 钻价,不再因为中间档没配价而拿不到价格;
3. 我的寄卖列表把分组、关键字、翻页全部下沉到 SQL:新增 listWorkerConsignmentPage 用 UNION ALL 合成「提报单行 + 无提报单库存兜底行」,CASE 推导 待审核/履约中/已完成 分组,返回当前分组 total 与三个分组的角标计数;
4. 关键字覆盖寄卖单号、规格名、系统/区服/系列/钻级、卖家角色名与数字 ID、联系方式、买家昵称与游戏 ID(读取 work_orders.material_json.collect.fields 的多种历史键名);
5. 前端搜索框 300ms 防抖后才请求服务端、换分组或换关键字自动回到第 1 页、列表底部增加分页器,并移除原来固定 pageSize 200 的隐形截断;
6. 新增仓库层与匹配层单测,其中包含 SQL 分组 CASE 与 domain/consignment-item-stage.ts 的 group 映射交叉断言,防止两处状态机漂移;后端 516 项、前端 66 项测试全部通过。
2026-10-01 11:07:28 +08:00
yml2213 and Cursor
ef491660e7
fix(admin-worker): 发单金额高于用户付款时强制确认,避免只靠红色字提醒
...
发布、指派和改价都会弹出亏损确认,且不能用「不再提示」跳过;列表发单金额旁增加「高于付款」标签。
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-21 15:48:23 +08:00
yml2213 and Cursor
9298b31b9b
feat(worker-platform): 增加寄卖白名单总开关,关闭后全员可发布
...
资金配置与打手列表可一键切换白名单模式;发布校验、打手端入口按总开关放行。同时收紧未开通判定、关权限确认和开通弹窗文案。
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-21 14:23:00 +08:00
yml2213
937e51db6b
fix(admin-worker): 修复打手管理切换寄卖权限后表格状态未自动刷新的问题
...
1. 修复 WorkersPanel 中 queryKey 匹配偏差,改用统一的 admin-worker-platform-workers 查询键与 refreshWorkers();
2. 引入 setQueriesData 乐观更新机制,点击 Switch 切换后毫秒级原地更新行状态,无需手动刷新页面。
2026-09-21 13:37:54 +08:00
yml2213
cb8b249e57
feat(worker-platform): 实现打手寄卖白名单权限控制与存量发布打手平滑过渡
...
1. 新增数据库迁移 082_worker_consignment_whitelist.sql,worker_users 表增加 can_consign 与 consignment_activated_at 字段,存量在 consignment_submissions 提报过的打手默认自动开启;
2. 打手端提报接口 publishWorkerConsignment 增加白名单权限服务端强校验拦截(403 consignment_permission_required);
3. 管理后台打手管理表格增加「寄卖权限」实时 Switch 开关列与打手详情抽屉权限展示,支持客服即时开通或关闭打手寄卖权限;
4. 打手端我要寄卖页面在未开通权限时展示专属白名单引导卡片,一键呼起联系客服开通寄卖弹窗;
5. 补充寄卖权限拦截与路由单测,前端59项单测与后端507项单测全部通过。
2026-09-21 13:30:33 +08:00
yml2213
0df5c9f34e
feat(worker-platform): 抢单大厅首页新增联系客服胶囊入口并抽象通用客服弹窗组件
...
1. 抽离打手端通用联系客服弹窗组件 WorkerContactModal,统一维护微信二维码、打手账号/状态/余额回显、一键复制及沟通提示;
2. 抢单大厅移动端顶部状态栏(余额上限右侧首屏黄金位)新增精致微动效【联系客服】胶囊按钮,大幅缩短找客服沟通链路;
3. 抢单大厅桌面端头部操作栏同步补齐【联系客服】按钮,并在个人中心账号弹窗中统一复用 WorkerContactModal;
4. 适配移动端与超窄屏自适应响应式样式,完成前端59项测试与全量打包构建验证。
2026-09-21 12:37:38 +08:00
yml2213
a4f6f5ed9b
style(worker-portal): 优化打手端我要寄卖页面顶部卡片布局,轻量化重构首屏体验
...
1. 移除第 4 个占位无意义的「发布寄卖 苏尔南」卡片,核心指标精准收敛为待审核、履约中、已完成 3 大状态;
2. 新增 worker-consignment-kpi-grid 紧凑统计栏,移动端改为横向 3 列等宽平铺,高度由 320px+ 骤降至 52px,竖向空间节省超 80%;
3. 剔除卡片内无实际价值的长句副说明文案,改为上行轻量状态标签 + 下行醒目数字的微排版,支持点击秒切记录过滤;
4. 彻底解决移动端首屏被巨幅卡片占满导致表单下沉的问题,首屏直接呈现履约押金提示与规格选择,提升打手发布效率;
5. 前端 59 个自动化测试全绿,全套 check 与 build 100% 通过。
2026-09-21 12:31:03 +08:00
yml2213 and Cursor
577e0eec02
fix(consignment): 内部现货履约文案对齐待加好友,并移除已废弃的指派打手路径
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-21 12:04:30 +08:00
yml2213
29589bb9af
feat(worker-platform): 接单工单表格「打手」列支持展示寄售供货打手与现货资料
...
1. 新增 resolveConsignmentWorkerDisplay 工具函数,自动解析工单寄售现货与资料字段(供货打手、游戏角色昵称、游戏ID及联系方式);
2. 优化 renderWorkOrderWorkers 渲染逻辑:当工单为内部寄售现货履约时,打手列带「供货打手」或「内部现货」专属角标,主标题展示打手名/角色名,副标题拼接游戏ID与联系方式,解决原先显示为破折号 - 的问题;
3. 新增 consignment-worker-display 单元测试,更新寄卖库存优化现状与进度追踪文档,前端 57 个测试全绿并通过类型检查。
2026-09-21 11:40:25 +08:00
yml2213
c80bd0e337
fix(worker-platform): 修复寄售匹配工单详情中卖家上架截图丢失问题,并收敛手动匹配为内部现货直接履约
...
1. 修复文件归一化器 normalizeUploadedFiles 遇到纯字符串 URL 数组被误过滤为空的问题,自动提取 objectKey 并构造规范 UploadedFile 结构;
2. 优化工单展示映射器 resolveWorkOrderEffectiveBoosterMaterial:当工单资料中截图为空时,自动回退并加载寄售卖家上架/主页截图;
3. 前端管理后台详情抽屉与打手端详情抽屉支持读取 detailOrder.gift.boosterMaterial.screenshots 与 consignmentInfo.screenshots 降级兜底渲染;
4. 手动匹配弹窗与发布拦截弹窗全面收敛为单一标准的【内部现货直接履约】,废除旧版指派打手带来的重复扣押金与二次填资料问题;
5. 新增 consignment-booster-material 单元测试,更新寄卖库存优化现状与进度追踪文档,前后端全套测试通过。
2026-09-21 11:35:38 +08:00
yml2213 and Cursor
040b3db84c
fix(finance): 移除资金审核取消按钮,避免提现冻结资金未退回
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-20 21:59:29 +08:00
yml2213
f07e4087ad
feat(consignment): 优化寄售仓库与接单工单双向手动匹配,支持工单号与提报单号检索与强制匹配
...
1. 寄售仓库手动匹配订单扩充支持 open 状态工单,增强 WO 工单号与纯数字的模糊/前缀搜索,修复工单搜不到的问题并在卡片高亮展示内部工单号与状态;
2. 接单工单操作列全面支持【手动匹配寄售】,允许从接单工单主动调起寄售匹配弹窗;
3. 寄售现货筛选支持通过 SUB 提报单号、INV 仓库号、供货打手等快速搜索;
4. 完善规格冲突下的强制匹配确认与必填原因提交机制,确保履约全流程留痕合规。
2026-09-19 17:59:05 +08:00
yml2213
f08a221e15
feat(worker-platform): 接单平台工单详情抽屉支持卖家与买家资料一键复制与单项复制
...
1. 寄售赠送进度卡片右上角新增【一键复制卖家资料】按钮,一键聚合复制卖家角色昵称、游戏ID、区服、系统、联系方式(微信/QQ/手机)、提报/仓库单号及备注;
2. 资料信息卡片右上角新增【一键复制买家资料】按钮,一键复制买家提交的全部表单字段;
3. 卖家资料与买家资料的各项字段值(角色名、数字ID、区服、系统、联系方式、单号等)右侧均补充内联一键复制小图标,支持快捷单项提取。
2026-09-19 14:39:43 +08:00
yml2213
2c120bd3e5
fix(worker-platform): 接单平台工单详情抽屉完整展示寄售手动匹配与指派订单的卖家资料
...
1. 修复管理后台「接单平台 -> 接单工单」抽屉中,手动匹配或指派寄售库存履约的工单因 booster_material_json 为空导致卖家资料全部显示 '-' 的问题;
2. 后端在履约及指派时将卖家角色昵称、数字ID、联系方式、手机号、备注及上架凭证截图完整写入工单 material.consignment;
3. 后端工单查询及展示映射层增加自动回退与批量库存补充解析机制,确保历史与新增的寄售工单均能准确解析出卖家角色名、ID、区服、系统与截图;
4. 前端工单抽屉卡片优化寄售订单的资料展示与阶段标签,清晰展示卖家角色名、游戏ID、联系方式(微信/QQ/手机)、提报/仓库单号及上架截图。
2026-09-19 14:33:56 +08:00
yml2213
13a9028c66
feat(worker-platform): 发布寄卖与我的寄卖界面支持停留状态与筛选持久化记忆
...
1. 在 WorkerConsignmentPage 中通过 localStorage 与 URL 查询参数实时双向同步 activeTab 与 recordFilter;
2. 打手在切换发布寄卖/我的寄卖或筛选状态后,刷新页面或切换路由返回时自动恢复上次停留界面;
3. 提交寄卖成功后自动切换并记住跳转到我的寄卖-待审核列表。
2026-09-19 14:23:51 +08:00
yml2213
d40b5a4c1c
feat(worker-platform): 优化打手我的寄卖卡片资料展示,前置展示打手自身上架账号资料
...
1. 后端 consignment-worker-service 在我的寄卖列表中解析并返回打手上架时填写的 sellerInfo(角色名、数字ID、区服系统、微信号/QQ、寄卖留言等);
2. 前端新增 ConsignmentSellerInfoBlock 卖家资料区块,提供角色名/ID高亮与一键复制功能;
3. 寄卖卡片布局升级为前置展示【我的寄卖账号资料】、后置展示【买家加好友资料】,多号上架时号主与买家清晰对应,彻底杜绝登错号加错人。
2026-09-19 14:19:35 +08:00
yml2213
c0d00d28ce
fix(admin-orders): 修复实时 SSE 订单推送未按时间倒序排列导致历史单跳到第 1 行的闪烁问题
...
1. 在 AdminLayout 的 patchAdminOrderListEnvelope 中接入 sortAdminOrdersDesc 排序引擎,严格按 paidAt / createdAt 倒序及 orderId 倒序排列;
2. 修复后台同步历史订单(如 15/16 号)时,SSE 事件盲目将其插入第一页顶部并在手动刷新后消失的跳跃与闪烁现象;
3. 新订单按时间自然沉降到正确的页码位置,只有属于当前页时间范围的新订单才会展示在第一页顶部。
2026-09-19 11:49:48 +08:00
yml2213
8631100d07
style: 统一代码格式化与代码规范
2026-09-19 10:41:15 +08:00
yml2213
a5727554a4
feat(worker-platform): 彻底去除非平台内部现货履约,寄卖匹配全面收敛为接单平台指派打手
...
1. 手动指定现货弹窗移除 deliveryKind 冗余单选框,统一收敛为一键指派供货打手履约;
2. 匹配确认后自动冻结打手履约押金、启动交付倒计时与履约时效监控,消除脱管盲区;
3. 订单发布前置拦截弹窗移除内部代交付入口,统一为走接单平台指派;
4. 未关联供货打手的现货进行明确阻断与告警提示,避免无监管指派;
5. 同步更新前端静态单测并保证全量测试与构建通过。
2026-09-19 10:28:23 +08:00
yml2213
d6523635ea
fix(worker-platform): 优化工单号精准检索与跨状态流转展示,修复状态更新后工单消失问题
...
1. 后端查询重构:新增 isWorkOrderNoLookupKeyword 工单号前缀与忽略大小写精准索引匹配,优化后端 work-order-query-repo 的工单号检索路径;
2. 前端单号智能穿透:管理员输入 WO... 等精准单号查询时,自动放宽细粒度排他状态/阶段过滤,避免加好友/验收等状态流转后工单因旧状态筛选脱靶消失;
3. 搜索栏交互升级:输入框清空即时重置关键词与页码,支持回车/按钮/清除全方位无缝触发;
4. 详情抽屉与多面板联动:增加 ordersQuery 数据更新对 detailOrder 的自动同步,并将 refreshAll 广播范围覆盖至寄售仓库与统计指标。
2026-09-18 19:36:17 +08:00
yml2213
68cd309bdd
refactor(consignment): 清理寄卖库存详情与编辑中的上号凭据旧字段
...
1. 物品详情弹窗中移除登录方式、账号、密码、上号说明等旧上号字段,保留履约信息与备注;
2. 编辑物品弹窗中移除上号凭据信息卡片,聚焦现货规格、成本、供货打手与备注。
2026-09-18 18:45:59 +08:00
yml2213
ace4791005
feat(consignment): 寄卖物品已验收后隐藏退单回库按钮并拦截退库
...
1. 寄卖库存管理面板中,已验收通过的现货记录不再展示「退单回库」按钮;
2. 后端 returnAdminConsignmentInventory 接口增加校验,若关联工单已验收结算则拒绝退库,后续问题引导走售后流程。
2026-09-18 18:43:22 +08:00
yml2213
771deb221e
style(worker-consignment): 优化寄卖卡片截图展示为紧凑单行并排布局
...
1. 将提报商品截图与赠送凭证截图重构为同一行紧凑胶囊栏,减少上下两行占用空间;
2. 分别保留商品截图与赠送凭证的张数、缩略图与大图预览画廊,视觉更精致。
2026-09-18 18:38:43 +08:00
yml2213
c38f6dfbfd
feat(worker-consignment): 寄卖卡片同时展示提报商品截图与已提交赠送截图
...
1. 寄卖记录卡片同时保留提报商品截图展示区域与赠送凭证截图展示区域;
2. 提报商品截图与赠送凭证截图带清晰分类标题与张数统计,方便卖家完整核对。
2026-09-18 18:36:51 +08:00
yml2213
c17b8a78d5
fix(worker-consignment): 修复卖家提交赠送截图后在接单平台无法回显的问题
...
1. 后端 listWorkerConsignments 接口从关联工单验收资料中提取 giftEvidenceImages、giftEvidenceNote、giftEvidenceSubmittedAt 并在打手端寄卖列表中下发;
2. 接单平台「我的寄卖」卡片新增已提交赠送凭证展示模块,支持展示缩略图、张数统计、大图预览及赠送备注;
3. 优化提报单与库存、工单的 SQL 关联兼容双向绑定,确保后台与前台均能稳定查到赠送凭证。
2026-09-18 18:35:15 +08:00
yml2213
8228776b8c
fix(files): 修复 304 缓存未销毁流导致的 S3 连接池泄漏与图片挂起卡死
2026-09-17 21:03:20 +08:00
yml2213
c5d1e2c375
feat(consignment): 寄售匹配成功后向卖家端与客服后台透出买家加好友资料
2026-09-17 20:46:45 +08:00
yml2213
eff45bb9a8
fix(consignment): 优化撤销寄售履约弹窗(无接单打手时隐藏打手履约押金,正名供货打手发布押金)
2026-09-17 20:10:00 +08:00
yml2213
1526907005
feat(consignment): 建议价精准匹配璀璨数 + 限制璀璨不超过钻石数量
...
- 修复价格匹配:parseSpecsFromText 支持「璀」字缩写(1璀/2璀/3璀)与「无璀/0璀」,
避免生产规则被误判为 0 璀;suggestConsignmentPriceFromRules 增加 brillianceCount
精准对齐匹配,未配对应模板则返回空,解决同钻级多条规则全中并取最高价的问题
- 透传参数:路由与打手端服务均增加 brillianceCount 传递
- 限制璀璨不超过钻级:
- 前端选项动态禁用:大于当前钻级的璀璨芯片置灰
- 钻级调小自动收敛:若原选璀璨大于新钻级,自动 clamp 至新钻级
- 默认值与联动:璀璨数默认 initialValue=0,queryKey 纳入璀璨,切换即刻带出对应建议价
- 前后端双重校验:前端表单 Validator 校验 + 后端提报硬拦截(brilliance_exceeds_diamond)
- 后端 487 / 前端 54 测试全绿,docs/寄卖系统优化方案.md 记录批次 Z
2026-09-17 19:14:04 +08:00
yml2213
103299a7c9
feat(consignment): 发布寄卖自动从接单模板带出建议价
...
- 新纯函数 suggestConsignmentPriceFromRules:模板商品名(安卓暗潮1钻)用与
订单同一套规格解析器拆解,系统+系列+钻级全对上才命中;系统按通配口径
(模板写通用/双端两端都算,模板没写系统不命中——宁可不建议不给错价);
多条命中取最高价
- 新端点 GET /worker/consignment/price-suggestion(requireActiveWorker)
- 发布表单规格选齐后 300ms 防抖请求:同规格去重、过期响应丢弃;命中自动
填入寄售价并提示来源与条数;卖家手改过价只提示不覆盖,换规格重新带出;
提交成功状态复位;接口失败静默(本地没配模板保持手填,行为不变)
- 建议:本地模板没配不影响任何现有行为,生产库模板越多建议越准
后端 483(+建议价命中/不符排除/取最高/通用模板用例)/ 前端 54 测试全绿
docs/寄卖系统优化方案.md 记录批次 X
2026-09-17 13:14:10 +08:00
yml2213
4e076ed628
style(worker): 寄卖规格 chips 只有一个选项时四角统一圆角
...
苏尔南区服现在只有「互通」一个选项,chips 的 :first-child/::last-child
圆角规则同时命中、last-child 在后覆盖成"左方右圆";补 :only-child
规则让唯一选项四个角都是 8px 圆角,与多选项时的观感一致
2026-09-17 13:04:27 +08:00
yml2213
f8101c1730
feat(consignment): 规格口径定案——互通通配 + 后台全量/发布端按物品展示
...
业务定案:
- 操作后台全量:系统 苹果/安卓/通用,区服 微信区/QQ区/互通;提报审核与
库存编辑的系统/区服从自由文本改为受控下拉(单一来源 utils/consignment-spec.ts)
- 打手端发布按物品类型展示:苏尔南系统二选一(必须区分端),区服唯一
「互通」选项且默认选中;后续其他品类在共享常量按品类加条目
- 匹配引擎通配符对称化:区服通配=互通(通用/全区/不限归一化为别名),
系统通配=通用(双端/全端同理);订单侧写通配同样放行,只增不减匹配面;
差异描述不把通配对当冲突
- 提报白名单校验(API 层):系统只收 苹果/安卓,区服只收 微信/QQ/互通,
旧页面缓存或直调接口绕不过
- 物品名拼接:区服为互通时不拼入(对买家无信息量),前后端同口径
后端 481(+互通双向匹配/通配不算差异/真冲突仍排除/白名单校验)、
前端 54(+选项口径/表单引用/默认值)测试全绿;typecheck/lint/format/check:sql 通过
docs/寄卖系统优化方案.md 记录批次 W
2026-09-17 13:01:59 +08:00
yml2213
b666a9c951
fix(consignment): 拼单份额验收收官补寄卖结算钩子 + 手动匹配弹窗三处复核遗留
...
- acceptWorkOrderShareAndSettle 最后一个份额把母单转 accepted 的分支,
此前不释放发布押金也不结算供货货款(两钩子只在统一验收里):
现在同口径补上;供货货款传 assignedWorkerId=0(拼单母单无单一接单人,
份额打手已各自按 share_reward 结算,不会重复付款)
- 手动匹配弹窗:race_condition/unavailable/spec_mismatch/partial_requires_confirm
四个错误码清空已选并自动重拉列表,数据过期不再死循环撞错
- 手动匹配弹窗库存侧:keyword+pageSize100 透传后端(原来 keyword 是死参数、
只拉 50 条),300ms 防抖后端搜索;无供货打手时禁用指派选项并在提交前
再拦一道(原来必 400 死路);选中订单回显 workerId/workerName
- 凭证核销反馈抽共享 utils/voucher-consume,WorkOrdersPanel 与弹窗共用,
口径不再漂移(弹窗顺带获得"已提前核销 N 张"提示)
- docs/寄卖系统优化方案.md 记录批次 V
后端 477(+4)/ 前端 50(+1)测试全绿,typecheck / lint / format / check:sql 通过
2026-09-17 12:45:51 +08:00
yml2213
63837e473b
fix(consignment): 复核修复——占库撞 080 CHECK 必 500、指派非卖家双付货款、手动匹配权限门控
...
- 占库默认 allocation_status 从自由文本改为「已安排」,不再撞 080 的
CHECK ('待安排','已安排');加静态守卫测试(剥注释断言枚举内默认值)
- resolveConsignmentAssignRewardFen 加 assigneeIsSupplier:指派供货卖家本人
→ 报酬=结算价(货款走报酬渠道);指派别的打手 → 报酬保持原值(货款走
供货货款渠道),两条渠道互斥,封住平台双付;补行为级测试 + 调用点钉住
- 手动匹配两处入口(库存面板行内按钮、拦截弹窗 footer)统一按
consignment.fulfill 门控,编辑/作废仍为 manage,与后端权限一一对应
- docs/寄卖系统优化方案.md 记录批次 U
后端 473(+3)/ 前端 49(+1)测试全绿,typecheck / lint / format / check:sql / build 通过
2026-09-17 12:36:12 +08:00
yml2213
0476339ec4
fix(consignment): 手动匹配订单按钮点了不弹窗(弹窗挂错了位置)
...
用户反馈:在库待匹配列表点「手动匹配订单」没有反应。
根因:上一批把手动匹配弹窗挂到了「编辑寄售物品」弹窗**内部**,外层弹窗未打开时
该组件根本没被挂载,点击只改状态、界面无变化。
- 弹窗移到面板顶层(与其它弹窗同级),点击即弹
- 新增静态守卫测试:断言手动匹配弹窗前面不能有未闭合的 Modal(即不能嵌在别的弹窗里)、
按钮必须真的 setState、open 由该状态驱动;已验证该守卫能拦下错误写法
- 顺带补入口缺口:订单侧原先只在"检测到系统候选"的提醒弹窗里给入口,订单没有任何候选时
反而进不去手动匹配 —— 工单行内新增常驻「手动匹配现货」(仅待指派/待补资料,
与后端前置校验同口径)
- 已暂停匹配的现货点按钮会直接 409,改为按钮禁用并提示先打开「允许匹配」开关
- destroyOnClose → antd 6 的 destroyOnHidden(前者已废弃)
验证:前端 typecheck/lint/format/48 例测试/build 全过。
2026-09-17 12:27:58 +08:00
yml2213
a7a55d6c16
feat(consignment): 客服手动指定现货匹配的界面入口
...
后端批次已提供判定/差异/强制留痕与双向读取接口,这里补界面,让客服真的能用上。
- 新增共享弹窗 ConsignmentManualMatchModal:订单侧(匹配弹窗「手动指定现货匹配」)与
库存侧(寄售仓库行内「手动匹配订单」)共用同一套交互与落地逻辑,避免两套 UI 漂移
- 交互:搜索 → 选中(精确/非精确/规格冲突三档标签 + 字段级差异说明)→ 选交付方式
(内部现货履约 / 指派供货打手)→ 非精确需勾选确认、冲突需勾选「确认规格不一致」并必填原因
→ 落地;并在落地前提示"现货立刻被占用、点错需撤销寄售履约"
- 判定规则收敛成纯函数 consignment-manual-match.ts(需不需要确认/填原因、能否提交、
关键词过滤、标签文案)并加 4 例单测
- 服务与类型补齐:fetchWorkOrderConsignmentMatchOptions / fetchInventoryMatchableOrders,
fulfill/assign 入参增加 allowSpecMismatch 与 matchNote
- 凭证核销失败的提示沿用既有规则(核销失败不能报成功)
验证:前端 typecheck/lint/format/44 例测试/build 全过;两个新接口未登录访问均 401
(路由已挂载、权限位生效)。
2026-09-17 12:23:30 +08:00
yml2213
e731348bb0
refactor(consignment): 删掉按库存号操作寄卖的卖家入口
...
手动入库停用后,"没有提报单的现货"已不可能再产生,批次 I 为兜这类货加的两个
按库存号入口(/worker/consignment/inventories/:inventoryId/...)成了纯负担。
- 删除两个按库存号的路由/服务函数、前端两个请求函数与页面里的锚点分派逻辑,
卖家动作只按提报单号(寄卖单号)定位
- 卖家列表里"没有提报单"的兜底行不再暴露内部仓库号(标题改「客服手工入库」),
且一律不给操作能力位,不给用户一个点下去必然失败的按钮
- 加静态守卫测试钉住以上两点,防止以后又长出按库存号的入口
真实库验证:卖家列表三件货都带寄卖单号与 submissionId,没有提报单的现货 0 件。
2026-09-17 11:45:50 +08:00
yml2213
0c10f0e135
feat(consignment): 停用客服手动入库,寄卖货源只走平台提报
...
背景:手动入库是唯一会造出「没有提报单的现货」的入口,这类货没有寄卖单号,
统一状态机/凭证链/搜索/卖家端单号锚定都串不起来,只能在界面回退显示内部仓库号 INV,
正是"一件货两个号"的残留。业务定调:寄卖货源只走「打手平台提报 → 客服审核入库」。
- 前端寄售仓库的「手动入库」入口整块删除(按钮 + 入库弹窗 + 提交逻辑 + 服务函数)
- 后端同时挡住,防旧页面缓存或直接调接口绕过:
POST /worker-platform/consignment/inventories 返回 409 consignment_manual_inbound_disabled;
死代码一并清掉(服务层原实现、仓库层 createConsignmentInventory)
- 提报审核入库路径不受影响,照旧生成内部仓库号 INV 并写 source_submission_id,
即每件货都必然挂着寄卖单号,INV 只作为内部编号存在、界面不展示
真实库验证:接口被拒(409),且「没有提报单的现货行数」前后均为 0。
2026-09-17 11:41:46 +08:00
yml2213
47e09d72ce
fix(consignment): 内部寄售匹配弹窗防点错
...
问题:弹窗里「走接单平台指派打手(冻结押金交付)」与「内部现货履约」两个按钮上下紧挨、
样式相近,而且只有"部分匹配"才弹确认——精确匹配时两个按钮点下去都立刻执行,
点错就得走「撤销寄售履约」才能退回来。
- 两个动作一律二次确认(不再只有部分匹配才确认),确认框写明:寄卖单号(可复制)、
动作(给谁接单/是否冻结押金)、结果(立刻占用现货、其它订单不能再匹配、
内部履约还会跳过「待打手提交资料」直接进冷却)、以及退回要走撤销寄售履约;
部分匹配额外红字提示"不是精确匹配、无法自动回退"并把确认按钮降为 danger
- 按钮区改成独立的「选择履约方式」分区小卡片:两个按钮各占一行 block 铺满
(点击目标更大、不再小按钮挨着)、间距 14px、各加图标(打手 TeamOutlined /
库存 PushpinOutlined),每个按钮下方一句后果说明
2026-09-17 11:33:23 +08:00
yml2213
54f8a27e97
fix(consignment): 匹配弹窗改用寄卖单号,客服界面不再展示内部仓库号
...
问题:内部寄售库存匹配弹窗显示的是「寄卖单号 INV26091711253394」——候选现货走的
是另一个查询 listActiveConsignmentInventoriesForMatching,它没 join 提报单,
sourceSubmissionNo 取不到,前端就回退显示内部仓库号;客服拿这个号去寄卖仓库又搜不到。
- 匹配候选查询补 LEFT JOIN consignment_submissions 带出 source_submission_no;
该查询原本是 SELECT * 且列名无前缀,而 consignment_submissions 同样有
status/game_name/category_id,加 join 会让条件变成 ambiguous column 直接 500,
故列名统一加 ci. 前缀并显式列字段(加静态守卫测试钉住)
- 客服界面只展示寄卖单号:匹配弹窗候选卡片、工单寄售标识、工单详情、寄卖仓库列表与详情
全部去掉内部仓库号;手工入库现货写「客服手工入库(无提报单号)」,
历史老单写「老单无提报单号」,不再抛内部编号
- 内部仓库号保留:数据/接口/按它搜索都还在,撤销解绑等链路未动
真实库验证:仓库层候选查询与 checkWorkOrderInventoryMatches 都带出了寄卖单号。临时数据已清理。
2026-09-17 11:31:01 +08:00
yml2213
ca04e09deb
feat(consignment): 客服端凭证链可视化(提报凭证 + 赠送凭证)
...
问题:一件寄卖有两类凭证,客服界面只看得见第一类,还是 48x48 一张缩略图,
看不出是主页还是物品;第二类(证明"这件货真送出去了"的赠送完成截图)只在工单验收界面,
客服要证明赠送是否完成得自己跨模块翻,没有任何地方把两类凭证并排呈现。
- 两类凭证分别在哪里:
提报凭证 = 提报表 screenshots_json(卖家提报时的游戏主页截图,含物品/仓库详情)
赠送凭证 = 绑定工单的验收资料 work_orders.acceptance_json(冷却结束后上传、客服凭此验收)
- 后端把凭证链从客服两个列表/详情接口一起下发:提报表/库存 → 结果库存 → 绑定工单,
新增 submissionScreenshots / giftEvidenceImages / giftEvidenceNote / giftEvidenceSubmittedAt /
giftWorkOrderNo / giftWorkOrderStatus / giftEvidenceReviewStatus(none|pending|accepted|submitted);
赠送凭证图从 imageUrls 与 files[].url|mediumUrl|thumbnailUrl 两处取并去重
- 提报凭证口径统一:有来源提报单用提报单主页截图,客服手工入库现货回退库存自身截图,
前端只看 submissionScreenshots 一个字段,不会拿错
- 前端新增共享组件 ConsignmentEvidenceGallery(缩略图 + 大图预览 + 共 N 张,
预览用 Image.PreviewGroup items,被折叠的图在大图里仍能翻看);审核面板把「凭据截图」
拆成「提报凭证(游戏主页截图)」与「赠送凭证」(带待验收/已验收 Tag + 关联工单 Tooltip),
仓库面板新增「凭证」列并分组展示,两个详情弹窗同口径(含备注/提交时间/工单号/一句话说明)
真实库验证:赠送凭证解析在构造的工单验收资料上取到 3 张图(imageUrls 1 + files 2)并识别
pending_acceptance → 待客服验收;提报凭证在真实数据上取到 1 张。临时数据已清理。
2026-09-17 11:22:59 +08:00
yml2213
44de11a3a7
feat(consignment): 一个寄卖单号锚定全流程 + 统一状态机 + 卖家侧确认加好友/提交赠送截图
...
问题:一件货身上挂着三套互不相通的状态(提报单审核态、仓库库存态、工单赠送态),
my-items 同时返回两个数组、卖家端分两个列表渲染,同一件货显示两行两个号;
且卖家端只映射了前两套状态,"已出库"之后流程就断了,卖家不知道该干什么。
- 提报单号 SUB… 作为唯一「寄卖单号」从发布锚定到结算(零迁移);
listWorkerConsignments 改成一件货一条记录,库存/工单信息挂上去,
客服手工入库的现货(无提报单)才回退用库存号当锚点
- 新增 domain/consignment-item-stage.ts:把三套底层状态推导成卖家看得懂的一个阶段
(待审核/已通过待匹配/已匹配-待加好友/冷却中/待赠送/已赠送待审核/已完成/驳回/作废/取消)
+ 一句"下一步做什么" + 能力位(谁能确认加好友、谁该传截图),列表筛选与 KPI 也改由它驱动
- 卖家侧新增动作(以前只有 publish + my-items,卖家只能干看):
POST /worker/consignment/items/:submissionId/{confirm-friend,gift-evidence}
POST /worker/consignment/inventories/:inventoryId/{confirm-friend,gift-evidence}(手工入库现货)
复用既有工单链路 confirmWorkOrderFriendAdded / submitWorkerOrderAcceptance,
只加归属校验(不是本人履约的订单 403),顺带白拿"冷却没结束不许提交凭证""必须带图"
- 客服端用同一个号:库存列表/详情补 sourceSubmissionNo(LEFT JOIN 提报单),
履约/指派写进工单的寄售信息也带上;关键字搜索支持按寄卖单号搜(计数 SQL 同步补 join)
真实库端到端验证:确认加好友 → gift_phase=friend_countdown / friend_added_at 落库 /
gift_available_at 正好 +72h;冷却期内提交截图被拒(work_order_gift_cooldown_active);
越权操作被拒(consignment_item_not_found);按寄卖单号搜索命中正确。临时数据已清理。
2026-09-17 10:57:57 +08:00
yml2213
99752dce9e
fix(consignment): 修掉发布时乱弹内部库存提醒,并把弹窗赏金换算成元
...
乱弹窗根因:matchPeacekeeperOrderWithInventory 精确匹配判定失败后无条件 fall through 到
部分匹配;而系统/区服/系列/钻级缺失时 compareSpec 返回 unknown(不是 mismatch)会被放行,
于是任何只写了游戏名的订单都命中仓库里全部在库货,表现为"随便发布点什么都会弹一下"。
严格模式(自动提醒)现在要求:① 系统/区服/系列都能确认一致;② 存在正信号(库存配置更高,
或订单压根没提钻级)。"订单没写规格"不再算命中。
同时给 matchPeacekeeperOrderWithInventory / findMatchingPeacekeeperInventories 增加
allowUnspecifiedSpecs 选项:人工履约的服务端复检(运营已人工选定现货)走宽松模式,
标题没写全规格不硬拦、真冲突仍拦,避免收紧自动提醒时把人工履约一起挡掉。
赏金显示:弹窗用 rewardAmount(单位分)直接 toFixed,把 ¥40 显示成 ¥4000;
同文件其他 30 余处均为 /100,仅此处漏了。弹窗内收购成本/履约押金本来就已 /100,核对无误。
验证:用截图里的现货(苹果QQ区怒嚎3钻2璀璨)对照 6 种订单——
"怒嚎"、"苏尔南" 从命中变为不命中;"苹果QQ区怒嚎1钻" 仍按高配充低配提醒;
"5钻"(低配充高配)、"安卓微信区怒嚎1钻"(系统/区服不符)不命中。
后端 435 例(新增 3 例、改写 3 例)全绿。
2026-09-17 10:30:17 +08:00
yml2213
d158cc91bc
feat(consignment): 确认加好友后现货作废不回池,撤销履约押金可选并结算打手押金
...
现货口径(严):已确认加好友 = 买家好友已加上、货随时可能送出去,回池会被下一个工单
再次占用(等于二次出货)。收口在 releaseConsignmentInventoryBindingForWorkOrderWithClient:
解绑前读工单 acceptance_mode/friend_added_at,命中则 archived + allow_matching=FALSE + 留痕,
否则仍回池。所有解绑路径自动继承,发单系统接口未动。
撤销寄售履约(寄卖专属入口)支持两笔押金各自可选,默认按规则自动:
- 打手履约押金:auto / refund / forfeit
- 卖家发布押金:auto / keep_frozen / forfeit
策略抽成 domain/consignment-deposit-policy.ts 纯函数;覆盖时原因照旧必填,选项与金额写进
工单事件便于对账。
顺带修掉两个 bug:
1. 撤销寄售履约从不结算打手履约押金——只清 assigned_worker_id、只处理卖家押金,
worker_deposit 单撤销后打手押金永久冻结。现按选项结算(退还/没收)。
2. detachConsignmentMaterialFromWorkOrderWithClient 里 $1 既作 $1::text(detachedAt)
又赋值给 updated_at,Postgres 整体推断成 text → 42804。凡解绑现货摘寄售标记的路径
(取消指派/撤单/退单/售后/撤销履约/人工回库)在真实库上必然 500,假 client 单测抓不到。
已显式 ::timestamptz,并补类级静态护栏扫同类写法。
验证:真实库(全回滚)——已确认加好友解绑 → archived/allow_matching=false;
未确认 → 仍 in_stock;打手押金冻结 3000 → 退还 3000(重复结算 0)→ 再冻 2500 → 没收 2500
(可用余额不变、冻结归零、流水 deposit_deduction)。后端 432 例(新增 5 例)全绿。
2026-09-17 10:21:38 +08:00
yml2213
d6f6219fe9
feat(consignment): 内部现货履约改为停在「待加好友」,由客服确认后进赠送冷却
...
需求:发布匹配成功后订单要停在待加好友,客服线下通知加好友、手动确认后才进赠送冷却。
- 新增 parkWorkOrderWaitingFriendAddWithClient:占库落地时把工单停在
acceptance_mode=friend_gift + gift_phase=material_required 的「待加好友」阶段,
friend_added_at / gift_available_at / deadline_at 都留空(没有打手在跑,不该背时限),
并把商品规则里的冷却时长落到工单上(两者都为 0 时补默认 72 小时,
否则客服确认后会得到 0 秒冷却而立刻可赠送)。
- 履约服务不再传 forceFriendGift(该开关会直接把 friend_added_at 写成当前时间、
跳过客服确认);同步删除这个已无调用方的开关,冷却起始事件里的
skippedWorkerMaterial 改为按是否内部现货履约判断。
- 前端:内部现货单在该阶段显示「待加好友」(原为「待打手提交资料」),
确认按钮统一为「确认加好友」,确认弹窗补上"先用库存账号加好友、通知进展记备注"的引导。
- 后台备注增加快捷项「已通知加好友」,一键追加「[已通知加好友] 操作人 时间」。
- 阶段文案抽到 utils/gift-phase.ts 以便单测覆盖这条口径。
验证:真实库跑通全链路(停阶段 → 确认加好友进冷却 → 重复确认被拒 → 事件流正确,临时单已清理);
后端 415 例(412 通过,新增 3 例)、前端 25 例(新增 4 例)全绿。
2026-09-16 21:02:50 +08:00
yml2213
563e548b2e
feat(consignment): 补齐寄卖前端权限门控,收口调拨状态与运营体验
...
权限门控(P1-8 剩余):
- 新增 resolveAdminPermission(sessionPermissions, code):会话接口的最新权限列表优先,
接口异常才回退登录时的本地快照;空数组也判无权限,避免"刚被收回权限仍能点"。
- 寄售仓库面板:consignment.manage 控制手动入库/编辑/作废/退单回库/匹配开关(无权限时开关禁用)。
- 寄卖提报面板:consignment.review 控制审核入库/驳回。
- 接单平台页:无 consignment.view 不渲染两个寄卖 tab,并把 URL/localStorage 的旧选择拉回工单页。
数据约束(P2-19 剩余):
- 迁移 080:allocation_status 历史非法值归位「待安排」(备注留痕)后加 CHECK(待安排/已安排),
并顺手修正 077 遗留的"收集链接/玩家提交"权限描述文案。
- 编辑接口拒绝直接改 allocationStatus(400 consignment_allocation_status_update_forbidden)。
运营体验:
- 两个面板补 isError 错误态与重试;审核通过/驳回加 confirmLoading 与提交中守卫(防双提交)。
- 待审徽标改用后端真实总数(原来只统计当前页);编辑弹窗押金不再兜底 ¥100(会误写押金)。
- 履约拦截弹窗冷静期文案不再硬编码"3 天",改为按商品规则设定。
- 核实并撤回"倒计时时区偏移"误报:deadlineAt 为带 Z 的 ISO,前端无偏移问题。
验证:后端 412 例(409 通过)、前端 21 例(新增 5 例权限解析)全绿,
typecheck / lint / format / check:sql / build 通过;迁移 001→080 在全新空库跑通并在 dev 库应用。
2026-09-16 20:39:52 +08:00
yml2213
5d11bf2012
fix(consignment): 补齐指派补偿与规格复检,封闭寄卖资金/货物不一致窗口
...
- 指派失败改为完整补偿:取消指派(解冻打手押金 + 工单退回大厅 + 解绑现货)→ 兜底释放占用 →
摘除工单寄售标记。此前只把现货放回在库池,一旦"指派已提交、写 material 失败",工单会停在
in_progress + 押金冻结却不带寄售记录,现货还回到可匹配池,同一件货会被第二张单占用。
- 电子凭证核销失败写 consignment_fulfill_voucher_consume_failed 事件,前端按 voucherConsume.ok
弹警告并提示人工核销,不再无条件报成功(核销走快手外部接口,无法与数据库事务合并回滚)。
- 匹配规格改为 match/mismatch/unknown 三态,钻级兜底由 || 1 改 || 0:订单规格信息不全一律不进
"精确匹配",降级 partial 并在原因里列出缺失字段,消除"任意现货都 100 分精确匹配"的错发根因。
- 履约与指派在占库前做服务端规格复检:冲突 409 consignment_spec_mismatch;非 exact 必须显式
传 allowPartial(前端在部分匹配候选上先危险确认),高配充低配保留但不可误触。
- 人工解绑守卫由"状态黑名单"收窄为只拦交付中三态(与撤销白名单对齐),修复
"工单未开始 + 现货仍绑定"没有任何人工出口的问题。
- 新增 detachConsignmentMaterialFromWorkOrderWithClient,解绑回库/人工退回复库/作废同步摘掉
工单寄售标记,消除"已回库却仍显示寄卖履约"的陈旧痕迹。
- 回归测试新增 8 例(后端 410 例 / 407 通过),附迁移 079 上库前检查脚本。
2026-09-16 20:12:14 +08:00
yml2213
632dddc4c3
fix(consignment): 下线 H5 收集链接渠道并封闭寄卖履约状态机
...
下线定向收集链接(H5 填报)整条线,提报统一走接单平台打手端:
- 删除前端 ConsignmentCollectPage、consignment-public 服务与 /consignment-collect/:token 路由
- 删除后端公开路由 routes/consignment.ts、consignment-public-service 与管理端 /consignment/links 三接口
- 迁移 079 删表 consignment_collect_links、删列 consignment_submissions.link_id,
source_type 的 collection_link 归并为 worker_portal 并替换 CHECK
修复手工入库/编辑的凭据与截图静默丢失:后端统一按 credentialsJson ?? credentials、
screenshotsJson ?? screenshots 读取(入库/编辑/审核入库三个入口)。
按"已验收一律禁止撤销"封闭状态机:
- 撤销寄售履约加状态白名单(in_progress|pending_acceptance|problem)+ 事务内 FOR UPDATE
锁单 + UPDATE 带 status 条件(0 行 409)+ 原因必填 + 清空指派/时限/验收草稿痕迹
- 库存改状态一律带条件:撤销要求 bound_work_order_id 命中本工单;作废/回库要求未被
进行中工单占用(被挡时提示具体工单号);079 加部分唯一索引并清理历史重复绑定
- 工单终止统一解绑回库:打手撤单/取消指派/退回大厅/撤单/打手退单申请/超时处置接入
releaseConsignmentInventoryBindingForWorkOrderWithClient(售后不改工单状态,无需接入)
- 回库路径保留运营的 allow_matching 开关设置(不再强制开启),前端文案同步更正
顺带修掉资金与归属的同源缺陷:
- 押金归属与重冻金额改取不可变的冻结核销行,审核改派不再"退给错人/向错人扣款"
- 新增 assigned_worker_id 拆开"卖家"与"被指派履约人",占库不再覆盖卖家
- PUT /inventories/:id 禁止直接改 status;发布接口补 requireActiveWorker
- 押金冻结/释放后补推钱包实时事件;迁移 079 给发布冻结加台账幂等唯一索引
验证:后端 401 测试/398 通过/3 skip(新增 5 例回归),前端 16 通过;
两侧 typecheck、lint:check、format:check 与 check:sql、build 全绿。
迁移 079 未经真实数据库执行(本环境无 Postgres),上库前请先 dry-run。
2026-09-16 20:05:49 +08:00