feiyu02
2025-09-30 94fee0b511279679b43e210878d3d36e5a14384b
src/main/kotlin/com/flightfeather/uav/model/BaseModel.kt
@@ -3,7 +3,6 @@
import com.flightfeather.uav.common.utils.DateUtil
import com.flightfeather.uav.common.utils.ExcelUtil
import com.flightfeather.uav.socket.eunm.FactorType
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.xssf.streaming.SXSSFWorkbook
import java.io.File
import java.io.FileOutputStream
@@ -14,7 +13,7 @@
 * 污染源影响程度权重分析模型
 * 基类
 */
abstract class BaseModel<M : BaseMData> {
abstract class BaseModel<M : BaseMData, S: BaseSOP> {
    data class ResultCell(
        var total: Double = 0.0,
@@ -27,26 +26,26 @@
        }
    }
    abstract var dataPrep: BaseDataPrep<M, BaseSOP>
    abstract var dataPrep: BaseDataPrep<M, S>
    // 权重因子,在进行计算分析时使用的监测因子
    abstract var factorTypes: List<FactorType>
    // 权重值,多种权重进行乘积计算
    abstract var weights: List<BaseWeight<M, BaseSOP>>
    abstract var weights: List<BaseWeight<M, S>>
    // 计算结果
    private val rMap = mutableMapOf<String, MutableMap<String, MutableMap<String, ResultCell>>>()
    // 结果筛选方式
    abstract var sections: List<BaseSection<M, BaseSOP>>
    abstract var sections: List<BaseSection<M, S>>
    /**
     * 污染源影响程度计算
     * @param mDataList 监测数据集合
     * @param sopList 污染源集合
     */
    fun execute(mDataList: List<M>, sopList: List<BaseSOP>, hasNext: Boolean = false) {
    open fun execute(mDataList: List<M>, sopList: List<S>, hasNext: Boolean = false) {
        if (!hasNext) rMap.clear()
        //1. 数据预处理
@@ -68,7 +67,7 @@
     * @param mData 监测数据
     * @param sop 污染源
     */
    private fun weightCompute(mData: M, sop: BaseSOP) {
    private fun weightCompute(mData: M, sop: S) {
        val effect = BaseEffect(sop.sourceId, sop.sourceName, sop.index)
        // 将原监测数据按照权重计算出结果值
@@ -132,7 +131,7 @@
                        val lKey = "$se($factorType)"
                        if (lMap.containsKey(lKey)) {
                            val resultCell = lMap[lKey] ?: return@type
                            val size = resultCell.count
//                            val size = resultCell.count
                            // 添加该分类作为表头
                            val h = lKey
//                            val h = "$lKey($size)"
@@ -199,6 +198,12 @@
        return rMap
    }
    /**
     * 将计算结果格式化为多层级的键对值结构
     * 第一层按照不同污染源的索引值进行分类
     * 第二层按照监测因子类型进行分类
     * 第三层按照自定义的标签进行分类
     */
    private fun formatConversion2(e: BaseEffect) {
        val rKey = "${e.sourceName};${e.index}"
        if (!rMap.containsKey(rKey)) {
@@ -234,5 +239,5 @@
    /**
     * 污染源数据合法性检查
     */
    abstract fun sopCheck(s: BaseSOP): Boolean
    abstract fun sopCheck(s: S): Boolean
}