<script setup lang="tsx">
|
import { computed, onMounted, onUnmounted, ref } from 'vue'
|
import type { DataTableColumns, DataTableRowKey } from 'naive-ui'
|
import { bootstrapAuthEntry, useBoolean } from '@/hooks'
|
import { usePermission } from '@/hooks/usePermission'
|
import { cancelAndCloseOrder, deleteOrder, exportOrderExcel, getFleetList, getOrderList, refundOrder } from '@/service/api/transaction'
|
import { operationPageList } from '@/service/api/vehicleConvoy'
|
import { getRegionCascaderNoArea } from '@/service/api/operations'
|
import { NButton, NSpace, useMessage } from 'naive-ui'
|
import SearchPanel from '@/components/custom/SearchPanel.vue'
|
import OperationLogModal from '@/components/custom/OperationLogModal.vue'
|
import dayjs from 'dayjs'
|
import { downloadFile } from '@/utils'
|
import TableModal from './components/TableModal.vue'
|
// import ReassignModal from './components/ReassignModal.vue'
|
import CloseOrderModal from './components/CloseOrderModal.vue'
|
import Modal from './components/Modal.vue'
|
|
const { bool: loading, setTrue: startLoading, setFalse: endLoading } = useBoolean(false)
|
const { t } = useI18n()
|
const message = useMessage()
|
const router = useRouter()
|
const route = useRoute()
|
const dialog = useDialog()
|
const { hasPermission } = usePermission()
|
// 默认落地页允许进入,但无 6011 权限时不请求列表和相关下拉数据。
|
const canViewOrderList = computed(() => hasPermission(6011))
|
|
const initialModel = {
|
orderNumber: '',
|
nickName: '',
|
name: '',
|
phoneNumber: '',
|
startPointName: '',
|
endPointName: '',
|
vehicleModel: '',
|
orderMoney: '',
|
plateNumber: null,
|
fleetId: null,
|
orderSource: null,
|
cityCode: null,
|
status: null,
|
orderTime: null,
|
}
|
const model = ref({ ...initialModel })
|
function handleResetSearch() {
|
model.value = { ...initialModel }
|
handleSearch()
|
}
|
const pageParams = ref({
|
pageNum: 1,
|
pageSize: 10,
|
})
|
|
function handleSearch() {
|
if (!canViewOrderList.value)
|
return
|
pageParams.value.pageNum = 1
|
getList()
|
}
|
|
const isFleetIdOpen = ref(false)
|
const isPlateNumberOpen = ref(false)
|
const isCityCodeIdOpen = ref(false)
|
const isStatusOpen = ref(false)
|
const isOrderSourceOpen = ref(false)
|
const modalRef = ref()
|
const modalRef1 = ref()
|
const closeOrderModalRef = ref()
|
|
const checkedRowKeysRef = ref<DataTableRowKey[]>([])
|
const listData = ref<any[]>([])
|
const showOperationLogModal = ref(false)
|
|
function handleOpenOperationLog() {
|
showOperationLogModal.value = true
|
}
|
|
function getActionCount(row: any) {
|
let count = 1
|
if (row.status === 1 || row.status === 2 || row.status === 3 || row.status === 4)
|
count += 1
|
if (row.status === 6)
|
count += 1
|
if (row.status === 8)
|
count += 1
|
if (row.status === 2 || row.status === 3 || row.status === 4)
|
count += 1
|
if (row.status === 0)
|
count += 1
|
if (row.status === 9 || row.status === 10 || row.status === 13)
|
count += 1
|
return count
|
}
|
|
function handleRefund(row: any) {
|
dialog.warning({
|
title: '是否确认退款?',
|
content: '',
|
positiveText: '确定',
|
negativeText: '取消',
|
maskClosable: false,
|
autoFocus: false,
|
onPositiveClick: () => {
|
refundOrder(row.id!).then((res) => {
|
if (res.code === 200) {
|
message.success('退款成功')
|
getList()
|
}
|
})
|
},
|
})
|
}
|
|
const actionColumnWidth = computed(() => {
|
const maxCount = listData.value.reduce((max, row) => Math.max(max, getActionCount(row)), 1)
|
if (maxCount <= 1)
|
return 60
|
if (maxCount === 2)
|
return 100
|
if (maxCount === 3)
|
return 140
|
if (maxCount === 4)
|
return 180
|
if (maxCount === 5)
|
return 220
|
return 260
|
})
|
|
// 订单状态
|
const statusOptions = [
|
{
|
label: '待接单',
|
value: 1,
|
type: 'primary',
|
},
|
{
|
label: '待出发',
|
value: 2,
|
type: 'success',
|
},
|
{
|
label: '待到达预约地点',
|
value: 3,
|
type: 'warning',
|
},
|
{
|
label: '待乘客上车',
|
value: 4,
|
type: 'primary',
|
},
|
{
|
label: '乘客已上车',
|
value: 5,
|
type: 'success',
|
},
|
{
|
label: '服务中',
|
value: 6,
|
type: 'success',
|
},
|
{
|
label: '待客下车',
|
value: 7,
|
type: 'warning',
|
},
|
{
|
label: '待支付',
|
value: 8,
|
type: 'warning',
|
},
|
{
|
label: '待评价',
|
value: 9,
|
type: 'default',
|
},
|
{
|
label: '已完成',
|
value: 10,
|
type: 'success',
|
},
|
{
|
label: '退款中',
|
value: 11,
|
type: 'warning',
|
},
|
{
|
label: '已退款',
|
value: 12,
|
type: 'success',
|
},
|
{
|
label: '退款失败',
|
value: 13,
|
type: 'error',
|
},
|
{
|
label: '已取消',
|
value: 0,
|
type: 'default',
|
},
|
]
|
|
const columns = computed<DataTableColumns<any>>(() => [
|
{
|
type: 'selection',
|
width: 40,
|
fixed: 'left',
|
},
|
{
|
title: t('transaction.orderNo'),
|
key: 'orderNumber',
|
width: 150,
|
resizable: true,
|
fixed: 'left',
|
},
|
{
|
title: t('transaction.orderTime'),
|
key: 'createTime',
|
width: 160,
|
resizable: true,
|
render: row => <span>{row.createTime ? dayjs(row.createTime).format('YYYY/MM/DD HH:mm') : '-'}</span>,
|
},
|
{
|
title: t('transaction.orderSource'),
|
key: 'orderSource',
|
width: 100,
|
resizable: true,
|
render(row) {
|
return row.orderSource === 1 ? '小鹏小程序' : '-'
|
},
|
},
|
// {
|
// title: t('transaction.pickupTime'),
|
// key: 'rideTime',
|
// width: 160,
|
// resizable: true,
|
// },
|
{
|
title: t('transaction.userNickname'),
|
key: 'nickName',
|
width: 120,
|
resizable: true,
|
},
|
{
|
title: t('transaction.userPhone'),
|
key: 'phoneNumber',
|
width: 120,
|
resizable: true,
|
},
|
{
|
title: t('transaction.pickupLocation'),
|
key: 'startPointName',
|
width: 160,
|
resizable: true,
|
ellipsis: {
|
tooltip: true,
|
},
|
},
|
{
|
title: t('transaction.dropoffLocation'),
|
key: 'endPointName',
|
width: 160,
|
resizable: true,
|
ellipsis: {
|
tooltip: true,
|
},
|
},
|
{
|
title: t('transaction.selectedVehicleType'),
|
key: 'vehicleModel',
|
width: 120,
|
resizable: true,
|
},
|
{
|
title: t('transaction.acceptedVehicleType'),
|
key: 'plateNumber',
|
width: 120,
|
resizable: true,
|
},
|
{
|
title: t('transaction.affiliatedFleet'),
|
key: 'fleetName',
|
width: 120,
|
resizable: true,
|
},
|
{
|
title: t('transaction.orderAmount'),
|
key: 'payAmount',
|
width: 120,
|
resizable: true,
|
render(row) {
|
return row.payAmount === 0 ? `¥${row.payAmount}` : row.payAmount ? `¥${row.payAmount.toFixed(2)}` : '-'
|
},
|
},
|
{
|
title: t('transaction.status'),
|
key: 'status',
|
width: 120,
|
resizable: true,
|
render(row) {
|
const option = statusOptions.find(item => item.value === row.status)
|
return (
|
<n-tag
|
type={option?.type || 'default'}
|
bordered={false}
|
style={row.status === 9
|
? {
|
color: '#764DFF',
|
backgroundColor: '#F6F0FF',
|
}
|
: {}}
|
>
|
{option?.label || ''}
|
</n-tag>
|
)
|
},
|
},
|
{
|
title: '操作',
|
key: 'actions',
|
width: actionColumnWidth.value,
|
fixed: 'right',
|
render: (row) => {
|
return (
|
<NSpace>
|
{(row.status === 1 || row.status === 2 || row.status === 3 || row.status === 4) && (
|
<NButton
|
text
|
v-permission="60113"
|
type="primary"
|
onClick={() => {
|
dialog.warning({
|
title: '是否确认取消订单?',
|
content: '',
|
positiveText: '确定',
|
negativeText: '取消',
|
maskClosable: false,
|
autoFocus: false,
|
onPositiveClick: () => {
|
cancelAndCloseOrder({ orderId: row.id!, type: 1 }).then((res) => {
|
if (res.code === 200) {
|
message.success('取消订单成功')
|
getList()
|
}
|
})
|
},
|
})
|
}}
|
>
|
取消订单
|
</NButton>
|
)}
|
{(row.status === 5 || row.status === 6 || row.status === 7) && (
|
<NButton
|
text
|
v-permission="60114"
|
type="primary"
|
onClick={() => {
|
closeOrderModalRef.value?.openModal(row)
|
}}
|
>
|
关闭订单
|
</NButton>
|
)}
|
{row.status === 8 && (
|
<NButton
|
text
|
type="primary"
|
v-permission="60115"
|
onClick={() => modalRef1.value.openModal(row)}
|
>
|
改价
|
</NButton>
|
)}
|
{ (row.status === 2 || row.status === 3 || row.status === 4) && (
|
<NButton
|
text
|
v-permission="60116"
|
type="primary"
|
onClick={() => modalRef.value.openModal(row)}
|
>
|
改派
|
</NButton>
|
)}
|
{(row.status === 9 || row.status === 10 || row.status === 13) && (
|
<NButton
|
text
|
type="primary"
|
onClick={() => handleRefund(row)}
|
>
|
退款
|
</NButton>
|
)}
|
<NButton
|
text
|
v-permission="60111"
|
type="primary"
|
onClick={() => {
|
router.push({
|
name: 'orderDetail',
|
query: {
|
orderId: row.id!,
|
},
|
})
|
}}
|
>
|
详情
|
</NButton>
|
{row.status === 0 && (
|
<NButton
|
text
|
v-permission="60117"
|
type="primary"
|
onClick={() => {
|
dialog.create({
|
title: '是否确认删除订单?',
|
content: '',
|
positiveText: '确定',
|
negativeText: '取消',
|
maskClosable: false,
|
autoFocus: false,
|
onPositiveClick: () => {
|
deleteOrder(row.id!).then((res) => {
|
if (res.code === 200) {
|
message.success('删除订单成功')
|
getList()
|
}
|
})
|
},
|
})
|
}}
|
>
|
删除
|
</NButton>
|
)}
|
</NSpace>
|
)
|
},
|
},
|
])
|
// 车队
|
const options = ref<any[]>([])
|
const plateNumberOptions = ref<any[]>([])
|
// 渠道
|
const chanleOptions = [
|
{
|
label: '小鹏小程序',
|
value: 1,
|
},
|
]
|
|
const pcaOptions = ref<any[]>([])
|
// 搜索项
|
const filterItems = computed(() => [
|
{
|
label: t('transaction.orderNo'),
|
path: 'orderNumber',
|
render: () => <n-input v-model:value={model.value.orderNumber} />,
|
},
|
{
|
label: t('transaction.userName'),
|
path: 'nickName',
|
render: () => <n-input v-model:value={model.value.nickName} />,
|
},
|
{
|
label: t('transaction.vehicleNumber'),
|
path: 'plateNumber',
|
render: () => (
|
<n-select
|
v-model:value={model.value.plateNumber}
|
onUpdate:show={(val: any) => isPlateNumberOpen.value = val}
|
options={plateNumberOptions.value}
|
filterable
|
clearable
|
>
|
{{
|
arrow: () => (
|
<img
|
src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
|
class={`arrow-icon ${isPlateNumberOpen.value ? 'arrow-icon--open' : ''}`}
|
style={{ width: '16px', height: '16px' }}
|
alt="arrow"
|
/>
|
),
|
empty: () => (
|
<div class="flex-center">
|
<img
|
src="/src/assets/element-img/no-data.png"
|
style={{ width: '50%' }}
|
/>
|
</div>
|
),
|
}}
|
</n-select>
|
),
|
},
|
{
|
label: t('transaction.fleetName'),
|
path: 'fleetId',
|
render: () => (
|
<n-select
|
v-model:value={model.value.fleetId}
|
onUpdate:show={(val: any) => isFleetIdOpen.value = val}
|
options={options.value}
|
clearable
|
>
|
{{
|
arrow: () => (
|
<img
|
src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
|
class={`arrow-icon ${isFleetIdOpen.value ? 'arrow-icon--open' : ''}`}
|
style={{ width: '16px', height: '16px' }}
|
alt="arrow"
|
/>
|
),
|
empty: () => (
|
<div class="flex-center">
|
<img
|
src="/src/assets/element-img/no-data.png"
|
style={{ width: '50%' }}
|
/>
|
</div>
|
),
|
}}
|
</n-select>
|
),
|
},
|
{
|
label: t('transaction.channel'),
|
path: 'orderSource',
|
render: () => (
|
<n-select
|
v-model:value={model.value.orderSource}
|
onUpdate:show={(val: any) => isOrderSourceOpen.value = val}
|
options={chanleOptions}
|
clearable
|
>
|
{{
|
arrow: () => (
|
<img
|
src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
|
class={`arrow-icon ${isOrderSourceOpen.value ? 'arrow-icon--open' : ''}`}
|
style={{ width: '16px', height: '16px' }}
|
alt="arrow"
|
/>
|
),
|
empty: () => (
|
<div class="flex-center">
|
<img
|
src="/src/assets/element-img/no-data.png"
|
style={{ width: '50%' }}
|
/>
|
</div>
|
),
|
}}
|
</n-select>
|
),
|
},
|
{
|
label: t('transaction.city'),
|
path: 'cityCode',
|
render: () => (
|
<n-cascader v-model:value={model.value.cityCode} options={pcaOptions.value} onUpdate:show={(val: any) => isCityCodeIdOpen.value = val} value-field="code" label-field="name" check-strategy="child" clearable>
|
{{
|
arrow: () => (
|
<img
|
src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
|
class={`arrow-icon ${isCityCodeIdOpen.value ? 'arrow-icon--open' : ''}`}
|
style={{ width: '16px', height: '16px' }}
|
alt="arrow"
|
/>
|
),
|
}}
|
</n-cascader>
|
),
|
},
|
{
|
label: t('transaction.status'),
|
path: 'status',
|
render: () => (
|
<n-select
|
v-model:value={model.value.status}
|
onUpdate:show={(val: any) => isStatusOpen.value = val}
|
options={statusOptions}
|
clearable
|
>
|
{{
|
arrow: () => (
|
<img
|
src="https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/e120f81c-9f15-4e1a-9938-22252898edf9.png"
|
class={`arrow-icon ${isStatusOpen.value ? 'arrow-icon--open' : ''}`}
|
style={{ width: '16px', height: '16px' }}
|
alt="arrow"
|
/>
|
),
|
empty: () => (
|
<div class="flex-center">
|
<img
|
src="/src/assets/element-img/no-data.png"
|
style={{ width: '50%' }}
|
/>
|
</div>
|
),
|
}}
|
</n-select>
|
),
|
},
|
{
|
label: t('transaction.orderTime'),
|
path: 'orderTime',
|
render: () => <n-date-picker format="yyyy/MM/dd" v-model:value={model.value.orderTime} type="daterange" clearable actions={[]} close-on-select={true} />,
|
},
|
{
|
label: '下单用户昵称',
|
path: 'name',
|
render: () => <n-input v-model:value={model.value.name} />,
|
},
|
{
|
label: t('transaction.pickupLocation'),
|
path: 'startPointName',
|
render: () => <n-input v-model:value={model.value.startPointName} />,
|
},
|
{
|
label: t('transaction.dropoffLocation'),
|
path: 'endPointName',
|
render: () => <n-input v-model:value={model.value.endPointName} />,
|
},
|
{
|
label: t('transaction.selectedVehicleType'),
|
path: 'vehicleModel',
|
render: () => <n-input v-model:value={model.value.vehicleModel} />,
|
},
|
{
|
label: t('transaction.orderAmount'),
|
path: 'orderMoney',
|
render: () => <n-input v-model:value={model.value.orderMoney} />,
|
},
|
])
|
|
const count = ref(0)
|
|
async function getList() {
|
if (!canViewOrderList.value) {
|
listData.value = []
|
count.value = 0
|
return
|
}
|
startLoading()
|
const params = {
|
...pageParams.value,
|
status: model.value.status,
|
orderNumber: model.value.orderNumber,
|
nickName: model.value.nickName,
|
phoneNumber: model.value.phoneNumber,
|
startPointName: model.value.startPointName,
|
endPointName: model.value.endPointName,
|
vehicleModel: model.value.vehicleModel,
|
orderMoney: model.value.orderMoney,
|
name: model.value.name,
|
plateNumber: model.value.plateNumber,
|
fleetId: model.value.fleetId,
|
orderSource: model.value.orderSource,
|
cityCode: model.value.cityCode,
|
startTime: model.value.orderTime ? dayjs(model.value.orderTime?.[0]).format('YYYY-MM-DD') : null,
|
endTime: model.value.orderTime ? dayjs(model.value.orderTime?.[1]).format('YYYY-MM-DD') : null,
|
}
|
getOrderList(params).then((res) => {
|
if (res.code === 200) {
|
count.value = res.data.total || res.data.records?.length
|
listData.value = res.data.records || []
|
}
|
}).finally(() => {
|
endLoading()
|
})
|
}
|
|
async function handleExport() {
|
let params: any = {}
|
if (checkedRowKeysRef.value.length > 0) {
|
params.ids = checkedRowKeysRef.value
|
}
|
else {
|
params = {
|
...pageParams.value,
|
status: model.value.status,
|
orderNumber: model.value.orderNumber,
|
nickName: model.value.nickName,
|
phoneNumber: model.value.phoneNumber,
|
startPointName: model.value.startPointName,
|
endPointName: model.value.endPointName,
|
vehicleModel: model.value.vehicleModel,
|
orderMoney: model.value.orderMoney,
|
plateNumber: model.value.plateNumber,
|
name: model.value.name,
|
fleetId: model.value.fleetId,
|
orderSource: model.value.orderSource,
|
cityCode: model.value.cityCode,
|
orderTime: model.value.orderTime,
|
startTime: model.value.orderTime ? dayjs(model.value.orderTime?.[0]).format('YYYY-MM-DD') : null,
|
endTime: model.value.orderTime ? dayjs(model.value.orderTime?.[1]).format('YYYY-MM-DD') : null,
|
}
|
}
|
const response = await exportOrderExcel(params)
|
if (response instanceof Blob) {
|
downloadFile(response, `订单列表_${new Date().getTime()}.xlsx`)
|
message.success(`导出成功,共${checkedRowKeysRef.value.length > 0 ? checkedRowKeysRef.value.length : count.value}条数据`)
|
}
|
}
|
|
let parentIdCounter = 0
|
function formatCascaderData(list: any[]) {
|
return list.map((item) => {
|
const newItem = { ...item }
|
if (newItem.children && newItem.children.length > 0) {
|
parentIdCounter++
|
newItem.code = `parent_${item.code}_${parentIdCounter}`
|
newItem.children = formatCascaderData(newItem.children)
|
}
|
else {
|
delete newItem.children
|
}
|
return newItem
|
})
|
}
|
|
async function fetchCascaderData() {
|
if (!canViewOrderList.value)
|
return
|
const res = await getRegionCascaderNoArea()
|
if (res.code === 200 && res.data) {
|
pcaOptions.value = formatCascaderData(res.data)
|
}
|
}
|
|
async function fetchFleetList() {
|
if (!canViewOrderList.value)
|
return
|
const res = await getFleetList()
|
if (res.code === 200) {
|
options.value = res.data.map((item: any) => ({
|
label: item.fleetName,
|
value: item.id,
|
}))
|
}
|
}
|
|
async function fetchPlateNumberOptions() {
|
if (!canViewOrderList.value) {
|
plateNumberOptions.value = []
|
return
|
}
|
const res = await operationPageList({
|
pageNum: 1,
|
pageSize: 99999,
|
})
|
if (res.code !== 200 || !res.data || !res.data.records) {
|
plateNumberOptions.value = []
|
return
|
}
|
const records = Array.isArray(res.data.records) ? res.data.records : []
|
const uniquePlateNumbers = Array.from(new Set(
|
records
|
.map((item: any) => item.plateNumber)
|
.filter((item: any) => item !== null && item !== undefined && String(item).trim() !== ''),
|
))
|
plateNumberOptions.value = uniquePlateNumbers.map((item: any) => ({
|
label: String(item),
|
value: String(item),
|
}))
|
}
|
|
function rowKey(row: any) {
|
return row.id
|
}
|
|
let timer: any = null
|
|
onMounted(async () => {
|
// 承接原 dashboard 的入口初始化逻辑,确保默认首页切换后
|
// SSO 回调和用户信息同步仍然会在首屏完成。
|
const handledAuthEntry = await bootstrapAuthEntry(route, 'orderManagement')
|
if (handledAuthEntry)
|
return
|
|
// 页面允许访问,但没有查看权限时保持空态,不发列表/轮询请求。
|
if (!canViewOrderList.value) {
|
listData.value = []
|
count.value = 0
|
return
|
}
|
getList()
|
fetchCascaderData()
|
fetchFleetList()
|
fetchPlateNumberOptions()
|
timer = setInterval(() => {
|
getList()
|
}, 60 * 1000)
|
})
|
|
onUnmounted(() => {
|
if (timer) {
|
clearInterval(timer)
|
}
|
})
|
|
function handleCheck(rowKeys: DataTableRowKey[]) {
|
checkedRowKeysRef.value = rowKeys
|
}
|
|
function changePage(page: number, size: number) {
|
if (!canViewOrderList.value)
|
return
|
pageParams.value.pageNum = page
|
pageParams.value.pageSize = size
|
getList()
|
}
|
</script>
|
|
<template>
|
<div class="roboTaxi w-full h-full">
|
<div class="roboTaxi-form-card mb-12px">
|
<n-form :model="model" label-placement="left" inline :show-feedback="false">
|
<SearchPanel>
|
<n-gi v-for="item in filterItems" :key="item.path" class="n-grid-item">
|
<n-form-item :label="item.label" :path="item.path">
|
<component :is="item.render" />
|
</n-form-item>
|
</n-gi>
|
<template #action>
|
<NButton @click="handleResetSearch">
|
{{ $t('common.reset') }}
|
</NButton>
|
<NButton type="primary" @click="handleSearch">
|
{{ $t('common.search') }}
|
</NButton>
|
</template>
|
</SearchPanel>
|
</n-form>
|
</div>
|
|
<n-card class="flex-1 robotaxi-table-card">
|
<template #header>
|
<n-flex v-permission="60112" justify="flex-start">
|
<div class="flex gap-2 items-center">
|
<span v-if="checkedRowKeysRef.length > 0" style="color: rgba(23, 31, 38, 0.6);font-weight: 400;">
|
{{ $t('accountManagement.messages.selectedRecords', { count: checkedRowKeysRef.length }) }}
|
</span>
|
<NButton @click="handleExport">
|
批量导出订单
|
</NButton>
|
<NButton v-permission="60118" @click="handleOpenOperationLog">
|
操作日志
|
</NButton>
|
<span style="color: rgba(23, 31, 38, 0.6);font-weight: 400;">
|
订单列表每60S自动刷新一次
|
</span>
|
</div>
|
</n-flex>
|
</template>
|
<div class="flex-1 flex flex-col h-full">
|
<!-- table 区域 -->
|
<n-data-table
|
class="flex-1" :row-key="rowKey" :scroll-x="1950" :columns="columns" :data="listData"
|
:loading="loading" flex-height :bordered="false" :header-height="18" :row-height="18"
|
@update:checked-row-keys="handleCheck"
|
>
|
<template #empty>
|
<div class="flex-center">
|
<img src="/src/assets/element-img/no-data.png" style="width:123px;height:125px" @error="(e: any) => { e.target.src = 'https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/9bed493b-a6aa-4ef6-ac10-7f67f5c6adc5.png' }">
|
</div>
|
</template>
|
</n-data-table>
|
<Pagination
|
:count="count" :page="pageParams.pageNum" :page-size="pageParams.pageSize"
|
class="robotaxi-pagination mt-12px" @change="changePage"
|
/>
|
</div>
|
</n-card>
|
<TableModal ref="modalRef" modal-name="订单改派" @refresh="handleSearch" />
|
<CloseOrderModal ref="closeOrderModalRef" modal-name="关闭订单" @refresh="handleSearch" />
|
<Modal ref="modalRef1" modal-name="改价" @refresh="handleSearch" />
|
<OperationLogModal v-model:show="showOperationLogModal" />
|
</div>
|
</template>
|