|
@@ -55,6 +55,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
private final WorkDateInfoMapper dateInfoMapper;
|
|
|
|
|
|
+ private final IEmployeeTaskInfoService employeeTaskInfoService;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 批量新增或修改预算
|
|
@@ -480,14 +482,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
for (ProjectCostBudgetVO2 vo2 : list) {
|
|
|
List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
|
|
|
if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
|
|
|
-// //是否跨月
|
|
|
-// Boolean isTwoMonth = false;
|
|
|
-// //总计划天数
|
|
|
-// BigDecimal totalDays = new BigDecimal(0);
|
|
|
-// //子计划开始月计划总天数
|
|
|
-// BigDecimal startTotalDays = new BigDecimal(0);
|
|
|
-// //子计划结束月计划总天数
|
|
|
-// BigDecimal endTotalDays = new BigDecimal(0);
|
|
|
+ //选出正在进行中的子计划id
|
|
|
+ List<Long> ids = vo2ChildrenList.stream().filter(l -> l.getStatus() != null && l.getStatus() != 1).map(ProjectCostBudgetVO2::getId).collect(Collectors.toList());
|
|
|
+ //清空除进行中之外的子计划的 员工任务信息表
|
|
|
+ employeeTaskInfoService.deleteByBudgetParentId(ids,vo2.getId());
|
|
|
for (ProjectCostBudget budget : vo2ChildrenList) {
|
|
|
//如果计划正在进行中或者已经完成,则跳过
|
|
|
if (budget.getStatus() != null && budget.getStatus() != 1){
|
|
@@ -506,12 +504,43 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
budget.setProjectProcess(vo2.getProjectProcess());
|
|
|
budget.setTaskDetail(vo2.getTaskDetail());
|
|
|
budget.setPostType(vo2.getPostType());
|
|
|
- //设置主计划总天数
|
|
|
-// totalDays = totalDays.add(budget.getPlanDays());
|
|
|
+
|
|
|
+ //先删除任务计划表中的信息
|
|
|
+ if (budget.getId() == null){
|
|
|
+ budget.setId(SnowFlakeUtil.getId());
|
|
|
+ }
|
|
|
+
|
|
|
//只计算固定计划的人工成本
|
|
|
if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
|
|
|
+ LocalDate startTime = budget.getPlanStartTime();
|
|
|
+ LocalDate endTime = budget.getPlanEndTime();
|
|
|
+ List<EmployeeTaskInfo> infoList = new ArrayList<>();
|
|
|
+ //获取岗位单价
|
|
|
+ BigDecimal postMoney = new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue());
|
|
|
+ //获取计划日期中的工作日
|
|
|
+ List<LocalDate> workDaysList = dateInfoMapper.getWorkDaysList(startTime, endTime);
|
|
|
+ for (LocalDate today : workDaysList) {
|
|
|
+ //保存预算到任务计划表
|
|
|
+ EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
|
|
|
+ employeeTaskInfo.setBudgetId(budget.getId());
|
|
|
+ employeeTaskInfo.setProjectId(budget.getProjectId());
|
|
|
+ employeeTaskInfo.setBudgetParentId(budget.getParentId());
|
|
|
+ employeeTaskInfo.setUnitType(budget.getUnitType());
|
|
|
+ employeeTaskInfo.setDeptId(budget.getDeptId());
|
|
|
+ employeeTaskInfo.setCostType(budget.getCostType());
|
|
|
+ employeeTaskInfo.setTaskDetail(budget.getTaskDetail());
|
|
|
+ employeeTaskInfo.setProjectProcess(budget.getProjectProcess());
|
|
|
+ employeeTaskInfo.setBudgetType(budget.getBudgetType());
|
|
|
+ employeeTaskInfo.setOneDay(today);
|
|
|
+ employeeTaskInfo.setWorkType(0);
|
|
|
+ employeeTaskInfo.setPostType(budget.getPostType());
|
|
|
+ employeeTaskInfo.setEmployeeSalary(postMoney);
|
|
|
+ infoList.add(employeeTaskInfo);
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.saveBatch(infoList);
|
|
|
+
|
|
|
//计划人工支出
|
|
|
- budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue())));
|
|
|
+ budget.setPlanStaffCost(budget.getPlanDays().multiply(postMoney));
|
|
|
//如果跨月
|
|
|
if (budget.getPlanStartTime().getMonthValue() != budget.getPlanEndTime().getMonthValue()) {
|
|
|
//跨月则改变状态
|
|
@@ -532,7 +561,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
// endTotalDays = endTotalDays.add(budget.getPlanDays().subtract(new BigDecimal(days)));
|
|
|
budget.setPlanStartMonthDays(new BigDecimal(days));
|
|
|
budget.setPlanEndMonthDays(budget.getPlanDays().subtract(new BigDecimal(days)));
|
|
|
- budget.setPlanStartMoney(new BigDecimal(days).multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
|
|
|
+ budget.setPlanStartMoney(new BigDecimal(days).multiply(postMoney));
|
|
|
budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
|
|
|
}
|
|
|
}else {
|
|
@@ -541,18 +570,6 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
}
|
|
|
}
|
|
|
childrenList.addAll(vo2ChildrenList);
|
|
|
-// //有子计划也要为父计划设置是否跨月,并且跨月多少天,预算多少钱
|
|
|
-// ProjectCostBudget costBudget = new ProjectCostBudget();
|
|
|
-// costBudget.setId(vo2.getId());
|
|
|
-// if (isTwoMonth){
|
|
|
-// costBudget.setPlanIsTwoMonth(1);
|
|
|
-// costBudget.setPlanStartMonthDays(startTotalDays);
|
|
|
-// costBudget.setPlanEndMonthDays(endTotalDays);
|
|
|
-// }else {
|
|
|
-// costBudget.setPlanIsTwoMonth(0);
|
|
|
-// }
|
|
|
-// costBudget.setPlanDays(totalDays);
|
|
|
-// parentList.add(costBudget);
|
|
|
}else {
|
|
|
//无子计划
|
|
|
ProjectCostBudget budget = new ProjectCostBudget();
|
|
@@ -562,9 +579,42 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
budget.setPlanIsTwoMonth(0);
|
|
|
budget.setPlanStartMoney(new BigDecimal(0));
|
|
|
budget.setPlanEndMoney(new BigDecimal(0));
|
|
|
+ employeeTaskInfoService.deleteByBudgetIdAndParentId(budget.getId());
|
|
|
}else {
|
|
|
+ //如果计划正在进行中或者已经完成,则跳过
|
|
|
+ if (budget.getStatus() != null && budget.getStatus() != 1){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.deleteByBudgetId(budget.getId());
|
|
|
//存在数据,则判断是否是固定计划
|
|
|
if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
|
|
|
+ LocalDate startTime = budget.getPlanStartTime();
|
|
|
+ LocalDate endTime = budget.getPlanEndTime();
|
|
|
+ List<EmployeeTaskInfo> infoList = new ArrayList<>();
|
|
|
+ //获取岗位单价
|
|
|
+ BigDecimal postMoney = new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue());
|
|
|
+ //获取计划日期中的工作日
|
|
|
+ List<LocalDate> workDaysList = dateInfoMapper.getWorkDaysList(startTime, endTime);
|
|
|
+ for (LocalDate today : workDaysList) {
|
|
|
+ //保存预算到任务计划表
|
|
|
+ EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
|
|
|
+ employeeTaskInfo.setBudgetId(budget.getId());
|
|
|
+ employeeTaskInfo.setProjectId(budget.getProjectId());
|
|
|
+ employeeTaskInfo.setBudgetParentId(budget.getParentId());
|
|
|
+ employeeTaskInfo.setUnitType(budget.getUnitType());
|
|
|
+ employeeTaskInfo.setDeptId(budget.getDeptId());
|
|
|
+ employeeTaskInfo.setCostType(budget.getCostType());
|
|
|
+ employeeTaskInfo.setTaskDetail(budget.getTaskDetail());
|
|
|
+ employeeTaskInfo.setProjectProcess(budget.getProjectProcess());
|
|
|
+ employeeTaskInfo.setBudgetType(budget.getBudgetType());
|
|
|
+ employeeTaskInfo.setOneDay(today);
|
|
|
+ employeeTaskInfo.setWorkType(0);
|
|
|
+ employeeTaskInfo.setPostType(budget.getPostType());
|
|
|
+ employeeTaskInfo.setEmployeeSalary(postMoney);
|
|
|
+ infoList.add(employeeTaskInfo);
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.saveBatch(infoList);
|
|
|
+
|
|
|
//计划人工支出
|
|
|
budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
|
|
|
//如果跨月
|
|
@@ -974,17 +1024,38 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
if (list != null && list.size() > 0){
|
|
|
BigDecimal big = new BigDecimal(0);
|
|
|
for (ProjectCostBudget budget : list) {
|
|
|
+ //判断是否跨年
|
|
|
if (budget.getRealPlanStartTime().getYear() != year || budget.getPracticalFinishTime().getYear() != year){
|
|
|
if (budget.getIsTwoMonth() != 1){
|
|
|
throw new ServiceException("计划年份异常");
|
|
|
}
|
|
|
if (budget.getPracticalFinishTime().getYear() != year){
|
|
|
- //如果结束时间不是今年,则使用开始金额
|
|
|
- big = big.add(budget.getPracticalStartMoney());
|
|
|
+ //如果结束时间不是今年,则使用开始时间到年底的工作日,除以总工作日
|
|
|
+ LocalDate start = budget.getRealPlanStartTime();
|
|
|
+ LocalDate end = LocalDate.of(start.getYear(),12,31);
|
|
|
+ Integer workDays = dateInfoMapper.getWorkDays(start, end);
|
|
|
+ //如果工作日大于等于实际完成工作日,则直接把人工支出算到上一年
|
|
|
+ if (workDays >= budget.getPracticalTaskDays().intValue()){
|
|
|
+ big = big.add(budget.getActualTotalMoney());
|
|
|
+ }else {
|
|
|
+ if (budget.getPracticalTaskDays().intValue() != 0) {
|
|
|
+ BigDecimal decimal = new BigDecimal(workDays).divide(budget.getPracticalTaskDays()).multiply(budget.getActualTotalMoney()).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ big = big.add(decimal);
|
|
|
+ }
|
|
|
+ }
|
|
|
}else {
|
|
|
- big = big.add(budget.getPracticalEndMoney());
|
|
|
+ //开始时间不是今年
|
|
|
+ LocalDate start = budget.getRealPlanStartTime();
|
|
|
+ LocalDate end = LocalDate.of(start.getYear(),12,31);
|
|
|
+ Integer workDays = dateInfoMapper.getWorkDays(start, end);
|
|
|
+ //如果工作日大于等于实际完成工作日,则今年的支出就是0
|
|
|
+ if (workDays < budget.getPracticalTaskDays().intValue()){
|
|
|
+ BigDecimal decimal = new BigDecimal(workDays).divide(budget.getPracticalTaskDays()).multiply(budget.getActualTotalMoney()).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ big = big.add(budget.getActualTotalMoney().subtract(decimal));
|
|
|
+ }
|
|
|
}
|
|
|
}else {
|
|
|
+ //不跨年直接使用实际工资
|
|
|
big = big.add(budget.getActualTotalMoney());
|
|
|
}
|
|
|
}
|