liriming
2025-03-03 8bb7160c9c4fd7ce5893ee673647b13cc35410ae
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,24 +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" 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-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>
@@ -116,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() // 国际化
@@ -162,6 +169,7 @@
        return e;
      })
    }
  }
  defineExpose({ open }) // 提供 open 方法,用于打开弹窗
@@ -171,6 +179,9 @@
    ],
    className: [
      {required: true, message: '全类名不能为空', trigger: 'blur'}
    ],
    model: [
      {required: true, message: 'model不能为空', trigger: 'blur'}
    ]
  })
@@ -252,10 +263,29 @@
  // 运行
  const modelRun = async () => {
    modelRunResult.value = ''
// 校验表单
    showSaveModel.value = false
  // 校验表单
    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 {
@@ -276,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>