import request from "@/utils/request"; const API_PATH = "/payment/har"; /** * 分页结果 — 后端 PageResult 全局 SNAKE_CASE 序列化后 JSON key 为 `list` * (全局 PageResult 声明的是 items,与后端契约不符;保留 items 兼容字段, * 调用方按 `?.items || ?.list || []` 双保险解包,与 batch.ts 一致) */ export interface HarPageResult { 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 = { "0": "等待支付", "1": "支付成功", "2": "退款成功", "4": "退款中", "8": "交易关闭", }; export type ElTagType = "primary" | "success" | "warning" | "info" | "danger"; export const HAR_TRADE_STATUS_TAG: Record = { "0": "warning", "1": "success", "2": "info", "4": "warning", "8": "info", }; export const HAR_SHOP_STATUS_TEXT: Record = { PENDING: "待核实", SUCCESS: "创建成功", FAILED: "创建失败", }; export const HAR_SHOP_STATUS_TAG: Record = { PENDING: "warning", SUCCESS: "success", FAILED: "danger", }; export const HAR_NOTIFY_STATUS_TEXT: Record = { 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>>({ url: `${API_PATH}/merchant`, method: "get", params, }); }, /** 新增或修改商户配置(id 有值为修改) */ merchantSave(data: HarMerchantSaveParams) { return request>({ url: `${API_PATH}/merchant`, method: "post", data, }); }, /** 删除商户配置 */ merchantDelete(id: string) { return request>({ 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>>({ url: `${API_PATH}/shop`, method: "get", params, }); }, /** 门店详情 */ shopDetail(id: string) { return request>({ url: `${API_PATH}/shop/${id}`, method: "get", }); }, /** * 创建门店(同步调用上游)。 * 上游没有门店查询接口,超时后无法核实远端是否已创建 —— 此时本地落 PENDING, * 页面按「待核实」展示并引导人工与上游核对,不可盲目重试(third_shop_id 是幂等键) */ shopCreate(data: HarShopCreateParams) { return request>({ url: `${API_PATH}/shop`, method: "post", data, }); }, // ---------- 订单 ---------- /** 订单列表(分页) */ orderList(params: HarOrderQueryParams) { return request>>({ url: `${API_PATH}/order`, method: "get", params, }); }, /** 订单详情 */ orderDetail(id: string) { return request>({ url: `${API_PATH}/order/${id}`, method: "get", }); }, /** * 后台下单(调用上游)。 * 上游异步通知未回 success 时每 5s 重试、最多 5 次(约 25s 窗口), * 因此支付结果以主动查询为准,通知只是加速收敛 */ orderCreate(data: HarOrderCreateParams) { return request>({ url: `${API_PATH}/order`, method: "post", data, }); }, /** 主动查询上游并回写状态 */ orderSync(id: string) { return request>({ url: `${API_PATH}/order/${id}/sync`, method: "post", }); }, }; export default HarAPI;