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() {
|
|
}
|
}
|