feiyu02
2024-09-25 0516cba27e632f20efac2752787f38f0c87baafa
src/main/kotlin/cn/flightfeather/supervision/business/autooutput/datasource/AopDataSource.kt
@@ -1,11 +1,14 @@
package cn.flightfeather.supervision.business.autooutput.datasource
import cn.flightfeather.supervision.common.exception.BizException
import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.domain.ds1.entity.*
import cn.flightfeather.supervision.domain.ds2.entity.LedgerRecord
import cn.flightfeather.supervision.domain.ds2.entity.LedgerSubType
import cn.flightfeather.supervision.domain.ds2.entity.UserMap
import cn.flightfeather.supervision.domain.ds2.entity.UserinfoTZ
import cn.flightfeather.supervision.lightshare.vo.EvaluationSubRuleVo
import org.springframework.beans.BeanUtils
import tk.mybatis.mapper.entity.Example
import java.time.LocalDateTime
import java.time.ZoneId
@@ -47,10 +50,49 @@
        }
    }
    fun setResource(subtask: Subtask) {
        val scene = aopDbMapper.scenseMapper.selectByPrimaryKey(subtask.scenseid)
        val sceneType = scene.typeid?.toInt()
        val config = AopDataConfig(topTaskGuid = subtask.tguid, sceneType = sceneType,
            districtName = subtask.districtname, townCode = subtask.towncode)
        evaluationScene.config = config
//        val check = aopSceneTypeCheck.checkSceneType(sceneType)
        this.mode = 0
        sceneSourceList.clear()
        sceneSourceList.add(scene)
    }
    /**
     * 轮询数据源
     */
    fun loop(callback: (index:Int, evaluationScene: EvaluationScene) -> Unit) {
        when (mode) {
            0 -> {
                sceneSourceList.forEachIndexed { i, scene ->
                    evaluationScene.clear()
                    evaluationScene.index = i
                    evaluationScene.setDefaultScene(scene)
                    do {
                        callback(i, evaluationScene)
                    } while (evaluationScene.gotoNextSubTask())
                }
            }
            1 -> {
                userSourceList.forEachIndexed { i, user ->
                    evaluationScene.clear()
                    evaluationScene.index = i
                    evaluationScene.setDefaultUserTZ(user)
                    callback(i, evaluationScene)
                }
            }
        }
    }
    /**
     * 根据子任务只轮询一次
     * 当数据源是通过[setResource]传入[Subtask]时决定时
     */
    fun runBySubTask(callback: (index: Int, evaluationScene: EvaluationScene) -> Unit) {
        when (mode) {
            0 -> {
                sceneSourceList.forEachIndexed { i, scene ->
@@ -73,23 +115,16 @@
    // 从监管系统获取场景
    private fun initSceneSource(config: AopDataConfig) {
        config.topTaskGuid ?: throw IllegalStateException("顶层任务id不能为null")
        config.topTaskGuid ?: throw BizException("顶层任务id不能为null")
        this.config = config
        this.mode = 0
        sceneSourceList.clear()
        val taskSceneIdList =
            aopDbMapper.monitorobjectversionMapper.getSceneByType(config.topTaskGuid, config.sceneType, config.townCode)
        aopDbMapper.scenseMapper.selectByExample(Example(Scense::class.java).apply {
            createCriteria()
                .andIn("guid", taskSceneIdList)
//                .andEqualTo("provincecode", config.provinceCode)
//                .andEqualTo("citycode", config.cityCode)
//                .andEqualTo("districtcode", config.districtCode)
//                .andEqualTo("towncode", config.townCode)
//                .andEqualTo("typeid", config.sceneType)
//                .andNotEqualTo("extension1", '0')
        })?.let { sceneSourceList.addAll(it) }
            aopDbMapper.scenseMapper.getSceneByType(config.topTaskGuid, config.sceneType, config.townCode)
        taskSceneIdList.forEach {
            println(it.name)
        }
        sceneSourceList.addAll(taskSceneIdList)
    }
    // 从台账系统获取场景
@@ -147,12 +182,21 @@
            })
        }
        //巡查任务信息
        var subTaskIndex = 0
        val subTask = InfoProxy<Subtask> {_,_ ->
            return@InfoProxy if (subTaskList.value?.isNotEmpty() == true) {
                subTaskList.value?.get(subTaskIndex)
            } else {
                null
            }
        }
        val subTaskList = InfoProxy<List<Subtask>> {_,_ ->
            return@InfoProxy aopDbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
                createCriteria().andEqualTo("scenseid", scene.value?.guid)
//                    .andBetween("planstarttime", config?.startTime, config?.endTime)
                    .andEqualTo("tguid", config?.topTaskGuid)
            })?.takeIf { it.isNotEmpty() }?.get(0)
            })
        }
        //现场巡查信息
@@ -166,23 +210,23 @@
        val baseScene = InfoProxy<BaseScene> {_,_ ->
            return@InfoProxy when (config?.sceneType.toString()) {
                // 监管系统
                Constant.ScenseType.TYPE1.value -> {
                Constant.SceneType.TYPE1.value -> {
                    aopDbMapper.sceneConstructionSiteMapper.selectByPrimaryKey(scene.value?.guid)
                }
                Constant.ScenseType.TYPE2.value -> {
                Constant.SceneType.TYPE2.value -> {
                    aopDbMapper.sceneWharfMapper.selectByPrimaryKey(scene.value?.guid)
                }
                Constant.ScenseType.TYPE3.value -> {
                Constant.SceneType.TYPE3.value -> {
                    aopDbMapper.sceneMixingPlantMapper.selectByPrimaryKey(scene.value?.guid)
                }
                Constant.ScenseType.TYPE14.value -> {
                Constant.SceneType.TYPE14.value -> {
                    aopDbMapper.sceneStorageYardMapper.selectByPrimaryKey(scene.value?.guid)
                }
                // 台账系统
                Constant.ScenseType.TYPE5.value -> {
                Constant.SceneType.TYPE5.value -> {
                    aopDbMapper.restaurantBaseInfoMapper.selectByPrimaryKey(userInfoTZ.value?.guid)
                }
                Constant.ScenseType.TYPE6.value -> {
                Constant.SceneType.TYPE6.value -> {
                    aopDbMapper.vehicleBaseInfoMapper.selectByPrimaryKey(userInfoTZ.value?.guid)
                }
                else -> null
@@ -231,9 +275,9 @@
        val totalScore = InfoProxy<Int>()
        //自动评分规则一级分类
        val topItems = InfoProxy<MutableList<Evaluationsubrule2>>(config?.sceneType.toString()) { _, cacheMap ->
            val _topItems = mutableListOf<Evaluationsubrule2>()
            val _rules = mutableListOf<Pair<Evaluationsubrule2, MutableList<Evaluationsubrule2>>>()
        val topRules = InfoProxy<MutableList<EvaluationSubRuleVo>>(config?.sceneType.toString()) { _, cacheMap ->
            val _topItems = mutableListOf<EvaluationSubRuleVo>()
            val _rules = mutableListOf<Pair<EvaluationSubRuleVo, MutableList<EvaluationSubRuleVo>>>()
            val rule = aopDbMapper.evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
                createCriteria()
                    .andEqualTo("tasktypeid", 99)
@@ -247,7 +291,11 @@
                val rules =
                    aopDbMapper.evaluationsubruleMapper.selectByExample(Example(Evaluationsubrule2::class.java).apply {
                        createCriteria().andEqualTo("erguid", ruleId)
                    })
                    }).map {
                        val vo = EvaluationSubRuleVo()
                        BeanUtils.copyProperties(it, vo)
                        vo
                    }
                rules.forEach {
                    if (it.ertype == 2) {
                        _topItems.add(it)
@@ -258,7 +306,7 @@
                var t = 0
                _topItems.forEach {
                    t += it.maxscore ?: 0
                    val tempRules = mutableListOf<Evaluationsubrule2>()
                    val tempRules = mutableListOf<EvaluationSubRuleVo>()
                    for (i in rules) {
                        if (i.fatherid == it.guid && i.ertype == 3) {
                            tempRules.add(i)
@@ -270,7 +318,7 @@
                    }
                    tempRules.sortBy { t -> t.displayid }
                    tempRules.forEach { temp ->
                        val tempSubRules = mutableListOf<Evaluationsubrule2>()
                        val tempSubRules = mutableListOf<EvaluationSubRuleVo>()
                        for (i in rules) {
                            if (i.fatherid == temp.guid && i.ertype == 4) {
                                tempSubRules.add(i)
@@ -291,11 +339,11 @@
        // FIXME: 2023/8/9 子规则的获取必须在[topItems]调用之后,否则为空
        //自动评分规则二级和三级分类
        val rules = InfoProxy<MutableList<Pair<Evaluationsubrule2, MutableList<Evaluationsubrule2>>>>()
        val rules = InfoProxy<MutableList<Pair<EvaluationSubRuleVo, MutableList<EvaluationSubRuleVo>>>>()
        //必填台账数量
        val ledgerCount = InfoProxy<Int>(config?.sceneType.toString()) {_, cacheMap ->
            val tzSceneType = Constant.ScenseType.typeMap(scene.value?.typeid)
            val tzSceneType = Constant.SceneType.typeMap(scene.value?.typeid)
            val list = aopDbMapper.ledgerSubTypeMapper.selectCountByExample(Example(LedgerSubType::class.java).apply {
                createCriteria().andEqualTo("lScenetype", tzSceneType).andEqualTo("lNeedupdate", true)
            })
@@ -338,21 +386,43 @@
         */
        fun clear() {
            scene.clear()
            subTaskIndex = 0
            subTaskList.clear()
            userInfo.clear()
            userInfoTZ.clear()
            baseScene.clear()
            problemTypes.clear()
            ledgerCount.clear()
            ledgerRecords.clear()
            clearSubtask()
        }
        fun clearSubtask() {
            subTask.clear()
            inspection.clear()
            baseScene.clear()
            problems.clear()
            evaluation.clear()
            itemevaluationList.clear()
            problemTypes.clear()
            baseRule.clear()
            totalScore.clear()
            topItems.clear()
            topRules.clear()
            baseRule.clear()
            rules.clear()
            ledgerCount.clear()
            ledgerRecords.clear()
        }
        /**
         * 切换至下一个巡查任务
         * 一个场景可能同时存在多个巡查任务[subTaskList],需要对每个巡查任务分别进行评分
         * @return 是否有下一个巡查任务
         */
        fun gotoNextSubTask(): Boolean {
            return if (subTaskIndex + 1 < (subTaskList.value?.size ?: 0)) {
                clearSubtask()
                subTaskIndex++
                true
            } else {
                false
            }
        }
        /**