diff --git a/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationItem.java b/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationItem.java index c1476b6..0c9bf1c 100644 --- a/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationItem.java +++ b/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationItem.java @@ -4,6 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; +import java.math.BigDecimal; + /** * @ClassName UnitInvestigationItem * @Description TODO @@ -30,5 +32,5 @@ public class UnitInvestigationItem { private Integer verifiedProblemCount; @Schema(description = "查实率", example = "75.00%") - private String verifiedRate; + private BigDecimal verifiedRate; } \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/vo/NegativeQueryVo.java b/src/main/java/com/biutag/supervision/pojo/vo/NegativeQueryVo.java index 99b79c2..789d7b5 100644 --- a/src/main/java/com/biutag/supervision/pojo/vo/NegativeQueryVo.java +++ b/src/main/java/com/biutag/supervision/pojo/vo/NegativeQueryVo.java @@ -205,4 +205,8 @@ public class NegativeQueryVo { @Schema(description = "下发层级") private Integer crtDepartLevel; + + @Schema(description = "核查结论code") + private String checkStatusCode; + } diff --git a/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java b/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java index 8270578..9bc7edb 100644 --- a/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java +++ b/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java @@ -1,13 +1,19 @@ package com.biutag.supervision.service.report; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.biutag.supervision.constants.enums.CheckStatusEnum; import com.biutag.supervision.constants.enums.ProcessingStatusEnum; +import com.biutag.supervision.pojo.dto.DepartAndSubDepartDto; +import com.biutag.supervision.pojo.dto.report.OverviewSection; +import com.biutag.supervision.pojo.dto.report.ReportViewModel; +import com.biutag.supervision.pojo.dto.report.accountability.AccountabilityDepartmentSection; import com.biutag.supervision.pojo.dto.report.accountability.AccountabilityOverviewSection; +import com.biutag.supervision.pojo.dto.report.accountability.AccountabilityPersonalSection; +import com.biutag.supervision.pojo.dto.report.accountability.AccountabilityTypeItem; import com.biutag.supervision.pojo.dto.report.businessLine.BusinessLineDetailSection; import com.biutag.supervision.pojo.dto.report.businessLine.BusinessLineOverviewSection; -import com.biutag.supervision.pojo.dto.report.OverviewSection; -import com.biutag.supervision.pojo.dto.report.ReportViewModel; import com.biutag.supervision.pojo.dto.report.businessLine.BusinessLinePersonRankItem; import com.biutag.supervision.pojo.dto.report.businessLine.BusinessLineRankItem; import com.biutag.supervision.pojo.dto.report.unitInvestigation.UnitInvestigationItem; @@ -15,17 +21,20 @@ import com.biutag.supervision.pojo.dto.report.unitInvestigation.UnitInvestigatio import com.biutag.supervision.pojo.entity.NegativeBlame; import com.biutag.supervision.pojo.enums.report.TrendEnum; import com.biutag.supervision.pojo.param.NegativeQueryParam; +import com.biutag.supervision.pojo.param.SupDepartGroupParam; import com.biutag.supervision.pojo.param.negativeBlame.NegativeBlameQueryParam; import com.biutag.supervision.pojo.vo.DictProblemSourceTree; import com.biutag.supervision.pojo.vo.NegativeQueryVo; import com.biutag.supervision.repository.negative.NegativeResourceService; import com.biutag.supervision.repository.negativeBlame.NegativeBlameResourceService; +import com.biutag.supervision.repository.supdepart.SupDepartResourceService; import com.biutag.supervision.service.NegativeQueryService; import com.biutag.supervision.service.SupDictProblemSourceService; import com.biutag.supervision.util.DateCompareRangeUtil; import com.biutag.supervision.util.ReportTrendUtil; import com.biutag.supervision.util.TimeUtil; import jakarta.annotation.Resource; +import lombok.Data; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -48,6 +57,9 @@ public class ReportDataServiceImpl implements ReportDataService { @Resource private SupDictProblemSourceService supDictProblemSourceService; + @Resource + private SupDepartResourceService supDepartResourceService; + @Override public ReportViewModel buildViewModel(NegativeQueryParam request) { String periodStart = TimeUtil.formatDate(request.getCrtTime().get(0)); @@ -60,62 +72,137 @@ public class ReportDataServiceImpl implements ReportDataService { vm.setBusinessLineDetailSections(buildBusinessLineDetailSections(request, periodStart, periodEnd)); vm.setUnitInvestigationSection(buildUnitInvestigationSection(request, periodStart, periodEnd)); vm.setAccountabilityOverviewSection(buildAccountabilityOverviewSection(request, periodStart, periodEnd)); -// vm.setAccountabilityUnitDetailSection(); + vm.setAccountabilityUnitDetailSection(buildAccountabilityUnitDetailSection(request, periodStart, periodEnd)); + vm.setAccountabilityPersonOverviewSection(buildAccountabilityPersonOverviewSection(request, periodStart, periodEnd)); return vm; } + private AccountabilityPersonalSection buildAccountabilityPersonOverviewSection(NegativeQueryParam request, String periodStart, String periodEnd) { + NegativeQueryParam ztnegativeQueryParam = request.newQueryParam(); + List ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); + List ztNegativeIds = ztNegativeList.stream().map(NegativeQueryVo::getId).toList(); + AccountabilityStats accountabilityStats = buildAccountabilityStats(ztNegativeIds); + // 个人问责 + Map> leadMap = accountabilityStats.getLeadBlames().stream().collect(Collectors.groupingBy(NegativeBlame::getLeadHandleResultName)); + Map> personMap = accountabilityStats.getPersonalBlames().stream().collect(Collectors.groupingBy(NegativeBlame::getHandleResultName)); + Map> mergedMap = new HashMap<>(personMap); + leadMap.forEach((key, value) -> + mergedMap.merge(key, value, (list1, list2) -> { + List list = new ArrayList<>(list1); + list.addAll(list2); + return list; + }) + ); + AccountabilityPersonalSection accountabilityPersonalSection = new AccountabilityPersonalSection(); + accountabilityPersonalSection.setTotalCount(accountabilityStats.getPersonal()); + // 构造 typeItems + List typeItems = mergedMap.entrySet().stream() + .map(entry -> { + AccountabilityTypeItem item = new AccountabilityTypeItem(); + item.setTypeName(entry.getKey()); + item.setCount(entry.getValue().size()); + return item; + }) + .sorted(Comparator.comparing(AccountabilityTypeItem::getCount).reversed()) + .toList(); + accountabilityPersonalSection.setTypeItems(typeItems); + return accountabilityPersonalSection; + } + + /** + * 单位问责情况 + * + * @param request + * @param periodStart + * @param periodEnd + * @return + */ + private AccountabilityDepartmentSection buildAccountabilityUnitDetailSection(NegativeQueryParam request, String periodStart, String periodEnd) { + NegativeQueryParam ztnegativeQueryParam = request.newQueryParam(); + List ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); + List ztNegativeIds = ztNegativeList.stream().map(NegativeQueryVo::getId).toList(); + AccountabilityStats accountabilityStats = buildAccountabilityStats(ztNegativeIds); + // 单位问责 + Map> unitMap = accountabilityStats.getUnitBlames().stream().collect(Collectors.groupingBy(NegativeBlame::getHandleResultName)); + + AccountabilityDepartmentSection accountabilityDepartmentSection = new AccountabilityDepartmentSection(); + accountabilityDepartmentSection.setTotalCount(accountabilityStats.getUnit()); + // 构造 typeItems + List typeItems = unitMap.entrySet().stream() + .map(entry -> { + AccountabilityTypeItem item = new AccountabilityTypeItem(); + item.setTypeName(entry.getKey()); + item.setCount(entry.getValue().size()); + return item; + }) + .sorted(Comparator.comparing(AccountabilityTypeItem::getCount).reversed()) + .toList(); + accountabilityDepartmentSection.setTypeItems(typeItems); + return accountabilityDepartmentSection; + } + /** * 问责追责总览 + * * @param request * @param periodStart * @param periodEnd * @return */ private AccountabilityOverviewSection buildAccountabilityOverviewSection(NegativeQueryParam request, String periodStart, String periodEnd) { - - return null; + // 总体数据 + NegativeQueryParam ztnegativeQueryParam = request.newQueryParam(); + List ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); + List tzNegativeIds = ztNegativeList.stream().map(NegativeQueryVo::getId).toList(); + AccountabilityStats accountabilityStats = buildAccountabilityStats(tzNegativeIds); + AccountabilityOverviewSection accountabilityOverviewSection = new AccountabilityOverviewSection(); + accountabilityOverviewSection.setPeriodStart(periodStart); + accountabilityOverviewSection.setPeriodEnd(periodEnd); + accountabilityOverviewSection.setProblemTypeCount(ztNegativeList.size()); + accountabilityOverviewSection.setPersonalAccountabilityCount(accountabilityStats.personal); + accountabilityOverviewSection.setDepartmentAccountabilityCount(accountabilityStats.unit); + return accountabilityOverviewSection; } private UnitInvestigationOverviewSection buildUnitInvestigationSection(NegativeQueryParam request, String periodStart, String periodEnd) { + DateCompareRangeUtil.CompareDateRange compareDateRange = DateCompareRangeUtil.buildCompareDateRange(request.getCrtTime().get(0), request.getCrtTime().get(1)); + // 总体数据 + NegativeQueryParam ztnegativeQueryParam = request.newQueryParam(); + List ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); + SupDepartGroupParam supDepartGroupParam = new SupDepartGroupParam(); + supDepartGroupParam.setParentLevel(2); + supDepartGroupParam.setChildLevel(3); + Map departAndSubDepart = supDepartResourceService.getDepartAndSubDepart(supDepartGroupParam); + List topUnits = new ArrayList<>(); + for (DepartAndSubDepartDto value : departAndSubDepart.values()) { + Set allDepartIds = value.getAllDepartIds(); + List voList = ztNegativeList.stream().filter(one -> allDepartIds.contains(one.getInvolveDepartId())).toList(); + if (CollectionUtil.isNotEmpty(voList)){ + UnitInvestigationItem unitInvestigationItem = new UnitInvestigationItem(); + unitInvestigationItem.setUnitName(value.getParentName()); + unitInvestigationItem.setIssuedProblemCount(voList.size()); + List csList = voList.stream() + .filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode()) + || CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) + .toList(); + unitInvestigationItem.setVerifiedProblemCount(csList.size()); + unitInvestigationItem.setVerifiedRate(ReportTrendUtil.percent(csList.size(), voList.size())); + topUnits.add(unitInvestigationItem); + } + } + topUnits.sort(Comparator.comparing(UnitInvestigationItem::getVerifiedProblemCount).reversed()); UnitInvestigationOverviewSection section = new UnitInvestigationOverviewSection(); section.setPeriodStart(periodStart); section.setPeriodEnd(periodEnd); - - List topUnits = new ArrayList<>(); - - UnitInvestigationItem item1 = new UnitInvestigationItem(); - item1.setRank(1); - item1.setUnitName("北京市分公司"); - item1.setIssuedProblemCount(28); - item1.setVerifiedProblemCount(21); - item1.setVerifiedRate("75.00"); - - UnitInvestigationItem item2 = new UnitInvestigationItem(); - item2.setRank(2); - item2.setUnitName("上海市分公司"); - item2.setIssuedProblemCount(24); - item2.setVerifiedProblemCount(17); - item2.setVerifiedRate("70.83"); - - UnitInvestigationItem item3 = new UnitInvestigationItem(); - item3.setRank(3); - item3.setUnitName("广东省分公司"); - item3.setIssuedProblemCount(19); - item3.setVerifiedProblemCount(13); - item3.setVerifiedRate("68.42"); - - topUnits.add(item1); - topUnits.add(item2); - topUnits.add(item3); - section.setTopUnits(topUnits); return section; } /** * 业务条线的明细 + * * @param request * @param periodStart * @param periodEnd @@ -246,6 +333,7 @@ public class ReportDataServiceImpl implements ReportDataService { /** * 业务条线的总览 + * * @param request * @param periodStart * @param periodEnd @@ -314,40 +402,69 @@ public class ReportDataServiceImpl implements ReportDataService { // 分县市局下发数据 List fxsjxfNegativeList = ztNegativeList.stream().filter(one -> Objects.equals(2, one.getCrtDepartLevel())).toList(); // 办结数据 - List bjNegativeList = ztNegativeList.stream().filter(one -> ProcessingStatusEnum.completed.getLabel().equals(one.getProcessingStatus())).toList(); + List bjNegativeList = ztNegativeList.stream().filter(one -> ProcessingStatusEnum.completed.name().equals(one.getProcessingStatus())).toList(); // 办结中属实数据 - List bjssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatus())).toList(); + List bjssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode())).toList(); // 办结中基本属实数据 - List bjjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatus())).toList(); + List bjjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).toList(); // 办结中不属实数据 - List bjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.FALSE_SET.contains(one.getCheckStatus())).toList(); + List bjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.FALSE_SET.contains(one.getCheckStatusCode())).toList(); // 属实 基本属实中的问责数据 List ssNegativeIds = Stream.concat(bjssNegativeList.stream(), bjjbssNegativeList.stream()) .map(NegativeQueryVo::getId).filter(StrUtil::isNotBlank).distinct().toList(); - NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); - negativeBlameQueryParam.setNegativeIds(ssNegativeIds); - List negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); - // 个人问责 - List grwzNegativeBlames = negativeBlames.stream().filter(one -> "personal".equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())).toList(); - - // 单位问责 - List dwwzNegativeBlames = negativeBlames.stream() - .filter(one -> "department".equals(one.getType())) - .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) - .filter(one -> !"不予追责".equals(one.getHandleResultName())).toList(); + AccountabilityStats currentAccountabilityStats = buildAccountabilityStats(ssNegativeIds); + // ==================== 环比问责数据 ==================== + // 环比办结数据 + List hbBjNegativeList = hbNegativList.stream() + .filter(one -> ProcessingStatusEnum.completed.name().equals(one.getProcessingStatus())) + .toList(); + // 环比办结中属实数据 + List hbBjssNegativeList = hbBjNegativeList.stream() + .filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode())) + .toList(); + // 环比办结中基本属实数据 + List hbBjjbssNegativeList = hbBjNegativeList.stream() + .filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) + .toList(); + // 环比属实 + 基本属实中的问责数据 + List hbNegativeIds = Stream.concat(hbBjssNegativeList.stream(), hbBjjbssNegativeList.stream()) + .map(NegativeQueryVo::getId) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + AccountabilityStats momAccountabilityStats = buildAccountabilityStats(hbNegativeIds); + int hbAccountabilityTotal = momAccountabilityStats.getTotal(); + // ==================== 同比问责数据 ==================== + // 同比办结数据 + List tbBjNegativeList = tbNegativList.stream() + .filter(one -> ProcessingStatusEnum.completed.name().equals(one.getProcessingStatus())) + .toList(); + // 同比办结中属实数据 + List tbBjssNegativeList = tbBjNegativeList.stream() + .filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode())) + .toList(); + // 同比办结中基本属实数据 + List tbBjjbssNegativeList = tbBjNegativeList.stream() + .filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) + .toList(); + // 同比属实 + 基本属实中的问责数据 + List tbNegativeIds = Stream.concat(tbBjssNegativeList.stream(), tbBjjbssNegativeList.stream()) + .map(NegativeQueryVo::getId) + .filter(StrUtil::isNotBlank) + .distinct() + .toList(); + AccountabilityStats yoyAccountabilityStats = buildAccountabilityStats(tbNegativeIds); + int tbAccountabilityTotal = yoyAccountabilityStats.getTotal(); + // 总问责数 + int accountabilityTotal = currentAccountabilityStats.getTotal(); + // 个人问责数 + int personalAccountability = currentAccountabilityStats.getPersonal(); + // 单位问责数 + int unitAccountability = currentAccountabilityStats.getUnit(); // 第一段 int current = ztNegativeList.size(); int mom = hbNegativList.size(); int yoy = tbNegativList.size(); - // 第二段 - int closedCount = bjNegativeList.size(); // 总办结 - int verifiedCount = bjssNegativeList.size(); // 查实 - int basicallyVerifiedCount = bjjbssNegativeList.size();// 基本属实 - int unverifiedCount = bjbssNegativeList.size(); // 不属实 - - OverviewSection overviewSection = new OverviewSection(); // 时间 overviewSection.setPeriodStart(periodStart); @@ -367,10 +484,10 @@ public class ReportDataServiceImpl implements ReportDataService { overviewSection.setCountyIssued(fxsjxfNegativeList.size()); overviewSection.setCountyRate(ReportTrendUtil.percent(fxsjxfNegativeList.size(), ztNegativeList.size())); // 办结总数据 - overviewSection.setClosedCount(closedCount); - overviewSection.setVerifiedCount(verifiedCount); - overviewSection.setBasicallyVerifiedCount(basicallyVerifiedCount); - overviewSection.setUnverifiedCount(unverifiedCount); + overviewSection.setClosedCount(bjNegativeList.size()); + overviewSection.setVerifiedCount(bjssNegativeList.size()); + overviewSection.setBasicallyVerifiedCount(bjjbssNegativeList.size()); + overviewSection.setUnverifiedCount(bjbssNegativeList.size()); // 办结查实率 // 1) 本期/环比/同比 查实率(都是 %,BigDecimal) BigDecimal curVerifiedRate = calcVerifiedRate(ztNegativeList); @@ -383,7 +500,14 @@ public class ReportDataServiceImpl implements ReportDataService { // 4) 查实率同比(注意:率对率) overviewSection.setVerifiedYoyRate(ReportTrendUtil.calcRate(curVerifiedRate, yoyVerifiedRate)); overviewSection.setVerifiedYoyTrend(ReportTrendUtil.calcTrend(curVerifiedRate, yoyVerifiedRate)); - + // 5) 问责数据 + overviewSection.setAccountabilityTotal(accountabilityTotal); + overviewSection.setPersonalAccountability(personalAccountability); + overviewSection.setUnitAccountability(unitAccountability); + overviewSection.setAccountabilityMomRate(ReportTrendUtil.calcRate(accountabilityTotal, hbAccountabilityTotal)); + overviewSection.setAccountabilityMomTrend(ReportTrendUtil.calcTrend(accountabilityTotal, hbAccountabilityTotal)); + overviewSection.setAccountabilityYoyRate(ReportTrendUtil.calcRate(accountabilityTotal, tbAccountabilityTotal)); + overviewSection.setAccountabilityYoyTrend(ReportTrendUtil.calcTrend(accountabilityTotal, tbAccountabilityTotal)); // 集中问题 Map.Entry problemEntry = ReportTrendUtil.topBy(NegativeQueryVo::getProblemSources, bjssNegativeList, bjjbssNegativeList); String problemSource = problemEntry != null ? problemEntry.getKey() : null; @@ -401,7 +525,7 @@ public class ReportDataServiceImpl implements ReportDataService { // 查实率 private BigDecimal calcVerifiedRate(List list) { // 办结 - List closed = list.stream().filter(n -> n.getCompleteDate() != null).toList(); + List closed = list.stream().filter(one -> ProcessingStatusEnum.completed.name().equals(one.getProcessingStatus())).toList(); int closedCount = closed.size(); if (closedCount == 0) { @@ -410,12 +534,12 @@ public class ReportDataServiceImpl implements ReportDataService { // 属实 int verified = (int) closed.stream() - .filter(n -> CheckStatusEnum.TRUE_SET.contains(n.getCheckStatus())) + .filter(n -> CheckStatusEnum.TRUE_SET.contains(n.getCheckStatusCode())) .count(); // 基本属实 int partVerified = (int) closed.stream() - .filter(n -> CheckStatusEnum.PART_TRUE_SET.contains(n.getCheckStatus())) + .filter(n -> CheckStatusEnum.PART_TRUE_SET.contains(n.getCheckStatusCode())) .count(); // 查实率 = (属实 + 基本属实) / 办结 @@ -437,4 +561,80 @@ public class ReportDataServiceImpl implements ReportDataService { : StrUtil.blankToDefault(child.getLabel(), "未归类"); } + + private AccountabilityStats buildAccountabilityStats(List negativeIds) { + AccountabilityStats stats = new AccountabilityStats(); + if (CollUtil.isEmpty(negativeIds)) { + return stats; + } + NegativeBlameQueryParam queryParam = new NegativeBlameQueryParam(); + queryParam.setNegativeIds(negativeIds); + List negativeBlames = negativeBlameResourceService.query(queryParam); + // 个人问责 + List personalBlames = negativeBlames.stream() + .filter(one -> "personal".equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) + .filter(one -> !"不予追责".equals(one.getHandleResultName())) + .toList(); + // 个人问责中的领导问责 + Set seenLead = new HashSet<>(); + List leadBlames = personalBlames.stream() + .filter(one -> StrUtil.isNotBlank(one.getLeadHandleResultName())) + .filter(one -> !"不予追责".equals(one.getLeadHandleResultName())) + .filter(one -> seenLead.add(one.getNegativeId() + "_" + one.getLeadHandleResultName() + "_" + one.getLeadName())) + .toList(); + // 单位问责 + List unitBlames = negativeBlames.stream() + .filter(one -> "department".equals(one.getType())) + .filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) + .filter(one -> !"不予追责".equals(one.getHandleResultName())) + .toList(); + int personalCount = personalBlames.size() + leadBlames.size(); + int unitCount = unitBlames.size(); + stats.setPersonal(personalCount); + stats.setUnit(unitCount); + stats.setTotal(personalCount + unitCount); + + stats.setPersonalBlames(personalBlames); + stats.setLeadBlames(leadBlames); + stats.setUnitBlames(unitBlames); + return stats; + } + + + @Data + private static class AccountabilityStats { + + /** + * 问责总数 = 个人问责 + 领导问责 + 单位问责 + */ + private int total; + + /** + * 个人问责数 = 个人问责 + 领导问责 + */ + private int personal; + + /** + * 单位问责数 + */ + private int unit; + + + /** + * 个人问责 + */ + private List personalBlames = new ArrayList<>(); + + /** + * 领导问责 + */ + private List leadBlames = new ArrayList<>(); + + /** + * 单位问责 + */ + private List unitBlames = new ArrayList<>(); + } + } \ No newline at end of file