fetch(add): 新增
Some checks failed
构建并部署前端到测试环境 / build-and-deploy (push) Failing after 6s

This commit is contained in:
sexygoat
2026-01-27 09:18:45 +08:00
parent 0eed8244e5
commit 5c6312c407
33 changed files with 4897 additions and 374 deletions

View File

@@ -42,13 +42,14 @@
<script setup lang="ts">
import { h } from 'vue'
import { useRouter } from 'vue-router'
import { CardService } from '@/api/modules'
import { CardService, DeviceService } from '@/api/modules'
import { ElMessage, ElTag } from 'element-plus'
import type { SearchFormItem } from '@/types'
import { useCheckedColumns } from '@/composables/useCheckedColumns'
import { formatDateTime } from '@/utils/business/format'
import ArtButtonTable from '@/components/core/forms/ArtButtonTable.vue'
import type { IotCardImportTask, IotCardImportTaskStatus } from '@/types/api/card'
import type { DeviceImportTask } from '@/types/api/device'
defineOptions({ name: 'TaskManagement' })
@@ -56,8 +57,13 @@
const loading = ref(false)
const tableRef = ref()
// 任务类型
type TaskType = 'card' | 'device'
type ImportTask = IotCardImportTask | DeviceImportTask
// 搜索表单初始值
const initialSearchState = {
task_type: undefined as TaskType | undefined,
status: undefined,
carrier_id: undefined,
batch_no: '',
@@ -77,6 +83,19 @@
// 搜索表单配置
const searchFormItems: SearchFormItem[] = [
{
label: '任务类型',
prop: 'task_type',
type: 'select',
config: {
clearable: true,
placeholder: '全部'
},
options: () => [
{ label: 'ICCID导入', value: 'card' },
{ label: '设备导入', value: 'device' }
]
},
{
label: '任务状态',
prop: 'status',
@@ -123,7 +142,7 @@
type: 'daterange',
startPlaceholder: '开始时间',
endPlaceholder: '结束时间',
valueFormat: 'YYYY-MM-DD HH:mm:ss'
valueFormat: 'YYYY-MM-DDTHH:mm:ssZ'
}
}
]
@@ -131,6 +150,7 @@
// 列配置
const columnOptions = [
{ label: '任务编号', prop: 'task_no' },
{ label: '任务类型', prop: 'task_type' },
{ label: '批次号', prop: 'batch_no' },
{ label: '运营商', prop: 'carrier_name' },
{ label: '文件名', prop: 'file_name' },
@@ -144,7 +164,7 @@
{ label: '操作', prop: 'operation' }
]
const taskList = ref<IotCardImportTask[]>([])
const taskList = ref<ImportTask[]>([])
// 获取状态标签类型
const getStatusType = (status: IotCardImportTaskStatus) => {
@@ -162,11 +182,28 @@
}
}
// 获取任务类型
const getTaskType = (row: ImportTask): TaskType => {
// 判断是否为设备导入任务(设备导入任务有 device_no 字段,卡导入任务有 carrier_name 字段)
if ('device_no' in row || (row.batch_no && row.batch_no.startsWith('DEV-'))) {
return 'device'
}
return 'card'
}
// 获取任务类型文本
const getTaskTypeText = (taskType: TaskType) => {
return taskType === 'device' ? '设备导入' : 'ICCID导入'
}
// 查看详情
const viewDetail = (row: IotCardImportTask) => {
const viewDetail = (row: ImportTask) => {
router.push({
path: '/asset-management/task-detail',
query: { id: row.id }
query: {
id: row.id,
task_type: getTaskType(row)
}
})
}
@@ -177,6 +214,16 @@
label: '任务编号',
width: 150
},
{
prop: 'task_type',
label: '任务类型',
width: 100,
formatter: (row: ImportTask) => {
const taskType = getTaskType(row)
const tagType = taskType === 'device' ? 'warning' : 'primary'
return h(ElTag, { type: tagType, size: 'small' }, () => getTaskTypeText(taskType))
}
},
{
prop: 'batch_no',
label: '批次号',
@@ -185,7 +232,10 @@
{
prop: 'carrier_name',
label: '运营商',
width: 100
width: 100,
formatter: (row: ImportTask) => {
return (row as IotCardImportTask).carrier_name || '-'
}
},
{
prop: 'file_name',
@@ -196,7 +246,7 @@
prop: 'status',
label: '任务状态',
width: 100,
formatter: (row: IotCardImportTask) => {
formatter: (row: ImportTask) => {
return h(ElTag, { type: getStatusType(row.status) }, () => row.status_text)
}
},
@@ -214,7 +264,7 @@
prop: 'fail_count',
label: '失败数',
width: 80,
formatter: (row: IotCardImportTask) => {
formatter: (row: ImportTask) => {
const type = row.fail_count > 0 ? 'danger' : 'success'
return h(ElTag, { type, size: 'small' }, () => row.fail_count)
}
@@ -228,20 +278,20 @@
prop: 'created_at',
label: '创建时间',
width: 160,
formatter: (row: IotCardImportTask) => formatDateTime(row.created_at)
formatter: (row: ImportTask) => formatDateTime(row.created_at)
},
{
prop: 'completed_at',
label: '完成时间',
width: 160,
formatter: (row: IotCardImportTask) => (row.completed_at ? formatDateTime(row.completed_at) : '-')
formatter: (row: ImportTask) => (row.completed_at ? formatDateTime(row.completed_at) : '-')
},
{
prop: 'operation',
label: '操作',
width: 100,
fixed: 'right',
formatter: (row: IotCardImportTask) => {
formatter: (row: ImportTask) => {
return h(ArtButtonTable, {
type: 'view',
onClick: () => viewDetail(row)
@@ -262,7 +312,6 @@
page: pagination.page,
page_size: pagination.pageSize,
status: searchForm.status,
carrier_id: searchForm.carrier_id,
batch_no: searchForm.batch_no || undefined
}
@@ -279,10 +328,48 @@
}
})
const res = await CardService.getIotCardImportTasks(params)
if (res.code === 0) {
taskList.value = res.data.list || []
pagination.total = res.data.total || 0
// 根据任务类型获取不同的数据
if (searchForm.task_type === 'device') {
// 仅获取设备导入任务
const res = await DeviceService.getImportTasks(params)
if (res.code === 0) {
taskList.value = res.data.list || []
pagination.total = res.data.total || 0
}
} else if (searchForm.task_type === 'card') {
// 仅获取ICCID导入任务需要carrier_id参数
const cardParams = {
...params,
carrier_id: searchForm.carrier_id
}
const res = await CardService.getIotCardImportTasks(cardParams)
if (res.code === 0) {
taskList.value = res.data.list || []
pagination.total = res.data.total || 0
}
} else {
// 获取所有类型任务 - 分别调用两个API然后合并结果
const [cardRes, deviceRes] = await Promise.all([
CardService.getIotCardImportTasks({
...params,
carrier_id: searchForm.carrier_id
}),
DeviceService.getImportTasks(params)
])
const cardTasks = cardRes.code === 0 ? cardRes.data.list || [] : []
const deviceTasks = deviceRes.code === 0 ? deviceRes.data.list || [] : []
// 合并并按创建时间排序
const allTasks = [...cardTasks, ...deviceTasks].sort((a, b) => {
return new Date(b.created_at).getTime() - new Date(a.created_at).getTime()
})
// 前端分页
const start = (pagination.page - 1) * pagination.pageSize
const end = start + pagination.pageSize
taskList.value = allTasks.slice(start, end)
pagination.total = allTasks.length
}
} catch (error) {
console.error(error)