订单比对加上状态
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
已扫描 {{ progress.scanned || 0 }}
|
||||
/ 本地已有 {{ progress.matched || 0 }}
|
||||
/ 本地缺失 {{ progress.missing || 0 }}
|
||||
/ 状态不一致 {{ progress.statusMismatch || 0 }}
|
||||
</div>
|
||||
<div v-if="progress.message" class="msg-line">{{ progress.message }}</div>
|
||||
<div v-if="progress.error" class="err-line">{{ progress.error }}</div>
|
||||
@@ -40,7 +41,7 @@
|
||||
type="info"
|
||||
:closable="false"
|
||||
show-icon
|
||||
title="仅比对转单号:上游 TRANSFER_ORDER_ID 有、本地 transfer_no 没有。异步分页扫描,结果已写入操作记录。"
|
||||
title="比对转单号 + 订单状态:1) 上游有转单号、本地没有;2) 两端都有但 order_status 不一致。异步分页扫描,结果已写入操作记录。"
|
||||
/>
|
||||
|
||||
<div class="json-panel__head">
|
||||
@@ -57,6 +58,18 @@
|
||||
<el-table-column prop="transferNo" label="转单号" min-width="220" show-overflow-tooltip />
|
||||
</el-table>
|
||||
<el-empty v-if="!running && !(progress.missingTransferNos || []).length" description="暂无缺失转单号" />
|
||||
|
||||
<div class="json-panel__head">
|
||||
<span>状态不一致(样本)</span>
|
||||
</div>
|
||||
<el-table :data="statusMismatchRows" border size="small" max-height="280" class="mb12">
|
||||
<el-table-column type="index" width="55" label="#" />
|
||||
<el-table-column prop="transferNo" label="转单号" min-width="180" show-overflow-tooltip />
|
||||
<el-table-column prop="upstreamStatusLabel" label="上游状态" width="110" />
|
||||
<el-table-column prop="localStatusLabel" label="本地状态" width="110" />
|
||||
</el-table>
|
||||
<el-empty v-if="!running && !(progress.statusMismatchSamples || []).length" description="暂无状态不一致" />
|
||||
|
||||
</div>
|
||||
</el-drawer>
|
||||
</template>
|
||||
@@ -121,6 +134,35 @@ const progressStatus = computed(() => {
|
||||
return undefined
|
||||
})
|
||||
|
||||
const orderStatusMap = {
|
||||
'0': '待提货',
|
||||
'1': '已提货',
|
||||
'2': '已收货',
|
||||
'3': '运输中',
|
||||
'4': '派送中',
|
||||
'5': '已签收',
|
||||
'6': '已完成',
|
||||
'7': '已取消',
|
||||
'8': '异常',
|
||||
'9': '退件中',
|
||||
'10': '已退件'
|
||||
}
|
||||
|
||||
function labelStatus(v) {
|
||||
const k = v == null ? '' : String(v).trim()
|
||||
if (!k) return '-'
|
||||
return orderStatusMap[k] || k
|
||||
}
|
||||
|
||||
const statusMismatchRows = computed(() => {
|
||||
const list = progress.value?.statusMismatchSamples || []
|
||||
return list.map(row => ({
|
||||
transferNo: row.transferNo || row.transfer_no || '',
|
||||
upstreamStatusLabel: labelStatus(row.upstreamStatus ?? row.upstream_status),
|
||||
localStatusLabel: labelStatus(row.localStatus ?? row.local_status)
|
||||
}))
|
||||
})
|
||||
|
||||
const missingRows = computed(() => {
|
||||
const list = progress.value?.missingTransferNos || []
|
||||
return list.map(tn => ({ transferNo: tn }))
|
||||
|
||||
@@ -375,7 +375,7 @@ function openOrderCompare() {
|
||||
return
|
||||
}
|
||||
proxy.$modal.confirm(
|
||||
'将按当前客户与提货时间,异步分页比对上游转单号与本地订单库(仅转单号),确认继续?',
|
||||
'将按当前客户与提货时间,异步分页比对上游转单号与订单状态(缺失转单号 + 状态不一致),确认继续?',
|
||||
'二次确认'
|
||||
).then(() => {
|
||||
// 比对只按客户+时间;不带单号框内容(回填后可能有数千转单号,带上会把比对拖死)
|
||||
|
||||
@@ -83,6 +83,32 @@
|
||||
remote-search
|
||||
/>
|
||||
</template>
|
||||
<template #search-orderStatuses="{ model }">
|
||||
<el-select
|
||||
v-model="model.orderStatuses"
|
||||
multiple
|
||||
filterable
|
||||
clearable
|
||||
collapse-tags
|
||||
collapse-tags-tooltip
|
||||
placeholder="请选择"
|
||||
style="width: 100%"
|
||||
>
|
||||
<template #header>
|
||||
<el-checkbox
|
||||
:model-value="isAllSelected(model, 'orderStatuses', orderStatusAllValues)"
|
||||
:indeterminate="isIndeterminate(model, 'orderStatuses', orderStatusAllValues)"
|
||||
@change="(checked) => toggleAllSelected(model, 'orderStatuses', orderStatusAllValues, checked)"
|
||||
>全选</el-checkbox>
|
||||
</template>
|
||||
<el-option
|
||||
v-for="opt in orderStatusOptions"
|
||||
:key="opt.value"
|
||||
:label="opt.label"
|
||||
:value="opt.value"
|
||||
/>
|
||||
</el-select>
|
||||
</template>
|
||||
<template #search-billingFailStatuses="{ model }">
|
||||
<el-select
|
||||
v-model="model.billingFailStatuses"
|
||||
@@ -96,9 +122,9 @@
|
||||
>
|
||||
<template #header>
|
||||
<el-checkbox
|
||||
:model-value="isAllBillingFailSelected(model)"
|
||||
:indeterminate="isBillingFailIndeterminate(model)"
|
||||
@change="(checked) => toggleAllBillingFail(model, checked)"
|
||||
:model-value="isAllSelected(model, 'billingFailStatuses', billingFailAllValues)"
|
||||
:indeterminate="isIndeterminate(model, 'billingFailStatuses', billingFailAllValues)"
|
||||
@change="(checked) => toggleAllSelected(model, 'billingFailStatuses', billingFailAllValues, checked)"
|
||||
>全选</el-checkbox>
|
||||
</template>
|
||||
<el-option
|
||||
@@ -259,27 +285,37 @@ const billingFailStatusOptions = [
|
||||
{ label: '未知失败', value: 22 }
|
||||
]
|
||||
|
||||
const orderStatusAllValues = computed(() => orderStatusOptions.map(o => o.value))
|
||||
const billingFailAllValues = computed(() => billingFailStatusOptions.map(o => o.value))
|
||||
|
||||
function selectedBillingFailStatuses(model) {
|
||||
return Array.isArray(model?.billingFailStatuses) ? model.billingFailStatuses : []
|
||||
/** 多选下拉「全选」复选框的通用逻辑,订单状态 / 计费状态共用 */
|
||||
function selectedValues(model, key) {
|
||||
const value = model?.[key]
|
||||
return Array.isArray(value) ? value : []
|
||||
}
|
||||
|
||||
function isAllBillingFailSelected(model) {
|
||||
const selected = selectedBillingFailStatuses(model)
|
||||
const all = billingFailAllValues.value
|
||||
/** 模板中 computed 会自动解包为数组,script 内直接引用时是 ref,两种形态都兼容 */
|
||||
function resolveAllValues(allValues) {
|
||||
if (Array.isArray(allValues)) return allValues
|
||||
const value = allValues?.value
|
||||
return Array.isArray(value) ? value : []
|
||||
}
|
||||
|
||||
function isAllSelected(model, key, allValues) {
|
||||
const all = resolveAllValues(allValues)
|
||||
const selected = selectedValues(model, key)
|
||||
return all.length > 0 && selected.length === all.length
|
||||
}
|
||||
|
||||
function isBillingFailIndeterminate(model) {
|
||||
const selected = selectedBillingFailStatuses(model)
|
||||
const all = billingFailAllValues.value
|
||||
function isIndeterminate(model, key, allValues) {
|
||||
const all = resolveAllValues(allValues)
|
||||
const selected = selectedValues(model, key)
|
||||
return selected.length > 0 && selected.length < all.length
|
||||
}
|
||||
|
||||
function toggleAllBillingFail(model, checked) {
|
||||
function toggleAllSelected(model, key, allValues, checked) {
|
||||
if (!model) return
|
||||
model.billingFailStatuses = checked ? [...billingFailAllValues.value] : []
|
||||
model[key] = checked ? [...resolveAllValues(allValues)] : []
|
||||
}
|
||||
|
||||
const searchColumns = [
|
||||
|
||||
Reference in New Issue
Block a user