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