src/main/kotlin/cn/flightfeather/supervision/business/report/BaseTemplate.kt
@@ -1,20 +1,22 @@
package cn.flightfeather.supervision.business.report
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 cn.flightfeather.supervision.business.report.bean.BaseTemplateResult
import cn.flightfeather.supervision.common.utils.UUIDGenerator
import cn.flightfeather.supervision.domain.ds1.entity.DataProduct
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import tk.mybatis.mapper.entity.Example
import java.io.FileOutputStream
import java.io.OutputStream
import java.util.*
import kotlin.collections.ArrayList
import kotlin.reflect.full.createInstance
/**
 * excel报告模板基类
 * 单个数据源
 */
// FIXME: 2022/7/15 模板简化:只有表头会涉及单元格合并,默认表内容中没有合并
abstract class BaseTemplate(val dataSource: DataSource){
abstract class BaseTemplate(val dataSource: DataSource) : BaseOutputInterface {
    //列组合
    abstract val cols: List<BaseCols>
@@ -22,22 +24,35 @@
    //模板名称
    abstract val templateName: String
    // 中间结果对象 by hc 2024.12.5
    abstract var resultObjects: MutableList<BaseTemplateResult>
    // 中间结果基本信息对应数据库中的entity
    var dataProduct = DataProduct()
    // 中间结果具体信息对应数据库中的entity
    val entities = ArrayList<Any>()
    // 执行状态 by hc 2024.12.5
    var isExecuted: Boolean = false
    //表头
    val head = mutableListOf<MutableList<ExcelUtil.MyCell>>()
    //内容
    val contents = mutableListOf<MutableList<Any>>()
    open fun execute() {
    // 生成Template相关数据 by hc 2024.12.9
    open fun genData() {
        //数据源重置
        dataSource.reset()
        //合成表头
        cols.forEach {
            it.combineHead(head,dataSource)
            it.combineHead(head, dataSource)
        }
        //合成数据
        dataSource.loop { index, rowData ->
            cols.forEach {col ->
            cols.forEach { col ->
                val r = col.getOneRow(rowData)
                if (index >= contents.size) {
                    contents.add(mutableListOf())
@@ -47,20 +62,90 @@
        }
    }
    fun toWorkBook(wb: HSSFWorkbook) {
    open fun execute() {
        try {
            genData()
            // 没有错误正常运行结束
            isExecuted = true
        } catch (e: Exception) {
            // TODO: handle exception
        }
    }
    override fun toWorkBook(wb: HSSFWorkbook) {
        val f = tableFormat()
        ExcelUtil.write(f.first, f.second, wb, templateName)
    }
    fun toOutputStream(out: OutputStream, sheetName: String? = null) {
    override fun toOutputStream(out: OutputStream, sheetName: String?) {
        val f = tableFormat()
        ExcelUtil.write2(out, f.first, f.second, sheetName ?: templateName)
    }
    /**
     * 输出到对象
     * hc 2024.12.06
     */
    fun toObject(): MutableList<BaseTemplateResult>  {
        if (!isExecuted) {
            execute()
        }
        // 获得和template对应的中间结果数据对象KCLASS对象
        val classType = resultObjects.first()::class
        try {
            // 清空数组
            resultObjects.clear()
            contents.forEach {
                // 创建对应的中间结果数据对象
                val resultObj = classType.createInstance()
                resultObj.setProperties(it)
                resultObjects.add(resultObj)
            }
        }catch (e: Exception) {
            // 如果出现异常恢复到初始状态 避免下次调用toObject数据重复
            resultObjects.clear()
            resultObjects.add(classType.createInstance())
        }
        return resultObjects
    }
    /**
     * 生成中间结果具体信息entity
     * by hc 2024.12.12
     */
    fun toDBEntity() {
        entities.clear()
        if (!isExecuted) {
            execute()
        }
        // 先执行toObject后将toObject的结果转化为DBEntity
        toObject()
        resultObjects.forEach {
            entities.add(it.convertToDBEntity())
        }
    }
    /**
     * 生成中间结果基本信息entity
     * by hc 2024.12.12
     */
    fun toDBBaseInfoEntity() {
        dataProduct = DataProduct()
        dataProduct.guid = UUIDGenerator.generate16ShortUUID()
        dataProduct.townCode = dataSource.config.townCode
        dataProduct.cityCode = dataSource.config.cityCode
        dataProduct.districtCode = dataSource.config.districtCode
        dataProduct.endTime = dataSource.config.endTime
        dataProduct.startTime = dataSource.config.startTime
        dataProduct.provinceCode = dataSource.config.provinceCode
        dataProduct.sceneTypeId = dataSource.config.sceneType?.toByte() ?: -1
        dataProduct.taskGuid = dataSource.config.topTaskGuid
    }
    /**
     * 输出为文档
     */
    fun toFile(path: String) {
    override fun toFile(path: String) {
        val fileName = "${dataSource.areaName()}-${templateName}-${Date().time}.xls"
        val out = FileOutputStream(path + fileName)
        toOutputStream(out)
@@ -69,12 +154,13 @@
    /**
     * 表头和表内容格式转化
     */
    private fun tableFormat(): Pair<MutableList<Array<Any>>, MutableList<Array<Any>>> {
    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) {
@@ -91,11 +177,3 @@
        return Pair(h, c)
    }
}
//固定列组合
//基本信息
//问题扣分分布