@nstc-business/imes 1.0.9 → 1.0.11

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