增加履约高级配置

This commit is contained in:
yml2213
2026-05-26 22:56:41 +08:00
parent 5377f8893d
commit e8010728a4
18 changed files with 858 additions and 62 deletions
+1
View File
@@ -66,6 +66,7 @@ export type {
AdminCloudtentaclesSkuListResult,
AdminCloudtentaclesDeliveryRecordItem,
AdminCloudtentaclesDeliveryRecordListResult,
AdminKuaishouCloudDeliveryItem,
AdminKuaishouCloudFulfillmentItem,
AdminKuaishouCloudFulfillmentConfig,
} from './platform-config'
@@ -49,6 +49,7 @@ export type {
} from './cloudtentacles'
export type {
AdminKuaishouCloudDeliveryItem,
AdminKuaishouCloudFulfillmentItem,
AdminKuaishouCloudFulfillmentConfig,
} from './kuaishou-cloud-fulfillment'
@@ -1,3 +1,9 @@
export interface AdminKuaishouCloudDeliveryItem {
cloudSkuId: number
cloudSkuName: string
quantity: number
}
export interface AdminKuaishouCloudFulfillmentItem {
id: string
enabled: boolean
@@ -14,6 +20,7 @@ export interface AdminKuaishouCloudFulfillmentItem {
cloudSourceKeys: string[]
cloudSkuId: number
cloudSkuName: string
deliveryItems: AdminKuaishouCloudDeliveryItem[]
vnKey: string
autoBuyEnabled: boolean
minAssetReserve: number
@@ -429,6 +429,34 @@
padding: var(--space-4);
}
.delivery-items-editor {
display: grid;
gap: var(--space-3);
padding: var(--space-4);
}
.delivery-items-head {
display: flex;
justify-content: space-between;
gap: var(--space-3);
align-items: center;
color: var(--text-primary);
font-weight: 700;
}
.delivery-item-row {
display: grid;
grid-template-columns: minmax(220px, 1fr) minmax(160px, 0.7fr) 132px 48px;
gap: var(--space-3);
align-items: center;
}
.delivery-item-sku,
.delivery-item-name,
.delivery-item-count {
width: 100%;
}
.field-wide {
grid-column: 1 / -1;
}
@@ -501,6 +529,7 @@
.rule-editor-main,
.strategy-grid,
.mapping-editor,
.delivery-item-row,
.mapping-grid,
.mapping-extra {
grid-template-columns: 1fr;
@@ -13,6 +13,25 @@ const config = useKuaishouCloudConfig()
const ninetyone = useKuaishouCloudNinetyone(config)
const cloudSku = useKuaishouCloudSku(config.cloudtentaclesSourceOptions)
function handlePrimaryCloudSkuSelected(item: (typeof config.items.value)[number], value: number | string | undefined) {
cloudSku.handleCloudSkuSelected(item, value)
config.syncDeliveryItemsFromPrimaryCloudSku(item)
}
function handleDeliveryItemCloudSkuSelected(
item: (typeof config.items.value)[number],
index: number,
value: number | string | undefined,
) {
const deliveryItem = item.deliveryItems[index]
if (!deliveryItem) {
return
}
cloudSku.handleDeliveryItemCloudSkuSelected(item, deliveryItem, value)
config.syncPrimaryCloudSkuFromDeliveryItems(item)
}
onMounted(config.loadConfigs)
</script>
@@ -61,6 +80,7 @@ onMounted(config.loadConfigs)
:get-cloud-source-summary="config.getCloudSourceSummary"
:get-cloud-sku-summary="config.getCloudSkuSummary"
:get-consume-shop-summary="config.getConsumeShopSummary"
:get-delivery-plan-summary="config.getDeliveryPlanSummary"
:get-cloud-sku-options="cloudSku.getCloudSkuOptions"
:format-cloud-sku-option-label="cloudSku.formatCloudSkuOptionLabel"
:get-kuaishou-consume-shop-options="config.getKuaishouConsumeShopOptions"
@@ -74,12 +94,15 @@ onMounted(config.loadConfigs)
@add-item="config.addItem()"
@save-configs="config.saveConfigs()"
@toggle-collapsed="config.toggleCollapsed($event)"
@handle-cloud-sku-selected="(item, value) => cloudSku.handleCloudSkuSelected(item, value)"
@handle-cloud-sku-selected="handlePrimaryCloudSkuSelected"
@handle-delivery-item-cloud-sku-selected="handleDeliveryItemCloudSkuSelected"
@handle-cloud-sku-dropdown-visible="
(item, visible) => cloudSku.handleCloudSkuDropdownVisible(item, visible)
"
@handle-kuaishou-consume-shop-selected="config.handleKuaishouConsumeShopSelected($event)"
@handle-cloud-source-keys-changed="config.handleCloudSourceKeysChanged($event)"
@add-delivery-item="config.addDeliveryItem($event)"
@remove-delivery-item="(item, index) => config.removeDeliveryItem(item, index)"
@remove-item="config.removeItem($event)"
/>
</template>
@@ -19,6 +19,7 @@ defineProps<{
getCloudSourceSummary: (item: EditableItem) => string
getCloudSkuSummary: (item: EditableItem) => string
getConsumeShopSummary: (item: EditableItem) => string
getDeliveryPlanSummary: (item: EditableItem) => string
getCloudSkuOptions: (item: EditableItem) => AdminCloudtentaclesSkuItem[]
formatCloudSkuOptionLabel: (sku: AdminCloudtentaclesSkuItem) => string
getKuaishouConsumeShopOptions: () => AdminKuaishouEticketShopConfigItem[]
@@ -28,11 +29,21 @@ defineProps<{
const emit = defineEmits<{
toggleCollapsed: []
handleCloudSkuSelected: [value: number | string | undefined]
handleDeliveryItemCloudSkuSelected: [index: number, value: number | string | undefined]
handleCloudSkuDropdownVisible: [visible: boolean]
handleKuaishouConsumeShopSelected: []
handleCloudSourceKeysChanged: []
addDeliveryItem: []
removeDeliveryItem: [index: number]
remove: []
}>()
function isAdvancedDeliveryConfigured(item: EditableItem) {
return (
item.deliveryItems.length > 1 ||
item.deliveryItems.some((deliveryItem) => Number(deliveryItem.quantity || 1) > 1)
)
}
</script>
<template>
@@ -151,6 +162,7 @@ const emit = defineEmits<{
v-model="item.cloudSkuId"
class="text-input"
placeholder="请选择 cloud SKU"
:disabled="isAdvancedDeliveryConfigured(item)"
@change="emit('handleCloudSkuSelected', item.cloudSkuId)"
@visible-change="emit('handleCloudSkuDropdownVisible', $event)"
>
@@ -168,6 +180,7 @@ const emit = defineEmits<{
:model-value="item.cloudSkuName"
class="text-input"
placeholder="选择后自动带出"
disabled
readonly
/>
</el-form-item>
@@ -229,6 +242,61 @@ const emit = defineEmits<{
</el-form>
</section>
<details class="advanced-fields">
<summary>
<span>高级履约配置</span>
<small>{{ getDeliveryPlanSummary(item) }}</small>
</summary>
<div class="delivery-items-editor">
<div class="delivery-items-head">
<span>发货物品明细</span>
<el-button size="small" @click="emit('addDeliveryItem')">添加物品</el-button>
</div>
<div
v-for="(deliveryItem, deliveryIndex) in item.deliveryItems"
:key="`${item.localId}-${deliveryIndex}`"
class="delivery-item-row"
>
<el-select
v-model="deliveryItem.cloudSkuId"
class="delivery-item-sku"
placeholder="请选择 cloud SKU"
@change="emit('handleDeliveryItemCloudSkuSelected', deliveryIndex, deliveryItem.cloudSkuId)"
@visible-change="emit('handleCloudSkuDropdownVisible', $event)"
>
<el-option label="请选择 cloud SKU" :value="0" />
<el-option
v-for="sku in getCloudSkuOptions(item)"
:key="sku.id"
:label="formatCloudSkuOptionLabel(sku)"
:value="sku.id"
/>
</el-select>
<el-input
:model-value="deliveryItem.cloudSkuName || '-'"
class="delivery-item-name"
readonly
/>
<el-input-number
v-model="deliveryItem.quantity"
class="delivery-item-count"
:min="1"
:max="999"
controls-position="right"
/>
<el-button
link
type="danger"
:disabled="item.deliveryItems.length <= 1"
@click="emit('removeDeliveryItem', deliveryIndex)"
>
删除
</el-button>
</div>
<small class="field-help">同一个用户只绑定一次角色系统会按这里的物品和数量依次发货</small>
</div>
</details>
<details class="advanced-fields">
<summary>
<span>高级匹配与备注</span>
@@ -24,6 +24,7 @@ defineProps<{
getCloudSourceSummary: (item: EditableItem) => string
getCloudSkuSummary: (item: EditableItem) => string
getConsumeShopSummary: (item: EditableItem) => string
getDeliveryPlanSummary: (item: EditableItem) => string
getCloudSkuOptions: (item: EditableItem) => AdminCloudtentaclesSkuItem[]
formatCloudSkuOptionLabel: (sku: AdminCloudtentaclesSkuItem) => string
getKuaishouConsumeShopOptions: () => AdminKuaishouEticketShopConfigItem[]
@@ -41,9 +42,12 @@ const emit = defineEmits<{
saveConfigs: []
toggleCollapsed: [localId: string]
handleCloudSkuSelected: [item: EditableItem, value: number | string | undefined]
handleDeliveryItemCloudSkuSelected: [item: EditableItem, index: number, value: number | string | undefined]
handleCloudSkuDropdownVisible: [item: EditableItem, visible: boolean]
handleKuaishouConsumeShopSelected: [item: EditableItem]
handleCloudSourceKeysChanged: [item: EditableItem]
addDeliveryItem: [item: EditableItem]
removeDeliveryItem: [item: EditableItem, index: number]
removeItem: [localId: string]
}>()
</script>
@@ -130,15 +134,21 @@ const emit = defineEmits<{
:get-cloud-source-summary="getCloudSourceSummary"
:get-cloud-sku-summary="getCloudSkuSummary"
:get-consume-shop-summary="getConsumeShopSummary"
:get-delivery-plan-summary="getDeliveryPlanSummary"
:get-cloud-sku-options="getCloudSkuOptions"
:format-cloud-sku-option-label="formatCloudSkuOptionLabel"
:get-kuaishou-consume-shop-options="getKuaishouConsumeShopOptions"
:format-kuaishou-consume-shop-option="formatKuaishouConsumeShopOption"
@toggle-collapsed="emit('toggleCollapsed', item.localId)"
@handle-cloud-sku-selected="emit('handleCloudSkuSelected', item, $event)"
@handle-delivery-item-cloud-sku-selected="
(index, value) => emit('handleDeliveryItemCloudSkuSelected', item, index, value)
"
@handle-cloud-sku-dropdown-visible="emit('handleCloudSkuDropdownVisible', item, $event)"
@handle-kuaishou-consume-shop-selected="emit('handleKuaishouConsumeShopSelected', item)"
@handle-cloud-source-keys-changed="emit('handleCloudSourceKeysChanged', item)"
@add-delivery-item="emit('addDeliveryItem', item)"
@remove-delivery-item="emit('removeDeliveryItem', item, $event)"
@remove="emit('removeItem', item.localId)"
/>
</el-card>
@@ -8,6 +8,7 @@ import {
saveAdminKuaishouCloudFulfillmentConfig,
} from '@/services/admin'
import type {
AdminKuaishouCloudDeliveryItem,
AdminKuaishouCloudFulfillmentConfig,
AdminKuaishouCloudFulfillmentItem,
AdminKuaishouEticketShopConfigItem,
@@ -79,6 +80,7 @@ export function useKuaishouCloudConfig() {
cloudSourceKeys: sourceKeys,
cloudSkuId: 0,
cloudSkuName: '',
deliveryItems: [],
vnKey: '1',
autoBuyEnabled: true,
minAssetReserve: 0,
@@ -96,6 +98,8 @@ export function useKuaishouCloudConfig() {
item.kuaishouConsumeShopName,
)
const sourceKeys = normalizeCloudSourceKeys(item.cloudSourceKeys)
const deliveryItems = normalizeDeliveryItems(item)
const primaryDeliveryItem = deliveryItems[0]
return {
localId: crypto.randomUUID(),
id: item.id || crypto.randomUUID(),
@@ -111,8 +115,9 @@ export function useKuaishouCloudConfig() {
externalSkuName: item.externalSkuName || '',
resolvedSkuName: item.resolvedSkuName || '',
cloudSourceKeys: sourceKeys,
cloudSkuId: Number(item.cloudSkuId || 0) || 0,
cloudSkuName: item.cloudSkuName || '',
cloudSkuId: primaryDeliveryItem?.cloudSkuId || Number(item.cloudSkuId || 0) || 0,
cloudSkuName: primaryDeliveryItem?.cloudSkuName || item.cloudSkuName || '',
deliveryItems,
vnKey: item.vnKey || '',
autoBuyEnabled: item.autoBuyEnabled !== false,
minAssetReserve: Number(item.minAssetReserve || 0) || 0,
@@ -130,6 +135,8 @@ export function useKuaishouCloudConfig() {
item.kuaishouConsumeShopName,
)
const sourceKeys = normalizeCloudSourceKeys(item.cloudSourceKeys)
const deliveryItems = normalizeDeliveryItems(item)
const primaryDeliveryItem = deliveryItems[0]
return {
id: item.id.trim() || item.internalSkuCode.trim() || item.localId,
enabled: item.enabled,
@@ -144,8 +151,9 @@ export function useKuaishouCloudConfig() {
externalSkuName: item.externalSkuName.trim(),
resolvedSkuName: item.resolvedSkuName.trim(),
cloudSourceKeys: sourceKeys,
cloudSkuId: Number(item.cloudSkuId || 0) || 0,
cloudSkuName: item.cloudSkuName.trim(),
cloudSkuId: primaryDeliveryItem?.cloudSkuId || Number(item.cloudSkuId || 0) || 0,
cloudSkuName: primaryDeliveryItem?.cloudSkuName || item.cloudSkuName.trim(),
deliveryItems,
vnKey: item.vnKey.trim(),
autoBuyEnabled: item.autoBuyEnabled,
minAssetReserve: Math.max(0, Number(item.minAssetReserve || 0) || 0),
@@ -170,6 +178,64 @@ export function useKuaishouCloudConfig() {
return normalizeCloudSourceKeys([cloudtentaclesSourceOptions.value[0]?.key])
}
function normalizeDeliveryItems(
item: Pick<EditableItem, 'deliveryItems' | 'cloudSkuId' | 'cloudSkuName'> | AdminKuaishouCloudFulfillmentItem,
): AdminKuaishouCloudDeliveryItem[] {
const rawItems = Array.isArray(item.deliveryItems) ? item.deliveryItems : []
const normalizedItems = rawItems
.map((value) => normalizeDeliveryItem(value))
.filter((value): value is AdminKuaishouCloudDeliveryItem => Boolean(value))
if (normalizedItems.length > 0) {
return mergeDeliveryItems(normalizedItems)
}
const cloudSkuId = Number(item.cloudSkuId || 0) || 0
if (cloudSkuId <= 0) {
return []
}
return [
{
cloudSkuId,
cloudSkuName: String(item.cloudSkuName || '').trim(),
quantity: 1,
},
]
}
function normalizeDeliveryItem(value: unknown): AdminKuaishouCloudDeliveryItem | null {
const source = value && typeof value === 'object' ? (value as Partial<AdminKuaishouCloudDeliveryItem>) : {}
const cloudSkuId = Number(source.cloudSkuId || 0) || 0
if (!Number.isInteger(cloudSkuId) || cloudSkuId <= 0) {
return null
}
const quantity = Number(source.quantity || 1) || 1
return {
cloudSkuId,
cloudSkuName: String(source.cloudSkuName || '').trim(),
quantity: Number.isInteger(quantity) && quantity > 0 ? quantity : 1,
}
}
function mergeDeliveryItems(items: AdminKuaishouCloudDeliveryItem[]) {
const merged = new Map<number, AdminKuaishouCloudDeliveryItem>()
for (const item of items) {
const existing = merged.get(item.cloudSkuId)
if (existing) {
existing.quantity += item.quantity
existing.cloudSkuName = existing.cloudSkuName || item.cloudSkuName
continue
}
merged.set(item.cloudSkuId, { ...item })
}
return Array.from(merged.values())
}
// ── validation helpers ────────────────────────────────
function hasExternalMatch(
@@ -191,6 +257,7 @@ export function useKuaishouCloudConfig() {
item.cloudSourceKeys.length > 0 ||
Number(item.cloudSkuId || 0) > 0 ||
item.cloudSkuName.trim() ||
normalizeDeliveryItems(item).length > 0 ||
item.vnKey.trim() ||
item.shopId.trim() ||
item.notes.trim() ||
@@ -209,9 +276,9 @@ export function useKuaishouCloudConfig() {
function isItemComplete(item: EditableItem) {
return Boolean(
item.internalSkuCode.trim() &&
item.internalSkuCode.trim() &&
item.cloudSourceKeys.length > 0 &&
Number(item.cloudSkuId || 0) > 0 &&
normalizeDeliveryItems(item).length > 0 &&
(!item.autoConsumeAfterDispatch || Boolean(item.kuaishouConsumeShopId.trim())) &&
hasExternalMatch(item),
)
@@ -232,8 +299,16 @@ export function useKuaishouCloudConfig() {
return { localId: item.localId, message: `${title} 需要选择至少一个 cloud 账号` }
}
if (Number(item.cloudSkuId || 0) <= 0) {
return { localId: item.localId, message: `${title} 需要填写 cloud SKU ID` }
const deliveryItems = normalizeDeliveryItems(item)
if (deliveryItems.length === 0) {
return { localId: item.localId, message: `${title} 需要至少配置 1 个 cloud 发货物品` }
}
const invalidDeliveryItem = deliveryItems.find(
(deliveryItem) => Number(deliveryItem.quantity || 0) <= 0,
)
if (invalidDeliveryItem) {
return { localId: item.localId, message: `${title} 的发货数量必须大于 0` }
}
if (!hasExternalMatch(item)) {
@@ -263,7 +338,7 @@ export function useKuaishouCloudConfig() {
item.provider.trim() || '91kaquan',
item.platform.trim() || 'kuaishou',
item.shopId.trim() || '跨店铺',
item.cloudSkuId > 0 ? `cloud#${item.cloudSkuId}` : '待填 cloud SKU',
getDeliveryPlanSummary(item),
]
return parts.join(' / ')
}
@@ -367,17 +442,45 @@ export function useKuaishouCloudConfig() {
}
function getCloudSkuSummary(item: EditableItem) {
if (item.cloudSkuId > 0 && item.cloudSkuName.trim()) {
return `${item.cloudSkuName.trim()} · #${item.cloudSkuId}`
const deliveryItems = normalizeDeliveryItems(item)
if (deliveryItems.length > 1) {
return `${deliveryItems.length} 个物品 / 共 ${getDeliveryTotalQuantity(item)}`
}
if (item.cloudSkuId > 0) {
return `cloud SKU #${item.cloudSkuId}`
const primaryItem = deliveryItems[0]
if (primaryItem?.cloudSkuId && primaryItem.cloudSkuName.trim()) {
const suffix = primaryItem.quantity > 1 ? ` × ${primaryItem.quantity}` : ''
return `${primaryItem.cloudSkuName.trim()} · #${primaryItem.cloudSkuId}${suffix}`
}
if (primaryItem?.cloudSkuId) {
const suffix = primaryItem.quantity > 1 ? ` × ${primaryItem.quantity}` : ''
return `cloud SKU #${primaryItem.cloudSkuId}${suffix}`
}
return '待选择 cloud SKU'
}
function getDeliveryPlanSummary(item: EditableItem) {
const deliveryItems = normalizeDeliveryItems(item)
if (deliveryItems.length === 0) {
return '待填发货物品'
}
if (deliveryItems.length === 1) {
const firstItem = deliveryItems[0]
return firstItem.quantity > 1
? `cloud#${firstItem.cloudSkuId} × ${firstItem.quantity}`
: `cloud#${firstItem.cloudSkuId}`
}
return `${deliveryItems.length} 个物品 / ${getDeliveryTotalQuantity(item)}`
}
function getDeliveryTotalQuantity(item: EditableItem) {
return normalizeDeliveryItems(item).reduce((sum, deliveryItem) => sum + deliveryItem.quantity, 0)
}
// ── collapse state ────────────────────────────────────
function isCollapsed(localId: string) {
@@ -472,6 +575,49 @@ export function useKuaishouCloudConfig() {
item.cloudSourceKeys = sourceKeys
item.cloudSkuId = 0
item.cloudSkuName = ''
item.deliveryItems = []
}
function addDeliveryItem(item: EditableItem) {
item.deliveryItems.push({
cloudSkuId: 0,
cloudSkuName: '',
quantity: 1,
})
}
function removeDeliveryItem(item: EditableItem, index: number) {
item.deliveryItems.splice(index, 1)
syncPrimaryCloudSkuFromDeliveryItems(item)
}
function syncPrimaryCloudSkuFromDeliveryItems(item: EditableItem) {
const primaryItem = normalizeDeliveryItems(item)[0]
item.cloudSkuId = primaryItem?.cloudSkuId || 0
item.cloudSkuName = primaryItem?.cloudSkuName || ''
}
function syncDeliveryItemsFromPrimaryCloudSku(item: EditableItem) {
if (Number(item.cloudSkuId || 0) <= 0) {
item.deliveryItems = []
return
}
if (item.deliveryItems.length === 0) {
item.deliveryItems.push({
cloudSkuId: item.cloudSkuId,
cloudSkuName: item.cloudSkuName,
quantity: 1,
})
return
}
item.deliveryItems[0] = {
...item.deliveryItems[0],
cloudSkuId: item.cloudSkuId,
cloudSkuName: item.cloudSkuName,
quantity: Math.max(1, Number(item.deliveryItems[0].quantity || 1) || 1),
}
}
async function focusValidationTarget(localId: string) {
@@ -559,6 +705,7 @@ export function useKuaishouCloudConfig() {
getCloudSkuSummary,
getCloudSourceSummary,
getConsumeShopSummary,
getDeliveryPlanSummary,
// consume shops
getKuaishouConsumeShopOptions,
findKuaishouConsumeShop,
@@ -566,6 +713,10 @@ export function useKuaishouCloudConfig() {
formatKuaishouConsumeShopOption,
handleKuaishouConsumeShopSelected,
handleCloudSourceKeysChanged,
addDeliveryItem,
removeDeliveryItem,
syncPrimaryCloudSkuFromDeliveryItems,
syncDeliveryItemsFromPrimaryCloudSku,
// collapse
isCollapsed,
setCollapsed,
@@ -62,6 +62,7 @@ export function useKuaishouCloudNinetyone(
cloudSourceKeys: sourceKeys,
cloudSkuId: 0,
cloudSkuName: '',
deliveryItems: [],
vnKey: '1',
autoBuyEnabled: true,
minAssetReserve: 0,
@@ -2,7 +2,7 @@ import { ref } from 'vue'
import { showError, showSuccess } from '@/lib/feedback'
import { fetchAdminCloudtentaclesSkuList } from '@/services/admin'
import type { AdminCloudtentaclesSkuItem } from '@/types/admin'
import type { AdminCloudtentaclesSkuItem, AdminKuaishouCloudDeliveryItem } from '@/types/admin'
import type { EditableItem } from './types'
@@ -86,9 +86,8 @@ export function useKuaishouCloudSku(cloudtentaclesSourceOptions?: { value: { key
const sourceKey = getSourceKey(item)
const catalog = cloudSkuCatalogBySourceKey.value[sourceKey] || []
const keyword = getCloudSkuKeyword(item)
const scored = catalog
return catalog
.map((sku) => ({ sku, score: scoreCloudSkuMatch(sku, keyword) }))
.filter((entry) => entry.score > 0 || entry.sku.id === Number(item.cloudSkuId || 0))
.sort((left, right) => {
if (right.score !== left.score) {
return right.score - left.score
@@ -97,12 +96,6 @@ export function useKuaishouCloudSku(cloudtentaclesSourceOptions?: { value: { key
return left.sku.name.localeCompare(right.sku.name, 'zh-CN')
})
.map((entry) => entry.sku)
if (scored.length > 0) {
return scored.slice(0, 80)
}
return catalog.slice(0, 80)
}
function formatCloudSkuOptionLabel(item: AdminCloudtentaclesSkuItem) {
@@ -126,6 +119,25 @@ export function useKuaishouCloudSku(cloudtentaclesSourceOptions?: { value: { key
item.cloudSkuName = matched?.name || item.cloudSkuName || ''
}
function handleDeliveryItemCloudSkuSelected(
item: EditableItem,
deliveryItem: AdminKuaishouCloudDeliveryItem,
value: number | string | undefined,
) {
const skuId = Number(value || 0)
deliveryItem.cloudSkuId = Number.isInteger(skuId) && skuId > 0 ? skuId : 0
if (!deliveryItem.cloudSkuId) {
deliveryItem.cloudSkuName = ''
return
}
const sourceKey = getSourceKey(item)
const catalog = cloudSkuCatalogBySourceKey.value[sourceKey] || []
const matched = catalog.find((sku) => sku.id === deliveryItem.cloudSkuId)
deliveryItem.cloudSkuName = matched?.name || deliveryItem.cloudSkuName || ''
}
async function handleCloudSkuDropdownVisible(item: EditableItem, visible: boolean) {
if (!visible) {
return
@@ -185,6 +197,7 @@ export function useKuaishouCloudSku(cloudtentaclesSourceOptions?: { value: { key
getCloudSkuOptions,
formatCloudSkuOptionLabel,
handleCloudSkuSelected,
handleDeliveryItemCloudSkuSelected,
handleCloudSkuDropdownVisible,
refreshCloudSkuCatalog,
syncCloudSkuCatalogLoading,