src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdMiddleServiceImpl.kt
@@ -3,13 +3,12 @@
import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.common.utils.QueryByCache
import cn.flightfeather.supervision.domain.ds1.entity.SceneConstructionSite
import cn.flightfeather.supervision.domain.ds1.repository.TaskRep
import cn.flightfeather.supervision.lightshare.service.DataProdBaseService
import cn.flightfeather.supervision.lightshare.service.DataProdMiddleService
import cn.flightfeather.supervision.lightshare.vo.dataprod.QueryOpt
import cn.flightfeather.supervision.lightshare.vo.dataprod.middle.DPEvaluationByArea
import cn.flightfeather.supervision.lightshare.vo.dataprod.middle.DPInspectionSummary
import cn.flightfeather.supervision.lightshare.vo.dataprod.middle.DPProblemCountByArea
import cn.flightfeather.supervision.lightshare.vo.dataprod.middle.DPProblemTypeCount
import cn.flightfeather.supervision.lightshare.vo.dataprod.middle.*
import org.springframework.beans.BeanUtils
import org.springframework.stereotype.Service
/**
@@ -18,7 +17,10 @@
 * @author feiyu02
 */
@Service
class DataProdMiddleServiceImpl(private val dataProdBaseService: DataProdBaseService) : DataProdMiddleService {
class DataProdMiddleServiceImpl(
    private val dataProdBaseService: DataProdBaseService, private val taskRep: TaskRep,
) : DataProdMiddleService {
    override fun getInspectionSummary(queryOpt: QueryOpt): DPInspectionSummary {
        return QueryByCache.queryCache(
@@ -34,7 +36,7 @@
                    when (it.scene?.typeid.toString()) {
                        // 对于建筑工地类型,根据其csStatus判断是否停工或完工
                        Constant.SceneType.TYPE1.value -> {
                            when ((it.subScene as SceneConstructionSite).csStatus) {
                            when ((it.subScene as SceneConstructionSite?)?.csStatus) {
                                "停工" -> {
                                    res.stopSceneCount++
                                }
@@ -54,7 +56,6 @@
                }
                return@queryCache res
            },
            save = {}
        )
    }
@@ -62,6 +63,16 @@
        return QueryByCache.queryCache(
            cache = { return@queryCache null },
            calculate = {
                // 查询上一个周期的总任务统计情况
                val lastTopTask = taskRep.findLastTopTask(queryOpt.topTaskId)
                val lastQueryOpt = QueryOpt()
                BeanUtils.copyProperties(queryOpt, lastQueryOpt)
                lastQueryOpt.topTaskId = lastTopTask?.tguid
                val lastInspectionInfo = dataProdBaseService.getInspectionInfo(lastQueryOpt)
                val lastAllProblemList = lastInspectionInfo.flatMap { it.problems ?: emptyList() }
                val lastAllProblemMap = lastAllProblemList.groupBy { it.typeid }
                // 查询当前周期的总任务统计情况
                val res = mutableListOf<DPProblemTypeCount>()
                val inspectionInfo = dataProdBaseService.getInspectionInfo(queryOpt)
                val allProblemList = inspectionInfo.flatMap { it.problems ?: emptyList() }
@@ -71,11 +82,16 @@
                        this.typeName = problemList.firstOrNull()?.typename
                        this.count = problemList.size
                        this.ratio = problemList.size.toDouble() / allProblemList.size
                        this.ratioDiff =
                            if (lastAllProblemMap[typeid] == null) {
                                this.ratio
                            } else {
                                this.ratio - lastAllProblemMap[typeid]!!.size.toDouble() / lastAllProblemList.size
                            }
                    })
                }
                return@queryCache res
            },
            save = {}
        )
    }
@@ -101,13 +117,12 @@
                            this.townName = firstSubtask?.townname
                            this.sceneCount = ins.distinctBy { it.subTask?.scenseid }.size
                            this.problemCount = allProblemList.size
                            this.ratio = problemCount.toDouble() / sceneCount
                            this.proAvg = problemCount.toDouble() / sceneCount
                        })
                    }
                return@queryCache res
            },
            save = {}
        )
    }
@@ -147,7 +162,42 @@
                return@queryCache res
            },
            save = {}
        )
    }
    override fun getTypicalProblems(queryOpt: QueryOpt, rateTotal: Double): List<DPTypicalProblemScene> {
        return QueryByCache.queryCache(
            cache = { return@queryCache null },
            calculate = {
                val res = mutableListOf<DPTypicalProblemScene>()
                val inspectionInfo = dataProdBaseService.getInspectionInfo(queryOpt)
                inspectionInfo.groupBy { it.subTask?.scenseid }.forEach { (sceneId, ins) ->
                    val problems = ins.flatMap { it.problems ?: emptyList() }
                    if (problems.isEmpty()) return@forEach
                    val unChangePros = problems.filter { it.ischanged != true }
                    val changeRatio = if (problems.isNotEmpty()) {
                        (problems.size - unChangePros.size.toDouble()) / problems.size
                    } else {
                        0.0
                    }
                    if (changeRatio < rateTotal) {
                        res.add(DPTypicalProblemScene().apply {
                            val firstSubtask = ins.first().subTask
                            this.sceneId = sceneId
                            this.sceneName = firstSubtask?.scensename
                            this.townCode = firstSubtask?.towncode
                            this.townName = firstSubtask?.townname
                            this.problemCount = problems.size
                            this.changeCount = problems.size - unChangePros.size
                            this.changeRatio = changeRatio
                            this.typicalProblems = unChangePros
                                .distinctBy { it.ptguid }
                        })
                    }
                }
                return@queryCache res
            },
        )
    }
}