Procházet zdrojové kódy

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf před 2 roky
rodič
revize
1df853ef6a
38 změnil soubory, kde provedl 1353 přidání a 71 odebrání
  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. 93 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentPlanLog.java
  5. 5 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  6. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetDisburseVO.java
  7. 40 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetIncomeVO.java
  8. 32 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO.java
  9. 50 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO2.java
  10. 2 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java
  11. 95 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  12. 16 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java
  13. 28 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentPlanLogController.java
  14. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.java
  15. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetDisburseMapper.xml
  16. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.java
  17. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetIncomeMapper.xml
  18. 18 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java
  19. 42 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml
  20. 15 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentPlanLogMapper.java
  21. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentPlanLogMapper.xml
  22. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetDisburseService.java
  23. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetIncomeService.java
  24. 16 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  25. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentMonthPlanService.java
  26. 18 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentPlanLogService.java
  27. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetDisburseServiceImpl.java
  28. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetIncomeServiceImpl.java
  29. 357 9
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  30. 17 8
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  31. 38 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentPlanLogImpl.java
  32. 59 34
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  33. 49 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  34. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  35. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java
  36. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  37. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  38. 250 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.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"

+ 93 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentPlanLog.java

@@ -0,0 +1,93 @@
+package org.springblade.control.entity;
+
+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.core.mp.base.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.util.Date;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/15 11:42
+ **/
+@Data
+@TableName("c_department_plan_log")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "部门计划日志表", description = "部门计划日志表")
+public class DepartmentPlanLog extends BaseEntity {
+    @ApiModelProperty(value = "计划id")
+    private Long planId;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "原计划开始时间")
+    private LocalDate planStartTime;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "原计划结束时间")
+    private LocalDate planEndTime;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "实际计划开启时间")
+    private LocalDate realPlanStartTime;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "中途暂停时间")
+    private LocalDate timeOut;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "中途开启计划-开始时间")
+    private LocalDate openPlanStartTime;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "中途开启计划-结束时间")
+    private LocalDate openPlanEndTime;
+
+    @ApiModelProperty(value = "实际工作时间")
+    private Integer realWorkDays;
+
+    @ApiModelProperty(value = "计划执行顺序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "中途开启计划起止天数")
+    private Integer openPlanStartEndDays;
+
+    @ApiModelProperty(value = "上一次中途开启计划起止天数")
+    private Integer lastOpenPlanStartEndDays;
+}

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

@@ -86,6 +86,9 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "计划完成指标")
     private String planTarget;
 
+    @ApiModelProperty(value = "任务人")
+    private Long taskUser;
+
     @DateTimeFormat(
             pattern = "yyyy-MM-dd"
     )
@@ -93,7 +96,7 @@ public class ProjectCostBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "计划开始日期")
-    private Date planStartDate;
+    private LocalDate planStartTime;
 
     @DateTimeFormat(
             pattern = "yyyy-MM-dd"
@@ -102,7 +105,7 @@ public class ProjectCostBudget extends BaseEntity {
             pattern = "yyyy-MM-dd"
     )
     @ApiModelProperty(value = "计划结束日期")
-    private Date planEndDate;
+    private LocalDate planEndTime;
 
     @ApiModelProperty(value = "计划天数")
     private BigDecimal planDays;

+ 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());
+    }
 
 }

+ 16 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java

@@ -2,6 +2,8 @@ package org.springblade.control.controller;
 
 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.entity.DepartmentMonthPlan;
@@ -32,6 +34,20 @@ public class DepartmentMonthPlanController {
         return R.data(planService.addDepartmentPlan(plan));
     }
 
+    /**
+     * 查询部门月计划
+     */
+    @PostMapping("/getDepartmentPlan")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "查询部门月计划")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "departmentType", value = "部门名称", required = true),
+            @ApiImplicitParam(name = "planDate", value = "计划日期", required = true),
+    })
+    public R getDepartmentPlan(@RequestBody DepartmentMonthPlan plan) {
+        return R.data(planService.getDepartmentPlan(plan));
+    }
+
     /**
      * 获取前5个部门列表
      */

+ 28 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentPlanLogController.java

@@ -0,0 +1,28 @@
+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.service.IAnnualBudgetService;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/12 15:45
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/departmentPlanLog")
+@Api(value = "部门计划日志接口", tags = "部门计划日志接口")
+public class DepartmentPlanLogController {
+
+
+}

+ 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>

+ 15 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentPlanLogMapper.java

@@ -0,0 +1,15 @@
+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.DepartmentPlanLog;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:38
+ **/
+public interface DepartmentPlanLogMapper extends BaseMapper<DepartmentPlanLog> {
+
+}

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

@@ -0,0 +1,6 @@
+<?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.DepartmentPlanLogMapper">
+
+
+</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();
 }

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

@@ -20,4 +20,6 @@ public interface IDepartmentMonthPlanService extends BaseService<DepartmentMonth
     List<ProjectCostBudgetVO> addDepartmentPlan(DepartmentMonthPlan plan);
 
     List<DictInfo> getDepartmentDict();
+
+    List<ProjectCostBudgetVO> getDepartmentPlan(DepartmentMonthPlan plan);
 }

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

@@ -0,0 +1,18 @@
+package org.springblade.control.service;
+
+import org.springblade.control.entity.DepartmentMonthPlan;
+import org.springblade.control.entity.DepartmentPlanLog;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 13:41
+ **/
+public interface IDepartmentPlanLogService extends BaseService<DepartmentPlanLog> {
+
+}

+ 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;
+    }
 }

+ 17 - 8
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java

@@ -53,14 +53,7 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
         plan.setPlanName(date[0]+"年"+date[1]+"月"+departmentName+"预算计划");
         this.save(plan);
         //查询出部门当月的项目计划,返回
-        List<ProjectCostBudgetVO> voList = new ArrayList<>();
-        if (plan.getDepartmentType() != 5){
-            voList = budgetService.getDepartmentPlan(plan.getDepartmentType(),planDate);
-        }else {
-            voList.addAll(budgetService.getDepartmentPlan(5,planDate));
-            voList.addAll(budgetService.getDepartmentPlan(6,planDate));
-        }
-        return voList;
+        return getDepartmentPlan(plan);
     }
 
     /**
@@ -71,4 +64,20 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
     public List<DictInfo> getDepartmentDict() {
         return baseMapper.getDepartmentDict();
     }
+
+    /**
+     * 获取部门月计划
+     */
+    @Override
+    public List<ProjectCostBudgetVO> getDepartmentPlan(DepartmentMonthPlan plan) {
+        //查询出部门当月的项目计划,返回
+        List<ProjectCostBudgetVO> voList = new ArrayList<>();
+        if (plan.getDepartmentType() != 5){
+            voList = budgetService.getDepartmentPlan(plan.getDepartmentType(),plan.getPlanDate());
+        }else {
+            voList.addAll(budgetService.getDepartmentPlan(5,plan.getPlanDate()));
+            voList.addAll(budgetService.getDepartmentPlan(6,plan.getPlanDate()));
+        }
+        return voList;
+    }
 }

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

@@ -0,0 +1,38 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.entity.ControlContractInfo;
+import org.springblade.control.entity.ControlProjectInfo;
+import org.springblade.control.entity.DepartmentPlanLog;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.mapper.DepartmentPlanLogMapper;
+import org.springblade.control.mapper.ProjectInfoMapper;
+import org.springblade.control.service.IContractInfoService;
+import org.springblade.control.service.IDepartmentPlanLogService;
+import org.springblade.control.service.IProjectInfoService;
+import org.springblade.control.service.IProjectProcessService;
+import org.springblade.control.vo.ControlProjectInfoVO;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Query;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:43
+ **/
+@Service
+@AllArgsConstructor
+public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapper, DepartmentPlanLog> implements IDepartmentPlanLogService {
+
+}

+ 59 - 34
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -53,8 +53,10 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId());
             queryWrapper.lambda().eq(TaskProcessInfo::getStatus, 1);
         } else if (dto.getSelectType().equals("2")) { //已审核、已驳回为已办任务
-            queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId());
-            queryWrapper.lambda().in(TaskProcessInfo::getStatus, 2, 3);
+            queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId())
+                    .or()
+                    .like(TaskProcessInfo::getAuditUserIdsComplete, SecureUtil.getUserId())
+                    .and(wrapper -> wrapper.in(TaskProcessInfo::getStatus, 2, 3));
         } else if (dto.getSelectType().equals("3")) { //我发起的任务
             if (ObjectUtil.isNotEmpty(dto.getSelectStatus()) && !dto.getSelectStatus().equals("1")) {
                 queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
@@ -83,15 +85,19 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
             vo.setReportUserName(userMap.get(vo.getReportUserId()));
 
-            List<String> auditUserNames = Arrays.stream(vo.getAuditUserIds().split(","))
-                    .map(Long::parseLong).map(userMap::get)
-                    .collect(Collectors.toList());
-            vo.setAuditUserNames(StringUtils.join(auditUserNames, "、"));
+            if (StringUtils.isNotEmpty(vo.getAuditUserIds())) {
+                List<String> auditUserNames = Arrays.stream(vo.getAuditUserIds().split(","))
+                        .map(Long::parseLong).map(userMap::get)
+                        .collect(Collectors.toList());
+                vo.setAuditUserNames(StringUtils.join(auditUserNames, "、"));
+            }
 
-            List<String> auditUserCompleteNames = Arrays.stream(vo.getAuditUserIdsComplete().split(","))
-                    .map(Long::parseLong).map(userMap::get)
-                    .collect(Collectors.toList());
-            vo.setAuditUserCompleteNames(StringUtils.join(auditUserCompleteNames, "、"));
+            if (StringUtils.isNotEmpty(vo.getAuditUserIdsComplete())) {
+                List<String> auditUserCompleteNames = Arrays.stream(vo.getAuditUserIdsComplete().split(","))
+                        .map(Long::parseLong).map(userMap::get)
+                        .collect(Collectors.toList());
+                vo.setAuditUserCompleteNames(StringUtils.join(auditUserCompleteNames, "、"));
+            }
 
             vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : "已驳回"));
 
@@ -207,31 +213,42 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
     @Override
     public boolean taskReject(TaskProcessInfoDTO dto) {
-        if (ObjectUtil.isEmpty(dto.getId())) {
-            throw new ServiceException("未获取到当前任务信息,请联系管理员");
-        }
-        List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + dto.getId(), new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
-        if (records.size() == 0) {
-            throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("未获取到当前用户信息,请联系管理员");
         }
-        //修改审批任务状态 =3 已驳回
-        if (this.update(Wrappers.<TaskProcessInfo>lambdaUpdate()
-                .set(TaskProcessInfo::getStatus, 3)
-                .set(TaskProcessInfo::getRejectDesc, StringUtils.isNotEmpty(dto.getRejectDesc()) ? dto.getRejectDesc() : null)
-                .eq(TaskProcessInfo::getId, dto.getId()))) {
-            //修改业务数据状态 =3 已驳回
-            for (ExpenseTaskRecord record : records) {
-                if (ObjectUtil.isNotEmpty(record.getExpenseInfoType())) {
-                    Integer businessDataType = record.getExpenseInfoType();
-                    if (businessDataType.equals(dto.getTaskType())) {
-                        this.updateTaskStatus(businessDataType, 3, record.getExpenseInfoId());
+        TaskProcessInfo taskProcessInfo = baseMapper.selectById(dto.getId());
+        if (taskProcessInfo != null) {
+            List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + taskProcessInfo.getId(), new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
+            if (records.size() == 0) {
+                throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
+            }
+            if (StringUtils.isNotEmpty(taskProcessInfo.getAuditUserIds())) {
+                if (!taskProcessInfo.getAuditUserIds().contains(SecureUtil.getUserId() + "")) {
+                    throw new ServiceException("当前用户不属于当前审批任务的审批人员,操作失败");
+                }
+                //修改审批任务状态 =3 已驳回
+                if (this.update(Wrappers.<TaskProcessInfo>lambdaUpdate()
+                        .set(TaskProcessInfo::getStatus, 3)
+                        .set(TaskProcessInfo::getRejectDesc, StringUtils.isNotEmpty(dto.getRejectDesc()) ? dto.getRejectDesc() : null)
+                        .eq(TaskProcessInfo::getId, dto.getId()))) {
+                    //修改业务数据状态 =3 已驳回
+                    for (ExpenseTaskRecord record : records) {
+                        if (ObjectUtil.isNotEmpty(record.getExpenseInfoType())) {
+                            Integer businessDataType = record.getExpenseInfoType();
+                            if (businessDataType.equals(dto.getTaskType())) {
+                                this.updateTaskStatus(businessDataType, 3, record.getExpenseInfoId());
+                            }
+                        }
                     }
+                    return true;
                 }
+            } else {
+                throw new ServiceException("未获取到当前任务的审批人员信息,请联系管理员");
             }
-            return true;
         } else {
-            throw new ServiceException("当前任务审批失败,请联系管理员");
+            throw new ServiceException("未获取到当前任务信息,请联系管理员");
         }
+        return false;
     }
 
     @Override
@@ -242,23 +259,31 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         }
         TaskProcessInfo taskProcessInfo = baseMapper.selectById(id);
         if (ObjectUtil.isEmpty(taskProcessInfo)) {
-            throw new ServiceException("未获取当前任务信息,请联系管理员");
+            throw new ServiceException("未获取当前任务信息,请联系管理员");
         }
 
         List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where task_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
         if (records.size() == 0) {
             throw new ServiceException("未获取当前任务的关联业务信息,请联系管理员");
         }
-        if (StringUtils.isNotEmpty(taskProcessInfo.getAuditUserIds()) && taskProcessInfo.getAuditUserIds().contains(SecureUtil.getUserId() + "")) {
+        if (StringUtils.isNotEmpty(taskProcessInfo.getAuditUserIds())) {
+            if (ObjectUtil.isNotEmpty(taskProcessInfo.getAuditUserIdsComplete()) && taskProcessInfo.getAuditUserIdsComplete().contains(SecureUtil.getUserId() + "")) {
+                throw new ServiceException("当前用户已完成此任务的审批操作,请勿重复提交");
+            }
+            if (!taskProcessInfo.getAuditUserIds().contains(SecureUtil.getUserId() + "")) {
+                throw new ServiceException("当前用户不属于当前审批任务的审批人员,操作失败");
+            }
             //加锁
             String redisLock = bladeRedis.get("user:id=" + SecureUtil.getUserId());
             if (StringUtils.isNotEmpty(redisLock) && redisLock.equals("task:id=" + id)) {
-                throw new ServiceException("当前用户已提交该任务的审批,请勿重复操作!");
+                throw new ServiceException("当前用户已完成此任务的审批操作,请勿重复提交");
             } else {
-                bladeRedis.setEx("user:id=" + SecureUtil.getUserId(), "task:id=" + id, Duration.ofMinutes(10));//10分钟过期
+                bladeRedis.setEx("user:id=" + SecureUtil.getUserId(), "task:id=" + id, Duration.ofMinutes(1));
             }
 
-            List<String> auditUserIdList = Func.toStrList(taskProcessInfo.getAuditUserIds());
+            //待审批人员List
+            List<String> auditUserIdList = new ArrayList<>(Func.toStrList(taskProcessInfo.getAuditUserIds()));
+            //已审批人员List
             Set<String> auditUserIdCompleteList = new HashSet<>(Func.toStrList(taskProcessInfo.getAuditUserIdsComplete()));
 
             //剔除待审批中当前用户信息

+ 49 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -582,7 +582,7 @@ public class ContractInfoController extends BladeController {
     /**
      * 查询合同段树-全加载-监理合同段
      */
-    @GetMapping("/tree-all-jl")
+    /*@GetMapping("/tree-all-jl")
     @ApiOperationSupport(order = 19)
     @ApiOperation(value = "查询合同段私有Wbs节点树形结构-监理合同段", notes = "合同段id,type=1")
     @ApiImplicitParams(value = {
@@ -604,7 +604,7 @@ public class ContractInfoController extends BladeController {
             return R.data(treeAllJL);
         }
         return R.fail(200, "未查询到信息");
-    }
+    }*/
 
     /**
      * 查询合同段私有Wbs节点树形结构 --- 试验关联工程节点树 懒加载
@@ -713,4 +713,51 @@ public class ContractInfoController extends BladeController {
     }
 
 
+    /**
+     * 资料填报(资料查询)节点搜索输入框查询接口
+     *
+     * @author liuyc
+     * @since 2023年6月15日11:44:36
+     */
+    @GetMapping("/getTreeNodeByQueryValueAndContractId")
+    @ApiOperationSupport(order = 23)
+    @ApiOperation(value = "资料填报(资料查询)节点搜索输入框查询接口", notes = "传入合同段id、输入框搜索的queryValue")
+    public R getTreeNodeByValueAndContractId(@RequestParam String queryValue, @RequestParam String contractId) {
+        R list = contractInfoService.getTreeNodeByValueAndContractId(queryValue, contractId);
+        Object data = list.getData();
+        if (data != null) {
+            ContractInfo contractInfo = contractInfoService.getBaseMapper().selectById(contractId);
+            if (data instanceof List) {
+                if (contractInfo.getContractType().equals(1)) {
+                    List<WbsTreeContractTreeAllVO> dataList = (List<WbsTreeContractTreeAllVO>) data;
+                    for (WbsTreeContractTreeAllVO wbsTreeContractVO : dataList) {
+                        if (ObjectUtil.isNotEmpty(wbsTreeContractVO.getParentId()) && 0L == wbsTreeContractVO.getParentId()) {
+                            wbsTreeContractVO.setTitle(contractInfo.getContractName());
+                            break;
+                        }
+                    }
+                    return R.data(data);
+                }
+            } else if (data instanceof Map) {
+                if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
+                    List<WbsTreeContractTreeAllVO> jlYzList = new LinkedList<>();
+                    Map<Long, List<WbsTreeContractTreeAllVO>> dataMap = (Map<Long, List<WbsTreeContractTreeAllVO>>) data;
+                    for (Map.Entry<Long, List<WbsTreeContractTreeAllVO>> map : dataMap.entrySet()) {
+                        ContractInfo contractInfoJlYz = contractInfoService.getBaseMapper().selectById(map.getKey());
+                        for (WbsTreeContractTreeAllVO wbsTreeContractVO : map.getValue()) {
+                            if (ObjectUtil.isNotEmpty(wbsTreeContractVO.getParentId()) && 0L == wbsTreeContractVO.getParentId()) {
+                                wbsTreeContractVO.setTitle(contractInfoJlYz.getContractName());
+                                break;
+                            }
+                        }
+                        jlYzList.addAll(map.getValue());
+                    }
+                    return R.data(jlYzList);
+                }
+            }
+        }
+        return R.fail(200, "未查询到信息");
+    }
+
+
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -469,7 +469,7 @@
         d.parent_id AS "parentId",
         IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,
         d.node_name AS "nodeName",
-        d.node_type AS "nodeType",
+        d.node_type ,
         d.id AS "value",
         d.id AS "key",
         old_id,

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
@@ -78,4 +79,7 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
 
     List<ContractInfo> getContractListByProjectId(Long projectId);
+
+    R getTreeNodeByValueAndContractId(String queryValue, String contractId);
+
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -401,6 +401,9 @@ public class ArTreeContractInitServiceImpl {
         for (WbsTreeContractVO6 wbsTreeVO2 : wbsTreeContractVO6s) {
             //不要中间交工,质量评定和开工报告作为目录节点
             //wbsMap.put(wbsTreeVO2.getId(),wbsTreeVO2);
+            if(wbsTreeVO2.getNodeType() == null){
+                continue;
+            }
             if (!wbsTreeVO2.isProcessType()) {
                 continue;
             }

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

@@ -157,7 +157,7 @@ public class ArchiveTreeContractSyncImpl {
 
         List<ArchiveTreeContract> saveList = new ArrayList<>();
         //todo 等测试OK再打开
-        //saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
+//        saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
 
         return saveList;
     }

+ 250 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -2,27 +2,32 @@ package org.springblade.manager.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
 import lombok.AllArgsConstructor;
+import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.mapper.ProjectContractAreaMapper;
 import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
-import org.springblade.manager.vo.*;
-import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.service.IContractInfoService;
-import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.vo.*;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.vo.UserContractInfoVO;
@@ -31,7 +36,6 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.io.IOException;
 import java.util.*;
@@ -206,10 +210,250 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 
     @Override
     public List<ContractInfo> getContractListByProjectId(Long projectId) {
-        List<ContractInfo> list=contractInfoMapper.getContractListByProjectId(projectId);
-        return list;
+        return contractInfoMapper.getContractListByProjectId(projectId);
+    }
+
+    @Override
+    public R getTreeNodeByValueAndContractId(String queryValue, String contractId) {
+        List<WbsTreeContractTreeAllVO> resultList = new ArrayList<>();
+        Map<Long, List<WbsTreeContractTreeAllVO>> resultMaps = new LinkedHashMap<>();
+        if (StringUtils.isNotEmpty(queryValue) && StringUtils.isNotEmpty(contractId)) {
+            ContractInfo contractInfo = contractInfoMapper.selectById(contractId);
+            if (contractInfo != null) {
+                //质检
+                if (contractInfo.getContractType().equals(1)) {
+                    //获取查询的有效节点信息,以及所有上级父级节点
+                    LambdaQueryWrapper<WbsTreeContract> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.like(WbsTreeContract::getFullName, queryValue);
+                    queryWrapper.eq(WbsTreeContract::getContractId, contractId);
+                    queryWrapper.eq(WbsTreeContract::getType, 1);
+                    List<WbsTreeContract> nodes = wbsTreeContractMapper.selectList(queryWrapper);
+                    Set<WbsTreeContract> resultNodes = new LinkedHashSet<>();
+                    this.recursiveGetParentNodes(resultNodes, nodes, contractId);
+                    resultNodes.addAll(nodes);
+                    List<String> nodePkeyIds = resultNodes.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+
+                    //获取填报过的资料信息Map
+                    Set<InformationQuery> informationQuerySet = new HashSet<>();
+                    List<List<String>> partition = Lists.partition(nodePkeyIds, 500);
+                    for (List<String> wbsIds : partition) {
+                        List<InformationQuery> informationQueryList = jdbcTemplate.query("select wbs_id,status from u_information_query where wbs_id in(" + org.apache.commons.lang.StringUtils.join(wbsIds, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
+                        informationQuerySet.addAll(informationQueryList);
+                    }
+                    Map<Long, Integer> informationQueryMaps = informationQuerySet.stream().collect(Collectors.toMap(InformationQuery::getWbsId, InformationQuery::getStatus, (v1, v2) -> v1));
+
+                    //构造vo
+                    List<WbsTreeContractTreeAllVO> wbsTreeContractTreeAllVOS = resultNodes.stream().map(node -> {
+                        WbsTreeContractTreeAllVO vo = BeanUtil.copyProperties(node, WbsTreeContractTreeAllVO.class);
+                        if (vo != null) {
+                            vo.setType(ObjectUtils.isNotEmpty(node.getNodeType()) ? node.getNodeType() : 0);
+                            vo.setTitle(node.getFullName());
+                            vo.setPrimaryKeyId(node.getPKeyId());
+                            if (ObjectUtils.isNotEmpty(informationQueryMaps.get(vo.getPrimaryKeyId()))) {
+                                vo.setSubmitCounts(1L); //如果存在资料填报信息,那么计数
+                                vo.setColorStatus(informationQueryMaps.get(vo.getPrimaryKeyId())); //颜色
+                            } else {
+                                vo.setSubmitCounts(0L);
+                                vo.setColorStatus(null); //没填报就是null
+                            }
+                        }
+                        return vo;
+                    }).collect(Collectors.toList());
+
+                    //构造树形结构
+                    List<WbsTreeContractTreeAllVO> reNodes = this.buildWbsTreeByStreamByTreeAll(wbsTreeContractTreeAllVOS);
+
+                    //获取构造完的List集合
+                    LinkedList<WbsTreeContractTreeAllVO> resultNodesAll = new LinkedList<>();
+                    this.getNodesAll(reNodes, resultNodesAll);
+                    resultNodesAll.addAll(0, reNodes);
+
+                    //处理父级节点计数、颜色问题
+                    this.reSetSubmitCountsAndColorStatus(resultNodesAll);
+
+                    //返回结果集
+                    resultList.addAll(reNodes);
+                    return R.data(resultList);
+
+                } else if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
+                    //监理、指挥部
+                    List<ContractRelationJlyz> relationJLYZList = jdbcTemplate.query("select * from m_contract_relation_jlyz where contract_id_jlyz = " + contractId, new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+
+                    for (ContractRelationJlyz contractRelationJlyz : relationJLYZList) {
+                        //获取查询的有效节点信息,以及所有上级父级节点
+                        LambdaQueryWrapper<WbsTreeContract> queryWrapper = new LambdaQueryWrapper<>();
+                        queryWrapper.like(WbsTreeContract::getFullName, queryValue);
+                        queryWrapper.eq(WbsTreeContract::getContractId, contractRelationJlyz.getContractIdSg());
+                        queryWrapper.eq(WbsTreeContract::getType, 1);
+                        List<WbsTreeContract> nodes = wbsTreeContractMapper.selectList(queryWrapper);
+                        Set<WbsTreeContract> resultNodes = new LinkedHashSet<>();
+                        this.recursiveGetParentNodes(resultNodes, nodes, contractRelationJlyz.getContractIdSg() + "");
+                        resultNodes.addAll(nodes);
+                        List<String> nodePkeyIds = resultNodes.stream().map(WbsTreeContract::getPKeyId).map(String::valueOf).collect(Collectors.toList());
+
+                        //获取填报过的资料信息Map
+                        Set<InformationQuery> informationQuerySet = new HashSet<>();
+                        List<List<String>> partition = Lists.partition(nodePkeyIds, 500);
+                        for (List<String> wbsIds : partition) {
+                            List<InformationQuery> informationQueryList = jdbcTemplate.query("select wbs_id,status from u_information_query where wbs_id in(" + org.apache.commons.lang.StringUtils.join(wbsIds, ",") + ")", new BeanPropertyRowMapper<>(InformationQuery.class));
+                            informationQuerySet.addAll(informationQueryList);
+                        }
+                        Map<Long, Integer> informationQueryMaps = informationQuerySet.stream().collect(Collectors.toMap(InformationQuery::getWbsId, InformationQuery::getStatus, (v1, v2) -> v1));
+
+                        //构造vo
+                        List<WbsTreeContractTreeAllVO> wbsTreeContractTreeAllVOS = resultNodes.stream().map(node -> {
+                            WbsTreeContractTreeAllVO vo = BeanUtil.copyProperties(node, WbsTreeContractTreeAllVO.class);
+                            if (vo != null) {
+                                vo.setType(ObjectUtils.isNotEmpty(node.getNodeType()) ? node.getNodeType() : 0);
+                                vo.setTitle(node.getFullName());
+                                vo.setPrimaryKeyId(node.getPKeyId());
+                                if (ObjectUtils.isNotEmpty(informationQueryMaps.get(vo.getPrimaryKeyId()))) {
+                                    vo.setSubmitCounts(1L); //如果存在资料填报信息,那么计数
+                                    vo.setColorStatus(informationQueryMaps.get(vo.getPrimaryKeyId())); //颜色
+                                } else {
+                                    vo.setSubmitCounts(0L);
+                                    vo.setColorStatus(null); //没填报就是null
+                                }
+                            }
+                            return vo;
+                        }).collect(Collectors.toList());
+
+                        //构造树形结构
+                        List<WbsTreeContractTreeAllVO> reNodes = this.buildWbsTreeByStreamByTreeAll(wbsTreeContractTreeAllVOS);
+
+                        //获取构造完的List集合
+                        LinkedList<WbsTreeContractTreeAllVO> resultNodesAll = new LinkedList<>();
+                        this.getNodesAll(reNodes, resultNodesAll);
+                        resultNodesAll.addAll(0, reNodes);
+
+                        //处理父级节点计数、颜色问题
+                        this.reSetSubmitCountsAndColorStatus(resultNodesAll);
+                        //返回结果集
+                        resultMaps.put(contractRelationJlyz.getContractIdSg(), reNodes);
+                    }
+                    return R.data(resultMaps);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 处理submitCounts计数、colorStatus颜色问题
+     *
+     * @param reNodes 数据源
+     */
+    private void reSetSubmitCountsAndColorStatus(List<WbsTreeContractTreeAllVO> reNodes) {
+        //反向for循环解决顺序问题,最底层节点才是数据源
+        for (int i = reNodes.size() - 1; i >= 0; i--) {
+            WbsTreeContractTreeAllVO node = reNodes.get(i);
+            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
+                long childSubmitCounts = 0L;
+                int colorStatus = 1;
+
+                boolean allChildStatusEquals3 = true;
+                boolean allChildStatusEquals4 = true;
+
+                //计数
+                for (WbsTreeContractTreeAllVO child : node.getChildren()) {
+                    if (child.getSubmitCounts() == 1L) {
+                        childSubmitCounts++;
+                    } else if (child.getSubmitCounts() > 1L) {
+                        childSubmitCounts = child.getSubmitCounts();
+                    }
+                }
+
+                //颜色
+                for (WbsTreeContractTreeAllVO child : node.getChildren()) {
+                    if (ObjectUtils.isNotEmpty(child.getColorStatus())) {
+                        //只要有一个子级是已填报-未上报,那么上级默认已填报-未上报(蓝色)
+                        if (child.getColorStatus().equals(2)) {
+                            colorStatus = 2;
+                            break;
+                        }
+
+                        if (child.getColorStatus().equals(3)) {
+                            allChildStatusEquals4 = false;
+                            colorStatus = 4;
+
+                        } else if (child.getColorStatus().equals(4)) {
+                            allChildStatusEquals3 = false;
+                            colorStatus = 3;
+
+                        } else {
+                            allChildStatusEquals3 = false;
+                            allChildStatusEquals4 = false;
+                            colorStatus = 1;
+                            break;
+                        }
+                    }
+                }
+
+                //父节点计数
+                node.setSubmitCounts(childSubmitCounts);
+
+                //父节点颜色
+                if (allChildStatusEquals3) {
+                    node.setColorStatus(3);
+                    continue;
+                }
+                if (allChildStatusEquals4) {
+                    node.setColorStatus(4);
+                    continue;
+                }
+                node.setColorStatus(colorStatus);
+
+            } else if (node.getSubmitCounts() == 1L) {
+                node.setSubmitCounts(1L);
+                //最底层颜色
+                if (ObjectUtils.isNotEmpty(node.getColorStatus())) {
+                    if (node.getColorStatus().equals(0)) { //任务状态=0,未上报
+                        node.setColorStatus(2); //蓝色
+                    } else if (node.getColorStatus().equals(1)) { //任务状态=1,待审批
+                        node.setColorStatus(3); //橙色
+                    } else if (node.getColorStatus().equals(2)) { //任务状态=2,已审批
+                        node.setColorStatus(4); //绿色
+                    }
+                }
+            } else if (node.getSubmitCounts() == 0L && ObjectUtils.isEmpty(node.getColorStatus())) {
+                node.setColorStatus(1); //黑色 //任务状态=null,未填报
+            }
+        }
     }
 
+
+    /**
+     * 获取构造完的List集合
+     *
+     * @param reNodes 数据源
+     * @param result  结果集
+     */
+    private void getNodesAll(List<WbsTreeContractTreeAllVO> reNodes, LinkedList<WbsTreeContractTreeAllVO> result) {
+        for (WbsTreeContractTreeAllVO node : reNodes) {
+            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
+                result.addAll(node.getChildren());
+                getNodesAll(node.getChildren(), result);
+            }
+        }
+    }
+
+    /**
+     * 反向递归获取父级
+     *
+     * @param resultNodes
+     * @param nodes
+     * @param contractId
+     */
+    private void recursiveGetParentNodes(Set<WbsTreeContract> resultNodes, List<WbsTreeContract> nodes, String contractId) {
+        Set<String> parentIds = nodes.stream().map(WbsTreeContract::getParentId).map(String::valueOf).filter(ObjectUtils::isNotEmpty).collect(Collectors.toSet());
+        List<WbsTreeContract> parentNodes = jdbcTemplate.query("select * from m_wbs_tree_contract where is_deleted = 0 and status = 1 and type = 1 and id in(" + org.apache.commons.lang.StringUtils.join(parentIds, ",") + ") and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        if (parentNodes.size() > 0) {
+            resultNodes.addAll(parentNodes);
+            this.recursiveGetParentNodes(resultNodes, parentNodes, contractId);
+        }
+    }
+
+
     public List<WbsTreeContractVO> buildWbsTreeByStreamChildNodeTree(List<WbsTreeContractVO> nodes, WbsTreeContract parentNodeRoot) {
         List<WbsTreeContractVO> list = nodes.stream().filter(f -> f.getId().equals(parentNodeRoot.getId())).collect(Collectors.toList());
         Map<Long, List<WbsTreeContractVO>> map = nodes.stream().collect(Collectors.groupingBy(WbsTreeContractVO::getParentId));