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/pre/item/MmPredictItemForm.vue | 11 + src/views/model/mpk/project/ProjectForm.vue | 2 src/views/model/sche/scheme/ScheduleSchemeForm.vue | 3 src/views/model/mpk/file/MpkRun.vue | 70 ++++++----- src/views/model/sche/model/ScheduleModelForm.vue | 233 ++++++++++++++++++++++++++------------ src/api/model/mpk/mpk.ts | 4 6 files changed, 209 insertions(+), 114 deletions(-) diff --git a/src/api/model/mpk/mpk.ts b/src/api/model/mpk/mpk.ts index 653cf8b..dc2782f 100644 --- a/src/api/model/mpk/mpk.ts +++ b/src/api/model/mpk/mpk.ts @@ -42,8 +42,8 @@ return request.post({ url: '/model/mpk/api/test', data: params }) } -export const list = () => { - return request.get({ url: '/model/mpk/file/list'}) +export const list = (params) => { + return request.get({ url: '/model/mpk/file/list', params}) } export const publish = (params) => { diff --git a/src/views/model/mpk/file/MpkRun.vue b/src/views/model/mpk/file/MpkRun.vue index 104377d..2b9039c 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,23 +83,31 @@ </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-input v-model="modelRunResult" placeholder="" rows="4" type="textarea" /> diff --git a/src/views/model/mpk/project/ProjectForm.vue b/src/views/model/mpk/project/ProjectForm.vue index d6937f7..585271e 100644 --- a/src/views/model/mpk/project/ProjectForm.vue +++ b/src/views/model/mpk/project/ProjectForm.vue @@ -140,7 +140,7 @@ // 所有模型列表 const modelList = ref([]) const getModelList = async () => { - modelList.value = await MpkApi.list() + modelList.value = await MpkApi.list({}) } // 模型筛选 diff --git a/src/views/model/pre/item/MmPredictItemForm.vue b/src/views/model/pre/item/MmPredictItemForm.vue index c7d32b1..7f653e6 100644 --- a/src/views/model/pre/item/MmPredictItemForm.vue +++ b/src/views/model/pre/item/MmPredictItemForm.vue @@ -147,7 +147,7 @@ </el-row> <el-row v-if="dataForm.itemtypename === 'NormalItem'"> <el-col :span="12"> - <el-form-item label="关联项目"> + <el-form-item label="关联项目" prop="mmPredictModel.mpkprojectid"> <el-select v-model="dataForm.mmPredictModel.mpkprojectid" placeholder="请选择"> <el-option v-for="item in mpkProjectList" @@ -363,7 +363,7 @@ 添加 </el-button> <el-button - @click="deleteRow(scope.$index, dataForm.mmModelParamList)" + @click="deleteRow(scope.$index, scope.row, dataForm.mmModelParamList)" type="text" size="mini"> 删除 @@ -564,6 +564,7 @@ 'dmModuleItem.moduleid': [{required: true, message: '管网不能为空', trigger: 'blur'}], 'dmModuleItem.itemorder': [{required: true, message: '排序不能为空', trigger: 'blur'}], 'mmPredictItem.predictlength': [{required: true, message: '预测长度不能为空', trigger: 'blur'}], + 'mmPredictModel.mpkprojectid': [{required: true, message: '关联项目不能为空', trigger: 'blur'}], }) const formRef = ref() // 表单 Ref @@ -835,9 +836,9 @@ rows.splice(index, 0, row) } -function deleteRow(index: string, rows) { - if (!rows || rows.length === 1) { - message.error('不能全部删除!') +function deleteRow(index, row, rows) { + if (!rows || rows.length === 1 || rows.filter(e => e.modelparamportorder === row.modelparamportorder).length === 1) { + message.error('不可删除!') return } rows.splice(index, 1) diff --git a/src/views/model/sche/model/ScheduleModelForm.vue b/src/views/model/sche/model/ScheduleModelForm.vue index 84b1f3d..9bf611b 100644 --- a/src/views/model/sche/model/ScheduleModelForm.vue +++ b/src/views/model/sche/model/ScheduleModelForm.vue @@ -7,15 +7,11 @@ :rules="formRules" label-width="120px" > + <el-divider content-position="left">基本信息</el-divider> <el-row> <el-col :span="12"> <el-form-item label="模型编号" prop="modelCode"> <el-input v-model="formData.modelCode" placeholder="请输入模型编号" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="模型名称" prop="modelName"> - <el-input v-model="formData.modelName" placeholder="请输入模型名称" /> </el-form-item> </el-col> </el-row> @@ -45,36 +41,54 @@ </el-form-item> </el-col> </el-row> + <el-divider content-position="left">模型信息</el-divider> + <div style="width: 120px;text-align: right;margin-bottom: 8px"> + <el-popover placement="right" :width="300" trigger="click" ref="modelPopover" @before-enter4="model = undefined"> + <template #reference> + <span style="color: #409eff;cursor: pointer">关联模型信息</span> + </template> + <template #default> + <div style="display:flex;flex-direction: row;align-items: center;"> + <el-cascader style="width: 100%" v-model="model" placeholder="选择模型" :teleported="false" @change="changeModel" :options="scheduleModelList"/> + </div> + </template> + </el-popover> + </div> <el-row> - <el-col :span="24"> + <el-col :span="12"> + <el-form-item label="模型名称" prop="modelName"> + <el-input v-model="formData.modelName" placeholder="请输入模型名称" :disabled="true" /> + </el-form-item> + </el-col> + <el-col :span="12"> <el-form-item label="类名" prop="className"> - <el-input v-model="formData.className" placeholder="请输入类名 " /> + <el-input v-model="formData.className" placeholder="请输入类名" :disabled="true" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="方法名" prop="methodName"> - <el-input v-model="formData.methodName" placeholder="请输入方法名 " /> + <el-input v-model="formData.methodName" placeholder="请输入方法名" :disabled="true" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="参数数量" prop="portLength"> - <el-input-number v-model="formData.portLength" :min="0" controls-position="right" /> + <el-input-number v-model="formData.portLength" :min="0" controls-position="right" :disabled="true" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="参数构造" prop="paramStructure"> - <el-input v-model="formData.paramStructure" placeholder="请输入参数构造 " /> + <el-input v-model="formData.paramStructure" placeholder="请输入参数构造" :disabled="true" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item label="模型路径" prop="modelPath"> - <el-input v-model="formData.modelPath" placeholder="模型路径" /> + <el-input v-model="formData.modelPath" placeholder="模型路径" :disabled="true" /> </el-form-item> </el-col> </el-row> @@ -89,7 +103,7 @@ width="100" align="center"> <template #default="scope"> - <el-input size="mini" v-model="scope.row.modelparamportorder" maxlength="5" clearable + <el-input v-model="scope.row.modelparamportorder" maxlength="5" clearable :disabled="true" style="width:100%; hight:100%"/> </template> </el-table-column> @@ -99,7 +113,7 @@ width="100" align="center"> <template #default="scope"> - <el-input size="mini" v-model="scope.row.modelparamorder" maxlength="5" clearable + <el-input v-model="scope.row.modelparamorder" maxlength="5" clearable style="width:100%;hight:100%"/> </template> </el-table-column> @@ -109,7 +123,7 @@ width="150" align="center"> <template #default="scope"> - <el-select v-model="scope.row.modelparamtype" placeholder="请选择"> + <el-select v-model="scope.row.modelparamtype" placeholder="请选择" @change="changeModelparamtype(scope.row)"> <el-option v-for="dict in getStrDictOptions(DICT_TYPE.MODEL_PARAM_TYPE)" :key="dict.value" @@ -124,8 +138,25 @@ label="参数名称" align="center"> <template #default="scope"> - <el-select - size="mini" + <el-select v-if="scope.row.modelparamtype === 'NormalItem'" + v-model="scope.row.modelparamid" + placeholder="请选择" + filterable + style="width: 100%"> + <el-option-group + v-for="group in modelparamListMap['NormalItem']" + :key="group.value" + :label="group.label" + > + <el-option + v-for="item in group.children" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-option-group> + </el-select> + <el-select v-else v-model="scope.row.modelparamid" filterable placeholder="请选择"> @@ -162,7 +193,7 @@ </el-button> <el-button link - @click.prevent="deleteRow(scope.$index, formData.paramList)" + @click.prevent="deleteRow(scope.$index, scope.row, formData.paramList)" type="primary" size="small"> 删除 @@ -181,7 +212,7 @@ label="键" align="center"> <template #default="scope"> - <el-input size="mini" v-model="scope.row.key" maxlength="20" clearable + <el-input v-model="scope.row.key" maxlength="20" clearable :disabled="true" style="width:100%;hight:100%"/> </template> </el-table-column> @@ -190,7 +221,7 @@ label="名称" align="center"> <template #default="scope"> - <el-input size="mini" v-model="scope.row.name" maxlength="20" clearable + <el-input v-model="scope.row.name" maxlength="20" clearable :disabled="true" style="width:100%;hight:100%"/> </template> </el-table-column> @@ -199,7 +230,7 @@ label="类型" align="center"> <template #default="scope"> - <el-select v-model="scope.row.valuetype" placeholder="请选择"> + <el-select v-model="scope.row.valuetype" placeholder="请选择" :disabled="true"> <el-option v-for="dict in getStrDictOptions(DICT_TYPE.MODEL_METHOD_SETTING_VALUE_TYPE)" :key="dict.value" @@ -214,32 +245,32 @@ label="值" align="center"> <template #default="scope"> - <el-input size="mini" v-model="scope.row.value" maxlength="256" clearable + <el-input v-model="scope.row.value" maxlength="256" clearable :disabled="scope.row.key === 'pyFile'" style="width:100%;hight:100%"/> </template> </el-table-column> - <el-table-column - prop="" - label="操作" - width="100" - align="center"> - <template #default="scope"> - <el-button - @click.prevent="addRow(scope.$index, formData.settingList)" - link - type="primary" - size="small"> - 添加 - </el-button> - <el-button - @click.prevent="deleteRow(scope.$index, formData.settingList)" - link - type="primary" - size="small"> - 删除 - </el-button> - </template> - </el-table-column> +<!-- <el-table-column--> +<!-- prop=""--> +<!-- label="操作"--> +<!-- width="100"--> +<!-- align="center">--> +<!-- <template #default="scope">--> +<!-- <el-button--> +<!-- @click.prevent="addRow(scope.$index, formData.settingList)"--> +<!-- link--> +<!-- type="primary"--> +<!-- size="small">--> +<!-- 添加--> +<!-- </el-button>--> +<!-- <el-button--> +<!-- @click.prevent="deleteRow(scope.$index, formData.settingList)"--> +<!-- link--> +<!-- type="primary"--> +<!-- size="small">--> +<!-- 删除--> +<!-- </el-button>--> +<!-- </template>--> +<!-- </el-table-column>--> </el-table> </el-form> <template #footer> @@ -252,6 +283,7 @@ import { DICT_TYPE, getStrDictOptions } from '@/utils/dict' import * as ScheduleModelApi from '@/api/model/sche/model' import { CommonStatusEnum } from '@/utils/constants' + import * as MpkApi from "@/api/model/mpk/mpk"; defineOptions({ name: 'ScheduleModelForm' }) @@ -274,19 +306,8 @@ resultStrId: undefined, invocation: undefined, status: CommonStatusEnum.ENABLE, - paramList: [{ - modelparamportorder: '1', - modelparamorder: '1', - modelparamtype: '', - modelparamid: '', - datalength: '' - }], - settingList: [{ - key: '', - value: '', - valuetype: '', - name: '' - }] + paramList: [], + settingList: [] }) const formRules = reactive({ modelCode: [{ required: true, message: '模型编号不能为空', trigger: 'blur' }], @@ -295,6 +316,10 @@ }) const formRef = ref() // 表单 Ref const modelparamListMap = ref({}) + // 调度模型列表 + const scheduleModelList = ref([]) + const model = ref() + const modelPopover = ref() const addRow = function (index, rows) { let row = JSON.parse(JSON.stringify(rows[index])) @@ -302,9 +327,9 @@ this.orderRow(rows) } - const deleteRow = function (index, rows) { - if (!rows || rows.length === 1) { - message.error('不能全部删除!') + const deleteRow = function (index, row, rows) { + if (!rows || rows.length === 1 || rows.filter(e => e.modelparamportorder === row.modelparamportorder).length === 1) { + message.error('不可删除!') return } rows.splice(index, 1) @@ -341,6 +366,8 @@ } // 加载参数列表 modelparamListMap.value = await ScheduleModelApi.getModelParamList() + // 加载调度模型列表 + getScheduleModelList() } defineExpose({ open }) // 提供 open 方法,用于打开弹窗 @@ -385,20 +412,82 @@ resultStrId: undefined, invocation: undefined, status: CommonStatusEnum.ENABLE, - paramList: [{ - modelparamportorder: '1', - modelparamorder: '1', - modelparamtype: '', - modelparamid: '', - datalength: '' - }], - settingList: [{ - key: '', - value: '', - valuetype: '', - name: '' - }] + paramList: [], + settingList: [] } formRef.value?.resetFields() } + + const getScheduleModelList = async () => { + let list = await MpkApi.list({pyType: 'schedul'}) + if (list && list.length > 0) { + scheduleModelList.value = list.map(e => { + return { + label: e.pyChineseName, + value: e, + children: e.modelMethods.map(m => { + return { + label: m.methodName, + value: m + } + }) + } + }) + } + } + + // 选择调度模型 + const changeModel = async () => { + // 校验 + if (model.value && model.value.length > 0) { + const modelInfo = model.value[0] + const methodInfo = model.value[1] + formData.value.modelName = modelInfo.pyChineseName + formData.value.className = modelInfo.pkgName + '.impl.' + modelInfo.pyName + 'Impl'; + formData.value.methodName = methodInfo.methodName + formData.value.portLength = methodInfo.dataLength + // 参数构造 + let paramStructure = [] + for (let i = 0; i < methodInfo.dataLength; i++) { + paramStructure.push('[[D') + } + if (methodInfo.model === 1) { + paramStructure.push('java.util.HashMap') + } + paramStructure.push('java.util.HashMap') + formData.value.paramStructure = paramStructure.join(',') + formData.value.modelPath = modelInfo.pyModule + // 输入参数 + let paramList = [] + for (let i = 0; i < methodInfo.dataLength; i++) { + paramList.push({ + modelparamportorder: i+1 + '', + modelparamorder: '1', + modelparamtype: '', + modelparamid: '', + datalength: 0 + }) + } + + formData.value.paramList = paramList + // 设置参数 + let settingList = [] + methodInfo.methodSettings.forEach(e => { + settingList.push({ + key: e.settingKey, + value: e.value, + valuetype: e.valueType, + name: e.name + }) + }) + formData.value.settingList = settingList + modelPopover.value.hide() + }else { + message.error("请先选择模型") + } + } + + function changeModelparamtype(row) { + row.modelparamid = '' + } </script> diff --git a/src/views/model/sche/scheme/ScheduleSchemeForm.vue b/src/views/model/sche/scheme/ScheduleSchemeForm.vue index 1fcdc8c..9ee1e84 100644 --- a/src/views/model/sche/scheme/ScheduleSchemeForm.vue +++ b/src/views/model/sche/scheme/ScheduleSchemeForm.vue @@ -72,7 +72,7 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="关联项目"> + <el-form-item label="关联项目" prop="mpkprojectid"> <el-select v-model="formData.mpkprojectid" placeholder="请选择"> <el-option v-for="item in mpkProjectList" @@ -136,6 +136,7 @@ triggerCondition: [{required: true, message: '触发条件不能为空', trigger: 'blur'}], modelId: [{required: true, message: '调度模型不能为空', trigger: 'blur'}], triggerCondition: [{required: true, message: '触发条件不能为空', trigger: 'blur'}], + mpkprojectid: [{required: true, message: '关联项目不能为空', trigger: 'blur'}], }) const formRef = ref() // 表单 Ref const scheduleModelList = ref([] as ScheduleModelApi.ScheduleModelVO[]) -- Gitblit v1.9.3