diff --git a/src/api/module/engineering/index.d.ts b/src/api/module/engineering/index.d.ts index 785b67c..88c9f16 100644 --- a/src/api/module/engineering/index.d.ts +++ b/src/api/module/engineering/index.d.ts @@ -5,3 +5,8 @@ export interface IEngineeringOV { isCreate: boolean } +export interface IEngineeringImport { + projectName: string + description?: string + file: File +} \ No newline at end of file diff --git a/src/api/module/engineering/index.ts b/src/api/module/engineering/index.ts index 05d6ec8..6dead23 100644 --- a/src/api/module/engineering/index.ts +++ b/src/api/module/engineering/index.ts @@ -1,6 +1,6 @@ import { globalServer } from '../index' -import type { IEngineeringOV } from './index.d' +import type { IEngineeringImport, IEngineeringOV } from './index.d' export const createEngineering = (params: IEngineeringOV) => { return globalServer({ @@ -33,6 +33,18 @@ export const deleteEngineeringBatch = (names: string[]) => { return globalServer({ url: 'project/delete-list', method: 'delete', - params: names.join(','), + params: { + names: names.join(',') + }, }) } + +export const importEngineering = (params: IEngineeringImport) => { + return globalServer({ + url: '/project/import', + method: 'POST', + data: params, + headers: { 'Content-Type': 'multipart/form-data' }, + timeout: 0, + }) +} \ No newline at end of file diff --git a/src/views/engineering/components/create-engineering-dlg.vue b/src/views/engineering/components/create-engineering-dlg.vue index 51aa672..c1915db 100644 --- a/src/views/engineering/components/create-engineering-dlg.vue +++ b/src/views/engineering/components/create-engineering-dlg.vue @@ -17,6 +17,29 @@ clearable /> + + 工程文件: + + + + + + 拖拽文件或点击上传 + 支持文件类型为:.prj + + + 工程描述: import { cloneDeep } from 'lodash-es' -import { useRouter } from 'vue-router' - +import { UploadFilled } from '@element-plus/icons-vue' import { useMessage } from '@/composables/useMessage' import EdfsDialog from '@/components/Edfs-dialog.vue' import type { IEngineeringOV } from '@/api/module/engineering/index.d' -import { createEngineering } from '@/api/module/engineering' -import { validateName } from '@/utils/validate' +import { createEngineering, importEngineering } from '@/api/module/engineering' +import type { UploadFile } from 'element-plus' const message = useMessage() -const router = useRouter() + +type ActionType = 'create' | 'import' + +const actionType = ref('create') const props = defineProps<{ existingNames?: string[] }>() const emit = defineEmits<{ - 'on-save': [name: string] + 'on-save': [name: string, actionType: ActionType] }>() const fromData: IEngineeringOV = { @@ -59,33 +84,86 @@ const fromData: IEngineeringOV = { isCreate: true, } +const file = ref(null) + +function handleRemove() { + file.value = null +} + +async function handleFileChange(fileUpload: UploadFile) { + if (!fileUpload.raw) return + + const isPrj = fileUpload.name.toLowerCase().endsWith('.prj') + // const isLt5M = fileUpload.size! / 1024 / 1024 < 5 + + if (!isPrj) { + message.warning('请上传 .prj 格式的文件') + file.value = null + return + } + + // if (!isLt5M) { + // message.warning('文件大小不能超过 5MB') + // file.value = null + // return + // } + + file.value = fileUpload +} + const form = ref(cloneDeep(fromData)) const visible = ref(false) const btnLoading = ref(false) -function open() { +function open(type: ActionType) { + actionType.value = type visible.value = true } async function onSave() { if (verifyData()) return - btnLoading.value = true - try { - await createEngineering(form.value) - message.success('创建成功') - emit('on-save', form.value.name) - close() - } catch (error) { - message.error('创建失败') - } finally { - btnLoading.value = false + if (actionType.value === 'create') { + await createdEngineering() + } else { + await importSave() + } + + btnLoading.value = false +} + +async function importSave() { + if (!file.value?.raw) return + const res = await importEngineering({ + projectName: form.value.name, + description: form.value.description, + file: file.value?.raw, + }) + + if (res.code !== 0) { + message.error(res?.msg || '导入失败') + return } + message.success('导入成功') + emit('on-save', form.value.name, actionType.value) + close() +} + +async function createdEngineering() { + const res = await createEngineering(form.value) + if (res.code != 0) { + message.error(res?.msg || '创建失败') + return + } + message.success('创建成功') + emit('on-save', form.value.name, actionType.value) + close() } function close() { visible.value = false form.value = cloneDeep(fromData) + file.value = null } function verifyData() { @@ -99,6 +177,11 @@ function verifyData() { return true } + if (actionType.value === 'import' && !file.value?.raw) { + message.warning('请上传工程文件') + return true + } + return false } diff --git a/src/views/engineering/components/device-dlg.vue b/src/views/engineering/components/device-dlg.vue index a9630ca..ae90452 100644 --- a/src/views/engineering/components/device-dlg.vue +++ b/src/views/engineering/components/device-dlg.vue @@ -110,7 +110,7 @@ const computedChannels = computed(() => { }) const computedCategories = computed(() => { - return props.categories[form.value.channel] + return props.categories[form.value.channel]?.filter(r => r.status) ?? [] }) const form = ref(cloneDeep(FormData)) diff --git a/src/views/engineering/index.vue b/src/views/engineering/index.vue index 6828d50..5e4766e 100644 --- a/src/views/engineering/index.vue +++ b/src/views/engineering/index.vue @@ -1,19 +1,27 @@ - + - 批量删除 + 批量删除 确认删除 取消 + 导入工程 @@ -30,21 +38,21 @@ - 工程名称:{{ item.name }} - 工程名称:{{ item.name }} @@ -52,12 +60,12 @@ 工程描述:{{ item.description }} @@ -72,13 +80,13 @@ /> - -
工程描述:{{ item.description }}