- 新增接口 confirmOfflinePayment 支持门店确认线下付款收款 - 修改订单操作类型,增加“确认收款”按钮供线下付款未付款订单使用 - 确认收款弹窗新增备注输入框和支付凭证上传(必填,单张) - 调整提交逻辑,确认收款操作调用新接口,并校验凭证上传 - 订单列表页“删除订单”改为“关闭订单”,调用更新接口逻辑关闭订单 - 修改订单详情页金额明细渲染逻辑,修复0时错误显示问题
217 lines
5.5 KiB
TypeScript
217 lines
5.5 KiB
TypeScript
import request, { ErrorType, RequestError } from '@/utils/request';
|
||
import type { ApiResult, PageResult } from '@/api';
|
||
import type { ShopOrder, ShopOrderParam, OrderCreateRequest } from './model';
|
||
|
||
/**
|
||
* 分页查询订单
|
||
*/
|
||
export async function pageShopOrder(params: ShopOrderParam) {
|
||
const res = await request.get<ApiResult<PageResult<ShopOrder>>>(
|
||
'/shop/shop-order/page',
|
||
params
|
||
);
|
||
if (res.code === 0) {
|
||
return res.data;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 查询订单列表
|
||
*/
|
||
export async function listShopOrder(params?: ShopOrderParam) {
|
||
const res = await request.get<ApiResult<ShopOrder[]>>(
|
||
'/shop/shop-order',
|
||
params
|
||
);
|
||
if (res.code === 0 && res.data) {
|
||
return res.data;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 添加订单
|
||
*/
|
||
export async function addShopOrder(data: ShopOrder) {
|
||
const res = await request.post<ApiResult<unknown>>(
|
||
'/shop/shop-order',
|
||
data
|
||
);
|
||
if (res.code === 0) {
|
||
return res.message;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 修改订单
|
||
*/
|
||
export async function updateShopOrder(data: ShopOrder) {
|
||
const res = await request.put<ApiResult<unknown>>(
|
||
'/shop/shop-order',
|
||
data
|
||
);
|
||
if (res.code === 0) {
|
||
return res.message;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 删除订单
|
||
*/
|
||
export async function removeShopOrder(id?: number) {
|
||
const res = await request.del<ApiResult<unknown>>(
|
||
'/shop/shop-order/' + id
|
||
);
|
||
if (res.code === 0) {
|
||
return res.message;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 批量删除订单
|
||
*/
|
||
export async function removeBatchShopOrder(data: (number | undefined)[]) {
|
||
const res = await request.del<ApiResult<unknown>>(
|
||
'/shop/shop-order/batch',
|
||
{ ids: data.filter(Boolean) }
|
||
);
|
||
if (res.code === 0) {
|
||
return res.message;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 根据id查询订单
|
||
*/
|
||
export async function getShopOrder(id: number) {
|
||
const res = await request.get<ApiResult<ShopOrder>>(
|
||
'/shop/shop-order/' + id
|
||
);
|
||
if (res.code === 0 && res.data) {
|
||
return res.data;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 微信支付返回数据
|
||
*/
|
||
export interface WxPayResult {
|
||
prepayId: string;
|
||
orderNo: string;
|
||
timeStamp: string;
|
||
nonceStr: string;
|
||
package: string;
|
||
signType: string;
|
||
paySign: string;
|
||
}
|
||
|
||
/**
|
||
* 订单重新发起支付(对"已创建但未支付"的订单生成新的预支付参数,不应重复创建订单)
|
||
*
|
||
* 说明:不同后端版本可能暴露不同路径,这里做兼容探测;若全部失败,调用方可自行降级处理。
|
||
*/
|
||
export interface OrderPrepayRequest {
|
||
orderId: number;
|
||
payType: number;
|
||
}
|
||
|
||
export async function prepayShopOrder(data: OrderPrepayRequest) {
|
||
const urls = [
|
||
'/shop/shop-order/pay',
|
||
'/shop/shop-order/prepay',
|
||
'/shop/shop-order/repay'
|
||
];
|
||
|
||
let lastError: unknown;
|
||
let businessError: unknown;
|
||
for (const url of urls) {
|
||
try {
|
||
const res = await request.post<ApiResult<WxPayResult>>(url, data, { showError: false });
|
||
// request.ts 在 code!=0 时会直接 throw;走到这里通常都是 code===0
|
||
if (res.code === 0) return res.data;
|
||
} catch (e) {
|
||
// 若已命中"业务错误"(例如订单已取消/已支付),优先保留该错误用于向上提示;
|
||
// 不要被后续的 404/网络错误覆盖掉,避免调用方误判为"不支持该接口"而降级走创建订单。
|
||
if (!businessError && e instanceof RequestError && e.type === ErrorType.BUSINESS_ERROR) {
|
||
businessError = e;
|
||
} else {
|
||
lastError = e;
|
||
}
|
||
}
|
||
}
|
||
|
||
return Promise.reject(businessError || lastError || new Error('发起支付失败'));
|
||
}
|
||
|
||
/**
|
||
* 创建订单
|
||
*/
|
||
export async function createOrder(data: OrderCreateRequest) {
|
||
// Java 后端期望 camelCase 字段,直接传
|
||
// 注意:货到付款(payType=8)和线下付款(payType=9)时,后端不应创建微信支付订单,
|
||
// 理论上返回 data 为 null 或订单信息;微信支付场景才会返回 WxPayResult。
|
||
const res = await request.post<ApiResult<WxPayResult | null>>(
|
||
'/shop/shop-order',
|
||
data
|
||
);
|
||
if (res.code === 0) {
|
||
return res.data;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 修复订单支付状态
|
||
*/
|
||
export async function repairOrder(data: ShopOrder) {
|
||
const res = await request.put<ApiResult<unknown>>(
|
||
'/shop/shop-order/repair',
|
||
data
|
||
);
|
||
if (res.code === 0) {
|
||
return res.message;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
|
||
/**
|
||
* 申请|同意退款
|
||
*/
|
||
export async function refundShopOrder(data: ShopOrder) {
|
||
const res = await request.put<ApiResult<unknown>>(
|
||
'/shop/shop-order/refund',
|
||
data
|
||
);
|
||
if (res.code === 0) {
|
||
return res.message;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|
||
|
||
/**
|
||
* 确认线下付款收款
|
||
* 商家确认已收到线下付款(微信转账/银行汇款等),确认后订单进入待发货状态
|
||
*/
|
||
export async function confirmOfflinePayment(
|
||
id: number,
|
||
remarks?: string,
|
||
paymentVoucher?: string
|
||
) {
|
||
const params: string[] = []
|
||
if (remarks) params.push(`remarks=${encodeURIComponent(remarks)}`)
|
||
if (paymentVoucher) params.push(`paymentVoucher=${encodeURIComponent(paymentVoucher)}`)
|
||
const url = '/shop/shop-order/confirm-offline-payment/' + id + (params.length ? '?' + params.join('&') : '')
|
||
const res = await request.put<ApiResult<unknown>>(url, null)
|
||
if (res.code === 0) {
|
||
return res.message;
|
||
}
|
||
return Promise.reject(new Error(res.message));
|
||
}
|