feiyu02
2022-11-15 23bd719cebe5feeff4e48fde925b0b39755eea93
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/Impl/EvaluationServiceImpl.kt
@@ -16,6 +16,7 @@
import com.github.pagehelper.PageHelper
import org.springframework.stereotype.Service
import tk.mybatis.mapper.entity.Example
import java.time.LocalDateTime
import java.util.*
import javax.servlet.http.HttpServletResponse
@@ -75,16 +76,20 @@
        return evaluationMapper.selectByExample(example)
    }
    override fun getHistoryPoint(userId: String, page: Int, per_page: Int, response: HttpServletResponse): List<AssessmentGradeVo> {
    override fun getHistoryPoint(userId: String, page: Int, per_page: Int, platform:String?, response: HttpServletResponse): List<AssessmentGradeVo> {
        val userInfo = userinfoMapper.selectByPrimaryKey(userId) ?: return emptyList()
        // FIXME: 2022/11/8 临时添加过度功能,提供微信小程序前端汽修类型的场景单独的评估清单 ,场景类型为 -7
        var sceneType = userInfo.extension2
        if (platform == "weixin" && sceneType == SceneType.VehicleRepair.value.toString()) {
            sceneType = "-7"
        }
        //评分规则下的分级、等级颜色及等级评语
        val pointLevel = mutableListOf<Pair<Int, Int>>()
        val evaluateLevel = mutableListOf<String>()
        val creditTexts = mutableListOf<String>()
        val levelColors = mutableListOf<String>()
        val rule = evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
            createCriteria().andEqualTo("scensetypeid", userInfo.extension2)
            createCriteria().andEqualTo("scensetypeid", sceneType)
                .andEqualTo("ruletype", "0")
        })
        if (rule.isNotEmpty()) {
@@ -124,7 +129,7 @@
            resultList.add(AssessmentGradeVo().apply {
                this.userId = userId
                userRealName = userInfo.realname
                sceneType = userInfo.extension2?.toIntOrNull() ?: SceneType.NoType.value
                this.sceneType = userInfo.extension2?.toIntOrNull() ?: SceneType.NoType.value
                tPGuid = it.guid
                tPRuleGuid = it.stguid
                totalPoint = it.resultscorebef?.toInt() ?: 0
@@ -144,20 +149,22 @@
    override fun getCreditInfo(userId: String): CreditInfoVo {
        val userinfo = userinfoMapper.selectByPrimaryKey(userId)
        val baseInfo = baseInfoMapper.selectByPrimaryKey(userId)
            ?: return CreditInfoVo(
                userId, userinfo.realname,userinfo.extension2?.toIntOrNull() ?: SceneType.NoType.value)
        val company = companyMapper.selectByPrimaryKey(baseInfo.ciGuid)
        val result = CreditInfoVo(
                userId,
                baseInfo.biName,
                baseInfo?.biName,
                userinfo.extension2?.toIntOrNull() ?: SceneType.NoType.value,
                baseInfo.ciName,
                baseInfo.biManagementCompany,
                baseInfo.biContact,
                baseInfo.biTelephone,
                baseInfo.biAddress,
                district = company.ciDistrictName,
                town = company.ciTownName
                baseInfo?.ciName,
                baseInfo?.biManagementCompany,
                baseInfo?.biContact,
                baseInfo?.biTelephone,
                baseInfo?.biAddress,
                district = company?.ciDistrictName,
                town = company?.ciTownName
        )
        val rule = evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
@@ -169,7 +176,7 @@
        }).takeIf { it.isNotEmpty() }?.get(0) ?: return result
        val overallEvaluation = overallEvaluationMapper.selectByExample(Example(OverallEvaluation::class.java).apply {
            createCriteria().andEqualTo("biGuid", baseInfo.biGuid)
            createCriteria().andEqualTo("biGuid", baseInfo?.biGuid)
            orderBy("oePublishTime").desc()
        }).takeIf { it.isNotEmpty() }?.get(0) ?: return result
@@ -254,10 +261,16 @@
    override fun uploadScore(userId: String, period: String, ruleId: String?, itemList: List<Pair<String, String>>): Boolean {
        val userinfo = userinfoMapper.selectByPrimaryKey(userId) ?: return false
        var sceneType = userinfo.extension2
        // FIXME: 2022/11/8 临时添加过度功能,提供微信小程序前端汽修类型的场景单独的评估清单 ,场景类型为 -7
        if (sceneType == SceneType.VehicleRepair.value.toString()) {
            sceneType = "-7"
        }
        //该场景类型下的总得分规则
        val tRule = evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
            createCriteria().andEqualTo("scensetypeid", userinfo.extension2)
            createCriteria().andEqualTo("scensetypeid", sceneType)
                .andEqualTo("ruletype", AssessmentRuleType.Total.value)
                .andIsNull("tasktypeid")
        }).takeIf { it.isNotEmpty() }?.get(0)
@@ -275,7 +288,7 @@
//        }
        val ruleList = evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
            createCriteria().andEqualTo("scensetypeid", userinfo.extension2)
            createCriteria().andEqualTo("scensetypeid", sceneType)
                    .andNotEqualTo("ruletype", AssessmentRuleType.Total.value)
                .andIsNull("tasktypeid")
        }).forEach {rule->
@@ -290,6 +303,7 @@
            //总得分
            var totalScore = 0
            //根据上传的选择的条目,生成对应的评分记录
            itemList.forEach {
                for (s in subRules) {
                    if (s.guid == it.first) {
@@ -307,8 +321,6 @@
                                }
                            }
                        } while (fatherId?.isNotBlank() == true)
                        totalScore += it.second.toInt()
                        break
                    }
                }
@@ -317,16 +329,21 @@
            //总分
            var maxScore = 0
            subRules.forEach subRules@{s ->
                if (s.ertype == 2) {
                //计算应得总分,basic_score:表示基础分,计算在应得总分内;addition_score表示加分,不计算在内
                if (s.ertype == 2 && s.extension1 != "addition_score") {
                    maxScore += s.maxscore ?: 0
                }
                //规则已经打分完毕,则跳过
                itemEvaluationList.forEach {i ->
                    if (i.esrguid == s.guid) {
                        //如果是最大的2级评估规则,计算已获得的总分
                        if (s.ertype == 2) {
                            totalScore += i.value?.toInt() ?: 0
                        }
                        return@subRules
                    }
                }
                //否则新增一条未扣分的记录
                //否则如果前端允许不用全部评分,新增一条未评分的记录
                itemEvaluationList.add(Itemevaluation().apply {
                    ieguid = UUIDGenerator.generate16ShortUUID()
                    iguid = userId
@@ -376,77 +393,89 @@
    }
    override fun getDetail(userId: String, period: String): GradeDetailVo {
        val list = period.split("-")
        val endM = list[1].toInt()
        val list2 = list[0].split("/")
        val year = list2[0].toInt()
        val startM = list2[1].toInt()
        val st = LocalDateTime.of(year, startM, 1, 0, 0, 0, 0)
        val et = LocalDateTime.of(year, endM, 1, 0, 0, 0, 0).plusMonths(1)
        val result = GradeDetailVo()
        val userinfo = userinfoMapper.selectByPrimaryKey(userId) ?: return result
        var sceneType = userinfo.extension2
        // FIXME: 2022/11/8 临时添加过度功能,提供微信小程序前端汽修类型的场景单独的评估清单 ,场景类型为 -7
        if (sceneType == SceneType.VehicleRepair.value.toString()) {
            sceneType = "-7"
        }
        //该场景类型下的所有得分规则
        var rule0: Evaluationrule? = null
        val rule1List = mutableListOf<Evaluationrule>()
        evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
            createCriteria().andEqualTo("scensetypeid", userinfo.extension2)
                and(createCriteria().orIsNull("tasktypeid").orNotEqualTo("tasktypeid", 1))
        }).forEach {
            if (it.ruletype == AssessmentRuleType.Total.value.toString()) {
                rule0 = it
            } else {
                rule1List.add(it)
            }
        }
        if (rule0 == null) return result
//        var rule0: Evaluationrule? = null
//        val rule1List = mutableListOf<Evaluationrule>()
//        evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
//            createCriteria().andEqualTo("scensetypeid", sceneType)
//                and(createCriteria().orIsNull("tasktypeid").orNotEqualTo("tasktypeid", 1))
//        }).forEach {
//            if (it.ruletype == AssessmentRuleType.Total.value.toString()) {
//                rule0 = it
//            } else {
//                rule1List.add(it)
//            }
//        }
//        if (rule0 == null) return result
        //得分解读和得分详情
        evaluationMapper.selectByExample(Example(Evaluation::class.java).apply {
            createCriteria().andEqualTo("iguid", userId)
                    .andEqualTo("ertype", AssessmentRuleType.Total.value.toByte())
                    .andEqualTo("scensename", period)
        }).takeIf { it.isNotEmpty() }?.get(0)?.let {
            rule0?.apply {
                val pointLevel = mutableListOf<Pair<Int, Int>>()
                val evaluateLevel = mutableListOf<String>()
                val creditTexts = mutableListOf<String>()
                val levelColors = mutableListOf<String>()
                extension1?.split("#")?.forEach {
                    val pStr = it.split(",")
                    pointLevel.add(Pair(pStr[0].toInt(), pStr[1].toInt()))
                }
                extension2?.split("#")?.forEach {
                    evaluateLevel.add(it)
                }
                extension3?.split("#")?.forEach {
                    creditTexts.add(it)
                }
                remark?.split(";")?.forEach {
                    levelColors.add(it)
                }
//                    .andEqualTo("ertype", AssessmentRuleType.Total.value.toByte())
            and(
                    createCriteria().orEqualTo("scensename", period)
                            .orBetween("createdate", st, et)
            )
        }).forEach {e ->
            val rule = evaluationruleMapper.selectByPrimaryKey(e.stguid)
            //总分规则,生成总体评价
            if (rule.ruletype == AssessmentRuleType.Total.value.toString()) {
                rule?.apply {
                    val pointLevel = mutableListOf<Pair<Int, Int>>()
                    val evaluateLevel = mutableListOf<String>()
                    val creditTexts = mutableListOf<String>()
                    val levelColors = mutableListOf<String>()
                    extension1?.split("#")?.forEach {
                        val pStr = it.split(",")
                        pointLevel.add(Pair(pStr[0].toInt(), pStr[1].toInt()))
                    }
                    extension2?.split("#")?.forEach {
                        evaluateLevel.add(it)
                    }
                    extension3?.split("#")?.forEach {
                        creditTexts.add(it)
                    }
                    remark?.split(";")?.forEach {
                        levelColors.add(it)
                    }
                val l = getEvaluationLevel(it.resultscorebef?.toInt()
                        ?: 0, pointLevel, evaluateLevel, creditTexts, levelColors)
                result.apply {
                    creditText = l["creditText"]
                    score = it.resultscorebef?.toInt() ?: 0
                    rank = it.promissednum
                    level = l["evaluateLevel"]
                    this.period = it.scensename
                    time = it.createdate
                    val l = getEvaluationLevel(e.resultscorebef?.toInt()
                            ?: 0, pointLevel, evaluateLevel, creditTexts, levelColors)
                    result.apply {
                        creditText = l["creditText"]
                        score = e.resultscorebef?.toInt() ?: 0
                        rank = e.promissednum
                        level = l["evaluateLevel"]
                        this.period = period
                        time = e.createdate
//                    color = l["color"]
                    }
                }
            }
        }
        //分类别的得分(每个评分表的评分大项的得分)和失分条目
        val ruleMap = result.loseScore
        rule1List.forEach {
            val evaluation = evaluationMapper.selectByExample(Example(Evaluation::class.java).apply {
                createCriteria().andEqualTo("iguid", userId)
                        .andEqualTo("ertype", it.ruletype)
                        .andEqualTo("scensename", period)
            }).takeIf { it.isNotEmpty() }?.get(0)?.let {e ->
            //具体评估表
            else {
                val subRules = evaluationsubruleMapper.selectByExample(Example(Evaluationsubrule::class.java).apply {
                    createCriteria().andEqualTo("erguid", it.guid)
                    createCriteria().andEqualTo("erguid", rule.guid)
                })
                val itemEvaluations = itemevaluationService.getItemEvaluationList(e.guid!!)
                val ruleMap = result.loseScore
                //分类别的得分(每个评分表的评分大项的得分)和失分条目
                itemEvaluations.sortedBy { it.ertype }.forEach {item ->
                    when (item.ertype) {
                        //分类别的得分
@@ -483,19 +512,27 @@
                                for (s in subRules) {
                                    if (s.guid == item.esrguid) {
                                        val d =
                                            Triple(
                                                item.name ?: "",
                                                if ((item.value?.toInt() ?: 0) < 0) {
                                                    item . value ?: "0"
                                                } else {
                                                    (item.value?.toInt() ?: 0).minus(s.maxscore ?: 0).toString()
                                                },
                                                s.remark ?: ""
                                            )
                                                Triple(
                                                        item.name ?: "",
//                                                if ((item.value?.toInt() ?: 0) < 0) {
//                                                    item.value ?: "0"
//                                                } else {
//                                                    (item.value?.toInt() ?: 0).minus(s.maxscore ?: 0).toString()
//                                                },
                                                        item.value ?: "0",
                                                        s.remark ?: ""
                                                )
                                        val rule3Name = s.fathername
                                        for (s1 in subRules) {
                                            if (s1.itemname == rule3Name) {
                                                val rule2Name = s1.fathername
                                                val rule2Name =
                                                //父id为空,说明此4级评估项直接附属于2级评估项
                                                if (s1.fathername.isNullOrBlank()) {
                                                    ruleMap[rule3Name]?.put(rule3Name, mutableListOf())
                                                    rule3Name
                                                } else {
                                                    s1.fathername
                                                }
                                                ruleMap[rule2Name]?.get(rule3Name)?.add(d)
                                                break
                                            }
@@ -509,13 +546,15 @@
                    }
                }
            }
        }
        return result
    }
    /**
     * 根据上传的子规则扣分情况,生产子项得分记录
     * 根据上传的子规则扣分情况,生成子项得分记录
     * @param rule 总规则
     * @param eGuid 总分记录id
     * @param userId 用户id
@@ -528,9 +567,27 @@
        var result: Pair<String?, String?> = Pair(null, null)
        var exist = false
        for (i in itemEvaluationList) {
            //记录已存在,说明是父项的评分规则下的某个子项的一部分扣分,扣分累加
            //记录已存在,说明是父项的评分规则下的某个子项的一部分扣分,扣分累加,并且不能超过父项的上限
            if (subRule.guid == i.esrguid) {
                i.value = i.value?.toInt()?.plus(score.toInt())?.toString()
                val s = i.value?.toInt()?.plus(score.toInt()) ?: 0
                //加分模式
                if (subRule.extension2 == "add_mode") {
                    if (s > (subRule.maxscore ?: 0)) {
                        i.value = subRule.maxscore?.toString() ?: "0"
                    } else {
                        i.value = s.toString()
                    }
                }
                //默认情况为减分模式
                else {
                    //允许扣除的分数最小值(负数)
                    val min = subRule.minscore?.minus(subRule.maxscore ?: 0) ?: 0
                    if (s < min) {
                        i.value = min.toString()
                    } else {
                        i.value = s.toString()
                    }
                }
                result = Pair(subRule.fatherid, i.value)
                exist = true
                break
@@ -578,7 +635,8 @@
            }
        } else {
            for (i in pointLevel.indices) {
                if (score in pointLevel[i].first..pointLevel[i].second) {
                if (score in pointLevel[i].first..pointLevel[i].second ||
                        (i == pointLevel.size - 1 && score > pointLevel[i].second)) {
                    result["color"] = levelColors[i % levelColors.size]
                    result["creditText"] = creditTexts[i % creditTexts.size]
                    result["evaluateLevel"] = evaluateLevel[i % evaluateLevel.size]