Эх сурвалжийг харах

内控-预算与实际统计-月度

qianxb 2 жил өмнө
parent
commit
d35ebd5942
16 өөрчлөгдсөн 353 нэмэгдсэн , 6 устгасан
  1. 36 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByMonthVO.java
  2. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  3. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  4. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  5. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  6. 10 3
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  7. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java
  8. 0 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  9. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  10. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  11. 10 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  12. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  13. 123 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  14. 42 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  15. 79 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  16. 23 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

+ 36 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/BudgetAndPracticalByMonthVO.java

@@ -0,0 +1,36 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/7/24 14:22
+ **/
+@Data
+public class BudgetAndPracticalByMonthVO {
+
+    @ApiModelProperty(value = "时间")
+    private String time;
+
+    @ApiModelProperty(value = "年初每月收入")
+    private BigDecimal income1;
+
+    @ApiModelProperty(value = "年初每月支出")
+    private BigDecimal disburse1;
+
+    @ApiModelProperty(value = "每月计划收入")
+    private BigDecimal income2;
+
+    @ApiModelProperty(value = "每月计划支出")
+    private BigDecimal disburse2;
+
+    @ApiModelProperty(value = "实际每月收入")
+    private BigDecimal income3;
+
+    @ApiModelProperty(value = "实际每月支出")
+    private BigDecimal disburse3;
+}

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java

@@ -227,4 +227,14 @@ public class AnnualBudgetController {
 //        return R.data(budgetService.portalRiskPlanDetail());
 //    }
 
+    /**
+     * 预算与实际统计-月度统计
+     */
+    @GetMapping("/budgetAndPracticalByMonth")
+    @ApiOperationSupport(order = 16)
+    @ApiOperation(value = "预算与实际统计-月度统计",notes = "传入年:2023年")
+    public R<List<BudgetAndPracticalByMonthVO>> budgetAndPracticalByMonth(String year) {
+        return R.data(budgetService.budgetAndPracticalByMonth(year));
+    }
+
 }

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

@@ -30,4 +30,6 @@ public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedI
     List<ContractReturnedInfo> getProjectReturnedByMonth(@Param("date") String date);
 
     void deleteByContractId(@Param("contractId") Long contractId);
+
+    List<ContractReturnedInfo> getAllMonthReturnedByYear(@Param("year") int y);
 }

+ 8 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml

@@ -46,4 +46,12 @@
         </if>
         and practical_returned_money is not null
     </select>
+    <select id="getAllMonthReturnedByYear" resultType="org.springblade.control.entity.ContractReturnedInfo">
+        SELECT *
+        from c_contract_returned_info
+        WHERE  is_deleted = 0
+        <if test="year != 0">
+            and DATE_FORMAT(practical_returned_time ,'%Y') = #{year}
+        </if>
+    </select>
 </mapper>

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

@@ -108,4 +108,6 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     Integer getUserMonthLog(@Param("userId") Long userId,@Param("start") LocalDate start,@Param("end") LocalDate end);
 
     List<ProjectCostBudgetVO> getDepartmentTimeOutPlan(@Param("costType") Integer costType,@Param("projectId") Long projectId);
+
+    List<ProjectCostBudget> getAllMonthBudgetByYear(@Param("year") int y);
 }

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

@@ -187,7 +187,7 @@
         FROM c_project_cost_budget pcb WHERE pcb.project_id = #{id} AND pcb.parent_id > 0
     </select>
     <select id="getBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
-        select id,project_id,practical_finish_time ,actual_total_money  from c_project_cost_budget
+        select *  from c_project_cost_budget
         WHERE is_deleted = 0 and task_approve = 1 and DATE_FORMAT(practical_finish_time ,'%Y') = #{year}
     </select>
     <select id="getPlanByMonth" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
@@ -288,8 +288,8 @@
     </select>
     <select id="getAllMaintainPlan" resultType="org.springblade.control.entity.ProjectCostBudget">
         SELECT *
-        from c_project_cost_budget
-        WHERE plan_task_type > 0 and (SELECT dict_value from c_dict_info cdi WHERE id = plan_task_type) = 2
+        from c_project_cost_budget pcb
+        WHERE pcb.plan_task_type > 0 and (SELECT cdi.dict_value from c_dict_info cdi WHERE cdi.id = pcb.plan_task_type) = 2
     </select>
     <select id="getAllMaintainPlan2" resultType="org.springblade.control.entity.ProjectCostBudget">
         SELECT *
@@ -346,5 +346,12 @@
         WHERE pcb.cost_type = #{costType} and pcb.is_deleted = 0 and pcb.project_id = #{projectId} and pcb.plan_end_time &lt; pcb.practical_finish_time and pcb.status = 4
     </select>
 
+    <select id="getAllMonthBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select pcb.*
+        from c_project_cost_budget pcb
+        WHERE pcb.is_deleted = 0 and pcb.approve = 1
+            and DATE_FORMAT(pcb.plan_start_time ,'%Y') = #{year}
+    </select>
+
 
 </mapper>

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

@@ -54,4 +54,5 @@ public interface ProjectInfoMapper extends BaseMapper<ControlProjectInfo> {
     List<ProjectReimburseVO> getProjectReimburse2(@Param("projectId") Long projectId);
     //返回指定项目,指定费用分类对应的进程
     List<ProjectReimburseVO> getProjectReimburse3(@Param("projectId") Long projectId,@Param("costType") Integer costType);
+
 }

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

@@ -118,5 +118,4 @@
         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>

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

@@ -50,4 +50,6 @@ public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
     List<ProjectIncomeCostRatioVO> portalProjectIncomeRatio(String date);
 
     List<ProjectServiceProcessVO> portalProjectProcess(Long projectId);
+
+    List<BudgetAndPracticalByMonthVO> budgetAndPracticalByMonth(String year);
 }

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

@@ -40,4 +40,8 @@ public interface IContractReturnedInfoService extends BaseService<ContractReturn
     List<ContractReturnedInfo> getProjectReturnedByMonth(String date);
 
     void deleteByContractId(Long id);
+
+    //获取所有项目当年每月的,1返回应回款,2返回实际回款
+    List<BigDecimal> getAllMonthReturnedByYear(int y,int type);
+
 }

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

@@ -98,10 +98,10 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //获取所有项目的截至目前的维护支出
     BigDecimal getAllMaintainCost2();
 
-    //获取所有项目截至当年的维护支出,分月返回
+    //获取所有项目截至当年的维护支出,分月返回,以项目为主键
     Map<Long,List<BigDecimal>> getAllMaintainCost3(int year);
 
-    //获取所有项目截至当年的维护支出,按年返回
+    //获取所有项目截至当年的维护支出,按年返回,以项目为主键
     Map<Long,BigDecimal> getAllMaintainCost4(int year);
 
     //获取所有项目截至目前的的维护支出,按项目返回
@@ -118,4 +118,12 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     //获取项目的维护预算
     Set<Long> getAllMaintainBudgetId(Long projectId);
+
+    //根据年获取已经分配月的计划支出,按12个月返回
+    List<BigDecimal> getAllMonthBudgetByYear(int y);
+
+    //获取每月实际的人工支出
+    List<BigDecimal> getAllMonthStaffCostByYear(int y);
+    //获取每月实际的维护支出
+    List<BigDecimal> getAllMonthMaintainCostByYear(int y);
 }

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

@@ -63,4 +63,5 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
     //根据项目id获取项目截至目前-某个费用分类的的报销支出,按项目环节返回
     Map<Long,BigDecimal> getProjectReimburseByCostType(Long projectId,Integer costType);
 
+    List<BigDecimal> getAllMonthReimburseByYear(int y);
 }

+ 123 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -94,6 +94,39 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
     @Override
     @Transactional
     public void updateAnnualBudget(AnnualBudgetDTO dto) {
+        //收入数据校验
+        List<AnnualBudgetIncome> incomeList = dto.getIncomeList();
+        if (incomeList != null && incomeList.size() > 0){
+            for (AnnualBudgetIncome income : incomeList) {
+                if (income.getProjectId() == null){
+                    throw new ServiceException("请选择项目名称");
+                }
+                if (income.getIncomeType() == null){
+                    throw new ServiceException("请选择收入类别");
+                }
+                if (income.getPredictSignDate() == null){
+                    throw new ServiceException("请选择预计签单时间");
+                }
+                if (income.getPredictContractMoney() == null){
+                    throw new ServiceException("请输入预计新签合同额");
+                }
+                if (income.getPredictAnnualReturned() == null){
+                    throw new ServiceException("请输入预计本年度回款额");
+                }
+            }
+        }
+        //支出数据校验
+        List<AnnualBudgetDisburse> disburseList = dto.getDisburseList();
+        if (disburseList != null && disburseList.size() > 0){
+            for (AnnualBudgetDisburse disburse : disburseList) {
+                if (disburse.getBudgetSubject() == null){
+                    throw new ServiceException("请选择预算科目");
+                }
+                if (disburse.getSecondSubject() == null){
+                    throw new ServiceException("请选择二级科目");
+                }
+            }
+        }
         //统计支出
         Map<String, BigDecimal> map = statisticDisburse(dto);
         BigDecimal disburseTotal = map.get("1");
@@ -941,6 +974,96 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         return vos;
     }
 
+    /**
+     * 预算与实际统计-月度统计
+     */
+    @Override
+    public List<BudgetAndPracticalByMonthVO> budgetAndPracticalByMonth(String year) {
+        int y = Integer.parseInt(year.substring(0, 4));
+        //获取年度预算
+        AnnualBudget budget = baseMapper.getThisYearBudget(y);
+        Boolean isAnnual = true;
+        AnnualBudgetVO2 preview;
+        List<AnnualBudgetVO2.IncomeDetail> monthIncome = new ArrayList<>();
+        List<AnnualBudgetVO2.disburseDetail> monthDisburse = new ArrayList<>();
+        if (budget != null) {
+            preview = this.preview(budget.getId());
+            monthIncome = preview.getMonthIncome();
+            monthDisburse = preview.getMonthDisburse();
+        }else {
+            isAnnual = false;
+        }
+
+        //获取所有项目当年每月的应回款
+        List<BigDecimal> returned1 = returnedInfoService.getAllMonthReturnedByYear(y,1);
+        //获取已经指定年分配月的成本测算
+        List<BigDecimal> budgets = budgetService.getAllMonthBudgetByYear(y);
+        //获取所有项目当年每月的实际回款
+        List<BigDecimal> returned2 = returnedInfoService.getAllMonthReturnedByYear(y,2);
+        //获取每月实际的人工支出
+        List<BigDecimal> staffCost = budgetService.getAllMonthStaffCostByYear(y);
+        //获取每月实际的维护支出
+        List<BigDecimal> maintainCost = budgetService.getAllMonthMaintainCostByYear(y);
+        //获取每月实际的报销支出
+        List<BigDecimal> reimburse = projectInfoService.getAllMonthReimburseByYear(y);
+        //结果集
+        List<BudgetAndPracticalByMonthVO> list = new ArrayList<>();
+
+        //分别计算12个月
+        List<String> months = Arrays.asList("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月");
+        BigDecimal c1 = new BigDecimal(0);
+        BigDecimal c2 = new BigDecimal(0);
+        BigDecimal c3 = new BigDecimal(0);
+        BigDecimal c4 = new BigDecimal(0);
+        BigDecimal c5 = new BigDecimal(0);
+        BigDecimal c6 = new BigDecimal(0);
+        for (int i = 1; i <= 12; i++) {
+            BudgetAndPracticalByMonthVO vo1 = new BudgetAndPracticalByMonthVO();
+            //月份
+            vo1.setTime(months.get(i-1));
+            //年初月收入
+            if (isAnnual) {
+                vo1.setIncome1(monthIncome.get(i-1).getIncome());
+                c1 = c1.add(monthIncome.get(i-1).getIncome());
+            }else {
+                vo1.setIncome1(new BigDecimal(0));
+                c1 = c1.add(new BigDecimal(0));
+            }
+            //年初月支出
+            if (isAnnual) {
+                vo1.setDisburse1(monthDisburse.get(i-1).getDisburse());
+                c2 = c2.add(monthDisburse.get(i-1).getDisburse());
+            }else {
+                vo1.setDisburse1(new BigDecimal(0));
+                c2 = c2.add(new BigDecimal(0));
+            }
+            //每月计划收入
+            vo1.setIncome2(returned1.get(i-1));
+            c3 = c3.add(returned1.get(i-1));
+            //每月计划支出
+            vo1.setDisburse2(budgets.get(i-1));
+            c4 = c4.add(budgets.get(i-1));
+            //实际每月收入
+            vo1.setIncome3(returned2.get(i-1));
+            c5 = c5.add(returned2.get(i-1));
+            //实际每月支出
+            vo1.setDisburse3(staffCost.get(i-1).add(maintainCost.get(i-1).add(reimburse.get(i-1))));
+            c6 = c6.add(staffCost.get(i-1).add(maintainCost.get(i-1).add(reimburse.get(i-1))));
+
+        list.add(vo1);
+        }
+        BudgetAndPracticalByMonthVO vo2 = new BudgetAndPracticalByMonthVO();
+        vo2.setTime("总计");
+        vo2.setIncome1(c1);
+        vo2.setDisburse1(c2);
+        vo2.setIncome2(c3);
+        vo2.setDisburse2(c4);
+        vo2.setIncome3(c5);
+        vo2.setDisburse3(c6);
+        list.add(vo2);
+        return list;
+    }
+
     /**
      * 统计支出 1支出总和2工资总和
      */

+ 42 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java

@@ -19,6 +19,7 @@ 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.stream.Collectors;
 
@@ -121,4 +122,45 @@ public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractRet
     public void deleteByContractId(Long contractId) {
         baseMapper.deleteByContractId(contractId);
     }
+
+    /**
+     * 获取所有项目当年每月的回款
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthReturnedByYear(int y,int type) {
+        //获取当年所有回款
+        List<ContractReturnedInfo> infos = baseMapper.getAllMonthReturnedByYear(y);
+        List<BigDecimal> list = new ArrayList<>();
+        //计算每月回款
+        if (infos != null && infos.size() > 0){
+            if (type == 1){
+                for (int i = 0; i < 12; i++) {
+                    BigDecimal big = new BigDecimal(0);
+                    for (ContractReturnedInfo info : infos) {
+                        if (info.getShouldReturnedTime().getMonthValue() == (i+1)){
+                            big = big.add(info.getShouldReturnedMoney());
+                        }
+                    }
+                    list.add(big);
+                }
+            }else {
+                for (int i = 0; i < 12; i++) {
+                    BigDecimal big = new BigDecimal(0);
+                    for (ContractReturnedInfo info : infos) {
+                        if (info.getPracticalReturnedTime().getMonthValue() == (i+1)){
+                            big = big.add(info.getPracticalReturnedMoney());
+                        }
+                    }
+                    list.add(big);
+                }
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
 }

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

@@ -2050,6 +2050,85 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return null;
     }
 
+    /**
+     * 根据年获取已经分配月的计划支出,按12个月返回
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthBudgetByYear(int y) {
+        List<ProjectCostBudget> budgets = baseMapper.getAllMonthBudgetByYear(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (budgets != null && budgets.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (ProjectCostBudget budget : budgets) {
+                    if (budget.getPlanStartTime().getMonthValue() == (i+1)){
+                        big = big.add(budget.getBudgetCountMoney());
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取每月实际的人工支出
+     * @param y
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthStaffCostByYear(int y) {
+        List<ProjectCostBudget> budgets = baseMapper.getBudgetByYear(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (budgets != null && budgets.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (ProjectCostBudget budget : budgets) {
+                    if (budget.getPracticalFinishTime().getMonthValue() == (i+1)){
+                        big = big.add(budget.getActualTotalMoney());
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 获取每月实际的维护支出
+     * @param year
+     * @return
+     */
+    @Override
+    public List<BigDecimal> getAllMonthMaintainCostByYear(int year) {
+        Map<Long, List<BigDecimal>> map = this.getAllMaintainCost3(year);
+        List<BigDecimal> list = new ArrayList<>();
+        if (map != null && map.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (Long aLong : map.keySet()) {
+                    big = big.add(map.get(aLong).get(i));
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 23 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.control.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -503,5 +504,27 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         return decimalMap;
     }
 
+    @Override
+    public List<BigDecimal> getAllMonthReimburseByYear(int y) {
+        List<EMFinancialReimbursementInfo> reimburse = baseMapper.getYearReimburseByMonth(y);
+        List<BigDecimal> list = new ArrayList<>();
+        if (reimburse != null && reimburse.size() > 0){
+            for (int i = 0; i < 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                for (EMFinancialReimbursementInfo info : reimburse) {
+                    if (info.getFrDate().getMonth() == i){
+                        big = big.add(info.getFrMoney());
+                    }
+                }
+                list.add(big);
+            }
+        }else {
+            for (int i = 0; i < 12; i++) {
+                list.add(new BigDecimal(0));
+            }
+        }
+        return list;
+    }
+
 
 }