Преглед на файлове

Merge remote-tracking branch 'origin/master'

liuyc преди 2 години
родител
ревизия
f23478b8d7

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java

@@ -213,7 +213,7 @@ public class ProjectCostBudgetController {
      * 编辑子计划
      */
     @PostMapping("/updateChildrenPlan")
-    @ApiOperationSupport(order = 15)
+    @ApiOperationSupport(order = 16)
     @ApiOperation(value = "编辑项目计划预算-编辑子计划",notes = "传入主计划,和子计划")
     public R<ProjectCostBudgetVO2> updateChildrenPlan(@RequestBody ProjectCostBudgetVO2 vo2){
         return R.data(budgetService.updateChildrenPlan(vo2));

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

@@ -90,4 +90,6 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<ContractReturnedInfo> getAllReturnedInfo(@Param("projectId") Long id);
 
     DictInfo getTaskType(@Param("id") Long planTaskType);
+
+    User getUserInfo(@Param("userId") Long userId);
 }

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

@@ -271,6 +271,9 @@
         select * from c_dict_info
         where `type` = 2 and  id = #{id}
     </select>
+    <select id="getUserInfo" resultType="org.springblade.system.user.entity.User">
+        select * from blade_user where id = #{userId}
+    </select>
 
 
 </mapper>

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

@@ -28,4 +28,6 @@ public interface IDepartmentPlanLogService extends BaseService<DepartmentPlanLog
     void savePlanInOpen(DepartmentPlanLog log);
 
     DepartmentPlanLogVO updateOpenTime(DepartmentPlanLog log);
+
+    DepartmentPlanLog getNewestTaskLog(Long planId);
 }

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -81,4 +81,7 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     ProjectCostBudgetVO2 updateMainPlan(ProjectCostBudgetVO2 vo2);
 
     ProjectCostBudgetVO2 updateChildrenPlan(ProjectCostBudgetVO2 vo2);
+
+    //任务审批完成闭环时,计算当前任务的实际用时和人工成本,传入任务id和任务实际完成时间
+    void taskFinishedStats(Long PlanId,LocalDate practicalFinishTime);
 }

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentPlanLogImpl.java

@@ -183,4 +183,14 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
         }
         return vo;
     }
+
+    /**
+     * 根据计划id获取计划的最新一条日志
+     * @param planId
+     * @return
+     */
+    @Override
+    public DepartmentPlanLog getNewestTaskLog(Long planId) {
+        return baseMapper.getNewestPlanLog(planId);
+    }
 }

+ 64 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -12,8 +12,10 @@ import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.dto.ProjectCostBudgetStatsDTO;
 import org.springblade.control.entity.*;
+import org.springblade.control.mapper.DepartmentPlanLogMapper;
 import org.springblade.control.mapper.ProjectCostBudgetMapper;
 import org.springblade.control.mapper.ProjectInfoMapper;
+import org.springblade.control.service.IDepartmentPlanLogService;
 import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.service.IProjectInfoService;
 import org.springblade.control.service.IProjectProcessService;
@@ -43,7 +45,7 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBudgetMapper, ProjectCostBudget> implements IProjectCostBudgetService {
 
-//    private final IProjectInfoService projectInfoService;
+    private final DepartmentPlanLogMapper logMapper;
 
     private final ProjectInfoMapper infoMapper;
 
@@ -1133,6 +1135,67 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return vo2;
     }
 
+    /**
+     * 任务完成之后统计工作时间和人工成本
+     * @param PlanId  计划id
+     * @param practicalFinishTime  实际完成时间
+     */
+    @Override
+    public void taskFinishedStats(Long PlanId, LocalDate practicalFinishTime) {
+        //先获取当前计划
+        ProjectCostBudget budget = this.getById(PlanId);
+        budget.setStatus(4);
+        budget.setTaskApprove(1);
+        budget.setPracticalFinishTime(practicalFinishTime);
+        DictInfo dictInfo = baseMapper.getTaskType(budget.getPlanTaskType());
+        int taskType = dictInfo.getDictValue().intValue();
+        //计划为临时计划,则不计算金额直接闭环
+        if (taskType == 2){
+            this.updateById(budget);
+        }else {
+            //获取任务人工资
+            User userInfo = baseMapper.getUserInfo(budget.getTaskUser());
+            if (userInfo.getOneMoney() == null){
+                throw new ServiceException("没有为任务人设置工资");
+            }
+            Double money = userInfo.getOneMoney();
+            //为固定计划,则获取最后一条任务日志
+            DepartmentPlanLog planLog = logMapper.getNewestPlanLog(PlanId);
+            Integer realWorkDays = 0;
+            //日志类型为暂停,和status=3则 直接用实际工作时间
+            if (planLog.getStatus() == 0){
+                //实际工作时间
+                realWorkDays = planLog.getRealWorkDays();
+            }else {
+                //日志类型为开启,和status=2则 计算计划结束时间到中途开启时间 + 实际工作时间
+                if (planLog.getOpenPlanStartTime() == null){
+                    //中途没暂停,开启过任务
+                    if (planLog.getRealPlanStartTime().until(practicalFinishTime, ChronoUnit.DAYS) > 35) {
+                        throw new ServiceException("固定计划完成周期超过一个月,请联系管理员");
+                    }else {
+                        realWorkDays = CommonUtil.getWorkDays(planLog.getRealPlanStartTime(), practicalFinishTime);
+                    }
+                }else {
+                    //中途暂停,开启过任务
+                    //获取上次暂停时实际工作日
+                    Integer days = planLog.getRealWorkDays();
+                    //计算这次开启后到任务完成之间的工作日
+                    if (planLog.getOpenPlanStartTime().until(practicalFinishTime, ChronoUnit.DAYS) > 35) {
+                        throw new ServiceException("固定计划完成周期超过一个月,请联系管理员");
+                    }else {
+                        int day = CommonUtil.getWorkDays(planLog.getOpenPlanStartTime(), practicalFinishTime);
+                        realWorkDays = days + day;
+                    }
+                }
+                //设置status=4,taskAPP=1,实际工资,实际工资天数,实际完成时间,如果计划处于暂停中,那么实际完成时间就是暂停时间
+            }
+            budget.setPracticalTaskDays(new BigDecimal(realWorkDays));
+            //实际人工支出
+            budget.setActualTotalMoney(new BigDecimal(realWorkDays).multiply(new BigDecimal(money)));
+            this.updateById(budget);
+        }
+    }
+
     /**
      * 统计一行的几个总金额
      */