Jelajahi Sumber

项目统计环节费用和费用明细

qianxb 2 tahun lalu
induk
melakukan
7be7f820c7

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

@@ -79,7 +79,7 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "预算备注")
     private String budgetRemark;
 
-    @ApiModelProperty(value = "之前是否审批通过")
+    @ApiModelProperty(value = "成本测算是否审批通过")
     private String approve;
 
     @ApiModelProperty(value = "计划任务类型")
@@ -116,6 +116,12 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "计划天数")
     private BigDecimal planDays;
 
+    @ApiModelProperty(value = "实际任务天数")
+    private BigDecimal practicalTaskDays;
+
+    @ApiModelProperty(value = "任务完成后是否审批通过")
+    private String taskApprove;
+
     @ApiModelProperty(value = "关联回款")
     @JsonSerialize(nullsUsing = NullSerializer.class)
     private Long contractReturnedId;

+ 22 - 4
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectProcessVO.java

@@ -5,6 +5,10 @@ import jdk.net.SocketFlow;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.control.entity.ProjectProcess;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @Param
@@ -18,15 +22,29 @@ public class ProjectProcessVO extends ProjectProcess {
     private String statusValue;
 
     @ApiModelProperty(value = "是否参与")
-    private String isParticipate;
+    private Integer isParticipate;
 
     @ApiModelProperty(value = "成本支出")
-    private String costIncome;
+    private BigDecimal costDisburse;
 
     @ApiModelProperty(value = "时间成本")
-    private String timeCost;
+    private BigDecimal timeCost;
 
     @ApiModelProperty(value = "人员投入")
-    private String staffTotal;
+    private Integer staffTotal;
+
+    @ApiModelProperty(value = "明细")
+    private List<costDetail> costDetails;
+
+    @Data
+    public static class costDetail {
+        @ApiModelProperty(value = "费用类型")
+        private String costTypeValue;
+
+        @ApiModelProperty(value = "费用")
+        private BigDecimal price;
 
+        @ApiModelProperty(value = "总计")
+        private BigDecimal total;
+    }
 }

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

@@ -51,4 +51,6 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     Integer getPostMoney(@Param("type") Integer postType);
 
     List<ProjectCostBudget> getAllBudgetByProjectId(@Param("id") Long id);
+
+    List<ProjectCostBudget> getProjectAllFinishedTask(@Param("projectId") Long projectId,@Param("costType") Integer costType);
 }

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

@@ -121,6 +121,9 @@
     <select id="getAllBudgetByProjectId" resultType="org.springblade.control.entity.ProjectCostBudget">
         select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{id} and pcb.parent_id = 0
     </select>
+    <select id="getProjectAllFinishedTask" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{projectId} and cost_type = #{costType} and pcb.task_approve = 1
+    </select>
 
 
 </mapper>

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

@@ -54,4 +54,6 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     List<Map<String,List<Integer>>> MonthOfYearPlanOverview();
 
     List<ProjectCostBudget> getAllBudgetByProjectId(Long id);
+
+    List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType);
 }

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

@@ -385,6 +385,16 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return baseMapper.getAllBudgetByProjectId(id);
     }
 
+    /**
+     * 获取当前项目所有预算已闭环的任务
+     * @param projectId
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType) {
+        return baseMapper.getProjectAllFinishedTask(projectId,costType);
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 51 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java

@@ -4,16 +4,24 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.entity.ProjectProcess;
 import org.springblade.control.mapper.ProjectProcessMapper;
+import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.service.IProjectProcessService;
 import org.springblade.control.vo.ProjectProcessVO;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.system.entity.TopMenu;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @Param
@@ -24,6 +32,7 @@ import java.util.List;
 @AllArgsConstructor
 public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMapper, ProjectProcess> implements IProjectProcessService {
     private final ProjectProcessMapper processMapper;
+    private final IProjectCostBudgetService budgetService;
 
     /**
      * 新增项目时保存进程
@@ -109,6 +118,48 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
      */
     @Override
     public List<ProjectProcessVO> processService(Long projectId, Integer costType) {
+        //获取当前项目所有项目环节
+        List<ProjectProcessVO> list = processMapper.getProjectProcess(projectId);
+        //获取项目具体部门所有已闭环的任务
+        List<ProjectCostBudget> budgets = budgetService.getProjectAllFinishedTask(projectId,costType);
+        if (budgets != null || budgets.size() > 0){
+            //获取项目环节的set集合
+            Set<Long> set = budgets.stream().map(l -> l.getProjectProcess()).collect(Collectors.toSet());
+            //根据项目环节分组
+            Map<Long, List<ProjectCostBudget>> map = budgets.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudget::getProjectProcess));
+            //包含此环节就统计,不包含就跳出
+            for (ProjectProcessVO vo : list) {
+                if (set.contains(vo.getId())){
+                    //设置参与
+                    vo.setIsParticipate(1);
+                    //时间成本统计总天数,人员投入统计总人数,成本支出统计当前环节总支出
+                    List<ProjectCostBudget> budgetList = map.get(vo.getId());
+                    BigDecimal costDisburse = new BigDecimal(0);
+                    BigDecimal timeCost = new BigDecimal(0);
+                    int staffTotal = budgetList.size();
+                    for (ProjectCostBudget budget : budgetList) {
+                        costDisburse = costDisburse.add(budget.getActualTotalMoney());
+                        timeCost = timeCost.add(budget.getPracticalTaskDays());
+                    }
+                    //设置费用明细
+                    List<ProjectProcessVO.costDetail> details = new ArrayList<>();
+                    ProjectProcessVO.costDetail costDetail = new ProjectProcessVO.costDetail();
+                    costDetail.setCostTypeValue("人工成本");
+                    costDetail.setPrice(costDisburse);
+                    costDetail.setTotal(costDisburse);
+                    details.add(costDetail);
+                    //目前环节费用的成本支出只统计了人工成本
+                    vo.setCostDisburse(costDisburse);
+                    vo.setTimeCost(timeCost);
+                    vo.setStaffTotal(staffTotal);
+                    vo.setCostDetails(details);
+                }else {
+                    vo.setIsParticipate(0);
+                }
+            }
+            return list;
+        }
         return null;
     }
 }