@nstc-business/imes 1.0.24 → 1.0.26

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.
@@ -1,1888 +1,1888 @@
1
- <template>
2
- <Page>
3
- <expandable-pane title="模型信息">
4
- <div class="flex-box flex-lr m-b-s">
5
- <div></div>
6
- <div>
7
- <el-button type="primary" size="mini" @click="printFn">
8
- 打印
9
- </el-button>
10
- </div>
11
- </div>
12
- <descriptions>
13
- <el-descriptions-item label="模型类型">
14
- <span v-if="modelData.type === 1">评价模型</span>
15
- <span v-else-if="modelData.type === 2">计算模型</span>
16
- <span v-else-if="modelData.type === 3">统计模型</span>
17
- <span v-else>--</span>
18
- </el-descriptions-item>
19
- <el-descriptions-item label="模型编号">
20
- {{ modelData.code }}
21
- </el-descriptions-item>
22
- <el-descriptions-item label="模型名称">
23
- {{ modelData.name }}
24
- </el-descriptions-item>
25
- <el-descriptions-item label="模型版本">
26
- 版本{{ modelData.version }}
27
- </el-descriptions-item>
28
- <el-descriptions-item label="应用业务">
29
- {{
30
- modelData.businessCodeVOS
31
- ? modelData?.businessCodeVOS?.map(item => item.name).join(',')
32
- : '--'
33
- }}
34
- </el-descriptions-item>
35
- <el-descriptions-item label="统计模式" v-if="modelData.type === 3">
36
- {{ modelData.sataMode === 1 ? '表模式' : '计算模式' }}
37
- </el-descriptions-item>
38
- <el-descriptions-item
39
- label="是否展示指标权重"
40
- v-if="modelData.type === 1"
41
- >
42
- {{ modelData.showWeight ? '是' : '否' }}
43
- </el-descriptions-item>
44
- <el-descriptions-item
45
- label="同一指标项目是否横向展示"
46
- v-if="modelData.type === 1"
47
- >
48
- {{ modelData.acrossShow ? '是' : '否' }}
49
- </el-descriptions-item>
50
- <el-descriptions-item
51
- label="业务系统显示格式"
52
- v-if="modelData.type === 2"
53
- >
54
- <span v-if="modelData.showStyle === 1">数值格式</span>
55
- <span v-else-if="modelData.showStyle === 2">货币格式</span>
56
- <span v-else>--</span>
57
- </el-descriptions-item>
58
- <el-descriptions-item label="负责人">
59
- <div
60
- class="text-ellipsis"
61
- show-overflow-tooltip="true"
62
- v-title="
63
- modelData?.modelRoleList?.map(item => item.roleName).join(',')
64
- "
65
- >
66
- {{
67
- modelData.modelRoleList && modelData.modelRoleList.length > 0
68
- ? modelData?.modelRoleList?.map(item => item.roleName).join(',')
69
- : '--'
70
- }}
71
- </div>
72
- </el-descriptions-item>
73
- <el-descriptions-item label="备注">
74
- {{ modelData.remark }}
75
- </el-descriptions-item>
76
- </descriptions>
77
- </expandable-pane>
78
- <expandable-pane title="模型测算信息">
79
- <el-form class="label-width-10em" label-width="10em">
80
- <el-form-item label="客户名称:">
81
- <span>{{ modelData.memberName }}</span>
82
- </el-form-item>
83
- <el-form-item label="客户编号:">
84
- <span>{{ modelData.memberNo }}</span>
85
- </el-form-item>
86
- <el-form-item label="业务基准时间:">
87
- <span>{{ modelData.useDate }}</span>
88
- </el-form-item>
89
- </el-form>
90
- <template v-if="typeObj.targetArray.length > 0">
91
- <el-form>
92
- <el-form-item label="模型:">
93
- <span>【{{ modelData.name }}】——模型指标</span>
94
- </el-form-item>
95
- </el-form>
96
- </template>
97
-
98
- <div>
99
- <el-form
100
- class="label-width-10em"
101
- label-width="10em"
102
- v-if="modelData.sataMode !== 1"
103
- >
104
- <el-form-item
105
- label="模型得分:"
106
- v-if="
107
- modelData.type === 1 ||
108
- (modelData.type === 3 && modelData.sataMode === 2)
109
- "
110
- >
111
- <span>
112
- {{
113
- modelData.result || modelData.result === 0
114
- ? Number(modelData.result).toFixed(modelData.digits)
115
- : '--'
116
- }}
117
- </span>
118
- </el-form-item>
119
- <el-form-item label="模型结果:" v-if="modelData.type !== 3">
120
- <span>{{ modelData.resultText }}</span>
121
- </el-form-item>
122
- </el-form>
123
- <!-- 普通指标 -->
124
- <div v-if="typeObj.targetArray.length > 0">
125
- <el-form
126
- class="label-width-6em"
127
- label-width="10em"
128
- v-if="modelData.type === 1"
129
- >
130
- <el-form-item label="指标得分结果小计:">
131
- <span>
132
- {{
133
- typeObj.targetArray.reduce(
134
- (total, item) =>
135
- N_add(
136
- item.valueScore ? item.valueScore : 0,
137
- total,
138
- modelData.digits
139
- ),
140
- 0
141
- )
142
- }}
143
- </span>
144
- </el-form-item>
145
- <el-form-item label="模型指标得分小计:">
146
- <span>
147
- {{
148
- typeObj.targetArray.reduce(
149
- (total, item) =>
150
- N_add(
151
- item.modifiedResult ? item.modifiedResult : item.result,
152
- total,
153
- modelData.digits
154
- ),
155
- 0
156
- )
157
- }}
158
- </span>
159
- </el-form-item>
160
- </el-form>
161
- <table-pro
162
- border
163
- :columns="tabelHeadersTarget"
164
- :data="typeObj.targetArray"
165
- :merge-cells="mergeCells(typeObj.targetArray, tabelHeadersTarget)"
166
- :scrollY="{
167
- enabled: false
168
- }"
169
- :cellDefault="false"
170
- :showSetsize="false"
171
- :small="{
172
- border: true,
173
- size: 'small',
174
- stripe: false
175
- }"
176
- >
177
- <vxe-column
178
- slot="indicatorResult"
179
- slot-scope="{ column }"
180
- v-bind="{ ...column, field: column.prop, title: column.label }"
181
- >
182
- <template slot-scope="{ row }">
183
- <el-tooltip
184
- class="item"
185
- effect="dark"
186
- :disabled="!row.displayFormula"
187
- >
188
- <div slot="content">
189
- {{ row.displayFormula }}:
190
- <br/>
191
- {{ row.relFormula }}
192
- </div>
193
- <div v-if="row.sourceType === 5 && row.showValueType === 1">
194
- {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
195
- </div>
196
- <div
197
- v-else-if="
198
- row.sourceType !== 3 &&
199
- (!row?.optionList || row?.optionList?.length == 0)
200
- "
201
- >
202
- {{ indicatorResultFn(row) }}
203
- {{
204
- row.displayStyle === 1 &&
205
- (row.indicatorResult || row.indicatorResult === 0)
206
- ? '%'
207
- : ''
208
- }}
209
- </div>
210
-
211
- <div v-if="row.sourceType == 3 && row.itemType === 21">
212
- {{
213
- row.value || row.value === 0
214
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
215
- : ''
216
- }}
217
- {{
218
- row.displayStyle === 1 && (row.value || row.value === 0)
219
- ? '%'
220
- : ''
221
- }}
222
- </div>
223
- <div v-if="row.itemType === 22 && row.optionList?.length">
224
- {{
225
- row.value && row.value.scoreText
226
- ? row.value.scoreText
227
- : '--'
228
- }}
229
- </div>
230
- <div
231
- v-if="
232
- row.modifyRank == 2 &&
233
- row.indicatorResult !== '' &&
234
- row.indicatorResult !== null
235
- "
236
- >
237
- <template v-if="row.itemType === 21">
238
- <!-- displayStyle 是否百分比展示 -->
239
- {{
240
- row.value || row.value === 0
241
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
242
- : ''
243
- }}
244
- {{
245
- row.displayStyle === 1 && (row.value || row.value === 0)
246
- ? '%'
247
- : ''
248
- }}
249
- </template>
250
-
251
- <template
252
- v-else-if="row.itemType === 22 && row.optionList?.length"
253
- >
254
- {{
255
- row.value && row.value.scoreText
256
- ? row.value.scoreText
257
- : '--'
258
- }}
259
- </template>
260
- </div>
261
- </el-tooltip>
262
- </template>
263
- </vxe-column>
264
- <vxe-column
265
- slot="value"
266
- slot-scope="{ column }"
267
- v-bind="{ ...column, field: column.prop, title: column.label }"
268
- >
269
- <template slot-scope="{ row }">
270
- <div>
271
- {{
272
- row.valueScore || row.valueScore === 0
273
- ? row.valueScore
274
- : '--'
275
- }}
276
- </div>
277
- </template>
278
- </vxe-column>
279
- <vxe-column
280
- slot="result"
281
- slot-scope="{ column }"
282
- v-bind="{ ...column, field: column.prop, title: column.label }"
283
- >
284
- <template slot-scope="{ row }">
285
- <div>
286
- {{
287
- row.result || row.result === 0
288
- ? Number(row.result).toFixed(modelData.digits)
289
- : ''
290
- }}
291
- </div>
292
- </template>
293
- </vxe-column>
294
- <vxe-column
295
- slot="modifyRank"
296
- slot-scope="{ column }"
297
- v-bind="{ ...column, field: column.prop, title: column.label }"
298
- v-if="
299
- !typeObj.targetArray.every(
300
- el => !el.modifyRank || el.modifyRank === 0
301
- )
302
- "
303
- >
304
- <template slot-scope="{ row }">
305
- {{ row.modifyRank === 1 ? '指标得分' : row.modifyRank === 2 ? '指标值' : '不调整' }}
306
- </template>
307
- </vxe-column>
308
- <vxe-column
309
- slot="modifiedVal"
310
- slot-scope="{ column }"
311
- v-bind="{ ...column, field: column.prop, title: column.label }"
312
- v-if="
313
- !typeObj.targetArray.every(
314
- el => !el.modifyRank || el.modifyRank === 0
315
- )
316
- "
317
- >
318
- <template slot-scope="{ row }">
319
- <span>
320
- {{
321
- row.modifyRank === 2
322
- ? row.displayStyle === 1
323
- ? Number.parseFloat(
324
- N.subFixed(
325
- row.modifiedVal / 100,
326
- this.modelData.digits
327
- )
328
- ) + '%'
329
- : row.modifiedVal
330
- : '--'
331
- }}
332
- </span>
333
- </template>
334
- </vxe-column>
335
- <vxe-column
336
- slot="modifiedResult"
337
- slot-scope="{ column }"
338
- v-bind="{ ...column, field: column.prop, title: column.label }"
339
- v-if="
340
- !typeObj.targetArray.every(
341
- el => !el.modifyRank || el.modifyRank === 0
342
- )
343
- "
344
- >
345
- <template slot-scope="{ row }">
346
- <div>
347
- {{ row.modifiedResult || '--' }}
348
- </div>
349
- </template>
350
- </vxe-column>
351
- <vxe-column
352
- slot="indicatorValText"
353
- slot-scope="{ column }"
354
- v-bind="{ ...column, field: column.prop, title: column.label }"
355
- v-if="!typeObj.targetArray.every(
356
- el => !el.supplementRuleVOList || item.supplementRuleVOList.length === 0
357
- )">
358
- <template slot-scope="{ row }">
359
- <div>
360
- {{row.indicatorValText || '--' }}
361
- </div>
362
- </template>
363
- </vxe-column>
364
- </table-pro>
365
- </div>
366
- <!-- 子模型:按模型树文件夹顺序(定量→定性→调整项)展开,不按类型分块 -->
367
- <template v-for="(item, index) in typeObj.orderedSubModels">
368
- <!-- 评价模型 -->
369
- <div
370
- v-if="item._subModelKind === 'assess'"
371
- :key="'assessModelArray' + index"
372
- class="m-t-m"
373
- >
374
- <div>子模型【评级模型】--{{ item.name }}--模型指标</div>
375
- <el-form class="label-width-6em" label-width="10em">
376
- <el-form-item label="模型得分:">
377
- <span>
378
- {{
379
- item.result || item.result === 0
380
- ? item.result.toFixed(item.showDigits)
381
- : ''
382
- }}
383
- </span>
384
- </el-form-item>
385
- <el-form-item label="模型结果:">
386
- <span>{{ item.resultText }}</span>
387
- </el-form-item>
388
- </el-form>
389
- <div class="m-t-s">
390
- <table-pro
391
- border
392
- :columns="tabelHeadersAssessModel"
393
- :data="item.tableData"
394
- :merge-cells="mergeCells(item.tableData, tabelHeadersAssessModel)"
395
- :scrollY="{
396
- enabled: false
397
- }"
398
- :cellDefault="false"
399
- :showSetsize="false"
400
- :small="{
401
- border: true,
402
- size: 'small',
403
- stripe: false
404
- }"
405
- >
406
- <vxe-column
407
- slot-scope="{ column }"
408
- v-bind="{ ...column, field: column.prop, title: column.label }"
409
- ></vxe-column>
410
- <vxe-column
411
- slot="indicatorResult"
412
- slot-scope="{ column }"
413
- v-bind="{ ...column, field: column.prop, title: column.label }"
414
- >
415
- <template slot-scope="{ row }">
416
- <el-tooltip
417
- class="item"
418
- effect="dark"
419
- :disabled="!row.displayFormula"
420
- >
421
- <div slot="content">
422
- {{ row.displayFormula }}:
423
- <br/>
424
- {{ row.relFormula }}
425
- </div>
426
- <div v-if="row.sourceType === 5 && row.showValueType === 1">
427
- {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
428
- </div>
429
- <div
430
- v-else-if="
431
- row.sourceType !== 3 &&
432
- (!row?.optionList || row?.optionList?.length == 0)
433
- "
434
- >
435
- {{ indicatorResultFn(row) }}
436
- {{
437
- row.displayStyle === 1 &&
438
- (row.indicatorResult || row.indicatorResult === 0)
439
- ? '%'
440
- : ''
441
- }}
442
- </div>
443
-
444
- <div v-if="row.sourceType == 3 && row.itemType === 21">
445
- {{
446
- row.value || row.value === 0
447
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
448
- : ''
449
- }}
450
- {{
451
- row.displayStyle === 1 && (row.value || row.value === 0)
452
- ? '%'
453
- : ''
454
- }}
455
- </div>
456
- <div
457
- v-else-if="row.itemType === 22 && row.optionList?.length"
458
- >
459
- {{
460
- row.value && row.value.scoreText
461
- ? row.value.scoreText
462
- : '--'
463
- }}
464
- </div>
465
- <div
466
- v-if="
467
- row.modifyRank == 2 &&
468
- row.indicatorResult !== '' &&
469
- row.indicatorResult !== null
470
- "
471
- >
472
- <template v-if="row.itemType === 21">
473
- <!-- displayStyle 是否百分比展示 -->
474
- {{
475
- row.value || row.value === 0
476
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
477
- : ''
478
- }}
479
- {{
480
- row.displayStyle === 1 &&
481
- (row.value || row.value === 0)
482
- ? '%'
483
- : ''
484
- }}
485
- </template>
486
- <template
487
- v-else-if="
488
- row.itemType === 22 && row.optionList?.length
489
- "
490
- >
491
- {{
492
- row.value && row.value.scoreText
493
- ? row.value.scoreText
494
- : '--'
495
- }}
496
- </template>
497
- </div>
498
- </el-tooltip>
499
- </template>
500
- </vxe-column>
501
- <vxe-column
502
- slot="value"
503
- slot-scope="{ column }"
504
- v-bind="{ ...column, field: column.prop, title: column.label }"
505
- >
506
- <template slot-scope="{ row }">
507
- <div>
508
- {{
509
- row.valueScore || row.valueScore === 0
510
- ? row.valueScore
511
- : '--'
512
- }}
513
- </div>
514
- </template>
515
- </vxe-column>
516
- <vxe-column
517
- slot="result"
518
- slot-scope="{ column }"
519
- v-bind="{ ...column, field: column.prop, title: column.label }"
520
- >
521
- <template slot-scope="{ row }">
522
- <div>
523
- {{
524
- row.result || row.result === 0
525
- ? row.result.toFixed(modelData.digits)
526
- : ''
527
- }}
528
- </div>
529
- </template>
530
- </vxe-column>
531
- <vxe-column
532
- slot="modifyRank"
533
- slot-scope="{ column }"
534
- v-bind="{ ...column, field: column.prop, title: column.label }"
535
- v-if="
536
- !item.tableData.every(
537
- el => !el.modifyRank || el.modifyRank === 0
538
- )
539
- "
540
- >
541
- <template slot-scope="{ row }">
542
- {{ row.modifyRank === 1 ? '指标得分' : row.modifyRank === 2 ? '指标值' : '不调整' }}
543
- </template>
544
- </vxe-column>
545
- <vxe-column
546
- slot="modifiedVal"
547
- slot-scope="{ column }"
548
- v-bind="{ ...column, field: column.prop, title: column.label }"
549
- v-if="
550
- !item.tableData.every(
551
- el => !el.modifyRank || el.modifyRank === 0
552
- )
553
- "
554
- >
555
- <template slot-scope="{ row }">
556
- <span>
557
- {{
558
- row.modifyRank === 2
559
- ? row.displayStyle === 1
560
- ? Number.parseFloat(
561
- N.subFixed(
562
- row.modifiedVal / 100,
563
- this.modelData.digits
564
- )
565
- ) + '%'
566
- : row.modifiedVal
567
- : '--'
568
- }}
569
- </span>
570
- </template>
571
- </vxe-column>
572
- <vxe-column
573
- slot="modifiedResult"
574
- slot-scope="{ column }"
575
- v-bind="{ ...column, field: column.prop, title: column.label }"
576
- v-if="
577
- !item.tableData.every(
578
- el => !el.modifyRank || el.modifyRank === 0
579
- )
580
- "
581
- >
582
- <template slot-scope="{ row }">
583
- <div>
584
- {{
585
- row.result || row.result === 0
586
- ? Number(row.modifiedResult).toFixed(modelData.digits)
587
- : '--'
588
- }}
589
- </div>
590
- </template>
591
- </vxe-column>
592
- </table-pro>
593
- </div>
594
- </div>
595
- <!-- 计算模型 -->
596
- <div
597
- v-else-if="item._subModelKind === 'eval'"
598
- :key="'evalModelArray' + index"
599
- class="m-t-m"
600
- >
601
- <div>子模型【计算模型】--{{ item.name }}--模型指标</div>
602
- <div class="m-t-s">
603
- <table-pro
604
- border
605
- :columns="tabelHeadersEvalModel"
606
- :data="item.tableData"
607
- :merge-cells="mergeCells(item.tableData, tabelHeadersEvalModel)"
608
- :scrollY="{
609
- enabled: false
610
- }"
611
- :cellDefault="false"
612
- :showSetsize="false"
613
- :small="{
614
- border: true,
615
- size: 'small',
616
- stripe: false
617
- }"
618
- >
619
- <vxe-column
620
- slot-scope="{ column }"
621
- v-bind="{ ...column, field: column.prop, title: column.label }"
622
- ></vxe-column>
623
- <vxe-column
624
- slot="indicatorResult"
625
- slot-scope="{ column }"
626
- v-bind="{ ...column, field: column.prop, title: column.label }"
627
- >
628
- <template slot-scope="{ row }">
629
- <el-tooltip
630
- class="item"
631
- effect="dark"
632
- :disabled="!row.displayFormula"
633
- >
634
- <div slot="content">
635
- {{ row.displayFormula }}:
636
- <br/>
637
- {{ row.relFormula }}
638
- </div>
639
- <div v-if="row.sourceType === 5 && row.showValueType === 1">
640
- {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
641
- </div>
642
- <div
643
- v-else-if="
644
- row.sourceType !== 3 &&
645
- (!row?.optionList || row?.optionList?.length == 0)
646
- "
647
- >
648
- {{ indicatorResultFn(row) }}
649
- {{
650
- row.displayStyle === 1 &&
651
- (row.indicatorResult || row.indicatorResult === 0)
652
- ? '%'
653
- : ''
654
- }}
655
- </div>
656
-
657
- <div v-if="row.sourceType == 3 && row.itemType === 21">
658
- {{
659
- row.value || row.value === 0
660
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
661
- : ''
662
- }}
663
- {{
664
- row.displayStyle === 1 && (row.value || row.value === 0)
665
- ? '%'
666
- : ''
667
- }}
668
- </div>
669
-
670
- <div
671
- v-else-if="row.itemType === 22 && row.optionList?.length"
672
- >
673
- {{
674
- row.value && row.value.scoreText
675
- ? row.value.scoreText
676
- : '--'
677
- }}
678
- </div>
679
-
680
- <div
681
- v-if="
682
- row.modifyRank == 2 &&
683
- row.indicatorResult !== '' &&
684
- row.indicatorResult !== null
685
- "
686
- >
687
- <template v-if="row.itemType === 21">
688
- <!-- displayStyle 是否百分比展示 -->
689
- {{
690
- row.value || row.value === 0
691
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
692
- : ''
693
- }}
694
- {{
695
- row.displayStyle === 1 &&
696
- (row.value || row.value === 0)
697
- ? '%'
698
- : ''
699
- }}
700
- </template>
701
-
702
- <template
703
- v-else-if="
704
- row.itemType === 22 && row.optionList?.length
705
- "
706
- >
707
- {{
708
- row.value && row.value.scoreText
709
- ? row.value.scoreText
710
- : '--'
711
- }}
712
- </template>
713
- </div>
714
- </el-tooltip>
715
- </template>
716
- </vxe-column>
717
- <vxe-column
718
- slot="value"
719
- slot-scope="{ column }"
720
- v-bind="{ ...column, field: column.prop, title: column.label }"
721
- >
722
- <template slot-scope="{ row }">
723
- <div>
724
- {{
725
- row.valueScore || row.valueScore === 0
726
- ? row.valueScore
727
- : '--'
728
- }}
729
- </div>
730
- </template>
731
- </vxe-column>
732
- <vxe-column
733
- slot="result"
734
- slot-scope="{ column }"
735
- v-bind="{ ...column, field: column.prop, title: column.label }"
736
- >
737
- <template slot-scope="{ row }">
738
- <div>
739
- {{
740
- row.result || row.result === 0
741
- ? row.result.toFixed(modelData.digits)
742
- : ''
743
- }}
744
- </div>
745
- </template>
746
- </vxe-column>
747
- <vxe-column
748
- slot="modifyRank"
749
- slot-scope="{ column }"
750
- v-bind="{ ...column, field: column.prop, title: column.label }"
751
- v-if="
752
- !item.tableData.every(
753
- el => !el.modifyRank || el.modifyRank === 0
754
- )
755
- "
756
- >
757
- <template slot-scope="{ row }">
758
- {{ row.modifyRank === 1 ? '指标得分' : row.modifyRank === 2 ? '指标值' : '不调整' }}
759
- </template>
760
- </vxe-column>
761
- <vxe-column
762
- slot="modifiedVal"
763
- slot-scope="{ column }"
764
- v-bind="{ ...column, field: column.prop, title: column.label }"
765
- v-if="
766
- !item.tableData.every(
767
- el => !el.modifyRank || el.modifyRank === 0
768
- )
769
- "
770
- >
771
- <template slot-scope="{ row }">
772
- <span>
773
- {{
774
- row.modifyRank === 2
775
- ? row.displayStyle === 1
776
- ? Number.parseFloat(
777
- N.subFixed(
778
- row.modifiedVal / 100,
779
- this.modelData.digits
780
- )
781
- ) + '%'
782
- : row.modifiedVal
783
- : '--'
784
- }}
785
- </span>
786
- </template>
787
- </vxe-column>
788
- <vxe-column
789
- slot="modifiedResult"
790
- slot-scope="{ column }"
791
- v-bind="{ ...column, field: column.prop, title: column.label }"
792
- v-if="
793
- !item.tableData.every(
794
- el => !el.modifyRank || el.modifyRank === 0
795
- )
796
- "
797
- >
798
- <template slot-scope="{ row }">
799
- <div>
800
- {{
801
- row.result || row.result === 0
802
- ? Number(row.modifiedResult).toFixed(modelData.digits)
803
- : '--'
804
- }}
805
- </div>
806
- </template>
807
- </vxe-column>
808
- </table-pro>
809
- </div>
810
- </div>
811
-
812
- <!-- 统计模型 (暂不考虑子模型的情况) -->
813
- <div
814
- v-else-if="item._subModelKind === 'stat'"
815
- :key="'statisticsArray' + index"
816
- class="m-t-m"
817
- >
818
- <div v-if="modelData.type !== 3">
819
- 子模型【统计模型--{{
820
- item.sataMode === 1 ? '表模式' : '计算模式'
821
- }}】--{{ item.name }}--模型指标
822
- </div>
823
- <div class="m-t-s">
824
- <table-pro
825
- border
826
- :columns="tabelHeadersStatistics"
827
- :data="item.tableData"
828
- :merge-cells="mergeCells(item.tableData, tabelHeadersStatistics)"
829
- :scrollY="{
830
- enabled: false
831
- }"
832
- :cellDefault="false"
833
- :showSetsize="false"
834
- :small="{
835
- border: true,
836
- size: 'small',
837
- stripe: false
838
- }"
839
- >
840
- <vxe-column
841
- slot-scope="{ column }"
842
- v-bind="{ ...column, field: column.prop, title: column.label }"
843
- ></vxe-column>
844
- <vxe-column
845
- slot="indicatorResult"
846
- slot-scope="{ column }"
847
- v-bind="{ ...column, field: column.prop, title: column.label }"
848
- >
849
- <template slot-scope="{ row }">
850
- <div v-if="row.rankType === 9">--</div>
851
- <el-tooltip
852
- v-if="row.rankType !== 9"
853
- class="item"
854
- effect="dark"
855
- :disabled="!row.displayFormula"
856
- >
857
- <div slot="content">
858
- {{ row.displayFormula }}:
859
- <br/>
860
- {{ row.relFormula }}
861
- </div>
862
- <div v-if="row.sourceType === 5 && row.showValueType === 1">
863
- {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
864
- </div>
865
- <div
866
- v-else-if="
867
- row.sourceType !== 3 &&
868
- (!row?.optionList || row?.optionList?.length == 0)
869
- "
870
- >
871
- {{ indicatorResultFn(row) }}
872
- {{
873
- row.displayStyle === 1 &&
874
- (row.indicatorResult || row.indicatorResult === 0)
875
- ? '%'
876
- : ''
877
- }}
878
- </div>
879
-
880
- <div v-if="row.sourceType === 3 && row.itemType === 21">
881
- {{
882
- row.value || row.value === 0
883
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
884
- : ''
885
- }}
886
- {{
887
- row.displayStyle === 1 && (row.value || row.value === 0)
888
- ? '%'
889
- : ''
890
- }}
891
- </div>
892
-
893
- <div
894
- v-else-if="row.itemType === 22 && row.optionList?.length"
895
- >
896
- {{
897
- row.value && row.value.scoreText
898
- ? row.value.scoreText
899
- : '--'
900
- }}
901
- </div>
902
-
903
- <div
904
- v-if="
905
- row.modifyRank == 2 &&
906
- row.indicatorResult !== '' &&
907
- row.indicatorResult !== null
908
- "
909
- >
910
- <template v-if="row.itemType === 21">
911
- <!-- displayStyle 是否百分比展示 -->
912
- {{
913
- row.value || row.value === 0
914
- ? row?.value?.toFixed(digitsCalc(row.showDigits))
915
- : ''
916
- }}
917
- {{
918
- row.displayStyle === 1 &&
919
- (row.value || row.value === 0)
920
- ? '%'
921
- : ''
922
- }}
923
- </template>
924
-
925
- <template
926
- v-else-if="
927
- row.itemType === 22 && row.optionList?.length
928
- "
929
- >
930
- {{
931
- row.value && row.value.scoreText
932
- ? row.value.scoreText
933
- : '--'
934
- }}
935
- </template>
936
- </div>
937
- </el-tooltip>
938
- </template>
939
- </vxe-column>
940
- <vxe-column
941
- slot="value"
942
- slot-scope="{ column }"
943
- v-bind="{ ...column, field: column.prop, title: column.label }"
944
- >
945
- <template slot-scope="{ row }">
946
- <div>
947
- {{
948
- row.valueScore || row.valueScore === 0
949
- ? row.valueScore
950
- : '--'
951
- }}
952
- </div>
953
- </template>
954
- </vxe-column>
955
- <vxe-column
956
- slot="result"
957
- slot-scope="{ column }"
958
- v-bind="{ ...column, field: column.prop, title: column.label }"
959
- >
960
- <template slot-scope="{ row }">
961
- <el-tooltip
962
- class="item"
963
- effect="dark"
964
- :disabled="!row.displayFormula"
965
- >
966
- <div slot="content">
967
- {{ row.displayFormula }}:
968
- <br/>
969
- {{ row.relFormula }}
970
- </div>
971
- <div>
972
- {{
973
- row.result
974
- ? addThousands(
975
- toFixedTrunc(row?.result, modelData.digits)
976
- )
977
- : row.result === 0
978
- ? row.result
979
- : ''
980
- }}
981
- </div>
982
- </el-tooltip>
983
- </template>
984
- </vxe-column>
985
- <vxe-column
986
- slot="modifiedResult"
987
- slot-scope="{ column }"
988
- v-bind="{ ...column, field: column.prop, title: column.label }"
989
- >
990
- <template slot-scope="{ row }">
991
- <div>
992
- {{
993
- row.result || row.result === 0
994
- ? Number(row.modifiedResult).toFixed(modelData.digits)
995
- : ''
996
- }}
997
- </div>
998
- </template>
999
- </vxe-column>
1000
- <vxe-column
1001
- slot="indicatorValText"
1002
- slot-scope="{ column }"
1003
- v-bind="{ ...column, field: column.prop, title: column.label }"
1004
- v-if="!item.tableData.every(
1005
- el => !el.supplementRuleVOList || item.supplementRuleVOList.length === 0
1006
- )">
1007
- <template slot-scope="{ row }">
1008
- <div>
1009
- {{row.indicatorValText || '--' }}
1010
- </div>
1011
- </template>
1012
- </vxe-column>
1013
- </table-pro>
1014
- </div>
1015
- </div>
1016
- </template>
1017
- </div>
1018
- </expandable-pane>
1019
- </Page>
1020
- </template>
1021
- <script>
1022
- import {
1023
- setMergeCells,
1024
- toFixedTrunc,
1025
- addThousands,
1026
- formatFloat2
1027
- } from '../common'
1028
- import {N, Page, ExpandablePane, Descriptions, TablePro} from 'n20-common-lib'
1029
- import {printJS} from 'n20-common-lib/src/plugins/Print'
1030
-
1031
- /**
1032
- * 关键参数说明 sourceType
1033
- * 0 系统自定义
1034
- * 1 报表取数
1035
- * 2 指标取数
1036
- * 3 手工填报
1037
- * 4 标准值取数
1038
- * 5 系统取值
1039
- * 6 系统取数
1040
- *
1041
- * rankType
1042
- * 0 取指标值
1043
- * 1 分段模糊化打分
1044
- * 2 公式模糊化打分
1045
- * 3 分段模糊化公式打分
1046
- * 4 企业绩效评估标准打分
1047
- * 5 评价等级化取值
1048
- * 6 分段模糊化取值
1049
- * 7 特殊化打分
1050
- * 8 标准值打分
1051
- * 9 统计项运算
1052
- * 10 手工录入
1053
- * 11 分段取值
1054
- *
1055
- * 调整项
1056
- * modifyRank
1057
- * 0 不调整
1058
- * 2 指标值
1059
- * 1 指标得分
1060
- *
1061
- * 模型指标类型
1062
- * itemType
1063
- * 11 计算模型
1064
- * 12 评价模型
1065
- * 13 统计模型
1066
- * 21 可量化指标
1067
- * 22 不可量化指标
1068
- */
1069
- export default {
1070
- name: 'calculateDetail',
1071
- props: {
1072
- showModelInfo: {
1073
- type: Boolean,
1074
- default: true
1075
- },
1076
- modelId: String,
1077
- logId: String
1078
- },
1079
- watch: {
1080
- logId: {
1081
- handler(value) {
1082
- if (value) {
1083
- this.init()
1084
- }
1085
- },
1086
- immediate: true
1087
- }
1088
- },
1089
- components: {Page, ExpandablePane, Descriptions, TablePro},
1090
- data() {
1091
- return {
1092
- // 拆分数结构为三类数据
1093
- typeObj: {
1094
- // 指标数组
1095
- targetArray: [],
1096
- // 统计模型数组
1097
- statisticsArray: [],
1098
- // 计算模型数组
1099
- evalModelArray: [],
1100
- // 评价模型数组
1101
- assessModelArray: [],
1102
- // 子模型按模型树文件夹顺序(定量→定性→调整项)展开
1103
- orderedSubModels: []
1104
- },
1105
- tabelHeadersAssessModel: [
1106
- {
1107
- label: '分组',
1108
- prop: 'pName',
1109
- align: 'center',
1110
- minWidth: 150,
1111
- 'show-overflow-tooltip': true
1112
- },
1113
- {
1114
- label: '序号',
1115
- prop: 'serialNumber',
1116
- align: 'center',
1117
- minWidth: 100,
1118
- 'show-overflow-tooltip': true
1119
- },
1120
- {
1121
- label: '指标名称',
1122
- prop: 'name',
1123
- align: 'center',
1124
- minWidth: 150,
1125
- 'show-overflow-tooltip': true
1126
- },
1127
- {
1128
- label: '指标编号',
1129
- prop: 'code',
1130
- align: 'center',
1131
- minWidth: 150,
1132
- 'show-overflow-tooltip': true
1133
- },
1134
- {
1135
- label: '占模型权重(%)',
1136
- prop: 'weight',
1137
- align: 'center',
1138
- minWidth: 150,
1139
- formatter: 'formatRate',
1140
- 'show-overflow-tooltip': true
1141
- },
1142
- {
1143
- label: '指标满分值',
1144
- prop: 'fullScore',
1145
- align: 'center',
1146
- minWidth: 150,
1147
- formatter: 'formatRate',
1148
- 'show-overflow-tooltip': true
1149
- },
1150
- {
1151
- label: '指标调整项',
1152
- prop: 'modifyRank',
1153
- slotName: 'modifyRank',
1154
- align: 'center',
1155
- minWidth: 100,
1156
- 'show-overflow-tooltip': true,
1157
- formatter: [
1158
- 'formatSelect',
1159
- [
1160
- {label: '不调整', value: 0},
1161
- {
1162
- label: '指标得分',
1163
- value: 1
1164
- },
1165
- {label: '指标值', value: 2}
1166
- ]
1167
- ]
1168
- },
1169
- {
1170
- label: '指标值',
1171
- prop: 'indicatorResult',
1172
- slotName: 'indicatorResult',
1173
- align: 'center',
1174
- minWidth: 150,
1175
- 'show-overflow-tooltip': false
1176
- },
1177
- {
1178
- label: '调整后指标值',
1179
- prop: 'modifiedVal',
1180
- slotName: 'modifiedVal',
1181
- align: 'center',
1182
- minWidth: 150,
1183
- 'show-overflow-tooltip': true,
1184
- type: 'html',
1185
- formatter: ({cellValue, row}) => {
1186
- return `<span>${
1187
- row.modifyRank === 2
1188
- ? row.displayStyle === 1
1189
- ? formatFloat2(cellValue / 100, this.modelData.digits) + '%'
1190
- : cellValue
1191
- : '--'
1192
- }</span>`
1193
- }
1194
- },
1195
- {
1196
- label: '指标得分',
1197
- prop: 'value',
1198
- slotName: 'value',
1199
- align: 'center',
1200
- minWidth: 150,
1201
- 'show-overflow-tooltip': false
1202
- },
1203
- {
1204
- label: '模型指标得分',
1205
- prop: 'result',
1206
- slotName: 'result',
1207
- align: 'center',
1208
- minWidth: 150,
1209
- 'show-overflow-tooltip': false
1210
- },
1211
- {
1212
- label: '调整后模型指标得分',
1213
- prop: 'modifiedResult',
1214
- slotName: 'modifiedResult',
1215
- align: 'center',
1216
- minWidth: 150,
1217
- 'show-overflow-tooltip': false
1218
- }
1219
- ],
1220
- tabelHeadersEvalModel: [
1221
- {
1222
- label: '分组',
1223
- prop: 'pName',
1224
- align: 'center',
1225
- minWidth: 150,
1226
- 'show-overflow-tooltip': true
1227
- },
1228
- {
1229
- label: '序号',
1230
- prop: 'serialNumber',
1231
- align: 'center',
1232
- minWidth: 100,
1233
- 'show-overflow-tooltip': true
1234
- },
1235
- {
1236
- label: '指标名称',
1237
- prop: 'name',
1238
- align: 'center',
1239
- minWidth: 150,
1240
- 'show-overflow-tooltip': true
1241
- },
1242
- {
1243
- label: '指标编号',
1244
- prop: 'code',
1245
- align: 'center',
1246
- minWidth: 150,
1247
- 'show-overflow-tooltip': true
1248
- },
1249
- {
1250
- label: '模型指标系数名称',
1251
- prop: 'ratioName',
1252
- align: 'center',
1253
- minWidth: 150,
1254
- 'show-overflow-tooltip': false
1255
- },
1256
- {
1257
- label: '指标调整项',
1258
- prop: 'modifyRank',
1259
- slotName: 'modifyRank',
1260
- align: 'center',
1261
- minWidth: 100,
1262
- 'show-overflow-tooltip': true,
1263
- formatter: [
1264
- 'formatSelect',
1265
- [
1266
- {label: '不调整', value: 0},
1267
- {
1268
- label: '指标得分',
1269
- value: 1
1270
- },
1271
- {label: '指标值', value: 2}
1272
- ]
1273
- ]
1274
- },
1275
- {
1276
- label: '指标值',
1277
- prop: 'indicatorResult',
1278
- slotName: 'indicatorResult',
1279
- align: 'center',
1280
- minWidth: 150,
1281
- 'show-overflow-tooltip': false
1282
- },
1283
- {
1284
- label: '调整后指标值',
1285
- prop: 'modifiedVal',
1286
- slotName: 'modifiedVal',
1287
- align: 'center',
1288
- minWidth: 150,
1289
- 'show-overflow-tooltip': true,
1290
- type: 'html',
1291
- formatter: ({cellValue, row}) => {
1292
- return `<span>${
1293
- row.modifyRank === 2
1294
- ? row.displayStyle === 1
1295
- ? formatFloat2(cellValue / 100, this.modelData.digits) + '%'
1296
- : cellValue
1297
- : '--'
1298
- }</span>`
1299
- }
1300
- },
1301
- {
1302
- label: '模型指标取值结果',
1303
- prop: 'result',
1304
- slotName: 'result',
1305
- align: 'center',
1306
- minWidth: 150,
1307
- 'show-overflow-tooltip': false
1308
- }
1309
- ],
1310
- tabelHeadersStatistics: [
1311
- {
1312
- label: '指标项',
1313
- prop: 'pName',
1314
- align: 'center',
1315
- minWidth: 150,
1316
- 'show-overflow-tooltip': true
1317
- },
1318
- {
1319
- label: '统计项名称',
1320
- prop: 'statsName',
1321
- align: 'center',
1322
- minWidth: 150,
1323
- 'show-overflow-tooltip': true
1324
- },
1325
- {
1326
- label: '指标名称',
1327
- prop: 'name',
1328
- align: 'center',
1329
- minWidth: 150,
1330
- 'show-overflow-tooltip': true
1331
- },
1332
- {
1333
- label: '指标编号',
1334
- prop: 'code',
1335
- align: 'center',
1336
- minWidth: 150,
1337
- 'show-overflow-tooltip': true
1338
- },
1339
- {
1340
- label: '指标满分值',
1341
- prop: 'fullScore',
1342
- align: 'center',
1343
- minWidth: 150,
1344
- 'show-overflow-tooltip': true
1345
- },
1346
- {
1347
- label: '指标值',
1348
- prop: 'indicatorResult',
1349
- slotName: 'indicatorResult',
1350
- align: 'center',
1351
- minWidth: 250,
1352
- 'show-overflow-tooltip': false
1353
- },
1354
- {
1355
- label: '指标值显示',
1356
- prop: 'indicatorValText',
1357
- slotName: 'indicatorValText',
1358
- align: 'center',
1359
- minWidth: 150,
1360
- 'show-overflow-tooltip': false
1361
- },
1362
- {
1363
- label: '统计结果',
1364
- prop: 'result',
1365
- slotName: 'result',
1366
- align: 'center',
1367
- minWidth: 150,
1368
- 'show-overflow-tooltip': false
1369
- }
1370
- ],
1371
- modelData: {},
1372
- model: {}
1373
- }
1374
- },
1375
- computed: {
1376
- tabelHeadersTarget() {
1377
- if (this.modelData.type === 1) {
1378
- return this.tabelHeadersAssessModel
1379
- } else if (this.modelData.type === 2) {
1380
- return this.tabelHeadersEvalModel
1381
- } else if (this.modelData.type === 3) {
1382
- return this.tabelHeadersStatistics
1383
- } else {
1384
- return []
1385
- }
1386
- }
1387
- },
1388
- methods: {
1389
- toFixedTrunc,
1390
- addThousands,
1391
- N_add(a, b, w) {
1392
- return N.add(a, b, w)
1393
- },
1394
- N_mul(a, b, w) {
1395
- return N.mul(a, b, w)
1396
- },
1397
- N_div(a, b, w) {
1398
- return N.div(a, b, w)
1399
- },
1400
- async init() {
1401
- await this.getModelById()
1402
- if (this.model.showLevel !== 1) {
1403
- this.tabelHeadersAssessModel = this.tabelHeadersAssessModel.filter(
1404
- item => item.prop !== 'serialNumber'
1405
- )
1406
- this.tabelHeadersEvalModel = this.tabelHeadersEvalModel.filter(
1407
- item => item.prop !== 'serialNumber'
1408
- )
1409
- }
1410
- if (this.model.type === 1 && this.model.showWeight !== 1) {
1411
- this.tabelHeadersAssessModel = this.tabelHeadersAssessModel.filter(
1412
- item => item.prop !== 'weight'
1413
- )
1414
- }
1415
- switch (this.model.type) {
1416
- case 1:
1417
- case 2:
1418
- if (this.model.code) {
1419
- this.processingData(this.model, 'targetArray')
1420
- await this.queryCalcResultDetail()
1421
- this.processingData(this.modelData)
1422
- this.alignSubModelsWithTargetOrder()
1423
- this.comFn(this.modelData)
1424
- }
1425
- break
1426
- case 3:
1427
- await this.queryCalcResultDetail()
1428
- this.recursionFn([this.modelData.modelTreeVO])
1429
- const modelTreeVO = JSON.parse(
1430
- JSON.stringify(this.modelData.modelTreeVO)
1431
- )
1432
- modelTreeVO.itemID = modelTreeVO.modelID
1433
- modelTreeVO.tableData = []
1434
- modelTreeVO.children = []
1435
- const statRow = {...modelTreeVO, _subModelKind: 'stat'}
1436
- this.typeObj.statisticsArray.push(statRow)
1437
- this.typeObj.orderedSubModels.push(statRow)
1438
- this.comFn(this.modelData)
1439
- let showFullScore = 0
1440
- let showIndicatorValText = 0
1441
- this.typeObj.statisticsArray.forEach(item => {
1442
- console.log(JSON.stringify(item))
1443
- if (item.fullScore) {
1444
- showFullScore = 1
1445
- }
1446
- if (
1447
- item.supplementRuleVOList &&
1448
- item.supplementRuleVOList.length > 0
1449
- ) {
1450
- showIndicatorValText = 1
1451
- }
1452
- })
1453
- if (showFullScore !== 1) {
1454
- this.tabelHeadersStatistics = this.tabelHeadersStatistics.filter(
1455
- item => item.prop !== 'fullScore'
1456
- )
1457
- }
1458
- if (showIndicatorValText !== 1) {
1459
- this.tabelHeadersStatistics = this.tabelHeadersStatistics.filter(
1460
- item => item.prop !== 'indicatorValText'
1461
- )
1462
- }
1463
- break
1464
- default:
1465
- break
1466
- }
1467
- },
1468
- async getModelById() {
1469
- if (!this.modelId) {
1470
- this.$message.warning('modelId不能为空')
1471
- return
1472
- }
1473
- const {code, data} = await this.$axios.post(
1474
- '/imes/v1/indicatorModel/getModelById',
1475
- {
1476
- id: this.modelId
1477
- }
1478
- )
1479
- if (code === 0) {
1480
- this.model = data || {}
1481
- }
1482
- },
1483
- async queryCalcResultDetail() {
1484
- const {code, data} = await this.$axios.post(
1485
- '/imes/v2/models/queryCalcResultDetail',
1486
- {id: this.logId}
1487
- )
1488
- if (code == 0) {
1489
- this.modelData = data
1490
- }
1491
- },
1492
- /** 统计模型专用 处理叶子节点为2 */
1493
- recursionFn(arr) {
1494
- if (arr.length === 0) return arr
1495
- arr.forEach(item => {
1496
- item.label = item.name
1497
- if (item.isLeaf === 2) {
1498
- this.$set(
1499
- item,
1500
- 'indicatorDeepList',
1501
- item.children.map(item2 => {
1502
- return {...item2, label: item.name}
1503
- })
1504
- )
1505
- item.children = []
1506
- } else {
1507
- if (item.children?.length) {
1508
- this.recursionFn(item.children)
1509
- }
1510
- }
1511
- })
1512
- },
1513
- /** 页面渲染函数 */
1514
- comFn(data) {
1515
- const modelTreeVO = data.modelTreeVO
1516
- this.typeObj.statisticsArray.forEach(statistics => {
1517
- this.$set(statistics, 'children', [])
1518
- this.$set(statistics, 'tableData', [])
1519
- return statistics
1520
- })
1521
- this.typeObj.evalModelArray.forEach(evalModel => {
1522
- this.$set(evalModel, 'children', [])
1523
- this.$set(evalModel, 'tableData', [])
1524
- return evalModel
1525
- })
1526
- this.typeObj.assessModelArray.forEach(evalModel => {
1527
- this.$set(evalModel, 'children', [])
1528
- this.$set(evalModel, 'tableData', [])
1529
- return evalModel
1530
- })
1531
- const digui = data => {
1532
- if (data.children && data.children.length > 0) {
1533
- data.children.map(async item => {
1534
- // 统计模型 找到先关模型下面的指标项
1535
- if (item.isLeaf == 2) {
1536
- if (this.modelData.type == 3) {
1537
- this.typeObj.statisticsArray.forEach(async statistics => {
1538
- if (statistics.itemID == item.modelID) {
1539
- statistics.children.push(item)
1540
- if (
1541
- item.indicatorDeepList &&
1542
- item.indicatorDeepList.length &&
1543
- item.indicatorDeepList.length > 0
1544
- ) {
1545
- const promiseAll = item.indicatorDeepList.map(
1546
- async itemc => this.itemDataFn(itemc, data)
1547
- )
1548
- const objArr = await Promise.all(promiseAll)
1549
- objArr.map(obj => {
1550
- statistics.tableData.push({
1551
- ...obj,
1552
- pName: item.folderName || item.name
1553
- })
1554
- })
1555
- }
1556
- }
1557
- return statistics
1558
- })
1559
- } else {
1560
- this.typeObj.statisticsArray.forEach(async statistics => {
1561
- if (statistics.itemID == item.modelID) {
1562
- statistics.children.push(item)
1563
- if (
1564
- item.children &&
1565
- item.children.length &&
1566
- item.children.length > 0
1567
- ) {
1568
- const promiseAll = item.children.map(async itemc =>
1569
- this.itemDataFn(itemc, data)
1570
- )
1571
- const objArr = await Promise.all(promiseAll)
1572
- objArr.map(obj => {
1573
- statistics.tableData.push({
1574
- ...obj,
1575
- pName: item.folderName || item.name
1576
- })
1577
- })
1578
- }
1579
- }
1580
- return statistics
1581
- })
1582
- }
1583
- }
1584
- // 计算/评价模型
1585
- if (item.isLeaf == 0) {
1586
- this.typeObj.evalModelArray.forEach(async evalModel => {
1587
- if (evalModel.itemID == item.modelID) {
1588
- evalModel.children.push(item)
1589
- if (
1590
- item.children &&
1591
- item.children.length &&
1592
- item.children.length > 0
1593
- ) {
1594
- const promiseAll = item.children.map(async itemc =>
1595
- this.itemDataFn(itemc, data)
1596
- )
1597
- const objArr = await Promise.all(promiseAll)
1598
- objArr.map(obj => {
1599
- evalModel.tableData.push({
1600
- ...obj,
1601
- pName: item.folderName || item.name
1602
- })
1603
- })
1604
- }
1605
- }
1606
- return evalModel
1607
- })
1608
- this.typeObj.assessModelArray.forEach(async assessModel => {
1609
- if (assessModel.itemID == item.modelID) {
1610
- assessModel.result = item.result
1611
- assessModel.resultText = item.resultText
1612
- assessModel.showDigits = item.showDigits
1613
- assessModel.children.push(item)
1614
- if (
1615
- item.children &&
1616
- item.children.length &&
1617
- item.children.length > 0
1618
- ) {
1619
- const promiseAll = item.children.map(async itemc =>
1620
- this.itemDataFn(itemc, data)
1621
- )
1622
- const objArr = await Promise.all(promiseAll)
1623
- objArr.map(obj => {
1624
- assessModel.tableData.push({
1625
- ...obj,
1626
- pName: item.folderName || item.name
1627
- })
1628
- })
1629
- }
1630
- }
1631
- return assessModel
1632
- })
1633
- }
1634
- // 指标
1635
- if (item.isLeaf == 1) {
1636
- this.typeObj.targetArray.forEach(itemc => {
1637
- if (itemc.itemID === item.itemID && itemc.tid === item.tid) {
1638
- itemc.result = item.result
1639
- itemc.indicatorResult = item.indicatorResult
1640
- itemc.relFormula = item.relFormula
1641
- itemc.displayFormula = item.displayFormula
1642
- itemc.serialNumber = item.serialNumber
1643
- itemc.fieldValue = item.fieldValue
1644
- this.itemDataFn(itemc, data)
1645
- }
1646
-
1647
- return itemc
1648
- })
1649
- }
1650
- digui(item)
1651
- })
1652
- }
1653
- }
1654
-
1655
- digui(modelTreeVO)
1656
- },
1657
-
1658
- /** 给指标值赋值 */
1659
- async itemDataFn(item, data, len) {
1660
- let value
1661
- let valueScore
1662
- if (item.sourceType == 3) {
1663
- value = item.indicatorResult
1664
- } else {
1665
- // 指标项取值方式
1666
- switch (item.rankType) {
1667
- // 手工录入
1668
- case 10:
1669
- value = item.formula
1670
- break
1671
- // 统计项运算
1672
- case 9:
1673
- value = item.result
1674
- break
1675
- default:
1676
- value = item.indicatorResult
1677
- break
1678
- }
1679
- }
1680
- // 不可量化指标 查询选项
1681
- if (item.itemType == 22) {
1682
- item.optionList = []
1683
- // 获取当前时间戳
1684
- const timestamp = Date.now()
1685
- // 生成一个随机数
1686
- const randomNum = Math.floor(Math.random() * 1000000) // 这里生成一个 0 到 999999 之间的整数
1687
- // 组合时间戳和随机数
1688
- const randomNumStr = `${timestamp}${randomNum}`
1689
- const {code, data: optionList} = await this.$axios.post(
1690
- `/imes/v1/indicator/getScoreMap?randomNumStr=${randomNumStr}`,
1691
- {id: item.itemID}
1692
- )
1693
- if (code == 0) {
1694
- item.optionList = optionList
1695
- if (item?.optionList?.length > 0) {
1696
- value = item.optionList.find(
1697
- item2 => item2.scoreValue == item.indicatorResult
1698
- )
1699
- }
1700
- }
1701
- }
1702
- if (item.weight) {
1703
- valueScore =
1704
- item.result || item.result === 0
1705
- ? this.N_div(
1706
- this.N_mul(
1707
- item.result,
1708
- 100,
1709
- this.digitsCalc(item.showDigits) + 2
1710
- ),
1711
- item.weight,
1712
- this.digitsCalc(item.showDigits)
1713
- )
1714
- : ''
1715
- } else {
1716
- valueScore = ''
1717
- }
1718
- item.value = value
1719
- item.valueScore = valueScore
1720
- item.pName = data.serialNumber
1721
- ? `${data.serialNumber}. ${data.name}`
1722
- : data.name
1723
- return item
1724
- },
1725
- // 指标table :isLeaf =1 itemType = [21,22]
1726
- // 统计模型table : isLeaf=2 itemType = 13
1727
- // 计算模型table : isLeaf=0 itemType = 11
1728
- // 评价模型table: isLeaf=0 itemType = 12
1729
- /** 子模型展开顺序与主表指标(定量→定性→调整项)保持一致 */
1730
- alignSubModelsWithTargetOrder() {
1731
- const orderIds = this.typeObj.targetArray
1732
- .filter(i => [11, 12, 13].includes(Number(i.itemType)))
1733
- .map(i => i.itemID)
1734
- if (!orderIds.length || !this.typeObj.orderedSubModels.length) {
1735
- return
1736
- }
1737
- this.typeObj.orderedSubModels.sort((a, b) => {
1738
- const ia = orderIds.indexOf(a.itemID)
1739
- const ib = orderIds.indexOf(b.itemID)
1740
- return (ia < 0 ? Number.MAX_SAFE_INTEGER : ia) -
1741
- (ib < 0 ? Number.MAX_SAFE_INTEGER : ib)
1742
- })
1743
- },
1744
- processingData(modelData, type) {
1745
- const modelTreeVO = JSON.parse(JSON.stringify(modelData.modelTreeVO))
1746
- const digui = data => {
1747
- if (data.children && data.children.length > 0) {
1748
- data.children.map(async item => {
1749
- if (item.isLeaf === 1) {
1750
- switch (item.itemType) {
1751
- // 可量化指标
1752
- case 21: {
1753
- if (type === 'targetArray') {
1754
- this.typeObj.targetArray.push({})
1755
- this.$set(
1756
- this.typeObj.targetArray,
1757
- this.typeObj.targetArray.length - 1,
1758
- await this.itemDataFn(item, data)
1759
- )
1760
- }
1761
- }
1762
- break
1763
- // 不可量化指标
1764
- case 22: {
1765
- if (type === 'targetArray') {
1766
- item.optionList = []
1767
- this.typeObj.targetArray.push({})
1768
- this.$set(
1769
- this.typeObj.targetArray,
1770
- this.typeObj.targetArray.length - 1,
1771
- await this.itemDataFn(item, data)
1772
- )
1773
- }
1774
- }
1775
- break
1776
- // 计算模型
1777
- case 11: {
1778
- if (type === 'targetArray') {
1779
- this.typeObj.targetArray.push({})
1780
- this.$set(
1781
- this.typeObj.targetArray,
1782
- this.typeObj.targetArray.length - 1,
1783
- await this.itemDataFn(item, data)
1784
- )
1785
- } else {
1786
- item.children = []
1787
- item.tableData = []
1788
- const row = {...item, _subModelKind: 'eval'}
1789
- this.typeObj.evalModelArray.push(row)
1790
- this.typeObj.orderedSubModels.push(row)
1791
- }
1792
- }
1793
- break
1794
- // 评价模型
1795
- case 12: {
1796
- if (type === 'targetArray') {
1797
- this.typeObj.targetArray.push({})
1798
- this.$set(
1799
- this.typeObj.targetArray,
1800
- this.typeObj.targetArray.length - 1,
1801
- await this.itemDataFn(item, data)
1802
- )
1803
- } else {
1804
- item.children = []
1805
- item.tableData = []
1806
- const row = {...item, _subModelKind: 'assess'}
1807
- this.typeObj.assessModelArray.push(row)
1808
- this.typeObj.orderedSubModels.push(row)
1809
- }
1810
- }
1811
-
1812
- break
1813
- // 统计模型
1814
- case 13: {
1815
- if (type === 'targetArray') {
1816
- this.typeObj.targetArray.push({})
1817
- this.$set(
1818
- this.typeObj.targetArray,
1819
- this.typeObj.targetArray.length - 1,
1820
- await this.itemDataFn(item, data)
1821
- )
1822
- } else {
1823
- item.children = []
1824
- item.tableData = []
1825
- const row = {...item, _subModelKind: 'stat'}
1826
- this.typeObj.statisticsArray.push(row)
1827
- this.typeObj.orderedSubModels.push(row)
1828
- }
1829
- // this.typeObj.targetArray[this.typeObj.targetArray.length - 1] = await this.itemDataFn(item, data)
1830
- }
1831
- break
1832
- default:
1833
- break
1834
- }
1835
- } else if (item.isLeaf === 0) {
1836
- digui(item)
1837
- }
1838
- })
1839
- }
1840
- }
1841
- digui(modelTreeVO)
1842
- },
1843
- /** 统计模型表头合并 */
1844
- mergeCells(table, columns) {
1845
- const arr1 = setMergeCells({
1846
- list: table,
1847
- columns: columns,
1848
- merges: ['pName'],
1849
- condition: ['pid'],
1850
- field: 'prop'
1851
- })
1852
- return [...arr1]
1853
- },
1854
- digitsCalc(showDigits) {
1855
- if (showDigits || showDigits === 0) {
1856
- return showDigits
1857
- } else {
1858
- return this.modelData.digits
1859
- }
1860
- },
1861
- indicatorResultFn(row) {
1862
- let indicatorResult = ''
1863
- if (row.indicatorResult || row.indicatorResult === 0) {
1864
- indicatorResult = Number(row.indicatorResult).toFixed(
1865
- this.digitsCalc(row.showDigits)
1866
- )
1867
- }
1868
- return indicatorResult
1869
- },
1870
- async printFn() {
1871
- const res = await this.$axios.post('/imes/v1/indicatorModel/print', [
1872
- {logId: this.logId, modelId: this.modelId}
1873
- ])
1874
- printJS({
1875
- printable: res.data,
1876
- type: 'pdf',
1877
- base64: true
1878
- })
1879
- }
1880
- }
1881
- }
1882
- </script>
1883
-
1884
- <style scoped lang="less">
1885
- .el-form-item {
1886
- margin-bottom: 0;
1887
- }
1888
- </style>
1
+ <template>
2
+ <Page>
3
+ <expandable-pane title="模型信息">
4
+ <div class="flex-box flex-lr m-b-s">
5
+ <div></div>
6
+ <div>
7
+ <el-button type="primary" size="mini" @click="printFn">
8
+ 打印
9
+ </el-button>
10
+ </div>
11
+ </div>
12
+ <descriptions>
13
+ <el-descriptions-item label="模型类型">
14
+ <span v-if="modelData.type === 1">评价模型</span>
15
+ <span v-else-if="modelData.type === 2">计算模型</span>
16
+ <span v-else-if="modelData.type === 3">统计模型</span>
17
+ <span v-else>--</span>
18
+ </el-descriptions-item>
19
+ <el-descriptions-item label="模型编号">
20
+ {{ modelData.code }}
21
+ </el-descriptions-item>
22
+ <el-descriptions-item label="模型名称">
23
+ {{ modelData.name }}
24
+ </el-descriptions-item>
25
+ <el-descriptions-item label="模型版本">
26
+ 版本{{ modelData.version }}
27
+ </el-descriptions-item>
28
+ <el-descriptions-item label="应用业务">
29
+ {{
30
+ modelData.businessCodeVOS
31
+ ? modelData?.businessCodeVOS?.map(item => item.name).join(',')
32
+ : '--'
33
+ }}
34
+ </el-descriptions-item>
35
+ <el-descriptions-item label="统计模式" v-if="modelData.type === 3">
36
+ {{ modelData.sataMode === 1 ? '表模式' : '计算模式' }}
37
+ </el-descriptions-item>
38
+ <el-descriptions-item
39
+ label="是否展示指标权重"
40
+ v-if="modelData.type === 1"
41
+ >
42
+ {{ modelData.showWeight ? '是' : '否' }}
43
+ </el-descriptions-item>
44
+ <el-descriptions-item
45
+ label="同一指标项目是否横向展示"
46
+ v-if="modelData.type === 1"
47
+ >
48
+ {{ modelData.acrossShow ? '是' : '否' }}
49
+ </el-descriptions-item>
50
+ <el-descriptions-item
51
+ label="业务系统显示格式"
52
+ v-if="modelData.type === 2"
53
+ >
54
+ <span v-if="modelData.showStyle === 1">数值格式</span>
55
+ <span v-else-if="modelData.showStyle === 2">货币格式</span>
56
+ <span v-else>--</span>
57
+ </el-descriptions-item>
58
+ <el-descriptions-item label="负责人">
59
+ <div
60
+ class="text-ellipsis"
61
+ show-overflow-tooltip="true"
62
+ v-title="
63
+ modelData?.modelRoleList?.map(item => item.roleName).join(',')
64
+ "
65
+ >
66
+ {{
67
+ modelData.modelRoleList && modelData.modelRoleList.length > 0
68
+ ? modelData?.modelRoleList?.map(item => item.roleName).join(',')
69
+ : '--'
70
+ }}
71
+ </div>
72
+ </el-descriptions-item>
73
+ <el-descriptions-item label="备注">
74
+ {{ modelData.remark }}
75
+ </el-descriptions-item>
76
+ </descriptions>
77
+ </expandable-pane>
78
+ <expandable-pane title="模型测算信息">
79
+ <el-form class="label-width-10em" label-width="10em">
80
+ <el-form-item label="客户名称:">
81
+ <span>{{ modelData.memberName }}</span>
82
+ </el-form-item>
83
+ <el-form-item label="客户编号:">
84
+ <span>{{ modelData.memberNo }}</span>
85
+ </el-form-item>
86
+ <el-form-item label="业务基准时间:">
87
+ <span>{{ modelData.useDate }}</span>
88
+ </el-form-item>
89
+ </el-form>
90
+ <template v-if="typeObj.targetArray.length > 0">
91
+ <el-form>
92
+ <el-form-item label="模型:">
93
+ <span>【{{ modelData.name }}】——模型指标</span>
94
+ </el-form-item>
95
+ </el-form>
96
+ </template>
97
+
98
+ <div>
99
+ <el-form
100
+ class="label-width-10em"
101
+ label-width="10em"
102
+ v-if="modelData.sataMode !== 1"
103
+ >
104
+ <el-form-item
105
+ label="模型得分:"
106
+ v-if="
107
+ modelData.type === 1 ||
108
+ (modelData.type === 3 && modelData.sataMode === 2)
109
+ "
110
+ >
111
+ <span>
112
+ {{
113
+ modelData.result || modelData.result === 0
114
+ ? Number(modelData.result).toFixed(modelData.digits)
115
+ : '--'
116
+ }}
117
+ </span>
118
+ </el-form-item>
119
+ <el-form-item label="模型结果:" v-if="modelData.type !== 3">
120
+ <span>{{ modelData.resultText }}</span>
121
+ </el-form-item>
122
+ </el-form>
123
+ <!-- 普通指标 -->
124
+ <div v-if="typeObj.targetArray.length > 0">
125
+ <el-form
126
+ class="label-width-6em"
127
+ label-width="10em"
128
+ v-if="modelData.type === 1"
129
+ >
130
+ <el-form-item label="指标得分结果小计:">
131
+ <span>
132
+ {{
133
+ typeObj.targetArray.reduce(
134
+ (total, item) =>
135
+ N_add(
136
+ item.valueScore ? item.valueScore : 0,
137
+ total,
138
+ modelData.digits
139
+ ),
140
+ 0
141
+ )
142
+ }}
143
+ </span>
144
+ </el-form-item>
145
+ <el-form-item label="模型指标得分小计:">
146
+ <span>
147
+ {{
148
+ typeObj.targetArray.reduce(
149
+ (total, item) =>
150
+ N_add(
151
+ item.modifiedResult ? item.modifiedResult : item.result,
152
+ total,
153
+ modelData.digits
154
+ ),
155
+ 0
156
+ )
157
+ }}
158
+ </span>
159
+ </el-form-item>
160
+ </el-form>
161
+ <table-pro
162
+ border
163
+ :columns="tabelHeadersTarget"
164
+ :data="typeObj.targetArray"
165
+ :merge-cells="mergeCells(typeObj.targetArray, tabelHeadersTarget)"
166
+ :scrollY="{
167
+ enabled: false
168
+ }"
169
+ :cellDefault="false"
170
+ :showSetsize="false"
171
+ :small="{
172
+ border: true,
173
+ size: 'small',
174
+ stripe: false
175
+ }"
176
+ >
177
+ <vxe-column
178
+ slot="indicatorResult"
179
+ slot-scope="{ column }"
180
+ v-bind="{ ...column, field: column.prop, title: column.label }"
181
+ >
182
+ <template slot-scope="{ row }">
183
+ <el-tooltip
184
+ class="item"
185
+ effect="dark"
186
+ :disabled="!row.displayFormula"
187
+ >
188
+ <div slot="content">
189
+ {{ row.displayFormula }}:
190
+ <br/>
191
+ {{ row.relFormula }}
192
+ </div>
193
+ <div v-if="row.sourceType === 5 && row.showValueType === 1">
194
+ {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
195
+ </div>
196
+ <div
197
+ v-else-if="
198
+ row.sourceType !== 3 &&
199
+ (!row?.optionList || row?.optionList?.length == 0)
200
+ "
201
+ >
202
+ {{ indicatorResultFn(row) }}
203
+ {{
204
+ row.displayStyle === 1 &&
205
+ (row.indicatorResult || row.indicatorResult === 0)
206
+ ? '%'
207
+ : ''
208
+ }}
209
+ </div>
210
+
211
+ <div v-if="row.sourceType == 3 && row.itemType === 21">
212
+ {{
213
+ row.value || row.value === 0
214
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
215
+ : ''
216
+ }}
217
+ {{
218
+ row.displayStyle === 1 && (row.value || row.value === 0)
219
+ ? '%'
220
+ : ''
221
+ }}
222
+ </div>
223
+ <div v-if="row.itemType === 22 && row.optionList?.length">
224
+ {{
225
+ row.value && row.value.scoreText
226
+ ? row.value.scoreText
227
+ : '--'
228
+ }}
229
+ </div>
230
+ <div
231
+ v-if="
232
+ row.modifyRank == 2 &&
233
+ row.indicatorResult !== '' &&
234
+ row.indicatorResult !== null
235
+ "
236
+ >
237
+ <template v-if="row.itemType === 21">
238
+ <!-- displayStyle 是否百分比展示 -->
239
+ {{
240
+ row.value || row.value === 0
241
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
242
+ : ''
243
+ }}
244
+ {{
245
+ row.displayStyle === 1 && (row.value || row.value === 0)
246
+ ? '%'
247
+ : ''
248
+ }}
249
+ </template>
250
+
251
+ <template
252
+ v-else-if="row.itemType === 22 && row.optionList?.length"
253
+ >
254
+ {{
255
+ row.value && row.value.scoreText
256
+ ? row.value.scoreText
257
+ : '--'
258
+ }}
259
+ </template>
260
+ </div>
261
+ </el-tooltip>
262
+ </template>
263
+ </vxe-column>
264
+ <vxe-column
265
+ slot="value"
266
+ slot-scope="{ column }"
267
+ v-bind="{ ...column, field: column.prop, title: column.label }"
268
+ >
269
+ <template slot-scope="{ row }">
270
+ <div>
271
+ {{
272
+ row.valueScore || row.valueScore === 0
273
+ ? row.valueScore
274
+ : '--'
275
+ }}
276
+ </div>
277
+ </template>
278
+ </vxe-column>
279
+ <vxe-column
280
+ slot="result"
281
+ slot-scope="{ column }"
282
+ v-bind="{ ...column, field: column.prop, title: column.label }"
283
+ >
284
+ <template slot-scope="{ row }">
285
+ <div>
286
+ {{
287
+ row.result || row.result === 0
288
+ ? Number(row.result).toFixed(modelData.digits)
289
+ : ''
290
+ }}
291
+ </div>
292
+ </template>
293
+ </vxe-column>
294
+ <vxe-column
295
+ slot="modifyRank"
296
+ slot-scope="{ column }"
297
+ v-bind="{ ...column, field: column.prop, title: column.label }"
298
+ v-if="
299
+ !typeObj.targetArray.every(
300
+ el => !el.modifyRank || el.modifyRank === 0
301
+ )
302
+ "
303
+ >
304
+ <template slot-scope="{ row }">
305
+ {{ row.modifyRank === 1 ? '指标得分' : row.modifyRank === 2 ? '指标值' : '不调整' }}
306
+ </template>
307
+ </vxe-column>
308
+ <vxe-column
309
+ slot="modifiedVal"
310
+ slot-scope="{ column }"
311
+ v-bind="{ ...column, field: column.prop, title: column.label }"
312
+ v-if="
313
+ !typeObj.targetArray.every(
314
+ el => !el.modifyRank || el.modifyRank === 0
315
+ )
316
+ "
317
+ >
318
+ <template slot-scope="{ row }">
319
+ <span>
320
+ {{
321
+ row.modifyRank === 2
322
+ ? row.displayStyle === 1
323
+ ? Number.parseFloat(
324
+ N.subFixed(
325
+ row.modifiedVal / 100,
326
+ this.modelData.digits
327
+ )
328
+ ) + '%'
329
+ : row.modifiedVal
330
+ : '--'
331
+ }}
332
+ </span>
333
+ </template>
334
+ </vxe-column>
335
+ <vxe-column
336
+ slot="modifiedResult"
337
+ slot-scope="{ column }"
338
+ v-bind="{ ...column, field: column.prop, title: column.label }"
339
+ v-if="
340
+ !typeObj.targetArray.every(
341
+ el => !el.modifyRank || el.modifyRank === 0
342
+ )
343
+ "
344
+ >
345
+ <template slot-scope="{ row }">
346
+ <div>
347
+ {{ row.modifiedResult || '--' }}
348
+ </div>
349
+ </template>
350
+ </vxe-column>
351
+ <vxe-column
352
+ slot="indicatorValText"
353
+ slot-scope="{ column }"
354
+ v-bind="{ ...column, field: column.prop, title: column.label }"
355
+ v-if="!typeObj.targetArray.every(
356
+ el => !el.supplementRuleVOList || item.supplementRuleVOList.length === 0
357
+ )">
358
+ <template slot-scope="{ row }">
359
+ <div>
360
+ {{row.indicatorValText || '--' }}
361
+ </div>
362
+ </template>
363
+ </vxe-column>
364
+ </table-pro>
365
+ </div>
366
+ <!-- 子模型:按模型树文件夹顺序(定量→定性→调整项)展开,不按类型分块 -->
367
+ <template v-for="(item, index) in typeObj.orderedSubModels">
368
+ <!-- 评价模型 -->
369
+ <div
370
+ v-if="item._subModelKind === 'assess'"
371
+ :key="'assessModelArray' + index"
372
+ class="m-t-m"
373
+ >
374
+ <div>子模型【评级模型】--{{ item.name }}--模型指标</div>
375
+ <el-form class="label-width-6em" label-width="10em">
376
+ <el-form-item label="模型得分:">
377
+ <span>
378
+ {{
379
+ item.result || item.result === 0
380
+ ? item.result.toFixed(item.showDigits)
381
+ : ''
382
+ }}
383
+ </span>
384
+ </el-form-item>
385
+ <el-form-item label="模型结果:">
386
+ <span>{{ item.resultText }}</span>
387
+ </el-form-item>
388
+ </el-form>
389
+ <div class="m-t-s">
390
+ <table-pro
391
+ border
392
+ :columns="tabelHeadersAssessModel"
393
+ :data="item.tableData"
394
+ :merge-cells="mergeCells(item.tableData, tabelHeadersAssessModel)"
395
+ :scrollY="{
396
+ enabled: false
397
+ }"
398
+ :cellDefault="false"
399
+ :showSetsize="false"
400
+ :small="{
401
+ border: true,
402
+ size: 'small',
403
+ stripe: false
404
+ }"
405
+ >
406
+ <vxe-column
407
+ slot-scope="{ column }"
408
+ v-bind="{ ...column, field: column.prop, title: column.label }"
409
+ ></vxe-column>
410
+ <vxe-column
411
+ slot="indicatorResult"
412
+ slot-scope="{ column }"
413
+ v-bind="{ ...column, field: column.prop, title: column.label }"
414
+ >
415
+ <template slot-scope="{ row }">
416
+ <el-tooltip
417
+ class="item"
418
+ effect="dark"
419
+ :disabled="!row.displayFormula"
420
+ >
421
+ <div slot="content">
422
+ {{ row.displayFormula }}:
423
+ <br/>
424
+ {{ row.relFormula }}
425
+ </div>
426
+ <div v-if="row.sourceType === 5 && row.showValueType === 1">
427
+ {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
428
+ </div>
429
+ <div
430
+ v-else-if="
431
+ row.sourceType !== 3 &&
432
+ (!row?.optionList || row?.optionList?.length == 0)
433
+ "
434
+ >
435
+ {{ indicatorResultFn(row) }}
436
+ {{
437
+ row.displayStyle === 1 &&
438
+ (row.indicatorResult || row.indicatorResult === 0)
439
+ ? '%'
440
+ : ''
441
+ }}
442
+ </div>
443
+
444
+ <div v-if="row.sourceType == 3 && row.itemType === 21">
445
+ {{
446
+ row.value || row.value === 0
447
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
448
+ : ''
449
+ }}
450
+ {{
451
+ row.displayStyle === 1 && (row.value || row.value === 0)
452
+ ? '%'
453
+ : ''
454
+ }}
455
+ </div>
456
+ <div
457
+ v-else-if="row.itemType === 22 && row.optionList?.length"
458
+ >
459
+ {{
460
+ row.value && row.value.scoreText
461
+ ? row.value.scoreText
462
+ : '--'
463
+ }}
464
+ </div>
465
+ <div
466
+ v-if="
467
+ row.modifyRank == 2 &&
468
+ row.indicatorResult !== '' &&
469
+ row.indicatorResult !== null
470
+ "
471
+ >
472
+ <template v-if="row.itemType === 21">
473
+ <!-- displayStyle 是否百分比展示 -->
474
+ {{
475
+ row.value || row.value === 0
476
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
477
+ : ''
478
+ }}
479
+ {{
480
+ row.displayStyle === 1 &&
481
+ (row.value || row.value === 0)
482
+ ? '%'
483
+ : ''
484
+ }}
485
+ </template>
486
+ <template
487
+ v-else-if="
488
+ row.itemType === 22 && row.optionList?.length
489
+ "
490
+ >
491
+ {{
492
+ row.value && row.value.scoreText
493
+ ? row.value.scoreText
494
+ : '--'
495
+ }}
496
+ </template>
497
+ </div>
498
+ </el-tooltip>
499
+ </template>
500
+ </vxe-column>
501
+ <vxe-column
502
+ slot="value"
503
+ slot-scope="{ column }"
504
+ v-bind="{ ...column, field: column.prop, title: column.label }"
505
+ >
506
+ <template slot-scope="{ row }">
507
+ <div>
508
+ {{
509
+ row.valueScore || row.valueScore === 0
510
+ ? row.valueScore
511
+ : '--'
512
+ }}
513
+ </div>
514
+ </template>
515
+ </vxe-column>
516
+ <vxe-column
517
+ slot="result"
518
+ slot-scope="{ column }"
519
+ v-bind="{ ...column, field: column.prop, title: column.label }"
520
+ >
521
+ <template slot-scope="{ row }">
522
+ <div>
523
+ {{
524
+ row.result || row.result === 0
525
+ ? row.result.toFixed(modelData.digits)
526
+ : ''
527
+ }}
528
+ </div>
529
+ </template>
530
+ </vxe-column>
531
+ <vxe-column
532
+ slot="modifyRank"
533
+ slot-scope="{ column }"
534
+ v-bind="{ ...column, field: column.prop, title: column.label }"
535
+ v-if="
536
+ !item.tableData.every(
537
+ el => !el.modifyRank || el.modifyRank === 0
538
+ )
539
+ "
540
+ >
541
+ <template slot-scope="{ row }">
542
+ {{ row.modifyRank === 1 ? '指标得分' : row.modifyRank === 2 ? '指标值' : '不调整' }}
543
+ </template>
544
+ </vxe-column>
545
+ <vxe-column
546
+ slot="modifiedVal"
547
+ slot-scope="{ column }"
548
+ v-bind="{ ...column, field: column.prop, title: column.label }"
549
+ v-if="
550
+ !item.tableData.every(
551
+ el => !el.modifyRank || el.modifyRank === 0
552
+ )
553
+ "
554
+ >
555
+ <template slot-scope="{ row }">
556
+ <span>
557
+ {{
558
+ row.modifyRank === 2
559
+ ? row.displayStyle === 1
560
+ ? Number.parseFloat(
561
+ N.subFixed(
562
+ row.modifiedVal / 100,
563
+ this.modelData.digits
564
+ )
565
+ ) + '%'
566
+ : row.modifiedVal
567
+ : '--'
568
+ }}
569
+ </span>
570
+ </template>
571
+ </vxe-column>
572
+ <vxe-column
573
+ slot="modifiedResult"
574
+ slot-scope="{ column }"
575
+ v-bind="{ ...column, field: column.prop, title: column.label }"
576
+ v-if="
577
+ !item.tableData.every(
578
+ el => !el.modifyRank || el.modifyRank === 0
579
+ )
580
+ "
581
+ >
582
+ <template slot-scope="{ row }">
583
+ <div>
584
+ {{
585
+ row.result || row.result === 0
586
+ ? Number(row.modifiedResult).toFixed(modelData.digits)
587
+ : '--'
588
+ }}
589
+ </div>
590
+ </template>
591
+ </vxe-column>
592
+ </table-pro>
593
+ </div>
594
+ </div>
595
+ <!-- 计算模型 -->
596
+ <div
597
+ v-else-if="item._subModelKind === 'eval'"
598
+ :key="'evalModelArray' + index"
599
+ class="m-t-m"
600
+ >
601
+ <div>子模型【计算模型】--{{ item.name }}--模型指标</div>
602
+ <div class="m-t-s">
603
+ <table-pro
604
+ border
605
+ :columns="tabelHeadersEvalModel"
606
+ :data="item.tableData"
607
+ :merge-cells="mergeCells(item.tableData, tabelHeadersEvalModel)"
608
+ :scrollY="{
609
+ enabled: false
610
+ }"
611
+ :cellDefault="false"
612
+ :showSetsize="false"
613
+ :small="{
614
+ border: true,
615
+ size: 'small',
616
+ stripe: false
617
+ }"
618
+ >
619
+ <vxe-column
620
+ slot-scope="{ column }"
621
+ v-bind="{ ...column, field: column.prop, title: column.label }"
622
+ ></vxe-column>
623
+ <vxe-column
624
+ slot="indicatorResult"
625
+ slot-scope="{ column }"
626
+ v-bind="{ ...column, field: column.prop, title: column.label }"
627
+ >
628
+ <template slot-scope="{ row }">
629
+ <el-tooltip
630
+ class="item"
631
+ effect="dark"
632
+ :disabled="!row.displayFormula"
633
+ >
634
+ <div slot="content">
635
+ {{ row.displayFormula }}:
636
+ <br/>
637
+ {{ row.relFormula }}
638
+ </div>
639
+ <div v-if="row.sourceType === 5 && row.showValueType === 1">
640
+ {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
641
+ </div>
642
+ <div
643
+ v-else-if="
644
+ row.sourceType !== 3 &&
645
+ (!row?.optionList || row?.optionList?.length == 0)
646
+ "
647
+ >
648
+ {{ indicatorResultFn(row) }}
649
+ {{
650
+ row.displayStyle === 1 &&
651
+ (row.indicatorResult || row.indicatorResult === 0)
652
+ ? '%'
653
+ : ''
654
+ }}
655
+ </div>
656
+
657
+ <div v-if="row.sourceType == 3 && row.itemType === 21">
658
+ {{
659
+ row.value || row.value === 0
660
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
661
+ : ''
662
+ }}
663
+ {{
664
+ row.displayStyle === 1 && (row.value || row.value === 0)
665
+ ? '%'
666
+ : ''
667
+ }}
668
+ </div>
669
+
670
+ <div
671
+ v-else-if="row.itemType === 22 && row.optionList?.length"
672
+ >
673
+ {{
674
+ row.value && row.value.scoreText
675
+ ? row.value.scoreText
676
+ : '--'
677
+ }}
678
+ </div>
679
+
680
+ <div
681
+ v-if="
682
+ row.modifyRank == 2 &&
683
+ row.indicatorResult !== '' &&
684
+ row.indicatorResult !== null
685
+ "
686
+ >
687
+ <template v-if="row.itemType === 21">
688
+ <!-- displayStyle 是否百分比展示 -->
689
+ {{
690
+ row.value || row.value === 0
691
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
692
+ : ''
693
+ }}
694
+ {{
695
+ row.displayStyle === 1 &&
696
+ (row.value || row.value === 0)
697
+ ? '%'
698
+ : ''
699
+ }}
700
+ </template>
701
+
702
+ <template
703
+ v-else-if="
704
+ row.itemType === 22 && row.optionList?.length
705
+ "
706
+ >
707
+ {{
708
+ row.value && row.value.scoreText
709
+ ? row.value.scoreText
710
+ : '--'
711
+ }}
712
+ </template>
713
+ </div>
714
+ </el-tooltip>
715
+ </template>
716
+ </vxe-column>
717
+ <vxe-column
718
+ slot="value"
719
+ slot-scope="{ column }"
720
+ v-bind="{ ...column, field: column.prop, title: column.label }"
721
+ >
722
+ <template slot-scope="{ row }">
723
+ <div>
724
+ {{
725
+ row.valueScore || row.valueScore === 0
726
+ ? row.valueScore
727
+ : '--'
728
+ }}
729
+ </div>
730
+ </template>
731
+ </vxe-column>
732
+ <vxe-column
733
+ slot="result"
734
+ slot-scope="{ column }"
735
+ v-bind="{ ...column, field: column.prop, title: column.label }"
736
+ >
737
+ <template slot-scope="{ row }">
738
+ <div>
739
+ {{
740
+ row.result || row.result === 0
741
+ ? row.result.toFixed(modelData.digits)
742
+ : ''
743
+ }}
744
+ </div>
745
+ </template>
746
+ </vxe-column>
747
+ <vxe-column
748
+ slot="modifyRank"
749
+ slot-scope="{ column }"
750
+ v-bind="{ ...column, field: column.prop, title: column.label }"
751
+ v-if="
752
+ !item.tableData.every(
753
+ el => !el.modifyRank || el.modifyRank === 0
754
+ )
755
+ "
756
+ >
757
+ <template slot-scope="{ row }">
758
+ {{ row.modifyRank === 1 ? '指标得分' : row.modifyRank === 2 ? '指标值' : '不调整' }}
759
+ </template>
760
+ </vxe-column>
761
+ <vxe-column
762
+ slot="modifiedVal"
763
+ slot-scope="{ column }"
764
+ v-bind="{ ...column, field: column.prop, title: column.label }"
765
+ v-if="
766
+ !item.tableData.every(
767
+ el => !el.modifyRank || el.modifyRank === 0
768
+ )
769
+ "
770
+ >
771
+ <template slot-scope="{ row }">
772
+ <span>
773
+ {{
774
+ row.modifyRank === 2
775
+ ? row.displayStyle === 1
776
+ ? Number.parseFloat(
777
+ N.subFixed(
778
+ row.modifiedVal / 100,
779
+ this.modelData.digits
780
+ )
781
+ ) + '%'
782
+ : row.modifiedVal
783
+ : '--'
784
+ }}
785
+ </span>
786
+ </template>
787
+ </vxe-column>
788
+ <vxe-column
789
+ slot="modifiedResult"
790
+ slot-scope="{ column }"
791
+ v-bind="{ ...column, field: column.prop, title: column.label }"
792
+ v-if="
793
+ !item.tableData.every(
794
+ el => !el.modifyRank || el.modifyRank === 0
795
+ )
796
+ "
797
+ >
798
+ <template slot-scope="{ row }">
799
+ <div>
800
+ {{
801
+ row.result || row.result === 0
802
+ ? Number(row.modifiedResult).toFixed(modelData.digits)
803
+ : '--'
804
+ }}
805
+ </div>
806
+ </template>
807
+ </vxe-column>
808
+ </table-pro>
809
+ </div>
810
+ </div>
811
+
812
+ <!-- 统计模型 (暂不考虑子模型的情况) -->
813
+ <div
814
+ v-else-if="item._subModelKind === 'stat'"
815
+ :key="'statisticsArray' + index"
816
+ class="m-t-m"
817
+ >
818
+ <div v-if="modelData.type !== 3">
819
+ 子模型【统计模型--{{
820
+ item.sataMode === 1 ? '表模式' : '计算模式'
821
+ }}】--{{ item.name }}--模型指标
822
+ </div>
823
+ <div class="m-t-s">
824
+ <table-pro
825
+ border
826
+ :columns="tabelHeadersStatistics"
827
+ :data="item.tableData"
828
+ :merge-cells="mergeCells(item.tableData, tabelHeadersStatistics)"
829
+ :scrollY="{
830
+ enabled: false
831
+ }"
832
+ :cellDefault="false"
833
+ :showSetsize="false"
834
+ :small="{
835
+ border: true,
836
+ size: 'small',
837
+ stripe: false
838
+ }"
839
+ >
840
+ <vxe-column
841
+ slot-scope="{ column }"
842
+ v-bind="{ ...column, field: column.prop, title: column.label }"
843
+ ></vxe-column>
844
+ <vxe-column
845
+ slot="indicatorResult"
846
+ slot-scope="{ column }"
847
+ v-bind="{ ...column, field: column.prop, title: column.label }"
848
+ >
849
+ <template slot-scope="{ row }">
850
+ <div v-if="row.rankType === 9">--</div>
851
+ <el-tooltip
852
+ v-if="row.rankType !== 9"
853
+ class="item"
854
+ effect="dark"
855
+ :disabled="!row.displayFormula"
856
+ >
857
+ <div slot="content">
858
+ {{ row.displayFormula }}:
859
+ <br/>
860
+ {{ row.relFormula }}
861
+ </div>
862
+ <div v-if="row.sourceType === 5 && row.showValueType === 1">
863
+ {{ row.fieldValue || row.fieldValue === 0 ? row.fieldValue : '--' }}
864
+ </div>
865
+ <div
866
+ v-else-if="
867
+ row.sourceType !== 3 &&
868
+ (!row?.optionList || row?.optionList?.length == 0)
869
+ "
870
+ >
871
+ {{ indicatorResultFn(row) }}
872
+ {{
873
+ row.displayStyle === 1 &&
874
+ (row.indicatorResult || row.indicatorResult === 0)
875
+ ? '%'
876
+ : ''
877
+ }}
878
+ </div>
879
+
880
+ <div v-if="row.sourceType === 3 && row.itemType === 21">
881
+ {{
882
+ row.value || row.value === 0
883
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
884
+ : ''
885
+ }}
886
+ {{
887
+ row.displayStyle === 1 && (row.value || row.value === 0)
888
+ ? '%'
889
+ : ''
890
+ }}
891
+ </div>
892
+
893
+ <div
894
+ v-else-if="row.itemType === 22 && row.optionList?.length"
895
+ >
896
+ {{
897
+ row.value && row.value.scoreText
898
+ ? row.value.scoreText
899
+ : '--'
900
+ }}
901
+ </div>
902
+
903
+ <div
904
+ v-if="
905
+ row.modifyRank == 2 &&
906
+ row.indicatorResult !== '' &&
907
+ row.indicatorResult !== null
908
+ "
909
+ >
910
+ <template v-if="row.itemType === 21">
911
+ <!-- displayStyle 是否百分比展示 -->
912
+ {{
913
+ row.value || row.value === 0
914
+ ? row?.value?.toFixed(digitsCalc(row.showDigits))
915
+ : ''
916
+ }}
917
+ {{
918
+ row.displayStyle === 1 &&
919
+ (row.value || row.value === 0)
920
+ ? '%'
921
+ : ''
922
+ }}
923
+ </template>
924
+
925
+ <template
926
+ v-else-if="
927
+ row.itemType === 22 && row.optionList?.length
928
+ "
929
+ >
930
+ {{
931
+ row.value && row.value.scoreText
932
+ ? row.value.scoreText
933
+ : '--'
934
+ }}
935
+ </template>
936
+ </div>
937
+ </el-tooltip>
938
+ </template>
939
+ </vxe-column>
940
+ <vxe-column
941
+ slot="value"
942
+ slot-scope="{ column }"
943
+ v-bind="{ ...column, field: column.prop, title: column.label }"
944
+ >
945
+ <template slot-scope="{ row }">
946
+ <div>
947
+ {{
948
+ row.valueScore || row.valueScore === 0
949
+ ? row.valueScore
950
+ : '--'
951
+ }}
952
+ </div>
953
+ </template>
954
+ </vxe-column>
955
+ <vxe-column
956
+ slot="result"
957
+ slot-scope="{ column }"
958
+ v-bind="{ ...column, field: column.prop, title: column.label }"
959
+ >
960
+ <template slot-scope="{ row }">
961
+ <el-tooltip
962
+ class="item"
963
+ effect="dark"
964
+ :disabled="!row.displayFormula"
965
+ >
966
+ <div slot="content">
967
+ {{ row.displayFormula }}:
968
+ <br/>
969
+ {{ row.relFormula }}
970
+ </div>
971
+ <div>
972
+ {{
973
+ row.result
974
+ ? addThousands(
975
+ toFixedTrunc(row?.result, modelData.digits)
976
+ )
977
+ : row.result === 0
978
+ ? row.result
979
+ : ''
980
+ }}
981
+ </div>
982
+ </el-tooltip>
983
+ </template>
984
+ </vxe-column>
985
+ <vxe-column
986
+ slot="modifiedResult"
987
+ slot-scope="{ column }"
988
+ v-bind="{ ...column, field: column.prop, title: column.label }"
989
+ >
990
+ <template slot-scope="{ row }">
991
+ <div>
992
+ {{
993
+ row.result || row.result === 0
994
+ ? Number(row.modifiedResult).toFixed(modelData.digits)
995
+ : ''
996
+ }}
997
+ </div>
998
+ </template>
999
+ </vxe-column>
1000
+ <vxe-column
1001
+ slot="indicatorValText"
1002
+ slot-scope="{ column }"
1003
+ v-bind="{ ...column, field: column.prop, title: column.label }"
1004
+ v-if="!item.tableData.every(
1005
+ el => !el.supplementRuleVOList || item.supplementRuleVOList.length === 0
1006
+ )">
1007
+ <template slot-scope="{ row }">
1008
+ <div>
1009
+ {{row.indicatorValText || '--' }}
1010
+ </div>
1011
+ </template>
1012
+ </vxe-column>
1013
+ </table-pro>
1014
+ </div>
1015
+ </div>
1016
+ </template>
1017
+ </div>
1018
+ </expandable-pane>
1019
+ </Page>
1020
+ </template>
1021
+ <script>
1022
+ import {
1023
+ setMergeCells,
1024
+ toFixedTrunc,
1025
+ addThousands,
1026
+ formatFloat2
1027
+ } from '../common'
1028
+ import {N, Page, ExpandablePane, Descriptions, TablePro} from 'n20-common-lib'
1029
+ import {printJS} from 'n20-common-lib/src/plugins/Print'
1030
+
1031
+ /**
1032
+ * 关键参数说明 sourceType
1033
+ * 0 系统自定义
1034
+ * 1 报表取数
1035
+ * 2 指标取数
1036
+ * 3 手工填报
1037
+ * 4 标准值取数
1038
+ * 5 系统取值
1039
+ * 6 系统取数
1040
+ *
1041
+ * rankType
1042
+ * 0 取指标值
1043
+ * 1 分段模糊化打分
1044
+ * 2 公式模糊化打分
1045
+ * 3 分段模糊化公式打分
1046
+ * 4 企业绩效评估标准打分
1047
+ * 5 评价等级化取值
1048
+ * 6 分段模糊化取值
1049
+ * 7 特殊化打分
1050
+ * 8 标准值打分
1051
+ * 9 统计项运算
1052
+ * 10 手工录入
1053
+ * 11 分段取值
1054
+ *
1055
+ * 调整项
1056
+ * modifyRank
1057
+ * 0 不调整
1058
+ * 2 指标值
1059
+ * 1 指标得分
1060
+ *
1061
+ * 模型指标类型
1062
+ * itemType
1063
+ * 11 计算模型
1064
+ * 12 评价模型
1065
+ * 13 统计模型
1066
+ * 21 可量化指标
1067
+ * 22 不可量化指标
1068
+ */
1069
+ export default {
1070
+ name: 'calculateDetail',
1071
+ props: {
1072
+ showModelInfo: {
1073
+ type: Boolean,
1074
+ default: true
1075
+ },
1076
+ modelId: String,
1077
+ logId: String
1078
+ },
1079
+ watch: {
1080
+ logId: {
1081
+ handler(value) {
1082
+ if (value) {
1083
+ this.init()
1084
+ }
1085
+ },
1086
+ immediate: true
1087
+ }
1088
+ },
1089
+ components: {Page, ExpandablePane, Descriptions, TablePro},
1090
+ data() {
1091
+ return {
1092
+ // 拆分数结构为三类数据
1093
+ typeObj: {
1094
+ // 指标数组
1095
+ targetArray: [],
1096
+ // 统计模型数组
1097
+ statisticsArray: [],
1098
+ // 计算模型数组
1099
+ evalModelArray: [],
1100
+ // 评价模型数组
1101
+ assessModelArray: [],
1102
+ // 子模型按模型树文件夹顺序(定量→定性→调整项)展开
1103
+ orderedSubModels: []
1104
+ },
1105
+ tabelHeadersAssessModel: [
1106
+ {
1107
+ label: '分组',
1108
+ prop: 'pName',
1109
+ align: 'center',
1110
+ minWidth: 150,
1111
+ 'show-overflow-tooltip': true
1112
+ },
1113
+ {
1114
+ label: '序号',
1115
+ prop: 'serialNumber',
1116
+ align: 'center',
1117
+ minWidth: 100,
1118
+ 'show-overflow-tooltip': true
1119
+ },
1120
+ {
1121
+ label: '指标名称',
1122
+ prop: 'name',
1123
+ align: 'center',
1124
+ minWidth: 150,
1125
+ 'show-overflow-tooltip': true
1126
+ },
1127
+ {
1128
+ label: '指标编号',
1129
+ prop: 'code',
1130
+ align: 'center',
1131
+ minWidth: 150,
1132
+ 'show-overflow-tooltip': true
1133
+ },
1134
+ {
1135
+ label: '占模型权重(%)',
1136
+ prop: 'weight',
1137
+ align: 'center',
1138
+ minWidth: 150,
1139
+ formatter: 'formatRate',
1140
+ 'show-overflow-tooltip': true
1141
+ },
1142
+ {
1143
+ label: '指标满分值',
1144
+ prop: 'fullScore',
1145
+ align: 'center',
1146
+ minWidth: 150,
1147
+ formatter: 'formatRate',
1148
+ 'show-overflow-tooltip': true
1149
+ },
1150
+ {
1151
+ label: '指标调整项',
1152
+ prop: 'modifyRank',
1153
+ slotName: 'modifyRank',
1154
+ align: 'center',
1155
+ minWidth: 100,
1156
+ 'show-overflow-tooltip': true,
1157
+ formatter: [
1158
+ 'formatSelect',
1159
+ [
1160
+ {label: '不调整', value: 0},
1161
+ {
1162
+ label: '指标得分',
1163
+ value: 1
1164
+ },
1165
+ {label: '指标值', value: 2}
1166
+ ]
1167
+ ]
1168
+ },
1169
+ {
1170
+ label: '指标值',
1171
+ prop: 'indicatorResult',
1172
+ slotName: 'indicatorResult',
1173
+ align: 'center',
1174
+ minWidth: 150,
1175
+ 'show-overflow-tooltip': false
1176
+ },
1177
+ {
1178
+ label: '调整后指标值',
1179
+ prop: 'modifiedVal',
1180
+ slotName: 'modifiedVal',
1181
+ align: 'center',
1182
+ minWidth: 150,
1183
+ 'show-overflow-tooltip': true,
1184
+ type: 'html',
1185
+ formatter: ({cellValue, row}) => {
1186
+ return `<span>${
1187
+ row.modifyRank === 2
1188
+ ? row.displayStyle === 1
1189
+ ? formatFloat2(cellValue / 100, this.modelData.digits) + '%'
1190
+ : cellValue
1191
+ : '--'
1192
+ }</span>`
1193
+ }
1194
+ },
1195
+ {
1196
+ label: '指标得分',
1197
+ prop: 'value',
1198
+ slotName: 'value',
1199
+ align: 'center',
1200
+ minWidth: 150,
1201
+ 'show-overflow-tooltip': false
1202
+ },
1203
+ {
1204
+ label: '模型指标得分',
1205
+ prop: 'result',
1206
+ slotName: 'result',
1207
+ align: 'center',
1208
+ minWidth: 150,
1209
+ 'show-overflow-tooltip': false
1210
+ },
1211
+ {
1212
+ label: '调整后模型指标得分',
1213
+ prop: 'modifiedResult',
1214
+ slotName: 'modifiedResult',
1215
+ align: 'center',
1216
+ minWidth: 150,
1217
+ 'show-overflow-tooltip': false
1218
+ }
1219
+ ],
1220
+ tabelHeadersEvalModel: [
1221
+ {
1222
+ label: '分组',
1223
+ prop: 'pName',
1224
+ align: 'center',
1225
+ minWidth: 150,
1226
+ 'show-overflow-tooltip': true
1227
+ },
1228
+ {
1229
+ label: '序号',
1230
+ prop: 'serialNumber',
1231
+ align: 'center',
1232
+ minWidth: 100,
1233
+ 'show-overflow-tooltip': true
1234
+ },
1235
+ {
1236
+ label: '指标名称',
1237
+ prop: 'name',
1238
+ align: 'center',
1239
+ minWidth: 150,
1240
+ 'show-overflow-tooltip': true
1241
+ },
1242
+ {
1243
+ label: '指标编号',
1244
+ prop: 'code',
1245
+ align: 'center',
1246
+ minWidth: 150,
1247
+ 'show-overflow-tooltip': true
1248
+ },
1249
+ {
1250
+ label: '模型指标系数名称',
1251
+ prop: 'ratioName',
1252
+ align: 'center',
1253
+ minWidth: 150,
1254
+ 'show-overflow-tooltip': false
1255
+ },
1256
+ {
1257
+ label: '指标调整项',
1258
+ prop: 'modifyRank',
1259
+ slotName: 'modifyRank',
1260
+ align: 'center',
1261
+ minWidth: 100,
1262
+ 'show-overflow-tooltip': true,
1263
+ formatter: [
1264
+ 'formatSelect',
1265
+ [
1266
+ {label: '不调整', value: 0},
1267
+ {
1268
+ label: '指标得分',
1269
+ value: 1
1270
+ },
1271
+ {label: '指标值', value: 2}
1272
+ ]
1273
+ ]
1274
+ },
1275
+ {
1276
+ label: '指标值',
1277
+ prop: 'indicatorResult',
1278
+ slotName: 'indicatorResult',
1279
+ align: 'center',
1280
+ minWidth: 150,
1281
+ 'show-overflow-tooltip': false
1282
+ },
1283
+ {
1284
+ label: '调整后指标值',
1285
+ prop: 'modifiedVal',
1286
+ slotName: 'modifiedVal',
1287
+ align: 'center',
1288
+ minWidth: 150,
1289
+ 'show-overflow-tooltip': true,
1290
+ type: 'html',
1291
+ formatter: ({cellValue, row}) => {
1292
+ return `<span>${
1293
+ row.modifyRank === 2
1294
+ ? row.displayStyle === 1
1295
+ ? formatFloat2(cellValue / 100, this.modelData.digits) + '%'
1296
+ : cellValue
1297
+ : '--'
1298
+ }</span>`
1299
+ }
1300
+ },
1301
+ {
1302
+ label: '模型指标取值结果',
1303
+ prop: 'result',
1304
+ slotName: 'result',
1305
+ align: 'center',
1306
+ minWidth: 150,
1307
+ 'show-overflow-tooltip': false
1308
+ }
1309
+ ],
1310
+ tabelHeadersStatistics: [
1311
+ {
1312
+ label: '指标项',
1313
+ prop: 'pName',
1314
+ align: 'center',
1315
+ minWidth: 150,
1316
+ 'show-overflow-tooltip': true
1317
+ },
1318
+ {
1319
+ label: '统计项名称',
1320
+ prop: 'statsName',
1321
+ align: 'center',
1322
+ minWidth: 150,
1323
+ 'show-overflow-tooltip': true
1324
+ },
1325
+ {
1326
+ label: '指标名称',
1327
+ prop: 'name',
1328
+ align: 'center',
1329
+ minWidth: 150,
1330
+ 'show-overflow-tooltip': true
1331
+ },
1332
+ {
1333
+ label: '指标编号',
1334
+ prop: 'code',
1335
+ align: 'center',
1336
+ minWidth: 150,
1337
+ 'show-overflow-tooltip': true
1338
+ },
1339
+ {
1340
+ label: '指标满分值',
1341
+ prop: 'fullScore',
1342
+ align: 'center',
1343
+ minWidth: 150,
1344
+ 'show-overflow-tooltip': true
1345
+ },
1346
+ {
1347
+ label: '指标值',
1348
+ prop: 'indicatorResult',
1349
+ slotName: 'indicatorResult',
1350
+ align: 'center',
1351
+ minWidth: 250,
1352
+ 'show-overflow-tooltip': false
1353
+ },
1354
+ {
1355
+ label: '指标值显示',
1356
+ prop: 'indicatorValText',
1357
+ slotName: 'indicatorValText',
1358
+ align: 'center',
1359
+ minWidth: 150,
1360
+ 'show-overflow-tooltip': false
1361
+ },
1362
+ {
1363
+ label: '统计结果',
1364
+ prop: 'result',
1365
+ slotName: 'result',
1366
+ align: 'center',
1367
+ minWidth: 150,
1368
+ 'show-overflow-tooltip': false
1369
+ }
1370
+ ],
1371
+ modelData: {},
1372
+ model: {}
1373
+ }
1374
+ },
1375
+ computed: {
1376
+ tabelHeadersTarget() {
1377
+ if (this.modelData.type === 1) {
1378
+ return this.tabelHeadersAssessModel
1379
+ } else if (this.modelData.type === 2) {
1380
+ return this.tabelHeadersEvalModel
1381
+ } else if (this.modelData.type === 3) {
1382
+ return this.tabelHeadersStatistics
1383
+ } else {
1384
+ return []
1385
+ }
1386
+ }
1387
+ },
1388
+ methods: {
1389
+ toFixedTrunc,
1390
+ addThousands,
1391
+ N_add(a, b, w) {
1392
+ return N.add(a, b, w)
1393
+ },
1394
+ N_mul(a, b, w) {
1395
+ return N.mul(a, b, w)
1396
+ },
1397
+ N_div(a, b, w) {
1398
+ return N.div(a, b, w)
1399
+ },
1400
+ async init() {
1401
+ await this.getModelById()
1402
+ if (this.model.showLevel !== 1) {
1403
+ this.tabelHeadersAssessModel = this.tabelHeadersAssessModel.filter(
1404
+ item => item.prop !== 'serialNumber'
1405
+ )
1406
+ this.tabelHeadersEvalModel = this.tabelHeadersEvalModel.filter(
1407
+ item => item.prop !== 'serialNumber'
1408
+ )
1409
+ }
1410
+ if (this.model.type === 1 && this.model.showWeight !== 1) {
1411
+ this.tabelHeadersAssessModel = this.tabelHeadersAssessModel.filter(
1412
+ item => item.prop !== 'weight'
1413
+ )
1414
+ }
1415
+ switch (this.model.type) {
1416
+ case 1:
1417
+ case 2:
1418
+ if (this.model.code) {
1419
+ this.processingData(this.model, 'targetArray')
1420
+ await this.queryCalcResultDetail()
1421
+ this.processingData(this.modelData)
1422
+ this.alignSubModelsWithTargetOrder()
1423
+ this.comFn(this.modelData)
1424
+ }
1425
+ break
1426
+ case 3:
1427
+ await this.queryCalcResultDetail()
1428
+ this.recursionFn([this.modelData.modelTreeVO])
1429
+ const modelTreeVO = JSON.parse(
1430
+ JSON.stringify(this.modelData.modelTreeVO)
1431
+ )
1432
+ modelTreeVO.itemID = modelTreeVO.modelID
1433
+ modelTreeVO.tableData = []
1434
+ modelTreeVO.children = []
1435
+ const statRow = {...modelTreeVO, _subModelKind: 'stat'}
1436
+ this.typeObj.statisticsArray.push(statRow)
1437
+ this.typeObj.orderedSubModels.push(statRow)
1438
+ this.comFn(this.modelData)
1439
+ let showFullScore = 0
1440
+ let showIndicatorValText = 0
1441
+ this.typeObj.statisticsArray.forEach(item => {
1442
+ console.log(JSON.stringify(item))
1443
+ if (item.fullScore) {
1444
+ showFullScore = 1
1445
+ }
1446
+ if (
1447
+ item.supplementRuleVOList &&
1448
+ item.supplementRuleVOList.length > 0
1449
+ ) {
1450
+ showIndicatorValText = 1
1451
+ }
1452
+ })
1453
+ if (showFullScore !== 1) {
1454
+ this.tabelHeadersStatistics = this.tabelHeadersStatistics.filter(
1455
+ item => item.prop !== 'fullScore'
1456
+ )
1457
+ }
1458
+ if (showIndicatorValText !== 1) {
1459
+ this.tabelHeadersStatistics = this.tabelHeadersStatistics.filter(
1460
+ item => item.prop !== 'indicatorValText'
1461
+ )
1462
+ }
1463
+ break
1464
+ default:
1465
+ break
1466
+ }
1467
+ },
1468
+ async getModelById() {
1469
+ if (!this.modelId) {
1470
+ this.$message.warning('modelId不能为空')
1471
+ return
1472
+ }
1473
+ const {code, data} = await this.$axios.post(
1474
+ '/imes/v1/indicatorModel/getModelById',
1475
+ {
1476
+ id: this.modelId
1477
+ }
1478
+ )
1479
+ if (code === 0) {
1480
+ this.model = data || {}
1481
+ }
1482
+ },
1483
+ async queryCalcResultDetail() {
1484
+ const {code, data} = await this.$axios.post(
1485
+ '/imes/v2/models/queryCalcResultDetail',
1486
+ {id: this.logId}
1487
+ )
1488
+ if (code == 0) {
1489
+ this.modelData = data
1490
+ }
1491
+ },
1492
+ /** 统计模型专用 处理叶子节点为2 */
1493
+ recursionFn(arr) {
1494
+ if (arr.length === 0) return arr
1495
+ arr.forEach(item => {
1496
+ item.label = item.name
1497
+ if (item.isLeaf === 2) {
1498
+ this.$set(
1499
+ item,
1500
+ 'indicatorDeepList',
1501
+ item.children.map(item2 => {
1502
+ return {...item2, label: item.name}
1503
+ })
1504
+ )
1505
+ item.children = []
1506
+ } else {
1507
+ if (item.children?.length) {
1508
+ this.recursionFn(item.children)
1509
+ }
1510
+ }
1511
+ })
1512
+ },
1513
+ /** 页面渲染函数 */
1514
+ comFn(data) {
1515
+ const modelTreeVO = data.modelTreeVO
1516
+ this.typeObj.statisticsArray.forEach(statistics => {
1517
+ this.$set(statistics, 'children', [])
1518
+ this.$set(statistics, 'tableData', [])
1519
+ return statistics
1520
+ })
1521
+ this.typeObj.evalModelArray.forEach(evalModel => {
1522
+ this.$set(evalModel, 'children', [])
1523
+ this.$set(evalModel, 'tableData', [])
1524
+ return evalModel
1525
+ })
1526
+ this.typeObj.assessModelArray.forEach(evalModel => {
1527
+ this.$set(evalModel, 'children', [])
1528
+ this.$set(evalModel, 'tableData', [])
1529
+ return evalModel
1530
+ })
1531
+ const digui = data => {
1532
+ if (data.children && data.children.length > 0) {
1533
+ data.children.map(async item => {
1534
+ // 统计模型 找到先关模型下面的指标项
1535
+ if (item.isLeaf == 2) {
1536
+ if (this.modelData.type == 3) {
1537
+ this.typeObj.statisticsArray.forEach(async statistics => {
1538
+ if (statistics.itemID == item.modelID) {
1539
+ statistics.children.push(item)
1540
+ if (
1541
+ item.indicatorDeepList &&
1542
+ item.indicatorDeepList.length &&
1543
+ item.indicatorDeepList.length > 0
1544
+ ) {
1545
+ const promiseAll = item.indicatorDeepList.map(
1546
+ async itemc => this.itemDataFn(itemc, data)
1547
+ )
1548
+ const objArr = await Promise.all(promiseAll)
1549
+ objArr.map(obj => {
1550
+ statistics.tableData.push({
1551
+ ...obj,
1552
+ pName: item.folderName || item.name
1553
+ })
1554
+ })
1555
+ }
1556
+ }
1557
+ return statistics
1558
+ })
1559
+ } else {
1560
+ this.typeObj.statisticsArray.forEach(async statistics => {
1561
+ if (statistics.itemID == item.modelID) {
1562
+ statistics.children.push(item)
1563
+ if (
1564
+ item.children &&
1565
+ item.children.length &&
1566
+ item.children.length > 0
1567
+ ) {
1568
+ const promiseAll = item.children.map(async itemc =>
1569
+ this.itemDataFn(itemc, data)
1570
+ )
1571
+ const objArr = await Promise.all(promiseAll)
1572
+ objArr.map(obj => {
1573
+ statistics.tableData.push({
1574
+ ...obj,
1575
+ pName: item.folderName || item.name
1576
+ })
1577
+ })
1578
+ }
1579
+ }
1580
+ return statistics
1581
+ })
1582
+ }
1583
+ }
1584
+ // 计算/评价模型
1585
+ if (item.isLeaf == 0) {
1586
+ this.typeObj.evalModelArray.forEach(async evalModel => {
1587
+ if (evalModel.itemID == item.modelID) {
1588
+ evalModel.children.push(item)
1589
+ if (
1590
+ item.children &&
1591
+ item.children.length &&
1592
+ item.children.length > 0
1593
+ ) {
1594
+ const promiseAll = item.children.map(async itemc =>
1595
+ this.itemDataFn(itemc, data)
1596
+ )
1597
+ const objArr = await Promise.all(promiseAll)
1598
+ objArr.map(obj => {
1599
+ evalModel.tableData.push({
1600
+ ...obj,
1601
+ pName: item.folderName || item.name
1602
+ })
1603
+ })
1604
+ }
1605
+ }
1606
+ return evalModel
1607
+ })
1608
+ this.typeObj.assessModelArray.forEach(async assessModel => {
1609
+ if (assessModel.itemID == item.modelID) {
1610
+ assessModel.result = item.result
1611
+ assessModel.resultText = item.resultText
1612
+ assessModel.showDigits = item.showDigits
1613
+ assessModel.children.push(item)
1614
+ if (
1615
+ item.children &&
1616
+ item.children.length &&
1617
+ item.children.length > 0
1618
+ ) {
1619
+ const promiseAll = item.children.map(async itemc =>
1620
+ this.itemDataFn(itemc, data)
1621
+ )
1622
+ const objArr = await Promise.all(promiseAll)
1623
+ objArr.map(obj => {
1624
+ assessModel.tableData.push({
1625
+ ...obj,
1626
+ pName: item.folderName || item.name
1627
+ })
1628
+ })
1629
+ }
1630
+ }
1631
+ return assessModel
1632
+ })
1633
+ }
1634
+ // 指标
1635
+ if (item.isLeaf == 1) {
1636
+ this.typeObj.targetArray.forEach(itemc => {
1637
+ if (itemc.itemID === item.itemID && itemc.tid === item.tid) {
1638
+ itemc.result = item.result
1639
+ itemc.indicatorResult = item.indicatorResult
1640
+ itemc.relFormula = item.relFormula
1641
+ itemc.displayFormula = item.displayFormula
1642
+ itemc.serialNumber = item.serialNumber
1643
+ itemc.fieldValue = item.fieldValue
1644
+ this.itemDataFn(itemc, data)
1645
+ }
1646
+
1647
+ return itemc
1648
+ })
1649
+ }
1650
+ digui(item)
1651
+ })
1652
+ }
1653
+ }
1654
+
1655
+ digui(modelTreeVO)
1656
+ },
1657
+
1658
+ /** 给指标值赋值 */
1659
+ async itemDataFn(item, data, len) {
1660
+ let value
1661
+ let valueScore
1662
+ if (item.sourceType == 3) {
1663
+ value = item.indicatorResult
1664
+ } else {
1665
+ // 指标项取值方式
1666
+ switch (item.rankType) {
1667
+ // 手工录入
1668
+ case 10:
1669
+ value = item.formula
1670
+ break
1671
+ // 统计项运算
1672
+ case 9:
1673
+ value = item.result
1674
+ break
1675
+ default:
1676
+ value = item.indicatorResult
1677
+ break
1678
+ }
1679
+ }
1680
+ // 不可量化指标 查询选项
1681
+ if (item.itemType == 22) {
1682
+ item.optionList = []
1683
+ // 获取当前时间戳
1684
+ const timestamp = Date.now()
1685
+ // 生成一个随机数
1686
+ const randomNum = Math.floor(Math.random() * 1000000) // 这里生成一个 0 到 999999 之间的整数
1687
+ // 组合时间戳和随机数
1688
+ const randomNumStr = `${timestamp}${randomNum}`
1689
+ const {code, data: optionList} = await this.$axios.post(
1690
+ `/imes/v1/indicator/getScoreMap?randomNumStr=${randomNumStr}`,
1691
+ {id: item.itemID}
1692
+ )
1693
+ if (code == 0) {
1694
+ item.optionList = optionList
1695
+ if (item?.optionList?.length > 0) {
1696
+ value = item.optionList.find(
1697
+ item2 => item2.scoreValue == item.indicatorResult
1698
+ )
1699
+ }
1700
+ }
1701
+ }
1702
+ if (item.weight) {
1703
+ valueScore =
1704
+ item.result || item.result === 0
1705
+ ? this.N_div(
1706
+ this.N_mul(
1707
+ item.result,
1708
+ 100,
1709
+ this.digitsCalc(item.showDigits) + 2
1710
+ ),
1711
+ item.weight,
1712
+ this.digitsCalc(item.showDigits)
1713
+ )
1714
+ : ''
1715
+ } else {
1716
+ valueScore = ''
1717
+ }
1718
+ item.value = value
1719
+ item.valueScore = valueScore
1720
+ item.pName = data.serialNumber
1721
+ ? `${data.serialNumber}. ${data.name}`
1722
+ : data.name
1723
+ return item
1724
+ },
1725
+ // 指标table :isLeaf =1 itemType = [21,22]
1726
+ // 统计模型table : isLeaf=2 itemType = 13
1727
+ // 计算模型table : isLeaf=0 itemType = 11
1728
+ // 评价模型table: isLeaf=0 itemType = 12
1729
+ /** 子模型展开顺序与主表指标(定量→定性→调整项)保持一致 */
1730
+ alignSubModelsWithTargetOrder() {
1731
+ const orderIds = this.typeObj.targetArray
1732
+ .filter(i => [11, 12, 13].includes(Number(i.itemType)))
1733
+ .map(i => i.itemID)
1734
+ if (!orderIds.length || !this.typeObj.orderedSubModels.length) {
1735
+ return
1736
+ }
1737
+ this.typeObj.orderedSubModels.sort((a, b) => {
1738
+ const ia = orderIds.indexOf(a.itemID)
1739
+ const ib = orderIds.indexOf(b.itemID)
1740
+ return (ia < 0 ? Number.MAX_SAFE_INTEGER : ia) -
1741
+ (ib < 0 ? Number.MAX_SAFE_INTEGER : ib)
1742
+ })
1743
+ },
1744
+ processingData(modelData, type) {
1745
+ const modelTreeVO = JSON.parse(JSON.stringify(modelData.modelTreeVO))
1746
+ const digui = data => {
1747
+ if (data.children && data.children.length > 0) {
1748
+ data.children.map(async item => {
1749
+ if (item.isLeaf === 1) {
1750
+ switch (item.itemType) {
1751
+ // 可量化指标
1752
+ case 21: {
1753
+ if (type === 'targetArray') {
1754
+ this.typeObj.targetArray.push({})
1755
+ this.$set(
1756
+ this.typeObj.targetArray,
1757
+ this.typeObj.targetArray.length - 1,
1758
+ await this.itemDataFn(item, data)
1759
+ )
1760
+ }
1761
+ }
1762
+ break
1763
+ // 不可量化指标
1764
+ case 22: {
1765
+ if (type === 'targetArray') {
1766
+ item.optionList = []
1767
+ this.typeObj.targetArray.push({})
1768
+ this.$set(
1769
+ this.typeObj.targetArray,
1770
+ this.typeObj.targetArray.length - 1,
1771
+ await this.itemDataFn(item, data)
1772
+ )
1773
+ }
1774
+ }
1775
+ break
1776
+ // 计算模型
1777
+ case 11: {
1778
+ if (type === 'targetArray') {
1779
+ this.typeObj.targetArray.push({})
1780
+ this.$set(
1781
+ this.typeObj.targetArray,
1782
+ this.typeObj.targetArray.length - 1,
1783
+ await this.itemDataFn(item, data)
1784
+ )
1785
+ } else {
1786
+ item.children = []
1787
+ item.tableData = []
1788
+ const row = {...item, _subModelKind: 'eval'}
1789
+ this.typeObj.evalModelArray.push(row)
1790
+ this.typeObj.orderedSubModels.push(row)
1791
+ }
1792
+ }
1793
+ break
1794
+ // 评价模型
1795
+ case 12: {
1796
+ if (type === 'targetArray') {
1797
+ this.typeObj.targetArray.push({})
1798
+ this.$set(
1799
+ this.typeObj.targetArray,
1800
+ this.typeObj.targetArray.length - 1,
1801
+ await this.itemDataFn(item, data)
1802
+ )
1803
+ } else {
1804
+ item.children = []
1805
+ item.tableData = []
1806
+ const row = {...item, _subModelKind: 'assess'}
1807
+ this.typeObj.assessModelArray.push(row)
1808
+ this.typeObj.orderedSubModels.push(row)
1809
+ }
1810
+ }
1811
+
1812
+ break
1813
+ // 统计模型
1814
+ case 13: {
1815
+ if (type === 'targetArray') {
1816
+ this.typeObj.targetArray.push({})
1817
+ this.$set(
1818
+ this.typeObj.targetArray,
1819
+ this.typeObj.targetArray.length - 1,
1820
+ await this.itemDataFn(item, data)
1821
+ )
1822
+ } else {
1823
+ item.children = []
1824
+ item.tableData = []
1825
+ const row = {...item, _subModelKind: 'stat'}
1826
+ this.typeObj.statisticsArray.push(row)
1827
+ this.typeObj.orderedSubModels.push(row)
1828
+ }
1829
+ // this.typeObj.targetArray[this.typeObj.targetArray.length - 1] = await this.itemDataFn(item, data)
1830
+ }
1831
+ break
1832
+ default:
1833
+ break
1834
+ }
1835
+ } else if (item.isLeaf === 0) {
1836
+ digui(item)
1837
+ }
1838
+ })
1839
+ }
1840
+ }
1841
+ digui(modelTreeVO)
1842
+ },
1843
+ /** 统计模型表头合并 */
1844
+ mergeCells(table, columns) {
1845
+ const arr1 = setMergeCells({
1846
+ list: table,
1847
+ columns: columns,
1848
+ merges: ['pName'],
1849
+ condition: ['pid'],
1850
+ field: 'prop'
1851
+ })
1852
+ return [...arr1]
1853
+ },
1854
+ digitsCalc(showDigits) {
1855
+ if (showDigits || showDigits === 0) {
1856
+ return showDigits
1857
+ } else {
1858
+ return this.modelData.digits
1859
+ }
1860
+ },
1861
+ indicatorResultFn(row) {
1862
+ let indicatorResult = ''
1863
+ if (row.indicatorResult || row.indicatorResult === 0) {
1864
+ indicatorResult = Number(row.indicatorResult).toFixed(
1865
+ this.digitsCalc(row.showDigits)
1866
+ )
1867
+ }
1868
+ return indicatorResult
1869
+ },
1870
+ async printFn() {
1871
+ const res = await this.$axios.post('/imes/v1/indicatorModel/print', [
1872
+ {logId: this.logId, modelId: this.modelId}
1873
+ ])
1874
+ printJS({
1875
+ printable: res.data,
1876
+ type: 'pdf',
1877
+ base64: true
1878
+ })
1879
+ }
1880
+ }
1881
+ }
1882
+ </script>
1883
+
1884
+ <style scoped lang="less">
1885
+ .el-form-item {
1886
+ margin-bottom: 0;
1887
+ }
1888
+ </style>