2025-11-25 17:49:53 +08:00

372 lines
8.6 KiB
Vue

<script lang="ts">
import { defineComponent } from "vue";
export default defineComponent({
name: "ImportModal",
});
</script>
<script setup lang="ts">
import Icon from "@/components/Module/Icon/index.vue";
import Modal from "@/components/Module/Modal/index.vue";
import {
Form,
FormItem,
Select,
SelectOption,
Row,
Col,
Space,
Button,
Input,
Textarea,
Upload,
Radio,
RadioGroup,
} from "ant-design-vue";
import { ref } from "vue";
interface PropsType {
state: Record<string, any>;
api: Record<string, any>;
requestMap: Record<string, any>;
// data: Record<string, any>[];
}
const props = withDefaults(defineProps<PropsType>(), {
state: () => {
return {};
},
api: () => {
return {};
},
requestMap: () => {
return {};
},
});
const emits = defineEmits(["onSuccess"]);
// 表单实例
const formRef = ref();
// 表单
const form = ref<Record<string, any>>({
files: [],
csvFiles: [],
batch_name: "",
description: "",
work_mode: "",
system_param: "",
system_status: "",
agreement: "38解析协议",
});
// 协议校验
const onAgreementValid = (
rule: Record<string, any>,
value: Record<string, any>,
callback: Function,
) => {
if (
form.value.agreement &&
(form.value.agreement != customAgreement.value ||
(form.value.agreement == customAgreement.value && customAgreement.value != ""))
) {
return Promise.resolve();
} else {
return Promise.reject("请输入");
}
};
const onFilesValid = (
rule: Record<string, any>,
value: Record<string, any>,
callback: Function,
) => {
if (form.value.files && form.value.files.length) {
return Promise.resolve();
} else {
return Promise.reject("请上传文件");
}
};
const rules: Record<string, any> = {
files: [
{
required: true,
validator: onFilesValid,
message: "请上传文件",
trigger: "blur",
},
],
batch_name: [
{
required: true,
message: "请输入数据名称",
trigger: "blur",
},
],
// agreement: [
// {
// required: true,
// validator: onAgreementValid,
// message: "请输入协议",
// trigger: "blur",
// },
// ],
};
// 协议选项配置
const options = [
{
label: "38解析协议",
value: "38解析协议",
},
{
label: "14解析协议",
value: "14解析协议",
},
];
// 上传
const onUpload = (e: File) => {
form.value.files[0] = e;
return false;
};
// 上传csv辅助文件
const onCsvUpload = (e: File) => {
form.value.csvFiles[0] = e;
return false;
};
const customAgreement = ref("");
// 更新自定义协议
const updateAgreement = (e: Record<string, any>) => {
if (form.value.agreement == customAgreement.value) {
form.value.agreement = e.target.value;
}
customAgreement.value = e.target.value;
};
let open = ref<boolean>(false);
// 重置
const reset = () => {
// formRef.value.clearValidate();
form.value = {
files: [],
csvFiles: [],
batch_name: "",
description: "",
work_mode: "",
system_param: "",
system_status: "",
// agreement: "38解析协议",
};
customAgreement.value = "";
};
// 打开
const onOpen = () => {
reset();
open.value = true;
};
// 关闭
const onClose = () => {
open.value = false;
};
defineExpose({ onOpen, onClose });
// 提交
const onSubmit = async () => {
await formRef.value.validate();
const formData = new FormData();
formData.append("file", form.value.files[0]);
if (form.value.csvFiles.length) {
formData.append("csvFile", form.value.csvFiles[0]);
}
formData.append("batch_name", form.value.batch_name);
formData.append("description", form.value.description);
formData.append("work_mode", form.value.work_mode);
formData.append("system_param", form.value.system_param);
formData.append("system_status", form.value.system_status);
const res = await props.api.onImportData(formData);
if (res?.code == 200) {
emits("onSuccess");
onClose();
}
console.log("form", props);
};
</script>
<template>
<Modal
v-model:open="open"
title="导入数据"
width="700px"
style="top: 10px"
:loading="props.requestMap.importRequest.loading.value"
:onConfirm="onSubmit"
>
<Form layout="vertical" :model="form" ref="formRef" :rules="rules" v-if="open">
<Row :gutter="[20, 0]">
<Col :span="24">
<FormItem label="选择数据" name="files" class="upload-row">
<Upload
:multiple="false"
:before-upload="onUpload"
:max-count="1"
style="width: 100%"
accept=".bin, .mat, .json"
>
<div class="upload-box">
<div class="upload-box-icon">
<Icon name="fileUpload" />
</div>
<div class="upload-box-title">点击上传</div>
</div>
</Upload>
<div class="upload-desc">支持bim、mat、json等各类二进制原始数据及航迹数据</div>
</FormItem>
</Col>
<Col :span="24">
<FormItem label="csv数据" name="csv" class="upload-row">
<Upload
:multiple="false"
:before-upload="onCsvUpload"
:max-count="1"
style="width: 100%"
accept=".bin, .mat, .json"
>
<div class="upload-box">
<div class="upload-box-icon">
<Icon name="fileUpload" />
</div>
<div class="upload-box-title">点击上传</div>
</div>
</Upload>
<div class="upload-desc">支持bim、mat、json等各类二进制原始数据及航迹数据</div>
</FormItem>
</Col>
<Col :span="24">
<FormItem label="数据名称" name="batch_name">
<Input v-model:value="form.batch_name" placeholder="请输入" />
</FormItem>
</Col>
<Col :span="24">
<FormItem label="数据描述" name="description">
<Input v-model:value="form.description" placeholder="请输入" />
</FormItem>
</Col>
<Col :span="24">
<FormItem label="雷达工作模式" name="work_mode">
<Input v-model:value="form.work_mode" placeholder="请输入" />
</FormItem>
</Col>
<Col :span="24">
<FormItem label="雷达系统参数" name="system_param">
<Textarea
:autoSize="{
minRows: 3,
}"
v-model:value="form.system_param"
placeholder="请输入"
/>
</FormItem>
</Col>
<Col :span="24">
<FormItem label="系统状态" name="system_status">
<Input v-model:value="form.system_status" placeholder="请输入" />
</FormItem>
</Col>
<!-- <Col :span="24">
<FormItem label="数据解析" name="agreement">
<RadioGroup v-model:value="form.agreement" style="width: 100%">
<Row :gutter="[12, 12]">
<Col :span="12" v-for="item in options">
<Radio :value="item.value">{{ item.label }}</Radio>
</Col>
<Col :span="12">
<Radio :value="customAgreement">
<Input :value="customAgreement" @change="updateAgreement" />
</Radio>
</Col>
</Row>
</RadioGroup>
</FormItem>
</Col> -->
</Row>
</Form>
</Modal>
</template>
<style scoped lang="scss">
.grid-box {
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
:deep(.ant-form-item) {
margin-bottom: 0;
}
}
.grey-text {
color: #8c8c8c;
}
.upload-row {
.ant-upload-wrapper {
display: block;
:deep(.ant-upload) {
width: 100%;
}
}
.ant-upload-select {
width: 100%;
.upload-box {
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
font-size: 16px;
color: #8a8a8a;
width: 100%;
aspect-ratio: 537 / 91;
border-radius: 6px 6px 6px 6px;
border: 1px solid #d9d9d9;
background: rgba(200, 200, 200, 0.2);
&-icon {
}
&-title {
}
}
}
.upload-desc {
font-family:
Source Han Sans,
Source Han Sans;
font-weight: 400;
font-size: 12px;
color: #c8c8c8;
line-height: 26px;
text-align: justify;
font-style: normal;
text-transform: none;
}
}
.upload-footer {
padding: 12px 16px;
width: 100%;
display: flex;
align-items: center;
justify-content: end;
gap: 20px;
}
</style>