From 8c15c9cc0d6474ed77e313258f9b09f7f2d6366e Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期三, 17 九月 2025 17:29:47 +0800
Subject: [PATCH] 2025.9.17 1. 新增数据产品接口

---
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPEvaluateInfo.kt              |   16 +
 src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdMiddleService.kt           |   35 ++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPInspectionSummary.kt  |   34 ++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdFinalService.kt            |    9 
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPMonitorDataInfo.kt           |   12 
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPSceneInfo.kt                 |   26 +
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemTypeCount.kt   |   28 +
 src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdBaseController.kt              |   42 ++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdMiddleServiceImpl.kt  |  153 ++++++++++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdMiddleController.kt            |   48 +++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/ScenseVo.kt                             |   12 
 src/main/kotlin/cn/flightfeather/supervision/business/autooutput/datasource/AopDbMapper.kt         |    3 
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPInspectionInfo.kt            |   15 +
 src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdBaseServiceImpl.kt    |  209 +++++++++++++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdBaseService.kt             |   31 ++
 src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt                              |    4 
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPEvaluationByArea.kt   |   59 +++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdFinalController.kt             |   16 +
 src/main/kotlin/cn/flightfeather/supervision/common/utils/QueryByCache.kt                          |   26 +
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/QueryOpt.kt                    |   41 ++
 src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemCountByArea.kt |   38 ++
 21 files changed, 844 insertions(+), 13 deletions(-)

diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/autooutput/datasource/AopDbMapper.kt b/src/main/kotlin/cn/flightfeather/supervision/business/autooutput/datasource/AopDbMapper.kt
index 4586daa..8208268 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/business/autooutput/datasource/AopDbMapper.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/autooutput/datasource/AopDbMapper.kt
@@ -28,5 +28,6 @@
     val userMapMapper: UserMapMapper,
     val townMapper: TownMapper,
     val restaurantBaseInfoMapper: RestaurantBaseInfoMapper,
-    val vehicleBaseInfoMapper: VehicleBaseInfoMapper
+    val vehicleBaseInfoMapper: VehicleBaseInfoMapper,
+    val dustDataResultMapper: DustDataResultMapper
 )
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt b/src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt
index bece96e..a240500 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt
@@ -24,6 +24,10 @@
     enum class RuleType(val value: Byte, val text: String){
         STANDARD(1,"瑙勮寖鎬�"), SCORE(2,"璇勫垎")
     }
+    //瑙勮寖鎬х瓑绾�
+    enum class EvaluationLevel(val value: Byte, val text: String){
+        A(1,"瑙勮寖"), B(2,"鍩烘湰瑙勮寖"), C(3,"涓嶈鑼�"), D(4,"涓ラ噸涓嶈鑼�")
+    }
     //浠诲姟鐘舵��
     enum class TaskProgress(val value: String, val text: String){
         RUNINGSTATUS1("1","鏈墽琛�"),
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/utils/QueryByCache.kt b/src/main/kotlin/cn/flightfeather/supervision/common/utils/QueryByCache.kt
new file mode 100644
index 0000000..a024094
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/utils/QueryByCache.kt
@@ -0,0 +1,26 @@
+package cn.flightfeather.supervision.common.utils
+
+/**
+ * 缂撳瓨鏌ヨ宸ュ叿绫�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+object QueryByCache {
+
+    /**
+     * 缂撳瓨鏌ヨ
+     * @param cache 缂撳瓨鑾峰彇鏂规硶
+     * @param calculate 璁$畻鏂规硶
+     * @param save 缂撳瓨淇濆瓨鏂规硶
+     * @return
+     */
+    fun <T> queryCache(cache: () -> T?, calculate: () -> T, save: (t: T) -> Unit): T {
+        val cacheData = cache.invoke()
+        if (cacheData != null) {
+            return cacheData
+        }
+        val calculateData = calculate.invoke()
+        save.invoke(calculateData)
+        return calculateData
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdBaseService.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdBaseService.kt
new file mode 100644
index 0000000..4da47e1
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdBaseService.kt
@@ -0,0 +1,31 @@
+package cn.flightfeather.supervision.lightshare.service
+
+import cn.flightfeather.supervision.lightshare.vo.dataprod.*
+
+/**
+ * 鍩虹鏁版嵁浜у搧鏈嶅姟鎺ュ彛
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+interface DataProdBaseService {
+
+    /**
+     * 鑾峰彇鏁版嵁浜у搧鍦烘櫙淇℃伅
+     */
+    fun getSceneInfo(queryOpt: QueryOpt): List<DPSceneInfo>
+
+    /**
+     * 鑾峰彇鏁版嵁浜у搧瑙勮寖璇勪及淇℃伅
+     */
+    fun getEvaluateInfo(queryOpt: QueryOpt): List<DPEvaluateInfo>
+
+    /**
+     * 鑾峰彇鏁版嵁浜у搧宸℃煡淇℃伅
+     */
+    fun getInspectionInfo(queryOpt: QueryOpt): List<DPInspectionInfo>
+
+    /**
+     * 鑾峰彇鏁版嵁浜у搧鐩戞祴鏁版嵁淇℃伅
+     */
+    fun getMonitorDataInfo(queryOpt: QueryOpt): List<DPMonitorDataInfo>
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdFinalService.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdFinalService.kt
new file mode 100644
index 0000000..6917fd1
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdFinalService.kt
@@ -0,0 +1,9 @@
+package cn.flightfeather.supervision.lightshare.service
+
+/**
+ * 鏈�缁堟暟鎹骇鍝佹湇鍔℃帴鍙�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+interface DataProdFinalService {
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdMiddleService.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdMiddleService.kt
new file mode 100644
index 0000000..11904b5
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/DataProdMiddleService.kt
@@ -0,0 +1,35 @@
+package cn.flightfeather.supervision.lightshare.service
+
+import cn.flightfeather.supervision.lightshare.vo.dataprod.middle.DPInspectionSummary
+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.DPProblemCountByArea
+import cn.flightfeather.supervision.lightshare.vo.dataprod.middle.DPProblemTypeCount
+
+/**
+ * 涓棿鏁版嵁浜у搧鏈嶅姟鎺ュ彛
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+interface DataProdMiddleService {
+
+    /**
+     * 宸℃煡瀹屾垚鎯呭喌姹囨��
+     */
+    fun getInspectionSummary(queryOpt: QueryOpt): DPInspectionSummary
+
+    /**
+     * 闂鍒嗙被姹囨��
+     */
+    fun getProblemTypeSummary(queryOpt: QueryOpt): List<DPProblemTypeCount>
+
+    /**
+     * 鍒嗗尯鍩熷崟鍦烘櫙闂鏁伴噺
+     */
+    fun getProblemCountByArea(queryOpt: QueryOpt): List<DPProblemCountByArea>
+
+    /**
+     * 鍒嗗尯鍩熻鑼冩�ф儏鍐�
+     */
+    fun getEvaluationByArea(queryOpt: QueryOpt): List<DPEvaluationByArea>
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdBaseServiceImpl.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdBaseServiceImpl.kt
new file mode 100644
index 0000000..4fd0203
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdBaseServiceImpl.kt
@@ -0,0 +1,209 @@
+package cn.flightfeather.supervision.lightshare.service.impl
+
+import cn.flightfeather.supervision.business.autooutput.datasource.AopDbMapper
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.QueryByCache
+import cn.flightfeather.supervision.domain.ds1.entity.*
+import cn.flightfeather.supervision.lightshare.service.DataProdBaseService
+import cn.flightfeather.supervision.lightshare.vo.ProblemListVo
+import cn.flightfeather.supervision.lightshare.vo.dataprod.*
+import org.springframework.beans.BeanUtils
+import org.springframework.stereotype.Service
+import tk.mybatis.mapper.entity.Example
+
+/**
+ *
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+@Service
+class DataProdBaseServiceImpl(private val aopDbMapper: AopDbMapper) : DataProdBaseService {
+
+    override fun getSceneInfo(queryOpt: QueryOpt): List<DPSceneInfo> {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = mutableListOf<DPSceneInfo>()
+                val objList = aopDbMapper.monitorobjectversionMapper.selectByExample(Example(Monitorobjectversion::class.java).apply {
+                    createCriteria().andEqualTo("tid", queryOpt.topTaskId)
+                })
+                if (objList.isEmpty()) return@queryCache emptyList<DPSceneInfo>()
+
+                val guidList = objList.map { it.sguid }
+                val baseScene = aopDbMapper.scenseMapper.selectByExample(Example(Scense::class.java).apply {
+                    createCriteria().andIn("guid", guidList)
+                        .andEqualTo("typeid", queryOpt.sceneTypeId)
+                    orderBy("typeid").orderBy("index")
+                })
+                baseScene.groupBy { it.typeid }.forEach { (typeid, sceneList) ->
+                    when (typeid.toString()) {
+                        Constant.SceneType.TYPE1.value -> {
+                            val subScene = aopDbMapper.sceneConstructionSiteMapper.selectByExample(Example(SceneConstructionSite::class.java).apply {
+                                createCriteria().andIn("sGuid", sceneList.map { it.guid })
+                            })
+                            sceneList.forEach {
+                                val sub = subScene.find { sub-> sub.getsGuid() == it.guid }
+                                res.add(DPSceneInfo().apply {
+                                    this.scene = it
+                                    this.subScene = sub
+                                    this.status = sub?.csStatus
+                                    this.statusBool = sub?.csStatus == "寤鸿涓�"
+                                    this.stage = sub?.siExtension1
+                                })
+                            }
+                        }
+                        Constant.SceneType.TYPE2.value -> {
+                            val subScene = aopDbMapper.sceneWharfMapper.selectByExample(Example(SceneWharf::class.java).apply {
+                                createCriteria().andIn("sGuid", sceneList.map { it.guid })
+                            })
+                            sceneList.forEach {
+                                val sub = subScene.find { sub-> sub.getsGuid() == it.guid }
+                                res.add(DPSceneInfo().apply {
+                                    this.scene = it
+                                    this.subScene = sub
+                                    this.status = sub?.getwStatus()
+                                    this.statusBool = sub?.getwStatus() == "钀ヨ繍涓�"
+                                })
+                            }
+                        }
+                        Constant.SceneType.TYPE3.value -> {
+                            val subScene = aopDbMapper.sceneMixingPlantMapper.selectByExample(Example(SceneMixingPlant::class.java).apply {
+                                createCriteria().andIn("sGuid", sceneList.map { it.guid })
+                            })
+                            sceneList.forEach {
+                                val sub = subScene.find { sub-> sub.getsGuid() == it.guid }
+                                res.add(DPSceneInfo().apply {
+                                    this.scene = it
+                                    this.subScene = sub
+                                    this.status = sub?.mpStatus
+                                    this.statusBool = sub?.mpStatus == "钀ヨ繍涓�"
+                                })
+                            }
+                        }
+                        Constant.SceneType.TYPE14.value -> {
+                            val subScene = aopDbMapper.sceneStorageYardMapper.selectByExample(Example
+                                (SceneStorageYard::class.java).apply {
+                                createCriteria().andIn("sGuid", sceneList.map { it.guid })
+                            })
+                            sceneList.forEach {
+                                val sub = subScene.find { sub-> sub.getsGuid() == it.guid }
+                                res.add(DPSceneInfo().apply {
+                                    this.scene = it
+                                    this.subScene = sub
+                                    this.status = sub?.syStatus
+                                    this.statusBool = sub?.syStatus == "钀ヨ繍涓�"
+                                })
+                            }
+                        }
+                        else -> {
+                            sceneList.forEach {
+                                res.add(DPSceneInfo().apply {
+                                    this.scene = it
+                                })
+                            }
+                        }
+                    }
+                }
+                return@queryCache res
+            },
+            save = {  }
+        )
+    }
+
+    override fun getEvaluateInfo(queryOpt: QueryOpt): List<DPEvaluateInfo> {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = mutableListOf<DPEvaluateInfo>()
+                val subtaskList = aopDbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
+                    createCriteria().andEqualTo("tguid", queryOpt.topTaskId)
+                })
+                if (subtaskList.isEmpty()) return@queryCache emptyList<DPEvaluateInfo>()
+
+                aopDbMapper.evaluationMapper.selectByExample(Example(Evaluation::class.java).apply {
+                    createCriteria().andIn("stguid", subtaskList.map { it.stguid })
+                }).forEach {
+                    res.add(DPEvaluateInfo().apply {
+                        subTask = subtaskList.find { sub-> sub.stguid == it.stguid }
+                        evaluate = it
+                        val score = it.resultscorebef?.toIntOrNull() ?: -1
+                        scoreLevel = when {
+                            score in 0..39 -> Constant.EvaluationLevel.D.text
+                            score in 40..89 -> Constant.EvaluationLevel.C.text
+                            score in 90..99 -> Constant.EvaluationLevel.B.text
+                            score >= 100 -> Constant.EvaluationLevel.A.text
+                            else -> ""
+                        }
+                    })
+                }
+                return@queryCache res
+            },
+            save = {  }
+        )
+    }
+
+    override fun getInspectionInfo(queryOpt: QueryOpt): List<DPInspectionInfo> {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = mutableListOf<DPInspectionInfo>()
+                val subtaskList = aopDbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
+                    createCriteria().andEqualTo("tguid", queryOpt.topTaskId)
+                })
+                if (subtaskList.isEmpty()) return@queryCache emptyList<DPInspectionInfo>()
+
+                val problemList = aopDbMapper.problemlistMapper.selectByExample(Example(Problemlist::class.java).apply {
+                    createCriteria().andIn("stguid", subtaskList.map { it.stguid })
+                })
+
+                val problemTypeList = aopDbMapper.problemtypeMapper.selectByExample(Example(Problemtype::class.java)
+                    .apply { createCriteria().andIn("guid", problemList.map { it.ptguid }) })
+
+                subtaskList.forEach {
+                    res.add(DPInspectionInfo().apply {
+                        subTask = it
+                        problems = problemList.filter { problem-> problem.stguid == it.stguid }.map { problem->
+                            val problemListVo = ProblemListVo()
+                            BeanUtils.copyProperties(problem, problemListVo)
+                            problemListVo.apply {
+                                problemTypeList.find { type-> type.guid == problem.ptguid }?.let {
+                                    typeid = it.typeid
+                                    typename = it.typename
+                                }
+                            }
+                            // TODO 濯掍綋鏂囦欢
+                        }
+                    })
+                }
+
+                return@queryCache res
+            },
+            save = {  }
+        )
+    }
+
+    override fun getMonitorDataInfo(queryOpt: QueryOpt): List<DPMonitorDataInfo> {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = mutableListOf<DPMonitorDataInfo>()
+                val objList = aopDbMapper.monitorobjectversionMapper.selectByExample(Example(Monitorobjectversion::class.java).apply {
+                    createCriteria().andEqualTo("tid", queryOpt.topTaskId)
+                })
+                if (objList.isEmpty()) return@queryCache res
+
+                aopDbMapper.dustDataResultMapper.selectByExample(Example(DustDataResult::class.java).apply {
+                    createCriteria().andBetween("drTime", queryOpt.startTime, queryOpt.endTime)
+                        .andIn("objectId", objList.map { it.sguid })
+                }).forEach {
+                    res.add(DPMonitorDataInfo().apply {
+                        data = it
+                    })
+                }
+
+                return@queryCache res
+            },
+            save = {  }
+        )
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdMiddleServiceImpl.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdMiddleServiceImpl.kt
new file mode 100644
index 0000000..b6e4029
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/DataProdMiddleServiceImpl.kt
@@ -0,0 +1,153 @@
+package cn.flightfeather.supervision.lightshare.service.impl
+
+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.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 org.springframework.stereotype.Service
+
+/**
+ *
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+@Service
+class DataProdMiddleServiceImpl(private val dataProdBaseService: DataProdBaseService) : DataProdMiddleService {
+
+    override fun getInspectionSummary(queryOpt: QueryOpt): DPInspectionSummary {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = DPInspectionSummary()
+                val inspectionInfo = dataProdBaseService.getInspectionInfo(queryOpt)
+                val sceneInfo = dataProdBaseService.getSceneInfo(queryOpt)
+                res.sceneCount = sceneInfo.size
+                res.pointCount = inspectionInfo.size
+                res.reviewPointCount = inspectionInfo.size - inspectionInfo.distinctBy { it.subTask?.scenseid }.size
+                sceneInfo.forEach {
+                    when (it.scene?.typeid.toString()) {
+                        // 瀵逛簬寤虹瓚宸ュ湴绫诲瀷锛屾牴鎹叾csStatus鍒ゆ柇鏄惁鍋滃伐鎴栧畬宸�
+                        Constant.SceneType.TYPE1.value -> {
+                            when ((it.subScene as SceneConstructionSite).csStatus) {
+                                "鍋滃伐" -> {
+                                    res.stopSceneCount++
+                                }
+
+                                "瀹屽伐" -> {
+                                    res.completeSceneCount++
+                                }
+                            }
+                        }
+                        // 瀵逛簬鍏朵粬绫诲瀷锛屾牴鎹叾extension1锛堜唬琛ㄦ槸鍚︿笂绾匡級鍒ゆ柇鏄惁瀹屽伐
+                        else -> {
+                            if (it.scene?.extension1 != "1") {
+                                res.completeSceneCount++
+                            }
+                        }
+                    }
+                }
+                return@queryCache res
+            },
+            save = {}
+        )
+    }
+
+    override fun getProblemTypeSummary(queryOpt: QueryOpt): List<DPProblemTypeCount> {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = mutableListOf<DPProblemTypeCount>()
+                val inspectionInfo = dataProdBaseService.getInspectionInfo(queryOpt)
+                val allProblemList = inspectionInfo.flatMap { it.problems ?: emptyList() }
+                allProblemList.groupBy { it.typeid }.forEach { (typeid, problemList) ->
+                    res.add(DPProblemTypeCount().apply {
+                        this.typeId = typeid
+                        this.typeName = problemList.firstOrNull()?.typename
+                        this.count = problemList.size
+                        this.ratio = problemList.size.toDouble() / allProblemList.size
+                    })
+                }
+                return@queryCache res
+            },
+            save = {}
+        )
+    }
+
+    override fun getProblemCountByArea(queryOpt: QueryOpt): List<DPProblemCountByArea> {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = mutableListOf<DPProblemCountByArea>()
+                val inspectionInfo = dataProdBaseService.getInspectionInfo(queryOpt)
+                inspectionInfo
+                    .groupBy { it.subTask?.provincecode + it.subTask?.citycode + it.subTask?.districtcode + it.subTask?.towncode }
+                    .forEach { (areaName, ins) ->
+                        val firstSubtask = ins.first().subTask
+                        val allProblemList = ins.flatMap { it.problems ?: emptyList() }
+                        res.add(DPProblemCountByArea().apply {
+                            this.provinceCode = firstSubtask?.provincecode
+                            this.provinceName = firstSubtask?.provincename
+                            this.cityCode = firstSubtask?.citycode
+                            this.cityName = firstSubtask?.cityname
+                            this.districtCode = firstSubtask?.districtcode
+                            this.districtName = firstSubtask?.districtname
+                            this.townCode = firstSubtask?.towncode
+                            this.townName = firstSubtask?.townname
+                            this.sceneCount = ins.distinctBy { it.subTask?.scenseid }.size
+                            this.problemCount = allProblemList.size
+                            this.ratio = problemCount.toDouble() / sceneCount
+                        })
+                    }
+
+                return@queryCache res
+            },
+            save = {}
+        )
+    }
+
+    override fun getEvaluationByArea(queryOpt: QueryOpt): List<DPEvaluationByArea> {
+        return QueryByCache.queryCache(
+            cache = { return@queryCache null },
+            calculate = {
+                val res = mutableListOf<DPEvaluationByArea>()
+                val sceneInfo = dataProdBaseService.getSceneInfo(queryOpt)
+                val evaluation = dataProdBaseService.getEvaluateInfo(queryOpt)
+                evaluation
+                    .groupBy { it.subTask?.provincecode + it.subTask?.citycode + it.subTask?.districtcode + it.subTask?.towncode }
+                    .forEach { (areaName, evals) ->
+                        val firstSubtask = evals.first().subTask
+                        res.add(DPEvaluationByArea().apply {
+                            this.provinceCode = firstSubtask?.provincecode
+                            this.provinceName = firstSubtask?.provincename
+                            this.cityCode = firstSubtask?.citycode
+                            this.cityName = firstSubtask?.cityname
+                            this.districtCode = firstSubtask?.districtcode
+                            this.districtName = firstSubtask?.districtname
+                            this.townCode = firstSubtask?.towncode
+                            this.townName = firstSubtask?.townname
+                            this.validSceneCount = sceneInfo
+                                .filter {
+                                    it.scene?.provincecode + it.scene?.citycode + it.scene?.districtcode + it.scene?.towncode == areaName
+                                            && it.statusBool
+                                }.size
+                            this.evaluationCount = evals.size
+                            this.evalLevelACount = evals.count { it.scoreLevel == Constant.EvaluationLevel.A.text }
+                            this.evalLevelBCount = evals.count { it.scoreLevel == Constant.EvaluationLevel.B.text }
+                            this.evalLevelCCount = evals.count { it.scoreLevel == Constant.EvaluationLevel.C.text }
+                            this.evalLevelDCount = evals.count { it.scoreLevel == Constant.EvaluationLevel.D.text }
+                            this.evalLevelRatioAB = (this.evalLevelACount + this.evalLevelBCount).toDouble() / this.evaluationCount
+                        })
+                    }
+
+                return@queryCache res
+            },
+            save = {}
+        )
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/ScenseVo.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/ScenseVo.kt
index 45e3a5b..103a3a6 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/ScenseVo.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/ScenseVo.kt
@@ -74,16 +74,4 @@
     var monitorNum: Int = 0
 
     var inspectedNum: Int = 0
-}
-
-/**
- * 鏍规嵁鍦烘櫙id鎵惧埌鍦烘櫙
- */
-fun List<Scense?>.findByGuid(guid: String?): Scense? {
-    this.forEach {
-        if (it?.guid == guid) {
-            return it
-        }
-    }
-    return null
 }
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPEvaluateInfo.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPEvaluateInfo.kt
new file mode 100644
index 0000000..2ec2707
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPEvaluateInfo.kt
@@ -0,0 +1,16 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod
+
+import cn.flightfeather.supervision.domain.ds1.entity.Evaluation
+import cn.flightfeather.supervision.domain.ds1.entity.Subtask
+
+/**
+ * 鏁版嵁浜у搧瑙勮寖璇勪及淇℃伅绫�
+ * 鐢ㄤ簬灏佽鍦烘櫙鐨勮鑼冭瘎浼版暟鎹紝鍖呮嫭鍦烘櫙鍩烘湰淇℃伅鍜岃瘎浼扮粨鏋�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPEvaluateInfo {
+    var subTask:Subtask? = null
+    var evaluate: Evaluation? = null
+    var scoreLevel: String? = null
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPInspectionInfo.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPInspectionInfo.kt
new file mode 100644
index 0000000..3b79a72
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPInspectionInfo.kt
@@ -0,0 +1,15 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod
+
+import cn.flightfeather.supervision.domain.ds1.entity.Problemlist
+import cn.flightfeather.supervision.domain.ds1.entity.Subtask
+import cn.flightfeather.supervision.lightshare.vo.ProblemListVo
+
+/**
+ * 鏁版嵁浜у搧鐜板満宸℃煡淇℃伅
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPInspectionInfo {
+    var subTask: Subtask? = null
+    var problems: List<ProblemListVo>? = null
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPMonitorDataInfo.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPMonitorDataInfo.kt
new file mode 100644
index 0000000..7a50c06
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPMonitorDataInfo.kt
@@ -0,0 +1,12 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod
+
+import cn.flightfeather.supervision.domain.ds1.entity.DustDataResult
+
+/**
+ * 鏁版嵁浜у搧鐩戞祴鏁版嵁淇℃伅
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPMonitorDataInfo {
+    var data: DustDataResult? = null
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPSceneInfo.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPSceneInfo.kt
new file mode 100644
index 0000000..91a8a81
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/DPSceneInfo.kt
@@ -0,0 +1,26 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod
+
+import cn.flightfeather.supervision.domain.ds1.entity.BaseScene
+import cn.flightfeather.supervision.domain.ds1.entity.Scense
+
+/**
+ * 鏁版嵁浜у搧鍦烘櫙淇℃伅
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPSceneInfo {
+
+    // 鍦烘櫙鍩烘湰淇℃伅
+    var scene: Scense? = null
+
+    // 鍦烘櫙鐗规湁淇℃伅
+    var subScene: BaseScene? = null
+
+
+    // 鐘舵�侊紝鏍规嵁鍦烘櫙绫诲瀷涓嶅悓锛屾弿杩颁笉鍚岋紙渚嬪宸ュ湴锛氬缓璁句腑銆佸畬宸ャ�佸仠宸ワ紱鐮佸ご锛氬仠杩愩�佽惀杩愪腑锛�
+    var status: String? = null
+    var statusBool: Boolean = false
+
+    // 闃舵锛屾牴鎹満鏅被鍨嬩笉鍚岋紝鎻忚堪涓嶅悓锛堜緥濡傚伐鍦帮細鍩虹銆佺粨鏋勩�佸澶栨�讳綋绛夛級
+    var stage: String? = null
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/QueryOpt.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/QueryOpt.kt
new file mode 100644
index 0000000..18b3716
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/QueryOpt.kt
@@ -0,0 +1,41 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod
+
+import com.fasterxml.jackson.annotation.JsonFormat
+import io.swagger.annotations.ApiModelProperty
+import java.time.LocalDateTime
+
+/**
+ * 鏌ヨ鍙傛暟
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class QueryOpt {
+    @ApiModelProperty("鎬讳换鍔d")
+    var topTaskId: String? = null
+
+    @ApiModelProperty("鐪佷唤缂栫爜")
+    var provinceCode: String? = null
+
+    @ApiModelProperty("鍩庡競缂栫爜")
+    var cityCode: String? = null
+
+    @ApiModelProperty("鍖哄幙缂栫爜")
+    var districtCode: String? = null
+
+    @ApiModelProperty("琛楅晣缂栫爜")
+    var townCode: String? = null
+
+    @ApiModelProperty("璧峰鏃堕棿锛屾牸寮� yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    var startTime: LocalDateTime? = null
+
+    @ApiModelProperty("缁撴潫鏃堕棿锛屾牸寮� yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    var endTime: LocalDateTime? = null
+
+    @ApiModelProperty("鍦烘櫙绫诲瀷id")
+    var sceneTypeId: String? = null
+
+    @ApiModelProperty("鏄惁闇�瑕佺紦瀛�")
+    var needCache: Boolean = true
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPEvaluationByArea.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPEvaluationByArea.kt
new file mode 100644
index 0000000..8407aa6
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPEvaluationByArea.kt
@@ -0,0 +1,59 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod.middle
+
+/**
+ * 鍒嗗尯鍩熻鑼冩�ф儏鍐�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPEvaluationByArea {
+    var provinceCode: String? = null
+
+    var provinceName: String? = null
+
+    var cityCode: String? = null
+
+    var cityName: String? = null
+
+    var districtCode: String? = null
+
+    var districtName: String? = null
+
+    var townCode: String? = null
+
+    var townName: String? = null
+
+    /**
+     * 鏈夋晥鍦烘櫙鏁伴噺锛堝缓璁句腑鐨勫伐鍦帮紝钀ヨ繍涓殑鐮佸ご绛夛級
+     */
+    var validSceneCount: Int = 0
+
+    /**
+     * 璇勪及鐐规
+     */
+    var evaluationCount: Int = 0
+
+    /**
+     * 瑙勮寖绛夌骇A锛堣鑼冿級鏁伴噺
+     */
+    var evalLevelACount: Int = 0
+
+    /**
+     * 瑙勮寖绛夌骇B锛堝熀鏈鑼冿級鏁伴噺
+     */
+    var evalLevelBCount: Int = 0
+
+    /**
+     * 瑙勮寖绛夌骇C锛堜笉瑙勮寖锛夋暟閲�
+     */
+    var evalLevelCCount: Int = 0
+
+    /**
+     * 瑙勮寖绛夌骇D锛堜弗閲嶄笉瑙勮寖锛夋暟閲�
+     */
+    var evalLevelDCount: Int = 0
+
+    /**
+     * 瑙勮寖绛夌骇A锛堣鑼冿級涓嶣锛堝熀鏈鑼冿級鍗犳瘮
+     */
+    var evalLevelRatioAB: Double = 0.0
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPInspectionSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPInspectionSummary.kt
new file mode 100644
index 0000000..4bf44ac
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPInspectionSummary.kt
@@ -0,0 +1,34 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod.middle
+
+/**
+ * 鏁版嵁浜у搧宸℃煡姹囨�讳俊鎭�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPInspectionSummary {
+
+    /**
+     * 宸℃煡鍦烘櫙鎬绘暟
+     */
+    var sceneCount: Int = 0
+
+    /**
+     * 宸℃煡鐐规鎬绘暟
+     */
+    var pointCount: Int = 0
+
+    /**
+     * 宸℃煡澶嶆牳鐐规鎬绘暟
+     */
+    var reviewPointCount: Int = 0
+
+    /**
+     * 鍋滃伐鍦烘櫙鏁�
+     */
+    var stopSceneCount: Int = 0
+
+    /**
+     * 瀹屽伐鍦烘櫙鏁�
+     */
+    var completeSceneCount: Int = 0
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemCountByArea.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemCountByArea.kt
new file mode 100644
index 0000000..a9be50c
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemCountByArea.kt
@@ -0,0 +1,38 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod.middle
+
+import io.swagger.annotations.ApiModelProperty
+
+/**
+ *
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPProblemCountByArea {
+    var provinceCode: String? = null
+
+    var provinceName: String? = null
+
+    var cityCode: String? = null
+
+    var cityName: String? = null
+
+    var districtCode: String? = null
+
+    var districtName: String? = null
+
+    var townCode: String? = null
+
+    var townName: String? = null
+    /**
+     * 鍦烘櫙鏁伴噺
+     */
+    var sceneCount: Int = 0
+    /**
+     * 闂鏁伴噺
+     */
+    var problemCount: Int = 0
+    /**
+     * 闂鏁伴噺鍗犳瘮
+     */
+    var ratio: Double = 0.0
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemTypeCount.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemTypeCount.kt
new file mode 100644
index 0000000..c647157
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/vo/dataprod/middle/DPProblemTypeCount.kt
@@ -0,0 +1,28 @@
+package cn.flightfeather.supervision.lightshare.vo.dataprod.middle
+
+/**
+ * 鏁版嵁浜у搧闂鍒嗙被姹囨�讳俊鎭�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+class DPProblemTypeCount {
+    /**
+     * 闂鍒嗙被ID
+     */
+    var typeId: Byte? = null
+
+    /**
+     * 闂鍒嗙被鍚嶇О
+     */
+    var typeName: String? = null
+
+    /**
+     * 闂鏁伴噺
+     */
+    var count: Int = 0
+
+    /**
+     * 闂鏁伴噺鍗犳瘮
+     */
+    var ratio: Double = 0.0
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdBaseController.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdBaseController.kt
new file mode 100644
index 0000000..b079252
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdBaseController.kt
@@ -0,0 +1,42 @@
+package cn.flightfeather.supervision.lightshare.web
+
+import cn.flightfeather.supervision.lightshare.service.DataProdBaseService
+import cn.flightfeather.supervision.lightshare.vo.dataprod.QueryOpt
+import io.swagger.annotations.Api
+import org.springframework.web.bind.annotation.*
+
+/**
+ * 鍩虹鏁版嵁浜у搧鎺у埗鍣�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+@Api(tags = ["DataProdBaseController"], description = "鍩虹鏁版嵁浜у搧鐩稿叧API鎺ュ彛")
+@RestController
+@RequestMapping("/dataProd/base")
+class DataProdBaseController(private val dataProdBaseService: DataProdBaseService) {
+
+    /**
+     * 鍦烘櫙鍒楄〃
+     */
+    @PostMapping("/scene/get")
+    fun getSceneInfo(@RequestBody queryOpt: QueryOpt) = resPack { dataProdBaseService.getSceneInfo(queryOpt) }
+
+    /**
+     * 瑙勮寖璇勪及鍒楄〃
+     */
+    @PostMapping("/evaluate/get")
+    fun getEvaluateInfo(@RequestBody queryOpt: QueryOpt) = resPack { dataProdBaseService.getEvaluateInfo(queryOpt) }
+
+    /**
+     * 宸℃煡鍒楄〃
+     */
+    @PostMapping("/inspection/get")
+    fun getInspectionInfo(@RequestBody queryOpt: QueryOpt) = resPack { dataProdBaseService.getInspectionInfo(queryOpt) }
+
+
+    /**
+     * 鐩戞祴鏁版嵁鍒楄〃
+     */
+    @PostMapping("/monitorData/get")
+    fun getMonitorDataInfo(@RequestBody queryOpt: QueryOpt) = resPack { dataProdBaseService.getMonitorDataInfo(queryOpt) }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdFinalController.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdFinalController.kt
new file mode 100644
index 0000000..c41733b
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdFinalController.kt
@@ -0,0 +1,16 @@
+package cn.flightfeather.supervision.lightshare.web
+
+import io.swagger.annotations.Api
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+/**
+ * 鏈�缁堟暟鎹骇鍝佹帶鍒跺櫒
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+@Api(tags = ["DataProdFinalController"], description = "鏈�缁堟暟鎹骇鍝佺浉鍏矨PI鎺ュ彛")
+@RestController
+@RequestMapping("/dataProd/final")
+class DataProdFinalController {
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdMiddleController.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdMiddleController.kt
new file mode 100644
index 0000000..04cfa85
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/web/DataProdMiddleController.kt
@@ -0,0 +1,48 @@
+package cn.flightfeather.supervision.lightshare.web
+
+import cn.flightfeather.supervision.lightshare.service.DataProdMiddleService
+import cn.flightfeather.supervision.lightshare.vo.dataprod.QueryOpt
+import io.swagger.annotations.Api
+import org.springframework.web.bind.annotation.PostMapping
+import org.springframework.web.bind.annotation.RequestBody
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+/**
+ * 涓棿鏁版嵁浜у搧鎺у埗鍣�
+ * @date 2025/9/15
+ * @author feiyu02
+ */
+@Api(tags = ["DataProdMiddleController"], description = "涓棿鏁版嵁浜у搧鐩稿叧API鎺ュ彛")
+@RestController
+@RequestMapping("/dataProd/middle")
+class DataProdMiddleController(private val dataProdMiddleService: DataProdMiddleService) {
+
+    /**
+     * 宸℃煡瀹屾垚鎯呭喌姹囨��
+     */
+    @PostMapping("/inspection/summary/get")
+    fun getInspectionSummary(@RequestBody queryOpt: QueryOpt) =
+        resPack { dataProdMiddleService.getInspectionSummary(queryOpt) }
+
+    /**
+     * 闂鍒嗙被姹囨��
+     */
+    @PostMapping("/problemType/summary/get")
+    fun getProblemTypeSummary(@RequestBody queryOpt: QueryOpt) =
+        resPack { dataProdMiddleService.getProblemTypeSummary(queryOpt) }
+
+    /**
+     * 鍒嗗尯鍩熷崟鍦烘櫙闂鏁伴噺
+     */
+    @PostMapping("/problemCount/area/get")
+    fun getProblemCountByArea(@RequestBody queryOpt: QueryOpt) =
+        resPack { dataProdMiddleService.getProblemCountByArea(queryOpt) }
+
+    /**
+     * 鍒嗗尯鍩熻鑼冩�ф儏鍐�
+     */
+    @PostMapping("/evaluation/area/get")
+    fun getEvaluationByArea(@RequestBody queryOpt: QueryOpt) =
+        resPack { dataProdMiddleService.getEvaluationByArea(queryOpt) }
+}
\ No newline at end of file

--
Gitblit v1.9.3