Jelajahi Sumber

车辆模型-加载carsim

zhangliang2 2 tahun lalu
induk
melakukan
e2fddf7c2a

+ 5 - 1
src/api/common.js

@@ -18,6 +18,8 @@ const completeMultipartUpload = basePart + '/simulation/resource/common/minio/co
 const getMyMenuTree = '/simulation/resource/server/menu/getMyMenuTree'; // 获取左侧菜单
 const getCurrentUserInfo = '/simulation/resource/server/userInfo/getCurrentUserInfo'; // 获取个人信息
 
+const parse = basePart + '/simulation/resource/common/excel/parse'; // excel解析
+
 export default {
     single,
     username,
@@ -35,7 +37,9 @@ export default {
     completeMultipartUpload,
 
     getMyMenuTree,
-    getCurrentUserInfo
+    getCurrentUserInfo,
+
+    parse
 }
 
 //10.15.12.74:7001/simulation/oauth/client/sign/single?code=1001&ticket=1001

TEMPAT SAMPAH
src/assets/common/image/others/car.png


TEMPAT SAMPAH
src/assets/common/image/others/carsim.png


TEMPAT SAMPAH
src/assets/common/image/others/carsimFont.png


+ 234 - 0
src/components/echarts/lineChartCarsim.vue

@@ -0,0 +1,234 @@
+<template>
+    <div class="linechart" :id="id" style="width: 100%; height: 100%"></div>
+</template>
+
+<script>
+import { mapState } from "vuex";
+
+export default {
+    name: "lineChartCarsim", // carsim-折线图
+    props: {
+        id: {
+            default: "lineChartCarsim",
+            type: String,
+        },
+        dataList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+        columns: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+    },
+
+    data() {
+        return {
+            tipData: [], //线数据
+            showData: [], //展示数据
+            charts: "",
+        };
+    },
+
+    watch: {
+        dataList: {
+            handler(val) {
+                if (val.length > 0) {
+                    this.initStateList();
+                }
+            },
+            deep: true,
+        },
+    },
+
+    computed: {
+        ...mapState(["themeColor"]),
+    },
+
+    methods: {
+        initStateList() {
+            let array = this.dataList;
+
+            for (let index = 0; index < array.length; index++) {
+                const element = array[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    let option1 = {
+                        title: {
+                            text: "暂无数据",
+                            show: flag,
+                            left: "center",
+                            top: "center",
+                        },
+                        tooltip: {
+                            //提示框,可以在全局也可以在
+                            trigger: "item", //提示框的样式
+                            formatter: "{b}: {c}",
+                            color: "#000", //提示框的背景色
+                            textStyle: {
+                                //提示的字体样式
+                                color: "#ffffff",
+                            },
+                            confine: true,
+                        },
+                        xAxis: {
+                            // name: "t(s)",
+                            type: "category",
+                            boundaryGap: false,
+                            data: [],
+                        },
+                        yAxis: {
+                            // name: this.yUnit,
+                        },
+                        series: [
+                            {
+                                data: [],
+                                type: "line",
+                                smooth: true,
+                                symbol: "circle",
+                                symbolSize: 6,
+                                lineStyle: {
+                                    normal: {
+                                        width: 1.5,
+                                        // color: this.themeColor,
+                                    },
+                                },
+                                itemStyle: {
+                                    normal: {
+                                        // color: this.themeColor,
+                                    },
+                                },
+                            },
+                        ],
+                        grid: {
+                            top: "30px",
+                            left: "30px",
+                            right: "40px",
+                            bottom: "10%",
+                            containLabel: true,
+                        },
+                    };
+                    this.charts.clear();
+                    this.charts.setOption(option1);
+                    return;
+                }
+            }
+
+            let props = [];
+
+            this.columns.forEach((i) => {
+                props.push(i.prop); // ['x', '1.0', '2.0', '3.0', '4.0']
+            });
+
+            let xData = [];
+            let yData = [];
+
+            props.forEach((j) => {
+                let arr = [];
+                array.forEach((i) => {
+                    let a = i[j] || 0;
+                    if (j === "x") {
+                        xData.push(a);
+                    } else {
+                        arr.push(a);
+                    }
+                });
+
+                if (j != "x") yData.push(arr);
+            });
+
+            let series = [];
+
+            yData.forEach((i, index) => {
+                series.push({
+                    name: props[index + 1],
+                    data: i,
+                    type: "line",
+                    smooth: true,
+                    symbol: "circle",
+                    symbolSize: 6,
+                    lineStyle: {
+                        normal: {
+                            width: 1.5,
+                            // color: this.themeColor,
+                        },
+                    },
+                    itemStyle: {
+                        normal: {
+                            // color: this.themeColor,
+                        },
+                    },
+                });
+            });
+
+            let option = {
+                title: {
+                    text: "暂无数据",
+                    show: yData.length === 0,
+                    left: "center",
+                    top: "center",
+                },
+                tooltip: {
+                    //提示框,可以在全局也可以在
+                    trigger: "item", //提示框的样式
+                    formatter: "{b}: {c}",
+                    color: "#000", //提示框的背景色
+                    textStyle: {
+                        //提示的字体样式
+                        color: "#ffffff",
+                    },
+                    confine: true,
+                },
+                xAxis: {
+                    // name: "t(s)",
+                    type: "category",
+                    boundaryGap: false,
+                    data: xData,
+                },
+                yAxis: {
+                    // name: this.yUnit,
+                },
+                legend: {},
+                series,
+                grid: {
+                    top: "36px",
+                    left: "30px",
+                    right: "30px",
+                    bottom: "10%",
+                    containLabel: true,
+                },
+            };
+            this.charts.setOption(option);
+        },
+    },
+
+    mounted() {
+        this.charts = this.$echarts.init(document.getElementById(this.id));
+
+        this.initStateList();
+
+        this.$nextTick(() => {
+            window.addEventListener("resize", () => {
+                this.charts.resize();
+            });
+        });
+    },
+
+    destroyed() {
+        this.charts.dispose();
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.linechart {
+    margin: 0 auto;
+    overflow: hidden;
+}
+</style>

+ 317 - 0
src/components/echarts/lineChartCarsimA.vue

@@ -0,0 +1,317 @@
+<template>
+    <div class="linechart" :id="id" style="width: 100%; height: 100%"></div>
+</template>
+
+<script>
+import { mapState } from "vuex";
+
+export default {
+    name: "lineChartCarsimA", // carsim-折线图
+    props: {
+        id: {
+            default: "lineChartCarsimA",
+            type: String,
+        },
+        dataList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+        dataListA: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+        columns: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+    },
+
+    data() {
+        return {
+            tipData: [], //线数据
+            showData: [], //展示数据
+            charts: "",
+        };
+    },
+
+    watch: {
+        dataList: {
+            handler(val) {
+                if (val.length > 0) {
+                    this.initStateList();
+                }
+            },
+            deep: true,
+        },
+        dataListA: {
+            handler(val) {
+                if (val.length > 0) {
+                    this.initStateList();
+                }
+            },
+            deep: true,
+        },
+    },
+
+    computed: {
+        ...mapState(["themeColor"]),
+    },
+
+    methods: {
+        initStateList() {
+            let array = this.dataList;
+            let array1 = this.dataListA;
+
+            for (let index = 0; index < array.length; index++) {
+                const element = array[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    let option1 = {
+                        title: {
+                            text: "暂无数据",
+                            show: flag,
+                            left: "center",
+                            top: "center",
+                        },
+                        tooltip: {
+                            //提示框,可以在全局也可以在
+                            trigger: "item", //提示框的样式
+                            formatter: "{b}: {c}",
+                            color: "#000", //提示框的背景色
+                            textStyle: {
+                                //提示的字体样式
+                                color: "#ffffff",
+                            },
+                            confine: true,
+                        },
+                        xAxis: {
+                            type: "category",
+                            boundaryGap: false,
+                            data: [],
+                        },
+                        yAxis: {},
+                        series: [
+                            {
+                                data: [],
+                                type: "line",
+                                smooth: true,
+                                symbol: "circle",
+                                symbolSize: 6,
+                                lineStyle: {
+                                    normal: {
+                                        width: 1.5,
+                                        // color: this.themeColor,
+                                    },
+                                },
+                                itemStyle: {
+                                    normal: {
+                                        // color: this.themeColor,
+                                    },
+                                },
+                            },
+                        ],
+                        grid: {
+                            top: "30px",
+                            left: "30px",
+                            right: "40px",
+                            bottom: "10%",
+                            containLabel: true,
+                        },
+                    };
+                    this.charts.clear();
+                    this.charts.setOption(option1);
+                    return;
+                }
+            }
+
+            for (let index = 0; index < array1.length; index++) {
+                const element = array1[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    let option1 = {
+                        title: {
+                            text: "暂无数据",
+                            show: flag,
+                            left: "center",
+                            top: "center",
+                        },
+                        tooltip: {
+                            //提示框,可以在全局也可以在
+                            trigger: "item", //提示框的样式
+                            formatter: "{b}: {c}",
+                            color: "#000", //提示框的背景色
+                            textStyle: {
+                                //提示的字体样式
+                                color: "#ffffff",
+                            },
+                            confine: true,
+                        },
+                        xAxis: {
+                            type: "category",
+                            boundaryGap: false,
+                            data: [],
+                        },
+                        yAxis: {},
+                        series: [
+                            {
+                                data: [],
+                                type: "line",
+                                smooth: true,
+                                symbol: "circle",
+                                symbolSize: 6,
+                                lineStyle: {
+                                    normal: {
+                                        width: 1.5,
+                                        // color: this.themeColor,
+                                    },
+                                },
+                                itemStyle: {
+                                    normal: {
+                                        // color: this.themeColor,
+                                    },
+                                },
+                            },
+                        ],
+                        grid: {
+                            top: "30px",
+                            left: "30px",
+                            right: "40px",
+                            bottom: "10%",
+                            containLabel: true,
+                        },
+                    };
+                    this.charts.clear();
+                    this.charts.setOption(option1);
+                    return;
+                }
+            }
+
+            let props = ["x", "y"];
+
+            let xData = [];
+            let yData = [];
+
+            props.forEach((j) => {
+                let arr = [];
+                array.forEach((i) => {
+                    let a = i[j] || 0;
+                    if (j === "x") {
+                        xData.push(a);
+                    } else {
+                        arr.push(a);
+                    }
+                });
+
+                if (j != "x") yData.push(arr);
+            });
+
+            props.forEach((j) => {
+                let arr = [];
+                array1.forEach((i) => {
+                    let a = i[j] || 0;
+                    if (j != "x") {
+                        arr.push(a);
+                    }
+                });
+
+                if (j != "x") yData.push(arr);
+            });
+
+            let series = [];
+
+            let names = ["up-shifting", "down-shifting"];
+
+            yData.forEach((i, index) => {
+                series.push({
+                    name: names[index],
+                    data: i,
+                    type: "line",
+                    smooth: true,
+                    symbol: "circle",
+                    symbolSize: 6,
+                    lineStyle: {
+                        normal: {
+                            width: 1.5,
+                            // color: this.themeColor,
+                        },
+                    },
+                    itemStyle: {
+                        normal: {
+                            // color: this.themeColor,
+                        },
+                    },
+                });
+            });
+
+            let option = {
+                title: {
+                    text: "暂无数据",
+                    show: yData.length === 0,
+                    left: "center",
+                    top: "center",
+                },
+                tooltip: {
+                    //提示框,可以在全局也可以在
+                    trigger: "item", //提示框的样式
+                    formatter: "{b}: {c}",
+                    color: "#000", //提示框的背景色
+                    textStyle: {
+                        //提示的字体样式
+                        color: "#ffffff",
+                    },
+                    confine: true,
+                },
+                xAxis: {
+                    type: "category",
+                    boundaryGap: false,
+                    data: xData,
+                },
+                yAxis: {},
+                legend: {},
+                series,
+                grid: {
+                    top: "36px",
+                    left: "30px",
+                    right: "30px",
+                    bottom: "10%",
+                    containLabel: true,
+                },
+            };
+            this.charts.setOption(option);
+        },
+    },
+
+    mounted() {
+        this.charts = this.$echarts.init(document.getElementById(this.id));
+
+        this.initStateList();
+
+        this.$nextTick(() => {
+            window.addEventListener("resize", () => {
+                this.charts.resize();
+            });
+        });
+    },
+
+    destroyed() {
+        this.charts.dispose();
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.linechart {
+    margin: 0 auto;
+    overflow: hidden;
+}
+</style>

+ 224 - 0
src/components/echarts/lineChartCarsimB.vue

@@ -0,0 +1,224 @@
+<template>
+    <div class="linechart" :id="id" style="width: 100%; height: 100%"></div>
+</template>
+
+<script>
+import { mapState } from "vuex";
+
+export default {
+    name: "lineChartCarsimB", // carsim-折线图
+    props: {
+        id: {
+            default: "lineChartCarsimB",
+            type: String,
+        },
+        dataList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+        columns: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+    },
+
+    data() {
+        return {
+            tipData: [], //线数据
+            showData: [], //展示数据
+            charts: "",
+        };
+    },
+
+    watch: {
+        dataList: {
+            handler(val) {
+                if (val.length > 0) {
+                    this.initStateList();
+                }
+            },
+            deep: true,
+        },
+    },
+
+    computed: {
+        ...mapState(["themeColor"]),
+    },
+
+    methods: {
+        initStateList() {
+            let array = this.dataList;
+
+            for (let index = 0; index < array.length; index++) {
+                const element = array[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    let option1 = {
+                        title: {
+                            text: "暂无数据",
+                            show: flag,
+                            left: "center",
+                            top: "center",
+                        },
+                        tooltip: {
+                            //提示框,可以在全局也可以在
+                            trigger: "item", //提示框的样式
+                            formatter: "{b}: {c}",
+                            color: "#000", //提示框的背景色
+                            textStyle: {
+                                //提示的字体样式
+                                color: "#ffffff",
+                            },
+                            confine: true,
+                        },
+                        xAxis: {
+                            type: "category",
+                            boundaryGap: false,
+                            data: [],
+                        },
+                        yAxis: {},
+                        series: [
+                            {
+                                data: [],
+                                type: "line",
+                                smooth: true,
+                                symbol: "circle",
+                                symbolSize: 6,
+                                lineStyle: {
+                                    normal: {
+                                        width: 1.5,
+                                        color: this.themeColor,
+                                    },
+                                },
+                                itemStyle: {
+                                    normal: {
+                                        color: this.themeColor,
+                                    },
+                                },
+                            },
+                        ],
+                        grid: {
+                            top: "30px",
+                            left: "30px",
+                            right: "40px",
+                            bottom: "10%",
+                            containLabel: true,
+                        },
+                    };
+                    this.charts.clear();
+                    this.charts.setOption(option1);
+                    return;
+                }
+            }
+
+            let props = ["x", "y"];
+
+            let xData = [];
+            let yData = [];
+
+            props.forEach((j) => {
+                let arr = [];
+                array.forEach((i) => {
+                    let a = i[j] || 0;
+                    if (j === "x") {
+                        xData.push(a);
+                    } else {
+                        arr.push(a);
+                    }
+                });
+
+                if (j != "x") yData.push(arr);
+            });
+
+            let series = [];
+
+            yData.forEach((i, index) => {
+                series.push({
+                    name: '数据',
+                    data: i,
+                    type: "line",
+                    smooth: true,
+                    symbol: "circle",
+                    symbolSize: 6,
+                    lineStyle: {
+                        normal: {
+                            width: 1.5,
+                            color: this.themeColor,
+                        },
+                    },
+                    itemStyle: {
+                        normal: {
+                            color: this.themeColor,
+                        },
+                    },
+                });
+            });
+
+            let option = {
+                title: {
+                    text: "暂无数据",
+                    show: yData.length === 0,
+                    left: "center",
+                    top: "center",
+                },
+                tooltip: {
+                    //提示框,可以在全局也可以在
+                    trigger: "item", //提示框的样式
+                    formatter: "{b}: {c}",
+                    color: "#000", //提示框的背景色
+                    textStyle: {
+                        //提示的字体样式
+                        color: "#ffffff",
+                    },
+                    confine: true,
+                },
+                xAxis: {
+                    type: "category",
+                    boundaryGap: false,
+                    data: xData,
+                },
+                yAxis: {},
+                legend: {},
+                series,
+                grid: {
+                    top: "36px",
+                    left: "30px",
+                    right: "30px",
+                    bottom: "10%",
+                    containLabel: true,
+                },
+            };
+            this.charts.setOption(option);
+        },
+    },
+
+    mounted() {
+        this.charts = this.$echarts.init(document.getElementById(this.id));
+
+        this.initStateList();
+
+        this.$nextTick(() => {
+            window.addEventListener("resize", () => {
+                this.charts.resize();
+            });
+        });
+    },
+
+    destroyed() {
+        this.charts.dispose();
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.linechart {
+    margin: 0 auto;
+    overflow: hidden;
+}
+</style>

+ 432 - 0
src/views/modelLibrary/components/modelTypeList.vue

@@ -0,0 +1,432 @@
+<template>
+    <div class="modelListPanel">
+        <div class="addBtn" @click="addOne">
+            <span>新增</span>
+            <i class="el-icon-plus"></i>
+        </div>
+        <div class="listPanel">
+            <div class="inputPanel">
+                <el-input
+                    placeholder="请输入内容"
+                    v-model="searchName"
+                    maxlength="60"
+                    class="input-with-select"
+                    clearable
+                >
+                    <el-button
+                        slot="append"
+                        icon="el-icon-search"
+                        @click="searchOne"
+                    ></el-button>
+                </el-input>
+            </div>
+
+            <div class="titleLabel">公有</div>
+            <div class="autoScrollBox">
+                <div class="boxPanel" v-bind:class="{ isActive: vtdPub }">
+                    <div class="titlePanel">
+                        <i
+                            class="el-icon el-icon-caret-right"
+                            @click="handleChange('vtdPub')"
+                        ></i>
+                        <span class="title" @click="handleChange('vtdPub')"
+                            >VTD</span
+                        >
+                    </div>
+                    <ul class="list listPub">
+                        <li v-for="item in listVtdPub" :key="item.id">
+                            <span
+                                @click="showInfo(item.id)"
+                                v-bind:class="{
+                                    isCur:
+                                        curOne.share === '1' &&
+                                        curOne.id === item.id,
+                                }"
+                            >
+                                {{ item[showName] }}
+                            </span>
+                        </li>
+                    </ul>
+                </div>
+
+                <div class="boxPanel" v-bind:class="{ isActive: carsimPub }">
+                    <div class="titlePanel">
+                        <i
+                            class="el-icon el-icon-caret-right"
+                            @click="handleChange('carsimPub')"
+                        ></i>
+                        <span class="title" @click="handleChange('carsimPub')"
+                            >Carsim</span
+                        >
+                    </div>
+                    <ul class="list listPub">
+                        <li v-for="item in listCarsimPub" :key="item.id">
+                            <span
+                                @click="showInfo(item.id)"
+                                v-bind:class="{
+                                    isCur:
+                                        curOne.share === '1' &&
+                                        curOne.id === item.id,
+                                }"
+                            >
+                                {{ item[showName] }}
+                            </span>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+
+            <div class="titleLabel">私有</div>
+            <div class="autoScrollBox">
+                <div class="boxPanel" v-bind:class="{ isActive: vtdPri }">
+                    <div class="titlePanel">
+                        <i
+                            class="el-icon el-icon-caret-right"
+                            @click="handleChange('vtdPri')"
+                        ></i>
+                        <span class="title" @click="handleChange('vtdPri')"
+                            >VTD</span
+                        >
+                    </div>
+                    <ul class="list listPri">
+                        <li v-for="item in listVtdPri" :key="item.id">
+                            <span
+                                @click="showInfo(item.id)"
+                                v-bind:class="{
+                                    isCur:
+                                        curOne.share === '0' &&
+                                        curOne.id === item.id,
+                                }"
+                            >
+                                {{ item[showName] }}
+                            </span>
+                            <i
+                                class="el-icon-delete"
+                                @click="delOne(item.id)"
+                            ></i>
+                        </li>
+                    </ul>
+                </div>
+
+                <div class="boxPanel" v-bind:class="{ isActive: carsimPri }">
+                    <div class="titlePanel">
+                        <i
+                            class="el-icon el-icon-caret-right"
+                            @click="handleChange('carsimPri')"
+                        ></i>
+                        <span class="title" @click="handleChange('carsimPri')"
+                            >Carsim</span
+                        >
+                    </div>
+                    <ul class="list listPri">
+                        <li v-for="item in listCarsimPri" :key="item.id">
+                            <span
+                                @click="showInfo(item.id)"
+                                v-bind:class="{
+                                    isCur:
+                                        curOne.share === '0' &&
+                                        curOne.id === item.id,
+                                }"
+                            >
+                                {{ item[showName] }}
+                            </span>
+                            <i
+                                class="el-icon-delete"
+                                @click="delOne(item.id)"
+                            ></i>
+                        </li>
+                    </ul>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+//import  from '';
+
+export default {
+    name: "modelTypeList", // 模型列表-带分类
+    components: {},
+    data() {
+        return {
+            searchName: "",
+            listVtdPub: [], // 公有vtd列表
+            listCarsimPub: [], // 公有carsim列表
+            listVtdPri: [], // 私有vtd列表
+            listCarsimPri: [], // 私有carsim列表
+            isShowed: false, // 判断是否进行过初次展示,只执行一次
+            vtdPub: false,
+            carsimPub: false,
+            vtdPri: false,
+            carsimPri: false,
+        };
+    },
+
+    props: {
+        getListApi: {
+            type: String,
+            default: "",
+        },
+        showName: {
+            type: String,
+            default: "",
+        },
+        curOne: {
+            default: function () {
+                return {
+                    share: "",
+                    id: "",
+                };
+            },
+            type: Object,
+        },
+    },
+
+    methods: {
+        getList() {
+            if (!this.getListApi) return;
+
+            let data = {};
+            data[this.showName] = this.searchName;
+
+            this.$axios({
+                method: "post",
+                url: this.getListApi,
+                data,
+            }).then((res) => {
+                if (res.code == 200 && res.info) {
+                    this.listVtdPub = res.info.filter(
+                        (i) => i.share === "1" && i.parameterType === "1"
+                    );
+                    this.listCarsimPub = res.info.filter(
+                        (i) => i.share === "1" && i.parameterType === "2"
+                    );
+                    this.listVtdPri = res.info.filter(
+                        (i) => i.share === "0" && i.parameterType === "1"
+                    );
+                    this.listCarsimPri = res.info.filter(
+                        (i) => i.share === "0" && i.parameterType === "2"
+                    );
+
+                    if (!this.isShowed) {
+                        this.isShowed = true;
+                        if (this.listVtdPub[0] && this.listVtdPub[0].id) {
+                            this.showInfo(this.listVtdPub[0].id);
+                        }
+                    }
+                } else {
+                    this.$message.error(res.message || "获取失败");
+                }
+            });
+        },
+        showInfo(id) {
+            this.$emit("showInfo", id);
+        },
+        addOne() {
+            this.$emit("addOne");
+        },
+        delOne(id) {
+            this.$confirm("确认是否删除?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            }).then(() => {
+                this.$emit("delOne", id);
+            });
+        },
+        searchOne() {
+            this.getList();
+        },
+        handleChange(name) {
+            if (this[name]) {
+                this[name] = false;
+            } else {
+                this[name] = true;
+            }
+        },
+    },
+
+    mounted() {
+        this.getList();
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.modelListPanel {
+    position: relative;
+    width: 322px;
+    margin-right: 10px;
+
+    .addBtn {
+        position: relative;
+        z-index: 1;
+        display: flex;
+        justify-content: space-between;
+        width: 320px;
+        padding: 12px 24px;
+        margin: 0 auto;
+        border-radius: 3px;
+        color: #ffffff;
+        background: @themeColor;
+        cursor: pointer;
+    }
+
+    .listPanel {
+        padding-top: 18px;
+        border: 1px solid @grayLine;
+        border-radius: 4px;
+        box-shadow: 3px 0 6px @grayLine, 0 3px 6px @grayLine, 0 0px transparent,
+            -3px 0 6px @grayLine;
+        overflow: hidden;
+
+        .titleLabel {
+            border-left: 6px solid @themeColor;
+            padding-left: 20px;
+            margin-bottom: 4px;
+            color: @themeColor;
+            font-size: 16px;
+            font-weight: bold;
+        }
+
+        .titlePanel {
+            display: flex;
+            align-items: center;
+            cursor: pointer;
+            margin: 0 10px 20px 0;
+
+            .title {
+                flex: 1;
+                padding-left: 10px;
+                font-weight: bold;
+            }
+        }
+
+        .el-icon-caret-right {
+            transform: rotate(0);
+            transition: all 0.3s;
+        }
+
+        // .list1 {
+        //     margin: 0 10px 40px 26px;
+        //     border-top: 1px solid @grayLine;
+
+        //     li {
+        //         margin-top: 10px;
+        //         word-break: break-all;
+        //         align-items: center;
+
+        //         span,
+        //         i {
+        //             cursor: pointer;
+        //         }
+
+        //         .isCur {
+        //             color: @themeColor;
+        //         }
+        //     }
+        // }
+
+        .list {
+            height: 0;
+            overflow: hidden;
+            transition: all 0.3s;
+
+            li {
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+                margin: 0 10px 15px 24px;
+                transition: all 0.3s;
+                word-break: break-all;
+
+                &:last-child {
+                    margin-bottom: 20px;
+                }
+
+                span,
+                i {
+                    cursor: pointer;
+                }
+
+                span {
+                    margin-right: 10px;
+                }
+
+                .isCur {
+                    color: @themeColor;
+                }
+            }
+        }
+
+        .autoScrollBox {
+            height: calc(50% - 91px);
+            margin: 0 10px 40px 26px;
+            padding-top: 10px;
+            border-top: 1px solid @grayLine;
+            overflow-y: auto;
+        }
+
+        .listPri li {
+            i {
+                font-size: 16px;
+                color: @themeColor;
+            }
+        }
+    }
+
+    .isActive {
+        .el-icon-caret-right {
+            transform: rotate(90deg);
+            transition: all 0.3s;
+        }
+
+        .list {
+            height: auto;
+            transition: all 0.3s;
+        }
+
+        .titlePanel {
+            margin-bottom: 20px;
+        }
+    }
+
+    .inputPanel {
+        margin: 0 10px 20px;
+
+        .el-input {
+            width: 300px;
+        }
+
+        /deep/ .el-input-group__append {
+            background-color: #fff;
+            border-color: #e5e5e5;
+            padding: 0;
+            overflow: hidden;
+        }
+    }
+
+    .el-icon {
+        color: @themeColor;
+        font-size: 18px;
+    }
+
+    .input-with-select .el-input-group__prepend {
+        background-color: #fff;
+    }
+
+    /deep/ .el-input-group__append button.el-button,
+    /deep/ .el-input-group__append div.el-select .el-input__inner,
+    /deep/ .el-input-group__append div.el-select:hover .el-input__inner,
+    /deep/ .el-input-group__prepend button.el-button,
+    /deep/ .el-input-group__prepend div.el-select .el-input__inner,
+    /deep/ .el-input-group__prepend div.el-select:hover .el-input__inner {
+        border-color: transparent;
+        background-color: transparent;
+        color: inherit;
+        border-top: 0;
+        border-bottom: 0;
+    }
+}
+</style>

+ 232 - 0
src/views/modelLibrary/components/upload.vue

@@ -0,0 +1,232 @@
+<template>
+    <div>
+        <el-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="true"
+            :file-list="fileList"
+            :limit="limit"
+            :on-exceed="handleExceed"
+            :multiple="multiple"
+        >
+            <el-button size="small" type="primary">点击上传</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: "1",
+        },
+        // 是否需要处理大文件上传
+        needInstance: {
+            type: Boolean,
+            default: false,
+        },
+        multiple: {
+            type: Boolean,
+            default: true,
+        },
+        // 上传url
+        uploadUrl: {
+            type: String,
+            default: "",
+        },
+    },
+    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).toLowerCase())) {
+                this.$message.warning("请上传以xlsx、xls为后缀名的Excel文件");
+                return false;
+            }
+        },
+        handleChange(file, fileList) {
+            this.fileList = fileList;
+        },
+        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", "");
+        },
+        async toUpload(file) {
+            let _this = this;
+
+            return new Promise(async (resolve, reject) => {
+                let formData = new FormData();
+                // await formData.append("name", file.file.name);
+                // await formData.append('type', _this.defaultParam.md5)
+                // await formData.append("type", this.type);
+                // await formData.append("objectPath", this.objectPath);
+                // await formData.append("md5", _this.defaultParam.md5);
+                await formData.append("excel", 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.common.parse;
+                // 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 && res.info) {
+                            this.attachmentList.push({
+                                info: res.info,
+                            });
+                            resolve("成功");
+                            this.$emit("attachmentChange", res.info);
+                            // 上传完成后进行通知
+                            this.$emit("didUpload", "success");
+                        } 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>
+</style>

+ 3241 - 0
src/views/modelLibrary/components/vehicleModelCarsim.vue

@@ -0,0 +1,3241 @@
+<template>
+    <div>
+        <el-form ref="form" :model="form" :rules="rules" label-width="160px">
+            <div class="titlePanel">
+                <div class="titlePanelBor">几何参数</div>
+            </div>
+
+            <div class="titlePanelA padTop0">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>车体</span>
+                </div>
+            </div>
+
+            <div class="carTipBox">
+                <div class="searchLayoutBox">
+                    <img :src="imgSrc" width="100%" alt="" />
+                    <el-form-item label="" prop="wheelCenterToTop" class="p1">
+                        <el-input
+                            placeholder="请输入"
+                            maxlength="12"
+                            v-autoTrim="{ obj: form, key: 'wheelCenterToTop' }"
+                            v-model="form.wheelCenterToTop"
+                        >
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item
+                        label=""
+                        prop="wheelCenterToGround"
+                        class="p2"
+                    >
+                        <el-input
+                            placeholder="请输入"
+                            maxlength="12"
+                            v-autoTrim="{
+                                obj: form,
+                                key: 'wheelCenterToGround',
+                            }"
+                            v-model="form.wheelCenterToGround"
+                        >
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item
+                        label=""
+                        prop="centroidToFrontWheelCenter"
+                        class="p3"
+                    >
+                        <el-input
+                            placeholder="请输入"
+                            maxlength="12"
+                            v-autoTrim="{
+                                obj: form,
+                                key: 'centroidToFrontWheelCenter',
+                            }"
+                            v-model="form.centroidToFrontWheelCenter"
+                        >
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item label="" prop="centroidToGround" class="p4">
+                        <el-input
+                            placeholder="请输入"
+                            maxlength="12"
+                            v-autoTrim="{ obj: form, key: 'centroidToGround' }"
+                            v-model="form.centroidToGround"
+                        >
+                        </el-input>
+                    </el-form-item>
+                    <el-form-item label="" prop="wheelbase" class="p6">
+                        <el-input
+                            placeholder="请输入"
+                            maxlength="12"
+                            v-autoTrim="{ obj: form, key: 'wheelbase' }"
+                            v-model="form.wheelbase"
+                        >
+                        </el-input>
+                    </el-form-item>
+                </div>
+            </div>
+
+            <div class="flexBox padTop22">
+                <el-form-item label="簧上质量:" prop="sprungMass">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'sprungMass' }"
+                        v-model="form.sprungMass"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车辆宽度:" prop="vehicleWidth">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'vehicleWidth' }"
+                        v-model="form.vehicleWidth"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="整车绕Y轴转动惯量:"
+                    prop="rotationalInertiaY"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'rotationalInertiaY' }"
+                        v-model="form.rotationalInertiaY"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="整车绕Z轴转动惯量:"
+                    prop="rotationalInertiaZ"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'rotationalInertiaZ' }"
+                        v-model="form.rotationalInertiaZ"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="整车绕X轴转动惯量:"
+                    prop="rotationalInertiaX"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'rotationalInertiaX' }"
+                        v-model="form.rotationalInertiaX"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanelA">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>轮胎</span>
+                </div>
+            </div>
+
+            <div class="myTabsBox myTabsBoxFourTabs">
+                <el-tabs
+                    v-model="activeName"
+                    type="card"
+                    @tab-click="pageControl"
+                >
+                    <el-tab-pane label="左前轮" name="1"></el-tab-pane>
+                    <el-tab-pane label="左后轮" name="2"></el-tab-pane>
+                    <el-tab-pane label="右前轮" name="3"></el-tab-pane>
+                    <el-tab-pane label="右后轮" name="4"></el-tab-pane>
+                </el-tabs>
+            </div>
+            <div v-show="activeName === '1'" class="flexBox">
+                <el-form-item
+                    label="有效滚动半径/mm:"
+                    prop="frontLeftWheelEffectiveRollingRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontLeftWheelEffectiveRollingRadius',
+                        }"
+                        v-model="form.frontLeftWheelEffectiveRollingRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="滚动阻力系数:"
+                    prop="frontLeftWheelRollingResistanceCoefficient"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontLeftWheelRollingResistanceCoefficient',
+                        }"
+                        v-model="
+                            form.frontLeftWheelRollingResistanceCoefficient
+                        "
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="自由半径/mm:"
+                    prop="frontLeftWheelFreeRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontLeftWheelFreeRadius',
+                        }"
+                        v-model="form.frontLeftWheelFreeRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div v-show="activeName === '2'" class="flexBox">
+                <el-form-item
+                    label="有效滚动半径/mm:"
+                    prop="rearLeftWheelEffectiveRollingRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearLeftWheelEffectiveRollingRadius',
+                        }"
+                        v-model="form.rearLeftWheelEffectiveRollingRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="滚动阻力系数:"
+                    prop="rearLeftWheelRollingResistanceCoefficient"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearLeftWheelRollingResistanceCoefficient',
+                        }"
+                        v-model="form.rearLeftWheelRollingResistanceCoefficient"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="自由半径/mm:"
+                    prop="rearLeftWheelFreeRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearLeftWheelFreeRadius',
+                        }"
+                        v-model="form.rearLeftWheelFreeRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div v-show="activeName === '3'" class="flexBox">
+                <el-form-item
+                    label="有效滚动半径/mm:"
+                    prop="frontRightWheelEffectiveRollingRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontRightWheelEffectiveRollingRadius',
+                        }"
+                        v-model="form.frontRightWheelEffectiveRollingRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="滚动阻力系数:"
+                    prop="frontRightWheelRollingResistanceCoefficient"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontRightWheelRollingResistanceCoefficient',
+                        }"
+                        v-model="
+                            form.frontRightWheelRollingResistanceCoefficient
+                        "
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="自由半径/mm:"
+                    prop="frontRightWheelFreeRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontRightWheelFreeRadius',
+                        }"
+                        v-model="form.frontRightWheelFreeRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div v-show="activeName === '4'" class="flexBox">
+                <el-form-item
+                    label="有效滚动半径/mm:"
+                    prop="rearRightWheelEffectiveRollingRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearRightWheelEffectiveRollingRadius',
+                        }"
+                        v-model="form.rearRightWheelEffectiveRollingRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="滚动阻力系数:"
+                    prop="rearRightWheelRollingResistanceCoefficient"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearRightWheelRollingResistanceCoefficient',
+                        }"
+                        v-model="
+                            form.rearRightWheelRollingResistanceCoefficient
+                        "
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="自由半径/mm:"
+                    prop="rearRightWheelFreeRadius"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearRightWheelFreeRadius',
+                        }"
+                        v-model="form.rearRightWheelFreeRadius"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="dialogBtnBox flexBox">
+                <div
+                    class="dia"
+                    v-bind:class="{ isCur: isCur === 'isCur1' }"
+                    @click="
+                        diaChange(
+                            'isCur1',
+                            '不同载荷下回正力矩和侧偏角的关系曲线',
+                            1
+                        )
+                    "
+                >
+                    不同载荷下回正力矩和侧偏角的关系曲线
+                </div>
+                <div
+                    class="dia"
+                    v-bind:class="{ isCur: isCur === 'isCur2' }"
+                    @click="
+                        diaChange(
+                            'isCur2',
+                            '不同载荷下侧向力和侧偏角的关系曲线',
+                            2
+                        )
+                    "
+                >
+                    不同载荷下侧向力和侧偏角的关系曲线
+                </div>
+                <div
+                    class="dia"
+                    v-bind:class="{ isCur: isCur === 'isCur3' }"
+                    @click="
+                        diaChange(
+                            'isCur3',
+                            '不同载荷下纵向力和滑移率的关系曲线',
+                            3
+                        )
+                    "
+                >
+                    不同载荷下纵向力和滑移率的关系曲线
+                </div>
+            </div>
+
+            <div class="titlePanelA">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>悬架</span>
+                </div>
+            </div>
+
+            <div class="myTabsBox myTabsBoxFourTabs">
+                <el-tabs
+                    v-model="activeName2"
+                    type="card"
+                    @tab-click="pageControl2"
+                >
+                    <el-tab-pane label="前轮" name="1"></el-tab-pane>
+                    <el-tab-pane label="后轮" name="2"></el-tab-pane>
+                </el-tabs>
+            </div>
+
+            <div v-show="activeName2 === '1'" class="flexBox">
+                <el-form-item label="悬架类型:" prop="frontWheelSuspensionType">
+                    <el-select v-model="form.frontWheelSuspensionType">
+                        <el-option
+                            v-for="item in suspensionTypeList"
+                            :label="item.caption"
+                            :value="item.code"
+                            :key="item.code"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item
+                    label="悬架运动学系数:"
+                    prop="frontWheelSuspensionKinematicsCoefficient"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontWheelSuspensionKinematicsCoefficient',
+                        }"
+                        v-model="form.frontWheelSuspensionKinematicsCoefficient"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="簧下质量/kg:"
+                    prop="frontWheelUnsprungMass"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontWheelUnsprungMass',
+                        }"
+                        v-model="form.frontWheelUnsprungMass"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="轮距/mm:" prop="frontWheelTrackWidth">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'frontWheelTrackWidth' }"
+                        v-model="form.frontWheelTrackWidth"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div v-show="activeName2 === '2'" class="flexBox">
+                <el-form-item label="悬架类型:" prop="rearWheelSuspensionType">
+                    <el-select v-model="form.rearWheelSuspensionType">
+                        <el-option
+                            v-for="item in suspensionTypeList"
+                            :label="item.caption"
+                            :value="item.code"
+                            :key="item.code"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item
+                    label="悬架运动学系数:"
+                    prop="rearWheelSuspensionKinematicsCoefficient"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearWheelSuspensionKinematicsCoefficient',
+                        }"
+                        v-model="form.rearWheelSuspensionKinematicsCoefficient"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="簧下质量/kg:" prop="rearWheelUnsprungMass">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'rearWheelUnsprungMass' }"
+                        v-model="form.rearWheelUnsprungMass"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="轮距/mm:" prop="rearWheelTrackWidth">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'rearWheelTrackWidth' }"
+                        v-model="form.rearWheelTrackWidth"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanelA">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>空气阻力</span>
+                </div>
+            </div>
+            <div class="flexBox">
+                <el-form-item label="迎风面积:" prop="windwardArea">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'windwardArea' }"
+                        v-model="form.windwardArea"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="空气密度:" prop="airDensity">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'airDensity' }"
+                        v-model="form.airDensity"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanel">
+                <div class="titlePanelBor">动力参数</div>
+            </div>
+            <div class="titlePanelA padTop0">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>发动机</span>
+                </div>
+            </div>
+
+            <div class="flexBox">
+                <el-form-item
+                    label="发动机曲轴转动惯量:"
+                    prop="engineCrankshaftMomentInertia"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'engineCrankshaftMomentInertia',
+                        }"
+                        v-model="form.engineCrankshaftMomentInertia"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="怠速转速:" prop="idleSpeed">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'idleSpeed' }"
+                        v-model="form.idleSpeed"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="dialogBtnBox">
+                <div
+                    class="dia dia2"
+                    v-bind:class="{ isCur: isCurA === 'isCurA' }"
+                    @click="
+                        diaChange1(
+                            'isCurA',
+                            '发动机扭矩、转速和节气门开度的关系曲线',
+                            4
+                        )
+                    "
+                >
+                    发动机扭矩、转速和节气门开度的关系曲线
+                </div>
+            </div>
+
+            <div class="titlePanelA">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>离合器</span>
+                </div>
+            </div>
+            <div class="flexBox">
+                <el-form-item
+                    label="输入轴的转动惯量:"
+                    prop="momentInertiaInputShaft"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'momentInertiaInputShaft',
+                        }"
+                        v-model="form.momentInertiaInputShaft"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="输出轴的转动惯量:"
+                    prop="momentInertiaOutputShaft"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'momentInertiaOutputShaft',
+                        }"
+                        v-model="form.momentInertiaOutputShaft"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanelA">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>差速器</span>
+                </div>
+            </div>
+            <div class="flexBox">
+                <el-form-item label="主减速器传动比:" prop="finalDriveRatio">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'finalDriveRatio' }"
+                        v-model="form.finalDriveRatio"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="传动效率:" prop="transmissionEfficiency">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'transmissionEfficiency',
+                        }"
+                        v-model="form.transmissionEfficiency"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanelA">
+                <div class="titlePanelABor">
+                    <b></b>
+                    <span>变速器</span>
+                </div>
+            </div>
+
+            <div>
+                <tableList
+                    :columns="columns"
+                    :getDataWay="getDataWay"
+                    style="margin: 0 15px 15px 0"
+                >
+                    <el-table-column
+                        v-for="(column, index) in columns"
+                        :key="`col_${index}`"
+                        :slot="column.prop"
+                        :label="column.label"
+                        align="center"
+                    >
+                        <template v-slot="scope">
+                            <span
+                                v-if="
+                                    column.prop != 'inertia' &&
+                                    scope.row.a === 'N'
+                                "
+                                >/</span
+                            >
+                            <el-input
+                                v-else
+                                maxlength="12"
+                                placeholder="请输入"
+                                v-autoTrim="{
+                                    obj: scope.row,
+                                    key: `${column.prop}`,
+                                }"
+                                v-model="scope.row[`${column.prop}`]"
+                            ></el-input>
+                        </template>
+                    </el-table-column>
+                </tableList>
+                <div>
+                    <el-form-item label="换挡时间(S):" prop="shiftTime">
+                        <el-input
+                            placeholder="请输入"
+                            maxlength="12"
+                            v-autoTrim="{ obj: form, key: 'shiftTime' }"
+                            v-model="form.shiftTime"
+                        >
+                        </el-input>
+                    </el-form-item>
+                </div>
+
+                <div class="flexBox wrapBox">
+                    <div class="labelName">各挡位换挡曲线:</div>
+                    <div class="dialogBtnBox flexBox">
+                        <div
+                            class="dia"
+                            v-bind:class="{ isCur: isCurB === 'isCurB1' }"
+                            @click="diaChange2('isCurB1', '1-2 换挡曲线', 1)"
+                        >
+                            1-2 换挡曲线
+                        </div>
+                        <div
+                            class="dia"
+                            v-bind:class="{ isCur: isCurB === 'isCurB2' }"
+                            @click="diaChange2('isCurB2', '2-3 换挡曲线', 2)"
+                        >
+                            2-3 换挡曲线
+                        </div>
+                        <div
+                            class="dia"
+                            v-bind:class="{ isCur: isCurB === 'isCurB3' }"
+                            @click="diaChange2('isCurB3', '3-4 换挡曲线', 3)"
+                        >
+                            3-4 换挡曲线
+                        </div>
+                        <div
+                            class="dia"
+                            v-bind:class="{ isCur: isCurB === 'isCurB4' }"
+                            @click="diaChange2('isCurB4', '4-5 换挡曲线', 4)"
+                        >
+                            4-5 换挡曲线
+                        </div>
+                        <div
+                            class="dia"
+                            v-bind:class="{ isCur: isCurB === 'isCurB5' }"
+                            @click="diaChange2('isCurB5', '5-6 换挡曲线', 5)"
+                        >
+                            5-6 换挡曲线
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="titlePanel">
+                <div class="titlePanelBor">制动参数</div>
+            </div>
+
+            <div class="flexBox">
+                <el-form-item label="制动类型:" prop="brakeType">
+                    <el-select v-model="form.brakeType">
+                        <el-option
+                            v-for="item in brakeTypeList"
+                            :label="item.caption"
+                            :value="item.code"
+                            :key="item.code"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item
+                    label="左前轮制动力矩:"
+                    prop="frontLeftWheelBrakingTorque"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontLeftWheelBrakingTorque',
+                        }"
+                        v-model="form.frontLeftWheelBrakingTorque"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="左后轮制动力矩:"
+                    prop="rearLeftWheelBrakingTorque"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearLeftWheelBrakingTorque',
+                        }"
+                        v-model="form.rearLeftWheelBrakingTorque"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="右前轮制动力矩:"
+                    prop="frontRightWheelBrakingTorque"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontRightWheelBrakingTorque',
+                        }"
+                        v-model="form.frontRightWheelBrakingTorque"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="右后轮制动力矩:"
+                    prop="rearRightWheelBrakingTorque"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rearRightWheelBrakingTorque',
+                        }"
+                        v-model="form.rearRightWheelBrakingTorque"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanel">
+                <div class="titlePanelBor">转向参数</div>
+            </div>
+
+            <div class="flexBox">
+                <el-form-item label="转向类型:" prop="steeringType">
+                    <el-select v-model="form.steeringType">
+                        <el-option
+                            v-for="item in steeringTypeList"
+                            :label="item.caption"
+                            :value="item.code"
+                            :key="item.code"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="转向器类型:" prop="steeringGearType">
+                    <el-select v-model="form.steeringGearType">
+                        <el-option
+                            v-for="item in steeringGearTypeList"
+                            :label="item.caption"
+                            :value="item.code"
+                            :key="item.code"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="转向器传动比:" prop="steeringGearRatio">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'steeringGearRatio' }"
+                        v-model="form.steeringGearRatio"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="dialogBtnBox">
+                <div
+                    class="dia dia2"
+                    v-bind:class="{ isCur: isCurC === 'isCurC' }"
+                    @click="
+                        diaChange3('isCurC', '车轮转角与转向器输出的关系曲线')
+                    "
+                >
+                    车轮转角与转向器输出的关系曲线
+                </div>
+            </div>
+        </el-form>
+
+        <el-dialog
+            v-if="diaVisible"
+            :title="diaTitle"
+            :visible.sync="diaVisible"
+            width="1200px"
+            :close-on-click-modal="false"
+            :close-on-press-escape="false"
+            :before-close="diaCancel"
+        >
+            <div class="diaContentBox">
+                <div class="diaContent chartBox chartBox1">
+                    <line-chart
+                        :id="'carsimChartA' + chartIndex"
+                        :dataList="getDataWay1.data"
+                        :columns="columns1"
+                    >
+                    </line-chart>
+                </div>
+                <div class="diaContent tableBox">
+                    <tableList
+                        :columns="columns1"
+                        :getDataWay="getDataWay1"
+                        style="margin: 0 -10px 15px -10px"
+                        index
+                    >
+                        <el-table-column
+                            v-for="(column, index) in columns1"
+                            :key="`col_${index}`"
+                            :slot="column.prop"
+                            :label="column.label"
+                            align="center"
+                        >
+                            <template v-slot="scope">
+                                <el-input
+                                    maxlength="12"
+                                    placeholder="请输入"
+                                    v-autoTrim="{
+                                        obj: scope.row,
+                                        key: `${column.prop}`,
+                                    }"
+                                    v-model="scope.row[`${column.prop}`]"
+                                ></el-input>
+                            </template>
+                        </el-table-column>
+                    </tableList>
+                    <el-form
+                        ref="form1"
+                        key="1"
+                        :model="form1"
+                        :rules="rules1"
+                        label-width="60px"
+                        class="handleForm"
+                    >
+                        <div class="flexBox">
+                            <el-form-item label="行数:" prop="a">
+                                <el-input
+                                    placeholder="请输入"
+                                    maxlength="12"
+                                    v-autoTrim="{ obj: form1, key: 'a' }"
+                                    v-model="form1.a"
+                                    @change="handleChang"
+                                >
+                                </el-input>
+                            </el-form-item>
+                            <el-form-item label="列数:" prop="b">
+                                <el-input
+                                    placeholder="请输入"
+                                    maxlength="12"
+                                    v-autoTrim="{ obj: form1, key: 'b' }"
+                                    v-model="form1.b"
+                                    @change="handleChang"
+                                >
+                                </el-input>
+                            </el-form-item>
+                        </div>
+                    </el-form>
+                    <div>
+                        <upload
+                            ref="upload"
+                            :multiple="false"
+                            @attachmentChange="attachmentChange1"
+                        ></upload>
+                    </div>
+                </div>
+            </div>
+            <span slot="footer">
+                <el-button type="primary" @click="diaSave">保 存</el-button>
+                <el-button @click="diaCancel">取 消</el-button>
+            </span>
+        </el-dialog>
+
+        <el-dialog
+            v-if="diaVisible1"
+            :title="diaTitle1"
+            :visible.sync="diaVisible1"
+            width="1200px"
+            :close-on-click-modal="false"
+            :close-on-press-escape="false"
+            :before-close="diaCancel1"
+        >
+            <div class="diaContentBox">
+                <div class="diaContent chartBox chartBox1">
+                    <line-chart-a
+                        :id="'carsimChartB' + chartIndex"
+                        :dataList="getDataWay2.data"
+                        :dataListA="getDataWay2A.data"
+                        :columns="columns2"
+                    >
+                    </line-chart-a>
+                </div>
+                <div class="diaContent tableBox">
+                    <div class="tipName">up-shifting</div>
+                    <tableList
+                        :columns="columns2"
+                        :getDataWay="getDataWay2"
+                        style="margin: 0 -10px 15px -10px"
+                        index
+                    >
+                        <el-table-column
+                            v-for="(column, index) in columns2"
+                            :key="`col_${index}`"
+                            :slot="column.prop"
+                            :label="column.label"
+                            align="center"
+                        >
+                            <template v-slot="scope">
+                                <el-input
+                                    maxlength="12"
+                                    placeholder="请输入"
+                                    v-autoTrim="{
+                                        obj: scope.row,
+                                        key: `${column.prop}`,
+                                    }"
+                                    v-model="scope.row[`${column.prop}`]"
+                                ></el-input>
+                            </template>
+                        </el-table-column>
+                    </tableList>
+                    <el-form
+                        ref="form2"
+                        :model="form2"
+                        :rules="rules2"
+                        label-width="60px"
+                        class="handleForm"
+                    >
+                        <div class="flexBox">
+                            <el-form-item label="行数:" prop="a">
+                                <el-input
+                                    placeholder="请输入"
+                                    maxlength="12"
+                                    v-autoTrim="{ obj: form2, key: 'a' }"
+                                    v-model="form2.a"
+                                    @change="handleChang1('2')"
+                                >
+                                </el-input>
+                            </el-form-item>
+                        </div>
+                    </el-form>
+                    <div class="marBot20">
+                        <upload
+                            ref="upload"
+                            :multiple="false"
+                            @attachmentChange="attachmentChange2"
+                        ></upload>
+                    </div>
+
+                    <div class="tipName">down-shifting</div>
+                    <tableList
+                        :columns="columns2A"
+                        :getDataWay="getDataWay2A"
+                        style="margin: 0 -10px 15px -10px"
+                        index
+                    >
+                        <el-table-column
+                            v-for="(column, index) in columns2A"
+                            :key="`col_${index}`"
+                            :slot="column.prop"
+                            :label="column.label"
+                            align="center"
+                        >
+                            <template v-slot="scope">
+                                <el-input
+                                    maxlength="12"
+                                    placeholder="请输入"
+                                    v-autoTrim="{
+                                        obj: scope.row,
+                                        key: `${column.prop}`,
+                                    }"
+                                    v-model="scope.row[`${column.prop}`]"
+                                ></el-input>
+                            </template>
+                        </el-table-column>
+                    </tableList>
+                    <el-form
+                        ref="form2A"
+                        :model="form2A"
+                        :rules="rules2A"
+                        label-width="60px"
+                        class="handleForm"
+                    >
+                        <div class="flexBox">
+                            <el-form-item label="行数:" prop="a">
+                                <el-input
+                                    placeholder="请输入"
+                                    maxlength="12"
+                                    v-autoTrim="{ obj: form2A, key: 'a' }"
+                                    v-model="form2A.a"
+                                    @change="handleChang1('2A')"
+                                >
+                                </el-input>
+                            </el-form-item>
+                        </div>
+                    </el-form>
+                    <div>
+                        <upload
+                            ref="upload1"
+                            :multiple="false"
+                            @attachmentChange="attachmentChange2A"
+                        ></upload>
+                    </div>
+                </div>
+            </div>
+            <span slot="footer">
+                <el-button type="primary" @click="diaSave1">保 存</el-button>
+                <el-button @click="diaCancel1">取 消</el-button>
+            </span>
+        </el-dialog>
+
+        <el-dialog
+            v-if="diaVisible2"
+            :title="diaTitle2"
+            :visible.sync="diaVisible2"
+            width="1200px"
+            :close-on-click-modal="false"
+            :close-on-press-escape="false"
+            :before-close="diaCancel2"
+        >
+            <div class="diaContentBox">
+                <div class="diaContent chartBox">
+                    <div class="diaLineTitle">右轮转角与转向器输出的关系</div>
+                    <line-chart-b
+                        key="carsimChartC"
+                        :id="'carsimChartC' + chartIndex"
+                        :dataList="getDataWay3.data"
+                        :columns="columns3"
+                    >
+                    </line-chart-b>
+                </div>
+                <div class="diaContent tableBox">
+                    <tableList
+                        :columns="columns3"
+                        :getDataWay="getDataWay3"
+                        style="margin: 0 -10px 15px -10px"
+                        index
+                    >
+                        <el-table-column
+                            v-for="(column, index) in columns3"
+                            :key="`col_${index}`"
+                            :slot="column.prop"
+                            :label="column.label"
+                            align="center"
+                        >
+                            <template v-slot="scope">
+                                <el-input
+                                    maxlength="12"
+                                    placeholder="请输入"
+                                    v-autoTrim="{
+                                        obj: scope.row,
+                                        key: `${column.prop}`,
+                                    }"
+                                    v-model="scope.row[`${column.prop}`]"
+                                ></el-input>
+                            </template>
+                        </el-table-column>
+                    </tableList>
+                    <el-form
+                        ref="form3"
+                        :model="form3"
+                        :rules="rules3"
+                        label-width="60px"
+                        class="handleForm"
+                    >
+                        <div class="flexBox">
+                            <el-form-item label="行数:" prop="a">
+                                <el-input
+                                    placeholder="请输入"
+                                    maxlength="12"
+                                    v-autoTrim="{ obj: form3, key: 'a' }"
+                                    v-model="form3.a"
+                                    @change="handleChang1('3')"
+                                >
+                                </el-input>
+                            </el-form-item>
+                        </div>
+                    </el-form>
+                    <div class="marBot20">
+                        <upload
+                            ref="upload"
+                            :multiple="false"
+                            @attachmentChange="attachmentChange3"
+                        ></upload>
+                    </div>
+                </div>
+            </div>
+            <div class="diaContentBox">
+                <div class="diaContent chartBox">
+                    <div class="diaLineTitle">左轮转角与转向器输出的关系</div>
+                    <line-chart-b
+                        key="carsimChartD"
+                        :id="'carsimChartD' + chartIndex"
+                        :dataList="getDataWay3A.data"
+                        :columns="columns3A"
+                    >
+                    </line-chart-b>
+                </div>
+                <div class="diaContent tableBox">
+                    <tableList
+                        :columns="columns3A"
+                        :getDataWay="getDataWay3A"
+                        style="margin: 0 -10px 15px -10px"
+                        index
+                    >
+                        <el-table-column
+                            v-for="(column, index) in columns3A"
+                            :key="`col_${index}`"
+                            :slot="column.prop"
+                            :label="column.label"
+                            align="center"
+                        >
+                            <template v-slot="scope">
+                                <el-input
+                                    maxlength="12"
+                                    placeholder="请输入"
+                                    v-autoTrim="{
+                                        obj: scope.row,
+                                        key: `${column.prop}`,
+                                    }"
+                                    v-model="scope.row[`${column.prop}`]"
+                                ></el-input>
+                            </template>
+                        </el-table-column>
+                    </tableList>
+                    <el-form
+                        ref="form3"
+                        :model="form3A"
+                        :rules="rules3A"
+                        label-width="60px"
+                        class="handleForm"
+                    >
+                        <div class="flexBox">
+                            <el-form-item label="行数:" prop="a">
+                                <el-input
+                                    placeholder="请输入"
+                                    maxlength="12"
+                                    v-autoTrim="{ obj: form3A, key: 'a' }"
+                                    v-model="form3A.a"
+                                    @change="handleChang1('3A')"
+                                >
+                                </el-input>
+                            </el-form-item>
+                        </div>
+                    </el-form>
+                    <div>
+                        <upload
+                            ref="upload1"
+                            :multiple="false"
+                            @attachmentChange="attachmentChange3A"
+                        ></upload>
+                    </div>
+                </div>
+            </div>
+            <span slot="footer">
+                <el-button type="primary" @click="diaSave2">保 存</el-button>
+                <el-button @click="diaCancel2">取 消</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import tableList from "@/components/grid/TableList";
+import lineChart from "@/components/echarts/lineChartCarsim";
+import lineChartA from "@/components/echarts/lineChartCarsimA";
+import lineChartB from "@/components/echarts/lineChartCarsimB";
+import upload from "./upload.vue";
+
+export default {
+    name: "vehicleModelCarsim", // 车辆模型-Carsim
+    components: { tableList, lineChart, lineChartA, lineChartB, upload },
+    data() {
+        // 校验非负且最多4位小数
+        let validateNum = (rule, value, callback) => {
+            !/^(0|[1-9][0-9]*)(\.\d{1,4})?$/.test(value) &&
+                callback(new Error(rule.message));
+            callback();
+        };
+
+        // 校验不大于1
+        let validateNoMore1 = (rule, value, callback) => {
+            if (value > 1) {
+                callback(new Error(rule.message));
+                return;
+            }
+            callback();
+        };
+
+        return {
+            imgSrc: require("@/assets/common/image/others/carsimFont.png"),
+            form: {
+                sprungMass: "", // 簧上质量
+                vehicleWidth: "", // 车辆宽度
+                rotationalInertiaX: "", // 整车绕X轴转动惯量
+                rotationalInertiaY: "", // 整车绕Y轴转动惯量
+                rotationalInertiaZ: "", // 整车绕Z轴转动惯量
+
+                wheelCenterToTop: "", // 轮胎中心到车顶的高度
+                wheelCenterToGround: "", // 轮胎中心到地面的高度
+                centroidToFrontWheelCenter: "", // 质心到前轮中心的距离
+                centroidToGround: "", // 质心到地面的高度
+                wheelbase: "", // 轴距
+
+                frontLeftWheelEffectiveRollingRadius: "", // 左前轮-有效滚动半径/mm
+                frontLeftWheelRollingResistanceCoefficient: "", // 左前轮-滚动阻力系数
+                frontLeftWheelFreeRadius: "", // 左前轮-自由半径/mm
+                rearLeftWheelEffectiveRollingRadius: "", // 左后轮-有效滚动半径/mm
+                rearLeftWheelRollingResistanceCoefficient: "", // 左后轮-滚动阻力系数
+                rearLeftWheelFreeRadius: "", // 左后轮-自由半径/mm
+                frontRightWheelEffectiveRollingRadius: "", // 右前轮-有效滚动半径/mm
+                frontRightWheelRollingResistanceCoefficient: "", // 右前轮-滚动阻力系数
+                frontRightWheelFreeRadius: "", // 右前轮-自由半径/mm
+                rearRightWheelEffectiveRollingRadius: "", // 右后轮-有效滚动半径/mm
+                rearRightWheelRollingResistanceCoefficient: "", // 右后轮-滚动阻力系数
+                rearRightWheelFreeRadius: "", // 右后轮-自由半径/mm
+
+                frontLeftWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 左前轮不同载荷下回正力矩和侧偏角的关系曲线
+                frontLeftWheelRelationCurveLateralForceAndSideslipAngle: [], // 左前轮不同载荷下侧向力和侧偏角的关系曲线
+                frontLeftWheelRelationCurveLongitudinalForceAndSideslipAngle:
+                    [], // 左前轮不同载荷下纵向力和侧偏角的关系曲线
+                rearLeftWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 左后轮不同载荷下回正力矩和侧偏角的关系曲线
+                rearLeftWheelRelationCurveLateralForceAndSideslipAngle: [], // 左后轮不同载荷下侧向力和侧偏角的关系曲线
+                rearLeftWheelRelationCurveLongitudinalForceAndSideslipAngle: [], // 左后轮不同载荷下纵向力和侧偏角的关系曲线
+                frontRightWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 右前轮不同载荷下回正力矩和侧偏角的关系曲线
+                frontRightWheelRelationCurveLateralForceAndSideslipAngle: [], // 右前轮不同载荷下侧向力和侧偏角的关系曲线
+                frontRightWheelRelationCurveLongitudinalForceAndSideslipAngle:
+                    [], // 右前轮不同载荷下纵向力和侧偏角的关系曲线
+                rearRightWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 右后轮不同载荷下回正力矩和侧偏角的关系曲线
+                rearRightWheelRelationCurveLateralForceAndSideslipAngle: [], // 右后轮不同载荷下侧向力和侧偏角的关系曲线
+                rearRightWheelRelationCurveLongitudinalForceAndSideslipAngle:
+                    [], // 右后轮不同载荷下纵向力和侧偏角的关系曲线
+
+                frontWheelSuspensionType: "", // 前轮-悬架类型
+                frontWheelSuspensionKinematicsCoefficient: "", // 前轮-悬架运动学系数
+                frontWheelUnsprungMass: "", // 前轮-簧下质量/kg
+                frontWheelTrackWidth: "", // 前轮-轮距/mm
+                rearWheelSuspensionType: "", // 后轮-悬架类型
+                rearWheelSuspensionKinematicsCoefficient: "", // 后轮-悬架运动学系数
+                rearWheelUnsprungMass: "", // 后轮-簧下质量/kg
+                rearWheelTrackWidth: "", // 后轮-轮距/mm
+
+                windwardArea: "", // 迎风面积
+                airDensity: "", // 空气密度
+
+                engineCrankshaftMomentInertia: "", // 发动机曲轴转动惯量
+                idleSpeed: "", // 怠速转速
+
+                relationCurveEngineTorqueSpeedAndThrottleOpening: [], // 发动机扭矩、转速和节气门开的度关系曲线
+
+                momentInertiaInputShaft: "", // 输入轴的转动惯量
+                momentInertiaOutputShaft: "", // 输出轴的转动惯量
+
+                finalDriveRatio: "", // 主减速器传动比
+                transmissionEfficiency: "", // 传动效率
+
+                gearRatio: [], // R,N,1,2,3,4,5,6
+                inertia: [], // R,N,1,2,3,4,5,6
+                driving: [], // R,N,1,2,3,4,5,6
+                coasting: [], // R,N,1,2,3,4,5,6
+
+                shiftTime: "", // 换挡时间(S)
+
+                shiftTimeUp12: [],
+                shiftTimeDown12: [],
+                shiftTimeUp23: [],
+                shiftTimeDown23: [],
+                shiftTimeUp34: [],
+                shiftTimeDown34: [],
+                shiftTimeUp45: [],
+                shiftTimeDown45: [],
+                shiftTimeUp56: [],
+                shiftTimeDown56: [],
+
+                brakeType: "", // 制动类型
+                frontLeftWheelBrakingTorque: "", // 左前轮制动力矩
+                rearLeftWheelBrakingTorque: "", // 左后轮制动力矩
+                frontRightWheelBrakingTorque: "", // 右前轮制动力矩
+                rearRightWheelBrakingTorque: "", // 右后轮制动力矩
+
+                steeringType: "", // 转向类型
+                steeringGearType: "", // 转向器类型
+                steeringGearRatio: "", // 转向器传动比
+
+                relationCurveRightWheelAngleAndSteeringGearOutput: [], // 右轮转角与转向器输出的关系
+                relationCurveLeftWheelAngleAndSteeringGearOutput: [], // 左轮转角与转向器输出的关系
+            },
+            rules: {
+                sprungMass: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                vehicleWidth: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rotationalInertiaX: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rotationalInertiaY: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rotationalInertiaZ: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                wheelCenterToTop: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelCenterToGround: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                centroidToFrontWheelCenter: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                centroidToGround: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelbase: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                frontLeftWheelEffectiveRollingRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontLeftWheelRollingResistanceCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontLeftWheelFreeRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearLeftWheelEffectiveRollingRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearLeftWheelRollingResistanceCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearLeftWheelFreeRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontRightWheelEffectiveRollingRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontRightWheelRollingResistanceCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontRightWheelFreeRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearRightWheelEffectiveRollingRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearRightWheelRollingResistanceCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearRightWheelFreeRadius: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                frontWheelSuspensionType: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+                frontWheelSuspensionKinematicsCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontWheelUnsprungMass: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontWheelTrackWidth: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearWheelSuspensionType: [
+                    { required: true, message: "请输入", trigger: "change" },
+                ],
+                rearWheelSuspensionKinematicsCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearWheelUnsprungMass: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearWheelTrackWidth: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                windwardArea: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                airDensity: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                engineCrankshaftMomentInertia: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                idleSpeed: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                momentInertiaInputShaft: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                momentInertiaOutputShaft: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                finalDriveRatio: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                transmissionEfficiency: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNoMore1,
+                        message: "请输入不大于1的非负数",
+                        trigger: ["blur"],
+                    },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                shiftTime: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                brakeType: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+                frontLeftWheelBrakingTorque: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearLeftWheelBrakingTorque: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontRightWheelBrakingTorque: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearRightWheelBrakingTorque: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+
+                steeringType: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+                steeringGearType: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+                steeringGearRatio: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+            },
+            activeName: "1",
+            activeName2: "1",
+            isCur: "", // 轮胎下的样式控制
+            isCurA: "", // 发动机下的样式控制
+            isCurB: "", // 各挡位换挡曲线
+            isCurC: "", // 各挡位换挡曲线
+            columns: [
+                {
+                    label: "",
+                    prop: "a",
+                },
+                {
+                    label: "Gear Ratio",
+                    prop: "gearRatio",
+                    template: true,
+                },
+                {
+                    label: "Inertia",
+                    prop: "inertia",
+                    template: true,
+                },
+                {
+                    label: "Driving",
+                    prop: "driving",
+                    template: true,
+                },
+                {
+                    label: "Coasting",
+                    prop: "coasting",
+                    template: true,
+                },
+            ],
+            columns1: [],
+            columns2: [],
+            columns2A: [],
+            columns3: [],
+            columns3A: [],
+            getDataWay: {
+                //加载表格数据
+                dataType: "data",
+                type: "post",
+                data: [
+                    {
+                        a: "R",
+                        gearRatio: "",
+                        inertia: "",
+                        driving: "",
+                        coasting: "",
+                    },
+                    {
+                        a: "N",
+                        gearRatio: "/",
+                        inertia: "",
+                        driving: "/",
+                        coasting: "/",
+                    },
+                    {
+                        a: "1档",
+                        gearRatio: "",
+                        inertia: "",
+                        driving: "",
+                        coasting: "",
+                    },
+                    {
+                        a: "2档",
+                        gearRatio: "",
+                        inertia: "",
+                        driving: "",
+                        coasting: "",
+                    },
+                    {
+                        a: "3档",
+                        gearRatio: "",
+                        inertia: "",
+                        driving: "",
+                        coasting: "",
+                    },
+                    {
+                        a: "4档",
+                        gearRatio: "",
+                        inertia: "",
+                        driving: "",
+                        coasting: "",
+                    },
+                    {
+                        a: "5档",
+                        gearRatio: "",
+                        inertia: "",
+                        driving: "",
+                        coasting: "",
+                    },
+                    {
+                        a: "6档",
+                        gearRatio: "",
+                        inertia: "",
+                        driving: "",
+                        coasting: "",
+                    },
+                ],
+                param: {},
+            },
+            getDataWay1: {
+                //加载表格数据
+                dataType: "data",
+                type: "post",
+                data: [],
+                param: {},
+            },
+            getDataWay2: {
+                //加载表格数据
+                dataType: "data",
+                type: "post",
+                data: [],
+                param: {},
+            },
+            getDataWay2A: {
+                //加载表格数据
+                dataType: "data",
+                type: "post",
+                data: [],
+                param: {},
+            },
+            getDataWay3: {
+                //加载表格数据
+                dataType: "data",
+                type: "post",
+                data: [],
+                param: {},
+            },
+            getDataWay3A: {
+                //加载表格数据
+                dataType: "data",
+                type: "post",
+                data: [],
+                param: {},
+            },
+            diaTitle: "",
+            diaTitle1: "",
+            diaTitle2: "",
+            diaVisible: false,
+            diaVisible1: false,
+            diaVisible2: false,
+            form1: {
+                a: "",
+                b: "",
+            },
+            form2: {
+                a: "",
+            },
+            form2A: {
+                a: "",
+            },
+            form3: {
+                a: "",
+            },
+            form3A: {
+                a: "",
+            },
+            rules1: {},
+            rules2: {},
+            rules2A: {},
+            rules3: {},
+            rules3A: {},
+            file: "",
+            file1: "",
+            chartIndex: 0, // 配合每个echarts有不同的id
+            dia1Type: 0, // 判断可输入多y轴数据的dialog类型
+            dia2Type: 0, // 判断可输入单y轴数据的dialog类型
+        };
+    },
+
+    props: {
+        suspensionTypeList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+        brakeTypeList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+        steeringTypeList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+        steeringGearTypeList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+    },
+
+    methods: {
+        pageControl(data) {
+            this.activeName = data.name;
+        },
+        pageControl2(data) {
+            this.activeName2 = data.name;
+        },
+        arrToData(arr, s = "") {
+            if (Array.isArray(arr) && arr.length > 0) {
+                if (s) {
+                    this[`getDataWay${s}`].data = this.attachmentHandle(arr);
+                } else {
+                    this.attachmentChange1(arr);
+                }
+            }
+        },
+        /**
+         *
+         * @param {*} v 样式
+         * @param {*} t title
+         * @param {*} d data
+         */
+        diaChange(v, t, d) {
+            this.diaTitle = t;
+            this.isCur = v;
+            this.chartIndex++;
+
+            this.dia1Type = d;
+
+            switch (this.activeName) {
+                case "1":
+                    if (d === 1) {
+                        this.arrToData(
+                            this.form
+                                .frontLeftWheelRelationCurvePositiveMomentAndSideslipAngle
+                        );
+                    } else if (d === 2) {
+                        this.arrToData(
+                            this.form
+                                .frontLeftWheelRelationCurveLateralForceAndSideslipAngle
+                        );
+                    } else if (d === 3) {
+                        this.arrToData(
+                            this.form
+                                .frontLeftWheelRelationCurveLongitudinalForceAndSideslipAngle
+                        );
+                    }
+                    break;
+                case "2":
+                    if (d === 1) {
+                        this.arrToData(
+                            this.form
+                                .rearLeftWheelRelationCurvePositiveMomentAndSideslipAngle
+                        );
+                    } else if (d === 2) {
+                        this.arrToData(
+                            this.form
+                                .rearLeftWheelRelationCurveLateralForceAndSideslipAngle
+                        );
+                    } else if (d === 3) {
+                        this.arrToData(
+                            this.form
+                                .rearLeftWheelRelationCurveLongitudinalForceAndSideslipAngle
+                        );
+                    }
+                    break;
+                case "3":
+                    if (d === 1) {
+                        this.arrToData(
+                            this.form
+                                .frontRightWheelRelationCurvePositiveMomentAndSideslipAngle
+                        );
+                    } else if (d === 2) {
+                        this.arrToData(
+                            this.form
+                                .frontRightWheelRelationCurveLateralForceAndSideslipAngle
+                        );
+                    } else if (d === 3) {
+                        this.arrToData(
+                            this.form
+                                .frontRightWheelRelationCurveLongitudinalForceAndSideslipAngle
+                        );
+                    }
+                    break;
+                case "4":
+                    if (d === 1) {
+                        this.arrToData(
+                            this.form
+                                .rearRightWheelRelationCurvePositiveMomentAndSideslipAngle
+                        );
+                    } else if (d === 2) {
+                        this.arrToData(
+                            this.form
+                                .rearRightWheelRelationCurveLateralForceAndSideslipAngle
+                        );
+                    } else if (d === 3) {
+                        this.arrToData(
+                            this.form
+                                .rearRightWheelRelationCurveLongitudinalForceAndSideslipAngle
+                        );
+                    }
+                    break;
+                default:
+                    break;
+            }
+
+            if (this.getDataWay1.data.length === 0) {
+                this.columns1 = this.getDefaultArr("columnsOri1");
+                this.getDataWay1.data = this.getDefaultArr("defaultArr1");
+            }
+
+            this.form1 = {
+                a: "",
+                b: "",
+            };
+
+            this.diaVisible = true;
+        },
+        diaChange1(v, t, d) {
+            this.diaTitle = t;
+            this.isCurA = v;
+            this.chartIndex++;
+
+            this.dia1Type = d;
+
+            this.arrToData(
+                this.form.relationCurveEngineTorqueSpeedAndThrottleOpening
+            );
+
+            if (this.getDataWay1.data.length === 0) {
+                this.columns1 = this.getDefaultArr("columnsOri1");
+                this.getDataWay1.data = this.getDefaultArr("defaultArr1");
+            }
+
+            this.form1 = {
+                a: "",
+                b: "",
+            };
+
+            this.diaVisible = true;
+        },
+        diaChange2(v, t, d) {
+            this.diaTitle1 = t;
+            this.isCurB = v;
+            this.chartIndex++;
+
+            this.dia2Type = d;
+
+            this.columns2 = this.getDefaultArr("columnsOri2");
+            this.columns2A = this.getDefaultArr("columnsOri2");
+
+            switch (d) {
+                case 1:
+                    this.arrToData(this.form.shiftTimeUp12, "2");
+                    this.arrToData(this.form.shiftTimeDown12, "2A");
+                    break;
+                case 2:
+                    this.arrToData(this.form.shiftTimeUp23, "2");
+                    this.arrToData(this.form.shiftTimeDown23, "2A");
+                    break;
+                case 3:
+                    this.arrToData(this.form.shiftTimeUp34, "2");
+                    this.arrToData(this.form.shiftTimeDown34, "2A");
+                    break;
+                case 4:
+                    this.arrToData(this.form.shiftTimeUp45, "2");
+                    this.arrToData(this.form.shiftTimeDown45, "2A");
+                    break;
+                case 5:
+                    this.arrToData(this.form.shiftTimeUp56, "2");
+                    this.arrToData(this.form.shiftTimeDown56, "2A");
+                    break;
+                default:
+                    break;
+            }
+
+            if (this.getDataWay2.data.length === 0) {
+                this.getDataWay2.data = this.getDefaultArr("defaultArr2");
+            }
+
+            if (this.getDataWay2A.data.length === 0) {
+                this.getDataWay2A.data = this.getDefaultArr("defaultArr2");
+            }
+
+            this.form2 = { a: "" };
+            this.form2A = { a: "" };
+
+            this.diaVisible1 = true;
+        },
+        diaChange3(v, t) {
+            this.diaTitle2 = t;
+            this.isCurC = v;
+            this.chartIndex++;
+
+            this.columns3 = this.getDefaultArr("columnsOri2");
+            this.columns3A = this.getDefaultArr("columnsOri2");
+
+            this.arrToData(
+                this.form.relationCurveRightWheelAngleAndSteeringGearOutput,
+                "3"
+            );
+
+            this.arrToData(
+                this.form.relationCurveLeftWheelAngleAndSteeringGearOutput,
+                "3A"
+            );
+
+            if (this.getDataWay3.data.length === 0) {
+                this.getDataWay3.data = this.getDefaultArr("defaultArr2");
+            }
+
+            if (this.getDataWay3A.data.length === 0) {
+                this.getDataWay3A.data = this.getDefaultArr("defaultArr2");
+            }
+
+            this.form3 = { a: "" };
+            this.form3A = { a: "" };
+
+            this.diaVisible2 = true;
+        },
+        diaSave() {
+            let array = this.getDataWay1.data;
+
+            for (let index = 0; index < array.length; index++) {
+                const element = array[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    this.$message.error("数据不全,请填写完整");
+                    return;
+                }
+            }
+
+            let data = [];
+
+            let labels = [];
+            let props = [];
+
+            this.columns1.forEach((i) => {
+                labels.push(i.label); // ['X Axis', '1.0', '2.0', '3.0', '4.0']
+                props.push(i.prop); // ['x', '1.0', '2.0', '3.0', '4.0']
+            });
+
+            data.push(labels);
+
+            array.forEach((i) => {
+                let arr = [];
+                props.forEach((j) => {
+                    arr.push(i[j]);
+                });
+                data.push(arr);
+            });
+
+            let d = this.dia1Type;
+
+            if (d === 4) {
+                this.form.relationCurveEngineTorqueSpeedAndThrottleOpening =
+                    data;
+            } else {
+                switch (this.activeName) {
+                    case "1":
+                        if (d === 1) {
+                            this.form.frontLeftWheelRelationCurvePositiveMomentAndSideslipAngle =
+                                data;
+                        } else if (d === 2) {
+                            this.form.frontLeftWheelRelationCurveLateralForceAndSideslipAngle =
+                                data;
+                        } else if (d === 3) {
+                            this.form.frontLeftWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                                data;
+                        }
+                        break;
+                    case "2":
+                        if (d === 1) {
+                            this.form.rearLeftWheelRelationCurvePositiveMomentAndSideslipAngle =
+                                data;
+                        } else if (d === 2) {
+                            this.form.rearLeftWheelRelationCurveLateralForceAndSideslipAngle =
+                                data;
+                        } else if (d === 3) {
+                            this.form.rearLeftWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                                data;
+                        }
+                        break;
+                    case "3":
+                        if (d === 1) {
+                            this.form.frontRightWheelRelationCurvePositiveMomentAndSideslipAngle =
+                                data;
+                        } else if (d === 2) {
+                            this.form.frontRightWheelRelationCurveLateralForceAndSideslipAngle =
+                                data;
+                        } else if (d === 3) {
+                            this.form.frontRightWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                                data;
+                        }
+                        break;
+                    case "4":
+                        if (d === 1) {
+                            this.form.rearRightWheelRelationCurvePositiveMomentAndSideslipAngle =
+                                data;
+                        } else if (d === 2) {
+                            this.form.rearRightWheelRelationCurveLateralForceAndSideslipAngle =
+                                data;
+                        } else if (d === 3) {
+                            this.form.rearRightWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                                data;
+                        }
+                        break;
+
+                    default:
+                        break;
+                }
+            }
+
+            // console.log(data);
+
+            // console.log(labels);
+            // console.log(props);
+
+            this.diaCancel();
+        },
+        diaCancel() {
+            this.diaVisible = false;
+
+            this.diaTitle = "";
+            this.isCur = "";
+            this.isCurA = "";
+
+            this.columns1 = [];
+            this.getDataWay1.data = [];
+
+            // this.$refs.upload1.attachmentList = [];
+            // console.log(this.$refs.upload1);
+            // console.log(this.$refs.upload1.attachmentList);
+        },
+        diaSave1() {
+            let array = this.getDataWay2.data;
+
+            for (let index = 0; index < array.length; index++) {
+                const element = array[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    this.$message.error("数据不全,请填写完整");
+                    return;
+                }
+            }
+
+            let array1 = this.getDataWay2A.data;
+
+            for (let index = 0; index < array1.length; index++) {
+                const element = array1[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    this.$message.error("数据不全,请填写完整");
+                    return;
+                }
+            }
+
+            let data = [];
+            data.push(["X Axis", "Y Axis"]);
+
+            array.forEach((i) => {
+                data.push([i.x, i.y]);
+            });
+
+            let data1 = [];
+            data1.push(["X Axis", "Y Axis"]);
+
+            array1.forEach((i) => {
+                data1.push([i.x, i.y]);
+            });
+
+            switch (this.dia2Type) {
+                case 1:
+                    this.form.shiftTimeUp12 = data;
+                    this.form.shiftTimeDown12 = data1;
+                    break;
+                case 2:
+                    this.form.shiftTimeUp23 = data;
+                    this.form.shiftTimeDown23 = data1;
+                    break;
+                case 3:
+                    this.form.shiftTimeUp34 = data;
+                    this.form.shiftTimeDown34 = data1;
+                    break;
+                case 4:
+                    this.form.shiftTimeUp45 = data;
+                    this.form.shiftTimeDown45 = data1;
+                    break;
+                case 5:
+                    this.form.shiftTimeUp56 = data;
+                    this.form.shiftTimeDown56 = data1;
+                    break;
+                default:
+                    break;
+            }
+
+            this.diaCancel1();
+        },
+        diaCancel1() {
+            this.diaVisible1 = false;
+
+            this.diaTitle1 = "";
+            this.isCurB = "";
+
+            this.columns2 = [];
+            this.columns2A = [];
+            this.getDataWay2.data = [];
+            this.getDataWay2A.data = [];
+        },
+        diaSave2() {
+            let array = this.getDataWay3.data;
+
+            for (let index = 0; index < array.length; index++) {
+                const element = array[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    this.$message.error("数据不全,请填写完整");
+                    return;
+                }
+            }
+
+            let array1 = this.getDataWay3A.data;
+
+            for (let index = 0; index < array1.length; index++) {
+                const element = array1[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    this.$message.error("数据不全,请填写完整");
+                    return;
+                }
+            }
+
+            let data = [];
+            data.push(["X Axis", "Y Axis"]);
+
+            array.forEach((i) => {
+                data.push([i.x, i.y]);
+            });
+
+            let data1 = [];
+            data1.push(["X Axis", "Y Axis"]);
+
+            array1.forEach((i) => {
+                data1.push([i.x, i.y]);
+            });
+
+            this.form.relationCurveRightWheelAngleAndSteeringGearOutput = data;
+            this.form.relationCurveLeftWheelAngleAndSteeringGearOutput = data1;
+
+            this.diaCancel2();
+        },
+        diaCancel2() {
+            this.diaVisible2 = false;
+
+            this.diaTitle2 = "";
+            this.isCurC = "";
+
+            this.columns3 = [];
+            this.columns3A = [];
+            this.getDataWay3.data = [];
+            this.getDataWay3A.data = [];
+        },
+        attachmentHandle(fileInfo) {
+            let data = []; // 表格数据
+
+            let brr = fileInfo.slice(1) || []; // 传过来的数据
+
+            for (let j = 0; j < brr.length; j++) {
+                let v = brr[j];
+                let obj = {
+                    x: v[0],
+                    y: v[1],
+                };
+
+                data.push(obj);
+            }
+
+            return data;
+        },
+        attachmentChange(fileInfo) {
+            this.file = fileInfo;
+        },
+        attachmentChange1(fileInfo) {
+            this.file1 = fileInfo;
+            // console.log(fileInfo);
+
+            let columns = []; // column数组
+
+            // let flag = false; // 简单的校验是否是只有x、y轴的单y轴数据
+
+            fileInfo[0].forEach((i) => {
+                // if (i.toLowerCase().includes("y")) flag = true;
+                columns.push({
+                    label: i,
+                    prop: i.toLowerCase().includes("x") ? "x" : i,
+                    template: true,
+                });
+            });
+
+            // if (flag) return;
+
+            let data = []; // 表格数据
+
+            let arr = fileInfo[0] || []; // 传过来的props
+            let brr = fileInfo.slice(1) || []; // 传过来的数据
+
+            for (let j = 0; j < brr.length; j++) {
+                let v = brr[j];
+                let obj = {};
+
+                arr.forEach((i, index) => {
+                    let prop = "";
+                    if (i.toLowerCase().includes("x")) {
+                        prop = "x";
+                    } else {
+                        prop = i;
+                    }
+
+                    obj[prop] = v[index];
+                });
+
+                data.push(obj);
+            }
+
+            this.columns1 = columns;
+            this.getDataWay1.data = data;
+        },
+        attachmentChange2(fileInfo) {
+            this.getDataWay2.data = this.attachmentHandle(fileInfo);
+        },
+        attachmentChange2A(fileInfo) {
+            this.getDataWay2A.data = this.attachmentHandle(fileInfo);
+        },
+        attachmentChange3(fileInfo) {
+            this.getDataWay3.data = this.attachmentHandle(fileInfo);
+        },
+        attachmentChange3A(fileInfo) {
+            this.getDataWay3A.data = this.attachmentHandle(fileInfo);
+        },
+        handleChang() {
+            let a = +this.form1.a;
+            let b = +this.form1.b;
+
+            if (a && b) {
+                let columnsArr = [
+                    {
+                        label: "X Axis",
+                        prop: "x",
+                        template: true,
+                    },
+                ];
+
+                let propArr = ["x"];
+
+                // 处理表头,并确定对应的prop ->column
+                for (let index = 1; index < b; index++) {
+                    columnsArr.push({
+                        label: index + "",
+                        prop: index,
+                        template: true,
+                    });
+
+                    propArr.push(index);
+                }
+
+                let dataArr = [];
+
+                // 往对应的prop里添加数据 ->data
+                for (let j = 0; j < a; j++) {
+                    let obj = {};
+
+                    propArr.forEach((p) => {
+                        obj[p] = "";
+                    });
+
+                    dataArr.push(obj);
+                }
+
+                this.columns1 = columnsArr;
+                this.getDataWay1.data = dataArr;
+            }
+        },
+        handleChang1(s) {
+            let a = +this[`form${s}`].a;
+
+            if (a) {
+                let dataArr = [];
+
+                // 往对应的prop里添加数据 ->data
+                for (let j = 0; j < a; j++) {
+                    let obj = { x: "", y: "" };
+                    dataArr.push(obj);
+                }
+
+                this[`getDataWay${s}`].data = dataArr;
+            }
+        },
+        getDefaultArr(type) {
+            switch (type) {
+                case "columnsOri1":
+                    return [
+                        {
+                            label: "X Axis",
+                            prop: "x",
+                            template: true,
+                        },
+                        {
+                            label: "1",
+                            prop: "1",
+                            template: true,
+                        },
+                        {
+                            label: "2",
+                            prop: "2",
+                            template: true,
+                        },
+                        {
+                            label: "3",
+                            prop: "3",
+                            template: true,
+                        },
+                        {
+                            label: "4",
+                            prop: "4",
+                            template: true,
+                        },
+                    ];
+                    break;
+                case "columnsOri2":
+                    return [
+                        {
+                            label: "X Axis",
+                            prop: "x",
+                            template: true,
+                        },
+                        {
+                            label: "Y Axis",
+                            prop: "y",
+                            template: true,
+                        },
+                    ];
+                    break;
+                case "defaultArr1":
+                    return [
+                        {
+                            x: "",
+                            1: "",
+                            2: "",
+                            3: "",
+                            4: "",
+                        },
+                        {
+                            x: "",
+                            1: "",
+                            2: "",
+                            3: "",
+                            4: "",
+                        },
+                        {
+                            x: "",
+                            1: "",
+                            2: "",
+                            3: "",
+                            4: "",
+                        },
+                        {
+                            x: "",
+                            1: "",
+                            2: "",
+                            3: "",
+                            4: "",
+                        },
+                        {
+                            x: "",
+                            1: "",
+                            2: "",
+                            3: "",
+                            4: "",
+                        },
+                    ];
+                    break;
+                case "defaultArr2":
+                    return [
+                        {
+                            x: "",
+                            y: "",
+                        },
+                        {
+                            x: "",
+                            y: "",
+                        },
+                        {
+                            x: "",
+                            y: "",
+                        },
+                        {
+                            x: "",
+                            y: "",
+                        },
+                        {
+                            x: "",
+                            y: "",
+                        },
+                    ];
+                    break;
+                default:
+                    return [];
+                    break;
+            }
+        },
+        checkArr() {
+            /*  
+frontLeftWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 左前轮不同载荷下回正力矩和侧偏角的关系曲线
+frontLeftWheelRelationCurveLateralForceAndSideslipAngle: [], // 左前轮不同载荷下侧向力和侧偏角的关系曲线
+frontLeftWheelRelationCurveLongitudinalForceAndSideslipAngle:
+    [], // 左前轮不同载荷下纵向力和侧偏角的关系曲线
+rearLeftWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 左后轮不同载荷下回正力矩和侧偏角的关系曲线
+rearLeftWheelRelationCurveLateralForceAndSideslipAngle: [], // 左后轮不同载荷下侧向力和侧偏角的关系曲线
+rearLeftWheelRelationCurveLongitudinalForceAndSideslipAngle: [], // 左后轮不同载荷下纵向力和侧偏角的关系曲线
+frontRightWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 右前轮不同载荷下回正力矩和侧偏角的关系曲线
+frontRightWheelRelationCurveLateralForceAndSideslipAngle: [], // 右前轮不同载荷下侧向力和侧偏角的关系曲线
+frontRightWheelRelationCurveLongitudinalForceAndSideslipAngle:
+    [], // 右前轮不同载荷下纵向力和侧偏角的关系曲线
+rearRightWheelRelationCurvePositiveMomentAndSideslipAngle: [], // 右后轮不同载荷下回正力矩和侧偏角的关系曲线
+rearRightWheelRelationCurveLateralForceAndSideslipAngle: [], // 右后轮不同载荷下侧向力和侧偏角的关系曲线
+rearRightWheelRelationCurveLongitudinalForceAndSideslipAngle:
+    [], // 右后轮不同载荷下纵向力和侧偏角的关系曲线
+    */
+            let arr =
+                this.form
+                    .frontLeftWheelRelationCurvePositiveMomentAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "左前轮不同载荷下回正力矩和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .frontLeftWheelRelationCurveLateralForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "左前轮不同载荷下侧向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .frontLeftWheelRelationCurveLongitudinalForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "左前轮不同载荷下纵向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .rearLeftWheelRelationCurvePositiveMomentAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "左后轮不同载荷下回正力矩和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .rearLeftWheelRelationCurveLateralForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "左后轮不同载荷下侧向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .rearLeftWheelRelationCurveLongitudinalForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "左后轮不同载荷下纵向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .frontRightWheelRelationCurvePositiveMomentAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "右前轮不同载荷下回正力矩和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .frontRightWheelRelationCurveLateralForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "右前轮不同载荷下侧向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .frontRightWheelRelationCurveLongitudinalForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "右前轮不同载荷下纵向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .rearRightWheelRelationCurvePositiveMomentAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "右后轮不同载荷下回正力矩和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .rearRightWheelRelationCurveLateralForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "右后轮不同载荷下侧向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            arr =
+                this.form
+                    .rearRightWheelRelationCurveLongitudinalForceAndSideslipAngle;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "右后轮不同载荷下纵向力和侧偏角的关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            /* 
+            relationCurveEngineTorqueSpeedAndThrottleOpening: [], // 发动机扭矩、转速和节气门开的度关系曲线
+            */
+
+            arr = this.form.relationCurveEngineTorqueSpeedAndThrottleOpening;
+            if (!Array.isArray(arr) || arr.length === 0) {
+                this.$message.error(
+                    "发动机扭矩、转速和节气门开的度关系曲线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            /* 
+                gearRatio: [], // R,N,1,2,3,4,5,6
+                inertia: [], // R,N,1,2,3,4,5,6
+                driving: [], // R,N,1,2,3,4,5,6
+                coasting: [], // R,N,1,2,3,4,5,6
+            */
+
+            let dataArray = this.getDataWay.data;
+
+            for (let index = 0; index < dataArray.length; index++) {
+                const element = dataArray[index];
+
+                let flag = Object.values(element).some((i) => i === "");
+
+                if (flag) {
+                    this.$message.error("变速器表格中数据不全,请填写完整");
+                    return false;
+                }
+            }
+
+            this.form.gearRatio = [];
+            this.form.inertia = [];
+            this.form.driving = [];
+            this.form.coasting = [];
+
+            dataArray.forEach((i) => {
+                this.form.gearRatio.push(i.gearRatio);
+                this.form.inertia.push(i.inertia);
+                this.form.driving.push(i.driving);
+                this.form.coasting.push(i.coasting);
+            });
+
+            console.log(dataArray);
+            console.log(this.form.gearRatio);
+            console.log(this.form.inertia);
+            console.log(this.form.driving);
+            console.log(this.form.coasting);
+
+            /* arr = this.form.gearRatio;
+            let arr1 = this.form.inertia;
+            let arr2 = this.form.driving;
+            let arr3 = this.form.coasting;
+            if (
+                !Array.isArray(arr) ||
+                arr.length === 0 ||
+                !Array.isArray(arr1) ||
+                arr1.length === 0 ||
+                !Array.isArray(arr2) ||
+                arr2.length === 0 ||
+                !Array.isArray(arr3) ||
+                arr3.length === 0
+            ) {
+                this.$message.error("变速器表格中数据不全,请填写完整");
+                return false;
+            } */
+
+            /* 
+                shiftTimeUp12: [],
+                shiftTimeDown12: [],
+                shiftTimeUp23: [],
+                shiftTimeDown23: [],
+                shiftTimeUp34: [],
+                shiftTimeDown34: [],
+                shiftTimeUp45: [],
+                shiftTimeDown45: [],
+                shiftTimeUp56: [],
+                shiftTimeDown56: [],
+            */
+
+            arr = this.form.shiftTimeUp12;
+            let arr1 = this.form.shiftTimeDown12;
+            if (
+                !Array.isArray(arr) ||
+                arr.length === 0 ||
+                !Array.isArray(arr1) ||
+                arr1.length === 0
+            ) {
+                this.$message.error("1-2 换挡曲线数据不全,请填写完整");
+                return false;
+            }
+
+            arr = this.form.shiftTimeUp23;
+            arr1 = this.form.shiftTimeDown23;
+            if (
+                !Array.isArray(arr) ||
+                arr.length === 0 ||
+                !Array.isArray(arr1) ||
+                arr1.length === 0
+            ) {
+                this.$message.error("2-3 换挡曲线数据不全,请填写完整");
+                return false;
+            }
+
+            arr = this.form.shiftTimeUp34;
+            arr1 = this.form.shiftTimeDown34;
+            if (
+                !Array.isArray(arr) ||
+                arr.length === 0 ||
+                !Array.isArray(arr1) ||
+                arr1.length === 0
+            ) {
+                this.$message.error("3-4 换挡曲线数据不全,请填写完整");
+                return false;
+            }
+
+            arr = this.form.shiftTimeUp45;
+            arr1 = this.form.shiftTimeDown45;
+            if (
+                !Array.isArray(arr) ||
+                arr.length === 0 ||
+                !Array.isArray(arr1) ||
+                arr1.length === 0
+            ) {
+                this.$message.error("4-5 换挡曲线数据不全,请填写完整");
+                return false;
+            }
+
+            arr = this.form.shiftTimeUp56;
+            arr1 = this.form.shiftTimeDown56;
+            if (
+                !Array.isArray(arr) ||
+                arr.length === 0 ||
+                !Array.isArray(arr1) ||
+                arr1.length === 0
+            ) {
+                this.$message.error("5-6 换挡曲线数据不全,请填写完整");
+                return false;
+            }
+
+            /* 
+            relationCurveRightWheelAngleAndSteeringGearOutput: [], // 右轮转角与转向器输出的关系
+            relationCurveLeftWheelAngleAndSteeringGearOutput: [], // 左轮转角与转向器输出的关系
+             */
+
+            arr = this.form.relationCurveRightWheelAngleAndSteeringGearOutput;
+            arr1 = this.form.relationCurveLeftWheelAngleAndSteeringGearOutput;
+            if (
+                !Array.isArray(arr) ||
+                arr.length === 0 ||
+                !Array.isArray(arr1) ||
+                arr1.length === 0
+            ) {
+                this.$message.error(
+                    "车轮转角与转向器输出的关系曲线线数据不全,请填写完整"
+                );
+                return false;
+            }
+
+            return true;
+        },
+        save() {
+            let flag = null;
+
+            this.$refs.form.validate((valid) => {
+                if (valid) {
+                    let hasArr = this.checkArr();
+
+                    if (hasArr) {
+                        // this.$emit("getForm", this.form, 2);
+                        flag = true;
+                    } else {
+                        flag = false;
+                    }
+                } else {
+                    flag = false;
+                }
+            });
+
+            return flag;
+        },
+        handleData() {
+            /* gearRatio: [], // R,N,1,2,3,4,5,6
+                inertia: [], // R,N,1,2,3,4,5,6
+                driving: [], // R,N,1,2,3,4,5,6
+                coasting: [], // R,N,1,2,3,4,5,6 
+                
+                {
+                        a: "N",
+                        gearRatio: "/",
+                        inertia: "",
+                        driving: "/",
+                        coasting: "/",
+                    },
+                */
+
+            // let arr = this.form.gearRatio;
+            if (this.form.gearRatio.length === 0) return;
+
+            let arr = this.getDataWay.data;
+
+            for (let index = 0; index < arr.length; index++) {
+                const obj = arr[index];
+                obj.gearRatio = this.form.gearRatio[index];
+                obj.inertia = this.form.inertia[index];
+                obj.driving = this.form.driving[index];
+                obj.coasting = this.form.coasting[index];
+            }
+        },
+    },
+
+    mounted() {},
+};
+</script>
+
+<style lang='less' scoped>
+.titlePanel {
+    padding: 22px 0;
+}
+
+.titlePanelA {
+    padding-top: 22px;
+    padding-bottom: 22px;
+}
+
+.padTop15 {
+    padding-top: 15px;
+}
+
+.padTop22 {
+    padding-top: 22px;
+}
+
+.padTop0 {
+    padding-top: 0;
+}
+
+.marBot20 {
+    margin-bottom: 20px;
+}
+
+.titlePanelABor {
+    padding-left: 9px;
+    font-weight: bold;
+    line-height: 1.08;
+
+    b {
+        display: inline-block;
+        width: 15px;
+        height: 13px;
+        margin-right: 6px;
+        vertical-align: middle;
+        background: url("../../../assets/common/image/others/car.png") center
+            no-repeat;
+        background-size: contain;
+    }
+}
+
+.carTipBox {
+    width: 807px;
+    padding-right: 30px;
+    // margin: 0 auto;
+
+    .searchLayoutBox {
+        position: relative;
+        padding: 18px;
+        text-align: center;
+    }
+
+    /deep/ .el-input {
+        width: 100%;
+        max-width: 231px;
+    }
+
+    /deep/ .el-form-item {
+        position: absolute;
+        z-index: 6;
+        margin: 0;
+        width: 12%;
+    }
+
+    /deep/ .el-form-item__content {
+        margin: 0 !important;
+    }
+
+    .p1 {
+        top: 36.6%;
+        left: 4.2%;
+    }
+
+    .p2 {
+        top: 74.1%;
+        left: 12%;
+    }
+
+    .p3 {
+        top: 65.1%;
+        left: 36%;
+    }
+
+    .p4 {
+        top: 62.1%;
+        left: 54%;
+    }
+
+    .p6 {
+        top: 81%;
+        left: 42%;
+    }
+}
+
+.myTabsBox {
+    margin-right: 30px;
+
+    /deep/ .el-tabs__nav-scroll {
+        &:after {
+            width: 100%;
+        }
+    }
+
+    &.myTabsBoxFourTabs {
+        /deep/ .el-tabs {
+            width: auto;
+            margin: 0;
+        }
+
+        /deep/ .el-tabs__item {
+            width: 90px;
+        }
+    }
+
+    /deep/
+        .el-tabs--top.el-tabs--card
+        > .el-tabs__header
+        .el-tabs__item:nth-child(2) {
+        padding-left: 0;
+        border-left-color: @gray;
+
+        &.is-active {
+            border-left-color: @themeColor;
+        }
+    }
+
+    /deep/
+        .el-tabs--top.el-tabs--card
+        > .el-tabs__header
+        .el-tabs__item:last-child {
+        padding-right: 0;
+    }
+}
+
+.dialogBtnBox {
+    // justify-content: space-between;
+    padding-bottom: 12px;
+    margin-right: 30px;
+
+    .dia {
+        padding: 10px 6px;
+        margin-right: 10px;
+        margin-bottom: 10px;
+        border: 1px solid @gray;
+        border-radius: 4px;
+        background: rgba(51, 151, 255, 0.06);
+        cursor: pointer;
+
+        &:last-child {
+            margin-right: 0;
+        }
+
+        &:hover,
+        &.isCur {
+            border-color: @themeColor;
+            color: @themeColor;
+        }
+    }
+
+    .dia2 {
+        display: inline-block;
+    }
+}
+
+.wrapBox {
+    .labelName {
+        padding-right: 10px;
+        margin-top: 10px;
+    }
+}
+
+.diaContentBox {
+    display: flex;
+    justify-content: space-between;
+
+    .diaContent {
+        width: 48%;
+    }
+
+    .chartBox {
+        height: 60vh;
+    }
+
+    .chartBox1 {
+        height: 66vh;
+    }
+
+    .diaLineTitle {
+        padding: 0 10px 10px;
+        font-weight: bold;
+    }
+
+    .handleForm {
+        .el-form-item {
+            margin-right: 30px;
+        }
+
+        .el-input {
+            width: 180px;
+        }
+    }
+
+    .tipName {
+        padding-bottom: 10px;
+    }
+}
+
+.el-table .el-input {
+    width: 100%;
+}
+</style>

+ 452 - 0
src/views/modelLibrary/components/vehicleModelVTD.vue

@@ -0,0 +1,452 @@
+<template>
+    <el-form ref="form" :model="form" :rules="rules" label-width="160px">
+        <div class="titlePanel">
+            <div class="titlePanelBor">控制参数</div>
+        </div>
+        <div class="flexBox">
+            <el-form-item label="最大速度(km/h):" prop="maxSpeed">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'maxSpeed' }"
+                    v-model="form.maxSpeed"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="发动机功率(kW):" prop="enginePower">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'enginePower' }"
+                    v-model="form.enginePower"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="最大减速度(m/s²):" prop="maxDeceleration">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'maxDeceleration' }"
+                    v-model="form.maxDeceleration"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="最大转向角度(rad):" prop="maxSteeringAngle">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'maxSteeringAngle' }"
+                    v-model="form.maxSteeringAngle"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="驱动方式:" prop="wheelDrive">
+                <el-select v-model="form.wheelDrive">
+                    <el-option
+                        v-for="item in wheelDriveList"
+                        :label="item.caption"
+                        :value="item.code"
+                        :key="item.code"
+                    ></el-option>
+                </el-select>
+            </el-form-item>
+        </div>
+
+        <div class="titlePanel">
+            <div class="titlePanelBor">效率参数</div>
+        </div>
+        <div class="flexBox">
+            <el-form-item label="总效率:" prop="overallEfficiency">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="9"
+                    v-autoTrim="{ obj: form, key: 'overallEfficiency' }"
+                    v-model="form.overallEfficiency"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item
+                label="前表面有效面积(㎡):"
+                prop="frontSurfaceEffective"
+            >
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{
+                        obj: form,
+                        key: 'frontSurfaceEffective',
+                    }"
+                    v-model="form.frontSurfaceEffective"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="空气阻力系数:" prop="airDragCoefficient">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="9"
+                    v-autoTrim="{
+                        obj: form,
+                        key: 'airDragCoefficient',
+                    }"
+                    v-model="form.airDragCoefficient"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item
+                label="滚动阻力系数:"
+                prop="rollingResistanceCoefficient"
+            >
+                <el-input
+                    placeholder="请输入"
+                    maxlength="9"
+                    v-autoTrim="{
+                        obj: form,
+                        key: 'rollingResistanceCoefficient',
+                    }"
+                    v-model="form.rollingResistanceCoefficient"
+                >
+                </el-input>
+            </el-form-item>
+        </div>
+
+        <div class="titlePanel">
+            <div class="titlePanelBor">几何参数</div>
+        </div>
+        <div class="flexBox">
+            <el-form-item label="车轮直径(m):" prop="wheelDiameter">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'wheelDiameter' }"
+                    v-model="form.wheelDiameter"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="车前距(m):" prop="frontDistance">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'frontDistance' }"
+                    v-model="form.frontDistance"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="车后距(m):" prop="rearDistance">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'rearDistance' }"
+                    v-model="form.rearDistance"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="车左距(m):" prop="leftDistance">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'leftDistance' }"
+                    v-model="form.leftDistance"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="车右距(m):" prop="rightDistance">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'rightDistance' }"
+                    v-model="form.rightDistance"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="车高(m):" prop="heightDistance">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'heightDistance' }"
+                    v-model="form.heightDistance"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="轴距(m):" prop="wheelbase">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'wheelbase' }"
+                    v-model="form.wheelbase"
+                >
+                </el-input>
+            </el-form-item>
+            <el-form-item label="质量(kg):" prop="mass">
+                <el-input
+                    placeholder="请输入"
+                    maxlength="12"
+                    v-autoTrim="{ obj: form, key: 'mass' }"
+                    v-model="form.mass"
+                >
+                </el-input>
+            </el-form-item>
+        </div>
+    </el-form>
+</template>
+
+<script>
+//import  from '';
+
+export default {
+    name: "vehicleModelVTD", // 车辆模型-VTD
+    components: {},
+    data() {
+        // 校验非负且最多4位小数
+        let validateNum = (rule, value, callback) => {
+            !/^(0|[1-9][0-9]*)(\.\d{1,4})?$/.test(value) &&
+                callback(new Error(rule.message));
+            callback();
+        };
+        // 校验不大于1
+        let validateNoMore1 = (rule, value, callback) => {
+            if (value > 1) {
+                callback(new Error(rule.message));
+                return;
+            }
+            callback();
+        };
+        return {
+            form: {
+                // vehicleCode: "", // 车辆ID
+                // vehicleName: "", // 车辆名称
+                // description: "", // 车辆描述
+                // vehicleType: "", // 车辆类型
+                // vehicleModel: "", // 车辆型号
+                // vehicleColour: "", // 车辆颜色
+                // vehicleType: [], // 车辆模型
+                // modelLabel: "", // 车辆模型标识
+                maxSpeed: "", // 最大速度
+                enginePower: "", // 发动机功率
+                maxDeceleration: "", // 最大减速度
+                maxSteeringAngle: "", // 最大转角
+                wheelDrive: "", // 驱动方式
+                overallEfficiency: "", // 总效率
+                frontSurfaceEffective: "", // 前表面有效面积
+                airDragCoefficient: "", // 空气阻力系数
+                rollingResistanceCoefficient: "", // 滚动阻力系数
+                wheelDiameter: "", // 车轮直径
+                frontDistance: "", // 车前距
+                rearDistance: "", // 车后距
+                leftDistance: "", // 车左距
+                rightDistance: "", // 车右距
+                heightDistance: "", // 车高
+                wheelbase: "", // 轴距
+                mass: "", // 质量
+                // share: "", // 分享
+                // vehicleImage: "", // 对应的图片相对地址
+                // id: "",
+                // vehicleFrontView: "", // 对应的图片相对地址
+                // vehicleTopView: "", // 对应的图片相对地址
+            },
+            vehicleTypeList: [],
+            vehicleModelList: [],
+            vehicleColourList: [],
+            // wheelDriveList: [],
+            rules: {
+                // vehicleName: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                // ],
+                // description: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                // ],
+                // vehicleModel: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                // ],
+                // vehicleColour: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                // ],
+                // modelLabel: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                // ],
+                maxSpeed: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                enginePower: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                maxDeceleration: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                maxSteeringAngle: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                overallEfficiency: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNoMore1,
+                        message: "请输入不大于1的非负数",
+                        trigger: ["blur"],
+                    },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontSurfaceEffective: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                airDragCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNoMore1,
+                        message: "请输入不大于1的非负数",
+                        trigger: ["blur"],
+                    },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rollingResistanceCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNoMore1,
+                        message: "请输入不大于1的非负数",
+                        trigger: ["blur"],
+                    },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelDiameter: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                leftDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rightDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                heightDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelbase: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                mass: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelDrive: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+                // vehicleType: [
+                //     { required: true, message: "请选择", trigger: "change" },
+                // ],
+            },
+        };
+    },
+
+    props: {
+        wheelDriveList: {
+            default: function () {
+                return [];
+            },
+            type: Array,
+        },
+    },
+
+    methods: {
+        save() {
+            let flag = null;
+            
+            this.$refs.form.validate((valid) => {
+                if (valid) {
+                    flag = true;
+                } else {
+                    flag = false;
+                }
+            });
+
+            return flag;
+        },
+    },
+
+    mounted() {},
+};
+</script>
+
+<style lang='less' scoped>
+.titlePanel {
+    padding: 22px 0;
+}
+</style>

+ 446 - 386
src/views/modelLibrary/vehicleModel.vue

@@ -18,9 +18,24 @@
                 :rules="rules"
                 label-width="160px"
             >
-                <div class="inputBox flexBox">
-                    <span class="label">车辆ID</span>
-                    <div>{{ form.vehicleCode }}</div>
+                <div class="flexBox">
+                    <el-form-item label="车辆设置方式:" prop="parameterType">
+                        <el-select
+                            v-model="form.parameterType"
+                            :disabled="form.share != ''"
+                        >
+                            <el-option
+                                v-for="item in parameterTypeList"
+                                :label="item.caption"
+                                :value="item.code"
+                                :key="item.code"
+                            ></el-option>
+                        </el-select>
+                    </el-form-item>
+                    <div class="inputBox flexBox">
+                        <span class="label">车辆ID:</span>
+                        <div>{{ form.vehicleCode }}</div>
+                    </div>
                 </div>
 
                 <div class="flexBox">
@@ -59,214 +74,52 @@
                         >
                         </el-input>
                     </el-form-item>
-                </div>
-
-                <div class="titlePanel">
-                    <div class="titlePanelBor">控制参数</div>
-                </div>
-                <div class="flexBox">
-                    <el-form-item label="最大速度(km/h):" prop="maxSpeed">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'maxSpeed' }"
-                            v-model="form.maxSpeed"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="发动机功率(kW):" prop="enginePower">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'enginePower' }"
-                            v-model="form.enginePower"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item
-                        label="最大减速度(m/s²):"
-                        prop="maxDeceleration"
-                    >
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'maxDeceleration' }"
-                            v-model="form.maxDeceleration"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item
-                        label="最大转向角度(rad):"
-                        prop="maxSteeringAngle"
-                    >
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'maxSteeringAngle' }"
-                            v-model="form.maxSteeringAngle"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="驱动方式:" prop="wheelDrive">
-                        <el-select v-model="form.wheelDrive">
-                            <el-option
-                                v-for="item in wheelDriveList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </el-form-item>
-                </div>
-
-                <div class="titlePanel">
-                    <div class="titlePanelBor">效率参数</div>
-                </div>
-                <div class="flexBox">
-                    <el-form-item label="总效率:" prop="overallEfficiency">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="9"
-                            v-autoTrim="{ obj: form, key: 'overallEfficiency' }"
-                            v-model="form.overallEfficiency"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item
-                        label="前表面有效面积(㎡):"
-                        prop="frontSurfaceEffective"
+                    <!-- <el-form-item
+                        v-if="form.parameterType != '1'"
+                        label="参数文件:"
+                        prop="file"
                     >
                         <el-input
                             placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{
-                                obj: form,
-                                key: 'frontSurfaceEffective',
-                            }"
-                            v-model="form.frontSurfaceEffective"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item
-                        label="空气阻力系数:"
-                        prop="airDragCoefficient"
-                    >
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="9"
-                            v-autoTrim="{
-                                obj: form,
-                                key: 'airDragCoefficient',
-                            }"
-                            v-model="form.airDragCoefficient"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item
-                        label="滚动阻力系数:"
-                        prop="rollingResistanceCoefficient"
-                    >
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="9"
-                            v-autoTrim="{
-                                obj: form,
-                                key: 'rollingResistanceCoefficient',
-                            }"
-                            v-model="form.rollingResistanceCoefficient"
+                            maxlength="120"
+                            v-autoTrim="{ obj: form, key: 'file' }"
+                            v-model="form.file"
+                            disabled
+                            :title="form.file"
                         >
                         </el-input>
-                    </el-form-item>
+                        <upload
+                            ref="upload"
+                            :multiple="false"
+                            @attachmentChange="attachmentChange"
+                        ></upload>
+                    </el-form-item> -->
                 </div>
 
-                <div class="titlePanel">
-                    <div class="titlePanelBor">几何参数</div>
-                </div>
-                <div class="flexBox">
-                    <el-form-item label="车轮直径(m):" prop="wheelDiameter">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'wheelDiameter' }"
-                            v-model="form.wheelDiameter"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="车前距(m):" prop="frontDistance">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'frontDistance' }"
-                            v-model="form.frontDistance"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="车后距(m):" prop="rearDistance">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'rearDistance' }"
-                            v-model="form.rearDistance"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="车左距(m):" prop="leftDistance">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'leftDistance' }"
-                            v-model="form.leftDistance"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="车右距(m):" prop="rightDistance">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'rightDistance' }"
-                            v-model="form.rightDistance"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="车高(m):" prop="heightDistance">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'heightDistance' }"
-                            v-model="form.heightDistance"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="轴距(m):" prop="wheelbase">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'wheelbase' }"
-                            v-model="form.wheelbase"
-                        >
-                        </el-input>
-                    </el-form-item>
-                    <el-form-item label="质量(kg):" prop="mass">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="12"
-                            v-autoTrim="{ obj: form, key: 'mass' }"
-                            v-model="form.mass"
-                        >
-                        </el-input>
-                    </el-form-item>
-                </div>
+                <vtd
+                    ref="vtd"
+                    v-show="form.parameterType === '1'"
+                    :wheelDriveList="wheelDriveList"
+                ></vtd>
+                <Carsim
+                    ref="carsim"
+                    v-show="form.parameterType != '1'"
+                    :suspensionTypeList="suspensionTypeList"
+                    :brakeTypeList="brakeTypeList"
+                    :steeringTypeList="steeringTypeList"
+                    :steeringGearTypeList="steeringGearTypeList"
+                ></Carsim>
 
                 <div class="titlePanel">
                     <div class="titlePanelBor">3D视图</div>
                 </div>
-                
+
                 <div class="modelBox">
                     <!-- <img v-show="modelImgSrc" :src="modelImgSrc" width="100%" /> -->
-                    <three-show
+                    <!-- <three-show
                         ref="threeShow"
                         :carModel="carModel"
-                    ></three-show>
+                    ></three-show> -->
                 </div>
             </el-form>
 
@@ -300,13 +153,16 @@
 </template>
 
 <script>
-import modelList from "./components/modelList.vue";
+import modelList from "./components/modelTypeList.vue";
 import { mapState } from "vuex";
 import threeShow from "./components/threeVehicleModel.vue";
+import vtd from "./components/vehicleModelVTD.vue";
+import Carsim from "./components/vehicleModelCarsim.vue";
+import upload from "./components/upload.vue";
 
 export default {
     name: "vehicleModel", // 车辆模型
-    components: { modelList, threeShow },
+    components: { modelList, threeShow, vtd, Carsim, upload },
     data() {
         // 校验非负且最多4位小数
         let validateNum = (rule, value, callback) => {
@@ -329,31 +185,34 @@ export default {
             typeList: [],
             // imgSrc: require("@/assets/common/image/car.png"),
             form: {
+                parameterType: "1", // 车辆设置方式
                 vehicleCode: "", // 车辆ID
                 vehicleName: "", // 车辆名称
                 description: "", // 车辆描述
+                // file: "", // 参数文件
                 // vehicleType: "", // 车辆类型
                 // vehicleModel: "", // 车辆型号
                 // vehicleColour: "", // 车辆颜色
                 vehicleType: [], // 车辆模型
                 modelLabel: "", // 车辆模型标识
-                maxSpeed: "", // 最大速度
-                enginePower: "", // 发动机功率
-                maxDeceleration: "", // 最大减速度
-                maxSteeringAngle: "", // 最大转角
-                wheelDrive: "", // 驱动方式
-                overallEfficiency: "", // 总效率
-                frontSurfaceEffective: "", // 前表面有效面积
-                airDragCoefficient: "", // 空气阻力系数
-                rollingResistanceCoefficient: "", // 滚动阻力系数
-                wheelDiameter: "", // 车轮直径
-                frontDistance: "", // 车前距
-                rearDistance: "", // 车后距
-                leftDistance: "", // 车左距
-                rightDistance: "", // 车右距
-                heightDistance: "", // 车高
-                wheelbase: "", // 轴距
-                mass: "", // 质量
+
+                // maxSpeed: "", // 最大速度
+                // enginePower: "", // 发动机功率
+                // maxDeceleration: "", // 最大减速度
+                // maxSteeringAngle: "", // 最大转角
+                // wheelDrive: "", // 驱动方式
+                // overallEfficiency: "", // 总效率
+                // frontSurfaceEffective: "", // 前表面有效面积
+                // airDragCoefficient: "", // 空气阻力系数
+                // rollingResistanceCoefficient: "", // 滚动阻力系数
+                // wheelDiameter: "", // 车轮直径
+                // frontDistance: "", // 车前距
+                // rearDistance: "", // 车后距
+                // leftDistance: "", // 车左距
+                // rightDistance: "", // 车右距
+                // heightDistance: "", // 车高
+                // wheelbase: "", // 轴距
+                // mass: "", // 质量
                 share: "", // 分享
                 // vehicleImage: "", // 对应的图片相对地址
                 id: "",
@@ -364,171 +223,183 @@ export default {
             vehicleModelList: [],
             vehicleColourList: [],
             wheelDriveList: [],
+            parameterTypeList: [],
+
+            suspensionTypeList: [],
+            brakeTypeList: [],
+            steeringTypeList: [],
+            steeringGearTypeList: [],
+
             rules: {
+                parameterType: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
                 vehicleName: [
                     { required: true, message: "请输入", trigger: "blur" },
                 ],
                 description: [
                     { required: true, message: "请输入", trigger: "blur" },
                 ],
+                vehicleType: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+                modelLabel: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                ],
+                // file: [{ required: true, message: "请上传", trigger: "blur" }],
+
                 // vehicleModel: [
                 //     { required: true, message: "请输入", trigger: "blur" },
                 // ],
                 // vehicleColour: [
                 //     { required: true, message: "请输入", trigger: "blur" },
                 // ],
-                modelLabel: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                ],
-                maxSpeed: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                enginePower: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                maxDeceleration: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                maxSteeringAngle: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                overallEfficiency: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNoMore1,
-                        message: "请输入不大于1的非负数",
-                        trigger: ["blur"],
-                    },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                frontSurfaceEffective: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                airDragCoefficient: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNoMore1,
-                        message: "请输入不大于1的非负数",
-                        trigger: ["blur"],
-                    },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                rollingResistanceCoefficient: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNoMore1,
-                        message: "请输入不大于1的非负数",
-                        trigger: ["blur"],
-                    },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                wheelDiameter: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                frontDistance: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                rearDistance: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                leftDistance: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                rightDistance: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                heightDistance: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                wheelbase: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                mass: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNum,
-                        message: "请输入最多带有4位小数的非负数",
-                        trigger: ["blur"],
-                    },
-                ],
-                wheelDrive: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
-                vehicleType: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
+                // maxSpeed: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // enginePower: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // maxDeceleration: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // maxSteeringAngle: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // overallEfficiency: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNoMore1,
+                //         message: "请输入不大于1的非负数",
+                //         trigger: ["blur"],
+                //     },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // frontSurfaceEffective: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // airDragCoefficient: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNoMore1,
+                //         message: "请输入不大于1的非负数",
+                //         trigger: ["blur"],
+                //     },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // rollingResistanceCoefficient: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNoMore1,
+                //         message: "请输入不大于1的非负数",
+                //         trigger: ["blur"],
+                //     },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // wheelDiameter: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // frontDistance: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // rearDistance: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // leftDistance: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // rightDistance: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // heightDistance: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // wheelbase: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // mass: [
+                //     { required: true, message: "请输入", trigger: "blur" },
+                //     {
+                //         validator: validateNum,
+                //         message: "请输入最多带有4位小数的非负数",
+                //         trigger: ["blur"],
+                //     },
+                // ],
+                // wheelDrive: [
+                //     { required: true, message: "请选择", trigger: "change" },
+                // ],
             },
             props: {
                 multiple: false,
@@ -551,6 +422,157 @@ export default {
     },
 
     methods: {
+        updateForm(t, o) {
+            let form = {};
+
+            if (t === "1") {
+                form.maxSpeed = o.maxSpeed;
+                form.enginePower = o.enginePower;
+                form.maxDeceleration = o.maxDeceleration;
+                form.maxSteeringAngle = o.maxSteeringAngle;
+                form.wheelDrive = o.wheelDrive;
+                form.overallEfficiency = o.overallEfficiency;
+                form.frontSurfaceEffective = o.frontSurfaceEffective;
+                form.airDragCoefficient = o.airDragCoefficient;
+                form.rollingResistanceCoefficient =
+                    o.rollingResistanceCoefficient;
+                form.wheelDiameter = o.wheelDiameter;
+                form.frontDistance = o.frontDistance;
+                form.rearDistance = o.rearDistance;
+                form.leftDistance = o.leftDistance;
+                form.rightDistance = o.rightDistance;
+                form.heightDistance = o.heightDistance;
+                form.wheelbase = o.wheelbase;
+                form.mass = o.mass;
+
+                this.$refs.vtd.form = form;
+            } else {
+                form.sprungMass = o.sprungMass;
+                form.vehicleWidth = o.vehicleWidth;
+                form.rotationalInertiaX = o.rotationalInertiaX;
+                form.rotationalInertiaY = o.rotationalInertiaY;
+                form.rotationalInertiaZ = o.rotationalInertiaZ;
+
+                form.wheelCenterToTop = o.wheelCenterToTop;
+                form.wheelCenterToGround = o.wheelCenterToGround;
+                form.centroidToFrontWheelCenter = o.centroidToFrontWheelCenter;
+                form.centroidToGround = o.centroidToGround;
+                form.wheelbase = o.wheelbase;
+
+                form.frontLeftWheelEffectiveRollingRadius =
+                    o.frontLeftWheelEffectiveRollingRadius;
+                form.frontLeftWheelRollingResistanceCoefficient =
+                    o.frontLeftWheelRollingResistanceCoefficient;
+                form.frontLeftWheelFreeRadius = o.frontLeftWheelFreeRadius;
+                form.rearLeftWheelEffectiveRollingRadius =
+                    o.rearLeftWheelEffectiveRollingRadius;
+                form.rearLeftWheelRollingResistanceCoefficient =
+                    o.rearLeftWheelRollingResistanceCoefficient;
+                form.rearLeftWheelFreeRadius = o.rearLeftWheelFreeRadius;
+                form.frontRightWheelEffectiveRollingRadius =
+                    o.frontRightWheelEffectiveRollingRadius;
+                form.frontRightWheelRollingResistanceCoefficient =
+                    o.frontRightWheelRollingResistanceCoefficient;
+                form.frontRightWheelFreeRadius = o.frontRightWheelFreeRadius;
+                form.rearRightWheelEffectiveRollingRadius =
+                    o.rearRightWheelEffectiveRollingRadius;
+                form.rearRightWheelRollingResistanceCoefficient =
+                    o.rearRightWheelRollingResistanceCoefficient;
+                form.rearRightWheelFreeRadius = o.rearRightWheelFreeRadius;
+
+                form.frontLeftWheelRelationCurvePositiveMomentAndSideslipAngle =
+                    o.frontLeftWheelRelationCurvePositiveMomentAndSideslipAngle;
+                form.frontLeftWheelRelationCurveLateralForceAndSideslipAngle =
+                    o.frontLeftWheelRelationCurveLateralForceAndSideslipAngle;
+                form.frontLeftWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                    o.frontLeftWheelRelationCurveLongitudinalForceAndSideslipAngle;
+                form.rearLeftWheelRelationCurvePositiveMomentAndSideslipAngle =
+                    o.rearLeftWheelRelationCurvePositiveMomentAndSideslipAngle;
+                form.rearLeftWheelRelationCurveLateralForceAndSideslipAngle =
+                    o.rearLeftWheelRelationCurveLateralForceAndSideslipAngle;
+                form.rearLeftWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                    o.rearLeftWheelRelationCurveLongitudinalForceAndSideslipAngle;
+                form.frontRightWheelRelationCurvePositiveMomentAndSideslipAngle =
+                    o.frontRightWheelRelationCurvePositiveMomentAndSideslipAngle;
+                form.frontRightWheelRelationCurveLateralForceAndSideslipAngle =
+                    o.frontRightWheelRelationCurveLateralForceAndSideslipAngle;
+                form.frontRightWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                    o.frontRightWheelRelationCurveLongitudinalForceAndSideslipAngle;
+                form.rearRightWheelRelationCurvePositiveMomentAndSideslipAngle =
+                    o.rearRightWheelRelationCurvePositiveMomentAndSideslipAngle;
+                form.rearRightWheelRelationCurveLateralForceAndSideslipAngle =
+                    o.rearRightWheelRelationCurveLateralForceAndSideslipAngle;
+                form.rearRightWheelRelationCurveLongitudinalForceAndSideslipAngle =
+                    o.rearRightWheelRelationCurveLongitudinalForceAndSideslipAngle;
+
+                form.frontWheelSuspensionType = o.frontWheelSuspensionType;
+                form.frontWheelSuspensionKinematicsCoefficient =
+                    o.frontWheelSuspensionKinematicsCoefficient;
+                form.frontWheelUnsprungMass = o.frontWheelUnsprungMass;
+                form.frontWheelTrackWidth = o.frontWheelTrackWidth;
+                form.rearWheelSuspensionType = o.rearWheelSuspensionType;
+                form.rearWheelSuspensionKinematicsCoefficient =
+                    o.rearWheelSuspensionKinematicsCoefficient;
+                form.rearWheelUnsprungMass = o.rearWheelUnsprungMass;
+                form.rearWheelTrackWidth = o.rearWheelTrackWidth;
+
+                form.windwardArea = o.windwardArea;
+                form.airDensity = o.airDensity;
+
+                form.engineCrankshaftMomentInertia =
+                    o.engineCrankshaftMomentInertia;
+                form.idleSpeed = o.idleSpeed;
+
+                form.relationCurveEngineTorqueSpeedAndThrottleOpening =
+                    o.relationCurveEngineTorqueSpeedAndThrottleOpening;
+
+                form.momentInertiaInputShaft = o.momentInertiaInputShaft;
+                form.momentInertiaOutputShaft = o.momentInertiaOutputShaft;
+
+                form.finalDriveRatio = o.finalDriveRatio;
+                form.transmissionEfficiency = o.transmissionEfficiency;
+
+                form.gearRatio = o.gearRatio;
+                form.inertia = o.inertia;
+                form.driving = o.driving;
+                form.coasting = o.coasting;
+
+                form.shiftTime = o.shiftTime;
+
+                form.shiftTimeUp12 = o.shiftTimeUp12;
+                form.shiftTimeDown12 = o.shiftTimeDown12;
+                form.shiftTimeUp23 = o.shiftTimeUp23;
+                form.shiftTimeDown23 = o.shiftTimeDown23;
+                form.shiftTimeUp34 = o.shiftTimeUp34;
+                form.shiftTimeDown34 = o.shiftTimeDown34;
+                form.shiftTimeUp45 = o.shiftTimeUp45;
+                form.shiftTimeDown45 = o.shiftTimeDown45;
+                form.shiftTimeUp56 = o.shiftTimeUp56;
+                form.shiftTimeDown56 = o.shiftTimeDown56;
+
+                form.brakeType = o.brakeType;
+                form.frontLeftWheelBrakingTorque =
+                    o.frontLeftWheelBrakingTorque;
+                form.rearLeftWheelBrakingTorque = o.rearLeftWheelBrakingTorque;
+                form.frontRightWheelBrakingTorque =
+                    o.frontRightWheelBrakingTorque;
+                form.rearRightWheelBrakingTorque =
+                    o.rearRightWheelBrakingTorque;
+
+                form.steeringType = o.steeringType;
+                form.steeringGearType = o.steeringGearType;
+                form.steeringGearRatio = o.steeringGearRatio;
+
+                form.relationCurveRightWheelAngleAndSteeringGearOutput =
+                    o.relationCurveRightWheelAngleAndSteeringGearOutput;
+                form.relationCurveLeftWheelAngleAndSteeringGearOutput =
+                    o.relationCurveLeftWheelAngleAndSteeringGearOutput;
+
+                this.$refs.carsim.form = form;
+
+                this.$refs.carsim.handleData();
+            }
+        },
         showInfo(id) {
             this.$axios({
                 method: "post",
@@ -560,25 +582,33 @@ export default {
                 },
             }).then((res) => {
                 if (res.code == 200 && res.info) {
+                    let info = res.info;
+
                     this.$refs.form.clearValidate();
-                    this.form = res.info;
-                    if (res.info.vehicleFrontView) {
+
+                    Object.assign(this.form, info);
+
+                    if (info.vehicleFrontView) {
                         // this.modelImgSrc = this.getImgUrl(
                         //     res.info.vehicleFrontView
                         // );
-                        this.carModel = this.getImgUrl(
-                            res.info.vehicleFrontView
-                        );
+                        this.carModel = this.getImgUrl(info.vehicleFrontView);
                     }
 
-                    // if (this.form.vehicleType[1]) {
-                    //     this.carModel = this.form.vehicleType[1];
-                    // }
-
                     this.curOne = {
-                        share: res.info.share,
-                        id: res.info.id,
+                        share: info.share,
+                        id: info.id,
                     };
+
+                    this.$nextTick(() => {
+                        if (info.parameterType === "1") {
+                            this.$refs.vtd.$refs.form.clearValidate();
+                        } else {
+                            this.$refs.carsim.$refs.form.clearValidate();
+                        }
+
+                        this.updateForm(info.parameterType, info);
+                    });
                 } else {
                     this.$message.error(res.message || "获取失败");
                 }
@@ -592,12 +622,30 @@ export default {
                         this.form.id = "";
                     }
 
+                    let canSave = false;
+
+                    if (this.form.parameterType === "1") {
+                        canSave = this.$refs.vtd.save();
+                    } else {
+                        canSave = this.$refs.carsim.save();
+                    }
+
+                    if (!canSave) return;
+
+                    let form = {};
+
+                    if (this.form.parameterType === "1") {
+                        form = this.$refs.vtd.form;
+                    } else {
+                        form = this.$refs.carsim.form;
+                    }
+
+                    let data = Object.assign({}, this.form, form);
+
                     this.$axios({
                         method: "post",
                         url: this.$api.modelLibrary.saveVehicle,
-                        data: {
-                            ...this.form,
-                        },
+                        data,
                     }).then((res) => {
                         if (res.code == 200 && res.info) {
                             this.form.id = res.info.id;
@@ -614,11 +662,17 @@ export default {
                             this.$message.error(res.message || "保存失败");
                         }
                     });
+                } else {
+                    console.log(6);
                 }
             });
         },
         addOne() {
             this.$refs.form.resetFields();
+
+            this.form.parameterType = "1";
+            this.$refs.vtd && this.$refs.vtd.$refs.form.resetFields();
+
             this.form.vehicleCode = "";
             this.form.vehicleFrontView = "";
             this.form.vehicleTopView = "";
@@ -701,10 +755,7 @@ export default {
                 this.$refs.cascader.getCheckedNodes(true)[0].data.vo
             );
 
-            console.log(this.form);
-            console.log(this.form.vehicleFrontView);
-
-            // this.carModel = this.form.vehicleType[1];
+            this.updateForm("1", this.form);
 
             // this.modelImgSrc = this.getImgUrl(this.form.vehicleFrontView);
             this.carModel = this.getImgUrl(this.form.vehicleFrontView);
@@ -722,12 +773,21 @@ export default {
                 }
             });
         },
+        attachmentChange(fileInfo) {
+            this.form.file = fileInfo;
+            // this.$refs.form.clearValidate("file");
+        },
     },
 
     async mounted() {
         await this.$dicsListsInit({
             vehicleTypeList: "vehicleType",
             wheelDriveList: "driveType",
+            parameterTypeList: "dynamicParameterType",
+            suspensionTypeList: "suspensionType",
+            brakeTypeList: "brakeType",
+            steeringTypeList: "steeringType",
+            steeringGearTypeList: "steeringGearType",
         });
 
         this.getModelLabelList();
@@ -752,7 +812,7 @@ export default {
     }
 
     .inputBox.flexBox {
-        margin-bottom: 22px;
+        // margin-bottom: 22px;
 
         .label {
             width: 138px;