Răsfoiți Sursa

项目计划预算保存时,保存预算具体日期

qianxb 2 ani în urmă
părinte
comite
43f64714c3
15 a modificat fișierele cu 384 adăugiri și 39 ștergeri
  1. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/DepartmentMonthPlanDTO.java
  2. 79 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EmployeeTaskInfo.java
  3. 7 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  4. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.java
  5. 3 3
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml
  6. 30 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.java
  7. 24 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EmployeeTaskInfoMapper.xml
  8. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  9. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/WorkDateInfoMapper.java
  10. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/WorkDateInfoMapper.xml
  11. 34 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IEmployeeTaskInfoService.java
  12. 26 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  13. 2 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  14. 71 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EmployeeTaskInfoServiceImpl.java
  15. 98 27
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/DepartmentMonthPlanDTO.java

@@ -18,7 +18,7 @@ import java.time.LocalDate;
 public class DepartmentMonthPlanDTO {
 
     @ApiModelProperty(value = "部门类型")
-    private Integer departmentType;
+    private Long deptId;
 
 
     @ApiModelProperty(value = "计划开始日期")

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

@@ -0,0 +1,79 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.NullSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:21
+ **/
+@Data
+@TableName("c_employee_task_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "员工任务信息表", description = "员工任务信息表")
+public class EmployeeTaskInfo extends BaseEntity {
+
+    @ApiModelProperty(value = "预算id")
+    private Long budgetId;
+
+    @ApiModelProperty(value = "预算父计划id")
+    private Long budgetParentId;
+
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "单位类型1施工2监理3建设")
+    private Integer unitType;
+
+    @ApiModelProperty(value = "费用分摊部门")
+    private Long deptId;
+
+    @ApiModelProperty(value = "费用类型")
+    private Integer costType;
+
+    @ApiModelProperty(value = "项目环节")
+    private Long projectProcess;
+
+    @ApiModelProperty(value = "预算类型")
+    private Integer budgetType;
+
+    @ApiModelProperty(value = "工作类型,0预算1实际")
+    private Integer workType;
+
+    @ApiModelProperty(value = "岗位类型")
+    private Long postType;
+
+    @ApiModelProperty(value = "任务类型")
+    private Integer taskDetail;
+
+    @ApiModelProperty(value = "员工id")
+    @JsonSerialize(nullsUsing = NullSerializer.class)
+    private Long employeeId;
+
+    @ApiModelProperty(value = "员工当天工资")
+    private BigDecimal employeeSalary;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "当天日期")
+    private LocalDate oneDay;
+
+
+
+}

+ 7 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java

@@ -1,5 +1,7 @@
 package org.springblade.control.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@@ -83,6 +85,7 @@ public class ProjectCostBudget extends BaseEntity {
     private Integer approve;
 
     @ApiModelProperty(value = "计划任务类型")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private Long planTaskType;
 
     @ApiModelProperty(value = "计划任务描述")
@@ -102,6 +105,7 @@ public class ProjectCostBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "计划开始日期")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private LocalDate planStartTime;
 
     @DateTimeFormat(
@@ -111,12 +115,15 @@ public class ProjectCostBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "计划结束日期")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private LocalDate planEndTime;
 
     @ApiModelProperty(value = "计划天数")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private BigDecimal planDays;
 
     @ApiModelProperty(value = "计划人工成本")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
     private BigDecimal planStaffCost;
 
     @ApiModelProperty(value = "任务实际完成天数")

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.java

@@ -25,7 +25,7 @@ public interface DepartmentMonthPlanMapper extends BaseMapper<DepartmentMonthPla
 
     List<DictInfo> getDepartmentDict();
 
-    String getDepartmentName(@Param("departmentType") Integer departmentType);
+    String getDepartmentName(@Param("deptId") Long deptId);
 
     List<DepartmentMonthPlanVO> getPage(IPage page, @Param("dto") DepartmentMonthPlanDTO dto, @Param("userId") Long userId);
 

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

@@ -10,7 +10,7 @@
         select * from c_dict_info WHERE code = 'department_type' order by sort LIMIT 5
     </select>
     <select id="getDepartmentName" resultType="java.lang.String">
-        select dict_name from c_dict_info WHERE code = 'department_type' and dict_value = #{departmentType}
+        select dept_name from blade_dept WHERE id = #{deptId} and is_deleted = 0
     </select>
     <select id="getPage" resultType="org.springblade.control.vo.DepartmentMonthPlanVO">
         SELECT dmp.*,
@@ -25,8 +25,8 @@
                 (select bu.name from blade_user bu WHERE bu.id = dmp.plan_designer) as 'planDesignerName'
         FROM c_department_month_plan dmp
         where dmp.plan_designer = #{userId} and dmp.is_deleted = 0
-        <if test="dto.departmentType != null and dto.departmentType != ''">
-            and dmp.department_type = #{dto.departmentType}
+        <if test="dto.deptId != null and dto.deptId != ''">
+            and dmp.dept_id = #{dto.deptId}
         </if>
         <if test="dto.planStartDate != null and dto.planStartDate != ''">
             and DATE_FORMAT(dmp.plan_start_date ,'%Y-%m') BETWEEN #{dto.planStartDate} AND #{dto.planEndDate}

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

@@ -0,0 +1,30 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.vo.ControlProjectInfoVO;
+import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.vo.ProjectCostBudgetVO2;
+import org.springblade.control.vo.ProjectCostBudgetVO3;
+import org.springblade.system.user.entity.User;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:38
+ **/
+public interface EmployeeTaskInfoMapper extends BaseMapper<EmployeeTaskInfo> {
+    void deleteByBudgetId(@Param("id") Long id);
+
+    void deleteByBudgetParentId(@Param("ids") List<Long> ids,@Param("parentId") Long parentId);
+
+    void deleteByBudgetIdAndParentId(@Param("id") Long id);
+}

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

@@ -0,0 +1,24 @@
+<?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">
+
+
+    <delete id="deleteByBudgetId">
+        delete from c_employee_task_info
+        where budget_id = #{id}
+    </delete>
+    <delete id="deleteByBudgetParentId">
+        delete from c_employee_task_info
+        where budget_parent_id = #{parentId}
+        <if test="ids != null and ids.size > 0">
+            and budget_id not in
+            <foreach collection="ids" item="id" open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+    </delete>
+    <delete id="deleteByBudgetIdAndParentId">
+        delete from c_employee_task_info
+        where budget_id = #{id} or budget_parent_id = #{id}
+    </delete>
+</mapper>

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -191,7 +191,7 @@
 
     <select id="getBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
         select *  from c_project_cost_budget pcb
-        WHERE pcb.is_deleted = 0  and task_approve = 1  and (select cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 1 and pcb.task_approve = 1 and (DATE_FORMAT(pcb.practical_finish_time ,'%Y') = #{year} or DATE_FORMAT(pcb.real_plan_start_time ,'%Y') = #{year})
+        WHERE pcb.is_deleted = 0 and (select cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 1 and pcb.task_approve = 1 and (DATE_FORMAT(pcb.practical_finish_time ,'%Y') = #{year} or DATE_FORMAT(pcb.real_plan_start_time ,'%Y') = #{year})
     </select>
 
     <select id="getBudgetByYear2" resultType="org.springblade.control.entity.ProjectCostBudget">

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

@@ -16,4 +16,6 @@ import java.util.List;
 public interface WorkDateInfoMapper extends BaseMapper<WorkDateInfo> {
 
     Integer getWorkDays(@Param("start") LocalDate start, @Param("end") LocalDate end);
+
+    List<LocalDate> getWorkDaysList(@Param("start") LocalDate start, @Param("end") LocalDate end);
 }

+ 5 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/WorkDateInfoMapper.xml

@@ -8,4 +8,9 @@
         WHERE DATE_FORMAT(one_day,'%Y-%m-%d') between DATE_FORMAT(#{start} ,'%Y-%m-%d') and DATE_FORMAT(#{end},'%Y-%m-%d')
         and is_work = 1
     </select>
+    <select id="getWorkDaysList" resultType="java.time.LocalDate">
+        select one_day  from c_work_date_info
+        WHERE DATE_FORMAT(one_day,'%Y-%m-%d') between DATE_FORMAT(#{start} ,'%Y-%m-%d') and DATE_FORMAT(#{end},'%Y-%m-%d')
+          and is_work = 1
+    </select>
 </mapper>

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

@@ -0,0 +1,34 @@
+package org.springblade.control.service;
+
+import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.dto.ProjectCostBudgetStatsDTO;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.entity.EmployeeTaskInfo;
+import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.control.entity.ProjectCostBudgetStats;
+import org.springblade.control.vo.*;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.mp.support.Query;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:41
+ **/
+public interface IEmployeeTaskInfoService extends BaseService<EmployeeTaskInfo> {
+
+    //根据预算id删除工作信息
+    void deleteByBudgetId(Long id);
+
+    //根据预算id删除工作信息,清空所有
+    void deleteByBudgetIdAndParentId(Long id);
+
+    //根据父预算id删除工作信息,并且排除到正在进行中的计划
+    void deleteByBudgetParentId(List<Long> ids,Long parentId);
+}

+ 26 - 4
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -8,6 +8,7 @@ import org.springblade.control.dto.AnnualBudgetDTO;
 import org.springblade.control.entity.*;
 import org.springblade.control.mapper.AnnualBudgetMapper;
 import org.springblade.control.mapper.DepartmentMonthPlanMapper;
+import org.springblade.control.mapper.WorkDateInfoMapper;
 import org.springblade.control.service.*;
 import org.springblade.control.vo.*;
 import org.springblade.core.log.exception.ServiceException;
@@ -49,6 +50,8 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
 
     private final IProjectProcessService processService;
 
+    private final WorkDateInfoMapper dateInfoMapper;
+
     /**
      * 新增年度经营预算
      * @param dto
@@ -553,7 +556,7 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }
         List<AnnualProjectCostVO> mapList = new ArrayList<>();
         //按年查询所有支出,按照项目分组,然后再按照月份分组统计
-        //目前查询人工支出
+        //查询人工支出
         List<ProjectCostBudget> budgetByYear = budgetService.getBudgetByYear(y);
         Map<Long, List<ProjectCostBudget>> map = budgetByYear.parallelStream()
                 .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
@@ -583,7 +586,7 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                                 throw new ServiceException("计划年份异常2");
                             }
                             if (budget.getPracticalFinishTime().getYear() != y){
-                                //如果结束时间不是今年,则使用开始金额
+                                //如果结束时间不是今年,则开始月大于等于当前月才计算
                                 if (budget.getRealPlanStartTime().getMonthValue() == i) {
                                     big = big.add(budget.getPracticalStartMoney());
                                 }
@@ -593,8 +596,27 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                                 }
                             }
                         }else {
-                            if (budget.getPracticalFinishTime().getMonthValue() == i) {
-                                big = big.add(budget.getActualTotalMoney());
+                            //开始和结束时间没有跨年,但是需要判断是否跨月,如果没有跨月,则判断是否是当前月完成
+                            if (budget.getIsTwoMonth() == 0) {
+                                if (budget.getPracticalFinishTime().getMonthValue() == i) {
+                                    big = big.add(budget.getActualTotalMoney());
+                                }
+                            }else {
+                                //如果跨月则判断是否包含当前月
+                                LocalDate startTime = budget.getRealPlanStartTime();
+                                LocalDate endTime = budget.getPracticalFinishTime();
+                                if (startTime.getMonthValue() <= i && endTime.getMonthValue() >= i){
+                                    if (startTime.getMonthValue() == i){
+                                        //开始时间是当月,获取当月工作日,除以总工作日,乘以总工资
+
+                                    }else if (endTime.getMonthValue() == i){
+                                        //开始时间是当月,获取当月工作日,除以总工作日,乘以总工资
+                                    }else {
+                                        //判断此月之前的工作日,如果此工作日已经大于总工作日,那么此月不算支出
+
+                                        //获取此月整月工作日,用总工作日,减去此月之前的工作日,如果此月工作日大于结果工作日,则使用结果工作日
+                                    }
+                                }
                             }
                         }
                     }

+ 2 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java

@@ -64,13 +64,13 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
     public List<ProjectCostBudgetVO> addDepartmentPlan(DepartmentMonthPlan plan) {
         //判断数据库是否存在当前部门当前月数据
         DepartmentMonthPlan one = this.getOne(new LambdaQueryWrapper<DepartmentMonthPlan>()
-                .eq(DepartmentMonthPlan::getDepartmentType, plan.getDepartmentType())
+                .eq(DepartmentMonthPlan::getDeptId, plan.getDeptId())
                 .eq(DepartmentMonthPlan::getPlanDate, plan.getPlanDate()));
         if (one != null){
             throw new ServiceException("新增失败,该部门该月份已存在计划");
         }
         //获取部门名称
-        String departmentName = baseMapper.getDepartmentName(plan.getDepartmentType());
+        String departmentName = baseMapper.getDepartmentName(plan.getDeptId());
         //新增部门月计划,并且设置名称和起止日期,制定人
         Long userId = SecureUtil.getUserId();
         plan.setPlanDesigner(userId);

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

@@ -0,0 +1,71 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.dto.ProjectCostBudgetStatsDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.*;
+import org.springblade.control.service.IContractInfoService;
+import org.springblade.control.service.IEmployeeTaskInfoService;
+import org.springblade.control.service.IProjectCostBudgetService;
+import org.springblade.control.vo.*;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.system.user.entity.User;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:43
+ **/
+@Service
+@AllArgsConstructor
+public class EmployeeTaskInfoServiceImpl extends BaseServiceImpl<EmployeeTaskInfoMapper, EmployeeTaskInfo> implements IEmployeeTaskInfoService {
+
+
+    /**
+     * 根据预算id删除工作信息
+     * @param id
+     */
+    @Override
+    public void deleteByBudgetId(Long id) {
+        baseMapper.deleteByBudgetId(id);
+    }
+
+    /**
+     * 根据预算id删除工作信息,清空所有
+     * @param id
+     */
+    @Override
+    public void deleteByBudgetIdAndParentId(Long id) {
+        baseMapper.deleteByBudgetIdAndParentId(id);
+    }
+
+    /**
+     * 根据父预算id删除工作信息,并且排除到正在进行中的计划
+     * @param ids
+     * @param parentId
+     */
+    @Override
+    public void deleteByBudgetParentId(List<Long> ids, Long parentId) {
+        baseMapper.deleteByBudgetParentId(ids,parentId);
+    }
+}

+ 98 - 27
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -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());
                 }
             }