|
@@ -18,6 +18,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.rmi.ServerException;
|
|
|
import java.time.LocalDate;
|
|
|
import java.util.*;
|
|
@@ -1163,11 +1164,95 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
|
|
|
List<ProjectCostBudget> allPlan = budgetService.getAllPlanByYear(y);
|
|
|
Boolean isBudget = true;
|
|
|
Map<Integer, List<ProjectCostBudget>> allPlanMap = new HashMap<>();
|
|
|
+ Boolean isOtherBudget = true;
|
|
|
+ Map<Integer, List<ProjectCostBudget>> otherBudgetMap = new HashMap<>();
|
|
|
if (allPlan != null && allPlan.size() > 0){
|
|
|
+ List<ProjectCostBudget> parentList = new ArrayList<>();
|
|
|
//如果不为空,根据costType分组
|
|
|
allPlanMap = allPlan.parallelStream()
|
|
|
.collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
|
|
|
- //分解出父计划和子计划,需要用父计划其他预算支出
|
|
|
+ //所有父计划id
|
|
|
+ Set<Long> parentIds = new HashSet<>();
|
|
|
+ Set<Long> longs = allPlan.stream().filter(l -> l.getParentId() == 0).map(ProjectCostBudget::getId).collect(Collectors.toSet());
|
|
|
+ Set<Long> longs2 = allPlan.stream().filter(l -> l.getParentId() > 0).map(ProjectCostBudget::getParentId).collect(Collectors.toSet());
|
|
|
+ parentIds.addAll(longs);
|
|
|
+ parentIds.addAll(longs2);
|
|
|
+ parentList = budgetService.listByIds(parentIds);
|
|
|
+ Map<Long, List<ProjectCostBudget>> map = allPlan.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getParentId));
|
|
|
+ parentList = parentList.stream().filter(l->l.getBudgetCountMoney().subtract(l.getBudgetStaffCost()).intValue() != 0).collect(Collectors.toList());
|
|
|
+ if (parentList != null && parentList.size() > 0) {
|
|
|
+ //循环父计划,统计子计划
|
|
|
+ for (ProjectCostBudget budget : parentList) {
|
|
|
+ BigDecimal noStaffCost = budget.getBudgetCountMoney().subtract(budget.getBudgetStaffCost());
|
|
|
+ //有子计划直接设置
|
|
|
+ if (map.get(budget.getId()) != null && map.get(budget.getId()).size() > 0) {
|
|
|
+ List<ProjectCostBudget> budgetList = map.get(budget.getId());
|
|
|
+ //有子计划才设置,没子计划证明有值
|
|
|
+ //最小计划开始时间
|
|
|
+ LocalDate start = LocalDate.MAX;
|
|
|
+ //最大计划开始时间
|
|
|
+ LocalDate end = LocalDate.MIN;
|
|
|
+ //总天数
|
|
|
+ BigDecimal total = new BigDecimal(0);
|
|
|
+ //开始月工作日
|
|
|
+ BigDecimal startDays = new BigDecimal(0);
|
|
|
+ //结束月工作日
|
|
|
+ BigDecimal endDays = new BigDecimal(0);
|
|
|
+ for (ProjectCostBudget costBudget : budgetList) {
|
|
|
+ if (costBudget.getPlanStartTime().isBefore(start)) {
|
|
|
+ start = costBudget.getPlanStartTime();
|
|
|
+ }
|
|
|
+ if (costBudget.getPlanEndTime().isAfter(end)) {
|
|
|
+ end = costBudget.getPlanEndTime();
|
|
|
+ }
|
|
|
+ total = total.add(costBudget.getPlanDays());
|
|
|
+ if (costBudget.getPlanIsTwoMonth() == 0) {
|
|
|
+ //如果开始时间和最小计划时间是一个月,则直接算入开始工作日
|
|
|
+ if (start.getMonthValue() == costBudget.getPlanStartTime().getMonthValue()) {
|
|
|
+ startDays = startDays.add(costBudget.getPlanDays());
|
|
|
+ } else {
|
|
|
+ //开始时间和最小计划时间不是一个月,算入结束工作日
|
|
|
+ endDays = endDays.add(costBudget.getPlanDays());
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ startDays = startDays.add(costBudget.getPlanStartMonthDays());
|
|
|
+ endDays = endDays.add(costBudget.getPlanEndMonthDays());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ budget.setPlanStartTime(start);
|
|
|
+ budget.setPlanEndTime(end);
|
|
|
+ budget.setPlanDays(total);
|
|
|
+ //如果没跨月
|
|
|
+ if (start.getMonthValue() == end.getMonthValue()) {
|
|
|
+ budget.setPlanIsTwoMonth(0);
|
|
|
+ budget.setPlanStartMoney(noStaffCost);
|
|
|
+ } else {
|
|
|
+ //跨月
|
|
|
+ budget.setPlanIsTwoMonth(1);
|
|
|
+ BigDecimal decimal = startDays.divide(total, 2, BigDecimal.ROUND_HALF_UP).multiply(noStaffCost).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ budget.setPlanStartMoney(decimal);
|
|
|
+ budget.setPlanEndMoney(noStaffCost.subtract(decimal));
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //没有子计划如果没有跨月则直接把其他支出放入startMoney
|
|
|
+ if (budget.getPlanIsTwoMonth() == 0){
|
|
|
+ budget.setPlanStartMoney(noStaffCost);
|
|
|
+ }else {
|
|
|
+ BigDecimal decimal = budget.getPlanStartMonthDays().divide(budget.getPlanDays(), 2, BigDecimal.ROUND_HALF_UP).multiply(noStaffCost).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ budget.setPlanStartMoney(decimal);
|
|
|
+ budget.setPlanEndMoney(noStaffCost.subtract(decimal));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //根据部门分组
|
|
|
+ otherBudgetMap = parentList.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
|
|
|
+ }else {
|
|
|
+ isOtherBudget = false;
|
|
|
+ }
|
|
|
|
|
|
}else {
|
|
|
isBudget = false;
|
|
@@ -1258,6 +1343,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
|
|
|
}else {
|
|
|
vo.setBudget1(new BigDecimal(0));
|
|
|
}
|
|
|
+ //其他预算金额
|
|
|
+ if (isBudget && isOtherBudget && otherBudgetMap.get(1) != null && otherBudgetMap.get(1).size() > 0){
|
|
|
+ List<ProjectCostBudget> b1 = otherBudgetMap.get(1);
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ //循环市场部每一个预算
|
|
|
+ for (ProjectCostBudget budget : b1) {
|
|
|
+ //如果开始时间或结束时间是当月,则添加预算
|
|
|
+ if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
|
|
|
+ || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
|
|
|
+ //如果开始时间和结束时间的月相同,则直接用总预算
|
|
|
+ if (budget.getPlanIsTwoMonth() == 0) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //如果开始月是当前月,则直接使用开始金额
|
|
|
+ if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //结束月是当前月,使用结束金额
|
|
|
+ big = big.add(budget.getPlanEndMoney());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vo.setBudget1(vo.getBudget1().add(big));
|
|
|
+ c1 = c1.add(big);
|
|
|
+ }
|
|
|
+
|
|
|
if (isFinished){
|
|
|
List<ProjectCostBudget> d1 = finishedMap.get(1);
|
|
|
if (d1 != null && d1.size() > 0){
|
|
@@ -1337,6 +1449,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
|
|
|
}else {
|
|
|
vo.setBudget2(new BigDecimal(0));
|
|
|
}
|
|
|
+ //其他预算金额
|
|
|
+ if (isBudget && isOtherBudget && otherBudgetMap.get(2) != null && otherBudgetMap.get(2).size() > 0){
|
|
|
+ List<ProjectCostBudget> b1 = otherBudgetMap.get(2);
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ //循环市场部每一个预算
|
|
|
+ for (ProjectCostBudget budget : b1) {
|
|
|
+ //如果开始时间或结束时间是当月,则添加预算
|
|
|
+ if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
|
|
|
+ || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
|
|
|
+ //如果开始时间和结束时间的月相同,则直接用总预算
|
|
|
+ if (budget.getPlanIsTwoMonth() == 0) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //如果开始月是当前月,则直接使用开始金额
|
|
|
+ if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //结束月是当前月,使用结束金额
|
|
|
+ big = big.add(budget.getPlanEndMoney());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vo.setBudget2(vo.getBudget2().add(big));
|
|
|
+ c3 = c3.add(big);
|
|
|
+ }
|
|
|
+
|
|
|
if (isFinished){
|
|
|
List<ProjectCostBudget> d2 = finishedMap.get(2);
|
|
|
if (d2 != null && d2.size() > 0){
|
|
@@ -1417,6 +1556,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
|
|
|
}else {
|
|
|
vo.setBudget3(new BigDecimal(0));
|
|
|
}
|
|
|
+ //其他预算金额
|
|
|
+ if (isBudget && isOtherBudget && otherBudgetMap.get(3) != null && otherBudgetMap.get(3).size() > 0){
|
|
|
+ List<ProjectCostBudget> b1 = otherBudgetMap.get(3);
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ //循环市场部每一个预算
|
|
|
+ for (ProjectCostBudget budget : b1) {
|
|
|
+ //如果开始时间或结束时间是当月,则添加预算
|
|
|
+ if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
|
|
|
+ || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
|
|
|
+ //如果开始时间和结束时间的月相同,则直接用总预算
|
|
|
+ if (budget.getPlanIsTwoMonth() == 0) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //如果开始月是当前月,则直接使用开始金额
|
|
|
+ if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //结束月是当前月,使用结束金额
|
|
|
+ big = big.add(budget.getPlanEndMoney());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vo.setBudget3(vo.getBudget3().add(big));
|
|
|
+ c5 = c5.add(big);
|
|
|
+ }
|
|
|
+
|
|
|
if (isFinished){
|
|
|
List<ProjectCostBudget> d3 = finishedMap.get(3);
|
|
|
if (d3 != null && d3.size() > 0){
|
|
@@ -1497,6 +1663,33 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
|
|
|
}else {
|
|
|
vo.setBudget4(new BigDecimal(0));
|
|
|
}
|
|
|
+ //其他预算金额
|
|
|
+ if (isBudget && isOtherBudget && otherBudgetMap.get(4) != null && otherBudgetMap.get(4).size() > 0){
|
|
|
+ List<ProjectCostBudget> b1 = otherBudgetMap.get(4);
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ //循环市场部每一个预算
|
|
|
+ for (ProjectCostBudget budget : b1) {
|
|
|
+ //如果开始时间或结束时间是当月,则添加预算
|
|
|
+ if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
|
|
|
+ || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
|
|
|
+ //如果开始时间和结束时间的月相同,则直接用总预算
|
|
|
+ if (budget.getPlanIsTwoMonth() == 0) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //如果开始月是当前月,则直接使用开始金额
|
|
|
+ if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //结束月是当前月,使用结束金额
|
|
|
+ big = big.add(budget.getPlanEndMoney());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vo.setBudget4(vo.getBudget4().add(big));
|
|
|
+ c7 = c7.add(big);
|
|
|
+ }
|
|
|
+
|
|
|
if (isFinished){
|
|
|
List<ProjectCostBudget> d4 = finishedMap.get(4);
|
|
|
if (d4 != null && d4.size() > 0){
|
|
@@ -1574,6 +1767,32 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ //其他预算金额
|
|
|
+ if (isBudget && isOtherBudget && otherBudgetMap.get(5) != null && otherBudgetMap.get(5).size() > 0){
|
|
|
+ List<ProjectCostBudget> b1 = otherBudgetMap.get(5);
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ //循环市场部每一个预算
|
|
|
+ for (ProjectCostBudget budget : b1) {
|
|
|
+ //如果开始时间或结束时间是当月,则添加预算
|
|
|
+ if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
|
|
|
+ || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
|
|
|
+ //如果开始时间和结束时间的月相同,则直接用总预算
|
|
|
+ if (budget.getPlanIsTwoMonth() == 0) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //如果开始月是当前月,则直接使用开始金额
|
|
|
+ if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //结束月是当前月,使用结束金额
|
|
|
+ big = big.add(budget.getPlanEndMoney());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ big1 = big.add(big);
|
|
|
+ }
|
|
|
+
|
|
|
if (isFinished){
|
|
|
List<ProjectCostBudget> d5 = finishedMap.get(5);
|
|
|
if (d5 != null && d5.size() > 0){
|
|
@@ -1620,6 +1839,32 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ //其他预算金额
|
|
|
+ if (isBudget && isOtherBudget && otherBudgetMap.get(6) != null && otherBudgetMap.get(6).size() > 0){
|
|
|
+ List<ProjectCostBudget> b1 = otherBudgetMap.get(6);
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
+ //循环市场部每一个预算
|
|
|
+ for (ProjectCostBudget budget : b1) {
|
|
|
+ //如果开始时间或结束时间是当月,则添加预算
|
|
|
+ if ((budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y)
|
|
|
+ || (budget.getPlanEndTime().getMonthValue() == (i + 1) && budget.getPlanEndTime().getYear() == y)) {
|
|
|
+ //如果开始时间和结束时间的月相同,则直接用总预算
|
|
|
+ if (budget.getPlanIsTwoMonth() == 0) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //如果开始月是当前月,则直接使用开始金额
|
|
|
+ if (budget.getPlanStartTime().getMonthValue() == (i + 1) && budget.getPlanStartTime().getYear() == y) {
|
|
|
+ big = big.add(budget.getPlanStartMoney());
|
|
|
+ } else {
|
|
|
+ //结束月是当前月,使用结束金额
|
|
|
+ big = big.add(budget.getPlanEndMoney());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ big1 = big.add(big);
|
|
|
+ }
|
|
|
+
|
|
|
if (isFinished){
|
|
|
List<ProjectCostBudget> d6 = finishedMap.get(6);
|
|
|
if (d6 != null && d6.size() > 0){
|