tangjunhao před 4 dny
rodič
revize
c97a6d43a3

+ 41 - 4
src/views/home.vue

@@ -1490,7 +1490,27 @@
             <template #footer>
               <div class="dialog-footer">
                 <el-button @click="dialog.propnoisedialog = false">取消</el-button>
-                <el-button type="primary" @click=" dialog.propnoisedialog = false">
+                <el-button type="primary" @click="getpropnoisetosave();dialog.propnoisedialog = false">
+                  确定
+                </el-button>
+              </div>
+            </template>
+           </el-dialog>
+           <!-- AFNoise -->
+           <el-dialog v-model="dialog.afnoisedialog" align-center :modal="false" :close-on-click-modal="false"
+            :append-to-body="true" draggable :fullscreen="false" :modal-append-to-body="false" modal-class="summary-dlg"
+            :before-close="handleClose" width="630" class="dialog_class bgcolor tianjia sel colortext">
+            <template #header="{ titleId, titleClass }">
+              <div class="my-header ">
+                <!-- <el-image :src="getImgPath('xuek0.png')" fit="contain"></el-image> -->
+                <h4 :id="titleId" :class="titleClass">AFNoise</h4>
+              </div>
+            </template>
+            <AFNoise ref="AFNoiseref"/>
+            <template #footer>
+              <div class="dialog-footer">
+                <el-button @click="dialog.afnoisedialog = false">取消</el-button>
+                <el-button type="primary" @click="getafnoisetosave();dialog.afnoisedialog = false">
                   确定
                 </el-button>
               </div>
@@ -1855,6 +1875,7 @@ import cloudsecond from "./titlecomponent/Cloudsecond.vue";
 import FSI from './titlecomponent/FSI.vue'
 import Flight from './titlecomponent/Flight.vue'
 import PropNoise from './titlecomponent/PropNoise.vue'
+import AFNoise from './titlecomponent/AFNoise.vue'
 import MathFunc from './titlecomponent/MathFunc.vue'
 import ListSE from "./titlecomponent/ListSE.vue";
 import TACS from "./titlecomponent/TACS.vue";
@@ -1898,7 +1919,7 @@ let Toptimizeref=ref();
 let Fsiref=ref();
 let Flightref=ref();
 let PropNoiseref=ref();
-let AFnoiseref=ref();
+let AFNoiseref=ref();
 let MathFuncref=ref();
 let Tacsref=ref();
 let exportref = ref();
@@ -2661,8 +2682,8 @@ const optimizerfalse = (val) => {
     dialog.value.afnoisedialog = true;
     nextTick(() => {
       // 确保 ref 已经初始化
-      if (AFnoiseref.value) {
-        AFnoiseref.value.getafnoise(pid.value,wid);
+      if (AFNoiseref.value) {
+        AFNoiseref.value.getafnoise(pid.value,wid);
       }
     });
   }
@@ -2679,6 +2700,8 @@ const optimizerfalse = (val) => {
     dialog.value.MathFuncdialog = false;
     dialog.value.fsidialog = false;
     dialog.value.flightdialog = false;
+    dialog.value.propnoisedialog = false;
+    dialog.value.afnoisedialog = false;
   }
 
 }
@@ -4637,6 +4660,20 @@ const gettacstosave = () => {
   }
 }
 
+// propnoise保存
+const getpropnoisetosave = () => {
+  if (PropNoiseref.value) {
+    PropNoiseref.value.getpropnoisesave(pid.value);
+  }
+}
+
+//afnoise保存
+const getafnoisetosave = () => {
+  if (AFNoiseref.value) {
+    AFNoiseref.value.getafnoisesave(pid.value);
+  }
+}
+
 // 云图打开二级弹窗
 let seconddialogshow = ref(false)
 let activesd = ref ({

+ 554 - 0
src/views/titlecomponent/AFNoise.vue

@@ -0,0 +1,554 @@
+<template>
+  <div class="XFpdding" style="height: 470px;">
+    <ul>
+      <li class="item" v-for="(tab, index) in tabslist1" :key="index" :class="{ active: currentTab1 === index }"
+        @click="selectTab1(index)">
+        <img :src="tab.imgSrc" style="width: 22px;" />
+        {{ tab.name }}
+      </li>
+    </ul>
+    <div v-show="currentTab1 == '0'" class="eldesign classtable" style="margin-top: 10px">
+      <el-form :label-width="formLabelWidth1">
+        <el-form-item label="整机构型:">
+          <el-radio-group v-model="afnoise.selected_configs">
+            <el-radio label="T">常规构型</el-radio>
+            <el-radio label="F">干净构型</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="机翼类型:">
+          <el-radio-group v-model="afnoise.selected_wing">
+            <el-radio label="T">三角翼</el-radio>
+            <el-radio label="F">矩形翼</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="襟翼类型:">
+          <el-radio-group v-model="afnoise.selected_flaps">
+            <el-radio label="T">三缝襟翼</el-radio>
+            <el-radio label="F">单/双缝襟翼</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="计算部件:">
+          <el-row style="width: 90%;" justify="space-between">
+            <el-checkbox v-model="afnoise.wing" label="机翼" true-label="T" false-label="F" />
+            <el-checkbox v-model="afnoise.horizontal_tail" label="平尾" true-label="T" false-label="F" />
+            <el-checkbox v-model="afnoise.vertical_tail" label="垂尾" true-label="T" false-label="F" />
+            <el-checkbox v-model="afnoise.flap" label="襟翼" true-label="T" false-label="F" />
+          </el-row>
+          <el-row style="width: 90%;" justify="space-between">
+            <el-checkbox v-model="afnoise.main_landing_gear" label="主起落架" true-label="T" false-label="F" />
+            <el-checkbox v-model="afnoise.nose_landing_gear" label="前起落架" true-label="T" false-label="F" />
+            <el-checkbox v-model="afnoise.slat" label="缝翼" true-label="T" false-label="F" />
+          </el-row>
+        </el-form-item>
+      </el-form>
+      <el-table :data="gxcstable" border style="width: 100%; height: 220px"
+        :header-cell-class-name="headerCellClassName">
+        <el-table-column type="index" width="70" label="编号" />
+        <el-table-column prop="name" label="参数名称">
+          <!-- <template #default="{ row }">
+              <el-input v-model="row.name" @change="handleEdit(row)" />
+            </template> -->
+        </el-table-column>
+        <el-table-column prop="value" label="参数值">
+          <template #default="{ row }">
+            <el-input v-model="row.value" type="number" />
+          </template>
+        </el-table-column>
+        <el-table-column prop="flag" label="启用" width="100">
+          <template v-slot="scope">
+            <el-checkbox :false-label="0" :true-label="1" v-model="scope.row.flag" />
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <div v-show="currentTab1 == '1'" class="eldesign classtable" style="margin-top: 10px">
+      <el-collapse v-model="activeNames">
+        <el-collapse-item title="环境参数" name="1">
+          <template #title>
+            <span class="collapse-title">环境参数</span>
+          </template>
+          <el-form-item label="声速(m/s):" :label-width="formLabelWidth2">
+            <el-input v-model="afnoise.a"></el-input>
+          </el-form-item>
+          <el-form-item label="密度(kg/m³):" :label-width="formLabelWidth2">
+            <el-input v-model="afnoise.density"></el-input>
+          </el-form-item>
+          <el-form-item label="动力黏度(pa·s):" :label-width="formLabelWidth2">
+            <el-input v-model="afnoise.dynamic_viscosity"></el-input>
+          </el-form-item>
+          <el-form-item label="马赫数:" :label-width="formLabelWidth2">
+            <el-input v-model="afnoise.ma"></el-input>
+          </el-form-item>
+        </el-collapse-item>
+        <el-collapse-item title="计算方法" name="2">
+          <template #title>
+            <span class="collapse-title">计算方法</span>
+          </template>
+          <el-form>
+            <el-form-item label="选择计算方法:" :label-width="formLabelWidth2">
+              <el-radio-group v-model="afnoise.selected">
+                <el-radio label="T">Fink</el-radio>
+                <el-radio label="F">ESDU</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-form>
+        </el-collapse-item>
+        <el-collapse-item title="频率范围" name="3">
+          <template #title>
+            <span class="collapse-title">频率范围</span>
+          </template>
+          <el-form>
+            <el-form-item label="起始频率(Hz):" :label-width="formLabelWidth2">
+              <el-input v-model="afnoise.starting_fre"></el-input>
+            </el-form-item>
+            <el-form-item label="截止频率(Hz):" :label-width="formLabelWidth2">
+              <el-input v-model="afnoise.cutoff_fre"></el-input>
+            </el-form-item>
+          </el-form>
+        </el-collapse-item>
+      </el-collapse>
+    </div>
+
+    <div v-show="currentTab1 == '2'" class="eldesign classtable" style="margin-top: 10px">
+      <el-form-item label="麦克风数量:" :label-width="formLabelWidth1">
+        <el-input v-model="afnoise.num" @change="handleMicCountChange"></el-input>
+      </el-form-item>
+      <el-table :data="gcdbztable" border style="width: 100%; height: 400px"
+        :header-cell-class-name="headerCellClassName1">
+        <el-table-column type="index" width="70" label="编号" />
+        <el-table-column prop="distances" label="各麦克风距离(m)">
+          <template #default="{ row }">
+            <el-input v-model="row.distances" type="number" />
+          </template>
+        </el-table-column>
+        <el-table-column prop="polar_emission_angle" label="极角(deg)">
+          <template #default="{ row }">
+            <el-input v-model="row.polar_emission_angle" type="number" />
+          </template>
+        </el-table-column>
+        <el-table-column prop="azimuthal_angle" label="方位角(deg)">
+          <template #default="{ row }">
+            <el-input v-model="row.azimuthal_angle" type="number" />
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <div v-show="currentTab1 == '3'" class="eldesign classtable" style="margin-top: 10px">
+      <el-table :data="fxcstable" border style="width: 100%; height: 400px"
+        :header-cell-class-name="headerCellClassName">
+        <el-table-column type="index" width="70" label="编号" />
+        <el-table-column prop="name" label="参数名称">
+          <!-- <template #default="{ row }">
+              <el-input v-model="row.name" @change="handleEdit(row)" />
+            </template> -->
+        </el-table-column>
+        <el-table-column prop="value" label="参数值">
+          <template #default="{ row }">
+            <el-input v-model="row.value" />
+          </template>
+        </el-table-column>
+        <el-table-column prop="flag" label="启用" width="100">
+          <template v-slot="scope">
+            <el-checkbox :false-label="0" :true-label="1" v-model="scope.row.flag" />
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+  </div>
+</template>
+
+<script  setup>
+import { ref, onMounted, reactive, provide, nextTick } from "vue"
+import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
+import { request, uploadFile } from "@/utils/request"
+import emitter from "@/utils/emitter"
+
+import propnoise1 from "@/assets/img/propnoise1.png";
+import propnoise2 from "@/assets/img/propnoise2.png";
+import propnoise3 from "@/assets/img/propnoise3.png";
+import propnoise4 from "@/assets/img/propnoise4.png";
+
+let tabslist1 = ref([
+  { id: "0", name: "构型参数", imgSrc: propnoise1 },
+  { id: "1", name: "工况设置", imgSrc: propnoise2 },
+  { id: "2", name: "观测点布置", imgSrc: propnoise3 },
+  { id: "3", name: "分析参数", imgSrc: propnoise4 },
+])
+
+const selectTab1 = (index) => {
+  // console.log('dayin',index)
+  currentTab1.value = index
+  // console.log('currentTab1',currentTab1.value)
+}
+
+let currentTab1 = ref(0)
+let formLabelWidth1 = ref(120)
+let formLabelWidth2 = ref(160)
+
+let activeNames = ref(['1', '2', '3'])
+
+let pid = ref()
+let wid = ref()
+let afnoiseid = ref()
+
+let afnoise = ref({
+  selected_configs: 'T',
+  selected_wing: 'T',
+  selected_flaps: 'T',
+  wing: 'T',
+  horizontal_tail: 'F',
+  vertical_tail: 'F',
+  flap: 'F',
+  main_landing_gear: 'F',
+  nose_landing_gear: 'F',
+  slat: 'F',
+  a: '340.3',
+  density: '1.225',
+  dynamic_viscosity: '0.000017894',
+  ma: '0.235',
+  selected: 'T',
+  starting_fre: '50',
+  cutoff_fre: '4000',
+  num: 8,
+})
+
+let gxcstable = ref([
+  {
+    value: '321.1',
+    code: 'wing_area',
+    name: "机翼面积(m²)",
+    flag: 1
+  },
+  {
+    value: '47.4',
+    code: 'wing_span',
+    name: "机翼展长(m)",
+    flag: 1
+  },
+])
+
+const headerCellClassName = ({ column }) => {
+  // console.log('列:',column.property)
+  if (column.property === 'name') {
+    console.log('yanse',column.property)
+    return 'header-blue';
+  } else if (column.property === 'value') {
+    return 'header-green';
+  } else if (column.property === 'flag') {
+    return 'header-yellow';
+  }
+  return '';
+};
+
+// 监听wing等参数变化,T时gxcstable增加机相关参数,F时删除
+const partsConfig = {
+  wing: [
+    { value: '321.1', code: 'wing_area', name: "机翼面积(m²)", flag: 1 },
+    { value: '47.4',  code: 'wing_span', name: "机翼展长(m)", flag: 1 }
+  ],
+  horizontal_tail: [
+    { value: '119.1', code: 'horizontal_tail_area', name: "平尾面积(m²)", flag: 1 },
+    { value: '21.8',  code: 'horizontal_tail_span', name: "平尾展长(m)", flag: 1 }
+  ],
+  vertical_tail: [
+    { value: '51.1', code: 'vertical_tail_area', name: "垂尾面积(m²)", flag: 1 },
+    { value: '9',  code: 'vertical_tail_span', name: "垂尾展长(m)", flag: 1 }
+  ],
+  flap: [
+    { value: '49.8', code: 'flap_area', name: "襟翼面积(m²)", flag: 1 },
+    { value: '24.9',  code: 'flap_span', name: "襟翼展长(m)", flag: 1 },
+    { value: '42',  code: 'flap_deflection_angle', name: "襟翼偏转角(°)", flag: 1 }
+  ],
+  main_landing_gear: [
+    { value: 2, code: 'number_of_main_landing_gears', name: "主起落架个数", flag: 1 },
+    { value: 4,  code: 'number_of_wheels_per_main_landing_gear', name: "每个主起落架轮数", flag: 1 },
+    { value: '1.3',  code: 'main_landing_gear_wheel_diameter', name: "主起落架轮径(m)", flag: 1 },
+    { value: '3.03',  code: 'main_landing_gear_strut_length', name: "主起落架支柱长度(m)", flag: 1 }
+  ],
+  nose_landing_gear: [
+    { value: 1, code: 'number_of_nose_landing_gears', name: "前起落架个数", flag: 1 },
+    { value: 2,  code: 'number_of_wheels_per_nose_landing_gear', name: "每个前起落架轮数", flag: 1 },
+    { value: '0.9',  code: 'nose_landing_gear_wheel_diameter', name: "前起落架轮径(m)", flag: 1 },
+    { value: '2.03',  code: 'nose_landing_gear_strut_length', name: "前起落架支柱长度(m)", flag: 1 }
+  ],
+};
+
+// 通用逻辑
+function updateTable(newVal, params) {
+  if (newVal === 'T') {
+    gxcstable.value.push(...params);
+  } else {
+    const codes = params.map(p => p.code);
+    gxcstable.value = gxcstable.value.filter(item => !codes.includes(item.code));
+  }
+}
+
+// 循环生成 watcher
+Object.keys(partsConfig).forEach(key => {
+  watch(() => afnoise.value[key], (newVal) => updateTable(newVal, partsConfig[key]));
+});
+
+let gcdbztable = ref([
+  {
+    distances: '200',
+    polar_emission_angle: '50',
+    azimuthal_angle: '0',
+  },
+  {
+    distances: '200',
+    polar_emission_angle: '60',
+    azimuthal_angle: '0',
+  },
+  {
+    distances: '200',
+    polar_emission_angle: '70',
+    azimuthal_angle: '0',
+  },
+  {
+    distances: '200',
+    polar_emission_angle: '80',
+    azimuthal_angle: '0',
+  },
+  {
+    distances: '200',
+    polar_emission_angle: '90',
+    azimuthal_angle: '0',
+  },
+  {
+    distances: '200',
+    polar_emission_angle: '100',
+    azimuthal_angle: '0',
+  },
+  {
+    distances: '200',
+    polar_emission_angle: '110',
+    azimuthal_angle: '0',
+  },
+  {
+    distances: '200',
+    polar_emission_angle: '120',
+    azimuthal_angle: '0',
+  },
+])
+
+// 监听麦克风数量变化,动态增减表格行数
+const handleMicCountChange = () => {
+  const count = parseInt(afnoise.value.num);
+  const currentCount = gcdbztable.value.length;
+
+  if (count > currentCount) {
+    for (let i = currentCount; i < count; i++) {
+      gcdbztable.value.push({
+        distances: '200',
+        polar_emission_angle: '0',
+        azimuthal_angle: '0',
+      });
+    }
+  } else if (count < currentCount) {
+    gcdbztable.value.splice(count);
+  }
+};
+
+const headerCellClassName1 = ({ column }) => {
+  if (column.property === 'distances') {
+    return 'header-blue';
+  } else if (column.property === 'polar_emission_angle') {
+    return 'header-green';
+  } else if (column.property === 'azimuthal_angle') {
+    return 'header-yellow';
+  }
+  return '';
+};
+
+
+let fxcstable = ref([
+  {
+    value: '0.2;0.3;0.45;0.6;0.747',
+    code: 'frequency',
+    name: "频率(Hz)",
+    flag: 1
+  },
+  {
+    value: '0.2;0.3;0.45;0.6;0.747',
+    code: 'componentspl',
+    name: "观测点声压级(dB)",
+    flag: 1
+  },
+  {
+    value: '0.2;0.3;0.45;0.6;0.747',
+    code: 'oaspl',
+    name: "观测点总声压级(dB)",
+    flag: 1
+  },
+])
+
+const getafnoise = (id,nowid) => {
+  pid.value = id;
+  if(nowid){
+    wid.value = nowid;
+  }
+  const params = {
+    transCode: "MDO2001",
+    pid: pid.value,
+    wid: wid.value
+  };
+  request(params).then((res) => {
+    if (res.hasOwnProperty("afnoiseid")) {
+      getafnoiseAssign(res);
+    }
+  })
+  .catch((err) => {
+      console.log('AFNoise初始化失败err:',err)
+      ElMessage.error('AFNoise初始化失败')
+    })
+}
+
+const getafnoiseAssign = (data) => {
+  pid.value = data.pid;
+  afnoiseid.value = data.afnoiseid;
+  afnoise.value.selected_configs = data.selected_configs;
+  afnoise.value.selected_wing = data.selected_wing;
+  afnoise.value.selected_flaps = data.selected_flaps;
+  afnoise.value.wing = data.wing;
+  afnoise.value.horizontal_tail = data.horizontal_tail;
+  afnoise.value.vertical_tail = data.vertical_tail;
+  afnoise.value.flap = data.flap;
+  afnoise.value.main_landing_gear = data.main_landing_gear;
+  afnoise.value.nose_landing_gear = data.nose_landing_gear;
+  afnoise.value.slat = data.slat;
+  afnoise.value.a = data.a;
+  afnoise.value.density = data.density;
+  afnoise.value.dynamic_viscosity = data.dynamic_viscosity;
+  afnoise.value.ma = data.ma;
+  afnoise.value.selected = data.selected;
+  afnoise.value.starting_fre = data.starting_fre;
+  afnoise.value.cutoff_fre = data.cutoff_fre;
+  afnoise.value.num = data.num;
+
+  getgxcstableAssign(data);
+
+  applyValueStringToParams(gcdbztable.value, data.mic_distances, data.mic_polar_angles, data.mic_azimuthal_angles);
+
+  // fxcstable赋值 code对应的值返回
+  fxcstable.value.find(item => item.code === 'frequency').value = data.frequency;
+  fxcstable.value.find(item => item.code === 'componentspl').value = data.components;
+  fxcstable.value.find(item => item.code === 'oaspl').value = data.oaspl;
+}
+
+// gxcstable赋值 wing等参数有返回值时调用
+const getgxcstableAssign = (data) => {
+  gxcstable.value = [];
+
+  // 遍历所有构件配置
+  Object.keys(partsConfig).forEach(key => {
+    if (data[key] === 'T') {
+      // 深拷贝对应的默认配置
+      const params = partsConfig[key].map(item => {
+        const newItem = { ...item };
+        // 如果data中存在对应code的属性,覆盖默认value
+        if (data[newItem.code] !== undefined && data[newItem.code] !== null) {
+          newItem.value = data[newItem.code];
+        }
+        return newItem;
+      });
+      gxcstable.value.push(...params);
+    }
+  });
+};
+
+// 赋值gcdbztable时调用
+const applyValueStringToParams = (params, valueStr1 , valueStr2, valueStr3) => {
+  const values1 = valueStr1.split(';').map(Number);
+  const values2 = valueStr2.split(';').map(Number);
+  const values3 = valueStr3.split(';').map(Number);
+
+  params.length = 0; //清空现有数据
+
+  //判断最长的数组长度
+  const maxLength = Math.max(values1.length, values2.length, values3.length);
+
+  for (let i = 0; i < maxLength; i++) {
+    params.push({
+      distances: values1[i] !== undefined ? values1[i] : null,
+      polar_emission_angle: values2[i] !== undefined ? values2[i] : null,
+      azimuthal_angle: values3[i] !== undefined ? values3[i] : null,
+    });
+  }
+}
+
+// 保存
+const getafnoisesave = (id,nowid) => {
+  if(nowid){
+    wid.value = nowid
+  }
+  pid.value = id;
+  const params = {
+    transCode: "MDO2002",
+    pid: pid.value,
+    wid: wid.value,
+    selected_configs: afnoise.value.selected_configs,
+    selected_wing: afnoise.value.selected_wing,
+    selected_flaps: afnoise.value.selected_flaps,
+    wing: afnoise.value.wing,
+    horizontal_tail: afnoise.value.horizontal_tail,
+    vertical_tail: afnoise.value.vertical_tail,
+    flap: afnoise.value.flap,
+    main_landing_gear: afnoise.value.main_landing_gear,
+    nose_landing_gear: afnoise.value.nose_landing_gear,
+    slat: afnoise.value.slat,
+    a: afnoise.value.a,
+    density: afnoise.value.density,
+    dynamic_viscosity: afnoise.value.dynamic_viscosity,
+    ma: afnoise.value.ma,
+    selected: afnoise.value.selected,
+    starting_fre: afnoise.value.starting_fre,
+    cutoff_fre: afnoise.value.cutoff_fre,
+    num: afnoise.value.num,
+    mic_distances: gcdbztable.value.map(item => item.distances).join(';'),
+    mic_polar_angles: gcdbztable.value.map(item => item.polar_emission_angle).join(';'),
+    mic_azimuthal_angles: gcdbztable.value.map(item => item.azimuthal_angle).join(';'),
+    frequency: fxcstable.value.find(item => item.code === 'frequency').value,
+    components: fxcstable.value.find(item => item.code === 'componentspl').value,
+    oaspl: fxcstable.value.find(item => item.code === 'oaspl').value,
+  };
+
+  //把 gxcstable 中的参数加入 params
+  gxcstable.value.forEach(item => {
+    params[item.code] = item.value;
+  });
+
+  request(params).then((res) => {
+      ElMessage.success('AFNoise保存成功')
+  })
+  .catch((err) => {
+      console.log('AFNoise保存失败err:',err)
+      ElMessage.error('AFNoise保存失败')
+    })
+}
+
+defineExpose({
+  getafnoise,
+  getafnoisesave
+});
+
+</script>
+
+<style scoped>
+
+:deep(.collapse-title) {
+  flex: 1 0 90%;
+  order: 1;
+  text-align: left;
+}
+
+:deep(.collapse-title) .el-collapse-item__header {
+  flex: 1 0 auto;
+  order: -1;
+}
+
+
+
+</style>

+ 133 - 14
src/views/titlecomponent/PropNoise.vue

@@ -201,8 +201,8 @@
 import { ref, onMounted, reactive, provide, nextTick } from "vue"
 import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
 import { request, uploadFile } from "@/utils/request"
+import emitter from "@/utils/emitter"
 
-import configParams from "@/assets/img/configParams.png";
 import propnoise1 from "@/assets/img/propnoise1.png";
 import propnoise2 from "@/assets/img/propnoise2.png";
 import propnoise3 from "@/assets/img/propnoise3.png";
@@ -222,21 +222,22 @@ let wid = ref()
 let propnoiseid = ref()
 
 let propnoise = ref({
-  r: 1.015,
-  hub: 0.203,
-  blade: 2,
-  three_quarter_twist: 21,
-  dim: 9,
+  r: '1.015',
+  hub: '0.203',
+  blade: '2',
+  three_quarter_twist: '21',
+  dim: '9',
   airfoil: '',
   airfoil_polars: '',
-  a: 340.3,
-  t: 288.16889478,
-  density: 1.225,
-  dynamic_viscosity: 1.7894e-5,
-  omega: 2390,
-  velocity: 77.2,
-  theta: 90,
-  l: 4,
+  a: '340.3',
+  t: '288.16889478',
+  density: '1.225',
+  dynamic_viscosity: '0.000017894',
+  omega: '2390',
+  velocity: '77.2',
+  theta: '90',
+  l: '4',
+  spl: ''
 })
 
 let tabslist1 = ref([
@@ -355,6 +356,124 @@ const headerCellClassName1 = ({ column }) => {
   return '';
 };
 
+const getpropnoise = (id, nowid) => {
+  pid.value = id;
+  if(nowid) {
+    wid.value = nowid;
+  }
+  const params = {
+    transCode: "MDO2004",
+    pid: pid.value,
+    wid: wid.value
+  };
+  request(params).then((res) => {
+    if (res.hasOwnProperty("propnId")) {
+      getPropNAssign(res);
+      emitter.emit('propnIdFromPropN', propnoiseid);
+    }
+  })
+  .catch((err) => {
+      console.log('PropNoise初始化失败err:',err)
+      ElMessage.error('PropNoise初始化失败')
+    })
+}
+
+const getPropNAssign = (data) => {
+  // console.log('getPropNAssign-data:', data);
+  pid.value = data.pid;
+  propnoiseid.value = data.propnId;
+  propnoise.value.r = data.r;
+  propnoise.value.hub = data.hub;
+  propnoise.value.blade = data.blade;
+  propnoise.value.three_quarter_twist = data.three_quarter_twist;
+  propnoise.value.dim = data.dim;
+  propnoise.value.airfoil = data.airfoil;
+  propnoise.value.airfoil_polars = data.airfoil_polars;
+  propnoise.value.a = data.a;
+  propnoise.value.t = data.t;
+  propnoise.value.density = data.density;
+  propnoise.value.dynamic_viscosity = data.dynamic_viscosity;
+  propnoise.value.omega = data.omega;
+  propnoise.value.velocity = data.velocity;
+  propnoise.value.theta = data.theta;
+  propnoise.value.l = data.l;
+  //fxcstable第一组数据的value为spl
+  fxcstable.value[0].value = data.spl;
+  applyValueStringToParams(gxcsTable.value, data.r_r , data.t_c, data.b_r, data.beta);
+}
+
+const applyValueStringToParams = (params, valueStr1 , valueStr2, valueStr3, valueStr4) => {
+  const values1 = valueStr1.split(';').map(Number);
+  const values2 = valueStr2.split(';').map(Number);
+  const values3 = valueStr3.split(';').map(Number);
+  const values4 = valueStr4.split(';').map(Number);
+
+  params.length = 0; //清空现有数据
+
+  //判断最长的数组长度
+  const maxLength = Math.max(values1.length, values2.length, values3.length, values4.length);
+
+  for (let i = 0; i < maxLength; i++) {
+    params.push({
+      r_r: values1[i] !== undefined ? values1[i] : null,
+      t_c: values2[i] !== undefined ? values2[i] : null,
+      b_r: values3[i] !== undefined ? values3[i] : null,
+      beta: values4[i] !== undefined ? values4[i] : null,
+    });
+  }
+}
+
+
+const getpropnoisesave = (id, nowid) => {
+  if(nowid) {
+    wid.value = nowid;
+  }
+  pid.value = id;
+  // 拼接gxcsTable数据为字符串
+  const r_r_str = gxcsTable.value.map(item => item.r_r).join(';');
+  const t_c_str = gxcsTable.value.map(item => item.t_c).join(';');
+  const b_r_str = gxcsTable.value.map(item => item.b_r).join(';');
+  const beta_str = gxcsTable.value.map(item => item.beta).join(';');
+
+  const params = {
+    transCode: "MDO2005",
+    pid: pid.value,
+    wid: wid.value,
+    propnId: propnoiseid.value,
+    r: propnoise.value.r,
+    hub: propnoise.value.hub,
+    blade: propnoise.value.blade,
+    three_quarter_twist: propnoise.value.three_quarter_twist,
+    dim: propnoise.value.dim,
+    airfoil: propnoise.value.airfoil,
+    airfoil_polars: propnoise.value.airfoil_polars,
+    a: propnoise.value.a,
+    t: propnoise.value.t,
+    density: propnoise.value.density,
+    dynamic_viscosity: propnoise.value.dynamic_viscosity,
+    omega: propnoise.value.omega,
+    velocity: propnoise.value.velocity,
+    theta: propnoise.value.theta,
+    l: propnoise.value.l,
+    spl: fxcstable.value[0].value,
+    r_r: r_r_str,
+    t_c: t_c_str,
+    b_r: b_r_str,
+    beta: beta_str,
+  };
+  request(params).then((res) => {
+      ElMessage.success('PropNoise保存成功')
+    })
+    .catch((err) => {
+      ElMessage.error('PropNoise保存失败')
+    })
+}
+
+defineExpose({
+  getpropnoise,
+  getpropnoisesave
+});
+
 </script>
 
 <style scoped>

+ 8 - 0
src/views/vuetree/index.vue

@@ -700,6 +700,7 @@ const xfid = ref('')
 const adid = ref('')
 const mfcid = ref('')
 const tacsid = ref('')
+const propnid = ref('')
 const ffdid = ref('')
 const cstid = ref('')
 // 监听组件xfoil返回的xfid
@@ -722,6 +723,11 @@ const handleTacsid = (tacsidFromB) => {
   noid.value.data.tacsid = tacsid.value;
 };
 
+const handlePropnId = (propnidFromB) => {
+  propnid.value = propnidFromB.value;
+  noid.value.data.propnid = propnid.value;
+}
+
 const handleFfdid = (ffdidFromB) => {
   // console.log('ffdidFromB:',ffdidFromB.value);
   ffdid.value = ffdidFromB.value;
@@ -1425,6 +1431,7 @@ onMounted(() => {
   emitter.on("adidFromadflow", handleAdid);
   emitter.on("mfcidFromMathFunc", handleMfcid);
   emitter.on("tacsidFromTACS", handleTacsid);
+  emitter.on("propnIdFromPropN", handlePropnId);
   emitter.on("ffdidFromFfd", handleFfdid);
   emitter.on("cstidFromCst", handleCstid);
   emitter.on("getMfcid",handlegetMfcid);
@@ -1459,6 +1466,7 @@ onUnmounted(() => {
   emitter.off("adidFromadflow", handleAdid);
   emitter.off("mfcidFromMathFunc", handleMfcid);
   emitter.off("tacsidFromTACS", handleTacsid);
+  emitter.off("propnIdFromPropN", handlePropnId);
   emitter.off("ffdidFromFfd", handleFfdid);
   emitter.off("cstidFromCst", handleCstid);
   emitter.off("getMfcid",handlegetMfcid);