# 打手重复奖励核对清单(2026-10-27) > 数据源:本地生产快照 `order_site`(与 `backups/postgres/order_site-20261022-092601.dump` 模拟库一致)。 > 审计视图:`v_worker_wallet_duplicate_rewards`(迁移 104,已排除寄卖货款并按 `worker_id` 分组)。 > **结论:原始按“工单 + 流水类型”分组得到 9 组;排除寄卖货款后,实际疑似重复 8 组。** > 处理原则:**不自动扣回、不删除流水**;由财务逐组核对后走人工调整。 --- ## 一、汇总 | 指标 | 数值 | | --- | --- | | 原始同工单奖励流水组 | 9 组 | | 其中寄卖货款误报 | 1 组(工单 84886) | | 实际疑似重复 | **8 组** | | 涉及流水 | 16 条 | | 两组流水合计 | **¥392.40** | | 重复多计(按每组一半估算) | **¥196.20** | | 涉及打手 | 7 人 | | 工单状态 | 全部 `accepted` | > 金额单位:分;下表同时给出元。`多计` 按“两条金额相同、保留一条”估算,最终以财务核对为准。 --- ## 二、疑似重复明细(8 组) | # | 工单号 | 工单 ID | 打手 ID | 打手账号 | 流水 ID | 单条金额 | 条数 | 合计 | 多计 | 时间差 | 当前可用余额 | | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | | 1 | WO68ae5cc00012 | 41430 | 7 | 18622832733 | 26738 / 26739 | ¥12.60 | 2 | ¥25.20 | ¥12.60 | 0.218s | ¥22,817.40 | | 2 | WOf9a256424094 | 67580 | 28 | 19391334110 | 55324 / 55325 | ¥47.50 | 2 | ¥95.00 | ¥47.50 | 3.487s | ¥329.04 | | 3 | WO1ef60bfd41f3 | 70556 | 60 | 18700402637 | 58633 / 58634 | ¥0.20 | 2 | ¥0.40 | ¥0.20 | 3.808s | ¥1,397.00 | | 4 | WO26092719382700 | 90262 | 21 | 17386836758 | 85908 / 85909 | ¥6.50 | 2 | ¥13.00 | ¥6.50 | 0.595s | ¥104.50 | | 5 | WO26100215392303 | 100509 | 37 | 13779907018 | 99520 / 99522 | ¥12.80 | 2 | ¥25.60 | ¥12.80 | 0.773s | ¥0.48 | | 6 | WO26100312143075 | 102885 | 51 | 14718183196 | 102228 / 102229 | ¥100.00 | 2 | ¥200.00 | ¥100.00 | 3.400s | ¥1,887.60 | | 7 | WO26100316285341 | 103640 | 21 | 17386836758 | 103021 / 103022 | ¥1.60 | 2 | ¥3.20 | ¥1.60 | 3.376s | ¥104.50 | | 8 | WO26101115455274 | 125710 | 1365 | 15669767683 | 130982 / 130983 | ¥15.00 | 2 | ¥30.00 | ¥15.00 | 0.614s | ¥4,407.18 | --- ## 三、逐条流水明细(16 条) | 流水 ID | 工单 ID | 打手 ID | 金额 | 余额后 | 冻结后 | 备注 | payload | 创建时间 | | ---: | ---: | ---: | ---: | ---: | ---: | --- | --- | --- | | 26738 | 41430 | 7 | 1260 | 1515880 | 0 | 验收通过结算报酬 | `{}` | 2026-08-26 19:15:09.638 | | 26739 | 41430 | 7 | 1260 | 1517140 | 0 | 验收通过结算报酬 | `{}` | 2026-08-26 19:15:09.856 | | 55324 | 67580 | 28 | 4750 | 124321 | 6000 | 验收通过结算报酬 | `{}` | 2026-09-03 21:05:22.924 | | 55325 | 67580 | 28 | 4750 | 129071 | 6000 | 验收通过结算报酬 | `{}` | 2026-09-03 21:05:26.411 | | 58633 | 70556 | 60 | 20 | 76280 | 0 | 验收通过结算报酬 | `{}` | 2026-09-04 21:18:52.540 | | 58634 | 70556 | 60 | 20 | 76300 | 0 | 验收通过结算报酬 | `{}` | 2026-09-04 21:18:56.348 | | 85908 | 90262 | 21 | 650 | 221195 | 0 | 验收通过结算报酬 | `{}` | 2026-09-27 19:50:13.522 | | 85909 | 90262 | 21 | 650 | 221845 | 0 | 验收通过结算报酬 | `{}` | 2026-09-27 19:50:14.117 | | 99520 | 100509 | 37 | 1280 | 57160 | 12000 | 验收通过结算报酬 | `{}` | 2026-10-02 15:52:18.017 | | 99522 | 100509 | 37 | 1280 | 58440 | 12000 | 验收通过结算报酬 | `{}` | 2026-10-02 15:52:18.790 | | 102228 | 102885 | 51 | 10000 | 331210 | 0 | 验收通过结算报酬 | `{}` | 2026-10-03 12:29:32.277 | | 102229 | 102885 | 51 | 10000 | 341210 | 0 | 验收通过结算报酬 | `{}` | 2026-10-03 12:29:35.677 | | 103021 | 103640 | 21 | 160 | 74193 | 0 | 验收通过结算报酬 | `{}` | 2026-10-03 16:48:16.927 | | 103022 | 103640 | 21 | 160 | 74353 | 0 | 验收通过结算报酬 | `{}` | 2026-10-03 16:48:20.303 | | 130982 | 125710 | 1365 | 1500 | 469690 | 0 | 验收通过结算报酬 | `{}` | 2026-10-11 17:17:22.873 | | 130983 | 125710 | 1365 | 1500 | 471190 | 0 | 验收通过结算报酬 | `{}` | 2026-10-11 17:17:23.487 | > 16 条流水的 `payload_json` 都为空、备注都是“验收通过结算报酬”,且同一打手、同一工单、时间差 0.2–3.8 秒,重复特征明显。 --- ## 四、误报排除:工单 84886 原始 9 组里包含工单 84886,但它不是重复奖励: | 流水 ID | 打手 ID | 金额 | 备注 | payload | | ---: | ---: | ---: | --- | --- | | 87769 | 25 | 13000 | 验收通过结算报酬 | `{}` | | 87770 | 37 | 13000 | 寄卖货款结算 #84886 | `{"inventoryId":159,"workOrderId":84886,"costPriceFen":13000,"submissionNo":"SUB26092515093529"}` | - 两条流水属于**不同打手**; - 一条是工单验收奖励,一条是寄卖货款结算; - 金额相同只是巧合,不能按重复扣回。 因此审计视图已修正为: - 按 `worker_id + work_order_id + ledger_type + share_id` 分组; - 排除 `payload_json ? 'inventoryId'` 的寄卖货款; - 结果从 9 组降为 **8 组**。 --- ## 五、人工核对建议 每组按以下顺序确认: 1. 查工单 `accepted` 时间、验收人、`work_order_shares` 是否有同打手多份额; 2. 确认两条流水是否都是“验收通过结算报酬”,且没有对应的冲正/扣回流水; 3. 对比 `worker_wallets.total_settled_amount` 与全部结算流水,确认多计已进入余额; 4. 确认打手当前余额是否足够扣回;不足时登记欠款,不要直接把余额改成负数; 5. 处理方式建议: - 余额足够:人工新增负数调整流水(`ledger_type` 建议 `manual_adjustment`,备注“重复结算追回 + 工单号”); - 余额不足:登记 `worker_after_sales_debts` 或线下追缴,后续结算抵扣; - 不删除原流水,不直接改 `worker_wallets` 历史余额。 --- ## 六、复核 SQL ```sql -- 当前疑似重复(已排除寄卖货款、按打手分组) SELECT * FROM v_worker_wallet_duplicate_rewards ORDER BY ledger_count DESC, related_work_order_id; -- 指定工单的全部奖励流水 SELECT id, worker_id, ledger_type, amount, balance_after, frozen_after, note, payload_json, created_at FROM worker_wallet_ledgers WHERE related_work_order_id = 41430 AND ledger_type IN ('reward_settlement', 'sharing_reward', 'reward_pending_unfreeze') ORDER BY id; ``` --- ## 七、结论 - 需要人工核对的疑似重复:**8 组,16 条流水,合计 ¥392.40,多计约 ¥196.20**; - 工单 84886 是寄卖货款 + 工单奖励,**不是重复**,不要扣回; - 历史重复不自动修复,避免误伤正常寄卖/多份额结算; - 迁移 104 已为未来奖励流水加 `event_key` 唯一约束,新重复会被数据库直接拒绝。