Sfoglia il codice sorgente

保存部门计划时,计算计划的金额和跨月金额

qianxb 2 anni fa
parent
commit
503204f9c0

+ 13 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java

@@ -116,6 +116,9 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "计划天数")
     private BigDecimal planDays;
 
+    @ApiModelProperty(value = "计划人工成本")
+    private BigDecimal planStaffCost;
+
     @ApiModelProperty(value = "任务实际完成天数")
     private BigDecimal practicalTaskDays;
 
@@ -138,7 +141,7 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "实际计划开启时间")
     private LocalDate realPlanStartTime;
 
-    @ApiModelProperty(value = "是否跨月,0不跨月,1跨月")
+    @ApiModelProperty(value = "实际工作是否跨月,0不跨月,1跨月")
     private Integer isTwoMonth;
 
     @ApiModelProperty(value = "实际开始月工资")
@@ -147,4 +150,13 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "实际结束月工资")
     private BigDecimal practicalEndMoney;
 
+    @ApiModelProperty(value = "计划是否跨月,0不跨月,1跨月")
+    private Integer planIsTwoMonth;
+
+    @ApiModelProperty(value = "计划开始月工资")
+    private BigDecimal planStartMoney;
+
+    @ApiModelProperty(value = "计划结束月工资")
+    private BigDecimal planEndMoney;
+
 }

+ 69 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -441,6 +441,22 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 list.addAll(constructUnit.get(i));
             }
         }
+        //获取当前所有岗位类型,用于统计计划人工支出
+        List<DictInfo> postType = baseMapper.getAllPostType();
+        if (postType == null || postType.size() <= 0){
+            throw new ServiceException("保存失败,没有配置岗位类型");
+        }
+        //根据岗位id分类
+        Map<Long, List<DictInfo>> map = postType.parallelStream()
+                .collect(Collectors.groupingBy(DictInfo::getId));
+        //获取当前任务类型,如果是临时任务,就不用计算人工成本
+        List<DictInfo> taskInfo = baseMapper.getAllTaskInfo();
+        if (taskInfo == null || taskInfo.size() <= 0){
+            throw new ServiceException("保存失败,没有配置任务类型");
+        }
+        //根据任务类型id分类
+        Map<Long, List<DictInfo>> map2 = taskInfo.parallelStream()
+                .collect(Collectors.groupingBy(DictInfo::getId));
         List<ProjectCostBudget> childrenList = new ArrayList<>();
         List<ProjectCostBudget> parentList = new ArrayList<>();
         //把所有子计划分离出来,并且设置父类id
@@ -448,6 +464,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
             if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
                 for (ProjectCostBudget budget : vo2ChildrenList) {
+                    //如果计划正在进行中或者已经完成,则跳过
+                    if (budget.getStatus() != null && budget.getStatus() != 1){
+                        continue;
+                    }
+                    //如果保存太快,没有生成planDays,就查询
+                    if (budget.getPlanDays() == null || budget.getPlanDays().intValue() == 0){
+                        budget.setPlanDays(new BigDecimal( CommonUtil.getWorkDays(budget.getPlanStartTime(),budget.getPlanEndTime())));
+                    }
                     budget.setProjectId(vo.getProjectId());
                     budget.setParentId(vo2.getId());
                     budget.setCostType(vo2.getCostType());
@@ -456,12 +480,57 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     budget.setBudgetType(vo2.getBudgetType());
                     budget.setProjectProcess(vo2.getProjectProcess());
                     budget.setTaskDetail(vo2.getTaskDetail());
+                    budget.setPostType(vo2.getPostType());
+                    //只计算固定计划的人工成本
+                    if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
+                        //计划人工支出
+                        budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue())));
+                        //如果跨月
+                        if (budget.getPlanStartTime().getMonthValue() != budget.getPlanEndTime().getMonthValue()) {
+                            budget.setPlanIsTwoMonth(1);
+                            //计算开始到月底多少个工作日
+                            int days = CommonUtil.getWorkDays(budget.getPlanStartTime(), LocalDate.of(vo2.getPlanStartTime().getYear(), budget.getPlanStartTime().getMonthValue(), budget.getPlanStartTime().getMonth().maxLength()));
+                            if (days > budget.getPlanDays().intValue()){
+                                budget.setPlanStartMoney(budget.getPlanStaffCost());
+                                budget.setPlanEndMoney(new BigDecimal(0));
+                            }else {
+                                budget.setPlanStartMoney(new BigDecimal(days).multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
+                                budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
+                            }
+                        }
+                    }
                 }
                 childrenList.addAll(vo2ChildrenList);
             }else {
                 //无子计划
                 ProjectCostBudget budget = new ProjectCostBudget();
                 BeanUtils.copyProperties(vo2, budget);
+                //如果主计划被清空,然后把计划金额也清空
+                if (budget.getPlanTaskType() == null){
+                    budget.setPlanIsTwoMonth(0);
+                    budget.setPlanStartMoney(new BigDecimal(0));
+                    budget.setPlanEndMoney(new BigDecimal(0));
+                }else {
+                    //存在数据,则判断是否是固定计划
+                    if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
+                        //计划人工支出
+                        budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
+                        //如果跨月
+                        if (budget.getPlanStartTime().getMonthValue() != budget.getPlanEndTime().getMonthValue()) {
+                            budget.setPlanIsTwoMonth(1);
+                            //计算开始到月底多少个工作日
+                            int days = CommonUtil.getWorkDays(budget.getPlanStartTime(), LocalDate.of(budget.getPlanStartTime().getYear(), budget.getPlanStartTime().getMonthValue(), budget.getPlanStartTime().getMonth().maxLength()));
+                            if (days > budget.getPlanDays().intValue()){
+                                budget.setPlanStartMoney(budget.getPlanStaffCost());
+                                budget.setPlanEndMoney(new BigDecimal(0));
+                            }else {
+                                budget.setPlanStartMoney(new BigDecimal(days).multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
+                                budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
+                            }
+                        }
+                    }
+
+                }
                 parentList.add(budget);
             }
         }