Kaynağa Gözat

场景上传

zhangliang2 2 yıl önce
ebeveyn
işleme
ed564e17a7

+ 3 - 5
src/api/sceneLibrary.js

@@ -24,6 +24,7 @@ const instShareList = basePart + '/ScenePackage/instShareList'; // 分享场景
 const deleteList = basePart + '/ScenePackage/deleteList'; // 删除场景测试包
 
 const queryScenePackageSublistList = basePart + '/ScenePackage/queryScenePackageSublistList'; // 场景数据包列表
+const getSceneParam = basePart + '/ScenePackage/getSceneParam'; // 场景测试包创建上限
 const saveScenePackage = basePart + '/ScenePackage/saveScenePackage'; // 场景数据包列表保存
 const queryCsb = basePart + '/ScoringRules/queryCsb'; // 测试包添加评分规则下拉
 
@@ -35,8 +36,6 @@ const saveSceneGeneralTemplate = basePart + '/SceneGeneralTemplate/saveSceneGene
 const saveSceneGeneralExample = basePart + '/SceneGeneralTemplate/saveSceneGeneralExample'; // 保存泛化场景
 const queryGeneralTemplateByFh = basePart + '/SceneGeneralTemplate/queryGeneralTemplateByFh'; // 泛化过的详情
 
-const getSceneParam = basePart + '/ScenePackage/getSceneParam'; // 场景测试包创建上限
-
 
 export default {
     queryScoringRulesList,
@@ -62,6 +61,7 @@ export default {
     deleteList,
 
     queryScenePackageSublistList,
+    getSceneParam,
     saveScenePackage,
     queryCsb,
 
@@ -71,7 +71,5 @@ export default {
     querySceneGeneralTemplateById,
     saveSceneGeneralTemplate,
     saveSceneGeneralExample,
-    queryGeneralTemplateByFh,
-
-    getSceneParam
+    queryGeneralTemplateByFh
 }

+ 11 - 1
src/api/systemManagement.js

@@ -1,4 +1,5 @@
 const basePart = '/simulation/resource/server'
+
 //账户管理
 const getUserPageList = basePart + '/user/getUserPageList'
 const saveUser = basePart + '/user/saveUser'
@@ -28,6 +29,11 @@ const queryPackageByUserId = basePart + '/SystemScenePackage/queryPackageByUserI
 const savePackageByUserId = basePart + '/SystemScenePackage/savePackageByUserId' // 保存场景包分配详情
 const querySystemScenePackageListByTJ = basePart + '/SystemScenePackage/querySystemScenePackageListByTJ' // 场景包数量统计
 
+// 场景上传
+const getSceneImporPagetList = basePart + '/sceneImport/getSceneImporPagetList' // 场景上传列表
+const saveSceneGeneralTemplateAll = basePart + '/SceneGeneralTemplate/saveSceneGeneralTemplateAll'; // 保存泛化场景-new
+const saveTask = basePart + '/sceneImport/saveTask'; // 保存3个真实场景
+
 
 export default {
     getUserPageList,
@@ -52,5 +58,9 @@ export default {
     queryPackageByUserIdList,
     queryPackageByUserId,
     savePackageByUserId,
-    querySystemScenePackageListByTJ
+    querySystemScenePackageListByTJ,
+
+    getSceneImporPagetList,
+    saveSceneGeneralTemplateAll,
+    saveTask
 }

+ 9 - 0
src/router/systemManagement.js

@@ -106,6 +106,15 @@ export default [{
         },
         component: () => import("@/views/systemManagement/scenePacketDistributionDetail")
     },
+    {
+        path: "/sceneUploadList",
+        name: "sceneUploadList",
+        meta: {
+            tabname: "场景上传",
+            menuKind: "systemManagement"
+        },
+        component: () => import("@/views/systemManagement/sceneUploadList")
+    },
     {
         path: "/reportTemplateManagement",
         name: "reportTemplateManagement",

+ 259 - 0
src/views/systemManagement/components/upload.vue

@@ -0,0 +1,259 @@
+<template>
+    <div>
+        <el-upload
+            class="upload"
+            ref="upload"
+            action=""
+            :before-upload="beforeUpload"
+            :on-change="handleChange"
+            :on-remove="handleRemove"
+            :on-preview="preview"
+            :on-success="success"
+            :on-error="error"
+            :http-request="toUpload"
+            :auto-upload="false"
+            :file-list="fileList"
+            :on-exceed="handleExceed"
+            :multiple="multiple"
+        >
+            <el-button type="primary" plain icon="el-icon-upload"
+                >上传文件</el-button
+            >
+        </el-upload>
+        <!--        <el-button @click="download">下载</el-button>-->
+    </div>
+</template>
+
+<script>
+export default {
+    name: "upload",
+    props: {
+        // 限制上传的个数
+        limit: {
+            type: Number,
+            default: 1,
+        },
+        // 一组文件传相同的值,保证其为一组
+        objectPath: {
+            type: String,
+            default: "1",
+        },
+        type: {
+            type: String,
+            default: "4",
+        },
+        // 是否需要处理大文件上传
+        needInstance: {
+            type: Boolean,
+            default: false,
+        },
+        // 上传url
+        uploadUrl: {
+            type: String,
+            default: "",
+        },
+        multiple: {
+            type: Boolean,
+            default: false,
+        },
+    },
+    data() {
+        return {
+            fileList: [],
+            attachmentList: [],
+            defaultParam: {},
+        };
+    },
+    methods: {
+        beforeUpload(file) {
+            let arr = ["xls", "xlsx"];
+            let i = file.name.lastIndexOf(".");
+
+            if (!arr.includes(file.name.slice(i + 1))) {
+                this.$message.warning("请上传以xlsx、xls为后缀名的Excel文件");
+                return false;
+            }
+        },
+        handleChange(file, fileList) {
+            this.fileList = fileList;
+
+            let arr = ["xls", "xlsx"];
+            let i = file.name.lastIndexOf(".");
+
+            if (!arr.includes(file.name.slice(i + 1))) {
+                this.$message.warning("请上传以xlsx、xls为后缀名的Excel文件");
+                return false;
+            }
+
+            this.$emit("handleChange", file);
+        },
+        handleExceed(files, fileList) {
+            this.$message.warning(
+                `当前限制选择 ${this.limit} 个文件,本次选择了 ${
+                    files.length
+                } 个文件,共选择了 ${files.length + fileList.length} 个文件`
+            );
+        },
+        async handleRemove(file, fileList) {
+            let md5 = "";
+            if (file.raw) {
+                await this.$md5(file.raw).then((res) => {
+                    md5 = res;
+                });
+            } else {
+                md5 = file.md5;
+            }
+
+            let removeIndex = "";
+            this.attachmentList.forEach((item, index) => {
+                if (md5 === item.md5) {
+                    removeIndex = index;
+                }
+            });
+
+            // if (removeIndex < 0) {
+            //     this.$message.error("删除失败");
+            // }
+
+            this.attachmentList.splice(removeIndex, 1);
+            this.$emit("attachmentChange", this.attachmentList);
+        },
+        async toUpload(file) {
+            let _this = this;
+
+            // console.log(file);
+            return;
+
+            return new Promise(async (resolve, reject) => {
+                let formData = new FormData();
+                await formData.append("name", file.file.name);
+                // await formData.append('type', _this.defaultParam.md5)
+                // console.log(this);
+
+                await formData.append("type", this.type);
+                await formData.append("objectPath", Math.random().toString());
+                // await formData.append("md5", _this.defaultParam.md5);
+                await formData.append("file", file.file);
+
+                let axios = this.$axios;
+                // 处理大文件上传 instance已被设置不携带token
+                // if (this.needInstance) {
+                //     axios = this.$instance;
+                // }
+
+                // 上传前进行通知
+                this.$emit("willUpload");
+
+                /* let url = this.uploadUrl;
+                    let defaultParam = {};
+                    if (!url) {
+                        url = this.$api.common.uploadWj;
+                        // 获取MD5值
+                        await this.$md5(file.file).then((res) => {
+                            defaultParam = {
+                                // file: file.file,
+                                md5: res,
+                            };
+                        });
+                    } */
+
+                let url = this.$api.sceneLibrary.saveSceneNatural;
+                let defaultParam = {};
+                // 获取MD5值
+                await this.$md5(file.file).then((res) => {
+                    defaultParam = {
+                        // file: file.file,
+                        md5: res,
+                    };
+                });
+
+                await axios({
+                    method: "post",
+                    url,
+                    data: formData,
+                    withCredentials: true,
+                    headers: {
+                        "Content-type": "multipart/form-data",
+                    },
+                }).then((res) => {
+                    if (res.code == 200) {
+                        // this.attachmentList.push({
+                        //     // attachmentName: file.file.name,
+                        //     // attachmentAddress: res.params,
+                        //     md5: defaultParam.md5 || "",
+                        //     // uid: file.file.uid,
+                        //     fileType: file.file.type,
+                        //     // fileName: res.info.fileName,
+                        //     // videoPreview: res.info.videoPreview,
+                        // });
+                        // resolve("成功");
+                        // this.$emit("attachmentChange", this.attachmentList);
+                        // 上传完成后进行通知
+                        // this.$emit("didUpload", "success");
+                        this.$refs.upload.clearFiles();
+                        this.$emit("didUpload");
+                    } else {
+                        this.$message.error(res.message || "上传失败");
+                        // this.$emit("didUpload", "fail");
+                        // reject("失败");
+                    }
+                });
+                // .catch((err) => {
+                //     this.$emit("didUpload", "error");
+                //     reject(err);
+                // });
+            });
+        },
+        success(response, file, fileList) {
+            this.$message.success("上传成功 ");
+        },
+        error(response, file, fileList) {
+            this.$message.warning("上传失败");
+        },
+        preview(file) {
+            return false;
+            console.log(file);
+            console.log(this.attachmentList);
+            let item = this.attachmentList.find((item) =>
+                item.fileName.endsWith(file.name)
+            );
+            this.download(item.fileName, item.attachmentName);
+        },
+        download(downPath, downName) {
+            this.$axios({
+                method: "post",
+                url: this.$api.common.download,
+                responseType: "blob",
+                data: {
+                    objectName: downPath,
+                },
+            }).then((res) => {
+                const blob = new Blob([res]); //构造一个blob对象来处理数据
+                const fileName = downName;
+                //对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
+                //IE10以上支持blob但是依然不支持download
+                if ("download" in document.createElement("a")) {
+                    //支持a标签download的浏览器
+                    const link = document.createElement("a"); //创建a标签
+                    link.download = fileName; //a标签添加属性
+                    link.style.display = "none";
+                    link.href = URL.createObjectURL(blob);
+                    document.body.appendChild(link);
+                    link.click(); //执行下载
+                    URL.revokeObjectURL(link.href); //释放url
+                    document.body.removeChild(link); //释放标签
+                } else {
+                    //其他浏览器
+                    navigator.msSaveBlob(blob, fileName);
+                }
+            });
+        },
+    },
+};
+</script>
+
+<style scoped>
+.upload /deep/ .el-upload-list {
+    display: none;
+}
+</style>

+ 399 - 0
src/views/systemManagement/sceneUploadList.vue

@@ -0,0 +1,399 @@
+<template>
+    <div>
+        <search-layout :needBox="true">
+            <template slot="searchItem1">
+                <span class="label">任务名称</span>
+                <el-input
+                    v-model="searchParams.name"
+                    size="small"
+                    clearable
+                    placeholder="请输入"
+                    maxlength="60"
+                    @keyup.enter.native="doSearch"
+                >
+                </el-input>
+            </template>
+            <template slot="searchItem2">
+                <span class="label">上传时间</span>
+                <el-date-picker
+                    v-model="uploadDate"
+                    type="daterange"
+                    format="yyyy-MM-dd"
+                    value-format="yyyy-MM-dd"
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                >
+                </el-date-picker>
+            </template>
+
+            <template slot="searchBtn1">
+                <el-button type="primary" @click="doSearch">查询</el-button>
+            </template>
+            <template slot="searchBtn2">
+                <el-button type="primary" @click="doReset">重置</el-button>
+            </template>
+        </search-layout>
+
+        <div class="btnsPanel">
+            <el-button
+                type="primary"
+                icon="el-icon-circle-plus-outline"
+                @click="addOne"
+                >新增</el-button
+            >
+        </div>
+
+        <tableList
+            ref="table"
+            style="margin: 0 30px"
+            :columns="columns"
+            :getDataWay="getDataWay"
+            :pagination="pagination"
+            index
+        >
+            <el-table-column label="操作" slot="cgInfos" align="center">
+                <template v-slot="scope">
+                    <span
+                        v-if="scope.row.errorMessage"
+                        @click="viewRow(scope.row)"
+                        class="errRecord"
+                        >错误记录</span
+                    >
+                </template>
+            </el-table-column>
+        </tableList>
+
+        <el-dialog
+            title="场景上传"
+            :visible.sync="dialogVisible"
+            width="690px"
+            :close-on-click-modal="false"
+            :close-on-press-escape="false"
+            :before-close="uploadCancel"
+        >
+            <el-form
+                ref="form"
+                :model="form"
+                :rules="rules"
+                label-width="108px"
+            >
+                <el-form-item label="任务名称:" prop="name">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="60"
+                        v-autoTrim="{ obj: form, key: 'name' }"
+                        v-model="form.name"
+                    >
+                    </el-input>
+                </el-form-item>
+
+                <el-form-item label="场景分类:" prop="sceneType">
+                    <el-select
+                        v-model="form.sceneType"
+                        @change="sceneTypeChange"
+                    >
+                        <el-option
+                            v-for="item in sceneTypeList"
+                            :label="item.caption"
+                            :value="item.code"
+                            :key="item.code"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+
+                <!-- 三个真实场景时展示 -->
+                <el-form-item
+                    v-if="form.sceneType != '4'"
+                    label="场景路径:"
+                    prop="dataDirectory"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="300"
+                        v-autoTrim="{ obj: form, key: 'dataDirectory' }"
+                        v-model="form.dataDirectory"
+                    >
+                    </el-input>
+                </el-form-item>
+
+                <!-- 泛化时展示 -->
+                <el-form-item
+                    v-if="form.sceneType === '4'"
+                    label="文件上传:"
+                    prop="fileName"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="600"
+                        v-autoTrim="{ obj: form, key: 'fileName' }"
+                        v-model="form.fileName"
+                        disabled
+                    >
+                    </el-input>
+                    <upload
+                        ref="upload"
+                        class="upload"
+                        @handleChange="handleChange"
+                    ></upload>
+                </el-form-item>
+            </el-form>
+            <span slot="footer">
+                <el-button type="primary" @click="uploadConfirm"
+                    >确 定</el-button
+                >
+                <el-button @click="uploadCancel">取 消</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import searchLayout from "@/components/grid/searchLayout";
+import tableList from "@/components/grid/TableList";
+import upload from "./components/upload";
+
+export default {
+    name: "sceneUploadList", // 场景上传
+    components: { searchLayout, tableList, upload },
+    data() {
+        let formatSeconds = function formatSeconds(value) {
+            var theTime = parseInt(value); // 秒
+            var theTime1 = 0; // 分
+            var theTime2 = 0; // 小时
+            if (theTime > 60) {
+                theTime1 = parseInt(theTime / 60);
+                theTime = parseInt(theTime % 60);
+                if (theTime1 > 60) {
+                    theTime2 = parseInt(theTime1 / 60);
+                    theTime1 = parseInt(theTime1 % 60);
+                }
+            }
+            var result = "" + parseInt(theTime) + "秒";
+            if (theTime1 > 0) {
+                result = "" + parseInt(theTime1) + "分" + result;
+            }
+            if (theTime2 > 0) {
+                result = "" + parseInt(theTime2) + "小时" + result;
+            }
+            return result;
+        };
+
+        return {
+            searchParams: {
+                //搜索参数
+                name: "", // 任务名称
+                timeBegin: "", // 上传时间起
+                timeEnd: "", // 上传时间止
+            },
+            uploadDate: "",
+            columns: [
+                {
+                    label: "任务名称",
+                    prop: "name",
+                },
+                {
+                    label: "场景分类",
+                    prop: "sceneType",
+                },
+                {
+                    label: "上传时间",
+                    prop: "createTime",
+                },
+                {
+                    label: "上传状态",
+                    prop: "status",
+                },
+                {
+                    label: "总用时长",
+                    prop: "totalTime",
+                    formatter: (row) => {
+                        if (row.totalTime)
+                            if (row.totalTime && !isNaN(row.totalTime)) {
+                                return formatSeconds(row.totalTime);
+                            }
+                    },
+                },
+                {
+                    label: "操作",
+                    prop: "cgInfos",
+                    template: true,
+                },
+            ],
+            pagination: {
+                //分页使用
+                currentPage: 1,
+                pageSize: 10,
+                position: "right",
+                pageSizes: [10, 30, 50, 100, 200],
+                layout: "sizes, total, prev, pager, next, jumper",
+            },
+            getDataWay: {
+                //加载表格数据
+                dataType: "url",
+                type: "post",
+                // firstRequest: false,
+                data: this.$api.systemManagement.getSceneImporPagetList,
+                param: {},
+            },
+            form: {
+                name: "", // 任务名称
+                sceneType: "", // 场景分类
+                dataDirectory: "", // 场景路径
+                fileName: "", // 文件名称
+            },
+            rules: {
+                name: [{ required: true, message: "请输入", trigger: "blur" }],
+                sceneType: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+                dataDirectory: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                ],
+                fileName: [
+                    { required: true, message: "请上传", trigger: "change" },
+                ],
+            },
+            sceneTypeList: [],
+            dialogVisible: false,
+            file: null,
+        };
+    },
+
+    methods: {
+        doSearch() {
+            if (this.uploadDate) {
+                this.searchParams.timeBegin = `${this.uploadDate[0]}`;
+                this.searchParams.timeEnd = `${this.uploadDate[1]}`;
+            } else {
+                this.searchParams.timeBegin = "";
+                this.searchParams.timeEnd = "";
+            }
+
+            let pageMap = {
+                name: this.searchParams.name,
+                timeBegin: this.searchParams.timeBegin,
+                timeEnd: this.searchParams.timeEnd,
+            };
+            this.refreshList(pageMap);
+        },
+        //刷新table
+        refreshList(param) {
+            param
+                ? this.$refs["table"].loadData(param)
+                : this.$refs["table"].loadData();
+        },
+        doReset() {
+            this.searchParams = {
+                name: "",
+                timeBegin: "",
+                timeEnd: "",
+            };
+            this.uploadDate = "";
+            this.doSearch();
+        },
+        addOne() {
+            this.form = {
+                name: "",
+                sceneType: "",
+                dataDirectory: "",
+                fileName: "",
+            };
+            this.file = null;
+
+            this.dialogVisible = true;
+
+            this.$nextTick(() => {
+                this.$refs.form.clearValidate();
+            });
+        },
+        viewRow(row) {},
+        uploadConfirm() {
+            this.$refs.form.validate(async (valid) => {
+                if (valid) {
+                    if (this.form.sceneType === "4") {
+                        let formData = new FormData();
+                        await formData.append("taskName", this.form.name);
+                        await formData.append("name", this.file.name);
+                        await formData.append("file", this.file.raw);
+
+                        await this.$axios({
+                            method: "post",
+                            url: this.$api.systemManagement
+                                .saveSceneGeneralTemplateAll,
+                            data: formData,
+                            withCredentials: true,
+                            headers: {
+                                "Content-type": "multipart/form-data",
+                            },
+                        }).then((res) => {
+                            if (res.code == 200) {
+                                this.$message.success("保存成功");
+                                this.uploadCancel();
+                                this.doSearch();
+                            } else {
+                                this.$message.error(res.message || "保存失败");
+                            }
+                        });
+                    } else {
+                        this.$axios({
+                            method: "post",
+                            url: this.$api.systemManagement.saveTask,
+                            data: { ...this.form },
+                        }).then((res) => {
+                            if (res.code == 200) {
+                                this.$message.success("保存成功");
+                                this.uploadCancel();
+                                this.doSearch();
+                            } else {
+                                this.$message.error(res.message || "保存失败");
+                            }
+                        });
+                    }
+                }
+            });
+        },
+        uploadCancel() {
+            this.dialogVisible = false;
+        },
+        attachmentChange(obj) {
+            this.attachmentList = obj;
+        },
+        handleChange(file) {
+            this.file = file;
+            this.form.fileName = file.name;
+        },
+        sceneTypeChange(v) {
+            if (v === "4") {
+                this.$refs.form.clearValidate("dataDirectory");
+            } else {
+                this.file = null;
+                this.form.fileName = "";
+                this.$refs.form.clearValidate("fileName");
+            }
+        },
+    },
+
+    async mounted() {
+        await this.$dicsListsInit({
+            sceneTypeList: "sceneType",
+        });
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.btnsPanel {
+    margin: 45px 40px 15px;
+    text-align: right;
+}
+
+.errRecord {
+    color: @themeColor;
+    cursor: pointer;
+}
+
+.upload {
+    margin-top: 15px;
+}
+</style>

+ 2 - 2
vue.config.js

@@ -88,8 +88,8 @@ module.exports = {
                 // target: 'http://10.10.83.145:6888/user-center',
                 // target: 'http://10.12.10.70/simulation',
                 // target: 'http://10.12.10.70:7001', // 登录
-                target: 'http://10.12.10.73:7003',  // 王志强
-                // target: 'http://10.12.10.70', // windowstest
+                // target: 'http://10.12.10.73:7003',  // 王志强
+                target: 'http://10.12.10.70', // windowstest
                 // target: 'http://10.12.10.87:8001',  // 赵艳
                 // target: 'http://10.12.10.72:8001',  // 王晓峰
                 // target: 'http://192.168.30.75',  // gq