| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- 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_un_stage=支付宝支付(260924 前叫 alipay_payment) */
- trade_type?: string;
- /** 业务类型。非分期传 har_ali_un_stage(规范 260924 订单创建参数表 biz 行) */
- biz?: 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;
- /** 退款原因:我方发给上游的那一句。上游不回传,非退款单为 null */
- refund_reason?: 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;
- /**
- * 业务类型。选填。规范 260924 订单创建参数表 biz 行:非分期传 `har_ali_un_stage`。
- *
- * 后端原样透传、不推导 —— 所以下单表单在非分期时自己带上这个值(见 order/index.vue)。
- */
- biz?: 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;
- }
- /** 交易方式。非分期那个值 260924 起叫 alipay_un_stage(此前是 alipay_payment)。 */
- export const HAR_TRADE_TYPE_OPTIONS = [
- { label: "支付宝支付", value: "alipay_un_stage" },
- { label: "花呗分期", value: "alipay_stage" },
- ];
- /** 非分期的业务类型(上游 biz)。规范 260924 订单创建参数表 biz 行 只给了这一个取值。 */
- export const HAR_BIZ_UN_STAGE = "har_ali_un_stage";
- /**
- * 「1 支付成功」—— 本通道**唯一**允许发起退款的起点状态。
- *
- * 有名字才敢在模板里比:写死 "1" 的判据散在三处时,改枚举的人只会改到一处。
- * 上游语义:退款只能从已支付发起,4 退款中 / 2 退款成功 / 8 交易关闭 都会被拒。
- */
- export const HAR_ORDER_STATUS_PAID = "1";
- /** 上游订单状态枚举,与后端 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,
- });
- },
- // ---------- 订单 ----------
- /** 订单列表(分页);silent = 后台静默刷新 */
- orderList(params: HarOrderQueryParams, silent = false) {
- return request<ApiResponse<HarPageResult<HarOrderVO[]>>>({
- url: `${API_PATH}/order`,
- method: "get",
- params,
- silent,
- });
- },
- /** 订单详情;silent = 后台静默刷新(详情弹窗实时联动用) */
- orderDetail(id: string, silent = false) {
- return request<ApiResponse<HarOrderVO>>({
- url: `${API_PATH}/order/${id}`,
- method: "get",
- silent,
- });
- },
- /**
- * 后台下单(调用上游)。
- * 上游异步通知未回 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",
- });
- },
- /**
- * 退款(全额,调用上游)。
- *
- * ★ **全额**:本通道上游没有金额字段,所以没有「退多少」这个选择,按钮上不要暗示能部分退。
- * ★ 返回的是**受理结果**(trade_status=4 退款中),**不是已退款到账** ——
- * 到账与否由通知/轮询把状态收敛成 2 退款成功,调用方必须按返回值如实提示。
- * ★ reason 留空由服务端补默认值:上游对空原因**整笔直接拒**,所以这里不能省成一个
- * 「服务端有默认值」的假设 —— 默认值兜的是调用方,界面仍应引导填一句真实原因。
- */
- orderRefund(id: string, reason?: string) {
- return request<ApiResponse<HarOrderVO>>({
- url: `${API_PATH}/order/${id}/refund`,
- method: "post",
- data: { reason },
- });
- },
- };
- export default HarAPI;
|