فهرست منبع

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

huangtf 2 سال پیش
والد
کامیت
5f442933e0
27فایلهای تغییر یافته به همراه530 افزوده شده و 77 حذف شده
  1. 1 6
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskPlanDTO.java
  2. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ExpenseTaskRecord.java
  3. 2 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  4. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoVO.java
  5. 20 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanFinishedRatioVO.java
  6. 41 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanStatisticVO2.java
  7. 0 27
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/RiskPlanByMonthOfYearVO.java
  8. 17 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProjectCostBudgetVO.java
  9. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  10. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AttendanceManagerController.java
  11. 35 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java
  12. 7 7
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExpenseManagerController.java
  13. 21 8
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java
  14. 11 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectInfoController.java
  15. 9 2
      blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java
  16. 7 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  17. 28 5
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  18. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java
  19. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  20. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  21. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  22. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/TaskProcessService.java
  23. 4 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  24. 199 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  25. 9 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  26. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PublicScheduledTaskServiceImpl.java
  27. 95 9
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

+ 1 - 6
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskPlanDTO.java

@@ -1,12 +1,9 @@
 package org.springblade.control.dto;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.ProjectCostBudget;
 
-import java.util.Date;
-
 
 @Data
 public class TaskPlanDTO extends ProjectCostBudget {
@@ -21,11 +18,9 @@ public class TaskPlanDTO extends ProjectCostBudget {
     private String taskStatus;
 
     @ApiModelProperty(value = "开始时间")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GTM+8")
-    private Date startTime;
+    private String startTime;
 
     @ApiModelProperty(value = "结束时间")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GTM+8")
     private String endTime;
 
 }

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

@@ -11,7 +11,7 @@ public class ExpenseTaskRecord implements Serializable {
 
     private Long id;
     private Long taskId;
-    private Long expenseInfoId;
+    private String expenseInfoId;
     private Integer expenseInfoType;
 
 }

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

@@ -79,8 +79,8 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "预算备注")
     private String budgetRemark;
 
-    @ApiModelProperty(value = "成本测算是否审批通过")
-    private String approve;
+    @ApiModelProperty(value = "成本测算是否审批通过,0未上报1已审批")
+    private Integer approve;
 
     @ApiModelProperty(value = "计划任务类型")
     private Integer planTaskType;

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoVO.java

@@ -25,4 +25,7 @@ public class EMFinancialReimbursementInfoVO extends EMFinancialReimbursementInfo
     @ApiModelProperty(value = "审批结果")
     private String approvalResultName;
 
+    @ApiModelProperty(value = "是否是财务人员 1=是")
+    private Integer isFinancialPersonnel;
+
 }

+ 20 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanFinishedRatioVO.java

@@ -0,0 +1,20 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Param  任务统计-任务完成率
+ * @Author wangwl
+ * @Date 2023/6/30 16:01
+ **/
+@Data
+public class PlanFinishedRatioVO {
+    @ApiModelProperty(value = "员工集合")
+    private List<String> userList;
+
+    @ApiModelProperty(value = "完成率集合")
+    private List<Integer> ratioList;
+}

+ 41 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/PlanStatisticVO2.java

@@ -0,0 +1,41 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Param  门户普通权限,计划统计图-风险暂停计划
+ * @Author wangwl
+ * @Date 2023/6/30 14:32
+ **/
+@Data
+public class PlanStatisticVO2 {
+
+    @ApiModelProperty(value = "统计图集合")
+    private List<PlanStatisticVO> dataList;
+
+    @ApiModelProperty(value = "日期集合")
+    private List<String> dateList;
+
+    @ApiModelProperty(value = "风险计划集合")
+    private List<RiskPlan> riskPlans;
+
+    @Data
+    public static class RiskPlan {
+        @ApiModelProperty(value = "计划名称")
+        private String name;
+
+        @ApiModelProperty(value = "格式")
+        private String type;
+
+        @ApiModelProperty(value = "格式")
+        private String stack;
+
+        @ApiModelProperty(value = "计划数量")
+        private List<Integer> data;
+    }
+
+
+}

+ 0 - 27
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/RiskPlanByMonthOfYearVO.java

@@ -1,27 +0,0 @@
-package org.springblade.control.vo;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @Param  任务统计-风险计划
- * @Author wangwl
- * @Date 2023/6/30 16:01
- **/
-@Data
-public class RiskPlanByMonthOfYearVO {
-    @ApiModelProperty(value = "计划名称")
-    private String name;
-
-    @ApiModelProperty(value = "格式")
-    private String type;
-
-    @ApiModelProperty(value = "格式")
-    private String stack;
-
-    @ApiModelProperty(value = "计划数量")
-    private List<Integer> data;
-
-}

+ 17 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProjectCostBudgetVO.java

@@ -0,0 +1,17 @@
+package org.springblade.control.vo;
+
+import lombok.Data;
+import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.control.entity.ProjectCostBudgetStats;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class TaskProjectCostBudgetVO implements Serializable {
+
+    private ProjectCostBudgetStats projectCostBudgetStats;
+
+    private List<ProjectCostBudget> projectCostBudgetList;
+
+}

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -3202,7 +3202,7 @@ public class InformationWriteQueryController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
     })
     public R<IPage<InformationQueryVO>> page(@RequestBody InformationQueryVO vo) {
-        if ("null".equals(String.valueOf(vo.getContractId())) || StringUtils.isEmpty(String.valueOf(vo.getContractId()))) {
+        if (ObjectUtil.isEmpty(vo.getContractId())) {
             return R.data(-1, null, "数据查询失败");
         }
         //封装分页信息

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

@@ -28,7 +28,7 @@ public class AttendanceManagerController extends BladeController {
     @PostMapping("/trip/page")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "出差信息分页查询", notes = "传入AttendanceTripInfoDTO、Query")
-    public R<IPage<AttendanceTripInfoVO>> tripPage(AttendanceTripInfoDTO dto, Query query) {
+    public R<IPage<AttendanceTripInfoVO>> tripPage(AttendanceTripInfoDTO dto,@RequestBody Query query) {
         return R.data(attendanceTripService.tripPage(Condition.getPage(query), dto));
     }
 

+ 35 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java

@@ -8,6 +8,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.business.vo.TrialContainerClassificationVO;
 import org.springblade.control.entity.*;
 import org.springblade.control.service.impl.ContractReturnedInfoServiceImpl;
 import org.springblade.control.service.impl.EMLoanServiceImpl;
@@ -149,7 +150,7 @@ public class ExMaTwoController extends BladeController {
 
     @GetMapping("/getUserList")
     @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "获取管控系统用户列表(财务报销-归属人、发票管理-开票人)")
+    @ApiOperation(value = "获取管控系统用户列表", notes = "(财务报销-归属人、发票管理-开票人、支付-申请人)")
     public R<List<UserControlVO>> getUserList() {
         List<User> query = jdbcTemplate.query("select id,name,real_name from blade_user where tenant_id = 003077 and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
         List<UserControlVO> result = new ArrayList<>();
@@ -229,4 +230,37 @@ public class ExMaTwoController extends BladeController {
         return R.data(null);
     }
 
+    @GetMapping("/getApprovesList")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "获取审批人列表")
+    public R<Map<String, Map<String, List<String>>>> getApprovesList() {
+        Map<String, Map<String, List<String>>> result = new LinkedHashMap<>();
+        List<TaskProcessRecordDictInfo> query = jdbcTemplate.query("select dict_id,role_name,sort,type from c_task_process_record_dict_info", new BeanPropertyRowMapper<>(TaskProcessRecordDictInfo.class));
+        Map<Long, List<TaskProcessRecordDictInfo>> collect = query.stream().collect(Collectors.groupingBy(TaskProcessRecordDictInfo::getDictId));
+        for (Map.Entry<Long, List<TaskProcessRecordDictInfo>> longListEntry : collect.entrySet()) {
+            DictInfo dictInfo = jdbcTemplate.query("select dict_name from c_dict_info where is_deleted = 0 and type = 6 and id = " + longListEntry.getKey(), new BeanPropertyRowMapper<>(DictInfo.class)).stream().findAny().orElse(null);
+            if (dictInfo != null) {
+                List<String> spRoleInfo = longListEntry.getValue()
+                        .stream()
+                        .filter(info -> info.getType() == 1)
+                        .sorted(Comparator.comparing(TaskProcessRecordDictInfo::getSort))
+                        .map(TaskProcessRecordDictInfo::getRoleName)
+                        .collect(Collectors.toList());
+
+                List<String> zcRoleInfo = longListEntry.getValue()
+                        .stream()
+                        .filter(info -> info.getType() == 2)
+                        .sorted(Comparator.comparing(TaskProcessRecordDictInfo::getSort))
+                        .map(TaskProcessRecordDictInfo::getRoleName)
+                        .collect(Collectors.toList());
+
+                Map<String, List<String>> map = new LinkedHashMap<>();
+                map.put("审批人", spRoleInfo);
+                map.put("抄送人", zcRoleInfo);
+                result.put(dictInfo.getDictName(), map);
+            }
+        }
+        return R.data(result);
+    }
+
 }

+ 7 - 7
blade-service/blade-control/src/main/java/org/springblade/control/controller/ExpenseManagerController.java

@@ -33,7 +33,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/financial/page")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "财务报销分页查询", notes = "传入EMFinancialReimbursementInfoDTO、Query")
-    public R<IPage<EMFinancialReimbursementInfoVO>> financialPage(@RequestBody EMFinancialReimbursementInfoDTO dto, Query query) {
+    public R<IPage<EMFinancialReimbursementInfoVO>> financialPage(@RequestBody EMFinancialReimbursementInfoDTO dto,@RequestBody Query query) {
         return R.data(financialReimbursementService.financialPage(Condition.getPage(query), dto));
     }
 
@@ -82,7 +82,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/pay/page")
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "支付申请分页查询", notes = "传入EMPayInfoDTO、Query")
-    public R<IPage<EMPayInfoVO>> payPage(@RequestBody EMPayInfoDTO dto, Query query) {
+    public R<IPage<EMPayInfoVO>> payPage(@RequestBody EMPayInfoDTO dto,@RequestBody Query query) {
         return R.data(payService.payPage(Condition.getPage(query), dto));
     }
 
@@ -124,7 +124,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/loan/page")
     @ApiOperationSupport(order = 13)
     @ApiOperation(value = "借款申请分页查询", notes = "传入EMLoanInfoDTO、Query")
-    public R<IPage<EMLoanInfoVO>> loanPage(@RequestBody EMLoanInfoDTO dto, Query query) {
+    public R<IPage<EMLoanInfoVO>> loanPage(@RequestBody EMLoanInfoDTO dto,@RequestBody Query query) {
         return R.data(loanService.loanPage(Condition.getPage(query), dto));
     }
 
@@ -166,7 +166,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/purchase/page")
     @ApiOperationSupport(order = 19)
     @ApiOperation(value = "采购申请分页查询", notes = "传入EMPurchaseInfoDTO、Query")
-    public R<IPage<EMPurchaseInfoVO>> purchasePage(@RequestBody EMPurchaseInfoDTO dto, Query query) {
+    public R<IPage<EMPurchaseInfoVO>> purchasePage(@RequestBody EMPurchaseInfoDTO dto,@RequestBody Query query) {
         return R.data(purchaseService.purchasePage(Condition.getPage(query), dto));
     }
 
@@ -215,7 +215,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/car/page")
     @ApiOperationSupport(order = 25)
     @ApiOperation(value = "用车申请分页查询", notes = "传入EMUseCarInfoDTO、Query")
-    public R<IPage<EMUseCarInfoVO>> carPage(@RequestBody EMUseCarInfoDTO dto, Query query) {
+    public R<IPage<EMUseCarInfoVO>> carPage(@RequestBody EMUseCarInfoDTO dto,@RequestBody Query query) {
         return R.data(useCarService.carPage(Condition.getPage(query), dto));
     }
 
@@ -264,7 +264,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/invoice/page")
     @ApiOperationSupport(order = 31)
     @ApiOperation(value = "发票申请分页查询", notes = "传入EMInvoiceInfoDTO、Query")
-    public R<IPage<EMInvoiceInfoVO>> invoicePage(@RequestBody EMInvoiceInfoDTO dto, Query query) {
+    public R<IPage<EMInvoiceInfoVO>> invoicePage(@RequestBody EMInvoiceInfoDTO dto,@RequestBody Query query) {
         return R.data(invoiceService.invoicePage(Condition.getPage(query), dto));
     }
 
@@ -320,7 +320,7 @@ public class ExpenseManagerController extends BladeController {
     @PostMapping("/outsourcing/page")
     @ApiOperationSupport(order = 39)
     @ApiOperation(value = "外包支付申请分页查询", notes = "传入EMOutsourcingPayInfoDTO、Query")
-    public R<IPage<EMOutsourcingPayInfoVO>> outsourcingPage(@RequestBody EMOutsourcingPayInfoDTO dto, Query query) {
+    public R<IPage<EMOutsourcingPayInfoVO>> outsourcingPage(@RequestBody EMOutsourcingPayInfoDTO dto,@RequestBody Query query) {
         return R.data(outsourcingPayService.outsourcingPage(Condition.getPage(query), dto));
     }
 

+ 21 - 8
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java

@@ -10,10 +10,7 @@ import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.service.IProjectCostBudgetService;
-import org.springblade.control.vo.ControlProjectInfoVO;
-import org.springblade.control.vo.PlanStatisticVO;
-import org.springblade.control.vo.ProjectCostBudgetVO;
-import org.springblade.control.vo.ProjectCostBudgetVO3;
+import org.springblade.control.vo.*;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -146,13 +143,29 @@ public class ProjectCostBudgetController {
     }
 
     /**
-     * 任务统计-计划统计图
+     * 任务统计-计划统计图-风险暂停计划
      */
     @GetMapping("/MonthOfYearPlanOverview2")
     @ApiOperationSupport(order = 11)
-    @ApiOperation(value = "任务统计-计划统计图",notes = "有参数的计划统计图")
-    public R<List<PlanStatisticVO>> MonthOfYearPlanOverview2(Long deptId,Long UserId,LocalDate start,LocalDate end){
-        return R.data(budgetService.MonthOfYearPlanOverview2(deptId,UserId,start,end));
+    @ApiOperation(value = "任务统计-计划统计图-风险暂停计划",notes = "2张图的返回值都在其中")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "startDate", value = "开始日期", required = false),
+            @ApiImplicitParam(name = "endDate", value = "结束日期", required = false),
+            @ApiImplicitParam(name = "deptId", value = "部门id", required = false),
+            @ApiImplicitParam(name = "userId", value = "用户id", required = false),
+    })
+    public R<PlanStatisticVO2> MonthOfYearPlanOverview2(Long deptId, Long userId, String start, String end){
+        return R.data(budgetService.MonthOfYearPlanOverview2(deptId,userId,start,end));
+    }
+
+    /**
+     * 任务统计-任务完成率
+     */
+    @GetMapping("/planFinishedRatio")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "任务统计-任务完成率")
+    public R<PlanFinishedRatioVO> planFinishedRatio(Long deptId, Long userId, String start, String end){
+        return R.data(budgetService.planFinishedRatio(deptId,userId,start,end));
     }
 
 

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

@@ -16,6 +16,7 @@ import org.springblade.control.vo.AllProjectStatsVO;
 import org.springblade.control.vo.ControlProjectInfoVO;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.system.user.entity.User;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -145,4 +146,14 @@ public class ProjectInfoController {
         return R.data(projectInfoService.ProjectCostTypeStats(id));
     }
 
+    /**
+     * 获取实施负责人
+     */
+    @GetMapping("/getImplementUser")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取实施负责人")
+    public R<List<User>> getImplementUser() {
+        return R.data(projectInfoService.getImplementUser());
+    }
+
 }

+ 9 - 2
blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java

@@ -35,7 +35,7 @@ public class TaskProcessController extends BladeController {
     @PostMapping("/task/page")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "审批管理任务分页查询", notes = "传入TaskProcessInfoDTO、Query")
-    public R<IPage<TaskProcessInfoVO>> taskPage(@RequestBody TaskProcessInfoDTO dto, Query query) {
+    public R<IPage<TaskProcessInfoVO>> taskPage(@RequestBody TaskProcessInfoDTO dto, @RequestBody Query query) {
         return R.data(taskProcessService.taskPage(Condition.getPage(query), dto));
     }
 
@@ -63,7 +63,7 @@ public class TaskProcessController extends BladeController {
     @PostMapping("/task/plan/page")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "计划任务执行分页查询", notes = "传入TaskPlanDTO、Query")
-    public R<IPage<TaskPlanInfoVO>> taskPlanPage(@RequestBody TaskPlanDTO dto, Query query) {
+    public R<IPage<TaskPlanInfoVO>> taskPlanPage(@RequestBody TaskPlanDTO dto, @RequestBody Query query) {
         return R.data(taskProcessService.taskPlanPage(Condition.getPage(query), dto));
     }
 
@@ -95,4 +95,11 @@ public class TaskProcessController extends BladeController {
         return R.data(taskProcessService.dataDictList(id));
     }
 
+    @GetMapping("/cost/budget/submit")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "项目成本测算审批提交", notes = "传入成本测算id")
+    public R<Object> approveCostBudgetSubmit(@RequestParam String id) {
+        return R.status(taskProcessService.approveCostBudgetSubmit(id));
+    }
+
 }

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

@@ -9,11 +9,13 @@ import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.*;
 import org.springblade.control.vo.*;
 import org.springblade.core.mp.support.Query;
+import org.springblade.system.user.entity.User;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Param
@@ -68,5 +70,9 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
 
     List<ProjectCostBudget> getPlanPracticalCostByMonth(@Param("date") String date);
 
-    List<ProjectCostBudget> MonthOfYearPlanOverview2(@Param("deptId") Long deptId,@Param("userId") Long userId,@Param("start") LocalDate start,@Param("end") LocalDate end);
+    List<ProjectCostBudget> getPlanByDeptOrUserOrTime(@Param("deptId") Long deptId,@Param("userId") Long userId,@Param("start") LocalDate start,@Param("end") LocalDate end);
+
+    List<User> getAllEmployees(@Param("tenantId") String tenantId,@Param("deptId") Long deptId,@Param("userId") Long userId);
+
+    List<ProjectCostBudget> getPlanByDeptOrUserOrTime2(@Param("ids") Set<Long> ids, @Param("start") LocalDate start,@Param("end") LocalDate end);
 }

+ 28 - 5
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -191,11 +191,34 @@
             and DATE_FORMAT(pcb.plan_start_time ,'%Y-%m') = #{date}
         </if>
     </select>
-    <select id="MonthOfYearPlanOverview2" resultType="org.springblade.control.entity.ProjectCostBudget">
-        select pcb.*
-        from c_project_cost_budget pcb
-        where pcb.task_user = #{user} and pcb.is_deleted = 0
-            and DATE_FORMAT(pcb.plan_start_time,'%Y') = #{year} or DATE_FORMAT(pcb.plan_end_time,'%Y') = #{year}
+    <select id="getPlanByDeptOrUserOrTime" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select * from c_project_cost_budget pcb
+        WHERE is_deleted = 0
+        <if test="deptId != null and deptId != ''">
+            and dept_id = #{deptId}
+        </if>
+        <if test="userId != null and userId != ''">
+            and task_user = #{userId}
+        </if>
+             and (plan_start_time BETWEEN  #{start} and #{end} or plan_end_time BETWEEN  #{start} and #{end})
+    </select>
+    <select id="getAllEmployees" resultType="org.springblade.system.user.entity.User">
+        select id, name from blade_user where tenant_id = #{tenantId} and is_deleted = 0
+        <if test="userId != null and userId != ''">
+            and id = #{userId}
+        </if>
+        <if test="deptId != null and deptId != ''">
+            and dept_id like concat('%', #{deptId}, '%')
+        </if>
+    </select>
+    <select id="getPlanByDeptOrUserOrTime2" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select * from c_project_cost_budget
+        WHERE is_deleted = 0
+        and (plan_start_time BETWEEN  #{start} and #{end} or plan_end_time BETWEEN  #{start} and #{end})
+        and task_user in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
     </select>
 
 

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

@@ -9,6 +9,7 @@ import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.AllProjectStatsVO;
 import org.springblade.control.vo.ControlProjectInfoVO;
 import org.springblade.system.entity.DictBiz;
+import org.springblade.system.user.entity.User;
 
 import java.util.List;
 
@@ -37,4 +38,6 @@ public interface ProjectInfoMapper extends BaseMapper<ControlProjectInfo> {
     ControlProjectInfo getById(@Param("id") Long id);
 
     List<ControlProjectInfo> listByYear(@Param("year") int year);
+
+    List<User> getImplementUser();
 }

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

@@ -81,6 +81,10 @@
     <select id="listByYear" resultType="org.springblade.control.entity.ControlProjectInfo">
         select * from c_control_project_info WHERE DATE_FORMAT(start_time,'%Y') &lt;= #{year} and DATE_FORMAT(end_time ,'%Y') &gt;= #{year}
     </select>
+    <select id="getImplementUser" resultType="org.springblade.system.user.entity.User">
+        select bu.id,bu.name from blade_user bu WHERE id in
+         (SELECT cpi.implement_principal from c_control_project_info cpi WHERE cpi.is_deleted = 0 GROUP by cpi.implement_principal)
+    </select>
 
 
 </mapper>

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

@@ -52,7 +52,7 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     List<PlanStatisticVO> MonthOfYearPlanOverview();
 
-    List<PlanStatisticVO> MonthOfYearPlanOverview2(Long deptId,Long UserId,LocalDate start,LocalDate end);
+    PlanStatisticVO2 MonthOfYearPlanOverview2(Long deptId,Long userId,String start,String end);
 
     List<ProjectCostBudget> getAllBudgetByProjectId(Long id);
 
@@ -69,4 +69,6 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     List<ProjectCostBudget> getRiskPlan(Long projectId,Integer costType);
 
     List<ProjectCostBudget> getPlanPracticalCostByMonth(String date);
+
+    PlanFinishedRatioVO planFinishedRatio(Long deptId, Long userId, String start, String end);
 }

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

@@ -9,6 +9,7 @@ import org.springblade.control.vo.ControlProjectInfoVO;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 import org.springblade.system.entity.DictBiz;
+import org.springblade.system.user.entity.User;
 
 import java.util.List;
 
@@ -39,4 +40,6 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
     List<AllProjectStatsVO> ProjectCostTypeStats(Long id);
 
     List<ControlProjectInfo> listByYear(int year);
+
+    List<User> getImplementUser();
 }

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

@@ -35,4 +35,7 @@ public interface TaskProcessService extends BaseService<TaskProcessInfo> {
     boolean dataDictSubmit(TaskDataDictDTO dto);
 
     Map<String, List<TaskProcessRecordDictInfo>> dataDictList(String id);
+
+    boolean approveCostBudgetSubmit(String id);
+
 }

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

@@ -402,9 +402,9 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
             for (int i = year; i <= thisYear; i++) {
                 list.add(i + "年");
             }
-        }
-        if (type != 1) {
-            list.add("汇总所有");
+            if (type != 1) {
+                list.add("汇总所有");
+            }
         }
         return list;
     }
@@ -458,7 +458,7 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }
         //获取当月所有计划,和计划工资
         List<ProjectCostBudgetVO2> planByMonth = budgetService.getPlanByMonth(date);
-        if (planByMonth != null || planByMonth.size() >= 0) {
+        if (planByMonth != null && planByMonth.size() > 0) {
             List<DeptMonthPlanRatioVO> vos = new ArrayList<>();
             //月计划包含的项目
             Set<Long> projectIds = new HashSet<>();

+ 199 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.ControlProjectInfoDTO;
@@ -23,12 +24,14 @@ import org.springblade.control.vo.*;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -418,8 +421,128 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         }
     }
 
+
+    /**
+     * 任务统计-计划统计图
+     */
     @Override
-    public List<PlanStatisticVO> MonthOfYearPlanOverview2(Long deptId, Long UserId, LocalDate start, LocalDate end) {
+    public PlanStatisticVO2 MonthOfYearPlanOverview2(Long deptId, Long userId, String start, String end) {
+        LocalDate startDate;
+        LocalDate endDate;
+        //判断是否选择部门,如果选择了部门再判断是否选择了具体的人,如果没有选择具体的人则查询整个部门
+        if (StringUtils.isBlank(start) || StringUtils.isBlank(end)){
+            startDate = LocalDate.of(LocalDate.now().getYear(),1,1);
+            endDate = LocalDate.of(LocalDate.now().getYear(),12,31);
+        }else {
+            String[] s1 = start.split("-");
+            startDate = LocalDate.of(Integer.parseInt(s1[0]),Integer.parseInt(s1[1]),1);
+            String[] s2 = end.split("-");
+            endDate = LocalDate.of(Integer.parseInt(s2[0]),Integer.parseInt(s2[1]),1);
+            endDate = endDate.with(TemporalAdjusters.lastDayOfMonth());
+        }
+        //获取时间段中的计划,默认是今年
+        List<ProjectCostBudget> plans = baseMapper.getPlanByDeptOrUserOrTime(deptId, userId, startDate, endDate);
+        if (plans != null && plans.size() > 0) {
+            //结果
+            PlanStatisticVO2 vo2 = new PlanStatisticVO2();
+            List<PlanStatisticVO> list = new ArrayList<>();
+            //任务总量
+            PlanStatisticVO planTotal = new PlanStatisticVO();
+            planTotal.setName("任务总量");
+            List<Integer> l1 = new ArrayList<>();
+            //已完成
+            PlanStatisticVO finished = new PlanStatisticVO();
+            finished.setName("已完成");
+            List<Integer> l2 = new ArrayList<>();
+            //未完成
+            PlanStatisticVO unfinished = new PlanStatisticVO();
+            unfinished.setName("未完成");
+            List<Integer> l3 = new ArrayList<>();
+            //获取月数组
+            List<String> dateList = new ArrayList<>();
+
+            //风险计划集合
+            List<PlanStatisticVO2.RiskPlan> riskPlans = new ArrayList<>();
+            PlanStatisticVO2.RiskPlan riskPlan = new PlanStatisticVO2.RiskPlan();
+            riskPlan.setName("风险暂停计划");
+            riskPlan.setType("line");
+            riskPlan.setStack("Total");
+            List<Integer> list1 = new ArrayList<>();
+            PlanStatisticVO2.RiskPlan normalPlan = new PlanStatisticVO2.RiskPlan();
+            normalPlan.setName("正常计划");
+            normalPlan.setType("line");
+            normalPlan.setStack("Total");
+            List<Integer> list2 = new ArrayList<>();
+
+//            endDate = endDate.plusMonths(1);
+            while (startDate.isBefore(endDate)) {
+                //循环月,并且计算任务总量,已完成,未完成
+                Integer total = 0;
+                Integer finish = 0;
+                Integer unfinish = 0;
+
+                Integer risk = 0;
+                Integer normal = 0;
+                for (ProjectCostBudget plan : plans) {
+                    if ((plan.getPlanStartTime().getYear() == startDate.getYear() && plan.getPlanStartTime().getMonthValue() == startDate.getMonthValue())
+                            || (plan.getPlanEndTime().getYear() == startDate.getYear() && plan.getPlanEndTime().getMonthValue() == startDate.getMonthValue())) {
+                        //计划统计图
+                        total++;
+                        if (plan.getTaskApprove() == 1){
+                            finish++;
+                        }else {
+                            unfinish++;
+                        }
+
+                        //风险计划统计图
+                        if (plan.getStatus() == 4){
+                            if (plan.getPlanEndTime().isBefore(plan.getPracticalFinishTime())){
+                                //风险计划
+                                risk++;
+                            }else {
+                                normal++;
+                            }
+                        }else {
+                            if (plan.getPlanEndTime().isBefore(LocalDate.now())){
+                                //风险计划
+                                risk++;
+                            }else {
+                                normal++;
+                            }
+                        }
+
+                    }
+                }
+                list1.add(risk);
+                list2.add(normal);
+
+                l1.add(total);
+                l2.add(finish);
+                l3.add(unfinish);
+                dateList.add(startDate.getYear()+"年"+startDate.getMonthValue()+"月");
+                startDate = startDate.plusMonths(1);
+            }
+            //统计图集合
+            planTotal.setValue(l1);
+            finished.setValue(l2);
+            unfinished.setValue(l3);
+            list.add(planTotal);
+            list.add(finished);
+            list.add(unfinished);
+            vo2.setDataList(list);
+
+            //统计日期
+            vo2.setDateList(dateList);
+
+            //统计风险计划
+            riskPlan.setData(list1);
+            normalPlan.setData(list2);
+            riskPlans.add(riskPlan);
+            riskPlans.add(normalPlan);
+            vo2.setRiskPlans(riskPlans);
+
+            return vo2;
+        }
         return null;
     }
 
@@ -504,6 +627,81 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return baseMapper.getPlanPracticalCostByMonth(date);
     }
 
+    /**
+     * 任务统计-任务完成率
+     */
+    @Override
+    public PlanFinishedRatioVO planFinishedRatio(Long deptId, Long userId, String start, String end) {
+        String tenantId = SecureUtil.getTenantId();
+        List<User> Employees = new ArrayList<>();
+        if (deptId == null){
+            //查询所有员工
+            Employees = baseMapper.getAllEmployees(tenantId,null,null);
+        }else if (userId == null){
+            //查询整个部门的员工
+            Employees = baseMapper.getAllEmployees(tenantId,deptId,null);
+        }else {
+            //查询指定员工
+            Employees = baseMapper.getAllEmployees(tenantId,deptId,userId);
+        }
+        if (Employees != null && Employees.size() > 0 ){
+            PlanFinishedRatioVO vo = new PlanFinishedRatioVO();
+            List<String> names = new ArrayList<>();
+            List<Integer> ratios = new ArrayList<>();
+            LocalDate startDate;
+            LocalDate endDate;
+            //判断是否选择部门,如果选择了部门再判断是否选择了具体的人,如果没有选择具体的人则查询整个部门
+            if (StringUtils.isBlank(start) || StringUtils.isBlank(end)){
+                startDate = LocalDate.of(LocalDate.now().getYear(),1,1);
+                endDate = LocalDate.of(LocalDate.now().getYear(),12,31);
+            }else {
+                String[] s1 = start.split("-");
+                startDate = LocalDate.of(Integer.parseInt(s1[0]),Integer.parseInt(s1[1]),1);
+                String[] s2 = end.split("-");
+                endDate = LocalDate.of(Integer.parseInt(s2[0]),Integer.parseInt(s2[1]),1);
+                endDate = endDate.with(TemporalAdjusters.lastDayOfMonth());
+            }
+            //获取员工id集合
+            Set<Long> ids = Employees.stream().map(l -> l.getId()).collect(Collectors.toSet());
+            //根据员工id查询时间范围内的任务
+            //获取时间段中的计划,默认是今年
+            List<ProjectCostBudget> plans = baseMapper.getPlanByDeptOrUserOrTime2(ids, startDate, endDate);
+            if (plans != null && plans.size() > 0) {
+                //通过员工id分组
+                Map<Long, List<ProjectCostBudget>> listMap = plans.parallelStream()
+                        .collect(Collectors.groupingBy(ProjectCostBudget::getTaskUser));
+                for (User employee : Employees) {
+                    names.add(employee.getName());
+                    BigDecimal total = new BigDecimal(0);
+                    BigDecimal finished = new BigDecimal(0);
+                    List<ProjectCostBudget> list = listMap.get(employee.getId());
+                    //判断此用户是否存在任务,不存在则直接比例为0
+                    if (list != null && list.size() > 0) {
+                        for (ProjectCostBudget plan : list) {
+                            if (plan.getTaskUser().equals(employee.getId())) {
+                                total = total.add(new BigDecimal(1));
+                                if (plan.getTaskApprove() == 1) {
+                                    finished = finished.add(new BigDecimal(1));
+                                }
+                            }
+                        }
+                        if (total.compareTo(new BigDecimal(0)) != 0) {
+                            ratios.add(finished.divide(total, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+                        } else {
+                            ratios.add(0);
+                        }
+                    }else {
+                        ratios.add(0);
+                    }
+                }
+                vo.setUserList(names);
+                vo.setRatioList(ratios);
+                return vo;
+            }
+        }
+        return null;
+    }
+
     /**
      * 统计一行的几个总金额
      */

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

@@ -15,6 +15,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
 import org.springblade.system.entity.DictBiz;
+import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -206,5 +207,13 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         return baseMapper.listByYear(year);
     }
 
+    /**
+     * 获取实施负责人
+     */
+    @Override
+    public List<User> getImplementUser() {
+        return baseMapper.getImplementUser();
+    }
+
 
 }

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

@@ -22,6 +22,7 @@ public class PublicScheduledTaskServiceImpl {
     private final EMPayServiceImpl emPayService;
     private final EMPurchaseServiceImpl emPurchaseService;
     private final EMUseCarServiceImpl emUseCarService;
+    private final AttendanceTripServiceImpl attendanceTripService;
 
     /**
      * 定时删除费用管理的草稿数据信息
@@ -43,6 +44,7 @@ public class PublicScheduledTaskServiceImpl {
         emPayService.remove(Wrappers.<EMPayInfo>lambdaQuery().eq(EMPayInfo::getIsTemp, 0).le(EMPayInfo::getCreateTime, formattedDateTime));
         emPurchaseService.remove(Wrappers.<EMPurchaseInfo>lambdaQuery().eq(EMPurchaseInfo::getIsTemp, 0).le(EMPurchaseInfo::getCreateTime, formattedDateTime));
         emUseCarService.remove(Wrappers.<EMUseCarInfo>lambdaQuery().eq(EMUseCarInfo::getIsTemp, 0).le(EMUseCarInfo::getCreateTime, formattedDateTime));
+        attendanceTripService.remove(Wrappers.<AttendanceTripInfo>lambdaQuery().eq(AttendanceTripInfo::getIsTemp, 0).le(AttendanceTripInfo::getCreateTime, formattedDateTime));
     }
 
 }

+ 95 - 9
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -58,6 +58,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     private final BladeRedis bladeRedis;
     private final ProjectCostBudgetServiceImpl projectCostBudgetService;
     private final ProjectInfoServiceImpl projectInfoServiceImpl;
+    private final ProjectCostBudgetStatsServiceImpl projectCostBudgetStatsService;
 
     @Override
     public IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto) {
@@ -177,7 +178,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 EMFinancialReimbursementInfoVO voCW = BeanUtil.copyProperties(data, EMFinancialReimbursementInfoVO.class);
                                 if (voCW != null) {
                                     if (ObjectUtil.isNotEmpty(voCW.getProjectId()) && ObjectUtil.isNotEmpty(voCW.getBudgetPlanIds())) { //如果预算ids不为空,那么证明有关联计划任务(单关联)
-                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(Long.parseLong(voCW.getBudgetPlanIds()), controlProjectInfos);
+                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(voCW.getBudgetPlanIds(), controlProjectInfos);
                                         if (planTaskInfoList2 != null) {
                                             vo.setPlanTaskInfoList(Collections.singletonList(planTaskInfoList2));
                                         }
@@ -189,10 +190,21 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                         }
                                     }
                                     voCW.setUserNameVesting(userMap.get(voCW.getCreateUser()));
+                                    //获取当前用户是否为财务人员,财务人员修改是否支付状态
+                                    if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+                                        throw new ServiceException("获取当前用户信息失败,请联系管理员");
+                                    }
+                                    R<Dept> dept = iSysClient.getDept(Long.parseLong(SecureUtil.getDeptId()));
+                                    if (dept != null && dept.getData() != null) {
+                                        Dept deptObj = dept.getData();
+                                        if (deptObj != null && (deptObj.getDeptName().contains("财务") || deptObj.getDeptName().contains("人事"))) {
+                                            voCW.setIsFinancialPersonnel(1); //财务人员
+                                        }
+                                    }
                                     data = voCW;
                                 }
-
                                 break;
+
                             case 3: //支付
                                 data = jdbcTemplate.query("select * from c_expense_pay_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMPayInfo.class)).stream().findAny().orElse(null);
                                 break;
@@ -208,8 +220,6 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                             case 7: //发票
                                 data = jdbcTemplate.query("select * from c_expense_invoice_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMInvoiceInfo.class)).stream().findAny().orElse(null);
 
-                                //TODO 此处根据invoiceContentType查询发票字典,封装vo
-
                                 break;
                             case 8: //外包
                                 data = jdbcTemplate.query("select * from c_expense_outsourcing_pay_info where id = " + record.getExpenseInfoId(), new BeanPropertyRowMapper<>(EMOutsourcingPayInfo.class)).stream().findAny().orElse(null);
@@ -220,15 +230,27 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 AttendanceTripInfoVO voCC = BeanUtil.copyProperties(data, AttendanceTripInfoVO.class);
                                 if (voCC != null) {
                                     if (ObjectUtil.isNotEmpty(voCC.getProjectId()) && ObjectUtil.isNotEmpty(voCC.getBudgetPlanIds())) { //如果预算ids不为空,那么证明有关联计划任务(单关联)
-                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(Long.parseLong(voCC.getBudgetPlanIds()), controlProjectInfos);
+                                        TaskPlanInfoVO planTaskInfoList2 = this.getPlanTaskInfoList(voCC.getBudgetPlanIds(), controlProjectInfos);
                                         if (planTaskInfoList2 != null) {
                                             vo.setPlanTaskInfoList(Collections.singletonList(planTaskInfoList2));
                                         }
                                     }
-
                                     data = voCC;
                                 }
                                 break;
+                            case 10: //成本测算
+                                List<ProjectCostBudget> query = jdbcTemplate.query("select * from c_project_cost_budget where id in(" + record.getExpenseInfoId() + ")", new BeanPropertyRowMapper<>(ProjectCostBudget.class));
+                                if (query.size() > 0) {
+                                    Long projectId = query.stream().map(ProjectCostBudget::getProjectId).collect(Collectors.toList()).stream().findAny().orElse(null);
+                                    if (projectId != null) {
+                                        ProjectCostBudgetStats projectCostBudgetStats = jdbcTemplate.query("select * from c_project_cost_budget_stats where project_id = " + projectId, new BeanPropertyRowMapper<>(ProjectCostBudgetStats.class)).stream().findAny().orElse(null);
+                                        TaskProjectCostBudgetVO voCbCs = new TaskProjectCostBudgetVO();
+                                        voCbCs.setProjectCostBudgetList(query);
+                                        voCbCs.setProjectCostBudgetStats(projectCostBudgetStats);
+                                        data = voCbCs;
+                                    }
+                                }
+                                break;
                         }
                     }
                 }
@@ -600,6 +622,60 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         return resultMap;
     }
 
+    @Override
+    public boolean approveCostBudgetSubmit(String id) {
+        ProjectCostBudgetStats projectCostBudgetStats = projectCostBudgetStatsService.getBaseMapper().selectById(id);
+        if (projectCostBudgetStats != null) {
+            List<ProjectCostBudget> projectCostBudgetList = projectCostBudgetService.getBaseMapper().selectList(Wrappers.<ProjectCostBudget>lambdaQuery()
+                    .eq(ProjectCostBudget::getProjectId, projectCostBudgetStats.getProjectId())
+                    .eq(ProjectCostBudget::getApprove, 0));//未上报
+            if (projectCostBudgetList.size() > 0) {
+                //审批人(总经理)
+                List<String> auditUserIds = new LinkedList<>();
+                List<Dept> query = jdbcTemplate.query("select id from blade_dept where dept_name = '总经理' and tenant_id = 003077 and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
+                if (query.size() == 1) {
+                    Dept dept = query.get(0);
+                    List<User> users = jdbcTemplate.query("select id from blade_user where dept_id like '%" + dept.getId() + "%' and tenant_id = 003077 and is_deleted = 0", new BeanPropertyRowMapper<>(User.class));
+                    if (users.size() > 0) {
+                        List<Long> ids = users.stream().map(User::getId).collect(Collectors.toList());
+                        auditUserIds.add(StringUtils.join(ids, ","));
+                    } else {
+                        throw new ServiceException("未获取到总经理岗位人员信息,请联系管理员");
+                    }
+                } else {
+                    throw new ServiceException("未获取到总经理岗位信息,请联系管理员");
+                }
+
+                //创建审批任务
+                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                taskProcessInfo.setId(SnowFlakeUtil.getId());
+                taskProcessInfo.setStatus(1); //待审批
+                taskProcessInfo.setReportDate(new Date());
+                taskProcessInfo.setTaskType(10); //成本测算审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【成本测算】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                for (String userId : auditUserIds) {
+                    if (StringUtils.isNotEmpty(userId)) {
+                        nonEmptyAuditUserIds.add(userId);
+                    }
+                }
+                taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+
+                this.save(taskProcessInfo);
+
+                //新增审批任务关联信息
+                List<String> ids = projectCostBudgetList.stream().map(ProjectCostBudget::getId).map(String::valueOf).collect(Collectors.toList());
+                String budgetIds = StringUtils.join(ids, ",");
+                jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + budgetIds + ",10)");
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * 修改业务审批状态
      *
@@ -607,7 +683,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      * @param taskStatus       计划任务状态
      * @param dataId           业务id
      */
-    private void updateTaskStatus(Integer businessDataType, Integer taskStatus, Long dataId) {
+    private void updateTaskStatus(Integer businessDataType, Integer taskStatus, String dataId) {
         switch (businessDataType) {
             case 1: //计划任务
                 if (taskStatus == 2) {
@@ -643,6 +719,16 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             case 9: //出差
                 jdbcTemplate.execute("update c_attendance_trip_info set status = " + taskStatus + " where id = " + dataId);
                 break;
+            case 10: //成本测算
+                if (taskStatus == 2) {
+                    //已完成 = 已完成(修改成本测算的数据状态)dataId = ids
+                    jdbcTemplate.execute("update c_project_cost_budget set approve = 1 where id in(" + dataId + ")");
+
+                } else if (taskStatus == 3) {
+                    //已驳回 = 不做处理,驳回后依然是未上报
+                    break;
+                }
+                break;
         }
     }
 
@@ -652,7 +738,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      * @param businessDataType 业务类型
      * @param dataId           业务id
      */
-    private void processTheServiceDataAfterTheApprovalClosedLoop(Integer businessDataType, Long dataId) {
+    private void processTheServiceDataAfterTheApprovalClosedLoop(Integer businessDataType, String dataId) {
         switch (businessDataType) {
             case 1:
                 //计划任务
@@ -717,7 +803,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      * @param controlProjectInfos
      * @return
      */
-    private TaskPlanInfoVO getPlanTaskInfoList(Long id, List<ControlProjectInfo> controlProjectInfos) {
+    private TaskPlanInfoVO getPlanTaskInfoList(String id, List<ControlProjectInfo> controlProjectInfos) {
         ProjectCostBudget planTask = jdbcTemplate.query("select * from c_project_cost_budget where id = " + id, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
         if (planTask != null) {
             TaskPlanInfoVO planInfoVO = new TaskPlanInfoVO();