feat(settlement): v4.0.6 酒厂 T+3 每 3 天出一期并与订单完全比对

含现场提货入账、零应付仍出账、核对补生成,以及线上历史账单修复 SQL。
This commit is contained in:
2026-08-31 17:27:38 +08:00
parent ac94f5f5de
commit f35e1a3ba5
15 changed files with 782 additions and 84 deletions
+2 -1
View File
@@ -116,7 +116,8 @@
- 确认打款时可填写打款凭证号(`paymentRef`),并可上传凭证照片(`paymentProofUrls`,最多 9 张);已打款后在详情与导出中展示
- 门店账单统一列表:T+1 终态「已打款」、手动提现终态「已结算」(均为 `PAID`,文案区分业务类型)
- 门店 T+1「出账日」= 出账当天(核销窗口「昨日 00:00–今日 00:00」中的今天)
- **账单日一律为出账当天的北京日历日**(Asia/Shanghai):门店 T+1、酒厂 T+3 账单的 `billDate`;合伙人/物流月账的账期按北京自然月。酒厂 T+3 只决定纳入哪天完成订单,账单日不是完成日
- **账单日一律为出账当天的北京日历日**(Asia/Shanghai):门店 T+1、酒厂 T+3 账单的 `billDate`;合伙人/物流月账的账期按北京自然月。酒厂 T+3 = **每 3 天出一期**,纳入上期 3 天完成订单。
- **酒厂账单与订单完全比对**(v4.0.6):全部已完成已付订单均入账(含现场提货);出账日无单或应付为 0 仍生成账单,业务状态展示「无需打款」(DB 仍为 `UNPAID`);支持按出账周期核对补生成漏账。
- 核销详情展示核销门店主账户收款信息
### 3.4~3.8 Wave 能力
+1 -1
View File
@@ -65,7 +65,7 @@ C 端购酒核销 · 门店扫码核销+打款 · 合伙人拓店履约 · WebAd
**主链路 15 项**:登录、4 SKU、起购、支付+权益、双通道核销、payout、关店不可见、拓店审核、配送完成、退款、T+1/T+30…
**后台 8 项**:商品/门店/订单/权益/核销/工单/日志/财务。
**开发计划任务**:状态 `TODO` 待开发 / `IN_PROGRESS` 开发中 / `DEVELOPED` 已开发 / `RELEASED` 已上线;任务列表「来源工单」链到 `/tickets/support?id=`
**财务账单日**:出账当天北京日历日(门店/酒厂 `billDate`;合伙人/物流账期按北京自然月)。禁止 `toISOString().slice(0,10)` 或服务器本地 `Date` 午夜当账单日。
**财务账单日**:出账当天北京日历日(门店/酒厂 `billDate`;合伙人/物流账期按北京自然月)。禁止 `toISOString().slice(0,10)` 或服务器本地 `Date` 午夜当账单日。酒厂应付为 0 仍出账(展示无需打款)。
## 6. 技术债(摘要)
+12 -4
View File
@@ -1,8 +1,8 @@
# 杜康好客 · V4 PRD
> **v4.0**2026-08-29)· 关联码与分佣事实源
> 未改规则仍见 [`杜康好客-v3-PRD.md`](./杜康好客-v3-PRD.md)。**冲突时 V4 > V3**(本主题:订单佣金归属、关联码、合伙人账单明细、活动图)。
> 实现:[`v4.0.1 开发文档`](./杜康好客-v4.0.1-开发文档.md) · [`v4.0.2 开发文档`](./杜康好客-v4.0.2-开发文档.md) · 审计:[`v4-现状对照`](./杜康好客-v4-现状对照.md)
> **v4.0**2026-08-29)· 关联码与分佣事实源**v4.0.6** 酒厂对账与订单完全比对
> 未改规则仍见 [`杜康好客-v3-PRD.md`](./杜康好客-v3-PRD.md)。**冲突时 V4 > V3**(本主题:订单佣金归属、关联码、合伙人账单明细、活动图、酒厂对账)。
> 实现:[`v4.0.1 开发文档`](./杜康好客-v4.0.1-开发文档.md) · [`v4.0.2 开发文档`](./杜康好客-v4.0.2-开发文档.md) · [`v4.0.6 开发文档`](./杜康好客-v4.0.6-开发文档.md) · 审计:[`v4-现状对照`](./杜康好客-v4-现状对照.md)
## 0. 版本
@@ -10,6 +10,7 @@
|----|------|------|----------|
| 4.0.1 | 08-29 / 08-30 | 合伙人关联码;订单佣金只认关联;账单酒单/核销分列;去掉区县酒单佣金;HQ 关联筛选与快链;合伙人 H5 用户管理与首页统计 | [`v4.0.1`](./杜康好客-v4.0.1-开发文档.md) |
| 4.0.2 | 08-30 | HQ 活动图模板(底图 + 方形码栏 + 文案);合伙人下载合成关联码;所选图写入库并作为用户管理主图 | [`v4.0.2`](./杜康好客-v4.0.2-开发文档.md) |
| 4.0.6 | 08-31 | 酒厂 T+3=每 3 天出一期;全部已完成已付订单(含现场提货);应付为 0 仍出账;核对补生成 | [`v4.0.6`](./杜康好客-v4.0.6-开发文档.md) |
## 1. 锚点(沿用 V3,佣金归属改写)
@@ -75,6 +76,13 @@ HQ 财务详情与合伙人确认页均展示两段列表。不再「无快照
- 合伙人只看 `ACTIVE`;下架后列表不再出现。无关联码则不可下载并明确报错。
- HQ 持权限 `activity_posters`(默认超管 + 运营)可增删改、上下架。
## 7. 不做
## 7. 酒厂对账(v4.0.6
- 口径:T+3 = **每 3 个自然日出具一张账单**(对齐起点 `2026-08-01`,出账日如 8/4、8/7、8/10…);纳入窗口为上一期 3 天 `[出账日−3, 出账日)` 内全部 **COMPLETED + PAID** 订单(含现场提货);`billDate` = 出账当天北京日历日;应付 = 实付合计 × 30%。
- **与订单完全比对**:上述订单均须进入对应出账日账单明细;漏账可通过 HQ「核对补生成」或每日任务回扫补齐。
- **应付为 0 仍出账**:出账日无订单或应付为 0 仍生成账单;业务状态展示「无需打款」(DB 仍为 `UNPAID`,不可确认打款)。
- **已打款不回刷**;未打款账单可重算;明细 `orderId` 冲突时从其他未打款账单迁入。
## 8. 不做
改推广码体系;改核销归属;子账号自己的码;回刷已打款账单;区县佣金双轨;AI 出图/出文案;C 端/门店端活动图;预生成每人缓存图。
+5 -3
View File
@@ -3,13 +3,13 @@
> 基准:[`杜康好客-v4-PRD.md`](./杜康好客-v4-PRD.md)
> V3 进度仍见 [`杜康好客-v3-现状对照.md`](./杜康好客-v3-现状对照.md),不混表。
## 0. 总览(2026-08-30
## 0. 总览(2026-08-31
| 维度 | 结论 |
|------|------|
| 版本线 | **v4.0.2** 活动图模板 + 关联码合成 |
| 版本线 | **v4.0.6** 酒厂对账与订单完全比对 |
| 订单佣金 | 区县归属已删除;只认关联 / 代下单选择 |
| 账单 | 酒订单 / 核销订单分列 |
| 账单 | 酒订单 / 核销订单分列;酒厂含现场提货,零应付仍出账(无需打款) |
| 活动图 | HQ 上传底图/码栏/文案;合伙人选择写入库;用户管理主图跟选择走 |
## 1. 版本交付
@@ -18,6 +18,7 @@
|------|------|------|
| 4.0.1 | [`关联码与分佣账单`](./杜康好客-v4.0.1-开发文档.md) | ✅ 已实现 |
| 4.0.2 | [`活动图模板与关联码合成`](./杜康好客-v4.0.2-开发文档.md) | ✅ 已实现 |
| 4.0.6 | [`酒厂对账核对`](./杜康好客-v4.0.6-开发文档.md) | ✅ 已实现 |
| 日期 | 说明 |
|------|------|
@@ -25,3 +26,4 @@
| 2026-08-30 | HQ 订单/用户详情展示关联合伙人;改绑权限 `users_partner_assoc`;用户/订单筛选关联合伙人;开城关联用户快链 |
| 2026-08-30 | 合伙人 H5:首页关联用户/关联用户订单统计;用户管理 Tab(关联码+列表+备注);`partner_user_note` 与 HQ `hqRemark` 隔离 |
| 2026-08-30 | v4.0.2HQ 活动图(底图 + 拖拽码栏 + 文案);合伙人复制文案、下载合成关联码;选择写入库,用户管理主图下次登录仍显示 |
| 2026-08-31 | v4.0.6:酒厂 T+3=每 3 天出一期(非每日);含现场提货;零应付仍出账;核对补生成 |
+63
View File
@@ -0,0 +1,63 @@
# 杜康好客 · v4.0.6 开发文档
> **2026-08-31** · settlement / admin-web
> **主题**:酒厂 T+3 = 每 3 天出一期;与全部已完成已付订单完全比对(含现场提货);应付为 0 仍出账(无需打款);核对补生成
需求事实源:[`杜康好客-v4-PRD.md`](./杜康好客-v4-PRD.md) §7 · V3 财务锚点仍见 [`杜康好客-v3-PRD.md`](./杜康好客-v3-PRD.md) §3.3
---
## 1. 版本目标
| # | 任务 | 类型 | 交付 |
|---|------|------|------|
| 1 | T+3 出账节奏 | 修 | **每 3 天一张账单**(非每日);纳入上期 3 个自然日全部已付已完成订单 |
| 2 | 含现场提货 | 修 | 不限配送类型 |
| 3 | 零应付 / 无单仍出账 | 修 | 出账日仍生成账单,展示「无需打款」 |
| 4 | 核对补生成 | 需求 | HQ 按区间重算周期出账日;清理旧「每日一账」空账单 |
---
## 2. 规则
对齐起点 `WINERY_BILL_EPOCH_YMD = 2026-08-01`,周期 `WINERY_SETTLEMENT_PERIOD_DAYS = 3`
| 出账日 | 纳入完成日窗口 |
|--------|----------------|
| 8/4 | [8/1, 8/4) |
| 8/7 | [8/4, 8/7) |
| 8/28 | [8/25, 8/28) |
| 8/31 | [8/28, 8/31) |
- 应付 = `round2(Σ payAmount × 0.3)`
- `wineryAmount === 0` → UI/导出「无需打款」;确认打款拒绝
- 非周期日不生成;每日 cron 仅在出账日真正落账
### 旧逻辑为何对不上
旧实现是「**每天**出账,只收 **3 天前那一天** 的订单」:当天窗口无完成单就 skip → 8/48/28 大量空白;8/28、8/29 连着出是因为两天各自都有「D−3」完成单。
---
## 3. 变更面
| 位置 | 说明 |
|------|------|
| `packages/domain` | `isWineryIssueDay` / `shanghaiWineryPeriodWindow` / `wineryIssueDateFromCompletedAt` / `listWineryIssueDays` |
| `shared-types` | `WINERY_SETTLEMENT_PERIOD_DAYS``WINERY_BILL_EPOCH_YMD` |
| `settlement.service` | 周期出账;`reconcileWineryBills` 只跑周期日并清理非周期空账单 |
| `settlement.scheduler` | 每日尝试出账(非周期日 skip)+ 近 45 日核对 |
| `admin-web` | 文案 + 核对补生成 |
无 Prisma 迁移。线上历史账单一次性修复:`server/dukang-api/prisma/sql/fix-winery-bills-v406.sql`(补现场提货入账、中间 0 账、迁错期明细)。
---
## 4. 验收
- [ ] 账单日仅为 8/4、8/7、8/10… 这类周期日,不会连续两天各出一张(除非跨期)
- [ ] 核对补生成后,同城配送与现场提货订单均出现在对应期账单明细(历史现场单缺 `completedAt` 会自动用 `paidAt` 补齐)
- [ ] 每张账单明细覆盖上期 3 天全部已付已完成订单(含现场提货/同城/跨城)
- [ ] 出账日无单仍有账单,「无需打款」
- [ ] HQ「核对补生成」可选 8/4~今天,补齐中间漏期并清理误生成的每日账单
- [ ] 已打款账单不回刷