feiyu02
2024-09-25 0516cba27e632f20efac2752787f38f0c87baafa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
package cn.flightfeather.supervision.business.autooutput.score
 
import cn.flightfeather.supervision.business.autooutput.datasource.AopDataSource
import cn.flightfeather.supervision.common.utils.UUIDGenerator
import cn.flightfeather.supervision.domain.ds1.entity.Evaluation
import cn.flightfeather.supervision.lightshare.vo.EvaluationSubRuleVo
import cn.flightfeather.supervision.domain.ds1.entity.Itemevaluation
import cn.flightfeather.supervision.lightshare.vo.EvaluationVo
import cn.flightfeather.supervision.lightshare.vo.ItemEvaluationVo
import java.util.*
 
/**
 * 得分计算工具
 * 评分表格分为三个层级
 * 第一层为大分类,第二层为评估标准,第三层为标准对应的不同程度的评估结果
 */
// FIXME: 2024/9/23 目前暂按照三层评估规则进行评估,后续应该优化为不限层数
object ScoreUtil {
 
    /**
     * 根据所选最深层评估选项,给规则赋值对应分数及自动计算其余所有条目得分
     * @param evaluationScene 需要评估的对象
     * @param selected 评估表中选中的评估条目主键id集合(必须是最深一层的评估条目)
     */
    fun scoreAssign(evaluationScene: AopDataSource.EvaluationScene, selected: List<String>) {
        val topRules = evaluationScene.topRules.value
        val subRules = evaluationScene.rules.value
        subRules?.forEach { r ->
            // 根据传入的选中评估条目主键id,修改其得分
            r.second.forEach { e ->
                if (selected.contains(e.guid)) {
                    e.setMaxScore()
                }
            }
            // 根据子项的选择情况,自动计算该条评估的总得分
            subRuleCal(r)
 
            // 补充各最上级评分项的计分
            val fatherId = r.first.fatherid
            for (t in (evaluationScene.topRules.value ?: emptyList())) {
                if (t.guid == fatherId) {
                    t.score += r.first.score
                    break
                }
            }
        }
    }
 
    /**
     * 计算某一具体评分标准的得分,并且根据选项和分数上限计算最终得分
     * @param rulePair 二级和三级评分规则的对应结构
     */
    fun subRuleCal(rulePair: Pair<EvaluationSubRuleVo, MutableList<EvaluationSubRuleVo>>?) {
        val rule = rulePair?.first
        val itemList = rulePair?.second
        var total = 0
        itemList?.forEach {
            total += it.score
        }
//        val s = if (abs(total) > rule?.maxscore!!) {
//            when (rule.extension2) {
//                // 减分模式,记录为扣分(负数)
//                Constant.EvaGradeMode.MINUS_MODE.value -> {
//                    0 - rule.maxscore!!
//                }
//                // 加分模式,记录为得分(正数)
//                Constant.EvaGradeMode.ADD_MODE.value -> {
//                    rule.maxscore!!
//                }
//                // 默认减分模式
//                else -> {
//                    0 - rule.maxscore!!
//                }
//            }
//        } else {
//            total
//        }
//        rule.score = s
        rule?.score = total
    }
 
    /**
     * 生成评估记录结果
     * @param evaluationScene 需要评估的对象
     * @return 评估总分和对应细则得分的数据库结构
     */
    fun genEvaRecord(evaluationScene: AopDataSource.EvaluationScene): Pair<Evaluation, List<Itemevaluation>>? {
        val scene = evaluationScene.scene.value ?: return null
        val topRules = evaluationScene.topRules.value ?: return null
        val baseRule = evaluationScene.baseRule.value
        val rules = evaluationScene.rules.value ?: return null
        val subTask = evaluationScene.subTask.value
        val inspection = evaluationScene.inspection.value
 
        var total = 0 //总得分
        topRules.forEach top@{ top ->
            total += top.getFinalScore()
        }
        val evaluation = EvaluationVo.newAutoEvaluation(inspection, subTask, scene, baseRule, total)
        //子项具体得分
        val itemList = mutableListOf<Itemevaluation>()
        topRules.forEach { subRule ->
            val item = ItemEvaluationVo.newItemEvaluation(baseRule, subTask, inspection, subRule)
            itemList.add(item)
        }
        rules.forEach { p ->
            if (p.first.ertype != 2) {
                val item = ItemEvaluationVo.newItemEvaluation(baseRule, subTask, inspection, p.first)
                itemList.add(item)
            }
            p.second.forEach { r ->
                val item1 = ItemEvaluationVo.newItemEvaluation(baseRule, subTask, inspection, r)
                itemList.add(item1)
            }
        }
        return Pair(evaluation, itemList)
    }
 
    /**
     * 更新评估记录结果
     * @param evaluationScene 需要评估的对象
     * @return 评估总分和对应细则得分的数据库结构
     */
    fun updateEvaRecord(evaluationScene: AopDataSource.EvaluationScene): Pair<Evaluation, List<Itemevaluation>>? {
        val topRules = evaluationScene.topRules.value ?: return null
        val rules = evaluationScene.rules.value ?: return null
 
        val evaluation = evaluationScene.evaluation.value ?: return null
        val itemevaluationList = evaluationScene.itemevaluationList.value ?: return null
 
        var total = 0 //总得分
        topRules.forEach top@{ top ->
            total += top.getFinalScore()
        }
        evaluation.apply {
            resultscorebef = total.toString()
            updatedate = Date()
        }
        //子项具体得分
        topRules.forEach { subRule ->
            itemevaluationList.find { it.esrguid == subRule.guid }?.let {
                it.value = subRule.score.toString()
                it.extension1 = subRule.selected.toString()
            }
        }
        rules.forEach { p ->
            // 可能存在第一层级下属直接为第三层级的情况
            if (p.first.ertype != 2) {
                itemevaluationList.find { it.esrguid == p.first.guid }?.let {
                    it.value = p.first.score.toString()
                    it.extension1 = p.first.selected.toString()
                }
            }
            p.second.forEach { r ->
                itemevaluationList.find { it.esrguid == r.guid }?.let {
                    it.value = r.score.toString()
                    it.extension1 = r.selected.toString()
                }
            }
        }
        return Pair(evaluation, itemevaluationList)
    }
 
    /**
     * 生成新的一条评分记录
     */
    fun newItemEvaluation(evaluationScene: AopDataSource.EvaluationScene, itemRule: EvaluationSubRuleVo) =
        Itemevaluation().apply {
            val rule = evaluationScene.baseRule.value
            val subTask = evaluationScene.subTask.value
            val inspection = evaluationScene.inspection.value
            ieguid = UUIDGenerator.generate16ShortUUID()
            iguid = inspection?.guid
            stguid = subTask?.stguid
            sguid = subTask?.scenseid
            sensename = subTask?.scensename
            erguid = rule?.guid
            rulename = rule?.rulename
            ruletype = rule?.ruletype?.toInt()
            ertype = itemRule.ertype
            esrguid = itemRule.guid
            name = itemRule.itemname
            value = itemRule.score.toString()
            extension1 = itemRule.selected.toString()
        }
 
    /**
     * 分数转换环信码
     */
    fun scoreToCredit(s: Int?): Pair<Int?, String?> {
        return when (s) {
            in 0..59 -> Pair(2, "红码")
            in 60..89 -> Pair(1, "黄码")
            in 90..100 -> Pair(0, "绿码")
            null -> Pair(null, null)
            else -> Pair(-1, "超出范围")
        }
    }
 
    /**
     * 分数转换规范等级
     */
    fun scoreToStandard() {
 
    }
}