From 6b41b5fa0f766c7f78cec97378798521f20fb5dd Mon Sep 17 00:00:00 2001 From: yaosutu <770858045@qq.com> Date: Mon, 14 Sep 2026 12:40:23 +0800 Subject: [PATCH] =?UTF-8?q?docs(finance):=20=E4=B8=9A=E5=8A=A1=E5=A4=96?= =?UTF-8?q?=E6=94=B6=E5=85=A5=E5=BB=BA=E5=8D=95=E5=8E=BB=E6=8E=89=E8=B4=A6?= =?UTF-8?q?=E6=88=B7/=E5=87=AD=E8=AF=81=E5=AD=97=E6=AE=B5=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=E4=B8=A4=E6=AD=A5=E8=B5=84=E9=87=91=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=20changelog=EF=BC=88#7662=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 入参删 fundAccountId/payMethod/voucherNo/voucherUrl,由出纳 confirm-in 采集; 出参不变、零 DDL;前端需把字段从申请页挪到确认收款弹窗。 --- ...މ账户凭证字段对齐两步资金流程-修改接口-管理后台.md | 256 ++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 changelogs-v2/2026-09/14_7662_业务外收入建单去掉账户凭证字段对齐两步资金流程-修改接口-管理后台.md diff --git a/changelogs-v2/2026-09/14_7662_业务外收入建单去掉账户凭证字段对齐两步资金流程-修改接口-管理后台.md b/changelogs-v2/2026-09/14_7662_业务外收入建单去掉账户凭证字段对齐两步资金流程-修改接口-管理后台.md new file mode 100644 index 00000000..3ad3848c --- /dev/null +++ b/changelogs-v2/2026-09/14_7662_业务外收入建单去掉账户凭证字段对齐两步资金流程-修改接口-管理后台.md @@ -0,0 +1,256 @@ +--- +schema: "hl-changelog/v2" +ticket: "7662" +title: "业务外收入 IN 建单去掉入账账户/收付方式/凭证字段,对齐两步资金流程" +consumer: "admin" +author: "yst(GIT)" +change_type: "修改接口" +backend_status: "deployed" +gateway_status: "verified" +frontend_status: "required" +frontend_owner: "" +frontend_ref: "" +target_release: "" +verified_at: "" +status_note: "入参删字段(fundAccountId/payMethod/voucherNo/voucherUrl),建单不再采集;这 4 个值由出纳「确认收款」confirm-in 采集并回写。前端需把这 4 个字段从「添加收入」表单挪到「确认收款」弹窗。出参(列表 Row/详情 Detail)字段不变。" +updated_at: "2026-09-14" +base: "dev-v3" +--- + +# 业务外收入 IN 建单去掉入账账户/收付方式/凭证字段(修改接口) + +> **服务**: hl-order-service-v3(hl-finance 模块,同进程部署) +> **PR**: [#7664](https://git.1814.love:8443/wx/HL/pulls/7664) +> **Issue**: [#7662](https://git.1814.love:8443/wx/HL/issues/7662) +> **commit**: [7fcea4c029](https://git.1814.love:8443/wx/HL/commit/7fcea4c029) +> **日期**: 2026-09-14 +> **影响范围**: 业务外收支申请/编辑两个端点的**入参字段集合**(删 4 个);不涉及路由、出参结构、错误码集合、数据库 DDL + +--- + +## ⚠️ 关键变化 + +🔴 **建单/编辑不再接收这 4 个字段**(前端须从申请表单移除,挪到出纳确认收款弹窗): + +| 被删入参字段 | 原含义 | 现在的去向 | +|---|---|---| +| `fundAccountId` | 入/出账公司账户ID | 出纳确认收款时由 `payAccountId` 采集(写入 `pay_account_id` 列) | +| `payMethod` | 收付方式 | 出纳确认收款时采集(`CashierConfirmInReqVO.payMethod`) | +| `voucherNo` | 凭证号 | 出纳确认收款时采集 | +| `voucherUrl` | 凭证影像 URL | 出纳确认收款时采集 | + +🟢 **出参不变**:列表 Row / 详情 Detail 仍透出 `payMethod(+payMethodName)`、`voucherNo`、`voucherUrl`、`fundAccountId`,单据走到 PAID 后由 confirm-in 回写正常显示。**对未确认收款的草稿/待审批单,这 4 个出参字段改后恒为 null**(此前可能带建单时的预填值)。 + +🟢 **零 DDL**:`fin_nonbiz_flow` 表结构不动,历史 `fund_account_id` 列保留。 + +--- + +## 一、背景(前因后果) + +业务外收入(IN)原先在**申请建单步**就要求填「入账账户/收付方式/凭证」,但核实发现这是**冗余且语义错位**的: + +- **资金只在出纳「确认收款」才动**:建单与批准均不碰资金;只有出纳 `POST /admin/finance/cashier/confirm-in` 才记 `fin_fund_flow` IN + 重算结存 + 回写 PAID。 +- **建单填的入账账户无人读**:建单仅 `setFundAccountId` 存库,全模块无任何读取方;真正动资金用的是 confirm-in 请求里的 `payAccountId`(必填),写入**另一列** `pay_account_id`。建单选 A 账户、出纳确认选 B 账户,系统不校验、不拦。 +- 这导致建单字段沦为纯展示,且与「审批后单独确认收款」的既有流程自相矛盾。 + +本次把 IN 统一为「申请 → 审批 → **出纳确认收款(动钱)**」两步资金语义,与业务外支出(OUT)的「申请 → 审批 → 出纳付款(动钱)」对称。 + +## 二、变更清单 + +| 接口 | 方法+路径 | 变更 | +|---|---|---| +| 业务外收支申请(建单) | `POST /admin/finance/nonbiz-flows` | 入参删 `fundAccountId`/`payMethod`/`voucherNo`/`voucherUrl` | +| 业务外收支编辑 | `PUT /admin/finance/nonbiz-flows/{id}` | 入参删同上 4 字段 | + +> 两个端点对 IN / OUT 两个方向同接口;本次删字段对两个方向同时生效(OUT 方向本就不采集这 4 个,删除后契约一致)。 + +## 三、接口详情 + +### 3.1 业务外收支申请(建单) + +- **方法/路径**:`POST /admin/finance/nonbiz-flows` +- **权限**:管理后台已登录(网关鉴权) +- **说明**:创建业务外收入/支出草稿(status=PENDING) + +### 3.2 业务外收支编辑 + +- **方法/路径**:`PUT /admin/finance/nonbiz-flows/{id}` +- **说明**:编辑草稿单(direction 不可改),入参字段同建单(除无 direction) + +## 四、入参 + +### 修改后(本次生效) + +| 字段 | 类型 | 必填 | 说明 | +|---|---|---|---| +| `direction` | string | ✅ 仅建单 | `IN` 业务外收入 / `OUT` 业务外支出 | +| `category` | string | ✅ | 收支类别码(fin_nonbiz_category 同方向组正常项),≤64 | +| `unitId` | long | ✅ | 外部单位ID(可付款供应商),JSON 传 number | +| `operatorId` | long | ✅ | 经办人ID(所选部门下员工),JSON 传 number | +| `amount` | number | ✅ | 收支金额(>0) | +| `feeRate` | number | 否 | 手续费率(‰,默认 0;收入页改动自动重算 fee) | +| `fee` | number | 否 | 手续费(收入缺省按费率算、可手改;支出手填) | +| `occurDate` | string | ✅ | 发生日期 `yyyy-MM-dd` | +| `deptId` | long | 否 | 归属部门ID(用户域部门树) | +| `remark` | string | 否 | 备注,≤200 | + +### 已删除(前端勿再传) + +| 字段 | 类型 | 原必填 | 删除说明 | +|---|---|---|---| +| ~~`fundAccountId`~~ | long | 否 | 改由出纳 confirm-in 的 `payAccountId` 采集 | +| ~~`payMethod`~~ | string | 否 | 改由出纳 confirm-in 采集 | +| ~~`voucherNo`~~ | string | 否 | 改由出纳 confirm-in 采集 | +| ~~`voucherUrl`~~ | string | 否 | 改由出纳 confirm-in 采集 | + +> ⚠️ 当前服务对未知 JSON 字段为**忽略**(不报错):旧前端若仍传这 4 个字段不会 400,但**值会被丢弃、不落库**。请以前端移除字段为准。 + +## 五、出参 + +不变。建单/编辑返回 `data.id`(新建单 ID)。 + +列表 `GET /admin/finance/nonbiz-flows/page` 与详情 `GET /admin/finance/nonbiz-flows/{id}` 仍含 `payMethod`/`payMethodName`/`voucherNo`/`voucherUrl`/`fundAccountId`——单据 PAID 后由 confirm-in 回写正常显示;草稿/待审批态这 4 个字段恒为 null。 + +## 六、枚举 / 数据字典 + +| 项 | 值 | 说明 | +|---|---|---| +| `direction` | `IN` / `OUT` | 业务外收入 / 业务外支出 | +| 单据 `status` | `PENDING` / `SUBMITTED` / `APPROVED` / `PAID` / ... | 本次不变;IN 仅经 confirm-in 到 PAID | +| `payMethod`(confirm-in 时) | 字典 `fin_pay_way`:`CASH`/`BANK_TRANSFER`/`WECHAT`/`ALIPAY` | 出纳确认收款时采集 | + +## 七、错误码 + +| 码 | 含义 | 触发 | +|---|---|---| +| 598501 | 金额有效性 | amount≤0 / fee<0 / actualAmount<0 | +| 598502 | 类别归属方向组且正常 | category 非法 | +| 598506 | 方向合法 | direction 非 IN/OUT | +| 598510 | 单号撞号重试耗尽 | 极端并发 | + +(本次未新增/变更错误码) + +## 八、示例 + +### 8.1 典型:建 IN 收入单(不再传账户/凭证) + +```http +POST /admin/finance/nonbiz-flows +Content-Type: application/json + +{ + "direction": "IN", + "category": "AGENT_SALARY", + "unitId": 2097974318146146305, + "operatorId": 1001, + "amount": 500, + "feeRate": 0, + "occurDate": "2026-09-14", + "deptId": 33, + "remark": "代收工资" +} +``` + +响应: + +```json +{ "code": 200, "message": "成功", "data": { "id": "2099329937876934657" }, "success": true } +``` + +建单后详情(4 字段恒 null): + +```json +{ + "code": 200, + "data": { + "id": "2099329937876934657", "flowNo": "WS-20260914-0001", + "direction": "IN", "status": "PENDING", + "amount": 500.0, "fee": 0.0, "actualAmount": 500.0, + "fundAccountId": null, "payMethod": null, "voucherNo": null, "voucherUrl": null + }, + "success": true +} +``` + +### 8.2 边界:仍传已删字段(被忽略,不报错也不落库) + +```http +POST /admin/finance/nonbiz-flows +{ "direction":"IN","category":"AGENT_SALARY","unitId":2097974318146146305,"operatorId":1001, + "amount":500,"occurDate":"2026-09-14", + "fundAccountId":999999,"payMethod":"WECHAT","voucherNo":"V001","voucherUrl":"http://x/y.png" } +``` + +响应 200 正常建单,但详情里这 4 字段**仍为 null**(值被丢弃)。 + +### 8.3 异常:缺必填 + +```http +POST /admin/finance/nonbiz-flows +{ "direction":"IN","category":"AGENT_SALARY","amount":500,"occurDate":"2026-09-14" } +``` + +```json +{ "code": 400, "message": "请求数据格式错误,请检查参数是否正确", "success": false } +``` + +(缺 `unitId`/`operatorId` 等 @NotNull 字段) + +### 8.4 资金确认入口(不变,供前端对齐):出纳确认收款 + +```http +POST /admin/finance/cashier/confirm-in +Content-Type: application/json + +{ + "bizId": 2099329937876934657, + "payAccountId": 123, + "payMethod": "BANK_TRANSFER", + "voucherNo": "V2026-0914-01", + "voucherUrl": "https://oss/...png", + "payDate": "2026-09-14" +} +``` + +| 字段 | 类型 | 必填 | 说明 | +|---|---|---|---| +| `bizId` | long | ✅ | 业务单据ID(direction=IN 且 status=APPROVED) | +| `payAccountId` | long | ✅ | 入账公司账户ID(fin_fund_account,须 ACTIVE) | +| `payMethod` | string | 否 | 收款方式(fin_pay_way 码值) | +| `voucherNo` | string | 否 | 收款凭证号 | +| `voucherUrl` | string | 否 | 收款凭证影像 URL | +| `payDate` | string | ✅ | 收款日期 `yyyy-MM-dd` | + +## 九、业务边界 + +- IN 单据只能在 status=APPROVED 后经 confirm-in 到 PAID(唯一资金确认入口),批准本身不动资金。 +- 建单/编辑阶段不再采集账户与凭证;账户/方式/凭证由出纳在 confirm-in 一次性采集并回写。 +- OUT 方向本就由出纳「登记付款」采集,本次删字段后 IN/OUT 建单侧契约一致。 + +## 十、修改前后对比 + +| 维度 | 修改前 | 修改后 | +|---|---|---| +| 建单入参字段数 | 14(含 4 个无效字段) | 10 | +| 建单是否采集账户/凭证 | 采集(但无人读) | 不采集 | +| 资金动作时机 | 建单填账户但不动钱、confirm-in 再选账户(重复) | 仅 confirm-in 选账户并动钱 | +| 草稿态 4 字段出参 | 可能带建单预填值 | 恒 null,PAID 后由 confirm-in 回写 | + +## 十一、影响评估 / 回滚 + +- **影响**:前端「添加收入」「编辑收入」表单需删除 收款账号/凭证号/收款凭证 3 项;「确认收款」弹窗需补 入账账户*/收款方式/凭证号/凭证/收款日期*(confirm-in 入参)。原型已同步(PR #7665)。 +- **兼容性**:旧前端仍传 4 字段不会报错(被忽略),但语义已变,请尽快移除。 +- **回滚**:回滚本 PR 即恢复旧入参;无 DDL、无数据迁移,回滚安全。 + +## 十二、注意事项 + +- JSON 中 `unitId`/`operatorId`/`deptId`/`payAccountId`/`bizId` 等 Long 字段**传 number**(不要加引号传字符串),否则 400「请求数据格式错误」。 +- 出参中 Long 已序列化为字符串(防 JS 精度丢失),前端按 string 读。 + +## 十三、关联 / 联系人 + +- Issue: [#7662](https://git.1814.love:8443/wx/HL/issues/7662) +- PR(后端): [#7664](https://git.1814.love:8443/wx/HL/pulls/7664) · commit [7fcea4c029](https://git.1814.love:8443/wx/HL/commit/7fcea4c029) +- PR(原型同步): [#7665](https://git.1814.love:8443/wx/HL/pulls/7665) +- 关联 Issue(OUT 手续费,原型侧): [#7663](https://git.1814.love:8443/wx/HL/issues/7663) +- 负责人: 腰苏图(yst)