Ver código fonte

保存项目计划预算时,同时保存人工预算之外的预算

qianxb 2 anos atrás
pai
commit
a7e5dbd797

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EmployeeTaskInfo.java

@@ -65,6 +65,9 @@ public class EmployeeTaskInfo extends BaseEntity {
     @ApiModelProperty(value = "员工当天工资")
     private BigDecimal employeeSalary;
 
+    @ApiModelProperty(value = "测算其他支出均摊到天")
+    private BigDecimal avgOtherCost;
+
     @DateTimeFormat(
             pattern = "yyyy-MM-dd"
     )

+ 2 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.java

@@ -39,4 +39,6 @@ public interface EmployeeTaskInfoMapper extends BaseMapper<EmployeeTaskInfo> {
 
     //根据年获取所有预算工作日
     List<EmployeeTaskInfo> getAllBudgetSalaryByYear(@Param("year") int y);
+
+    void setAvgOtherCostByParentId(@Param("id") Long id,@Param("avg") BigDecimal avg);
 }

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.xml

@@ -1,6 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.control.mapper.EmployeeTaskInfoMapper">
+    <update id="setAvgOtherCostByParentId">
+        update c_employee_task_info set avg_other_cost = #{avg} where budget_parent_id = #{id}
+    </update>
 
 
     <delete id="deleteByBudgetId">

+ 7 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IEmployeeTaskInfoService.java

@@ -33,6 +33,9 @@ public interface IEmployeeTaskInfoService extends BaseService<EmployeeTaskInfo>
     //根据父预算id删除工作信息,并且排除到正在进行中的计划
     void deleteByBudgetParentId(List<Long> ids,Long parentId);
 
+    //根据父预算id修改所有日期的,其他平均预算
+    void setAvgOtherCostByParentId(Long id,BigDecimal avg);
+
 
     /**
      *  实际支出相关接口
@@ -52,6 +55,10 @@ public interface IEmployeeTaskInfoService extends BaseService<EmployeeTaskInfo>
     //根据年查询所有人工支出,按月分组,当月没有支出将不会插入
     Map<Integer, BigDecimal> getAllEmployeeSalaryByYear4(int y);
 
+    //根据年查询除所有人工支出,按部门分组,再按月统计
+    Map<Long,Map<Integer, BigDecimal>> getAllEmployeeSalaryByYear5(int y);
+
+
 
     /**
      *  预算支出相关接口

+ 13 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -1070,6 +1070,19 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         return list;
     }
 
+
+    /**
+     * 预算与实际统计-部门支出统计
+     */
+    public List<BudgetAndPracticalByDeptVO> budgetAndPracticalByDept2(String year) {
+        int y = Integer.parseInt(year.substring(0, 4));
+        //结果集
+        List<BudgetAndPracticalByDeptVO> list = new ArrayList<>();
+        List<String> months = Arrays.asList("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月");
+        //
+        return null;
+    }
+
     /**
      * 预算与实际统计-部门支出统计
      */

+ 38 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EmployeeTaskInfoServiceImpl.java

@@ -69,6 +69,16 @@ public class EmployeeTaskInfoServiceImpl extends BaseServiceImpl<EmployeeTaskInf
         baseMapper.deleteByBudgetParentId(ids,parentId);
     }
 
+    /**
+     * 根据父预算id修改所有日期的,其他平均预算
+     * @param id
+     * @param avg
+     */
+    @Override
+    public void setAvgOtherCostByParentId(Long id, BigDecimal avg) {
+        baseMapper.setAvgOtherCostByParentId(id,avg);
+    }
+
     /**
      * 根据年查询当年所有的人工支出
      * @param y
@@ -171,6 +181,34 @@ public class EmployeeTaskInfoServiceImpl extends BaseServiceImpl<EmployeeTaskInf
         return null;
     }
 
+    /**
+     * 根据年查询除所有人工支出,按部门分组,再按月统计
+     * @param y
+     * @return
+     */
+    @Override
+    public Map<Long, Map<Integer, BigDecimal>> getAllEmployeeSalaryByYear5(int y) {
+        List<EmployeeTaskInfo> list = baseMapper.getAllEmployeeSalaryByYear2(y);
+        if (list != null && list.size() > 0){
+            Map<Long, Map<Integer, BigDecimal>> map = new HashMap<>();
+            Map<Long, List<EmployeeTaskInfo>> listMap = list.parallelStream()
+                    .collect(Collectors.groupingBy(EmployeeTaskInfo::getDeptId));
+            for (Long aLong : listMap.keySet()) {
+                //该项目所有支出
+                List<EmployeeTaskInfo> infoList = listMap.get(aLong);
+                //按月份分组
+                Map<Integer, BigDecimal> monthMap = infoList.stream().collect(
+                        Collectors.groupingBy(
+                                o -> o.getOneDay().getMonthValue(),
+                                Collectors.mapping(EmployeeTaskInfo::getEmployeeSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))
+                        ));
+                map.put(aLong,monthMap);
+            }
+            return map;
+        }
+        return null;
+    }
+
     @Override
     public Map<Long, BigDecimal> getAllBudgetSalaryByProject(Long projectId) {
         List<EmployeeTaskInfo> list = baseMapper.getAllBudgetSalaryByProject(projectId);

+ 29 - 3
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -486,9 +486,15 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 List<Long> ids = vo2ChildrenList.stream().filter(l -> l.getStatus() != null && l.getStatus() != 1).map(ProjectCostBudgetVO2::getId).collect(Collectors.toList());
                 //清空除进行中之外的子计划的 员工任务信息表
                 employeeTaskInfoService.deleteByBudgetParentId(ids,vo2.getId());
+                BigDecimal allTotal = new BigDecimal(0);
+                Boolean isTaskType = false;
                 for (ProjectCostBudget budget : vo2ChildrenList) {
                     //如果计划正在进行中或者已经完成,则跳过
                     if (budget.getStatus() != null && budget.getStatus() != 1){
+                        if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
+                            isTaskType = true;
+                        }
+                        allTotal = allTotal.add(budget.getPlanDays());
                         continue;
                     }
                     //如果保存太快,没有生成planDays,就查询
@@ -512,6 +518,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
                     //只计算固定计划的人工成本
                     if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
+                        isTaskType = true;
                         LocalDate startTime = budget.getPlanStartTime();
                         LocalDate endTime = budget.getPlanEndTime();
                         List<EmployeeTaskInfo> infoList = new ArrayList<>();
@@ -519,6 +526,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                         BigDecimal postMoney = new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue());
                         //获取计划日期中的工作日
                         List<LocalDate> workDaysList = dateInfoMapper.getWorkDaysList(startTime, endTime);
+                        allTotal = allTotal.add(new BigDecimal(workDaysList.size()));
                         for (LocalDate today : workDaysList) {
                             //保存预算到任务计划表
                             EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
@@ -569,6 +577,16 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                         }
                     }
                 }
+                //修改所有父id下的其他平均工资
+                if (isTaskType){
+                    BigDecimal otherCost = vo2.getBudgetCountMoney().subtract(vo2.getBudgetStaffCost());
+                    BigDecimal other = new BigDecimal(0);
+                    //查看成本测算中是否包含其他支出
+                    if (otherCost.intValue() != 0 ){
+                        other = otherCost.divide(allTotal,2, BigDecimal.ROUND_HALF_UP);
+                    }
+                    employeeTaskInfoService.setAvgOtherCostByParentId(vo2.getId(),other);
+                }
                 childrenList.addAll(vo2ChildrenList);
             }else {
                 //无子计划
@@ -585,7 +603,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     if (budget.getStatus() != null && budget.getStatus() != 1){
                         continue;
                     }
-                    employeeTaskInfoService.deleteByBudgetId(budget.getId());
+                    employeeTaskInfoService.deleteByBudgetIdAndParentId(budget.getId());
+//                    employeeTaskInfoService.deleteByBudgetId(budget.getId());
                     //存在数据,则判断是否是固定计划
                     if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
                         LocalDate startTime = budget.getPlanStartTime();
@@ -595,6 +614,12 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                         BigDecimal postMoney = new BigDecimal(map.get(vo2.getPostType()).get(0).getDictValue());
                         //获取计划日期中的工作日
                         List<LocalDate> workDaysList = dateInfoMapper.getWorkDaysList(startTime, endTime);
+                        BigDecimal otherCost = budget.getBudgetCountMoney().subtract(budget.getBudgetStaffCost());
+                        BigDecimal other = new BigDecimal(0);
+                        //查看成本测算中是否包含其他支出
+                        if (otherCost.intValue() != 0 ){
+                            other = otherCost.divide(new BigDecimal(workDaysList.size()),2, BigDecimal.ROUND_HALF_UP);
+                        }
                         for (LocalDate today : workDaysList) {
                             //保存预算到任务计划表
                             EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
@@ -611,6 +636,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                             employeeTaskInfo.setWorkType(0);
                             employeeTaskInfo.setPostType(budget.getPostType());
                             employeeTaskInfo.setEmployeeSalary(postMoney);
+                            employeeTaskInfo.setAvgOtherCost(other);
                             infoList.add(employeeTaskInfo);
                         }
                         employeeTaskInfoService.saveBatch(infoList);
@@ -1039,7 +1065,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                             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);
+                                BigDecimal decimal = new BigDecimal(workDays).divide(budget.getPracticalTaskDays(),2, BigDecimal.ROUND_HALF_UP).multiply(budget.getActualTotalMoney()).setScale(2, RoundingMode.HALF_UP);
                                 big = big.add(decimal);
                             }
                         }
@@ -1050,7 +1076,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                         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);
+                            BigDecimal decimal = new BigDecimal(workDays).divide(budget.getPracticalTaskDays(),2, BigDecimal.ROUND_HALF_UP).multiply(budget.getActualTotalMoney()).setScale(2, RoundingMode.HALF_UP);
                             big = big.add(budget.getActualTotalMoney().subtract(decimal));
                         }
                     }