api.md 3.4 KB

Phase 1 API Contracts: 订单 ezPay 电子发票开立

Date: 2026-06-16

后端 REST 接口契约。客户端开票挂在 UserOrderController;管理端(商家+平台)查看/重试/作废用独立 PosOrderInvoiceController

一、客户端(客户为自己的订单开票)

挂在 UserOrderController@RequestMapping("/system/userOrder"),已有 JWT 鉴权)。

POST /system/userOrder/applyInvoice

客户对已完成订单申请开票。

请求体 ApplyInvoiceDto: | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | orderId | Long | 是 | 订单 id(须为当前登录客户的订单、state=3、payStatus=1) | | category | String | 是 | B2C / B2B | | buyerName | String | 是 | 买方名称(B2C 客户名 / B2B 公司名) | | buyerUbn | String | B2B 必填 | 统一编号 8 码(B2B 必填且校验格式) | | buyerEmail | String | B2C 无载具时必填 | 接收邮箱 | | carrierType | String | 否 | 0手机条码 / 1自然人凭证 / 2ezPay会员载具 | | carrierNum | String | carrierType 非空时必填 | 载具号码 |

处理:校验订单归属与可开票(门店 ezPay 已开通启用、非免用发票)→ 金额拆分 → 组装明细 → 调 EzPay.issueInvoice → 落库发票号/随机码/凭证。

响应 AjaxResult

  • 成功 {code:200, msg:"开票成功", data:{invoiceNumber, invoiceUrl}}
  • 失败 {code:500, msg:"<可理解原因>"}(统编格式非法 / 门店不可开票 / 已开票 / ezPay 失败原因)

GET /system/userOrder/getInvoice?orderId=

客户查看自己订单的发票状态。

响应 AjaxResult data:{invoiceStatus, invoiceNumber, invoiceUrl, category, ...}(不可开票门店返回 invoiceStatus=null 前端隐藏入口)。


二、管理端(商家端 + 平台后台)

PosOrderInvoiceController@RequestMapping("/system/orderInvoice"),权限键 chanting:orderInvoice:*)。

GET /system/orderInvoice/list

订单发票列表(分页 + 筛选)。

入参(query):orderId/orderNo/storeId/invoiceStatus/invoiceCategory/日期范围 + startPage()

响应 TableDataInfo,行 PosOrderInvoiceVo:订单号、门店、发票类型、买方、发票号、状态、金额、开立/作废时间。

GET /system/orderInvoice/{orderId}

订单发票详情。

PUT /system/orderInvoice/retry/{orderId}

重试开票(仅 invoiceStatus ∈ {2 失败, 3 作废})。权限 chanting:orderInvoice:retry

PUT /system/orderInvoice/invalid/{orderId}

作废发票(仅 invoiceStatus = 1 已开)。权限 chanting:orderInvoice:invalid。入参可选 {invalidReason}


三、ezPay 外部调用(复用工具类,非新接口)

业务 工具类方法 ezPay 端点
开立 EzPay.issueInvoice(baseUrl, cfg, postData) /Api/invoice_issue (v1.5)
作废 EzPay.doPost(baseUrl + URL_INVALID, cfg, postData) /Api/invoice_invalid (v1.0)

EzPayConfig 由门店 pos_store_ezpaymerchantId/hashKey/hashIv 构造;baseUrl 测试 BASE_TEST、正式 BASE_PROD(按环境配置)。

四、菜单 / 权限(写入 updatesql/sql.md)

sys_menu 新增「订单发票管理」(C) + 按钮权限 chanting:orderInvoice:list/query/retry/invalid,挂在平台后台门店/订单相关父菜单下(参考 009 菜单写法)。