diff --git a/manager/src/api/order.js b/manager/src/api/order.js index d729f54f4..a3540c1aa 100644 --- a/manager/src/api/order.js +++ b/manager/src/api/order.js @@ -78,6 +78,15 @@ export const getOrderList = (params) => { return getRequest(`/order/order`, params) } +// 小程序专用接口由服务端固定来源与微信支付范围,并回填本地上报结果。 +export const getWechatOrderList = (params) => getRequest('/order/order/wechat', params) +// 状态统计与专用列表共用上报状态筛选。 +export const getWechatOrderNum = (params) => getRequest('/order/order/wechat/orderNum', params) +// 人工补报复用支付流水锁和真实履约校验,不受自动上报开关限制。 +export const retryWechatOrder = (sn) => postRequest(`/order/order/wechat/${encodeURIComponent(sn)}/retry`, {}, undefined, 120000) +// 查询同笔微信支付下的操作日志,不返回原始支付和物流凭据。 +export const getWechatOrderLogs = (sn, params) => getRequest(`/order/order/wechat/${encodeURIComponent(sn)}/logs`, params) + // 导出订单列表 export const exportOrder = (params) => { return getRequest(`/order/order/queryExportOrder`, params,'blob') diff --git a/manager/src/libs/axios.js b/manager/src/libs/axios.js index b3542dc4c..372fe35bb 100644 --- a/manager/src/libs/axios.js +++ b/manager/src/libs/axios.js @@ -182,10 +182,12 @@ export const postBlobRequest = (url, data) => { }); }; -export const postRequest = (url, params, headers) => { +// 个别需等待外部平台的操作可传超时毫秒数,现有调用保持 8 秒默认值。 +export const postRequest = (url, params, headers, timeout = 8000) => { let accessToken = getStore("accessToken"); return service({ method: "post", + timeout, url: `${url}`, data: params, transformRequest: headers diff --git a/manager/src/utils/wechatOrderSync.js b/manager/src/utils/wechatOrderSync.js new file mode 100644 index 000000000..0c0b58e9d --- /dev/null +++ b/manager/src/utils/wechatOrderSync.js @@ -0,0 +1,23 @@ +/** + * 小程序订单上报状态及日志显示口径,成功仅表示发货接口受理。 + * @author Bulbasaur + * @since 2026-11-09 + */ +export const wechatSyncOptions = [ + { value: "UNCHECKED", label: "待核查", type: "info" }, + { value: "PENDING", label: "待上报", type: "warning" }, + { value: "PROCESSING", label: "处理中", type: "warning" }, + { value: "SUCCESS", label: "上报成功", type: "success" }, + { value: "FAILED", label: "上报失败", type: "danger" }, +]; + +/** 查找页面和日志的统一状态标签,重复请求跳过使用独立说明。 */ +export function wechatSyncLabel(value) { + if (value === "SKIPPED") return "已跳过重复"; + return wechatSyncOptions.find((item) => item.value === value)?.label || value || "—"; +} + +/** 返回 Element Plus 标签类型,未知状态使用中性色。 */ +export function wechatSyncTag(value) { + return wechatSyncOptions.find((item) => item.value === value)?.type || "info"; +} diff --git a/manager/src/views/order/order/orderList.vue b/manager/src/views/order/order/orderList.vue index 46950b2cc..fcae49d15 100644 --- a/manager/src/views/order/order/orderList.vue +++ b/manager/src/views/order/order/orderList.vue @@ -52,6 +52,7 @@ @change="selectDateRange" /> + 搜索 重置 @@ -74,6 +75,9 @@ 导出订单 + + 重新加载 + @@ -126,9 +130,11 @@ - + + @@ -162,6 +168,8 @@ const props = defineProps({ fixedClientType: { type: String, default: "" }, fixedPaymentMethod: { type: String, default: "" }, allowExport: { type: Boolean, default: true }, + wechatSync: { type: Boolean, default: false }, + actionWidth: { type: Number, default: 80 }, }); const PROMOTION_OPTIONS = [ @@ -204,6 +212,7 @@ function emptySearchForm(pageSize = 20) { orderStatus: "", paymentMethod: props.fixedPaymentMethod, orderPromotionType: "", + ...(props.wechatSync ? { wechatSyncStatus: "" } : {}), }; } @@ -216,6 +225,9 @@ const searchFormRef = ref(null); const tableRef = ref(null); const loading = ref(true); +const loadError = ref(false); +let listRequestSeq = 0; +let countRequestSeq = 0; const exporting = ref(false); const pageSizes = ref(PAGE_SIZES); const promotionOptions = ref(PROMOTION_OPTIONS); @@ -389,16 +401,28 @@ function listParams() { return params; } function getDataList() { + const requestId = ++listRequestSeq; loading.value = true; - API_Order.getOrderList(listParams()) + loadError.value = false; + const fetchList = props.wechatSync ? API_Order.getWechatOrderList : API_Order.getOrderList; + fetchList(listParams()) .then((res) => { + if (requestId !== listRequestSeq) return; if (res.success) { data.value = res.result.records; total.value = res.result.total; + } else { + throw new Error("订单查询失败"); } }) + .catch(() => { + if (requestId !== listRequestSeq) return; + data.value = []; + total.value = 0; + loadError.value = true; + }) .finally(() => { - loading.value = false; + if (requestId === listRequestSeq) loading.value = false; }); } function detail(v) { @@ -454,14 +478,19 @@ function orderStatusClick(name) { getDataList(); } function getOrderNumData() { - API_Order.getOrderNum(countParams()) + const requestId = ++countRequestSeq; + const fetchCount = props.wechatSync ? API_Order.getWechatOrderNum : API_Order.getOrderNum; + fetchCount(countParams()) .then((res) => { + if (requestId !== countRequestSeq) return; if (res.success) { orderNumData.value = res.result; + } else { + orderNumData.value = {}; } }) .catch(() => { - orderNumData.value = {}; + if (requestId === countRequestSeq) orderNumData.value = {}; }); } @@ -476,6 +505,9 @@ watch( } ); +// 补报完成后刷新当前筛选和页码,不清空运营人员已选条件。 +defineExpose({ reload: init }); + onMounted(() => { try { sessionStorage.removeItem("manager-order-list-query"); diff --git a/manager/src/views/order/wechat/SyncLogDrawer.vue b/manager/src/views/order/wechat/SyncLogDrawer.vue new file mode 100644 index 000000000..fcc279e2f --- /dev/null +++ b/manager/src/views/order/wechat/SyncLogDrawer.vue @@ -0,0 +1,88 @@ + + + + + + diff --git a/manager/src/views/order/wechat/orderList.vue b/manager/src/views/order/wechat/orderList.vue index 54d200d2e..feca87318 100644 --- a/manager/src/views/order/wechat/orderList.vue +++ b/manager/src/views/order/wechat/orderList.vue @@ -8,14 +8,76 @@ class="wechat-order-notice" description="仅展示微信小程序下单且使用微信支付的订单。自动上报开关开启且微信侧已开通发货管理时,按现有履约流程上报。" /> - + + + + + +