|
@@ -354,7 +354,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
}
|
|
|
//没有子计划,则计算父计划成本是否超过测算,如果计划没有完成,有选择日期,有员工支出,则判断
|
|
|
if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null){
|
|
|
- if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()) {
|
|
|
+ if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue()) {
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+"天)");
|
|
|
}
|
|
@@ -914,7 +914,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
}
|
|
|
}
|
|
|
if (total.compareTo(new BigDecimal(0)) != 0) {
|
|
|
- ratios.add(finished.divide(total, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
|
|
|
+ ratios.add(finished.divide(total, 2,RoundingMode.HALF_UP).multiply(new BigDecimal(100)).intValue());
|
|
|
} else {
|
|
|
ratios.add(0);
|
|
|
}
|
|
@@ -1009,8 +1009,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(vo2.getPlanStartTime(), vo2.getPlanEndTime())));
|
|
|
}
|
|
|
}
|
|
|
- if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()){
|
|
|
- vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+")天");
|
|
|
+ if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue()){
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue())+")天");
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
}else {
|
|
|
vo2.setTaskFinishedStatus(0);
|
|
@@ -1096,9 +1096,9 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
}
|
|
|
//计算是否超过预算
|
|
|
if (vo2.getTaskFinishedStatus() == null || vo2.getTaskFinishedStatus() != 2) {
|
|
|
- if (workDays.intValue() > vo2.getBudgetDays().intValue()) {
|
|
|
+ if (workDays.intValue() > vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue()) {
|
|
|
vo2.setTaskFinishedStatus(1);
|
|
|
- vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (workDays.intValue() - vo2.getBudgetDays().intValue()) + "天)");
|
|
|
+ vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (workDays.intValue() - vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue()) + "天)");
|
|
|
} else {
|
|
|
vo2.setTaskFinishedStatus(null);
|
|
|
}
|
|
@@ -1210,11 +1210,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 获取所有项目截至当前的维护支出
|
|
|
+ * 根据年份获取所有项目的维护支出
|
|
|
* @return
|
|
|
*/
|
|
|
@Override
|
|
|
- public BigDecimal getAllMaintainCost() {
|
|
|
+ public BigDecimal getAllMaintainCost(int year) {
|
|
|
//获取所有已分配任务人的维护支出,如果没有返回0
|
|
|
List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
|
|
|
if (plans != null && plans.size() > 0) {
|
|
@@ -1232,12 +1232,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
|
|
|
.collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
|
|
|
//查询出所有项目
|
|
|
- List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, bab));
|
|
|
+ List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
|
|
|
//通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
- List<ControlContractInfo> contractList = contractService.list(
|
|
|
- new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId, budgetMap.keySet()));
|
|
|
- if (contractList == null || projectInfos.size() != contractList.size()){
|
|
|
- throw new ServiceException("项目没有合同,无法计算维护支出");
|
|
|
+ List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
|
|
|
+ if (contractList == null || contractList.size() <= 0){
|
|
|
+ return new BigDecimal(0);
|
|
|
}
|
|
|
//把合同根据项目分组
|
|
|
Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
|
|
@@ -1246,6 +1245,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
BigDecimal count = new BigDecimal(0);
|
|
|
//循环项目,
|
|
|
for (ControlProjectInfo info : projectInfos) {
|
|
|
+ List<ControlContractInfo> infos = contractMap.get(info.getId());
|
|
|
+ if (infos == null || infos.size() == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
//获取合同时间,获取多少个月
|
|
|
ControlContractInfo contract = contractMap.get(info.getId()).get(0);
|
|
|
LocalDate startTime = contract.getStartTime();
|
|
@@ -1262,14 +1265,59 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
continue;
|
|
|
}
|
|
|
//获得每个月的维护费
|
|
|
- BigDecimal scale = big.divide(new BigDecimal(months)).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal scale = big.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
// 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
// throw new ServiceException("合同开始时间超过当前时间,无法计算维护支出");
|
|
|
continue;
|
|
|
}
|
|
|
- int thisYears = LocalDate.now().getYear() - startTime.getYear();
|
|
|
- int thisMonths = thisYears * 12 + (LocalDate.now().getYear()- startTime.getMonthValue()) + 1;
|
|
|
+ int startMonth = 0;
|
|
|
+ int endMonth = 0;
|
|
|
+ //判断是否查询今年
|
|
|
+ if (LocalDate.now().getYear() == year){
|
|
|
+ //如果合同开始日期大于今年,则开始时间从一月算起
|
|
|
+ if (startTime.getYear() < year){
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始日期比今天要大,则不计算维护费
|
|
|
+ if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
|
|
|
+ continue;
|
|
|
+ }else {
|
|
|
+ //开始日期比今天小,从开始日期开始计算
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
+ endMonth = LocalDate.now().getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //不是今年
|
|
|
+ if (startTime.getYear() > year){
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始月比1月要大,则用开始日期
|
|
|
+ if (startTime.getMonthValue() > 1){
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ //开始月比1或者等于1,从1开始计算
|
|
|
+ startMonth = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间
|
|
|
+ if (endTime.getYear() > year){
|
|
|
+ endMonth = 12;
|
|
|
+ }else {
|
|
|
+ if (endTime.getMonthValue() < 12) {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = 12;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ int thisMonths = endMonth - startMonth + 1;
|
|
|
BigDecimal multiply = scale.multiply(new BigDecimal(thisMonths));
|
|
|
count = count.add(multiply);
|
|
|
}
|
|
@@ -1278,6 +1326,326 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
return new BigDecimal(0);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取所有项目的维护支出
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public BigDecimal getAllMaintainCost2() {
|
|
|
+ //获取所有已分配任务人的维护支出,如果没有返回0
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
+ bab.add(plan.getId());
|
|
|
+ } else {
|
|
|
+ bab.add(plan.getParentId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //查询出所有维护计划,根据项目id分组
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
+ Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
|
|
|
+ //查询出所有项目
|
|
|
+ List<ControlProjectInfo> projectInfos = infoMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
+ List<ControlContractInfo> contractList = contractService.list(
|
|
|
+ new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId,budgetMap.keySet()));
|
|
|
+ if (contractList == null || contractList.size() <= 0){
|
|
|
+ return new BigDecimal(0);
|
|
|
+ }
|
|
|
+ //把合同根据项目分组
|
|
|
+ Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
|
|
|
+ //新建总金额字段
|
|
|
+ BigDecimal count = new BigDecimal(0);
|
|
|
+ //循环项目,
|
|
|
+ for (ControlProjectInfo info : projectInfos) {
|
|
|
+ List<ControlContractInfo> infos = contractMap.get(info.getId());
|
|
|
+ if (infos == null || infos.size() == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
+ ControlContractInfo contract = contractMap.get(info.getId()).get(0);
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
+ List<ProjectCostBudget> list = budgetMap.get(info.getId());
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ for (ProjectCostBudget l : list) {
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获得每个月的维护费
|
|
|
+ BigDecimal scale = big.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
+// throw new ServiceException("合同开始时间超过当前时间,无法计算维护支出");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //如果合同结束时间比当前大,就用当前时间
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
+ endTime = LocalDate.now();
|
|
|
+ }
|
|
|
+ int year = LocalDate.now().getYear() - startTime.getYear();
|
|
|
+ int month = year * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ BigDecimal multiply = scale.multiply(new BigDecimal(month));
|
|
|
+ count = count.add(multiply);
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+ return new BigDecimal(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * //获取所有项目截至当年的维护支出,分月返回
|
|
|
+ * @param year
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<Long,List<BigDecimal>> getAllMaintainCost3(int year) {
|
|
|
+ //获取所有已分配任务人的维护支出,如果没有返回0
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
+ bab.add(plan.getId());
|
|
|
+ } else {
|
|
|
+ bab.add(plan.getParentId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //查询出所有维护计划,根据项目id分组
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
+ Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
|
|
|
+ //查询出所有项目
|
|
|
+ List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
+ List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
|
|
|
+ if (contractList == null || contractList.size() <= 0){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //把合同根据项目分组
|
|
|
+ Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
|
|
|
+ //返回结果
|
|
|
+ Map<Long,List<BigDecimal>> map = new HashMap<>();
|
|
|
+ //循环项目,
|
|
|
+ for (ControlProjectInfo info : projectInfos) {
|
|
|
+ List<ControlContractInfo> infos = contractMap.get(info.getId());
|
|
|
+ if (infos == null || infos.size() == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
+ ControlContractInfo contract = contractMap.get(info.getId()).get(0);
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
+ List<ProjectCostBudget> list = budgetMap.get(info.getId());
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ for (ProjectCostBudget l : list) {
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获得每个月的维护费
|
|
|
+ BigDecimal scale = big.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int startMonth = 0;
|
|
|
+ int endMonth = 0;
|
|
|
+ //判断是否查询今年
|
|
|
+ if (LocalDate.now().getYear() == year){
|
|
|
+ //如果合同开始日期大于今年,则开始时间从一月算起
|
|
|
+ if (startTime.getYear() < year){
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始日期比今天要大,则不计算维护费
|
|
|
+ if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
|
|
|
+ continue;
|
|
|
+ }else {
|
|
|
+ //开始日期比今天小,从开始日期开始计算
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
+ endMonth = LocalDate.now().getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //不是今年
|
|
|
+ if (startTime.getYear() > year){
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始月比1月要大,则用开始日期
|
|
|
+ if (startTime.getMonthValue() > 1){
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ //开始月比1或者等于1,从1开始计算
|
|
|
+ startMonth = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间
|
|
|
+ if (endTime.getYear() > year){
|
|
|
+ endMonth = 12;
|
|
|
+ }else {
|
|
|
+ if (endTime.getMonthValue() < 12) {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = 12;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //为项目设置值
|
|
|
+ List<BigDecimal> decimalList = new ArrayList<>();
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
+ if (i >= startMonth && i <= endMonth){
|
|
|
+ decimalList.add(scale);
|
|
|
+ }else {
|
|
|
+ decimalList.add(new BigDecimal(0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ map.put(info.getId(),decimalList);
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * //获取所有项目截至当年的维护支出,按年返回
|
|
|
+ * @param year
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<Long, BigDecimal> getAllMaintainCost4(int year) {
|
|
|
+ //获取所有已分配任务人的维护支出,如果没有返回0
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
+ bab.add(plan.getId());
|
|
|
+ } else {
|
|
|
+ bab.add(plan.getParentId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //查询出所有维护计划,根据项目id分组
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
+ Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
|
|
|
+ //查询出所有项目
|
|
|
+ List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
+ List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
|
|
|
+ if (contractList == null || contractList.size() <= 0){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //把合同根据项目分组
|
|
|
+ Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
|
|
|
+ //返回结果
|
|
|
+ Map<Long,BigDecimal> map = new HashMap<>();
|
|
|
+ //循环项目,
|
|
|
+ for (ControlProjectInfo info : projectInfos) {
|
|
|
+ List<ControlContractInfo> infos = contractMap.get(info.getId());
|
|
|
+ if (infos == null || infos.size() == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
+ ControlContractInfo contract = contractMap.get(info.getId()).get(0);
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
+ List<ProjectCostBudget> list = budgetMap.get(info.getId());
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ for (ProjectCostBudget l : list) {
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获得每个月的维护费
|
|
|
+ BigDecimal scale = big.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int startMonth = 0;
|
|
|
+ int endMonth = 0;
|
|
|
+ //判断是否查询今年
|
|
|
+ if (LocalDate.now().getYear() == year){
|
|
|
+ //如果合同开始日期大于今年,则开始时间从一月算起
|
|
|
+ if (startTime.getYear() < year){
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始日期比今天要大,则不计算维护费
|
|
|
+ if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
|
|
|
+ continue;
|
|
|
+ }else {
|
|
|
+ //开始日期比今天小,从开始日期开始计算
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
+ endMonth = LocalDate.now().getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //不是今年
|
|
|
+ if (startTime.getYear() > year){
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始月比1月要大,则用开始日期
|
|
|
+ if (startTime.getMonthValue() > 1){
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ //开始月比1或者等于1,从1开始计算
|
|
|
+ startMonth = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间
|
|
|
+ if (endTime.getYear() > year){
|
|
|
+ endMonth = 12;
|
|
|
+ }else {
|
|
|
+ if (endTime.getMonthValue() < 12) {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = 12;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //为项目设置值
|
|
|
+ int thisMonths = endMonth - startMonth + 1;
|
|
|
+ BigDecimal multiply = scale.multiply(new BigDecimal(thisMonths));
|
|
|
+ map.put(info.getId(),multiply);
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 统计一行的几个总金额
|
|
|
*/
|