履约配置优化
This commit is contained in:
@@ -4,9 +4,7 @@ import { computed, nextTick, onMounted, reactive, ref } from 'vue'
|
||||
import { showSuccess } from '@/lib/feedback'
|
||||
import {
|
||||
fetchAdminFulfillmentBindingConfigs,
|
||||
fetchAdminKhhaoSourceConfig,
|
||||
fetchAdminKuaishouEticketSourceConfig,
|
||||
queryAdminKhhaoOrders,
|
||||
lookupAdminFulfillmentBindingOrder,
|
||||
saveAdminFulfillmentBindingConfigs,
|
||||
} from '@/services/admin'
|
||||
@@ -14,7 +12,6 @@ import type {
|
||||
AdminFulfillmentBindingConfigItem,
|
||||
AdminFulfillmentLookupItem,
|
||||
AdminFulfillmentLookupResult,
|
||||
AdminKhhaoOrderPreview,
|
||||
AdminKuaishouEticketShopConfigItem,
|
||||
AdminObservedProductItem,
|
||||
} from '@/types/admin'
|
||||
@@ -93,18 +90,6 @@ const lookupForm = reactive({
|
||||
shopId: '',
|
||||
platformOrderId: '',
|
||||
})
|
||||
const khhaoLookupLoading = ref(false)
|
||||
const khhaoLookupErrorMessage = ref('')
|
||||
const khhaoLookupResults = ref<AdminKhhaoOrderPreview[]>([])
|
||||
const importedKhhaoOrderIds = ref<string[]>([])
|
||||
const khhaoLookupForm = reactive({
|
||||
baseUrl: 'https://admin.khhao.com',
|
||||
username: '',
|
||||
password: '',
|
||||
page: 1,
|
||||
limit: 10,
|
||||
maxCaptchaAttempts: 3,
|
||||
})
|
||||
|
||||
const ruleMetrics = computed(() => {
|
||||
const completedCount = bindings.value.filter(isEditableBindingComplete).length
|
||||
@@ -288,9 +273,8 @@ async function loadConfigs() {
|
||||
errorMessage.value = ''
|
||||
|
||||
try {
|
||||
const [response, khhaoSourceResponse, kuaishouSourceResponse] = await Promise.all([
|
||||
const [response, kuaishouSourceResponse] = await Promise.all([
|
||||
fetchAdminFulfillmentBindingConfigs(),
|
||||
fetchAdminKhhaoSourceConfig(),
|
||||
fetchAdminKuaishouEticketSourceConfig(),
|
||||
])
|
||||
filePath.value = response.data.filePath
|
||||
@@ -299,10 +283,6 @@ async function loadConfigs() {
|
||||
bindings.value = nextBindings
|
||||
collapsedBindingIds.value = buildCollapsedIds(nextBindings)
|
||||
observedProducts.value = response.data.observedProducts
|
||||
khhaoLookupForm.baseUrl = khhaoSourceResponse.data.source.baseUrl || 'https://admin.khhao.com'
|
||||
khhaoLookupForm.username = khhaoSourceResponse.data.source.username || ''
|
||||
khhaoLookupForm.password = khhaoSourceResponse.data.source.password || ''
|
||||
khhaoLookupForm.maxCaptchaAttempts = khhaoSourceResponse.data.source.maxCaptchaAttempts || 3
|
||||
} catch (error) {
|
||||
errorMessage.value = error instanceof Error ? error.message : '读取履约配置失败'
|
||||
} finally {
|
||||
@@ -366,29 +346,6 @@ function isLookupProductImported(lineId: string) {
|
||||
return importedLookupLineIds.value.includes(lineId)
|
||||
}
|
||||
|
||||
function importKhhaoProduct(item: AdminKhhaoOrderPreview) {
|
||||
importObservedProduct({
|
||||
provider: item.provider || 'khhao',
|
||||
platform: item.platform || 'unknown',
|
||||
shopId: isKhhaoKuaishouBinding({ provider: item.provider || 'khhao', platform: item.platform || 'unknown' })
|
||||
? (item.kuaishouShopId || resolveKuaishouShopByName(item.shopName)?.shopId || '')
|
||||
: item.shopId,
|
||||
shopName: item.shopName,
|
||||
khhaoShopId: item.khhaoShopId || item.shopId,
|
||||
externalSkuCode: item.skuCode,
|
||||
externalItemId: item.itemId,
|
||||
externalSkuName: item.itemTitle,
|
||||
})
|
||||
|
||||
if (!importedKhhaoOrderIds.value.includes(item.platformOrderId)) {
|
||||
importedKhhaoOrderIds.value = [...importedKhhaoOrderIds.value, item.platformOrderId]
|
||||
}
|
||||
}
|
||||
|
||||
function isKhhaoProductImported(platformOrderId: string) {
|
||||
return importedKhhaoOrderIds.value.includes(platformOrderId)
|
||||
}
|
||||
|
||||
function normalizeBindingForSave(item: EditableBinding): SaveBindingPayload {
|
||||
syncBindingShopSelection(item)
|
||||
|
||||
@@ -615,34 +572,6 @@ async function lookupOrderProducts() {
|
||||
}
|
||||
}
|
||||
|
||||
async function lookupKhhaoProducts() {
|
||||
if (!khhaoLookupForm.username.trim() || !khhaoLookupForm.password.trim()) {
|
||||
khhaoLookupErrorMessage.value = '请先填写 khhao 账号和密码'
|
||||
return
|
||||
}
|
||||
|
||||
khhaoLookupLoading.value = true
|
||||
khhaoLookupErrorMessage.value = ''
|
||||
|
||||
try {
|
||||
const response = await queryAdminKhhaoOrders({
|
||||
baseUrl: khhaoLookupForm.baseUrl.trim() || 'https://admin.khhao.com',
|
||||
username: khhaoLookupForm.username.trim(),
|
||||
password: khhaoLookupForm.password.trim(),
|
||||
page: Number(khhaoLookupForm.page || 1),
|
||||
limit: Number(khhaoLookupForm.limit || 10),
|
||||
maxCaptchaAttempts: Number(khhaoLookupForm.maxCaptchaAttempts || 3),
|
||||
})
|
||||
khhaoLookupResults.value = response.data.items
|
||||
importedKhhaoOrderIds.value = []
|
||||
} catch (error) {
|
||||
khhaoLookupResults.value = []
|
||||
khhaoLookupErrorMessage.value = error instanceof Error ? error.message : 'khhao 订单查询失败'
|
||||
} finally {
|
||||
khhaoLookupLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(loadConfigs)
|
||||
</script>
|
||||
|
||||
@@ -938,113 +867,6 @@ onMounted(loadConfigs)
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="table-card table-card--dense">
|
||||
<div class="section-title-row section-title-row--tight">
|
||||
<div>
|
||||
<h3>khhao 订单取样导入</h3>
|
||||
<p>先用 khhao 账号查订单样本,再直接把商品导入成规则草稿,适合首批建规则。</p>
|
||||
</div>
|
||||
<span class="section-note-chip">khhao / kuaishou</span>
|
||||
</div>
|
||||
|
||||
<div class="khhao-toolbar">
|
||||
<label class="field-block field-wide">
|
||||
<span>Base URL</span>
|
||||
<input v-model="khhaoLookupForm.baseUrl" class="text-input" placeholder="https://admin.khhao.com" />
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>账号</span>
|
||||
<input v-model="khhaoLookupForm.username" class="text-input" placeholder="khhao 登录账号" />
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>密码</span>
|
||||
<input v-model="khhaoLookupForm.password" class="text-input" type="password" placeholder="khhao 登录密码" />
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>页码</span>
|
||||
<input v-model.number="khhaoLookupForm.page" class="text-input" type="number" min="1" />
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>每页条数</span>
|
||||
<input v-model.number="khhaoLookupForm.limit" class="text-input" type="number" min="1" max="50" />
|
||||
</label>
|
||||
|
||||
<label class="field-block">
|
||||
<span>验证码重试</span>
|
||||
<input v-model.number="khhaoLookupForm.maxCaptchaAttempts" class="text-input" type="number" min="1" max="5" />
|
||||
</label>
|
||||
|
||||
<div class="field-block field-block--action">
|
||||
<span>操作</span>
|
||||
<el-button :loading="khhaoLookupLoading" round type="primary" @click="lookupKhhaoProducts">查询 khhao 订单</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="toolbar-hint">这里直接读取 khhao 订单列表,不写库,只用于导入规则草稿。</p>
|
||||
<p v-if="khhaoLookupErrorMessage" class="error-copy lookup-error">{{ khhaoLookupErrorMessage }}</p>
|
||||
<div v-else-if="khhaoLookupLoading" class="empty-inline">正在查询 khhao 订单…</div>
|
||||
|
||||
<table v-else class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>订单</th>
|
||||
<th>店铺</th>
|
||||
<th>商品</th>
|
||||
<th>金额 / 状态</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="item in khhaoLookupResults" :key="`${item.platformOrderId}:${item.skuCode}:${item.itemId}`">
|
||||
<td>
|
||||
<div class="cell-stack">
|
||||
<strong>{{ item.platformOrderId }}</strong>
|
||||
<span class="cell-subtle">{{ item.platformLabel || item.platform || '-' }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="cell-stack">
|
||||
<strong>{{ item.shopName || item.shopId || '-' }}</strong>
|
||||
<span class="cell-subtle">khhao ID: {{ item.khhaoShopId || item.shopId || '-' }}</span>
|
||||
<span v-if="item.kuaishouShopId" class="cell-subtle">快手 ID: {{ item.kuaishouShopId }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="cell-stack">
|
||||
<strong>{{ item.itemTitle || '-' }}</strong>
|
||||
<span class="cell-subtle">SKU: {{ item.skuCode || '-' }}</span>
|
||||
<span class="cell-subtle">ItemId: {{ item.itemId || '-' }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="cell-stack">
|
||||
<strong>{{ (item.totalAmountFen / 100).toFixed(2) }}</strong>
|
||||
<span class="cell-subtle">{{ item.statusLabel || item.status || '-' }}</span>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<el-button
|
||||
v-if="!isKhhaoProductImported(item.platformOrderId)"
|
||||
link
|
||||
type="primary"
|
||||
@click="importKhhaoProduct(item)"
|
||||
>
|
||||
导入到规则
|
||||
</el-button>
|
||||
<span v-else class="cell-subtle">已导入草稿</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-if="khhaoLookupResults.length === 0">
|
||||
<td colspan="5" class="empty-inline">还没有 khhao 查询结果。</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section class="table-card table-card--dense">
|
||||
<div class="section-title-row section-title-row--tight">
|
||||
<div>
|
||||
|
||||
Reference in New Issue
Block a user