|
|
|
|
@ -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<NegativeQueryVo> ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); |
|
|
|
|
List<String> ztNegativeIds = ztNegativeList.stream().map(NegativeQueryVo::getId).toList(); |
|
|
|
|
AccountabilityStats accountabilityStats = buildAccountabilityStats(ztNegativeIds); |
|
|
|
|
// 个人问责
|
|
|
|
|
Map<String, List<NegativeBlame>> leadMap = accountabilityStats.getLeadBlames().stream().collect(Collectors.groupingBy(NegativeBlame::getLeadHandleResultName)); |
|
|
|
|
Map<String, List<NegativeBlame>> personMap = accountabilityStats.getPersonalBlames().stream().collect(Collectors.groupingBy(NegativeBlame::getHandleResultName)); |
|
|
|
|
Map<String, List<NegativeBlame>> mergedMap = new HashMap<>(personMap); |
|
|
|
|
leadMap.forEach((key, value) -> |
|
|
|
|
mergedMap.merge(key, value, (list1, list2) -> { |
|
|
|
|
List<NegativeBlame> list = new ArrayList<>(list1); |
|
|
|
|
list.addAll(list2); |
|
|
|
|
return list; |
|
|
|
|
}) |
|
|
|
|
); |
|
|
|
|
AccountabilityPersonalSection accountabilityPersonalSection = new AccountabilityPersonalSection(); |
|
|
|
|
accountabilityPersonalSection.setTotalCount(accountabilityStats.getPersonal()); |
|
|
|
|
// 构造 typeItems
|
|
|
|
|
List<AccountabilityTypeItem> 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<NegativeQueryVo> ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); |
|
|
|
|
List<String> ztNegativeIds = ztNegativeList.stream().map(NegativeQueryVo::getId).toList(); |
|
|
|
|
AccountabilityStats accountabilityStats = buildAccountabilityStats(ztNegativeIds); |
|
|
|
|
// 单位问责
|
|
|
|
|
Map<String, List<NegativeBlame>> unitMap = accountabilityStats.getUnitBlames().stream().collect(Collectors.groupingBy(NegativeBlame::getHandleResultName)); |
|
|
|
|
|
|
|
|
|
AccountabilityDepartmentSection accountabilityDepartmentSection = new AccountabilityDepartmentSection(); |
|
|
|
|
accountabilityDepartmentSection.setTotalCount(accountabilityStats.getUnit()); |
|
|
|
|
// 构造 typeItems
|
|
|
|
|
List<AccountabilityTypeItem> 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<NegativeQueryVo> ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); |
|
|
|
|
List<String> 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<NegativeQueryVo> ztNegativeList = negativeQueryService.page(ztnegativeQueryParam).getRecords(); |
|
|
|
|
SupDepartGroupParam supDepartGroupParam = new SupDepartGroupParam(); |
|
|
|
|
supDepartGroupParam.setParentLevel(2); |
|
|
|
|
supDepartGroupParam.setChildLevel(3); |
|
|
|
|
Map<String, DepartAndSubDepartDto> departAndSubDepart = supDepartResourceService.getDepartAndSubDepart(supDepartGroupParam); |
|
|
|
|
List<UnitInvestigationItem> topUnits = new ArrayList<>(); |
|
|
|
|
for (DepartAndSubDepartDto value : departAndSubDepart.values()) { |
|
|
|
|
Set<String> allDepartIds = value.getAllDepartIds(); |
|
|
|
|
List<NegativeQueryVo> 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<NegativeQueryVo> 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<UnitInvestigationItem> 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<NegativeQueryVo> fxsjxfNegativeList = ztNegativeList.stream().filter(one -> Objects.equals(2, one.getCrtDepartLevel())).toList(); |
|
|
|
|
// 办结数据
|
|
|
|
|
List<NegativeQueryVo> bjNegativeList = ztNegativeList.stream().filter(one -> ProcessingStatusEnum.completed.getLabel().equals(one.getProcessingStatus())).toList(); |
|
|
|
|
List<NegativeQueryVo> bjNegativeList = ztNegativeList.stream().filter(one -> ProcessingStatusEnum.completed.name().equals(one.getProcessingStatus())).toList(); |
|
|
|
|
// 办结中属实数据
|
|
|
|
|
List<NegativeQueryVo> bjssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatus())).toList(); |
|
|
|
|
List<NegativeQueryVo> bjssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode())).toList(); |
|
|
|
|
// 办结中基本属实数据
|
|
|
|
|
List<NegativeQueryVo> bjjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatus())).toList(); |
|
|
|
|
List<NegativeQueryVo> bjjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())).toList(); |
|
|
|
|
// 办结中不属实数据
|
|
|
|
|
List<NegativeQueryVo> bjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.FALSE_SET.contains(one.getCheckStatus())).toList(); |
|
|
|
|
List<NegativeQueryVo> bjbssNegativeList = bjNegativeList.stream().filter(one -> CheckStatusEnum.FALSE_SET.contains(one.getCheckStatusCode())).toList(); |
|
|
|
|
// 属实 基本属实中的问责数据
|
|
|
|
|
List<String> ssNegativeIds = Stream.concat(bjssNegativeList.stream(), bjjbssNegativeList.stream()) |
|
|
|
|
.map(NegativeQueryVo::getId).filter(StrUtil::isNotBlank).distinct().toList(); |
|
|
|
|
NegativeBlameQueryParam negativeBlameQueryParam = new NegativeBlameQueryParam(); |
|
|
|
|
negativeBlameQueryParam.setNegativeIds(ssNegativeIds); |
|
|
|
|
List<NegativeBlame> negativeBlames = negativeBlameResourceService.query(negativeBlameQueryParam); |
|
|
|
|
// 个人问责
|
|
|
|
|
List<NegativeBlame> grwzNegativeBlames = negativeBlames.stream().filter(one -> "personal".equals(one.getType())) |
|
|
|
|
.filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) |
|
|
|
|
.filter(one -> !"不予追责".equals(one.getHandleResultName())).toList(); |
|
|
|
|
|
|
|
|
|
// 单位问责
|
|
|
|
|
List<NegativeBlame> 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<NegativeQueryVo> hbBjNegativeList = hbNegativList.stream() |
|
|
|
|
.filter(one -> ProcessingStatusEnum.completed.name().equals(one.getProcessingStatus())) |
|
|
|
|
.toList(); |
|
|
|
|
// 环比办结中属实数据
|
|
|
|
|
List<NegativeQueryVo> hbBjssNegativeList = hbBjNegativeList.stream() |
|
|
|
|
.filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode())) |
|
|
|
|
.toList(); |
|
|
|
|
// 环比办结中基本属实数据
|
|
|
|
|
List<NegativeQueryVo> hbBjjbssNegativeList = hbBjNegativeList.stream() |
|
|
|
|
.filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) |
|
|
|
|
.toList(); |
|
|
|
|
// 环比属实 + 基本属实中的问责数据
|
|
|
|
|
List<String> hbNegativeIds = Stream.concat(hbBjssNegativeList.stream(), hbBjjbssNegativeList.stream()) |
|
|
|
|
.map(NegativeQueryVo::getId) |
|
|
|
|
.filter(StrUtil::isNotBlank) |
|
|
|
|
.distinct() |
|
|
|
|
.toList(); |
|
|
|
|
AccountabilityStats momAccountabilityStats = buildAccountabilityStats(hbNegativeIds); |
|
|
|
|
int hbAccountabilityTotal = momAccountabilityStats.getTotal(); |
|
|
|
|
// ==================== 同比问责数据 ====================
|
|
|
|
|
// 同比办结数据
|
|
|
|
|
List<NegativeQueryVo> tbBjNegativeList = tbNegativList.stream() |
|
|
|
|
.filter(one -> ProcessingStatusEnum.completed.name().equals(one.getProcessingStatus())) |
|
|
|
|
.toList(); |
|
|
|
|
// 同比办结中属实数据
|
|
|
|
|
List<NegativeQueryVo> tbBjssNegativeList = tbBjNegativeList.stream() |
|
|
|
|
.filter(one -> CheckStatusEnum.TRUE_SET.contains(one.getCheckStatusCode())) |
|
|
|
|
.toList(); |
|
|
|
|
// 同比办结中基本属实数据
|
|
|
|
|
List<NegativeQueryVo> tbBjjbssNegativeList = tbBjNegativeList.stream() |
|
|
|
|
.filter(one -> CheckStatusEnum.PART_TRUE_SET.contains(one.getCheckStatusCode())) |
|
|
|
|
.toList(); |
|
|
|
|
// 同比属实 + 基本属实中的问责数据
|
|
|
|
|
List<String> 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<String, Long> 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<NegativeQueryVo> list) { |
|
|
|
|
// 办结
|
|
|
|
|
List<NegativeQueryVo> closed = list.stream().filter(n -> n.getCompleteDate() != null).toList(); |
|
|
|
|
List<NegativeQueryVo> 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<String> negativeIds) { |
|
|
|
|
AccountabilityStats stats = new AccountabilityStats(); |
|
|
|
|
if (CollUtil.isEmpty(negativeIds)) { |
|
|
|
|
return stats; |
|
|
|
|
} |
|
|
|
|
NegativeBlameQueryParam queryParam = new NegativeBlameQueryParam(); |
|
|
|
|
queryParam.setNegativeIds(negativeIds); |
|
|
|
|
List<NegativeBlame> negativeBlames = negativeBlameResourceService.query(queryParam); |
|
|
|
|
// 个人问责
|
|
|
|
|
List<NegativeBlame> personalBlames = negativeBlames.stream() |
|
|
|
|
.filter(one -> "personal".equals(one.getType())) |
|
|
|
|
.filter(one -> StrUtil.isNotBlank(one.getHandleResultName())) |
|
|
|
|
.filter(one -> !"不予追责".equals(one.getHandleResultName())) |
|
|
|
|
.toList(); |
|
|
|
|
// 个人问责中的领导问责
|
|
|
|
|
Set<String> seenLead = new HashSet<>(); |
|
|
|
|
List<NegativeBlame> 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<NegativeBlame> 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<NegativeBlame> personalBlames = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 领导问责 |
|
|
|
|
*/ |
|
|
|
|
private List<NegativeBlame> leadBlames = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 单位问责 |
|
|
|
|
*/ |
|
|
|
|
private List<NegativeBlame> unitBlames = new ArrayList<>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |