From 10074d37a273fc0c1f94b04c827bff4668c57887 Mon Sep 17 00:00:00 2001 From: buaixuexideshitongxue <2936013465@qq.com> Date: Tue, 24 Mar 2026 15:42:32 +0800 Subject: [PATCH] =?UTF-8?q?fix--=E9=97=AE=E8=B4=A3=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/datav/DatavServiceImpl.java | 623 ++++-------------- .../service/subDatav/SubDatavServiceImpl.java | 134 +++- 2 files changed, 218 insertions(+), 539 deletions(-) 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 5d6a2c2..8c64d8e 100644 --- a/src/main/java/com/biutag/supervision/service/datav/DatavServiceImpl.java +++ b/src/main/java/com/biutag/supervision/service/datav/DatavServiceImpl.java @@ -435,39 +435,15 @@ public class DatavServiceImpl implements DatavService { List negatives = negativeResourceService.query(negativeQueryParam); List ssList = negatives.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).toList(); List completedList = negatives.stream().filter(item -> ProcessingStatusEnum.completed.name().equals(item.getProcessingStatus())).toList(); - NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); - negativeBlameQueryParam.setNegativeIds(ssList.stream().map(Negative::getId).toList()); - List negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); - - // 3. 个人问责 - List personalBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); - // 4. 领导问责(按 negativeId + 领导姓名 + 领导处理结果 去重) - Set seenLead = new HashSet<>(); - List leadBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) - .filter(one -> !"不予追责".equals(one.getLeadHandleResultName())) - .filter(one -> seenLead.add( - one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName() - )) - .toList(); - // 5. 单位问责 - List unitBlames = negativeBlames.stream() - .filter(one -> BlameType.department.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); VideoSuperviseCountVo overview = new VideoSuperviseCountVo(); overview.setTotal(negatives.size()); overview.setCompletionProblem((long) completedList.size()); overview.setDiscoverProblem((long) ssList.size()); - overview.setRelativeOrg((long) unitBlames.size()); - overview.setRelativePer((long) (personalBlames.size() + leadBlames.size())); + overview.setRelativeOrg(accountabilityCountResult.unitCount()); + overview.setRelativePer(accountabilityCountResult.personTotalCount()); JSONObject data = new JSONObject().fluentPut("overview", overview); return Result.success(data); } @@ -487,41 +463,15 @@ public class DatavServiceImpl implements DatavService { List ssList = negatives.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).toList(); List completedList = negatives.stream().filter(item -> ProcessingStatusEnum.completed.name().equals(item.getProcessingStatus())).toList(); - NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); - negativeBlameQueryParam.setNegativeIds(ssList.stream().map(Negative::getId).toList()); - List negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); - - // 3. 个人问责 - List personalBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); - // 4. 领导问责(按 negativeId + 领导姓名 + 领导处理结果 去重) - Set seenLead = new HashSet<>(); - List leadBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) - .filter(one -> !"不予追责".equals(one.getLeadHandleResultName())) - .filter(one -> seenLead.add( - one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName() - )) - .toList(); - // 5. 单位问责 - List unitBlames = negativeBlames.stream() - .filter(one -> BlameType.department.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); - - + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); VideoSuperviseMapIconVo videoSuperviseMapIconVo = new VideoSuperviseMapIconVo(); videoSuperviseMapIconVo.setName(fxsj.getShortName()); videoSuperviseMapIconVo.setDepartId(fxsj.getId()); videoSuperviseMapIconVo.setDiscoverProblem(ssList.size()); videoSuperviseMapIconVo.setCompletionProblem(completedList.size()); - videoSuperviseMapIconVo.setRelativeOrg(unitBlames.size()); - videoSuperviseMapIconVo.setRelativePer(personalBlames.size() + leadBlames.size()); + videoSuperviseMapIconVo.setRelativeOrg(Math.toIntExact(accountabilityCountResult.unitCount())); + videoSuperviseMapIconVo.setRelativePer(Math.toIntExact(accountabilityCountResult.personTotalCount())); videoSuperviseMapIconVoList.add(videoSuperviseMapIconVo); } videoSuperviseMapIconVoList.forEach(VideoSuperviseMapIconVo::initDefaultIfNull); @@ -662,34 +612,8 @@ public class DatavServiceImpl implements DatavService { superviseReportLambdaQueryWrapper.between(SuperviseReport::getCrtTime, request.getBeginTime(), request.getEndTime()); superviseReportLambdaQueryWrapper.eq(SuperviseReport::getType, "1"); List superviseReportList = superviseReportService.list(superviseReportLambdaQueryWrapper); - List negativeIds = negatives.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).map(Negative::getId).toList(); - - NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); - negativeBlameQueryParam.setNegativeIds(negativeIds); - List negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); - - // 3. 个人问责 - List personalBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); - // 4. 领导问责(按 negativeId + 领导姓名 + 领导处理结果 去重) - Set seenLead = new HashSet<>(); - List leadBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) - .filter(one -> !"不予追责".equals(one.getLeadHandleResultName())) - .filter(one -> seenLead.add( - one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName() - )) - .toList(); - // 5. 单位问责 - List unitBlames = negativeBlames.stream() - .filter(one -> BlameType.department.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); // 通报问题数 overView.setProblemNumber(negatives.size()); @@ -700,8 +624,8 @@ public class DatavServiceImpl implements DatavService { // 已办结 overView.setCompletedNumber((long) completedList.size()); // 问责单位数 - overView.setDepartNumber((long) unitBlames.size()); - overView.setPersonNumber((long) (personalBlames.size() + leadBlames.size())); + overView.setDepartNumber(accountabilityCountResult.unitCount()); + overView.setPersonNumber(accountabilityCountResult.personTotalCount()); return Result.success(overView); } @@ -735,14 +659,15 @@ public class DatavServiceImpl implements DatavService { .orElse(Collections.emptySet()); superviseReportLambdaQueryWrapper.in(CollectionUtil.isNotEmpty(allDepartIds), SuperviseReport::getCrtDepartId, allDepartIds); List superviseReportList = superviseReportService.list(superviseReportLambdaQueryWrapper); - BlameResult blameResult = this.buildBlameResult(negatives); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); superviseMapIconVo.setDepartId(fxsj.getId()); superviseMapIconVo.setName(fxsj.getShortName()); superviseMapIconVo.setTotalPro(negatives.size()); superviseMapIconVo.setProcessingNumber(processingList.size()); superviseMapIconVo.setCompletedNumber(completedList.size()); - superviseMapIconVo.setRelationOrg(String.valueOf(blameResult.unitBlames().size())); - superviseMapIconVo.setPersonNum(String.valueOf(blameResult.personalBlames().size() + blameResult.leadBlames().size())); + superviseMapIconVo.setRelationOrg(String.valueOf(accountabilityCountResult.unitCount())); + superviseMapIconVo.setPersonNum(String.valueOf(accountabilityCountResult.personTotalCount())); superviseMapIconVo.setReportNumber(String.valueOf(superviseReportList.size())); superviseTempMapVoList.add(superviseMapIconVo); } @@ -900,30 +825,8 @@ public class DatavServiceImpl implements DatavService { List ssNegative = negatives.stream() .filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).toList(); - NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); - negativeBlameQueryParam.setNegativeIds(ssNegative.stream().map(Negative::getId).toList()); - List negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); - // 3. 个人问责 - List personalBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); - // 4. 领导问责(按 negativeId + 领导姓名 + 领导处理结果 去重) - Set seenLead = new HashSet<>(); - List leadBlames = negativeBlames.stream() - .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) - .filter(one -> !"不予追责".equals(one.getLeadHandleResultName())) - .filter(one -> seenLead.add( - one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName() - )) - .toList(); - // 5. 单位问责 - List unitBlames = negativeBlames.stream() - .filter(one -> BlameType.department.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); //计算查实率(向上取整) Double verificationRate = 0.0; if (!dataCaseVerifs.isEmpty() || !jbNegatvieList.isEmpty()) { @@ -933,8 +836,8 @@ public class DatavServiceImpl implements DatavService { overview.setTotal(dataCaseVerifs.size() + jbNegatvieList.size()); overview.setConfirmed(ssNegative.size()); overview.setDealCasePro((long) negatives.size()); - overview.setPunishPre((long) (personalBlames.size() + leadBlames.size())); - overview.setPunishOrg((long) unitBlames.size()); + overview.setPunishPre(accountabilityCountResult.personTotalCount()); + overview.setPunishOrg(accountabilityCountResult.unitCount()); overview.setRate(verificationRate); JSONObject res = new JSONObject().fluentPut("overview", overview); return Result.success(res); @@ -962,31 +865,8 @@ public class DatavServiceImpl implements DatavService { List ssNegative = negatives.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).toList(); // 交办案件数 List jbNegatvieList = negatives.stream().filter(one -> ldjbCode.contains(one.getProblemSourcesCode())).toList(); - NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); - negativeBlameQueryParam.setNegativeIds(ssNegative.stream().map(Negative::getId).toList()); - List negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); - - // 3. 个人问责 - List personalBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); - // 4. 领导问责(按 negativeId + 领导姓名 + 领导处理结果 去重) - Set seenLead = new HashSet<>(); - List leadBlames = negativeBlames.stream() - .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) - .filter(one -> !"不予追责".equals(one.getLeadHandleResultName())) - .filter(one -> seenLead.add( - one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName() - )) - .toList(); - // 5. 单位问责 - List unitBlames = negativeBlames.stream() - .filter(one -> BlameType.department.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); Double verificationRate = 0.0; if (!dataCaseVerifs.isEmpty() || !jbNegatvieList.isEmpty()) { @@ -999,8 +879,8 @@ public class DatavServiceImpl implements DatavService { caseVerificationMapVo.setTotal(dataCaseVerifs.size() + jbNegatvieList.size()); caseVerificationMapVo.setConfirmed(ssNegative.size()); caseVerificationMapVo.setDealCasePro(negatives.size()); - caseVerificationMapVo.setPunishPre(personalBlames.size() + leadBlames.size()); - caseVerificationMapVo.setPunishOrg(unitBlames.size()); + caseVerificationMapVo.setPunishPre(Math.toIntExact(accountabilityCountResult.personTotalCount())); + caseVerificationMapVo.setPunishOrg(Math.toIntExact(accountabilityCountResult.unitCount())); caseVerificationMapVo.setRate(verificationRate); caseVerificationMapList.add(caseVerificationMapVo); } @@ -1238,7 +1118,8 @@ public class DatavServiceImpl implements DatavService { negativeQueryParam.setCrtTime(List.of(request.getBeginTime(), request.getEndTime())); negativeQueryParam.setProblemSourcesCode(List.of(ZFTZSJ.getValue())); List negativeListData = negativeResourceService.query(negativeQueryParam); - BlameResult blameResult = this.buildBlameResult(negativeListData); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negativeListData); BigDecimal zftzje = this.sumAmountInWan(reportProjects, ReportProject::getReportMoney); BigDecimal zftzsjje = this.sumAmountInWan(reportProjects, ReportProject::getArchivingReduceMoney); @@ -1246,12 +1127,7 @@ public class DatavServiceImpl implements DatavService { auditOverview.setAuditAmount(zftzje); auditOverview.setAuditSjAmount(zftzsjje); auditOverview.setNegativeNumber(negativeListData.size()); - long accountableNumber = 0L; - if (blameResult != null) { - accountableNumber += blameResult.personalBlames() == null ? 0 : blameResult.personalBlames().size(); - accountableNumber += blameResult.leadBlames() == null ? 0 : blameResult.leadBlames().size(); - } - auditOverview.setAccountableNumber(accountableNumber); + auditOverview.setAccountableNumber(accountabilityCountResult.personTotalCount()); } else { DataAuditQueryParam dataAuditQueryParam = new DataAuditQueryParam(); dataAuditQueryParam.setAuditTimeStart(toLocalDateTime(request.getBeginTime())); @@ -1262,19 +1138,15 @@ public class DatavServiceImpl implements DatavService { negativeQueryParam.setCrtTime(List.of(request.getBeginTime(), request.getEndTime())); negativeQueryParam.setProblemSourcesCode(List.of(request.getAuditType())); List negativeListData = negativeResourceService.query(negativeQueryParam); - BlameResult blameResult = this.buildBlameResult(negativeListData); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(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()); - long accountableNumber = 0L; - if (blameResult != null) { - accountableNumber += blameResult.personalBlames() == null ? 0 : blameResult.personalBlames().size(); - accountableNumber += blameResult.leadBlames() == null ? 0 : blameResult.leadBlames().size(); - } - auditOverview.setAccountableNumber(accountableNumber); + auditOverview.setAccountableNumber(accountabilityCountResult.personTotalCount()); } JSONObject object = new JSONObject(); object.fluentPut("fxData", fxData); @@ -1329,7 +1201,8 @@ public class DatavServiceImpl implements DatavService { negativeQueryParam.setCrtTime(List.of(request.getBeginTime(), request.getEndTime())); negativeQueryParam.setProblemSourcesCode(GROUP_27_28_29_30); List negativeListData = negativeResourceService.query(negativeQueryParam); - BlameResult blameResult = this.buildBlameResult(negativeListData); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negativeListData); // 政府投资总金额 BigDecimal zftzje = this.sumAmountInWan(reportProjects, ReportProject::getReportMoney); // 政府投资审减金额 @@ -1342,12 +1215,7 @@ public class DatavServiceImpl implements DatavService { overview.setAuditAmount(zftzje.add(qtsjje)); overview.setAuditSjAmount(zftzsjje.add(qtsjwtje)); overview.setNegativeNumber(negativeListData.size()); - long accountableNumber = 0L; - if (blameResult != null) { - accountableNumber += blameResult.personalBlames() == null ? 0 : blameResult.personalBlames().size(); - accountableNumber += blameResult.leadBlames() == null ? 0 : blameResult.leadBlames().size(); - } - overview.setAccountableNumber(accountableNumber); + overview.setAccountableNumber(accountabilityCountResult.personTotalCount()); return Result.success(overview); } @@ -1384,7 +1252,8 @@ public class DatavServiceImpl implements DatavService { List negativeListData = negativeMapper.getNegativeListData(key, request.getBeginTime(), request.getEndTime(), GROUP_27_28_29_30); - BlameResult blameResult = this.buildBlameResult(negativeListData); + // 使用统一的问责次数统计口径,便于核对大屏与导出逻辑差异 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negativeListData); // 政府投资总金额 BigDecimal zftzje = this.sumAmountInWan(reportProjects, ReportProject::getReportMoney); // 政府投资审减金额 @@ -1398,12 +1267,7 @@ public class DatavServiceImpl implements DatavService { auditSuperviseMapIconVo.setAuditAmount(zftzje.add(qtsjje)); auditSuperviseMapIconVo.setAuditSjAmount(zftzsjje.add(qtsjwtje)); auditSuperviseMapIconVo.setNegativeNumber(negativeListData.size()); - int accountableNumber = 0; - if (blameResult != null) { - accountableNumber += blameResult.personalBlames() == null ? 0 : blameResult.personalBlames().size(); - accountableNumber += blameResult.leadBlames() == null ? 0 : blameResult.leadBlames().size(); - } - auditSuperviseMapIconVo.setAccountableNumber(accountableNumber); + auditSuperviseMapIconVo.setAccountableNumber(Math.toIntExact(accountabilityCountResult.personTotalCount())); auditSuperviseMapIconVoList.add(auditSuperviseMapIconVo); } JSONObject data = new JSONObject().fluentPut("auditSuperviseMapIconVoList", auditSuperviseMapIconVoList); @@ -1531,6 +1395,88 @@ public class DatavServiceImpl implements DatavService { } + + private static final Set NO_ACCOUNTABILITY_SET = Set.of("不予问责", "不予追责"); + + private record AccountabilityCountResult( + long personalCount, + long leaderCount, + long personTotalCount, + long unitCount + ) {} + + private AccountabilityCountResult buildAccountabilityCountResult(List negatives) { + if (CollectionUtil.isEmpty(negatives)) { + return new AccountabilityCountResult(0L, 0L, 0L, 0L); + } + + List effectiveNegativeIds = negatives.stream() + .filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) + || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) + .map(Negative::getId) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + + if (CollectionUtil.isEmpty(effectiveNegativeIds)) { + return new AccountabilityCountResult(0L, 0L, 0L, 0L); + } + + NegativeBlameQueryParam param = new NegativeBlameQueryParam(); + param.setNegativeIds(effectiveNegativeIds); + List negativeBlames = negativeBlameResourceService.query(param); + + if (CollectionUtil.isEmpty(negativeBlames)) { + return new AccountabilityCountResult(0L, 0L, 0L, 0L); + } + + long personalCount = negativeBlames.stream() + .filter(one -> BlameType.personal.name().equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getBlameName())) + .flatMap(one -> splitValidAccountabilityResults(one.getHandleResultName()).stream() + .map(resultName -> one.getNegativeId() + "_" + one.getBlameName() + "_" + resultName)) + .distinct() + .count(); + + long leaderCount = negativeBlames.stream() + .filter(one -> BlameType.personal.name().equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getLeadName())) + .flatMap(one -> splitValidAccountabilityResults(one.getLeadHandleResultName()).stream() + .map(resultName -> one.getNegativeId() + "_" + one.getLeadName() + "_" + resultName)) + .distinct() + .count(); + + long unitCount = negativeBlames.stream() + .filter(one -> BlameType.department.name().equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getBlameName())) + .flatMap(one -> splitValidAccountabilityResults(one.getHandleResultName()).stream() + .map(resultName -> one.getNegativeId() + "_" + one.getBlameName() + "_" + resultName)) + .distinct() + .count(); + + return new AccountabilityCountResult( + personalCount, + leaderCount, + personalCount + leaderCount, + unitCount + ); + } + + private List splitValidAccountabilityResults(String raw) { + if (StrUtil.isBlank(raw)) { + return List.of(); + } + + return Arrays.stream(raw.split("[、,,]")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .filter(item -> !NO_ACCOUNTABILITY_SET.contains(item)) + .distinct() + .toList(); + } + + + public record BlameResult( List personalBlames, List leadBlames, @@ -1667,337 +1613,4 @@ public class DatavServiceImpl implements DatavService { // endregion - public Result getSubOneMailMapIcon() { - - // ✅ 注意:这里的 name 必须和地图 geojson 区域名一致(一般是“xx街道/园区”) - // departId 仍然放派出所 dept_id,用于你点击打开弹窗时传参 - List list = new ArrayList<>(); - - // 东屯渡街道 -> 东屯渡派出所(2990) - MailMapIconVo a = new MailMapIconVo(); - a.setName("东屯渡街道"); - a.setDepartId("2990"); - a.setCountryTotal("32"); - a.setPoliceTotal("18"); - a.setCommissionerTotal("6"); - a.setNumTotal("9"); - a.setTotal(String.valueOf(32 + 18 + 9)); // total 不含 commissionerTotal - list.add(a); - - // 定王台街道 -> 定王台派出所(1245) - MailMapIconVo b = new MailMapIconVo(); - b.setName("定王台街道"); - b.setDepartId("1245"); - b.setCountryTotal("21"); - b.setPoliceTotal("10"); - b.setCommissionerTotal("4"); - b.setNumTotal("7"); - b.setTotal(String.valueOf(21 + 10 + 7)); - list.add(b); - - // 火星街道 -> 火星派出所(2985) - MailMapIconVo c = new MailMapIconVo(); - c.setName("火星街道"); - c.setDepartId("2985"); - c.setCountryTotal("45"); - c.setPoliceTotal("24"); - c.setCommissionerTotal("9"); - c.setNumTotal("14"); - c.setTotal(String.valueOf(45 + 24 + 14)); - list.add(c); - - // 五里牌街道 -> 五里牌派出所(2971) - MailMapIconVo d = new MailMapIconVo(); - d.setName("五里牌街道"); - d.setDepartId("2971"); - d.setCountryTotal("16"); - d.setPoliceTotal("9"); - d.setCommissionerTotal("3"); - d.setNumTotal("5"); - d.setTotal(String.valueOf(16 + 9 + 5)); - list.add(d); - - // 荷花园街道 -> 荷花园派出所(1247) - MailMapIconVo e = new MailMapIconVo(); - e.setName("荷花园街道"); - e.setDepartId("1247"); - e.setCountryTotal("38"); - e.setPoliceTotal("20"); - e.setCommissionerTotal("7"); - e.setNumTotal("11"); - e.setTotal(String.valueOf(38 + 20 + 11)); - list.add(e); - - // 文艺路街道 -> 文艺路派出所(2946) - MailMapIconVo f = new MailMapIconVo(); - f.setName("文艺路街道"); - f.setDepartId("2946"); - f.setCountryTotal("12"); - f.setPoliceTotal("6"); - f.setCommissionerTotal("2"); - f.setNumTotal("3"); - f.setTotal(String.valueOf(12 + 6 + 3)); - list.add(f); - - // 朝阳街街道 -> 朝阳街派出所(2960) (你表里就是“朝阳街街道”) - MailMapIconVo g = new MailMapIconVo(); - g.setName("朝阳街街道"); - g.setDepartId("2960"); - g.setCountryTotal("27"); - g.setPoliceTotal("13"); - g.setCommissionerTotal("5"); - g.setNumTotal("8"); - g.setTotal(String.valueOf(27 + 13 + 8)); - list.add(g); - - // 韭菜园街道 -> 韭菜园派出所(2940) - MailMapIconVo h = new MailMapIconVo(); - h.setName("韭菜园街道"); - h.setDepartId("2940"); - h.setCountryTotal("19"); - h.setPoliceTotal("7"); - h.setCommissionerTotal("3"); - h.setNumTotal("6"); - h.setTotal(String.valueOf(19 + 7 + 6)); - list.add(h); - - // 隆平高科技园 -> (dept_id=2898) - MailMapIconVo i = new MailMapIconVo(); - i.setName("隆平高科技园"); - i.setDepartId("2898"); - i.setCountryTotal("8"); - i.setPoliceTotal("4"); - i.setCommissionerTotal("1"); - i.setNumTotal("2"); - i.setTotal(String.valueOf(8 + 4 + 2)); - list.add(i); - - // 马王堆街道 -> 马王堆派出所(3003) - MailMapIconVo j = new MailMapIconVo(); - j.setName("马王堆街道"); - j.setDepartId("3003"); - j.setCountryTotal("33"); - j.setPoliceTotal("15"); - j.setCommissionerTotal("6"); - j.setNumTotal("10"); - j.setTotal(String.valueOf(33 + 15 + 10)); - list.add(j); - - // 马坡岭街道 -> 马坡岭派出所(3019) - MailMapIconVo k = new MailMapIconVo(); - k.setName("马坡岭街道"); - k.setDepartId("3019"); - k.setCountryTotal("14"); - k.setPoliceTotal("5"); - k.setCommissionerTotal("2"); - k.setNumTotal("4"); - k.setTotal(String.valueOf(14 + 5 + 4)); - list.add(k); - - // 湘湖街道 -> 湘湖派出所(1246) - MailMapIconVo l = new MailMapIconVo(); - l.setName("湘湖街道"); - l.setDepartId("1246"); - l.setCountryTotal("26"); - l.setPoliceTotal("12"); - l.setCommissionerTotal("4"); - l.setNumTotal("7"); - l.setTotal(String.valueOf(26 + 12 + 7)); - list.add(l); - - // 东岸街道 -> 东岸派出所(1248) - MailMapIconVo m = new MailMapIconVo(); - m.setName("东岸街道"); - m.setDepartId("1248"); - m.setCountryTotal("11"); - m.setPoliceTotal("4"); - m.setCommissionerTotal("1"); - m.setNumTotal("3"); - m.setTotal(String.valueOf(11 + 4 + 3)); - list.add(m); - - // 东湖街道 -> 东湖派出所(3038) - MailMapIconVo n = new MailMapIconVo(); - n.setName("东湖街道"); - n.setDepartId("3038"); - n.setCountryTotal("29"); - n.setPoliceTotal("16"); - n.setCommissionerTotal("5"); - n.setNumTotal("9"); - n.setTotal(String.valueOf(29 + 16 + 9)); - list.add(n); - - JSONObject data = new JSONObject().fluentPut("mailMapIconList", list); - return Result.success(data); - } - - - public Result mockSubOneEntanglementAndMassMail() { - - // ===== 分县市局 - 群体集访 ===== - List fxsjMassMailList = new ArrayList<>(); - OrganizeProblemRankVo v1 = new OrganizeProblemRankVo(); - v1.setLabel("浏阳市局"); - v1.setValue("126"); - fxsjMassMailList.add(v1); - OrganizeProblemRankVo v2 = new OrganizeProblemRankVo(); - v2.setLabel("宁乡市局"); - v2.setValue("98"); - fxsjMassMailList.add(v2); - OrganizeProblemRankVo v3 = new OrganizeProblemRankVo(); - v3.setLabel("长沙县局"); - v3.setValue("86"); - fxsjMassMailList.add(v3); - OrganizeProblemRankVo v4 = new OrganizeProblemRankVo(); - v4.setLabel("望城区局"); - v4.setValue("74"); - fxsjMassMailList.add(v4); - OrganizeProblemRankVo v5 = new OrganizeProblemRankVo(); - v5.setLabel("岳麓分局"); - v5.setValue("63"); - fxsjMassMailList.add(v5); - - // ===== 分县市局 - 领导接访 ===== - List fxsjLeaderReviewMailList = new ArrayList<>(); - OrganizeProblemRankVo v6 = new OrganizeProblemRankVo(); - v6.setLabel("浏阳市局"); - v6.setValue("34"); - fxsjLeaderReviewMailList.add(v6); - OrganizeProblemRankVo v7 = new OrganizeProblemRankVo(); - v7.setLabel("宁乡市局"); - v7.setValue("28"); - fxsjLeaderReviewMailList.add(v7); - OrganizeProblemRankVo v8 = new OrganizeProblemRankVo(); - v8.setLabel("长沙县局"); - v8.setValue("25"); - fxsjLeaderReviewMailList.add(v8); - OrganizeProblemRankVo v9 = new OrganizeProblemRankVo(); - v9.setLabel("望城区局"); - v9.setValue("19"); - fxsjLeaderReviewMailList.add(v9); - OrganizeProblemRankVo v10 = new OrganizeProblemRankVo(); - v10.setLabel("岳麓分局"); - v10.setValue("16"); - fxsjLeaderReviewMailList.add(v10); - - // ===== 局属单位 - 群体集访 ===== - List bwzdMassMailList = new ArrayList<>(); - OrganizeProblemRankVo b1 = new OrganizeProblemRankVo(); - b1.setLabel("治安支队"); - b1.setValue("47"); - bwzdMassMailList.add(b1); - OrganizeProblemRankVo b2 = new OrganizeProblemRankVo(); - b2.setLabel("刑侦支队"); - b2.setValue("39"); - bwzdMassMailList.add(b2); - OrganizeProblemRankVo b3 = new OrganizeProblemRankVo(); - b3.setLabel("交警支队"); - b3.setValue("33"); - bwzdMassMailList.add(b3); - OrganizeProblemRankVo b4 = new OrganizeProblemRankVo(); - b4.setLabel("网安支队"); - b4.setValue("28"); - bwzdMassMailList.add(b4); - - // ===== 局属单位 - 领导接访 ===== - List bwzdLeaderReviewMailList = new ArrayList<>(); - OrganizeProblemRankVo b5 = new OrganizeProblemRankVo(); - b5.setLabel("治安支队"); - b5.setValue("14"); - bwzdLeaderReviewMailList.add(b5); - OrganizeProblemRankVo b6 = new OrganizeProblemRankVo(); - b6.setLabel("刑侦支队"); - b6.setValue("11"); - bwzdLeaderReviewMailList.add(b6); - OrganizeProblemRankVo b7 = new OrganizeProblemRankVo(); - b7.setLabel("交警支队"); - b7.setValue("9"); - bwzdLeaderReviewMailList.add(b7); - OrganizeProblemRankVo b8 = new OrganizeProblemRankVo(); - b8.setLabel("网安支队"); - b8.setValue("6"); - bwzdLeaderReviewMailList.add(b8); - - // ===== 汇总(分县市局)===== - MailEntanglementMassOverviewVo fxsjOverview = new MailEntanglementMassOverviewVo(); - fxsjOverview.setEntanglement(0); - fxsjOverview.setMass(fxsjMassMailList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum()); - fxsjOverview.setLeaderReview(fxsjLeaderReviewMailList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum()); - - // ===== 汇总(局属单位)===== - MailEntanglementMassOverviewVo bwzdOverview = new MailEntanglementMassOverviewVo(); - bwzdOverview.setEntanglement(0); - bwzdOverview.setMass(bwzdMassMailList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum()); - bwzdOverview.setLeaderReview(bwzdLeaderReviewMailList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum()); - - JSONObject data = new JSONObject() - .fluentPut("fxsjOverview", fxsjOverview) - .fluentPut("bwzdOverview", bwzdOverview) - .fluentPut("fxsjMassMailList", fxsjMassMailList) - .fluentPut("bwzdMassMailList", bwzdMassMailList) - .fluentPut("fxsjLeaderReviewMailList", fxsjLeaderReviewMailList) - .fluentPut("bwzdLeaderReviewMailList", bwzdLeaderReviewMailList); - - return Result.success(data); - } - - - public Result getSubOneFirstAndRepeatMail() { - - // 派出所 mock - List fxsjFirstRankList = new ArrayList<>(); - List fxsjRepeatRankList = new ArrayList<>(); - - fxsjFirstRankList.add(new OrganizeProblemRankVo("芙蓉派出所", "15")); - fxsjFirstRankList.add(new OrganizeProblemRankVo("天心派出所", "12")); - fxsjFirstRankList.add(new OrganizeProblemRankVo("雨花派出所", "9")); - fxsjFirstRankList.add(new OrganizeProblemRankVo("开福派出所", "7")); - - fxsjRepeatRankList.add(new OrganizeProblemRankVo("芙蓉派出所", "6")); - fxsjRepeatRankList.add(new OrganizeProblemRankVo("天心派出所", "5")); - fxsjRepeatRankList.add(new OrganizeProblemRankVo("雨花派出所", "3")); - fxsjRepeatRankList.add(new OrganizeProblemRankVo("开福派出所", "2")); - - // 大队 mock - List bwzdFirstRankList = new ArrayList<>(); - List bwzdRepeatRankList = new ArrayList<>(); - - bwzdFirstRankList.add(new OrganizeProblemRankVo("刑侦大队", "22")); - bwzdFirstRankList.add(new OrganizeProblemRankVo("治安大队", "18")); - bwzdFirstRankList.add(new OrganizeProblemRankVo("交警大队", "13")); - - bwzdRepeatRankList.add(new OrganizeProblemRankVo("刑侦大队", "8")); - bwzdRepeatRankList.add(new OrganizeProblemRankVo("治安大队", "6")); - bwzdRepeatRankList.add(new OrganizeProblemRankVo("交警大队", "4")); - - // 汇总(派出所) - MailFirstAndRepeatOverviewVo fxsjOverview = new MailFirstAndRepeatOverviewVo(); - fxsjOverview.setFirstMail( - fxsjFirstRankList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum() - ); - fxsjOverview.setRepeatMail( - fxsjRepeatRankList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum() - ); - fxsjOverview.setLeaderMail(0); - - // 汇总(大队) - MailFirstAndRepeatOverviewVo bwzdOverview = new MailFirstAndRepeatOverviewVo(); - bwzdOverview.setFirstMail( - bwzdFirstRankList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum() - ); - bwzdOverview.setRepeatMail( - bwzdRepeatRankList.stream().mapToInt(OrganizeProblemRankVo::getValueAsInt).sum() - ); - bwzdOverview.setLeaderMail(0); - - JSONObject data = new JSONObject() - .fluentPut("fxsjOverview", fxsjOverview) - .fluentPut("bwzdOverview", bwzdOverview) - .fluentPut("fxsjFirstRankList", fxsjFirstRankList) - .fluentPut("fxsjRepeatRankList", fxsjRepeatRankList) - .fluentPut("bwzdFirstRankList", bwzdFirstRankList) - .fluentPut("bwzdRepeatRankList", bwzdRepeatRankList); - - return Result.success(data); - } } diff --git a/src/main/java/com/biutag/supervision/service/subDatav/SubDatavServiceImpl.java b/src/main/java/com/biutag/supervision/service/subDatav/SubDatavServiceImpl.java index 9ff8537..e6c2a3b 100644 --- a/src/main/java/com/biutag/supervision/service/subDatav/SubDatavServiceImpl.java +++ b/src/main/java/com/biutag/supervision/service/subDatav/SubDatavServiceImpl.java @@ -113,6 +113,7 @@ public class SubDatavServiceImpl implements SubDatavService { private SuperviseReportService superviseReportService; private static final String NO_BLAME = "不予追责"; + private static final Set NO_ACCOUNTABILITY_SET = Set.of("不予问责", "不予追责"); private static final BigDecimal WAN = new BigDecimal("10000"); @@ -319,39 +320,15 @@ public class SubDatavServiceImpl implements SubDatavService { List negatives = negativeMapper.getNegativeListData(request.getDepartId(), request.getBeginTime(), request.getEndTime(), List.of(SPDC.getValue())); List ssList = negatives.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).toList(); List completedList = negatives.stream().filter(item -> ProcessingStatusEnum.completed.name().equals(item.getProcessingStatus())).toList(); - NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); - negativeBlameQueryParam.setNegativeIds(ssList.stream().map(Negative::getId).toList()); - List negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); - - // 3. 个人问责 - List personalBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); - // 4. 领导问责(按 negativeId + 领导姓名 + 领导处理结果 去重) - Set seenLead = new HashSet<>(); - List leadBlames = negativeBlames.stream() - .filter(one -> BlameType.personal.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) - .filter(one -> !"不予追责".equals(one.getLeadHandleResultName())) - .filter(one -> seenLead.add( - one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName() - )) - .toList(); - // 5. 单位问责 - List unitBlames = negativeBlames.stream() - .filter(one -> BlameType.department.name().equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())) - .toList(); + // 与 DatavServiceImpl 保持一致:按“有效问题 + 多处理结果拆分 + negativeId/对象/处理结果去重”的口径统计。 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); VideoSuperviseCountVo overview = new VideoSuperviseCountVo(); overview.setTotal(negatives.size()); overview.setCompletionProblem((long) completedList.size()); overview.setDiscoverProblem((long) ssList.size()); - overview.setRelativeOrg((long) unitBlames.size()); - overview.setRelativePer((long) (personalBlames.size() + leadBlames.size())); + overview.setRelativeOrg(accountabilityCountResult.unitCount()); + overview.setRelativePer(accountabilityCountResult.personTotalCount()); JSONObject data = new JSONObject().fluentPut("overview", overview); return Result.success(data); } @@ -541,15 +518,16 @@ public class SubDatavServiceImpl implements SubDatavService { superviseReportLambdaQueryWrapper.eq(SuperviseReport::getType, "1"); superviseReportLambdaQueryWrapper.eq(SuperviseReport::getCrtDepartId, supDepart.getId()); List superviseReportList = superviseReportService.list(superviseReportLambdaQueryWrapper); - DatavServiceImpl.BlameResult blameResult = this.buildBlameResult(negatives); + // 与 DatavServiceImpl 保持一致:按“有效问题 + 多处理结果拆分 + negativeId/对象/处理结果去重”的口径统计。 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); SuperviseMapIconVo superviseMapIconVo = new SuperviseMapIconVo(); superviseMapIconVo.setName(supDepart.getShortName()); superviseMapIconVo.setDepartId(supDepart.getId()); superviseMapIconVo.setTotalPro(negatives.size()); superviseMapIconVo.setCompletedNumber(completedList.size()); superviseMapIconVo.setProcessingNumber(processingList.size()); - superviseMapIconVo.setPersonNum(String.valueOf(blameResult.personalBlames().size() + blameResult.leadBlames().size())); - superviseMapIconVo.setRelationOrg(String.valueOf(blameResult.unitBlames().size())); + superviseMapIconVo.setPersonNum(String.valueOf(accountabilityCountResult.personTotalCount())); + superviseMapIconVo.setRelationOrg(String.valueOf(accountabilityCountResult.unitCount())); superviseMapIconVo.setReportNumber(String.valueOf(superviseReportList.size())); superviseTempMapVoList.add(superviseMapIconVo); } @@ -578,13 +556,14 @@ public class SubDatavServiceImpl implements SubDatavService { superviseReportLambdaQueryWrapper.eq(SuperviseReport::getType, "1"); superviseReportLambdaQueryWrapper.in(CollectionUtil.isNotEmpty(allDepartIds), SuperviseReport::getCrtDepartId, allDepartIds); List superviseReportList = superviseReportService.list(superviseReportLambdaQueryWrapper); - DatavServiceImpl.BlameResult blameResult = this.buildBlameResult(negatives); + // 与 DatavServiceImpl 保持一致:按“有效问题 + 多处理结果拆分 + negativeId/对象/处理结果去重”的口径统计。 + AccountabilityCountResult accountabilityCountResult = buildAccountabilityCountResult(negatives); overView.setProblemNumber(negatives.size()); overView.setProcessingNumber((long) processingList.size()); overView.setCompletedNumber((long) completedList.size()); overView.setReportNumber((long) superviseReportList.size()); - overView.setDepartNumber((long) blameResult.unitBlames().size()); - overView.setPersonNumber((long) (blameResult.leadBlames().size() + blameResult.personalBlames().size())); + overView.setDepartNumber(accountabilityCountResult.unitCount()); + overView.setPersonNumber(accountabilityCountResult.personTotalCount()); return Result.success(new JSONObject().fluentPut("overview", overView)); } @@ -1190,6 +1169,93 @@ public class SubDatavServiceImpl implements SubDatavService { ) { } + /** + * 统一问责统计口径: + * 1. 仅统计核查属实、部分属实的问题; + * 2. 同一条问责记录中若包含多个处理结果,按分隔符拆分后分别计数; + * 3. 通过 negativeId + 问责对象 + 处理结果 去重,避免重复累计。 + */ + private record AccountabilityCountResult( + long personalCount, + long leaderCount, + long personTotalCount, + long unitCount + ) { + } + + /** + * 与 DatavServiceImpl 的问责人数、问责单位数统计逻辑保持一致,避免区县大屏与一级大屏口径不一致。 + */ + private AccountabilityCountResult buildAccountabilityCountResult(List negatives) { + if (CollectionUtil.isEmpty(negatives)) { + return new AccountabilityCountResult(0L, 0L, 0L, 0L); + } + + List effectiveNegativeIds = negatives.stream() + .filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) + || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) + .map(Negative::getId) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + + if (CollectionUtil.isEmpty(effectiveNegativeIds)) { + return new AccountabilityCountResult(0L, 0L, 0L, 0L); + } + + NegativeBlameQueryParam param = new NegativeBlameQueryParam(); + param.setNegativeIds(effectiveNegativeIds); + List negativeBlames = negativeBlameResourceService.query(param); + + if (CollectionUtil.isEmpty(negativeBlames)) { + return new AccountabilityCountResult(0L, 0L, 0L, 0L); + } + + long personalCount = negativeBlames.stream() + .filter(one -> BlameType.personal.name().equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getBlameName())) + .flatMap(one -> splitValidAccountabilityResults(one.getHandleResultName()).stream() + .map(resultName -> one.getNegativeId() + "_" + one.getBlameName() + "_" + resultName)) + .distinct() + .count(); + + long leaderCount = negativeBlames.stream() + .filter(one -> BlameType.personal.name().equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getLeadName())) + .flatMap(one -> splitValidAccountabilityResults(one.getLeadHandleResultName()).stream() + .map(resultName -> one.getNegativeId() + "_" + one.getLeadName() + "_" + resultName)) + .distinct() + .count(); + + long unitCount = negativeBlames.stream() + .filter(one -> BlameType.department.name().equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getBlameName())) + .flatMap(one -> splitValidAccountabilityResults(one.getHandleResultName()).stream() + .map(resultName -> one.getNegativeId() + "_" + one.getBlameName() + "_" + resultName)) + .distinct() + .count(); + + return new AccountabilityCountResult( + personalCount, + leaderCount, + personalCount + leaderCount, + unitCount + ); + } + + private List splitValidAccountabilityResults(String raw) { + if (StrUtil.isBlank(raw)) { + return List.of(); + } + + return Arrays.stream(raw.split("[、,,]")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .filter(item -> !NO_ACCOUNTABILITY_SET.contains(item)) + .distinct() + .toList(); + } + public DatavServiceImpl.BlameResult buildBlameResult(List negativeListData) { if (CollUtil.isEmpty(negativeListData)) { return new DatavServiceImpl.BlameResult(List.of(), List.of(), List.of());