diff --git a/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue b/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue
index f48b61144..829d4a488 100644
--- a/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue
+++ b/frontend/admin/src/pages/order/orderCenter/components/DetailOrderInfo.vue
@@ -203,8 +203,8 @@
买家留言
- -
-
{{ data.mark || '--' }}
+ -
+
{{ data.mark || '--' }}
@@ -227,8 +227,8 @@
@@ -351,6 +351,20 @@ function isImageItem(item) {
&:nth-child(3n + 3) {
padding-left: 20px;
}
+
+ // 买家留言 / 订单备注:占满整行,避免按三列宽度提前换行
+ &.item-full {
+ flex: 0 0 100%;
+ padding-left: 0;
+ padding-right: 0;
+ word-break: break-word;
+ white-space: pre-wrap;
+ }
+ }
+
+ .full-text {
+ width: 100%;
+ line-height: 1.6;
}
.value {
diff --git a/frontend/uni-app/src/dynamic-pages/api/action-map.js b/frontend/uni-app/src/dynamic-pages/api/action-map.js
index 0475899b1..d194c40c4 100644
--- a/frontend/uni-app/src/dynamic-pages/api/action-map.js
+++ b/frontend/uni-app/src/dynamic-pages/api/action-map.js
@@ -46,14 +46,18 @@ export default {
}
uni.navigateTo({ url: routes.cashier + '?order_no=' + orderId + '&from_type=order' });
},
- /** 取消订单 */
- cancelOrder(order, params) {
+ /** 取消订单(详情页通过 context.onCancel 自行调接口并刷新;列表页走事件总线) */
+ cancelOrder(order, params, context) {
const orderNo = params.order_no || order.order_no || '';
uni.showModal({
title: i18n.t(`提示`),
content: i18n.t(`确定取消该订单吗?`),
success: (res) => {
if (res.confirm) {
+ if (context && typeof context.onCancel === 'function') {
+ context.onCancel({ order_no: orderNo });
+ return;
+ }
uni.$emit('order:cancel', { order_no: orderNo });
}
},
diff --git a/frontend/uni-app/src/dynamic-pages/components/order/create/OrderCustomForm.vue b/frontend/uni-app/src/dynamic-pages/components/order/create/OrderCustomForm.vue
index ce5ed3a23..45680df28 100644
--- a/frontend/uni-app/src/dynamic-pages/components/order/create/OrderCustomForm.vue
+++ b/frontend/uni-app/src/dynamic-pages/components/order/create/OrderCustomForm.vue
@@ -1,6 +1,6 @@
- {{ $t('必填信息') }}
+ {{ $t('表单信息') }}
diff --git a/frontend/uni-app/src/dynamic-pages/engines/OrderDetailEngine.vue b/frontend/uni-app/src/dynamic-pages/engines/OrderDetailEngine.vue
index 0c18cc266..29d28b77e 100644
--- a/frontend/uni-app/src/dynamic-pages/engines/OrderDetailEngine.vue
+++ b/frontend/uni-app/src/dynamic-pages/engines/OrderDetailEngine.vue
@@ -61,7 +61,7 @@ import { resolveSectionComponent, InfoListComponent } from '../components/order/
import SectionDispatcher from '../components/order/detail/SectionDispatcher.vue';
// #endif
import actionMap from '../api/action-map.js';
-import { getCenterOrderDetail, takeOrder } from '@/api/order-center.js';
+import { getCenterOrderDetail, takeOrder, cancelOrder } from '@/api/order-center.js';
import { express } from '@/api/order.js';
import routes from '../api/routes.js';
import { useColorTheme } from '@/composables/useColorTheme';
@@ -82,6 +82,7 @@ const { colorStyle } = useColorTheme();
const pageConfig = ref({ sections: [], extensions: {} });
const loading = ref(true);
const confirmingReceive = ref(false);
+const cancellingOrder = ref(false);
const logisticsLoading = ref(false);
// 送礼分享
const giftModalShow = ref(false);
@@ -288,6 +289,8 @@ function onButtonAction(payload) {
var context;
if (payload.action === 'confirmReceive') {
context = { onConfirm: confirmReceive };
+ } else if (payload.action === 'cancelOrder') {
+ context = { onCancel: cancelUnpaidOrder };
} else if (payload.action === 'shareGift') {
context = { onShareGift: openGiftShare };
}
@@ -313,12 +316,33 @@ async function confirmReceive(payload) {
await takeOrder(payload.order_no);
uni.showToast({ title: i18n.t('收货成功'), icon: 'success' });
await loadDetail();
+ // 通知列表页同步刷新(栈内列表仍挂载时立即更新)
+ uni.$emit('order:list-refresh');
} catch (e) {
- uni.showToast({ title: e?.msg || i18n.t('收货失败'), icon: 'none' });
+ uni.showToast({ title: (typeof e === 'string' ? e : e?.msg) || i18n.t('收货失败'), icon: 'none' });
} finally {
confirmingReceive.value = false;
}
}
+
+/**
+ * 详情页取消未支付订单
+ * @param {object} payload {order_no}
+ */
+async function cancelUnpaidOrder(payload) {
+ if (cancellingOrder.value) return;
+ cancellingOrder.value = true;
+ try {
+ await cancelOrder(payload.order_no);
+ uni.showToast({ title: i18n.t('取消成功'), icon: 'success' });
+ await loadDetail();
+ uni.$emit('order:list-refresh');
+ } catch (e) {
+ uni.showToast({ title: (typeof e === 'string' ? e : e?.msg) || i18n.t('取消失败'), icon: 'none' });
+ } finally {
+ cancellingOrder.value = false;
+ }
+}
/**
* 行动入口卡片点击(ActionCard emit)
* @param {object} payload {action, link}
diff --git a/frontend/uni-app/src/dynamic-pages/engines/OrderListEngine.vue b/frontend/uni-app/src/dynamic-pages/engines/OrderListEngine.vue
index b222e61a5..426739c78 100644
--- a/frontend/uni-app/src/dynamic-pages/engines/OrderListEngine.vue
+++ b/frontend/uni-app/src/dynamic-pages/engines/OrderListEngine.vue
@@ -274,7 +274,7 @@ async function onCancelOrder({ order_no }) {
uni.showToast({ title: i18n.t('取消成功'), icon: 'success' });
refreshList();
} catch (e) {
- uni.showToast({ title: e?.msg || i18n.t('取消失败'), icon: 'none' });
+ uni.showToast({ title: (typeof e === 'string' ? e : e?.msg) || i18n.t('取消失败'), icon: 'none' });
}
}
/**
@@ -286,7 +286,7 @@ async function onConfirmOrder({ order_no }) {
uni.showToast({ title: i18n.t('收货成功'), icon: 'success' });
refreshList();
} catch (e) {
- uni.showToast({ title: e?.msg || i18n.t('收货失败'), icon: 'none' });
+ uni.showToast({ title: (typeof e === 'string' ? e : e?.msg) || i18n.t('收货失败'), icon: 'none' });
}
}
/**
@@ -298,15 +298,17 @@ async function onDeleteOrder({ order_no }) {
uni.showToast({ title: i18n.t('删除成功'), icon: 'success' });
refreshList();
} catch (e) {
- uni.showToast({ title: e?.msg || i18n.t('删除失败'), icon: 'none' });
+ uni.showToast({ title: (typeof e === 'string' ? e : e?.msg) || i18n.t('删除失败'), icon: 'none' });
}
}
/**
* 刷新列表
+ * 必须先复位 loading,否则进行中的 loadOrders 会让本次刷新被 if (loading) return 吞掉
*/
function refreshList() {
page.value = 1;
finished.value = false;
+ loading.value = false;
orders.value = [];
getOrderData();
loadOrders();
@@ -323,10 +325,13 @@ onMounted(() => {
uni.$on('order:cancel', onCancelOrder);
uni.$on('order:confirm', onConfirmOrder);
uni.$on('order:delete', onDeleteOrder);
+ // 详情页取消/收货成功后同步刷新栈内列表
+ uni.$on('order:list-refresh', refreshList);
});
onBeforeUnmount(() => {
uni.$off('order:cancel', onCancelOrder);
+ uni.$off('order:list-refresh', refreshList);
uni.$off('order:confirm', onConfirmOrder);
uni.$off('order:delete', onDeleteOrder);
});