|
@@ -55,6 +55,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
|
|
|
private final WorkDateInfoMapper dateInfoMapper;
|
|
|
|
|
|
+ private final IEmployeeTaskInfoService employeeTaskInfoService;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 批量新增或修改预算
|
|
@@ -480,17 +482,23 @@ 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());
|
|
|
+ BigDecimal allTotal = new BigDecimal(0);
|
|
|
+ Boolean isTaskType = false;
|
|
|
+ //判断进行中的任务是否包含临时任务
|
|
|
+ Boolean isStarting = false;
|
|
|
for (ProjectCostBudget budget : vo2ChildrenList) {
|
|
|
//如果计划正在进行中或者已经完成,则跳过
|
|
|
if (budget.getStatus() != null && budget.getStatus() != 1){
|
|
|
+ if (map2.get(budget.getPlanTaskType()).get(0).getDictValue() == 1) {
|
|
|
+ isTaskType = true;
|
|
|
+ }else {
|
|
|
+ isStarting = true;
|
|
|
+ }
|
|
|
+ allTotal = allTotal.add(budget.getPlanDays());
|
|
|
continue;
|
|
|
}
|
|
|
//如果保存太快,没有生成planDays,就查询
|
|
@@ -506,12 +514,45 @@ 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) {
|
|
|
+ isTaskType = true;
|
|
|
+ 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);
|
|
|
+ allTotal = allTotal.add(new BigDecimal(workDaysList.size()));
|
|
|
+ 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()) {
|
|
|
//跨月则改变状态
|
|
@@ -528,31 +569,72 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
budget.setPlanEndMoney(new BigDecimal(0));
|
|
|
}else {
|
|
|
//如果这个月工作天数小于总计划,则总计划相减
|
|
|
-// startTotalDays = startTotalDays.add(new BigDecimal(days));
|
|
|
-// 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 {
|
|
|
-// startTotalDays = startTotalDays.add(budget.getPlanDays());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ //修改所有父id下的其他平均工资
|
|
|
+ if (isTaskType){
|
|
|
+ //清空维护成本
|
|
|
+ employeeTaskInfoService.deleteMaintainByBudgetId(vo2.getId());
|
|
|
+ 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);
|
|
|
+ }else {
|
|
|
+ //维护任务统计维护成本
|
|
|
+ //如果有进行中的临时任务,就不新增不删除
|
|
|
+ if (isStarting){
|
|
|
+
|
|
|
+ }else {
|
|
|
+ //清空维护成本
|
|
|
+ employeeTaskInfoService.deleteMaintainByBudgetId(vo2.getId());
|
|
|
+ //获取项目合同,如果项目没有合同则提示
|
|
|
+ ControlContractInfo contractInfo = contractService.getContractByProjectId(vo2.getProjectId());
|
|
|
+ if (contractInfo == null){
|
|
|
+ throw new ServiceException("当前项目没有合同,不能保存临时任务");
|
|
|
+ }
|
|
|
+ LocalDate startTime = contractInfo.getStartTime();
|
|
|
+ LocalDate endTime = contractInfo.getEndTime();
|
|
|
+ //获取开始时间到结束时间的天数
|
|
|
+ long days = endTime.toEpochDay() - startTime.toEpochDay() + 1;
|
|
|
+ //获得每天维护费
|
|
|
+ BigDecimal decimal = new BigDecimal(0);
|
|
|
+ if (vo2.getBudgetCountMoney().intValue() != 0 && days != 0){
|
|
|
+ decimal = vo2.getBudgetCountMoney().divide(new BigDecimal(days), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ }
|
|
|
+ endTime = endTime.plusDays(1);
|
|
|
+ List<EmployeeTaskInfo> infoList = new ArrayList<>();
|
|
|
+ //循环存入每一天
|
|
|
+ while (startTime.isBefore(endTime)){
|
|
|
+ //保存预算到任务计划表
|
|
|
+ EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
|
|
|
+ employeeTaskInfo.setBudgetId(vo2.getId());
|
|
|
+ employeeTaskInfo.setProjectId(vo2.getProjectId());
|
|
|
+ employeeTaskInfo.setUnitType(vo2.getUnitType());
|
|
|
+ employeeTaskInfo.setDeptId(vo2.getDeptId());
|
|
|
+ employeeTaskInfo.setCostType(vo2.getCostType());
|
|
|
+ employeeTaskInfo.setTaskDetail(vo2.getTaskDetail());
|
|
|
+ employeeTaskInfo.setProjectProcess(vo2.getProjectProcess());
|
|
|
+ employeeTaskInfo.setBudgetType(vo2.getBudgetType());
|
|
|
+ employeeTaskInfo.setOneDay(startTime);
|
|
|
+ employeeTaskInfo.setWorkType(2);
|
|
|
+ employeeTaskInfo.setPostType(vo2.getPostType());
|
|
|
+ employeeTaskInfo.setEmployeeSalary(decimal);
|
|
|
+ infoList.add(employeeTaskInfo);
|
|
|
+ startTime = startTime.plusDays(1);
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.saveBatch(infoList);
|
|
|
+ }
|
|
|
+ }
|
|
|
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 +644,49 @@ 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.deleteByBudgetIdAndParentId(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);
|
|
|
+ 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();
|
|
|
+ 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);
|
|
|
+ employeeTaskInfo.setAvgOtherCost(other);
|
|
|
+ infoList.add(employeeTaskInfo);
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.saveBatch(infoList);
|
|
|
+
|
|
|
//计划人工支出
|
|
|
budget.setPlanStaffCost(budget.getPlanDays().multiply(new BigDecimal(map.get(budget.getPostType()).get(0).getDictValue())));
|
|
|
//如果跨月
|
|
@@ -586,6 +708,45 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
budget.setPlanEndMoney(budget.getPlanStaffCost().subtract(budget.getPlanStartMoney()));
|
|
|
}
|
|
|
}
|
|
|
+ }else {
|
|
|
+ //维护任务统计维护成本
|
|
|
+ //获取项目合同,如果项目没有合同则提示
|
|
|
+ ControlContractInfo contractInfo = contractService.getContractByProjectId(vo2.getProjectId());
|
|
|
+ if (contractInfo == null){
|
|
|
+ throw new ServiceException("当前项目没有合同,不能保存临时任务");
|
|
|
+ }
|
|
|
+ LocalDate startTime = contractInfo.getStartTime();
|
|
|
+ LocalDate endTime = contractInfo.getEndTime();
|
|
|
+ //获取开始时间到结束时间的天数
|
|
|
+ long days = endTime.toEpochDay() - startTime.toEpochDay() + 1;
|
|
|
+ //获得每天维护费
|
|
|
+ BigDecimal decimal = new BigDecimal(0);
|
|
|
+ if (vo2.getBudgetCountMoney().intValue() != 0 && days != 0){
|
|
|
+ decimal = vo2.getBudgetCountMoney().divide(new BigDecimal(days), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ }
|
|
|
+ endTime = endTime.plusDays(1);
|
|
|
+ List<EmployeeTaskInfo> infoList = new ArrayList<>();
|
|
|
+ //循环存入每一天
|
|
|
+ while (startTime.isBefore(endTime)){
|
|
|
+ //保存预算到任务计划表
|
|
|
+ EmployeeTaskInfo employeeTaskInfo = new EmployeeTaskInfo();
|
|
|
+ employeeTaskInfo.setBudgetId(vo2.getId());
|
|
|
+ employeeTaskInfo.setProjectId(vo2.getProjectId());
|
|
|
+ employeeTaskInfo.setUnitType(vo2.getUnitType());
|
|
|
+ employeeTaskInfo.setDeptId(vo2.getDeptId());
|
|
|
+ employeeTaskInfo.setCostType(vo2.getCostType());
|
|
|
+ employeeTaskInfo.setTaskDetail(vo2.getTaskDetail());
|
|
|
+ employeeTaskInfo.setProjectProcess(vo2.getProjectProcess());
|
|
|
+ employeeTaskInfo.setBudgetType(vo2.getBudgetType());
|
|
|
+ employeeTaskInfo.setOneDay(startTime);
|
|
|
+ employeeTaskInfo.setWorkType(2);
|
|
|
+ employeeTaskInfo.setPostType(vo2.getPostType());
|
|
|
+ employeeTaskInfo.setEmployeeSalary(decimal);
|
|
|
+ infoList.add(employeeTaskInfo);
|
|
|
+ startTime = startTime.plusDays(1);
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.saveBatch(infoList);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -974,17 +1135,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(),2, BigDecimal.ROUND_HALF_UP).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(),2, BigDecimal.ROUND_HALF_UP).multiply(budget.getActualTotalMoney()).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ big = big.add(budget.getActualTotalMoney().subtract(decimal));
|
|
|
+ }
|
|
|
}
|
|
|
}else {
|
|
|
+ //不跨年直接使用实际工资
|
|
|
big = big.add(budget.getActualTotalMoney());
|
|
|
}
|
|
|
}
|
|
@@ -1339,6 +1521,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
* @param practicalFinishTime 实际完成时间
|
|
|
*/
|
|
|
@Override
|
|
|
+ @Transactional
|
|
|
public void taskFinishedStats(Long PlanId, LocalDate practicalFinishTime) {
|
|
|
System.out.println("计划实际结束时间"+practicalFinishTime);
|
|
|
System.out.println("今天"+ LocalDateTime.now());
|
|
@@ -1354,7 +1537,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
int taskType = dictInfo.getDictValue().intValue();
|
|
|
//计划为临时计划,则不计算金额直接闭环
|
|
|
if (taskType == 2){
|
|
|
- //为临时任务设置任务实际实际,方便统计
|
|
|
+ //为临时任务设置任务实际天数,方便统计
|
|
|
budget.setPracticalTaskDays(new BigDecimal(1 + budget.getPracticalFinishTime().until(budget.getRealPlanStartTime(), ChronoUnit.DAYS)));
|
|
|
this.updateById(budget);
|
|
|
}else {
|
|
@@ -1366,6 +1549,48 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
Double money = userInfo.getOneMoney();
|
|
|
//为固定计划,则获取最后一条任务日志
|
|
|
DepartmentPlanLog planLog = logMapper.getNewestPlanLog(PlanId);
|
|
|
+ //为员工任务信息表插入实际工作时间
|
|
|
+ String workDate = planLog.getWorkDate();
|
|
|
+ StringBuilder str = new StringBuilder();
|
|
|
+ List<LocalDate> workDaysList = new ArrayList<>();
|
|
|
+ //如果最后一条任务操作是暂停,则直接使用工作日集合
|
|
|
+ if (StringUtils.isNotBlank(workDate)){
|
|
|
+ String[] days = workDate.split(",");
|
|
|
+ if (days != null && days.length > 0){
|
|
|
+ for (String day : days) {
|
|
|
+ workDaysList.add(LocalDate.parse(day));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果最后一条任务操作是开启,则+最后开启时间与提交日期之间的工作日
|
|
|
+ if (planLog.getStatus() == 1){
|
|
|
+ List<LocalDate> list = dateInfoMapper.getWorkDaysList(planLog.getOpenPlanStartTime(), practicalFinishTime);
|
|
|
+ if (list != null && list.size() > 0){
|
|
|
+ workDaysList.addAll(list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<EmployeeTaskInfo> infoList = new ArrayList<>();
|
|
|
+ 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(1);
|
|
|
+ employeeTaskInfo.setPostType(budget.getPostType());
|
|
|
+ employeeTaskInfo.setEmployeeSalary(new BigDecimal(money));
|
|
|
+ infoList.add(employeeTaskInfo);
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.saveBatch(infoList);
|
|
|
+
|
|
|
+
|
|
|
Integer realWorkDays = 0;
|
|
|
//日志类型为暂停,和status=3则 直接用实际工作时间
|
|
|
if (planLog.getStatus() == 0){
|
|
@@ -1409,12 +1634,67 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
}else {
|
|
|
budget.setIsTwoMonth(0);
|
|
|
}
|
|
|
- //如果跨月,则计算开始月人工成本和结束月人工成本
|
|
|
- //
|
|
|
+
|
|
|
baseMapper.updateByBudgetId(budget);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 任务转移审批通过时,计算上一个任务人工作量,并清空workDate
|
|
|
+ * @param PlanId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void taskChangeStats(Long PlanId,Long taskUser) {
|
|
|
+ ProjectCostBudget budget = this.getById(PlanId);
|
|
|
+ //如果为临时任务,则直接跳过
|
|
|
+ DictInfo dictInfo = baseMapper.getTaskType(budget.getPlanTaskType());
|
|
|
+ int taskType = dictInfo.getDictValue().intValue();
|
|
|
+ //计划为固定计划时,则插入工作量,清空workDate
|
|
|
+ if (taskType == 1){
|
|
|
+ //获取任务人工资
|
|
|
+ User userInfo = baseMapper.getUserInfo(taskUser);
|
|
|
+ if (userInfo.getOneMoney() == null){
|
|
|
+ throw new ServiceException("没有为任务人设置工资");
|
|
|
+ }
|
|
|
+ Double money = userInfo.getOneMoney();
|
|
|
+ DepartmentPlanLog planLog = logMapper.getNewestPlanLog(PlanId);
|
|
|
+ //为员工任务信息表插入实际工作时间
|
|
|
+ String workDate = planLog.getWorkDate();
|
|
|
+ List<LocalDate> workDaysList = new ArrayList<>();
|
|
|
+ //直接使用工作日集合
|
|
|
+ if (StringUtils.isNotBlank(workDate)){
|
|
|
+ String[] days = workDate.split(",");
|
|
|
+ if (days != null && days.length > 0){
|
|
|
+ for (String day : days) {
|
|
|
+ workDaysList.add(LocalDate.parse(day));
|
|
|
+ }
|
|
|
+ List<EmployeeTaskInfo> infoList = new ArrayList<>();
|
|
|
+ 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(1);
|
|
|
+ employeeTaskInfo.setPostType(budget.getPostType());
|
|
|
+ employeeTaskInfo.setEmployeeSalary(new BigDecimal(money));
|
|
|
+ infoList.add(employeeTaskInfo);
|
|
|
+ }
|
|
|
+ employeeTaskInfoService.saveBatch(infoList);
|
|
|
+ planLog.setWorkDate("");
|
|
|
+ logMapper.updateById(planLog);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据年份获取所有项目的维护支出
|
|
|
* @return
|
|
@@ -1944,6 +2224,212 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取所有项目截至当年的维护支出,按部门分组,再按月分组,统计总和
|
|
|
+ * @param year
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<Long, Map<Integer, BigDecimal>> getAllMaintainCost10(int year) {
|
|
|
+ //获取所有已分配任务人的维护支出,如果没有返回0
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
+ bab.add(plan.getId());
|
|
|
+ } else {
|
|
|
+ bab.add(plan.getParentId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //查询出所有维护计划,根据项目id分组
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
+ Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
|
|
|
+ //查询出所有项目
|
|
|
+ List<ControlProjectInfo> projectInfos = infoMapper.selectList(new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
+ List<ControlContractInfo> contractList = contractService.getContractByYear(year, budgetMap.keySet());
|
|
|
+ if (contractList == null || contractList.size() <= 0){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ //把合同根据项目分组
|
|
|
+ Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
|
|
|
+ .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
|
|
|
+ //返回结果
|
|
|
+ Map<Integer,List<BigDecimal>> map = new HashMap<>();
|
|
|
+ for (int i = 1; i <= 6; i++) {
|
|
|
+ List<BigDecimal> list = new ArrayList<>();
|
|
|
+ for (int j = 0; j < 12; j++) {
|
|
|
+ list.add(new BigDecimal(0));
|
|
|
+ }
|
|
|
+ map.put(i,list);
|
|
|
+ }
|
|
|
+ //循环项目,
|
|
|
+ for (ControlProjectInfo info : projectInfos) {
|
|
|
+ List<ControlContractInfo> infos = contractMap.get(info.getId());
|
|
|
+ if (infos == null || infos.size() == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
+ ControlContractInfo contract = contractMap.get(info.getId()).get(0);
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
+ //合同开始日期比今天大,直接跳过
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
+ //该项目所有的维护计划,不会为空,
|
|
|
+ List<ProjectCostBudget> list = budgetMap.get(info.getId());
|
|
|
+ //查询出每个部门的维护支出
|
|
|
+ BigDecimal b1 = new BigDecimal(0);
|
|
|
+ BigDecimal b2 = new BigDecimal(0);
|
|
|
+ BigDecimal b3 = new BigDecimal(0);
|
|
|
+ BigDecimal b4 = new BigDecimal(0);
|
|
|
+ BigDecimal b5 = new BigDecimal(0);
|
|
|
+ BigDecimal b6 = new BigDecimal(0);
|
|
|
+ for (ProjectCostBudget l : list) {
|
|
|
+ if (l.getCostType() == 1){
|
|
|
+ b1 = b1.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (l.getCostType() == 2){
|
|
|
+ b2 = b2.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (l.getCostType() == 3){
|
|
|
+ b3 = b3.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (l.getCostType() == 4){
|
|
|
+ b4 = b4.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (l.getCostType() == 5){
|
|
|
+ b5 = b5.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ if (l.getCostType() == 6){
|
|
|
+ b6 = b6.add(l.getBudgetStaffCost());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
+ int startMonth = 0;
|
|
|
+ int endMonth = 0;
|
|
|
+ //判断是否查询今年
|
|
|
+ if (LocalDate.now().getYear() == year){
|
|
|
+ //如果合同开始日期大于今年,则开始时间从一月算起
|
|
|
+ if (startTime.getYear() < year){
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始日期比今天要大,则不计算维护费
|
|
|
+ if (startTime.getMonthValue() > LocalDate.now().getMonthValue()){
|
|
|
+ continue;
|
|
|
+ }else {
|
|
|
+ //开始日期比今天小,从开始日期开始计算
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间,如果合同时间小于当前,就用合同时间 -做结束时间
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
+ endMonth = LocalDate.now().getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //不是今年
|
|
|
+ if (startTime.getYear() > year){
|
|
|
+ continue;
|
|
|
+ }else if (startTime.getYear() < year) {
|
|
|
+ startMonth = 1;
|
|
|
+ }else {
|
|
|
+ //如果合同开始月比1月要大,则用开始日期
|
|
|
+ if (startTime.getMonthValue() > 1){
|
|
|
+ startMonth = startTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ //开始月比1或者等于1,从1开始计算
|
|
|
+ startMonth = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果合同时间大于当前,就用当前时间
|
|
|
+ if (endTime.getYear() > year){
|
|
|
+ endMonth = 12;
|
|
|
+ }else {
|
|
|
+ if (endTime.getMonthValue() < 12) {
|
|
|
+ endMonth = endTime.getMonthValue();
|
|
|
+ }else {
|
|
|
+ endMonth = 12;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //为部门设置值
|
|
|
+ if (b1.intValue() != 0){
|
|
|
+ //获得部门每个月的维护费
|
|
|
+ BigDecimal scale = b1.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ List<BigDecimal> l1 = map.get(1);
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
+ if (i >= startMonth && i <= endMonth){
|
|
|
+ l1.set(i-1,l1.get(i-1).add(scale));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (b2.intValue() != 0){
|
|
|
+ //获得部门每个月的维护费
|
|
|
+ BigDecimal scale = b2.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ List<BigDecimal> l1 = map.get(2);
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
+ if (i >= startMonth && i <= endMonth){
|
|
|
+ l1.set(i-1,l1.get(i-1).add(scale));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (b3.intValue() != 0){
|
|
|
+ //获得部门每个月的维护费
|
|
|
+ BigDecimal scale = b3.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ List<BigDecimal> l1 = map.get(3);
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
+ if (i >= startMonth && i <= endMonth){
|
|
|
+ l1.set(i-1,l1.get(i-1).add(scale));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (b4.intValue() != 0){
|
|
|
+ //获得部门每个月的维护费
|
|
|
+ BigDecimal scale = b4.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ List<BigDecimal> l1 = map.get(4);
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
+ if (i >= startMonth && i <= endMonth){
|
|
|
+ l1.set(i-1,l1.get(i-1).add(scale));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (b5.intValue() != 0){
|
|
|
+ //获得部门每个月的维护费
|
|
|
+ BigDecimal scale = b5.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ List<BigDecimal> l1 = map.get(5);
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
+ if (i >= startMonth && i <= endMonth){
|
|
|
+ l1.set(i-1,l1.get(i-1).add(scale));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (b6.intValue() != 0){
|
|
|
+ //获得部门每个月的维护费
|
|
|
+ BigDecimal scale = b6.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ List<BigDecimal> l1 = map.get(6);
|
|
|
+ for (int i = 1; i <= 12; i++) {
|
|
|
+ if (i >= startMonth && i <= endMonth){
|
|
|
+ l1.set(i-1,l1.get(i-1).add(scale));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* //获取所有项目截至当年的维护支出,按年返回
|
|
|
* @param year
|