feat: 新增导出
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 5m19s

This commit is contained in:
luo
2026-06-16 11:35:45 +08:00
parent 908367ba5d
commit 2a8f4e40d6
19 changed files with 1347 additions and 0 deletions

View File

@@ -0,0 +1,144 @@
<template>
<ElDialog v-model="visible" :title="title" width="520px" destroy-on-close>
<ElAlert type="info" :closable="false" show-icon class="export-rule-alert">
<template #title>{{ description }}</template>
</ElAlert>
<ElForm label-width="100px" class="export-task-form">
<ElFormItem label="导出场景">
<ElTag>{{ sceneName }}</ElTag>
</ElFormItem>
<ElFormItem label="导出格式">
<ElRadioGroup v-model="form.format">
<ElRadio label="xlsx">XLSX</ElRadio>
<ElRadio label="csv">CSV</ElRadio>
</ElRadioGroup>
</ElFormItem>
</ElForm>
<template #footer>
<div class="dialog-footer">
<ElButton @click="visible = false">取消</ElButton>
<ElButton
v-if="!confirmPermission || hasAuth(confirmPermission)"
type="primary"
:loading="submitting"
@click="submit"
>
创建导出任务
</ElButton>
</div>
</template>
</ElDialog>
</template>
<script setup lang="ts">
import { computed, reactive, ref, watch } from 'vue'
import { ElMessage } from 'element-plus'
import { ExportTaskService } from '@/api/modules'
import { useAuth } from '@/composables/useAuth'
import type { CreateExportTaskResponse, ExportTaskFormat, ExportTaskScene } from '@/types/api'
const props = withDefaults(
defineProps<{
modelValue: boolean
scene: ExportTaskScene
query?: Record<string, unknown>
defaultFormat?: ExportTaskFormat
title?: string
description?: string
confirmPermission?: string
}>(),
{
query: () => ({}),
defaultFormat: 'xlsx',
title: '创建导出任务',
description: '导出规则基于列表中的检索条件全量导出,不仅导出当前分页数据。'
}
)
const emit = defineEmits<{
(e: 'update:modelValue', value: boolean): void
(e: 'success', value: CreateExportTaskResponse): void
}>()
const { hasAuth } = useAuth()
const submitting = ref(false)
const form = reactive({
format: props.defaultFormat
})
const visible = computed({
get: () => props.modelValue,
set: (value: boolean) => emit('update:modelValue', value)
})
const sceneName = computed(() => {
const sceneMap: Record<ExportTaskScene, string> = {
device: '设备管理',
iot_card: 'IoT卡管理'
}
return sceneMap[props.scene]
})
watch(
() => props.modelValue,
(opened) => {
if (opened) {
form.format = props.defaultFormat
}
}
)
const getNormalizedQuery = () => {
const query: Record<string, unknown> = {}
Object.entries(props.query || {}).forEach(([key, value]) => {
if (value === undefined || value === null || value === '') return
if (Array.isArray(value) && value.length === 0) return
query[key] = value
})
return query
}
const submit = async () => {
if (props.confirmPermission && !hasAuth(props.confirmPermission)) {
ElMessage.warning('您没有创建导出任务的权限')
return
}
submitting.value = true
try {
const res = await ExportTaskService.createExportTask({
scene: props.scene,
format: form.format,
query: getNormalizedQuery()
})
if (res.code === 0) {
ElMessage.success(res.data?.message || '导出任务已创建')
emit('success', res.data)
visible.value = false
} else {
ElMessage.error(res.msg || '创建导出任务失败')
}
} catch (error) {
console.error('创建导出任务失败:', error)
ElMessage.error('创建导出任务失败')
} finally {
submitting.value = false
}
}
</script>
<style scoped lang="scss">
.export-rule-alert {
margin-bottom: 18px;
}
.export-task-form {
padding-top: 4px;
}
</style>