forked from erp-dev/erp
167 lines
4.8 KiB
Markdown
167 lines
4.8 KiB
Markdown
# 客户对账单 Bug 修复计划
|
||
|
||
本文档列出 antd-demo 后端对账单同步与计算中已确认的所有问题,按优先级排序。
|
||
|
||
---
|
||
|
||
## 问题总览
|
||
|
||
| # | 问题 | 影响金额(腾飞案例) | 影响金额(张晓鹏案例) | 优先级 |
|
||
|---|------|---:|---:|:---:|
|
||
| 1 | 退货单金额放错列 | 7,378 | 17,224 | P0 |
|
||
| 2 | 退货单被冗余写入收款桶 | 7,378 | 17,224 | P0 |
|
||
| 3 | SfJinE 未按 BianHaoID 去重 | 0 | 197,280 | P0 |
|
||
| 4 | 销售折扣(F_Skd XS% 行 ZkJinE)无法获取 | 2 | 583 | P1 |
|
||
|
||
---
|
||
|
||
## Bug 1:退货单金额放错列
|
||
|
||
### 现象
|
||
|
||
"外部销售退货单"行的金额被放到了"已收金额"列,应该放到"本单应收"列(负数)。
|
||
|
||
| | antd-demo 当前 | ERP 正确值 |
|
||
|---|---|---|
|
||
| 本单应收 | 0 | -7,378(负数) |
|
||
| 已收金额 | 7,378 | 0 |
|
||
|
||
### 影响
|
||
|
||
退货对欠款的减少效果被抵消,导致累欠偏高。
|
||
|
||
### 修复
|
||
|
||
同步 `sale_return` 类型的 `ExternalCustomerStatementOrder` 时:
|
||
- `positive_amount` = 0
|
||
- `negative_amount` = |JinE|(取绝对值,如 7,378)
|
||
|
||
对账单视图中"本单应收"显示为负数(= positive_amount - negative_amount = -7,378)。
|
||
|
||
---
|
||
|
||
## Bug 2:退货单被冗余写入收款桶
|
||
|
||
### 现象
|
||
|
||
同一笔 XT 退货单同时出现在"外部销售退货单"和"收款单"两种类型里。
|
||
|
||
腾飞纺织:收款单 101 行(应为 92),多出的 9 行 = 退货单。
|
||
|
||
### 影响
|
||
|
||
收款行数虚增,但金额被退货冲减,导致退货效果完全抵消。
|
||
|
||
### 修复
|
||
|
||
同步逻辑中,XT 退货单只写入退货桶(`external_sales_return_order`),不写入收款桶(`receipt_order`)。
|
||
|
||
检查点:`finance/by-customer?record_types=refund` 返回的 XT 记录不应该再创建 `ReceiptOrder`。
|
||
|
||
---
|
||
|
||
## Bug 3:SfJinE 未按 BianHaoID 去重
|
||
|
||
### 现象
|
||
|
||
`I_Sale.SfJinE` 是单据头级别字段,被冗余写到同一 BianHaoID 的每一行明细上。直接对所有明细行求和会重复计入。
|
||
|
||
张晓鹏案例:
|
||
- 7 笔现场收款订单,共 22 行明细
|
||
- 去重后 SfJinE = 77,132(正确)
|
||
- 直接 SUM = 274,412(错误,多算 197,280)
|
||
|
||
### 影响
|
||
|
||
欠款被严重低估(张晓鹏少算了 197,280 元)。
|
||
|
||
### 修复
|
||
|
||
同步时按 BianHaoID 分组,每组只取一次 SfJinE:
|
||
|
||
```python
|
||
seen = set()
|
||
total_sf = 0.0
|
||
for record in sales_records:
|
||
if record.BianHaoID not in seen:
|
||
seen.add(record.BianHaoID)
|
||
total_sf += record.SfJinE
|
||
```
|
||
|
||
---
|
||
|
||
## Bug 4:销售折扣数据缺失
|
||
|
||
### 现象
|
||
|
||
`/api/v1/i-sale/by-customer` 返回的 `ZkJinE` 全部为 0。真实的销售折扣存在于 `F_Skd` 表的 XS% 行中,但当前只从 F_Skd 拉 SK%(收款)记录。
|
||
|
||
张晓鹏案例:
|
||
- receipt.ZkJinE = 233(已正确获取)✅
|
||
- sales.ZkJinE = 583(存在于 F_Skd XS% 行,无法获取)❌
|
||
- 总差额 = 816 元
|
||
|
||
### 影响
|
||
|
||
欠款偏高 583 元(销售折扣未扣减)。影响较小,大部分客户折扣为 0 或极小。
|
||
|
||
### 解决方案(需 haobuye API 配合)
|
||
|
||
**方案 A(推荐)**:让 haobuye API 的 `finance/by-customer` 接口支持 `record_types=sale`
|
||
|
||
```http
|
||
GET /api/v1/finance/by-customer?customer_name_b64=xxx&record_types=sale
|
||
```
|
||
|
||
返回 F_Skd 中 `sType=1 AND BianHaoID LIKE 'XS%'` 的记录,包含 ZkJinE 字段。
|
||
|
||
**方案 B**:用 `db/select` 补查非零折扣
|
||
|
||
```http
|
||
GET /api/v1/db/select?table=dbo.F_Skd
|
||
&columns=BianHaoID,ZkJinE
|
||
&where=KhID='KH00308' AND BianHaoID LIKE 'XS%' AND ZkJinE<>0
|
||
&limit=1000
|
||
```
|
||
|
||
非零折扣行通常很少,不会触及 1000 行上限。
|
||
|
||
**方案 C**:让 haobuye API 修改 `i-sale/by-customer` 接口,按 BianHaoID join F_Skd 把真实 ZkJinE 填入返回值。
|
||
|
||
---
|
||
|
||
## 修复优先级建议
|
||
|
||
```text
|
||
第一步:修 Bug 1 + Bug 2(退货相关,影响最大,纯后端改动)
|
||
第二步:修 Bug 3(SfJinE 去重,纯后端改动)
|
||
第三步:修 Bug 4(需要 haobuye API 配合,影响最小)
|
||
```
|
||
|
||
---
|
||
|
||
## 修复后预期结果
|
||
|
||
以腾飞纺织为例:
|
||
|
||
| 项目 | 修复前 | 修复后 | ERP 正确值 |
|
||
|------|---:|---:|---:|
|
||
| 累欠金额 | 60,899 | 53,521 | 53,521 |
|
||
|
||
以张晓鹏为例(截至 5-18):
|
||
|
||
| 项目 | 修复前 | 修复后(不含 Bug4) | 修复后(含 Bug4) | ERP |
|
||
|------|---:|---:|---:|---:|
|
||
| 累欠金额 | 748,563 | 748,330 | 747,747 | 747,747 |
|
||
|
||
---
|
||
|
||
## 验证方法
|
||
|
||
修复后用以下客户验证:
|
||
|
||
1. **木棉(KH01078)**— SfJinE=0,无折扣,预期 10,718
|
||
2. **腾飞纺织(KH00311)**— SfJinE=0,折扣=2,预期 53,521
|
||
3. **金庸(KH00290)**— SfJinE=23,394(1笔1行,不涉及去重),折扣=13,009,预期 82,670
|
||
4. **张晓鹏(KH00308)**— SfJinE=77,132(7笔22行,必须去重),折扣=816,预期与 ERP 实时值一致
|