From f84c0f2de793be5dac3bda0e952afe14c625f596 Mon Sep 17 00:00:00 2001 From: dongyukun <1208714201@qq.com> Date: 星期四, 26 六月 2025 16:35:28 +0800 Subject: [PATCH] ai模型绑定 --- src/views/model/sche/model/ScheduleModelForm.vue | 194 +++++++++++++++++++++++++++++++++++++----------- 1 files changed, 148 insertions(+), 46 deletions(-) diff --git a/src/views/model/sche/model/ScheduleModelForm.vue b/src/views/model/sche/model/ScheduleModelForm.vue index fe9722d..dd68526 100644 --- a/src/views/model/sche/model/ScheduleModelForm.vue +++ b/src/views/model/sche/model/ScheduleModelForm.vue @@ -11,7 +11,7 @@ <el-row> <el-col :span="12"> <el-form-item label="模型编号" prop="modelCode"> - <el-input v-model="formData.modelCode" placeholder="请输入模型编号" /> + <el-input v-model="formData.modelCode" placeholder="请输入模型编号"/> </el-form-item> </el-col> </el-row> @@ -43,13 +43,17 @@ </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-enter="model = undefined"> + <el-popover placement="right" :width="300" trigger="click" ref="modelPopover" + @before-enter="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"/> + <el-cascader style="width: 100%" v-model="model" placeholder="选择模型" + :teleported="false" @change="changeModel" :options="scheduleModelList" v-if="formData.invocation != '4'"/> + <el-cascader style="width: 100%" v-model="model" placeholder="选择模型" + :teleported="false" @change="changeAiModel" :options="aiModelList" v-if="formData.invocation === '4'"/> </div> </template> </el-popover> @@ -62,33 +66,34 @@ </el-col> <el-col :span="12"> <el-form-item label="类名" prop="className"> - <el-input v-model="formData.className" placeholder="请输入类名" :disabled="true" /> + <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="请输入方法名" :disabled="true" /> + <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" :disabled="true" /> + <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="请输入参数构造" :disabled="true" /> + <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="模型路径" :disabled="true" /> + <el-input v-model="formData.modelPath" placeholder="模型路径" :disabled="true"/> </el-form-item> </el-col> </el-row> @@ -123,7 +128,8 @@ width="150" align="center"> <template #default="scope"> - <el-select v-model="scope.row.modelparamtype" placeholder="请选择" @change="changeModelparamtype(scope.row)"> + <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" @@ -139,22 +145,22 @@ align="center"> <template #default="scope"> <el-select-v2 v-if="scope.row.modelparamtype === 'NormalItem'" - v-model="scope.row.modelparamid" - :options="modelparamListMap['NormalItem'] || []" - placeholder="请选择" - :props="{value:'value',label:'label',options:'children'}" - clearable - filterable - :fit-input-width="false" + v-model="scope.row.modelparamid" + :options="modelparamListMap['NormalItem'] || []" + placeholder="请选择" + :props="{value:'value',label:'label',options:'children'}" + clearable + filterable + :fit-input-width="false" /> <el-select-v2 v-else - v-model="scope.row.modelparamid" - :options="modelparamListMap[scope.row.modelparamtype] || []" - placeholder="请选择" - :props="{value:'id',label:'name'}" - clearable - filterable - :fit-input-width="false" + v-model="scope.row.modelparamid" + :options="modelparamListMap[scope.row.modelparamtype] || []" + placeholder="请选择" + :props="{value:'id',label:'name'}" + clearable + filterable + :fit-input-width="false" /> </template> </el-table-column> @@ -164,7 +170,8 @@ width="160" align="center"> <template #default="scope"> - <el-input-number v-model="scope.row.datalength" :min="0" clearable controls-position="right" + <el-input-number v-model="scope.row.datalength" :min="0" clearable + controls-position="right" style="width:100%;hight:100%"/> </template> </el-table-column> @@ -248,7 +255,7 @@ <el-divider content-position="left">模型下发配置</el-divider> <el-row :gutter="20"> <el-col :span="4"> - <el-button type="primary" size="small" @click="addRowOut()" >新增</el-button> + <el-button type="primary" size="small" @click="addRowOut()">新增</el-button> </el-col> </el-row> <el-table @@ -274,12 +281,14 @@ </el-table-column> <el-table-column prop="resultPort" label="角标1" align="center" width="100"> <template #default="scope"> - <el-input-number :min="0" clearable controls-position="right" size="small" v-model="scope.row.resultPort" style="width:100%;height:100%"/> + <el-input-number :min="0" clearable controls-position="right" size="small" + v-model="scope.row.resultPort" style="width:100%;height:100%"/> </template> </el-table-column> <el-table-column prop="resultIndex" label="角标2" align="center" width="100"> <template #default="scope"> - <el-input-number :min="0" clearable controls-position="right" size="small" v-model="scope.row.resultIndex" style="width:100%;height:100%"/> + <el-input-number :min="0" clearable controls-position="right" size="small" + v-model="scope.row.resultIndex" style="width:100%;height:100%"/> </template> </el-table-column> <el-table-column prop="isWrite" label="是否下发" align="center" width="100"> @@ -304,7 +313,7 @@ /> </template> </el-table-column> - <el-table-column prop="disturbancePointNo’" label="无扰切换点位" align="center" min-width="200"> + <el-table-column prop="disturbancePointNo" label="无扰切换点位" align="center" min-width="200"> <template #default="scope"> <el-select-v2 v-model="scope.row.disturbancePointNo" @@ -337,17 +346,17 @@ </Dialog> </template> <script lang="ts" setup> - import { DICT_TYPE, getStrDictOptions } from '@/utils/dict' + import {DICT_TYPE, getStrDictOptions} from '@/utils/dict' import * as ScheduleModelApi from '@/api/model/sche/model' - import { CommonStatusEnum } from '@/utils/constants' + import {CommonStatusEnum} from '@/utils/constants' import * as MpkApi from "@/api/model/mpk/mpk"; import {generateUUID} from "@/utils"; - import { ElMessage,ElMessageBox } from 'element-plus' - import { Refresh } from '@element-plus/icons-vue' + import {ElMessage, ElMessageBox} from 'element-plus' + import {Refresh} from '@element-plus/icons-vue' - defineOptions({ name: 'ScheduleModelForm' }) + defineOptions({name: 'ScheduleModelForm'}) - const { t } = useI18n() // 国际化 + const {t} = useI18n() // 国际化 const message = useMessage() // 消息弹窗 const dialogVisible = ref(false) // 弹窗的是否展示 const dialogTitle = ref('') // 弹窗的标题 @@ -377,14 +386,16 @@ modelOut: [] }) const formRules = reactive({ - modelCode: [{ required: true, message: '模型编号不能为空', trigger: 'blur' }], - modelName: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }], - modelType: [{ required: true, message: '模型类型不能为空', trigger: 'blur' }] + modelCode: [{required: true, message: '模型编号不能为空', trigger: 'blur'}], + modelName: [{required: true, message: '模型名称不能为空', trigger: 'blur'}], + modelType: [{required: true, message: '模型类型不能为空', trigger: 'blur'}] }) const formRef = ref() // 表单 Ref const modelparamListMap = ref({}) // 调度模型列表 const scheduleModelList = ref([]) + const aiModelList = ref([]) + const aiModel = ref([]) const model = ref() const modelPopover = ref() @@ -435,8 +446,10 @@ modelparamListMap.value = await ScheduleModelApi.getModelParamList(id) // 加载调度模型列表 getScheduleModelList() + // 加载ai模型列表 + getAiModelList() } - defineExpose({ open }) // 提供 open 方法,用于打开弹窗 + defineExpose({open}) // 提供 open 方法,用于打开弹窗 /** 提交表单 */ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 @@ -525,6 +538,24 @@ } } + const getAiModelList = async () => { + aiModel.value = await MpkApi.aiList(null) + if (aiModel.value && aiModel.value.length > 0) { + aiModelList.value = aiModel.value.map(e => { + return { + value: e.id, + label: e.name, + children: e.children.map(template => { + return { + value: template.id, + label: template.questionName + } + }) + } + }) + } + }; + // 选择调度模型 const changeModel = async () => { // 校验 @@ -532,16 +563,86 @@ ElMessageBox.confirm( '是否更新输入参数?', '提示', - {confirmButtonText: '是', cancelButtonText: '否', type: 'success',icon: markRaw(Refresh),closeOnClickModal:false,closeOnPressEscape:false} + { + confirmButtonText: '是', + cancelButtonText: '否', + type: 'success', + icon: markRaw(Refresh), + closeOnClickModal: false, + closeOnPressEscape: false + } ).then(() => { relevanceModel(true) }).catch(() => { relevanceModel(false) }) - }else { + } else { message.error("请先选择模型") } } + + // 选择ai模型 + const changeAiModel = () => { + if (!model.value && model.value.length > 0) return + // 查找选中的模型组 + const modelGroup = aiModel.value.find( + group => group.id === model.value[0] + ) + // 查找选中的模板 + const template = modelGroup?.children.find( + t => t.id === model.value[1] + ) + if (!modelGroup || !template) return + // 弹窗确认 + ElMessageBox.confirm( + '是否更新输入参数?', + '提示', + { + confirmButtonText: '是', + cancelButtonText: '否', + type: 'success', + icon: markRaw(Refresh), + closeOnClickModal: false, + closeOnPressEscape: false + } + ).then(() => { + // 更新表单数据 + updateAiModelForm(modelGroup, template, true) + }).catch(() => { + updateAiModelForm(modelGroup, template, false) + }) + } + + // 更新AI模型表单数据 + const updateAiModelForm = (modelGroup, template, updateParams) => { + // 设置基本信息 + formData.value.modelName = modelGroup.name + formData.value.methodName = template.questionName + formData.value.portLength = template.dataLength + + // 设置参数列表转换 + formData.value.settingList = template.settingList.map(setting => { + return { + key: setting.settingKey, + name: setting.settingName, + value: setting.settingValue, + valuetype: 'string' + } + }) + // 输入参数 + let paramList = [] + for (let i = 0; i < formData.value.portLength; i++) { + paramList.push({ + modelparamportorder: i + 1 + '', + modelparamorder: '1', + modelparamtype: '', + modelparamid: '', + datalength: 0 + }) + } + formData.value.paramList = paramList + } + function relevanceModel(refreshParam) { const modelInfo = model.value[0] @@ -566,7 +667,7 @@ let paramList = [] for (let i = 0; i < methodInfo.dataLength; i++) { paramList.push({ - modelparamportorder: i+1 + '', + modelparamportorder: i + 1 + '', modelparamorder: '1', modelparamtype: '', modelparamid: '', @@ -592,8 +693,9 @@ function changeModelparamtype(row) { row.modelparamid = '' } - const addRowOut= function () { - if(formData.value.modelOut===undefined) { + + const addRowOut = function () { + if (formData.value.modelOut === undefined) { formData.value.modelOut = [] } formData.value.modelOut.push({ @@ -603,9 +705,9 @@ port: 0, index: 0, isWrite: 1, - pointNo:undefined, - sort:undefined, - disturbancePointNo:undefined, + pointNo: undefined, + sort: undefined, + disturbancePointNo: undefined, }) } const deleteModelOutRow = function (index) { -- Gitblit v1.9.3