@nstc-business/imes 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1222 @@
1
+ <template>
2
+ <div>
3
+ <div>
4
+ <el-form inline="inline">
5
+ <el-form-item label="单位编号" label-width="80px">
6
+ <el-input v-model="param.cltNo" class="input-w"></el-input>
7
+ </el-form-item>
8
+ <el-form-item label="计算日期">
9
+ <el-date-picker
10
+ class="input-w"
11
+ v-model="param.calcDate"
12
+ type="date"
13
+ placeholder="选择日期"
14
+ format="yyyy-MM-dd"
15
+ value-format="yyyy-MM-dd"
16
+ ></el-date-picker>
17
+ </el-form-item>
18
+ </el-form>
19
+ </div>
20
+ <!-- -->
21
+ <!-- 普通指标 -->
22
+ <div v-if="typeObj.targetArray.length > 0">
23
+ <table-pro
24
+ border
25
+ :columns="tabelHeadersTarget"
26
+ :data="typeObj.targetArray"
27
+ :merge-cells="mergeCells(typeObj.targetArray, tabelHeadersTarget)"
28
+ :scrollY="{
29
+ enabled: false
30
+ }"
31
+ :cellDefault="false"
32
+ :showSetsize="false"
33
+ :small="{
34
+ border: true,
35
+ size: 'small',
36
+ stripe: false
37
+ }"
38
+ :key="key"
39
+ >
40
+ <vxe-column
41
+ slot-scope="{ column }"
42
+ v-bind="{ ...column, field: column.prop, title: column.label }"
43
+ ></vxe-column>
44
+ <vxe-column
45
+ slot="indicatorResult"
46
+ slot-scope="{ column }"
47
+ v-bind="{ ...column, field: column.prop, title: column.label }"
48
+ >
49
+ <div slot-scope="{ row }">
50
+ <div
51
+ v-if="
52
+ row.sourceType !== 3 &&
53
+ (!row?.optionList || row?.optionList?.length == 0)
54
+ "
55
+ >
56
+ {{ indicatorResultFn(row) }}
57
+ </div>
58
+
59
+ <template v-if="row.sourceType == 3 && row.itemType === 21">
60
+ <input-number2
61
+ v-if="row.displayStyle === 1"
62
+ type="rate"
63
+ class="input-w"
64
+ :d-num="digitsCalc(row.showDigits)"
65
+ v-model="row.value"
66
+ ></input-number2>
67
+ <input-number2
68
+ :d-num="digitsCalc(row.showDigits)"
69
+ class="input-w"
70
+ v-else
71
+ v-model="row.value"
72
+ />
73
+ </template>
74
+
75
+ <template v-if="row.itemType === 22 && row.optionList?.length">
76
+ <el-select
77
+ class="input-w"
78
+ v-model="row.value"
79
+ value-key="scoreMapID"
80
+ >
81
+ <el-option
82
+ v-for="item in row.optionList"
83
+ :key="item.scoreMapID"
84
+ :label="item.scoreText"
85
+ :value="item"
86
+ />
87
+ </el-select>
88
+ </template>
89
+
90
+ <template
91
+ v-if="
92
+ row.modifyRank == 2 &&
93
+ row.indicatorResult !== '' &&
94
+ row.indicatorResult !== null
95
+ "
96
+ >
97
+ <template v-if="row.itemType === 21">
98
+ <!-- displayStyle 是否百分比展示 -->
99
+ <input-number
100
+ v-if="row.displayStyle === 1"
101
+ type="rate"
102
+ class="input-w"
103
+ :d-num="digitsCalc(row.showDigits)"
104
+ v-model="row.value"
105
+ ></input-number>
106
+ <input-number
107
+ :d-num="digitsCalc(row.showDigits)"
108
+ class="input-w"
109
+ v-else
110
+ v-model="row.value"
111
+ />
112
+ <i
113
+ v-if="row.businessModuleRemark"
114
+ class="n20-icon-xinxitishi cur-point m-l-s"
115
+ v-title="row.businessModuleRemark"
116
+ style="color: var(--color-text-secondary)"
117
+ ></i>
118
+ </template>
119
+
120
+ <template
121
+ v-else-if="row.itemType === 22 && row.optionList?.length"
122
+ >
123
+ <el-select
124
+ class="input-w"
125
+ v-model="row.value"
126
+ value-key="scoreMapID"
127
+ >
128
+ <el-option
129
+ v-for="item in row.optionList"
130
+ :key="item.scoreMapID"
131
+ :label="item.scoreText"
132
+ :value="item"
133
+ />
134
+ </el-select>
135
+ </template>
136
+ </template>
137
+ </div>
138
+ </vxe-column>
139
+ <vxe-column
140
+ slot="result"
141
+ slot-scope="{ column }"
142
+ v-bind="{ ...column, field: column.prop, title: column.label }"
143
+ >
144
+ <div slot-scope="{ row }">
145
+ <div>{{ resultByshowStyle(row) }}</div>
146
+ <input-number
147
+ v-if="
148
+ row.result !== '' && row.result !== null && row.modifyRank === 1
149
+ "
150
+ :d-num="modelData.digits"
151
+ style="width: 100%"
152
+ :max="row.fullScore"
153
+ v-model="row.modifiedResult"
154
+ placeholder="修改指标得分"
155
+ ></input-number>
156
+ </div>
157
+ </vxe-column>
158
+ </table-pro>
159
+ </div>
160
+
161
+ <!-- 计算 评价 模型 -->
162
+ <div
163
+ v-for="(item, index) in typeObj.evalModelArray"
164
+ :key="'evalModelArray' + index"
165
+ class="m-t-m"
166
+ >
167
+ <span>模型名称:{{ item.name }}</span>
168
+ <span class="m-l-s">
169
+ 模型类型:{{ item.itemType == 11 ? '计算模型' : '评价模型' }}
170
+ </span>
171
+ <div class="m-t-s">
172
+ <n20-table-pro
173
+ border
174
+ :columns="tabelHeadersEvalModel"
175
+ :data="item.tableData"
176
+ :scrollY="{
177
+ enabled: false
178
+ }"
179
+ :cellDefault="false"
180
+ :showSetsize="false"
181
+ :small="{
182
+ border: true,
183
+ size: 'small',
184
+ stripe: false
185
+ }"
186
+ >
187
+ <vxe-column
188
+ slot-scope="{ column }"
189
+ v-bind="{ ...column, field: column.prop, title: column.label }"
190
+ ></vxe-column>
191
+ <vxe-column
192
+ slot="indicatorResult"
193
+ slot-scope="{ column }"
194
+ v-bind="{ ...column, field: column.prop, title: column.label }"
195
+ >
196
+ <template slot-scope="{ row }">
197
+ <div>
198
+ <div
199
+ v-if="
200
+ row.sourceType !== 3 &&
201
+ (!row?.optionList || row?.optionList?.length == 0)
202
+ "
203
+ >
204
+ {{ indicatorResultFn(row) }}
205
+ </div>
206
+
207
+ <template v-if="row.sourceType == 3 && row.itemType === 21">
208
+ <input-number2
209
+ v-if="row.displayStyle === 1"
210
+ type="rate"
211
+ class="input-w"
212
+ :d-num="digitsCalc(row.showDigits)"
213
+ v-model="row.value"
214
+ ></input-number2>
215
+ <input-number2
216
+ :d-num="digitsCalc(row.showDigits)"
217
+ class="input-w"
218
+ v-else
219
+ v-model="row.value"
220
+ />
221
+ </template>
222
+ <template
223
+ v-else-if="row.itemType === 22 && row.optionList?.length"
224
+ >
225
+ <el-select
226
+ class="input-w"
227
+ v-model="row.value"
228
+ value-key="scoreMapID"
229
+ >
230
+ <el-option
231
+ v-for="item in row.optionList"
232
+ :key="item.scoreMapID"
233
+ :label="item.scoreText"
234
+ :value="item"
235
+ />
236
+ </el-select>
237
+ </template>
238
+
239
+ <template
240
+ v-if="
241
+ row.modifyRank == 2 &&
242
+ row.indicatorResult !== '' &&
243
+ row.indicatorResult !== null
244
+ "
245
+ >
246
+ <template v-if="row.itemType === 21">
247
+ <!-- displayStyle 是否百分比展示 -->
248
+ <input-number
249
+ v-if="row.displayStyle === 1"
250
+ type="rate"
251
+ class="input-w"
252
+ :d-num="digitsCalc(row.showDigits)"
253
+ v-model="row.value"
254
+ ></input-number>
255
+ <input-number
256
+ :d-num="digitsCalc(row.showDigits)"
257
+ class="input-w"
258
+ v-else
259
+ v-model="row.value"
260
+ />
261
+ <i
262
+ v-if="row.businessModuleRemark"
263
+ class="n20-icon-xinxitishi cur-point m-l-s"
264
+ v-title="row.businessModuleRemark"
265
+ style="color: var(--color-text-secondary)"
266
+ ></i>
267
+ </template>
268
+
269
+ <template
270
+ v-else-if="row.itemType === 22 && row.optionList?.length"
271
+ >
272
+ <el-select
273
+ class="input-w"
274
+ v-model="row.value"
275
+ value-key="scoreMapID"
276
+ >
277
+ <el-option
278
+ v-for="item in row.optionList"
279
+ :key="item.scoreMapID"
280
+ :label="item.scoreText"
281
+ :value="item"
282
+ />
283
+ </el-select>
284
+ </template>
285
+ </template>
286
+ </div>
287
+ </template>
288
+ </vxe-column>
289
+ <vxe-column
290
+ slot="result"
291
+ slot-scope="{ column }"
292
+ v-bind="{ ...column, field: column.prop, title: column.label }"
293
+ >
294
+ <template slot-scope="{ row }">
295
+ <div>{{ resultByshowStyle(row) }}</div>
296
+
297
+ <input-number
298
+ v-if="
299
+ row.result !== '' &&
300
+ row.result !== null &&
301
+ row.modifyRank === 1
302
+ "
303
+ :d-num="modelData.digits"
304
+ style="width: 100%"
305
+ :max="row.fullScore"
306
+ v-model="row.modifiedResult"
307
+ placeholder="修改指标得分"
308
+ ></input-number>
309
+ </template>
310
+ </vxe-column>
311
+ </n20-table-pro>
312
+ </div>
313
+ </div>
314
+
315
+ <!-- 统计模型 -->
316
+ <div
317
+ v-for="(item, index) in typeObj.statisticsArray"
318
+ :key="'statisticsArray' + index"
319
+ class="m-t-m"
320
+ >
321
+ <span>模型名称:{{ item.name }}</span>
322
+ <span class="m-l-s">模型类型:{{ '统计模型' }}</span>
323
+ <div class="m-t-s">
324
+ <n20-table-pro
325
+ border
326
+ :columns="tabelHeadersStatistics"
327
+ :data="item.tableData"
328
+ :merge-cells="mergeCells(item.tableData, tabelHeadersStatistics)"
329
+ :scrollY="{
330
+ enabled: false
331
+ }"
332
+ :cellDefault="false"
333
+ :showSetsize="false"
334
+ :small="{
335
+ border: true,
336
+ size: 'small',
337
+ stripe: false
338
+ }"
339
+ >
340
+ <vxe-column
341
+ slot-scope="{ column }"
342
+ v-bind="{ ...column, field: column.prop, title: column.label }"
343
+ ></vxe-column>
344
+ <vxe-column
345
+ slot="indicatorResult"
346
+ slot-scope="{ column }"
347
+ v-bind="{ ...column, field: column.prop, title: column.label }"
348
+ >
349
+ <template slot-scope="{ row }">
350
+ <div>
351
+ <div
352
+ v-if="
353
+ row.sourceType !== 3 &&
354
+ (!row?.optionList || row?.optionList?.length == 0)
355
+ "
356
+ >
357
+ {{ indicatorResultFn(row) }}
358
+ </div>
359
+
360
+ <template v-if="row.sourceType === 3 && row.itemType === 21">
361
+ <input-number2
362
+ v-if="row.displayStyle === 1"
363
+ type="rate"
364
+ class="input-w"
365
+ :d-num="digitsCalc(row.showDigits)"
366
+ v-model="row.value"
367
+ ></input-number2>
368
+ <input-number2
369
+ class="input-w"
370
+ :d-num="digitsCalc(row.showDigits)"
371
+ v-else
372
+ v-model="row.value"
373
+ />
374
+ </template>
375
+
376
+ <template
377
+ v-else-if="row.itemType === 22 && row.optionList?.length"
378
+ >
379
+ <el-select
380
+ class="input-w"
381
+ v-model="row.value"
382
+ value-key="scoreMapID"
383
+ >
384
+ <el-option
385
+ v-for="item in row.optionList"
386
+ :key="item.scoreMapID"
387
+ :label="item.scoreText"
388
+ :value="item"
389
+ />
390
+ </el-select>
391
+ </template>
392
+
393
+ <template
394
+ v-if="
395
+ row.modifyRank == 2 &&
396
+ row.indicatorResult !== '' &&
397
+ row.indicatorResult !== null
398
+ "
399
+ >
400
+ <template v-if="row.itemType === 21">
401
+ <!-- displayStyle 是否百分比展示 -->
402
+ <input-number
403
+ v-if="row.displayStyle === 1"
404
+ type="rate"
405
+ class="input-w"
406
+ :d-num="digitsCalc(row.showDigits)"
407
+ v-model="row.value"
408
+ ></input-number>
409
+ <input-number
410
+ class="input-w"
411
+ :d-num="digitsCalc(row.showDigits)"
412
+ v-else
413
+ v-model="row.value"
414
+ />
415
+ <i
416
+ v-if="row.businessModuleRemark"
417
+ class="n20-icon-xinxitishi cur-point m-l-s"
418
+ v-title="row.businessModuleRemark"
419
+ style="color: var(--color-text-secondary)"
420
+ ></i>
421
+ </template>
422
+
423
+ <template
424
+ v-else-if="row.itemType === 22 && row.optionList?.length"
425
+ >
426
+ <el-select
427
+ class="input-w"
428
+ v-model="row.value"
429
+ value-key="scoreMapID"
430
+ >
431
+ <el-option
432
+ v-for="item in row.optionList"
433
+ :key="item.scoreMapID"
434
+ :label="item.scoreText"
435
+ :value="item"
436
+ />
437
+ </el-select>
438
+ </template>
439
+ </template>
440
+ </div>
441
+ </template>
442
+ </vxe-column>
443
+ <vxe-column
444
+ slot="result"
445
+ slot-scope="{ column }"
446
+ v-bind="{ ...column, field: column.prop, title: column.label }"
447
+ >
448
+ <template slot-scope="{ row }">
449
+ <div>{{ resultByshowStyle(row) }}</div>
450
+
451
+ <input-number
452
+ v-if="
453
+ row.result !== '' &&
454
+ row.result !== null &&
455
+ row.modifyRank === 1
456
+ "
457
+ :d-num="modelData.digits"
458
+ style="width: 100%"
459
+ :max="row.fullScore"
460
+ v-model="row.modifiedResult"
461
+ placeholder="修改指标得分"
462
+ ></input-number>
463
+ </template>
464
+ </vxe-column>
465
+ </n20-table-pro>
466
+ </div>
467
+ </div>
468
+ </div>
469
+ </template>
470
+
471
+ <script>
472
+ // import { getModelById, qryModelBkIndicatorList, testCalc } from '../../api/modelIndex'
473
+ /**
474
+ * 关键参数说明 sourceType
475
+ * 0 系统自定义
476
+ * 1 报表取数
477
+ * 2 指标取数
478
+ * 3 手工填报
479
+ * 4 标准值取数
480
+ * 5 系统取值
481
+ * 6 系统取数
482
+ *
483
+ * rankType
484
+ * 0 取指标值
485
+ * 1 分段模糊化打分
486
+ * 2 公式模糊化打分
487
+ * 3 分段模糊化公式打分
488
+ * 4 企业绩效评估标准打分
489
+ * 5 评价等级化取值
490
+ * 6 分段模糊化取值
491
+ * 7 特殊化打分
492
+ * 8 标准值打分
493
+ * 9 统计项运算
494
+ * 10 手工录入
495
+ * 11 分段取值
496
+ *
497
+ * 调整项
498
+ * modifyRank
499
+ * 0 不调整
500
+ * 2 指标值
501
+ * 1 指标得分
502
+ *
503
+ * 模型指标类型
504
+ * itemType
505
+ * 11 计算模型
506
+ * 12 评价模型
507
+ * 13 统计模型
508
+ * 21 可量化指标
509
+ * 22 不可量化指标
510
+ */
511
+
512
+ // 输入框-不四舍五入
513
+ import {
514
+ setMergeCells,
515
+ formatFloat2,
516
+ toFixedTrunc,
517
+ addThousands
518
+ } from '../common'
519
+ import inputNumber2 from './input-number.vue'
520
+ import {TablePro, InputNumber} from 'n20-common-lib'
521
+
522
+ export default {
523
+ name: 'modelCalcTest',
524
+ props: ['modelId', 'modelCode', 'modelData'],
525
+ components: {inputNumber2, TablePro, InputNumber},
526
+ data() {
527
+ return {
528
+ toFixedTrunc,
529
+ addThousands,
530
+ param: {
531
+ cltNo: '',
532
+ calcDate: ''
533
+ },
534
+
535
+ // 拆分数结构为三类数据
536
+ typeObj: {
537
+ // 指标数组
538
+ targetArray: [],
539
+ // 统计模型数组
540
+ statisticsArray: [],
541
+ // 评价/计算模型数组
542
+ evalModelArray: []
543
+ },
544
+
545
+ tabelHeadersTarget: [
546
+ {
547
+ label: '分组',
548
+ prop: 'pName',
549
+ align: 'center',
550
+ minWidth: 150,
551
+ 'show-overflow-tooltip': true
552
+ },
553
+ // {
554
+ // label: '序号',
555
+ // prop: 'serialNumber',
556
+ // align: 'center',
557
+ // minWidth: 100,
558
+ // 'show-overflow-tooltip': true
559
+ // },
560
+ {
561
+ label: '指标名称',
562
+ prop: 'name',
563
+ align: 'center',
564
+ minWidth: 150,
565
+ 'show-overflow-tooltip': true
566
+ },
567
+ {
568
+ label: '指标模拟数据输入',
569
+ prop: 'indicatorResult',
570
+ slotName: 'indicatorResult',
571
+ align: 'center',
572
+ minWidth: 280,
573
+ 'show-overflow-tooltip': false
574
+ },
575
+ {
576
+ label: '指标得分',
577
+ prop: 'result',
578
+ slotName: 'result',
579
+ align: 'center',
580
+ minWidth: 250,
581
+ 'show-overflow-tooltip': false
582
+ },
583
+ {
584
+ label: '指标值显示',
585
+ prop: 'indicatorValText',
586
+ align: 'center',
587
+ minWidth: 250,
588
+ 'show-overflow-tooltip': false
589
+ }
590
+ ],
591
+
592
+ tabelHeadersEvalModel: [
593
+ // {
594
+ // label: '序号',
595
+ // prop: 'serialNumber',
596
+ // align: 'center',
597
+ // minWidth: 100,
598
+ // 'show-overflow-tooltip': true
599
+ // },
600
+ {
601
+ label: '指标名称',
602
+ prop: 'name',
603
+ align: 'center',
604
+ minWidth: 150,
605
+ 'show-overflow-tooltip': true
606
+ },
607
+ {
608
+ label: '指标模拟数据输入',
609
+ prop: 'indicatorResult',
610
+ slotName: 'indicatorResult',
611
+ align: 'center',
612
+ minWidth: 280,
613
+ 'show-overflow-tooltip': false
614
+ },
615
+ {
616
+ label: '指标得分',
617
+ prop: 'result',
618
+ slotName: 'result',
619
+ align: 'center',
620
+ minWidth: 250,
621
+ 'show-overflow-tooltip': false
622
+ },
623
+ {
624
+ label: '指标值显示',
625
+ prop: 'indicatorValText',
626
+ align: 'center',
627
+ minWidth: 250,
628
+ 'show-overflow-tooltip': false
629
+ }
630
+ ],
631
+
632
+ tabelHeadersStatistics: [
633
+ {
634
+ label: '指标项',
635
+ prop: 'pName',
636
+ align: 'center',
637
+ minWidth: 150,
638
+ 'show-overflow-tooltip': true
639
+ },
640
+ {
641
+ label: '统计项名称',
642
+ prop: 'statsName',
643
+ align: 'center',
644
+ minWidth: 150,
645
+ 'show-overflow-tooltip': true
646
+ },
647
+ {
648
+ label: '指标名称',
649
+ prop: 'name',
650
+ align: 'center',
651
+ minWidth: 150,
652
+ 'show-overflow-tooltip': true
653
+ },
654
+ {
655
+ label: '指标模拟数据输入',
656
+ prop: 'indicatorResult',
657
+ slotName: 'indicatorResult',
658
+ align: 'center',
659
+ minWidth: 280,
660
+ 'show-overflow-tooltip': false
661
+ },
662
+ {
663
+ label: '指标得分',
664
+ prop: 'result',
665
+ slotName: 'result',
666
+ align: 'center',
667
+ minWidth: 250,
668
+ 'show-overflow-tooltip': false
669
+ },
670
+ {
671
+ label: '指标值显示',
672
+ prop: 'indicatorValText',
673
+ align: 'center',
674
+ minWidth: 250,
675
+ 'show-overflow-tooltip': false
676
+ }
677
+ ],
678
+
679
+ messageStr: '',
680
+ key: 0
681
+ }
682
+ },
683
+ methods: {
684
+ /** 获取模型下面的内容 */
685
+ async getModelWithChildren(modelCode) {
686
+ const {code, data} = await this.$axios.post(
687
+ '/imes/v1/indicatorModel/getModelByCodeWithChildren',
688
+ {id: modelCode}
689
+ )
690
+ if (code == 0) {
691
+ this.comFn(data)
692
+ }
693
+ },
694
+
695
+ /** 页面渲染函数 */
696
+ comFn(data) {
697
+ const modelTreeVO = data.modelTreeVO
698
+ this.typeObj.statisticsArray.forEach(statistics => {
699
+ this.$set(statistics, 'children', [])
700
+ this.$set(statistics, 'tableData', [])
701
+ return statistics
702
+ })
703
+ this.typeObj.evalModelArray.forEach(evalModel => {
704
+ this.$set(evalModel, 'children', [])
705
+ this.$set(evalModel, 'tableData', [])
706
+ return evalModel
707
+ })
708
+ const digui = data => {
709
+ if (data.children && data.children.length > 0) {
710
+ data.children.map(async item => {
711
+ // 统计模型 找到先关模型下面的指标项
712
+ if (item.isLeaf == 2) {
713
+ if (this.modelData.type == 3) {
714
+ this.typeObj.statisticsArray.forEach(async statistics => {
715
+ if (statistics.itemID == item.modelID) {
716
+ statistics.children.push(item)
717
+ if (
718
+ item.indicatorDeepList &&
719
+ item.indicatorDeepList.length &&
720
+ item.indicatorDeepList.length > 0
721
+ ) {
722
+ const promiseAll = item.indicatorDeepList.map(
723
+ async itemc => this.itemDataFn(itemc, data)
724
+ )
725
+ const objArr = await Promise.all(promiseAll)
726
+ objArr.map(obj => {
727
+ statistics.tableData.push({
728
+ ...obj,
729
+ pName: item.folderName || item.name
730
+ })
731
+ })
732
+ }
733
+ }
734
+ return statistics
735
+ })
736
+ } else {
737
+ this.typeObj.statisticsArray.forEach(async statistics => {
738
+ if (statistics.itemID == item.modelID) {
739
+ statistics.children.push(item)
740
+ if (
741
+ item.children &&
742
+ item.children.length &&
743
+ item.children.length > 0
744
+ ) {
745
+ const promiseAll = item.children.map(async itemc =>
746
+ this.itemDataFn(itemc, data)
747
+ )
748
+ const objArr = await Promise.all(promiseAll)
749
+ objArr.map(obj => {
750
+ statistics.tableData.push({
751
+ ...obj,
752
+ pName: item.folderName || item.name
753
+ })
754
+ })
755
+ }
756
+ }
757
+ return statistics
758
+ })
759
+ }
760
+ }
761
+ // 计算/评价模型
762
+ if (item.isLeaf == 0) {
763
+ this.typeObj.evalModelArray.forEach(async evalModel => {
764
+ if (evalModel.itemID == item.modelID) {
765
+ evalModel.children.push(item)
766
+ if (
767
+ item.children &&
768
+ item.children.length &&
769
+ item.children.length > 0
770
+ ) {
771
+ const promiseAll = item.children.map(async itemc =>
772
+ this.itemDataFn(itemc, data)
773
+ )
774
+ const objArr = await Promise.all(promiseAll)
775
+ objArr.map(obj => {
776
+ evalModel.tableData.push({
777
+ pName: item.folderName || item.name,
778
+ ...obj
779
+ })
780
+ })
781
+ }
782
+ }
783
+ return evalModel
784
+ })
785
+ }
786
+ // 指标
787
+ if (item.isLeaf == 1) {
788
+ this.typeObj.targetArray.forEach(itemc => {
789
+ if (itemc.itemID === item.itemID && itemc.tid === item.tid) {
790
+ itemc.result = item.result
791
+ itemc.indicatorResult = item.indicatorResult
792
+ itemc.businessModuleRemark = item.businessModuleRemark
793
+ if (item.itemType !== 22 && (item.modifiedVal || item.modifiedVal === 0)) {
794
+ itemc.value = item.modifiedVal
795
+ }
796
+ }
797
+ return itemc
798
+ })
799
+ }
800
+ digui(item)
801
+ })
802
+ }
803
+ }
804
+ digui(modelTreeVO)
805
+ },
806
+
807
+ /** 给指标值赋值 */
808
+ async itemDataFn(item, data) {
809
+ let value
810
+ if (item.sourceType == 3) {
811
+ value = item.indicatorResult
812
+ } else {
813
+ // 指标项取值方式
814
+ switch (item.rankType) {
815
+ // 手工录入
816
+ case 10:
817
+ value = item.formula
818
+ break
819
+ // 统计项运算
820
+ case 9:
821
+ value = item.result
822
+ break
823
+ default:
824
+ value = item.indicatorResult
825
+ break
826
+ }
827
+ }
828
+
829
+ // 不可量化指标 查询选项
830
+ if (item.itemType == 22) {
831
+ item.optionList = []
832
+ // 获取当前时间戳
833
+ const timestamp = Date.now()
834
+ // 生成一个随机数
835
+ const randomNum = Math.floor(Math.random() * 1000000) // 这里生成一个 0 到 999999 之间的整数
836
+ // 组合时间戳和随机数
837
+ const randomNumStr = `${timestamp}${randomNum}`
838
+ const {code, data: optionList} = await this.$axios.post(
839
+ `/imes/v1/indicator/getScoreMap?randomNumStr=${randomNumStr}`,
840
+ {id: item.itemID}
841
+ )
842
+ if (code == 0) {
843
+ item.optionList = optionList
844
+ if (item?.optionList?.length > 0) {
845
+ value = item.optionList.find(
846
+ item2 => item2.scoreValue == item.indicatorResult
847
+ )
848
+ }
849
+ }
850
+ }
851
+ item.value = value
852
+ item.pName = data.name
853
+ return item
854
+ },
855
+
856
+ /** 计算 */
857
+ async calc() {
858
+ if (!this.param.cltNo) {
859
+ this.$message.warning('请先输入单位编号')
860
+ return
861
+ }
862
+ const {scoreMapList, indicatorCalcList, state} = this.validateFn()
863
+ if (state == false) {
864
+ return
865
+ }
866
+ this.$emit('changeLoading', true)
867
+ this.param.scoreMapList = scoreMapList
868
+ this.param.indicatorCalcList = indicatorCalcList
869
+ this.param.code = this.modelCode
870
+ let res = {}
871
+ // 统计模型单独写测算
872
+ if (this.modelData.type == 3) {
873
+ try {
874
+ res = await this.$axios.post('/imes/v2/models/testCalc', this.param)
875
+ } catch (error) {
876
+ this.$emit('changeLoading', false)
877
+ }
878
+ if (res.code == 0) {
879
+ const model = res.data
880
+ const modelTreeVO = model.modelTreeVO
881
+ this.recursionFn([modelTreeVO])
882
+ this.comFn(model)
883
+ this.$emit('calcResult', model.resultText)
884
+ }
885
+ } else {
886
+ try {
887
+ res = await this.$axios.post(
888
+ '/imes/v2/models/calcWithChildren',
889
+ this.param
890
+ )
891
+ } catch (error) {
892
+ this.$emit('changeLoading', false)
893
+ }
894
+
895
+ if (res.code == 0) {
896
+ this.comFn(res.data)
897
+ this.$emit('calcResult', res.data.resultText)
898
+ }
899
+ }
900
+
901
+ this.$emit('changeLoading', false)
902
+ },
903
+
904
+ /** 指标计算值检测 */
905
+ checkItem(checkObj) {
906
+ const obj = {
907
+ scoreMapList: [],
908
+ indicatorCalcList: [],
909
+ state: true
910
+ }
911
+ // 可量化的手填的
912
+ if (checkObj.sourceType == 3 && checkObj.itemType == '21') {
913
+ if (!checkObj.value && checkObj.value != 0) {
914
+ obj.state = false
915
+ this.messageStr = this.messageStr + checkObj.name + '的指标值不可为空'
916
+ }
917
+ obj.indicatorCalcList.push({
918
+ hasInput: true,
919
+ indicatorID: checkObj.itemID,
920
+ tid: checkObj.tid,
921
+ modifiedReason: '',
922
+ scoreValue:
923
+ checkObj.displayStyle == 1
924
+ ? formatFloat2(checkObj.value / 100, this.modelData.digits)
925
+ : checkObj.value
926
+ })
927
+ }
928
+ // 不可量化的 有选项的
929
+ if (checkObj.itemType == 22 && checkObj?.optionList?.length > 0) {
930
+ if (!checkObj.value?.scoreMapID) {
931
+ this.messageStr =
932
+ this.messageStr + checkObj.name + '的指标值不可为空;'
933
+ obj.state = false
934
+ }
935
+ obj.scoreMapList.push({
936
+ indicatorID: checkObj.itemID,
937
+ reason: '',
938
+ scoreMapID: checkObj.value?.scoreMapID,
939
+ scoreText: checkObj.value?.scoreText,
940
+ scoreValue: checkObj.value?.scoreValue
941
+ })
942
+ }
943
+ // 调整项为 指标值
944
+ if (
945
+ checkObj.modifyRank == 2 &&
946
+ checkObj.indicatorResult !== '' &&
947
+ checkObj.indicatorResult !== null &&
948
+ (checkObj.value || checkObj.value == 0)
949
+ ) {
950
+ obj.indicatorCalcList.push({
951
+ hasInput: true,
952
+ indicatorID: checkObj.itemID,
953
+ tid: checkObj.tid,
954
+ modifiedReason: '',
955
+ modifiedVal:
956
+ checkObj.displayStyle == 1
957
+ ? formatFloat2(checkObj.value / 100, this.modelData.digits)
958
+ : checkObj.value
959
+ })
960
+ }
961
+ // 调整项为 指标得分
962
+ if (
963
+ checkObj.result !== '' &&
964
+ checkObj.result !== null &&
965
+ checkObj.modifyRank == 1 &&
966
+ (checkObj.modifiedResult || checkObj.modifiedResult == 0)
967
+ ) {
968
+ obj.indicatorCalcList.push({
969
+ hasInput: true,
970
+ indicatorID: checkObj.itemID,
971
+ tid: checkObj.tid,
972
+ modifiedReason: '',
973
+ modifiedResult: checkObj.modifiedResult
974
+ })
975
+ }
976
+ return obj
977
+ },
978
+
979
+ /** 计算逻辑抽取 */
980
+ validateFn() {
981
+ let scoreMapList = []
982
+ let indicatorCalcList = []
983
+ let state = true
984
+ this.messageStr = ''
985
+
986
+ this.typeObj.targetArray.map(item => {
987
+ const {
988
+ scoreMapList: scoreMapListTarget,
989
+ indicatorCalcList: indicatorCalcListTarget,
990
+ state: stateTarget
991
+ } = this.checkItem(item)
992
+ if (!stateTarget) {
993
+ state = false
994
+ return
995
+ }
996
+ scoreMapList.push(...scoreMapListTarget)
997
+ indicatorCalcList.push(...indicatorCalcListTarget)
998
+ })
999
+ this.typeObj.statisticsArray.map(item => {
1000
+ item.tableData.map(item2 => {
1001
+ const {
1002
+ scoreMapList: scoreMapListTarget,
1003
+ indicatorCalcList: indicatorCalcListTarget,
1004
+ state: stateTarget
1005
+ } = this.checkItem(item2)
1006
+ if (!stateTarget) {
1007
+ state = false
1008
+ return
1009
+ }
1010
+ scoreMapList.push(...scoreMapListTarget)
1011
+ indicatorCalcList.push(...indicatorCalcListTarget)
1012
+ })
1013
+ })
1014
+ this.typeObj.evalModelArray.map(item => {
1015
+ item.tableData.map(item2 => {
1016
+ const {
1017
+ scoreMapList: scoreMapListTarget,
1018
+ indicatorCalcList: indicatorCalcListTarget,
1019
+ state: stateTarget
1020
+ } = this.checkItem(item2)
1021
+ if (!stateTarget) {
1022
+ state = false
1023
+ return
1024
+ }
1025
+
1026
+ scoreMapList.push(...scoreMapListTarget)
1027
+ indicatorCalcList.push(...indicatorCalcListTarget)
1028
+ })
1029
+ })
1030
+ if (this.messageStr) {
1031
+ this.$message.warning(this.messageStr)
1032
+ }
1033
+ return {scoreMapList, indicatorCalcList, state}
1034
+ },
1035
+ // 指标table :isLeaf =1 itemType = [21,22]
1036
+ // 统计模型table : isLeaf=2 itemType = 13
1037
+ // 计算模型table : isLeaf=0 itemType = 11
1038
+ // 评价模型table: isLeaf=0 itemType = 12
1039
+ processingData(modelData) {
1040
+ const modelTreeVO = JSON.parse(JSON.stringify(modelData.modelTreeVO))
1041
+ const digui = data => {
1042
+ if (data.children && data.children.length > 0) {
1043
+ data.children.map(async item => {
1044
+ if (item.isLeaf === 1) {
1045
+ switch (item.itemType) {
1046
+ // 可量化指标
1047
+ case 21: {
1048
+ this.typeObj.targetArray.push({})
1049
+ this.typeObj.targetArray[this.typeObj.targetArray.length - 1] = await this.itemDataFn(item, data)
1050
+ this.key++
1051
+ }
1052
+ break
1053
+ // 不可量化指标
1054
+ case 22: {
1055
+ item.optionList = []
1056
+ this.typeObj.targetArray.push({})
1057
+ this.typeObj.targetArray[this.typeObj.targetArray.length - 1] = await this.itemDataFn(item, data)
1058
+ this.key++
1059
+ }
1060
+ break
1061
+ // 计算模型
1062
+ case 11: {
1063
+ item.children = []
1064
+ item.tableData = []
1065
+ this.typeObj.evalModelArray.push({...item})
1066
+ this.typeObj.targetArray.push({})
1067
+ this.typeObj.targetArray[this.typeObj.targetArray.length - 1] = await this.itemDataFn(item, data)
1068
+ this.key++
1069
+ }
1070
+ break
1071
+ // 评价模型
1072
+ case 12: {
1073
+ item.children = []
1074
+ item.tableData = []
1075
+ this.typeObj.evalModelArray.push({...item})
1076
+ this.typeObj.targetArray.push({})
1077
+ this.typeObj.targetArray[this.typeObj.targetArray.length - 1] = await this.itemDataFn(item, data)
1078
+ this.key++
1079
+ }
1080
+
1081
+ break
1082
+ // 统计模型
1083
+ case 13: {
1084
+ item.children = []
1085
+ item.tableData = []
1086
+ this.typeObj.statisticsArray.push({...item})
1087
+ this.typeObj.targetArray.push({})
1088
+ this.typeObj.targetArray[this.typeObj.targetArray.length - 1] = await this.itemDataFn(item, data)
1089
+ this.key++
1090
+ }
1091
+ break
1092
+ default:
1093
+ break
1094
+ }
1095
+ } else if (item.isLeaf === 0) {
1096
+ digui(item)
1097
+ }
1098
+ })
1099
+ }
1100
+ }
1101
+ digui(modelTreeVO)
1102
+ },
1103
+ /** 统计模型表头合并 */
1104
+ mergeCells(table, columns) {
1105
+ const arr1 = setMergeCells({
1106
+ list: table,
1107
+ columns: columns,
1108
+ merges: ['pName'],
1109
+ condition: ['pid'],
1110
+ field: 'prop'
1111
+ })
1112
+ return [...arr1]
1113
+ },
1114
+ /** 统计模型专用 处理叶子节点为2 */
1115
+ recursionFn(arr) {
1116
+ if (arr.length === 0) return arr
1117
+ arr.forEach(item => {
1118
+ item.label = item.name
1119
+ if (item.isLeaf === 2) {
1120
+ this.$set(
1121
+ item,
1122
+ 'indicatorDeepList',
1123
+ item.children.map(item2 => {
1124
+ return {...item2, label: item.name}
1125
+ })
1126
+ )
1127
+ item.children = []
1128
+ } else {
1129
+ if (item.children?.length) {
1130
+ this.recursionFn(item.children)
1131
+ }
1132
+ }
1133
+ })
1134
+ },
1135
+ digitsCalc(showDigits) {
1136
+ if (showDigits || showDigits === 0) {
1137
+ return showDigits
1138
+ } else {
1139
+ return this.modelData.digits
1140
+ }
1141
+ },
1142
+ resultByshowStyle(row) {
1143
+ const digits =
1144
+ row.showDigits || row.showDigits === 0
1145
+ ? row.showDigits
1146
+ : this.modelData.digits
1147
+ let val = ''
1148
+ if (row.showStyle === 2) {
1149
+ val =
1150
+ row.result || row.result === 0
1151
+ ? addThousands(toFixedTrunc(row?.result, digits))
1152
+ : ''
1153
+ } else {
1154
+ val =
1155
+ row.result || row.result === 0
1156
+ ? Number(row.result).toFixed(digits)
1157
+ : ''
1158
+ }
1159
+ return val
1160
+ },
1161
+ indicatorResultFn(row) {
1162
+ let value = ''
1163
+ const displayStyle =
1164
+ row.displayStyle === 1 &&
1165
+ (row.indicatorResult || row.indicatorResult === 0)
1166
+ ? '%'
1167
+ : ''
1168
+ if (row.indicatorResult || row.indicatorResult === 0) {
1169
+ value = row?.indicatorResult?.toFixed(this.digitsCalc(row.showDigits))
1170
+ if (row.showStyle === 2) {
1171
+ value = addThousands(value)
1172
+ }
1173
+ }
1174
+ return value + displayStyle
1175
+ }
1176
+ },
1177
+ mounted() {
1178
+ // if (this.modelData.showLevel !== 1) {
1179
+ // this.tabelHeadersTarget = this.tabelHeadersTarget.filter(item => item.prop !== 'serialNumber')
1180
+ // this.tabelHeadersEvalModel = this.tabelHeadersEvalModel.filter(item => item.prop !== 'serialNumber')
1181
+ // }
1182
+ switch (this.modelData.type) {
1183
+ case 1:
1184
+ case 2:
1185
+ if (this.modelCode) {
1186
+ this.processingData(this.modelData)
1187
+ this.getModelWithChildren(this.modelCode)
1188
+ }
1189
+ break
1190
+ case 3:
1191
+ const modelTreeVO = JSON.parse(
1192
+ JSON.stringify(this.modelData.modelTreeVO)
1193
+ )
1194
+ modelTreeVO.itemID = modelTreeVO.modelID
1195
+ modelTreeVO.tableData = []
1196
+ modelTreeVO.children = []
1197
+ this.typeObj.statisticsArray.push({...modelTreeVO})
1198
+ this.comFn(this.modelData)
1199
+ break
1200
+ default:
1201
+ break
1202
+ }
1203
+ }
1204
+ }
1205
+ </script>
1206
+
1207
+ <style lang="less" scoped>
1208
+ ::v-deep .vxe-body--column {
1209
+ padding-top: 8px;
1210
+ padding-bottom: 8px;
1211
+ height: auto !important;
1212
+ max-height: unset !important;
1213
+ }
1214
+
1215
+ /deep/
1216
+ .vxe-table--render-default.size--small
1217
+ .vxe-body--column.col--ellipsis
1218
+ > .vxe-cell {
1219
+ max-height: inherit;
1220
+ height: auto;
1221
+ }
1222
+ </style>