|
|
@ -1,13 +1,30 @@ |
|
|
|
package com.epmet.service.impl; |
|
|
|
|
|
|
|
import com.epmet.commons.tools.constant.NumConstant; |
|
|
|
import com.epmet.constant.ProjectConstant; |
|
|
|
import com.epmet.dto.stats.DimAgencyDTO; |
|
|
|
import com.epmet.dto.stats.DimDateDTO; |
|
|
|
import com.epmet.entity.project.ProjectEntity; |
|
|
|
import com.epmet.entity.project.ProjectProcessEntity; |
|
|
|
import com.epmet.entity.stats.DimDateEntity; |
|
|
|
import com.epmet.entity.stats.FactAgencyProjectDailyEntity; |
|
|
|
import com.epmet.service.StatsProjectService; |
|
|
|
import com.epmet.service.project.ProjectProcessService; |
|
|
|
import com.epmet.service.project.ProjectService; |
|
|
|
import com.epmet.service.stats.*; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.text.DateFormat; |
|
|
|
import java.text.NumberFormat; |
|
|
|
import java.text.SimpleDateFormat; |
|
|
|
import java.util.*; |
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
|
|
|
|
/** |
|
|
|
* 数据统计-项目(独立于任何具体数据源外层的service) |
|
|
|
* |
|
|
|
* @author sun |
|
|
|
*/ |
|
|
|
@Service |
|
|
@ -28,6 +45,8 @@ public class StatsProjectServiceImpl implements StatsProjectService { |
|
|
|
@Autowired |
|
|
|
private ProjectService projectService; |
|
|
|
@Autowired |
|
|
|
private ProjectProcessService projectProcessService; |
|
|
|
@Autowired |
|
|
|
private FactAgencyProjectDailyService factAgencyProjectDailyService; |
|
|
|
@Autowired |
|
|
|
private FactAgencyProjectMonthlyService factAgencyProjectMonthlyService; |
|
|
@ -44,6 +63,192 @@ public class StatsProjectServiceImpl implements StatsProjectService { |
|
|
|
**/ |
|
|
|
@Override |
|
|
|
public void statsAgencyProject(String customerId) { |
|
|
|
//1:执行机关日数据统计
|
|
|
|
agencyDateProjectStats(customerId); |
|
|
|
//2:执行机关月数据统计
|
|
|
|
if (Calendar.getInstance().get(Calendar.DATE) == 1) { |
|
|
|
agencyMonthProjectStats(customerId); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @param customerId |
|
|
|
* @Author sun |
|
|
|
* @Description 数据-项目-机关日统计 |
|
|
|
**/ |
|
|
|
private String agencyDateProjectStats(String customerId) { |
|
|
|
Date date = yesterDay(); |
|
|
|
//1:查询各维度表Id,方便使用 //TODO
|
|
|
|
DimDateDTO dimDateDTO = new DimDateDTO(); |
|
|
|
dimDateDTO.setCreatedTime(date); |
|
|
|
dimDateDTO = dimDateService.getDimDate(dimDateDTO).get(0); |
|
|
|
|
|
|
|
//2:根据客户Id查询机关维度表数据
|
|
|
|
DimAgencyDTO dimAgencyDTO = new DimAgencyDTO(); |
|
|
|
dimAgencyDTO.setCustomerId(customerId); |
|
|
|
List<DimAgencyDTO> dimAgencyList = dimAgencyService.getDimAgencyList(dimAgencyDTO); |
|
|
|
if (null == dimAgencyList || dimAgencyList.size() < NumConstant.ONE) { |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
//3:根据客户Id查询项目业务表数据
|
|
|
|
List<ProjectEntity> projectList = projectService.getProjectList(customerId); |
|
|
|
|
|
|
|
//4:查询项目处理进展表中是创建项目和结案两种进展的有效数据(创建日期截取yyyy-mm-dd格式字段值)
|
|
|
|
List<ProjectProcessEntity> processList = projectProcessService.getProcessList(customerId); |
|
|
|
|
|
|
|
//5:遍历统计每个机关各项指标数
|
|
|
|
//批量机关日统计新增对象
|
|
|
|
List<FactAgencyProjectDailyEntity> dimDateEntityList = new ArrayList<>(); |
|
|
|
//计算百分比使用,保留小数点后两位
|
|
|
|
NumberFormat numberFormat = NumberFormat.getInstance(); |
|
|
|
numberFormat.setMaximumFractionDigits(2); |
|
|
|
//遍历机关维度数据
|
|
|
|
for (DimAgencyDTO agency : dimAgencyList) { |
|
|
|
//存放当前机关及所有下级机关Id
|
|
|
|
Map map = new HashMap<>(); |
|
|
|
map.put(agency.getId(), agency.getId()); |
|
|
|
String subPids = ((null == agency.getPids() || "".equals(agency.getPids())) ? agency.getId() : agency.getPids() + ":" + agency.getId()); |
|
|
|
dimAgencyList.forEach(sub -> { |
|
|
|
if (sub.getPids().contains(subPids)) { |
|
|
|
map.put(sub.getId(), sub.getId()); |
|
|
|
} |
|
|
|
}); |
|
|
|
//机关下截止当前日期的项目总数、处理中总数、已结案总数、已结案已解决总数、已结案未解决总数
|
|
|
|
AtomicInteger projectTotal = new AtomicInteger(0); |
|
|
|
AtomicInteger pendingTotal = new AtomicInteger(0); |
|
|
|
AtomicInteger closedTotal = new AtomicInteger(0); |
|
|
|
AtomicInteger resolvedTotal = new AtomicInteger(0); |
|
|
|
AtomicInteger unResolvedTotal = new AtomicInteger(0); |
|
|
|
//存放当前机关及下级已结案切已解决的项目信息
|
|
|
|
Map resolvedMap = new HashMap<>(); |
|
|
|
//存放当前机关及下级已结案切未解决的项目信息
|
|
|
|
Map unResolvedMap = new HashMap<>(); |
|
|
|
//遍历项目数据,统计不同数据值
|
|
|
|
projectList.forEach(project -> { |
|
|
|
if (map.containsKey(project.getAgencyId())) { |
|
|
|
projectTotal.addAndGet(1); |
|
|
|
if (ProjectConstant.PENDING.equals(project.getStatus())) { |
|
|
|
pendingTotal.addAndGet(1); |
|
|
|
} |
|
|
|
if (ProjectConstant.CLOSED.equals(project.getStatus())) { |
|
|
|
closedTotal.addAndGet(1); |
|
|
|
if (ProjectConstant.RESOLVED.equals(project.getClosedStatus())) { |
|
|
|
resolvedTotal.addAndGet(1); |
|
|
|
resolvedMap.put(project.getAgencyId(), project.getClosedStatus()); |
|
|
|
} |
|
|
|
if (ProjectConstant.UNRESOLVED.equals(project.getClosedStatus())) { |
|
|
|
unResolvedTotal.addAndGet(1); |
|
|
|
unResolvedMap.put(project.getAgencyId(), project.getClosedStatus()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
//日增量中项目总数、处理中总数、已结案总数、已结案已解决总数、已结案未解决总数
|
|
|
|
AtomicInteger pendingIncr = new AtomicInteger(0); |
|
|
|
AtomicInteger closedIncr = new AtomicInteger(0); |
|
|
|
AtomicInteger resolvedIncr = new AtomicInteger(0); |
|
|
|
AtomicInteger unResolvedIncr = new AtomicInteger(0); |
|
|
|
//遍历项目进展列表数据,统计日增量数据
|
|
|
|
processList.forEach(process -> { |
|
|
|
if (date.equals(process.getCreatedTime())) { |
|
|
|
if (ProjectConstant.CREATED.equals(process.getOperation())) { |
|
|
|
pendingIncr.addAndGet(1); |
|
|
|
} |
|
|
|
if (ProjectConstant.CLOSE.equals(process.getOperation())) { |
|
|
|
closedIncr.addAndGet(1); |
|
|
|
} |
|
|
|
if (resolvedMap.containsKey(process.getAgencyId())) { |
|
|
|
resolvedIncr.addAndGet(1); |
|
|
|
} |
|
|
|
if (unResolvedMap.containsKey(process.getAgencyId())) { |
|
|
|
unResolvedIncr.addAndGet(1); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
//封装日数据对象
|
|
|
|
FactAgencyProjectDailyEntity agencyDailyEntity = new FactAgencyProjectDailyEntity(); |
|
|
|
agencyDailyEntity.setCustomerId(customerId); |
|
|
|
agencyDailyEntity.setAgencyId(agency.getId()); |
|
|
|
agencyDailyEntity.setParentId(agency.getPid()); |
|
|
|
//TODO
|
|
|
|
agencyDailyEntity.setDateId(""); |
|
|
|
agencyDailyEntity.setWeekId(""); |
|
|
|
agencyDailyEntity.setMonthId(""); |
|
|
|
agencyDailyEntity.setYearId(""); |
|
|
|
agencyDailyEntity.setProjectTotal(projectTotal.intValue()); |
|
|
|
agencyDailyEntity.setPendingTotal(pendingTotal.intValue()); |
|
|
|
agencyDailyEntity.setClosedTotal(closedTotal.intValue()); |
|
|
|
agencyDailyEntity.setResolvedTotal(resolvedTotal.intValue()); |
|
|
|
agencyDailyEntity.setUnresolvedTotal(unResolvedTotal.intValue()); |
|
|
|
if (projectTotal.intValue() > NumConstant.ZERO) { |
|
|
|
agencyDailyEntity.setPendingRatio(new BigDecimal(numberFormat.format((float) pendingTotal.intValue() / (float) projectTotal.intValue() * 100))); |
|
|
|
agencyDailyEntity.setClosedRatio(new BigDecimal(numberFormat.format((float) closedTotal.intValue() / (float) projectTotal.intValue() * 100))); |
|
|
|
} |
|
|
|
if (closedTotal.intValue() > NumConstant.ZERO) { |
|
|
|
agencyDailyEntity.setResolvedRatio(new BigDecimal(numberFormat.format((float) resolvedTotal.intValue() / (float) closedTotal.intValue() * 100))); |
|
|
|
agencyDailyEntity.setUnresolvedRatio(new BigDecimal(numberFormat.format((float) unResolvedTotal.intValue() / (float) closedTotal.intValue() * 100))); |
|
|
|
} |
|
|
|
agencyDailyEntity.setProjectIncr(pendingIncr.intValue() + closedIncr.intValue()); |
|
|
|
agencyDailyEntity.setPendingIncr(pendingIncr.intValue()); |
|
|
|
agencyDailyEntity.setClosedIncr(closedIncr.intValue()); |
|
|
|
agencyDailyEntity.setResolvedIncr(resolvedIncr.intValue()); |
|
|
|
agencyDailyEntity.setUnresolvedIncr(unResolvedIncr.intValue()); |
|
|
|
|
|
|
|
dimDateEntityList.add(agencyDailyEntity); |
|
|
|
} |
|
|
|
|
|
|
|
//6:批量保存机关日统计数据
|
|
|
|
if (null != dimDateEntityList && dimDateEntityList.size() > NumConstant.ZERO) { |
|
|
|
factAgencyProjectDailyService.insertBatch(dimDateEntityList); |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @param customerId |
|
|
|
* @Author sun |
|
|
|
* @Description 数据-项目-机关月统计 |
|
|
|
**/ |
|
|
|
private void agencyMonthProjectStats(String customerId) { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @param customerId |
|
|
|
* @return |
|
|
|
* @Author sun |
|
|
|
* @Description 数据-项目-网格日(月)统计 |
|
|
|
**/ |
|
|
|
@Override |
|
|
|
public void statsGridProject(String customerId) { |
|
|
|
//1:查询各维度表Id,方便使用
|
|
|
|
//2:根据客户Id查询网格维度表数据
|
|
|
|
//3:根据客户Id查询项目业务表数据
|
|
|
|
//4:查询项目处理进展表中是创建项目和结案两种进展的有效数据(创建日期截取yyyy-mm-dd格式字段值)
|
|
|
|
//5:根据客户Id查询议题表已转项目的议题数据(为了匹配项目所属的网格Id)
|
|
|
|
//6:遍历统计每个网格各项指标数据
|
|
|
|
//7:批量保存网格日统计数据
|
|
|
|
//8:判断当前日期是否为当月首日,执行网格月数据统计
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @Author sun |
|
|
|
* @Description 获取当前日期的前一天日期(yyyy-mm-dd) |
|
|
|
**/ |
|
|
|
private Date yesterDay() { |
|
|
|
Date date = new Date(); |
|
|
|
try { |
|
|
|
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
|
|
|
Calendar calendar = Calendar.getInstance(); |
|
|
|
calendar.set(Calendar.HOUR_OF_DAY, -24); |
|
|
|
String str = sdf.format(calendar.getTime()); |
|
|
|
date = sdf.parse(str); |
|
|
|
} catch (Exception e) { |
|
|
|
e.printStackTrace(); |
|
|
|
} |
|
|
|
return date; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|