浏览代码

年度经营预算所有接口

qianxb 2 年之前
父节点
当前提交
3b2084b512
共有 21 个文件被更改,包括 748 次插入17 次删除
  1. 35 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/AnnualBudgetDTO.java
  2. 8 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AnnualBudget.java
  3. 2 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AnnualBudgetIncome.java
  4. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetDisburseVO.java
  5. 40 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetIncomeVO.java
  6. 32 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO.java
  7. 50 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO2.java
  8. 2 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java
  9. 95 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  10. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.java
  11. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.xml
  12. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.java
  13. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.xml
  14. 18 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java
  15. 42 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml
  16. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetDisburseService.java
  17. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetIncomeService.java
  18. 16 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  19. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetDisburseServiceImpl.java
  20. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetIncomeServiceImpl.java
  21. 357 9
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

+ 35 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/AnnualBudgetDTO.java

@@ -0,0 +1,35 @@
+package org.springblade.control.dto;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.AnnualBudgetIncome;
+import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetDTO extends AnnualBudget {
+
+    @ApiModelProperty(value = "年度预算收入")
+    private List<AnnualBudgetIncome> incomeList;
+
+    @ApiModelProperty(value = "年度预算支出")
+    private List<AnnualBudgetDisburse> disburseList;
+
+}

+ 8 - 2
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AnnualBudget.java

@@ -33,7 +33,7 @@ public class AnnualBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "预算开始时间")
-    private LocalDate budgetStartDate;
+    private LocalDate budgetStartTime;
 
     @DateTimeFormat(
             pattern = "yyyy-MM-dd"
@@ -42,7 +42,7 @@ public class AnnualBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "预算结束时间")
-    private LocalDate budgetEndDate;
+    private LocalDate budgetEndTime;
 
     @ApiModelProperty(value = "总预算")
     private BigDecimal totalBudget;
@@ -52,4 +52,10 @@ public class AnnualBudget extends BaseEntity {
 
     @ApiModelProperty(value = "年度利润指标")
     private BigDecimal annualProfitTarget;
+
+    @ApiModelProperty(value = "人工成本")
+    private BigDecimal staffCost;
+
+    @ApiModelProperty(value = "管理支出")
+    private BigDecimal manageDisburse;
 }

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

@@ -33,10 +33,10 @@ public class AnnualBudgetIncome extends BaseEntity {
     private Integer incomeType;
 
     @ApiModelProperty(value = "项目类型")
-    private Integer projectType;
+    private String projectTypeValue;
 
     @ApiModelProperty(value = "合同类型")
-    private Integer contractType;
+    private String contractTypeValue;
 
     @DateTimeFormat(
             pattern = "yyyy-MM-dd"

+ 31 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetDisburseVO.java

@@ -0,0 +1,31 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetDisburseVO extends AnnualBudgetDisburse {
+
+    @ApiModelProperty(value = "预算科目值")
+    private String budgetSubjectValue;
+
+    @ApiModelProperty(value = "二级科目值")
+    private String secondSubjectValue;
+
+    @ApiModelProperty(value = "当月金额")
+    private String currentMonthMoney;
+
+}

+ 40 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetIncomeVO.java

@@ -0,0 +1,40 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudgetIncome;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetIncomeVO extends AnnualBudgetIncome {
+
+    @ApiModelProperty(value = "年度预算id")
+    private String projectName;
+
+    @ApiModelProperty(value = "收入类型值")
+    private String incomeTypeValue;
+
+    @ApiModelProperty(value = "当月金额")
+    private String monthMoney;
+
+    @ApiModelProperty(value = "回款时间")
+    private LocalDate returnTime;
+
+    @ApiModelProperty(value = "回款金额")
+    private BigDecimal returnMoney;
+
+}

+ 32 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO.java

@@ -0,0 +1,32 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.AnnualBudgetIncome;
+import org.springblade.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetVO extends AnnualBudget {
+    @ApiModelProperty(value = "年度预算收入")
+    private List<AnnualBudgetIncome> incomeList;
+
+    @ApiModelProperty(value = "年度预算支出")
+    private List<AnnualBudgetDisburse> disburseList;
+}

+ 50 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO2.java

@@ -0,0 +1,50 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.AnnualBudgetIncome;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class AnnualBudgetVO2 extends AnnualBudget {
+
+    @ApiModelProperty(value = "收入")
+    private List<IncomeDetail> MonthIncome;
+
+    @ApiModelProperty(value = "支出")
+    private List<disburseDetail> MonthDisburse;
+
+    @ApiModelProperty(value = "月总计")
+    private List<BigDecimal> MonthTotal;
+
+    @Data
+    public static class IncomeDetail{
+        @ApiModelProperty(value = "收入")
+        private BigDecimal income;
+
+        @ApiModelProperty(value = "当月收入详情")
+        private List<AnnualBudgetIncomeVO> incomeList;
+    }
+
+    @Data
+    public static class disburseDetail{
+        @ApiModelProperty(value = "支出")
+        private BigDecimal disburse;
+
+        @ApiModelProperty(value = "当月支出详情")
+        private List<AnnualBudgetDisburseVO> disburseList;
+    }
+
+
+}

+ 2 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java

@@ -22,6 +22,8 @@ public class ControlProjectInfoVO extends ControlProjectInfo {
     private String projectServerTypeValue;
     @ApiModelProperty(value = "合同金额")
     private BigDecimal contractMoney;
+    @ApiModelProperty(value = "合同类型值")
+    private String contractTypeValue;
     @ApiModelProperty(value = "项目负责人名称")
     private String projectPrincipalName;
     @ApiModelProperty(value = "实施负责人名称")

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

@@ -1,11 +1,18 @@
 package org.springblade.control.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.control.dto.AnnualBudgetDTO;
+import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.DepartmentMonthPlan;
+import org.springblade.control.service.IAnnualBudgetService;
 import org.springblade.control.service.IDepartmentMonthPlanService;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
@@ -19,6 +26,94 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/annualBudget")
 @Api(value = "年度经营预算接口", tags = "年度经营预算接口")
 public class AnnualBudgetController {
+    private final IAnnualBudgetService budgetService;
 
+    /**
+     * 新增年度经营预算
+     */
+    @PostMapping("/addAnnualBudget")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "新增年度经营预算")
+    public R addAnnualBudget(@RequestBody AnnualBudgetDTO dto) {
+        budgetService.addAnnualBudget(dto);
+        return R.success("新增成功");
+    }
+
+    /**
+     * 获取单个年度经营预算
+     */
+    @GetMapping("/getAnnualBudget")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取单个年度经营预算")
+    public R getAnnualBudget(Long id) {
+        return R.data(budgetService.getAnnualBudget(id));
+    }
+
+    /**
+     * 修改年度经营预算
+     */
+    @PostMapping("/updateAnnualBudget")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "修改年度经营预算")
+    public R updateAnnualBudget(@RequestBody AnnualBudgetDTO dto) {
+        budgetService.updateAnnualBudget(dto);
+        return R.success("修改成功");
+    }
+
+    /**
+     * 删除单个年度经营预算
+     */
+    @GetMapping("/deleteAnnualBudget")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "删除单个年度经营预算")
+    public R deleteAnnualBudget(Long id) {
+        budgetService.deleteAnnualBudget(id);
+        return R.success("删除成功");
+    }
+
+
+    /**
+     * 年度经营预算列表
+     */
+    @GetMapping("/page")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "年度经营预算列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "current", value = "当前页", required = true),
+            @ApiImplicitParam(name = "size", value = "每页的数量", required = true),
+    })
+    public R page(Query query) {
+        return R.data(budgetService.page(new Page<>(query.getCurrent(), query.getSize())));
+    }
+
+    /**
+     * 查询预览
+     */
+    @GetMapping("/preview")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "查询预览")
+    public R preview(Long id) {
+        return R.data(budgetService.preview(id));
+    }
+
+    /**
+     * 获取项目列表
+     */
+    @GetMapping("/getProjectList")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取项目列表")
+    public R getProjectList() {
+        return R.data(budgetService.getProjectList());
+    }
+
+    /**
+     * 获取二级科目
+     */
+    @GetMapping("/getSecondSubject")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取二级科目")
+    public R getSecondSubject() {
+        return R.data(budgetService.getSecondSubject());
+    }
 
 }

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

@@ -1,6 +1,7 @@
 package org.springblade.control.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudgetDisburse;
 import org.springblade.control.entity.AnnualBudgetIncome;
 
@@ -11,4 +12,5 @@ import org.springblade.control.entity.AnnualBudgetIncome;
  **/
 public interface AnnualBudgetDisburseMapper extends BaseMapper<AnnualBudgetDisburse> {
 
+    void deleteByAnnualId(@Param("id") Long id);
 }

+ 3 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.xml

@@ -3,5 +3,7 @@
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetDisburseMapper">
 
 
-
+    <delete id="deleteByAnnualId">
+        delete from c_annual_budget_disburse where annual_budget_id = #{id}
+    </delete>
 </mapper>

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

@@ -1,6 +1,7 @@
 package org.springblade.control.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.AnnualBudgetIncome;
 
@@ -11,4 +12,5 @@ import org.springblade.control.entity.AnnualBudgetIncome;
  **/
 public interface AnnualBudgetIncomeMapper extends BaseMapper<AnnualBudgetIncome> {
 
+    void deleteByAnnualId(@Param("id") Long id);
 }

+ 3 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.xml

@@ -3,5 +3,7 @@
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetIncomeMapper">
 
 
-
+    <delete id="deleteByAnnualId">
+        delete from c_annual_budget_income where annual_budget_id = #{id}
+    </delete>
 </mapper>

+ 18 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java

@@ -1,12 +1,16 @@
 package org.springblade.control.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.AnnualBudget;
+import org.springblade.control.entity.ContractReturnedInfo;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
+import org.springblade.control.vo.*;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Param
@@ -15,4 +19,18 @@ import java.util.List;
  **/
 public interface AnnualBudgetMapper extends BaseMapper<AnnualBudget> {
 
+    AnnualBudgetVO getAnnualBudget(@Param("id") Long id);
+
+    void removeById(@Param("id") Long id);
+
+    List<ControlProjectInfoVO> getProjectList();
+
+    List<AnnualBudgetIncomeVO> getReturnedByAnnualBudgetId(@Param("id") Long id);
+
+    List<AnnualBudgetDisburseVO> getDisburseByAnnualBudgetId(@Param("id") Long id);
+
+
+    List<DictInfoVO> getAllBudgetSubject();
+
+    List<DictInfoVO> getAllSecondSubject();
 }

+ 42 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml

@@ -1,7 +1,49 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.springblade.control.mapper.AnnualBudgetMapper">
+    <delete id="removeById">
+        delete from c_annual_budget where id = #{id}
+    </delete>
 
 
+    <select id="getAnnualBudget" resultType="org.springblade.control.vo.AnnualBudgetVO">
+        select * from c_annual_budget
+        where id = #{id}
+    </select>
+    <select id="getProjectList" resultType="org.springblade.control.vo.ControlProjectInfoVO">
+        select cpi.name,
+               (select dict_name  from c_dict_info WHERE code = 'project_type' AND dict_value = cpi.project_type) as projectTypeValue,
+               (select dict_name  from c_dict_info WHERE code = 'contract_type' AND dict_value= cci.contract_type) as contractTypeValue
+        from c_control_project_info cpi left join c_control_contract_info cci on cpi.id = cci.project_id
+    </select>
+    <select id="getReturnedByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetIncomeVO">
+        SELECT
+                (select name from c_control_project_info WHERE id = abi.project_id ) as projectName,
+                (select dict_name  from c_dict_info WHERE code = 'project_income_type' AND dict_value = abi.income_type) as incomeTypeValue,
+                abi.project_type_value ,
+               abi.contract_type_value,
+               cri.practical_returned_time as returnTime,
+               cri.practical_returned_money as returnMoney
+        FROM c_annual_budget_income abi left join c_contract_returned_info cri on abi.project_id = cri.project_id
+        WHERE cri.practical_returned_time is not null and cri.practical_returned_money is not NULL
+          AND abi.annual_budget_id = #{id}
+    </select>
+    <select id="getDisburseByAnnualBudgetId" resultType="org.springblade.control.vo.AnnualBudgetDisburseVO">
+        select abd.*,
+               (select dict_name  from c_dict_info WHERE `type` = 1 AND dict_value = abd.budget_subject AND parent_id = 0) as budgetSubjectValue,
+               (select dict_name  from c_dict_info WHERE `type` = 1 AND dict_value = abd.second_subject
+                       AND parent_id = (select id  from c_dict_info WHERE `type` = 1 AND dict_value = abd.budget_subject AND parent_id = 0)) as secondSubjectValue
+        from c_annual_budget_disburse abd
+        WHERE abd.annual_budget_id = #{id}
+    </select>
+    <select id="getAllBudgetSubject" resultType="org.springblade.control.vo.DictInfoVO">
+        select *
+        from c_dict_info di WHERE di.`type` = 1 AND di.parent_id = 0 ORDER BY sort
+    </select>
+    <select id="getAllSecondSubject" resultType="org.springblade.control.vo.DictInfoVO">
+        select *
+        from c_dict_info di WHERE di.`type` = 1 AND di.parent_id > 0
+    </select>
+
 
 </mapper>

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

@@ -11,5 +11,6 @@ import org.springblade.core.mp.base.BaseService;
  **/
 public interface IAnnualBudgetDisburseService extends BaseService<AnnualBudgetDisburse> {
 
+    void deleteByAnnualId(Long id);
 
 }

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

@@ -11,5 +11,5 @@ import org.springblade.core.mp.base.BaseService;
  **/
 public interface IAnnualBudgetIncomeService extends BaseService<AnnualBudgetIncome> {
 
-
+    void deleteByAnnualId(Long id);
 }

+ 16 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java

@@ -1,12 +1,14 @@
 package org.springblade.control.service;
 
+import org.springblade.control.dto.AnnualBudgetDTO;
 import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
-import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.vo.*;
 import org.springblade.core.mp.base.BaseService;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Param
@@ -16,4 +18,17 @@ import java.util.List;
 public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
 
 
+    void addAnnualBudget(AnnualBudgetDTO dto);
+
+    void updateAnnualBudget(AnnualBudgetDTO dto);
+
+    AnnualBudgetVO getAnnualBudget(Long id);
+
+    void deleteAnnualBudget(Long id);
+
+    List<ControlProjectInfoVO> getProjectList();
+
+    AnnualBudgetVO2 preview(Long id);
+
+    List<DictInfoVO> getSecondSubject();
 }

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

@@ -20,4 +20,8 @@ import org.springframework.stereotype.Service;
 public class AnnualBudgetDisburseServiceImpl extends BaseServiceImpl<AnnualBudgetDisburseMapper, AnnualBudgetDisburse> implements IAnnualBudgetDisburseService {
 
 
+    @Override
+    public void deleteByAnnualId(Long id) {
+        baseMapper.deleteByAnnualId(id);
+    }
 }

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

@@ -20,4 +20,8 @@ import org.springframework.stereotype.Service;
 public class AnnualBudgetIncomeServiceImpl extends BaseServiceImpl<AnnualBudgetIncomeMapper, AnnualBudgetIncome> implements IAnnualBudgetIncomeService {
 
 
+    @Override
+    public void deleteByAnnualId(Long id) {
+        baseMapper.deleteByAnnualId(id);
+    }
 }

+ 357 - 9
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -2,21 +2,22 @@ package org.springblade.control.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.AllArgsConstructor;
-import org.springblade.control.entity.AnnualBudget;
-import org.springblade.control.entity.DepartmentMonthPlan;
-import org.springblade.control.entity.DictInfo;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.AnnualBudgetDTO;
+import org.springblade.control.entity.*;
 import org.springblade.control.mapper.AnnualBudgetMapper;
 import org.springblade.control.mapper.DepartmentMonthPlanMapper;
-import org.springblade.control.service.IAnnualBudgetService;
-import org.springblade.control.service.IDepartmentMonthPlanService;
-import org.springblade.control.service.IProjectCostBudgetService;
-import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.service.*;
+import org.springblade.control.vo.*;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Param
@@ -27,5 +28,352 @@ import java.util.List;
 @AllArgsConstructor
 public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper, AnnualBudget> implements IAnnualBudgetService {
 
+    private final IAnnualBudgetIncomeService incomeService;
 
+    private final IAnnualBudgetDisburseService disburseService;
+
+    /**
+     * 新增年度经营预算
+     * @param dto
+     */
+    @Override
+    @Transactional
+    public void addAnnualBudget(AnnualBudgetDTO dto) {
+        Long id = SnowFlakeUtil.getId();
+        dto.setId(id);
+        //统计支出
+        Map<String, BigDecimal> map = statisticDisburse(dto);
+        BigDecimal disburseTotal = map.get("1");
+        BigDecimal staffTotal = map.get("2");
+        //统计收入
+        Map<String, BigDecimal> map2 = statisticIncome(dto);
+        BigDecimal contractTotal = map2.get("1");
+        BigDecimal planReturnedTotal = map2.get("2");
+
+        //总经营预算
+        dto.setTotalBudget(disburseTotal);
+        //年度合同指标
+        dto.setAnnualContractTarget(contractTotal);
+        //年度利润指标
+        dto.setAnnualProfitTarget(planReturnedTotal.subtract(disburseTotal));
+        //人工成本
+        dto.setStaffCost(staffTotal);
+        //管理支出
+        dto.setManageDisburse(disburseTotal.subtract(staffTotal));
+
+        //保存年度预算
+        AnnualBudget annualBudget = new AnnualBudget();
+        BeanUtils.copyProperties(dto,annualBudget);
+        this.save(annualBudget);
+        //保存年度收入
+        incomeService.saveBatch(dto.getIncomeList());
+        //保存年度支出
+        disburseService.saveBatch(dto.getDisburseList());
+
+    }
+
+    /**
+     * 修改年度经营预算
+     * @param dto
+     */
+    @Override
+    @Transactional
+    public void updateAnnualBudget(AnnualBudgetDTO dto) {
+        //统计支出
+        Map<String, BigDecimal> map = statisticDisburse(dto);
+        BigDecimal disburseTotal = map.get("1");
+        BigDecimal staffTotal = map.get("2");
+        //统计收入
+        Map<String, BigDecimal> map2 = statisticIncome(dto);
+        BigDecimal contractTotal = map2.get("1");
+        BigDecimal planReturnedTotal = map2.get("2");
+
+        //总经营预算
+        dto.setTotalBudget(disburseTotal);
+        //年度合同指标
+        dto.setAnnualContractTarget(contractTotal);
+        //年度利润指标
+        dto.setAnnualProfitTarget(planReturnedTotal.subtract(disburseTotal));
+        //人工成本
+        dto.setStaffCost(staffTotal);
+        //管理支出
+        dto.setManageDisburse(disburseTotal.subtract(staffTotal));
+
+        //保存年度预算
+        AnnualBudget annualBudget = new AnnualBudget();
+        BeanUtils.copyProperties(dto,annualBudget);
+        this.updateById(annualBudget);
+        //保存年度收入
+        incomeService.deleteByAnnualId(dto.getId());
+        incomeService.saveBatch(dto.getIncomeList());
+        //保存年度支出
+        disburseService.deleteByAnnualId(dto.getId());
+        disburseService.saveBatch(dto.getDisburseList());
+    }
+
+    /**
+     * 获取单个年度经营预算
+     */
+    @Override
+    public AnnualBudgetVO getAnnualBudget(Long id) {
+        //获取总预算
+        AnnualBudgetVO vo = baseMapper.getAnnualBudget(id);
+        //获取收入列表
+        List<AnnualBudgetIncome> incomeList = incomeService.list(new LambdaQueryWrapper<AnnualBudgetIncome>().eq(AnnualBudgetIncome::getAnnualBudgetId, id));
+        vo.setIncomeList(incomeList);
+        //获取支出列表
+        List<AnnualBudgetDisburse> disburseList = disburseService.list(new LambdaQueryWrapper<AnnualBudgetDisburse>().eq(AnnualBudgetDisburse::getAnnualBudgetId, id));
+        vo.setDisburseList(disburseList);
+        return vo;
+    }
+
+    /**
+     * 删除单个年度经营预算
+     */
+    @Override
+    @Transactional
+    public void deleteAnnualBudget(Long id) {
+        baseMapper.removeById(id);
+        incomeService.deleteByAnnualId(id);
+        disburseService.deleteByAnnualId(id);
+    }
+
+    /**
+     * 获取项目列表及相关信息
+     * @return
+     */
+    @Override
+    public List<ControlProjectInfoVO> getProjectList() {
+        return baseMapper.getProjectList();
+    }
+
+    /**
+     * 查询预览
+     */
+    @Override
+    public AnnualBudgetVO2 preview(Long id) {
+        AnnualBudgetVO2 vo2 = new AnnualBudgetVO2();
+        List<AnnualBudgetVO2.IncomeDetail> incomeDetails = new ArrayList<>();
+        List<AnnualBudgetVO2.disburseDetail> disburseDetails = new ArrayList<>();
+        List<BigDecimal> bigDecimals = new ArrayList<>();
+        //获取预算收入集合
+        List<AnnualBudgetIncomeVO> incomeList = baseMapper.getReturnedByAnnualBudgetId(id);
+        //获取预算支出集合
+        List<AnnualBudgetDisburseVO> disburseList = baseMapper.getDisburseByAnnualBudgetId(id);
+        //分别计算12个月
+        for (int i = 1; i <= 12; i++) {
+            //统计单月收入
+            AnnualBudgetVO2.IncomeDetail incomeDetail = new AnnualBudgetVO2.IncomeDetail();
+            BigDecimal incomeTotal = new BigDecimal("0");
+            List<AnnualBudgetIncomeVO> list1 = new ArrayList<>();
+            if (incomeList != null && incomeList.size() >0){
+                for (AnnualBudgetIncomeVO vo : incomeList) {
+                    if (vo.getReturnTime().getMonthValue() == i) {
+                        incomeTotal = incomeTotal.add(vo.getReturnMoney());
+                        list1.add(vo);
+                    }
+                }
+            }
+            //移除集中和已经通过的月
+            incomeDetail.setIncome(incomeTotal);
+            incomeDetail.setIncomeList(list1);
+            incomeDetails.add(incomeDetail);
+            //统计单月支出
+            AnnualBudgetVO2.disburseDetail disburseDetail = new AnnualBudgetVO2.disburseDetail();
+            BigDecimal disburseTotal = new BigDecimal("0");
+            List<AnnualBudgetDisburseVO> list2 = new ArrayList<>();
+            if (disburseList != null && disburseList.size() >0){
+                for (AnnualBudgetDisburseVO vo : disburseList) {
+                    if (i == 1){
+                        if (vo.getJanuary().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getJanuary());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 2){
+                        if (vo.getFebruary().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getFebruary());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 3){
+                        if (vo.getMarch().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getMarch());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 4){
+                        if (vo.getApril().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getApril());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 5){
+                        if (vo.getMay().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getMay());
+                            list2.add(vo);
+                          }
+                    }
+                    if (i == 6){
+                        if (vo.getJune().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getJune());
+                            list2.add(vo);
+                         }
+                    }
+                    if (i == 7){
+                        if (vo.getJuly().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getJuly());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 8){
+                        if (vo.getAugust().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getAugust());
+                        }
+                    }
+                    if (i == 9){
+                        if (vo.getSeptember().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getSeptember());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 10){
+                        if (vo.getOctober().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getOctober());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 11){
+                        if (vo.getNovember().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getNovember());
+                            list2.add(vo);
+                        }
+                    }
+                    if (i == 12){
+                        if (vo.getDecember().compareTo(BigDecimal.ZERO) != 0) {
+                            disburseTotal = disburseTotal.add(vo.getDecember());
+                            list2.add(vo);
+                        }
+                    }
+                }
+            }
+            disburseDetail.setDisburse(disburseTotal);
+            disburseDetail.setDisburseList(list2);
+            disburseDetails.add(disburseDetail);
+            //统计单月盈利,月收入-月支出
+            bigDecimals.add(incomeTotal.subtract(disburseTotal));
+
+        }
+        vo2.setMonthIncome(incomeDetails);
+        vo2.setMonthDisburse(disburseDetails);
+        vo2.setMonthTotal(bigDecimals);
+        return vo2;
+    }
+
+    /**
+     * 获取二级科目
+     */
+    @Override
+    public List<DictInfoVO> getSecondSubject() {
+        List<DictInfoVO> allBudgetSubject = baseMapper.getAllBudgetSubject();
+        List<DictInfoVO> allSecondSubject =baseMapper.getAllSecondSubject();
+        for (DictInfoVO vo : allBudgetSubject) {
+            List<DictInfoVO> list = new ArrayList<>();
+            for (DictInfoVO v02 : allSecondSubject) {
+                if (vo.getId().equals(v02.getParentId())){
+                    list.add(v02);
+                }
+            }
+            list = list.stream().sorted(Comparator.comparing(DictInfo::getSort)).collect(Collectors.toList());
+            vo.setChildren(list);
+        }
+        return allBudgetSubject;
+    }
+
+    /**
+     * 统计支出 1支出总和2工资总和
+     */
+    public static Map<String,BigDecimal> statisticDisburse(AnnualBudgetDTO dto){
+        BigDecimal disburseTotal = new BigDecimal("0");
+        BigDecimal staffTotal = new BigDecimal("0");
+        List<AnnualBudgetDisburse> disburseList = dto.getDisburseList();
+        if (disburseList != null && disburseList.size() > 0){
+            for (AnnualBudgetDisburse disburse : disburseList) {
+                disburse.setAnnualBudgetId(dto.getId());
+                //统计支出总和
+                BigDecimal temp = new BigDecimal("0");
+                if (disburse.getJanuary() != null){
+                    temp = temp.add(disburse.getJanuary());
+                }
+                if (disburse.getFebruary() != null){
+                    temp = temp.add(disburse.getFebruary());
+                }
+                if (disburse.getMarch() != null){
+                    temp = temp.add(disburse.getMarch());
+                }
+                if (disburse.getApril() != null){
+                    temp = temp.add(disburse.getApril());
+                }
+                if (disburse.getMay() != null){
+                    temp = temp.add(disburse.getMay());
+                }
+                if (disburse.getJune() != null){
+                    temp = temp.add(disburse.getJune());
+                }
+                if (disburse.getJuly() != null){
+                    temp = temp.add(disburse.getJuly());
+                }
+                if (disburse.getAugust() != null){
+                    temp = temp.add(disburse.getAugust());
+                }
+                if (disburse.getSeptember() != null){
+                    temp = temp.add(disburse.getSeptember());
+                }
+                if (disburse.getOctober() != null){
+                    temp = temp.add(disburse.getOctober());
+                }
+                if (disburse.getNovember() != null){
+                    temp = temp.add(disburse.getNovember());
+                }
+                if (disburse.getDecember() != null){
+                    temp = temp.add(disburse.getDecember());
+                }
+                disburseTotal = disburseTotal.add(temp);
+                //单独统计支出中的人工成本总和
+                if (disburse.getBudgetSubject() == 3){
+                    staffTotal = staffTotal.add(temp);
+                }
+            }
+        }
+        Map<String,BigDecimal> map = new HashMap<>();
+        map.put("1",disburseTotal);
+        map.put("2",staffTotal);
+        return map;
+    }
+
+    /**
+     * 统计收入,1合同收入2计划回款
+     */
+    public static Map<String,BigDecimal> statisticIncome(AnnualBudgetDTO dto){
+        List<AnnualBudgetIncome> incomeList = dto.getIncomeList();
+        BigDecimal contractTotal = new BigDecimal("0");
+        BigDecimal planReturnedTotal = new BigDecimal("0");
+        if (incomeList != null && incomeList.size() > 0){
+            for (AnnualBudgetIncome income : incomeList) {
+                income.setAnnualBudgetId(dto.getId());
+                //合同额总和
+                if (income.getPredictContractMoney() != null) {
+                    contractTotal = contractTotal.add(income.getPredictContractMoney());
+                }
+                //计划回款总和
+                if (income.getPredictAnnualReturned() != null){
+                    planReturnedTotal = planReturnedTotal.add(income.getPredictAnnualReturned());
+                }
+            }
+        }
+        Map<String,BigDecimal> map = new HashMap<>();
+        map.put("1",contractTotal);
+        map.put("2",planReturnedTotal);
+        return map;
+    }
 }