|
@@ -12,13 +12,9 @@ import org.springblade.core.mp.base.BaseServiceImpl;
|
|
|
import org.springblade.core.tool.utils.Func;
|
|
|
import org.springblade.modules.project.mapper.ProjectInfoMapper;
|
|
|
import org.springblade.modules.project.pojo.dto.*;
|
|
|
-import org.springblade.modules.project.pojo.entity.ProjectInfo;
|
|
|
-import org.springblade.modules.project.pojo.entity.ProjectInvestPlan;
|
|
|
-import org.springblade.modules.project.pojo.entity.ProjectPlanProgress;
|
|
|
+import org.springblade.modules.project.pojo.entity.*;
|
|
|
import org.springblade.modules.project.pojo.vo.*;
|
|
|
-import org.springblade.modules.project.service.IProjectInfoService;
|
|
|
-import org.springblade.modules.project.service.IProjectInvestPlanService;
|
|
|
-import org.springblade.modules.project.service.IProjectPlanProgressService;
|
|
|
+import org.springblade.modules.project.service.*;
|
|
|
import org.springblade.modules.project.utils.ObjectUtils;
|
|
|
import org.springblade.modules.project.utils.SnowFlakeUtil;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
@@ -27,11 +23,10 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
+import java.text.DateFormat;
|
|
|
import java.time.LocalDate;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -47,6 +42,10 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, P
|
|
|
|
|
|
private final IProjectPlanProgressService planProgressService;
|
|
|
|
|
|
+ private final IProjectWarningService warningService;
|
|
|
+
|
|
|
+ private final IRepealRecordService repealRecordService;
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void add(ProjectInfoDTO dto) {
|
|
@@ -69,6 +68,9 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, P
|
|
|
BigDecimal projectAll = BigDecimal.ZERO;
|
|
|
for (ProjectInvestPlan plan : list) {
|
|
|
Integer year = plan.getPlanYear();
|
|
|
+ if (year == null){
|
|
|
+ throw new ServiceException("请选择年");
|
|
|
+ }
|
|
|
plan.setPlanYear(null);
|
|
|
if (ObjectUtils.isAllFieldsNull(plan)){
|
|
|
plan.setIsPlan(0);
|
|
@@ -164,16 +166,16 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, P
|
|
|
if (plan.getOneInvest() != null){
|
|
|
all = all.add(plan.getOneInvest());
|
|
|
}
|
|
|
- if (plan.getOneInvest() != null){
|
|
|
+ if (plan.getTwoInvest() != null){
|
|
|
all = all.add(plan.getTwoInvest());
|
|
|
}
|
|
|
- if (plan.getOneInvest() != null){
|
|
|
+ if (plan.getThreeInvest() != null){
|
|
|
all = all.add(plan.getThreeInvest());
|
|
|
}
|
|
|
- if (plan.getOneInvest() != null){
|
|
|
+ if (plan.getFourInvest() != null){
|
|
|
all = all.add(plan.getFourInvest());
|
|
|
}
|
|
|
- if ((plan.getYearlyInvest() == null && all.compareTo(BigDecimal.ZERO) != 0) || (plan.getYearlyInvest() != null && all.compareTo(plan.getYearlyInvest()) != 0)){
|
|
|
+ if ((plan.getYearlyInvest() == null && all.compareTo(BigDecimal.ZERO) != 0) || (plan.getYearlyInvest() != null && all.compareTo(plan.getYearlyInvest()) != 0)){
|
|
|
throw new ServiceException(plan.getPlanYear()+"年全年计划投资与每季度总和不对");
|
|
|
}
|
|
|
if (plan.getYearlyInvest() != null || StringUtils.isNotBlank(plan.getYearlyTarget()) || StringUtils.isNotBlank(plan.getOnePlan())
|
|
@@ -668,61 +670,518 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, P
|
|
|
//获取当年计划
|
|
|
ProjectInvestPlan plan = planMap.get(vo2.getId());
|
|
|
//判断是否选择过月,选择过月则计划总投资为季度-实际完成投资为当月
|
|
|
- if (month != null){
|
|
|
+ if (month != null && month != -1) {
|
|
|
+ if (quarters[month] == 1) {
|
|
|
+ vo2.setPlanAllMoney(plan.getOneInvest() == null ? BigDecimal.ZERO : plan.getOneInvest());
|
|
|
+ vo2.setCurrentMoney(plan.getOneInvestFinish() == null ? BigDecimal.ZERO : plan.getOneInvestFinish());
|
|
|
+ } else if (quarters[month] == 2) {
|
|
|
+ vo2.setPlanAllMoney(plan.getTwoInvest() == null ? BigDecimal.ZERO : plan.getTwoInvest());
|
|
|
+ vo2.setCurrentMoney(plan.getTwoInvestFinish() == null ? BigDecimal.ZERO : plan.getTwoInvestFinish());
|
|
|
+ } else if (quarters[month] == 3) {
|
|
|
+ vo2.setPlanAllMoney(plan.getThreeInvest() == null ? BigDecimal.ZERO : plan.getThreeInvest());
|
|
|
+ vo2.setCurrentMoney(plan.getThreeInvestFinish() == null ? BigDecimal.ZERO : plan.getThreeInvestFinish());
|
|
|
+ } else {
|
|
|
+ vo2.setPlanAllMoney(plan.getFourInvest() == null ? BigDecimal.ZERO : plan.getFourInvest());
|
|
|
+ vo2.setCurrentMoney(plan.getFourInvestFinish() == null ? BigDecimal.ZERO : plan.getFourInvestFinish());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //没有选择过月计划总投资为年-实际完成投资为当年,
|
|
|
+ vo2.setPlanAllMoney(plan.getYearlyInvest() == null ? BigDecimal.ZERO : plan.getYearlyInvest());
|
|
|
+ vo2.setCurrentMoney(plan.getYearFinishInvest() == null ? BigDecimal.ZERO : plan.getYearFinishInvest());
|
|
|
+ }
|
|
|
+ //判断项目进程类型
|
|
|
+ if (plan.getOneInvest() == null || plan.getTwoInvest() == null || plan.getThreeInvest() == null || plan.getFourInvest() == null ||
|
|
|
+ plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 ||
|
|
|
+ plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0) {
|
|
|
+ vo2.setScheduleType(3);
|
|
|
+ } else {
|
|
|
+ if (plan.getOneInvest().compareTo(plan.getOneInvestFinish()) <= 0 &&
|
|
|
+ plan.getTwoInvest().compareTo(plan.getTwoInvestFinish()) <= 0 &&
|
|
|
+ plan.getThreeInvest().compareTo(plan.getThreeInvestFinish()) <= 0 &&
|
|
|
+ plan.getFourInvest().compareTo(plan.getFourInvestFinish()) <= 0 &&
|
|
|
+ plan.getOnePlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getThreePlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getFourPlanRatio().compareTo(new BigDecimal(100)) >= 0) {
|
|
|
+ vo2.setScheduleType(2);
|
|
|
+ } else if ((plan.getOneInvest().compareTo(plan.getOneInvestFinish()) == 0 &&
|
|
|
+ plan.getTwoInvest().compareTo(plan.getTwoInvestFinish()) == 0 &&
|
|
|
+ plan.getThreeInvest().compareTo(plan.getThreeInvestFinish()) == 0 &&
|
|
|
+ plan.getFourInvest().compareTo(plan.getFourInvestFinish()) == 0 &&
|
|
|
+ plan.getOnePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getThreePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getFourPlanRatio().compareTo(new BigDecimal(100)) == 0)) {
|
|
|
+ vo2.setScheduleType(1);
|
|
|
+ } else {
|
|
|
+ vo2.setScheduleType(3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //判断是否选择过项目进度类型,选择过,那么重新把集合赋值为筛选后的
|
|
|
+ Integer scheduleType = dto.getProjectScheduleType();
|
|
|
+ if (scheduleType != null && scheduleType != -1){
|
|
|
+ vo2s = vo2s.stream().filter(l->scheduleType.equals(l.getScheduleType())).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ vo.setProjectTotal(vo2s.size());
|
|
|
+ vo.setPlanAllMoney(vo2s.stream().map(l->l.getPlanAllMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setCurrentMoney(vo2s.stream().map(l->l.getCurrentMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ if (vo.getPlanAllMoney().compareTo(BigDecimal.ZERO) == 0){
|
|
|
+ vo.setInvestRatio(vo.getCurrentMoney());
|
|
|
+ }else {
|
|
|
+ vo.setInvestRatio(vo.getCurrentMoney().multiply(new BigDecimal(100)).divide(vo.getPlanAllMoney(),2,RoundingMode.UP));
|
|
|
+ }
|
|
|
+ vo.setTotal1((int) vo2s.stream().filter(l->l.getScheduleType() == 1).count());
|
|
|
+ vo.setTotal2((int) vo2s.stream().filter(l->l.getScheduleType() == 2).count());
|
|
|
+ vo.setTotal3((int) vo2s.stream().filter(l->l.getScheduleType() == 3).count());
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DataInvestStatVO dataInvestStat(DataStatDTO dto) {
|
|
|
+ Integer year = dto.getYear();
|
|
|
+ if (year == null){
|
|
|
+ throw new ServiceException("请选择年");
|
|
|
+ }
|
|
|
+ DataInvestStatVO vo = new DataInvestStatVO();
|
|
|
+ vo.setOneFinished(BigDecimal.ZERO);
|
|
|
+ vo.setOneUnFinished(BigDecimal.ZERO);
|
|
|
+ vo.setTwoFinished(BigDecimal.ZERO);
|
|
|
+ vo.setTwoUnFinished(BigDecimal.ZERO);
|
|
|
+ vo.setThreeFinished(BigDecimal.ZERO);
|
|
|
+ vo.setThreeUnFinished(BigDecimal.ZERO);
|
|
|
+ vo.setFourFinished(BigDecimal.ZERO);
|
|
|
+ vo.setFourUnFinished(BigDecimal.ZERO);
|
|
|
+ List<DataInvestStatVO2> vo2s = baseMapper.dataInvestStat(dto);
|
|
|
+ if (vo2s.size() == 0){
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+ List<ProjectInvestPlan> planList = investPlanService.list(new LambdaQueryWrapper<ProjectInvestPlan>()
|
|
|
+ .eq(ProjectInvestPlan::getPlanYear, year)
|
|
|
+ .in(ProjectInvestPlan::getProjectId, vo2s.stream().map(l -> l.getId()).collect(Collectors.toList())));
|
|
|
+ if (vo2s.size() != planList.size()){
|
|
|
+ throw new ServiceException("项目数据错误,请联系管理员");
|
|
|
+ }
|
|
|
+ Map<Long, ProjectInvestPlan> planMap = planList.stream().collect(Collectors.toMap(l -> l.getProjectId(), l -> l));
|
|
|
+ int[] quarters = {0,1,1,1,2,2,2,3,3,3,4,4,4};
|
|
|
+ Integer month = dto.getMonth();
|
|
|
+ for (DataInvestStatVO2 vo2 : vo2s) {
|
|
|
+ //获取当年计划
|
|
|
+ ProjectInvestPlan plan = planMap.get(vo2.getId());
|
|
|
+ //判断是否选择过月,选择过月则计划总投资为季度-实际完成投资为当月
|
|
|
+ if (month != null && month != -1){
|
|
|
if (quarters[month] == 1){
|
|
|
vo2.setPlanAllMoney(plan.getOneInvest() == null?BigDecimal.ZERO:plan.getOneInvest());
|
|
|
vo2.setCurrentMoney(plan.getOneInvestFinish() == null?BigDecimal.ZERO:plan.getOneInvestFinish());
|
|
|
+ vo2.setUnFinishedMoney(vo2.getPlanAllMoney().subtract(vo2.getCurrentMoney()));
|
|
|
}else if (quarters[month] == 2){
|
|
|
vo2.setPlanAllMoney(plan.getTwoInvest() == null?BigDecimal.ZERO:plan.getTwoInvest());
|
|
|
vo2.setCurrentMoney(plan.getTwoInvestFinish() == null?BigDecimal.ZERO:plan.getTwoInvestFinish());
|
|
|
+ vo2.setUnFinishedMoney(vo2.getPlanAllMoney().subtract(vo2.getCurrentMoney()));
|
|
|
}else if (quarters[month] == 3){
|
|
|
vo2.setPlanAllMoney(plan.getThreeInvest() == null?BigDecimal.ZERO:plan.getThreeInvest());
|
|
|
vo2.setCurrentMoney(plan.getThreeInvestFinish() == null?BigDecimal.ZERO:plan.getThreeInvestFinish());
|
|
|
+ vo2.setUnFinishedMoney(vo2.getPlanAllMoney().subtract(vo2.getCurrentMoney()));
|
|
|
}else {
|
|
|
vo2.setPlanAllMoney(plan.getFourInvest() == null?BigDecimal.ZERO:plan.getFourInvest());
|
|
|
vo2.setCurrentMoney(plan.getFourInvestFinish() == null?BigDecimal.ZERO:plan.getFourInvestFinish());
|
|
|
+ vo2.setUnFinishedMoney(vo2.getPlanAllMoney().subtract(vo2.getCurrentMoney()));
|
|
|
}
|
|
|
}else {
|
|
|
//没有选择过月计划总投资为年-实际完成投资为当年,
|
|
|
vo2.setPlanAllMoney(plan.getYearlyInvest() == null?BigDecimal.ZERO:plan.getYearlyInvest());
|
|
|
vo2.setCurrentMoney(plan.getYearFinishInvest() == null?BigDecimal.ZERO:plan.getYearFinishInvest());
|
|
|
+ vo2.setUnFinishedMoney(vo2.getPlanAllMoney().subtract(vo2.getCurrentMoney()));
|
|
|
}
|
|
|
+ //设置每个季度数据
|
|
|
+ vo2.setOneFinished(plan.getOneInvestFinish() == null?BigDecimal.ZERO:plan.getOneInvestFinish());
|
|
|
+ vo2.setOneUnFinished(plan.getOneInvest() == null?BigDecimal.ZERO:plan.getOneInvest().subtract(vo2.getOneFinished()));
|
|
|
+ vo2.setTwoFinished(plan.getTwoInvestFinish() == null?BigDecimal.ZERO:plan.getTwoInvestFinish());
|
|
|
+ vo2.setTwoUnFinished(plan.getTwoInvest() == null?BigDecimal.ZERO:plan.getTwoInvest().subtract(vo2.getTwoFinished()));
|
|
|
+ vo2.setThreeFinished(plan.getThreeInvestFinish() == null?BigDecimal.ZERO:plan.getThreeInvestFinish());
|
|
|
+ vo2.setThreeUnFinished(plan.getThreeInvest() == null?BigDecimal.ZERO:plan.getThreeInvest().subtract(vo2.getThreeFinished()));
|
|
|
+ vo2.setFourFinished(plan.getFourInvestFinish() == null?BigDecimal.ZERO:plan.getFourInvestFinish());
|
|
|
+ vo2.setFourUnFinished(plan.getFourInvest() == null?BigDecimal.ZERO:plan.getFourInvest().subtract(vo2.getFourFinished()));
|
|
|
//判断项目进程类型
|
|
|
- if (plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 ||
|
|
|
- plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 ){
|
|
|
+ if (plan.getOneInvest() == null || plan.getTwoInvest() == null || plan.getThreeInvest() == null || plan.getFourInvest() == null ||
|
|
|
+ plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 ||
|
|
|
+ plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0) {
|
|
|
vo2.setScheduleType(3);
|
|
|
- }else if (plan.getOneInvest().equals(plan.getOneInvestFinish()) && plan.getTwoInvest().equals(plan.getTwoInvestFinish()) &&
|
|
|
- plan.getThreeInvest().equals(plan.getThreeInvestFinish()) && plan.getFourInvest().equals(plan.getFourInvestFinish()) &&
|
|
|
- plan.getOnePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
- plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
- plan.getThreePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
- plan.getFourPlanRatio().compareTo(new BigDecimal(100)) == 0){
|
|
|
- vo2.setScheduleType(1);
|
|
|
+ } else {
|
|
|
+ if (plan.getOneInvest().compareTo(plan.getOneInvestFinish()) <= 0 &&
|
|
|
+ plan.getTwoInvest().compareTo(plan.getTwoInvestFinish()) <= 0 &&
|
|
|
+ plan.getThreeInvest().compareTo(plan.getThreeInvestFinish()) <= 0 &&
|
|
|
+ plan.getFourInvest().compareTo(plan.getFourInvestFinish()) <= 0 &&
|
|
|
+ plan.getOnePlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getThreePlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getFourPlanRatio().compareTo(new BigDecimal(100)) >= 0) {
|
|
|
+ vo2.setScheduleType(2);
|
|
|
+ } else if ((plan.getOneInvest().compareTo(plan.getOneInvestFinish()) == 0 &&
|
|
|
+ plan.getTwoInvest().compareTo(plan.getTwoInvestFinish()) == 0 &&
|
|
|
+ plan.getThreeInvest().compareTo(plan.getThreeInvestFinish()) == 0 &&
|
|
|
+ plan.getFourInvest().compareTo(plan.getFourInvestFinish()) == 0 &&
|
|
|
+ plan.getOnePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getThreePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getFourPlanRatio().compareTo(new BigDecimal(100)) == 0)) {
|
|
|
+ vo2.setScheduleType(1);
|
|
|
+ } else {
|
|
|
+ vo2.setScheduleType(3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //判断是否选择过项目进度类型,选择过,那么重新把集合赋值为筛选后的
|
|
|
+ Integer scheduleType = dto.getProjectScheduleType();
|
|
|
+ if (scheduleType != null && scheduleType != -1){
|
|
|
+ vo2s = vo2s.stream().filter(l->scheduleType.equals(l.getScheduleType())).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ //统计季度
|
|
|
+ vo.setOneFinished(vo2s.stream().map(l->l.getOneFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setOneUnFinished(vo2s.stream().map(l->l.getOneUnFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setTwoFinished(vo2s.stream().map(l->l.getTwoFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setTwoUnFinished(vo2s.stream().map(l->l.getTwoUnFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setThreeFinished(vo2s.stream().map(l->l.getThreeFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setThreeUnFinished(vo2s.stream().map(l->l.getThreeUnFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setFourFinished(vo2s.stream().map(l->l.getFourFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ vo.setFourUnFinished(vo2s.stream().map(l->l.getFourUnFinished()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ //统计项目阶段
|
|
|
+ List<DataInvestStatVO.InvestInfo> list = new ArrayList<>();
|
|
|
+ Map<Integer, List<DataInvestStatVO2>> map = vo2s.stream().collect(Collectors.groupingBy(DataInvestStatVO2::getProjectStage));
|
|
|
+ Set<Integer> stages = map.keySet();
|
|
|
+ ArrayList<Integer> stages2 = new ArrayList<>(stages);
|
|
|
+ Collections.sort(stages2);
|
|
|
+ for (Integer stage : stages2) {
|
|
|
+ //按照项目类型分组
|
|
|
+ Map<Integer, List<DataInvestStatVO2>> listMap = map.get(stage).stream().collect(Collectors.groupingBy(DataInvestStatVO2::getProjectType));
|
|
|
+ Set<Integer> types = listMap.keySet();
|
|
|
+ ArrayList<Integer> types2 = new ArrayList<>(types);
|
|
|
+ Collections.sort(types2);
|
|
|
+ for (Integer type : types2) {
|
|
|
+ List<DataInvestStatVO2> vo2List = listMap.get(type);
|
|
|
+ DataInvestStatVO.InvestInfo info = new DataInvestStatVO.InvestInfo();
|
|
|
+ info.setProjectStageName(vo2List.get(0).getProjectStageName());
|
|
|
+ info.setProjectTypeName(vo2List.get(0).getProjectTypeName());
|
|
|
+ info.setPlanAllMoney(vo2List.stream().map(l->l.getPlanAllMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ info.setCurrentMoney(vo2List.stream().map(l->l.getCurrentMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ info.setUnFinishedMoney(vo2List.stream().map(l->l.getUnFinishedMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
+ //走势图
|
|
|
+ Map<String,List<BigDecimal>> stringListMap = new HashMap<>();
|
|
|
+ List<BigDecimal> planInvest = new ArrayList<>();
|
|
|
+ List<BigDecimal> finishedInvest = new ArrayList<>();
|
|
|
+ List<BigDecimal> unFinishedInvest = new ArrayList<>();
|
|
|
+ BigDecimal one = BigDecimal.ZERO;
|
|
|
+ BigDecimal two = BigDecimal.ZERO;
|
|
|
+ BigDecimal three = BigDecimal.ZERO;
|
|
|
+ BigDecimal four = BigDecimal.ZERO;
|
|
|
+ BigDecimal one2 = BigDecimal.ZERO;
|
|
|
+ BigDecimal two2 = BigDecimal.ZERO;
|
|
|
+ BigDecimal three2 = BigDecimal.ZERO;
|
|
|
+ BigDecimal four2 = BigDecimal.ZERO;
|
|
|
+ BigDecimal one3 = BigDecimal.ZERO;
|
|
|
+ BigDecimal two3 = BigDecimal.ZERO;
|
|
|
+ BigDecimal three3 = BigDecimal.ZERO;
|
|
|
+ BigDecimal four3 = BigDecimal.ZERO;
|
|
|
+ for (DataInvestStatVO2 vo2 : vo2List) {
|
|
|
+ ProjectInvestPlan plan = planMap.get(vo2.getId());
|
|
|
+ if (plan.getOneInvest() != null){
|
|
|
+ one = one.add(plan.getOneInvest());
|
|
|
+ }
|
|
|
+ if (plan.getTwoInvest() != null){
|
|
|
+ two = two.add(plan.getTwoInvest());
|
|
|
+ }
|
|
|
+ if (plan.getThreeInvest() != null){
|
|
|
+ three = three.add(plan.getThreeInvest());
|
|
|
+ }
|
|
|
+ if (plan.getFourInvest() != null){
|
|
|
+ four = four.add(plan.getFourInvest());
|
|
|
+ }
|
|
|
+ one2 = one2.add(vo2.getOneFinished());
|
|
|
+ one3 = one3.add(vo2.getOneUnFinished());
|
|
|
+
|
|
|
+ two2 = two2.add(vo2.getTwoFinished());
|
|
|
+ two3 = two3.add(vo2.getTwoUnFinished());
|
|
|
+
|
|
|
+ three2 = three2.add(vo2.getThreeFinished());
|
|
|
+ three3 = three3.add(vo2.getThreeUnFinished());
|
|
|
+
|
|
|
+ four2 = four2.add(vo2.getFourFinished());
|
|
|
+ four3 = four3.add(vo2.getFourUnFinished());
|
|
|
+ }
|
|
|
+ planInvest.add(one);
|
|
|
+ planInvest.add(two);
|
|
|
+ planInvest.add(three);
|
|
|
+ planInvest.add(four);
|
|
|
+ finishedInvest.add(one2);
|
|
|
+ finishedInvest.add(two2);
|
|
|
+ finishedInvest.add(three2);
|
|
|
+ finishedInvest.add(four2);
|
|
|
+ unFinishedInvest.add(one3);
|
|
|
+ unFinishedInvest.add(two3);
|
|
|
+ unFinishedInvest.add(three3);
|
|
|
+ unFinishedInvest.add(four3);
|
|
|
+ //a计划b实际c未完成
|
|
|
+ stringListMap.put("a",planInvest);
|
|
|
+ stringListMap.put("b",finishedInvest);
|
|
|
+ stringListMap.put("c",unFinishedInvest);
|
|
|
+ info.setMap(stringListMap);
|
|
|
+ list.add(info);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vo.setList(list);
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public DataScheduleStatVO dataScheduleStat(DataStatDTO dto) {
|
|
|
+ Integer year = dto.getYear();
|
|
|
+ if (year == null){
|
|
|
+ throw new ServiceException("请选择年");
|
|
|
+ }
|
|
|
+ DataScheduleStatVO vo = new DataScheduleStatVO();
|
|
|
+ vo.setOneFinished(0);
|
|
|
+ vo.setOneUnFinished(0);
|
|
|
+ vo.setTwoFinished(0);
|
|
|
+ vo.setTwoUnFinished(0);
|
|
|
+ vo.setThreeFinished(0);
|
|
|
+ vo.setThreeUnFinished(0);
|
|
|
+ vo.setFourFinished(0);
|
|
|
+ vo.setFourUnFinished(0);
|
|
|
+ List<DataScheduleStatVO2> vo2s = baseMapper.dataScheduleStat(dto);
|
|
|
+ if (vo2s.size() == 0){
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+ List<ProjectInvestPlan> planList = investPlanService.list(new LambdaQueryWrapper<ProjectInvestPlan>()
|
|
|
+ .eq(ProjectInvestPlan::getPlanYear, year)
|
|
|
+ .in(ProjectInvestPlan::getProjectId, vo2s.stream().map(l -> l.getId()).collect(Collectors.toList())));
|
|
|
+ if (vo2s.size() != planList.size()){
|
|
|
+ throw new ServiceException("项目数据错误,请联系管理员");
|
|
|
+ }
|
|
|
+ Map<Long, ProjectInvestPlan> planMap = planList.stream().collect(Collectors.toMap(l -> l.getProjectId(), l -> l));
|
|
|
+ int[] quarters = {0,1,1,1,2,2,2,3,3,3,4,4,4};
|
|
|
+ Integer month = dto.getMonth();
|
|
|
+ for (DataScheduleStatVO2 vo2 : vo2s) {
|
|
|
+ //获取当年计划
|
|
|
+ ProjectInvestPlan plan = planMap.get(vo2.getId());
|
|
|
+ if (plan.getIsOnePlanFinish() == 0 || plan.getOnePlanRatio().compareTo(new BigDecimal(100)) < 0){
|
|
|
+ vo2.setIsOneFinished(0);
|
|
|
}else {
|
|
|
- vo2.setScheduleType(2);
|
|
|
+ vo2.setIsOneFinished(1);
|
|
|
+ }
|
|
|
+ if (plan.getIsTwoPlanFinish() == 0 || plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) < 0){
|
|
|
+ vo2.setIsTwoFinished(0);
|
|
|
+ }else {
|
|
|
+ vo2.setIsTwoFinished(1);
|
|
|
+ }
|
|
|
+ if (plan.getIsThreePlanFinish() == 0 || plan.getThreePlanRatio().compareTo(new BigDecimal(100)) < 0){
|
|
|
+ vo2.setIsThreeFinished(0);
|
|
|
+ }else {
|
|
|
+ vo2.setIsThreeFinished(1);
|
|
|
+ }
|
|
|
+ if (plan.getIsFourPlanFinish() == 0 || plan.getFourPlanRatio().compareTo(new BigDecimal(100)) < 0){
|
|
|
+ vo2.setIsFourFinished(0);
|
|
|
+ }else {
|
|
|
+ vo2.setIsFourFinished(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ //没有选择过月计划总投资为年-实际完成投资为当年
|
|
|
+ if (plan.getIsOnePlanFinish() == 0 || plan.getOnePlanRatio().compareTo(new BigDecimal(100)) < 0 ||
|
|
|
+ plan.getIsTwoPlanFinish() == 0 || plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) < 0 ||
|
|
|
+ plan.getIsThreePlanFinish() == 0 || plan.getThreePlanRatio().compareTo(new BigDecimal(100)) < 0 ||
|
|
|
+ plan.getIsFourPlanFinish() == 0 || plan.getFourPlanRatio().compareTo(new BigDecimal(100)) < 0
|
|
|
+ ){
|
|
|
+ vo2.setIsYearFinished(0);
|
|
|
+ }else {
|
|
|
+ vo2.setIsYearFinished(1);
|
|
|
+ }
|
|
|
+ //判断项目进程类型
|
|
|
+ if (plan.getOneInvest() == null || plan.getTwoInvest() == null || plan.getThreeInvest() == null || plan.getFourInvest() == null ||
|
|
|
+ plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 ||
|
|
|
+ plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0 || plan.getIsOneInvestFinish() == 0) {
|
|
|
+ vo2.setScheduleType(3);
|
|
|
+ } else {
|
|
|
+ if (plan.getOneInvest().compareTo(plan.getOneInvestFinish()) <= 0 &&
|
|
|
+ plan.getTwoInvest().compareTo(plan.getTwoInvestFinish()) <= 0 &&
|
|
|
+ plan.getThreeInvest().compareTo(plan.getThreeInvestFinish()) <= 0 &&
|
|
|
+ plan.getFourInvest().compareTo(plan.getFourInvestFinish()) <= 0 &&
|
|
|
+ plan.getOnePlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getThreePlanRatio().compareTo(new BigDecimal(100)) >= 0 &&
|
|
|
+ plan.getFourPlanRatio().compareTo(new BigDecimal(100)) >= 0) {
|
|
|
+ vo2.setScheduleType(2);
|
|
|
+ } else if ((plan.getOneInvest().compareTo(plan.getOneInvestFinish()) == 0 &&
|
|
|
+ plan.getTwoInvest().compareTo(plan.getTwoInvestFinish()) == 0 &&
|
|
|
+ plan.getThreeInvest().compareTo(plan.getThreeInvestFinish()) == 0 &&
|
|
|
+ plan.getFourInvest().compareTo(plan.getFourInvestFinish()) == 0 &&
|
|
|
+ plan.getOnePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getTwoPlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getThreePlanRatio().compareTo(new BigDecimal(100)) == 0 &&
|
|
|
+ plan.getFourPlanRatio().compareTo(new BigDecimal(100)) == 0)) {
|
|
|
+ vo2.setScheduleType(1);
|
|
|
+ } else {
|
|
|
+ vo2.setScheduleType(3);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
//判断是否选择过项目进度类型,选择过,那么重新把集合赋值为筛选后的
|
|
|
Integer scheduleType = dto.getProjectScheduleType();
|
|
|
- if (scheduleType != null){
|
|
|
+ if (scheduleType != null && scheduleType != -1){
|
|
|
vo2s = vo2s.stream().filter(l->scheduleType.equals(l.getScheduleType())).collect(Collectors.toList());
|
|
|
}
|
|
|
- vo.setProjectTotal(vo2s.size());
|
|
|
- vo.setPlanAllMoney(vo2s.stream().map(l->l.getPlanAllMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
- vo.setCurrentMoney(vo2s.stream().map(l->l.getCurrentMoney()).reduce(BigDecimal.ZERO,BigDecimal::add));
|
|
|
- if (vo.getPlanAllMoney().compareTo(BigDecimal.ZERO) == 0){
|
|
|
- vo.setInvestRatio(vo.getCurrentMoney());
|
|
|
- }else {
|
|
|
- vo.setInvestRatio(vo.getCurrentMoney().multiply(new BigDecimal(100)).divide(vo.getPlanAllMoney(),2,RoundingMode.UP));
|
|
|
+ //统计季度
|
|
|
+ vo.setOneFinished((int) vo2s.stream().filter(l->l.getIsOneFinished() == 1).count());
|
|
|
+ vo.setOneUnFinished((int) vo2s.stream().filter(l->l.getIsOneFinished() == 0).count());
|
|
|
+ vo.setTwoFinished((int) vo2s.stream().filter(l->l.getIsTwoFinished() == 1).count());
|
|
|
+ vo.setTwoUnFinished((int) vo2s.stream().filter(l->l.getIsTwoFinished() == 0).count());
|
|
|
+ vo.setThreeFinished((int) vo2s.stream().filter(l->l.getIsThreeFinished() == 1).count());
|
|
|
+ vo.setThreeUnFinished((int) vo2s.stream().filter(l->l.getIsThreeFinished() == 0).count());
|
|
|
+ vo.setFourFinished((int) vo2s.stream().filter(l->l.getIsFourFinished() == 1).count());
|
|
|
+ vo.setFourUnFinished((int) vo2s.stream().filter(l->l.getIsFourFinished() == 0).count());
|
|
|
+
|
|
|
+ //统计项目阶段
|
|
|
+ List<DataScheduleStatVO.ScheduleInfo> list = new ArrayList<>();
|
|
|
+ //按年
|
|
|
+ Map<Integer, List<DataScheduleStatVO2>> map = vo2s.stream().collect(Collectors.groupingBy(DataScheduleStatVO2::getProjectStage));
|
|
|
+ Set<Integer> stages = map.keySet();
|
|
|
+ ArrayList<Integer> stages2 = new ArrayList<>(stages);
|
|
|
+ Collections.sort(stages2);
|
|
|
+ for (Integer stage : stages2) {
|
|
|
+ //按照项目类型分组
|
|
|
+ Map<Integer, List<DataScheduleStatVO2>> listMap = map.get(stage).stream().collect(Collectors.groupingBy(DataScheduleStatVO2::getProjectType));
|
|
|
+ Set<Integer> types = listMap.keySet();
|
|
|
+ ArrayList<Integer> types2 = new ArrayList<>(types);
|
|
|
+ Collections.sort(types2);
|
|
|
+ for (Integer type : types2) {
|
|
|
+ List<DataScheduleStatVO2> vo2List = listMap.get(type);
|
|
|
+ DataScheduleStatVO.ScheduleInfo info = new DataScheduleStatVO.ScheduleInfo();
|
|
|
+ info.setProjectStageName(vo2List.get(0).getProjectStageName());
|
|
|
+ info.setProjectTypeName(vo2List.get(0).getProjectTypeName());
|
|
|
+ info.setProjectTotal(vo2List.size());
|
|
|
+ if (month != null && month != -1) {
|
|
|
+ if (quarters[month] == 1) {
|
|
|
+ info.setFinishedTotal((int) vo2List.stream().filter(l->l.getIsOneFinished() == 1).count());
|
|
|
+ info.setUnFinishedTotal((int) vo2List.stream().filter(l->l.getIsOneFinished() == 0).count());
|
|
|
+ } else if (quarters[month] == 2) {
|
|
|
+ info.setFinishedTotal((int) vo2List.stream().filter(l->l.getIsTwoFinished() == 1).count());
|
|
|
+ info.setUnFinishedTotal((int) vo2List.stream().filter(l->l.getIsTwoFinished() == 0).count());
|
|
|
+ } else if (quarters[month] == 3) {
|
|
|
+ info.setFinishedTotal((int) vo2List.stream().filter(l->l.getIsThreeFinished() == 1).count());
|
|
|
+ info.setUnFinishedTotal((int) vo2List.stream().filter(l->l.getIsThreeFinished() == 0).count());
|
|
|
+ } else {
|
|
|
+ info.setFinishedTotal((int) vo2List.stream().filter(l->l.getIsFourFinished() == 1).count());
|
|
|
+ info.setUnFinishedTotal((int) vo2List.stream().filter(l->l.getIsFourFinished() == 0).count());
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ info.setFinishedTotal((int) vo2List.stream().filter(l->l.getIsYearFinished() == 1).count());
|
|
|
+ info.setUnFinishedTotal((int) vo2List.stream().filter(l->l.getIsYearFinished() == 0).count());
|
|
|
+ }
|
|
|
+ list.add(info);
|
|
|
+ }
|
|
|
}
|
|
|
- vo.setTotal1((int) vo2s.stream().filter(l->l.getScheduleType() == 1).count());
|
|
|
- vo.setTotal2((int) vo2s.stream().filter(l->l.getScheduleType() == 2).count());
|
|
|
- vo.setTotal3((int) vo2s.stream().filter(l->l.getScheduleType() == 3).count());
|
|
|
+ vo.setList(list);
|
|
|
return vo;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public DataInvestStatVO dataInvestStat(DataStatDTO dto) {
|
|
|
- return null;
|
|
|
+ public String dataEndDate() {
|
|
|
+ LocalDate date = baseMapper.dataEndDate();
|
|
|
+ if (date == null){
|
|
|
+ return "暂无填写记录";
|
|
|
+ }else {
|
|
|
+ return date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void saveWarning(ProjectWarningDTO dto) {
|
|
|
+ //删除之前配置
|
|
|
+ baseMapper.deleteWarning();
|
|
|
+ //保存现在配置
|
|
|
+ List<ProjectWarning> list = dto.getList();
|
|
|
+ warningService.saveBatch(list);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ProjectWarningDTO detailWarning() {
|
|
|
+ ProjectWarningDTO dto = new ProjectWarningDTO();
|
|
|
+ List<ProjectWarning> list = warningService.list();
|
|
|
+ dto.setList(list);
|
|
|
+ return dto;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<pageWarningVO> pageWarning(pageWarningDTO dto) {
|
|
|
+ IPage<pageWarningVO> iPage = new Page<>(dto.getCurrent(),dto.getCurrent());
|
|
|
+ /*查询出所有数据,手动筛选,手动分页*/
|
|
|
+ //1 获取所有项目 所有年的计划
|
|
|
+ List<InvestPlanWarningVO> planList = baseMapper.getAllYearPlan();
|
|
|
+ //2 获取所有异常设置,如果没设置异常,则直接返回
|
|
|
+ List<ProjectWarning> list = warningService.list();
|
|
|
+ if (planList.size() == 0 || list.size() == 0){
|
|
|
+ return iPage;
|
|
|
+ }
|
|
|
+ Map<Integer, ProjectWarning> map = list.stream().collect(Collectors.toMap(l -> l.getWarningType(), l -> l));
|
|
|
+ ProjectWarning investWarning = map.get(1);
|
|
|
+ ProjectWarning planWarning = map.get(2);
|
|
|
+ if (investWarning == null || planWarning == null){
|
|
|
+ throw new ServiceException("获取异常配置错误");
|
|
|
+ }
|
|
|
+ //3 获取所有的撤销记录,按照项目id,异常类型,年份,季度 分组
|
|
|
+ List<RepealRecord> records = repealRecordService.list();
|
|
|
+ Map<RepealRecordVO, RepealRecord> recordMap = new HashMap<>();
|
|
|
+ try {
|
|
|
+ recordMap = records.stream().collect(Collectors.toMap(l -> new RepealRecordVO(l.getProjectId(), l.getPlanYear(), l.getPlanQuarter(), l.getPlanType()), l -> l));
|
|
|
+ }catch (Exception e){
|
|
|
+ throw new ServiceException("撤销记录数据异常");
|
|
|
+ }
|
|
|
+ //4 循环所有年计划
|
|
|
+ List<pageWarningVO> vos = new ArrayList<>();
|
|
|
+ for (InvestPlanWarningVO plan : planList) {
|
|
|
+ // 季度计划没有填写 和 实际完成没有填写 则不统计
|
|
|
+ if (plan.getOneInvest() != null && plan.getIsOneInvestFinish() == 1){
|
|
|
+ // 填写了则每个季度直接对比数值,从1到3
|
|
|
+ if (investWarning.getOneOne() != null && plan.getOneInvestRatio().compareTo(investWarning.getOneOne()) == -1){
|
|
|
+ pageWarningVO vo = new pageWarningVO(plan.getProjectId(),plan.getProjectName(),1,"项目投资异常",1,"第一季度",LocalDate.of(2022, 4, 1),1,"一级");
|
|
|
+ //判断是否撤销
|
|
|
+ RepealRecord record = recordMap.get(new RepealRecordVO(plan.getProjectId(), plan.getPlanYear(), 1, 1));
|
|
|
+ // 如果异常则添加到异常集合中,添加前判断是否撤销
|
|
|
+ if (record != null){
|
|
|
+ vo.setIsRepeal("是");
|
|
|
+ vo.setRepealStartDate(record.getStartDate());
|
|
|
+ vo.setRepealEndDate(record.getEndDate());
|
|
|
+ }
|
|
|
+ vos.add(vo);
|
|
|
+ }else if (investWarning.getOneTwo() != null && plan.getOneInvestRatio().compareTo(investWarning.getOneTwo()) == -1){
|
|
|
+ pageWarningVO vo = new pageWarningVO(plan.getProjectId(),plan.getProjectName(),1,"项目投资异常",1,"第一季度",LocalDate.of(2022, 4, 1),2,"二级");
|
|
|
+ //判断是否撤销
|
|
|
+ RepealRecord record = recordMap.get(new RepealRecordVO(plan.getProjectId(), plan.getPlanYear(), 1, 1));
|
|
|
+ // 如果异常则添加到异常集合中,添加前判断是否撤销
|
|
|
+ if (record != null){
|
|
|
+ vo.setIsRepeal("是");
|
|
|
+ vo.setRepealStartDate(record.getStartDate());
|
|
|
+ vo.setRepealEndDate(record.getEndDate());
|
|
|
+ }
|
|
|
+ vos.add(vo);
|
|
|
+ }else if (investWarning.getOneThree() != null && plan.getOneInvestRatio().compareTo(investWarning.getOneThree()) == -1){
|
|
|
+ pageWarningVO vo = new pageWarningVO(plan.getProjectId(),plan.getProjectName(),1,"项目投资异常",1,"第一季度",LocalDate.of(2022, 4, 1),3,"三级");
|
|
|
+ //判断是否撤销
|
|
|
+ RepealRecord record = recordMap.get(new RepealRecordVO(plan.getProjectId(), plan.getPlanYear(), 1, 1));
|
|
|
+ // 如果异常则添加到异常集合中,添加前判断是否撤销
|
|
|
+ if (record != null){
|
|
|
+ vo.setIsRepeal("是");
|
|
|
+ vo.setRepealStartDate(record.getStartDate());
|
|
|
+ vo.setRepealEndDate(record.getEndDate());
|
|
|
+ }
|
|
|
+ vos.add(vo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //5 异常集合先按照搜索条件过滤,再手动分组
|
|
|
+
|
|
|
+ return iPage;
|
|
|
}
|
|
|
+
|
|
|
}
|