移除了 khhao 平台相关
This commit is contained in:
@@ -4,7 +4,6 @@ import { computed, nextTick, onMounted, reactive, ref } from 'vue'
|
||||
import { showSuccess } from '@/lib/feedback'
|
||||
import {
|
||||
fetchAdminFulfillmentBindingConfigs,
|
||||
fetchAdminKuaishouEticketSourceConfig,
|
||||
lookupAdminFulfillmentBindingOrder,
|
||||
saveAdminFulfillmentBindingConfigs,
|
||||
} from '@/services/admin'
|
||||
@@ -12,7 +11,6 @@ import type {
|
||||
AdminFulfillmentBindingConfigItem,
|
||||
AdminFulfillmentLookupItem,
|
||||
AdminFulfillmentLookupResult,
|
||||
AdminKuaishouEticketShopConfigItem,
|
||||
AdminObservedProductItem,
|
||||
} from '@/types/admin'
|
||||
import { hasAdminRole } from '@/utils/admin-auth'
|
||||
@@ -24,7 +22,6 @@ type EditableBinding = {
|
||||
platform: string
|
||||
shopId: string
|
||||
shopName: string
|
||||
khhaoShopId: string
|
||||
skuCode: string
|
||||
skuName: string
|
||||
profileKey: string
|
||||
@@ -41,7 +38,6 @@ type SaveBindingPayload = {
|
||||
platform: string
|
||||
shopId: string
|
||||
shopName: string
|
||||
khhaoShopId: string
|
||||
skuCode: string
|
||||
skuName: string
|
||||
profileKey: string
|
||||
@@ -57,7 +53,7 @@ type SaveBindingPayload = {
|
||||
}
|
||||
}
|
||||
|
||||
type ValidationField = 'skuCode' | 'match' | 'profileKey' | 'shopId' | 'khhaoShopId'
|
||||
type ValidationField = 'skuCode' | 'match' | 'profileKey' | 'shopId'
|
||||
|
||||
type ValidationState = {
|
||||
bindingId: string
|
||||
@@ -78,7 +74,6 @@ const errorMessage = ref('')
|
||||
const filePath = ref('')
|
||||
const bindings = ref<EditableBinding[]>([])
|
||||
const observedProducts = ref<AdminObservedProductItem[]>([])
|
||||
const kuaishouShopOptions = ref<AdminKuaishouEticketShopConfigItem[]>([])
|
||||
const lookupLoading = ref(false)
|
||||
const lookupErrorMessage = ref('')
|
||||
const lookupResult = ref<AdminFulfillmentLookupResult | null>(null)
|
||||
@@ -113,7 +108,6 @@ type ImportableProductCandidate = Pick<
|
||||
AdminObservedProductItem,
|
||||
'provider' | 'platform' | 'shopId' | 'shopName' | 'externalSkuCode' | 'externalItemId' | 'externalSkuName'
|
||||
> & {
|
||||
khhaoShopId?: string
|
||||
}
|
||||
|
||||
function createEmptyBinding(): EditableBinding {
|
||||
@@ -123,7 +117,6 @@ function createEmptyBinding(): EditableBinding {
|
||||
platform: '',
|
||||
shopId: '',
|
||||
shopName: '',
|
||||
khhaoShopId: '',
|
||||
skuCode: '',
|
||||
skuName: '',
|
||||
profileKey: 'manual_review',
|
||||
@@ -137,14 +130,12 @@ function createEmptyBinding(): EditableBinding {
|
||||
}
|
||||
|
||||
function mapEditableBinding(item: AdminFulfillmentBindingConfigItem): EditableBinding {
|
||||
const matchedShop = resolveKuaishouShopById(item.shopId) || resolveKuaishouShopByName(item.shopName || '')
|
||||
const binding = {
|
||||
return {
|
||||
id: crypto.randomUUID(),
|
||||
provider: item.provider || 'agiso',
|
||||
platform: item.platform,
|
||||
shopId: matchedShop?.shopId || item.shopId,
|
||||
shopName: item.shopName || matchedShop?.kshopName || '',
|
||||
khhaoShopId: item.khhaoShopId || '',
|
||||
shopId: item.shopId,
|
||||
shopName: item.shopName || '',
|
||||
skuCode: item.skuCode,
|
||||
skuName: item.skuName,
|
||||
profileKey: item.profileKey || 'manual_review',
|
||||
@@ -155,9 +146,6 @@ function mapEditableBinding(item: AdminFulfillmentBindingConfigItem): EditableBi
|
||||
externalSkuName: item.match.externalSkuName,
|
||||
resolvedSkuName: String(item.match.config?.resolvedSkuName || ''),
|
||||
}
|
||||
|
||||
syncBindingShopSelection(binding)
|
||||
return binding
|
||||
}
|
||||
|
||||
function hasMatchCondition(item: Pick<EditableBinding, 'externalSkuCode' | 'externalItemId' | 'externalSkuName'>) {
|
||||
@@ -205,64 +193,16 @@ function getBindingStatusLabel(binding: EditableBinding) {
|
||||
}
|
||||
|
||||
function getBindingSummary(binding: EditableBinding) {
|
||||
const shopLabel = isKhhaoKuaishouBinding(binding)
|
||||
? [
|
||||
binding.shopName.trim() || binding.shopId.trim() || '未选快手店铺',
|
||||
binding.khhaoShopId.trim() ? `khhao#${binding.khhaoShopId.trim()}` : '',
|
||||
].filter(Boolean).join(' / ')
|
||||
: (binding.shopName.trim() || binding.shopId.trim() || '跨店铺')
|
||||
const parts = [
|
||||
binding.provider.trim() || 'agiso',
|
||||
binding.platform.trim() || '未选平台',
|
||||
shopLabel,
|
||||
binding.shopName.trim() || binding.shopId.trim() || '跨店铺',
|
||||
binding.profileKey.trim() || 'manual_review',
|
||||
]
|
||||
|
||||
return parts.join(' / ')
|
||||
}
|
||||
|
||||
function isKhhaoKuaishouBinding(binding: Pick<EditableBinding, 'provider' | 'platform'>) {
|
||||
return binding.provider.trim() === 'khhao' && binding.platform.trim() === 'kuaishou'
|
||||
}
|
||||
|
||||
function resolveKuaishouShopById(shopId: string) {
|
||||
const normalizedShopId = shopId.trim()
|
||||
return kuaishouShopOptions.value.find((item) => item.shopId === normalizedShopId) || null
|
||||
}
|
||||
|
||||
function resolveKuaishouShopByName(shopName: string) {
|
||||
const normalizedShopName = shopName.trim()
|
||||
return kuaishouShopOptions.value.find((item) => item.kshopName === normalizedShopName) || null
|
||||
}
|
||||
|
||||
function getKuaishouShopOptionLabel(item: AdminKuaishouEticketShopConfigItem) {
|
||||
return item.kshopName.trim()
|
||||
? `${item.kshopName} (${item.shopId})`
|
||||
: item.shopId
|
||||
}
|
||||
|
||||
function syncBindingShopSelection(binding: EditableBinding) {
|
||||
if (!isKhhaoKuaishouBinding(binding)) {
|
||||
return
|
||||
}
|
||||
|
||||
const matchedById = resolveKuaishouShopById(binding.shopId)
|
||||
if (matchedById) {
|
||||
binding.shopId = matchedById.shopId
|
||||
binding.shopName = matchedById.kshopName
|
||||
return
|
||||
}
|
||||
|
||||
const matchedByName = resolveKuaishouShopByName(binding.shopName)
|
||||
if (matchedByName) {
|
||||
binding.shopId = matchedByName.shopId
|
||||
binding.shopName = matchedByName.kshopName
|
||||
return
|
||||
}
|
||||
|
||||
binding.shopId = ''
|
||||
}
|
||||
|
||||
async function loadConfigs() {
|
||||
if (!hasAdminRole('admin')) {
|
||||
loading.value = false
|
||||
@@ -273,12 +213,8 @@ async function loadConfigs() {
|
||||
errorMessage.value = ''
|
||||
|
||||
try {
|
||||
const [response, kuaishouSourceResponse] = await Promise.all([
|
||||
fetchAdminFulfillmentBindingConfigs(),
|
||||
fetchAdminKuaishouEticketSourceConfig(),
|
||||
])
|
||||
const response = await fetchAdminFulfillmentBindingConfigs()
|
||||
filePath.value = response.data.filePath
|
||||
kuaishouShopOptions.value = kuaishouSourceResponse.data.source.shops.filter((item) => item.enabled !== false)
|
||||
const nextBindings = response.data.bindings.map(mapEditableBinding)
|
||||
bindings.value = nextBindings
|
||||
collapsedBindingIds.value = buildCollapsedIds(nextBindings)
|
||||
@@ -312,7 +248,6 @@ function createBindingFromProductCandidate(item: ImportableProductCandidate): Ed
|
||||
platform: item.platform,
|
||||
shopId: item.shopId,
|
||||
shopName: item.shopName,
|
||||
khhaoShopId: item.khhaoShopId || '',
|
||||
skuCode: '',
|
||||
skuName: item.externalSkuName,
|
||||
profileKey: 'manual_review',
|
||||
@@ -324,7 +259,6 @@ function createBindingFromProductCandidate(item: ImportableProductCandidate): Ed
|
||||
resolvedSkuName: item.externalSkuName,
|
||||
}
|
||||
|
||||
syncBindingShopSelection(binding)
|
||||
return binding
|
||||
}
|
||||
|
||||
@@ -347,14 +281,11 @@ function isLookupProductImported(lineId: string) {
|
||||
}
|
||||
|
||||
function normalizeBindingForSave(item: EditableBinding): SaveBindingPayload {
|
||||
syncBindingShopSelection(item)
|
||||
|
||||
return {
|
||||
provider: item.provider.trim() || 'agiso',
|
||||
platform: item.platform.trim(),
|
||||
shopId: item.shopId.trim(),
|
||||
shopName: item.shopName.trim(),
|
||||
khhaoShopId: item.khhaoShopId.trim(),
|
||||
skuCode: item.skuCode.trim(),
|
||||
skuName: item.skuName.trim(),
|
||||
profileKey: item.profileKey.trim() || 'manual_review',
|
||||
@@ -376,7 +307,6 @@ function hasBindingContent(item: SaveBindingPayload) {
|
||||
item.platform
|
||||
|| item.shopId
|
||||
|| item.shopName
|
||||
|| item.khhaoShopId
|
||||
|| item.skuCode
|
||||
|| item.skuName
|
||||
|| item.match.externalSkuCode
|
||||
@@ -392,24 +322,6 @@ function hasBindingContent(item: SaveBindingPayload) {
|
||||
|
||||
function resolveBindingValidationState(item: SaveBindingPayload, index: number, bindingId: string): ValidationState {
|
||||
const label = `第 ${index + 1} 条规则`
|
||||
const provider = item.provider.trim() || 'agiso'
|
||||
const platform = item.platform.trim()
|
||||
|
||||
if (provider === 'khhao' && platform === 'kuaishou' && (!item.shopId || !item.shopName)) {
|
||||
return {
|
||||
bindingId,
|
||||
field: 'shopId',
|
||||
message: `${label} 需要选择已配置的快手官方店铺`,
|
||||
}
|
||||
}
|
||||
|
||||
if (provider === 'khhao' && platform === 'kuaishou' && !item.khhaoShopId) {
|
||||
return {
|
||||
bindingId,
|
||||
field: 'khhaoShopId',
|
||||
message: `${label} 需要填写 khhao 店铺 ID`,
|
||||
}
|
||||
}
|
||||
|
||||
if (!item.skuCode) {
|
||||
return {
|
||||
@@ -454,7 +366,6 @@ async function focusValidationTarget(state: ValidationState) {
|
||||
card.scrollIntoView({ behavior: 'smooth', block: 'center' })
|
||||
|
||||
const selectors: Record<ValidationField, string> = {
|
||||
khhaoShopId: '[data-field="khhaoShopId"]',
|
||||
shopId: '[data-field="shopId"]',
|
||||
skuCode: '[data-field="skuCode"]',
|
||||
match: '[data-field="externalSkuCode"]',
|
||||
@@ -485,16 +396,6 @@ function isFieldInvalid(bindingId: string, field: ValidationField | 'externalSku
|
||||
return validationState.value.field === field
|
||||
}
|
||||
|
||||
function handleBindingProviderPlatformChange(binding: EditableBinding) {
|
||||
syncBindingShopSelection(binding)
|
||||
clearValidationState()
|
||||
}
|
||||
|
||||
function handleKuaishouShopChange(binding: EditableBinding) {
|
||||
syncBindingShopSelection(binding)
|
||||
clearValidationState()
|
||||
}
|
||||
|
||||
async function saveConfigs() {
|
||||
const normalizedBindings = bindings.value.map(normalizeBindingForSave)
|
||||
const nonEmptyBindings = normalizedBindings.filter(hasBindingContent)
|
||||
@@ -694,7 +595,7 @@ onMounted(loadConfigs)
|
||||
v-model="binding.provider"
|
||||
class="text-input"
|
||||
placeholder="agiso"
|
||||
@input="handleBindingProviderPlatformChange(binding)"
|
||||
@input="clearValidationState"
|
||||
/>
|
||||
</label>
|
||||
|
||||
@@ -704,76 +605,30 @@ onMounted(loadConfigs)
|
||||
v-model="binding.platform"
|
||||
class="text-input"
|
||||
placeholder="xianyu / taobao / pdd"
|
||||
@input="handleBindingProviderPlatformChange(binding)"
|
||||
@input="clearValidationState"
|
||||
/>
|
||||
</label>
|
||||
|
||||
<template v-if="isKhhaoKuaishouBinding(binding)">
|
||||
<label class="field-block">
|
||||
<span>khhao 店铺 ID</span>
|
||||
<input
|
||||
v-model="binding.khhaoShopId"
|
||||
:class="['text-input', { 'text-input--invalid': isFieldInvalid(binding.id, 'khhaoShopId') }]"
|
||||
data-field="khhaoShopId"
|
||||
placeholder="例如 12 / 13 / 14"
|
||||
@input="clearValidationState"
|
||||
/>
|
||||
<small class="field-help">这里填 khhao 系统里的店铺编号,专门用于同步订单命中规则。</small>
|
||||
</label>
|
||||
<label class="field-block">
|
||||
<span>店铺 ID</span>
|
||||
<input
|
||||
v-model="binding.shopId"
|
||||
:class="['text-input', { 'text-input--invalid': isFieldInvalid(binding.id, 'shopId') }]"
|
||||
data-field="shopId"
|
||||
placeholder="留空表示跨店铺通用"
|
||||
@input="clearValidationState"
|
||||
/>
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>快手店铺</span>
|
||||
<select
|
||||
v-model="binding.shopId"
|
||||
:class="['text-input', { 'text-input--invalid': isFieldInvalid(binding.id, 'shopId') }]"
|
||||
data-field="shopId"
|
||||
@change="handleKuaishouShopChange(binding)"
|
||||
>
|
||||
<option value="">请选择已配置的快手官方店铺</option>
|
||||
<option
|
||||
v-for="shop in kuaishouShopOptions"
|
||||
:key="shop.shopId"
|
||||
:value="shop.shopId"
|
||||
>
|
||||
{{ getKuaishouShopOptionLabel(shop) }}
|
||||
</option>
|
||||
</select>
|
||||
<small class="field-help">这里会直接写入快手官方店铺 ID,不再使用 khhao 内部店铺编号。</small>
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>快手店铺名</span>
|
||||
<input
|
||||
:value="binding.shopName || ''"
|
||||
class="text-input text-input--readonly"
|
||||
placeholder="选择店铺后自动带出"
|
||||
readonly
|
||||
/>
|
||||
</label>
|
||||
</template>
|
||||
|
||||
<template v-else>
|
||||
<label class="field-block">
|
||||
<span>店铺 ID</span>
|
||||
<input
|
||||
v-model="binding.shopId"
|
||||
:class="['text-input', { 'text-input--invalid': isFieldInvalid(binding.id, 'shopId') }]"
|
||||
data-field="shopId"
|
||||
placeholder="留空表示跨店铺通用"
|
||||
@input="clearValidationState"
|
||||
/>
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>店铺名称</span>
|
||||
<input
|
||||
v-model="binding.shopName"
|
||||
class="text-input"
|
||||
placeholder="用于保存和识别店铺"
|
||||
@input="clearValidationState"
|
||||
/>
|
||||
</label>
|
||||
</template>
|
||||
<label class="field-block">
|
||||
<span>店铺名称</span>
|
||||
<input
|
||||
v-model="binding.shopName"
|
||||
class="text-input"
|
||||
placeholder="用于保存和识别店铺"
|
||||
@input="clearValidationState"
|
||||
/>
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>优先级</span>
|
||||
@@ -1213,7 +1068,6 @@ onMounted(loadConfigs)
|
||||
}
|
||||
|
||||
.lookup-toolbar,
|
||||
.khhao-toolbar,
|
||||
.lookup-summary {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
@@ -1224,11 +1078,6 @@ onMounted(loadConfigs)
|
||||
align-items: end;
|
||||
}
|
||||
|
||||
.khhao-toolbar {
|
||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
||||
align-items: end;
|
||||
}
|
||||
|
||||
.field-block--action :deep(.el-button) {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user