潘志宝
2025-02-05 3e5f6c444a32a66a6111aacd3a4c5212c32bdf9e
提交 | 用户 | 时间
7462da 1 <template>
32396c 2   <Dialog v-model="dialogVisible" :title="dialogTitle" width="60%">
7462da 3     <el-form
L 4       ref="formRef"
5       v-loading="formLoading"
cd9f11 6       :model="dataForm"
7462da 7       :rules="formRules"
be4298 8       label-width="100px"
7462da 9     >
cd9f11 10       <el-divider content-position="left">基本信息</el-divider>
7462da 11       <el-row>
L 12         <el-col :span="12">
d3ee81 13           <el-form-item label="预测项名" prop="mmPredictItem.itemname">
14             <el-input v-model="dataForm.mmPredictItem.itemname" placeholder="预测项名"
15                       maxlength="50"/>
7462da 16           </el-form-item>
L 17         </el-col>
e1ff2d 18         <el-col :span="12">
d3ee81 19           <el-form-item label="编号" prop="mmPredictItem.itemno">
61c379 20             <el-input v-model="dataForm.mmPredictItem.itemno" placeholder="编号" maxlength="50"
21                       readonly/>
7462da 22           </el-form-item>
L 23         </el-col>
24       </el-row>
25       <el-row>
26         <el-col :span="12">
d3ee81 27           <el-form-item label="类型" prop="mmPredictItem.itemtypeid">
2caade 28             <el-select
L 29               v-model="dataForm.mmPredictItem.itemtypeid" @change="changeItemtype"
30               placeholder="请选择">
cd9f11 31               <el-option
L 32                 v-for="item in itemTypeList"
33                 :key="item.id"
34                 :label="item.itemtypename"
35                 :value="item.id"/>
36             </el-select>
7462da 37           </el-form-item>
L 38         </el-col>
39         <el-col :span="12">
e1ff2d 40           <el-form-item label="粒度" prop="mmPredictItem.granularity">
d3ee81 41             <el-select v-model="dataForm.mmPredictItem.granularity" placeholder="请选择">
42               <el-option
4c7918 43                 v-for="dict in getIntDictOptions(DICT_TYPE.PRED_GRANULARITY)"
d3ee81 44                 :key="dict.value"
45                 :label="dict.label"
46                 :value="dict.value"
47               />
48             </el-select>
7462da 49           </el-form-item>
L 50         </el-col>
51       </el-row>
52       <el-row>
53         <el-col :span="12">
e1ff2d 54           <el-form-item label="是否检查" prop="mmPredictItem.workchecked">
cd9f11 55             <el-select v-model="dataForm.mmPredictItem.workchecked" placeholder="请选择">
L 56               <el-option
d3ee81 57                 v-for="dict in getIntDictOptions(DICT_TYPE.COM_IS_INT)"
58                 :key="dict.value"
59                 :label="dict.label"
60                 :value="dict.value"
61               />
cd9f11 62             </el-select>
7462da 63           </el-form-item>
L 64         </el-col>
65         <el-col :span="12">
e1ff2d 66           <el-form-item label="是否启用" prop="mmPredictItem.status">
d3ee81 67             <el-select v-model="dataForm.mmPredictItem.status" placeholder="请选择">
cd9f11 68               <el-option
d3ee81 69                 v-for="dict in getIntDictOptions(DICT_TYPE.COM_IS_INT)"
70                 :key="dict.value"
71                 :label="dict.label"
72                 :value="dict.value"
73               />
cd9f11 74             </el-select>
7462da 75           </el-form-item>
L 76         </el-col>
77       </el-row>
78       <el-row>
79         <el-col :span="12">
e1ff2d 80           <el-form-item label="管网" prop="dmModuleItem.moduleid">
f5e3a1 81             <el-select v-model="dataForm.dmModuleItem.moduleid" placeholder="请选择" @change="clearExpressionList">
cd9f11 82               <el-option
L 83                 v-for="item in moduleList"
84                 :key="item.id"
85                 :label="item.modulename"
86                 :value="item.id"/>
87             </el-select>
7462da 88           </el-form-item>
L 89         </el-col>
90         <el-col :span="12">
2caade 91           <el-form-item label="类别">
83f63a 92             <el-input v-model="dataForm.dmModuleItem.categoryid" placeholder="类别" maxlength="64"/>
7462da 93           </el-form-item>
L 94         </el-col>
95       </el-row>
96       <el-row>
97         <el-col :span="12">
e1ff2d 98           <el-form-item label="排序" prop="dmModuleItem.itemorder">
d3ee81 99             <el-input-number v-model="dataForm.dmModuleItem.itemorder" :min="1" clearable
100                              controls-position="right"/>
7462da 101           </el-form-item>
L 102         </el-col>
103       </el-row>
cd9f11 104       <el-row v-if="dataForm.itemtypename === 'MergeItem'">
7462da 105         <el-col :span="12">
fcd59a 106           <el-form-item label="预测长度" prop="mmPredictItem.predictlength">
2caade 107             <el-input
L 108               v-model="dataForm.mmPredictItem.predictlength" placeholder="预测长度"
109               maxlength="5"/>
7462da 110           </el-form-item>
L 111         </el-col>
36885d 112         <el-col :span="12">
D 113           <el-form-item label="真实数据点">
114             <el-select
115               v-model="dataForm.pointId"
116               filterable
117               clearable
118               placeholder="请选择">
119               <el-option
120                 v-for="item in pointList"
121                 :key="item.id"
122                 :label="item.pointName"
123                 :value="item.id"/>
124             </el-select>
125           </el-form-item>
126         </el-col>
7462da 127       </el-row>
cd9f11 128       <el-divider content-position="left" v-if="dataForm.itemtypename === 'NormalItem'">模型信息
L 129       </el-divider>
d3ee81 130       <el-row :gutter="8" v-if="dataForm.itemtypename === 'NormalItem'">
131         <el-col :span="12">
2caade 132           <el-form-item label="模型名称">
L 133             <el-input
134               v-model="dataForm.mmPredictModel.modelname" placeholder="模型名称"
135               maxlength="50"/>
cd9f11 136           </el-form-item>
L 137         </el-col>
7462da 138         <el-col :span="12">
d3ee81 139           <el-upload
140             class="upload-demo"
141             :limit="1"
142             :file-list="fileList"
143             :before-upload="beforeUpload"
144             :on-success="uploadModelSuccess"
145             :on-error="uploadModelError"
146             :action="uploadUrl"
4c7918 147             :show-file-list="false"
d3ee81 148             :http-request="httpRequest">
149             <el-button type="primary" @click="setReplaceModelOnly(false)">
150               <Icon icon="ep:upload"/>
151               上传模型
152             </el-button>
de0f62 153             <el-button type="primary" plain @click="setReplaceModelOnly(true)">
d3ee81 154               <Icon icon="ep:upload"/>
155               更新模型
156             </el-button>
157           </el-upload>
7462da 158         </el-col>
L 159       </el-row>
be4298 160       <el-row v-if="dataForm.itemtypename === 'NormalItem'">
d8e4be 161         <el-col :span="12">
22bece 162           <el-form-item label="关联项目" prop="mmPredictModel.mpkprojectid">
be4298 163             <el-select v-model="dataForm.mmPredictModel.mpkprojectid" placeholder="请选择">
D 164               <el-option
165                 v-for="item in mpkProjectList"
166                 :key="item.id"
167                 :label="item.projectName"
168                 :value="item.id"/>
169             </el-select>
170           </el-form-item>
171         </el-col>
d8e4be 172         <el-col :span="12">
e1ff2d 173           <el-form-item label="编号">
d3ee81 174             <el-input
e1ff2d 175               v-model="dataForm.mmPredictModel.modelno" placeholder="编号" maxlength="30" readonly
d3ee81 176               disabled/>
177           </el-form-item>
178         </el-col>
cd9f11 179       </el-row>
d3ee81 180       <el-row :gutter="8" v-if="dataForm.itemtypename === 'NormalItem'">
cd9f11 181         <el-col :span="24">
2caade 182           <el-form-item label="路径">
L 183             <el-input
184               v-model="dataForm.mmPredictModel.modelpath" placeholder="路径" maxlength="32"
185               disabled/>
cd9f11 186           </el-form-item>
L 187         </el-col>
188       </el-row>
d3ee81 189       <el-row :gutter="8" v-if="dataForm.itemtypename === 'NormalItem'">
cd9f11 190         <el-col :span="24">
2caade 191           <el-form-item label="类名">
L 192             <el-input
193               v-model="dataForm.mmPredictModel.classname" placeholder="类名" maxlength="32"
194               disabled/>
cd9f11 195           </el-form-item>
L 196         </el-col>
197       </el-row>
d3ee81 198       <el-row :gutter="8" v-if="dataForm.itemtypename === 'NormalItem'">
cd9f11 199         <el-col :span="12">
2caade 200           <el-form-item label="方法名">
L 201             <el-input
202               v-model="dataForm.mmPredictModel.methodname" placeholder="方法名"
203               maxlength="32" disabled/>
cd9f11 204           </el-form-item>
L 205         </el-col>
206         <el-col :span="12">
2caade 207           <el-form-item label="参数">
L 208             <el-input
209               v-model="dataForm.mmPredictModel.modelparamstructure" placeholder="参数"
210               maxlength="32" disabled/>
cd9f11 211           </el-form-item>
L 212         </el-col>
213       </el-row>
d8e4be 214       <el-divider content-position="left" v-if="dataForm.itemtypename === 'NormalItem'">模型输出
D 215       </el-divider>
216       <el-button
5c475d 217         v-if="dataForm.itemtypename === 'NormalItem'"
fcd59a 218         @click="addItemOutput()"
d8e4be 219         type="primary"
D 220         size="small">
221         添加
222       </el-button>
223       <el-table
224         v-if="dataForm.itemtypename === 'NormalItem'"
225         :data="dataForm.mmItemOutputList"
226         border
227         style="width: 100%; margin-top: 5px;">
61c379 228         <el-table-column prop="outputorder" label="排序" align="center" width="80px"/>
32396c 229         <el-table-column label="结果KEY" align="center" width="150px">
d8e4be 230           <template #default="scope">
D 231             <el-input v-model="scope.row.resultstr" placeholder="请输入"/>
232           </template>
233         </el-table-column>
32396c 234         <el-table-column label="结果类型" align="center" width="150px">
d8e4be 235           <template #default="scope">
D 236             <el-select
237               v-model="scope.row.resultType"
238               @change="(value) => resultTypeChange(value,scope.row)"
239               filterable
240               placeholder="请选择">
241               <el-option
242                 v-for="dict in getIntDictOptions(DICT_TYPE.MODEL_RESULT_TYPE)"
243                 :key="dict.value"
244                 :label="dict.label"
245                 :value="dict.value"/>
246             </el-select>
247           </template>
248         </el-table-column>
32396c 249         <el-table-column label="索引" align="center" width="100px">
d8e4be 250           <template #default="scope">
61c379 251             <el-input-number style="width:100%;hight:100%" :disabled="scope.row.resultType !== 2"
252                              v-model="scope.row.resultIndex" :min="0" step-strictly
253                              controls-position="right"/>
32396c 254           </template>
255         </el-table-column>
256         <el-table-column label="结果名称" align="center" width="150px">
257           <template #default="scope">
258             <el-input v-model="scope.row.resultName" placeholder="请输入"/>
d8e4be 259           </template>
D 260         </el-table-column>
261         <el-table-column label="数据点" align="center">
262           <template #default="scope">
263             <el-select
264               v-model="scope.row.pointid"
265               filterable
d7baa4 266               clearable
d8e4be 267               @change="(value) => changeOutputPoint(value,scope.row)"
D 268               placeholder="请选择">
269               <el-option
270                 v-for="item in pointList"
271                 :key="item.id"
272                 :label="item.pointName"
273                 :value="item.id"/>
274             </el-select>
275           </template>
276         </el-table-column>
277         <el-table-column prop="" label="操作" width="80" align="center">
278           <template #default="scope">
279             <el-button
280               @click="deleteItemOutput(scope.$index, dataForm.mmItemOutputList)"
281               type="text"
282               size="small">
283               删除
284             </el-button>
285           </template>
286         </el-table-column>
287       </el-table>
288       <el-divider content-position="left" v-if="dataForm.itemtypename === 'NormalItem'">模型设置参数
289       </el-divider>
cd9f11 290       <el-table
L 291         v-if="dataForm.itemtypename === 'NormalItem'"
292         :data="dataForm.mmModelArithSettingsList"
293         border
294         style="width: 100%; margin-top: 5px;">
7b1ce6 295         <el-table-column prop="key" label="键" align="center" min-width="150"/>
296         <el-table-column prop="name" label="名称" align="center" min-width="150"/>
297         <el-table-column prop="valuetype" label="类型" align="center" min-width="150"/>
32396c 298         <el-table-column prop="" label="值" align="center" min-width="200">
cd9f11 299           <template #default="scope">
932c3a 300             <el-input v-model="scope.row.value" maxlength="1000"
5c475d 301                       :disabled="scope.row.key === 'pyFile'"
d3ee81 302                       style="width:100%;height:100%"/>
cd9f11 303           </template>
L 304         </el-table-column>
305       </el-table>
d8e4be 306       <el-divider content-position="left" v-if="dataForm.itemtypename === 'NormalItem'">模型输入参数
cd9f11 307       </el-divider>
L 308       <el-table
2caade 309         v-if="dataForm.itemtypename === 'NormalItem'"
cd9f11 310         :data="dataForm.mmModelParamList"
L 311         border
312         style="width: 100%; margin-top: 5px;">
313         <el-table-column prop="modelparamportorder" label="端口" width="60" align="center"/>
314         <el-table-column prop="modelparamorder" label="序号" width="60" align="center"/>
315         <el-table-column prop="" label="类型" width="200" align="center">
316           <template #default="scope">
61c379 317             <el-select v-model="scope.row.modelparamtype"
318                        @change="changeModelparamtype(scope.row)"
319                        placeholder="请选择">
cd9f11 320               <el-option
d3ee81 321                 v-for="dict in getStrDictOptions(DICT_TYPE.MODEL_PARAM_TYPE)"
322                 :key="dict.value"
323                 :label="dict.label"
324                 :value="dict.value"
325               />
cd9f11 326             </el-select>
L 327           </template>
328         </el-table-column>
329         <el-table-column prop="" label="参数名称" align="center">
330           <template #default="scope">
5c475d 331             <el-select v-if="scope.row.modelparamtype === 'NormalItem'"
D 332               v-model="scope.row.modelparamid"
333               placeholder="请选择"
334               filterable
335               @change="changeModelparam(scope.row)"
336               style="width: 100%">
337               <el-option-group
338                 v-for="group in modelparamListMap['NormalItem']"
339                 :key="group.value"
340                 :label="group.label"
341               >
342                 <el-option
343                   v-for="item in group.children"
344                   :key="item.value"
345                   :label="item.label"
346                   :value="item.value"
347                 />
348               </el-option-group>
349             </el-select>
350             <el-select v-else
cd9f11 351               v-model="scope.row.modelparamid"
L 352               filterable
353               @change="changeModelparam(scope.row)"
354               placeholder="请选择">
355               <el-option
356                 v-for="(item, index) in modelparamListMap[scope.row.modelparamtype]"
357                 :key="index"
358                 :label="item.name"
359                 :value="item.id"/>
360             </el-select>
361           </template>
362         </el-table-column>
363         <el-table-column prop="" label="参数长度" width="120" align="center">
364           <template #default="scope">
e1ff2d 365             <el-input-number v-model="scope.row.datalength" :min="0" clearable
366                              controls-position="right"
367                              style="width:100%;hight:100%"/>
cd9f11 368           </template>
L 369         </el-table-column>
7b1ce6 370         <el-table-column prop="" label="操作" width="120" align="center">
cd9f11 371           <template #default="scope">
L 372             <el-button
373               @click="addRow(scope.$index, dataForm.mmModelParamList)"
932c3a 374               type="text">
cd9f11 375               添加
L 376             </el-button>
377             <el-button
22bece 378               @click="deleteRow(scope.$index, scope.row, dataForm.mmModelParamList)"
932c3a 379               type="text">
cd9f11 380               删除
L 381             </el-button>
382           </template>
383         </el-table-column>
384       </el-table>
385       <el-divider content-position="left" v-if="dataForm.itemtypename === 'MergeItem'">表达式
386       </el-divider>
387       <el-table
2caade 388         v-if="dataForm.itemtypename === 'MergeItem'"
cd9f11 389         :data="expressionList"
L 390         border
391         style="width: 100%; margin-top: 5px;">
392         <el-table-column
393           prop=""
5c475d 394           label="预测项(NormalItem)"
cd9f11 395           align="center">
L 396           <template #default="scope">
397             <el-select
398               v-model="scope.row.point"
5c475d 399               placeholder="请选择"
cd9f11 400               filterable
49e497 401               :no-data-text="'无数据(管网:' + moduleList.find(e => e.id === dataForm.dmModuleItem.moduleid)?.modulename + ')'"
fcd59a 402               @change="changeNormalItemSelect"
5c475d 403               style="width: 100%">
D 404               <el-option-group
49e497 405                 v-for="group in modelparamListMap['NormalItem'].filter(e => e.moduleid === dataForm.dmModuleItem.moduleid)"
5c475d 406                 :key="group.value"
D 407                 :label="group.label"
408               >
409                 <el-option
410                   v-for="item in group.children"
411                   :key="item.value"
412                   :label="item.label"
413                   :value="item.value"
414                 />
415               </el-option-group>
cd9f11 416             </el-select>
L 417           </template>
418         </el-table-column>
419         <el-table-column
420           prop="point"
421           label="编号"
422           align="center"/>
423         <el-table-column
424           prop=""
425           label="运算符"
426           align="center">
427           <template #default="scope">
7b1ce6 428             <el-select v-model="scope.row.operator" placeholder="请选择" clearable>
cd9f11 429               <el-option
L 430                 v-for="item in operatorList"
431                 :key="item"
432                 :label="item"
433                 :value="item"/>
434             </el-select>
435           </template>
436         </el-table-column>
437         <el-table-column
438           prop=""
439           label="操作"
2caade 440           width="140"
cd9f11 441           align="center">
L 442           <template #default="scope">
443             <el-button
444               @click="addExpressionRow(scope.$index, expressionList)"
445               type="text"
446               size="small">
447               添加
448             </el-button>
449             <el-button
450               @click="deleteExpressionRow(scope.$index, expressionList)"
451               type="text"
452               size="small">
453               删除
454             </el-button>
455           </template>
456         </el-table-column>
457       </el-table>
7462da 458     </el-form>
L 459     <template #footer>
460       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
461       <el-button @click="dialogVisible = false">取 消</el-button>
462     </template>
463   </Dialog>
464 </template>
465 <script lang="ts" setup>
d3ee81 466 import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from '@/utils/dict'
7b1ce6 467 import * as MmPredictItem from '@/api/model/pre/item'
468 import * as MmItemType from '@/api/model/pre/type'
cd9f11 469 import * as DmModule from '@/api/model/pre/dm'
be4298 470 import * as ProjectApi from '@/api/model/mpk/project'
cd9f11 471 import * as DaPoint from '@/api/data/da/point'
7b1ce6 472 import {useUpload} from '@/api/model/pre/item'
e1ff2d 473 import * as ScheduleModelApi from '@/api/model/sche/model'
d3ee81 474
475 const {uploadUrl, httpRequest} = useUpload()
7462da 476
L 477 defineOptions({name: 'DataMmPredictItemForm'})
478
479 const {t} = useI18n() // 国际化
480 const message = useMessage() // 消息弹窗
481 const dialogVisible = ref(false) // 弹窗的是否展示
482 const dialogTitle = ref('') // 弹窗的标题
483 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
484 const formType = ref('') // 表单的类型:create - 新增;update - 修改
cd9f11 485 const itemTypeList = ref([])
L 486 const itemTypeMap = ref({})
487 const moduleList = ref([])
be4298 488 const mpkProjectList = ref([])
2caade 489 const pointNoList = ref([])
cd9f11 490 const pointList = ref([])
L 491 const pointMap = ref({})
d3ee81 492 const modelparamListMap = ref({})
cd9f11 493 const modelparamMap = ref({})
L 494 const expressionList = ref([])
495 const fileList = ref([])
496 const operatorList = ['+', '-']
d3ee81 497 const replaceModelOnly = ref(false)
cd9f11 498 const queryParams = reactive({
L 499   pageNo: 1,
500   pageSize: 10,
501   pointNo: undefined,
502   pointName: undefined,
503 })
504 const dataForm = ref({
2caade 505   id: undefined,
e1ff2d 506   itemtypename: 'NormalItem',
cd9f11 507   mmPredictItem: {
2caade 508     id: undefined,
L 509     itemno: undefined,
510     itemname: undefined,
511     caltypeid: undefined,
512     itemtypeid: undefined,
513     predictlength: undefined,
d3ee81 514     granularity: 60,
2caade 515     status: undefined,
L 516     isfuse: undefined,
517     predictphase: undefined,
d3ee81 518     workchecked: 0,
2caade 519     unittransfactor: undefined,
L 520     saveindex: undefined
cd9f11 521   },
L 522   dmModuleItem: {
2caade 523     id: undefined,
L 524     moduleid: undefined,
525     itemid: undefined,
d3ee81 526     itemorder: 1,
2caade 527     status: undefined,
L 528     categoryid: undefined
cd9f11 529   },
d8e4be 530   mmItemOutputList: [],
cd9f11 531   mmPredictModel: {
2caade 532     id: undefined,
L 533     modelno: undefined,
534     modelname: undefined,
535     itemid: undefined,
536     arithid: undefined,
537     trainsamplength: undefined,
538     predictsamplength: undefined,
539     isonlinetrain: undefined,
540     modelpath: undefined,
541     isnormal: undefined,
542     normalmax: undefined,
543     normalmin: undefined,
544     status: undefined,
545     classname: undefined,
546     methodname: undefined,
547     modelparamstructure: undefined,
548     resultstrid: undefined,
be4298 549     settingmap: undefined,
D 550     mpkprojectid: undefined
cd9f11 551   },
L 552   mmPredictMergeItem: {
2caade 553     id: undefined,
L 554     itemid: undefined,
555     expression: undefined,
556     num: undefined
cd9f11 557   },
L 558   mmModelArithSettingsList: [],
36885d 559   mmModelParamList: [],
D 560   pointId: undefined
7462da 561 })
L 562 const formRules = reactive({
d3ee81 563   'mmPredictItem.itemname': [{required: true, message: '预测项名不能为空', trigger: 'blur'}],
564   'mmPredictItem.itemtypeid': [{required: true, message: '类型不能为空', trigger: 'blur'}],
e1ff2d 565   'mmPredictItem.granularity': [{
d3ee81 566     required: true,
567     message: '粒度不能为空',
568     trigger: 'blur'
569   }],
e1ff2d 570   'mmPredictItem.workchecked': [{
d3ee81 571     required: true,
572     message: '是否检查不能为空',
573     trigger: 'blur'
574   }],
e1ff2d 575   'mmPredictItem.status': [{required: true, message: '是否启用不能为空', trigger: 'blur'}],
576   'dmModuleItem.moduleid': [{required: true, message: '管网不能为空', trigger: 'blur'}],
577   'dmModuleItem.itemorder': [{required: true, message: '排序不能为空', trigger: 'blur'}],
fcd59a 578   'mmPredictItem.predictlength': [{required: true, message: '预测长度不能为空', trigger: 'blur'}],
22bece 579   'mmPredictModel.mpkprojectid': [{required: true, message: '关联项目不能为空', trigger: 'blur'}],
d3ee81 580
7462da 581 })
L 582 const formRef = ref() // 表单 Ref
583
584 /** 打开弹窗 */
2caade 585 const open = async (type: string, id?: number, itemtypename?: string) => {
e1ff2d 586   formType.value = type
7462da 587   dialogVisible.value = true
L 588   dialogTitle.value = t('action.' + type)
2caade 589   dataForm.value.itemtypename = itemtypename || 'NormalItem'
e1ff2d 590   resetForm()
2caade 591   resetFields(dataForm.value)
83f63a 592   setDefaultFields()
e1ff2d 593
594   // 加载参数列表
5c475d 595   modelparamListMap.value = await ScheduleModelApi.getModelParamList(id)
e1ff2d 596
597   // 获取预测项类型列表
598   itemTypeList.value = await MmItemType.getItemTypeList()
599   itemTypeList.value.forEach(function (value) {
600     itemTypeMap[value.id] = value.itemtypename
601   })
602   if (!dataForm.value.id) {
603     dataForm.value.mmPredictItem.itemtypeid = itemTypeList.value[0].id
604   }
605
606   // 获取管网列表
607   moduleList.value = await DmModule.getModuleList()
608
be4298 609   // 获取mpk项目列表
D 610   mpkProjectList.value = await ProjectApi.list()
7b1ce6 611
e1ff2d 612   // 获取数据点列表
613   pointNoList.value = await DaPoint.getPointList(queryParams)
614   if (pointNoList.value.length > 0) {
d8e4be 615     pointList.value = []
e1ff2d 616     pointNoList.value.forEach(function (value) {
617       pointList.value.push(value)
d8e4be 618       pointMap[value.id] = value.pointName
e1ff2d 619     })
620   }
621
7b1ce6 622   // 修改时,设置数据
623   if (id) {
624     formLoading.value = true
625     try {
626       getInfo(id)
627     } finally {
d8e4be 628       formLoading.value = false
7b1ce6 629     }
630   }
e1ff2d 631   formLoading.value = false
7462da 632 }
L 633 defineExpose({open}) // 提供 open 方法,用于打开弹窗
634
635 /** 提交表单 */
636 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
637 const submitForm = async () => {
638   // 校验表单
639   if (!formRef) return
640   const valid = await formRef.value.validate()
641   if (!valid) return
d8e4be 642   //校验模型输出
fcd59a 643   if (dataForm.value.itemtypename === 'NormalItem') {
5c475d 644     if (dataForm.value.mmItemOutputList == undefined || dataForm.value.mmItemOutputList.length <= 0) {
D 645       message.error("模型输出不为空")
646       return
647     }
648
649     let flag = false
650     dataForm.value.mmItemOutputList.forEach(e => {
7db73a 651       if (e.resultstr == undefined || e.resultstr === '' || e.resultType == undefined || e.resultType === '' || (e.resultType === 2 && (e.resultIndex == undefined || e.resultIndex === ''))) {
5c475d 652         message.error("模型输出数据异常")
fcd59a 653         flag = true
D 654         return
655       }
656     })
657     if (flag) return
658   }
659   if (dataForm.value.itemtypename === 'MergeItem') {
660     if (expressionList.value == undefined || expressionList.value.length <= 1) {
661       message.error("表达式长度低于2")
662       return
663     }
664
665     let flag = false
666     expressionList.value.forEach((e,index) => {
3affb8 667       if (e.point == undefined || e.point === '' || ((e.operator == undefined || e.operator === '') && index != expressionList.value.length - 1)) {
fcd59a 668         message.error("表达式数据异常")
5c475d 669         flag = true
D 670         return
671       }
672     })
673     if (flag) return
d8e4be 674   }
D 675
676
7462da 677   // 提交请求
L 678   formLoading.value = true
679   try {
cd9f11 680     const data = dataForm.value as unknown as MmPredictItem.MmPredictItemVO
b39d0b 681     if (expressionList.value && expressionList.value.length > 0) {
L 682       let expression = ''
683       for (let i = 0; i < expressionList.value.length; i++) {
684         let value = expressionList.value[i]
685         expression = expression + value.point + (i === (expressionList.value.length - 1) ? '' : value.operator)
686       }
687       dataForm.value.mmPredictMergeItem.expression = expression
688     } else {
689       dataForm.value.mmPredictMergeItem.expression = ''
690     }
691     if (dataForm.value.mmModelArithSettingsList) {
692       for (let item of dataForm.value.mmModelArithSettingsList) {
9b24e4 693         if (item.key === 'predictLength') {
b39d0b 694           dataForm.value.mmPredictItem.predictlength = item.value
L 695         }
696       }
697     }
7462da 698     if (formType.value === 'create') {
L 699       await MmPredictItem.createMmPredictItem(data)
700       message.success(t('common.createSuccess'))
701     } else {
702       await MmPredictItem.updateMmPredictItem(data)
703       message.success(t('common.updateSuccess'))
704     }
705     dialogVisible.value = false
706     // 发送操作成功的事件
707     emit('success')
708   } finally {
709     formLoading.value = false
710   }
711 }
83f63a 712
2caade 713 const resetFields = (obj) => {
L 714   for (let key in obj) {
715     if (key === 'itemtypename') {
716       continue
717     }
718     if (obj[key] instanceof Array) {
719       obj[key] = []
720     } else if (obj[key] instanceof Object) {
721       resetFields(obj[key])
722     } else {
723       obj[key] = ''
724     }
725   }
726 }
727
728 const getInfo = async (id) => {
729   dataForm.value = await MmPredictItem.getMmPredictItem(id)
7b1ce6 730   dataForm.value.itemtypename = itemTypeMap[dataForm.value.mmPredictItem.itemtypeid]
83f63a 731   expressionList.value = []
2caade 732   if (dataForm.value.mmPredictMergeItem && dataForm.value.mmPredictMergeItem.expression) {
L 733     let expression = dataForm.value.mmPredictMergeItem.expression
83f63a 734     do {
L 735       let indexPlus = expression.indexOf('+')
736       let indexSub = expression.indexOf('-')
737       if (indexPlus !== -1 || indexSub !== -1) {
738         let endIndex = (indexSub == -1 || (indexPlus < indexSub && indexPlus !== -1)) ? indexPlus : indexSub
739         expressionList.value.push({
740           point: expression.substring(0, endIndex),
5c475d 741           operator: expression.substring(endIndex, endIndex + 1)
83f63a 742         })
L 743         expression = expression.substring(endIndex + 1)
744       } else {
745         expressionList.value.push({
746           point: expression,
747           operator: ''
748         })
749         expression = ''
750       }
751     } while (expression && expression.length > 0)
752   }
753 }
754
755 function setReplaceModelOnly(value) {
cd9f11 756   replaceModelOnly.value = value
L 757 }
83f63a 758
L 759 function beforeUpload(file) {
cd9f11 760   let fileName = file.name
L 761   let first = fileName.lastIndexOf('.')
762   let nameLength = fileName.length
763   let fileSuffix = fileName.substring(first + 1, nameLength)
764   if (fileSuffix !== 'miail') {
765     message.error('只能上传miail类型文件')
766     return
767   }
768 }
83f63a 769
L 770 function uploadModelSuccess(response, file, fileList) {
cd9f11 771   if (response.code === 0) {
L 772     message.success(t('上传成功'))
773     dataForm.value.mmModelArithSettingsList = []
d3ee81 774     if (!replaceModelOnly.value) {
cd9f11 775       dataForm.value.mmModelParamList = []
L 776     }
777     dataForm.value.mmPredictModel.modelpath = ''
778     dataForm.value.mmPredictModel.modelparamstructure = ''
779     if (response.data.loadFieldSetList && response.data.loadFieldSetList[0].propertyList) {
83f63a 780       response.data.loadFieldSetList[0].propertyList.forEach(function (value) {
5c475d 781         //匹配  data数字
D 782         if (!/^data\d+$/.test(value.key)) {
cd9f11 783           dataForm.value.mmModelArithSettingsList.push({
L 784             key: value.key,
785             name: value.name,
786             valuetype: value.valueType,
787             value: value.value
788           })
789         }
2caade 790       })
cd9f11 791     }
d3ee81 792     dataForm.value.mmPredictModel.modelname = response.data.originalFilename
cd9f11 793     dataForm.value.mmPredictModel.classname = response.data.className
L 794     dataForm.value.mmPredictModel.methodname = response.data.methodName
795     if (response.data.paramPathList) {
796       dataForm.value.mmPredictModel.modelpath = response.data.paramPathList[0]
797     }
798     if (response.data.paramsArray) {
799       dataForm.value.mmPredictModel.modelparamstructure = response.data.paramsArray.join(',')
800     }
d3ee81 801     if (response.data.paramsCount && !replaceModelOnly.value) {
cd9f11 802       for (let i = 0; i < response.data.paramsCount; i++) {
L 803         dataForm.value.mmModelParamList.push({
804           modelparamportorder: (i + 1),
805           modelparamorder: (i + 1),
806           modelparamtype: '',
807           modelparamid: '',
808           modelparamname: '',
809           datalength: 0
810         })
811       }
812     }
813     if (response.data.settingConfigMap && response.data.settingConfigMap.settingMap) {
814       dataForm.value.mmPredictModel.settingmap = JSON.stringify(response.data.settingConfigMap.settingMap)
815     }
816   } else {
817     message.error('上传失败!' + response.msg)
818     return
819   }
820   fileList = []
821 }
83f63a 822
L 823 function uploadModelError(file, err, fileList) {
cd9f11 824 }
83f63a 825
L 826 function changeModelparam(row) {
cd9f11 827   row.modelparamname = modelparamMap[row.modelparamid]
L 828 }
83f63a 829
L 830 function changeItemtype(value) {
cd9f11 831   dataForm.value.itemtypename = itemTypeMap[value]
L 832 }
83f63a 833
61c379 834 function changeModelparamtype(row) {
cd9f11 835   row.modelparamid = ''
L 836 }
83f63a 837
61c379 838 function changeOutputPoint(value, row) {
d8e4be 839   row.tagname = pointMap[value]
cd9f11 840 }
83f63a 841
L 842 function deleteExpressionRow(index, rows) {
cd9f11 843   rows.splice(index, 1)
L 844 }
83f63a 845
L 846 function addExpressionRow(index, rows) {
cd9f11 847   let row = JSON.parse(JSON.stringify(rows[index]))
L 848   rows.splice(index, 0, row)
849 }
83f63a 850
22bece 851 function deleteRow(index, row, rows) {
D 852   if (!rows || rows.length === 1 || rows.filter(e => e.modelparamportorder === row.modelparamportorder).length === 1) {
853     message.error('不可删除!')
cd9f11 854     return
L 855   }
856   rows.splice(index, 1)
857   orderRow(rows)
858 }
83f63a 859
L 860 function addRow(index: string, rows) {
cd9f11 861   let row = JSON.parse(JSON.stringify(rows[index]))
L 862   rows.splice(index, 0, row)
863   orderRow(rows)
d8e4be 864 }
61c379 865
fcd59a 866 function addItemOutput() {
D 867   if (!dataForm.value.mmItemOutputList) {
868     dataForm.value.mmItemOutputList = []
869   }
870   dataForm.value.mmItemOutputList.push({})
871   orderItemOutput(dataForm.value.mmItemOutputList)
d8e4be 872 }
61c379 873
d8e4be 874 function deleteItemOutput(index: string, rows) {
D 875   if (!rows || rows.length === 1) {
876     message.error('不能全部删除!')
877     return
878   }
879   rows.splice(index, 1)
880   orderItemOutput(rows)
881 }
61c379 882
d8e4be 883 function orderItemOutput(list) {
D 884   list.sort((a, b) => a.outputorder - b.outputorder);
885   let outputorder = 1
886   list.forEach(function (value) {
887     value.outputorder = outputorder
888     outputorder++
889   })
890 }
891
892 function resultTypeChange(value, row) {
893   if (value === 1) {
894     row.resultIndex = undefined
61c379 895   } else if (value === 2) {
d8e4be 896     row.resultIndex = 0
D 897   }
cd9f11 898 }
7462da 899
83f63a 900 function orderRow(rows) {
cd9f11 901   let modelparamorder = 0
L 902   let modelparamportorder = 0
903   rows.forEach(function (value) {
904     if (value.modelparamportorder !== modelparamportorder) {
905       modelparamportorder = value.modelparamportorder
906       modelparamorder = 1
907     }
908     value.modelparamorder = modelparamorder
909     modelparamorder++
910   })
911 }
83f63a 912
2caade 913 const setDefaultFields = () => {
83f63a 914   dataForm.value.mmPredictItem.workchecked = 0
L 915   dataForm.value.mmPredictItem.status = 1
916   dataForm.value.mmPredictItem.isfuse = 0
917   dataForm.value.mmPredictItem.predictphase = 0
918   dataForm.value.mmPredictItem.unittransfactor = 1
919   dataForm.value.mmPredictItem.saveindex = '2'
920   dataForm.value.dmModuleItem.status = 1
921   dataForm.value.mmPredictModel.trainsamplength = 60
922   dataForm.value.mmPredictModel.isonlinetrain = 0
923   dataForm.value.mmPredictModel.status = 1
d8e4be 924   dataForm.value.mmItemOutputList = []
83f63a 925   expressionList.value = [{
L 926     point: '',
927     operator: ''
928   }]
929   fileList.value = []
930 }
931
f5e3a1 932 const clearExpressionList = (value) => {
fcd59a 933   expressionList.value = [{
D 934     point: '',
935     operator: ''
936   }]
937 }
938
7462da 939 /** 重置表单 */
d3ee81 940 const resetForm = () => {
cd9f11 941   dataForm.value = {
L 942     mmModelArithSettingsList: [],
943     mmModelParamList: [],
944     id: '',
e1ff2d 945     itemtypename: 'NormalItem',
cd9f11 946     mmPredictItem: {
L 947       id: '',
948       itemno: '',
949       itemname: '',
950       caltypeid: '',
951       itemtypeid: '',
952       predictlength: '',
d3ee81 953       granularity: 60,
cd9f11 954       status: '',
L 955       isfuse: '',
956       predictphase: '',
d3ee81 957       workchecked: 0,
cd9f11 958       unittransfactor: '',
L 959       saveindex: ''
960     },
961     dmModuleItem: {
962       id: '',
963       moduleid: '',
964       itemid: '',
d3ee81 965       itemorder: 1,
cd9f11 966       status: 1,
L 967       categoryid: ''
968     },
d8e4be 969     mmItemOutputList: [],
cd9f11 970     mmPredictModel: {
L 971       id: '',
972       modelno: '',
973       modelname: '',
974       itemid: '',
975       arithid: '',
976       trainsamplength: '',
977       predictsamplength: '',
978       isonlinetrain: '',
979       modelpath: '',
980       isnormal: '',
981       normalmax: '',
982       normalmin: '',
983       status: 1,
984       classname: '',
985       methodname: '',
986       modelparamstructure: '',
987       resultstrid: '',
988       settingmap: ''
989     },
990     mmPredictMergeItem: {
991       id: '',
992       itemid: '',
993       expression: '',
994       num: ''
995     }
7462da 996   }
L 997   formRef.value?.resetFields()
d3ee81 998 }
cd9f11 999
L 1000 onMounted(() => {
1001   init()
1002 })
1003
83f63a 1004 function init() {
cd9f11 1005 }
7462da 1006 </script>