diff --git a/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/ExcessiveEmissionsService.java b/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/ExcessiveEmissionsService.java index edd4c26..0c1f8eb 100644 --- a/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/ExcessiveEmissionsService.java +++ b/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/ExcessiveEmissionsService.java @@ -54,6 +54,7 @@ public class ExcessiveEmissionsService { private PcOutletMapper outletMapper; public void execute(List reportIds){ + //复杂 无法批量 直接遍历报告id 进行审核 LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .in(BMainActionReports::getId, reportIds); List bMainActionReports = actionReportsMapper.selectList(queryWrapper); diff --git a/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/FugitiveExhaustPollutantsService.java b/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/FugitiveExhaustPollutantsService.java index b9219c6..ac4c6f0 100644 --- a/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/FugitiveExhaustPollutantsService.java +++ b/szhpt-fixed-task/src/main/java/cn/cecep/talroad/data/analyse/task/execute/report/specifications/audit/FugitiveExhaustPollutantsService.java @@ -1,9 +1,32 @@ package cn.cecep.talroad.data.analyse.task.execute.report.specifications.audit; +import cn.cecep.talroad.domain.BMainActionReports; +import cn.cecep.talroad.domain.BMainPollDisSelfMon; +import cn.cecep.talroad.domain.BStatTableZxbgGasEmissionStatistics; +import cn.cecep.talroad.domain.analysis.SRaActionReportsAuditRecord; +import cn.cecep.talroad.domain.analysis.SRaActionReportsAuditResult; +import cn.cecep.talroad.enums.EmlTypeEnums; +import cn.cecep.talroad.mapper.BMainActionReportsMapper; +import cn.cecep.talroad.mapper.BMainPollDisSelfMonMapper; +import cn.cecep.talroad.mapper.BStatTableZxbgGasEmissionStatisticsMapper; +import cn.cecep.talroad.mapper.analysis.SRaActionReportsAuditRecordMapper; +import cn.cecep.talroad.mapper.analysis.SRaActionReportsAuditResultMapper; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author hehongyu @@ -13,9 +36,182 @@ import java.util.List; @Slf4j @Service public class FugitiveExhaustPollutantsService { + @Autowired + private BMainActionReportsMapper actionReportsMapper; + @Autowired + private BMainPollDisSelfMonMapper pollDisSelfMonMapper; + + @Autowired + private BStatTableZxbgGasEmissionStatisticsMapper statTableZxbgGasEmissionStatisticsMapper; + + @Autowired + private SRaActionReportsAuditResultMapper auditResultMapper; + + @Autowired + private SRaActionReportsAuditRecordMapper recordMapper; public void execute(List reportIds){ + //复杂 无法批量 直接遍历报告id 进行审核 + LambdaQueryWrapper reportQueryWrapper = new QueryWrapper().lambda() + .in(BMainActionReports::getId, reportIds); + List bMainActionReports = actionReportsMapper.selectList(reportQueryWrapper); + List updateList = new ArrayList<>(); + //执行报告id 和 执行报告审核结果的映射关系 + Map reportRecordMap = getReportRecordMap(reportIds); + for (BMainActionReports bMainActionReport : bMainActionReports) { + String factoryId = bMainActionReport.getFactoryId(); + String reportsType = bMainActionReport.getReportsType();//EmlTypeEnums + //根据企业查询到所有频次 然后根据 报告类型判断 生产设施/无组织排放编号要用许可系统的无组织编号全部查一下 以排污许可自行监测为主表进行判断 + LambdaQueryWrapper pollQueryWrapper = new QueryWrapper().lambda() + .select(BMainPollDisSelfMon::getFactoryId, BMainPollDisSelfMon::getOutletCode, BMainPollDisSelfMon::getPollutantType) + .eq(BMainPollDisSelfMon::getFactoryId, factoryId); + List bMainPollDisSelfMons = pollDisSelfMonMapper.selectList(pollQueryWrapper); + if (CollectionUtil.isEmpty(bMainPollDisSelfMons)){ + log.warn("bMainActionReport:{} 无自行监测频率数据!", JSON.toJSONString(bMainActionReport)); + continue; + } + Map shouldDatCountMap = new HashMap<>(); + //需要建立一个 排放口编号-污染物种类:检测频率 的映射 + for (BMainPollDisSelfMon bMainPollDisSelfMon : bMainPollDisSelfMons) { + String monitoringManualFrequency = bMainPollDisSelfMon.getMonitoringManualFrequency(); + //如果是年报则判断 手工检测频次1年1次 或者1季度1次*4 或者1月一次*12 就是 需要填报数据的总次数 + int count = getCount(monitoringManualFrequency, reportsType); + //此处能获取到排口-污染物:报表对应需要检测的次数 + shouldDatCountMap.put(buildKey(bMainPollDisSelfMon.getOutletCode(),bMainPollDisSelfMon.getPollutantType()),count); + } + for (Map.Entry entry : shouldDatCountMap.entrySet()) { + String outletCode = getOutletCodeByKey(entry.getKey()); + String pollutantType = getPollutantTypeByKey(entry.getKey()); + //需要根据排口编号 和 污染物种类 去对比 报告实际填报了多少数据 + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() + .eq(BStatTableZxbgGasEmissionStatistics::getFactoryId, factoryId) + .eq(BStatTableZxbgGasEmissionStatistics::getZxbgType, reportsType) + .eq(BStatTableZxbgGasEmissionStatistics::getFacilitiesCode, outletCode) + .eq(BStatTableZxbgGasEmissionStatistics::getZxbgPollutantType, pollutantType); + List dataList = statTableZxbgGasEmissionStatisticsMapper.selectList(queryWrapper); + if (CollectionUtil.isEmpty(dataList)){ + log.warn("执行报告--无组织废气污染物排放浓度监测数据统计对象 排口code:{},污染物种类:{},无对应数据!",outletCode,pollutantType); + continue; + } + //除了判断频次是否达标外 还需要判断是否超标 + for (BStatTableZxbgGasEmissionStatistics data : dataList) { + boolean isUpdate = false; + SRaActionReportsAuditResult sRaActionReportsAuditResult = reportRecordMap.get(bMainActionReport.getId()); + if (sRaActionReportsAuditResult == null){ + continue; + } + Long monitoringNumber = data.getMonitoringNumber(); + if (monitoringNumber < entry.getValue()){ + //不满足 规范 + sRaActionReportsAuditResult.setMonitoringFrequency("“"+outletCode+"”监测“"+pollutantType+"”的监测频次为“"+entry.getValue()+"”,本次填报数据"+monitoringNumber+"条,缺失"+(entry.getValue().longValue()-monitoringNumber)+"条"); + isUpdate = true; + } + //浓度监测结果 + BigDecimal result = new BigDecimal(data.getMonitoringResultsHour()); + //许可浓度 + BigDecimal emission = new BigDecimal(data.getEmissionConcentration()); + if (result.compareTo(emission) > 0 && !"1".equals(data.getIsExceeded())){ + //结果 > 许可 但是 报告超标 是不规范的 + sRaActionReportsAuditResult.setExcessiveEmissions("“"+outletCode+"“"+pollutantType+"” 浓度监测结果与是否超标及超标原因不对应"); + isUpdate = true; + } + if (isUpdate){ + updateList.add(sRaActionReportsAuditResult); + } + } + } + } + //修改审核结果 + if (CollectionUtil.isNotEmpty(updateList)){ + auditResultMapper.batchUpdate(updateList); + } + } + public Map getReportRecordMap(List reportIds){ + LambdaQueryWrapper recordQueryWrapper = new QueryWrapper() + .lambda() + .select(SRaActionReportsAuditRecord::getId,SRaActionReportsAuditRecord::getReportId) + .in(SRaActionReportsAuditRecord::getReportId, reportIds); + List sRaActionReportsAuditRecords = recordMapper.selectList(recordQueryWrapper); + if (CollectionUtil.isEmpty(sRaActionReportsAuditRecords)){ + log.warn("执行报告审核记录不存在!"); + return null; + } + List recordIds = sRaActionReportsAuditRecords.stream().map(SRaActionReportsAuditRecord::getId).collect(Collectors.toList()); + Map recordReportIdMap = sRaActionReportsAuditRecords.stream().collect(Collectors.toMap(SRaActionReportsAuditRecord::getId, SRaActionReportsAuditRecord::getReportId)); + LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda().in(SRaActionReportsAuditResult::getRecordId, recordIds); + List sRaActionReportsAuditResults = auditResultMapper.selectList(queryWrapper); + if (CollectionUtil.isEmpty(sRaActionReportsAuditResults)){ + log.warn("执行报告规范性审核结果记录不存在!"); + return null; + } + return sRaActionReportsAuditResults.stream().collect(Collectors.toMap(data -> recordReportIdMap.get(data.getRecordId()), Function.identity())); + } + + public String buildKey(String outletCode, String pollutantType){ + return outletCode + "-" + pollutantType; + } + + public String getOutletCodeByKey(String key){ + if (StringUtils.isBlank(key)){ + return null; + } + return key.split("-")[0]; + } + + public String getPollutantTypeByKey(String key){ + if (StringUtils.isBlank(key)){ + return null; + } + return key.split("-")[1]; + } + + public int getCount(String monitoringManualFrequency, String reportsType){ + if (EmlTypeEnums.YEAR.getCode().equals(reportsType)){ + return getYearCount(monitoringManualFrequency); + }else if (EmlTypeEnums.QUARTER.getCode().equals(reportsType)){ + //直接拿年的所有频次去除季度 + int yearCount = getYearCount(monitoringManualFrequency); + //小于12 代表 获取到的是 季度以上的单位 + if (yearCount < 4){ + return 0; + } + return yearCount / 4; + }else if (EmlTypeEnums.MONTH.getCode().equals(reportsType)){ + //直接拿年的所有频次去除月 + int yearCount = getYearCount(monitoringManualFrequency); + //小于12 代表 获取到的是月度以上的单位 + if (yearCount < 12){ + return 0; + } + return yearCount/12; + } + return 0; + } + + public int getYearCount(String monitoringManualFrequency){ + //返回各种频次对应的 一整年需要多少次 此处周按照一年52周 每月5个星期算 + if (monitoringManualFrequency.contains("周")){ + //直接返回52周 + return 52; + } + if (monitoringManualFrequency.contains("月")){ + //每年有12个月 + return 12; + } + if (monitoringManualFrequency.contains("季")){ + //每年有4个季度 + return 4; + } + if (monitoringManualFrequency.contains("半年")){ + //每年有两个半年 + return 2; + } + if (monitoringManualFrequency.contains("年")){ + //每年一次 + return 1; + } + return 0; } }