ソースを参照

Merge remote-tracking branch 'origin/master' into master

yangyj 2 年 前
コミット
caee7fe3f3
33 ファイル変更645 行追加134 行削除
  1. 2 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/PlanInform.java
  2. 18 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectReimburseVO.java
  3. 0 5
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
  4. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/PlanInformController.java
  5. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectInfoController.java
  6. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanInformMapper.java
  7. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanInformMapper.xml
  8. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  9. 13 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  10. 14 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java
  11. 32 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  12. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectProcessMapper.java
  13. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectProcessMapper.xml
  14. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IPlanInformService.java
  15. 20 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  16. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectProcessService.java
  17. 83 15
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  18. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  19. 23 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanInformServiceImpl.java
  20. 22 3
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  21. 9 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetStatsServiceImpl.java
  22. 201 5
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  23. 102 37
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java
  24. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java
  25. 15 0
      blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java
  26. 8 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.java
  27. 11 0
      blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.xml
  28. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/service/IDeptService.java
  29. 7 0
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java
  30. 0 58
      blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java
  31. 0 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml
  32. 26 0
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java
  33. 0 3
      blade-service/blade-user/src/main/java/org/springblade/system/user/wrapper/UserWrapper.java

+ 2 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/PlanInform.java

@@ -10,6 +10,7 @@ import org.springblade.core.mp.base.BaseEntity;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 
 /**
  * @Param
@@ -34,6 +35,6 @@ public class PlanInform extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "通知时间")
-    private LocalDate informDate;
+    private LocalDateTime informDate;
 
 }

+ 18 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectReimburseVO.java

@@ -0,0 +1,18 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMFinancialReimbursementInfo;
+
+/**
+ * 报销加上项目进程
+ */
+@Data
+public class ProjectReimburseVO extends EMFinancialReimbursementInfo {
+
+    @ApiModelProperty(value = "项目进程id")
+    private Long projectProcess;
+
+    @ApiModelProperty(value = "费用分类")
+    private Integer costType;
+}

+ 0 - 5
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java

@@ -164,9 +164,4 @@ public class User extends TenantEntity {
     @ApiModelProperty(value = "日单价")
     private Double oneMoney;
 
-    /**
-     * 职位
-     */
-    @ApiModelProperty(value = "机构信息")
-    private String deptInfo;
 }

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

@@ -43,4 +43,7 @@ public class PlanInformController {
     public R<List<PlanInform>> getUserInform() {
         return R.data(informService.getUserInform());
     }
+
+
+
 }

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectInfoController.java

@@ -19,7 +19,9 @@ import org.springblade.core.tool.api.R;
 import org.springblade.system.user.entity.User;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Param
@@ -156,4 +158,6 @@ public class ProjectInfoController {
         return R.data(projectInfoService.getImplementUser());
     }
 
+
+
 }

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

@@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.PlanInform;
 
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
@@ -13,4 +15,5 @@ import org.springblade.control.entity.PlanInform;
 public interface PlanInformMapper extends BaseMapper<PlanInform> {
 
 
+    List<PlanInform> getUserInform(@Param("userId") Long userId);
 }

+ 6 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanInformMapper.xml

@@ -2,4 +2,10 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.control.mapper.PlanInformMapper">
 
+    <select id="getUserInform" resultType="org.springblade.control.entity.PlanInform">
+        select * from c_plan_inform
+        WHERE inform_user = #{userId} AND DATE_FORMAT(inform_date,'%Y-%m-%d') &gt;= DATE_FORMAT(date_add(NOW() , interval '-2' DAY),'%Y-%m-%d')
+        order by inform_date desc
+        limit 5
+    </select>
 </mapper>

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

@@ -98,4 +98,6 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<ProjectCostBudget> getAllMaintainPlan2(@Param("projectId")Long projectId);
 
     List<ProjectCostBudget> getAllMaintainPlan3(@Param("projectId")Long projectId,@Param("costType")Integer costType);
+
+    void updateByBudgetId(@Param("budget") ProjectCostBudget budget);
 }

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

@@ -4,6 +4,18 @@
     <update id="updateStatus">
         update c_project_cost_budget set status = #{status} where id = #{id}
     </update>
+    <update id="updateByBudgetId">
+        update
+            c_project_cost_budget
+        set
+            practical_task_days = #{budget.practicalTaskDays},
+            practical_finish_time = #{budget.practicalFinishTime},
+            task_approve = #{budget.taskApprove},
+            actual_total_money = #{budget.actualTotalMoney},
+            status = #{budget.status}
+        where
+            id = #{budget.id}
+    </update>
 
     <delete id="removeOldBudget">
         delete from c_project_cost_budget
@@ -166,7 +178,7 @@
         </if>
     </select>
     <select id="getAllChildrenPlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
-        SELECT pcb.plan_task_type,pcb.plan_task_desc,pcb.plan_target,pcb.plan_start_time,pcb.plan_end_time,pcb.plan_days,id,parent_id,status,task_approve,
+        SELECT pcb.*,
                (select cpp.name from c_project_process cpp where cpp.id = pcb.project_process) as projectProcessValue,
                (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0) as budgetTypeValue,
                (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.task_detail and di.parent_id =

+ 14 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java

@@ -6,11 +6,14 @@ import org.apache.ibatis.annotations.Param;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.ControlProjectInfo;
 import org.springblade.control.entity.DictInfo;
+import org.springblade.control.entity.EMFinancialReimbursementInfo;
 import org.springblade.control.vo.AllProjectStatsVO;
 import org.springblade.control.vo.ControlProjectInfoVO;
+import org.springblade.control.vo.ProjectReimburseVO;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -40,4 +43,15 @@ public interface ProjectInfoMapper extends BaseMapper<ControlProjectInfo> {
     List<ControlProjectInfo> listByYear(@Param("year") int year);
 
     List<User> getImplementUser();
+
+    BigDecimal getThisYearReimburse(@Param("year") int year);
+
+    List<EMFinancialReimbursementInfo> getYearReimburseByMonth(@Param("year") int year);
+
+    //返回报销对应的进程
+    List<ProjectReimburseVO> getProjectReimburse(@Param("projectId") Long projectId);
+    //返回报销对应的费用分类
+    List<ProjectReimburseVO> getProjectReimburse2(@Param("projectId") Long projectId);
+    //返回指定项目,指定费用分类对应的进程
+    List<ProjectReimburseVO> getProjectReimburse3(@Param("projectId") Long projectId,@Param("costType") Integer costType);
 }

+ 32 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml

@@ -85,6 +85,38 @@
         select bu.id,bu.name from blade_user bu WHERE id in
          (SELECT cpi.implement_principal from c_control_project_info cpi WHERE cpi.is_deleted = 0 GROUP by cpi.implement_principal)
     </select>
+    <select id="getThisYearReimburse" resultType="java.math.BigDecimal">
+        SELECT SUM(fri.fr_money)
+        FROM c_control_project_info cpi left join c_expense_financial_reimbursement_info fri on cpi.id  = fri.project_id
+        WHERE cpi.is_deleted = 0 and fri.is_deleted = 0 and fri.status = 2
+        <if test="year != 0">
+            and #{year} = DATE_FORMAT(fri.fr_date ,'%Y')
+        </if>
+    </select>
+    <select id="getYearReimburseByMonth"
+            resultType="org.springblade.control.entity.EMFinancialReimbursementInfo">
+        SELECT fri.*
+        FROM c_control_project_info cpi left join c_expense_financial_reimbursement_info fri on cpi.id  = fri.project_id
+        WHERE cpi.is_deleted = 0 and fri.is_deleted = 0 and fri.status = 2
+        <if test="year != 0">
+            and #{year} = DATE_FORMAT(fri.fr_date ,'%Y')
+        </if>
+    </select>
+    <select id="getProjectReimburse" resultType="org.springblade.control.vo.ProjectReimburseVO">
+        SELECT fri.*,pcb.project_process
+        FROM  c_expense_financial_reimbursement_info fri inner join c_project_cost_budget pcb on fri.budget_plan_ids = pcb.id
+        WHERE fri.is_deleted = 0 and fri.status = 2 and fri.project_id = #{projectId} and fri.budget_plan_ids > 0
+    </select>
+    <select id="getProjectReimburse2" resultType="org.springblade.control.vo.ProjectReimburseVO">
+        SELECT fri.*,pcb.cost_type
+        FROM  c_expense_financial_reimbursement_info fri inner join c_project_cost_budget pcb on fri.budget_plan_ids = pcb.id
+        WHERE fri.is_deleted = 0 and fri.status = 2 and fri.project_id = #{projectId} and fri.budget_plan_ids > 0
+    </select>
+    <select id="getProjectReimburse3" resultType="org.springblade.control.vo.ProjectReimburseVO">
+        SELECT fri.*,pcb.project_process
+        FROM  c_expense_financial_reimbursement_info fri inner join c_project_cost_budget pcb on fri.budget_plan_ids = pcb.id
+        WHERE fri.is_deleted = 0 and fri.status = 2 and fri.project_id = #{projectId} and and pcb.costType = #{costType} and fri.budget_plan_ids > 0
+    </select>
 
 
 </mapper>

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectProcessMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.ProjectProcess;
 import org.springblade.control.vo.ProjectProcessVO;
+import org.springblade.control.vo.ProjectReimburseVO;
 
 import java.util.List;
 
@@ -16,4 +17,7 @@ public interface ProjectProcessMapper extends BaseMapper<ProjectProcess> {
     List<ProjectProcessVO> getBaseProcess();
 
     List<ProjectProcessVO> getProjectProcess(@Param("id") Long id);
+
+    //返回指定项目,指定费用分类对应的进程
+    List<ProjectReimburseVO> getProjectReimburse3(@Param("projectId") Long projectId, @Param("costType") Integer costType);
 }

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

@@ -14,4 +14,9 @@
         WHERE project_id = #{id}
         order by sort
     </select>
+    <select id="getProjectReimburse3" resultType="org.springblade.control.vo.ProjectReimburseVO">
+        SELECT fri.*,pcb.project_process
+        FROM  c_expense_financial_reimbursement_info fri inner join c_project_cost_budget pcb on fri.budget_plan_ids = pcb.id
+        WHERE fri.is_deleted = 0 and fri.status = 2 and fri.project_id = #{projectId} and pcb.cost_type = #{costType} and fri.budget_plan_ids > 0
+    </select>
 </mapper>

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

@@ -14,4 +14,7 @@ import java.util.List;
 public interface IPlanInformService extends BaseService<PlanInform> {
 
     List<PlanInform> getUserInform();
+
+    //任务完成,传入任务名称.任务人和审批人
+    void taskFinishedInform(String taskName,Long taskUser,String appUser);
 }

+ 20 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java

@@ -11,7 +11,9 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.user.entity.User;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Param
@@ -43,4 +45,22 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
 
     List<User> getImplementUser();
 
+    //获取当年所有的报销
+    BigDecimal getThisYearReimburse(int year);
+
+    //获取所有项目截至当年的报销支出,分月返回
+    Map<Long,List<BigDecimal>> getYearReimburseByMonth(int year);
+
+    //获取所有项目截至当年的报销支出,按年返回
+    Map<Long,BigDecimal> getYearReimburseByYear(int year);
+
+    //获取指定项目截至报销支出,按项目进程返回
+    Map<Long,BigDecimal> getProjectReimburseByProcess(Long projectId);
+
+    //获取指定项目截至报销支出,按项目进程返回
+    Map<Integer,BigDecimal> getProjectReimburseByCostType(Long projectId);
+
+    //根据项目id获取项目截至目前-某个费用分类的的报销支出,按项目环节返回
+    Map<Long,BigDecimal> getProjectReimburseByCostType(Long projectId,Integer costType);
+
 }

+ 5 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectProcessService.java

@@ -5,7 +5,9 @@ import org.springblade.control.entity.ProjectProcess;
 import org.springblade.control.vo.ProjectProcessVO;
 import org.springblade.core.mp.base.BaseService;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Param
@@ -25,4 +27,7 @@ public interface IProjectProcessService extends BaseService<ProjectProcess> {
 
     List<ProjectProcessVO> processService(Long projectId, Integer costType);
 
+    //根据项目id获取项目截至目前-某个费用分类的的报销支出,按项目环节返回
+    Map<Long, BigDecimal> getProjectReimburseByCostType(Long projectId, Integer costType);
+
 }

+ 83 - 15
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -328,10 +328,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         vo3.setYearReturned(yearReturned);
 
         //统计今年的已盈利:已收入-支出 ,目前已支出只统计闭环的计划
-        //获取年人工支出
+        //获取年人工支出
         BigDecimal yearStaffDisburse = budgetService.getYearStaffDisburse(year);
+        //获取今年维护支出
         BigDecimal cost = budgetService.getAllMaintainCost(LocalDate.now().getYear());
-        vo3.setYearProfit(yearReturned.subtract(yearStaffDisburse).subtract(cost));
+        //获取今年报销支出
+        BigDecimal decimal = projectInfoService.getThisYearReimburse(LocalDate.now().getYear());
+        vo3.setYearProfit(yearReturned.subtract(yearStaffDisburse).subtract(cost).subtract(decimal));
 
         //获取今年的年度预算
         AnnualBudget annualBudget = baseMapper.getThisYearBudget(year);
@@ -408,7 +411,9 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }else {
             cost = budgetService.getAllMaintainCost(y);
         }
-        map.put("yearStaffDisburse",yearStaffDisburse.add(cost));
+        //报销支出
+        BigDecimal yearReimburse = projectInfoService.getThisYearReimburse(y);
+        map.put("yearStaffDisburse",yearStaffDisburse.add(cost).add(yearReimburse));
         //总计划支出:年度预算总计划支出
         if (y == 0){
             List<AnnualBudget> list = baseMapper.getAllYearBudget(y);
@@ -467,9 +472,15 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         //维护支出
         Map<Long, List<BigDecimal>> listMap = budgetService.getAllMaintainCost3(y);
         Boolean isMaintain = true;
-        if (listMap == null && listMap.size() <= 0){
+        if (listMap == null || listMap.size() <= 0){
             isMaintain = false;
         }
+        //报销支出
+        Map<Long, List<BigDecimal>> reimburseMap = projectInfoService.getYearReimburseByMonth(y);
+        Boolean isReimburse = true;
+        if (reimburseMap == null || reimburseMap.size() <= 0){
+            isReimburse = false;
+        }
         for (ControlProjectInfo project : list) {
             AnnualProjectCostVO vo = new AnnualProjectCostVO();
             List<Integer> integerList = new ArrayList<>();
@@ -490,6 +501,14 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                         big = big.add(decimals.get(i -1));
                     }
                 }
+                //计算报销
+                if (isReimburse){
+                    List<BigDecimal> decimals = reimburseMap.get(project.getId());
+                    if (decimals != null && decimals.size() > 0){
+                        big = big.add(decimals.get(i -1));
+                    }
+                }
+
                 integerList.add(big.intValue());
             }
             vo.setName(project.getName());
@@ -645,6 +664,12 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         if (listMap == null || listMap.size() <= 0){
             isMaintain = false;
         }
+        //报销支出
+        Map<Long, BigDecimal> reimburseMap = projectInfoService.getYearReimburseByYear(Integer.parseInt(date.substring(0,4)));
+        Boolean isReimburse = true;
+        if (reimburseMap == null || reimburseMap.size() <= 0){
+            isReimburse = false;
+        }
         List<ProjectIncomeCostRatioVO> vos = new ArrayList<>();
         //按年获取闭环任务,根据项目分组
         List<ProjectCostBudget> costByMonth = budgetService.getPlanPracticalCostByMonth(date.substring(0,4));
@@ -666,17 +691,31 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }
         Map<Long, List<ProjectCostBudget>> map = costByMonth.parallelStream()
                 .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
-        //为每个合同设置支出
+        //为每个项目设置支出
         for (ControlProjectInfo info : list) {
             ProjectIncomeCostRatioVO vo = new ProjectIncomeCostRatioVO();
             vo.setProjectName(info.getName());
             BigDecimal big = new BigDecimal(0);
+            //获取人工支出
             List<ProjectCostBudget> budgets = map.get(info.getId());
             if (budgets != null && budgets.size() > 0){
                 for (ProjectCostBudget budget : budgets) {
                     big = big.add(budget.getActualTotalMoney());
                 }
             }
+            //维护支出
+            if (isMaintain){
+                if (listMap.get(info.getId()) != null){
+                    big = big.add(listMap.get(info.getId()));
+                }
+            }
+            //计算报销
+            if (isReimburse){
+                BigDecimal decimals = reimburseMap.get(info.getId());
+                if (decimals != null){
+                    big = big.add(decimals);
+                }
+            }
             vo.setProjectCost(big.intValue());
             vos.add(vo);
         }
@@ -746,12 +785,18 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         //获取项目所有已经闭环的计划
         List<ProjectCostBudget> finishedTask = budgetService.getProjectAllFinishedTask(projectId, null);
         Map<Long, List<ProjectCostBudget>> collect = new HashMap<>();
-        boolean isPlan = false ;
+        boolean isPlan = true ;
         if (finishedTask != null && finishedTask.size() > 0){
             collect = finishedTask.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudget::getProjectProcess));
         }else {
-            isPlan = true;
+            isPlan = false;
+        }
+        //项目每个进程的报销支出
+        Map<Long, BigDecimal> reimburseMap = projectInfoService.getProjectReimburseByProcess(projectId);
+        Boolean isReimburse = true;
+        if (reimburseMap == null || reimburseMap.size() <= 0){
+            isReimburse = false;
         }
         //把计划根据进程分组
         //为每个进程设置值
@@ -793,8 +838,14 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 vo.setProcessProgressBar(0);
             }
             //设置进程支出金额,目前只统计人工支出
-            if (isPlan){
-                vo.setProcessCostCount(new BigDecimal(0));
+            if (!isPlan){
+                if (isReimburse){
+                    if (reimburseMap.get(process.getId()) != null){
+                        vo.setProcessCostCount(reimburseMap.get(process.getId()));
+                    }
+                }else {
+                    vo.setProcessCostCount(new BigDecimal(0));
+                }
             }else {
                 List<ProjectCostBudget> budgets = collect.get(process.getId());
                 if (budgets != null && budgets.size() > 0){
@@ -803,9 +854,20 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     for (ProjectCostBudget budget : budgets) {
                         big = big.add(budget.getActualTotalMoney());
                     }
+                    if (isReimburse){
+                        if (reimburseMap.get(process.getId()) != null){
+                            big = big.add(reimburseMap.get(process.getId()));
+                        }
+                    }
                     vo.setProcessCostCount(big);
                 }else {
-                    vo.setProcessCostCount(new BigDecimal(0));
+                    if (isReimburse){
+                        if (reimburseMap.get(process.getId()) != null){
+                            vo.setProcessCostCount(reimburseMap.get(process.getId()));
+                        }
+                    }else {
+                        vo.setProcessCostCount(new BigDecimal(0));
+                    }
                 }
             }
             //设置进程支出金额百分比,统计实际支出和预算的百分比
@@ -813,17 +875,23 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 List<ProjectCostBudget> budgets = collect2.get(process.getId());
                 if (budgets != null && budgets.size() > 0) {
                     BigDecimal allMoney = new BigDecimal(0);
-                    BigDecimal costMoney = new BigDecimal(0);
+//                    BigDecimal costMoney = new BigDecimal(0);
                     for (ProjectCostBudget budget : budgets) {
                         if (budget.getBudgetCountMoney() == null){
                             budget.setBudgetCountMoney(new BigDecimal(0));
                         }
                         allMoney = allMoney.add(budget.getBudgetCountMoney());
-                        if (budget.getTaskApprove() == 1) {
-                            costMoney = costMoney.add(budget.getActualTotalMoney());
-                        }
+//                        //统计人工支出
+//                        if (budget.getTaskApprove() == 1) {
+//                            costMoney = costMoney.add(budget.getActualTotalMoney());
+//                        }
+                    }
+                    //统计报销支出
+                    if (vo.getProcessCostCount() != null && allMoney.intValue() != 0){
+                        vo.setProcessCostProgressBar(vo.getProcessCostCount().divide(allMoney, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+                    }else {
+                        vo.setProcessProgressBar(0);
                     }
-                    vo.setProcessCostProgressBar(costMoney.divide(allMoney, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
                 } else {
                     vo.setProcessCostProgressBar(0);
                 }

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

@@ -25,6 +25,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -149,7 +150,7 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
                     PlanInform inform = new PlanInform();
                     inform.setInformDetails("《"+budget.getPlanTaskDesc()+"》您有一条新任务");
                     inform.setInformUser(budget.getTaskUser());
-                    inform.setInformDate(LocalDate.now());
+                    inform.setInformDate(LocalDateTime.now());
                     planInformService.save(inform);
                 }
             }

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

@@ -25,6 +25,8 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -37,10 +39,29 @@ import java.util.List;
 public class PlanInformServiceImpl extends BaseServiceImpl<PlanInformMapper, PlanInform> implements IPlanInformService {
 
 
+    /**
+     * 获取用户最近两天的通知
+     * @return
+     */
     @Override
     public List<PlanInform> getUserInform() {
-        //没有用户
         Long userId = SecureUtil.getUserId();
-        return this.list(new LambdaQueryWrapper<PlanInform>().eq(PlanInform::getInformUser,userId).orderByDesc(PlanInform::getInformDate).last("limit 5"));
+        return baseMapper.getUserInform(userId);
+    }
+
+    /**
+     * 任务审批后插入日志信息
+     * @param taskName 任务名称
+     * @param taskUser 任务人Id
+     * @param appUserName 审批人名称
+     */
+    @Override
+    public void taskFinishedInform(String taskName, Long taskUser, String appUserName) {
+        String str = "《"+taskName+"》"+"已被"+"【"+appUserName+"】"+"变成为已完成状态";
+        PlanInform inform = new PlanInform();
+        inform.setInformDetails(str);
+        inform.setInformUser(taskUser);
+        inform.setInformDate(LocalDateTime.now());
+        baseMapper.insert(inform);
     }
 }

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

@@ -914,7 +914,12 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                             }
                         }
                         if (total.compareTo(new BigDecimal(0)) != 0) {
-                            ratios.add(finished.divide(total, 2,RoundingMode.HALF_UP).multiply(new BigDecimal(100)).intValue());
+                            int i = finished.divide(total, 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).intValue();
+                            if (i > 100){
+                                i = 100;
+                            }
+                            ratios.add(i);
+
                         } else {
                             ratios.add(0);
                         }
@@ -1027,6 +1032,17 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         //如果子计划为空,则清空父计划,然后修改可以编辑父计划
         List<ProjectCostBudgetVO2> list = vo2.getChildrenList();
         if (list != null && list.size() > 0){
+            //查看进行中的子计划的任务类型是否被更改
+            for (ProjectCostBudgetVO2 vo : list) {
+                if (vo.getIsShowDelete() != null) {
+                    if (vo.getIsShowDelete() == 0) {
+                        ProjectCostBudget budget = this.getById(vo.getId());
+                        if (!budget.getPlanTaskType().equals(vo.getPlanTaskType())) {
+                            throw new ServiceException("不能更改正在进行中或已完成的子计划类型");
+                        }
+                    }
+                }
+            }
             //获取子计划任务类型,用于判断子计划类型是否一致
             ProjectCostBudgetVO2 budgetVO2 = list.get(0);
             Long taskType;
@@ -1059,7 +1075,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 if (!taskType.equals(l.getPlanTaskType())){
                     throw new ServiceException("子计划任务类型不一致");
                 }
-                if (budgetVO2.getTaskApprove() == null || budgetVO2.getTaskApprove() != 1){
+                if (l.getTaskApprove() == null || l.getTaskApprove() != 1){
                     isFinished = false;
                 }
                 //计算总天数
@@ -1155,6 +1171,9 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
      */
     @Override
     public void taskFinishedStats(Long PlanId, LocalDate practicalFinishTime) {
+        if (practicalFinishTime == null){
+            throw new ServiceException("请传入任务完成时间");
+        }
         //先获取当前计划
         ProjectCostBudget budget = this.getById(PlanId);
         budget.setStatus(4);
@@ -1205,7 +1224,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             budget.setPracticalTaskDays(new BigDecimal(realWorkDays));
             //实际人工支出
             budget.setActualTotalMoney(new BigDecimal(realWorkDays).multiply(new BigDecimal(money)));
-            this.updateById(budget);
+            baseMapper.updateByBudgetId(budget);
         }
     }
 

+ 9 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetStatsServiceImpl.java

@@ -99,6 +99,15 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
         if (stats.getApprove() == 1) {
             throw new ServiceException("已经审批通过,不能删除");
         }
+        //判断是否有预算正在审批中
+        List<ProjectCostBudget> list = budgetService.list(new LambdaQueryWrapper<ProjectCostBudget>().eq(ProjectCostBudget::getProjectId, stats.getProjectId()));
+        if (list != null && list.size() > 0){
+            for (ProjectCostBudget budget : list) {
+                if (budget.getApprove() == 2){
+                    throw new ServiceException("预算正在审批中,不能删除");
+                }
+            }
+        }
         //先删除成本详情
         budgetService.deleteByProjectId(stats.getProjectId());
         //再删除成本统计

+ 201 - 5
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -11,6 +11,7 @@ import org.springblade.control.mapper.ProjectInfoMapper;
 import org.springblade.control.service.*;
 import org.springblade.control.vo.AllProjectStatsVO;
 import org.springblade.control.vo.ControlProjectInfoVO;
+import org.springblade.control.vo.ProjectReimburseVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
@@ -26,10 +27,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -165,7 +166,9 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         AllProjectStatsVO vo = baseMapper.allProjectStats();
         //获取截至目前所有维护支出
         BigDecimal cost2 = budgetService.getAllMaintainCost2();
-        vo.setAllPracticalDisburse(vo.getAllPracticalDisburse().add(cost2));
+        //所有的报销支出
+        BigDecimal decimal = this.getThisYearReimburse(0);
+        vo.setAllPracticalDisburse(vo.getAllPracticalDisburse().add(cost2).add(decimal));
         return vo;
     }
 
@@ -175,20 +178,35 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
     @Override
     public List<AllProjectStatsVO> ProjectListStats() {
         List<AllProjectStatsVO> vos = baseMapper.ProjectListStats();
+        //获取维护支出
         Map<Long, BigDecimal> map = budgetService.getAllMaintainCost5();
         Boolean isMaintain = true;
         if (map == null || map.size() <= 0){
             isMaintain = false;
         }
+        //报销支出
+        Map<Long, BigDecimal> reimburseMap = this.getYearReimburseByYear(0);
+        Boolean isReimburse = true;
+        if (reimburseMap == null || reimburseMap.size() <= 0){
+            isReimburse = false;
+        }
         for (AllProjectStatsVO vo : vos) {
             if (isMaintain) {
                 BigDecimal decimal = map.get(vo.getProjectId());
+                //维护支出
                 if (decimal != null) {
                     if (vo.getPracticalPayCost() == null){
                         vo.setPracticalPayCost(new BigDecimal(0));
                     }
                     vo.setPracticalPayCost(vo.getPracticalPayCost().add(decimal));
                 }
+                //计算报销
+                if (isReimburse){
+                    BigDecimal decimals = reimburseMap.get(vo.getProjectId());
+                    if (decimals != null){
+                        vo.setPracticalPayCost(vo.getPracticalPayCost().add(decimals));
+                    }
+                }
             }
         }
         return vos;
@@ -214,6 +232,13 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         if (map == null || map.size() <= 0){
             isMaintain = false;
         }
+
+        //报销支出
+        Map<Integer, BigDecimal> reimburseMap = this.getProjectReimburseByCostType(id);
+        Boolean isReimburse = true;
+        if (reimburseMap == null || reimburseMap.size() <= 0){
+            isReimburse = false;
+        }
         //获取项目所有实际费用
         List<ProjectCostBudget> practicalList = budgetService.getAllPracticalBudgetByProjectId(id);
         if (budgets != null && budgets.size() > 0){
@@ -255,6 +280,13 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                         practicalCost = practicalCost.add(decimal);
                     }
                 }
+                //加上每个部门的报销支出
+                if (isReimburse){
+                    BigDecimal decimals = reimburseMap.get(i);
+                    if (decimals != null){
+                        practicalCost = practicalCost.add(decimals);
+                    }
+                }
                 vo.setPracticalCost(practicalCost);
                 list.add(vo);
             }
@@ -307,5 +339,169 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         return baseMapper.getImplementUser();
     }
 
+    /**
+     * 获取当年所有的报销
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getThisYearReimburse(int year) {
+        BigDecimal decimal = baseMapper.getThisYearReimburse(year);
+        if (decimal == null){
+            decimal = new BigDecimal(0);
+        }
+        return decimal;
+    }
+
+    /**
+     * 获取所有项目截至当年的报销支出,分月返回
+     * @param year
+     * @return
+     */
+    @Override
+    public Map<Long, List<BigDecimal>> getYearReimburseByMonth(int year) {
+        List<EMFinancialReimbursementInfo> list = baseMapper.getYearReimburseByMonth(year);
+        if (list != null && list.size() > 0){
+            Map<Long, List<BigDecimal>> result = new HashMap<>();
+            //按项目分组
+            Map<Long, List<EMFinancialReimbursementInfo>> map = list.parallelStream()
+                    .collect(Collectors.groupingBy(EMFinancialReimbursementInfo::getProjectId));
+            //再计算每个月的总报销额
+            //循环项目
+            for (Long aLong : map.keySet()) {
+                List<BigDecimal> decimals = new ArrayList<>();
+                for (int i = 0; i < 12; i++) {
+                    decimals.add(new BigDecimal(0));
+                }
+                List<EMFinancialReimbursementInfo> infoList = map.get(aLong);
+                //循环项目下的所有报销
+                for (EMFinancialReimbursementInfo info : infoList) {
+                    Date frDate = info.getFrDate();
+                    Instant instant = frDate.toInstant();
+                    ZoneId zoneId = ZoneId.systemDefault();
+                    LocalDate localDate = instant.atZone(zoneId).toLocalDate();
+                    decimals.set(localDate.getMonthValue() - 1,decimals.get(localDate.getMonthValue() - 1).add(info.getFrMoney()));
+                }
+                result.put(aLong,decimals);
+            }
+            return result;
+        }
+        return null;
+    }
+
+    /**
+     * 获取所有项目截至当年的报销支出,按年返回
+     * @param year
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getYearReimburseByYear(int year) {
+        List<EMFinancialReimbursementInfo> list = baseMapper.getYearReimburseByMonth(year);
+        if (list != null && list.size() > 0){
+            Map<Long, BigDecimal> result = new HashMap<>();
+            //按项目分组
+            Map<Long, List<EMFinancialReimbursementInfo>> map = list.parallelStream()
+                    .collect(Collectors.groupingBy(EMFinancialReimbursementInfo::getProjectId));
+            //再计算每个月的总报销额
+            //循环项目
+            for (Long aLong : map.keySet()) {
+              BigDecimal big = new BigDecimal(0);
+                List<EMFinancialReimbursementInfo> infoList = map.get(aLong);
+                //循环项目下的所有报销
+                for (EMFinancialReimbursementInfo info : infoList) {
+                    big = big.add(info.getFrMoney());
+                }
+                result.put(aLong,big);
+            }
+            return result;
+        }
+        return null;
+    }
+
+    /**
+     * 获取指定项目截至报销支出,按项目进程返回
+     * @param projectId
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getProjectReimburseByProcess(Long projectId) {
+        //获取项目的所有关联进程的报销
+        List<ProjectReimburseVO> infos = baseMapper.getProjectReimburse(projectId);
+        if (infos == null || infos.size() <= 0){
+            return null;
+        }
+        //按照项目进程分组
+        Map<Long, List<ProjectReimburseVO>> map = infos.parallelStream()
+                .collect(Collectors.groupingBy(ProjectReimburseVO::getProjectProcess));
+        Map<Long, BigDecimal> decimalMap = new HashMap<>();
+        //统计每个进程的报销总和
+        for (Long aLong : map.keySet()) {
+            BigDecimal big = new BigDecimal(0);
+            List<ProjectReimburseVO> list = map.get(aLong);
+            for (ProjectReimburseVO vo : list) {
+                big = big.add(vo.getFrMoney());
+            }
+            decimalMap.put(aLong,big);
+        }
+        return decimalMap;
+    }
+
+    /**
+     * 获取指定项目截至报销支出,按费用分类返回
+     * @param projectId
+     * @return
+     */
+    @Override
+    public Map<Integer, BigDecimal> getProjectReimburseByCostType(Long projectId) {
+        //获取项目的所有关联进程的报销
+        List<ProjectReimburseVO> infos = baseMapper.getProjectReimburse2(projectId);
+        if (infos == null || infos.size() <= 0){
+            return null;
+        }
+        //按照项目费用分类分组
+        Map<Integer, List<ProjectReimburseVO>> map = infos.parallelStream()
+                .collect(Collectors.groupingBy(ProjectReimburseVO::getCostType));
+        Map<Integer, BigDecimal> decimalMap = new HashMap<>();
+        //统计每个分类的报销总和
+        for (Integer aLong : map.keySet()) {
+            BigDecimal big = new BigDecimal(0);
+            List<ProjectReimburseVO> list = map.get(aLong);
+            for (ProjectReimburseVO vo : list) {
+                big = big.add(vo.getFrMoney());
+            }
+            decimalMap.put(aLong,big);
+        }
+        return decimalMap;
+    }
+
+    /**
+     * 根据项目id获取项目截至目前-某个费用分类的的报销支出,按项目环节返回
+     * @param projectId
+     * @param costType
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getProjectReimburseByCostType(Long projectId, Integer costType) {
+        //获取项目的所有关联进程的报销
+        List<ProjectReimburseVO> infos = baseMapper.getProjectReimburse3(projectId, costType);
+        if (infos == null || infos.size() <= 0) {
+            return null;
+        }
+        //按照项目进程分组
+        Map<Long, List<ProjectReimburseVO>> map = infos.parallelStream()
+                .collect(Collectors.groupingBy(ProjectReimburseVO::getProjectProcess));
+        Map<Long, BigDecimal> decimalMap = new HashMap<>();
+        //统计每个进程的报销总和
+        for (Long aLong : map.keySet()) {
+            BigDecimal big = new BigDecimal(0);
+            List<ProjectReimburseVO> list = map.get(aLong);
+            for (ProjectReimburseVO vo : list) {
+                big = big.add(vo.getFrMoney());
+            }
+            decimalMap.put(aLong, big);
+        }
+        return decimalMap;
+    }
+
 
 }

+ 102 - 37
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java

@@ -3,13 +3,16 @@ package org.springblade.control.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.controller.ProjectInfoController;
 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.IProjectInfoService;
 import org.springblade.control.service.IProjectProcessService;
 import org.springblade.control.vo.ProjectProcessVO;
+import org.springblade.control.vo.ProjectReimburseVO;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.system.entity.TopMenu;
 import org.springframework.stereotype.Service;
@@ -17,10 +20,7 @@ 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.*;
 import java.util.stream.Collectors;
 
 /**
@@ -34,6 +34,7 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
     private final ProjectProcessMapper processMapper;
     private final IProjectCostBudgetService budgetService;
 
+
     /**
      * 新增项目时保存进程
      *
@@ -121,57 +122,121 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
     public List<ProjectProcessVO> processService(Long projectId, Integer costType) {
         //获取当前项目所有项目环节
         List<ProjectProcessVO> list = processMapper.getProjectProcess(projectId);
+        //获取项目所有维护预算
         Map<Long, BigDecimal> maintainMap = budgetService.getAllMaintainCost7(projectId, costType);
         Boolean isMaintain = true;
         if (maintainMap == null || maintainMap.size() <= 0){
             isMaintain = false;
         }
+        //报销支出
+        Map<Long, BigDecimal> reimburseMap = this.getProjectReimburseByCostType(projectId,costType);
+        Boolean isReimburse = true;
+        if (reimburseMap == null || reimburseMap.size() <= 0){
+            isReimburse = false;
+        }
+
         //获取项目具体部门所有已闭环的任务
         List<ProjectCostBudget> budgets = budgetService.getProjectAllFinishedTask(projectId,costType);
-        if (budgets != null || budgets.size() > 0){
+        Boolean isBudgets = true;
+        Set<Long> set = new HashSet<>();
+        Map<Long, List<ProjectCostBudget>> map = new HashMap<>();
+        if (budgets != null && budgets.size() > 0){
             //获取项目环节的set集合
-            Set<Long> set = budgets.stream().map(l -> l.getProjectProcess()).collect(Collectors.toSet());
+            set = budgets.stream().map(l -> l.getProjectProcess()).collect(Collectors.toSet());
             //根据项目环节分组
-            Map<Long, List<ProjectCostBudget>> map = budgets.parallelStream()
+            map = budgets.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudget::getProjectProcess));
-            //包含此环节就统计,不包含就跳出
-            for (ProjectProcessVO vo : list) {
-                if (set.contains(vo.getId()) || (isMaintain && maintainMap.get(vo.getId()) != null)){
-                    //设置参与
-                    vo.setIsParticipate(1);
-                    //时间成本统计总天数,人员投入统计总人数,成本支出统计当前环节总支出
-                    BigDecimal costDisburse = new BigDecimal(0);
-                    BigDecimal timeCost = new BigDecimal(0);
-                    int staffTotal = 0;
-                    if (set.contains(vo.getId())) {
-                        List<ProjectCostBudget> budgetList = map.get(vo.getId());
-                        staffTotal = budgetList.size();
-                        for (ProjectCostBudget budget : budgetList) {
-                            costDisburse = costDisburse.add(budget.getActualTotalMoney());
-                            timeCost = timeCost.add(budget.getPracticalTaskDays());
-                        }
-                    }
-                    if (isMaintain && maintainMap.get(vo.getId()) != null){
-                        costDisburse = costDisburse.add(maintainMap.get(vo.getId()));
+        }else {
+            isBudgets = false;
+        }
+        //包含此环节就统计,不包含就跳出
+        for (ProjectProcessVO vo : list) {
+            if ((isBudgets && map.get(vo.getId()) != null) || (isMaintain && maintainMap.get(vo.getId()) != null) || (isReimburse && reimburseMap.get(vo.getId()) != null)){
+                //设置参与
+                vo.setIsParticipate(1);
+                //时间成本统计总天数,人员投入统计总人数,成本支出统计当前环节总支出
+                BigDecimal costDisburse = new BigDecimal(0);
+                BigDecimal timeCost = new BigDecimal(0);
+                int staffTotal = 0;
+                //设置费用明细
+                List<ProjectProcessVO.costDetail> details = new ArrayList<>();
+                if (isBudgets && map.get(vo.getId()) != null) {
+                    List<ProjectCostBudget> budgetList = map.get(vo.getId());
+                    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);
                 }
+                //维护支出
+                if (isMaintain && maintainMap.get(vo.getId()) != null){
+                    costDisburse = costDisburse.add(maintainMap.get(vo.getId()));
+                    ProjectProcessVO.costDetail costDetail = new ProjectProcessVO.costDetail();
+                    costDetail.setCostTypeValue("维护支出");
+                    costDetail.setPrice(maintainMap.get(vo.getId()));
+                    costDetail.setTotal(maintainMap.get(vo.getId()));
+                    details.add(costDetail);
+                }
+                //报销支出
+                if (isReimburse && reimburseMap.get(vo.getId()) != null){
+                    costDisburse = costDisburse.add(reimburseMap.get(vo.getId()));
+                    ProjectProcessVO.costDetail costDetail = new ProjectProcessVO.costDetail();
+                    costDetail.setCostTypeValue("报销支出");
+                    costDetail.setPrice(reimburseMap.get(vo.getId()));
+                    costDetail.setTotal(reimburseMap.get(vo.getId()));
+                    details.add(costDetail);
+                }
+                //统计最后的总计
+                if (details.size() > 0) {
+                    BigDecimal big = new BigDecimal(0);
+                    for (ProjectProcessVO.costDetail detail : details) {
+                        big = big.add(detail.getPrice());
+                    }
+                    details.get(0).setTotal(big);
+                }
+                //目前环节费用的成本支出统计了:人工成本,维护支出,项目报销
+                vo.setCostDisburse(costDisburse);
+                vo.setTimeCost(timeCost);
+                vo.setStaffTotal(staffTotal);
+                vo.setCostDetails(details);
+            }else {
+                vo.setIsParticipate(0);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 根据项目id获取项目截至目前-某个费用分类的的报销支出,按项目环节返回
+     * @param projectId
+     * @param costType
+     * @return
+     */
+    @Override
+    public Map<Long, BigDecimal> getProjectReimburseByCostType(Long projectId, Integer costType) {
+        //获取项目的所有关联进程的报销
+        List<ProjectReimburseVO> infos = baseMapper.getProjectReimburse3(projectId, costType);
+        if (infos == null || infos.size() <= 0) {
+            return null;
+        }
+        //按照项目进程分组
+        Map<Long, List<ProjectReimburseVO>> map = infos.parallelStream()
+                .collect(Collectors.groupingBy(ProjectReimburseVO::getProjectProcess));
+        Map<Long, BigDecimal> decimalMap = new HashMap<>();
+        //统计每个进程的报销总和
+        for (Long aLong : map.keySet()) {
+            BigDecimal big = new BigDecimal(0);
+            List<ProjectReimburseVO> list = map.get(aLong);
+            for (ProjectReimburseVO vo : list) {
+                big = big.add(vo.getFrMoney());
             }
-            return list;
+            decimalMap.put(aLong, big);
         }
-        return null;
+        return decimalMap;
     }
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -289,7 +289,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
                 if (eType.equals("bigint") && (eLength > 255 || eLength < 10)) {
                     throw new ServiceException("请输入正确长度,该类型范围为10-255之间");
-                } else if (eType.equals("varchar") && (eLength > 1000 || eLength < 10)) {
+                } else if (eType.equals("varchar") && (eLength > 2000 || eLength < 10)) {
                     throw new ServiceException("请输入正确长度,该类型范围为10-1000之间");
                 } else if (eType.equals("decimal") && (eLength > 65 || eLength < 10)) {
                     throw new ServiceException("请输入正确长度,该类型范围为10-65之间");

+ 15 - 0
blade-service/blade-system/src/main/java/org/springblade/system/controller/DeptController.java

@@ -195,4 +195,19 @@ public class DeptController extends BladeController {
     }
 
 
+    /**
+     * 获取部门用户tree (内控系统特有)
+     *
+     * @return
+     */
+    @GetMapping("/tree-userdept-info")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "树形结构", notes = "树形结构")
+    public R<List<DeptVO>> getUserDeptTreeInfo(String tenantId, BladeUser bladeUser,String deptType) {
+        List<DeptVO> tree = deptService.getUserDeptTreeInfo(Func.toStrWithEmpty(tenantId, bladeUser.getTenantId()),deptType);
+        return R.data(tree);
+    }
+
+
+
 }

+ 8 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.java

@@ -65,4 +65,12 @@ public interface DeptMapper extends BaseMapper<Dept> {
      */
     List<String> getDeptNames(Long[] ids);
 
+
+    /**
+     * 获取树形节点
+     *
+     * @param tenantId
+     * @return
+     */
+    List<DeptVO> getUserDeptTreeInfo(String tenantId,String deptType);
 }

+ 11 - 0
blade-service/blade-system/src/main/java/org/springblade/system/mapper/DeptMapper.xml

@@ -121,4 +121,15 @@
         and is_deleted = 0
     </select>
 
+
+    <select id="getUserDeptTreeInfo" resultMap="treeNodeResultMap">
+        select id, parent_id,dept_name as deptName,  dept_name as title, id as "value", id as "key" from  blade_view_postuser where 1=1
+        <if test="param1!=null and param1!=''">
+            and tenant_id = #{param1}
+        </if>
+        <if test="param2!=null and param2!=''">
+            and dept_type = #{param2}
+        </if>
+        --ORDER BY sort
+    </select>
 </mapper>

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/service/IDeptService.java

@@ -116,5 +116,5 @@ public interface IDeptService extends IService<Dept> {
      */
     List<DeptVO> search(String deptName, Long parentId);
 
-
+    List<DeptVO> getUserDeptTreeInfo(String tenantId,String deptType);
 }

+ 7 - 0
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java

@@ -176,4 +176,11 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements ID
         return DeptWrapper.build().listNodeVO(deptList);
     }
 
+
+
+    @Override
+    public List<DeptVO> getUserDeptTreeInfo(String tenantId,String deptType) {
+        return ForestNodeMerger.merge(baseMapper.getUserDeptTreeInfo(tenantId,deptType));
+    }
+
 }

+ 0 - 58
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/UserController.java

@@ -165,36 +165,6 @@ public class UserController {
     @PreAuth(RoleConstant.HAS_ROLE_ADMIN)
     public R submit(@Valid @RequestBody UserDTO user) {
         CacheUtil.clear(USER_CACHE);
-        // 内控系统拆分
-/*        List<DeptUserVO> deptList = user.getDeptList();
-        if (deptList != null && deptList.size() >= 1) {
-            user.setRoleId(JSON.toJSONString(deptList));
-            String deptId = "";
-            String postId = "";
-            String isLaderpostId = "";
-            for (int i = 0; i < deptList.size(); i++) {
-                DeptUserVO deptUserVO = deptList.get(i);
-                if (i == 0) {
-                    deptId += deptUserVO.getDeptId() + "";
-                    postId += deptUserVO.getPostId() + "";
-                    if (deptUserVO.getIsLeader() == 1) {
-                        isLaderpostId = deptUserVO.getDeptId() + "";
-                    }
-                } else {
-                    deptId += "," + deptUserVO.getDeptId();
-                    postId += "," + deptUserVO.getPostId() + ",";
-                    if (deptUserVO.getIsLeader() == 1) {
-                        isLaderpostId = "," + deptUserVO.getDeptId();
-                    }
-                }
-            }
-            user.setPostId(postId);
-            user.setDeptId(deptId);
-            user.setRoleId(postId);
-            user.setIsLeader(isLaderpostId);
-        }*/
-
-
         return R.status(userService.submit(user));
     }
 
@@ -218,34 +188,6 @@ public class UserController {
     @ApiOperation(value = "修改", notes = "传入User")
     public R update(@Valid @RequestBody UserDTO user) {
         CacheUtil.clear(USER_CACHE);
-        // 内控系统拆分
-/*        List<DeptUserVO> deptList = user.getDeptList();
-        if (deptList != null && deptList.size() >= 1) {
-            String deptId = "";
-            String postId = "";
-            String isLaderpostId = "";
-            for (int i = 0; i < deptList.size(); i++) {
-                DeptUserVO deptUserVO = deptList.get(i);
-                if (i == 0) {
-                    deptId += deptUserVO.getDeptId() + "";
-                    postId += deptUserVO.getPostId() + "";
-                    if (deptUserVO.getIsLeader() == 1) {
-                        isLaderpostId = deptUserVO.getDeptId() + "";
-                    }
-                } else {
-                    deptId += "," + deptUserVO.getDeptId();
-                    postId += "," + deptUserVO.getPostId() + ",";
-                    if (deptUserVO.getIsLeader() == 1) {
-                        isLaderpostId = "," + deptUserVO.getDeptId();
-                    }
-                }
-            }
-            user.setIsLeader(isLaderpostId);
-            user.setPostId(postId);
-            user.setDeptId(deptId);
-            user.setRoleId(postId);
-            user.setDeptInfo(JSONArray.toJSONString(deptList));
-        }*/
         return R.status(userService.updateUser(user));
     }
 

+ 0 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/mapper/UserMapper.xml

@@ -34,7 +34,6 @@
         <result column="sys_type" property="sysType"/>
         <result column="is_leader" property="isLeader"/>
         <result column="one_money" property="oneMoney"/>
-        <result column="dept_info" property="deptInfo"/>
     </resultMap>
     <update id="updateRoleIdById">
         UPDATE blade_user

+ 26 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -119,6 +119,20 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         if (userCount > 0L && Func.isEmpty(user.getId())) {
             throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount()));
         }
+
+        // 内控修改  当为部门负责人不为空时 执行
+        if (StringUtil.isNotBlank(user.getIsLeader())){
+            // 由于一个部门只有一个负责人  需要修改 之前的部门负责人
+            String [] leader = Func.toStrArray(user.getIsLeader());
+            for (String deptId : leader){
+                String reData = deptId+",";
+                String eqSql = "update blade_user set is_leader = null where  is_leader='"+deptId+"' ";
+                String fiSql = "update blade_user set is_leader = REPLACE(is_leader,"+reData+",'') where  FIND_IN_SET('"+deptId+"',is_leader) ";
+                jdbcTemplate.execute(eqSql);
+                jdbcTemplate.execute(fiSql);
+            }
+        }
+
         return save(user) && submitUserDept(user);
     }
 
@@ -218,6 +232,18 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
         if (userCount > 0L) {
             throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", user.getAccount()));
         }
+        // 内控修改  当为部门负责人不为空时 执行
+        if (StringUtil.isNotBlank(user.getIsLeader())){
+            // 由于一个部门只有一个负责人  需要修改 之前的部门负责人
+            String [] leader = Func.toStrArray(user.getIsLeader());
+            for (String deptId : leader){
+                String reData = deptId+",";
+                String eqSql = "update blade_user set is_leader = REPLACE(is_leader,'"+deptId+"','') where  FIND_IN_SET('"+deptId+"',is_leader) ";
+                String fiSql = "update blade_user set is_leader = REPLACE(is_leader,'"+reData+"','') where  FIND_IN_SET('"+deptId+"',is_leader) ";
+                jdbcTemplate.execute(fiSql);
+                jdbcTemplate.execute(eqSql);
+            }
+        }
         return updateUserInfo(user) && submitUserDept(user);
     }
 

+ 0 - 3
blade-service/blade-user/src/main/java/org/springblade/system/user/wrapper/UserWrapper.java

@@ -56,9 +56,6 @@ public class UserWrapper extends BaseEntityWrapper<User, UserVO> {
         userVO.setPostName(Func.join(postName));
         userVO.setSexName(DictCache.getValue(DictEnum.SEX, user.getSex()));
 
-        // 用户机构集合
-        userVO.setDeptList(JSON.parseArray(user.getDeptInfo(), DeptUserVO.class));
-
         // 用户所属 项目
         if (ObjectUtil.isNotEmpty(user.getUserType())) {
             String value = DictCache.getValue(DictEnum.USER_TYPE, user.getUserType()).replace("[", "").replace("]", "");