From 0565ac8dc1c479b98fb02b38f453977666687b1f Mon Sep 17 00:00:00 2001 From: halo Date: Fri, 10 Jul 2026 00:04:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(payment):=20=E5=AE=8C=E6=88=90=E9=98=B6?= =?UTF-8?q?=E6=AE=B57=E8=AE=A2=E5=8D=95+=E6=94=AF=E4=BB=98=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=BC=80=E5=8F=91(=E8=AE=A2=E5=8D=95=E6=94=AF?= =?UTF-8?q?=E4=BB=98/=E6=B1=87=E6=80=BB=E8=AE=A2=E5=8D=95/=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=E8=AE=A2=E5=8D=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/order.js | 17 + src/api/payment.js | 14 + src/constants/orderEnums.js | 34 ++ src/constants/paymentEnums.js | 40 +++ src/router/componentRegistry.js | 5 +- .../order/original/OriginalOrderList.vue | 96 +++++ src/views/order/summary/SummaryOrderList.vue | 119 +++++++ .../order-payment/PaymentDetailModal.vue | 67 ++++ .../order-payment/PaymentFormModal.vue | 336 ++++++++++++++++++ .../order-payment/PaymentRecordList.vue | 130 +++++++ 缺失的后端接口.md | 58 +++ 11 files changed, 915 insertions(+), 1 deletion(-) create mode 100644 src/api/order.js create mode 100644 src/api/payment.js create mode 100644 src/constants/orderEnums.js create mode 100644 src/constants/paymentEnums.js create mode 100644 src/views/order/original/OriginalOrderList.vue create mode 100644 src/views/order/summary/SummaryOrderList.vue create mode 100644 src/views/payment/order-payment/PaymentDetailModal.vue create mode 100644 src/views/payment/order-payment/PaymentFormModal.vue create mode 100644 src/views/payment/order-payment/PaymentRecordList.vue diff --git a/src/api/order.js b/src/api/order.js new file mode 100644 index 0000000..a4ad0a8 --- /dev/null +++ b/src/api/order.js @@ -0,0 +1,17 @@ +import request from './request' + +// ---------------- 订单管理(/api/original-order/*、/api/summary-order/*) ---------------- +// 说明: +// - `original-order/page` 仅支持 {page,pageSize,originalOrderNo} 过滤,不支持 docx 描述的 +// 渠道/下单日期范围/订单状态/结算状态/汇总订单编号/店铺ID,已登记于《缺失的后端接口.md》。 +// - `summary-order/page` 仅支持 {page,pageSize,orderNo} 过滤,不支持商品类型/清算状态/是否已 +// 推送/订单日期范围/计划清算日/实际清算日范围/贷款人,已登记于《缺失的后端接口.md》。 +// - `original-order/export` 入参 {summaryOrderId,originalOrderNo} 均可选,响应 data 结构 +// 未在 swagger 中定义,前端按项目既有约定(参考钱包对账单/回单下载)假定为 {fileData: base64}, +// 已登记于《缺失的后端接口.md》。 +// - `summary-order/detail` 响应即 SummaryOrderVo 本身,不含关联原始订单明细列表,已登记于 +// 《缺失的后端接口.md》。 +export const originalOrderPageApi = (data) => request.post('/api/original-order/page', data) +export const originalOrderExportApi = (data) => request.post('/api/original-order/export', data) +export const summaryOrderPageApi = (data) => request.post('/api/summary-order/page', data) +export const summaryOrderDetailApi = (data) => request.post('/api/summary-order/detail', data) diff --git a/src/api/payment.js b/src/api/payment.js new file mode 100644 index 0000000..08bab20 --- /dev/null +++ b/src/api/payment.js @@ -0,0 +1,14 @@ +import request from './request' + +// ---------------- 支付管理(/api/payment/*、/api/payment-management/*) ---------------- +// 说明: +// - `/api/payment/query-credit-quota`:查询授信额度,入参仅 {accountNo}(钱包账号字符串), +// 响应 data 字段在 swagger 中完全未定义具体结构(无 $ref、无 properties),属于未文档化接口, +// 前端按"任意存在字段"做防御性展示,已登记于《缺失的后端接口.md》。 +// - `/api/payment/order-pay`:订单支付,入参 CreatePaymentBto 不含短信验证码字段,短验无法 +// 真正传递给后端校验,前端仅做本地格式校验(非空+6位数字),已登记于《缺失的后端接口.md》。 +// - 查询支付记录/详情走 payment-management 组,与创建支付的 payment 组为同一 tag 下的不同前缀。 +export const queryCreditQuotaApi = (data) => request.post('/api/payment/query-credit-quota', data) +export const orderPayApi = (data) => request.post('/api/payment/order-pay', data) +export const queryPaymentRecordApi = (data) => request.post('/api/payment-management/query-payment-record', data) +export const queryPaymentDetailApi = (data) => request.post('/api/payment-management/query-payment-detail', data) diff --git a/src/constants/orderEnums.js b/src/constants/orderEnums.js new file mode 100644 index 0000000..e9c1bcd --- /dev/null +++ b/src/constants/orderEnums.js @@ -0,0 +1,34 @@ +// src/constants/orderEnums.js +// 订单管理相关枚举字典,取值与中文标签均从 swagger 组件 schema 的 description 字段程序化 +// 提取,未做任何人工编造。 + +// OrderTypeEnum 出现在 OriginalOrderVo.orderType 字段上,语义为"该原始订单记录本身的类型标 +// 记"(与"汇总订单"模块概念同名但用途不同,详见《缺失的后端接口.md》)。 +export const ORDER_TYPE_OPTIONS = [ + { value: 'SUMMARY', label: '汇总订单' }, + { value: 'ORIGINAL', label: '原始订单' } +] +export const ORDER_TYPE_MAP = { + SUMMARY: { text: '汇总订单', color: 'blue' }, + ORIGINAL: { text: '原始订单', color: 'default' } +} + +export const SUMMARY_ORDER_STATUS_OPTIONS = [ + { value: 'REGISTERED', label: '已登记' }, + { value: 'SETTLED', label: '已完结' } +] +export const SUMMARY_ORDER_STATUS_MAP = { + REGISTERED: { text: '已登记', color: 'blue' }, + SETTLED: { text: '已完结', color: 'green' } +} + +export const SETTLEMENT_STATUS_OPTIONS = [ + { value: 'UNSCHEDULED', label: '未清算' }, + { value: 'SETTLED_REPAID', label: '已清算并还款' }, + { value: 'FAILED', label: '清算失败' } +] +export const SETTLEMENT_STATUS_MAP = { + UNSCHEDULED: { text: '未清算', color: 'default' }, + SETTLED_REPAID: { text: '已清算并还款', color: 'green' }, + FAILED: { text: '清算失败', color: 'red' } +} diff --git a/src/constants/paymentEnums.js b/src/constants/paymentEnums.js new file mode 100644 index 0000000..e57f7e5 --- /dev/null +++ b/src/constants/paymentEnums.js @@ -0,0 +1,40 @@ +// src/constants/paymentEnums.js +// 支付管理相关枚举字典,取值与中文标签均从 swagger 组件 schema 的 description 字段程序化 +// 提取,未做任何人工编造。 + +export const PAYMENT_METHOD_OPTIONS = [ + { value: 'BALANCE', label: '余额支付' }, + { value: 'FINANCE', label: '融资支付' }, + { value: 'COMBINED', label: '组合支付' } +] +export const PAYMENT_METHOD_MAP = { + BALANCE: { text: '余额支付', color: 'blue' }, + FINANCE: { text: '融资支付', color: 'purple' }, + COMBINED: { text: '组合支付', color: 'cyan' } +} + +export const PAYMENT_STATUS_OPTIONS = [ + { value: 'PENDING_VERIFICATION', label: '待验证' }, + { value: 'VERIFYING', label: '验证中' }, + { value: 'PROCESSING', label: '支付中' }, + { value: 'SUCCESS', label: '支付成功' }, + { value: 'FAILED', label: '支付失败' }, + { value: 'CANCELLED', label: '已取消' } +] +export const PAYMENT_STATUS_MAP = { + PENDING_VERIFICATION: { text: '待验证', color: 'default' }, + VERIFYING: { text: '验证中', color: 'processing' }, + PROCESSING: { text: '支付中', color: 'processing' }, + SUCCESS: { text: '支付成功', color: 'green' }, + FAILED: { text: '支付失败', color: 'red' }, + CANCELLED: { text: '已取消', color: 'default' } +} + +export const FUND_SOURCE_OPTIONS = [ + { value: 'BALANCE', label: '余额' }, + { value: 'FINANCE', label: '融资' } +] +export const FUND_SOURCE_MAP = { + BALANCE: { text: '余额', color: 'blue' }, + FINANCE: { text: '融资', color: 'purple' } +} diff --git a/src/router/componentRegistry.js b/src/router/componentRegistry.js index fab132c..7648a62 100644 --- a/src/router/componentRegistry.js +++ b/src/router/componentRegistry.js @@ -13,7 +13,10 @@ export const routePathComponentMap = { '/wallet/enterprise-open': 'wallet/enterprise-open/EnterpriseOpenList', '/credit/loan-application': 'credit/loan-application/LoanApplicationList', '/merchant/management': 'merchant/management/MerchantList', - '/merchant/invoice': 'merchant/invoice/InvoiceList' + '/merchant/invoice': 'merchant/invoice/InvoiceList', + '/payment/order-payment': 'payment/order-payment/PaymentRecordList', + '/order/summary': 'order/summary/SummaryOrderList', + '/order/original': 'order/original/OriginalOrderList' } // 新增/编辑/查看等表单页不是后端菜单节点(不出现在侧边栏),但仍需要注册为 diff --git a/src/views/order/original/OriginalOrderList.vue b/src/views/order/original/OriginalOrderList.vue new file mode 100644 index 0000000..bbc878e --- /dev/null +++ b/src/views/order/original/OriginalOrderList.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/views/order/summary/SummaryOrderList.vue b/src/views/order/summary/SummaryOrderList.vue new file mode 100644 index 0000000..19d44f8 --- /dev/null +++ b/src/views/order/summary/SummaryOrderList.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/views/payment/order-payment/PaymentDetailModal.vue b/src/views/payment/order-payment/PaymentDetailModal.vue new file mode 100644 index 0000000..e1cc7fe --- /dev/null +++ b/src/views/payment/order-payment/PaymentDetailModal.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/views/payment/order-payment/PaymentFormModal.vue b/src/views/payment/order-payment/PaymentFormModal.vue new file mode 100644 index 0000000..f30a7ca --- /dev/null +++ b/src/views/payment/order-payment/PaymentFormModal.vue @@ -0,0 +1,336 @@ + + + + + diff --git a/src/views/payment/order-payment/PaymentRecordList.vue b/src/views/payment/order-payment/PaymentRecordList.vue new file mode 100644 index 0000000..ac834a9 --- /dev/null +++ b/src/views/payment/order-payment/PaymentRecordList.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/缺失的后端接口.md b/缺失的后端接口.md index bab3e16..19bc706 100644 --- a/缺失的后端接口.md +++ b/缺失的后端接口.md @@ -187,6 +187,26 @@ | `POST invoice-management/repayment/list` | 查询可匹配的本地回款流水,`FindRepaymentListQto`(merchantIdIs/accountNoLike/oppAccountNoLike/timeStart-End) | | `POST invoice-management/offline-recharge-unmatched-detail` | 查询线下来账明细,**透传中台30908接口**,需 `channelNo`+交易日期范围,用于"自动匹配"高级场景,本次未在 UI 中实现对应入口 | +### 1.15 支付管理 —— 订单支付(`/api/payment/*`、`/api/payment-management/*`) + +| 接口 | 说明 | +| --- | --- | +| `POST payment/query-credit-quota` | 查询授信额度,入参仅 `{accountNo}`(钱包账号字符串),响应 `data` **在 swagger 中完全未定义结构**(无 `$ref`/无 `properties`),真正的未文档化接口,前端只能做防御性字段展示 | +| `POST payment/order-pay` | 创建支付,`CreatePaymentBto`:`walletAccountId/loanApplyId(可空)/paymentMethod/payeeInfo/totalAmount/balanceAmount/financeAmount/status/remark/paymentDetailBtoList`,**无短信验证码字段** | +| `POST payment-management/query-payment-record` | 分页查询支付记录,`FindPaymentRecordListQto`,仅支持 `walletAccountIdIs/paymentMethodList/statusList/paidAtStart/paidAtEnd`,响应 `PaymentRecordListVo[]` | +| `POST payment-management/query-payment-detail` | `{id}`,响应 `PaymentRecordDetailVo`(列表字段 + `detailList: PaymentDetailVo[]`) | +| — | `PaymentMethodEnum`:`BALANCE`余额支付/`FINANCE`融资支付/`COMBINED`组合支付;`PaymentStatusEnum`:`PENDING_VERIFICATION/VERIFYING/PROCESSING/SUCCESS/FAILED/CANCELLED`;`FundSourceEnum`:`BALANCE/FINANCE` | + +### 1.16 订单管理 —— 汇总订单/原始订单(`/api/summary-order/*`、`/api/original-order/*`) + +| 接口 | 说明 | +| --- | --- | +| `POST summary-order/page` | 请求仅支持 `{page,pageSize,orderNo}`,响应 `SummaryOrderVo`(无关联原始订单明细列表) | +| `POST summary-order/detail` | `{id}`,响应即 `SummaryOrderVo` 本身,**不含关联原始订单明细** | +| `POST original-order/page` | 请求仅支持 `{page,pageSize,originalOrderNo}`,**不支持按 `summaryOrderId` 过滤** | +| `POST original-order/export` | 入参 `{summaryOrderId,originalOrderNo}` 均可选,响应 `data` **未定义结构**,前端沿用 `downloadStatement` 已建立的 `{fileData: base64}` 假设处理 | +| — | `SettlementStatusEnum`:`UNSCHEDULED/SETTLED_REPAID/FAILED`;`SummaryOrderVo` 含 `financeQuota/accumulatedLoanAmount` 等字段但**无剩余额度字段**,前端本地计算 `剩余额度 = financeQuota - accumulatedLoanAmount` | + --- ## Part 2:待后端确认 / 建议补充事项 @@ -313,3 +333,41 @@ 43. **`/api/invoice/page`(透传中台31909查询)与 `/api/invoice-management/invoice/list`(本地查询)为 功能重叠的两组平行接口**:前者需 `channelNo` 且字段命名与本地 `InvoiceVo` 不同,本项目统一采用 后者用于列表展示,前者未使用,建议后端确认二者分工或说明是否为废弃接口。 +44. **`payment/query-credit-quota` 响应 `data` 字段完全未定义结构**:swagger 中该字段无 `$ref`、无 + `properties`,前端在支付表单中改为原样展示返回的 JSON 供操作人员肉眼判断,无法做强类型的"剩余 + 额度"校验与展示,若融资金额超出实际额度,只能依赖后端 `order-pay` 接口调用失败后的错误提示兜底, + 建议后端补充该接口的响应字段定义。 +45. **`order-pay` 的 `CreatePaymentBto` 无短信验证码字段**:docx 描述的"发起支付前需短信验证"流程在 + 后端契约层面无法真正落地,前端仍按 docx 实现了"发送验证码(复用 `send-sms-code`)+ 输入验证码"的 + 交互与本地格式校验(非空+6位数字),但验证码本身不会被传给 `order-pay` 也不会被后端比对校验, + 该环节目前形同虚设,需后端评估是否要在 `CreatePaymentBto` 中补充 `smsCode` 字段并在服务端真正 + 校验。 +46. **`payment-management/query-payment-record`(及其 `PaymentRecordListVo`/`PaymentRecordDetailVo`) + 均无机构/商户/订单编号/付款人姓名等字段**:原型图查询区与列表列包含"机构/商户/订单编号/付款人/ + 付款账号/服务费"等信息,后端当前的支付记录模型仅关联到 `walletAccountId`,不关联商户或订单, + 前端已按接口实际返回字段精简查询表单与列表列,未臆造上述字段,建议后端评估是否需要在支付记录 + 落库时补充商户/订单关联字段。 +47. **`CreatePaymentBto` 只有一个 `walletAccountId` 字段,无法同时指定"余额账户"与"融资账户"两个不同 + 账户 ID**:结合 `wallet-account/detail` 以一个账户 id 返回其所属客户整套 `mainBalance/a2Balance/ + a6Balance/a7Balance` 余额的既有设计模式,前端推断该字段应始终填客户主账户(A1)的 id,融资额度 + 查询(`query-credit-quota`)则用该账户的 `accountNo` 反查,组合支付时的"融资部分"通过 + `loanApplyId` 关联的贷款申请单据来承载客户与金额信息,不再单独指定 A3 账户 ID。此为前端基于现有 + 接口设计模式的**推断性假设**,未在 swagger 中被明确证实,建议后端确认该理解是否准确。 +48. **`loanApplyId` 取自 `credit-apply/loan-application/list` 返回记录的数字主键 `id`**,且该模块使用的 + `ApplicationStatusEnum`(`DRAFT/CONFIRMED/SUBMITTED/APPLY_FAILED`)**无"已批准/生效/放款"等更精确的 + 终态**,前端支付表单在选择"关联贷款申请"时只能按 `SUBMITTED`(已申请)状态筛选可选记录,无法准确 + 判断该笔贷款是否已实际放款、是否仍有可用余额支持本次融资支付,建议后端补充更精确的贷款状态枚举 + 或提供专门的"可用于支付的贷款额度"查询接口。 +49. **`summary-order/page`/`original-order/page` 查询入参严重少于 docx/原型描述**:`summary-order/page` + 仅支持 `orderNo`,`original-order/page` 仅支持 `originalOrderNo`,原型图要求的渠道/日期范围/订单 + 状态/结算状态/店铺 ID 等查询条件均无对应参数,前端已按接口实际支持字段精简查询表单,建议后端 + 评估是否需要补充查询参数。 +50. **`original-order/export` 响应 `data` 字段未定义结构**:与 `download-statement`/`download-receipt` + 等已文档化 `fileData` 字段的导出接口不同,该接口响应结构在 swagger 中完全空白,前端沿用既有 + "假设为 `{fileData: base64}`"的处理模式实现下载,若实际结构不同将导致导出功能报错或下载内容 + 异常,建议后端补充响应字段定义。 +51. **`summary-order/detail` 不返回关联原始订单明细,且 `original-order/page` 不支持按 + `summaryOrderId` 过滤查询**:两个缺口叠加导致"查看汇总订单关联的原始订单明细列表"功能在当前 + 接口能力下无法实现,前端在汇总订单详情弹窗中用 `a-alert` 明确提示该缺口,未展示虚假数据,建议 + 后端为 `original-order/page` 补充 `summaryOrderId` 过滤参数,或在 `summary-order/detail` 响应中 + 直接内嵌关联的原始订单列表。