Parcourir la source

费用管理相关

liuyc il y a 2 ans
Parent
commit
dab1cb7f1a
32 fichiers modifiés avec 1081 ajouts et 67 suppressions
  1. 7 4
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTO.java
  2. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMLoanInfoDTO.java
  3. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMPayInfoDTO.java
  4. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMFinancialReimbursementInfo.java
  5. 41 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMLoanInfo.java
  6. 64 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMPayInfo.java
  7. 16 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ExpenseTaskRecord.java
  8. 24 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMDraftVO.java
  9. 0 16
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoDraftVO.java
  10. 19 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoVO.java
  11. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMLoanInfoVO.java
  12. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMPayInfoVO.java
  13. 3 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/LogHistoryInfoReadVO.java
  14. 24 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskPlanInfoVO.java
  15. 24 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessInfoDetailVO.java
  16. 46 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToEMFDetailVO.java
  17. 34 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToTaskPlanDetailVO.java
  18. 30 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TypeToTaskProcessDetailBasicsVO.java
  19. 107 8
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExpenseManagerController.java
  20. 20 8
      blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java
  21. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMLoanMapper.java
  22. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMLoanMapper.xml
  23. 8 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPayMapper.java
  24. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPayMapper.xml
  25. 4 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMFinancialReimbursementService.java
  26. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMLoanService.java
  27. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMPayService.java
  28. 6 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/TaskProcessService.java
  29. 103 18
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  30. 77 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java
  31. 185 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java
  32. 53 8
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

+ 7 - 4
blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMFinancialReimbursementInfoDTO.java

@@ -14,15 +14,18 @@ public class EMFinancialReimbursementInfoDTO extends EMFinancialReimbursementInf
     private String submitStatus;
 
     @ApiModelProperty(value = "部门负责人")
-    private EMProcessTaskUser responsibleObj;
+    private EMProcessTaskUser responsibleUser;
 
     @ApiModelProperty(value = "财务人员")
-    private EMProcessTaskUser financeObj;
+    private EMProcessTaskUser financeUser;
+
+    @ApiModelProperty(value = "最终确认付款人")
+    private EMProcessTaskUser finalConfirmationUser;
 
     @ApiModelProperty(value = "出纳人")
-    private EMProcessTaskUser cashierObj;
+    private EMProcessTaskUser cashierUser;
 
     @ApiModelProperty(value = "抄送人列表")
-    private List<EMProcessTaskUser> ccUserObjList;
+    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;
+
+}

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

@@ -49,7 +49,7 @@ public class EMFinancialReimbursementInfo extends BaseEntity {
     @ApiModelProperty(value = "归属人id")
     private Long userIdVesting;
 
-    @ApiModelProperty(value = "审批状态1=待审批 2=已审批 3=已驳回")
+    @ApiModelProperty(value = "审批状态0=未上报 1=待审批 2=已审批 3=已驳回")
     private Integer status;
 
     @ApiModelProperty(value = "是否抵扣借款 0=否 1=是")

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

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

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

+ 0 - 16
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMFinancialReimbursementInfoDraftVO.java

@@ -1,16 +0,0 @@
-package org.springblade.control.vo;
-
-import lombok.Data;
-
-import java.util.Date;
-
-@Data
-public class EMFinancialReimbursementInfoDraftVO  {
-
-    private Long id;
-
-    private String title;
-
-    private Date updateTime;
-
-}

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

@@ -1,9 +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;
+
+}

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

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

@@ -6,9 +6,15 @@ 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.vo.EMFinancialReimbursementInfoDraftVO;
+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;
@@ -24,10 +30,12 @@ import java.util.List;
 public class ExpenseManagerController extends BladeController {
 
     private final EMFinancialReimbursementService financialReimbursementService;
+    private final EMPayService payService;
+    private final EMLoanService loanService;
 
-    @GetMapping("/financial/page")
+    @PostMapping("/financial/page")
     @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "财务报销分页查询")
+    @ApiOperation(value = "财务报销分页查询", notes = "传入EMFinancialReimbursementInfoDTO、Query")
     public R<IPage<EMFinancialReimbursementInfoVO>> financialPage(EMFinancialReimbursementInfoDTO dto, Query query) {
         return R.data(financialReimbursementService.financialPage(Condition.getPage(query), dto));
     }
@@ -35,30 +43,121 @@ public class ExpenseManagerController extends BladeController {
     @GetMapping("/financial/draft/list")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "财务报销草稿箱列表")
-    public R<List<EMFinancialReimbursementInfoDraftVO>> financialDraftList() {
+    public R<List<EMDraftVO>> financialDraftList() {
         return R.data(financialReimbursementService.financialDraftList());
     }
 
     @GetMapping("/financial/detail")
     @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "财务报销信息详情")
+    @ApiOperation(value = "财务报销信息详情", notes = "传入财务报销信息id")
     public R<EMFinancialReimbursementInfoVO> financialDetail(@RequestParam Long id) {
         return R.data(financialReimbursementService.financialDetail(id));
     }
 
-    @GetMapping("/financial/submit")
+    @PostMapping("/financial/submit")
     @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "财务报销信息详情")
+    @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 = "财务报销记录物理删除")
+    @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));
+    }
+
 
 }

+ 20 - 8
blade-service/blade-control/src/main/java/org/springblade/control/controller/TaskProcessController.java

@@ -7,15 +7,13 @@ 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.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 @RestController
@@ -26,18 +24,32 @@ public class TaskProcessController extends BladeController {
 
     private final TaskProcessService taskProcessService;
 
-    @GetMapping("/task/page")
+    @PostMapping("/task/page")
     @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "审批管理任务分页查询")
+    @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 = "审批管理任务详情")
-    public R<TaskProcessInfoVO> taskDetail(@RequestParam String id) {
+    @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));
+    }
+
 }

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

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

@@ -3,7 +3,7 @@ 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.EMFinancialReimbursementInfoDraftVO;
+import org.springblade.control.vo.EMDraftVO;
 import org.springblade.control.vo.EMFinancialReimbursementInfoVO;
 import org.springblade.core.mp.base.BaseService;
 
@@ -13,7 +13,7 @@ public interface EMFinancialReimbursementService extends BaseService<EMFinancial
 
     IPage<EMFinancialReimbursementInfoVO> financialPage(IPage<EMFinancialReimbursementInfo> page, EMFinancialReimbursementInfoDTO dto);
 
-    List<EMFinancialReimbursementInfoDraftVO> financialDraftList();
+    List<EMDraftVO> financialDraftList();
 
     EMFinancialReimbursementInfoVO financialDetail(Long id);
 
@@ -21,4 +21,6 @@ public interface EMFinancialReimbursementService extends BaseService<EMFinancial
 
     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);
+
+}

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

@@ -3,6 +3,7 @@ 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;
 
@@ -10,6 +11,10 @@ public interface TaskProcessService extends BaseService<TaskProcessInfo> {
 
     IPage<TaskProcessInfoVO> taskPage(IPage<TaskProcessInfo> page, TaskProcessInfoDTO dto);
 
-    TaskProcessInfoVO taskDetail(String id);
+    TaskProcessInfoDetailVO taskDetail(String id);
+
+    boolean taskReject(TaskProcessInfoDTO dto);
+
+    boolean taskSubmit(String id);
 
 }

+ 103 - 18
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -3,21 +3,27 @@ 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.EMFinancialReimbursementInfo;
+import org.springblade.control.entity.*;
 import org.springblade.control.mapper.EMFinancialReimbursementMapper;
 import org.springblade.control.service.EMFinancialReimbursementService;
-import org.springblade.control.vo.EMFinancialReimbursementInfoDraftVO;
+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;
@@ -30,41 +36,59 @@ import java.util.stream.Collectors;
 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, 1);
+        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);
-            //TODO vo.set
+            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<EMFinancialReimbursementInfoDraftVO> financialDraftList() {
+    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, now, threeMonthsAgo);
-        queryWrapper.eq(EMFinancialReimbursementInfo::getIsDeleted, 1);
+        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<EMFinancialReimbursementInfoDraftVO> resultVOS = new ArrayList<>();
+        List<EMDraftVO> resultVOS = new ArrayList<>();
         for (EMFinancialReimbursementInfo obj : list) {
-            EMFinancialReimbursementInfoDraftVO vo = new EMFinancialReimbursementInfoDraftVO();
+            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(EMFinancialReimbursementInfoDraftVO::getUpdateTime).reversed())
+                .sorted(Comparator.comparing(EMDraftVO::getUpdateTime).reversed())
                 .collect(Collectors.toList());
     }
 
@@ -78,23 +102,62 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<EMFinan
 
     @Override
     public boolean financialSubmit(EMFinancialReimbursementInfoDTO dto) {
-        if (("1").equals(dto.getSubmitStatus())) { //暂存
-
-            dto.setIsDeleted(1);
+        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.getResponsibleObj()) && ObjectUtil.isNotEmpty(dto.getFinanceObj()) && ObjectUtil.isNotEmpty(dto.getCashierObj()) && ObjectUtil.isNotEmpty(dto.getCcUserObjList())) {
-                //新建任务 TODO
+            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());
 
-                //新增任务id与报销id关系信息
+                //审批人
+                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, ","));
 
-                dto.setIsDeleted(0);
+                //抄送人
+                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("获取当前流程人员信息失败,请联系管理员");
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
             }
         }
         return false;
@@ -105,4 +168,26 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<EMFinan
         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;
+    }
+
+
+}

+ 53 - 8
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -2,6 +2,7 @@ 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;
@@ -10,11 +11,12 @@ 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.TaskProcessInfoVO;
+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;
@@ -79,7 +81,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                     .collect(Collectors.toList());
             vo.setAuditUserNames(StringUtils.join(auditUserNames, "、"));
 
-            vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审" : "已驳回"));
+            vo.setStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审" : "已驳回"));
 
             for (DictInfo dictInfo : dictInfoList) {
                 if ((vo.getTaskType() + "").equals(dictInfo.getDictValue())) {
@@ -92,21 +94,64 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
     }
 
     @Override
-    public TaskProcessInfoVO taskDetail(String id) {
+    public TaskProcessInfoDetailVO taskDetail(String id) {
+        TaskProcessInfoDetailVO vo = new TaskProcessInfoDetailVO();
         TaskProcessInfo taskProcessInfo = baseMapper.selectById(id);
         if (taskProcessInfo != null) {
-            if (taskProcessInfo.getTaskType().equals(1)) {
-                //任务审批=1
+            //封装基础信息
+            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
+                //财务2、支付3、借款4、采购5、外包6类型
+                TypeToEMFDetailVO toEMFDetailVO = new TypeToEMFDetailVO();
+
+                toEMFDetailVO.setTaskInfoList(null); //获取计划任务List
+
+                //其他属性
+
+                vo.setTypeToEMFDetailVO(toEMFDetailVO);
 
             } else {
-                //其他
+                //其他类型
 
             }
         }
-        return null;
+        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;
     }