| | |
| | | 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> |
| | |
| | | //模板名称 |
| | | 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()) |
| | |
| | | } |
| | | } |
| | | |
| | | 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) |
| | |
| | | /** |
| | | * 表头和表内容格式转化 |
| | | */ |
| | | 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) { |
| | |
| | | return Pair(h, c) |
| | | } |
| | | } |
| | | |
| | | //固定列组合 |
| | | |
| | | |
| | | //基本信息 |
| | | //问题扣分分布 |
| | | |
| | | |