From 108083d33275d89d91805c9fe1a66fd1fb5fcca0 Mon Sep 17 00:00:00 2001 From: zzh <1368735060@qq.com> Date: Fri, 16 Oct 2026 15:17:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BA=97=E9=93=BA=E6=8B=89=E5=8D=95?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E6=8C=89=20TikTok=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=AD=9B=E9=80=89=EF=BC=8C=E5=B9=B6=E9=81=BF=E5=85=8D=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=88=B7=E6=96=B0=E6=89=93=E6=96=AD=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- src/components/HandsontablePro/index.vue | 7 + src/locale/en-US.ts | 18 +- src/locale/zh-CN.ts | 20 +- .../platformStoreOrder/PullOrdersModal.vue | 247 ++++++++++++++---- src/views/order/platformStoreOrder/index.vue | 1 + 5 files changed, 237 insertions(+), 56 deletions(-) diff --git a/src/components/HandsontablePro/index.vue b/src/components/HandsontablePro/index.vue index e9af2b3..33cb394 100644 --- a/src/components/HandsontablePro/index.vue +++ b/src/components/HandsontablePro/index.vue @@ -1475,6 +1475,9 @@ manualColumnResize: true, manualColumnMove: props.enableColumnReorder, stretchH: props.stretchColumns ? 'all' : 'none', + // 列宽由列定义给出。开启后 loadData 会走 GhostTable 测量, + // 单元格节点缺失时抛 getBoundingClientRect,并中断外层页面更新。 + autoColumnSize: false, // stretch 时锁定操作/序号/复选框列,避免被均分拉宽 beforeStretchingColumnWidth: lockFixedColumnStretchWidth, ...(props.rowHeight != null && props.rowHeight > 0 @@ -2362,6 +2365,8 @@ hotInstance.loadData([]); hotInstance.render(); publishSelection([], new Set()); + } catch (error) { + console.warn('[HandsontablePro] clear failed', error); } finally { selectionLock -= 1; } @@ -2393,6 +2398,8 @@ } else { applySelectedRowStyles(); } + } catch (error) { + console.warn('[HandsontablePro] refresh failed', error); } finally { selectionLock -= 1; } diff --git a/src/locale/en-US.ts b/src/locale/en-US.ts index fd64edb..a8d201f 100644 --- a/src/locale/en-US.ts +++ b/src/locale/en-US.ts @@ -1079,9 +1079,25 @@ export default { 'order.platformStoreOrder.createFulfillWms.success': 'Created {count} fulfill order(s)', 'order.platformStoreOrder.pull.store': 'Store', 'order.platformStoreOrder.pull.storePlaceholder': 'Select stores', + 'order.platformStoreOrder.pull.storeAll': 'All stores', 'order.platformStoreOrder.pull.status': 'Status', + 'order.platformStoreOrder.pull.statusAll': 'All', + 'order.platformStoreOrder.pull.statusClear': 'Clear', + 'order.platformStoreOrder.pull.statusCount': '{count} selected', 'order.platformStoreOrder.pull.time': 'Time', - 'order.platformStoreOrder.pull.timeHint': 'Defaults to today', + 'order.platformStoreOrder.pull.timeHint': 'Filter by order created time. Defaults to today.', + 'order.platformStoreOrder.pull.today': 'Today', + 'order.platformStoreOrder.pull.last7': '7 days', + 'order.platformStoreOrder.pull.last15': '15 days', + 'order.platformStoreOrder.pull.status.UNPAID': 'Unpaid', + 'order.platformStoreOrder.pull.status.ON_HOLD': 'On hold', + 'order.platformStoreOrder.pull.status.PARTIALLY_SHIPPING': 'Partially shipping', + 'order.platformStoreOrder.pull.status.AWAITING_SHIPMENT': 'Awaiting shipment', + 'order.platformStoreOrder.pull.status.AWAITING_COLLECTION': 'Awaiting collection', + 'order.platformStoreOrder.pull.status.IN_TRANSIT': 'In transit', + 'order.platformStoreOrder.pull.status.DELIVERED': 'Delivered', + 'order.platformStoreOrder.pull.status.COMPLETED': 'Completed', + 'order.platformStoreOrder.pull.status.CANCELLED': 'Cancelled', 'order.platformStoreOrder.message.loadFailed': 'Failed to load orders', 'order.platformStoreOrder.message.detailFailed': 'Failed to load detail', 'order.platformStoreOrder.message.matchSuccess': 'Inventory matched', diff --git a/src/locale/zh-CN.ts b/src/locale/zh-CN.ts index b2de6d1..dcd5440 100644 --- a/src/locale/zh-CN.ts +++ b/src/locale/zh-CN.ts @@ -1070,9 +1070,25 @@ export default { 'order.platformStoreOrder.createFulfillWms.success': '成功创建 {count} 张代发订单', 'order.platformStoreOrder.pull.store': '店铺', 'order.platformStoreOrder.pull.storePlaceholder': '请选择店铺', - 'order.platformStoreOrder.pull.status': '类型', + 'order.platformStoreOrder.pull.storeAll': '全选店铺', + 'order.platformStoreOrder.pull.status': '状态', + 'order.platformStoreOrder.pull.statusAll': '全选', + 'order.platformStoreOrder.pull.statusClear': '清空', + 'order.platformStoreOrder.pull.statusCount': '已选 {count} 个', 'order.platformStoreOrder.pull.time': '时间', - 'order.platformStoreOrder.pull.timeHint': '默认时间为当天', + 'order.platformStoreOrder.pull.timeHint': '按订单创建时间拉取,默认当天', + 'order.platformStoreOrder.pull.today': '今天', + 'order.platformStoreOrder.pull.last7': '近7天', + 'order.platformStoreOrder.pull.last15': '近15天', + 'order.platformStoreOrder.pull.status.UNPAID': '未付款', + 'order.platformStoreOrder.pull.status.ON_HOLD': '待处理', + 'order.platformStoreOrder.pull.status.PARTIALLY_SHIPPING': '部分发货', + 'order.platformStoreOrder.pull.status.AWAITING_SHIPMENT': '待发货', + 'order.platformStoreOrder.pull.status.AWAITING_COLLECTION': '待揽收', + 'order.platformStoreOrder.pull.status.IN_TRANSIT': '运输中', + 'order.platformStoreOrder.pull.status.DELIVERED': '已送达', + 'order.platformStoreOrder.pull.status.COMPLETED': '已完成', + 'order.platformStoreOrder.pull.status.CANCELLED': '已取消', 'order.platformStoreOrder.message.loadFailed': '加载订单失败', 'order.platformStoreOrder.message.detailFailed': '加载详情失败', 'order.platformStoreOrder.message.matchSuccess': '库存匹配成功', diff --git a/src/views/order/platformStoreOrder/PullOrdersModal.vue b/src/views/order/platformStoreOrder/PullOrdersModal.vue index b6ea476..3846adc 100644 --- a/src/views/order/platformStoreOrder/PullOrdersModal.vue +++ b/src/views/order/platformStoreOrder/PullOrdersModal.vue @@ -9,6 +9,7 @@ import { pickField } from '@/utils/warehouseListMapper' const props = defineProps<{ visible: boolean customerId?: number + platformCode?: string }>() const emit = defineEmits<{ @@ -16,51 +17,77 @@ const emit = defineEmits<{ success: [] }>() +/** TikTok 订单搜索状态,与平台 order_status 一致 */ +const TIKTOK_PULL_STATUSES = [ + 'UNPAID', + 'ON_HOLD', + 'PARTIALLY_SHIPPING', + 'AWAITING_SHIPMENT', + 'AWAITING_COLLECTION', + 'IN_TRANSIT', + 'DELIVERED', + 'COMPLETED', + 'CANCELLED', +] as const + +type StoreOption = { label: string; value: number; platform: string } + const { t } = useI18n() const loading = ref(false) const storeLoading = ref(false) -const storeOptions = ref>([]) +const storeOptions = ref([]) const storeIds = ref([]) -const orderStatuses = ref([ - 'unpaid', - 'pending', - 'canceled', - 'ready_to_ship', - 'delivered', - 'returned', - 'shipped', - 'failed', - 'topack', - 'toship', - 'shipping', - 'lost', -]) -const dateRange = ref<[string, string] | undefined>() - -const statusOptions = computed(() => - [ - 'unpaid', - 'pending', - 'canceled', - 'ready_to_ship', - 'delivered', - 'returned', - 'shipped', - 'failed', - 'topack', - 'toship', - 'shipping', - 'lost', - ].map((value) => ({ label: value, value })), -) +const orderStatuses = ref([...TIKTOK_PULL_STATUSES]) +const dateRange = ref<[string, string]>(todayRange()) const modalVisible = computed({ get: () => props.visible, set: (v: boolean) => emit('update:visible', v), }) +const visibleStoreOptions = computed(() => { + const platform = (props.platformCode || '').trim().toLowerCase() + if (!platform || platform === 'all') return storeOptions.value + return storeOptions.value.filter((item) => item.platform === platform) +}) + +const allStatusesChecked = computed( + () => orderStatuses.value.length === TIKTOK_PULL_STATUSES.length, +) +const allStoresChecked = computed( + () => + visibleStoreOptions.value.length > 0 + && storeIds.value.length === visibleStoreOptions.value.length, +) +const canSubmit = computed( + () => storeIds.value.length > 0 && orderStatuses.value.length > 0 && !storeLoading.value, +) + +function todayRange(): [string, string] { + return [dayjs().format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')] +} + +function applyRange(days: number) { + dateRange.value = [ + dayjs().subtract(days - 1, 'day').format('YYYY-MM-DD'), + dayjs().format('YYYY-MM-DD'), + ] +} + +function toggleAllStatuses() { + orderStatuses.value = allStatusesChecked.value ? [] : [...TIKTOK_PULL_STATUSES] +} + +function toggleAllStores() { + storeIds.value = allStoresChecked.value + ? [] + : visibleStoreOptions.value.map((item) => item.value) +} + async function loadStoreOptions() { storeIds.value = [] + orderStatuses.value = [...TIKTOK_PULL_STATUSES] + dateRange.value = todayRange() storeLoading.value = true try { const { items } = await getPlatformStoreList({ @@ -72,12 +99,12 @@ async function loadStoreOptions() { .map((raw: Record) => { const id = Number(pickField(raw, 'id', 'Id')) const name = String(pickField(raw, 'storeNickname', 'StoreNickname') ?? `#${id}`) - const platform = String(pickField(raw, 'platformCode', 'PlatformCode') ?? '') - return { label: platform ? `${name} (${platform})` : name, value: id } + const platform = String(pickField(raw, 'platformCode', 'PlatformCode') ?? '').toLowerCase() + return { label: platform ? `${name} (${platform})` : name, value: id, platform } }) - .filter((x) => x.value > 0) - if (!storeOptions.value.length) { - $baseMessage(t('order.platformStoreOrder.message.noStore'), 'warning') + .filter((item) => item.value > 0) + if (visibleStoreOptions.value.length === 1) { + storeIds.value = [visibleStoreOptions.value[0].value] } } catch (e: any) { storeOptions.value = [] @@ -145,38 +172,152 @@ async function handleSubmit(): Promise { - + - +
+
+ + + {{ allStoresChecked ? t('order.platformStoreOrder.pull.statusClear') : t('order.platformStoreOrder.pull.storeAll') }} + +
+
+ {{ t('order.platformStoreOrder.message.noStore') }} +
+
- +
+
+ + {{ t('order.platformStoreOrder.pull.statusCount', { count: orderStatuses.length }) }} + + + {{ allStatusesChecked ? t('order.platformStoreOrder.pull.statusClear') : t('order.platformStoreOrder.pull.statusAll') }} + +
+ + + {{ t(`order.platformStoreOrder.pull.status.${status}`) }} + {{ status }} + + +
- -
{{ t('order.platformStoreOrder.pull.timeHint') }}
+
+ +
+ + {{ t('order.platformStoreOrder.pull.today') }} + + + {{ t('order.platformStoreOrder.pull.last7') }} + + + {{ t('order.platformStoreOrder.pull.last15') }} + +
+
{{ t('order.platformStoreOrder.pull.timeHint') }}
+
diff --git a/src/views/order/platformStoreOrder/index.vue b/src/views/order/platformStoreOrder/index.vue index 931a79c..a395695 100644 --- a/src/views/order/platformStoreOrder/index.vue +++ b/src/views/order/platformStoreOrder/index.vue @@ -860,6 +860,7 @@ watch( v-if="pullVisible" v-model:visible="pullVisible" :customer-id="withCustomerId({}).customerId" + :platform-code="platformCode" @success="() => { loadSummary(); loadList() }" />