From 49c474fe2e8b42029017619211527ae020dac2fb Mon Sep 17 00:00:00 2001 From: buaixuexideshitongxue <2936013465@qq.com> Date: Thu, 19 Mar 2026 14:40:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E7=9B=91=E7=9D=A3=E5=A4=A7?= =?UTF-8?q?=E5=B1=8F--=E6=9C=AA=E7=A1=AE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datav/DataVAuditController.java | 19 +- .../mapper/ReportProjectMapper.java | 5 +- .../pojo/request/datav/DataVRequest.java | 3 + .../service/datav/DatavService.java | 7 + .../service/datav/DatavServiceImpl.java | 189 +++++++++++++++++- 5 files changed, 198 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/biutag/supervision/controller/datav/DataVAuditController.java b/src/main/java/com/biutag/supervision/controller/datav/DataVAuditController.java index b0f0b90..ffd1945 100644 --- a/src/main/java/com/biutag/supervision/controller/datav/DataVAuditController.java +++ b/src/main/java/com/biutag/supervision/controller/datav/DataVAuditController.java @@ -50,25 +50,14 @@ public class DataVAuditController { private final NegativeMapper negativeMapper; - private final NegativeBlameService negativeBlameService; - - @Resource - private ReportProjectMapper reportProjectMapper; - - @Resource - private DatavService datavService; + private final DatavService datavService; @Operation(summary = "审计整改结果") - @GetMapping("/getAuditNegativeVo") - public Result getAuditNegativeVo(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date beginTime, @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime){ - List fxData = negativeMapper.getAuditNegativeVo(beginTime,endTime,"3"); - List jsData = negativeMapper.getAuditNegativeVo(beginTime,endTime,"4"); - JSONObject object=new JSONObject(); - object.fluentPut("fxData",fxData); - object.fluentPut("jsData",jsData); - return Result.success(object); + @PostMapping("/getAuditNegativeVo") + public Result getAuditNegativeVo(@RequestBody DataVRequest request){ + return datavService.getAuditNegativeVo(request); } diff --git a/src/main/java/com/biutag/supervision/mapper/ReportProjectMapper.java b/src/main/java/com/biutag/supervision/mapper/ReportProjectMapper.java index c3a0fa0..904e171 100644 --- a/src/main/java/com/biutag/supervision/mapper/ReportProjectMapper.java +++ b/src/main/java/com/biutag/supervision/mapper/ReportProjectMapper.java @@ -23,9 +23,8 @@ public interface ReportProjectMapper extends BaseMapper { " UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 " + ") months " + "LEFT JOIN report_project rp " + - " ON MONTH(rp.archiving) = months.month " + - " AND YEAR(rp.archiving) = #{year} " + - " AND rp.node = 'end' " + + " ON MONTH(rp.publication_date) = months.month " + + " AND YEAR(rp.publication_date) = #{year} " + " AND rp.delete_flag = 0 " + "GROUP BY months.month " + "ORDER BY months.month") diff --git a/src/main/java/com/biutag/supervision/pojo/request/datav/DataVRequest.java b/src/main/java/com/biutag/supervision/pojo/request/datav/DataVRequest.java index 1f0555d..2f518b1 100644 --- a/src/main/java/com/biutag/supervision/pojo/request/datav/DataVRequest.java +++ b/src/main/java/com/biutag/supervision/pojo/request/datav/DataVRequest.java @@ -30,6 +30,9 @@ public class DataVRequest implements ParamChecked { @Schema(description = "专项督察类型") private String specialSupervision; + @Schema(description = "审计类型") + private String auditType; + @Override public void check() { diff --git a/src/main/java/com/biutag/supervision/service/datav/DatavService.java b/src/main/java/com/biutag/supervision/service/datav/DatavService.java index c75276d..b46558a 100644 --- a/src/main/java/com/biutag/supervision/service/datav/DatavService.java +++ b/src/main/java/com/biutag/supervision/service/datav/DatavService.java @@ -327,4 +327,11 @@ public interface DatavService { * @return */ Result getSubOneCaseSourceRateAndDealSituation(SubDataVRequest request); + + /** + * 审计监督一级大屏 整改结果 + * @param request + * @return + */ + Result getAuditNegativeVo(DataVRequest request); } diff --git a/src/main/java/com/biutag/supervision/service/datav/DatavServiceImpl.java b/src/main/java/com/biutag/supervision/service/datav/DatavServiceImpl.java index 1820644..8fc7475 100644 --- a/src/main/java/com/biutag/supervision/service/datav/DatavServiceImpl.java +++ b/src/main/java/com/biutag/supervision/service/datav/DatavServiceImpl.java @@ -1,5 +1,6 @@ package com.biutag.supervision.service.datav; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -35,12 +36,15 @@ import com.biutag.supervision.repository.supdepart.SupDepartResourceService; import com.biutag.supervision.service.*; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import net.logstash.logback.encoder.org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -127,6 +131,10 @@ public class DatavServiceImpl implements DatavService { @Resource private DataCaseVerifMapper dataCaseVerifMapper; + private static final String NO_BLAME = "不予追责"; + + private static final BigDecimal WAN = new BigDecimal("10000"); + private final String VALID_SIGN = "terminated"; private final String EX_SOURCE = "局长信箱"; @@ -557,11 +565,7 @@ public class DatavServiceImpl implements DatavService { Date endTime = request.getEndTime(); List negatives = negativeService.list(new LambdaQueryWrapper().between(Negative::getCrtTime, beginTime, DateUtil.endOfDay(endTime)) .in(Negative::getProblemSourcesCode, List.of(ProblemSourcesEnum.ZFTZSJ.getValue(), ProblemSourcesEnum.ZFSACFSS.getValue(), ProblemSourcesEnum.JJZRSJ.getValue(), ProblemSourcesEnum.ZXSJ.getValue()))); - long accountableNumber = 0; - if (CollectionUtil.isNotEmpty(negatives)) { - accountableNumber = negativeBlameService.count(new LambdaQueryWrapper().in(NegativeBlame::getNegativeId, negatives.stream().map(Negative::getId).collect(Collectors.toSet())) - .ne(NegativeBlame::getHandleResultName, "不予追责")); - } + BlameResult blameResult = buildBlameResult(negatives); // 政府投资数据 ReportProjectQueryParam reportProjectQueryParam = new ReportProjectQueryParam(); reportProjectQueryParam.setArchivingStart(beginTime); @@ -595,7 +599,7 @@ public class DatavServiceImpl implements DatavService { overview.setAuditSjAmount(zftzsjje); overview.setAuditWtAmount(fxwtje); overview.setNegativeNumber(negatives.size()); - overview.setAccountableNumber(accountableNumber); + overview.setAccountableNumber((long) (blameResult.personalBlames().size() + blameResult.leadBlames().size())); return Result.success(overview); } @@ -2072,7 +2076,7 @@ public class DatavServiceImpl implements DatavService { List dealSituationPieList = new ArrayList<>(); // 总 - List proCode = List.of(A12389.getValue(),SLDJB.getValue(), ZDDJB.getValue(), SJJB.getValue()); + List proCode = List.of(A12389.getValue(), SLDJB.getValue(), ZDDJB.getValue(), SJJB.getValue()); // 交办 Set ldjbCode = Set.of(SLDJB.getValue(), ZDDJB.getValue(), SJJB.getValue()); // 案件核查 || 12389 @@ -2121,6 +2125,65 @@ public class DatavServiceImpl implements DatavService { return Result.success(data); } + + @Override + public Result getAuditNegativeVo(DataVRequest request) { + // 排名 + SupDepartQueryParam supDepartQueryParam = new SupDepartQueryParam(); + supDepartQueryParam.setStatisticsGroupId(DepartGroupEnum.COUNTY_CITY_BUREAUS.getId()); + List fxsjDw = supDepartResourceService.query(supDepartQueryParam); + SupDepartQueryParam jsdwQueryParam = new SupDepartQueryParam(); + jsdwQueryParam.setStatisticsGroupId(DepartGroupEnum.BUREAU_AFFILIATED.getId()); + List jsdwDw = supDepartResourceService.query(jsdwQueryParam); + List fxData = buildAuditNegativeVoList(fxsjDw, request); + List jsData = buildAuditNegativeVoList(jsdwDw, request); + // 总览 + AuditOverview auditOverview = new AuditOverview(); + if (ZFTZSJ.getValue().equals(request.getAuditType())) { + ReportProjectQueryParam reportProjectQueryParam = new ReportProjectQueryParam(); + reportProjectQueryParam.setPublicationDateStart(request.getBeginTime()); + reportProjectQueryParam.setPublicationDateEnd(request.getEndTime()); + List reportProjects = reportProjectResourceService.query(reportProjectQueryParam); + NegativeQueryParam negativeQueryParam = new NegativeQueryParam(); + negativeQueryParam.setCrtTime(List.of(request.getBeginTime(), request.getEndTime())); + negativeQueryParam.setProblemSourcesCode(List.of(ZFTZSJ.getValue())); + List negativeListData = negativeResourceService.query(negativeQueryParam); + BlameResult blameResult = this.buildBlameResult(negativeListData); + BigDecimal zftzje = this.sumAmountInWan(reportProjects, ReportProject::getReportMoney); + BigDecimal zftzsjje = this.sumAmountInWan(reportProjects, ReportProject::getArchivingReduceMoney); + + auditOverview.setProjectNumber(BigDecimal.valueOf(reportProjects.size())); + auditOverview.setAuditAmount(zftzje); + auditOverview.setAuditSjAmount(zftzsjje); + auditOverview.setNegativeNumber(negativeListData.size()); + auditOverview.setAccountableNumber((long) (blameResult.personalBlames().size() + blameResult.leadBlames().size())); + } else { + DataAuditQueryParam dataAuditQueryParam = new DataAuditQueryParam(); + dataAuditQueryParam.setAuditTimeStart(toLocalDateTime(request.getBeginTime())); + dataAuditQueryParam.setAuditTimeEnd(toLocalDateTime(request.getEndTime())); + dataAuditQueryParam.setAuditType(request.getAuditType()); + List dataAuditList = dataAuditResourceService.query(dataAuditQueryParam); + NegativeQueryParam negativeQueryParam = new NegativeQueryParam(); + negativeQueryParam.setCrtTime(List.of(request.getBeginTime(), request.getEndTime())); + negativeQueryParam.setProblemSourcesCode(List.of(request.getAuditType())); + List negativeListData = negativeResourceService.query(negativeQueryParam); + BlameResult blameResult = this.buildBlameResult(negativeListData); + BigDecimal je = this.sumAmount(dataAuditList, DataAudit::getAuditAmount, new BigDecimal(1)); + BigDecimal zsjje = this.sumAmount(dataAuditList, DataAudit::getIssueAmount, new BigDecimal(1)); + auditOverview.setProjectNumber(BigDecimal.valueOf(dataAuditList.size())); + auditOverview.setAuditAmount(je); + auditOverview.setAuditSjAmount(zsjje); + auditOverview.setNegativeNumber(negativeListData.size()); + auditOverview.setAccountableNumber((long) (blameResult.personalBlames().size() + blameResult.leadBlames().size())); + + } + JSONObject object = new JSONObject(); + object.fluentPut("fxData", fxData); + object.fluentPut("jsData", jsData); + object.fluentPut("leftOverview", auditOverview); + return Result.success(object); + } + private List filterZero(List list) { return list.stream() .filter(e -> e.getValue() != null && e.getValue() > 0) @@ -2128,6 +2191,118 @@ public class DatavServiceImpl implements DatavService { } + public record BlameResult( + List personalBlames, + List leadBlames + ) { + } + + public BlameResult buildBlameResult(List negativeListData) { + if (CollUtil.isEmpty(negativeListData)) { + return new BlameResult(List.of(), List.of()); + } + // 1. 筛选有效 negative + List validNegatives = negativeListData.stream() + .filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) + || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) + .toList(); + if (CollUtil.isEmpty(validNegatives)) { + return new BlameResult(List.of(), List.of()); + } + // 2. 查询问责数据 + NegativeBlameQueryParam param = new NegativeBlameQueryParam(); + param.setNegativeIds(validNegatives.stream() + .map(Negative::getId) + .toList()); + List negativeBlames = negativeBlameResourceService.query(param); + if (CollUtil.isEmpty(negativeBlames)) { + return new BlameResult(List.of(), List.of()); + } + // 3. 个人问责 + List personalBlames = negativeBlames.stream() + .filter(one -> BlameType.personal.name().equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) + .filter(one -> !NO_BLAME.equals(one.getHandleResultName())) + .toList(); + // 4. 领导问责(去重) + Set seenLead = new HashSet<>(); + List leadBlames = negativeBlames.stream() + .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) + .filter(one -> !NO_BLAME.equals(one.getLeadHandleResultName())) + .filter(one -> seenLead.add( + one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName() + )) + .toList(); + return new BlameResult(personalBlames, leadBlames); + } + + private LocalDateTime toLocalDateTime(Date date) { + if (date == null) { + return null; + } + return date.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + } + + private long calculateRate(long numerator, long denominator) { + if (denominator == 0) { + return 0L; + } + return (numerator * 100 + denominator / 2) / denominator; + } + + private List buildAuditNegativeVoList(List departs, DataVRequest request) { + List result = new ArrayList<>(); + for (SupDepart depart : departs) { + List negativeListData = negativeMapper.getNegativeListData( + depart.getId(), + request.getBeginTime(), + request.getEndTime(), + List.of(request.getAuditType()) + ); + + long numerator = negativeListData.stream() + .filter(one -> "1".equals(one.getIsRectifyCode())) + .count(); + long denominator = negativeListData.size(); + AuditNegativeVo vo = new AuditNegativeVo(); + vo.setLabel(depart.getShortName()); + vo.setNumerator(numerator); + vo.setDenominator(denominator); + vo.setValue(calculateRate(numerator, denominator)); + result.add(vo); + } + return result.stream() + // 过滤没有问题数据的 + .filter(vo -> vo.getDenominator() > 0) + // 按整改率降序 + .sorted(Comparator.comparing(AuditNegativeVo::getValue).reversed()) + .toList(); + } + + + private BigDecimal sumAmount(List list, Function mapper, BigDecimal divisor) { + BigDecimal sum = list.stream() + .map(mapper) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + if (divisor == null || BigDecimal.ONE.compareTo(divisor) == 0) { + return sum; + } + + return sum.divide(divisor, 2, RoundingMode.HALF_UP); + } + + private BigDecimal sumAmountInWan(List list, Function mapper) { + return list.stream() + .map(mapper) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add) + .divide(WAN, 2, RoundingMode.HALF_UP); + } + public Result getSubOneMailMapIcon() { // ✅ 注意:这里的 name 必须和地图 geojson 区域名一致(一般是“xx街道/园区”)