feat(finance): 应收侧往来台账放开 ledgerType 扩域 changelog(#8719 / PR #8727)
changelog-filename-gate / validate (push) Failing after 2s
changelog-filename-gate / validate (push) Failing after 2s
statements/page 与 entries/page 入参 ledgerType 由仅 SUPPLIER 扩为 SUPPLIER / SUPPLIER_RECV / CUSTOMER(STAFF 未开放报 596005); netAmount/openingAmount 符号方向按账套分化,应收账套本期无流水空页属正常。
这个提交包含在:
@@ -0,0 +1,309 @@
|
||||
---
|
||||
schema: "hl-changelog/v2"
|
||||
ticket: "8719"
|
||||
title: "应收侧往来台账放开——ledgerType 取值域扩为 SUPPLIER/SUPPLIER_RECV/CUSTOMER(#8719)"
|
||||
consumer: "admin"
|
||||
author: "yst"
|
||||
change_type: "修改接口"
|
||||
backend_status: "deployed"
|
||||
gateway_status: "not_required"
|
||||
frontend_status: "pending"
|
||||
frontend_owner: ""
|
||||
frontend_ref: ""
|
||||
target_release: ""
|
||||
verified_at: "2026-10-02"
|
||||
status_note: "应收初始化录入的应收期初(客户应收/供应商应收)原在往来台账看不到,本期放开应收侧台账:/admin/finance/statements/page 与 /entries/page 两接口 ledgerType 取值域由仅 SUPPLIER 扩为 SUPPLIER/SUPPLIER_RECV/CUSTOMER(STAFF 仍未开放,传了报 596005)。应收账套本期无业务流水,increaseTotal/decreaseTotal 恒 0、entries 空页属正常;netAmount/openingAmount 符号方向按账套不同,详见正文对照表。"
|
||||
updated_at: "2026-10-02"
|
||||
base: "dev-v3"
|
||||
---
|
||||
|
||||
# finance:应收侧往来台账放开——ledgerType 扩域(管理后台)
|
||||
|
||||
> ⚠️ **修改接口(入参取值域扩大 + 出参符号语义按账套分化)**:`ledgerType` 新增 `SUPPLIER_RECV` / `CUSTOMER` 两个合法值;出参 `netAmount` / `openingAmount` 的正负方向随账套不同,前端展示层必须按账套区分正负含义并标红负值。
|
||||
|
||||
## 1. 接口背景
|
||||
|
||||
应收初始化录入的**应收期初**(客户应收 / 供应商应收)原先在往来台账页**完全看不到**——因为台账接口的 `ledgerType` 只开放 `SUPPLIER`(供应商应付)一个账套,应收侧的期初挂账没有查询入口。
|
||||
|
||||
本期放开应收侧台账,让期初挂账可见:
|
||||
- 供应商应收(`SUPPLIER_RECV`):我们预付/多付给供应商、应向他收回的钱
|
||||
- 客户应收(`CUSTOMER`):客户欠我们的钱(该收未收)
|
||||
|
||||
注意本期**只放开期初可见性**,应收账套暂无业务流水(后续版本接),所以应收账套下 `increaseTotal` / `decreaseTotal` 恒为 0、明细接口返回空页属于**正常行为**,不是接口坏了。
|
||||
|
||||
## 2. 变更清单
|
||||
|
||||
| # | 接口 | 变更点 | 类型 |
|
||||
|---|------|--------|------|
|
||||
| 1 | `GET /admin/finance/statements/page` | 入参 `ledgerType` 取值域扩大:`SUPPLIER` → `SUPPLIER` / `SUPPLIER_RECV` / `CUSTOMER` | ⚠️ 修改 |
|
||||
| 2 | `GET /admin/finance/statements/page` | 出参 `netAmount` / `openingAmount` 符号方向按账套分化(详见 §5 对照表) | 🔧 语义扩展 |
|
||||
| 3 | `GET /admin/finance/statements/page` | 出参 `ledgerType` 可能出现新值 `SUPPLIER_RECV` / `CUSTOMER` | ✨ 枚举扩域 |
|
||||
| 4 | `GET /admin/finance/statements/entries/page` | 入参 `ledgerType` 取值域同步扩大 | ⚠️ 修改 |
|
||||
| 5 | 两接口 | `STAFF` 账套仍未开放,传 `STAFF` 报 596005 | 📝 行为不变 |
|
||||
|
||||
## 3. 接口详情
|
||||
|
||||
| 项 | statements/page | entries/page |
|
||||
|---|---|---|
|
||||
| 方法 + 路径 | `GET /admin/finance/statements/page` | `GET /admin/finance/statements/entries/page` |
|
||||
| 接口名 | 往来台账分页(按往来单位汇总) | 台账明细分页(按往来单位看流水) |
|
||||
| 使用场景 | 管理后台 → 财务 → 往来台账列表页 | 台账页点某往来单位后的明细流水 |
|
||||
| 认证 | 管理后台登录态(JWT) | 同左 |
|
||||
| 幂等性 | 只读查询,天然幂等 | 只读查询,天然幂等 |
|
||||
| 限流 | 无特殊限流 | 无特殊限流 |
|
||||
|
||||
## 4. 接口入参
|
||||
|
||||
### 4.1 `GET /admin/finance/statements/page`(Query 参数)
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| ledgerType | string | **必填** | 账套:`SUPPLIER` / `SUPPLIER_RECV` / `CUSTOMER`(本期新增后两个值);传 `STAFF` 报 596005 |
|
||||
| refName | string | 可空 | 往来单位名称,模糊匹配 |
|
||||
| negativeOnly | boolean | 可空 | 只看净额为负(多付/多收)的单位;语义随账套,见 §5 |
|
||||
| page | int | 必填 | 页码,从 1 开始 |
|
||||
| pageSize | int | 必填 | 每页条数 |
|
||||
|
||||
### 4.2 `GET /admin/finance/statements/entries/page`(Query 参数)
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| ledgerType | string | **必填** | 账套,取值同 4.1;传 `STAFF` 报 596005 |
|
||||
| refId | string | 必填 | 往来单位 ID(台账列表出参 `refId`) |
|
||||
| direction | string | 可空 | 流水方向:`INCREASE` / `DECREASE` |
|
||||
| sourceType | string | 可空 | 来源类型:`PAYMENT` / `PREPAY` |
|
||||
| entryDateStart | string | 可空 | 流水日期起,格式 `yyyy-MM-dd` |
|
||||
| entryDateEnd | string | 可空 | 流水日期止,格式 `yyyy-MM-dd` |
|
||||
| teamNo | string | 可空 | 团号,精确过滤 |
|
||||
| page | int | 必填 | 页码,从 1 开始 |
|
||||
| pageSize | int | 必填 | 每页条数 |
|
||||
|
||||
## 5. 出参字段
|
||||
|
||||
### 5.1 statements/page 出参
|
||||
|
||||
统一分页包装 `PageResult`:`{ list/records: [...], total, page, pageSize }`(以前端现行解析字段为准,按现有页面使用的那个读)。
|
||||
|
||||
`records[]` 字段:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| ledgerType | string | 账套,可能值:`SUPPLIER` / `SUPPLIER_RECV` / `CUSTOMER`(新增后两个值) |
|
||||
| refId | string | 往来单位 ID(Long 序列化为字符串,防精度丢失) |
|
||||
| refName | string | 往来单位名称 |
|
||||
| openingAmount | number | 期初净额,方向按账套(见下表) |
|
||||
| increaseTotal | number | 本期增加合计(应收账套本期恒 0) |
|
||||
| decreaseTotal | number | 本期减少合计(应收账套本期恒 0) |
|
||||
| writeoffTotal | number | 核销合计 |
|
||||
| adjustTotal | number | 财务调账合计 |
|
||||
| netAmount | number | 当前净额,方向按账套(见下表) |
|
||||
|
||||
**金额符号语义对照表(前端展示必须按此区分)**:
|
||||
|
||||
| 账套 | openingAmount 期初净额 | netAmount 正数含义 | netAmount 负数含义 | 前端提示文案建议 |
|
||||
|------|------------------------|---------------------|---------------------|------------------|
|
||||
| `SUPPLIER` 供应商应付 | 期初应付 − 期初应收 | 我欠他(该付未付) | 多付他 | 应付 / 多付 |
|
||||
| `SUPPLIER_RECV` 供应商应收 | 期初应收 − 期初应付 | 他欠我(该收未收) | 多收他 | 应收 / 多收 |
|
||||
| `CUSTOMER` 客户应收 | 期初应收 − 期初应付 | 他欠我(该收未收) | 多收他 | 应收 / 多收 |
|
||||
|
||||
- **负值一律标红**(多付 / 多收属异常资金状态,需财务关注)。
|
||||
- 同一列在不同账套 tab 下正负含义**相反**,不能直接复用「正=欠」的单一判断。
|
||||
|
||||
### 5.2 entries/page 出参
|
||||
|
||||
`records[]` 字段:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | string | 明细 ID |
|
||||
| ledgerType | string | 账套,可能值同 5.1 |
|
||||
| refId | string | 往来单位 ID |
|
||||
| refName | string | 往来单位名称 |
|
||||
| entryDate | string | 流水日期 |
|
||||
| sourceType | string | 来源类型:`PAYMENT` / `PREPAY` |
|
||||
| sourceId | string | 来源单据 ID |
|
||||
| sourceNo | string | 来源单号 |
|
||||
| direction | string | `INCREASE` / `DECREASE` |
|
||||
| amount | number | 金额(正数,方向由 direction 表达) |
|
||||
| teamNo | string | 团号,无挂团时为空 |
|
||||
| summary | string | 摘要 |
|
||||
|
||||
## 6. 枚举 / 数据字典
|
||||
|
||||
### ledgerType(账套类型)
|
||||
|
||||
| 值 | 含义 | 本期状态 |
|
||||
|----|------|----------|
|
||||
| `SUPPLIER` | 供应商应付 | 原有,不变 |
|
||||
| `SUPPLIER_RECV` | 供应商应收 | **本期新增开放** |
|
||||
| `CUSTOMER` | 客户应收 | **本期新增开放** |
|
||||
| `STAFF` | 员工往来 | **未开放**,传了报 596005 |
|
||||
|
||||
### direction(流水方向)
|
||||
|
||||
| 值 | 含义 |
|
||||
|----|------|
|
||||
| `INCREASE` | 增加 |
|
||||
| `DECREASE` | 减少 |
|
||||
|
||||
### sourceType(来源类型)
|
||||
|
||||
| 值 | 含义 |
|
||||
|----|------|
|
||||
| `PAYMENT` | 付款/收款 |
|
||||
| `PREPAY` | 预付 |
|
||||
|
||||
## 7. 错误码
|
||||
|
||||
| 错误码 | 含义 | 触发场景 |
|
||||
|--------|------|----------|
|
||||
| 596005 | 账套非法或未开放 | `ledgerType` 传了 `STAFF` 或其他未开放/不存在的值 |
|
||||
|
||||
## 8. 示例
|
||||
|
||||
### 8.1 典型:查供应商应收台账(新开放账套)
|
||||
|
||||
请求:
|
||||
|
||||
```
|
||||
GET /admin/finance/statements/page?ledgerType=SUPPLIER_RECV&page=1&pageSize=20
|
||||
```
|
||||
|
||||
响应 200:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"data": {
|
||||
"list": [
|
||||
{
|
||||
"ledgerType": "SUPPLIER_RECV",
|
||||
"refId": "1927081523456789012",
|
||||
"refName": "草原牧歌车队有限公司",
|
||||
"openingAmount": 5000.00,
|
||||
"increaseTotal": 0,
|
||||
"decreaseTotal": 0,
|
||||
"writeoffTotal": 0,
|
||||
"adjustTotal": 0,
|
||||
"netAmount": 5000.00
|
||||
}
|
||||
],
|
||||
"total": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
读法:该供应商应收 5000,即「他欠我 5000 该收未收」(正 = 他欠我)。
|
||||
|
||||
### 8.2 边界:应收账套明细返回空页(正常)+ 负净额
|
||||
|
||||
查客户应收明细(本期无业务流水):
|
||||
|
||||
```
|
||||
GET /admin/finance/statements/entries/page?ledgerType=CUSTOMER&refId=1927081523456789999&page=1&pageSize=20
|
||||
```
|
||||
|
||||
响应 200(**空页属正常**,应收账套本期只有期初无流水):
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"data": {
|
||||
"list": [],
|
||||
"total": 0
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
多收客户场景(负净额,前端标红):
|
||||
|
||||
```json
|
||||
{
|
||||
"ledgerType": "CUSTOMER",
|
||||
"refId": "1927081523456789999",
|
||||
"refName": "王某某",
|
||||
"openingAmount": -800.00,
|
||||
"increaseTotal": 0,
|
||||
"decreaseTotal": 0,
|
||||
"writeoffTotal": 0,
|
||||
"adjustTotal": 0,
|
||||
"netAmount": -800.00
|
||||
}
|
||||
```
|
||||
|
||||
读法:CUSTOMER 账套净额 -800 = 多收该客户 800,前端标红。
|
||||
|
||||
### 8.3 业务失败:传未开放账套 STAFF
|
||||
|
||||
请求:
|
||||
|
||||
```
|
||||
GET /admin/finance/statements/page?ledgerType=STAFF&page=1&pageSize=20
|
||||
```
|
||||
|
||||
响应:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 596005,
|
||||
"message": "账套非法或未开放"
|
||||
}
|
||||
```
|
||||
|
||||
## 9. 业务边界
|
||||
|
||||
**适用**:
|
||||
- 管理后台财务查看供应商应付 / 供应商应收 / 客户应收三个账套的期初挂账与(应付侧)流水。
|
||||
- 应收侧(SUPPLIER_RECV / CUSTOMER)本期用于查看应收初始化录入的期初余额。
|
||||
|
||||
**不适用**:
|
||||
- 员工往来(STAFF)查询——未开放,传了报 596005。
|
||||
- 应收账套查业务流水——本期应收侧尚无业务流水入账,明细空页属正常,不要当 bug 报。
|
||||
|
||||
**特殊边界**:
|
||||
- 应收账套 `increaseTotal` / `decreaseTotal` / `writeoffTotal` / `adjustTotal` 本期恒 0,`netAmount` 就等于 `openingAmount`(方向见 §5 对照表)。
|
||||
- `refId` / `sourceId` 等 ID 字段为 Long 序列化的字符串,前端按字符串处理,不要转 number(防精度丢失)。
|
||||
|
||||
## 10. 修改前后对比
|
||||
|
||||
### 字段级对比
|
||||
|
||||
| 项 | 原来 | 现在 |
|
||||
|----|------|------|
|
||||
| 入参 `ledgerType` 取值域 | 仅 `SUPPLIER` 合法,其余报 596005 | `SUPPLIER` / `SUPPLIER_RECV` / `CUSTOMER` 合法;`STAFF` 仍报 596005 |
|
||||
| 出参 `ledgerType` 实际出现值 | 只会是 `SUPPLIER` | 可能出现 `SUPPLIER_RECV` / `CUSTOMER` |
|
||||
| 出参 `netAmount` 语义 | 只有应付口径:正 = 我欠他 / 负 = 多付他 | 按账套分化:应付口径不变;应收口径正 = 他欠我 / 负 = 多收他 |
|
||||
| 出参 `openingAmount` 语义 | 期初应付 − 期初应收(单一口径) | 应付账 = 期初应付 − 期初应收;应收账 = 期初应收 − 期初应付(方向反过来) |
|
||||
|
||||
### 行为级对比
|
||||
|
||||
| 行为 | 原来 | 现在 |
|
||||
|------|------|------|
|
||||
| 传 `ledgerType=CUSTOMER` | 报 596005 | 正常返回客户应收台账 |
|
||||
| 传 `ledgerType=SUPPLIER_RECV` | 报 596005 | 正常返回供应商应收台账 |
|
||||
| 应收期初可见性 | 期初挂账在台账页完全看不到 | 切到应收账套即可看到期初净额 |
|
||||
| SUPPLIER 账套行为 | —— | **完全不变**,老页面无感知 |
|
||||
|
||||
## 11. 影响评估 / 回滚
|
||||
|
||||
- **破坏兼容**:无。存量 `SUPPLIER` 账套的入参 / 出参 / 符号语义零变化,老前端不改也能跑。
|
||||
- **前端同步上线**:非强制。但若要展示应收侧数据,前端需:
|
||||
1. 台账页按账套 tab 切换:供应商应付(SUPPLIER)/ 供应商应收(SUPPLIER_RECV)/ 客户应收(CUSTOMER);
|
||||
2. 正负含义按 §5 对照表分账套判断,负值标红;
|
||||
3. 应收 tab 下明细为空是预期,建议展示「暂无流水」空态而非报错。
|
||||
- **回滚方案**:后端回滚 = 恢复原取值域校验(SUPPLIER_RECV/CUSTOMER 重新报 596005);无 DDL、无数据迁移,回滚无副作用。前端若已上 tab,回滚后应收 tab 会收到 596005,需前端同步下掉应收 tab。
|
||||
|
||||
## 12. 注意事项
|
||||
|
||||
1. **符号判断别偷懒**:`netAmount > 0` 在不同账套含义相反,前端任何「欠款/多付」文案、标红逻辑都必须先按 `ledgerType` 分支,不要写全局统一判断。
|
||||
2. **应收空明细是正常**:SUPPLIER_RECV / CUSTOMER 本期无业务流水,entries 返回空页、`increaseTotal`/`decreaseTotal` 恒 0,不要当缺陷上报。
|
||||
3. **STAFF 别放出入口**:员工往来账套未开放,前端不要给 STAFF 的 tab/选项;传了会吃 596005。
|
||||
4. **ID 按字符串处理**:`refId` / `sourceId` 是 Long 序列化字符串,转 number 会精度丢失。
|
||||
5. 页签展示名建议:SUPPLIER=供应商应付 / SUPPLIER_RECV=供应商应收 / CUSTOMER=客户应收。
|
||||
|
||||
## 13. 关联 / 联系人
|
||||
|
||||
- Issue:https://git.1814.love/wx/HL/issues/8719
|
||||
- PR:https://git.1814.love/wx/HL/pulls/8727
|
||||
- Commit:https://git.1814.love/wx/HL/commit/029000ef1f
|
||||
- 后端负责人:@yst
|
||||
在新工单中引用
屏蔽一个用户