package cn.cecep.talroad.data.analyse.task.execute.report.specifications.audit;

import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author hehongyu
 * @description: 执行报告审核类
 * @date 2023/8/12 17:07
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class ExecuteReportAuditService {
    //序号 61  （正常监测时段）无组织废气污染物排放浓度监测数据统计表
    final FugitiveExhaustPollutantsService fugitiveExhaustPollutantsService;
    //序号 64  非正常工况/特殊时段有组织废气污染物监测数据统计表
    final NotNormalOrgGasPollutantsService notNormalOrgGasPollutantsService;
    //序号 67  超标排放信息
    final ExcessiveEmissionsService excessiveEmissionsService;
    //序号 68  附图附件-自行监测布点图
    final SelfMonitoringLayoutMapService selfMonitoringLayoutMapService;
    //序号 69  污染物实际排放计算过程
    final PollutantEmissionsCalculationProcessService pollutantEmissionsCalculationProcessService;
    //序号 70 台账管理情况表
    final LedgerManagementStatusTableService ledgerManagementStatusTableService;
    // 需要66 差异20
    final ExcessiveDifferenceService excessiveDifferenceService;

    public void audit(List<String> executeReportIds){
        //执行报表分批次进行   暂定10个报告一批
        List<List<String>> partitionIds = Lists.partition(executeReportIds, 10);
        for (List<String> partitionExecuteReportIds : partitionIds) {
            //执行所有审核任务
            try {
                execute(partitionExecuteReportIds);
            }catch (Exception e){
                log.error("执行审核相关任务错误 executeReportIds：{}", executeReportIds, e);
            }
        }
    }


    public void execute(List<String> reportIds){
        //TODO 性能 可以利用线程池同时执行 策略为CallerRunsPolicy 用来并行执行比较耗时的任务

        //所有的审核任务 需要将方法手动添加到此处！！！

        //序号 61  (正常监测时段) 无组织废气污染物排放浓度监测数据统计表
        fugitiveExhaustPollutantsService.execute(reportIds); //比较耗时
        //序号 64  非正常工况/特殊时段有组织废气污染物监测数据统计表
        notNormalOrgGasPollutantsService.execute(reportIds); //比较耗时;
        //序号 67  超标排放信息
        excessiveEmissionsService.execute(reportIds);   //比较耗时
        //序号 66  差异占比
        excessiveDifferenceService.execute(reportIds);
        //序号 68  附图附件-自行监测布点图
        selfMonitoringLayoutMapService.execute(reportIds);
        //序号 69  污染物实际排放计算过程
        pollutantEmissionsCalculationProcessService.execute(reportIds);
        //序号 70 台账管理情况表
        ledgerManagementStatusTableService.execute(reportIds);
    }
}