| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- import request from "@/utils/request";
- const API_PATH = "/payment/har";
- /**
- * 分页结果 — 后端 PageResult 全局 SNAKE_CASE 序列化后 JSON key 为 `list`
- * (全局 PageResult<T> 声明的是 items,与后端契约不符;保留 items 兼容字段,
- * 调用方按 `?.items || ?.list || []` 双保险解包,与 batch.ts 一致)
- */
- export interface HarPageResult<T> {
- items?: T;
- list: T;
- total: number;
- page_no: number;
- page_size: number;
- }
- /** 商户配置(后端 HarMerchantVO)— merchant_code 由运营在上游报备进件后手工录入 */
- export interface HarMerchantVO {
- id?: string;
- /** 归属租户。超管建号时选定,之后不可改(列表侧供超管分辨各行属于谁) */
- tenant_id?: number;
- /** 选填。为空 ⇒ 租户级映射(同一租户下不再区分企业) */
- enterprise_id?: string;
- /** 上游分配的商户编号,全局唯一 */
- merchant_code: string;
- merchant_name?: string;
- contact_name?: string;
- contact_mobile?: string;
- description?: string;
- created_time?: string;
- updated_time?: string;
- }
- /**
- * 商户配置保存入参(HarMerchantSaveDTO)— id 为空即新增。
- *
- * ★ 该端点**只有超管**能调(后端 `@perm.hasRole('SUPERUSER')`),所以调用方必然在
- * 超管上下文里:`tenant_id` 新增时必填(替哪个租户建号),修改时后端忽略它。
- */
- export interface HarMerchantSaveParams {
- id?: string;
- /** 新增必填;修改时忽略(归属不可改) */
- tenant_id?: number;
- enterprise_id?: string;
- merchant_code: string;
- merchant_name?: string;
- contact_name?: string;
- contact_mobile?: string;
- description?: string;
- }
- /** 门店(后端 HarShopVO) */
- export interface HarShopVO {
- id?: string;
- enterprise_id: string;
- merchant_code?: string;
- /** 商户自己的门店编码,幂等键 */
- third_shop_id: string;
- shop_name?: string;
- /** 上游返回的平台门店编号,创建成功才有值 */
- shop_id?: string;
- /** PENDING=结果未知待人工核实 / SUCCESS=上游已确认 / FAILED=上游明确拒绝 */
- create_status: string;
- fail_reason?: string;
- retry_count?: number;
- description?: string;
- created_time?: string;
- updated_time?: string;
- }
- /** 门店创建入参(HarShopCreateDTO)— 上游无门店查询接口,本地落库是唯一的可查来源 */
- export interface HarShopCreateParams {
- third_shop_id: string;
- shop_name: string;
- /** 选填。为空 ⇒ 走**租户级**商户映射(enterprise_id IS NULL 的那一行) */
- enterprise_id?: string;
- /**
- * 用哪一条商户配置。一个租户可以配置**多个**商户(2026-09-24),此时必须指定:
- * 不指定而本租户有多条 ⇒ 后端 400「请在请求中指定 merchant_code」,
- * 不会替调用方挑一条(挑错了门店挂到别的商户名下,且没有任何报错)。
- * 取值必须是本租户的商户编号,跨租户的会被 404 挡掉。
- */
- merchant_code?: string;
- }
- /** 订单(后端 HarOrderVO)— 状态直接采用上游枚举,不做本地转义 */
- export interface HarOrderVO {
- id?: string;
- enterprise_id: string;
- /** 我方订单号(雪花ID),即上游的 third_order_no */
- order_no: string;
- /** 企业商户自己的订单号 */
- out_biz_no?: string;
- upstream_order_no?: string;
- platform_trade_no?: string;
- merchant_code?: string;
- shop_code?: string;
- third_shop_code?: string;
- price: string;
- title?: string;
- /** alipay_stage=花呗分期 / alipay_payment=支付宝支付 */
- trade_type?: string;
- stage_num?: string;
- /** 100=商户承担 / 0=用户承担 */
- percent?: string;
- pay_timeout?: number;
- extra_params?: string;
- /** 主扫下单返回的收款链接;被扫(auth_code)下单时为空 */
- pay_url?: string;
- /** 0=等待支付 / 1=支付成功 / 2=退款成功 / 4=退款中 / 8=交易关闭 */
- trade_status: string;
- trade_time?: string;
- refund_time?: string;
- upstream_create_time?: string;
- rcv_amount?: string;
- fee_amount?: string;
- channel_amount?: string;
- /** PENDING=未回调 / SUCCESS / FAILED */
- notify_status?: string;
- created_time?: string;
- updated_time?: string;
- }
- /** 下单入参(HarOrderCreateDTO)— auth_code 有值走被扫收款,为空走主扫下单 */
- export interface HarOrderCreateParams {
- /** 选填。为空 ⇒ 走**租户级**商户映射(enterprise_id IS NULL 的那一行) */
- enterprise_id?: string;
- /**
- * 用哪一条商户配置 —— 一个租户可以配置**多个**商户(2026-09-24)。
- * 不指定而本租户有多条 ⇒ 后端 400,不替调用方挑一条:
- * 挑错了钱会进另一个商户账号,且全程没有报错,对账时才发现。
- */
- merchant_code?: string;
- out_biz_no?: string;
- price: number | string;
- title: string;
- trade_type: string;
- /** 分期时必填,3/6/12/24 */
- stage_num?: string;
- /** 分期时必填 */
- percent?: string;
- third_shop_code?: string;
- shop_code?: string;
- pay_timeout?: number;
- extra_params?: string;
- auth_code?: string;
- }
- /** 订单列表查询条件 — 起止日期为 yyyy-MM-dd */
- export interface HarOrderQueryParams {
- enterprise_id?: string;
- merchant_code?: string;
- order_no?: string;
- out_biz_no?: string;
- trade_status?: string;
- trade_type?: string;
- start_date?: string;
- end_date?: string;
- page_no?: number;
- page_size?: number;
- }
- export const HAR_TRADE_TYPE_OPTIONS = [
- { label: "支付宝支付", value: "alipay_payment" },
- { label: "花呗分期", value: "alipay_stage" },
- ];
- /** 上游订单状态枚举,与后端 HarOrderStatus 逐字一致 */
- export const HAR_TRADE_STATUS_TEXT: Record<string, string> = {
- "0": "等待支付",
- "1": "支付成功",
- "2": "退款成功",
- "4": "退款中",
- "8": "交易关闭",
- };
- export type ElTagType = "primary" | "success" | "warning" | "info" | "danger";
- export const HAR_TRADE_STATUS_TAG: Record<string, ElTagType> = {
- "0": "warning",
- "1": "success",
- "2": "info",
- "4": "warning",
- "8": "info",
- };
- export const HAR_SHOP_STATUS_TEXT: Record<string, string> = {
- PENDING: "待核实",
- SUCCESS: "创建成功",
- FAILED: "创建失败",
- };
- export const HAR_SHOP_STATUS_TAG: Record<string, ElTagType> = {
- PENDING: "warning",
- SUCCESS: "success",
- FAILED: "danger",
- };
- export const HAR_NOTIFY_STATUS_TEXT: Record<string, string> = {
- PENDING: "未回调",
- SUCCESS: "回调成功",
- FAILED: "回调失败",
- };
- const HarAPI = {
- // ---------- 商户配置 ----------
- /** 商户配置列表(分页) */
- merchantList(params: {
- /** 租户筛选 —— 只有超管看得见所有租户的行(后端对超管跳过租户过滤) */
- tenant_id?: number;
- enterprise_id?: string;
- merchant_code?: string;
- merchant_name?: string;
- page_no?: number;
- page_size?: number;
- }) {
- return request<ApiResponse<HarPageResult<HarMerchantVO[]>>>({
- url: `${API_PATH}/merchant`,
- method: "get",
- params,
- });
- },
- /** 新增或修改商户配置(id 有值为修改) */
- merchantSave(data: HarMerchantSaveParams) {
- return request<ApiResponse<HarMerchantVO>>({
- url: `${API_PATH}/merchant`,
- method: "post",
- data,
- });
- },
- /** 删除商户配置 */
- merchantDelete(id: string) {
- return request<ApiResponse<void>>({
- url: `${API_PATH}/merchant/${id}`,
- method: "delete",
- });
- },
- // ---------- 门店 ----------
- /** 门店列表(分页) */
- shopList(params: {
- enterprise_id?: string;
- merchant_code?: string;
- third_shop_id?: string;
- create_status?: string;
- page_no?: number;
- page_size?: number;
- }) {
- return request<ApiResponse<HarPageResult<HarShopVO[]>>>({
- url: `${API_PATH}/shop`,
- method: "get",
- params,
- });
- },
- /** 门店详情 */
- shopDetail(id: string) {
- return request<ApiResponse<HarShopVO>>({
- url: `${API_PATH}/shop/${id}`,
- method: "get",
- });
- },
- /**
- * 创建门店(同步调用上游)。
- * 上游没有门店查询接口,超时后无法核实远端是否已创建 —— 此时本地落 PENDING,
- * 页面按「待核实」展示并引导人工与上游核对,不可盲目重试(third_shop_id 是幂等键)
- */
- shopCreate(data: HarShopCreateParams) {
- return request<ApiResponse<HarShopVO>>({
- url: `${API_PATH}/shop`,
- method: "post",
- data,
- });
- },
- // ---------- 订单 ----------
- /** 订单列表(分页) */
- orderList(params: HarOrderQueryParams) {
- return request<ApiResponse<HarPageResult<HarOrderVO[]>>>({
- url: `${API_PATH}/order`,
- method: "get",
- params,
- });
- },
- /** 订单详情 */
- orderDetail(id: string) {
- return request<ApiResponse<HarOrderVO>>({
- url: `${API_PATH}/order/${id}`,
- method: "get",
- });
- },
- /**
- * 后台下单(调用上游)。
- * 上游异步通知未回 success 时每 5s 重试、最多 5 次(约 25s 窗口),
- * 因此支付结果以主动查询为准,通知只是加速收敛
- */
- orderCreate(data: HarOrderCreateParams) {
- return request<ApiResponse<HarOrderVO>>({
- url: `${API_PATH}/order`,
- method: "post",
- data,
- });
- },
- /** 主动查询上游并回写状态 */
- orderSync(id: string) {
- return request<ApiResponse<HarOrderVO>>({
- url: `${API_PATH}/order/${id}/sync`,
- method: "post",
- });
- },
- };
- export default HarAPI;
|