Merge branch 'master' of http://git.lionquexpress.com/wuweihua/BMS
This commit is contained in:
@@ -213,6 +213,7 @@ function submit(skipConfirm) {
|
||||
orderId: q.orderId || undefined,
|
||||
orgOrderId: q.orgOrderId || undefined,
|
||||
transferOrderId: q.transferOrderId || undefined,
|
||||
orderStatuses: Array.isArray(q.orderStatuses) && q.orderStatuses.length ? q.orderStatuses : undefined,
|
||||
batchSize: 100
|
||||
}).then(res => {
|
||||
const asyncTaskId = res.data?.asyncTaskId || res.data
|
||||
|
||||
@@ -18,11 +18,11 @@
|
||||
ref="tableRef"
|
||||
:columns="columns"
|
||||
:search-columns="searchColumns"
|
||||
:default-params="defaultParams"
|
||||
:query="queryList"
|
||||
row-key="orderId"
|
||||
:auto-load="false"
|
||||
selection
|
||||
search-action-align="center"
|
||||
:search-per-row="4"
|
||||
:page-sizes="[100, 200, 300, 400]"
|
||||
:page-size="100"
|
||||
@@ -83,6 +83,31 @@
|
||||
<template #col-country="{ row }">
|
||||
{{ row.countryName || '-' }} ({{ row.country || '-' }})
|
||||
</template>
|
||||
<template #search-orderStatuses="{ model }">
|
||||
<el-select
|
||||
v-model="model.orderStatuses"
|
||||
multiple
|
||||
clearable
|
||||
collapse-tags
|
||||
collapse-tags-tooltip
|
||||
placeholder="请选择"
|
||||
style="width: 100%"
|
||||
>
|
||||
<template #header>
|
||||
<el-checkbox
|
||||
:model-value="isAllOrderStatusSelected(model)"
|
||||
:indeterminate="isOrderStatusIndeterminate(model)"
|
||||
@change="(checked) => toggleAllOrderStatus(model, checked)"
|
||||
>全选</el-checkbox>
|
||||
</template>
|
||||
<el-option
|
||||
v-for="opt in orderStatusOptions"
|
||||
:key="opt.value"
|
||||
:label="opt.label"
|
||||
:value="opt.value"
|
||||
/>
|
||||
</el-select>
|
||||
</template>
|
||||
<template #col-orderStatus="{ row }">
|
||||
{{ orderStatusLabel(row.orderStatus) }}
|
||||
</template>
|
||||
@@ -130,6 +155,27 @@ const syncFloat = ref(null)
|
||||
/** 比对回填搜索模式:走专用转单号接口,不影响普通列表 */
|
||||
const transferFillMode = ref(false)
|
||||
|
||||
const orderStatusMap = {
|
||||
0: '预报订单',
|
||||
1: '确认订单',
|
||||
2: '已中转',
|
||||
3: '已收货',
|
||||
4: '已装箱',
|
||||
5: '已出库',
|
||||
6: '转运中',
|
||||
7: '已上网',
|
||||
8: '已签收',
|
||||
9: '已退件',
|
||||
10: '已删除',
|
||||
11: '已复核'
|
||||
}
|
||||
|
||||
const orderStatusOptions = Object.keys(orderStatusMap).map(k => ({ label: orderStatusMap[k], value: Number(k) }))
|
||||
|
||||
const defaultParams = {
|
||||
orderStatuses: [3, 4, 5, 6, 7, 8, 11]
|
||||
}
|
||||
|
||||
const searchColumns = [
|
||||
{
|
||||
// 客户名称或客户代码混合录入,一行一个
|
||||
@@ -164,7 +210,20 @@ const searchColumns = [
|
||||
clearable: true,
|
||||
defaultTime: [new Date(2000, 0, 1, 0, 0, 0), new Date(2000, 0, 1, 23, 59, 59)]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
label: '订单状态',
|
||||
prop: 'orderStatuses',
|
||||
component: 'select',
|
||||
options: orderStatusOptions,
|
||||
placeholder: '请选择',
|
||||
props: {
|
||||
multiple: true,
|
||||
clearable: true,
|
||||
collapseTags: true,
|
||||
collapseTagsTooltip: true
|
||||
}
|
||||
},
|
||||
]
|
||||
|
||||
const columns = [
|
||||
@@ -186,21 +245,6 @@ const columns = [
|
||||
// { label: '操作', prop: 'action', align: 'center', width: 120, fixed: 'right', slot: 'action', showInToolbar: false }
|
||||
]
|
||||
|
||||
const orderStatusMap = {
|
||||
0: '预报订单',
|
||||
1: '确认订单',
|
||||
2: '已中转',
|
||||
3: '已收货',
|
||||
4: '已装箱',
|
||||
5: '已出库',
|
||||
6: '转运中',
|
||||
7: '已上网',
|
||||
8: '已签收',
|
||||
9: '已退件',
|
||||
10: '已删除',
|
||||
11: '已复核'
|
||||
}
|
||||
|
||||
const syncFloatVisible = computed(() => {
|
||||
const p = syncFloat.value
|
||||
return !!(p && (p.loading || p.finished))
|
||||
@@ -220,6 +264,30 @@ const syncFloatSummary = computed(() => {
|
||||
})
|
||||
const syncFloatTooltip = computed(() => syncFloat.value?.message || '点击查看详情')
|
||||
|
||||
|
||||
const orderStatusAllValues = computed(() => orderStatusOptions.map(o => o.value))
|
||||
|
||||
function selectedOrderStatuses(model) {
|
||||
return Array.isArray(model?.orderStatuses) ? model.orderStatuses : []
|
||||
}
|
||||
|
||||
function isAllOrderStatusSelected(model) {
|
||||
const selected = selectedOrderStatuses(model)
|
||||
const all = orderStatusAllValues.value
|
||||
return all.length > 0 && selected.length === all.length
|
||||
}
|
||||
|
||||
function isOrderStatusIndeterminate(model) {
|
||||
const selected = selectedOrderStatuses(model)
|
||||
const all = orderStatusAllValues.value
|
||||
return selected.length > 0 && selected.length < all.length
|
||||
}
|
||||
|
||||
function toggleAllOrderStatus(model, checked) {
|
||||
if (!model) return
|
||||
model.orderStatuses = checked ? [...orderStatusAllValues.value] : []
|
||||
}
|
||||
|
||||
function orderStatusLabel(status) {
|
||||
if (status === null || status === undefined || status === '') return '-'
|
||||
const key = Number(status)
|
||||
@@ -388,7 +456,8 @@ function toSyncRow(row) {
|
||||
orgOrderId: row.orgOrderId,
|
||||
transferOrderId: row.transferOrderId,
|
||||
customerCode: row.customerCode,
|
||||
pickupDate: row.pickupDate
|
||||
pickupDate: row.pickupDate,
|
||||
orderStatus: row.orderStatus
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,12 +14,16 @@
|
||||
virtual
|
||||
>
|
||||
<template #search-orderIdentifiers="{ model }">
|
||||
<multi-value-input
|
||||
v-model="model.orderIdentifiers"
|
||||
placeholder="订单号/运单号/转单号"
|
||||
width="100%"
|
||||
:search-method="searchOrderIdentifiers"
|
||||
/>
|
||||
<div class="order-identifier-search">
|
||||
<el-input
|
||||
v-model="model.orderIdentifiers"
|
||||
type="textarea"
|
||||
:rows="1"
|
||||
resize="none"
|
||||
placeholder="请输入订单号、运单号或转单号"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template #search-customerCodes="{ model }">
|
||||
<customer-select
|
||||
@@ -234,7 +238,7 @@
|
||||
</template>
|
||||
|
||||
<script setup name="BillingBill">
|
||||
import { listBill, getBill, refundBill, listOrderNoOptions, listTrackingNoOptions, listTransferNoOptions, updateCreditArrears, importChargeWeightAsync, downloadChargeWeightTemplate, recalcBillPriceAsync } from '@/api/price/billing'
|
||||
import { listBill, getBill, refundBill, updateCreditArrears, importChargeWeightAsync, downloadChargeWeightTemplate, recalcBillPriceAsync } from '@/api/price/billing'
|
||||
import { exportAsyncFromTable } from '@/utils/excelExport'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { useProducts } from '@/components/ProductSelect/useProducts'
|
||||
@@ -244,13 +248,27 @@ import EditChargeWeightDialog from './components/EditChargeWeightDialog.vue'
|
||||
import ExcelImportDialog from '@/components/ExcelImportDialog'
|
||||
import ChargeWeightImportAttachDrawer from './components/ChargeWeightImportAttachDrawer.vue'
|
||||
|
||||
// 单号下拉:订单号、运单号、转单号合并候选
|
||||
function searchOrderIdentifiers(keyword) {
|
||||
return Promise.all([
|
||||
listOrderNoOptions(keyword).then(res => res.data || []),
|
||||
listTrackingNoOptions(keyword).then(res => res.data || []),
|
||||
listTransferNoOptions(keyword).then(res => res.data || [])
|
||||
]).then(groups => [...new Set(groups.flat().map(v => String(v)))])
|
||||
const MAX_ORDER_IDENTIFIERS = 1000
|
||||
|
||||
function parseOrderIdentifiers(raw) {
|
||||
const values = Array.isArray(raw) ? raw : [raw]
|
||||
const identifiers = values
|
||||
.filter(v => v !== null && v !== undefined)
|
||||
.flatMap(v => String(v).split(/[\s,,;;]+/))
|
||||
.map(v => v.trim())
|
||||
.filter(Boolean)
|
||||
return [...new Set(identifiers)]
|
||||
}
|
||||
|
||||
function getUniqueOrderIdentifierCount(raw) {
|
||||
return parseOrderIdentifiers(raw).length
|
||||
}
|
||||
|
||||
function validateOrderIdentifierLimit(raw) {
|
||||
const count = getUniqueOrderIdentifierCount(raw)
|
||||
if (count <= MAX_ORDER_IDENTIFIERS) return true
|
||||
ElMessage.warning(`单号去重后最多输入 ${MAX_ORDER_IDENTIFIERS} 个,当前 ${count} 个`)
|
||||
return false
|
||||
}
|
||||
|
||||
// 产品下拉选项:复用 ProductSelect 的模块级产品缓存(全应用只拉一次)
|
||||
@@ -402,8 +420,10 @@ const searchColumns = [
|
||||
]
|
||||
|
||||
function buildBillQuery(params) {
|
||||
const { bizDateRange, ...rest } = params || {}
|
||||
const { bizDateRange, orderIdentifiers: rawOrderIdentifiers, ...rest } = params || {}
|
||||
const query = { ...rest }
|
||||
const orderIdentifiers = parseOrderIdentifiers(rawOrderIdentifiers)
|
||||
if (orderIdentifiers.length) query.orderIdentifiers = orderIdentifiers
|
||||
if (Array.isArray(bizDateRange) && (bizDateRange[0] || bizDateRange[1])) {
|
||||
query.params = {
|
||||
...(query.params || {}),
|
||||
@@ -415,11 +435,16 @@ function buildBillQuery(params) {
|
||||
}
|
||||
|
||||
function queryList(params) {
|
||||
if (!validateOrderIdentifierLimit(params?.orderIdentifiers)) {
|
||||
return Promise.reject(new Error('order identifier limit exceeded'))
|
||||
}
|
||||
const query = buildBillQuery(params)
|
||||
return listBill(query)
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
const params = tableRef.value?.getQueryParams?.() || {}
|
||||
if (!validateOrderIdentifierLimit(params.orderIdentifiers)) return
|
||||
return exportAsyncFromTable({
|
||||
baseUrl: '/price/billing/bill/export',
|
||||
tableRef: tableRef.value,
|
||||
@@ -491,7 +516,7 @@ function onDetailUpdated(data) {
|
||||
|
||||
function hasBatchFeeQuery(q) {
|
||||
const hasArr = (arr) => Array.isArray(arr) && arr.some(v => v != null && String(v).trim() !== '')
|
||||
return hasArr(q.orderIdentifiers)
|
||||
return parseOrderIdentifiers(q.orderIdentifiers).length > 0
|
||||
|| hasArr(q.orderNos)
|
||||
|| hasArr(q.trackingNos)
|
||||
|| hasArr(q.transferNos)
|
||||
@@ -504,12 +529,16 @@ function hasBatchFeeQuery(q) {
|
||||
|
||||
function openBatchFee() {
|
||||
const q = tableRef.value?.getQueryParams?.() || {}
|
||||
if (!validateOrderIdentifierLimit(q.orderIdentifiers)) return
|
||||
const { pageNum, pageSize, bizDateRange, ...rest } = q
|
||||
if (!hasBatchFeeQuery({ ...rest, bizDateRange })) {
|
||||
ElMessage.warning('请先设置列表查询条件')
|
||||
return
|
||||
}
|
||||
const listQuery = { ...rest }
|
||||
const listQuery = {
|
||||
...rest,
|
||||
orderIdentifiers: parseOrderIdentifiers(rest.orderIdentifiers)
|
||||
}
|
||||
if (Array.isArray(bizDateRange) && (bizDateRange[0] || bizDateRange[1])) {
|
||||
listQuery.beginBizDate = bizDateRange[0] || null
|
||||
listQuery.endBizDate = bizDateRange[1] || null
|
||||
@@ -525,6 +554,7 @@ function onBatchFeeSuccess() {
|
||||
|
||||
function buildRecalcPayload() {
|
||||
const q = tableRef.value?.getQueryParams?.() || {}
|
||||
if (!validateOrderIdentifierLimit(q.orderIdentifiers)) return null
|
||||
const { pageNum, pageSize, bizDateRange, ...rest } = q
|
||||
if (!hasBatchFeeQuery({ ...rest, bizDateRange })) {
|
||||
ElMessage.warning('请先设置列表查询条件')
|
||||
@@ -537,10 +567,11 @@ function buildRecalcPayload() {
|
||||
orderNos: rest.orderNos || [],
|
||||
trackingNos: rest.trackingNos || [],
|
||||
transferNos: rest.transferNos || [],
|
||||
orderIdentifiers: rest.orderIdentifiers || [],
|
||||
orderIdentifiers: parseOrderIdentifiers(rest.orderIdentifiers),
|
||||
customerCodes: rest.customerCodes || [],
|
||||
productCodes: rest.productCodes || [],
|
||||
creditArrearsStatus: rest.creditArrearsStatus || undefined
|
||||
creditArrearsStatus: rest.creditArrearsStatus || undefined,
|
||||
billingFailStatuses: Array.isArray(rest.billingFailStatuses) ? rest.billingFailStatuses : []
|
||||
}
|
||||
if (Array.isArray(bizDateRange) && (bizDateRange[0] || bizDateRange[1])) {
|
||||
payload.beginBizDate = bizDateRange[0] || null
|
||||
@@ -628,7 +659,7 @@ function buildChargeWeightTemplateQuery() {
|
||||
orderNos: rest.orderNos || [],
|
||||
trackingNos: rest.trackingNos || [],
|
||||
transferNos: rest.transferNos || [],
|
||||
orderIdentifiers: rest.orderIdentifiers || [],
|
||||
orderIdentifiers: parseOrderIdentifiers(rest.orderIdentifiers),
|
||||
customerCodes: rest.customerCodes || [],
|
||||
productCodes: rest.productCodes || [],
|
||||
creditArrearsStatus: rest.creditArrearsStatus || undefined
|
||||
@@ -641,6 +672,8 @@ function buildChargeWeightTemplateQuery() {
|
||||
}
|
||||
|
||||
async function downloadChargeWeightImportTemplate() {
|
||||
const currentQuery = tableRef.value?.getQueryParams?.() || {}
|
||||
if (cwFillByFilter.value && !validateOrderIdentifierLimit(currentQuery.orderIdentifiers)) return
|
||||
const payload = buildChargeWeightTemplateQuery()
|
||||
// Checked: backend fills orderNos from list filters. Unchecked: OSS template CHARGE_WEIGHT.
|
||||
if (payload.fillByFilter) {
|
||||
@@ -842,4 +875,5 @@ function refundTagType(status) {
|
||||
.billing-bill :deep(.basic-form .el-form-item .el-date-editor) {
|
||||
width: 100%;
|
||||
}
|
||||
.order-identifier-search { width: 100%; }
|
||||
</style>
|
||||
|
||||
@@ -211,12 +211,28 @@ function buildQueryTags(q) {
|
||||
: (q.creditArrearsStatus === 'NORMAL' ? "正常" : q.creditArrearsStatus)
|
||||
tags.push("额度欠费" + ':' + label)
|
||||
}
|
||||
const failStatuses = Array.isArray(q.billingFailStatuses) ? q.billingFailStatuses.filter(v => v != null) : []
|
||||
if (failStatuses.length) {
|
||||
const labels = failStatuses.map(v => billingFailStatusLabel(v))
|
||||
tags.push("计费失败" + ':' + labels.join(', '))
|
||||
}
|
||||
if (q.beginBizDate || q.endBizDate) {
|
||||
tags.push("计费时间:" + (q.beginBizDate || '…') + ' ~ ' + (q.endBizDate || '…'))
|
||||
}
|
||||
return tags
|
||||
}
|
||||
|
||||
function billingFailStatusLabel(code) {
|
||||
const map = {
|
||||
0: '计费成功',
|
||||
1: '未匹配产品',
|
||||
2: '未匹配国家',
|
||||
3: '未匹配重量段'
|
||||
}
|
||||
const key = Number(code)
|
||||
return map[key] != null ? map[key] : String(code)
|
||||
}
|
||||
|
||||
function loadSurcharges() {
|
||||
return listSurchargeOptions({ ssCode: 'on' }).then(res => {
|
||||
surchargeOptions.value = res.data || []
|
||||
@@ -262,6 +278,7 @@ function buildPayload() {
|
||||
customerCodes: q.customerCodes || [],
|
||||
productCodes: q.productCodes || [],
|
||||
creditArrearsStatus: q.creditArrearsStatus || undefined,
|
||||
billingFailStatuses: Array.isArray(q.billingFailStatuses) ? q.billingFailStatuses : [],
|
||||
beginBizDate: q.beginBizDate || undefined,
|
||||
endBizDate: q.endBizDate || undefined
|
||||
}
|
||||
|
||||
@@ -60,12 +60,16 @@
|
||||
</el-col>
|
||||
</template>
|
||||
<template #search-orderIdentifiers="{ model }">
|
||||
<multi-value-input
|
||||
v-model="model.orderIdentifiers"
|
||||
placeholder="订单号/运单号/转单号"
|
||||
width="100%"
|
||||
:search-method="searchOrderIdentifiers"
|
||||
/>
|
||||
<div class="order-identifier-search">
|
||||
<el-input
|
||||
v-model="model.orderIdentifiers"
|
||||
type="textarea"
|
||||
:rows="1"
|
||||
resize="none"
|
||||
placeholder="请输入订单号、运单号或转单号"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template #search-customerCodes="{ model }">
|
||||
<customer-select
|
||||
@@ -163,7 +167,7 @@
|
||||
|
||||
<script setup name="OrderBillQuery">
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { listOrderBill, listOrderNoOptions, listTrackingNoOptions, listTransferNoOptions, localRebillAsync } from '@/api/price/billing'
|
||||
import { listOrderBill, localRebillAsync } from '@/api/price/billing'
|
||||
import { exportAsyncFromTable } from '@/utils/excelExport'
|
||||
import OrderSourceSyncLogDrawer from '../../monitor/orderSource/components/OrderSourceSyncLogDrawer.vue'
|
||||
import OrderBillProductCheckDrawer from './components/OrderBillProductCheckDrawer.vue'
|
||||
@@ -182,6 +186,7 @@ const rebillProgressSuccess = ref(0)
|
||||
const rebillProgressFail = ref(0)
|
||||
const tableHeight = ref(480)
|
||||
let tableResizeObserver = null
|
||||
const MAX_ORDER_IDENTIFIERS = 1000
|
||||
|
||||
const defaultParams = {
|
||||
orderStatuses: [3, 4, 5, 6, 7, 8, 11],
|
||||
@@ -330,8 +335,10 @@ const searchColumns = [
|
||||
]
|
||||
|
||||
function applySearchRanges(params) {
|
||||
const { bizDateRange, pickupDateRange, ...rest } = params
|
||||
const { bizDateRange, pickupDateRange, orderIdentifiers: rawOrderIdentifiers, ...rest } = params || {}
|
||||
const query = { ...rest }
|
||||
const orderIdentifiers = parseOrderIdentifiers(rawOrderIdentifiers)
|
||||
if (orderIdentifiers.length) query.orderIdentifiers = orderIdentifiers
|
||||
const rangeParams = {}
|
||||
if (Array.isArray(bizDateRange) && (bizDateRange[0] || bizDateRange[1])) {
|
||||
rangeParams.beginBizDate = bizDateRange[0] || null
|
||||
@@ -347,11 +354,36 @@ function applySearchRanges(params) {
|
||||
return query
|
||||
}
|
||||
|
||||
function parseOrderIdentifiers(raw) {
|
||||
const values = Array.isArray(raw) ? raw : [raw]
|
||||
const identifiers = values
|
||||
.filter(v => v !== null && v !== undefined)
|
||||
.flatMap(v => String(v).split(/[\s,,;;]+/))
|
||||
.map(v => v.trim())
|
||||
.filter(Boolean)
|
||||
return [...new Set(identifiers)]
|
||||
}
|
||||
|
||||
function getUniqueOrderIdentifierCount(raw) {
|
||||
return parseOrderIdentifiers(raw).length
|
||||
}
|
||||
|
||||
function validateOrderIdentifierLimit(raw) {
|
||||
const count = getUniqueOrderIdentifierCount(raw)
|
||||
if (count <= MAX_ORDER_IDENTIFIERS) return true
|
||||
ElMessage.warning(`单号去重后最多输入 ${MAX_ORDER_IDENTIFIERS} 个,当前 ${count} 个`)
|
||||
return false
|
||||
}
|
||||
|
||||
function queryList(params) {
|
||||
return listOrderBill(applySearchRanges(params))
|
||||
const query = applySearchRanges(params)
|
||||
if (!validateOrderIdentifierLimit(query.orderIdentifiers)) return Promise.reject(new Error('order identifier limit exceeded'))
|
||||
return listOrderBill(query)
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
const params = tableRef.value?.getQueryParams?.() || {}
|
||||
if (!validateOrderIdentifierLimit(params.orderIdentifiers)) return
|
||||
return exportAsyncFromTable({
|
||||
baseUrl: '/price/billing/orderBill/export',
|
||||
tableRef: tableRef.value,
|
||||
@@ -365,9 +397,7 @@ const MAX_REBILL = 10000
|
||||
|
||||
function currentIdentifiers() {
|
||||
const q = tableRef.value?.getQueryParams?.() || {}
|
||||
return (Array.isArray(q.orderIdentifiers) ? q.orderIdentifiers : [])
|
||||
.map(v => String(v || '').trim())
|
||||
.filter(Boolean)
|
||||
return parseOrderIdentifiers(q.orderIdentifiers)
|
||||
}
|
||||
|
||||
function buildRebillFilter() {
|
||||
@@ -400,6 +430,7 @@ function buildCheckQuery() {
|
||||
|
||||
function handleCheckProducts() {
|
||||
const q = buildCheckQuery()
|
||||
if (!validateOrderIdentifierLimit(q.orderIdentifiers)) return
|
||||
const hasCustomer = Array.isArray(q.customerCodes) && q.customerCodes.length > 0
|
||||
const begin = q.params?.beginBizDate
|
||||
const end = q.params?.endBizDate
|
||||
@@ -474,6 +505,7 @@ async function runLocalRebill(payload, confirmText) {
|
||||
function openFilterRebill() {
|
||||
const filter = buildRebillFilter()
|
||||
const identifiers = filter.orderIdentifiers || []
|
||||
if (!validateOrderIdentifierLimit(identifiers)) return
|
||||
if (!hasRebillFilter(filter)) {
|
||||
ElMessage.warning('请输入单号,或选择客户并选择计费时间后再重新计费;也可勾选订单后点重新计费选中')
|
||||
return
|
||||
@@ -514,14 +546,6 @@ function handleBatchRebill(selection) {
|
||||
)
|
||||
}
|
||||
|
||||
function searchOrderIdentifiers(keyword) {
|
||||
return Promise.all([
|
||||
listOrderNoOptions(keyword).then(res => res.data || []),
|
||||
listTrackingNoOptions(keyword).then(res => res.data || []),
|
||||
listTransferNoOptions(keyword).then(res => res.data || [])
|
||||
]).then(groups => [...new Set(groups.flat().map(v => String(v)))])
|
||||
}
|
||||
|
||||
function formatWeight(val) {
|
||||
if (val == null || val === '') return '-'
|
||||
const num = Number(val)
|
||||
@@ -581,6 +605,7 @@ onBeforeUnmount(() => {
|
||||
.order-bill-query :deep(.basic-form .el-form-item .el-date-editor) {
|
||||
width: 100%;
|
||||
}
|
||||
.order-identifier-search { width: 100%; }
|
||||
.rebill-progress__msg { margin-top: 12px; color: var(--el-text-color-regular); }
|
||||
.rebill-progress__text { margin-top: 8px; font-size: 13px; color: var(--el-text-color-secondary); }
|
||||
.rebill-progress__hint { margin-top: 12px; font-size: 12px; color: var(--el-color-warning); }
|
||||
|
||||
Reference in New Issue
Block a user