From b041775dae4438e428d2b70d2b22cfe8c49844fe Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 19 七月 2022 16:22:36 +0800
Subject: [PATCH] 1. 巡查汇总报告功能编写基本完成

---
 src/main/kotlin/cn/flightfeather/supervision/lightshare/service/SearchService.kt                |    2 
 src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportOne.kt                  |   12 
 src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportThree.kt                |   11 
 src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportTwo.kt                  |   12 
 src/main/kotlin/cn/flightfeather/supervision/business/report/BaseExcel.kt                       |   36 +
 src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt                          |    2 
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeStatusSummary.kt   |  128 ++++
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProChange.kt               |   24 
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreAnalysisSummary.kt   |  176 +++++
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColLedger.kt                  |   19 
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColStatus.kt                  |   39 +
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColInspectionInfo.kt          |  112 +++
 src/main/kotlin/cn/flightfeather/supervision/business/storage/StAutoScore.kt                    |    6 
 src/main/kotlin/cn/flightfeather/supervision/business/report/BaseCols.kt                        |   82 ++
 src/main/kotlin/cn/flightfeather/supervision/common/utils/FileUtil.kt                           |   38 +
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankMainSummary.kt |   48 +
 src/test/kotlin/cn/flightfeather/supervision/business/fume/AutoScoreTest.kt                     |    4 
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankSummary.kt     |  125 ++++
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColSceneName.kt               |   18 
 src/test/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImplTest.kt   |    7 
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColTown.kt                    |   15 
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeDetailSummary.kt   |   12 
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreDetailSummary.kt     |   13 
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProDetailSummary.kt       |   12 
 src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt                          |    8 
 src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProAnalysisSummary.kt     |  169 +++++
 src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt                      |  306 +++++++++
 src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt                           |   19 
 src/main/resources/generator/generatorConfig4ds1.xml                                            |   12 
 src/main/kotlin/cn/flightfeather/supervision/business/report/BaseTemplate.kt                    |  109 +++
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColGrade.kt                   |  111 +++
 src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProblemDistribution.kt     |   54 +
 src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImpl.kt       |   63 +
 33 files changed, 1,746 insertions(+), 58 deletions(-)

diff --git a/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt b/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt
index 821485c..6bd2f4e 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/SupervisionApplication.kt
@@ -18,7 +18,7 @@
 
     @Bean
     fun runner() = ApplicationRunner {
-        fetchController.run()
+//        fetchController.run()
     }
 }
 
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseCols.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseCols.kt
new file mode 100644
index 0000000..c12a5cc
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseCols.kt
@@ -0,0 +1,82 @@
+package cn.flightfeather.supervision.business.report
+
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import kotlin.math.max
+
+/**
+ * 缁熻鏁版嵁鍒楀熀绫�
+ */
+abstract class BaseCols(){
+
+    protected var heads = mutableListOf<MutableList<ExcelUtil.MyCell>>()
+
+    //鐢熸垚琛ㄥご
+    fun getHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        heads = onHeads(dataSource)
+        return heads
+    }
+
+    abstract fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>>
+
+    //鐢熸垚涓�琛屽唴瀹�
+    fun getOneRow(rowData: DataSource.RowData): List<Any> {
+        return if (rowData.noRecord()) {
+            val r = mutableListOf<String>()
+            repeat(heads.last().size) { r.add(("")) }
+            r
+        } else {
+            onOneRow(rowData)
+        }
+    }
+
+    abstract fun onOneRow(rowData: DataSource.RowData): List<Any>
+
+    fun emptyJudge() {
+
+    }
+
+    /**
+     * 鏂拌�佽〃澶村悎骞�
+     */
+    fun combineHead(oldHeads: MutableList<MutableList<ExcelUtil.MyCell>>, dataSource: DataSource) {
+        //鍚堝苟琛ㄥご锛岄噰鍙栫畝鍖栭�昏緫锛屽彧鏈夌涓�琛岀殑琛ㄥご浼氳繘琛屽崟鍏冩牸鐨勮法琛屽悎骞�
+        val newHeads = getHeads(dataSource)
+        if (oldHeads.isEmpty()) {
+            newHeads.forEach { oldHeads.add(it) }
+        } else {
+            val maxRow = max(oldHeads.size, newHeads.size)
+            for (i in 0 until maxRow) {
+                val oH =
+                    //鍙栧凡鏈夎〃澶翠腑鐨勮
+                    if (i < oldHeads.size) {
+                        oldHeads[i]
+                    }
+                    //鍙栨柊涓�琛岋紝鍚屾椂绗竴琛岃〃澶磋法琛屾暟鍔犱竴
+                    else {
+                        if (i > 0) {
+                            oldHeads.first().forEach { it.rowSpan++ }
+                        }
+                        val h = mutableListOf<ExcelUtil.MyCell>()
+                        repeat(oldHeads.size) { h.add(ExcelUtil.MyCell("")) }
+                        oldHeads.add(h)
+                        h
+                    }
+
+                val nH =
+                    if (i < newHeads.size) {
+                        newHeads[i]
+                    } else {
+                        if (i > 0) {
+                            newHeads.first().forEach { it.rowSpan++ }
+                        }
+                        val h = mutableListOf<ExcelUtil.MyCell>()
+                        repeat(newHeads.size) { h.add(ExcelUtil.MyCell("")) }
+                        newHeads.add(h)
+                        h
+                    }
+
+                oH.addAll(nH)
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseExcel.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseExcel.kt
new file mode 100644
index 0000000..6f4c5b7
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseExcel.kt
@@ -0,0 +1,36 @@
+package cn.flightfeather.supervision.business.report
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook
+import java.io.FileOutputStream
+import java.io.OutputStream
+import java.util.*
+
+/**
+ * 鍚勬ā鏉垮悎骞惰緭鍑轰负鏁翠綋鏂囨。
+ */
+abstract class BaseExcel(val dataSource: DataSource) {
+
+    abstract val templates: List<BaseTemplate>
+
+    abstract val fileName: String
+
+    // excel鏂囨。
+    private var workbook = HSSFWorkbook()
+
+    fun toFile(path: String) {
+        val fileName = "${dataSource.areaName()}-${fileName}-${Date().time}.xls"
+        val out = FileOutputStream(path + fileName)
+        toOutputStream(out)
+    }
+
+    fun toOutputStream(out: OutputStream) {
+        templates.forEach {
+            it.execute()
+            it.toWorkBook(workbook)
+        }
+        workbook.write(out)
+        workbook.close()
+        out.flush()
+        out.close()
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseTemplate.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseTemplate.kt
index 5e0d3d4..f10a5be 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseTemplate.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/BaseTemplate.kt
@@ -1,14 +1,101 @@
 package cn.flightfeather.supervision.business.report
 
-/**
- * 鎶ュ憡妯℃澘鍩虹被
- */
-abstract class BaseTemplate {
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.DateUtil
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import cn.flightfeather.supervision.domain.ds1.entity.Problemlist
+import org.apache.poi.hssf.usermodel.HSSFWorkbook
+import tk.mybatis.mapper.entity.Example
+import java.io.FileOutputStream
+import java.io.OutputStream
+import java.util.*
 
-    //鍥哄畾鍒楃粍鍚�
-    //鍚嶇О
-    //鍩烘湰淇℃伅
-    //闂鎵e垎鍒嗗竷
-    //闂鏁存敼鍒嗗竷
-    //鐩戠璇︽儏
-}
\ No newline at end of file
+/**
+ * excel鎶ュ憡妯℃澘鍩虹被
+ */
+// FIXME: 2022/7/15 妯℃澘绠�鍖栵細鍙湁琛ㄥご浼氭秹鍙婂崟鍏冩牸鍚堝苟锛岄粯璁よ〃鍐呭涓病鏈夊悎骞�
+abstract class BaseTemplate(val dataSource: DataSource){
+
+    //鍒楃粍鍚�
+    abstract val cols: List<BaseCols>
+
+    //妯℃澘鍚嶇О
+    abstract val templateName: String
+
+    //琛ㄥご
+    val head = mutableListOf<MutableList<ExcelUtil.MyCell>>()
+    //鍐呭
+    val contents = mutableListOf<MutableList<Any>>()
+
+
+    open fun execute() {
+        //鏁版嵁婧愰噸缃�
+        dataSource.reset()
+        //鍚堟垚琛ㄥご
+        cols.forEach {
+            it.combineHead(head,dataSource)
+        }
+        //鍚堟垚鏁版嵁
+        dataSource.loop { index, rowData ->
+            cols.forEach {col ->
+                val r = col.getOneRow(rowData)
+                if (index >= contents.size) {
+                    contents.add(mutableListOf())
+                }
+                contents[index].addAll(r)
+            }
+        }
+    }
+
+    fun toWorkBook(wb: HSSFWorkbook) {
+        val f = tableFormat()
+        ExcelUtil.write(f.first, f.second, wb, templateName)
+    }
+
+    fun toOutputStream(out: OutputStream, sheetName: String? = null) {
+        val f = tableFormat()
+        ExcelUtil.write2(out, f.first, f.second, sheetName ?: templateName)
+    }
+
+    /**
+     * 杈撳嚭涓烘枃妗�
+     */
+    fun toFile(path: String) {
+        val fileName = "${dataSource.areaName()}-${templateName}-${Date().time}.xls"
+        val out = FileOutputStream(path + fileName)
+        toOutputStream(out)
+    }
+
+    /**
+     * 琛ㄥご鍜岃〃鍐呭鏍煎紡杞寲
+     */
+    private fun tableFormat(): Pair<MutableList<Array<Any>>, MutableList<Array<Any>>> {
+        val h = mutableListOf<Array<Any>>()
+        val c = mutableListOf<Array<Any>>()
+        head.forEach { h.add(it.toTypedArray()) }
+        contents.forEach { c.add(it.toTypedArray()) }
+        val index = c[0][0]
+        if (index is Int) {
+            c.sortBy {
+                if (it[0] is Int) {
+                    it[0] as Int
+                } else {
+                    0
+                }
+            }
+        } else {
+            c.sortBy {
+                it[0].toString()
+            }
+        }
+        return Pair(h, c)
+    }
+}
+
+//鍥哄畾鍒楃粍鍚�
+
+
+//鍩烘湰淇℃伅
+//闂鎵e垎鍒嗗竷
+
+
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt
index 0e23fd0..77154e7 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt
@@ -1,31 +1,299 @@
 package cn.flightfeather.supervision.business.report
 
-import cn.flightfeather.supervision.domain.ds1.entity.Problemlist
-import cn.flightfeather.supervision.domain.ds1.entity.Problemtype
-import cn.flightfeather.supervision.domain.ds1.entity.Scense
-import cn.flightfeather.supervision.domain.ds1.entity.Subtask
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.DateUtil
+import cn.flightfeather.supervision.domain.ds1.entity.*
+import cn.flightfeather.supervision.domain.ds1.mapper.*
+import cn.flightfeather.supervision.lightshare.vo.ExcelConfigVo
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Component
+import tk.mybatis.mapper.entity.Example
+import javax.annotation.PostConstruct
 
 /**
  * 鎶ュ憡鎵�闇�婧愭暟鎹�
- * 鐢熸垚鎶ュ憡鏃讹紝鎵�闇�瑕佺殑鏁版嵁婧�
+ * 鐢熸垚鎶ュ憡鏃讹紝缁熶竴鑾峰彇鍚勫熀纭�鏁版嵁
+ * @param config 鐢熸垚鎶ュ憡鐨勫弬鏁�
  */
-class DataSource {
+class DataSource(val config: ExcelConfigVo, val dbMapper: DbMapper){
 
-    private var subTask: Subtask? = null
+    private val dateUtil = DateUtil()
 
-    /**
-     * 鎸囧畾褰撳墠杩涜缁熻鐨勪富浣撳璞�
-     */
-    fun mainObj(subtask: Subtask) {
-        this.subTask = subTask
+    private val sourceList = mutableListOf<Subtask>()
+
+    val rowData = RowData()
+
+    init {
+        if (config.districtCode == null) {
+            throw IllegalStateException("鍙傛暟缂哄皯鍖哄幙缂栫爜:[districtCode]")
+        }
+        if (config.sceneType == null) {
+            throw IllegalStateException("鍙傛暟缂哄皯鍦烘櫙绫诲瀷:[sceneType]")
+        }
+        getSource(config)
     }
 
-    //鍦烘櫙鍩烘湰淇℃伅
-    var scene: Scense? = null
+    fun loop(callback: (index:Int, rowData: RowData) -> Unit) {
+        reset()
+        for (i in sourceList.indices) {
+            rowData.clear()
+            rowData.subTask = sourceList[i]
+            callback(i, rowData)
+        }
+    }
 
-    //闂绫诲瀷
-    var problemTypes = mutableListOf<Problemtype>()
+    /**
+     * 閲嶇疆
+     */
+    fun reset() {
+        rowData.subTask = sourceList.first()
+        rowData.clear()
+    }
 
-    //鍏蜂綋鐨勯棶棰�
-    var problems = mutableListOf<Problemlist>()
-}
\ No newline at end of file
+    /**
+     * 鏁版嵁缁熻鐨勬椂闂村拰鍖哄煙鍚嶇О
+     */
+    fun areaName(): String {
+        val t = dbMapper.taskMapper.selectByPrimaryKey(config.topTaskGuid)
+        return "${dateUtil.DateToString(t.starttime, DateUtil.DateStyle.YYYY_MM_CN)}${t.districtname}${Constant.ScenseType.getDes(config.sceneType)}"
+    }
+
+    /**
+     * 鑾峰彇鎶ュ憡鏁版嵁婧�
+     */
+    private fun getSource(config: ExcelConfigVo) {
+        if (config.sceneType == null) return
+
+        val result = mutableListOf<Subtask>()
+
+        //1. 鏌ユ壘鐗瑰畾鐨勫贰鏌ヤ换鍔℃垨鑰呮墍鏈夌殑璁″垝宸℃煡浠诲姟
+        var taskSceneIdList = listOf<String>()
+        val subTaskList = if (config.subTaskIdList?.isNotEmpty() == true ||
+            (config.startTime != null || config.endTime != null)
+        ) {
+            dbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
+                createCriteria().apply {
+                    if (config.subTaskIdList?.isNotEmpty() == true) {
+                        andIn("stguid", config.subTaskIdList)
+                    }
+                    config.startTime?.let { andGreaterThanOrEqualTo("planstarttime", it) }
+                    config.endTime?.let { andLessThanOrEqualTo("planendtime", it) }
+                }
+            })
+        } else {
+            taskSceneIdList = dbMapper.monitorobjectversionMapper.getSceneByType(config.topTaskGuid, config.sceneType)
+            dbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
+                createCriteria().andIn("scenseid", taskSceneIdList)
+                    .andEqualTo("tguid", config.topTaskGuid)
+            })
+        }
+
+        if (taskSceneIdList.isNotEmpty()) {
+            taskSceneIdList.forEach {
+                var subtask: Subtask? = null
+                for (s in subTaskList) {
+                    if (s.scenseid == it) {
+                        subtask = s
+                        break
+                    }
+                }
+                if (subtask == null) subtask = Subtask().apply { scenseid = it }
+                result.add(subtask)
+            }
+        } else {
+            result.addAll(subTaskList)
+        }
+
+        sourceList.addAll(result)
+    }
+
+
+    inner class RowData(){
+        var subTask: Subtask? = null
+
+        //鍦烘櫙鍩烘湰淇℃伅
+        val scene: Scense?
+            get() {
+                if (_scene == null) {
+                    _scene = dbMapper.scenseMapper.selectByPrimaryKey(subTask?.scenseid)
+                }
+                return _scene
+            }
+        private var _scene: Scense? = null
+
+        //鍚勫満鏅壒鏈夌殑鍩烘湰淇℃伅
+        val baseScene: BaseScene?
+            get() {
+                if (_baseScene == null) {
+                    _baseScene = when (this.scene?.typeid.toString()) {
+                        Constant.ScenseType.TYPE1.value -> {
+                            dbMapper.sceneConstructionSiteMapper.selectByPrimaryKey(scene?.guid)
+                        }
+                        Constant.ScenseType.TYPE2.value -> {
+                            dbMapper.sceneWharfMapper.selectByPrimaryKey(scene?.guid)
+                        }
+                        Constant.ScenseType.TYPE3.value -> {
+                            dbMapper.sceneMixingPlantMapper.selectByPrimaryKey(scene?.guid)
+                        }
+                        Constant.ScenseType.TYPE14.value -> {
+                            dbMapper.sceneStorageYardMapper.selectByPrimaryKey(scene?.guid)
+                        }
+                        else -> null
+                    }
+                }
+                return _baseScene
+            }
+        private var _baseScene: BaseScene? = null
+
+        //鍏蜂綋鐨勯棶棰�
+        val problems: MutableList<Problemlist>
+            get() {
+                if (noRecord()) return mutableListOf()
+
+                if (_problems.isEmpty()) {
+                    val r = dbMapper.problemlistMapper.selectByExample(Example(Problemlist::class.java).apply {
+                        createCriteria().andEqualTo("stguid", subTask?.stguid)
+                    })
+                    _problems.addAll(r)
+                }
+                return _problems
+            }
+        private var _problems = mutableListOf<Problemlist>()
+
+        val evaluation: Evaluation?
+            get() {
+                if (_evaluation == null) {
+                    if (noRecord()) return null
+
+                    dbMapper.evaluationMapper.selectByExample(Example(Evaluation::class.java).apply {
+                        createCriteria().andEqualTo("stguid", subTask?.stguid)
+                    })?.takeIf { it.isNotEmpty() }?.let { _evaluation = it[0] }
+                }
+                return _evaluation
+            }
+        private var _evaluation: Evaluation? = null
+
+        val itemevaluationList: MutableList<Itemevaluation>
+            get() {
+                if (_itemevaluationList.isEmpty()) {
+                    val r = dbMapper.itemevaluationMapper.selectByExample(Example(Itemevaluation::class.java).apply {
+                        createCriteria().andEqualTo("stguid", subTask?.stguid)
+                    })
+                    _itemevaluationList.addAll(r)
+                    println("-------------------itemevaluationList--------------------------------")
+                }
+                return _itemevaluationList
+            }
+        private var _itemevaluationList = mutableListOf<Itemevaluation>()
+
+        //闂绫诲瀷
+        val problemTypes: MutableList<Problemtype>
+            get() {
+                if (_problemTypes.isEmpty()) {
+                    val r = dbMapper.problemtypeMapper.selectByExample(Example(Problemtype::class.java).apply {
+                        createCriteria().andEqualTo("scensetypeid", config.sceneType)
+                            .andEqualTo("districtcode", config.districtCode)
+                        orderBy("extension1")
+                    })
+                    _problemTypes.addAll(r)
+                }
+                return _problemTypes
+            }
+        private var _problemTypes = mutableListOf<Problemtype>()
+
+        //鑷姩璇勫垎瑙勫垯涓�绾у垎绫�
+        val topItems: MutableList<Evaluationsubrule2>
+            get() {
+                if (_topItems.isEmpty()) {
+                    val rule = dbMapper.evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
+                        createCriteria()
+                            .andEqualTo("tasktypeid", 99)
+                            .andEqualTo("scensetypeid", config.sceneType)
+                    })
+                    if (rule.isNotEmpty()) {
+                        val ruleId = rule[0].guid
+                        val rules = dbMapper.evaluationsubruleMapper.selectByExample(Example(Evaluationsubrule2::class.java).apply {
+                            createCriteria().andEqualTo("erguid", ruleId)
+                        })
+                        rules.forEach {
+                            if (it.ertype == 2) {
+                                _topItems.add(it)
+                            }
+                        }
+                        _topItems.sortBy { it.displayid }
+
+                        var t = 0
+                        _topItems.forEach {
+                            t += it.maxscore ?: 0
+                            val tempRules = mutableListOf<Evaluationsubrule2>()
+                            for (i in rules) {
+                                if (i.fatherid == it.guid && i.ertype == 3) {
+                                    tempRules.add(i)
+                                }
+                            }
+                            //璇勫垎澶ч」濡傛灉娌℃湁鎵惧埌璇勫垎灏忛」锛屽垯璇存槑鍏剁洿鎺ュ搴旀渶灏忚瘎鍒嗛」锛屽叾鏈韩鍙樻垚璇勫垎椤�
+                            if (tempRules.isEmpty()) {
+                                tempRules.add(it)
+                            }
+                            tempRules.sortBy { t -> t.displayid }
+                            tempRules.forEach { temp ->
+                                val tempSubRules = mutableListOf<Evaluationsubrule2>()
+                                for (i in rules) {
+                                    if (i.fatherid == temp.guid && i.ertype == 4) {
+                                        tempSubRules.add(i)
+                                    }
+                                }
+                                tempSubRules.sortBy { ts -> ts.displayid }
+                                this._rules.add(Pair(temp, tempSubRules))
+                            }
+                        }
+                    }
+                }
+                return _topItems
+            }
+        private var _topItems = mutableListOf<Evaluationsubrule2>()
+
+        //鑷姩璇勫垎瑙勫垯浜岀骇鍜屼笁绾у垎绫�
+        val rules: MutableList<Pair<Evaluationsubrule2, MutableList<Evaluationsubrule2>>>
+            get() {
+                if (_rules.isEmpty()) {
+                    this.topItems
+                }
+                return _rules
+            }
+        private var _rules = mutableListOf<Pair<Evaluationsubrule2, MutableList<Evaluationsubrule2>>>()
+
+        /**
+         * 娓呯┖褰撳墠澶勭悊鐨勫璞$殑鐩稿叧鏁版嵁婧�
+         */
+        fun clear() {
+            _scene = null
+            _baseScene = null
+            _problems.clear()
+            _evaluation = null
+            _itemevaluationList.clear()
+        }
+
+        /**
+         * 鍒ゆ柇鍦烘櫙鏄惁宸℃煡鐩戠锛屾湁鏃犲贰鏌ヨ褰�
+         */
+        fun noRecord() = subTask?.stguid == null
+    }
+}
+
+data class DbMapper(
+    val scenseMapper: ScenseMapper,
+    val problemlistMapper: ProblemlistMapper,
+    val problemtypeMapper: ProblemtypeMapper,
+    val subtaskMapper: SubtaskMapper,
+    val monitorobjectversionMapper: MonitorobjectversionMapper,
+    val sceneConstructionSiteMapper: SceneConstructionSiteMapper,
+    val sceneMixingPlantMapper: SceneMixingPlantMapper,
+    val sceneStorageYardMapper: SceneStorageYardMapper,
+    val sceneWharfMapper: SceneWharfMapper,
+    val taskMapper: TaskMapper,
+    val evaluationruleMapper: EvaluationruleMapper,
+    val evaluationsubruleMapper: EvaluationsubruleMapper2,
+    val evaluationMapper: EvaluationMapper,
+    val itemevaluationMapper: ItemevaluationMapper
+)
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColGrade.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColGrade.kt
new file mode 100644
index 0000000..271e082
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColGrade.kt
@@ -0,0 +1,111 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import cn.flightfeather.supervision.domain.ds1.entity.Itemevaluation
+import org.apache.poi.hssf.util.HSSFColor
+
+class ColGrade(private val hasHead3: Boolean = true) : BaseCols() {
+
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        val h1 = mutableListOf<ExcelUtil.MyCell>()
+        h1.add(ExcelUtil.MyCell("鐜俊鐮�", 3, 1))
+        h1.add(ExcelUtil.MyCell("闃叉不瑙勮寖鎬�", 3, 1))
+        h1.add(ExcelUtil.MyCell("鎬诲垎", 3, 1))
+        val h2 = mutableListOf<ExcelUtil.MyCell>()
+        h2.add(ExcelUtil.MyCell(""))
+        h2.add(ExcelUtil.MyCell(""))
+        h2.add(ExcelUtil.MyCell(""))
+        val h3 = mutableListOf<ExcelUtil.MyCell>()
+        h3.add(ExcelUtil.MyCell(""))
+        h3.add(ExcelUtil.MyCell(""))
+        h3.add(ExcelUtil.MyCell(""))
+        dataSource.rowData.topItems.forEach {
+            h1.add(ExcelUtil.MyCell(it.itemname ?: "", 1, 0))
+            for (r in dataSource.rowData.rules) {
+                if (r.first.fatherid == it.guid || r.first.guid == it.guid) {
+                    h2.add(ExcelUtil.MyCell(r.first.itemname ?: "", 1, 0))
+                    if (hasHead3) {
+                        r.second.forEach { s ->
+                            h3.add(ExcelUtil.MyCell(s.itemname ?: ""))
+                            h2.last().colSpan++
+                            h1.last().colSpan++
+                        }
+                    } else {
+                        h2.last().colSpan++
+                        h1.last().colSpan++
+                    }
+                }
+            }
+        }
+
+        return mutableListOf(h1, h2, h3)
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        val row = mutableListOf<Any>()
+
+        if (rowData.noRecord()) {
+            repeat(heads.last().size) { row.add(("")) }
+        } else {
+            row.apply {
+                //鎬诲垎鍜岀幆淇$爜
+                rowData.evaluation.let { e ->
+                    val s = e?.resultscorebef?.toIntOrNull() ?: ""
+                    val code = when (s) {
+                        in 0..59 -> ExcelUtil.MyCell("绾㈢爜", fontColor = HSSFColor.HSSFColorPredefined.RED.index)
+                        in 60..89 -> ExcelUtil.MyCell("榛勭爜", fontColor = HSSFColor.HSSFColorPredefined.GOLD.index)
+                        in 90..100 -> ExcelUtil.MyCell("缁跨爜", fontColor = HSSFColor.HSSFColorPredefined.BRIGHT_GREEN.index)
+                        "" -> ExcelUtil.MyCell("", fontColor = HSSFColor.HSSFColorPredefined.BLACK.index)
+                        else -> ExcelUtil.MyCell("瓒呭嚭鑼冨洿锛�${s}", fontColor = HSSFColor.HSSFColorPredefined.BLACK.index)
+                    }
+                    val normalization = when (s) {
+                        in 0..59 -> ExcelUtil.MyCell("涓ラ噸涓嶈鑼�", fontColor = HSSFColor.HSSFColorPredefined.ROSE.index)
+                        in 60..89 -> ExcelUtil.MyCell("涓嶈鑼�", fontColor = HSSFColor.HSSFColorPredefined.RED.index)
+                        in 90..99 -> ExcelUtil.MyCell("鍩烘湰瑙勮寖", fontColor = HSSFColor.HSSFColorPredefined.GOLD.index)
+                        100 -> ExcelUtil.MyCell("瑙勮寖", fontColor = HSSFColor.HSSFColorPredefined.BRIGHT_GREEN.index)
+                        "" -> ExcelUtil.MyCell("", fontColor = HSSFColor.HSSFColorPredefined.BLACK.index)
+                        else -> ExcelUtil.MyCell("瓒呭嚭鑼冨洿锛�${s}", fontColor = HSSFColor.HSSFColorPredefined.BLACK.index)
+                    }
+                    add(code)
+                    add(normalization)
+                    add(s)
+                }
+
+
+                //姣忎竴椤瑰叿浣撳緱鍒�
+                rowData.topItems.forEach {
+                    for (r in rowData.rules) {
+                        if (r.first.fatherid == it.guid || r.first.guid == it.guid) {
+                            // FIXME: 2021/4/25 鍐冲畾鏄惁鍐檋3
+                            if (hasHead3) {
+                                r.second.forEach { s ->
+                                    val v = searchScore(s.guid, rowData.itemevaluationList)
+                                    add(v.toIntOrNull() ?: "")
+                                }
+                            } else {
+                                val v = searchScore(r.first.guid, rowData.itemevaluationList)
+                                add(v.toIntOrNull() ?: "")
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return row
+    }
+
+    //鏌ユ壘寰楀垎璁板綍鍐呭搴旇鍒欑殑寰楀垎
+    private fun searchScore(ruleId: String?, itemevaluations: List<Itemevaluation>): String {
+        var score = ""
+        for (e in itemevaluations) {
+            if (ruleId == e.esrguid) {
+                score = e.value ?: ""
+                break
+            }
+        }
+        return score
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColInspectionInfo.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColInspectionInfo.kt
new file mode 100644
index 0000000..da2bfe8
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColInspectionInfo.kt
@@ -0,0 +1,112 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.DateUtil
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+
+//鐩戠璇︽儏
+class ColInspectionInfo() : BaseCols() {
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        return mutableListOf(mutableListOf(
+            ExcelUtil.MyCell("鐩戠鏃堕棿"),
+            ExcelUtil.MyCell("宸℃煡浜哄憳"),
+            ExcelUtil.MyCell("闂绫诲瀷"),
+            ExcelUtil.MyCell("闂鎻忚堪"),
+            ExcelUtil.MyCell("闂浣嶇疆"),
+            ExcelUtil.MyCell("闂鏁�"),
+            ExcelUtil.MyCell("鏁存敼鏃堕棿"),
+            ExcelUtil.MyCell("鏁存敼鎯呭喌"),
+            ExcelUtil.MyCell("鏁存敼闂"),
+            ExcelUtil.MyCell("鏁存敼鏁�"),
+            ExcelUtil.MyCell("鏈暣鏀归棶棰�"),
+            ExcelUtil.MyCell("鏈暣鏀规暟"),
+            ExcelUtil.MyCell("瀹℃牳鎯呭喌"),
+            ExcelUtil.MyCell("闂瀹℃牳鏃堕棿"),
+            ExcelUtil.MyCell("鏁存敼瀹℃牳鏃堕棿"),
+            ExcelUtil.MyCell("闂鏁存敼鐜�"),
+        ))
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        val dateUtil = DateUtil()
+        val row = mutableListOf<Any>()
+        if (rowData.noRecord()) {
+            repeat(heads.last().size) { row.add(("")) }
+        } else {
+            row.apply {
+                // 琛ㄥご锛氬贰鏌ユ儏鍐靛強闂銆佹暣鏀圭粺璁�
+                //鐩戠鏃堕棿
+                add(dateUtil.DateToString(rowData.subTask?.planstarttime, DateUtil.DateStyle.MM_DD) ?: "")
+                //宸℃煡浜哄憳
+                add(rowData.subTask?.executorrealtimes?.replace("#", "銆�") ?: "")
+                //鏌ヨ瀛愪换鍔″搴旂殑闂锛屽苟涓旀牴鎹潯浠惰繘琛岀瓫閫�
+                var y = 1
+                var pType = ""//闂绫诲瀷
+                var pDes = ""//闂鎻忚堪
+                var pLoc = ""//闂浣嶇疆
+                var pNum = 0//闂鏁�
+                var changeTime = ""//鏁存敼鏃堕棿
+                var pChanged = ""//鏁存敼鎯呭喌
+                var changedProblem = ""//鏁存敼闂
+                var cNum = 0//鏁存敼鏁�
+                var unChangedProblem = ""//鏈暣鏀归棶棰�
+                var unChangeNum = 0//鏈暣鏀规暟
+                var checkStatus = ""//瀹℃牳鎯呭喌
+                var pCheckTime = ""//闂瀹℃牳鏃堕棿
+                var cCheckTime = ""//鏁存敼瀹℃牳鏃堕棿
+                var changePercent = ""//闂鏁存敼鐜�
+                rowData.problems.forEach { p ->
+                    var typeName = ""
+                    for (t in rowData.problemTypes) {
+                        if (t.guid == p.ptguid) {
+                            typeName = t.typename ?: ""
+                            break
+                        }
+                    }
+                    val lr = if (y > 1) "\n" else ""
+                    //宸℃煡鎯呭喌鍙婇棶棰樸�佹暣鏀圭粺璁�
+                    pType += "${lr}$y銆�${typeName}"
+                    pDes += "${lr}$y銆�${p.problemname}"
+                    pLoc += "${lr}$y銆�${p.location}"
+                    pNum++
+                    changeTime = "${lr}$y銆�${dateUtil.DateToString(p.changedtime, DateUtil.DateStyle.YYYY_MM_DD_HH_MM_CN)}"
+                    pChanged += "${lr}$y銆�${if (p.ischanged == true) "鉁�" else "脳"}"
+                    if (p.ischanged == true) {
+                        if (changedProblem.isNotBlank()) {
+                            changedProblem += "\n"
+                        }
+                        changedProblem += "$y銆�${p.problemname}"
+                        cNum++
+                    } else {
+                        if (unChangedProblem.isNotBlank()) {
+                            unChangedProblem += "\n"
+                        }
+                        unChangedProblem += "$y銆�${p.problemname}"
+                        unChangeNum++
+                    }
+                    val status = when (p.extension3) {
+                        Constant.PROBLEM_CHECK_PASS -> "闂瀹℃牳閫氳繃"//
+                        Constant.PROBLEM_CHECK_FAIL -> "闂瀹℃牳鏈�氳繃"//
+                        Constant.PROBLEM_UNCHECKED -> "闂鏈鏍�"//
+                        Constant.CHANGE_UNCHECKED -> "鏁存敼鏈鏍�"//
+                        Constant.CHANGE_CHECK_PASS -> "鏁存敼瀹℃牳閫氳繃"//
+                        Constant.CHANGE_CHECK_FAIL -> "鏁存敼瀹℃牳鏈�氳繃"//
+                        else -> "闂鏈鏍�"
+                    }
+                    checkStatus += "${lr}$y銆�${status}"
+                    changePercent = if (pNum == 0) "" else "${(cNum * 100 / pNum)}%"
+                    y++
+                }
+                addAll(
+                    listOf(
+                        pType, pDes, pLoc, pNum, changeTime, pChanged, changedProblem, cNum,
+                        unChangedProblem, unChangeNum, checkStatus, pCheckTime, cCheckTime, changePercent
+                    )
+                )
+            }
+        }
+        return row
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColLedger.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColLedger.kt
new file mode 100644
index 0000000..9f2b23f
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColLedger.kt
@@ -0,0 +1,19 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+
+class ColLedger : BaseCols() {
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        return mutableListOf(mutableListOf(
+            ExcelUtil.MyCell("鍙拌处鎻愪氦鐧惧垎姣�"),
+            ExcelUtil.MyCell("鍙拌处鎻愪氦鏃堕棿"),
+            ExcelUtil.MyCell("鍙拌处瀹℃牳鏃堕棿"),
+        ))
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        return listOf("", "", "")
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProChange.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProChange.kt
new file mode 100644
index 0000000..c491e61
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProChange.kt
@@ -0,0 +1,24 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+
+class ColProChange : BaseCols() {
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        return mutableListOf(
+            mutableListOf(ExcelUtil.MyCell("闂涓庢暣鏀�", colSpan = 2)),
+            mutableListOf(ExcelUtil.MyCell("闂鏁�"), ExcelUtil.MyCell("鏁存敼鏁�"))
+        )
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        var pNum = 0//闂鏁�
+        var cNum = 0//鏁存敼鏁�
+        rowData.problems.forEach {
+            pNum++
+            if (it.ischanged == true) cNum++
+        }
+        return listOf(pNum, cNum)
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProblemDistribution.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProblemDistribution.kt
new file mode 100644
index 0000000..440512e
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColProblemDistribution.kt
@@ -0,0 +1,54 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+
+//闂鏁存敼鍒嗗竷
+class ColProblemDistribution() : BaseCols() {
+    private var h2 = mutableListOf<ExcelUtil.MyCell>()
+    private val currentProblemType = mutableMapOf<String, String>()
+    private val currentProblemHead = mutableListOf<String>()
+
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        val h1 = mutableListOf<ExcelUtil.MyCell>()
+
+        dataSource.rowData.problemTypes.forEach {
+            if (!currentProblemHead.contains(it.typename)) {
+                currentProblemHead.add(it.typename ?: "")
+                h1.add(ExcelUtil.MyCell(it.typename ?: "", colSpan = 0))
+            }
+            currentProblemType[it.guid ?: ""] = it.description ?: ""
+            if (currentProblemHead.contains(it.typename)) {
+                h2.add(ExcelUtil.MyCell(it.description ?: ""))
+                h1.last().colSpan++
+
+                h2.add(ExcelUtil.MyCell("鏄惁鏁存敼"))
+                h1.last().colSpan++
+            }
+        }
+
+        return mutableListOf(h1, h2)
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        val pDis = mutableListOf<Any>()//鍏蜂綋闂鍒嗗竷鍙婃暣鏀规儏鍐�
+        repeat(h2.size) { pDis.add("")}
+        rowData.problems.forEach {p ->
+            val des = currentProblemType[p.ptguid]
+
+            //鍏蜂綋闂鍒嗗竷
+            for (t in h2.indices) {
+                if (des == h2[t].text) {
+                    //鍏蜂綋闂杩欎竴鍒楁坊鍔犳枃鏈紝琛ㄧず闂瀛樺湪
+                    pDis[t] = 1
+                    //闂鍒楃殑涓嬩竴鍒楁槸璇ラ棶棰樼殑鏁存敼鎯呭喌
+                    pDis[t + 1] = if (p.ischanged == true) 1 else 0
+                    break
+                }
+            }
+        }
+
+        return pDis
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColSceneName.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColSceneName.kt
new file mode 100644
index 0000000..7e2cc48
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColSceneName.kt
@@ -0,0 +1,18 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+
+//鍚嶇О
+class ColSceneName() : BaseCols() {
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        return mutableListOf(
+            mutableListOf(ExcelUtil.MyCell("琛ㄥ崟缂栧彿"), ExcelUtil.MyCell("鍞竴搴忓彿"), ExcelUtil.MyCell("鍦烘櫙鍚嶇О"))
+        )
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        return listOf(rowData.scene?.index ?: -99, rowData.scene?.extension2 ?: "", rowData.scene?.name ?: "")
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColStatus.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColStatus.kt
new file mode 100644
index 0000000..da630da
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColStatus.kt
@@ -0,0 +1,39 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import cn.flightfeather.supervision.domain.ds1.entity.SceneConstructionSite
+import cn.flightfeather.supervision.domain.ds1.entity.SceneMixingPlant
+import cn.flightfeather.supervision.domain.ds1.entity.SceneStorageYard
+import cn.flightfeather.supervision.domain.ds1.entity.SceneWharf
+
+class ColStatus : BaseCols() {
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        return mutableListOf(mutableListOf(
+            ExcelUtil.MyCell("鏂藉伐/钀ヨ繍鐘舵��"),
+            ExcelUtil.MyCell("鏂藉伐闃舵")
+        ))
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        val status = when (rowData.scene?.typeid.toString()) {
+            Constant.ScenseType.TYPE1.value -> {
+                (rowData.baseScene as SceneConstructionSite?)?.csStatus
+            }
+            Constant.ScenseType.TYPE2.value -> {
+                (rowData.baseScene as SceneWharf?)?.getwStatus()
+            }
+            Constant.ScenseType.TYPE3.value -> {
+                (rowData.baseScene as SceneMixingPlant?)?.mpStatus
+            }
+            Constant.ScenseType.TYPE14.value -> {
+                (rowData.baseScene as SceneStorageYard?)?.syStatus
+            }
+            else -> ""
+        }
+        val s = status ?: ""
+        return listOf(s, s)
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColTown.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColTown.kt
new file mode 100644
index 0000000..e1a73bb
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/cols/ColTown.kt
@@ -0,0 +1,15 @@
+package cn.flightfeather.supervision.business.report.cols
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+
+class ColTown : BaseCols() {
+    override fun onHeads(dataSource: DataSource): MutableList<MutableList<ExcelUtil.MyCell>> {
+        return mutableListOf(mutableListOf(ExcelUtil.MyCell("琛楅晣/宸ヤ笟鍖�")))
+    }
+
+    override fun onOneRow(rowData: DataSource.RowData): List<Any> {
+        return listOf(rowData.scene?.townname ?: "")
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportOne.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportOne.kt
new file mode 100644
index 0000000..c14adac
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportOne.kt
@@ -0,0 +1,12 @@
+package cn.flightfeather.supervision.business.report.file
+
+import cn.flightfeather.supervision.business.report.BaseExcel
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.template.ProAnalysisSummary
+import cn.flightfeather.supervision.business.report.template.ProDetailSummary
+
+class ReportOne(dataSource: DataSource) : BaseExcel(dataSource) {
+    override val templates: List<BaseTemplate> = listOf(ProDetailSummary(dataSource), ProAnalysisSummary(dataSource))
+    override val fileName: String = "闂涓庢暣鏀规眹鎬诲垎鏋愪笌鍔ㄦ�佽窡韪竻鍗�"
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportThree.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportThree.kt
new file mode 100644
index 0000000..86cf9ff
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportThree.kt
@@ -0,0 +1,11 @@
+package cn.flightfeather.supervision.business.report.file
+
+import cn.flightfeather.supervision.business.report.BaseExcel
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.template.*
+
+class ReportThree(dataSource: DataSource) : BaseExcel(dataSource) {
+    override val templates: List<BaseTemplate> = listOf(ProTypeDetailSummary(dataSource), ProTypeRankSummary(dataSource), ProTypeRankMainSummary(dataSource), ProTypeStatusSummary(dataSource))
+    override val fileName: String = "闂涓庢暣鏀瑰垎甯冨垎鏋愭竻鍗�"
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportTwo.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportTwo.kt
new file mode 100644
index 0000000..f5b8137
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/file/ReportTwo.kt
@@ -0,0 +1,12 @@
+package cn.flightfeather.supervision.business.report.file
+
+import cn.flightfeather.supervision.business.report.BaseExcel
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.template.ScoreAnalysisSummary
+import cn.flightfeather.supervision.business.report.template.ScoreDetailSummary
+
+class ReportTwo(dataSource: DataSource) : BaseExcel(dataSource) {
+    override val templates: List<BaseTemplate> = listOf(ScoreDetailSummary(dataSource), ScoreAnalysisSummary(dataSource))
+    override val fileName: String = "瑙勮寖鎬ц瘎浼颁笌鍒嗘瀽娓呭崟"
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProAnalysisSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProAnalysisSummary.kt
new file mode 100644
index 0000000..8317647
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProAnalysisSummary.kt
@@ -0,0 +1,169 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.cols.ColInspectionInfo
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import cn.flightfeather.supervision.domain.ds1.entity.SceneConstructionSite
+import cn.flightfeather.supervision.domain.ds1.entity.SceneMixingPlant
+import cn.flightfeather.supervision.domain.ds1.entity.SceneStorageYard
+import cn.flightfeather.supervision.domain.ds1.entity.SceneWharf
+import kotlin.math.round
+
+/**
+ * 鍒嗚闀囬棶棰樻暣鏀瑰垎鏋愭眹鎬昏〃
+ */
+class ProAnalysisSummary(dataSource: DataSource) : BaseTemplate(dataSource) {
+    override val cols: List<BaseCols> = listOf(ColInspectionInfo())
+
+    override val templateName: String = "鍒嗚闀囬棶棰樻暣鏀瑰垎鏋愭眹鎬昏〃"
+
+    override fun execute() {
+        //鏁版嵁婧愰噸缃�
+        dataSource.reset()
+
+        cols.forEach { it.combineHead(head,dataSource) }
+
+        val districtMap = mutableMapOf<String?, Summary>()
+        dataSource.loop { _, rowData ->
+            if (rowData.noRecord()) return@loop
+
+            val r = cols[0].getOneRow(rowData)
+
+            val k = rowData.scene?.townname
+            if (!districtMap.containsKey(k)) {
+                districtMap[k] = Summary().apply {
+                    townCode = rowData.scene?.towncode ?: ""
+                    townName = rowData.scene?.townname ?: ""
+                    type = rowData.scene?.type ?: ""
+                }
+            }
+            districtMap[k]?.apply {
+                sceneCount++
+                val status = when (dataSource.config.sceneType.toString()) {
+                    Constant.ScenseType.TYPE1.value -> {
+                        (rowData.baseScene as SceneConstructionSite?)?.csStatus
+                    }
+                    Constant.ScenseType.TYPE2.value -> {
+                        (rowData.baseScene as SceneWharf?)?.getwStatus()
+                    }
+                    Constant.ScenseType.TYPE3.value -> {
+                        (rowData.baseScene as SceneMixingPlant?)?.mpStatus
+                    }
+                    Constant.ScenseType.TYPE14.value -> {
+                        (rowData.baseScene as SceneStorageYard?)?.syStatus
+                    }
+                    else -> ""
+                }
+                // FIXME: 2022/7/18 鍚庣画鍦烘櫙鐨勬柦宸ョ姸鎬佹敼涓哄竷灏斿�煎瓨鍌�
+                if ((status?.contains("瀹屽伐") == true) || (status?.contains("鏈柦宸�") == true) || (status?.contains("鍋�") == true)
+                    || (status?.contains("鍏�") == true)
+                ) {
+                    inactiveScenes++
+                } else {
+                    activeScenes++
+                }
+                val pNum = r[5] as Int
+                val cNum = r[9] as Int
+                if (pNum > 0 && cNum > 0) changeScenes++
+                proNum += pNum
+                changeNum += cNum
+            }
+        }
+
+        val summarys = mutableListOf<Summary>()
+        var totalPro = 0
+        districtMap.forEach {
+            summarys.add(it.value)
+            totalPro += it.value.proNum
+        }
+        districtMap.forEach {
+            val v = it.value
+            v.changeScenePer = round(v.changeScenes.toDouble() / v.sceneCount * 1000) / 1000
+            v.proPer = round(v.proNum.toDouble() / totalPro * 1000) / 1000
+            v.changePer = round(v.changeNum.toDouble() / v.proNum * 1000) / 1000
+        }
+        //鏁存敼鍗曚綅姣旀帓鍚�
+        summarys.sortByDescending {
+            it.changeScenePer
+        }
+        for (i in summarys.indices) {
+            summarys[i].changeSceneRank = i + 1
+        }
+        //闂鏁存敼鐜囨帓鍚�
+        summarys.sortByDescending {
+            it.changePer
+        }
+        for (i in summarys.indices) {
+            summarys[i].proChangeRank = i + 1
+        }
+
+        //鏇存柊琛ㄥご
+        head.clear()
+        head.add(mutableListOf(
+            ExcelUtil.MyCell("琛楅晣搴忓彿", rowSpan = 2),
+            ExcelUtil.MyCell("鍖哄煙"),
+            ExcelUtil.MyCell("鍦烘櫙绫诲埆", rowSpan = 2),
+            ExcelUtil.MyCell("鍦烘櫙鐘舵��", colSpan = 3),
+            ExcelUtil.MyCell("鏁存敼鍗曚綅", colSpan = 2),
+            ExcelUtil.MyCell("闂涓庢暣鏀�", colSpan = 4),
+            ExcelUtil.MyCell("鎺掑悕", colSpan = 2),
+            ExcelUtil.MyCell("鍖哄煙鐩戠绛栫暐", colSpan = 2),
+        ))
+        head.add(mutableListOf(
+            ExcelUtil.MyCell(""),
+            ExcelUtil.MyCell("琛楅晣/宸ヤ笟鍖�"),
+            ExcelUtil.MyCell(""),
+            ExcelUtil.MyCell("鍦烘櫙鏁�"),
+            ExcelUtil.MyCell("瀹屽伐銆佹湭鏂藉伐銆佸仠宸ユ垨鍋滀笟銆佸叧闂瓑"),
+            ExcelUtil.MyCell("鏂藉伐涓�佽繍钀ヤ腑鎬绘暟"),
+            ExcelUtil.MyCell("鏁存敼鍗曚綅鏁�"),
+            ExcelUtil.MyCell("鏁存敼鍗曚綅鍗犳瘮"),
+            ExcelUtil.MyCell("闂鏁�"),
+            ExcelUtil.MyCell("闂鍗犳瘮"),
+            ExcelUtil.MyCell("鏁存敼鏁�"),
+            ExcelUtil.MyCell("鏁存敼鐜�"),
+            ExcelUtil.MyCell("鏁存敼鍗曚綅姣旀帓鍚�"),
+            ExcelUtil.MyCell("闂鏁存敼鐜囨帓鍚�"),
+            ExcelUtil.MyCell("鎷熷垪鍏ラ噸鐐圭洃绠℃暟"),
+            ExcelUtil.MyCell("鎷熷垪鍏ラ噸鐐圭洃绠″崰姣�"),
+        ))
+        //鏇存柊鍐呭
+        summarys.forEach {
+            contents.add(
+                mutableListOf(
+                    it.townCode, it.townName, it.type, it.sceneCount, it.inactiveScenes, it.activeScenes, it.changeScenes,
+                    "${round(it.changeScenePer * 1000) / 10}%",
+                    it.proNum, "${round(it.proPer * 1000) / 10}%", it.changeNum, "${round(it.changePer * 1000) / 10}%", it.changeSceneRank, it.proChangeRank
+                )
+            )
+        }
+    }
+
+    inner class Summary(){
+        var townCode = ""
+        var townName = ""
+        var type = ""
+        var sceneCount = 0
+        //鍋滆繍鐨勫満鏅暟
+        var inactiveScenes = 0
+        var activeScenes = 0
+
+        var changeScenes = 0
+        var changeScenePer = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+
+        var proNum = 0
+        var proPer = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+
+        var changeNum = 0
+        var changePer = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+
+        var changeSceneRank = 0
+        var proChangeRank = 0
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProDetailSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProDetailSummary.kt
new file mode 100644
index 0000000..edc0440
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProDetailSummary.kt
@@ -0,0 +1,12 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.cols.ColInspectionInfo
+import cn.flightfeather.supervision.business.report.cols.ColSceneName
+
+class ProDetailSummary(dataSource: DataSource) : BaseTemplate(dataSource) {
+    override val cols: List<BaseCols> = listOf(ColSceneName(), ColInspectionInfo())
+    override val templateName: String = "闂涓庢暣鏀硅窡韪眹鎬昏〃"
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeDetailSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeDetailSummary.kt
new file mode 100644
index 0000000..faf72d7
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeDetailSummary.kt
@@ -0,0 +1,12 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.cols.*
+
+class ProTypeDetailSummary(dataSource: DataSource) : BaseTemplate(dataSource) {
+    override val cols: List<BaseCols> = listOf(ColSceneName(), ColTown(), ColStatus(), ColProChange(), ColProblemDistribution())
+
+    override val templateName: String = "闂涓庢暣鏀瑰垎绫荤粺璁¤〃"
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankMainSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankMainSummary.kt
new file mode 100644
index 0000000..688d2e2
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankMainSummary.kt
@@ -0,0 +1,48 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import kotlin.math.round
+
+class ProTypeRankMainSummary(dataSource: DataSource) : ProTypeRankSummary(dataSource) {
+    override val templateName: String = "鏈堝害涓昏鎴栧吀鍨嬮棶棰樺垎鏋愯〃"
+
+    override fun formatTable(summarys: List<Summary>) {
+        summarys.sortedByDescending { it.count }
+
+        head.clear()
+        head.add(
+            mutableListOf(
+                ExcelUtil.MyCell("搴忓彿", rowSpan = 2),
+                ExcelUtil.MyCell("骞村害", rowSpan = 2),
+                ExcelUtil.MyCell("鏈堜唤", rowSpan = 2),
+                ExcelUtil.MyCell("鍦烘櫙绫诲埆", rowSpan = 2),
+                ExcelUtil.MyCell("鍖哄煙", rowSpan = 2),
+                ExcelUtil.MyCell("闂鏁�", rowSpan = 2),
+                ExcelUtil.MyCell("涓昏鎴栧吀鍨嬮棶棰樺垎鏋�", colSpan = 3),
+            )
+        )
+        head.add(
+            mutableListOf(
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell("涓昏闂绫诲埆锛堜笁绾ф寚鏍囷級"),
+                ExcelUtil.MyCell("涓昏闂鍚堣鏁�"),
+                ExcelUtil.MyCell("涓昏闂鍗犳瘮"),
+            )
+        )
+        for (i in summarys.indices) {
+            val s = summarys[i]
+            contents.add(
+                mutableListOf(
+                    i + 1, "", "", dataSource.rowData.scene?.type ?: "", "", s.count,
+                    s.proDes, s.count, "${round(s.countPer * 1000) / 10}%"
+                )
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankSummary.kt
new file mode 100644
index 0000000..0eec5f3
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeRankSummary.kt
@@ -0,0 +1,125 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.cols.*
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import kotlin.math.round
+
+open class ProTypeRankSummary(dataSource: DataSource) : BaseTemplate(dataSource) {
+    override val cols: List<BaseCols> = listOf()
+    override val templateName: String = "闂涓庢暣鏀瑰垎绫绘帓鍚�"
+
+    override fun execute() {
+        dataSource.reset()
+
+        val proMap = mutableMapOf<String?, Summary>()
+        dataSource.loop { _, rowData ->
+            rowData.problems.forEach {
+                val k = it.ptguid
+                if (!proMap.containsKey(k)) {
+                    proMap[k] = Summary().apply {
+                        for (p in rowData.problemTypes) {
+                            if (p.guid == k) {
+                                proType = p.typename ?: ""
+                                proDes = p.description ?: ""
+                                break
+                            }
+                        }
+                    }
+                }
+                proMap[k]?.apply {
+                    count++
+                    if (it.ischanged == true) changeNum++
+                }
+            }
+        }
+
+        //鍗犳瘮缁熻
+        val summarys = mutableListOf<Summary>()
+        var tPros = 0
+        proMap.forEach {
+            val v = it.value
+            summarys.add(v)
+            tPros += v.count
+        }
+        summarys.sortByDescending { it.count }
+        for (i in summarys.indices) {
+            val it = summarys[i]
+            it.countPer = it.count.toDouble() / tPros
+            it.countRank = i + 1
+            it.changePer = it.changeNum.toDouble() / it.count
+        }
+        summarys.sortByDescending { it.changePer }
+        for (i in summarys.indices) {
+            val it = summarys[i]
+            it.changeRank = i + 1
+        }
+
+        formatTable(summarys)
+    }
+
+    open fun formatTable(summarys: List<Summary>) {
+        head.clear()
+        head.add(
+            mutableListOf(
+                ExcelUtil.MyCell("搴忓彿", rowSpan = 2),
+                ExcelUtil.MyCell("骞村害", rowSpan = 2),
+                ExcelUtil.MyCell("鏈堜唤", rowSpan = 2),
+                ExcelUtil.MyCell("鍦烘櫙绫诲埆", rowSpan = 2),
+                ExcelUtil.MyCell("鍖哄煙", rowSpan = 2),
+                ExcelUtil.MyCell("闂澶х被锛堜簩绾ф寚鏍囷級", rowSpan = 2),
+                ExcelUtil.MyCell("闂灏忕被锛堜笁绾ф寚鏍囷級", rowSpan = 2),
+                ExcelUtil.MyCell("闂鍗犳瘮鎺掑悕鍒嗘瀽", colSpan = 3),
+                ExcelUtil.MyCell("鏁存敼鐜囨帓鍚嶅垎鏋�", colSpan = 3),
+            )
+        )
+        head.add(
+            mutableListOf(
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell("鍚堣闂鏁�"),
+                ExcelUtil.MyCell("闂鍗犳瘮"),
+                ExcelUtil.MyCell("闂鎺掑悕"),
+                ExcelUtil.MyCell("鏁存敼鏁�"),
+                ExcelUtil.MyCell("鏁存敼鐜�"),
+                ExcelUtil.MyCell("鏁存敼鎺掑悕"),
+            )
+        )
+        for (i in summarys.indices) {
+            val s = summarys[i]
+            contents.add(
+                mutableListOf(
+                    i + 1, "", "", dataSource.rowData.scene?.type ?: "", "",
+                    s.proType, s.proDes,
+                    s.count, "${round(s.countPer * 1000) / 10}%", s.countRank,
+                    s.changeNum, "${round(s.changePer * 1000) / 10}%", s.changeRank
+                )
+            )
+        }
+    }
+
+    inner class Summary() {
+        var proType = ""
+        var proDes = ""
+        var count = 0
+        var countPer = .0
+            set(value) {
+                field = if (value.isNaN()) .0 else value
+            }
+        var countRank = 0
+
+        var changeNum = 0
+        var changePer = .0
+            set(value) {
+                field = if (value.isNaN()) .0 else value
+            }
+        var changeRank = 0
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeStatusSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeStatusSummary.kt
new file mode 100644
index 0000000..b63af99
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ProTypeStatusSummary.kt
@@ -0,0 +1,128 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import cn.flightfeather.supervision.domain.ds1.entity.SceneConstructionSite
+import kotlin.math.round
+
+class ProTypeStatusSummary(dataSource: DataSource) : BaseTemplate(dataSource) {
+    override val cols: List<BaseCols> = listOf()
+    override val templateName: String = "宸ュ湴鏂藉伐闃舵闂鍒嗙被鍒嗘瀽琛�"
+
+    @Throws(Exception::class)
+    override fun execute() {
+        if (dataSource.config.sceneType.toString() != Constant.ScenseType.TYPE1.value) {
+            throw IllegalStateException("${templateName}鍙兘閽堝宸ュ湴杩涜鍒嗘瀽锛屽綋鍓嶄紶鍏ュ満鏅被鍨嬬紪鍙蜂负${dataSource.config.sceneType}")
+        }
+
+        dataSource.reset()
+
+        val proMap = mutableMapOf<String?, MutableMap<String?, Summary>>()
+        dataSource.loop { _, rowData ->
+            rowData.problems.forEach {
+                val s = (rowData.baseScene as SceneConstructionSite?)?.csStatus
+                if (!proMap.containsKey(s)) {
+                    proMap[s] = mutableMapOf()
+                }
+                val pt = it.ptguid
+                if (proMap[s]?.containsKey(pt) == false) {
+                    proMap[s]?.put(pt, Summary().apply {
+                        for (p in rowData.problemTypes) {
+                            if (p.guid == pt) {
+                                status = s ?: ""
+                                proType = p.typename ?: ""
+                                proDes = p.description ?: ""
+                                break
+                            }
+                        }
+                    })
+                }
+                proMap[s]?.get(pt)?.apply {
+                    count++
+                    if (it.ischanged == true) changeNum++
+                }
+            }
+        }
+
+        //鍗犳瘮缁熻
+        val summarys = mutableListOf<Summary>()
+        var tPros = 0
+        proMap.forEach {
+            it.value.forEach {e ->
+                val v = e.value
+                summarys.add(v)
+                tPros += v.count
+            }
+        }
+        summarys.forEach {
+            it.countPer = it.count.toDouble() / tPros
+            it.changePer = it.changeNum.toDouble() / it.count
+        }
+
+
+        head.clear()
+        head.add(
+            mutableListOf(
+                ExcelUtil.MyCell("搴忓彿", rowSpan = 2),
+                ExcelUtil.MyCell("骞村害", rowSpan = 2),
+                ExcelUtil.MyCell("鏈堜唤", rowSpan = 2),
+                ExcelUtil.MyCell("鍦烘櫙绫诲埆", rowSpan = 2),
+                ExcelUtil.MyCell("鍖哄煙", rowSpan = 2),
+                ExcelUtil.MyCell("鏂藉伐鎴栬繍钀ョ姸鎬�", rowSpan = 2),
+                ExcelUtil.MyCell("鏂藉伐闃舵", rowSpan = 2),
+                ExcelUtil.MyCell("闂澶х被锛堜簩绾ф寚鏍囷級", rowSpan = 2),
+                ExcelUtil.MyCell("闂灏忕被锛堜笁绾ф寚鏍囷級", rowSpan = 2),
+                ExcelUtil.MyCell("闂鍗犳瘮鎺掑悕鍒嗘瀽", colSpan = 2),
+                ExcelUtil.MyCell("鏁存敼鐜囨帓鍚嶅垎鏋�", colSpan = 2),
+            )
+        )
+        head.add(
+            mutableListOf(
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell(""),
+                ExcelUtil.MyCell("鍚堣闂鏁�"),
+                ExcelUtil.MyCell("闂鍗犳瘮"),
+                ExcelUtil.MyCell("鏁存敼鏁�"),
+                ExcelUtil.MyCell("鏁存敼鐜�"),
+            )
+        )
+        for (i in summarys.indices) {
+            val s = summarys[i]
+            contents.add(
+                mutableListOf(
+                    i + 1, "", "", dataSource.rowData.scene?.type ?: "", "", s.status, s.status,
+                    s.proType, s.proDes,
+                    s.count, "${round(s.countPer * 1000) / 10}%",
+                    s.changeNum, "${round(s.changePer * 1000) / 10}%",
+                )
+            )
+        }
+    }
+
+    inner class Summary() {
+        var status = ""
+        var proType = ""
+        var proDes = ""
+        var count = 0
+        var countPer = .0
+            set(value) {
+                field = if (value.isNaN()) .0 else value
+            }
+
+        var changeNum = 0
+        var changePer = .0
+            set(value) {
+                field = if (value.isNaN()) .0 else value
+            }
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreAnalysisSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreAnalysisSummary.kt
new file mode 100644
index 0000000..e6bf6cb
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreAnalysisSummary.kt
@@ -0,0 +1,176 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.cols.ColGrade
+import cn.flightfeather.supervision.common.utils.ExcelUtil
+import kotlin.math.round
+
+class ScoreAnalysisSummary(dataSource: DataSource) : BaseTemplate(dataSource) {
+    override val cols: List<BaseCols> = listOf(ColGrade())
+
+    override val templateName: String = "鍒嗚闀囪鑼冩�у垎鏋愯〃"
+
+    override fun execute() {
+        dataSource.reset()
+        cols.forEach { it.combineHead(head,dataSource) }
+
+        val districtMap = mutableMapOf<String?, Summary>()
+        dataSource.loop { index, rowData ->
+
+            val r = cols[0].getOneRow(rowData)
+
+            val k = rowData.scene?.townname
+            if (!districtMap.containsKey(k)) {
+                districtMap[k] = Summary().apply {
+                    townCode = rowData.scene?.towncode ?: ""
+                    townName = rowData.scene?.townname ?: ""
+                    type = rowData.scene?.type ?: ""
+                }
+            }
+            if (r[1] is String) {
+                val s = r[1]
+            }
+            districtMap[k]?.apply {
+                sceneCount++
+                rowData.evaluation?.run { gradeCount++ }
+                if ((r[1] is String) && (r[1] as String).isBlank()) return@loop
+                when ((r[1] as ExcelUtil.MyCell).text) {
+                    "瑙勮寖" -> {
+                        level1++
+                        standard++
+                    }
+                    "鍩烘湰瑙勮寖" -> {
+                        level2++
+                        standard++
+                    }
+                    "涓嶈鑼�" -> {
+                        level3++
+                        nonstandard++
+                    }
+                    "涓ラ噸涓嶈鑼�" -> {
+                        level4++
+                        nonstandard++
+                    }
+                }
+            }
+        }
+
+        //鍗犳瘮缁熻
+        val summarys = mutableListOf<Summary>()
+        var tLevel1 = 0
+        var tLevel2 = 0
+        var tLevel3 = 0
+        var tLevel4 = 0
+        var tNonstandard = 0
+        var tStandard = 0
+        districtMap.forEach {
+            val v = it.value
+            summarys.add(v)
+            tLevel1 += v.level1
+            tLevel2 += v.level2
+            tLevel3 += v.level3
+            tLevel4 += v.level4
+            tNonstandard += v.nonstandard
+            tStandard += v.standard
+        }
+        summarys.sortByDescending { it.standardPer }
+        for (i in summarys.indices) {
+            val it = summarys[i]
+            //鍙傝瘎鐧惧垎姣�
+            it.gradePer = it.gradeCount.toDouble() / it.sceneCount
+            //瑙勮寖銆佸熀鏈鑼冦�佷笉瑙勮寖鍜屼弗閲嶄笉瑙勮寖鍖哄煙鍗犳瘮
+            it.level1Per = it.level1.toDouble() / tLevel1
+            it.level2Per = it.level2.toDouble() / tLevel2
+            it.level3Per = it.level3.toDouble() / tLevel3
+            it.level4Per = it.level4.toDouble() / tLevel4
+            //涓嶈鑼冨尯鍩熷崰姣�
+            it.nonstandardPer = it.nonstandard.toDouble() / tNonstandard
+            //瑙勮寖鍖哄煙鍗犳瘮
+            it.standardPer = it.standard.toDouble() / tStandard
+            //瑙勮寖鍗犳瘮鎺掑悕
+            it.rank = i + 1
+        }
+
+        head.clear()
+        head.add(mutableListOf(
+            ExcelUtil.MyCell("琛楅晣搴忓彿", rowSpan = 2),
+            ExcelUtil.MyCell("琛楅晣/宸ヤ笟鍖�", rowSpan = 2),
+            ExcelUtil.MyCell("鍦烘櫙绫诲埆", rowSpan = 2),
+            ExcelUtil.MyCell("鍙傝瘎鎯呭喌", colSpan = 3),
+            ExcelUtil.MyCell("瑙勮寖鎬у垎绫诲垎鏋�", colSpan = 8),
+            ExcelUtil.MyCell("瑙勮寖鎬ф眹鎬诲垎鏋�", colSpan = 5),
+        ))
+        head.add(mutableListOf(
+            ExcelUtil.MyCell(""),
+            ExcelUtil.MyCell(""),
+            ExcelUtil.MyCell(""),
+            ExcelUtil.MyCell("鍦烘櫙鎬绘暟"),
+            ExcelUtil.MyCell("鍙傝瘎鏁�"),
+            ExcelUtil.MyCell("鍙傝瘎鐧惧垎姣�"),
+            ExcelUtil.MyCell("闃叉不瑙勮寖"),
+            ExcelUtil.MyCell("鍖哄煙鍗犳瘮"),
+            ExcelUtil.MyCell("闃叉不鍩烘湰瑙勮寖"),
+            ExcelUtil.MyCell("鍖哄煙鍗犳瘮"),
+            ExcelUtil.MyCell("闃叉不涓嶈鑼�"),
+            ExcelUtil.MyCell("鍖哄煙鍗犳瘮"),
+            ExcelUtil.MyCell("闃叉不涓ラ噸涓嶈鑼�"),
+            ExcelUtil.MyCell("鍖哄煙鍗犳瘮"),
+            ExcelUtil.MyCell("鍚勭被涓嶈鑼冨悎璁�"),
+            ExcelUtil.MyCell("鍚勭被涓嶈鑼冨悎璁″尯鍩熷崰姣�"),
+            ExcelUtil.MyCell("鍚勭被瑙勮寖鍚堣"),
+            ExcelUtil.MyCell("鍚勭被瑙勮寖鍚堣鍖哄煙鍗犳瘮"),
+            ExcelUtil.MyCell("瑙勮寖鎬ф帓鍚�"),
+        ))
+
+        summarys.forEach {
+            contents.add(
+                mutableListOf(
+                    it.townCode, it.townName, it.type, it.sceneCount, it.gradeCount, "${round(it.gradePer * 1000) / 10}%",
+                    it.level1, "${round(it.level1Per * 1000) / 10}%",
+                    it.level2, "${round(it.level2Per * 1000) / 10}%",
+                    it.level3, "${round(it.level3Per * 1000) / 10}%",
+                    it.level4, "${round(it.level4Per * 1000) / 10}%",
+                    it.nonstandard, "${round(it.nonstandardPer * 1000) / 10}%",
+                    it.standard, "${round(it.standardPer * 1000) / 10}%",
+                    it.rank
+                )
+            )
+        }
+    }
+
+    inner class Summary(){
+        var townCode = ""
+        var townName = ""
+        var type = ""
+        var sceneCount = 0
+        //鍙傝瘎鏁�
+        var gradeCount = 0
+        var gradePer = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+        //瑙勮寖銆佸熀鏈鑼冦�佷笉瑙勮寖鍜屼弗閲嶄笉瑙勮寖鏁伴噺鍙婂尯鍩熷崰姣�
+        var level1 = 0
+        var level1Per = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+        var level2 = 0
+        var level2Per = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+        var level3 = 0
+        var level3Per = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+        var level4 = 0
+        var level4Per = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+        //涓嶈鑼冨悎璁″強鍖哄煙鍗犳瘮
+        var nonstandard = 0
+        var nonstandardPer = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+        //瑙勮寖鍚堣鍙婂尯鍩熷崰姣�
+        var standard = 0
+        var standardPer = .0
+            set(value) { field = if (value.isNaN()) .0 else value }
+        //瑙勮寖鍗犳瘮鎺掑悕
+        var rank = 0
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreDetailSummary.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreDetailSummary.kt
new file mode 100644
index 0000000..25b3c7a
--- /dev/null
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/template/ScoreDetailSummary.kt
@@ -0,0 +1,13 @@
+package cn.flightfeather.supervision.business.report.template
+
+import cn.flightfeather.supervision.business.report.BaseCols
+import cn.flightfeather.supervision.business.report.BaseTemplate
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.cols.ColGrade
+import cn.flightfeather.supervision.business.report.cols.ColSceneName
+import cn.flightfeather.supervision.business.report.cols.ColTown
+
+class ScoreDetailSummary(dataSource: DataSource) : BaseTemplate(dataSource) {
+    override val cols: List<BaseCols> = listOf(ColSceneName(), ColTown(), ColGrade())
+    override val templateName: String = "瑙勮寖鎬ц瘎浼拌鎯呰〃"
+}
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/storage/StAutoScore.kt b/src/main/kotlin/cn/flightfeather/supervision/business/storage/StAutoScore.kt
index c776371..00721c7 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/business/storage/StAutoScore.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/storage/StAutoScore.kt
@@ -110,10 +110,10 @@
     fun topTaskGrade(topTaskId:String) {
         rows.clear()
         subtaskMapper.selectByTopTask2(topTaskId, sceneType.value.toInt()).forEach {
-//            sceneGrade(it)
-            sceneGradeToFile(it)
+            sceneGrade(it)
+//            sceneGradeToFile(it)
         }
-        toFile()
+//        toFile()
     }
 
     /**
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 d75f106..921170e 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/utils/Constant.kt
@@ -40,6 +40,25 @@
                 TYPE14.value -> 4
                 else -> sceneTypeId
             }
+
+            fun getDes(value: Int?) = when (value.toString()) {
+                "1" -> TYPE1.text
+                "2" -> TYPE2.text
+                "3" -> TYPE3.text
+                "4" -> TYPE4.text
+                "5" -> TYPE5.text
+                "6" -> TYPE6.text
+                "7" -> TYPE7.text
+                "8" -> TYPE8.text
+                "9" -> TYPE9.text
+                "10" -> TYPE10.text
+                "11" -> TYPE11.text
+                "12" -> TYPE12.text
+                "13" -> TYPE13.text
+                "14" -> TYPE14.text
+                "99" -> TYPE99.text
+                else -> ""
+            }
         }
     }
 
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt b/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt
index 8bb0aeb..3bd21a9 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt
@@ -181,11 +181,11 @@
     /**
      * 鑷姩澶勭悊琛屽悎骞舵暟鎹�
      */
-    fun write2(out: OutputStream, heads: List<Array<Any>>, contents: MutableList<Array<Any>>) {
+    fun write2(out: OutputStream, heads: List<Array<Any>>, contents: MutableList<Array<Any>>, sheetName: String = "sheet1") {
 
         val workbook = HSSFWorkbook()
 
-        write(heads, contents, workbook)
+        write(heads, contents, workbook, sheetName)
 
         workbook.write(out)
         workbook.close()
@@ -193,6 +193,10 @@
         out.close()
     }
 
+    fun write3() {
+
+    }
+
     private fun getMaxRows(rowArray: Array<Any>): Int {
         var maxRows = 1
         rowArray.forEach {
diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/utils/FileUtil.kt b/src/main/kotlin/cn/flightfeather/supervision/common/utils/FileUtil.kt
index 2cd72f0..f96d545 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/common/utils/FileUtil.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/utils/FileUtil.kt
@@ -1,10 +1,10 @@
 package cn.flightfeather.supervision.common.utils
 
-import java.io.File
-import java.io.FileOutputStream
-import java.io.FileInputStream
-
-
+import java.awt.Image
+import java.awt.image.BufferedImage
+import java.io.*
+import java.util.*
+import javax.imageio.ImageIO
 
 
 object FileUtil {
@@ -116,4 +116,32 @@
 
         }
     }
+
+    /**
+     * 鎸夌収鍥哄畾瀹藉害鍘嬬缉鍥剧墖鑷砨ase64褰㈠紡
+     */
+//    fun compressImage2(bytes: ByteArray): String {
+//        val length = 1440//鍥剧墖闀胯竟鍥哄畾鍘嬬缉涓�1440鍍忕礌
+//
+//        val input = ByteArrayInputStream(bytes)
+//        val srcImg = ImageIO.read(input)
+//        var srcLong = 0
+//        var srcShort = 0
+//        if (srcImg.width <= srcImg.height) {
+//            srcLong = srcImg.height
+//            srcShort = srcImg.width
+//
+//        } else {
+//
+//        }
+//        val scale = w.toFloat() / srcW
+//        val h = (srcImg.height * scale).toInt()
+//
+//        val buffImg = BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB)
+//        buffImg.graphics.drawImage(srcImg.getScaledInstance(w, h, Image.SCALE_SMOOTH), 0, 0, null)
+//        val out = ByteArrayOutputStream()
+//        ImageIO.write(buffImg, "PNG", out)
+//
+//        return SCHEME_PNG + Base64.getEncoder().encodeToString(out.toByteArray())
+//    }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/SearchService.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/SearchService.kt
index 8c84af7..214eb3a 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/SearchService.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/SearchService.kt
@@ -9,7 +9,7 @@
  */
 interface SearchService {
 
-    fun writeToFile(config: ExcelConfigVo)
+    fun writeToFile(config: ExcelConfigVo, mode: Int)
 
     fun getExcel(config: ExcelConfigVo, response: HttpServletResponse): HttpServletResponse
 
diff --git a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImpl.kt b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImpl.kt
index dbcdd84..647b09e 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImpl.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImpl.kt
@@ -1,5 +1,11 @@
 package cn.flightfeather.supervision.lightshare.service.impl
 
+import cn.flightfeather.supervision.business.report.DataSource
+import cn.flightfeather.supervision.business.report.DbMapper
+import cn.flightfeather.supervision.business.report.file.ReportOne
+import cn.flightfeather.supervision.business.report.file.ReportThree
+import cn.flightfeather.supervision.business.report.file.ReportTwo
+import cn.flightfeather.supervision.business.report.template.*
 import cn.flightfeather.supervision.common.utils.*
 import cn.flightfeather.supervision.domain.ds1.entity.*
 import cn.flightfeather.supervision.domain.ds1.mapper.*
@@ -36,19 +42,58 @@
     val scoreMapper: ScoreMapper,
     val inspectionMapper: InspectionMapper,
     val taskMapper: TaskMapper,
-    val monitorobjectversionMapper: MonitorobjectversionMapper
+    val monitorobjectversionMapper: MonitorobjectversionMapper,
+    val evaluationruleMapper: EvaluationruleMapper,
+    val evaluationsubruleMapper: EvaluationsubruleMapper2,
+    val evaluationMapper: EvaluationMapper,
+    val itemevaluationMapper: ItemevaluationMapper
 ) : SearchService {
 
     private val dateUtil = DateUtil()
 
-    override fun writeToFile(config: ExcelConfigVo) {
-        val fileName = "target/${dateUtil.DateToString(Date(), "yyyy-MM-ddhhmmss")}.xls"
+    override fun writeToFile(config: ExcelConfigVo, mode:Int) {
+        val dbMapper = DbMapper(
+            scenseMapper,
+            problemlistMapper,
+            problemtypeMapper,
+            subtaskMapper,
+            monitorobjectversionMapper,
+            sceneConstructionSiteMapper,
+            sceneMixingPlantMapper,
+            sceneStorageYardMapper,
+            sceneWharfMapper,
+            taskMapper,
+            evaluationruleMapper, evaluationsubruleMapper, evaluationMapper, itemevaluationMapper
+        )
+        val dataSource = DataSource(config, dbMapper)
+        val t = when (mode) {
+//            //闂涓庢暣鏀硅窡韪眹鎬昏〃
+//            0 -> ProDetailSummary(dataSource)
+//            //鍒嗚闀囬棶棰樻暣鏀瑰垎鏋愭眹鎬昏〃
+//            1 -> ProAnalysisSummary(dataSource)
+//
+//            //瑙勮寖鎬ц瘎浼拌鎯呰〃
+//            2 -> ScoreDetailSummary(dataSource)
+//            //鍒嗚闀囪鑼冩�у垎鏋愯〃
+//            3 -> ScoreAnalysisSummary(dataSource)
+//
+//            //闂涓庢暣鏀瑰垎绫荤粺璁¤〃
+//            4 -> ProTypeDetailSummary(dataSource)
+//            //闂涓庢暣鏀瑰垎绫绘帓鍚�
+//            5 -> ProTypeRankSummary(dataSource)
+//            //鏈堝害涓昏鎴栧吀鍨嬮棶棰樺垎鏋愯〃
+//            6 -> ProTypeRankMainSummary(dataSource)
+//            //宸ュ湴鏂藉伐闃舵闂鍒嗙被鍒嗘瀽琛�
+//            7 -> ProTypeStatusSummary(dataSource)
 
-        val out = FileOutputStream(fileName)
-//        val heads = getTableTitles(config.sceneType, config.districtCode)
-//        val contents = getTableContents(config, heads.size)
-        val r = getTable(2, config)
-        ExcelUtil.write2(out, r.first, r.second)
+            8 -> ReportOne(dataSource)
+            9 -> ReportTwo(dataSource)
+            10 -> ReportThree(dataSource)
+
+            else -> null
+        }
+//        t?.execute()
+        t?.toFile("target/")
     }
 
     override fun getExcel(config: ExcelConfigVo, response: HttpServletResponse): HttpServletResponse {
@@ -517,7 +562,7 @@
         //鍘熸湁鐨勭涓�琛岃〃澶村鍔�1琛岃璺ㄥ害,鍚屾椂鏂扮殑绗簩琛岃〃澶存坊鍔犵┖浣�
         head[0].forEach {
             (it as ExcelUtil.MyCell).rowSpan++
-            h2.add(0, "")
+//            h2.add(0, "")
         }
         //鍚堝苟琛ㄥご
         head[0].addAll(h1)
diff --git a/src/main/resources/generator/generatorConfig4ds1.xml b/src/main/resources/generator/generatorConfig4ds1.xml
index d162ed8..b694f3e 100644
--- a/src/main/resources/generator/generatorConfig4ds1.xml
+++ b/src/main/resources/generator/generatorConfig4ds1.xml
@@ -19,7 +19,7 @@
             <property name="suppressAllComments" value="true"/>
         </commentGenerator>
         <!--鏁版嵁搴撻摼鎺RL锛岀敤鎴峰悕銆佸瘑鐮� -->
-        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://47.100.191.150:3306/ledger?serverTimezone=Asia/Shanghai"
+        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://47.100.191.150:3306/supervision?serverTimezone=Asia/Shanghai"
 						userId="remoteU1"
 						password="eSoF8DnzfGTlhAjE">
         </jdbcConnection>
@@ -27,16 +27,16 @@
             <property name="forceBigDecimals" value="false"/>
         </javaTypeResolver>
         <!-- 鐢熸垚妯″瀷鐨勫寘鍚嶅拰浣嶇疆-->
-        <javaModelGenerator targetPackage="cn.flightfeather.supervision.domain.ds2.entity" targetProject="src/main/kotlin">
+        <javaModelGenerator targetPackage="cn.flightfeather.supervision.domain.ds1.entity" targetProject="src/main/kotlin">
             <property name="enableSubPackages" value="true"/>
             <property name="trimStrings" value="true"/>
         </javaModelGenerator>
         <!-- 鐢熸垚鏄犲皠鏂囦欢鐨勫寘鍚嶅拰浣嶇疆-->
-        <sqlMapGenerator targetPackage="ds2" targetProject="src/main/resources/mapper">
+        <sqlMapGenerator targetPackage="ds1" targetProject="src/main/resources/mapper">
             <property name="enableSubPackages" value="true"/>
         </sqlMapGenerator>
         <!-- 鐢熸垚DAO鐨勫寘鍚嶅拰浣嶇疆-->
-        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.flightfeather.supervision.domain.ds2.mapper" targetProject="src/main/kotlin">
+        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.flightfeather.supervision.domain.ds1.mapper" targetProject="src/main/kotlin">
             <property name="enableSubPackages" value="true"/>
         </javaClientGenerator>
         <!-- 瑕佺敓鎴愮殑琛� tableName鏄暟鎹簱涓殑琛ㄥ悕鎴栬鍥惧悕 domainObjectName鏄疄浣撶被鍚�-->
@@ -77,6 +77,8 @@
 <!--        <table tableName="sm_t_night_construction" domainObjectName="NightConstruction" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>-->
 <!--        <table tableName="sm_t_score" domainObjectName="Score" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
 <!--        <table tableName="sm_t_scense" domainObjectName="Scense" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
-        <table tableName="ea_t_mediafile" domainObjectName="LedgerMediaFile" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
+<!--        <table tableName="ea_t_mediafile" domainObjectName="LedgerMediaFile" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>-->
+        <table tableName="ea_t_dust_data_result" domainObjectName="DustDataResult" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
+               enableSelectByExample="false" selectByExampleQueryId="false"/>
     </context>
 </generatorConfiguration>
\ No newline at end of file
diff --git a/src/test/kotlin/cn/flightfeather/supervision/business/fume/AutoScoreTest.kt b/src/test/kotlin/cn/flightfeather/supervision/business/fume/AutoScoreTest.kt
index bd46631..f02583c 100644
--- a/src/test/kotlin/cn/flightfeather/supervision/business/fume/AutoScoreTest.kt
+++ b/src/test/kotlin/cn/flightfeather/supervision/business/fume/AutoScoreTest.kt
@@ -39,7 +39,9 @@
     @Test
     fun go() {
         autoScore.sceneType = Constant.ScenseType.TYPE1
-        autoScore.topTaskGrade("Z3RwJ5jF123sjDsj")
+        autoScore.topTaskGrade("tgfMJWdUJqWE6bWo")
+//        val subtask = subtaskMapper.selectByPrimaryKey("1DxdkFdVAdQD5Mce")
+//        autoScore.sceneGrade(subtask)
 //        autoScore3.go(2022, 1, 2)
 //        val t = problemlistMapper.getStatisticalResult("310116", "2021-09-01 00:00:00", "2021-09-30 00:00:00", "1")
 //        println()
diff --git a/src/test/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImplTest.kt b/src/test/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImplTest.kt
index 9b6ce43..498bc47 100644
--- a/src/test/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImplTest.kt
+++ b/src/test/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImplTest.kt
@@ -30,6 +30,11 @@
         val localTimeE = LocalDateTime.of(2021, 3, 31, 23, 59, 59)
         val sD = Date.from(localTimeS.atZone(ZoneId.systemDefault()).toInstant())
         val eD = Date.from(localTimeE.atZone(ZoneId.systemDefault()).toInstant())
-        searchService.writeToFile(ExcelConfigVo("Z3RwJ5jF123sjDsj", districtCode = "310106", sceneType = 1))
+
+        val mode = 10
+        //閲戝北2022骞�6鏈�
+        searchService.writeToFile(ExcelConfigVo("tgfMJWdUJqWE6bWo", districtCode = "310116", sceneType = 1), mode)
+        //閲戝北2021骞�3鏈�
+//        searchService.writeToFile(ExcelConfigVo("o7jdSzr79fe0NH3I", districtCode = "310116", sceneType = 1))
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3