From 22bece93435158d575297f200454c4ef2841070f Mon Sep 17 00:00:00 2001
From: dengzedong <dengzedong@email>
Date: 星期四, 05 十二月 2024 10:40:05 +0800
Subject: [PATCH] 1.模型输入参数删除逻辑调整 2.调度模型信息关联模型库 3.关联项目不能为空

---
 src/views/model/mpk/file/MpkRun.vue |  210 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 127 insertions(+), 83 deletions(-)

diff --git a/src/views/model/mpk/file/MpkRun.vue b/src/views/model/mpk/file/MpkRun.vue
index 6b0111b..2b9039c 100644
--- a/src/views/model/mpk/file/MpkRun.vue
+++ b/src/views/model/mpk/file/MpkRun.vue
@@ -12,46 +12,50 @@
       <el-form-item style="width: 100%">
         <el-divider content-position="left">模型信息</el-divider>
       </el-form-item>
-      <el-form-item label="全类名" style="width: 90%" prop="className">
-        <el-input v-model="formData.className" placeholder=""/>
-      </el-form-item>
-      <el-form-item label="方法名" prop="methodName">
-        <el-select v-model="formData.methodName" @change="methodChange" style="width: 240px">
-          <el-option
-            v-for="item in methodList"
-            :key="item.id"
-            :label="item.methodName"
-            :value="item.methodName"
-          />
-        </el-select>
-      </el-form-item>
-      <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="/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-row>
+        <el-col :span="24">
+          <el-form-item label="全类名" style="width: 100%" prop="className">
+            <el-input v-model="formData.className" placeholder=""/>
+          </el-form-item>
         </el-col>
       </el-row>
-      <el-row v-for="(item,index) in formData.datas" :key="index" :gutter="20">
-        <el-col :span="20">
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="方法名" prop="methodName">
+            <el-select v-model="formData.methodName" @change="methodChange" style="width: 240px">
+              <el-option
+                v-for="item in methodList"
+                :key="item.id"
+                :label="item.methodName"
+                :value="item.methodName"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-divider content-position="left">模型参数信息</el-divider>
+      <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%">
-            <el-input v-model="formData.datas[index]" placeholder="" />
+            <el-input type="textarea" :disabled="true" :rows="3" v-model="datas[index]" placeholder="" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -63,18 +67,26 @@
         </el-col>
       </el-row>
       <el-divider content-position="left">模型设置信息</el-divider>
-      <el-row :gutter="20">
-        <el-col :span="4">
-          <el-button type="primary" size="small" @click="addRow()">新增</el-button>
-        </el-col>
-      </el-row>
+<!--      <el-row :gutter="20">-->
+<!--        <el-col :span="4">-->
+<!--          <el-button type="primary" size="small" @click="addRow()">新增</el-button>-->
+<!--        </el-col>-->
+<!--      </el-row>-->
       <el-table :data="formData.modelSettings" border>
         <el-table-column
           prop=""
           label="参数key"
           align="center">
           <template #default="scope">
-            <el-input size="small" v-model="scope.row.settingKey" maxlength="50" clearable />
+            <el-input size="small" v-model="scope.row.settingKey" :disabled="true" maxlength="50" clearable />
+          </template>
+        </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
@@ -82,19 +94,20 @@
           label="参数value"
           align="center">
           <template #default="scope">
-            <el-input size="small" v-model="scope.row.settingValue" maxlength="50" clearable />
+            <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"
-              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-input v-model="modelRunResult" placeholder="" rows="4" type="textarea" />
@@ -108,6 +121,7 @@
   import * as MpkApi from '@/api/model/mpk/mpk'
   import {FormRules} from "element-plus";
   import {getAccessToken, getTenantId} from "@/utils/auth";
+  const staticDir = ref(import.meta.env.VITE_STATIC_DIR)
 
   const { t } = useI18n() // 国际化
   const message = useMessage() // 消息弹窗
@@ -119,10 +133,12 @@
     pyName: '',
     className: '',
     methodName: '',
-    datas: [],
+    uuids: [],
     modelSettings: [],
     model: undefined
   })
+
+  const datas = ref([])
 
   // 模型方法下拉列表
   const methodList = ref([])
@@ -136,19 +152,19 @@
     const mpk = await MpkApi.getMpk(row.id)
     methodList.value = mpk.modelMethods
     formData.methodName = mpk.modelMethods[0].methodName
-    formData.datas = []
+    datas.value = []
+    formData.uuids = [];
     for (let i = 0 ; i < mpk.modelMethods[0].dataLength ; i++) {
-     formData.datas[i] = '[[]]'
+     datas.value[i] = '[[]]';
+     formData.uuids[i] = '';
     }
     hasModel.value = mpk.modelMethods[0].model === 1
 
     // 回显参数
     if (mpk.modelMethods[0].methodSettings && mpk.modelMethods[0].methodSettings.length > 0) {
       formData.modelSettings = mpk.modelMethods[0].methodSettings.map(e => {
-        return {
-          settingKey: e.settingKey,
-          settingValue: e.value
-        }
+        e.settingValue = e.value;
+        return e;
       })
     }
   }
@@ -160,6 +176,9 @@
     ],
     className: [
       {required: true, message: '全类名不能为空', trigger: 'blur'}
+    ],
+    model: [
+      {required: true, message: 'model不能为空', trigger: 'blur'}
     ]
   })
 
@@ -173,19 +192,19 @@
     formData.modelSettings.splice(index, 1)
   }
   const methodChange = function (value) {
-    formData.datas = []
+    datas.value = []
+    formData.uuids = [];
     var method = methodList.value.find(e => e.methodName === value);
     for (let i = 0 ; i < method?.dataLength ; i++) {
-      formData.datas[i] = '[[]]'
+      datas.value[i] = '[[]]';
+      formData.uuids[i] = '';
     }
     hasModel.value = method?.model === 1
     // 回显参数
     if (method.methodSettings && method.methodSettings.length > 0) {
       formData.modelSettings = method.methodSettings.map(e => {
-        return {
-          settingKey: e.settingKey,
-          settingValue: e.value
-        }
+        e.settingValue = e.value;
+        return e;
       })
     }else {
       formData.modelSettings = []
@@ -203,17 +222,24 @@
     formLoading.value = false
   }
   const submitFormSuccess = (response: any) => {
-    if (response.code !== 0) {
-      message.error(response.msg)
+    try {
+      if (response.code !== 0) {
+        message.error(response.msg)
+        return
+      }
+      const data = response.data;
+      if (datas.value.length > data.length) {
+        message.error("导入数据长度为" + data.length + ",应≥" + datas.value.length)
+        return
+      }
+      for (let i = 0; i < datas.value.length; i++) {
+        datas.value[i] = data[i].data
+        formData.uuids[i] = data[i].uuid;
+      }
+      message.success('导入成功')
+    } finally {
       formLoading.value = false
-      return
     }
-    const datas = response.data;
-    for (let i=0;i<formData.datas.length;i++) {
-      formData.datas[i] = datas[i]
-    }
-    message.success('导入成功')
-    formLoading.value = false
   }
   const beforeUpload = function (file) {
     // 提交请求
@@ -233,10 +259,29 @@
   const formRef = ref()
   // 运行
   const modelRun = async () => {
+    modelRunResult.value = ''
 // 校验表单
     if (!formRef) return
     const valid = await formRef.value.validate()
     if (!valid) return
+
+    if (hasModel.value) {
+      debugger
+      if (!formData.model || formData.model === '') {
+        message.error("model为必填项!")
+        return
+      }
+
+      try {
+        JSON.parse(formData.model)
+      } catch (e) {
+        message.error("model参数异常!")
+        return
+      }
+
+    }
+
+
     // 提交请求
     modelRunloading.value = true
     try {
@@ -245,20 +290,19 @@
       }
 
       //处理modelSettings
-      let settingsPredict = {};
-      data.modelSettings.forEach(e => {
-        settingsPredict[e.settingKey] = e.settingValue;
-      })
-      data.modelSettings = settingsPredict
+      // let settingsPredict = {};
+      // data.modelSettings.forEach(e => {
+      //   settingsPredict[e.settingKey] = e.settingValue;
+      // })
+      // data.modelSettings = settingsPredict
       data.hasModel = hasModel.value
       if (data.hasModel && data.model) {
-        data.model = {model_path:data.model}
+        data.model = JSON.parse(data.model)
       }else {
         data.model = undefined
       }
 
       modelRunResult.value = await MpkApi.modelRun(data)
-      modelRunloading.value = false
       message.success('运行成功')
     } finally {
       modelRunloading.value = false

--
Gitblit v1.9.3