Jelajahi Sumber

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

huangtf 2 tahun lalu
induk
melakukan
423caf8037
91 mengubah file dengan 2452 tambahan dan 499 penghapusan
  1. 3 0
      blade-ops/blade-swagger/src/main/resources/application-dev.yml
  2. 22 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveInspectionInfoClient.java
  3. 6 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java
  4. 6 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ArchiveFileVO.java
  5. 0 11
      blade-service-api/blade-control-api/pom.xml
  6. 20 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/ContractReturnedInfoDTO.java
  7. 21 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/ControlContractInfoDTO.java
  8. 1 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/ControlProjectInfoDTO.java
  9. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTO.java
  10. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMLoanInfoDTO.java
  11. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMPayInfoDTO.java
  12. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskProcessInfoDTO.java
  13. 59 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ContractReturnedInfo.java
  14. 22 3
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DictInfo.java
  15. 64 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMFinancialReimbursementInfo.java
  16. 41 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMLoanInfo.java
  17. 64 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMPayInfo.java
  18. 15 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMProcessTaskUser.java
  19. 16 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ExpenseTaskRecord.java
  20. 48 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskProcessInfo.java
  21. 29 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractReturnedInfoVO.java
  22. 12 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlContractInfoVO.java
  23. 24 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMDraftVO.java
  24. 28 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoVO.java
  25. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMLoanInfoVO.java
  26. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMPayInfoVO.java
  27. 3 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryInfoReadVO.java
  28. 24 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanInfoVO.java
  29. 24 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessInfoDetailVO.java
  30. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessInfoVO.java
  31. 46 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToEMFDetailVO.java
  32. 34 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToTaskPlanDetailVO.java
  33. 30 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToTaskProcessDetailBasicsVO.java
  34. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveInspectionInfoController.java
  35. 14 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  36. 25 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveInspectionInfoClientImpl.java
  37. 17 3
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  38. 5 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveInspectionService.java
  39. 2 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  40. 44 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveInspectionServiceImpl.java
  41. 47 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  42. 20 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java
  43. 6 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java
  44. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  45. 38 0
      blade-service/blade-control/pom.xml
  46. 78 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/CSysController.java
  47. 11 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ContractInfoController.java
  48. 50 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ContractReturnedInfoController.java
  49. 15 15
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DictInfoController.java
  50. 163 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExpenseManagerController.java
  51. 55 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java
  52. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.java
  53. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractInfoMapper.xml
  54. 24 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.java
  55. 16 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ContractReturnedInfoMapper.xml
  56. 4 2
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DictInfoMapper.java
  57. 11 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/DictInfoMapper.xml
  58. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMFinancialReimbursementMapper.java
  59. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMFinancialReimbursementMapper.xml
  60. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMLoanMapper.java
  61. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMLoanMapper.xml
  62. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPayMapper.java
  63. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPayMapper.xml
  64. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskProcessMapper.java
  65. 6 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/TaskProcessMapper.xml
  66. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMFinancialReimbursementService.java
  67. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMLoanService.java
  68. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMPayService.java
  69. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractInfoService.java
  70. 30 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IContractReturnedInfoService.java
  71. 14 5
      blade-service/blade-control/src/main/java/org/springblade/control/service/IDictInfoService.java
  72. 20 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/TaskProcessService.java
  73. 21 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java
  74. 72 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractReturnedInfoServiceImpl.java
  75. 12 7
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DictInfoServiceImpl.java
  76. 193 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  77. 77 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java
  78. 185 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java
  79. 158 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  80. 13 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  81. 5 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  82. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  83. 0 127
      src/main/java/org/springblade/control/controller/DictInfoController.java
  84. 0 34
      src/main/java/org/springblade/control/dto/DictInfoDTO.java
  85. 0 64
      src/main/java/org/springblade/control/entity/DictInfo.java
  86. 0 42
      src/main/java/org/springblade/control/mapper/DictInfoMapper.java
  87. 0 32
      src/main/java/org/springblade/control/mapper/DictInfoMapper.xml
  88. 0 41
      src/main/java/org/springblade/control/service/IDictInfoService.java
  89. 0 41
      src/main/java/org/springblade/control/service/impl/DictInfoServiceImpl.java
  90. 0 34
      src/main/java/org/springblade/control/vo/DictInfoVO.java
  91. 0 20
      src/main/java/sql/dictinfo.menu.sql

+ 3 - 0
blade-ops/blade-swagger/src/main/resources/application-dev.yml

@@ -22,3 +22,6 @@ knife4j:
       - name: 档案接口
         uri: 127.0.0.1:8090
         location: /blade-archive/v2/api-docs
+      - name: 内控系统
+        uri: 127.0.0.1:8090
+        location: /blade-control/v2/api-docs

+ 22 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveInspectionInfoClient.java

@@ -0,0 +1,22 @@
+package org.springblade.archive.feign;
+
+import org.springblade.archive.dto.ArchiveInspectionDTO;
+import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.common.constant.ArchiveConstant;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(value = ArchiveConstant.APPLICATION_WEATHER_NAME)
+public interface ArchiveInspectionInfoClient {
+    String API_PREFIX = "/api/archive/archiveInspectionInfo";
+
+    @PostMapping(API_PREFIX + "/getAllopinion")
+    Map<String, Map<String,Object>> getAllopinion(@RequestParam String fileIds);
+}

+ 6 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/vo/ArchivesAutoVO.java

@@ -148,6 +148,11 @@ public class ArchivesAutoVO extends ArchivesAuto {
 	 */
 	private Integer isSelect;
 
+	/**
+	 * 去除四要素后的文件
+	 */
+	private Integer pageNumber;
+
 	/**
 	 * 柜子内部搜索
 	 */
@@ -221,5 +226,6 @@ public class ArchivesAutoVO extends ArchivesAuto {
 
 		private Long id;
 		private Long fileSize;
+		private Integer isElement;
 	}
 }

+ 6 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/ArchiveFileVO.java

@@ -89,5 +89,10 @@ public class ArchiveFileVO extends ArchiveFile {
      * 是否更改文件地址 0 未更改,1已更改
      */
     private Integer isUpdateUrl;
-
+    //所有的意见
+    private String allOpinion;
+    /**
+     * 案卷题名
+     */
+    private String archiveName;
 }

+ 0 - 11
blade-service-api/blade-control-api/pom.xml

@@ -11,17 +11,6 @@
     <artifactId>blade-control-api</artifactId>
     <version>${bladex.project.version}</version>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.springblade</groupId>
-            <artifactId>blade-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springblade</groupId>
-            <artifactId>blade-user-api</artifactId>
-            <version>2.9.1.RELEASE</version>
-        </dependency>
-    </dependencies>
     <packaging>jar</packaging>
 
 

+ 20 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/ContractReturnedInfoDTO.java

@@ -0,0 +1,20 @@
+package org.springblade.control.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.ContractReturnedInfo;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/6 16:53
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ContractReturnedInfoDTO extends ContractReturnedInfo{
+    @ApiModelProperty(value = "项目进程集合")
+    private List<ContractReturnedInfo> list;
+}

+ 21 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/ControlContractInfoDTO.java

@@ -0,0 +1,21 @@
+package org.springblade.control.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.ContractReturnedInfo;
+import org.springblade.control.entity.ControlContractInfo;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/6 16:53
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ControlContractInfoDTO extends ControlContractInfo {
+    @ApiModelProperty(value = "搜索值")
+    private String queryValue;
+}

+ 1 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/ControlProjectInfoDTO.java

@@ -17,6 +17,7 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = true)
 public class ControlProjectInfoDTO extends ControlProjectInfo {
     //项目进程集合
+    @ApiModelProperty(value = "项目进程集合")
     private List<ProjectProcess> projectProcessList;
 
     //模糊查询

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

@@ -0,0 +1,31 @@
+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 {
+
+    @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;
+
+}

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

@@ -0,0 +1,31 @@
+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 {
+
+    @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;
+
+}

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

@@ -0,0 +1,31 @@
+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 {
+
+    @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;
+
+}

+ 22 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/TaskProcessInfoDTO.java

@@ -0,0 +1,22 @@
+package org.springblade.control.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.TaskProcessInfo;
+
+@Data
+public class TaskProcessInfoDTO extends TaskProcessInfo {
+
+    @ApiModelProperty(value = "选择类型 1=待办任务 2=已办任务 3=我发起的任务 4=抄送给我的")
+    private String selectType;
+
+    @ApiModelProperty(value = "选择类型 1=所有 2=已审批 3=待审批 4=已驳回")
+    private String selectStatus;
+
+    @ApiModelProperty(value = "开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "结束时间")
+    private String endTime;
+
+}

+ 59 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ContractReturnedInfo.java

@@ -0,0 +1,59 @@
+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/6 9:21
+ **/
+@Data
+@TableName("c_contract_returned_info")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "合同回款信息表", description = "合同回款信息表")
+public class ContractReturnedInfo extends BaseEntity {
+
+    @ApiModelProperty(value = "合同id")
+    private Long contractId;
+
+    @ApiModelProperty(value = "回款条件")
+    private String returnedCondition;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "应回款时间")
+    private LocalDate shouldReturnedTime;
+
+    @ApiModelProperty(value = "应回款金额")
+    private BigDecimal shouldReturnedMoney;
+
+    @DateTimeFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @JsonFormat(
+            pattern = "yyyy-MM-dd"
+    )
+    @ApiModelProperty(value = "实际回款时间")
+    private LocalDate practicalReturnedTime;
+
+    @ApiModelProperty(value = "实际回款金额")
+    private BigDecimal practicalReturnedMoney;
+
+    @ApiModelProperty(value = "催款执行人")
+    private Long reminderUser;
+
+}

+ 22 - 3
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DictInfo.java

@@ -16,10 +16,16 @@
  */
 package org.springblade.control.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -32,15 +38,23 @@ import lombok.EqualsAndHashCode;
  */
 @Data
 @TableName("c_dict_info")
-@EqualsAndHashCode(callSuper = true)
-public class DictInfo extends BaseEntity {
+public class DictInfo implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 主键
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
     /**
      * 父主键
      */
     private Long parentId;
+
     /**
      * 字典名称
      */
@@ -62,5 +76,10 @@ public class DictInfo extends BaseEntity {
      */
     private String code;
 
-
+    /**
+     * 是否已删除
+     */
+    @TableLogic
+    @ApiModelProperty(value = "是否已删除")
+    private Integer isDeleted;
 }

+ 64 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMFinancialReimbursementInfo.java

@@ -0,0 +1,64 @@
+package org.springblade.control.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("c_expense_financial_reimbursement_info")
+@EqualsAndHashCode(callSuper = true)
+public class EMFinancialReimbursementInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "报销编号")
+    private String frNumber;
+
+    @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;
+
+    @ApiModelProperty(value = "所属项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "预算计划ids")
+    private String budgetPlanIds;
+
+    @ApiModelProperty(value = "归属人id")
+    private Long userIdVesting;
+
+    @ApiModelProperty(value = "审批状态0=未上报 1=待审批 2=已审批 3=已驳回")
+    private Integer status;
+
+    @ApiModelProperty(value = "是否抵扣借款 0=否 1=是")
+    private Integer isDeductLoan;
+
+    @ApiModelProperty(value = "借款信息id")
+    private Long deductLoanId;
+
+    @ApiModelProperty(value = "实际报销金额")
+    private BigDecimal frMoneyActual;
+
+}

+ 41 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMLoanInfo.java

@@ -0,0 +1,41 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName(value = "c_expense_loan_info")
+@EqualsAndHashCode(callSuper = true)
+public class EMLoanInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "申请人")
+    private String loanUserName;
+
+    @ApiModelProperty(value = "贷款事由")
+    private String loanDesc;
+
+    @ApiModelProperty(value = "申请金额")
+    private BigDecimal loanMoney;
+
+    @ApiModelProperty(value = "使用日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date useDate;
+
+    @ApiModelProperty(value = "归还日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date returnDate;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+
+}

+ 64 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMPayInfo.java

@@ -0,0 +1,64 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName(value = "c_expense_pay_info")
+@EqualsAndHashCode(callSuper = true)
+public class EMPayInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "申请时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date afDate;
+
+    @ApiModelProperty(value = "申请人id")
+    private Long afUserId;
+
+    @ApiModelProperty(value = "申请比例")
+    private String afProportion;
+
+    @ApiModelProperty(value = "申请金额")
+    private BigDecimal afMoney;
+
+    @ApiModelProperty(value = "收款人id")
+    private Long payeeUserId;
+
+    @ApiModelProperty(value = "收款人开户行")
+    private String payeeUserBankName;
+
+    @ApiModelProperty(value = "收款账号")
+    private String payeeUserBankId;
+
+    @ApiModelProperty(value = "请款用途")
+    private String payeeUseInfo;
+
+    @ApiModelProperty(value = "是否申请项目提成 0=否 1=是")
+    private Integer isProjectBonus;
+
+    @ApiModelProperty(value = "项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "合同回款数据id")
+    private Long contractCollectionDataId;
+
+    @ApiModelProperty(value = "回款时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date collectionDate;
+
+    @ApiModelProperty(value = "回款金额")
+    private BigDecimal collectionMoney;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+}

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

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

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

@@ -0,0 +1,16 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@TableName(value = "c_expense_task_record")
+public class ExpenseTaskRecord implements Serializable {
+
+    private Long id;
+    private Long taskId;
+    private Long expenseInfoId;
+
+}

+ 48 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskProcessInfo.java

@@ -0,0 +1,48 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.util.Date;
+
+@Data
+@TableName("c_task_process_info")
+@EqualsAndHashCode(callSuper = true)
+public class TaskProcessInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "任务名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "上报日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date reportDate;
+
+    @ApiModelProperty(value = "审核日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date auditDate;
+
+    @ApiModelProperty(value = "上报类型(任务类型)")
+    private Integer taskType;
+
+    @ApiModelProperty(value = "审批状态1=待审批 2=已审批 3=已驳回")
+    private Integer status;
+
+    @ApiModelProperty(value = "上报人id")
+    private Long reportUserId;
+
+    @ApiModelProperty(value = "审批人ids")
+    private String auditUserIds;
+
+    @ApiModelProperty(value = "抄送人ids")
+    private String ccUserIds;
+
+    @ApiModelProperty(value = "驳回原因")
+    private String rejectDesc;
+
+}

+ 29 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ContractReturnedInfoVO.java

@@ -0,0 +1,29 @@
+package org.springblade.control.vo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.ContractReturnedInfo;
+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/6 9:21
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ContractReturnedInfoVO extends ContractReturnedInfo {
+
+    @ApiModelProperty(value = "催款执行人名称")
+    private String reminderUserName;
+
+
+}

+ 12 - 2
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlContractInfoVO.java

@@ -1,9 +1,12 @@
 package org.springblade.control.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.control.entity.ControlContractInfo;
 
+import java.math.BigDecimal;
+
 /**
  * @Param
  * @Author wangwl
@@ -12,8 +15,15 @@ import org.springblade.control.entity.ControlContractInfo;
 @Data
 @EqualsAndHashCode(callSuper = true)
 public class ControlContractInfoVO extends ControlContractInfo {
-    //合同类型值
+    @ApiModelProperty(value = "合同类型值")
     private String contractTypeValue;
-    //项目名称
+
+    @ApiModelProperty(value = "项目名称")
     private String projectName;
+
+    @ApiModelProperty(value = "合同已回款")
+    private BigDecimal returnedMoney;
+
+    @ApiModelProperty(value = "合同未回款")
+    private BigDecimal unreturnedMoney;
 }

+ 24 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMDraftVO.java

@@ -0,0 +1,24 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 草稿箱vo
+ */
+@Data
+public class EMDraftVO implements Serializable {
+
+    @ApiModelProperty(value = "记录数据id")
+    private Long id;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "更新时间")
+    private Date updateTime;
+
+}

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

@@ -0,0 +1,28 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMFinancialReimbursementInfo;
+
+@Data
+public class EMFinancialReimbursementInfoVO extends EMFinancialReimbursementInfo {
+
+    @ApiModelProperty(value = "报销类型")
+    private String frTypeName;
+
+    @ApiModelProperty(value = "项目名称")
+    private String projectName;
+
+    @ApiModelProperty(value = "名称")
+    private String userNameVesting;
+
+    @ApiModelProperty(value = "创建人")
+    private String createName;
+
+    @ApiModelProperty(value = "审批状态")
+    private String approvalStatusName;
+
+    @ApiModelProperty(value = "审批结果")
+    private String approvalResultName;
+
+}

+ 22 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMLoanInfoVO.java

@@ -0,0 +1,22 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMLoanInfo;
+
+@Data
+public class EMLoanInfoVO extends EMLoanInfo {
+
+    @ApiModelProperty(value = "还款状态")
+    private String returnStatus;
+
+    @ApiModelProperty(value = "创建人")
+    private String createName;
+
+    @ApiModelProperty(value = "审批状态")
+    private String approvalStatusName;
+
+    @ApiModelProperty(value = "审批结果")
+    private String approvalResultName;
+
+}

+ 22 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMPayInfoVO.java

@@ -0,0 +1,22 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMPayInfo;
+
+@Data
+public class EMPayInfoVO extends EMPayInfo {
+
+    @ApiModelProperty(value = "收款人")
+    private String payeeUserName;
+
+    @ApiModelProperty(value = "创建人")
+    private String createName;
+
+    @ApiModelProperty(value = "审批状态")
+    private String approvalStatusName;
+
+    @ApiModelProperty(value = "审批结果")
+    private String approvalResultName;
+
+}

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

@@ -4,9 +4,11 @@ package org.springblade.control.vo;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.io.Serializable;
+
 @Data
 @TableName("c_log_history_read_record")
-public class LogHistoryInfoReadVO {
+public class LogHistoryInfoReadVO implements Serializable {
 
     private Long id;
     private Long logId;

+ 24 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanInfoVO.java

@@ -0,0 +1,24 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 计划任务vo
+ */
+@Data
+public class TaskPlanInfoVO implements Serializable {
+
+    @ApiModelProperty(value = "计划任务id")
+    private Long id;
+
+    @ApiModelProperty(value = "计划任务所属项目")
+    private String projectName;
+
+    @ApiModelProperty(value = "计划任务描述")
+    private String taskDesc;
+
+}

+ 24 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessInfoDetailVO.java

@@ -0,0 +1,24 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 审批任务详情vo
+ */
+@Data
+public class TaskProcessInfoDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "审批任务详情-基础信息")
+    private TypeToTaskProcessDetailBasicsVO basicsInfo;
+
+    @ApiModelProperty(value = "审批任务详情-计划类型任务")
+    private TypeToTaskPlanDetailVO toTaskPlanDetailVO;
+
+    @ApiModelProperty(value = "审批任务详情-财务、采购、外包、支付、借款类型任务")
+    private TypeToEMFDetailVO typeToEMFDetailVO;
+
+}

+ 22 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessInfoVO.java

@@ -0,0 +1,22 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.TaskProcessInfo;
+
+@Data
+public class TaskProcessInfoVO extends TaskProcessInfo {
+
+    @ApiModelProperty(value = "上报类型(任务类型)")
+    private String reportTypeName;
+
+    @ApiModelProperty(value = "审核状态名称")
+    private String statusName;
+
+    @ApiModelProperty(value = "上报人")
+    private String reportUserName;
+
+    @ApiModelProperty(value = "审核人")
+    private String auditUserNames;
+
+}

+ 46 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToEMFDetailVO.java

@@ -0,0 +1,46 @@
+package org.springblade.control.vo;
+
+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;
+import java.util.List;
+
+/**
+ * 审批详情-财务、采购、外包、支付、借款vo
+ */
+@Data
+public class TypeToEMFDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "计划任务信息")
+    private List<TaskPlanInfoVO> TaskInfoList;
+
+    @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 frTypeName;
+
+    @ApiModelProperty(value = "费用说明")
+    private String frDesc;
+
+    @ApiModelProperty(value = "电子发票url地址")
+    private String frElectronicInvoiceUrl;
+
+    @ApiModelProperty(value = "附件url地址")
+    private String frAttachmentUrl;
+
+    @ApiModelProperty(value = "归属人")
+    private String userNameVesting;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+}

+ 34 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToTaskPlanDetailVO.java

@@ -0,0 +1,34 @@
+package org.springblade.control.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 审批详情-计划任务类型vo
+ */
+@Data
+public class TypeToTaskPlanDetailVO implements Serializable {
+
+    @ApiModelProperty(value = "计划任务信息")
+    private List<TaskPlanInfoVO> TaskInfoList;
+
+    @ApiModelProperty(value = "变更类型")
+    private String statusTypeName;
+
+    @ApiModelProperty(value = "转移时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date toUpdateTime;
+
+    @ApiModelProperty(value = "转移对象")
+    private String toUserName;
+
+    @ApiModelProperty(value = "转移原因")
+    private String toDesc;
+
+}

+ 30 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToTaskProcessDetailBasicsVO.java

@@ -0,0 +1,30 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 审批详情-基础信息vo
+ */
+@Data
+public class TypeToTaskProcessDetailBasicsVO implements Serializable {
+
+    @ApiModelProperty(value = "审批任务id")
+    private Long taskId;
+
+    @ApiModelProperty(value = "审批任务名称")
+    private String taskName;
+
+    @ApiModelProperty(value = "审批任务上报类型")
+    private String reportTypeName;
+
+    @ApiModelProperty(value = "审批任务上报人")
+    private String reportUser;
+
+    @ApiModelProperty(value = "审批任务上报时间")
+    private Date reportDate;
+
+}

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveInspectionInfoController.java

@@ -71,6 +71,9 @@ public class ArchiveInspectionInfoController {
         ArchiveInspection archiveInspectionMod = archiveInspectionService.getById(archiveInspection.getId());
         if (archiveInspectionMod!= null ) {
             archiveInspectionMod.setOpinion(archiveInspection.getOpinion());
+        }else{
+            archiveInspection.setId(null);
+            return this.addArchiveInspection(archiveInspection);
         }
         return R.status(archiveInspectionService.saveOrUpdate(archiveInspectionMod));
     }

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

@@ -157,6 +157,20 @@ public class ArchivesAutoController extends BladeController {
 		}
 	}
 
+	/**
+	 * 档案统计-档案柜切换档案查看权限
+	 */
+	@GetMapping("/getArchivesAuthByUser")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "档案统计-档案柜切换档案查看权限")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "archiveType", value = "1业主2施工3监理", required = true),
+	})
+	public R getArchivesAuthByUser(Long projectId,Long contractId,Integer archiveType) {
+		archivesAutoService.getArchivesAuthByUser(projectId,contractId,archiveType);
+		return R.success("切换成功");
+	}
+
 	/**
 	 * 档案统计-已组案卷
 	 */

+ 25 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveInspectionInfoClientImpl.java

@@ -0,0 +1,25 @@
+package org.springblade.archive.feign;
+
+import lombok.AllArgsConstructor;
+import org.springblade.archive.dto.ArchiveInspectionDTO;
+import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.service.IArchiveInspectionService;
+import org.springblade.archive.service.IArchivesAutoService;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+public class ArchiveInspectionInfoClientImpl implements ArchiveInspectionInfoClient {
+
+    private IArchiveInspectionService iArchiveInspectionService;
+
+    @Override
+    public Map<String, Map<String,Object>> getAllopinion(String fileIds) {
+        return iArchiveInspectionService.getAllopinion(fileIds);
+    }
+}

+ 17 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -375,7 +375,8 @@
         where project_id = #{projectId};
     </select>
     <select id="pageByArchivesAuto" resultMap="archivesAutoResultMap">
-        select uaa.* from m_archive_tree_contract matc left join u_archives_auto uaa on matc.id = uaa.node_id left join
+        select uaa.*,(select COUNT(1) from u_archive_file af WHERE af.archive_id = uaa.id AND af.is_element = 0 and af.is_deleted = 0) as pageNumber
+        from m_archive_tree_contract 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.projectId != null and vo.projectId != ''">
@@ -425,7 +426,7 @@
     </select>
 
     <select id="pageByArchivesAuto2" resultMap="archivesAutoResultMap">
-        select uaa.* from
+        select uaa.*,(select COUNT(1) from u_archive_file af WHERE af.archive_id = uaa.id AND af.is_element = 0 and af.is_deleted = 0) as pageNumber from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and 1=2
         <foreach collection="vo.nodeIdArray" item="nodeId">
@@ -478,12 +479,16 @@
     </select>
 
     <select id="pageByArchivesAuto3" resultMap="archivesAutoResultMap">
-        select uaa.* from
+        select uaa.*,(select COUNT(1) from u_archive_file af WHERE af.archive_id = uaa.id AND af.is_element = 0 and af.is_deleted = 0) as pageNumber
+        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>
         GROUP BY uaa.id
         order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
     </select>
@@ -495,6 +500,9 @@
         ) 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 == 1 and vo.queryValue != null and vo.queryValue != ''">
             and uaa.name like concat('%',#{vo.queryValue},'%')
         </if>
@@ -542,6 +550,9 @@
         ) 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>
         GROUP BY uaa.id
         order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
 --         order by uaa.id
@@ -554,6 +565,9 @@
         ) 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 == 1 and vo.queryValue != null and vo.queryValue != ''">
             and uaa.name like concat('%',#{vo.queryValue},'%')
         </if>

+ 5 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchiveInspectionService.java

@@ -4,6 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.archive.dto.ArchiveInspectionDTO;
 import org.springblade.archive.entity.ArchiveInspection;
 
+import java.util.List;
+import java.util.Map;
+
 public interface IArchiveInspectionService extends IService<ArchiveInspection> {
     ArchiveInspectionDTO getbyFileId(Long fileId, Long userId);
+
+    Map<String,Map<String,Object>> getAllopinion(String fileIds);
 }

+ 2 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -88,4 +88,6 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	List<Map<String,List<Map<String,String>>>> getArchivesCabinet(ArchivesAutoVO archivesAuto);
 
 	R pageByArchivesAuto2(ArchivesAutoVO archivesAuto);
+
+    void getArchivesAuthByUser(Long projectId,Long contractId,Integer archiveType);
 }

+ 44 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveInspectionServiceImpl.java

@@ -11,7 +11,10 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 @AllArgsConstructor
@@ -44,4 +47,45 @@ public class ArchiveInspectionServiceImpl extends BaseServiceImpl<ArchiveInspect
         archiveInspectionDTO.setAllOpinion(allOpinion);
         return archiveInspectionDTO;
     }
+
+    @Override
+    public Map<String,Map<String,Object>> getAllopinion(String fileIds) {
+
+        LambdaQueryWrapper<ArchiveInspection> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(ArchiveInspection::getFileId, fileIds.split(","))
+                .eq(ArchiveInspection::getIsDeleted, 0);
+        List<ArchiveInspection> archiveInspectionList = archiveInspectionMapper.selectList(queryWrapper);
+        if(archiveInspectionList == null || archiveInspectionList.isEmpty()) {
+            return null;
+        }
+        Map<String,List<ArchiveInspection>> listMap = new HashMap<>();
+        for(ArchiveInspection archiveInspection : archiveInspectionList){
+            List<ArchiveInspection> list = null;
+            if(listMap.get(archiveInspection.getFileId().toString()) != null){
+                list = listMap.get(archiveInspection.getFileId().toString());
+            }else{
+                list = new ArrayList<>();
+            }
+            list.add(archiveInspection);
+            listMap.put(archiveInspection.getFileId().toString(),list);
+        }
+        Map<String,Map<String,Object>> map = new HashMap<>();
+        String allOpinion = "";
+        for(String key : listMap.keySet()) {
+            List<ArchiveInspection> inspections = listMap.get(key);
+            int count = 1;
+            for (ArchiveInspection archiveInspection : inspections) {
+                String opinion = archiveInspection.getOpinion();
+                if (opinion != null && !opinion.trim().isEmpty()) {
+                    allOpinion += count + ". " + opinion.trim() + " ; ";
+                    count++;
+                }
+            }
+            Map<String,Object> map1 = new HashMap<>();
+            map1.put("allOpinion",allOpinion);
+            map1.put("ArchiveName",inspections.get(0).getArchiveName());
+            map.put(key,map1);
+        }
+        return map;
+    }
 }

+ 47 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -183,10 +183,19 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//获取单位首节点
 		ArchiveTreeContract	contract = archiveTreeContractClient.getFirstNodeByTreeCode(vo.getProjectId(),vo.getArchiveType());
 		vo.setNodeId(contract.getId());
+		//获取合同段类型
+		ContractInfo contractInfo = contractClient.getContractById(vo.getContractId());
+		Integer contractType = contractInfo.getContractType();
+		//根据用户在当前合同段的权限,判断返回
+		BladeUser user = AuthUtil.getUser();
+		String name = baseMapper.getUserRoleName(vo.getProjectId(),vo.getContractId(),user.getUserId());
+		if (name.contains("超级管理员") || contractType == 3) {
+			vo.setContractId(null);
+		}
 		//根据单位查询出当前箱子所有档案,最大为160条
 		List<ArchivesAutoVO> archivesAutos = baseMapper.pageByArchivesAuto3(page, vo);
 		//根据条件筛选
-		if (vo.getInnerSearch() != null){
+		if (StringUtils.isNotBlank(vo.getInnerSearch())){
 			vo.setQueryValue(vo.getInnerSearch());
 			vo.setSearchType(1);
 			vo.setStorageTimes(null);
@@ -204,11 +213,17 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 		if (archivesAutos != null && archivesAutos.size() >0) {
 			for (ArchivesAutoVO aa : archivesAutos) {
+				//是否选中
 				if (ids.contains(aa.getId())){
 					aa.setIsSelect(1);
 				}else {
 					aa.setIsSelect(0);
 				}
+				//柜子里面侧面编号
+				if (aa.getFileNumber() != null && aa.getFileNumber() != "") {
+					String[] split = aa.getFileNumber().split("_");
+					aa.setFileNumber(split[split.length - 1]);
+				}
 				if (StringUtils.isNotBlank(aa.getStorageTime())) {
 					aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));
 				}
@@ -235,6 +250,28 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 	}
 
+	@Override
+	public void getArchivesAuthByUser(Long projectId,Long contractId,Integer archiveType) {
+		//获取合同段类型
+		ContractInfo contractInfo = contractClient.getContractById(contractId);
+		Integer contractType = contractInfo.getContractType();
+		//根据用户在当前合同段的权限,判断返回
+		BladeUser user = AuthUtil.getUser();
+		String name = baseMapper.getUserRoleName(projectId,contractId,user.getUserId());
+		if (!(name.contains("超级管理员") || (contractType == 3))) {
+			if (contractType == 1){
+				contractType = 2;
+			}else if (contractType == 2){
+				contractType = 3;
+			}else {
+				contractType = 1;
+			}
+			if (contractType != archiveType){
+				throw new ServiceException("无权限查看");
+			}
+		}
+	}
+
 	/**
 	 * 根据搜索获取档案柜
 	 * @param archivesAuto
@@ -247,6 +284,15 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		if (contract == null){
 			throw new ServiceException("归档树节点错误");
 		}
+		//获取合同段类型
+		ContractInfo contractInfo = contractClient.getContractById(archivesAuto.getContractId());
+		Integer contractType = contractInfo.getContractType();
+		//根据用户在当前合同段的权限,判断返回
+		BladeUser user = AuthUtil.getUser();
+		String name = baseMapper.getUserRoleName(archivesAuto.getProjectId(),archivesAuto.getContractId(),user.getUserId());
+		if (name.contains("超级管理员") || contractType == 3) {
+			archivesAuto.setContractId(null);
+		}
 		//如果没有获取到对应单位,则提示
 		archivesAuto.setNodeId(contract.getId());
 		//根据单位查询所有档案

+ 20 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ArchiveFileServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.feign.ArchiveInspectionInfoClient;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.vo.ArchiveFileVO;
 import org.springblade.business.mapper.ArchiveFileMapper;
@@ -36,6 +37,7 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
     private final NewIOSSClient iossClient;
 
     private ExecutorService executorService;
+    private final ArchiveInspectionInfoClient archiveInspectionInfoClient;
 
     @Override
     public IPage<ArchiveFileVO> selectArchiveFilePage(ArchiveFileVO vo) {
@@ -60,7 +62,7 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
 
         //获取业务字典
         List<DictBiz> sheetSourceList = this.dictBizClient.getList("sheet_source", "notRoot").getData();
-
+        StringBuffer fileIds = new StringBuffer();
         pageVoList.forEach(vos -> {
             vos.setIsApprovalValue(new Integer("0").equals(vos.getStatus()) ? "未上报" : new Integer("1").equals(vos.getStatus()) ? "待审批" : new Integer("2").equals(vos.getStatus()) ? "已审批" : "已废除");
             vos.setIsCertificationValue(new Integer("1").equals(vos.getIsCertification()) ? "已认证" : "未认证");
@@ -71,8 +73,25 @@ public class ArchiveFileServiceImpl extends BaseServiceImpl<ArchiveFileMapper, A
                     }
                 });
             }
+            fileIds.append(vos.getId()+",");
         });
+        if(vo.getRectification() != null &&(vo.getRectification() == 1 || vo.getRectification() == 2)) {
+            Map<String, Map<String, Object>> allopinion = archiveInspectionInfoClient.getAllopinion(fileIds.toString());
+            if (allopinion != null) {
+                pageVoList.forEach(vos -> {
+                    Map<String, Object> map = allopinion.get(vos.getId().toString());
+                    if (map != null) {
+                        if (map.get("ArchiveName") != null) {
+                            vos.setArchiveName(map.get("ArchiveName").toString());
+                        }
+                        if (map.get("allOpinion") != null) {
+                            vos.setAllOpinion(map.get("allOpinion").toString());
+                        }
+                    }
 
+                });
+            }
+        }
         return iPage.setRecords(pageVoList);
     }
 

+ 6 - 3
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -235,7 +235,10 @@ public class MetadataClassificationServiceImpl
 
             /**聚合层次**/
             ArchiveTreeContract archiveTreeContractById = archiveTreeContractClient.getArchiveTreeContractById(Long.parseLong(byId.getNodeId()));
-            List<ArchiveTreeContract> list = archiveTreeContractClient.getArchiveTreeContractListByIds(archiveTreeContractById.getAncestors());
+            String ancestors = archiveTreeContractById.getAncestors();
+            ancestors = ancestors.substring(ancestors.indexOf(","));
+            ancestors = ancestors + "," + archiveTreeContractById.getId();
+            List<ArchiveTreeContract> list = archiveTreeContractClient.getArchiveTreeContractListByIds(ancestors);
             StringBuffer nameStr = new StringBuffer();
             for (ArchiveTreeContract treeContract : list) {
                 nameStr.append(treeContract.getNodeName());
@@ -269,10 +272,10 @@ public class MetadataClassificationServiceImpl
             keyValue.put("题名", byId.getFileName());
             /**关键词**/
             String keyWords = "";
-            if (byId.getFileName().length() < 8) {
+            if (byId.getFileName().length() < 9) {
                 keyWords = byId.getFileName();
             } else {
-                keyWords = byId.getFileName().substring(0, 7);
+                keyWords = byId.getFileName().substring(0, 8);
             }
             keyValue.put("关键词", keyWords);
             /**摘要**/

+ 2 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -511,12 +511,13 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     }
 
 
-    @Scheduled(cron = "0 */2 * * * ?")
+    @Scheduled(cron = "0 */5 * * * ?")
     public void SignInfo() {
         //执行代码
         logger.debug("扫描开始");
         List<TaskBatch> maps = taskBatchService.getBaseMapper().selectList(Wrappers.<TaskBatch>lambdaQuery().eq(TaskBatch::getIsDeleted, 0));
         if (maps != null && maps.size() >= 1) {
+
             for (TaskBatch dataInfo : maps) {
                 String jsonData = dataInfo.getJsonData();
                 List<TaskApprovalVO> list = JSONArray.parseArray(jsonData, TaskApprovalVO.class);

+ 38 - 0
blade-service/blade-control/pom.xml

@@ -30,5 +30,43 @@
             <artifactId>blade-control-api</artifactId>
             <version>${bladex.project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-user-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>dockerfile-maven-plugin</artifactId>
+                <configuration>
+                    <username>${docker.username}</username>
+                    <password>${docker.password}</password>
+                    <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
+                    <tag>${project.version}</tag>
+                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
+                    <buildArgs>
+                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
+                    </buildArgs>
+                    <skip>false</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <compilerArguments>
+                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar:${java.home}/lib/jsse.jar
+                        </bootclasspath>
+                    </compilerArguments>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 78 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/CSysController.java

@@ -0,0 +1,78 @@
+/*
+ *      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.control.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.*;
+import lombok.AllArgsConstructor;
+
+import org.springblade.control.service.IDictInfoService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.manager.entity.ExctabCell;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springblade.system.user.vo.UserVO;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 参数信息表 控制器
+ *
+ * @author BladeX
+ * @since 2023-06-05
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sysinfo")
+@Api(value = "系统信息", tags = "系统信息接口")
+public class CSysController extends BladeController {
+
+  // 用户fen
+  private final IUserClient userClient;
+
+  //参数信息表
+  private final IDictInfoService dictInfoService;
+
+  /**
+   * 新增或修改 参数信息表
+   */
+  @PostMapping("/saveUser")
+  @ApiOperationSupport(order = 1)
+  @ApiOperation(value = "新增或修改", notes = "传入dictInfo")
+  public R submit(@Valid @RequestBody User user) {
+    return userClient.saveUser(user);
+  }
+
+
+  /**
+   * 分页 用户查询
+   */
+  @GetMapping("/selectUserlist")
+  @ApiOperationSupport(order = 2)
+  @ApiOperation(value = "用户分页查询", notes = "传入user")
+  public R<IPage<UserVO>> selectUserlist(UserVO user, Query query) {
+    IPage<UserVO> pages = dictInfoService.selectUserTabPage(Condition.getPage(query), user);
+    return R.data(pages);
+  }
+
+
+}

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

@@ -4,6 +4,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.ControlContractInfo;
 import org.springblade.control.service.IContractInfoService;
@@ -67,6 +68,16 @@ public class ContractInfoController {
         return R.data(contractInfoService.getContractInfoById(id));
     }
 
+    /**
+     * 合同列表,分页查询
+     */
+    @GetMapping("/getPage")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "合同列表,分页查询")
+    public R getPage(ControlContractInfoDTO dto,Query query) {
+        return R.data(contractInfoService.getPage(dto,query));
+    }
+
     /**
      * 获取合同类型字典
      */

+ 50 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/ContractReturnedInfoController.java

@@ -0,0 +1,50 @@
+package org.springblade.control.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.control.dto.ContractReturnedInfoDTO;
+import org.springblade.control.entity.ContractReturnedInfo;
+import org.springblade.control.entity.ControlContractInfo;
+import org.springblade.control.service.IContractInfoService;
+import org.springblade.control.service.IContractReturnedInfoService;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/6/6 16:03
+ **/
+@RestController
+@AllArgsConstructor
+@RequestMapping("/contractReturnedInfo")
+@Api(value = "合同回款接口", tags = "合同回款接口")
+public class ContractReturnedInfoController {
+
+    private final IContractReturnedInfoService contractReturnedInfoService;
+
+    /**
+     * 批量新增或修改回款信息
+     */
+    @PostMapping("/saveOrUpdateBatchReturned")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "批量新增或修改回款信息")
+    public R saveOrUpdateBatchReturned(@RequestBody ContractReturnedInfoDTO dto) {
+        contractReturnedInfoService.saveOrUpdateBatchReturned(dto);
+        return R.success("保存成功");
+    }
+
+    /**
+     * 获取合同回款列表
+     */
+    @GetMapping("/getContractReturnList")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "获取合同回款列表")
+    public R getContractReturnList(Long contractId){
+        return R.data(contractReturnedInfoService.getContractReturnList(contractId));
+    }
+}

+ 15 - 15
blade-service/blade-control/src/main/java/org/springblade/control/controller/DictInfoController.java

@@ -58,7 +58,7 @@ public class DictInfoController extends BladeController {
      * 新增或修改 参数信息表
      */
     @PostMapping("/submit")
-    @ApiOperationSupport(order = 6)
+    @ApiOperationSupport(order = 1)
     @ApiOperation(value = "新增或修改", notes = "传入dictInfo")
     public R submit(@Valid @RequestBody DictInfo dictInfo) {
         return R.status(dictInfoService.saveOrUpdate(dictInfo));
@@ -69,21 +69,21 @@ public class DictInfoController extends BladeController {
      * 删除 参数信息表
      */
     @PostMapping("/remove")
-    @ApiOperationSupport(order = 7)
+    @ApiOperationSupport(order = 2)
     @ApiOperation(value = "逻辑删除", notes = "传入ids")
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        return R.status(dictInfoService.deleteLogic(Func.toLongList(ids)));
+        return R.status(dictInfoService.removeBatchByIds(Func.toLongList(ids)));
     }
 
 
     /**
      * 获取字典
      */
-    @GetMapping("/dictionary")
-    @ApiOperationSupport(order = 8)
-    @ApiOperation(value = "获取字典", notes = "获取字典")
-    public R<List<DictBiz>> dictionary(String code) {
-        List<DictBiz> tree = dictInfoService.getList(code, "notRoot");
+    @GetMapping("/get-dict-info")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "参数信息列表", notes = "参数信息列表")
+    public R<List<DictInfo>> getDictInfo(String code) {
+        List<DictInfo> tree = dictInfoService.getDictInfo(code, "notRoot");
         return R.data(tree);
     }
 
@@ -93,10 +93,10 @@ public class DictInfoController extends BladeController {
     @GetMapping("/parent-list")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "code", value = "字典编号", paramType = "query", dataType = "string"),
-            @ApiImplicitParam(name = "dictValue", value = "字典名称", paramType = "query", dataType = "string")
+            @ApiImplicitParam(name = "type", value = "类型", paramType = "query", dataType = "Integer")
     })
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "列表", notes = "传入dict")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "顶级列表", notes = "顶级列表")
     public R<IPage<DictInfoVO>> parentList(@ApiIgnore @RequestParam Map<String, Object> dict, Query query) {
         return R.data(dictInfoService.parentList(dict, query));
     }
@@ -107,11 +107,11 @@ public class DictInfoController extends BladeController {
     @GetMapping("/child-list")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "code", value = "字典编号", paramType = "query", dataType = "string"),
-            @ApiImplicitParam(name = "dictValue", value = "字典名称", paramType = "query", dataType = "string"),
-            @ApiImplicitParam(name = "parentId", value = "字典名称", paramType = "query", dataType = "string")
+            @ApiImplicitParam(name = "parentId", value = "字典名称", paramType = "query", dataType = "string"),
+            @ApiImplicitParam(name = "type", value = "类型", paramType = "query", dataType = "Integer")
     })
-    @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "列表", notes = "传入dict")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "子列表", notes = "子列表")
     public R<List<DictInfoVO>> childList(@ApiIgnore @RequestParam Map<String, Object> dict, @RequestParam(required = false, defaultValue = "-1") Long parentId) {
         return R.data(dictInfoService.childList(dict, parentId));
     }

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

@@ -0,0 +1,163 @@
+package org.springblade.control.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.control.dto.EMFinancialReimbursementInfoDTO;
+import org.springblade.control.dto.EMLoanInfoDTO;
+import org.springblade.control.dto.EMPayInfoDTO;
+import org.springblade.control.service.EMFinancialReimbursementService;
+import org.springblade.control.service.EMLoanService;
+import org.springblade.control.service.EMPayService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMFinancialReimbursementInfoVO;
+import org.springblade.control.vo.EMLoanInfoVO;
+import org.springblade.control.vo.EMPayInfoVO;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/expense")
+@Api(value = "费用管理接口", tags = "费用管理接口")
+public class ExpenseManagerController extends BladeController {
+
+    private final EMFinancialReimbursementService financialReimbursementService;
+    private final EMPayService payService;
+    private final EMLoanService loanService;
+
+    @PostMapping("/financial/page")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "财务报销分页查询", notes = "传入EMFinancialReimbursementInfoDTO、Query")
+    public R<IPage<EMFinancialReimbursementInfoVO>> financialPage(EMFinancialReimbursementInfoDTO dto, Query query) {
+        return R.data(financialReimbursementService.financialPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/financial/draft/list")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "财务报销草稿箱列表")
+    public R<List<EMDraftVO>> financialDraftList() {
+        return R.data(financialReimbursementService.financialDraftList());
+    }
+
+    @GetMapping("/financial/detail")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "财务报销信息详情", notes = "传入财务报销信息id")
+    public R<EMFinancialReimbursementInfoVO> financialDetail(@RequestParam Long id) {
+        return R.data(financialReimbursementService.financialDetail(id));
+    }
+
+    @PostMapping("/financial/submit")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "财务报销信息提交", notes = "传入EMFinancialReimbursementInfoDTO")
+    public R<Object> financialSubmit(@RequestBody EMFinancialReimbursementInfoDTO dto) {
+        return R.status(financialReimbursementService.financialSubmit(dto));
+    }
+
+    @PostMapping("/financial/remove")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "财务报销记录物理删除", notes = "传入财务报销信息id")
+    public R<Object> financialRemove(@RequestParam Long id) {
+        return R.status(financialReimbursementService.financialRemove(id));
+    }
+
+    @PostMapping("/financial/cancel")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "财务报销记录上报撤销", notes = "传入财务报销信息id")
+    public R<Object> financialCancel(@RequestParam Long id) {
+        return R.status(financialReimbursementService.financialCancel(id));
+    }
+
+    @PostMapping("/pay/page")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation(value = "支付申请分页查询", notes = "传入EMPayInfoDTO、Query")
+    public R<IPage<EMPayInfoVO>> payPage(EMPayInfoDTO dto, Query query) {
+        return R.data(payService.payPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/pay/draft/list")
+    @ApiOperationSupport(order = 8)
+    @ApiOperation(value = "支付申请草稿箱列表")
+    public R<List<EMDraftVO>> payDraftList() {
+        return R.data(payService.payDraftList());
+    }
+
+    @GetMapping("/pay/detail")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "支付申请信息详情", notes = "传入支付申请信息id")
+    public R<EMPayInfoVO> payDetail(@RequestParam Long id) {
+        return R.data(payService.payDetail(id));
+    }
+
+    @PostMapping("/pay/submit")
+    @ApiOperationSupport(order = 10)
+    @ApiOperation(value = "支付申请提交", notes = "传入EMPayInfoDTO")
+    public R<Object> paySubmit(@RequestBody EMPayInfoDTO dto) {
+        return R.status(payService.paySubmit(dto));
+    }
+
+    @PostMapping("/pay/remove")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "支付申请记录物理删除", notes = "传入支付申请信息id")
+    public R<Object> payRemove(@RequestParam Long id) {
+        return R.status(payService.payRemove(id));
+    }
+
+    @PostMapping("/pay/cancel")
+    @ApiOperationSupport(order = 12)
+    @ApiOperation(value = "支付申请记录上报撤销", notes = "传入支付申请信息id")
+    public R<Object> payCancel(@RequestParam Long id) {
+        return R.status(payService.payCancel(id));
+    }
+
+    @PostMapping("/loan/page")
+    @ApiOperationSupport(order = 13)
+    @ApiOperation(value = "借款申请分页查询", notes = "传入EMLoanInfoDTO、Query")
+    public R<IPage<EMLoanInfoVO>> loanPage(EMLoanInfoDTO dto, Query query) {
+        return R.data(loanService.loanPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/loan/draft/list")
+    @ApiOperationSupport(order = 14)
+    @ApiOperation(value = "借款申请草稿箱列表")
+    public R<List<EMDraftVO>> loanDraftList() {
+        return R.data(loanService.loanDraftList());
+    }
+
+    @GetMapping("/loan/detail")
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "借款申请信息详情", notes = "传入支付申请信息id")
+    public R<EMLoanInfoVO> loanDetail(@RequestParam Long id) {
+        return R.data(loanService.loanDetail(id));
+    }
+
+    @PostMapping("/loan/submit")
+    @ApiOperationSupport(order = 16)
+    @ApiOperation(value = "借款申请提交", notes = "传入EMLoanInfoDTO")
+    public R<Object> loanSubmit(@RequestBody EMLoanInfoDTO dto) {
+        return R.status(loanService.loanSubmit(dto));
+    }
+
+    @PostMapping("/loan/remove")
+    @ApiOperationSupport(order = 17)
+    @ApiOperation(value = "借款申请记录物理删除", notes = "传入支付申请信息id")
+    public R<Object> loanRemove(@RequestParam Long id) {
+        return R.status(loanService.loanRemove(id));
+    }
+
+    @PostMapping("/loan/cancel")
+    @ApiOperationSupport(order = 18)
+    @ApiOperation(value = "借款申请记录上报撤销", notes = "传入支付申请信息id")
+    public R<Object> loanCancel(@RequestParam Long id) {
+        return R.status(loanService.loanCancel(id));
+    }
+
+
+}

+ 55 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java

@@ -0,0 +1,55 @@
+package org.springblade.control.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.control.dto.TaskProcessInfoDTO;
+import org.springblade.control.service.TaskProcessService;
+import org.springblade.control.vo.TaskProcessInfoDetailVO;
+import org.springblade.control.vo.TaskProcessInfoVO;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/approve")
+@Api(value = "审批管理接口", tags = "审批管理接口")
+public class TaskProcessController extends BladeController {
+
+    private final TaskProcessService taskProcessService;
+
+    @PostMapping("/task/page")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "审批管理任务分页查询", notes = "传入TaskProcessInfoDTO、Query")
+    public R<IPage<TaskProcessInfoVO>> taskPage(TaskProcessInfoDTO dto, Query query) {
+        return R.data(taskProcessService.taskPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/task/detail")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "审批管理任务详情", notes = "传入审批任务id")
+    public R<TaskProcessInfoDetailVO> taskDetail(@RequestParam String id) {
+        return R.data(taskProcessService.taskDetail(id));
+    }
+
+    @PostMapping("/task/reject")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "审批任务驳回", notes = "传入TaskProcessInfoDTO")
+    public R<Object> taskReject(TaskProcessInfoDTO dto) {
+        return R.status(taskProcessService.taskReject(dto));
+    }
+
+    @PostMapping("/task/submit")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "审批任务提交", notes = "传入审批任务id")
+    public R<Object> taskSubmit(@RequestParam String id) {
+        return R.status(taskProcessService.taskSubmit(id));
+    }
+
+}

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

@@ -3,6 +3,7 @@ package org.springblade.control.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.ControlContractInfo;
 import org.springblade.control.entity.ControlProjectInfo;
@@ -25,4 +26,6 @@ public interface ContractInfoMapper extends BaseMapper<ControlContractInfo> {
     List<ControlProjectInfo> getNoConnectionProject();
 
     ControlContractInfoVO getContractInfoById(@Param("id") Long id);
+
+    List<ControlContractInfoVO> getPage(IPage page,@Param("dto") ControlContractInfoDTO dto);
 }

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

@@ -18,4 +18,12 @@
             (select name  from c_control_project_info WHERE id = ci.project_id) as projectName
         FROM c_control_contract_info ci WHERE ci.id = #{id}
     </select>
+    <select id="getPage" resultType="org.springblade.control.vo.ControlContractInfoVO">
+        SELECT
+            ci.*,
+            (select dict_name  from c_dict_info WHERE code = 'contract_type' AND dict_value= ci.contract_type) as contractTypeValue,
+            IFNULL((select SUM(practical_returned_money) from c_contract_returned_info WHERE contract_id = ci.id),0)  as returnedMoney,
+            (ci.contract_money - IFNULL((select SUM(practical_returned_money) from c_contract_returned_info WHERE contract_id = ci.id),0)) as unreturnedMoney
+        FROM c_control_contract_info ci
+    </select>
 </mapper>

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

@@ -0,0 +1,24 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.control.entity.ContractReturnedInfo;
+import org.springblade.control.entity.ControlContractInfo;
+import org.springblade.control.entity.ControlProjectInfo;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.vo.ContractReturnedInfoVO;
+import org.springblade.control.vo.ControlContractInfoVO;
+
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:38
+ **/
+public interface ContractReturnedInfoMapper extends BaseMapper<ContractReturnedInfo> {
+
+    void deleteOldInfo(@Param("contractId") Long contractId);
+
+    List<ContractReturnedInfoVO> getContractReturnList(@Param("contractId") Long contractId);
+}

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

@@ -0,0 +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.ContractReturnedInfoMapper">
+
+
+    <delete id="deleteOldInfo">
+        delete from c_contract_returned_info
+        where contract_id = #{contractId} and  practical_returned_time is null and practical_returned_money is null
+    </delete>
+    <select id="getContractReturnList" resultType="org.springblade.control.vo.ContractReturnedInfoVO">
+        select
+            ri.*,
+            (select name from blade_user WHERE id = ri.reminder_user) as reminderUserName
+        from c_contract_returned_info ri where ri.contract_id = #{contractId}
+    </select>
+</mapper>

+ 4 - 2
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DictInfoMapper.java

@@ -21,7 +21,7 @@ import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.DictInfoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.system.entity.DictBiz;
+import org.springblade.system.user.vo.UserVO;
 
 import java.util.List;
 
@@ -48,5 +48,7 @@ public interface DictInfoMapper extends BaseMapper<DictInfo> {
      * @param code 字典编号
      * @return
      */
-    List<DictBiz> getList(@Param("code") String code, @Param("notRoot") String notRoot);
+    List<DictInfo> getDictInfo(@Param("code") String code, @Param("notRoot") String notRoot);
+
+    List<UserVO> selectUserTabPage(IPage page, @Param("excelTab") UserVO userinfo);
 }

+ 11 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/DictInfoMapper.xml

@@ -21,4 +21,15 @@
         where is_deleted = 0
     </select>
 
+    <select id="getDictInfo" resultMap="dictInfoResultMap">
+        select *
+        from c_dict_info
+        where is_deleted = 0
+    </select>
+
+    <select id="selectUserTabPage" resultMap="dictInfoResultMap">
+        select *
+        from blade_user
+        where is_deleted = 0
+    </select>
 </mapper>

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

@@ -0,0 +1,8 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.control.entity.EMFinancialReimbursementInfo;
+
+public interface EMFinancialReimbursementMapper extends BaseMapper<EMFinancialReimbursementInfo> {
+
+}

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMFinancialReimbursementMapper.xml

@@ -0,0 +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.EMFinancialReimbursementMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.EMFinancialReimbursementInfo">
+    </resultMap>
+
+
+</mapper>

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

@@ -0,0 +1,7 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.control.entity.EMLoanInfo;
+
+public interface EMLoanMapper extends BaseMapper<EMLoanInfo> {
+}

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMLoanMapper.xml

@@ -0,0 +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.EMLoanMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.EMLoanInfo">
+    </resultMap>
+
+
+</mapper>

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

@@ -0,0 +1,8 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.control.entity.EMPayInfo;
+
+public interface EMPayMapper extends BaseMapper<EMPayInfo> {
+
+}

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPayMapper.xml

@@ -0,0 +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.EMPayMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.EMPayInfo">
+    </resultMap>
+
+
+</mapper>

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

@@ -0,0 +1,8 @@
+package org.springblade.control.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.control.entity.TaskProcessInfo;
+
+public interface TaskProcessMapper extends BaseMapper<TaskProcessInfo> {
+
+}

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

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.control.mapper.TaskProcessMapper">
+
+
+</mapper>

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

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.EMFinancialReimbursementInfoDTO;
+import org.springblade.control.entity.EMFinancialReimbursementInfo;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMFinancialReimbursementInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface EMFinancialReimbursementService extends BaseService<EMFinancialReimbursementInfo> {
+
+    IPage<EMFinancialReimbursementInfoVO> financialPage(IPage<EMFinancialReimbursementInfo> page, EMFinancialReimbursementInfoDTO dto);
+
+    List<EMDraftVO> financialDraftList();
+
+    EMFinancialReimbursementInfoVO financialDetail(Long id);
+
+    boolean financialSubmit(EMFinancialReimbursementInfoDTO dto);
+
+    boolean financialRemove(Long id);
+
+    boolean financialCancel(Long id);
+
+}

+ 26 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/EMLoanService.java

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.EMLoanInfoDTO;
+import org.springblade.control.entity.EMLoanInfo;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMLoanInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface EMLoanService extends BaseService<EMLoanInfo> {
+
+    IPage<EMLoanInfoVO> loanPage(IPage<EMLoanInfo> page, EMLoanInfoDTO dto);
+
+    List<EMDraftVO> loanDraftList();
+
+    EMLoanInfoVO loanDetail(Long id);
+
+    boolean loanSubmit(EMLoanInfoDTO dto);
+
+    boolean loanRemove(Long id);
+
+    boolean loanCancel(Long id);
+
+}

+ 26 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/EMPayService.java

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.EMPayInfoDTO;
+import org.springblade.control.entity.EMPayInfo;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMPayInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface EMPayService extends BaseService<EMPayInfo> {
+
+    IPage<EMPayInfoVO> payPage(IPage<EMPayInfo> page, EMPayInfoDTO dto);
+
+    List<EMDraftVO> payDraftList();
+
+    EMPayInfoVO payDetail(Long id);
+
+    boolean paySubmit(EMPayInfoDTO dto);
+
+    boolean payRemove(Long id);
+
+    boolean payCancel(Long id);
+
+}

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

@@ -1,6 +1,7 @@
 package org.springblade.control.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.ControlContractInfo;
 import org.springblade.control.entity.ControlProjectInfo;
@@ -32,4 +33,6 @@ public interface IContractInfoService extends BaseService<ControlContractInfo> {
     void updateContractInfo(ControlContractInfo contractInfo);
 
     ControlContractInfoVO getContractInfoById(Long id);
+
+    List<ControlContractInfoVO> getPage(ControlContractInfoDTO dto,Query query);
 }

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

@@ -0,0 +1,30 @@
+package org.springblade.control.service;
+
+import org.springblade.control.dto.ContractReturnedInfoDTO;
+import org.springblade.control.entity.ContractReturnedInfo;
+import org.springblade.control.entity.ControlContractInfo;
+import org.springblade.control.entity.ControlProjectInfo;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.vo.ContractReturnedInfoVO;
+import org.springblade.control.vo.ControlContractInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:41
+ **/
+public interface IContractReturnedInfoService extends BaseService<ContractReturnedInfo> {
+
+    void saveOrUpdateBatchReturned(ContractReturnedInfoDTO dto);
+
+    /**
+     * 根据合同id获取合同已回款金额
+     */
+    BigDecimal getContractReturnedMoney(Long contractId);
+
+    List<ContractReturnedInfoVO> getContractReturnList(Long contractId);
+}

+ 14 - 5
blade-service/blade-control/src/main/java/org/springblade/control/service/IDictInfoService.java

@@ -16,13 +16,12 @@
  */
 package org.springblade.control.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.DictInfoVO;
-import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.mp.support.Query;
-import org.springblade.system.entity.DictBiz;
-import org.springblade.system.vo.DictBizVO;
+import org.springblade.system.user.vo.UserVO;
 
 import java.util.List;
 import java.util.Map;
@@ -33,7 +32,7 @@ import java.util.Map;
  * @author BladeX
  * @since 2023-06-05
  */
-public interface IDictInfoService extends BaseService<DictInfo> {
+public interface IDictInfoService extends IService<DictInfo> {
 
     /**
      * 自定义分页
@@ -51,7 +50,7 @@ public interface IDictInfoService extends BaseService<DictInfo> {
      * @param code 字典编号
      * @return
      */
-    List<DictBiz> getList(String code, String notRoot);
+    List<DictInfo> getDictInfo(String code, String notRoot);
 
 
     /**
@@ -71,4 +70,14 @@ public interface IDictInfoService extends BaseService<DictInfo> {
      * @return
      */
     List<DictInfoVO> childList(Map<String, Object> dict, Long parentId);
+
+
+    /**
+     * 自定义分页
+     *
+     * @param page
+     * @param userVO
+     * @return
+     */
+    IPage<UserVO> selectUserTabPage(IPage<UserVO> page, UserVO userVO);
 }

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

@@ -0,0 +1,20 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.TaskProcessInfoDTO;
+import org.springblade.control.entity.TaskProcessInfo;
+import org.springblade.control.vo.TaskProcessInfoDetailVO;
+import org.springblade.control.vo.TaskProcessInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+public interface TaskProcessService extends BaseService<TaskProcessInfo> {
+
+    IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto);
+
+    TaskProcessInfoDetailVO taskDetail(String id);
+
+    boolean taskReject(TaskProcessInfoDTO dto);
+
+    boolean taskSubmit(String id);
+
+}

+ 21 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ContractInfoServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.ControlContractInfoDTO;
 import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.entity.ControlContractInfo;
 import org.springblade.control.entity.ControlProjectInfo;
@@ -12,6 +13,7 @@ import org.springblade.control.entity.DictInfo;
 import org.springblade.control.mapper.ContractInfoMapper;
 import org.springblade.control.mapper.ProjectInfoMapper;
 import org.springblade.control.service.IContractInfoService;
+import org.springblade.control.service.IContractReturnedInfoService;
 import org.springblade.control.service.IProjectInfoService;
 import org.springblade.control.service.IProjectProcessService;
 import org.springblade.control.vo.ControlContractInfoVO;
@@ -23,6 +25,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -34,6 +37,8 @@ import java.util.List;
 @AllArgsConstructor
 public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper, ControlContractInfo> implements IContractInfoService {
 
+    private final IContractReturnedInfoService returnedInfoService;
+
     /**
      * 添加合同信息
      * @param contractInfo
@@ -88,6 +93,21 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
      */
     @Override
     public ControlContractInfoVO getContractInfoById(Long id) {
-        return baseMapper.getContractInfoById(id);
+        ControlContractInfoVO contractInfo = baseMapper.getContractInfoById(id);
+        BigDecimal returnedMoney = returnedInfoService.getContractReturnedMoney(id);
+        contractInfo.setReturnedMoney(returnedMoney);
+        contractInfo.setUnreturnedMoney(contractInfo.getContractMoney().subtract(returnedMoney));
+        return contractInfo;
+    }
+
+    /**
+     * 获取合同列表
+     * @param dto
+     * @return
+     */
+    @Override
+    public List<ControlContractInfoVO> getPage(ControlContractInfoDTO dto,Query query) {
+        IPage<ControlContractInfoVO> page = new Page<>(query.getCurrent(),query.getSize());
+        return baseMapper.getPage(page,dto);
     }
 }

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

@@ -0,0 +1,72 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import org.springblade.control.dto.ContractReturnedInfoDTO;
+import org.springblade.control.entity.ContractReturnedInfo;
+import org.springblade.control.entity.ControlContractInfo;
+import org.springblade.control.entity.ControlProjectInfo;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.mapper.ContractInfoMapper;
+import org.springblade.control.mapper.ContractReturnedInfoMapper;
+import org.springblade.control.service.IContractInfoService;
+import org.springblade.control.service.IContractReturnedInfoService;
+import org.springblade.control.vo.ContractReturnedInfoVO;
+import org.springblade.control.vo.ControlContractInfoVO;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/5/12 9:43
+ **/
+@Service
+@AllArgsConstructor
+public class ContractReturnedInfoServiceImpl extends BaseServiceImpl<ContractReturnedInfoMapper, ContractReturnedInfo> implements IContractReturnedInfoService {
+
+
+    /**
+     * 批量新增或保存合同回款信息
+     * @param dto
+     */
+    @Override
+    @Transactional
+    public void saveOrUpdateBatchReturned(ContractReturnedInfoDTO dto) {
+        baseMapper.deleteOldInfo(dto.getContractId());
+        this.saveOrUpdateBatch(dto.getList());
+    }
+
+    /**
+     * 根据合同id获取合同已回款
+     * @param contractId
+     * @return
+     */
+    @Override
+    public BigDecimal getContractReturnedMoney(Long contractId) {
+        BigDecimal money = new BigDecimal(0);
+        List<ContractReturnedInfo> list = this.list(new LambdaQueryWrapper<ContractReturnedInfo>().eq(ContractReturnedInfo::getContractId, contractId));
+        if (list != null && list.size() >0){
+            for (ContractReturnedInfo info : list) {
+                if (info.getPracticalReturnedMoney() != null){
+                    money = money.add(info.getPracticalReturnedMoney());
+                }
+            }
+        }
+        return money;
+    }
+
+    /**
+     * 获取合同回款列表
+     * @param contractId
+     * @return
+     */
+    @Override
+    public List<ContractReturnedInfoVO> getContractReturnList(Long contractId) {
+        return baseMapper.getContractReturnList(contractId);
+    }
+}

+ 12 - 7
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DictInfoServiceImpl.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.control.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.control.entity.DictInfo;
 import org.springblade.control.vo.DictInfoVO;
@@ -27,6 +28,7 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.system.cache.DictBizCache;
 import org.springblade.system.entity.DictBiz;
+import org.springblade.system.user.vo.UserVO;
 import org.springblade.system.vo.DictBizVO;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -42,7 +44,7 @@ import java.util.Map;
  * @since 2023-06-05
  */
 @Service
-public class DictInfoServiceImpl extends BaseServiceImpl<DictInfoMapper, DictInfo> implements IDictInfoService {
+public class DictInfoServiceImpl extends ServiceImpl<DictInfoMapper, DictInfo> implements IDictInfoService {
 
     @Override
     public IPage<DictInfoVO> selectDictInfoPage(IPage<DictInfoVO> page, DictInfoVO dictInfo) {
@@ -50,13 +52,13 @@ public class DictInfoServiceImpl extends BaseServiceImpl<DictInfoMapper, DictInf
     }
 
     @Override
-    public List<DictBiz> getList(String code, String notRoot) {
-        return baseMapper.getList(code, notRoot);
+    public List<DictInfo> getDictInfo(String code, String notRoot) {
+        return baseMapper.getDictInfo(code, notRoot);
     }
 
     @Override
     public IPage<DictInfoVO> parentList(Map<String, Object> dict, Query query) {
-        IPage<DictInfo> page = this.page(Condition.getPage(query), Condition.getQueryWrapper(dict, DictInfo.class).lambda().eq(DictInfo::getParentId, CommonConstant.TOP_PARENT_ID).orderByAsc(DictInfo::getSort));
+        IPage<DictInfo> page = this.page(Condition.getPage(query), Condition.getQueryWrapper(dict, DictInfo.class).lambda().eq(DictInfo::getParentId, CommonConstant.TOP_PARENT_ID).eq(DictInfo::getType, Integer.parseInt(dict.get("type") + "")).orderByAsc(DictInfo::getSort));
         return DictInfoWrapper.build().pageVO(page);
     }
 
@@ -65,9 +67,12 @@ public class DictInfoServiceImpl extends BaseServiceImpl<DictInfoMapper, DictInf
         if (parentId < 0) {
             return new ArrayList<>();
         }
-        dict.remove("parentId");
-        DictBiz parentDict = DictBizCache.getById(parentId);
-        List<DictInfo> list = this.list(Condition.getQueryWrapper(dict, DictInfo.class).lambda().ne(DictInfo::getId, parentId).eq(DictInfo::getCode, parentDict.getCode()).orderByAsc(DictInfo::getSort));
+        List<DictInfo> list = this.list(Condition.getQueryWrapper(dict, DictInfo.class).lambda().ne(DictInfo::getId, parentId).eq(DictInfo::getType, Integer.parseInt(dict.get("type") + "")).orderByAsc(DictInfo::getSort));
         return DictInfoWrapper.build().listNodeVO(list);
     }
+
+    @Override
+    public IPage<UserVO> selectUserTabPage(IPage<UserVO> page, UserVO userVO) {
+        return page.setRecords(baseMapper.selectUserTabPage(page, userVO));
+    }
 }

+ 193 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -0,0 +1,193 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.EMFinancialReimbursementInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.EMFinancialReimbursementMapper;
+import org.springblade.control.service.EMFinancialReimbursementService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMFinancialReimbursementInfoVO;
+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.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Service
+@AllArgsConstructor
+public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<EMFinancialReimbursementMapper, EMFinancialReimbursementInfo> implements EMFinancialReimbursementService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final TaskProcessServiceImpl taskProcessService;
+
+    @Override
+    public IPage<EMFinancialReimbursementInfoVO> financialPage(IPage<EMFinancialReimbursementInfo> page, EMFinancialReimbursementInfoDTO dto) {
+        QueryWrapper<EMFinancialReimbursementInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(EMFinancialReimbursementInfo::getIsDeleted, 0);
+        IPage<EMFinancialReimbursementInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMFinancialReimbursementInfo::getCreateTime));
+        List<DictInfo> dictInfoList = jdbcTemplate.query("select dict_name,dict_value from c_dict_info where code = 'expense_fr_type'", new BeanPropertyRowMapper<>(DictInfo.class));
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        return pages.convert(reimbursementInfo -> {
+            EMFinancialReimbursementInfoVO vo = new EMFinancialReimbursementInfoVO();
+            BeanUtils.copyProperties(reimbursementInfo, vo);
+            vo.setUserNameVesting(userMap.get(vo.getCreateUser()));
+            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("已审批") ? "已通过" : "未通过");
+            for (DictInfo dictInfo : dictInfoList) {
+                if (dictInfo.getDictValue().equals(vo.getFrType() + "")) {
+                    vo.setFrTypeName(dictInfo.getDictName());
+                    break;
+                }
+            }
+            vo.setProjectName(""); //TODO
+            return vo;
+        });
+    }
+
+    @Override
+    public List<EMDraftVO> financialDraftList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<EMFinancialReimbursementInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EMFinancialReimbursementInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(EMFinancialReimbursementInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(EMFinancialReimbursementInfo::getIsDeleted, 1); //暂存
+        List<EMFinancialReimbursementInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (EMFinancialReimbursementInfo obj : list) {
+            EMDraftVO vo = new EMDraftVO();
+            vo.setId(obj.getId());
+            userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + obj.getCreateUser() + "提交的日常报销" : ""));
+            vo.setUpdateTime(obj.getUpdateTime());
+            resultVOS.add(vo);
+        }
+        return resultVOS.stream()
+                .sorted(Comparator.comparing(EMDraftVO::getUpdateTime).reversed())
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public EMFinancialReimbursementInfoVO financialDetail(Long id) {
+        EMFinancialReimbursementInfo obj = baseMapper.selectById(id);
+        EMFinancialReimbursementInfoVO vo = BeanUtil.copyProperties(obj, EMFinancialReimbursementInfoVO.class);
+        //TODO vo.set
+        return vo;
+    }
+
+    @Override
+    public boolean financialSubmit(EMFinancialReimbursementInfoDTO dto) {
+        if (("1").equals(dto.getSubmitStatus())) {
+            dto.setIsDeleted(1); //暂存
+            dto.setStatus(0); //未上报
+            this.saveOrUpdate(dto);
+            return true;
+
+        } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
+            if (ObjectUtil.isNotEmpty(dto.getId()) && !new Integer(0).equals(dto.getStatus())) {
+                throw new ServiceException("当前填报的信息不是未上报状态,不允许操作!");
+            }
+            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser()) && ObjectUtil.isNotEmpty(dto.getCcUserList())) {
+                //新增审批任务
+                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(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());
+                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                //抄送人
+                List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
+                taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
+                taskProcessService.save(taskProcessInfo);
+
+                //新增信息
+                dto.setIsDeleted(0); //提交
+                dto.setStatus(1); //待审批
+                this.saveOrUpdate(dto);
+
+                //新增审批任务关联信息
+                jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ")");
+
+                //关联项目预算budgetPlanIds目前只做存储,在审批完成后闭环时再进行计算推送 TODO
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean financialRemove(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public boolean financialCancel(Long id) {
+        EMFinancialReimbursementInfo obj = baseMapper.selectById(id);
+        if (obj != null && obj.getStatus().equals(1)) {
+            //查询记录任务关联信息
+            ExpenseTaskRecord record = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class)).stream().findAny().orElse(null);
+            if (record != null) {
+                //删除上报的审批任务
+                jdbcTemplate.execute("delete from c_task_process_info where id = " + record.getTaskId());
+
+                //删除记录任务关联信息
+                jdbcTemplate.execute("delete from c_expense_task_record where expense_info_id = " + id + " and task_id = " + record.getTaskId());
+
+                //修改当前记录为未上报状态
+                this.update(Wrappers.<EMFinancialReimbursementInfo>lambdaUpdate().set(EMFinancialReimbursementInfo::getStatus, 0).eq(EMFinancialReimbursementInfo::getId, id));
+
+                return true;
+            }
+        }
+        return false;
+    }
+
+}

+ 77 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java

@@ -0,0 +1,77 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.AllArgsConstructor;
+import org.springblade.control.dto.EMLoanInfoDTO;
+import org.springblade.control.entity.EMLoanInfo;
+import org.springblade.control.mapper.EMLoanMapper;
+import org.springblade.control.service.EMLoanService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMLoanInfoVO;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class EMLoanServiceImpl extends BaseServiceImpl<EMLoanMapper, EMLoanInfo> implements EMLoanService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final TaskProcessServiceImpl taskProcessService;
+
+    @Override
+    public IPage<EMLoanInfoVO> loanPage(IPage<EMLoanInfo> page, EMLoanInfoDTO dto) {
+        QueryWrapper<EMLoanInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(EMLoanInfo::getIsDeleted, 1);
+        IPage<EMLoanInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMLoanInfo::getCreateTime));
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        return pages.convert(obj -> {
+            EMLoanInfoVO vo = new EMLoanInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+
+            //在财务报销里,财务报销审批闭环后,如果有选择抵消借款金额,那么扣除后,当前借款=0,就视为已还
+            vo.setReturnStatus(vo.getLoanMoney().compareTo(BigDecimal.valueOf(0)) == 0 ? "已还" : "未还");
+
+            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("已审批") ? "已通过" : "未通过");
+            return vo;
+        });
+    }
+
+    @Override
+    public List<EMDraftVO> loanDraftList() {
+        return null;
+    }
+
+    @Override
+    public EMLoanInfoVO loanDetail(Long id) {
+        return null;
+    }
+
+    @Override
+    public boolean loanSubmit(EMLoanInfoDTO dto) {
+        return false;
+    }
+
+    @Override
+    public boolean loanRemove(Long id) {
+        return false;
+    }
+
+    @Override
+    public boolean loanCancel(Long id) {
+        return false;
+    }
+}

+ 185 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java

@@ -0,0 +1,185 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.EMPayInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.EMPayMapper;
+import org.springblade.control.service.EMPayService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMPayInfoVO;
+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.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class EMPayServiceImpl extends BaseServiceImpl<EMPayMapper, EMPayInfo> implements EMPayService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final TaskProcessServiceImpl taskProcessService;
+
+    @Override
+    public IPage<EMPayInfoVO> payPage(IPage<EMPayInfo> page, EMPayInfoDTO dto) {
+        QueryWrapper<EMPayInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(EMPayInfo::getIsDeleted, 1);
+        IPage<EMPayInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMPayInfo::getCreateTime));
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        return pages.convert(obj -> {
+            EMPayInfoVO vo = new EMPayInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+            vo.setPayeeUserName(userMap.get(vo.getPayeeUserId()));
+            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("已审批") ? "已通过" : "未通过");
+            return vo;
+        });
+    }
+
+    @Override
+    public List<EMDraftVO> payDraftList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<EMPayInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EMPayInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(EMPayInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(EMPayInfo::getIsDeleted, 1); //暂存
+        List<EMPayInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (EMPayInfo obj : list) {
+            EMDraftVO vo = new EMDraftVO();
+            vo.setId(obj.getId());
+            userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + obj.getCreateUser() + "提交的支付申请" : ""));
+            vo.setUpdateTime(obj.getUpdateTime());
+            resultVOS.add(vo);
+        }
+        return resultVOS.stream()
+                .sorted(Comparator.comparing(EMDraftVO::getUpdateTime).reversed())
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public EMPayInfoVO payDetail(Long id) {
+        EMPayInfo obj = baseMapper.selectById(id);
+        EMPayInfoVO vo = BeanUtil.copyProperties(obj, EMPayInfoVO.class);
+        //TODO vo.set
+        return vo;
+    }
+
+    @Override
+    public boolean paySubmit(EMPayInfoDTO dto) {
+        if (("1").equals(dto.getSubmitStatus())) {
+            dto.setIsDeleted(1); //暂存
+            dto.setStatus(0); //未上报
+            this.saveOrUpdate(dto);
+            return true;
+
+        } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
+            if (ObjectUtil.isNotEmpty(dto.getId()) && !new Integer(0).equals(dto.getStatus())) {
+                throw new ServiceException("当前填报的信息不是未上报状态,不允许操作!");
+            }
+            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getFinanceUser()) && ObjectUtil.isNotEmpty(dto.getCashierUser()) && ObjectUtil.isNotEmpty(dto.getCcUserList())) {
+                //新增审批任务
+                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(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());
+                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                //抄送人
+                List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
+                taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
+                taskProcessService.save(taskProcessInfo);
+
+                //新增信息
+                dto.setIsDeleted(0); //提交
+                dto.setStatus(1); //待审批
+                this.saveOrUpdate(dto);
+
+                //新增审批任务关联信息
+                jdbcTemplate.execute("insert into c_expense_task_record(id,task_id,expense_info_id) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ")");
+
+                //关联项目、合同项目提成等目前只做存储,在审批完成后闭环时再进行计算推送 TODO
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean payRemove(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public boolean payCancel(Long id) {
+        EMPayInfo obj = baseMapper.selectById(id);
+        if (obj != null && obj.getStatus().equals(1)) {
+            //查询记录任务关联信息
+            ExpenseTaskRecord record = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class)).stream().findAny().orElse(null);
+            if (record != null) {
+                //删除上报的审批任务
+                jdbcTemplate.execute("delete from c_task_process_info where id = " + record.getTaskId());
+
+                //删除记录任务关联信息
+                jdbcTemplate.execute("delete from c_expense_task_record where expense_info_id = " + id + " and task_id = " + record.getTaskId());
+
+                //修改当前记录为未上报状态
+                this.update(Wrappers.<EMPayInfo>lambdaUpdate().set(EMPayInfo::getStatus, 0).eq(EMPayInfo::getId, id));
+
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+}

+ 158 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -0,0 +1,158 @@
+package org.springblade.control.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.time.DateUtils;
+import org.springblade.control.dto.TaskProcessInfoDTO;
+import org.springblade.control.entity.DictInfo;
+import org.springblade.control.entity.TaskProcessInfo;
+import org.springblade.control.mapper.TaskProcessMapper;
+import org.springblade.control.service.TaskProcessService;
+import org.springblade.control.vo.*;
+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.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, TaskProcessInfo> implements TaskProcessService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+
+    @Override
+    public IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("未获取到当前用户信息,请联系管理员");
+        }
+        QueryWrapper<TaskProcessInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        if (dto.getSelectType().equals("1")) { //待审批为待办任务
+            queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId());
+            queryWrapper.lambda().eq(TaskProcessInfo::getStatus, 1);
+        } else if (dto.getSelectType().equals("2")) { //已审核、已驳回为已办任务
+            queryWrapper.lambda().like(TaskProcessInfo::getAuditUserIds, SecureUtil.getUserId());
+            queryWrapper.lambda().in(TaskProcessInfo::getStatus, 2, 3);
+        } else if (dto.getSelectType().equals("3")) { //我发起的任务
+            if (ObjectUtil.isNotEmpty(dto.getSelectStatus()) && !dto.getSelectStatus().equals("1")) {
+                queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
+            }
+            queryWrapper.lambda().eq(TaskProcessInfo::getReportUserId, SecureUtil.getUserId());
+        } else if (dto.getSelectType().equals("4")) { //抄送给我的
+            if (ObjectUtil.isNotEmpty(dto.getSelectStatus()) && !dto.getSelectStatus().equals("1")) {
+                queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
+            }
+            queryWrapper.lambda().like(TaskProcessInfo::getCcUserIds, SecureUtil.getUserId());
+        }
+        if (StringUtils.isNotEmpty(dto.getStartTime()) && StringUtils.isNotEmpty(dto.getEndTime())) {
+            String endTime = dto.getEndTime();
+            endTime = DateUtil.format(DateUtils.addDays(DateUtil.parse(endTime, "yyyy-MM-dd"), 1), "yyyy-MM-dd");
+            queryWrapper.lambda().between(TaskProcessInfo::getReportDate, dto.getStartTime(), endTime);
+        }
+        IPage<TaskProcessInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, TaskProcessInfo::getReportDate));
+
+        List<DictInfo> dictInfoList = jdbcTemplate.query("select dict_name,dict_value from c_dict_info where code = 'report_type'", new BeanPropertyRowMapper<>(DictInfo.class));
+
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+
+        return pages.convert((obj -> {
+            TaskProcessInfoVO vo = new TaskProcessInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+            vo.setReportUserName(userMap.get(vo.getReportUserId()));
+            List<String> auditUserNames = Arrays.stream(vo.getAuditUserIds().split(","))
+                    .map(Long::parseLong).map(userMap::get)
+                    .collect(Collectors.toList());
+            vo.setAuditUserNames(StringUtils.join(auditUserNames, "、"));
+
+            vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : "已驳回"));
+
+            for (DictInfo dictInfo : dictInfoList) {
+                if ((vo.getTaskType() + "").equals(dictInfo.getDictValue())) {
+                    vo.setReportTypeName(dictInfo.getDictName());
+                    break;
+                }
+            }
+            return vo;
+        }));
+    }
+
+    @Override
+    public TaskProcessInfoDetailVO taskDetail(String id) {
+        TaskProcessInfoDetailVO vo = new TaskProcessInfoDetailVO();
+        TaskProcessInfo taskProcessInfo = baseMapper.selectById(id);
+        if (taskProcessInfo != null) {
+            //封装基础信息
+            Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+            List<DictInfo> dictInfoList = jdbcTemplate.query("select dict_name,dict_value from c_dict_info where code = 'report_type'", new BeanPropertyRowMapper<>(DictInfo.class));
+            TypeToTaskProcessDetailBasicsVO basicsVO = new TypeToTaskProcessDetailBasicsVO();
+            basicsVO.setTaskId(taskProcessInfo.getId());
+            basicsVO.setTaskName(taskProcessInfo.getTaskName());
+            for (DictInfo dictInfo : dictInfoList) {
+                if ((taskProcessInfo.getTaskType() + "").equals(dictInfo.getDictValue())) {
+                    basicsVO.setReportTypeName(dictInfo.getDictName());
+                    break;
+                }
+            }
+            String userName = userMap.get(taskProcessInfo.getReportUserId());
+            basicsVO.setReportUser(StringUtils.isNotEmpty(userName) ? userName : "");
+            basicsVO.setReportDate(taskProcessInfo.getReportDate());
+            vo.setBasicsInfo(basicsVO);
+
+            if ("1".equals((taskProcessInfo.getTaskType() + ""))) {
+                //计划任务类型1
+                TypeToTaskPlanDetailVO toTaskPlanDetailVO = new TypeToTaskPlanDetailVO();
+
+                toTaskPlanDetailVO.setTaskInfoList(null); //获取计划任务List TODO
+
+                //其他属性 TODO
+
+                vo.setToTaskPlanDetailVO(toTaskPlanDetailVO);
+
+            } else if (("2,3,4,5,6").contains(taskProcessInfo.getTaskType() + "")) {
+                //财务2、支付3、借款4、采购5、外包6类型
+                TypeToEMFDetailVO toEMFDetailVO = new TypeToEMFDetailVO();
+
+                toEMFDetailVO.setTaskInfoList(null); //获取计划任务List
+
+                //其他属性
+
+                vo.setTypeToEMFDetailVO(toEMFDetailVO);
+
+            } else {
+                //其他类型
+
+            }
+        }
+        return vo;
+    }
+
+    @Override
+    public boolean taskReject(TaskProcessInfoDTO dto) {
+        return this.update(Wrappers.<TaskProcessInfo>lambdaUpdate().set(TaskProcessInfo::getStatus, 3).set(TaskProcessInfo::getRejectDesc, dto.getRejectDesc()).eq(TaskProcessInfo::getId, dto.getId()));
+    }
+
+    @Override
+    public boolean taskSubmit(String id) {
+        //TODO
+        return true;
+    }
+
+
+}

+ 13 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -3,6 +3,12 @@ package com.mixsmart.utils;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.CannedAccessControlList;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import java.awt.Color;
@@ -23,6 +29,7 @@ import org.jfree.chart.title.TextTitle;
 import org.jfree.data.xy.DefaultXYDataset;
 import org.jfree.ui.RectangleInsets;
 import org.jsoup.Jsoup;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.IoUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
@@ -372,7 +379,7 @@ public class FormulaUtils {
 
 
     private static boolean isContainKeywords(String s) {
-        List<String> keywords = Arrays.asList( ":", "个","附录","抽查","测","求","小于","大于","检查","仪","按","不","各","记录");
+        List<String> keywords = Arrays.asList( ":", "个","附录","抽查","测","求","小于","大于","检查","仪","按","不","各","记录","且","规定");
         return keywords.stream().anyMatch(s::contains);
     }
 
@@ -411,6 +418,8 @@ public class FormulaUtils {
             ,"单桩每延米喷粉 (浆)量_不小于设计_查施工记录_实测值或偏差值"
             ,"搭接宽度(mm)_≥150【纵向】_尺量:抽查2%_实测值或实测偏差值",
             "搭接宽度(mm)_≥50(横向)_尺量:抽查2%_实测值或实测偏差值"
+            ,"竖直度(mm)_挖孔桩_0.5%桩长,且≤200_铅锤线:每桩检测_实测值或实测偏差值"
+            , "2△_压浆压力值 (Mpa)_满足施工技术 规范规定_查油压表读书;每管道检查_实测值或实测偏差值"
     );
 
 /*    public static void main(String[] args) {
@@ -568,4 +577,7 @@ public class FormulaUtils {
 //    }
 
 
+
+
+
 }

+ 5 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1587,19 +1587,19 @@ public class ExcelTabController extends BladeController {
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
         if (maps.size() >= 1) {
             Map<String, Object> stringObjectMap = maps.get(0);
-            Object pdfUrl = stringObjectMap.get("pdf_url");
+            String pdfUrl = stringObjectMap.get("pdf_url") + "";
             if (stringObjectMap.get("e_visa_pdf_url") != null) {
                 //优先使用电签的pdf
-                pdfUrl = stringObjectMap.get("e_visa_pdf_url");
+                pdfUrl = stringObjectMap.get("e_visa_pdf_url") + "";
             }
 
             if (stringObjectMap.get("pdf_trial_url") != null || stringObjectMap.get("pdf_trial_url_position") != null) {
                 //合并试验关联文件、试验工程部位信息的pdf
-                pdfUrl = this.mergePdfShow(pdfUrl, stringObjectMap);
+                pdfUrl = this.mergePdfShow(pdfUrl, stringObjectMap) + "";
             }
 
-            if (StringUtils.isEmpty(pdfUrl + "")) {
-                return R.fail(300, "无数据");
+            if (StringUtils.isEmpty(pdfUrl) || pdfUrl.equals("null")) {
+                return R.fail("获取PDF失败");
             } else {
                 return R.data(pdfUrl);
             }

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

@@ -1599,7 +1599,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     @Override
     public void getBussPdfs(String nodeId, String classify, String contractId, String projectId) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        //String file_path = "/Users/hongchuangyanfa/Desktop/";
         // 获取有权限的节点信息
         List<AppWbsTreeContractVO> wbsTreeContractList = wbsTreeContractService.searchNodeAllTable(nodeId, classify, contractId, projectId);
         List<String> data = new ArrayList<>();

+ 0 - 127
src/main/java/org/springblade/control/controller/DictInfoController.java

@@ -1,127 +0,0 @@
-/*
- *      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.control.controller;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
-import org.springblade.core.mp.support.Condition;
-import org.springblade.core.mp.support.Query;
-import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.Func;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.bind.annotation.RequestParam;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.control.entity.DictInfo;
-import org.springblade.control.vo.DictInfoVO;
-import org.springblade.control.service.IDictInfoService;
-import org.springblade.core.boot.ctrl.BladeController;
-
-/**
- * 参数信息表 控制器
- *
- * @author BladeX
- * @since 2023-06-05
- */
-@RestController
-@AllArgsConstructor
-@RequestMapping("/dictinfo")
-@Api(value = "参数信息表", tags = "参数信息表接口")
-public class DictInfoController extends BladeController {
-
-	private final IDictInfoService dictInfoService;
-
-	/**
-	 * 详情
-	 */
-	@GetMapping("/detail")
-	@ApiOperationSupport(order = 1)
-	@ApiOperation(value = "详情", notes = "传入dictInfo")
-	public R<DictInfo> detail(DictInfo dictInfo) {
-		DictInfo detail = dictInfoService.getOne(Condition.getQueryWrapper(dictInfo));
-		return R.data(detail);
-	}
-
-	/**
-	 * 分页 参数信息表
-	 */
-	@GetMapping("/list")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页", notes = "传入dictInfo")
-	public R<IPage<DictInfo>> list(DictInfo dictInfo, Query query) {
-		IPage<DictInfo> pages = dictInfoService.page(Condition.getPage(query), Condition.getQueryWrapper(dictInfo));
-		return R.data(pages);
-	}
-
-	/**
-	 * 自定义分页 参数信息表
-	 */
-	@GetMapping("/page")
-	@ApiOperationSupport(order = 3)
-	@ApiOperation(value = "分页", notes = "传入dictInfo")
-	public R<IPage<DictInfoVO>> page(DictInfoVO dictInfo, Query query) {
-		IPage<DictInfoVO> pages = dictInfoService.selectDictInfoPage(Condition.getPage(query), dictInfo);
-		return R.data(pages);
-	}
-
-	/**
-	 * 新增 参数信息表
-	 */
-	@PostMapping("/save")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增", notes = "传入dictInfo")
-	public R save(@Valid @RequestBody DictInfo dictInfo) {
-		return R.status(dictInfoService.save(dictInfo));
-	}
-
-	/**
-	 * 修改 参数信息表
-	 */
-	@PostMapping("/update")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入dictInfo")
-	public R update(@Valid @RequestBody DictInfo dictInfo) {
-		return R.status(dictInfoService.updateById(dictInfo));
-	}
-
-	/**
-	 * 新增或修改 参数信息表
-	 */
-	@PostMapping("/submit")
-	@ApiOperationSupport(order = 6)
-	@ApiOperation(value = "新增或修改", notes = "传入dictInfo")
-	public R submit(@Valid @RequestBody DictInfo dictInfo) {
-		return R.status(dictInfoService.saveOrUpdate(dictInfo));
-	}
-
-	
-	/**
-	 * 删除 参数信息表
-	 */
-	@PostMapping("/remove")
-	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "逻辑删除", notes = "传入ids")
-	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-		return R.status(dictInfoService.deleteLogic(Func.toLongList(ids)));
-	}
-
-	
-}

+ 0 - 34
src/main/java/org/springblade/control/dto/DictInfoDTO.java

@@ -1,34 +0,0 @@
-/*
- *      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.control.dto;
-
-import org.springblade.control.entity.DictInfo;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 参数信息表数据传输对象实体类
- *
- * @author BladeX
- * @since 2023-06-05
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class DictInfoDTO extends DictInfo {
-	private static final long serialVersionUID = 1L;
-
-}

+ 0 - 64
src/main/java/org/springblade/control/entity/DictInfo.java

@@ -1,64 +0,0 @@
-/*
- *      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.control.entity;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-import org.springblade.core.mp.base.BaseEntity;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 参数信息表实体类
- *
- * @author BladeX
- * @since 2023-06-05
- */
-@Data
-@TableName("c_dict_info")
-@EqualsAndHashCode(callSuper = true)
-public class DictInfo extends BaseEntity {
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	* 父主键
-	*/
-		private Long parentId;
-	/**
-	* 字典名称
-	*/
-		private String dictName;
-	/**
-	* 字典值
-	*/
-		private String dictValue;
-	/**
-	* 排序
-	*/
-		private Integer sort;
-	/**
-	* 参数类型
-	*/
-		private Integer type;
-	/**
-	* 自定义码
-	*/
-		private String code;
-
-
-}

+ 0 - 42
src/main/java/org/springblade/control/mapper/DictInfoMapper.java

@@ -1,42 +0,0 @@
-/*
- *      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.control.mapper;
-
-import org.springblade.control.entity.DictInfo;
-import org.springblade.control.vo.DictInfoVO;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import java.util.List;
-
-/**
- * 参数信息表 Mapper 接口
- *
- * @author BladeX
- * @since 2023-06-05
- */
-public interface DictInfoMapper extends BaseMapper<DictInfo> {
-
-	/**
-	 * 自定义分页
-	 *
-	 * @param page
-	 * @param dictInfo
-	 * @return
-	 */
-	List<DictInfoVO> selectDictInfoPage(IPage page, DictInfoVO dictInfo);
-
-}

+ 0 - 32
src/main/java/org/springblade/control/mapper/DictInfoMapper.xml

@@ -1,32 +0,0 @@
-<?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.DictInfoMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="dictInfoResultMap" type="org.springblade.control.entity.DictInfo">
-        <result column="id" property="id"/>
-        <result column="is_deleted" property="isDeleted"/>
-        <result column="parent_id" property="parentId"/>
-        <result column="dict_name" property="dictName"/>
-        <result column="dict_value" property="dictValue"/>
-        <result column="sort" property="sort"/>
-        <result column="type" property="type"/>
-        <result column="code" property="code"/>
-    </resultMap>
-
-
-    <select id="selectDictInfoPage" resultMap="dictInfoResultMap">
-        select *
-        from c_dict_info
-        where is_deleted = 0
-    </select>
-
-    <select id="getList" resultMap="dictInfoResultMap">
-        select * from c_dict_info where code = #{code}
-        <if test="notRoot != null and notRoot != ''">
-            and parent_id > 0
-        </if>
-        and is_deleted = 0
-        order by sort
-    </select>
-</mapper>

+ 0 - 41
src/main/java/org/springblade/control/service/IDictInfoService.java

@@ -1,41 +0,0 @@
-/*
- *      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.control.service;
-
-import org.springblade.control.entity.DictInfo;
-import org.springblade.control.vo.DictInfoVO;
-import org.springblade.core.mp.base.BaseService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-
-/**
- * 参数信息表 服务类
- *
- * @author BladeX
- * @since 2023-06-05
- */
-public interface IDictInfoService extends BaseService<DictInfo> {
-
-	/**
-	 * 自定义分页
-	 *
-	 * @param page
-	 * @param dictInfo
-	 * @return
-	 */
-	IPage<DictInfoVO> selectDictInfoPage(IPage<DictInfoVO> page, DictInfoVO dictInfo);
-
-}

+ 0 - 41
src/main/java/org/springblade/control/service/impl/DictInfoServiceImpl.java

@@ -1,41 +0,0 @@
-/*
- *      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.control.service.impl;
-
-import org.springblade.control.entity.DictInfo;
-import org.springblade.control.vo.DictInfoVO;
-import org.springblade.control.mapper.DictInfoMapper;
-import org.springblade.control.service.IDictInfoService;
-import org.springblade.core.mp.base.BaseServiceImpl;
-import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-
-/**
- * 参数信息表 服务实现类
- *
- * @author BladeX
- * @since 2023-06-05
- */
-@Service
-public class DictInfoServiceImpl extends BaseServiceImpl<DictInfoMapper, DictInfo> implements IDictInfoService {
-
-	@Override
-	public IPage<DictInfoVO> selectDictInfoPage(IPage<DictInfoVO> page, DictInfoVO dictInfo) {
-		return page.setRecords(baseMapper.selectDictInfoPage(page, dictInfo));
-	}
-
-}

+ 0 - 34
src/main/java/org/springblade/control/vo/DictInfoVO.java

@@ -1,34 +0,0 @@
-/*
- *      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.control.vo;
-
-import org.springblade.control.entity.DictInfo;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * 参数信息表视图实体类
- *
- * @author BladeX
- * @since 2023-06-05
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class DictInfoVO extends DictInfo {
-	private static final long serialVersionUID = 1L;
-
-}

+ 0 - 20
src/main/java/sql/dictinfo.menu.sql

@@ -1,20 +0,0 @@
-INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`,
-                         `is_open`, `remark`, `is_deleted`)
-VALUES ('1665658060720152578', 1123598815738675201, 'dictinfo', '参数信息表', 'menu', '/control/dictinfo', NULL, 1, 1, 0, 1,
-        NULL, 0);
-INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`,
-                         `is_open`, `remark`, `is_deleted`)
-VALUES ('1665658060720152579', '1665658060720152578', 'dictinfo_add', '新增', 'add', '/control/dictinfo/add', 'plus', 1,
-        2, 1, 1, NULL, 0);
-INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`,
-                         `is_open`, `remark`, `is_deleted`)
-VALUES ('1665658060720152580', '1665658060720152578', 'dictinfo_edit', '修改', 'edit', '/control/dictinfo/edit', 'form',
-        2, 2, 2, 1, NULL, 0);
-INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`,
-                         `is_open`, `remark`, `is_deleted`)
-VALUES ('1665658060720152581', '1665658060720152578', 'dictinfo_delete', '删除', 'delete',
-        '/api/blade-control/dictinfo/remove', 'delete', 3, 2, 3, 1, NULL, 0);
-INSERT INTO `blade_menu`(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`,
-                         `is_open`, `remark`, `is_deleted`)
-VALUES ('1665658060720152582', '1665658060720152578', 'dictinfo_view', '查看', 'view', '/control/dictinfo/view',
-        'file-text', 4, 2, 2, 1, NULL, 0);