From 8d139bf079918171f140a53004ad4221937e3ad0 Mon Sep 17 00:00:00 2001
From: 潘志宝 <979469083@qq.com>
Date: 星期五, 21 三月 2025 14:48:18 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/model/mpk/file/MpkRun.vue |  131 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 96 insertions(+), 35 deletions(-)

diff --git a/src/views/model/mpk/file/MpkRun.vue b/src/views/model/mpk/file/MpkRun.vue
index 104377d..908d883 100644
--- a/src/views/model/mpk/file/MpkRun.vue
+++ b/src/views/model/mpk/file/MpkRun.vue
@@ -34,28 +34,24 @@
         </el-col>
       </el-row>
       <el-divider content-position="left">模型参数信息</el-divider>
-      <el-row :gutter="20">
-        <el-col :span="2" style="margin-bottom: 10px;margin-left: 20px">
-          <el-button tag="a" :href="staticDir + '/template/模型参数导入模板.xlsx'" download="模型参数导入模板.xlsx" style="text-decoration: none;" type="primary" size="small" link>模板下载</el-button>
-        </el-col>
-        <el-col :span="2" style="margin-bottom: 10px;">
-          <el-upload
-            ref="uploadRef"
-            v-model:file-list="fileList"
-            :show-file-list="false"
-            :action="importUrl"
-            :auto-upload="true"
-            :disabled="formLoading"
-            :before-upload="beforeUpload"
-            :headers="uploadHeaders"
-            :on-error="submitFormError"
-            :on-success="submitFormSuccess"
-            accept=".xlsx"
-          >
-            <el-button type="primary" size="small" link>参数导入</el-button>
-          </el-upload>
-        </el-col>
-      </el-row>
+      <div style="display:flex;flex-direction: row;align-items: center;margin-bottom: 6px">
+        <el-button tag="a" :href="staticDir + '/template/模型参数导入模板.xlsx'" download="模型参数导入模板.xlsx" style="text-decoration: none;" type="primary" size="small" link>模板下载</el-button>
+        <el-upload
+          ref="uploadRef"
+          v-model:file-list="fileList"
+          :show-file-list="false"
+          :action="importUrl"
+          :auto-upload="true"
+          :disabled="formLoading"
+          :before-upload="beforeUpload"
+          :headers="uploadHeaders"
+          :on-error="submitFormError"
+          :on-success="submitFormSuccess"
+          accept=".xlsx"
+        >
+          <el-button type="primary" size="small" link>参数导入</el-button>
+        </el-upload>
+      </div>
       <el-row v-for="(item,index) in datas" :key="index" :gutter="20">
         <el-col :span="24">
           <el-form-item :label="'参数_' + (index)" required style="width: 100%">
@@ -87,25 +83,34 @@
         </el-table-column>
         <el-table-column
           prop=""
+          label="参数名称"
+          align="center">
+          <template #default="scope">
+            <el-input size="small" v-model="scope.row.name" :disabled="true" maxlength="50" clearable />
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop=""
           label="参数value"
           align="center">
           <template #default="scope">
             <el-input size="small" v-model="scope.row.settingValue" :disabled="scope.row.settingKey === 'pyFile'" maxlength="50" clearable />
           </template>
         </el-table-column>
-        <el-table-column label="操作" fixed="right" header-align="center" align="center" width="100">
-          <template #default="scope">
-            <el-button
-              @click="deleteRow(scope.$index)"
-              key="danger"
-              type="danger"
-              :disabled="scope.row.settingKey === 'pyFile'"
-              link
-            >删除</el-button>
-          </template>
-        </el-table-column>
+<!--        <el-table-column label="操作" fixed="right" header-align="center" align="center" width="100">-->
+<!--          <template #default="scope">-->
+<!--            <el-button-->
+<!--              @click="deleteRow(scope.$index)"-->
+<!--              key="danger"-->
+<!--              type="danger"-->
+<!--              :disabled="scope.row.settingKey === 'pyFile'"-->
+<!--              link-->
+<!--            >删除</el-button>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
       </el-table>
       <el-divider content-position="left">模型运行结果</el-divider>
+      <el-button type="primary" size="small" link @click="saveModel" v-if="showSaveModel && formData.methodName === 'train'">下载模型(.miail)</el-button>
       <el-input v-model="modelRunResult" placeholder="" rows="4" type="textarea" />
       <div style="display: flex;flex-direction: row;justify-content: end;margin-top: 16px">
         <el-button :loading="modelRunloading" type="primary" @click="modelRun()">运行</el-button>
@@ -117,6 +122,7 @@
   import * as MpkApi from '@/api/model/mpk/mpk'
   import {FormRules} from "element-plus";
   import {getAccessToken, getTenantId} from "@/utils/auth";
+  import download from "@/utils/download";
   const staticDir = ref(import.meta.env.VITE_STATIC_DIR)
 
   const { t } = useI18n() // 国际化
@@ -163,6 +169,7 @@
         return e;
       })
     }
+
   }
   defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 
@@ -256,7 +263,8 @@
   // 运行
   const modelRun = async () => {
     modelRunResult.value = ''
-// 校验表单
+    showSaveModel.value = false
+  // 校验表单
     if (!formRef) return
     const valid = await formRef.value.validate()
     if (!valid) return
@@ -298,10 +306,63 @@
         data.model = undefined
       }
 
-      modelRunResult.value = await MpkApi.modelRun(data)
+      let result = await MpkApi.modelRun(data)
+
+      modelRunResult.value = result;
       message.success('运行成功')
+      // 训练方法
+      if (formData.methodName === 'train') {
+        result = JSON.parse(result);
+        // 返回结果正确
+        if (result?.status_code === '100' && result?.models?.model_path) {
+          // 有预测方法
+          if (methodList.value.some(e => e.methodName === 'predict')) {
+            saveModelParams.modelResult = result
+            saveModelParams.model = result?.models
+            showSaveModel.value = true
+          }
+        }
+      }
     } finally {
       modelRunloading.value = false
     }
   }
+
+  const showSaveModel = ref(false)
+
+  const saveModelParams = reactive({
+    pyName: '',
+    className: '',
+    methodName: '',
+    uuids: [],
+    modelSettings: [],
+    predModelSettings: [],
+    hasModel: false,
+    model: undefined,
+    modelResult: undefined,
+    dataLength: undefined,
+    resultKey: undefined,
+  })
+
+  const saveModel = async () => {
+    saveModelParams.className = formData.className
+    saveModelParams.pyName = formData.pyName
+    saveModelParams.modelSettings = formData.modelSettings
+    const predMethod = methodList.value.find(e => e.methodName === 'predict');
+    saveModelParams.methodName = predMethod.methodName
+    saveModelParams.resultKey = predMethod.resultKey
+    //predModelSettings
+    if (predMethod.methodSettings && predMethod.methodSettings.length > 0) {
+      saveModelParams.predModelSettings = predMethod.methodSettings.map(e => {
+        e.settingValue = e.value;
+        return e;
+      })
+    }
+    saveModelParams.hasModel = predMethod.model === 1
+
+    saveModelParams.dataLength = predMethod.dataLength
+
+    const data = await MpkApi.saveModel(saveModelParams)
+    download.downloadFile(data, saveModelParams.pyName + '.miail')
+  }
 </script>

--
Gitblit v1.9.3