浏览代码

费用管理相关

liuyc 2 年之前
父节点
当前提交
62e6398963
共有 42 个文件被更改,包括 2141 次插入21 次删除
  1. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/AttendanceTripInfoDTO.java
  2. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMInvoiceInfoDTO.java
  3. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMOutsourcingPayInfoDTO.java
  4. 31 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMPurchaseInfoDTO.java
  5. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/dto/EMUseCarInfoDTO.java
  6. 58 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AttendanceTripInfo.java
  7. 46 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMInvoiceInfo.java
  8. 39 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMOutsourcingPayInfo.java
  9. 51 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMPurchaseInfo.java
  10. 55 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMUseCarInfo.java
  11. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AttendanceTripInfoVO.java
  12. 28 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMInvoiceInfoVO.java
  13. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMLoanInfoVO.java
  14. 26 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMOutsourcingPayInfoVO.java
  15. 22 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMPurchaseInfoVO.java
  16. 25 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMUseCarInfoVO.java
  17. 6 0
      blade-service/blade-control/pom.xml
  18. 70 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AttendanceManagerController.java
  19. 190 10
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ExpenseManagerController.java
  20. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AttendanceTripMapper.java
  21. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/AttendanceTripMapper.xml
  22. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMInvoiceMapper.java
  23. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMInvoiceMapper.xml
  24. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMOutsourcingPayMapper.java
  25. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMOutsourcingPayMapper.xml
  26. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPurchaseMapper.java
  27. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPurchaseMapper.xml
  28. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMUseCarMapper.java
  29. 10 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMUseCarMapper.xml
  30. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/AttendanceTripService.java
  31. 32 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMInvoiceService.java
  32. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMOutsourcingPayService.java
  33. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMPurchaseService.java
  34. 26 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/EMUseCarService.java
  35. 189 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java
  36. 2 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  37. 267 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java
  38. 116 6
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java
  39. 196 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java
  40. 3 3
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java
  41. 188 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java
  42. 178 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java

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

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

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

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

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

@@ -0,0 +1,31 @@
+package org.springblade.control.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMOutsourcingPayInfo;
+import org.springblade.control.entity.EMProcessTaskUser;
+
+import java.util.List;
+
+@Data
+public class EMOutsourcingPayInfoDTO extends EMOutsourcingPayInfo {
+
+    @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/EMPurchaseInfoDTO.java

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

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

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

+ 58 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AttendanceTripInfo.java

@@ -0,0 +1,58 @@
+package org.springblade.control.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+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_attendance_trip_info")
+@EqualsAndHashCode(callSuper = true)
+public class AttendanceTripInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "出差事由")
+    private String tripDesc;
+
+    @ApiModelProperty(value = "交通工具类型")
+    private Integer trafficType;
+
+    @ApiModelProperty(value = "单程往返")
+    private Integer isSingletonType;
+
+    @ApiModelProperty(value = "出发城市")
+    private String startCity;
+
+    @ApiModelProperty(value = "目的城市")
+    private String endCity;
+
+    @ApiModelProperty(value = "开始时间")
+    private Date startDate;
+
+    @ApiModelProperty(value = "结束时间")
+    private Date endDate;
+
+    @ApiModelProperty(value = "时长(天)")
+    private BigDecimal duration;
+
+    @ApiModelProperty(value = "天数(总)")
+    private BigDecimal durationAll;
+
+    @ApiModelProperty(value = "同行人ids")
+    private String fellowTravelerUserIds;
+
+    @ApiModelProperty(value = "关联项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "预算计划ids")
+    private String budgetPlanIds;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+}

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

@@ -0,0 +1,46 @@
+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_invoice_info")
+@EqualsAndHashCode(callSuper = true)
+public class EMInvoiceInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "申请日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date invoiceDate;
+
+    @ApiModelProperty(value = "开票事由")
+    private String invoiceDesc;
+
+    @ApiModelProperty(value = "开票人id")
+    private Long invoiceUserId;
+
+    @ApiModelProperty(value = "发票类型")
+    private Integer invoiceType;
+
+    @ApiModelProperty(value = "关联项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "开票金额")
+    private BigDecimal invoiceMoney;
+
+    @ApiModelProperty(value = "开票内容字典类型")
+    private Integer invoiceContentType;
+
+    @ApiModelProperty(value = "发票pdf")
+    private String invoicePdfUrl;
+
+}

+ 39 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMOutsourcingPayInfo.java

@@ -0,0 +1,39 @@
+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_outsourcing_pay_info")
+@EqualsAndHashCode(callSuper = true)
+public class EMOutsourcingPayInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "关联项目id")
+    private Long projectId;
+
+    @ApiModelProperty(value = "非项目描述")
+    private String noProjectDesc;
+
+    @ApiModelProperty(value = "对面单位")
+    private String toUnit;
+
+    @ApiModelProperty(value = "支付金额")
+    private BigDecimal payMoney;
+
+    @ApiModelProperty(value = "申请支付时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date payDate;
+
+    @ApiModelProperty(value = "外包类型")
+    private Integer outsourcingType;
+
+}

+ 51 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMPurchaseInfo.java

@@ -0,0 +1,51 @@
+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_purchase_info")
+@EqualsAndHashCode(callSuper = true)
+public class EMPurchaseInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "申请事由")
+    private String purDesc;
+
+    @ApiModelProperty(value = "采购类型")
+    private Integer purType;
+
+    @ApiModelProperty(value = "使用单位或部门")
+    private String useOrgName;
+
+    @ApiModelProperty(value = "期望交付日期")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date expectedDeliveryDate;
+
+    @ApiModelProperty(value = "采购名称")
+    private String purName;
+
+    @ApiModelProperty(value = "采购规格")
+    private String purSpecification;
+
+    @ApiModelProperty(value = "数量")
+    private Integer purCount;
+
+    @ApiModelProperty(value = "单位")
+    private String purOrgName;
+
+    @ApiModelProperty(value = "价格")
+    private BigDecimal purPrice;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+}

+ 55 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/EMUseCarInfo.java

@@ -0,0 +1,55 @@
+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(value = "c_expense_use_car_info")
+@EqualsAndHashCode(callSuper = true)
+public class EMUseCarInfo extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "用车事由")
+    private String ucDesc;
+
+    @ApiModelProperty(value = "用车部门id")
+    private Long ucOrgId;
+
+    @ApiModelProperty(value = "始发地点")
+    private String startLocations;
+
+    @ApiModelProperty(value = "返回地点")
+    private String endLocations;
+
+    @ApiModelProperty(value = "使用时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date useStartDate;
+
+    @ApiModelProperty(value = "归还时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date useEndDate;
+
+    @ApiModelProperty(value = "车辆类型")
+    private String carType;
+
+    @ApiModelProperty(value = "车辆数量")
+    private Integer carCount;
+
+    @ApiModelProperty(value = "其他要求")
+    private String otherRequirements;
+
+    @ApiModelProperty(value = "备注")
+    private String remarks;
+
+    @ApiModelProperty(value = "照片url")
+    private String photoUrl;
+
+}

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

@@ -0,0 +1,25 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.AttendanceTripInfo;
+
+@Data
+public class AttendanceTripInfoVO extends AttendanceTripInfo {
+
+    @ApiModelProperty(value = "关联项目名称")
+    private String projectName;
+
+    @ApiModelProperty(value = "同行人名称")
+    private String fellowTravelerUserNames;
+
+    @ApiModelProperty(value = "创建人")
+    private String createName;
+
+    @ApiModelProperty(value = "审批状态")
+    private String approvalStatusName;
+
+    @ApiModelProperty(value = "审批结果")
+    private String approvalResultName;
+
+}

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

@@ -0,0 +1,28 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMInvoiceInfo;
+
+@Data
+public class EMInvoiceInfoVO extends EMInvoiceInfo {
+
+    @ApiModelProperty(value = "创建人")
+    private String createName;
+
+    @ApiModelProperty(value = "审批状态")
+    private String approvalStatusName;
+
+    @ApiModelProperty(value = "审批结果")
+    private String approvalResultName;
+
+    @ApiModelProperty(value = "开票人")
+    private String invoiceUserName;
+
+    @ApiModelProperty(value = "发票类型")
+    private String invoiceTypeName;
+
+    @ApiModelProperty(value = "关联项目")
+    private String projectName;
+
+}

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

@@ -19,4 +19,7 @@ public class EMLoanInfoVO extends EMLoanInfo {
     @ApiModelProperty(value = "审批结果")
     private String approvalResultName;
 
+    @ApiModelProperty(value = "使用期-归还期")
+    private String useReturnDate;
+
 }

+ 26 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/EMOutsourcingPayInfoVO.java

@@ -0,0 +1,26 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMOutsourcingPayInfo;
+
+@Data
+public class EMOutsourcingPayInfoVO extends EMOutsourcingPayInfo {
+
+    @ApiModelProperty(value = "关联项目名")
+    private String projectName;
+
+    @ApiModelProperty(value = "外包类型名")
+    private String outsourcingTypeName;
+
+    @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/EMPurchaseInfoVO.java

@@ -0,0 +1,22 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMPurchaseInfo;
+
+@Data
+public class EMPurchaseInfoVO extends EMPurchaseInfo {
+
+    @ApiModelProperty(value = "采购类型名称")
+    private String purTypeName;
+
+    @ApiModelProperty(value = "创建人")
+    private String createName;
+
+    @ApiModelProperty(value = "审批状态")
+    private String approvalStatusName;
+
+    @ApiModelProperty(value = "审批结果")
+    private String approvalResultName;
+
+}

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

@@ -0,0 +1,25 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.control.entity.EMUseCarInfo;
+
+@Data
+public class EMUseCarInfoVO extends EMUseCarInfo {
+
+    @ApiModelProperty(value = "申请部门")
+    private String ucOrgName;
+
+    @ApiModelProperty(value = "用车起止日期")
+    private String useReturnDate;
+
+    @ApiModelProperty(value = "创建人")
+    private String createName;
+
+    @ApiModelProperty(value = "审批状态")
+    private String approvalStatusName;
+
+    @ApiModelProperty(value = "审批结果")
+    private String approvalResultName;
+
+}

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

@@ -36,6 +36,12 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-resource</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

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

@@ -0,0 +1,70 @@
+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.AttendanceTripInfoDTO;
+import org.springblade.control.service.AttendanceTripService;
+import org.springblade.control.vo.AttendanceTripInfoVO;
+import org.springblade.control.vo.EMDraftVO;
+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("/attendance")
+@Api(value = "考勤管理接口", tags = "考勤管理接口")
+public class AttendanceManagerController extends BladeController {
+
+    private final AttendanceTripService attendanceTripService;
+
+    @PostMapping("/trip/page")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "出差信息分页查询", notes = "传入AttendanceTripInfoDTO、Query")
+    public R<IPage<AttendanceTripInfoVO>> tripPage(AttendanceTripInfoDTO dto, Query query) {
+        return R.data(attendanceTripService.tripPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/trip/draft/list")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "出差信息草稿箱列表")
+    public R<List<EMDraftVO>> tripDraftList() {
+        return R.data(attendanceTripService.tripDraftList());
+    }
+
+    @GetMapping("/trip/detail")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "出差信息信息详情", notes = "传入出差信息id")
+    public R<AttendanceTripInfoVO> tripDetail(@RequestParam Long id) {
+        return R.data(attendanceTripService.tripDetail(id));
+    }
+
+    @PostMapping("/trip/submit")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation(value = "出差信息信息提交", notes = "传入AttendanceTripInfoDTO")
+    public R<Object> tripSubmit(@RequestBody AttendanceTripInfoDTO dto) {
+        return R.status(attendanceTripService.tripSubmit(dto));
+    }
+
+    @PostMapping("/trip/remove")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "出差信息记录物理删除", notes = "传入出差信息id")
+    public R<Object> tripRemove(@RequestParam Long id) {
+        return R.status(attendanceTripService.tripRemove(id));
+    }
+
+    @PostMapping("/trip/cancel")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "出差信息记录上报撤销", notes = "传入出差信息id")
+    public R<Object> tripCancel(@RequestParam Long id) {
+        return R.status(attendanceTripService.tripCancel(id));
+    }
+
+}

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

@@ -5,22 +5,17 @@ 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.control.dto.*;
+import org.springblade.control.service.*;
+import org.springblade.control.vo.*;
 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 org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 @RestController
@@ -32,6 +27,10 @@ public class ExpenseManagerController extends BladeController {
     private final EMFinancialReimbursementService financialReimbursementService;
     private final EMPayService payService;
     private final EMLoanService loanService;
+    private final EMPurchaseService purchaseService;
+    private final EMUseCarService useCarService;
+    private final EMInvoiceService invoiceService;
+    private final EMOutsourcingPayService outsourcingPayService;
 
     @PostMapping("/financial/page")
     @ApiOperationSupport(order = 1)
@@ -159,5 +158,186 @@ public class ExpenseManagerController extends BladeController {
         return R.status(loanService.loanCancel(id));
     }
 
+    @PostMapping("/purchase/page")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "采购申请分页查询", notes = "传入EMPurchaseInfoDTO、Query")
+    public R<IPage<EMPurchaseInfoVO>> purchasePage(EMPurchaseInfoDTO dto, Query query) {
+        return R.data(purchaseService.purchasePage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/purchase/draft/list")
+    @ApiOperationSupport(order = 20)
+    @ApiOperation(value = "采购申请草稿箱列表")
+    public R<List<EMDraftVO>> purchaseDraftList() {
+        return R.data(purchaseService.purchaseDraftList());
+    }
+
+    @GetMapping("/purchase/detail")
+    @ApiOperationSupport(order = 21)
+    @ApiOperation(value = "采购申请信息详情", notes = "传入支付申请信息id")
+    public R<EMPurchaseInfoVO> purchaseDetail(@RequestParam Long id) {
+        return R.data(purchaseService.purchaseDetail(id));
+    }
+
+    @PostMapping("/purchase/submit")
+    @ApiOperationSupport(order = 22)
+    @ApiOperation(value = "采购申请提交", notes = "传入EMPurchaseInfoDTO")
+    public R<Object> purchaseSubmit(@RequestBody EMPurchaseInfoDTO dto) {
+        return R.status(purchaseService.purchaseSubmit(dto));
+    }
+
+    @PostMapping("/purchase/remove")
+    @ApiOperationSupport(order = 23)
+    @ApiOperation(value = "采购申请记录物理删除", notes = "传入支付申请信息id")
+    public R<Object> purchaseRemove(@RequestParam Long id) {
+        return R.status(purchaseService.purchaseRemove(id));
+    }
+
+    @PostMapping("/purchase/cancel")
+    @ApiOperationSupport(order = 24)
+    @ApiOperation(value = "采购申请记录上报撤销", notes = "传入支付申请信息id")
+    public R<Object> purchaseCancel(@RequestParam Long id) {
+        return R.status(purchaseService.purchaseCancel(id));
+    }
+
+    @PostMapping("/car/page")
+    @ApiOperationSupport(order = 25)
+    @ApiOperation(value = "用车申请分页查询", notes = "传入EMUseCarInfoDTO、Query")
+    public R<IPage<EMUseCarInfoVO>> carPage(EMUseCarInfoDTO dto, Query query) {
+        return R.data(useCarService.carPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/car/draft/list")
+    @ApiOperationSupport(order = 26)
+    @ApiOperation(value = "用车申请草稿箱列表")
+    public R<List<EMDraftVO>> carDraftList() {
+        return R.data(useCarService.carDraftList());
+    }
+
+    @GetMapping("/car/detail")
+    @ApiOperationSupport(order = 27)
+    @ApiOperation(value = "用车申请信息详情", notes = "传入支付申请信息id")
+    public R<EMUseCarInfoVO> carDetail(@RequestParam Long id) {
+        return R.data(useCarService.carDetail(id));
+    }
+
+    @PostMapping("/car/submit")
+    @ApiOperationSupport(order = 28)
+    @ApiOperation(value = "用车申请提交", notes = "传入EMUseCarInfoDTO")
+    public R<Object> carSubmit(@RequestBody EMUseCarInfoDTO dto) {
+        return R.status(useCarService.carSubmit(dto));
+    }
+
+    @PostMapping("/car/remove")
+    @ApiOperationSupport(order = 29)
+    @ApiOperation(value = "用车申请记录物理删除", notes = "传入支付申请信息id")
+    public R<Object> carRemove(@RequestParam Long id) {
+        return R.status(useCarService.carRemove(id));
+    }
+
+    @PostMapping("/car/cancel")
+    @ApiOperationSupport(order = 30)
+    @ApiOperation(value = "用车申请记录上报撤销", notes = "传入支付申请信息id")
+    public R<Object> carCancel(@RequestParam Long id) {
+        return R.status(useCarService.carCancel(id));
+    }
+
+    @PostMapping("/invoice/page")
+    @ApiOperationSupport(order = 31)
+    @ApiOperation(value = "发票申请分页查询", notes = "传入EMInvoiceInfoDTO、Query")
+    public R<IPage<EMInvoiceInfoVO>> invoicePage(EMInvoiceInfoDTO dto, Query query) {
+        return R.data(invoiceService.invoicePage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/invoice/draft/list")
+    @ApiOperationSupport(order = 32)
+    @ApiOperation(value = "发票申请草稿箱列表")
+    public R<List<EMDraftVO>> invoiceDraftList() {
+        return R.data(invoiceService.invoiceDraftList());
+    }
+
+    @GetMapping("/invoice/detail")
+    @ApiOperationSupport(order = 33)
+    @ApiOperation(value = "发票申请信息详情", notes = "传入发票申请信息id")
+    public R<EMInvoiceInfoVO> invoiceDetail(@RequestParam Long id) {
+        return R.data(invoiceService.invoiceDetail(id));
+    }
+
+    @PostMapping("/invoice/submit")
+    @ApiOperationSupport(order = 34)
+    @ApiOperation(value = "发票申请提交", notes = "传入EMInvoiceInfoDTO")
+    public R<Object> invoiceSubmit(@RequestBody EMInvoiceInfoDTO dto) {
+        return R.status(invoiceService.invoiceSubmit(dto));
+    }
+
+    @PostMapping("/invoice/remove")
+    @ApiOperationSupport(order = 35)
+    @ApiOperation(value = "发票申请记录物理删除", notes = "传入发票申请信息id")
+    public R<Object> invoiceRemove(@RequestParam Long id) {
+        return R.status(invoiceService.invoiceRemove(id));
+    }
+
+    @PostMapping("/invoice/cancel")
+    @ApiOperationSupport(order = 36)
+    @ApiOperation(value = "发票申请记录上报撤销", notes = "传入发票申请信息id")
+    public R<Object> invoiceCancel(@RequestParam Long id) {
+        return R.status(invoiceService.invoiceCancel(id));
+    }
+
+    @GetMapping("/invoice/upload")
+    @ApiOperationSupport(order = 37)
+    @ApiOperation(value = "发票pdf上传", notes = "传入发票申请信息id、文件file")
+    public R<Object> invoiceUpload(@RequestParam Long id, @RequestParam MultipartFile file) throws IOException {
+        return R.status(invoiceService.invoiceUpload(id, file));
+    }
+
+    @GetMapping("/invoice/pdf")
+    @ApiOperationSupport(order = 38)
+    @ApiOperation(value = "发票查看pdf", notes = "传入发票申请信息id")
+    public R<Object> invoicePdf(@RequestParam Long id) {
+        return R.data(invoiceService.invoicePdf(id));
+    }
+
+    @PostMapping("/outsourcing/page")
+    @ApiOperationSupport(order = 39)
+    @ApiOperation(value = "外包支付申请分页查询", notes = "传入EMOutsourcingPayInfoDTO、Query")
+    public R<IPage<EMOutsourcingPayInfoVO>> outsourcingPage(EMOutsourcingPayInfoDTO dto, Query query) {
+        return R.data(outsourcingPayService.outsourcingPage(Condition.getPage(query), dto));
+    }
+
+    @GetMapping("/outsourcing/draft/list")
+    @ApiOperationSupport(order = 40)
+    @ApiOperation(value = "外包支付草稿箱列表")
+    public R<List<EMDraftVO>> outsourcingDraftList() {
+        return R.data(outsourcingPayService.outsourcingDraftList());
+    }
+
+    @GetMapping("/outsourcing/detail")
+    @ApiOperationSupport(order = 41)
+    @ApiOperation(value = "外包支付信息详情", notes = "传入外包支付信息id")
+    public R<EMOutsourcingPayInfoVO> outsourcingDetail(@RequestParam Long id) {
+        return R.data(outsourcingPayService.outsourcingDetail(id));
+    }
+
+    @PostMapping("/outsourcing/submit")
+    @ApiOperationSupport(order = 42)
+    @ApiOperation(value = "外包支付提交", notes = "传入EMOutsourcingPayInfoDTO")
+    public R<Object> outsourcingSubmit(@RequestBody EMOutsourcingPayInfoDTO dto) {
+        return R.status(outsourcingPayService.outsourcingSubmit(dto));
+    }
+
+    @PostMapping("/outsourcing/remove")
+    @ApiOperationSupport(order = 43)
+    @ApiOperation(value = "外包支付记录物理删除", notes = "传入外包支付信息id")
+    public R<Object> outsourcingRemove(@RequestParam Long id) {
+        return R.status(outsourcingPayService.outsourcingRemove(id));
+    }
+
+    @PostMapping("/outsourcing/cancel")
+    @ApiOperationSupport(order = 44)
+    @ApiOperation(value = "外包支付记录上报撤销", notes = "传入外包支付信息id")
+    public R<Object> outsourcingCancel(@RequestParam Long id) {
+        return R.status(outsourcingPayService.outsourcingCancel(id));
+    }
 
 }

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

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

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/AttendanceTripMapper.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.AttendanceTripMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.AttendanceTripInfo">
+    </resultMap>
+
+
+</mapper>

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

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

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMInvoiceMapper.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.EMInvoiceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.EMInvoiceInfo">
+    </resultMap>
+
+
+</mapper>

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

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

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMOutsourcingPayMapper.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.EMOutsourcingPayMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.EMOutsourcingPayInfo">
+    </resultMap>
+
+
+</mapper>

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

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

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMPurchaseMapper.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.EMPurchaseMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.EMPurchaseInfo">
+    </resultMap>
+
+
+</mapper>

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

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

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/EMUseCarMapper.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.EMUseCarMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="resultMap" type="org.springblade.control.entity.EMUseCarInfo">
+    </resultMap>
+
+
+</mapper>

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

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.AttendanceTripInfoDTO;
+import org.springblade.control.entity.AttendanceTripInfo;
+import org.springblade.control.vo.AttendanceTripInfoVO;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface AttendanceTripService extends BaseService<AttendanceTripInfo> {
+
+    IPage<AttendanceTripInfoVO> tripPage(IPage<AttendanceTripInfo> page, AttendanceTripInfoDTO dto);
+
+    List<EMDraftVO> tripDraftList();
+
+    AttendanceTripInfoVO tripDetail(Long id);
+
+    boolean tripSubmit(AttendanceTripInfoDTO dto);
+
+    boolean tripRemove(Long id);
+
+    boolean tripCancel(Long id);
+
+}

+ 32 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/EMInvoiceService.java

@@ -0,0 +1,32 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.EMInvoiceInfoDTO;
+import org.springblade.control.entity.EMInvoiceInfo;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMInvoiceInfoVO;
+import org.springblade.core.mp.base.BaseService;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+public interface EMInvoiceService extends BaseService<EMInvoiceInfo> {
+
+    IPage<EMInvoiceInfoVO> invoicePage(IPage<EMInvoiceInfo> page, EMInvoiceInfoDTO dto);
+
+    List<EMDraftVO> invoiceDraftList();
+
+    EMInvoiceInfoVO invoiceDetail(Long id);
+
+    boolean invoiceSubmit(EMInvoiceInfoDTO dto);
+
+    boolean invoiceRemove(Long id);
+
+    boolean invoiceCancel(Long id);
+
+    boolean invoiceUpload(Long id, MultipartFile file) throws IOException;
+
+    Object invoicePdf(Long id);
+
+}

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

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.EMOutsourcingPayInfoDTO;
+import org.springblade.control.entity.EMOutsourcingPayInfo;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMOutsourcingPayInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface EMOutsourcingPayService extends BaseService<EMOutsourcingPayInfo> {
+
+    IPage<EMOutsourcingPayInfoVO> outsourcingPage(IPage<EMOutsourcingPayInfo> page, EMOutsourcingPayInfoDTO dto);
+
+    List<EMDraftVO> outsourcingDraftList();
+
+    EMOutsourcingPayInfoVO outsourcingDetail(Long id);
+
+    boolean outsourcingSubmit(EMOutsourcingPayInfoDTO dto);
+
+    boolean outsourcingRemove(Long id);
+
+    boolean outsourcingCancel(Long id);
+
+}

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

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.EMPurchaseInfoDTO;
+import org.springblade.control.entity.EMPurchaseInfo;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMPurchaseInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface EMPurchaseService extends BaseService<EMPurchaseInfo> {
+
+    IPage<EMPurchaseInfoVO> purchasePage(IPage<EMPurchaseInfo> page, EMPurchaseInfoDTO dto);
+
+    List<EMDraftVO> purchaseDraftList();
+
+    EMPurchaseInfoVO purchaseDetail(Long id);
+
+    boolean purchaseSubmit(EMPurchaseInfoDTO dto);
+
+    boolean purchaseRemove(Long id);
+
+    boolean purchaseCancel(Long id);
+
+}

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

@@ -0,0 +1,26 @@
+package org.springblade.control.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.control.dto.EMUseCarInfoDTO;
+import org.springblade.control.entity.EMUseCarInfo;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMUseCarInfoVO;
+import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
+
+public interface EMUseCarService extends BaseService<EMUseCarInfo> {
+
+    IPage<EMUseCarInfoVO> carPage(IPage<EMUseCarInfo> page, EMUseCarInfoDTO dto);
+
+    List<EMDraftVO> carDraftList();
+
+    EMUseCarInfoVO carDetail(Long id);
+
+    boolean carSubmit(EMUseCarInfoDTO dto);
+
+    boolean carRemove(Long id);
+
+    boolean carCancel(Long id);
+
+}

+ 189 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java

@@ -0,0 +1,189 @@
+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.AttendanceTripInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.AttendanceTripMapper;
+import org.springblade.control.service.AttendanceTripService;
+import org.springblade.control.vo.AttendanceTripInfoVO;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMPurchaseInfoVO;
+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 AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMapper, AttendanceTripInfo> implements AttendanceTripService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final TaskProcessServiceImpl taskProcessService;
+
+    @Override
+    public IPage<AttendanceTripInfoVO> tripPage(IPage<AttendanceTripInfo> page, AttendanceTripInfoDTO dto) {
+        QueryWrapper<AttendanceTripInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(AttendanceTripInfo::getIsDeleted, 1);
+        IPage<AttendanceTripInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, AttendanceTripInfo::getCreateTime));
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        return pages.convert(obj -> {
+            AttendanceTripInfoVO vo = new AttendanceTripInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+
+            Set<String> names = new HashSet<>();
+            String[] userIds = vo.getFellowTravelerUserIds().split(",");
+            for (String id : userIds) {
+                String userName = userMap.get(Long.parseLong(id));
+                if (StringUtils.isNotEmpty(userName)) {
+                    names.add(userName);
+                }
+            }
+            vo.setFellowTravelerUserNames(StringUtils.join(names, "、"));
+            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> tripDraftList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<AttendanceTripInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AttendanceTripInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(AttendanceTripInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(AttendanceTripInfo::getIsDeleted, 1); //暂存
+        List<AttendanceTripInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (AttendanceTripInfo 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 AttendanceTripInfoVO tripDetail(Long id) {
+        AttendanceTripInfo obj = baseMapper.selectById(id);
+        AttendanceTripInfoVO vo = BeanUtil.copyProperties(obj, AttendanceTripInfoVO.class);
+        //TODO vo.set
+        return vo;
+    }
+
+    @Override
+    public boolean tripSubmit(AttendanceTripInfoDTO 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.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(9); //出差审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【出差审批】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                //审批人
+                List<String> auditUserIds = new LinkedList<>();
+                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                auditUserIds.add(responsibleObj.getUserId());
+                EMProcessTaskUser personnelUser = dto.getPersonnelUser(); //人事
+                auditUserIds.add(personnelUser.getUserId());
+
+                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() + ")");
+
+                //关联项目id,项目计划预算等,在任务闭环时计算推送 TODO
+
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean tripRemove(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public boolean tripCancel(Long id) {
+        AttendanceTripInfo 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.<AttendanceTripInfo>lambdaUpdate().set(AttendanceTripInfo::getStatus, 0).set(AttendanceTripInfo::getIsDeleted, 1).eq(AttendanceTripInfo::getId, id));
+
+                return true;
+            }
+        }
+        return false;
+    }
+}

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

@@ -181,8 +181,8 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<EMFinan
                 //删除记录任务关联信息
                 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));
+                //修改当前记录为未上报状态,且暂存
+                this.update(Wrappers.<EMFinancialReimbursementInfo>lambdaUpdate().set(EMFinancialReimbursementInfo::getStatus, 0).set(EMFinancialReimbursementInfo::getIsDeleted, 1).eq(EMFinancialReimbursementInfo::getId, id));
 
                 return true;
             }

+ 267 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java

@@ -0,0 +1,267 @@
+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 lombok.Data;
+import org.apache.commons.lang.StringUtils;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.control.dto.EMInvoiceInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.EMInvoiceMapper;
+import org.springblade.control.service.EMInvoiceService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMInvoiceInfoVO;
+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.oss.model.BladeFile;
+import org.springblade.core.secure.utils.SecureUtil;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.FileUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.resource.builder.oss.OssBuilder;
+import org.springblade.resource.entity.Attach;
+import org.springblade.resource.feign.CommonFileClient;
+import org.springblade.resource.service.IAttachService;
+import org.springblade.resource.vo.NewBladeFile;
+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.web.multipart.MultipartFile;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Data
+@AllArgsConstructor
+public class EMInvoiceServiceImpl extends BaseServiceImpl<EMInvoiceMapper, EMInvoiceInfo> implements EMInvoiceService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final OssBuilder ossBuilder;
+    private final CommonFileClient commonFileClient;
+    private final IAttachService attachService;
+    private final TaskProcessServiceImpl taskProcessService;
+
+    @Override
+    public IPage<EMInvoiceInfoVO> invoicePage(IPage<EMInvoiceInfo> page, EMInvoiceInfoDTO dto) {
+        QueryWrapper<EMInvoiceInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(EMInvoiceInfo::getIsDeleted, 1);
+        IPage<EMInvoiceInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMInvoiceInfo::getCreateTime));
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        List<DictInfo> dictInfoList1 = jdbcTemplate.query("select dict_name,dict_value from c_dict_info where code = 'invoice_type'", new BeanPropertyRowMapper<>(DictInfo.class));
+        return pages.convert(obj -> {
+            EMInvoiceInfoVO vo = new EMInvoiceInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+            vo.setCreateName(userMap.get(vo.getCreateUser()));
+            vo.setApprovalStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : (vo.getStatus().equals(3) ? "已驳回" : "未上报")));
+            vo.setApprovalResultName(vo.getApprovalStatusName().equals("已审批") ? "已通过" : "未通过");
+            for (DictInfo dictInfo : dictInfoList1) {
+                if (dictInfo.getDictValue().equals(vo.getInvoiceType() + "")) {
+                    vo.setInvoiceTypeName(dictInfo.getDictName());
+                    break;
+                }
+            }
+
+            vo.setInvoiceContentType(null); //发票内容字典type TODO
+            vo.setProjectName(""); //关联项目名 TODO
+
+            return vo;
+        });
+    }
+
+    @Override
+    public List<EMDraftVO> invoiceDraftList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<EMInvoiceInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EMInvoiceInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(EMInvoiceInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(EMInvoiceInfo::getIsDeleted, 1); //暂存
+        List<EMInvoiceInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (EMInvoiceInfo 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 EMInvoiceInfoVO invoiceDetail(Long id) {
+        EMInvoiceInfo obj = baseMapper.selectById(id);
+        EMInvoiceInfoVO vo = BeanUtil.copyProperties(obj, EMInvoiceInfoVO.class);
+        //TODO vo.set
+        return vo;
+    }
+
+    @Override
+    public boolean invoiceSubmit(EMInvoiceInfoDTO 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.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(7); //发票审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【发票审批】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                //审批人
+                List<String> auditUserIds = new LinkedList<>();
+                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                auditUserIds.add(responsibleObj.getUserId());
+                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
+                auditUserIds.add(financeObj.getUserId());
+                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() + ")");
+
+                //存储关联项目id,审批闭环后处理项目相关业务 TODO
+
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean invoiceRemove(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public boolean invoiceCancel(Long id) {
+        EMInvoiceInfo 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.<EMInvoiceInfo>lambdaUpdate().set(EMInvoiceInfo::getStatus, 0).set(EMInvoiceInfo::getIsDeleted, 1).eq(EMInvoiceInfo::getId, id));
+
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean invoiceUpload(Long id, MultipartFile file) throws IOException {
+        EMInvoiceInfo obj = baseMapper.selectById(id);
+        if (obj != null && obj.getStatus().equals(2)) { //已通过(已审批)
+            //上传原图
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(file.getBytes());
+            BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), inputStream);
+
+            //处理PDF文件
+            NewBladeFile newBladeFile = new NewBladeFile();
+            if (Objects.requireNonNull(file.getOriginalFilename()).contains("xlsx")) {
+                newBladeFile = this.commonFileClient.excelToPdf(file);
+
+            } else if (file.getOriginalFilename().contains("xls")) {
+                newBladeFile = this.commonFileClient.excelToPdf(file);
+
+            } else if (file.getOriginalFilename().contains("docx")) {
+                newBladeFile = this.commonFileClient.wordToPdf(file);
+
+            } else if (file.getOriginalFilename().contains("png") || file.getOriginalFilename().contains("jpg")) {
+                newBladeFile = this.commonFileClient.pngOrJpgToPdf(file);
+
+            } else if (file.getOriginalFilename().contains("pdf")) {
+                //获取PDF文件
+                PDDocument document = PDDocument.load(file.getInputStream());
+                //获取文件页数
+                newBladeFile.setPage(document.getPages().getCount());
+                //pdf的路径就是文件上传的路径
+                newBladeFile.setPdfUrl(bladeFile.getLink());
+            }
+
+            BeanUtils.copyProperties(bladeFile, newBladeFile);
+            newBladeFile.setFileSize(file.getSize() / 1024);
+
+            //入库
+            String fileExtension = FileUtil.getFileExtension(bladeFile.getOriginalName());
+            Attach attach = new Attach();
+            attach.setDomainUrl(bladeFile.getDomain());
+            attach.setLink(newBladeFile.getPdfUrl());
+            attach.setName(bladeFile.getName());
+            attach.setOriginalName(bladeFile.getOriginalName());
+            attach.setAttachSize(newBladeFile.getFileSize());
+            attach.setExtension(fileExtension);
+
+            if (attachService.save(attach)) {
+                //修改pdf路径
+                this.update(Wrappers.<EMInvoiceInfo>lambdaUpdate().set(EMInvoiceInfo::getInvoicePdfUrl, newBladeFile.getPdfUrl()).eq(EMInvoiceInfo::getId, id));
+                return true;
+            }
+        } else {
+            throw new ServiceException("当前发票记录信息不是已审批通过状态,无法上传!");
+        }
+        return false;
+    }
+
+    @Override
+    public Object invoicePdf(Long id) {
+        EMInvoiceInfo obj = baseMapper.selectById(id);
+        if (obj != null && StringUtils.isNotEmpty(obj.getInvoicePdfUrl())) {
+            return obj.getInvoicePdfUrl();
+        }
+        return null;
+    }
+
+}

+ 116 - 6
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java

@@ -1,25 +1,34 @@
 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.EMLoanInfoDTO;
-import org.springblade.control.entity.EMLoanInfo;
+import org.springblade.control.entity.*;
 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.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.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
+import java.time.LocalDateTime;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -46,32 +55,133 @@ public class EMLoanServiceImpl extends BaseServiceImpl<EMLoanMapper, EMLoanInfo>
             vo.setCreateName(userMap.get(vo.getCreateUser()));
             vo.setApprovalStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : (vo.getStatus().equals(3) ? "已驳回" : "未上报")));
             vo.setApprovalResultName(vo.getApprovalStatusName().equals("已审批") ? "已通过" : "未通过");
+            vo.setUseReturnDate(vo.getUseDate() + "-" + vo.getReturnDate());
             return vo;
         });
     }
 
     @Override
     public List<EMDraftVO> loanDraftList() {
-        return null;
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<EMLoanInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EMLoanInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(EMLoanInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(EMLoanInfo::getIsDeleted, 1); //暂存
+        List<EMLoanInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (EMLoanInfo 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 EMLoanInfoVO loanDetail(Long id) {
-        return null;
+        EMLoanInfo obj = baseMapper.selectById(id);
+        EMLoanInfoVO vo = BeanUtil.copyProperties(obj, EMLoanInfoVO.class);
+        //TODO vo.set
+        return vo;
     }
 
     @Override
     public boolean loanSubmit(EMLoanInfoDTO 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(4); //借款审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【借款审批】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                //审批人
+                List<String> auditUserIds = new LinkedList<>();
+                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                auditUserIds.add(responsibleObj.getUserId());
+                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
+                auditUserIds.add(financeObj.getUserId());
+                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
+                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
+                    auditUserIds.add(finalConfirmationObj.getUserId());
+                }
+                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
+                auditUserIds.add(cashierObj.getUserId());
+                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() + ")");
+
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
         return false;
     }
 
     @Override
     public boolean loanRemove(Long id) {
-        return false;
+        return this.removeById(id);
     }
 
     @Override
     public boolean loanCancel(Long id) {
+        EMLoanInfo 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.<EMLoanInfo>lambdaUpdate().set(EMLoanInfo::getStatus, 0).set(EMLoanInfo::getIsDeleted, 1).eq(EMLoanInfo::getId, id));
+
+                return true;
+            }
+        }
         return false;
     }
 }

+ 196 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java

@@ -0,0 +1,196 @@
+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.EMOutsourcingPayInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.EMOutsourcingPayMapper;
+import org.springblade.control.service.EMOutsourcingPayService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMInvoiceInfoVO;
+import org.springblade.control.vo.EMOutsourcingPayInfoVO;
+import org.springblade.control.vo.EMUseCarInfoVO;
+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 EMOutsourcingPayServiceImpl extends BaseServiceImpl<EMOutsourcingPayMapper, EMOutsourcingPayInfo> implements EMOutsourcingPayService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final TaskProcessServiceImpl taskProcessService;
+
+    @Override
+    public IPage<EMOutsourcingPayInfoVO> outsourcingPage(IPage<EMOutsourcingPayInfo> page, EMOutsourcingPayInfoDTO dto) {
+        QueryWrapper<EMOutsourcingPayInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(EMOutsourcingPayInfo::getIsDeleted, 1);
+        IPage<EMOutsourcingPayInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMOutsourcingPayInfo::getCreateTime));
+        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 = 'outsourcing_type'", new BeanPropertyRowMapper<>(DictInfo.class));
+        return pages.convert(obj -> {
+            EMOutsourcingPayInfoVO vo = new EMOutsourcingPayInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+            vo.setCreateName(userMap.get(vo.getCreateUser()));
+            vo.setApprovalStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : (vo.getStatus().equals(3) ? "已驳回" : "未上报")));
+            vo.setApprovalResultName(vo.getApprovalStatusName().equals("已审批") ? "已通过" : "未通过");
+            vo.setProjectName(""); //TODO 项目名
+
+            for (DictInfo dictInfo : dictInfoList) {
+                if (dictInfo.getDictValue().equals(vo.getOutsourcingType() + "")) {
+                    vo.setOutsourcingTypeName(dictInfo.getDictName());
+                    break;
+                }
+            }
+
+            return vo;
+        });
+
+    }
+
+    @Override
+    public List<EMDraftVO> outsourcingDraftList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<EMOutsourcingPayInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EMOutsourcingPayInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(EMOutsourcingPayInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(EMOutsourcingPayInfo::getIsDeleted, 1); //暂存
+        List<EMOutsourcingPayInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (EMOutsourcingPayInfo 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 EMOutsourcingPayInfoVO outsourcingDetail(Long id) {
+        EMOutsourcingPayInfo obj = baseMapper.selectById(id);
+        EMOutsourcingPayInfoVO vo = BeanUtil.copyProperties(obj, EMOutsourcingPayInfoVO.class);
+        //TODO vo.set
+        return vo;
+    }
+
+    @Override
+    public boolean outsourcingSubmit(EMOutsourcingPayInfoDTO 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(8); //外包支付
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【外包支付】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                //审批人
+                List<String> auditUserIds = new LinkedList<>();
+                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                auditUserIds.add(responsibleObj.getUserId());
+                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
+                auditUserIds.add(financeObj.getUserId());
+                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
+                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
+                    auditUserIds.add(finalConfirmationObj.getUserId());
+                }
+                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
+                auditUserIds.add(cashierObj.getUserId());
+                taskProcessInfo.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() + ")");
+
+                //关联项目id只做存储,任务闭环时在进行业务计算 TODO
+
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean outsourcingRemove(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public boolean outsourcingCancel(Long id) {
+        EMOutsourcingPayInfo 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.<EMOutsourcingPayInfo>lambdaUpdate().set(EMOutsourcingPayInfo::getStatus, 0).set(EMOutsourcingPayInfo::getIsDeleted, 1).eq(EMOutsourcingPayInfo::getId, id));
+
+                return true;
+            }
+        }
+        return false;
+    }
+}

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

@@ -112,7 +112,7 @@ public class EMPayServiceImpl extends BaseServiceImpl<EMPayMapper, EMPayInfo> im
                 taskProcessInfo.setId(SnowFlakeUtil.getId());
                 taskProcessInfo.setStatus(1); //待审批
                 taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(3); //报销审批
+                taskProcessInfo.setTaskType(3); //支付审批
                 taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【支付审批】审批");
                 //上报人
                 taskProcessInfo.setReportUserId(SecureUtil.getUserId());
@@ -172,8 +172,8 @@ public class EMPayServiceImpl extends BaseServiceImpl<EMPayMapper, EMPayInfo> im
                 //删除记录任务关联信息
                 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));
+                //修改当前记录为未上报状态,且暂存
+                this.update(Wrappers.<EMPayInfo>lambdaUpdate().set(EMPayInfo::getStatus, 0).set(EMPayInfo::getIsDeleted, 1).eq(EMPayInfo::getId, id));
 
                 return true;
             }

+ 188 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java

@@ -0,0 +1,188 @@
+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.EMPurchaseInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.EMPurchaseMapper;
+import org.springblade.control.service.EMPurchaseService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMPurchaseInfoVO;
+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 EMPurchaseServiceImpl extends BaseServiceImpl<EMPurchaseMapper, EMPurchaseInfo> implements EMPurchaseService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final TaskProcessServiceImpl taskProcessService;
+
+    @Override
+    public IPage<EMPurchaseInfoVO> purchasePage(IPage<EMPurchaseInfo> page, EMPurchaseInfoDTO dto) {
+        QueryWrapper<EMPurchaseInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(EMPurchaseInfo::getIsDeleted, 1);
+        IPage<EMPurchaseInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMPurchaseInfo::getCreateTime));
+        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 = 'purchase_type'", new BeanPropertyRowMapper<>(DictInfo.class));
+        return pages.convert(obj -> {
+            EMPurchaseInfoVO vo = new EMPurchaseInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+            for (DictInfo dictInfo : dictInfoList) {
+                if (dictInfo.getDictValue().equals(vo.getPurType() + "")) {
+                    vo.setPurTypeName(dictInfo.getDictName());
+                    break;
+                }
+            }
+            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> purchaseDraftList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<EMPurchaseInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EMPurchaseInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(EMPurchaseInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(EMPurchaseInfo::getIsDeleted, 1); //暂存
+        List<EMPurchaseInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (EMPurchaseInfo 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 EMPurchaseInfoVO purchaseDetail(Long id) {
+        EMPurchaseInfo obj = baseMapper.selectById(id);
+        EMPurchaseInfoVO vo = BeanUtil.copyProperties(obj, EMPurchaseInfoVO.class);
+        //TODO vo.set
+        return vo;
+    }
+
+    @Override
+    public boolean purchaseSubmit(EMPurchaseInfoDTO 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(5); //采购审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【采购审批】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                //审批人
+                List<String> auditUserIds = new LinkedList<>();
+                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                auditUserIds.add(responsibleObj.getUserId());
+                EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
+                auditUserIds.add(financeObj.getUserId());
+                if (ObjectUtil.isNotEmpty(dto.getFinalConfirmationUser())) { //最终确认付款人
+                    EMProcessTaskUser finalConfirmationObj = dto.getFinalConfirmationUser();
+                    auditUserIds.add(finalConfirmationObj.getUserId());
+                }
+                EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
+                auditUserIds.add(cashierObj.getUserId());
+                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() + ")");
+
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean purchaseRemove(Long id) {
+        return this.removeById(id);
+    }
+
+    @Override
+    public boolean purchaseCancel(Long id) {
+        EMPurchaseInfo 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.<EMPurchaseInfo>lambdaUpdate().set(EMPurchaseInfo::getStatus, 0).set(EMPurchaseInfo::getIsDeleted,1).eq(EMPurchaseInfo::getId, id));
+
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 178 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java

@@ -0,0 +1,178 @@
+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.EMUseCarInfoDTO;
+import org.springblade.control.entity.*;
+import org.springblade.control.mapper.EMUseCarMapper;
+import org.springblade.control.service.EMUseCarService;
+import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMUseCarInfoVO;
+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 EMUseCarServiceImpl extends BaseServiceImpl<EMUseCarMapper, EMUseCarInfo> implements EMUseCarService {
+
+    private final IUserClient iUserClient;
+    private final JdbcTemplate jdbcTemplate;
+    private final TaskProcessServiceImpl taskProcessService;
+
+
+    @Override
+    public IPage<EMUseCarInfoVO> carPage(IPage<EMUseCarInfo> page, EMUseCarInfoDTO dto) {
+        QueryWrapper<EMUseCarInfo> queryWrapper = Condition.getQueryWrapper(dto);
+        queryWrapper.lambda().eq(EMUseCarInfo::getIsDeleted, 1);
+        IPage<EMUseCarInfo> pages = this.page(page, queryWrapper.lambda().orderBy(true, true, EMUseCarInfo::getCreateTime));
+        Map<Long, String> userMap = iUserClient.selectUserAll().stream().collect(Collectors.toMap(User::getId, User::getRealName));
+        return pages.convert(obj -> {
+            EMUseCarInfoVO vo = new EMUseCarInfoVO();
+            BeanUtils.copyProperties(obj, vo);
+            vo.setCreateName(userMap.get(vo.getCreateUser()));
+            vo.setApprovalStatusName(vo.getStatus().equals(1) ? "待审批" : (vo.getStatus().equals(2) ? "已审批" : (vo.getStatus().equals(3) ? "已驳回" : "未上报")));
+            vo.setApprovalResultName(vo.getApprovalStatusName().equals("已审批") ? "已通过" : "未通过");
+            vo.setUcOrgName(""); //TODO 部门
+            vo.setUseReturnDate(vo.getUseStartDate() + "-" + vo.getUseEndDate());
+            return vo;
+        });
+    }
+
+    @Override
+    public List<EMDraftVO> carDraftList() {
+        if (ObjectUtil.isEmpty(SecureUtil.getUserId())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
+        LambdaQueryWrapper<EMUseCarInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(EMUseCarInfo::getCreateUser, SecureUtil.getUserId()); //获取当前用户草稿信息
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        //计算三个月前的时间
+        LocalDateTime threeMonthsAgo = now.minusMonths(3);
+        queryWrapper.between(EMUseCarInfo::getCreateTime, threeMonthsAgo, now);
+        queryWrapper.eq(EMUseCarInfo::getIsDeleted, 1); //暂存
+        List<EMUseCarInfo> list = baseMapper.selectList(queryWrapper);
+        Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
+        List<EMDraftVO> resultVOS = new ArrayList<>();
+        for (EMUseCarInfo 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 EMUseCarInfoVO carDetail(Long id) {
+        EMUseCarInfo obj = baseMapper.selectById(id);
+        EMUseCarInfoVO vo = BeanUtil.copyProperties(obj, EMUseCarInfoVO.class);
+        //TODO vo.set
+        return vo;
+    }
+
+    @Override
+    public boolean carSubmit(EMUseCarInfoDTO 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.getPersonnelUser()) && 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(6); //用车审批
+                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【用车审批】审批");
+                //上报人
+                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
+
+                //审批人
+                List<String> auditUserIds = new LinkedList<>();
+                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                auditUserIds.add(responsibleObj.getUserId());
+                EMProcessTaskUser personnelUser = dto.getPersonnelUser(); //人事
+                auditUserIds.add(personnelUser.getUserId());
+                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() + ")");
+
+                return true;
+
+            } else {
+                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean carRemove(Long id) {
+        return false;
+    }
+
+    @Override
+    public boolean carCancel(Long id) {
+        EMUseCarInfo 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.<EMUseCarInfo>lambdaUpdate().set(EMUseCarInfo::getStatus, 0).set(EMUseCarInfo::getIsDeleted, 1).eq(EMUseCarInfo::getId, id));
+
+                return true;
+            }
+        }
+        return false;
+    }
+}