浏览代码

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

huangtf 2 年之前
父节点
当前提交
7398ea7830
共有 100 个文件被更改,包括 2003 次插入911 次删除
  1. 5 3
      blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java
  2. 1 1
      blade-ops/blade-develop/src/test/java/org/springblade/test/CodeGenerator.java
  3. 0 11
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/AttendanceTripInfoDTO.java
  4. 0 17
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTO.java
  5. 0 35
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTOBatch.java
  6. 0 42
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTODetailInfo.java
  7. 0 27
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTOTaskUser.java
  8. 0 11
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMInvoiceInfoDTO.java
  9. 0 17
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMLoanInfoDTO.java
  10. 0 17
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMOutsourcingPayInfoDTO.java
  11. 0 17
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMPayInfoDTO.java
  12. 0 18
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMPurchaseInfoDTO.java
  13. 0 11
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMUseCarInfoDTO.java
  14. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentMonthPlan.java
  15. 4 4
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentPlanLog.java
  16. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMInvoiceInfo.java
  17. 0 17
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMProcessTaskUser.java
  18. 32 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/PlanRelationReturned.java
  19. 6 3
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  20. 4 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AllProjectStatsVO.java
  21. 32 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualBudgetVO3.java
  22. 20 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualProjectCostVO.java
  23. 35 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractInvoiceInfoVO.java
  24. 2 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractReturnedInfoVO.java
  25. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/DeptMonthPlanRatioVO.java
  26. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetVO.java
  27. 23 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetVO2.java
  28. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectProcessVO.java
  29. 14 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UseCarDeptVO.java
  30. 13 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UserControlVO.java
  31. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
  32. 3 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  33. 7 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java
  34. 18 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO4.java
  35. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO.java
  36. 5 1
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Dept.java
  37. 7 0
      blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java
  38. 8 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/dto/UserDTO.java
  39. 31 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/User.java
  40. 55 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/DeptUserVO.java
  41. 9 0
      blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/UserVO.java
  42. 2 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  43. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  44. 98 10
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  45. 123 33
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  46. 19 12
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java
  47. 9 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  48. 4 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  49. 16 3
      blade-service/blade-business/src/main/java/org/springblade/business/utils/StringSPUtils.java
  50. 79 6
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java
  51. 8 4
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ContractReturnedInfoController.java
  52. 48 9
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java
  53. 6 4
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentPlanLogController.java
  54. 77 12
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java
  55. 53 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/PlanRelationReturnedController.java
  56. 5 5
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java
  57. 3 3
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectInfoController.java
  58. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectProcessController.java
  59. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.java
  60. 21 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml
  61. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.java
  62. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml
  63. 4 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  64. 10 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  65. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.java
  66. 7 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DepartmentMonthPlanMapper.xml
  67. 16 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanRelationReturnedMapper.java
  68. 9 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanRelationReturnedMapper.xml
  69. 12 2
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  70. 53 6
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  71. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.java
  72. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  73. 0 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMFinancialReimbursementService.java
  74. 13 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IAnnualBudgetService.java
  75. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractInfoService.java
  76. 7 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  77. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentMonthPlanService.java
  78. 18 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IPlanRelationReturnedService.java
  79. 11 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  80. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectInfoService.java
  81. 0 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/TaskProcessService.java
  82. 274 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java
  83. 14 53
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java
  84. 14 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java
  85. 16 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  86. 15 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  87. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentPlanLogImpl.java
  88. 14 57
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  89. 15 54
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java
  90. 14 59
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java
  91. 15 57
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java
  92. 16 57
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java
  93. 12 54
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java
  94. 20 49
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java
  95. 34 36
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  96. 61 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanRelationReturnedServiceImpl.java
  97. 96 12
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  98. 3 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetStatsServiceImpl.java
  99. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  100. 208 29
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

+ 5 - 3
blade-auth/src/main/java/org/springblade/auth/service/BladeUserDetailsServiceImpl.java

@@ -146,12 +146,14 @@ public class BladeUserDetailsServiceImpl implements UserDetailsService {
                 throw new UserDeniedAuthorizationException(TokenUtil.USER_HAS_NO_ROLE);
             }
 
-            /* 校验登陆账号权限,客户端填报、试验userType=1,app端userType=2,档案userType=3,后管userType=4 */
+            /* 校验登陆账号权限,客户端填报、试验userType=1,app端userType=2,档案userType=3,后管userType=4 ,管控userType=5 ,征拆userType=6 */
             if (user.getUserType().contains(("1"))
                     || user.getUserType().contains(("2"))
                     || user.getUserType().contains(("3"))
-                    || user.getUserType().contains(("4"))) {
-                if (!("1,2,3,4").equals(user.getUserType())) {
+                    || user.getUserType().contains(("4"))
+                    || user.getUserType().contains(("5"))
+                    || user.getUserType().contains(("6"))) {
+                if (!("1,2,3,4,5,6").equals(user.getUserType())) {
                     //如果不是全部权限,那么分批校验登陆平台权限
                     this.judgeLoginPermission(user);
                 }

+ 1 - 1
blade-ops/blade-develop/src/test/java/org/springblade/test/CodeGenerator.java

@@ -71,7 +71,7 @@ public class CodeGenerator {
     /**
      * RUN THIS
      */
-    public static void main(String[] args) {
+    public static void main11(String[] args) {
         BladeCodeGenerator generator = new BladeCodeGenerator();
         generator.setCodeName(CODE_NAME);
         generator.setServiceName(SERVICE_NAME);

+ 0 - 11
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/AttendanceTripInfoDTO.java

@@ -3,9 +3,7 @@ package org.springblade.control.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.AttendanceTripInfo;
-import org.springblade.control.entity.EMProcessTaskUser;
 
-import java.util.List;
 
 @Data
 public class AttendanceTripInfoDTO extends AttendanceTripInfo {
@@ -13,13 +11,4 @@ public class AttendanceTripInfoDTO extends AttendanceTripInfo {
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
 
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "人事")
-    private EMProcessTaskUser personnelUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

+ 0 - 17
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTO.java

@@ -3,9 +3,7 @@ package org.springblade.control.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.EMFinancialReimbursementInfo;
-import org.springblade.control.entity.EMProcessTaskUser;
 
-import java.util.List;
 
 @Data
 public class EMFinancialReimbursementInfoDTO extends EMFinancialReimbursementInfo {
@@ -13,19 +11,4 @@ public class EMFinancialReimbursementInfoDTO extends EMFinancialReimbursementInf
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
 
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeUser;
-
-    @ApiModelProperty(value = "最终确认付款人")
-    private EMProcessTaskUser finalConfirmationUser;
-
-    @ApiModelProperty(value = "出纳人")
-    private EMProcessTaskUser cashierUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

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

@@ -1,35 +0,0 @@
-package org.springblade.control.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-@Data
-public class EMFinancialReimbursementInfoDTOBatch implements Serializable {
-
-    @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
-    private String submitStatus;
-
-    @ApiModelProperty(value = "明细信息")
-    private List<EMFinancialReimbursementInfoDTODetailInfo> detailInfo;
-
-    @ApiModelProperty(value = "审批人对象")
-    private EMFinancialReimbursementInfoDTOTaskUser taskUser;
-
-    @ApiModelProperty(value = "归属人id")
-    private Long userIdVesting;
-
-    @ApiModelProperty(value = "是否抵扣借款 0=否 1=是")
-    private Integer isDeductLoan;
-
-    @ApiModelProperty(value = "借款信息id")
-    private Long deductLoanId;
-
-    @ApiModelProperty(value = "实际报销金额")
-    private BigDecimal frMoneyActual;
-
-
-}

+ 0 - 42
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTODetailInfo.java

@@ -1,42 +0,0 @@
-package org.springblade.control.dto;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
-@Data
-public class EMFinancialReimbursementInfoDTODetailInfo implements Serializable {
-
-    @ApiModelProperty(value = "数据id")
-    private Long id;
-
-    @ApiModelProperty(value = "所属项目id")
-    private Long projectId;
-
-    @ApiModelProperty(value = "预算计划ids")
-    private String budgetPlanIds;
-
-    @ApiModelProperty(value = "报销类型")
-    private Integer frType;
-
-    @ApiModelProperty(value = "报销金额")
-    private BigDecimal frMoney;
-
-    @ApiModelProperty(value = "报销时间")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
-    private Date frDate;
-
-    @ApiModelProperty(value = "费用说明")
-    private String frDesc;
-
-    @ApiModelProperty(value = "电子发票url地址")
-    private String frElectronicInvoiceUrl;
-
-    @ApiModelProperty(value = "附件url地址")
-    private String frAttachmentUrl;
-
-}

+ 0 - 27
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTOTaskUser.java

@@ -1,27 +0,0 @@
-package org.springblade.control.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import org.springblade.control.entity.EMProcessTaskUser;
-
-import java.util.List;
-
-@Data
-public class EMFinancialReimbursementInfoDTOTaskUser {
-
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeUser;
-
-    @ApiModelProperty(value = "最终确认付款人")
-    private EMProcessTaskUser finalConfirmationUser;
-
-    @ApiModelProperty(value = "出纳人")
-    private EMProcessTaskUser cashierUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
-}

+ 0 - 11
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMInvoiceInfoDTO.java

@@ -3,9 +3,7 @@ package org.springblade.control.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.EMInvoiceInfo;
-import org.springblade.control.entity.EMProcessTaskUser;
 
-import java.util.List;
 
 @Data
 public class EMInvoiceInfoDTO extends EMInvoiceInfo {
@@ -13,13 +11,4 @@ public class EMInvoiceInfoDTO extends EMInvoiceInfo {
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
 
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

+ 0 - 17
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMLoanInfoDTO.java

@@ -3,9 +3,7 @@ package org.springblade.control.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.EMLoanInfo;
-import org.springblade.control.entity.EMProcessTaskUser;
 
-import java.util.List;
 
 @Data
 public class EMLoanInfoDTO extends EMLoanInfo {
@@ -13,19 +11,4 @@ public class EMLoanInfoDTO extends EMLoanInfo {
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
 
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeUser;
-
-    @ApiModelProperty(value = "最终确认付款人")
-    private EMProcessTaskUser finalConfirmationUser;
-
-    @ApiModelProperty(value = "出纳人")
-    private EMProcessTaskUser cashierUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

+ 0 - 17
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMOutsourcingPayInfoDTO.java

@@ -3,9 +3,7 @@ package org.springblade.control.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.EMOutsourcingPayInfo;
-import org.springblade.control.entity.EMProcessTaskUser;
 
-import java.util.List;
 
 @Data
 public class EMOutsourcingPayInfoDTO extends EMOutsourcingPayInfo {
@@ -13,19 +11,4 @@ public class EMOutsourcingPayInfoDTO extends EMOutsourcingPayInfo {
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
 
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeUser;
-
-    @ApiModelProperty(value = "最终确认付款人")
-    private EMProcessTaskUser finalConfirmationUser;
-
-    @ApiModelProperty(value = "出纳人")
-    private EMProcessTaskUser cashierUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

+ 0 - 17
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMPayInfoDTO.java

@@ -3,9 +3,7 @@ package org.springblade.control.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.control.entity.EMPayInfo;
-import org.springblade.control.entity.EMProcessTaskUser;
 
-import java.util.List;
 
 @Data
 public class EMPayInfoDTO extends EMPayInfo {
@@ -13,19 +11,4 @@ public class EMPayInfoDTO extends EMPayInfo {
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
 
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeUser;
-
-    @ApiModelProperty(value = "最终确认付款人")
-    private EMProcessTaskUser finalConfirmationUser;
-
-    @ApiModelProperty(value = "出纳人")
-    private EMProcessTaskUser cashierUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

+ 0 - 18
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMPurchaseInfoDTO.java

@@ -2,30 +2,12 @@ package org.springblade.control.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.springblade.control.entity.EMProcessTaskUser;
 import org.springblade.control.entity.EMPurchaseInfo;
 
-import java.util.List;
 
 @Data
 public class EMPurchaseInfoDTO extends EMPurchaseInfo {
 
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
-
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeUser;
-
-    @ApiModelProperty(value = "最终确认付款人")
-    private EMProcessTaskUser finalConfirmationUser;
-
-    @ApiModelProperty(value = "出纳人")
-    private EMProcessTaskUser cashierUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

+ 0 - 11
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMUseCarInfoDTO.java

@@ -2,10 +2,8 @@ package org.springblade.control.dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.springblade.control.entity.EMProcessTaskUser;
 import org.springblade.control.entity.EMUseCarInfo;
 
-import java.util.List;
 
 @Data
 public class EMUseCarInfoDTO extends EMUseCarInfo {
@@ -13,13 +11,4 @@ public class EMUseCarInfoDTO extends EMUseCarInfo {
     @ApiModelProperty(value = "提交状态 1=暂存 2=提交审批")
     private String submitStatus;
 
-    @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleUser;
-
-    @ApiModelProperty(value = "人事")
-    private EMProcessTaskUser personnelUser;
-
-    @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserList;
-
 }

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentMonthPlan.java

@@ -25,6 +25,9 @@ public class DepartmentMonthPlan extends BaseEntity {
     @ApiModelProperty(value = "部门类型")
     private Integer departmentType;
 
+    @ApiModelProperty(value = "部门id")
+    private Long deptId;
+
     @ApiModelProperty(value = "计划日期")
     private String planDate;
 

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

@@ -99,18 +99,18 @@ public class DepartmentPlanLog extends BaseEntity {
     private LocalDate pausePlanEndTime;
 
 
-    @ApiModelProperty(value = "计划天数")
+    @ApiModelProperty(value = "项目原计划起止工时")
     private BigDecimal planDays;
 
-    @ApiModelProperty(value = "实际工作时间")
+    @ApiModelProperty(value = "上一次计划截至暂停阶段,起止工时(天)")
     private BigDecimal realWorkDays;
 
     @ApiModelProperty(value = "计划执行顺序")
     private Integer sort;
 
-    @ApiModelProperty(value = "中途开启计划起止天数")
+    @ApiModelProperty(value = "中途暂停之后开启计划起止工时(天)")
     private BigDecimal openPlanStartEndDays;
 
-    @ApiModelProperty(value = "上一次中途开启计划起止天数")
+    @ApiModelProperty(value = "上一次计划工时(天)")
     private BigDecimal lastOpenPlanStartEndDays;
 }

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

@@ -41,7 +41,7 @@ public class EMInvoiceInfo extends BaseEntity {
     private BigDecimal invoiceMoney;
 
     @ApiModelProperty(value = "开票内容字典类型")
-    private Integer invoiceContentType;
+    private String invoiceContent;
 
     @ApiModelProperty(value = "发票pdf")
     private String invoicePdfUrl;

+ 0 - 17
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMProcessTaskUser.java

@@ -1,17 +0,0 @@
-package org.springblade.control.entity;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class EMProcessTaskUser implements Serializable {
-
-    @ApiModelProperty(value = "userId")
-    private String userId;
-
-    @ApiModelProperty(value = "名称")
-    private String userName;
-
-}

+ 32 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/PlanRelationReturned.java

@@ -0,0 +1,32 @@
+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.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/13 13:52
+ **/
+@Data
+@TableName("c_plan_relation_returned")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "年度经营预算表", description = "年度经营预算表")
+public class PlanRelationReturned extends BaseEntity {
+
+    @ApiModelProperty(value = "计划id")
+    private Long planId;
+
+    @ApiModelProperty(value = "回款id")
+    private Long returnedId;
+
+}

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

@@ -31,7 +31,7 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "单位类型1施工2监理3建设")
     private Integer unitType;
 
-    @ApiModelProperty(value = "部门")
+    @ApiModelProperty(value = "费用分摊部门")
     private Long deptId;
 
     @ApiModelProperty(value = "费用类型")
@@ -116,11 +116,14 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "计划天数")
     private BigDecimal planDays;
 
-    @ApiModelProperty(value = "实际任务天数")
+    @ApiModelProperty(value = "任务实际完成天数")
     private BigDecimal practicalTaskDays;
 
+    @ApiModelProperty(value = "任务实际完成时间")
+    private LocalDate practicalFinishTime;
+
     @ApiModelProperty(value = "任务完成后是否审批通过")
-    private String taskApprove;
+    private Integer taskApprove;
 
     @ApiModelProperty(value = "关联回款")
     @JsonSerialize(nullsUsing = NullSerializer.class)

+ 4 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AllProjectStatsVO.java

@@ -30,7 +30,7 @@ public class AllProjectStatsVO {
     @ApiModelProperty(value = "合同金额")
     private BigDecimal contractMoney;
 
-    @ApiModelProperty(value = "算成本")
+    @ApiModelProperty(value = "算成本")
     private BigDecimal budgetCost;
 
     @ApiModelProperty(value = "实际已支出成本")
@@ -57,4 +57,7 @@ public class AllProjectStatsVO {
     @ApiModelProperty(value = "项目id")
     private Long projectId;
 
+    @ApiModelProperty(value = "延期计划条数")
+    private Integer timeOutPlanTotal;
+
 }

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

@@ -0,0 +1,32 @@
+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 AnnualBudgetVO3 extends AnnualBudget {
+    @ApiModelProperty(value = "已收入")
+    private BigDecimal yearReturned;
+
+    @ApiModelProperty(value = "已盈利")
+    private BigDecimal yearProfit;
+
+    @ApiModelProperty(value = "合同进度统计")
+    private Integer contractSchedule;
+
+    @ApiModelProperty(value = "利润进度统计")
+    private Integer profitSchedule;
+}

+ 20 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AnnualProjectCostVO.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/28 15:20
+ **/
+@Data
+public class AnnualProjectCostVO {
+    @ApiModelProperty(value = "关联项目名称")
+    private String name;
+
+    @ApiModelProperty(value = "关联项目名称")
+    private List<Integer> value;
+}

+ 35 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractInvoiceInfoVO.java

@@ -0,0 +1,35 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class ContractInvoiceInfoVO implements Serializable {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "发票抬头")
+    private String invoiceHead;
+
+    @ApiModelProperty(value = "纳税人识别号")
+    private String taxpayerNumber;
+
+    @ApiModelProperty(value = "开户银行")
+    private String openAccountBank;
+
+    @ApiModelProperty(value = "银行账户")
+    private String bankAccount;
+
+    @ApiModelProperty(value = "收件人")
+    private String addresseeUserName;
+
+    @ApiModelProperty(value = "联系电话")
+    private String addresseePhone;
+
+    @ApiModelProperty(value = "邮寄地址")
+    private String mailingAddress;
+
+}

+ 2 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractReturnedInfoVO.java

@@ -28,5 +28,6 @@ public class ContractReturnedInfoVO extends ContractReturnedInfo {
     @ApiModelProperty(value = "是否超时,1没有,2超时")
     private String isTimeOut;
 
-
+    @ApiModelProperty(value = "是否关联,0未关联,1已关联")
+    private Integer isRelation;
 }

+ 25 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/DeptMonthPlanRatioVO.java

@@ -0,0 +1,25 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Param  门户-当月部门计划比重
+ * @Author wangwl
+ * @Date 2023/6/29 9:48
+ **/
+@Data
+public class DeptMonthPlanRatioVO {
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    @ApiModelProperty(value = "实施投入")
+    private String businessRatio;
+
+    @ApiModelProperty(value = "研发投入")
+    private String devRatio;
+
+    @ApiModelProperty(value = "维护投入")
+    private String maintainRatio;
+
+}

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

@@ -38,6 +38,9 @@ public class ProjectCostBudgetVO extends ProjectCostBudget {
     @ApiModelProperty(value = "状态值")
     private String statusValue;
 
+    @ApiModelProperty(value = "0不显示,1暂停,2开启")
+    private Integer startOrStop;
+
     @ApiModelProperty(value = "计划施工单位")
     private Map<Integer,List<ProjectCostBudgetVO2>> buildUnit;
 

+ 23 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetVO2.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.control.entity.ProjectCostBudget;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -17,9 +18,30 @@ import java.util.Map;
 @EqualsAndHashCode(callSuper = true)
 public class ProjectCostBudgetVO2 extends ProjectCostBudget {
     @ApiModelProperty(value = "子计划")
-    private List<ProjectCostBudget> childrenList;
+    private List<ProjectCostBudgetVO2> childrenList;
 
     @ApiModelProperty(value = "回款条件")
     private String returnedValue;
 
+    @ApiModelProperty(value = "项目环节名称")
+    private String projectProcessValue;
+
+    @ApiModelProperty(value = "预算类型值")
+    private String budgetTypeValue;
+
+    @ApiModelProperty(value = "任务明细值")
+    private String taskDetailValue;
+
+    @ApiModelProperty(value = "岗位类型值")
+    private String postTypeValue;
+
+    @ApiModelProperty(value = "任务完成状态,1黄色,2绿色")
+    private Integer taskFinishedStatus;
+
+    @ApiModelProperty(value = "计划总金额")
+    private BigDecimal planCountMoney;
+
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
 }

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectProcessVO.java

@@ -33,7 +33,7 @@ public class ProjectProcessVO extends ProjectProcess {
     @ApiModelProperty(value = "人员投入")
     private Integer staffTotal;
 
-    @ApiModelProperty(value = "明细")
+    @ApiModelProperty(value = "费用明细")
     private List<costDetail> costDetails;
 
     @Data

+ 14 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UseCarDeptVO.java

@@ -0,0 +1,14 @@
+package org.springblade.control.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class UseCarDeptVO implements Serializable {
+
+    private Long deptId;
+
+    private String deptName;
+
+}

+ 13 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UserControlVO.java

@@ -0,0 +1,13 @@
+package org.springblade.control.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class UserControlVO implements Serializable {
+
+    private Long id;
+    private String name;
+
+}

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java

@@ -44,4 +44,7 @@ public interface ArchiveTreeContractClient {
 
     @PostMapping(API_PREFIX + "/getFirstNodeByTreeCode")
     ArchiveTreeContract getFirstNodeByTreeCode(@RequestParam Long projectId,@RequestParam Integer type);
+
+    @PostMapping(API_PREFIX + "/getArchiveTreeContractByContractId")
+    ArchiveTreeContract getArchiveTreeContractByContractId(@RequestParam Long contractId);
 }

+ 3 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java

@@ -30,9 +30,9 @@ public interface ExcelTabClient {
 
     @PostMapping(API_PREFIX + "/getBussPDFTrial")
     String getBussPDFTrial(@RequestParam Long pkeyId,
-                         @RequestParam String contractId,
-                         @RequestParam String id,
-                         @RequestBody TrialSelfInspectionRecordDTO dto) throws Exception;
+                           @RequestParam String contractId,
+                           @RequestParam String id,
+                           @RequestBody TrialSelfInspectionRecordDTO dto) throws Exception;
 
 
     @PostMapping(API_PREFIX + "/getBussPDFSTrial")

+ 7 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java

@@ -1,5 +1,7 @@
 package org.springblade.manager.feign;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.manager.entity.ExcelTab;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -11,6 +13,7 @@ public class ExcelTabClientFallBack implements ExcelTabClient {
 
     @Autowired
     private JdbcTemplate jdbcTemplate;
+    private static final Logger logger = LoggerFactory.getLogger(ExcelTabClientFallBack.class);
 
     @Override
     public ExcelTab getById(String id) {
@@ -18,9 +21,11 @@ public class ExcelTabClientFallBack implements ExcelTabClient {
     }
 
     @Override
-    public String saveTabData(TrialSelfInspectionRecordDTO dto, Integer isBatchSave, Integer type, String tableType, Long id, String tabIds) throws RuntimeException {
+    public String saveTabData(TrialSelfInspectionRecordDTO dto, Integer isBatchSave, Integer type, String tableType, Long id, String tabIds) {
         jdbcTemplate.execute("delete from u_information_query where wbs_id = " + id);
-        throw new RuntimeException("试验数据保存失败,原因:ExcelTabClient#saveTabDataError...");
+        jdbcTemplate.execute("delete from u_trial_self_inspection_record where id = " + id);
+        logger.info("-----------------远程feign调用试验保存方法saveTabData失败-----------------");
+        return "500";
     }
 
     @Override

+ 18 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO4.java

@@ -0,0 +1,18 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+import org.springblade.manager.dto.ArchiveTreeContractDTO;
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/4/25 15:14
+ **/
+@Data
+public class ArchiveTreeContractVO4 extends ArchiveTreeContract {
+
+    List<ArchiveTreeContractDTO> listSort;
+}

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO.java

@@ -21,6 +21,12 @@ public class TreeNodeVO extends BaseNode<TreeNode> {
 
     private Integer type;
 
+    private Integer deptType;
+
+    private String deptName;
+
+    private String fullName;
+
     private String primaryKeyId;
 
     private Integer wbsType;

+ 5 - 1
blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Dept.java

@@ -104,5 +104,9 @@ public class Dept implements Serializable {
     @ApiModelProperty(value = "是否已删除")
     private Integer isDeleted;
 
-
+    /**
+     * 部门类型 内控系统特有
+     */
+    @ApiModelProperty(value = "部门类型")
+    private Integer deptType;
 }

+ 7 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java

@@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.tool.node.INode;
@@ -42,18 +43,21 @@ public class DeptVO extends Dept implements INode<DeptVO> {
     /**
      * 主键ID
      */
+    @ApiModelProperty(value = "主键ID")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
     /**
      * 父节点ID
      */
+    @ApiModelProperty(value = "父节点ID")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long parentId;
 
     /**
      * 子孙节点
      */
+    @ApiModelProperty(value = "父节点ID")
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private List<DeptVO> children;
 
@@ -74,16 +78,19 @@ public class DeptVO extends Dept implements INode<DeptVO> {
     /**
      * 上级机构
      */
+    @ApiModelProperty(value = "上级机构")
     private String parentName;
 
     /**
      * 机构类型名称
      */
+    @ApiModelProperty(value = "机构类型名称")
     private String deptCategoryName;
 
     /**
      * 租户id
      */
+    @ApiModelProperty(value = "租户id")
     private String tenantId;
 
 }

+ 8 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/dto/UserDTO.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.system.user.entity.User;
+import org.springblade.system.user.vo.DeptUserVO;
 
 import java.util.List;
 
@@ -19,4 +20,11 @@ public class UserDTO extends User {
     @ApiModelProperty(value = "用户关联项目List")
     private List<SaveUserInfoByProjectDTO> projectAndUserList;
 
+
+    /**
+     * 组织机构
+     */
+    @ApiModelProperty(value = "组织机构对象(内控)")
+    private List<DeptUserVO> deptList;
+
 }

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

@@ -41,83 +41,102 @@ public class User extends TenantEntity {
     /**
      * 用户编号
      */
+    @ApiModelProperty(value = "用户编号")
     private String code;
     /**
      * 用户平台 改为多选 字符串拼接
      */
+    @ApiModelProperty(value = "用户平台 改为多选 字符串拼接")
     private String userType;
     /**
      * 账号
      */
+    @ApiModelProperty(value = "账号")
     private String account;
     /**
      * 密码
      */
+    @ApiModelProperty(value = "密码(加密码)")
     private String password;
     /**
      * 明文密码
      */
+    @ApiModelProperty(value = "密码(明文密码)")
     private String plaintextPassword;
     /**
      * 昵称
      */
+    @ApiModelProperty(value = "昵称")
     private String name;
     /**
      * 真名
      */
+    @ApiModelProperty(value = "真名")
     private String realName;
     /**
      * 身份证号
      */
+    @ApiModelProperty(value = "身份证号")
     private String idNumber;
     /**
      * 头像
      */
+    @ApiModelProperty(value = "头像")
     private String avatar;
     /**
      * 邮箱
      */
+    @ApiModelProperty(value = "邮箱")
     private String email;
     /**
      * 手机
      */
+    @ApiModelProperty(value = "手机")
     private String phone;
     /**
      * 生日
      */
+    @ApiModelProperty(value = "生日")
     private Date birthday;
     /**
      * 性别
      */
+    @ApiModelProperty(value = "性别")
     private Integer sex;
 
     /**
      * 是否为同步用户信息
      */
+    @ApiModelProperty(value = "是否为同步用户信息")
     private Integer sysType;
 
     /**
      * 同步方系统Id
      */
+    @ApiModelProperty(value = "同步方系统Id")
     private String sysId;
 
 
     /**
      * 角色id
      */
+    @ApiModelProperty(value = "角色id")
     private String roleId;
     /**
      * 部门id
      */
+    @ApiModelProperty(value = "部门id")
     private String deptId;
     /**
      * 岗位id
      */
+    @ApiModelProperty(value = "岗位id")
     private String postId;
 
     /**
      * 电签证书编码
      */
+    @ApiModelProperty(value = "电签证书编码")
     private String accCode;
 
 
@@ -133,4 +152,16 @@ public class User extends TenantEntity {
     @ApiModelProperty(value = "职位")
     private String position;
 
+    /**
+     * 部门id负责人
+     */
+    @ApiModelProperty(value = "部门id负责人")
+    private String isLeader;
+
+    /**
+     * 职位
+     */
+    @ApiModelProperty(value = "日单价")
+    private Double oneMoney;
+
 }

+ 55 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/DeptUserVO.java

@@ -0,0 +1,55 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.system.user.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.user.entity.User;
+
+/**
+ * 视图实体类
+ *
+ * @author Chill
+ */
+@Data
+@ApiModel(value = "机构对象", description = "机构对象")
+public class DeptUserVO {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门Id
+     */
+    @ApiModelProperty(value = "部门Id")
+    private Long deptId;
+
+    /**
+     * 性别
+     */
+    @ApiModelProperty(value = "岗位Id")
+    private Long postId;
+
+    /**
+     * 拓展信息
+     */
+    @ApiModelProperty(value = "是否负责人(1:是 2:否)")
+    private Integer isLeader;
+}

+ 9 - 0
blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/vo/UserVO.java

@@ -21,6 +21,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.system.user.entity.User;
@@ -51,40 +52,48 @@ public class UserVO extends User {
     /**
      * 密码
      */
+
     private String password;
 
     /**
      * 租户名
      */
+    @ApiModelProperty(value = "租户名")
     private String tenantName;
 
     /**
      * 用户平台名
      */
+    @ApiModelProperty(value = "用户平台名")
     private String userTypeName;
 
     /**
      * 角色名
      */
+    @ApiModelProperty(value = "角色名")
     private String roleName;
 
     /**
      * 部门名
      */
+    @ApiModelProperty(value = "部门名")
     private String deptName;
 
     /**
      * 岗位名
      */
+    @ApiModelProperty(value = "岗位名")
     private String postName;
 
     /**
      * 性别
      */
+    @ApiModelProperty(value = "性别")
     private String sexName;
 
     /**
      * 拓展信息
      */
+    @ApiModelProperty(value = "拓展信息")
     private String userExt;
 }

+ 2 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -31,6 +31,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.http.message.BasicNameValuePair;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.utils.CallBgrsjk;
+import org.springblade.archive.utils.FileUtils;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
@@ -80,7 +81,6 @@ public class ArchivesAutoController extends BladeController {
 
 	private final IArchiveAutoPdfService archiveAutoPdfService;
 	private final ArchiveTreeContractClient archiveTreeContractClient;
-	private ProjectClient projectClient;
 	private ContractClient contractClient;
 
 	@Autowired
@@ -604,8 +604,8 @@ public class ArchivesAutoController extends BladeController {
 			@ApiImplicitParam(name = "file", value = "文件源", required = true)
 	})
 	public R putFileAttach(@RequestParam("file") MultipartFile file) {
+		String file_path = FileUtils.getSysLocalFileUrl();
 
-		String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
 
 
 		return R.success("上传成功");

+ 4 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -147,4 +147,8 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
     Long getAllArchiveFileSize(@Param("projectId") Long projectId);
 
 	ArchivesAutoVO getArchiveFileList(@Param("id") Long id);
+
+	List<ArchivesAutoVO> getArchivesCabinet22(@Param("vo") ArchivesAutoVO archivesAuto);
+
+	List<ArchivesAutoVO> pageByArchivesAuto5(@Param("vo") ArchivesAutoVO vo);
 }

+ 98 - 10
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -615,12 +615,11 @@
     </select>
 
     <select id="pageByArchivesAuto3" resultMap="archivesAutoResultMap">
-        select uaa.*
+        select uaa.id,uaa.name,uaa.file_number,uaa.unit,uaa.storage_time,uaa.secret_level
         from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and  ancestors like concat('%',#{vo.nodeId},'%')
-        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id =
-        uaf.archive_id
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id
         where uaa.is_deleted = 0 and uaa.is_archive = 1
         <if test="vo.contractId != null and vo.contractId != ''">
             and uaa.contract_id = #{vo.contractId}
@@ -633,8 +632,7 @@
         select uaa.id from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and  ancestors like concat('%',#{vo.nodeId},'%')
-        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id =
-        uaf.archive_id
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id
         where uaa.is_deleted = 0 and uaa.is_archive = 1
         <if test="vo.contractId != null and vo.contractId != ''">
             and uaa.contract_id = #{vo.contractId}
@@ -642,6 +640,50 @@
         <if test="vo.searchType == 1 and vo.queryValue != null and vo.queryValue != ''">
             and uaa.name like concat('%',#{vo.queryValue},'%') or uaa.file_number like concat('%',#{vo.queryValue},'%')
         </if>
+        <if test="vo.storageTimes != null and vo.storageTimes != ''">
+            and uaa.storage_time in
+            <foreach collection="vo.storageTimes" item="storageTime" open="(" separator="," close=")">
+                #{storageTime}
+            </foreach>
+        </if>
+        <if test="vo.secretLevels != null and vo.secretLevels != ''">
+            and uaa.secret_level in
+            <foreach collection="vo.secretLevels" item="secretLevel" open="(" separator="," close=")">
+                #{secretLevel}
+            </foreach>
+        </if>
+        <if test="vo.carrierTypes != null and vo.carrierTypes != ''">
+            and uaa.carrier_type in
+            <foreach collection="vo.carrierTypes" item="carrierType" open="(" separator="," close=")">
+                #{carrierType}
+            </foreach>
+        </if>
+        <if test="vo.years != null and vo.years != ''">
+            and
+            <foreach collection="vo.years" item="year" separator=" or" open="(" close=")">
+                #{year} BETWEEN DATE_FORMAT(uaa.start_date,'%Y') and DATE_FORMAT(uaa.end_date ,'%Y')
+            </foreach>
+        </if>
+        <if test="vo.months != null and vo.months != ''">
+            and
+            <foreach collection="vo.months" item="month" separator=" or" open="(" close=")">
+                #{month} BETWEEN DATE_FORMAT(uaa.start_date,'%c') and DATE_FORMAT(uaa.end_date ,'%c')
+            </foreach>
+        </if>
+        GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+    </select>
+
+    <select id="pageByArchivesAuto5" resultMap="archivesAutoResultMap">
+        select uaa.id from
+        (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
+        and  ancestors like concat('%',#{vo.nodeId},'%')
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id =
+        uaf.archive_id
+        where uaa.is_deleted = 0 and uaa.is_archive = 1
+        <if test="vo.contractId != null and vo.contractId != ''">
+            and uaa.contract_id = #{vo.contractId}
+        </if>
         <if test="vo.searchType == 2 and vo.queryValue != null and vo.queryValue != ''">
             and uaf.file_name like concat('%',#{vo.queryValue},'%')
         </if>
@@ -680,11 +722,10 @@
     </select>
 
     <select id="getArchivesCabinet" resultMap="archivesAutoResultMap">
-        select uaa.* from
+        select uaa.id,uaa.name,uaa.file_number,uaa.unit from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and  ancestors like concat('%',#{vo.nodeId},'%')
-        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id left join u_archive_file uaf on uaa.id =
-        uaf.archive_id
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id
         where uaa.is_deleted = 0 and uaa.is_archive = 1
         <if test="vo.contractId != null and vo.contractId != ''">
             and uaa.contract_id = #{vo.contractId}
@@ -695,6 +736,53 @@
     </select>
 
     <select id="getArchivesCabinet2" resultMap="archivesAutoResultMap">
+        select uaa.id from
+        (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
+        and  ancestors like concat('%',#{vo.nodeId},'%')
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id
+        where uaa.is_deleted = 0 and uaa.is_archive = 1
+        <if test="vo.contractId != null and vo.contractId != ''">
+            and uaa.contract_id = #{vo.contractId}
+        </if>
+        <if test="vo.searchType == 1 and vo.queryValue != null and vo.queryValue != ''">
+            and uaa.name like concat('%',#{vo.queryValue},'%')
+        </if>
+        <if test="vo.storageTimes != null and vo.storageTimes != ''">
+            and uaa.storage_time in
+            <foreach collection="vo.storageTimes" item="storageTime" open="(" separator="," close=")">
+                #{storageTime}
+            </foreach>
+        </if>
+        <if test="vo.secretLevels != null and vo.secretLevels != ''">
+            and uaa.secret_level in
+            <foreach collection="vo.secretLevels" item="secretLevel" open="(" separator="," close=")">
+                #{secretLevel}
+            </foreach>
+        </if>
+        <if test="vo.carrierTypes != null and vo.carrierTypes != ''">
+            and uaa.carrier_type in
+            <foreach collection="vo.carrierTypes" item="carrierType" open="(" separator="," close=")">
+                #{carrierType}
+            </foreach>
+        </if>
+        <if test="vo.years != null and vo.years != ''">
+            and
+            <foreach collection="vo.years" item="year" separator=" or" open="(" close=")">
+                #{year} BETWEEN DATE_FORMAT(uaa.start_date,'%Y') and DATE_FORMAT(uaa.end_date ,'%Y')
+            </foreach>
+        </if>
+        <if test="vo.months != null and vo.months != ''">
+            and
+            <foreach collection="vo.months" item="month" separator=" or" open="(" close=")">
+                #{month} BETWEEN DATE_FORMAT(uaa.start_date,'%c') and DATE_FORMAT(uaa.end_date ,'%c')
+            </foreach>
+        </if>
+        GROUP BY uaa.id
+                order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+--         order by uaa.id
+    </select>
+
+    <select id="getArchivesCabinet22" resultMap="archivesAutoResultMap">
         select uaa.id from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and  ancestors like concat('%',#{vo.nodeId},'%')
@@ -741,8 +829,8 @@
             </foreach>
         </if>
         GROUP BY uaa.id
-                order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
---         order by uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+        --         order by uaa.id
     </select>
 
     <select id="getAllArchiveByContractType" resultType="org.springblade.archive.vo.ArchivesAutoVO">

+ 123 - 33
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -216,7 +216,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			vo.setYears(null);
 			vo.setMonths(null);
 		}
-		List<ArchivesAutoVO> selectAutos = baseMapper.pageByArchivesAuto4(vo);
+		List<ArchivesAutoVO> selectAutos = new ArrayList<>();
+		if (vo.getSearchType() == 1) {
+			selectAutos = baseMapper.pageByArchivesAuto4(vo);
+		}else {
+			selectAutos = baseMapper.pageByArchivesAuto5(vo);
+		}
 		List<Long> ids = new ArrayList<>();
 		if (selectAutos != null && selectAutos.size() > 0) {
 			ids = selectAutos.stream().map(l -> l.getId()).collect(Collectors.toList());
@@ -336,7 +341,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//根据单位查询所有档案
 		List<ArchivesAutoVO> archivesAutos = baseMapper.getArchivesCabinet(archivesAuto);
 		//根据选择条件查询所有档案
-		List<ArchivesAutoVO> selectAutos = baseMapper.getArchivesCabinet2(archivesAuto);
+		List<ArchivesAutoVO> selectAutos = new ArrayList<>();
+		if (archivesAuto.getSearchType() == 1) {
+			selectAutos = baseMapper.getArchivesCabinet2(archivesAuto);
+		}else {
+			selectAutos = baseMapper.getArchivesCabinet22(archivesAuto);
+		}
 		List<Long> ids = new ArrayList<>();
 		if (selectAutos != null && selectAutos.size() > 0) {
 			ids = selectAutos.stream().map(l -> l.getId()).collect(Collectors.toList());
@@ -617,27 +627,20 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}
 
 		}
-
-
-
-
-
-
-
 	}
 
 	@Override
-	public void archiveAutoMethod(Long projectId,Long contractId,Long nodeId){
-		//步骤一:把档号集合初始化
-		indexMap = new HashMap<>();
-		//步骤二:查询归档树节点。存在未归档文件的节点。
-		List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
+    public void archiveAutoMethod(Long projectId, Long contractId, Long nodeId) {
+        //步骤一:把档号集合初始化
+        indexMap = new HashMap<>();
+        //步骤二:查询归档树节点。存在未归档文件的节点。
+        List<ArchiveTreeContract> list = archiveTreeContractClient.getHavedFileNodeByProjectID(projectId);
 
-		//按合同段过滤
-		List<ArchiveTreeContract> authlist = authFilter(list, contractId, nodeId);
+        //按合同段过滤
+        List<ArchiveTreeContract> authlist = authFilter(list, contractId, nodeId);
 
-		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
-		List<ArchiveTreeContract> list1= new ArrayList<>();
+        //步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
+        List<ArchiveTreeContract> list1 = new ArrayList<>();
 		List<ArchiveTreeContract> list2= new ArrayList<>();
 		List<ArchiveTreeContract> list3= new ArrayList<>();
 		for(ArchiveTreeContract treeContract:authlist){
@@ -701,6 +704,12 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			if (node.getAncestors().split(",").length <= 2){
 				//查询当前合同
 				ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractByNodeName(contractInfo.getContractName());
+				if (archiveTreeContract == null){
+					archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractByContractId(vo.getContractId());
+				}
+				if (archiveTreeContract == null){
+					throw new ServiceException("系统繁忙,请稍后再试");
+				}
 				vo.setNodeId(archiveTreeContract.getId());
 			}
 				list = baseMapper.pageByAuthenticate(page, vo);
@@ -847,14 +856,24 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				if(nodeContract==null){
 					nodeContract = contractClient.getContractById(nodeContractId);
 				}
-				storageTime = nodeContract.getStoragePeriod().toString();
+				Integer storagePeriod = nodeContract.getStoragePeriod();
+				if(storagePeriod==null){
+					storageTime="30";
+				}else{
+					storageTime = storagePeriod.toString();
+				}
 			}else{
 				if(contracts==null){
 					contracts = contractClient.getContractListByProjectId(archivesAuto.getProjectId());
 				}
 				for(ContractInfo c:contracts){
 					if(c.getContractType()==3){
-						storageTime = c.getStoragePeriod().toString();
+						Integer storagePeriod = c.getStoragePeriod();
+						if(storagePeriod==null){
+							storageTime="30";
+						}else{
+							storageTime = storagePeriod.toString();
+						}
 					}
 				}
 			}
@@ -973,12 +992,18 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//找出文件集合中的最大最小时间
 		List<String> fileTimeList = new ArrayList<>();
 		for(ArchiveFile file:waitArchiveFiles){
-			fileTimeList.add(file.getFileTime());
+			if(StringUtils.isNotEmpty(file.getFileTime())){
+				fileTimeList.add(file.getFileTime());
+			}
+		}
+		if(fileTimeList.size()>0){
+			Collections.sort(fileTimeList);
+			String startDate=fileTimeList.get(0);
+			String endDate=fileTimeList.get(fileTimeList.size()-1);
+			return startDate+","+endDate;
+		}else{
+			return "";
 		}
-		Collections.sort(fileTimeList);
-		String startDate=fileTimeList.get(0);
-		String endDate=fileTimeList.get(fileTimeList.size()-1);
-		return startDate+","+endDate;
 	}
 
 	private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node,boolean isCrossNode){
@@ -988,10 +1013,19 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		Long projectId = node.getProjectId();
 		ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
 		String projectName = projectInfo.getProjectName();
+		String contractName="";
+		Long contractId = node.getContractId();
+		if(contractId!=null){
+			ContractInfo contract = contractClient.getContractById(contractId);
+			contractName=contract.getContractName();
+		}
 		//获取案卷题名
+		archiveName=projectName;
+		if(StringUtils.isNotEmpty(contractName)){
+			archiveName=archiveName+contractName;
+		}
 		//--正常节点
 		if(isCrossNode){
-			archiveName=projectName;
 			//存在跨节点  项目名称+文件对应的所有节点名称
 			Set<String> nodeIdSet = new LinkedHashSet<>();
 			for(ArchiveFile file:waitArchiveFiles){
@@ -1001,17 +1035,21 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			for(String nodeId:nodeIdSet){
 				ArchiveTreeContract treeNode = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(nodeId));
 				String nodeName = treeNode.getNodeName();
-				archiveName=archiveName+" "+nodeName;
+				archiveName=archiveName+nodeName;
 			}
 		}else{
 			//不存在跨节点  项目名称+节点名称
-			archiveName=projectName+" "+node.getNodeName();
+			archiveName=archiveName+node.getNodeName();
 		}
 
 		//TODO wbs节点
 		//不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
 		//存在跨节点  获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
-		return archiveName+node.getArchiveNameSuffix();
+		String archiveNameSuffix=node.getArchiveNameSuffix();
+		if(archiveNameSuffix==null || archiveNameSuffix.equals("null")){
+			archiveNameSuffix="";
+		}
+		return archiveName+archiveNameSuffix;
 	}
 	private String builtFilePageNo(ArchivesAuto archivesAuto,List<ArchiveFile> waitArchiveFiles){
 		//生成文件对应的页码,返回url
@@ -1077,7 +1115,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//获取案卷内文件总页数
 		int pageN=0;
 		for(ArchiveFile file:waitArchiveFiles){
-			pageN=pageN+file.getFilePage();
+			Integer filePage=file.getFilePage();
+			if(filePage==null){
+				filePage=0;
+			}
+			pageN=pageN+filePage;
 		}
 		//默认组卷存在跨节点组卷  注意案卷归属节点,案卷命名方式
 		//获取案卷题名
@@ -1160,7 +1202,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//获取案卷内文件总页数
 		int pageN=0;
 		for(ArchiveFile file:waitArchiveFiles){
-			pageN=pageN+file.getFilePage();
+			Integer filePage= file.getFilePage();
+			if(filePage==null){
+				filePage=0;
+			}
+			pageN=pageN+filePage;
 		}
 
 
@@ -1187,9 +1233,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 
 	/**
-	 * 单租组卷流程  节点下的文件只在当前节点下组卷
+	 * 单租组卷流程  节点下的文件只在当前节点下组卷   满规格另组一卷 不跨节点
 	 */
-	private void archiveAutoMethod3(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap){
+	private void archiveAutoMethod3_old(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap){
 		//步骤1:遍历节点集合
 		for(ArchiveTreeContract node:list){
 			//步骤2:获取当前节点的案卷规格
@@ -1222,6 +1268,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 						//单独组卷流程
 						//步骤6:计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
 						Integer filePage = file.getFilePage();
+						if(filePage==null){
+							filePage=0;
+						}
 						archivesSize=archivesSize+filePage;
 						Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
 						//步骤6.1未到规格 不组卷
@@ -1277,7 +1326,45 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 			}
 
 		}
+	}
 
+	/**
+	 * 单租组卷流程  20230628 SBD又说单独组卷规则节点下只组一卷,不用满规格新组。这辈子没见过这样的人。
+	 * @param list
+	 * @param boxMap
+	 */
+	private void archiveAutoMethod3(List<ArchiveTreeContract> list,Map<String,List<ArchiveFile>> boxMap){
+		//步骤1:遍历节点集合
+		for(ArchiveTreeContract node:list){
+			//步骤2:查询节点下的未组卷文件
+			List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
+			//步骤3:遍历未归档文件
+			//待组卷文件集合
+			List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
+			//待组卷文件总页数
+			int archivesSize=0;
+			if(archiveFiles!=null){
+				for(ArchiveFile file:archiveFiles){
+					//步骤4:断文件是否存在分盒设置
+					if(file.getBoxNumber()!=null && file.getBoxNumber()!=-1){
+						//添加到分盒文件集合
+						addBoxMap(file,boxMap);
+					}else{
+						//单独组卷流程
+						Integer filePage = file.getFilePage();
+						if(filePage==null){
+							filePage=0;
+						}
+						archivesSize=archivesSize+filePage;
+						waitArchiveFiles.add(file);
+					}
+				}
+				//步骤3:将waitArchiveFiles组卷
+				createArchive3(waitArchiveFiles,node,archivesSize);
+				//将待组卷文件集合,总页数还原初始值,
+				waitArchiveFiles.clear();
+			}
+		}
 	}
 
 	/**
@@ -1396,6 +1483,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				}else{
 					//步骤3.5 计算和判断待组卷文件集合是否达到组卷要求,达到要求创建案卷,案卷归属当前节点,案卷下文件改为已组卷
 					Integer filePage = file.getFilePage();
+					if(filePage==null){
+						filePage=0;
+					}
 					archivesSize=archivesSize+filePage;
 					Integer checkStatus = checkSpecificationSize(specificationSize, archivesSize);
 					//步骤3.6未到规格 不组卷

+ 19 - 12
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -20,14 +20,17 @@ import org.apache.poi.xssf.usermodel.XSSFPrintSetup;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
+import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.constant.OssConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.common.utils.SystemUtils;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.resource.feign.NewIOSSClient;
+import org.springblade.system.cache.ParamCache;
 
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletResponse;
@@ -708,16 +711,20 @@ public class FileUtils {
         return ossPath;
     }
 
-//    public static void main(String[] args) {
-//
-//        System.out.println(getOssPath(null,"12344555",12424445L));
-//        System.out.println(getOssPath(OssConstant.TEMP_DIRECTORY,"12344555",12424445L));
-//        System.out.println(getOssPath(OssConstant.ARCHIVE_DIRECTORY,"12344555",12424445L));
-//        System.out.println(getOssPath("","12344555",null));
-//        String url = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/1578599210897772545/archive/ed4305eb971b062046c1ffd4e2da3c32-page1-1.pdf";
-//        String url1 = "https://bladex-chongqing-info.oss-cn-hangzhou.aliyuncs.com/upload/ed4305eb971b062046c1ffd4e2da3c32-page1-1.pdf";
-//
-//        System.out.println(getAliYunSubUrl(url));
-//        System.out.println(getAliYunSubUrl(url1));
-//    }
+    public static String getSysLocalFileUrl() {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        if (SystemUtils.isMacOs()) {
+            file_path = "/Users/hongchuangyanfa/Desktop/";
+        } else if (SystemUtils.isWindows()) {
+            file_path = "C://upload";
+        }
+        return file_path;
+    }
+
+    public static void main11(String[] args) {
+       /* SpeechRecognizerDemo demo = new SpeechRecognizerDemo(appKey, id, secret, url);
+        //本案例使用本地文件模拟发送实时流数据。
+        demo.process("./nls-sample-16k.wav", 16000);
+        demo.shutdown();*/
+    }
 }

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

@@ -2848,9 +2848,16 @@ public class InformationWriteQueryController extends BladeController {
         List<WbsTreeContract> selectedNodeList = jdbcTemplate.query("select * from m_wbs_tree_contract where status = 1 and is_deleted = 0 and p_key_id in(" + StringUtils.join(halfSelectedList, ",") + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
 
         //剔除与当前操作节点相同的ID,(如果saveType=1,表示当前及子级节点,那么就要剔除自己本身,否则视为仅当前节点操作,会存在自己本身)
-        if (("1").equals(saveType)) {
-            selectedNodeList.removeIf(wbsTreePrivate -> treeContract.getId().equals(wbsTreePrivate.getId()) || treeContract.getOldId().equals(wbsTreePrivate.getId().toString()));
+        if ("1".equals(saveType)){
+            //selectedNodeList.removeIf(wbsTreePrivate -> treeContract.getId().equals(wbsTreePrivate.getId()) || treeContract.getOldId().equals(wbsTreePrivate.getId().toString()));
+            selectedNodeList.removeIf(wbsTreePrivate -> {
+                Long id = wbsTreePrivate.getId();
+                String oldId = wbsTreePrivate.getId().toString();
+                return treeContract.getId() != null && treeContract.getOldId() != null &&
+                        (treeContract.getId().equals(id) || treeContract.getOldId().equals(oldId));
+            });
         }
+
         return selectedNodeList;
     }
 

+ 4 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -1018,10 +1018,12 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
         }
     }
 
-    public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) throws RuntimeException {
+    public void submitTrialData(TrialSelfInspectionRecord obj, TrialSelfInspectionRecordDTO dto) {
         String pdfURL = excelTabClient.saveTabData(dto, dto.getIsBatchSave(), dto.getType(), dto.getTableType(), dto.getId(), obj.getTableIds());
-        if (StringUtils.isNotEmpty(pdfURL)) {
+        if (StringUtils.isNotEmpty(pdfURL) && !pdfURL.equals("500")) {
             this.update(Wrappers.<TrialSelfInspectionRecord>lambdaUpdate().set(TrialSelfInspectionRecord::getPdfUrl, pdfURL).eq(TrialSelfInspectionRecord::getId, dto.getId()));
+        } else if (pdfURL.equals("500")) {
+            throw new ServiceException("试验填报保存操作失败");
         }
     }
 

+ 16 - 3
blade-service/blade-business/src/main/java/org/springblade/business/utils/StringSPUtils.java

@@ -1,5 +1,7 @@
 package org.springblade.business.utils;
 
+import org.springblade.core.tool.utils.DateUtil;
+
 public class StringSPUtils {
 
     /***
@@ -51,14 +53,19 @@ public class StringSPUtils {
             return alphatable[i];
     }
 
-    //根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串
     public String getStringSP(String SourceStr) {
         StringBuilder Result = new StringBuilder();
         int StrLength = SourceStr.length();
         int i;
         try {
             for (i = 0; i < StrLength; i++) {
-                Result.append(Char2Alpha(SourceStr.charAt(i)));
+                char ch = SourceStr.charAt(i);
+                // 判断是否是汉字
+                if (isChineseCharacter(ch)) {
+                    Result.append(Char2Alpha(ch));
+                } else {
+                    Result.append(ch);
+                }
             }
         } catch (Exception e) {
             Result = new StringBuilder();
@@ -66,6 +73,12 @@ public class StringSPUtils {
         return Result.toString();
     }
 
+    //判断字符是否是汉字
+    private boolean isChineseCharacter(char ch) {
+        //汉字的编码范围为'\u4e00'到'\u9fa5'
+        return (ch >= '\u4e00' && ch <= '\u9fa5');
+    }
+
     private boolean match(int i, int gb) {
         if (gb < table[i])
             return false;
@@ -122,7 +135,7 @@ public class StringSPUtils {
 
     /*public static void main(String[] args) {
         StringSPUtils obj1 = new StringSPUtils();
-        System.out.println(obj1.getStringSP("你好"));
+        System.out.println(obj1.getStringSP("你好NIHAO 00_1"));
         System.out.println(obj1.getStringSP("欢迎你"));
         String s = obj1.buildSerial(1, 4);
         System.out.println(s);

+ 79 - 6
blade-service/blade-control/src/main/java/org/springblade/control/controller/AnnualBudgetController.java

@@ -14,15 +14,15 @@ import org.springblade.control.entity.AnnualBudget;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.service.IAnnualBudgetService;
 import org.springblade.control.service.IDepartmentMonthPlanService;
-import org.springblade.control.vo.AnnualBudgetVO;
-import org.springblade.control.vo.AnnualBudgetVO2;
-import org.springblade.control.vo.ControlProjectInfoVO;
-import org.springblade.control.vo.DictInfoVO;
+import org.springblade.control.vo.*;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Param
@@ -108,7 +108,7 @@ public class AnnualBudgetController {
      * 获取项目列表
      */
     @GetMapping("/getProjectList")
-    @ApiOperationSupport(order = 5)
+    @ApiOperationSupport(order = 7)
     @ApiOperation(value = "获取项目列表")
     public R<List<ControlProjectInfoVO>> getProjectList() {
         return R.data(budgetService.getProjectList());
@@ -118,10 +118,83 @@ public class AnnualBudgetController {
      * 获取二级科目
      */
     @GetMapping("/getSecondSubject")
-    @ApiOperationSupport(order = 5)
+    @ApiOperationSupport(order = 8)
     @ApiOperation(value = "获取二级科目")
     public R<List<DictInfoVO>> getSecondSubject() {
         return R.data(budgetService.getSecondSubject());
     }
 
+    /**
+     * 门户-年度指标统计
+     */
+    @GetMapping("/portalAnnualTarget")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "门户-年度指标统计")
+    public R<AnnualBudgetVO3> portalAnnualTarget() {
+        return R.data(budgetService.portalAnnualTarget());
+    }
+
+    /**
+     * 门户-年度各项费用统计
+     */
+    @GetMapping("/portalAnnualCost")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "门户-年度各项费用统计")
+    public R<Map<String, BigDecimal>> portalAnnualCost(String year) {
+        return R.data(budgetService.portalAnnualCost(year));
+    }
+
+    /**
+     * 年度列表
+     */
+    @GetMapping("/yearList")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "门户-年度列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "type", value = "1不包含所有,2包含所有", required = true),
+    })
+    public R<List<String>> yearList(Integer type) {
+        return R.data(budgetService.yearList(type));
+    }
+
+    /**
+     * 门户-年度各项目支出对比
+     */
+    @GetMapping("/portalAnnualProjectCost")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "门户-年度各项目支出对比")
+    public R<List<AnnualProjectCostVO>> portalAnnualProjectCost(String year) {
+        return R.data(budgetService.portalAnnualProjectCost(year));
+    }
+
+    /**
+     * 门户-当月各部门计划安排比重
+     */
+    @GetMapping("/portalDeptMonthPlanRatio")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "门户-当月各部门计划安排比重",notes = "传入日期如:2023-06")
+    public R<List<DeptMonthPlanRatioVO>> portalProjectMonthRatio(String date) {
+        return R.data(budgetService.portalProjectMonthRatio(date));
+    }
+
+    /**
+     * 门户-风险计划
+     */
+    @GetMapping("/portalRiskPlan")
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "门户-风险计划")
+    public R<List<AllProjectStatsVO>> portalRiskPlan() {
+        return R.data(budgetService.portalRiskPlan());
+    }
+
+//    /**
+//     * 门户-风险计划查看
+//     */
+//    @GetMapping("/portalRiskPlanDetail")
+//    @ApiOperationSupport(order = 15)
+//    @ApiOperation(value = "门户-风险计划查看")
+//    public R<List<AllProjectStatsVO>> portalRiskPlanDetail() {
+//        return R.data(budgetService.portalRiskPlanDetail());
+//    }
+
 }

+ 8 - 4
blade-service/blade-control/src/main/java/org/springblade/control/controller/ContractReturnedInfoController.java

@@ -58,12 +58,16 @@ public class ContractReturnedInfoController {
     }
 
     /**
-     * 根据项目ID获取合同回款列表
+     * 计划获取合同回款列表关联
      */
     @GetMapping("/getListByProjectId")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "根据项目ID获取合同回款列表")
-    public R<List<ContractReturnedInfoVO>> getListByProjectId(Long projectId){
-        return R.data(contractReturnedInfoService.getListByProjectId(projectId));
+    @ApiOperation(value = "计划获取合同回款列表关联")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "planId", value = "计划id", required = true),
+            @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+    })
+    public R<List<ContractReturnedInfoVO>> getListByProjectId(Long projectId,Long planId){
+        return R.data(contractReturnedInfoService.getListByProjectId(projectId,planId));
     }
 }

+ 48 - 9
blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentMonthPlanController.java

@@ -9,11 +9,13 @@ import lombok.AllArgsConstructor;
 import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.entity.DepartmentMonthPlan;
+import org.springblade.control.entity.DictInfo;
 import org.springblade.control.entity.ProjectReimbursement;
 import org.springblade.control.service.IDepartmentMonthPlanService;
 import org.springblade.control.vo.DepartmentMonthPlanVO;
 import org.springblade.control.vo.ProjectCostBudgetVO;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
@@ -37,7 +39,7 @@ public class DepartmentMonthPlanController {
      * 部门月计划分页
      */
     @GetMapping("/getPage")
-    @ApiOperationSupport(order = 3)
+    @ApiOperationSupport(order = 1)
     @ApiOperation(value = "部门月计划分页")
     public R<List<DepartmentMonthPlanVO>> getPage(ControlContractInfoDTO dto, Query query) {
         return R.data(planService.getPage(dto,query));
@@ -49,6 +51,11 @@ public class DepartmentMonthPlanController {
     @PostMapping("/addDepartmentPlan")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "新增部门月计划")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "departmentType", value = "部门类型", required = true),
+            @ApiImplicitParam(name = "deptId", value = "部门id", required = true),
+            @ApiImplicitParam(name = "planDate", value = "计划日期", required = true),
+    })
     public R<List<ProjectCostBudgetVO>> addDepartmentPlan(@RequestBody DepartmentMonthPlan plan) {
         return R.data(planService.addDepartmentPlan(plan));
     }
@@ -57,10 +64,10 @@ public class DepartmentMonthPlanController {
      * 查询部门月计划
      */
     @PostMapping("/getDepartmentPlan")
-    @ApiOperationSupport(order = 2)
+    @ApiOperationSupport(order = 3)
     @ApiOperation(value = "查询部门月计划")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "departmentType", value = "部门名称", required = true),
+            @ApiImplicitParam(name = "departmentType", value = "部门类型", required = true),
             @ApiImplicitParam(name = "planDate", value = "计划日期", required = true),
     })
     public R<List<ProjectCostBudgetVO>> getDepartmentPlan(@RequestBody DepartmentMonthPlan plan) {
@@ -71,21 +78,53 @@ public class DepartmentMonthPlanController {
      * 修改部门月计划
      */
     @PostMapping("/updateDepartmentPlan")
-    @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "新增部门月计划")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "修改部门月计划" ,notes = "只需要传入departmentPlanList")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "departmentPlanList", value = "部门计划集合", required = true),
+    })
     public R updateDepartmentPlan(@RequestBody ProjectCostBudgetDTO dto) {
         planService.updateDepartmentPlan(dto);
         return R.success("保存成功");
     }
 
+    /**
+     * 删除部门月计划
+     */
+    @GetMapping("/deleteById")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "删除部门月计划")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "部门月计划主键", required = true),
+    })
+    public R deleteById(Long id) {
+        planService.deleteById(id);
+        return R.success("删除成功");
+
+    }
+
     /**
      * 获取前5个部门列表
      */
     @GetMapping("/getDepartmentDict")
-    @ApiOperationSupport(order = 2)
+    @ApiOperationSupport(order = 5)
     @ApiOperation(value = "获取部门列表")
-    public R getDepartmentDict() {
-        planService.getDepartmentDict();
-        return R.success("新增成功");
+    public R<List<DictInfo>> getDepartmentDict() {
+        return R.data(planService.getDepartmentDict());
+
+    }
+
+    /**
+     * 获取当前部门员工
+     */
+    @GetMapping("/getDepartmentUserDict")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "获取当前部门员工")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "departmentType", value = "部门名称", required = true),
+    })
+    public R<List<BladeUser>> getDepartmentUserDict(Integer departmentType) {
+        return R.data(planService.getDepartmentUserDict(departmentType));
+
     }
 }

+ 6 - 4
blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentPlanLogController.java

@@ -54,11 +54,11 @@ public class DepartmentPlanLogController {
     }
 
     /**
-     * 暂停保存
+     * 暂停
      */
     @PostMapping("/savePlanInPause")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "暂停保存")
+    @ApiOperation(value = "暂停计划的保存")
     public R savePlanInPause(@RequestBody DepartmentPlanLog log) {
         logService.savePlanInPause(log);
         return R.success("暂停成功");
@@ -79,11 +79,11 @@ public class DepartmentPlanLogController {
     }
 
     /**
-     * 开启保存
+     * 开启
      */
     @PostMapping("/savePlanInOpen")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "开启保存")
+    @ApiOperation(value = "开启计划的保存")
     public R savePlanInOpen(@RequestBody DepartmentPlanLog log) {
         logService.savePlanInOpen(log);
         return R.success("开启成功");
@@ -99,4 +99,6 @@ public class DepartmentPlanLogController {
         return R.data(logService.updateOpenTime(log));
     }
 
+
+
 }

+ 77 - 12
blade-service/blade-control/src/main/java/org/springblade/control/controller/ExMaTwoController.java

@@ -8,25 +8,23 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springblade.control.entity.ContractReturnedInfo;
-import org.springblade.control.entity.ControlProjectInfo;
-import org.springblade.control.entity.EMLoanInfo;
-import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.control.entity.*;
 import org.springblade.control.service.impl.ContractReturnedInfoServiceImpl;
 import org.springblade.control.service.impl.EMLoanServiceImpl;
 import org.springblade.control.service.impl.ProjectCostBudgetServiceImpl;
 import org.springblade.control.service.impl.ProjectInfoServiceImpl;
 import org.springblade.control.utils.NumberToChinese;
-import org.springblade.control.vo.ExMaByContractReturnedInfoVO;
-import org.springblade.control.vo.ExMaByControlProjectInfoVO;
-import org.springblade.control.vo.ExMaByLoanVO;
-import org.springblade.control.vo.ExMaByProjectCostBudgetVO;
+import org.springblade.control.vo.*;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.system.entity.Dept;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -34,9 +32,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @RestController
@@ -45,6 +41,7 @@ import java.util.stream.Collectors;
 @Api(value = "费用管理关联业务接口", tags = "费用管理关联业务接口")
 public class ExMaTwoController extends BladeController {
 
+    private final JdbcTemplate jdbcTemplate;
     private final IUserClient iUserClient;
     private final ProjectInfoServiceImpl projectInfoService;
     private final ProjectCostBudgetServiceImpl projectCostBudgetService;
@@ -140,7 +137,6 @@ public class ExMaTwoController extends BladeController {
         return R.data(collect);
     }
 
-
     @GetMapping("/getNumberToChinese")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "将数字转换为汉语大写,支持小数点", notes = "传入字符串value")
@@ -151,4 +147,73 @@ public class ExMaTwoController extends BladeController {
         return R.data(null);
     }
 
+    @GetMapping("/getUserList")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "获取管控系统用户列表(财务报销-归属人、发票管理-开票人)")
+    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<>();
+        for (User user : query) {
+            UserControlVO vo = new UserControlVO();
+            vo.setId(user.getId());
+            vo.setName(ObjectUtil.isNotEmpty(user.getName()) ? user.getName() : user.getRealName());
+            result.add(vo);
+        }
+        return R.data(result);
+    }
+
+    @GetMapping("/getPayeeUserNameList")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "获取支付收款人列表")
+    public R<List<String>> getPayeeUserNameList() {
+        List<EMPayInfo> query = jdbcTemplate.query("select payee_user_name from c_expense_pay_info and is_deleted = 0 and is_temp = 1", new BeanPropertyRowMapper<>(EMPayInfo.class));
+        if (query.size() > 0) {
+            return R.data(query.stream().map(EMPayInfo::getPayeeUserName).collect(Collectors.toList()));
+        }
+        return R.data(null);
+    }
+
+    @GetMapping("/getLoanUserNameList")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "获取借款申请人列表")
+    public R<List<String>> getLoanUserNameList() {
+        List<EMLoanInfo> query = jdbcTemplate.query("select loan_user_name from c_expense_loan_info and is_deleted = 0 and is_temp = 1", new BeanPropertyRowMapper<>(EMLoanInfo.class));
+        if (query.size() > 0) {
+            return R.data(query.stream().map(EMLoanInfo::getLoanUserName).collect(Collectors.toList()));
+        }
+        return R.data(null);
+    }
+
+    @GetMapping("/getUseCarDeptList")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "获取用车部门列表")
+    public R<List<UseCarDeptVO>> getUseCarDeptList() {
+        List<Dept> query = jdbcTemplate.query("select id,dept_name from blade_dept where tenant_id = 003077 and dept_type = 2", new BeanPropertyRowMapper<>(Dept.class));
+        List<UseCarDeptVO> result = new ArrayList<>();
+        if (query.size() > 0) {
+            for (Dept dept : query) {
+                UseCarDeptVO vo = new UseCarDeptVO();
+                vo.setDeptId(dept.getId());
+                vo.setDeptName(dept.getDeptName());
+                result.add(vo);
+            }
+        }
+        return R.data(result);
+    }
+
+    @GetMapping("/getContractInvoiceInfo")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "获取合同段发票信息", notes = "传入项目id")
+    public R<ContractInvoiceInfoVO> getContractInvoiceInfo(@RequestParam String projectId) {
+        List<ControlContractInfo> query = jdbcTemplate.query("select * from c_control_contract_info where project_id = " + projectId, new BeanPropertyRowMapper<>(ControlContractInfo.class));
+        if (query.size() == 1) {
+            ControlContractInfo controlContractInfo = query.get(0);
+            if (controlContractInfo != null) {
+                ContractInvoiceInfoVO vo = BeanUtil.copyProperties(controlContractInfo, ContractInvoiceInfoVO.class);
+                return R.data(vo);
+            }
+        }
+        return R.data(null);
+    }
+
 }

+ 53 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/PlanRelationReturnedController.java

@@ -0,0 +1,53 @@
+package org.springblade.control.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.entity.AnnualBudget;
+import org.springblade.control.service.IAnnualBudgetService;
+import org.springblade.control.service.IPlanRelationReturnedService;
+import org.springblade.control.vo.*;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/12 15:45
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/planRelationReturned")
+@Api(value = "计划关联回款接口", tags = "计划关联回款接口")
+public class PlanRelationReturnedController {
+
+    private final IPlanRelationReturnedService planRelationReturnedService;
+
+    /**
+     * 计划关联回款
+     */
+    @GetMapping("/relationPlanAndReturned")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "计划关联回款")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "planId", value = "计划id", required = true),
+            @ApiImplicitParam(name = "returnedId", value = "回款id", required = true),
+            @ApiImplicitParam(name = "type", value = "关联类型:0取消关联,1关联", required = true),
+    })
+    public R relationPlanAndReturned(Long returnedId,Long planId,Integer type){
+        String msg = planRelationReturnedService.relationPlanAndReturned(returnedId, planId, type);
+        return R.success(msg);
+    }
+
+}

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

@@ -30,7 +30,7 @@ import java.util.Map;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/projectCostBudget")
-@Api(value = "计划预算接口", tags = "计划预算接口")
+@Api(value = "项目计划预算", tags = "项目计划预算")
 public class ProjectCostBudgetController {
 
     private final IProjectCostBudgetService budgetService;
@@ -44,7 +44,7 @@ public class ProjectCostBudgetController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "queryValue", value = "搜索值", required = false),
     })
-    public R<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query){
+    public R<List<ControlProjectInfoVO>> page(ControlProjectInfoDTO dto, Query query){
         return R.data(budgetService.page(dto,query));
     }
 
@@ -65,8 +65,8 @@ public class ProjectCostBudgetController {
      * 编辑项目计划
      */
     @PostMapping("/updatePlan")
-    @ApiOperationSupport(order = 5)
-    @ApiOperation(value = "获取项目计划")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "编辑项目计划")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "id", value = "项目id", required = true),
     })
@@ -85,7 +85,7 @@ public class ProjectCostBudgetController {
             @ApiImplicitParam(name = "startDate", value = "开始日期", required = true),
             @ApiImplicitParam(name = "endDate", value = "结束日期", required = true),
     })
-    public R getWorkDays(@RequestParam("startDate") @DateTimeFormat(pattern="yyyy-MM-dd")LocalDate startDate,
+    public R<Integer> getWorkDays(@RequestParam("startDate") @DateTimeFormat(pattern="yyyy-MM-dd")LocalDate startDate,
                          @RequestParam("endDate") @DateTimeFormat(pattern="yyyy-MM-dd")LocalDate endDate){
         return R.data(budgetService.getWorkDays(startDate,endDate));
     }

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

@@ -120,7 +120,7 @@ public class ProjectInfoController {
      */
     @GetMapping("/allProjectStats")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "项目统计总金额成本")
+    @ApiOperation(value = "项目统计-项目统计")
     public R<AllProjectStatsVO> allProjectStats() {
         return R.data(projectInfoService.allProjectStats());
     }
@@ -130,7 +130,7 @@ public class ProjectInfoController {
      */
     @GetMapping("/ProjectListStats")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "项目统计列表统计")
+    @ApiOperation(value = "项目统计-列表统计")
     public R<List<AllProjectStatsVO>> ProjectListStats() {
         return R.data(projectInfoService.ProjectListStats());
     }
@@ -140,7 +140,7 @@ public class ProjectInfoController {
      */
     @GetMapping("/ProjectCostTypeStats")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "项目统计费用分类")
+    @ApiOperation(value = "项目统计-费用分类",notes = "传入项目id")
     public R<List<AllProjectStatsVO>> ProjectCostTypeStats(Long id) {
         return R.data(projectInfoService.ProjectCostTypeStats(id));
     }

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

@@ -41,7 +41,7 @@ public class ProjectProcessController {
      */
     @GetMapping("/projectLinkCost")
     @ApiOperationSupport(order = 10)
-    @ApiOperation(value = "项目统计-环节费用")
+    @ApiOperation(value = "项目统计-环节费用",notes = "传入项目id和费用分类")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "projectId", value = "项目id", required = true),
             @ApiImplicitParam(name = "costType", value = "费用分类", required = true),

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

@@ -33,4 +33,10 @@ public interface AnnualBudgetMapper extends BaseMapper<AnnualBudget> {
     List<DictInfoVO> getAllBudgetSubject();
 
     List<DictInfoVO> getAllSecondSubject();
+
+    AnnualBudget getThisYearBudget(@Param("year") int year);
+
+    List<AnnualBudget> getAllYearBudget(@Param("year") int year);
+
+    Integer yearList();
 }

+ 21 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AnnualBudgetMapper.xml

@@ -1,11 +1,16 @@
 <?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">
+
+    <sql id="budget_column">
+        id, name,budget_start_time, budget_end_time, total_budget,staff_cost,manage_disburse,annual_contract_target,annual_profit_target,status
+    </sql>
+
+
     <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}
@@ -44,6 +49,21 @@
         select *
         from c_dict_info di WHERE di.`type` = 1 AND di.parent_id > 0
     </select>
+    <select id="getThisYearBudget" resultType="org.springblade.control.entity.AnnualBudget">
+        select   <include refid="budget_column" />
+        from c_annual_budget where is_deleted = 0
+            and name like concat('%', #{year}, '%')
+    </select>
+    <select id="getAllYearBudget" resultType="org.springblade.control.entity.AnnualBudget">
+        select   <include refid="budget_column" />
+        from c_annual_budget where is_deleted = 0
+    </select>
+    <select id="yearList" resultType="java.lang.Integer">
+        select DATE_FORMAT(start_time,'%Y')
+        from c_control_project_info cpi
+        WHERE is_deleted = 0 order by start_time
+            limit 1
+    </select>
 
 
 </mapper>

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

@@ -12,6 +12,7 @@ import org.springblade.control.vo.ControlContractInfoVO;
 import org.springblade.control.vo.ControlProjectInfoVO;
 import org.springblade.system.entity.DictBiz;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -32,4 +33,6 @@ public interface ContractInfoMapper extends BaseMapper<ControlContractInfo> {
     List<ControlProjectInfo> getNoConnectionProject2();
 
     List<ControlContractInfo> getList();
+
+    BigDecimal getYearContractMoney(@Param("year") int year);
 }

+ 7 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml

@@ -31,4 +31,11 @@
     <select id="getList" resultType="org.springblade.control.entity.ControlContractInfo">
         select * from c_control_contract_info WHERE is_deleted = 0
     </select>
+    <select id="getYearContractMoney" resultType="java.math.BigDecimal">
+        SELECT SUM(contract_money)
+        from c_control_contract_info WHERE  is_deleted = 0
+        <if test="year != 0">
+            and DATE_FORMAT(contract_sign_time ,'%Y') = #{year}
+        </if>
+    </select>
 </mapper>

+ 4 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java

@@ -9,6 +9,7 @@ import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.ContractReturnedInfoVO;
 import org.springblade.control.vo.ControlContractInfoVO;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -22,5 +23,7 @@ public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedI
 
     List<ContractReturnedInfoVO> getListByContractId(@Param("contractId") Long contractId);
 
-    List<ContractReturnedInfoVO> getListByProjectId(@Param("projectId") Long projectId);
+    List<ContractReturnedInfoVO> getListByProjectId(@Param("projectId") Long projectId,@Param("contractId") Long contractId);
+
+    BigDecimal getYearReturned(@Param("year") int year);
 }

+ 10 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml

@@ -18,7 +18,16 @@
     <select id="getListByProjectId" resultType="org.springblade.control.vo.ContractReturnedInfoVO">
         select
             ri.*,
-            (select name from blade_user WHERE id = ri.reminder_user) as reminderUserName
+            (IFNULL((select COUNT(1)  from c_plan_relation_returned prr WHERE ri.id = prr.returned_id and prr.plan_id = #{contractId}),0)) as 'isRelation' ,
+                (select name from blade_user WHERE id = ri.reminder_user) as reminderUserName
         from c_contract_returned_info ri where ri.project_id = #{projectId}
     </select>
+    <select id="getYearReturned" resultType="java.math.BigDecimal">
+        SELECT SUM(practical_returned_money)
+        from c_contract_returned_info
+        WHERE  is_deleted = 0
+        <if test="year != 0">
+            and DATE_FORMAT(practical_returned_time ,'%Y') = #{year}
+        </if>
+    </select>
 </mapper>

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

@@ -10,6 +10,7 @@ import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.ControlProjectInfoVO;
 import org.springblade.control.vo.DepartmentMonthPlanVO;
+import org.springblade.core.secure.BladeUser;
 
 import java.util.List;
 
@@ -26,4 +27,8 @@ public interface DepartmentMonthPlanMapper extends BaseMapper<DepartmentMonthPla
     String getDepartmentName(@Param("departmentType") Integer departmentType);
 
     List<DepartmentMonthPlanVO> getPage(IPage page,@Param("dto") ControlContractInfoDTO dto);
+
+    List<BladeUser> getDepartmentUserDict(@Param("type") Integer departmentType);
+
+    void deleteById2(@Param("id") Long id);
 }

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

@@ -1,7 +1,10 @@
 <?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.DepartmentMonthPlanMapper">
-
+    <delete id="deleteById2">
+        DELETE FROM c_department_month_plan
+        WHERE id = #{id}
+    </delete>
 
     <select id="getDepartmentDict" resultType="org.springblade.control.entity.DictInfo">
         select * from c_dict_info WHERE code = 'department_type' order by sort LIMIT 5
@@ -24,4 +27,7 @@
                     or pcb.plan_end_time BETWEEN dmp.plan_start_date AND dmp.plan_end_date)) as 'beginPlanTotal'
         FROM c_department_month_plan dmp
     </select>
+    <select id="getDepartmentUserDict" resultType="org.springblade.core.secure.BladeUser">
+
+    </select>
 </mapper>

+ 16 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanRelationReturnedMapper.java

@@ -0,0 +1,16 @@
+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.PlanRelationReturned;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:38
+ **/
+public interface PlanRelationReturnedMapper extends BaseMapper<PlanRelationReturned> {
+
+    void deleteRelation(@Param("returnedId") Long returnedId,@Param("planId") Long planId);
+}

+ 9 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/PlanRelationReturnedMapper.xml

@@ -0,0 +1,9 @@
+<?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.PlanRelationReturnedMapper">
+
+    <delete id="deleteRelation">
+        delete from c_plan_relation_returned
+        where plan_id = #{planId} and returned_id = #{returnedId}
+    </delete>
+</mapper>

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

@@ -10,6 +10,7 @@ import org.springblade.control.entity.*;
 import org.springblade.control.vo.*;
 import org.springblade.core.mp.support.Query;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
@@ -28,11 +29,11 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
 
     ProjectCostBudgetStats getBudgetTotalByProjectId(@Param("projectId") Long projectId);
 
-    ControlProjectInfoVO page(IPage page,@Param("dto") ControlProjectInfoDTO dto);
+    List<ControlProjectInfoVO> page(IPage page,@Param("dto") ControlProjectInfoDTO dto);
 
     List<ProjectCostBudgetVO2> getApprovePlan(@Param("id") Long id);
 
-    List<ProjectCostBudget> getAllChildrenPlan(@Param("id") Long id);
+    List<ProjectCostBudgetVO2> getAllChildrenPlan(@Param("id") Long id);
 
     void removeChildrenPlan(@Param("projectId") Long projectId);
 
@@ -55,4 +56,13 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<ProjectCostBudget> getProjectAllFinishedTask(@Param("projectId") Long projectId,@Param("costType") Integer costType);
 
     List<ProjectCostBudget> getAllPracticalBudgetByProjectId(@Param("projectId") Long projectId);
+
+    //获取一年人工支出
+    BigDecimal getYearStaffDisburse(@Param("year") int year);
+
+    List<ProjectCostBudget> getBudgetByYear(@Param("year") int y);
+
+    List<ProjectCostBudgetVO2> getPlanByMonth(@Param("date") String date);
+
+    List<ProjectCostBudget> getRiskPlan(@Param("projectId") Long projectId,@Param("costType") Integer costType);
 }

+ 53 - 6
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -24,7 +24,7 @@
                 (select di.id from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0)) as taskDetailValue,
             (select di.dict_name from c_dict_info di where di.type = 3 and di.code = pcb.post_type) as postTypeValue
         from c_project_cost_budget pcb
-        where pcb.project_id = #{budget.projectId}
+        where pcb.project_id = #{budget.projectId} and pcb.parent_id = 0
         <if test="budget.costType != null and budget.costType != ''">
             and pcb.cost_type = #{budget.costType}
         </if>
@@ -48,7 +48,7 @@
             pi.*,
             (select dict_name  from c_dict_info WHERE code = 'project_type' AND dict_value = pi.project_type) as projectTypeValue,
             (select dict_name  from c_dict_info WHERE code = 'project_server_type' AND dict_value = pi.project_server_type) as projectServerTypeValue,
-            IFNULL((select cpp.name from c_project_process cpp WHERE cpp.project_id = pi.id and cpp.start_time &lt;= NOW() order by cpp.sort desc limit 1),
+            IFNULL((select cpp.name from c_project_process cpp WHERE cpp.project_id = pi.id and cpp.process_start_time &lt;= NOW() order by cpp.sort desc limit 1),
                 (select cpp.name from c_project_process cpp WHERE cpp.project_id = pi.id order by cpp.sort limit 1)) as CurrentProcessName
         from c_control_project_info pi
         WHERE 1=1
@@ -67,12 +67,15 @@
     <select id="getApprovePlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
         SELECT
             pcb.*,
-            (select cri.returned_condition from c_contract_returned_info cri where cri.id = pcb.contract_returned_id) as returnedValue
+            (select cpp.name from c_project_process cpp where cpp.id = pcb.project_process) as projectProcessValue,
+            (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0) as budgetTypeValue,
+            (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.task_detail and di.parent_id =
+            (select di.id from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0)) as taskDetailValue,
+            (select cri.returned_condition from c_contract_returned_info cri where cri.id = pcb.contract_returned_id) as returnedValue,
+            (select di.dict_name from c_dict_info di where di.type = 3 and di.code = pcb.post_type) as postTypeValue
         FROM c_project_cost_budget pcb WHERE pcb.project_id = #{id} AND pcb.approve = 1
     </select>
-    <select id="getAllChildrenPlan" resultType="org.springblade.control.entity.ProjectCostBudget">
-        SELECT * FROM c_project_cost_budget  WHERE project_id = #{id} AND parent_id is not null
-    </select>
+
     <select id="getDepartmentPlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO">
         select pcb.*,
                case pcb.status
@@ -128,6 +131,50 @@
             resultType="org.springblade.control.entity.ProjectCostBudget">
         select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{projectId} and pcb.task_approve = 1
     </select>
+    <select id="getYearStaffDisburse" resultType="java.math.BigDecimal">
+        SELECT SUM(actual_total_money)
+        from c_project_cost_budget
+        WHERE  is_deleted = 0 and task_approve = 1
+        <if test="year != 0">
+            and DATE_FORMAT(plan_end_time ,'%Y') = #{year}
+        </if>
+    </select>
+    <select id="getAllChildrenPlan" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
+        SELECT pcb.plan_task_type,pcb.plan_task_desc,pcb.plan_target,pcb.plan_start_time,pcb.plan_end_time,pcb.plan_days,id,parent_id,
+               (select cpp.name from c_project_process cpp where cpp.id = pcb.project_process) as projectProcessValue,
+               (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0) as budgetTypeValue,
+               (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.task_detail and di.parent_id =
+                                                                                                                  (select di.id from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0)) as taskDetailValue
+        FROM c_project_cost_budget pcb WHERE pcb.project_id = #{id} AND pcb.parent_id > 0
+    </select>
+    <select id="getBudgetByYear" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select id,project_id,practical_finish_time ,actual_total_money  from c_project_cost_budget
+        WHERE is_deleted = 0 and task_approve = 1 and DATE_FORMAT(practical_finish_time ,'%Y') = #{year}
+    </select>
+    <select id="getPlanByMonth" resultType="org.springblade.control.vo.ProjectCostBudgetVO2">
+        select pcb.*,
+               (pcb.plan_days * (select bu.one_money from blade_user bu WHERE bu.id = pcb.task_user)) as 'planCountMoney',
+                (select cpi.name from c_control_project_info cpi WHERE cpi.id = pcb.project_id) as 'projectName'
+        from c_project_cost_budget pcb WHERE DATE_FORMAT(pcb.plan_start_time ,'%Y-%m') = #{date}
+                                         and pcb.task_user is not null and pcb.plan_days is not null
+    </select>
+    <select id="getRiskPlan" resultType="org.springblade.control.entity.ProjectCostBudget">
+        SELECT * from c_project_cost_budget WHERE plan_end_time &lt; NOW() and status in (2,3)
+        <if test="projectId != null">
+            and project_id = #{projectId}
+        </if>
+        <if test="costType != null">
+            and cost_type = #{costType}
+        </if>
+        UNION ALL
+        SELECT * from c_project_cost_budget WHERE plan_end_time &lt; practical_finish_time and status = 4
+        <if test="projectId != null">
+            and project_id = #{projectId}
+        </if>
+        <if test="costType != null">
+            and cost_type = #{costType}
+        </if>
+    </select>
 
 
 </mapper>

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

@@ -35,4 +35,6 @@ public interface ProjectInfoMapper extends BaseMapper<ControlProjectInfo> {
     List<DictInfo> getCostTypeDict();
 
     ControlProjectInfo getById(@Param("id") Long id);
+
+    List<ControlProjectInfo> listByYear(@Param("year") int year);
 }

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

@@ -77,6 +77,9 @@
     <select id="getById" resultType="org.springblade.control.entity.ControlProjectInfo">
         select * from c_control_project_info where id = #{id}
     </select>
+    <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>
 
 
 </mapper>

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

@@ -2,10 +2,8 @@ package org.springblade.control.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.control.dto.EMFinancialReimbursementInfoDTO;
-import org.springblade.control.dto.EMFinancialReimbursementInfoDTOBatch;
 import org.springblade.control.entity.EMFinancialReimbursementInfo;
 import org.springblade.control.vo.EMDraftGroupVO;
-import org.springblade.control.vo.EMDraftVO;
 import org.springblade.control.vo.EMFinancialReimbursementInfoVO;
 import org.springblade.core.mp.base.BaseService;
 

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

@@ -7,6 +7,7 @@ import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.*;
 import org.springblade.core.mp.base.BaseService;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -31,4 +32,16 @@ public interface IAnnualBudgetService extends BaseService<AnnualBudget> {
     AnnualBudgetVO2 preview(Long id);
 
     List<DictInfoVO> getSecondSubject();
+
+    AnnualBudgetVO3 portalAnnualTarget();
+
+    Map<String, BigDecimal> portalAnnualCost(String year);
+
+    List<String> yearList(Integer type);
+
+    List<AnnualProjectCostVO> portalAnnualProjectCost(String year);
+
+    List<DeptMonthPlanRatioVO> portalProjectMonthRatio(String date);
+
+    List<AllProjectStatsVO> portalRiskPlan();
 }

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

@@ -12,6 +12,7 @@ import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 import org.springblade.system.entity.DictBiz;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -37,4 +38,6 @@ public interface IContractInfoService extends BaseService<ControlContractInfo> {
     List<ControlContractInfoVO> getPage(ControlContractInfoDTO dto,Query query);
 
     List<ControlContractInfo> getList();
+
+    BigDecimal getYearContractMoney(int year);
 }

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

@@ -29,5 +29,11 @@ public interface IContractReturnedInfoService extends BaseService<ContractReturn
 
     List<ContractReturnedInfoVO> getListByContractId(Long contractId);
 
-    List<ContractReturnedInfoVO> getListByProjectId(Long projectId);
+    /**
+     * 根据项目ID获取合同回款列表
+     */
+    List<ContractReturnedInfoVO> getListByProjectId(Long projectId,Long planId);
+
+    //获取指定一年的回款
+    BigDecimal getYearReturned(int year);
 }

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

@@ -11,6 +11,7 @@ import org.springblade.control.vo.ProjectCostBudgetVO;
 import org.springblade.control.vo.ProjectProcessVO;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 
 import java.util.List;
 
@@ -30,4 +31,8 @@ public interface IDepartmentMonthPlanService extends BaseService<DepartmentMonth
     List<ProjectCostBudgetVO> getDepartmentPlan(DepartmentMonthPlan plan);
 
     void updateDepartmentPlan(ProjectCostBudgetDTO dto);
+
+    List<BladeUser> getDepartmentUserDict(Integer departmentType);
+
+    void deleteById(Long id);
 }

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

@@ -0,0 +1,18 @@
+package org.springblade.control.service;
+
+import org.springblade.control.entity.AnnualBudgetDisburse;
+import org.springblade.control.entity.PlanRelationReturned;
+import org.springblade.core.mp.base.BaseService;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 13:41
+ **/
+public interface IPlanRelationReturnedService extends BaseService<PlanRelationReturned> {
+
+    /**
+     * 计划关联回款
+     */
+    String relationPlanAndReturned(Long returnedId, Long planId, Integer type);
+}

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

@@ -10,10 +10,12 @@ import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.entity.ProjectCostBudgetStats;
 import org.springblade.control.vo.ControlProjectInfoVO;
 import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.vo.ProjectCostBudgetVO2;
 import org.springblade.control.vo.ProjectCostBudgetVO3;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.core.mp.support.Query;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
@@ -33,7 +35,7 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     void deleteByProjectId(Long projectId);
     //分页获取列表
-    ControlProjectInfoVO page(ControlProjectInfoDTO dto, Query query);
+    List<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query);
     //根据id获取项目计划
     ProjectCostBudgetVO getPlanByProjectId(Long id);
     //修改项目计划
@@ -58,4 +60,12 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType);
 
     List<ProjectCostBudget> getAllPracticalBudgetByProjectId(Long projectId);
+
+    BigDecimal getYearStaffDisburse(int year);
+
+    List<ProjectCostBudget> getBudgetByYear(int y);
+
+    List<ProjectCostBudgetVO2> getPlanByMonth(String date);
+
+    List<ProjectCostBudget> getRiskPlan(Long projectId,Integer costType);
 }

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

@@ -37,4 +37,6 @@ public interface IProjectInfoService extends BaseService<ControlProjectInfo> {
     List<AllProjectStatsVO> ProjectListStats();
 
     List<AllProjectStatsVO> ProjectCostTypeStats(Long id);
+
+    List<ControlProjectInfo> listByYear(int year);
 }

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

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

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

@@ -16,6 +16,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.rmi.ServerException;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -32,6 +34,16 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
 
     private final IAnnualBudgetDisburseService disburseService;
 
+    private final IContractReturnedInfoService returnedInfoService;
+
+    private final IProjectCostBudgetService budgetService;
+
+    private final IDepartmentMonthPlanService monthPlanService;
+
+    private final IContractInfoService contractInfoService;
+
+    private final IProjectInfoService projectInfoService;
+
     /**
      * 新增年度经营预算
      * @param dto
@@ -50,11 +62,11 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         BigDecimal contractTotal = map2.get("1");
         BigDecimal planReturnedTotal = map2.get("2");
 
-        //总经营预算
+        //总经营预算,所有支出总额
         dto.setTotalBudget(disburseTotal);
-        //年度合同指标
-        dto.setAnnualContractTarget(contractTotal);
-        //年度利润指标
+        //年度合同指标,预计本年度回款总额
+        dto.setAnnualContractTarget(planReturnedTotal);
+        //年度利润指标, 合同指标减经营预算
         dto.setAnnualProfitTarget(planReturnedTotal.subtract(disburseTotal));
         //人工成本
         dto.setStaffCost(staffTotal);
@@ -290,6 +302,264 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         return allBudgetSubject;
     }
 
+    /**
+     * 门户-年度指标统计 ,统计今年的
+     */
+    @Override
+    public AnnualBudgetVO3 portalAnnualTarget() {
+        AnnualBudgetVO3 vo3 = new AnnualBudgetVO3();
+        //获取今年
+        int year = LocalDate.now().getYear();
+        //获取今年的年度预算
+        AnnualBudget annualBudget = baseMapper.getThisYearBudget(year);
+        if (annualBudget == null){
+            throw new ServiceException("请先做年度预算");
+        }
+        //年度利润指标
+        if (annualBudget.getAnnualContractTarget() == null){
+            annualBudget.setAnnualContractTarget(new BigDecimal(0));
+        }
+        if (annualBudget.getAnnualProfitTarget() == null){
+            annualBudget.setAnnualProfitTarget(new BigDecimal(0));
+        }
+        vo3.setAnnualProfitTarget(annualBudget.getAnnualProfitTarget());
+        //年度合同指标
+        vo3.setAnnualContractTarget(annualBudget.getAnnualContractTarget());
+        //获取今年的已收入:合同回款
+        BigDecimal yearReturned = returnedInfoService.getYearReturned(year);
+        vo3.setYearReturned(yearReturned);
+        //统计今年的已盈利:已收入-支出 ,目前已支出只统计闭环的计划
+        //获取一年人工支出
+        BigDecimal yearStaffDisburse = budgetService.getYearStaffDisburse(year);
+        vo3.setYearProfit(yearReturned.subtract(yearStaffDisburse));
+        //合同进度统计
+        if (vo3.getAnnualContractTarget() == null || vo3.getAnnualContractTarget().compareTo(BigDecimal.ZERO) == 0 || vo3.getYearReturned().compareTo(BigDecimal.ZERO) == 0){
+            vo3.setContractSchedule(0);
+        }else {
+            vo3.setContractSchedule(vo3.getYearReturned().divide(vo3.getAnnualContractTarget(),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+        }
+        //利润进度统计
+        if (vo3.getAnnualProfitTarget() == null || vo3.getAnnualProfitTarget().compareTo(BigDecimal.ZERO) == 0 || vo3.getYearProfit().compareTo(BigDecimal.ZERO) == 0){
+            vo3.setProfitSchedule(0);
+        }else {
+            vo3.setProfitSchedule(vo3.getYearProfit().divide(vo3.getAnnualProfitTarget(),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue());
+        }
+        return vo3;
+    }
+
+    /**
+     * 门户-年度各项费用统计 ,如果全部就传0
+     */
+    @Override
+    public Map<String, BigDecimal> portalAnnualCost(String year) {
+        int y;
+        if ("汇总所有".equals(year)){
+            y = 0;
+        }else {
+            y = Integer.parseInt(year.substring(0,4));
+        }
+        Map<String,BigDecimal> map = new HashMap<>();
+        //总合同:当年所有合同金额
+        BigDecimal yearContractMoney = contractInfoService.getYearContractMoney(y);
+        map.put("yearContractMoney",yearContractMoney);
+        //总实际收入:当年所有回款
+        BigDecimal yearReturned = returnedInfoService.getYearReturned(y);
+        map.put("yearReturned",yearReturned);
+        //总实际支出:当年所有报销支出,和人工支出
+        BigDecimal yearStaffDisburse = budgetService.getYearStaffDisburse(y);
+        map.put("yearStaffDisburse",yearStaffDisburse);
+        //总计划支出:年度预算总计划支出
+        if (y == 0){
+            List<AnnualBudget> list = baseMapper.getAllYearBudget(y);
+            BigDecimal decimal = new BigDecimal(0);
+            for (AnnualBudget budget : list) {
+                if (budget.getTotalBudget() != null){
+                    decimal = decimal.add(budget.getTotalBudget());
+                }
+            }
+            map.put("totalBudget", decimal);
+        }else {
+            AnnualBudget annualBudget = baseMapper.getThisYearBudget(y);
+            if (annualBudget != null && annualBudget.getTotalBudget() != null) {
+                BigDecimal totalBudget = annualBudget.getTotalBudget();
+                map.put("totalBudget", totalBudget);
+            }else {
+                map.put("totalBudget", new BigDecimal(0));
+            }
+        }
+        return map;
+    }
+
+    @Override
+    public List<String> yearList(Integer type) {
+        List<String> list = new ArrayList<>();
+        Integer year = baseMapper.yearList();
+        if (year != null) {
+            int thisYear = LocalDate.now().getYear();
+            for (int i = year; i <= thisYear; i++) {
+                list.add(i + "年");
+            }
+        }
+        if (type != 1) {
+            list.add("汇总所有");
+        }
+        return list;
+    }
+
+    /**
+     * 门户-年度各项目支出对比
+     */
+    @Override
+    public List<AnnualProjectCostVO> portalAnnualProjectCost(String year) {
+        int y = Integer.parseInt(year.substring(0,4));
+        //查出指定年的项目
+        List<ControlProjectInfo> list = projectInfoService.listByYear(y);
+        if (list == null || list.size() <= 0){
+            return null;
+        }
+        List<AnnualProjectCostVO> mapList = new ArrayList<>();
+        //按年查询所有支出,按照项目分组,然后再按照月份分组统计
+        //目前查询人工支出
+        List<ProjectCostBudget> budgetByYear = budgetService.getBudgetByYear(y);
+        Map<Long, List<ProjectCostBudget>> map = budgetByYear.parallelStream()
+                .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
+        for (ControlProjectInfo project : list) {
+            AnnualProjectCostVO vo = new AnnualProjectCostVO();
+            List<Integer> integerList = new ArrayList<>();
+            List<ProjectCostBudget> budgets = map.get(project.getId());
+            for (int i = 1; i <= 12; i++) {
+                BigDecimal big = new BigDecimal(0);
+                if (budgets != null && budgets.size() > 0) {
+                    for (ProjectCostBudget budget : budgets) {
+                        if (budget.getPracticalFinishTime().getMonthValue() == i) {
+                            big = big.add(budget.getActualTotalMoney());
+                        }
+                    }
+                }
+                integerList.add(big.intValue());
+            }
+            vo.setName(project.getName());
+            vo.setValue(integerList);
+            mapList.add(vo);
+        }
+        return mapList;
+    }
+
+    /**
+     * 门户-当月各部门计划安排比重
+     */
+    @Override
+    public List<DeptMonthPlanRatioVO> portalProjectMonthRatio(String date) {
+        //获取当月所有计划,和计划工资
+        List<ProjectCostBudgetVO2> planByMonth = budgetService.getPlanByMonth(date);
+        if (planByMonth != null || planByMonth.size() >= 0) {
+            List<DeptMonthPlanRatioVO> vos = new ArrayList<>();
+            //月计划包含的项目
+            Set<Long> projectIds = new HashSet<>();
+            //每个部门投入总和
+            BigDecimal businessCount = new BigDecimal(0);
+            BigDecimal devCount = new BigDecimal(0);
+            BigDecimal maintainCount = new BigDecimal(0);
+            //循环获取项目,获取每个部门总和
+            for (ProjectCostBudgetVO2 plan : planByMonth) {
+                projectIds.add(plan.getProjectId());
+                if (plan.getCostType() == 3) {
+                    businessCount = businessCount.add(plan.getPlanCountMoney());
+                } else if (plan.getCostType() == 2) {
+                    devCount = devCount.add(plan.getPlanCountMoney());
+                } else if (plan.getCostType() == 4) {
+                    maintainCount = maintainCount.add(plan.getPlanCountMoney());
+                }
+            }
+            //根据项目再一个一个存入
+            Map<Long, List<ProjectCostBudgetVO2>> projectMap = planByMonth.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getProjectId));
+            List<ControlProjectInfo> projectInfos = projectInfoService.listByIds(projectIds);
+            for (ControlProjectInfo projectInfo : projectInfos) {
+                DeptMonthPlanRatioVO vo = new DeptMonthPlanRatioVO();
+                BigDecimal business = new BigDecimal(0);
+                BigDecimal dev = new BigDecimal(0);
+                BigDecimal maintain = new BigDecimal(0);
+                vo.setProjectName(projectInfo.getName());
+                List<ProjectCostBudgetVO2> list = projectMap.get(projectInfo.getId());
+                for (ProjectCostBudgetVO2 vo2 : list) {
+                    if (vo2.getCostType() == 3) {
+                        business = business.add(vo2.getPlanCountMoney());
+                    } else if (vo2.getCostType() == 2) {
+                        dev = dev.add(vo2.getPlanCountMoney());
+                    } else if (vo2.getCostType() == 4) {
+                        maintain = maintain.add(vo2.getPlanCountMoney());
+                    }
+                }
+                //设置投入比
+                if (new BigDecimal(0).compareTo(businessCount) != 0){
+                    vo.setBusinessRatio(business.divide(businessCount, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue() + "%");
+                }
+                if (new BigDecimal(0).compareTo(devCount) != 0) {
+                    vo.setDevRatio(dev.divide(devCount, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue() + "%");
+                }
+                if (new BigDecimal(0).compareTo(maintainCount) != 0) {
+                    vo.setMaintainRatio(maintain.divide(maintainCount, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).intValue() + "%");
+                }
+                //插入结果集
+                vos.add(vo);
+            }
+            return vos;
+        }
+        return null;
+    }
+
+    /**
+     * 门户-风险计划
+     */
+    @Override
+    public List<AllProjectStatsVO> portalRiskPlan() {
+        //获取所有风险计划
+        List<ProjectCostBudget> riskPlan = budgetService.getRiskPlan(null,null);
+        if (riskPlan == null || riskPlan.size() <= 0) {
+            throw new ServiceException("暂无风险计划");
+        }
+        List<AllProjectStatsVO> vos = new ArrayList<>();
+        //获取部门映射值
+        List<DictInfo> costTypeDict = monthPlanService.getDepartmentDict();
+        Map<Integer, List<DictInfo>> collect = costTypeDict.parallelStream()
+                .collect(Collectors.groupingBy(DictInfo::getDictValue));
+        //风险计划按项目分组,再按照部门分组,再统计计划总数
+        Map<Long, List<ProjectCostBudget>> map = riskPlan.parallelStream()
+                .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
+        List<ControlProjectInfo> projectInfos = projectInfoService.listByIds(map.keySet());
+        for (ControlProjectInfo info : projectInfos) {
+            //获取项目延期计划
+            List<ProjectCostBudget> budgets = map.get(info.getId());
+            //通过部门分组
+            Map<Integer, List<ProjectCostBudget>> listMap = budgets.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
+            //添加进结果集
+            for (Integer integer : listMap.keySet()) {
+                AllProjectStatsVO vo = new AllProjectStatsVO();
+                vo.setProjectName(info.getName());
+                vo.setProjectId(info.getId());
+                vo.setCostType(integer);
+                //如果不为管理支出和外包劳务,则直接设置
+                if (integer != 5 && integer != 6){
+                    vo.setCostTypeValue(collect.get(integer).get(0).getDictName());
+                    vo.setTimeOutPlanTotal(listMap.get(integer).size());
+                }else {
+                    vo.setCostTypeValue(collect.get(5).get(0).getDictName());
+                    if (listMap.get(5) != null && listMap.get(6) != null){
+                        vo.setTimeOutPlanTotal(listMap.get(5).size() + listMap.get(6).size());
+                    }else if (listMap.get(5) != null){
+                        vo.setTimeOutPlanTotal(listMap.get(5).size());
+                    }else if (listMap.get(6) != null){
+                        vo.setTimeOutPlanTotal(listMap.get(6).size());
+                    }
+                }
+                vos.add(vo);
+            }
+        }
+        return vos;
+    }
+
     /**
      * 统计支出 1支出总和2工资总和
      */

+ 14 - 53
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java

@@ -156,63 +156,24 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
                         var = true;
                     }
                 }
-                if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getPersonnelUser())) {
-                    //新增审批任务
-                    if (ObjectUtil.isEmpty(SecureUtil.getUserName())) {
-                        throw new ServiceException("获取当前用户信息失败,请联系管理员");
-                    }
-                    TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                    taskProcessInfo.setId(SnowFlakeUtil.getId());
-                    taskProcessInfo.setStatus(1); //待审批
-                    taskProcessInfo.setReportDate(new Date());
-                    taskProcessInfo.setTaskType(9); //出差审批
-                    taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【出差审批】审批");
-                    //上报人
-                    taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                    //审批人
-                    List<String> auditUserIds = new LinkedList<>();
-                    EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                    auditUserIds.add(responsibleObj.getUserId());
-                    EMProcessTaskUser personnelUser = dto.getPersonnelUser(); //人事
-                    auditUserIds.add(personnelUser.getUserId());
-                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                    for (String userId : auditUserIds) {
-                        if (StringUtils.isNotEmpty(userId)) {
-                            nonEmptyAuditUserIds.add(userId);
-                        }
-                    }
-                    if (nonEmptyAuditUserIds.size() == 0) {
-                        taskProcessInfo.setAuditUserIds(null);
-                    } else {
-                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                    }
 
+                //新增审批任务
+                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                taskProcessService.buildTaskProcessInfoImpl(9, taskProcessInfo);
 
-                    //抄送人
-                    if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                        List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                        taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                    }
-                    taskProcessService.save(taskProcessInfo);
-
-                    //新增信息
-                    dto.setIsTemp(1); //提交
-                    dto.setStatus(1); //待审批
-                    if (var) {
-                        this.save(dto);
-                    } else {
-                        this.saveOrUpdate(dto);
-                    }
-
-                    //新增审批任务关联信息
-                    jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",9)");
-
-                    //关联项目id,项目计划预算等,在任务闭环时计算推送
-
+                //新增信息
+                dto.setIsTemp(1); //提交
+                dto.setStatus(1); //待审批
+                if (var) {
+                    this.save(dto);
                 } else {
-                    throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                    this.saveOrUpdate(dto);
                 }
+
+                //新增审批任务关联信息
+                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",9)");
+
+                //关联项目id,项目计划预算等,在任务闭环时计算推送
             }
         }
         return true;

+ 14 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java

@@ -132,4 +132,18 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     public List<ControlContractInfo> getList() {
         return baseMapper.getList();
     }
+
+    /**
+     * 获取当年所有合同金额总和
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getYearContractMoney(int year) {
+        BigDecimal decimal = baseMapper.getYearContractMoney(year);
+        if (decimal == null){
+            return new BigDecimal(0);
+        }
+        return decimal;
+    }
 }

+ 16 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java

@@ -80,7 +80,21 @@ public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractRet
     }
 
     @Override
-    public List<ContractReturnedInfoVO> getListByProjectId(Long projectId) {
-        return baseMapper.getListByProjectId(projectId);
+    public List<ContractReturnedInfoVO> getListByProjectId(Long projectId,Long contractId) {
+        return baseMapper.getListByProjectId(projectId,contractId);
+    }
+
+    /**
+     * 获取指定一年的回款
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getYearReturned(int year) {
+        BigDecimal yearReturned = baseMapper.getYearReturned(year);
+        if (yearReturned == null){
+            return new BigDecimal(0);
+        }
+        return yearReturned;
     }
 }

+ 15 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java

@@ -18,6 +18,7 @@ import org.springblade.control.vo.ProjectProcessVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -152,4 +153,18 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
             throw new ServiceException("暂无数据,无需保存");
         }
     }
+
+    @Override
+    public List<BladeUser> getDepartmentUserDict(Integer departmentType) {
+        return baseMapper.getDepartmentUserDict(departmentType);
+    }
+
+    /**
+     * 删除部门月计划名称
+     * @param id
+     */
+    @Override
+    public void deleteById(Long id) {
+        baseMapper.deleteById2(id);
+    }
 }

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

@@ -41,6 +41,9 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
     public DepartmentPlanLog getPlanInPause(Long id) {
         //获取计划最新的执行情况
         DepartmentPlanLog log = baseMapper.getNewestPlanLog(id);
+        if (log == null){
+            throw new ServiceException("暂未开启计划");
+        }
         //设置中途暂停计划日期为今天
         log.setPauseTime(LocalDate.now());
         //计算暂停日期和,中途开启计划的开始日期,之前的工作天数,如果是第一次暂停,则中途开启为null,则计算计划实际开始日期
@@ -81,6 +84,9 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
     public DepartmentPlanLog getPlanInOpen(Long id) {
         //获取计划最新的执行情况
         DepartmentPlanLog log = baseMapper.getNewestPlanLog(id);
+        if (log == null){
+            throw new ServiceException("暂未开启计划");
+        }
         //先设置上一次开启计划工时,因为下面会修改
         if (log.getOpenPlanStartEndDays() == null){
             log.setLastOpenPlanStartEndDays(null);

+ 14 - 57
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -172,67 +172,24 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
                         dto.setFrNumber(this.getNumber());
                     }
                 }
-                if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
-                    //新增审批任务
-                    TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                    taskProcessInfo.setId(SnowFlakeUtil.getId());
-                    taskProcessInfo.setStatus(1); //待审批
-                    taskProcessInfo.setReportDate(new Date());
-                    taskProcessInfo.setTaskType(2); //报销审批
-                    taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【报销审批】审批");
-                    //上报人
-                    taskProcessInfo.setReportUserId(SecureUtil.getUserId());
 
-                    //审批人
-                    List<String> auditUserIds = new LinkedList<>();
-                    EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                    auditUserIds.add(responsibleObj.getUserId());
-                    EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                    auditUserIds.add(financeObj.getUserId());
-                    if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
-                        EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
-                        auditUserIds.add(finalConfirmationObj.getUserId());
-                    }
-                    EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
-                    auditUserIds.add(cashierObj.getUserId());
-
-                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                    for (String userId : auditUserIds) {
-                        if (StringUtils.isNotEmpty(userId)) {
-                            nonEmptyAuditUserIds.add(userId);
-                        }
-                    }
-                    if (nonEmptyAuditUserIds.size() == 0) {
-                        taskProcessInfo.setAuditUserIds(null);
-                    } else {
-                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                    }
-
-
-                    //抄送人
-                    if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                        List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                        taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                    }
-                    taskProcessService.save(taskProcessInfo);
-
-                    //新增信息
-                    dto.setIsTemp(1); //提交
-                    dto.setStatus(1); //待审批
-                    if (var) {
-                        this.save(dto);
-                    } else {
-                        this.saveOrUpdate(dto);
-                    }
-
-                    //新增审批任务关联信息
-                    jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",2)");
-
-                    //关联项目预算budgetPlanIds目前只做存储,在审批完成后闭环时再进行计算推送
+                //新增审批任务
+                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                taskProcessService.buildTaskProcessInfoImpl(2, taskProcessInfo);
 
+                //新增信息
+                dto.setIsTemp(1); //提交
+                dto.setStatus(1); //待审批
+                if (var) {
+                    this.save(dto);
                 } else {
-                    throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                    this.saveOrUpdate(dto);
                 }
+
+                //新增审批任务关联信息
+                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",2)");
+
+                //关联项目预算budgetPlanIds目前只做存储,在审批完成后闭环时再进行计算推送
             }
         }
         return true;

+ 15 - 54
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java

@@ -60,9 +60,6 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
                     break;
                 }
             }
-
-            vo.setInvoiceContentType(null); //发票内容字典type TODO
-
             for (ControlProjectInfo projectInfo : controlProjectInfos) {
                 if (projectInfo.getId().equals(vo.getProjectId())) {
                     vo.setProjectName(projectInfo.getName());
@@ -154,62 +151,26 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
                     dto.setInvoiceNumber(this.getNumber());
                 }
             }
-            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser())) {
-                //新增审批任务
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(7); //发票审批
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【发票审批】审批");
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                auditUserIds.add(responsibleObj.getUserId());
-                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                auditUserIds.add(financeObj.getUserId());
 
-                List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                for (String userId : auditUserIds) {
-                    if (StringUtils.isNotEmpty(userId)) {
-                        nonEmptyAuditUserIds.add(userId);
-                    }
-                }
-                if (nonEmptyAuditUserIds.size() == 0) {
-                    taskProcessInfo.setAuditUserIds(null);
-                } else {
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                }
-
-                //抄送人
-                if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                    List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                    taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                }
-                taskProcessService.save(taskProcessInfo);
-
-                //新增信息
-                dto.setIsTemp(1); //提交
-                dto.setStatus(1); //待审批
-                if (var) {
-                    this.save(dto);
-                } else {
-                    this.saveOrUpdate(dto);
-                }
+            //新增审批任务
+            TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+            taskProcessService.buildTaskProcessInfoImpl(7, taskProcessInfo);
 
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",7)");
+            //新增信息
+            dto.setIsTemp(1); //提交
+            dto.setStatus(1); //待审批
+            if (var) {
+                this.save(dto);
+            } else {
+                this.saveOrUpdate(dto);
+            }
 
-                //存储关联项目id,审批闭环后处理项目相关业务
+            //新增审批任务关联信息
+            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",7)");
 
-                return true;
+            //存储关联项目id,审批闭环后处理项目相关业务
 
-            } else {
-                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
-            }
+            return true;
         }
         return false;
     }

+ 14 - 59
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java

@@ -154,69 +154,24 @@ public class EMLoanServiceImpl extends BaseServiceImpl<ExMLoanMapper, EMLoanInfo
                     dto.setLoanNumber(this.getNumber());
                 }
             }
-            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
-                //新增审批任务
-                if (ObjectUtil.isEmpty(SecureUtil.getUserName())) {
-                    throw new ServiceException("获取当前用户信息失败,请联系管理员");
-                }
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(4); //借款审批
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【借款审批】审批");
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                auditUserIds.add(responsibleObj.getUserId());
-                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                auditUserIds.add(financeObj.getUserId());
-                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
-                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
-                    auditUserIds.add(finalConfirmationObj.getUserId());
-                }
-                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
-                auditUserIds.add(cashierObj.getUserId());
-
-                List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                for (String userId : auditUserIds) {
-                    if (StringUtils.isNotEmpty(userId)) {
-                        nonEmptyAuditUserIds.add(userId);
-                    }
-                }
-                if (nonEmptyAuditUserIds.size() == 0) {
-                    taskProcessInfo.setAuditUserIds(null);
-                } else {
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                }
-
-                //抄送人
-                if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                    List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                    taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                }
-                taskProcessService.save(taskProcessInfo);
-
-                //新增信息
-                dto.setIsTemp(1); //提交
-                dto.setStatus(1); //待审批
-                if (var) {
-                    this.save(dto);
-                } else {
-                    this.saveOrUpdate(dto);
-                }
 
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",4)");
-
-                return true;
+            //新增审批任务
+            TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+            taskProcessService.buildTaskProcessInfoImpl(4, taskProcessInfo);
 
+            //新增信息
+            dto.setIsTemp(1); //提交
+            dto.setStatus(1); //待审批
+            if (var) {
+                this.save(dto);
             } else {
-                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                this.saveOrUpdate(dto);
             }
+
+            //新增审批任务关联信息
+            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",4)");
+
+            return true;
         }
         return false;
     }

+ 15 - 57
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java

@@ -146,68 +146,26 @@ public class EMOutsourcingPayServiceImpl extends BaseServiceImpl<ExMOutsourcingP
                     var = true;
                 }
             }
-            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
-                //新增审批任务
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(8); //外包支付
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【外包支付】审批");
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
 
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                auditUserIds.add(responsibleObj.getUserId());
-                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                auditUserIds.add(financeObj.getUserId());
-                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
-                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
-                    auditUserIds.add(finalConfirmationObj.getUserId());
-                }
-                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
-                auditUserIds.add(cashierObj.getUserId());
+            //新增审批任务
+            TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+            taskProcessService.buildTaskProcessInfoImpl(8, taskProcessInfo);
 
-                List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                for (String userId : auditUserIds) {
-                    if (StringUtils.isNotEmpty(userId)) {
-                        nonEmptyAuditUserIds.add(userId);
-                    }
-                }
-                if (nonEmptyAuditUserIds.size() == 0) {
-                    taskProcessInfo.setAuditUserIds(null);
-                } else {
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                }
-
-                //抄送人
-                if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                    List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                    taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                }
-                taskProcessService.save(taskProcessInfo);
-
-                //新增信息
-                dto.setIsTemp(1); //提交
-                dto.setStatus(1); //待审批
-                if (var) {
-                    this.save(dto);
-                } else {
-                    this.saveOrUpdate(dto);
-                }
-
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",8)");
+            //新增信息
+            dto.setIsTemp(1); //提交
+            dto.setStatus(1); //待审批
+            if (var) {
+                this.save(dto);
+            } else {
+                this.saveOrUpdate(dto);
+            }
 
-                //关联项目id只做存储,任务闭环时在进行业务计算
+            //新增审批任务关联信息
+            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",8)");
 
-                return true;
+            //关联项目id只做存储,任务闭环时在进行业务计算
 
-            } else {
-                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
-            }
+            return true;
         }
         return false;
     }

+ 16 - 57
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java

@@ -127,67 +127,26 @@ public class EMPayServiceImpl extends BaseServiceImpl<ExMPayMapper, EMPayInfo> i
                     var = true;
                 }
             }
-            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
-                //新增审批任务
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(3); //支付审批
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【支付审批】审批");
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                auditUserIds.add(responsibleObj.getUserId());
-                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                auditUserIds.add(financeObj.getUserId());
-                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
-                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
-                    auditUserIds.add(finalConfirmationObj.getUserId());
-                }
-                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
-                auditUserIds.add(cashierObj.getUserId());
-
-                List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                for (String userId : auditUserIds) {
-                    if (StringUtils.isNotEmpty(userId)) {
-                        nonEmptyAuditUserIds.add(userId);
-                    }
-                }
-                if (nonEmptyAuditUserIds.size() == 0) {
-                    taskProcessInfo.setAuditUserIds(null);
-                } else {
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                }
-
-                //抄送人
-                if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                    List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                    taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                }
-                taskProcessService.save(taskProcessInfo);
-
-                //新增信息
-                dto.setIsTemp(1); //提交
-                dto.setStatus(1); //待审批
-                if (var) {
-                    this.save(dto);
-                } else {
-                    this.saveOrUpdate(dto);
-                }
 
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",3)");
+            //新增审批任务
+            TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+            taskProcessService.buildTaskProcessInfoImpl(3, taskProcessInfo);
 
-                //关联项目、合同项目提成等目前只做存储,在审批完成后闭环时再进行计算推送
-
-                return true;
+            //新增信息
+            dto.setIsTemp(1); //提交
+            dto.setStatus(1); //待审批
+            if (var) {
+                this.save(dto);
             } else {
-                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                this.saveOrUpdate(dto);
             }
+
+            //新增审批任务关联信息
+            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",3)");
+
+            //关联项目、合同项目提成等目前只做存储,在审批完成后闭环时再进行计算推送
+
+            return true;
         }
         return false;
     }

+ 12 - 54
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java

@@ -154,64 +154,22 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
                         var = true;
                     }
                 }
-                if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser())) {
-                    //新增审批任务
-                    TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                    taskProcessInfo.setId(SnowFlakeUtil.getId());
-                    taskProcessInfo.setStatus(1); //待审批
-                    taskProcessInfo.setReportDate(new Date());
-                    taskProcessInfo.setTaskType(5); //采购审批
-                    taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【采购审批】审批");
-                    //上报人
-                    taskProcessInfo.setReportUserId(SecureUtil.getUserId());
 
-                    //审批人
-                    List<String> auditUserIds = new LinkedList<>();
-                    EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                    auditUserIds.add(responsibleObj.getUserId());
-                    EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
-                    auditUserIds.add(financeObj.getUserId());
-                    if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
-                        EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
-                        auditUserIds.add(finalConfirmationObj.getUserId());
-                    }
-                    EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
-                    auditUserIds.add(cashierObj.getUserId());
-
-                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                    for (String userId : auditUserIds) {
-                        if (StringUtils.isNotEmpty(userId)) {
-                            nonEmptyAuditUserIds.add(userId);
-                        }
-                    }
-                    if (nonEmptyAuditUserIds.size() == 0) {
-                        taskProcessInfo.setAuditUserIds(null);
-                    } else {
-                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                    }
-
-                    //抄送人
-                    if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                        List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                        taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                    }
-                    taskProcessService.save(taskProcessInfo);
-
-                    //新增信息
-                    dto.setIsTemp(1); //提交
-                    dto.setStatus(1); //待审批
-                    if (var) {
-                        this.save(dto);
-                    } else {
-                        this.saveOrUpdate(dto);
-                    }
-
-                    //新增审批任务关联信息
-                    jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",5)");
+                //新增审批任务
+                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                taskProcessService.buildTaskProcessInfoImpl(5, taskProcessInfo);
 
+                //新增信息
+                dto.setIsTemp(1); //提交
+                dto.setStatus(1); //待审批
+                if (var) {
+                    this.save(dto);
                 } else {
-                    throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                    this.saveOrUpdate(dto);
                 }
+
+                //新增审批任务关联信息
+                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",5)");
             }
         }
         return true;

+ 20 - 49
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java

@@ -20,6 +20,7 @@ import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.system.entity.Dept;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.beans.BeanUtils;
@@ -46,13 +47,19 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
         queryWrapper.lambda().eq(EMUseCarInfo::getIsTemp, 1);
         IPage<EMUseCarInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMUseCarInfo::getCreateTime));
         Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        List<Dept> deptList = jdbcTemplate.query("select id,dept_name from blade_dept where tenant_id = 003077 and dept_type = 2", new BeanPropertyRowMapper<>(Dept.class));
         return pages.convert(obj -> {
             EMUseCarInfoVO vo = new EMUseCarInfoVO();
             BeanUtils.copyProperties(obj, vo);
             vo.setCreateName(userMap.get(vo.getCreateUser()));
             vo.setApprovalStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : (vo.getStatus().equals(3) ? "已驳回" : "未上报")));
             vo.setApprovalResultName(vo.getApprovalStatusName().equals("已审批") || vo.getApprovalStatusName().equals("已驳回") ? "已通过" : "未通过");
-            vo.setUcOrgName(""); //TODO 部门
+
+            for (Dept dept : deptList) {
+                if (ObjectUtil.isNotEmpty(obj.getUcOrgId()) && obj.getUcOrgId().equals(dept.getId())) {
+                    vo.setUcOrgName(dept.getDeptName());
+                }
+            }
 
             if (ObjectUtil.isNotEmpty(obj.getUseStartDate()) && ObjectUtil.isNotEmpty(obj.getUseEndDate())) {
                 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
@@ -156,58 +163,22 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
                         var = true;
                     }
                 }
-                if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getPersonnelUser())) {
-                    //新增审批任务
-                    TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                    taskProcessInfo.setId(SnowFlakeUtil.getId());
-                    taskProcessInfo.setStatus(1); //待审批
-                    taskProcessInfo.setReportDate(new Date());
-                    taskProcessInfo.setTaskType(6); //用车审批
-                    taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【用车审批】审批");
-                    //上报人
-                    taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                    //审批人
-                    List<String> auditUserIds = new LinkedList<>();
-                    EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                    auditUserIds.add(responsibleObj.getUserId());
-                    EMProcessTaskUser personnelUser = dto.getPersonnelUser(); //人事
-                    auditUserIds.add(personnelUser.getUserId());
 
-                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
-                    for (String userId : auditUserIds) {
-                        if (StringUtils.isNotEmpty(userId)) {
-                            nonEmptyAuditUserIds.add(userId);
-                        }
-                    }
-                    if (nonEmptyAuditUserIds.size() == 0) {
-                        taskProcessInfo.setAuditUserIds(null);
-                    } else {
-                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-                    }
-
-                    //抄送人
-                    if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                        List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                        taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                    }
-                    taskProcessService.save(taskProcessInfo);
-
-                    //新增信息
-                    dto.setIsTemp(1); //提交
-                    dto.setStatus(1); //待审批
-                    if (var) {
-                        this.save(dto);
-                    } else {
-                        this.saveOrUpdate(dto);
-                    }
-
-                    //新增审批任务关联信息
-                    jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",6)");
+                //新增审批任务
+                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                taskProcessService.buildTaskProcessInfoImpl(6, taskProcessInfo);
 
+                //新增信息
+                dto.setIsTemp(1); //提交
+                dto.setStatus(1); //待审批
+                if (var) {
+                    this.save(dto);
                 } else {
-                    throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                    this.saveOrUpdate(dto);
                 }
+
+                //新增审批任务关联信息
+                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",6)");
             }
         }
         return true;

+ 34 - 36
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -304,48 +304,46 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         if (ObjectUtil.isEmpty(task.getDeptId())) {
             throw new ServiceException("获取部门信息失败,请联系管理员");
         }
-        //修改计划任务的状态为已完成
-        boolean updated = projectCostBudgetServiceImpl.update(Wrappers.<ProjectCostBudget>lambdaUpdate().set(ProjectCostBudget::getStatus, 4).eq(ProjectCostBudget::getId, taskId));
 
         //获取部门负责人信息
         User departmentHead = taskProcessService.getDepartmentHead(task.getDeptId());
-        if (updated && departmentHead != null) {
-            //新增审批任务
-            TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-            taskProcessInfo.setId(SnowFlakeUtil.getId());
-            taskProcessInfo.setStatus(1); //待审批
-            taskProcessInfo.setReportDate(new Date());
-            taskProcessInfo.setTaskType(1); //任务审批
-            taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【任务审批】审批");
-
-            //上报人
-            taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-            //审批人
-            List<String> auditUserIds = new LinkedList<>();
-            EMProcessTaskUser responsibleObj = new EMProcessTaskUser(); //部门负责人
-            responsibleObj.setUserId(departmentHead.getId() + "");
-            responsibleObj.setUserName(departmentHead.getRealName());
-            auditUserIds.add(responsibleObj.getUserId());
-
-            List<String> nonEmptyAuditUserIds = new LinkedList<>();
-            for (String userId : auditUserIds) {
-                if (StringUtils.isNotEmpty(userId)) {
-                    nonEmptyAuditUserIds.add(userId);
+        if (departmentHead != null) {
+            //修改计划任务的状态为已完成
+            boolean updated = projectCostBudgetServiceImpl.update(Wrappers.<ProjectCostBudget>lambdaUpdate().set(ProjectCostBudget::getStatus, 4).eq(ProjectCostBudget::getId, taskId));
+            if (updated) {
+                //新增审批任务
+                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                taskProcessInfo.setId(SnowFlakeUtil.getId());
+                taskProcessInfo.setStatus(1); //待审批
+                taskProcessInfo.setReportDate(new Date());
+                taskProcessInfo.setTaskType(1); //任务审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【任务审批】审批");
+
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                //审批人
+                List<String> auditUserIds = new LinkedList<>();
+                auditUserIds.add(departmentHead.getId() + "");
+
+                List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                for (String userId : auditUserIds) {
+                    if (StringUtils.isNotEmpty(userId)) {
+                        nonEmptyAuditUserIds.add(userId);
+                    }
+                }
+                if (nonEmptyAuditUserIds.size() == 0) {
+                    taskProcessInfo.setAuditUserIds(null);
+                } else {
+                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
                 }
-            }
-            if (nonEmptyAuditUserIds.size() == 0) {
-                taskProcessInfo.setAuditUserIds(null);
-            } else {
-                taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
-            }
-
-            taskProcessService.save(taskProcessInfo);
 
-            //新增审批任务关联信息
-            jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + task.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + task.getId() + ",1)");
+                taskProcessService.save(taskProcessInfo);
 
-            return true;
+                //新增审批任务关联信息
+                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + task.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + task.getId() + ",1)");
+                return true;
+            }
         }
         return false;
     }

+ 61 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/PlanRelationReturnedServiceImpl.java

@@ -0,0 +1,61 @@
+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.CommonUtil;
+import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.dto.ProjectCostBudgetStatsDTO;
+import org.springblade.control.entity.ControlProjectInfo;
+import org.springblade.control.entity.PlanRelationReturned;
+import org.springblade.control.entity.ProjectCostBudget;
+import org.springblade.control.entity.ProjectCostBudgetStats;
+import org.springblade.control.mapper.PlanRelationReturnedMapper;
+import org.springblade.control.mapper.ProjectCostBudgetMapper;
+import org.springblade.control.mapper.ProjectInfoMapper;
+import org.springblade.control.service.IPlanRelationReturnedService;
+import org.springblade.control.service.IProjectCostBudgetService;
+import org.springblade.control.vo.ControlProjectInfoVO;
+import org.springblade.control.vo.ProjectCostBudgetVO;
+import org.springblade.control.vo.ProjectCostBudgetVO2;
+import org.springblade.control.vo.ProjectCostBudgetVO3;
+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.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:43
+ **/
+@Service
+@AllArgsConstructor
+public class PlanRelationReturnedServiceImpl extends BaseServiceImpl<PlanRelationReturnedMapper, PlanRelationReturned> implements IPlanRelationReturnedService {
+
+
+    /**
+     * 计划关联回款
+     */
+    @Override
+    public String relationPlanAndReturned(Long returnedId, Long planId, Integer type) {
+        //关联类型:0取消关联,1关联
+        if (type == 1){
+            PlanRelationReturned relation = new PlanRelationReturned();
+            relation.setPlanId(planId);
+            relation.setReturnedId(returnedId);
+            baseMapper.insert(relation);
+            return "关联成功";
+        }else {
+            baseMapper.deleteRelation(returnedId,planId);
+            return "取消成功";
+        }
+    }
+}

+ 96 - 12
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -122,7 +122,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     }
 
     @Override
-    public ControlProjectInfoVO page(ControlProjectInfoDTO dto, Query query) {
+    public List<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query) {
         IPage page = new Page(query.getCurrent(), query.getSize());
         return baseMapper.page(page,dto);
     }
@@ -142,15 +142,42 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         //获取项目下所有已审批的计划
         List<ProjectCostBudgetVO2> list = baseMapper.getApprovePlan(id);
         //获取项目下所有的子计划
-        List<ProjectCostBudget> childrenList = baseMapper.getAllChildrenPlan(id);
-        //把子计划按parentId分组
-        Map<Long, List<ProjectCostBudget>> listMap = childrenList.parallelStream()
-                .collect(Collectors.groupingBy(ProjectCostBudget::getParentId));
-        Set<Long> key = listMap.keySet();
-        //把子计划插入计划里
-        for (ProjectCostBudgetVO2 vo2 : list) {
-            if (key.contains(vo2.getId())){
-                vo2.setChildrenList(listMap.get(vo2.getId()));
+        List<ProjectCostBudgetVO2> childrenList = baseMapper.getAllChildrenPlan(id);
+        if (childrenList != null && childrenList.size() >0) {
+            //把子计划按parentId分组
+            Map<Long, List<ProjectCostBudgetVO2>> listMap = childrenList.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getParentId));
+            Set<Long> key = listMap.keySet();
+            //循环所有父计划
+            for (ProjectCostBudgetVO2 vo2 : list) {
+                if (vo2.getTaskApprove() == 1) {
+                        vo2.setTaskFinishedStatus(2);
+                }
+                //如果子计划,把子计划插入计划里
+                if (key.contains(vo2.getId())) {
+                    //如果计划已经完成,则不计算超时
+                    if (vo2.getTaskFinishedStatus() == null) {
+                        //有子计划,判断子计划加起来是否超过预算天数
+                        BigDecimal workDays = new BigDecimal(0);
+                        List<ProjectCostBudgetVO2> vo2List = listMap.get(vo2.getId());
+                        for (ProjectCostBudgetVO2 budgetVO2 : vo2List) {
+                            if (budgetVO2.getPlanDays() != null) {
+                                workDays = workDays.add(budgetVO2.getPlanDays());
+                            }
+                        }
+                        if (workDays.compareTo(vo2.getBudgetDays()) == 1) {
+                            vo2.setTaskFinishedStatus(1);
+                        }
+                    }
+                    vo2.setChildrenList(listMap.get(vo2.getId()));
+                }else {
+                    //没有子计划,则计划父计划的时间是否超时
+                    if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null){
+                        if (vo2.getPlanDays().compareTo(vo2.getBudgetDays()) == 1) {
+                            vo2.setTaskFinishedStatus(1);
+                        }
+                    }
+                }
             }
         }
         //根据单位分类
@@ -201,7 +228,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         List<ProjectCostBudget> parentList = new ArrayList<>();
         //把所有子计划分离出来,并且设置父类id
         for (ProjectCostBudgetVO2 vo2 : list) {
-            List<ProjectCostBudget> vo2ChildrenList = vo2.getChildrenList();
+            List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
             if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
                 //有子计划
                 for (ProjectCostBudget budget : vo2ChildrenList) {
@@ -255,6 +282,17 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             }
         }
         List<ProjectCostBudgetVO> departmentPlan = baseMapper.getDepartmentPlan(type, startDate, endDate);
+        if (departmentPlan != null && departmentPlan.size() > 0){
+            for (ProjectCostBudgetVO vo : departmentPlan) {
+                if (vo.getStatus() == 1 || vo.getStatus() == 4){
+                    vo.setStartOrStop(0);
+                }else if (vo.getStatus() == 2){
+                    vo.setStartOrStop(1);
+                }else {
+                    vo.setStartOrStop(2);
+                }
+            }
+        }
         return departmentPlan;
     }
 
@@ -397,7 +435,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 获取项目的所有实际费用
-     * @param id
+     * @param projectId
      * @return
      */
     @Override
@@ -405,6 +443,52 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return baseMapper.getAllPracticalBudgetByProjectId(projectId);
     }
 
+    /**
+     * 获取一年的人工支出
+     * @param year
+     * @return
+     */
+    @Override
+    public BigDecimal getYearStaffDisburse(int year) {
+        BigDecimal yearStaffDisburse = baseMapper.getYearStaffDisburse(year);
+        if (yearStaffDisburse == null){
+            return new BigDecimal(0);
+        }
+        return yearStaffDisburse;
+    }
+
+    /**
+     * 按年查询所有支出
+     * @param y
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudget> getBudgetByYear(int y) {
+        return baseMapper.getBudgetByYear(y);
+    }
+
+    /**
+     * 按月查询所有支出
+     * @param date
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudgetVO2> getPlanByMonth(String date) {
+        return baseMapper.getPlanByMonth(date);
+    }
+
+
+    /**
+     * 获取风险计划,如果参数为空获取所有
+     * @param projectId
+     * @param costType
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudget> getRiskPlan(Long projectId,Integer costType) {
+        return baseMapper.getRiskPlan(projectId,costType);
+    }
+
     /**
      * 统计一行的几个总金额
      */

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

@@ -120,7 +120,9 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
         List<ProjectCostBudgetVO> list = budgetService.budgetList(costBudget);
         BigDecimal bigDecimal = new BigDecimal("0");
         for (ProjectCostBudgetVO l : list) {
-            bigDecimal = bigDecimal.add(l.getBudgetCountMoney());
+            if (l.getBudgetCountMoney() != null) {
+                bigDecimal = bigDecimal.add(l.getBudgetCountMoney());
+            }
         }
         vo.setPreviewTotalCost(bigDecimal);
         vo.setPreviewList(list);

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

@@ -36,8 +36,11 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, ControlProjectInfo> implements IProjectInfoService {
     private final ProjectInfoMapper infoMapper;
+
     private final IProjectProcessService processService;
+
     private final IContractInfoService contractInfoService;
+
     private final IProjectCostBudgetService budgetService;
 
     /**
@@ -198,5 +201,10 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         return null;
     }
 
+    @Override
+    public List<ControlProjectInfo> listByYear(int year) {
+        return baseMapper.listByYear(year);
+    }
+
 
 }

+ 208 - 29
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -23,6 +23,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
@@ -68,10 +69,7 @@ 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())
-                    .or()
-                    .like(TaskProcessInfo::getAuditUserIdsComplete, SecureUtil.getUserId())
-                    .and(wrapper -> wrapper.in(TaskProcessInfo::getStatus, 2, 3));
+            queryWrapper.lambda().apply("(audit_user_ids_complete LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS IN ( 2, 3 )) OR (audit_user_ids LIKE '%" + SecureUtil.getUserId() + "%' AND STATUS = 3)");
         } else if (dto.getSelectType().equals("3")) { //我发起的任务
             if (ObjectUtil.isNotEmpty(dto.getSelectStatus()) && !dto.getSelectStatus().equals("1")) {
                 queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
@@ -325,6 +323,16 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             //已审批人员List
             Set<String> auditUserIdCompleteList = new HashSet<>(Func.toStrList(taskProcessInfo.getAuditUserIdsComplete()));
 
+            //待审批的首位审批人,如果首位审批人还未审批,那么后面人员无法审批
+            if (auditUserIdList.size() > 0) {
+                String firstUserId = auditUserIdList.get(0);
+                if (!firstUserId.equals(SecureUtil.getUserId() + "")) {
+                    User user = iUserClient.userInfoById(Long.parseLong(firstUserId)).getData();
+                    bladeRedis.del("user:id=" + SecureUtil.getUserId());//解锁
+                    throw new ServiceException("当前任务的审批人【" + user.getRealName() + "】还未完成审批,请稍后再试");
+                }
+            }
+
             //剔除待审批中当前用户信息
             if (auditUserIdList.removeIf(next -> next != null && next.equals(SecureUtil.getUserId() + ""))) {
                 //剔除后视为已完成审批
@@ -483,10 +491,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
                         //审批人
                         List<String> auditUserIds = new LinkedList<>();
-                        EMProcessTaskUser responsibleObj = new EMProcessTaskUser(); //部门负责人
-                        responsibleObj.setUserId(departmentHead.getId() + "");
-                        responsibleObj.setUserName(departmentHead.getRealName());
-                        auditUserIds.add(responsibleObj.getUserId());
+                        auditUserIds.add(departmentHead.getId() + "");
 
                         List<String> nonEmptyAuditUserIds = new LinkedList<>();
                         for (String userId : auditUserIds) {
@@ -519,10 +524,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
 
                         //审批人
                         List<String> auditUserIds = new LinkedList<>();
-                        EMProcessTaskUser responsibleObj = new EMProcessTaskUser(); //部门负责人
-                        responsibleObj.setUserId(departmentHead.getId() + "");
-                        responsibleObj.setUserName(departmentHead.getRealName());
-                        auditUserIds.add(responsibleObj.getUserId());
+                        auditUserIds.add(departmentHead.getId() + "");
 
                         List<String> nonEmptyAuditUserIds = new LinkedList<>();
                         for (String userId : auditUserIds) {
@@ -708,23 +710,6 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         }
     }
 
-    /**
-     * 根据部门id获取部门负责人信息
-     *
-     * @param deptId
-     * @return
-     */
-    public User getDepartmentHead(Long deptId) {
-        if (ObjectUtil.isNotEmpty(deptId)) {
-            //TODO 根据部门id获取部门负责人信息
-            User user = new User();
-            user.setId(SnowFlakeUtil.getId());
-            user.setDeptId("123456789");
-            return user;
-        }
-        return null;
-    }
-
     /**
      * 获取计划任务List
      *
@@ -748,5 +733,199 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         return null;
     }
 
+    /**
+     * 构造审批任务
+     *
+     * @param type            任务类型
+     * @param taskProcessInfo 任务实体
+     */
+    public void buildTaskProcessInfoImpl(int type, TaskProcessInfo taskProcessInfo) {
+        taskProcessInfo.setId(SnowFlakeUtil.getId());
+        taskProcessInfo.setStatus(1); //待审批
+        taskProcessInfo.setReportDate(new Date());
+        taskProcessInfo.setTaskType(type);
+        String taskNameByType = this.taskNameByType(type);
+        if (StringUtils.isNotEmpty(taskNameByType)) {
+            taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】" + taskNameByType);
+        }
+        //上报人
+        taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+        //构造审批人auditUserIds
+        List<String> auditUserIds = new LinkedList<>();
+
+        //判断当前用户是否是部门负责人,如果是,那么不自己审批(跳过)
+        User user = iUserClient.userInfoById(SecureUtil.getUserId()).getData();
+        if (user != null && ObjectUtil.isEmpty(user.getIsLeader())) {
+            //负责人getIsLeader字段=null,证明不是负责人,那么获取当前部门负责人
+            User departmentHead = this.getDepartmentHead(Long.parseLong(SecureUtil.getUser().getDeptId()));
+            if (departmentHead != null) {
+                auditUserIds.add(departmentHead.getId() + "");
+            }
+        }
+
+        //获取审批人、抄送人信息
+        Map<String, List<User>> approveUserMaps = this.getApproveUserMaps(type);
+
+        //审批人
+        List<User> spUserList = approveUserMaps.getOrDefault("SP", null);
+        if (spUserList == null || spUserList.size() == 0) {
+            throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+        }
+        auditUserIds.addAll(spUserList.stream().map(User::getId).map(String::valueOf).collect(Collectors.toList()));
+
+        List<String> nonEmptyAuditUserIds = new LinkedList<>();
+        for (String userId : auditUserIds) {
+            if (StringUtils.isNotEmpty(userId)) {
+                nonEmptyAuditUserIds.add(userId);
+            }
+        }
+        if (nonEmptyAuditUserIds.size() == 0) {
+            taskProcessInfo.setAuditUserIds(null);
+        } else {
+            taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+        }
+
+        //抄送人
+        List<User> zcUserList = approveUserMaps.getOrDefault("ZC", null);
+        if (zcUserList != null && zcUserList.size() > 0) {
+            List<String> zcUserIds = zcUserList.stream().map(User::getId).map(String::valueOf).collect(Collectors.toList());
+            taskProcessInfo.setCcUserIds(StringUtils.join(zcUserIds, ","));
+        }
+
+        //入库
+        this.save(taskProcessInfo);
+    }
+
+    /**
+     * 根据任务类型获取任务名称
+     *
+     * @param type
+     * @return
+     */
+    private String taskNameByType(int type) {
+        switch (type) {
+            case 2:
+                return "向您发起【报销审批】审批";
+            case 3:
+                return "向您发起【支付审批】审批";
+            case 4:
+                return "向您发起【借款审批】审批";
+            case 5:
+                return "向您发起【采购审批】审批";
+            case 6:
+                return "向您发起【用车审批】审批";
+            case 7:
+                return "向您发起【发票审批】审批";
+            case 8:
+                return "向您发起【外包支付】审批";
+            case 9:
+                return "向您发起【出差审批】审批";
+        }
+        return "";
+    }
+
+    /**
+     * 根据部门id获取部门负责人信息(一个部门只有一个负责人)
+     *
+     * @param deptId
+     * @return
+     */
+    public User getDepartmentHead(Long deptId) {
+        if (ObjectUtil.isNotEmpty(deptId)) {
+            List<User> leaderUser = jdbcTemplate.query("select * from blade_user where dept_id like '%" + deptId + "%' and is_leader like '%" + deptId + "%'", new BeanPropertyRowMapper<>(User.class));
+            if (leaderUser.size() == 1) {
+                return leaderUser.get(0);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 根据审批类型获取审批人id信息(不包括部门负责人,单独处理)
+     *
+     * @param type 数据类型
+     * @return
+     */
+    public Map<String, List<User>> getApproveUserMaps(int type) {
+        //tenant_id = 003077(管控平台) dept_type = 3(最底层为岗位信息)
+        List<Dept> deptListControl = jdbcTemplate.query("select * from blade_dept where tenant_id = 003077 and dept_type = 3", new BeanPropertyRowMapper<>(Dept.class));
+        Map<String, List<User>> resultMaps = new LinkedHashMap<>();
+        List<String> spPostIds = new LinkedList<>();
+        List<String> zcPostIds = new LinkedList<>();
+        List<DictInfo> query = new ArrayList<>();
+        switch (type) {
+            case 2://财务报销
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%财务报销%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+            case 3://支付申请
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%支付申请%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+            case 4://借款申请
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%借款申请%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+            case 5://采购申请
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%采购申请%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+            case 6://用车审批
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%用车申请%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+            case 7://发票审批
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%发票管理%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+            case 8://外包支付
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%外包支付%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+            case 9://出差审批
+                query = jdbcTemplate.query("select id from c_dict_info where dict_name like '%出差管理%' and type = 6", new BeanPropertyRowMapper<>(DictInfo.class));
+                break;
+        }
+
+        if (query.size() == 1) {
+            DictInfo dictInfo = query.get(0);
+            List<TaskProcessRecordDictInfo> dictInfoList = jdbcTemplate.query("select * from c_task_process_record_dict_info where dict_id = " + dictInfo.getId(), new BeanPropertyRowMapper<>(TaskProcessRecordDictInfo.class));
+            if (dictInfoList.size() > 0) {
+                List<TaskProcessRecordDictInfo> spRoleInfos = dictInfoList.stream().filter(f -> f.getType().equals(1))
+                        .sorted(Comparator.comparingInt(TaskProcessRecordDictInfo::getSort))
+                        .collect(Collectors.toList());
+                List<TaskProcessRecordDictInfo> zcRoleInfos = dictInfoList.stream().filter(f -> f.getType().equals(2))
+                        .sorted(Comparator.comparingInt(TaskProcessRecordDictInfo::getSort))
+                        .collect(Collectors.toList());
+                for (TaskProcessRecordDictInfo spRoleInfo : spRoleInfos) {
+                    for (Dept dept : deptListControl) {
+                        if (spRoleInfo.getRoleName().equals(dept.getDeptName())) {
+                            spPostIds.add(dept.getId() + "");
+                        }
+                    }
+                }
+                for (TaskProcessRecordDictInfo zcRoleInfo : zcRoleInfos) {
+                    for (Dept dept : deptListControl) {
+                        if (zcRoleInfo.getRoleName().equals(dept.getDeptName())) {
+                            zcPostIds.add(dept.getId() + "");
+                        }
+                    }
+                }
+            }
+        }
+
+        if (spPostIds.size() > 0) {
+            List<User> spUserListAll = new LinkedList<>();
+            for (String spPostId : spPostIds) {
+                List<User> spUserList = jdbcTemplate.query("select * from blade_user where tenant_id = 003077 and dept_id =" + spPostId, new BeanPropertyRowMapper<>(User.class));
+                spUserListAll.addAll(spUserList);
+            }
+            if (spUserListAll.size() > 0) {
+                resultMaps.put("SP", spUserListAll);
+            }
+        }
+        if (zcPostIds.size() > 0) {
+            List<User> zcUserList = jdbcTemplate.query("select * from blade_user where tenant_id = 003077 and dept_id in(" + StringUtils.join(zcPostIds, ",") + ")", new BeanPropertyRowMapper<>(User.class));
+            if (zcUserList.size() > 0) {
+                resultMaps.put("ZC", zcUserList);
+            }
+        }
+        return resultMaps;
+    }
+
 
 }

部分文件因为文件数量过多而无法显示