Explorar el Código

add:考勤提交

caozixuan hace 1 año
padre
commit
1e3a7086c1
Se han modificado 17 ficheros con 1283 adiciones y 20 borrados
  1. 277 0
      sop-business/src/main/java/com/qmth/sop/business/bean/dto/DingSubmitExportDto.java
  2. 48 1
      sop-business/src/main/java/com/qmth/sop/business/bean/params/DingSubmitParam.java
  3. 213 0
      sop-business/src/main/java/com/qmth/sop/business/bean/params/DingSubmitParamTmp.java
  4. 136 0
      sop-business/src/main/java/com/qmth/sop/business/bean/query/DingSubmitQuery.java
  5. 57 0
      sop-business/src/main/java/com/qmth/sop/business/bean/result/DingSubmitResult.java
  6. 2 0
      sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingSubmitMapper.java
  7. 43 3
      sop-business/src/main/java/com/qmth/sop/business/service/TBDingSubmitService.java
  8. 207 4
      sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingSubmitServiceImpl.java
  9. 75 0
      sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncDingSubmitExportService.java
  10. 13 2
      sop-business/src/main/java/com/qmth/sop/business/templete/service/TaskLogicService.java
  11. 39 6
      sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java
  12. 10 0
      sop-business/src/main/resources/mapper/TBDingSubmitMapper.xml
  13. 1 0
      sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java
  14. 1 2
      sop-common/src/main/java/com/qmth/sop/common/enums/DingSubmitStatusEnum.java
  15. 2 0
      sop-common/src/main/java/com/qmth/sop/common/enums/TaskTypeEnum.java
  16. 159 0
      sop-server/src/main/java/com/qmth/sop/server/api/TBDingSubmitController.java
  17. 0 2
      sop-server/src/main/java/com/qmth/sop/server/api/TBUserArchivesController.java

+ 277 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/dto/DingSubmitExportDto.java

@@ -0,0 +1,277 @@
+package com.qmth.sop.business.bean.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.qmth.sop.common.enums.DingSubmitStatusEnum;
+import com.qmth.sop.common.enums.RoleTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考勤提交批量导出对象
+ * @Author: CaoZixuan
+ * @Date: 2023-08-29
+ */
+public class DingSubmitExportDto {
+    @ExcelProperty(value = "服务单元")
+    @ApiModelProperty(value = "服务单元")
+    private String serviceUnitName;
+
+    @ExcelProperty(value = "sop流水号")
+    @ApiModelProperty(value = "sop流水号")
+    private String sopNo;
+
+    @ExcelProperty(value = "客户名称")
+    @ApiModelProperty(value = "客户名称")
+    private String customName;
+
+    @ExcelProperty(value = "省份")
+    @ApiModelProperty(value = "省份")
+    private String province;
+
+    @ExcelProperty(value = "城市")
+    @ApiModelProperty(value = "城市")
+    private String city;
+
+    @ExcelProperty(value = "进场时间")
+    @ApiModelProperty(value = "进场时间")
+    private Long approachTime;
+
+    @ExcelProperty(value = "撤场时间")
+    @ApiModelProperty(value = "撤场时间")
+    private Long departureTime;
+
+    @ExcelProperty(value = "姓名(人员档案号)")
+    @ApiModelProperty(value = "姓名(人员档案号)")
+    private String archivesInfo;
+
+    @ExcelProperty(value = "项目角色")
+    @ApiModelProperty(value = "项目角色")
+    private RoleTypeEnum roleType;
+
+    @ExcelProperty(value = "供应商")
+    @ApiModelProperty(value = "供应商")
+    private String supplierName;
+
+    @ExcelProperty(value = "实际出勤(天)")
+    @ApiModelProperty(value = "实际出勤(天)")
+    private Integer actualDays;
+
+    @ExcelProperty(value = "工作日(天)")
+    @ApiModelProperty(value = "工作日(天)")
+    private Integer weekdays;
+
+    @ExcelProperty(value = "周末(天)")
+    @ApiModelProperty(value = "周末(天)")
+    private Integer weekends;
+
+    @ExcelProperty(value = "法定节假日(天)")
+    @ApiModelProperty(value = "法定节假日(天)")
+    private Integer legalHolidays;
+
+    @ExcelProperty(value = "累计工时(小时)")
+    @ApiModelProperty(value = "累计工时(小时)")
+    private Double workHours;
+
+    @ExcelProperty(value = "违规工时(天)")
+    @ApiModelProperty(value = "违规工时(天)")
+    private Double violationDays;
+
+    @ExcelProperty(value = "考勤异常数")
+    @ApiModelProperty(value = "考勤异常数")
+    private Integer dingExceptionCount;
+
+    @ExcelProperty(value = "剩余补卡次数")
+    @ApiModelProperty(value = "剩余补卡次数")
+    private Integer remainCount;
+
+    @ExcelProperty(value = "待处理异常数")
+    @ApiModelProperty(value = "待处理异常数")
+    private Integer exceptionCount;
+
+    @ExcelProperty(value = "提交状态")
+    @ApiModelProperty(value = "提交状态")
+    private DingSubmitStatusEnum submitStatus;
+
+    @ExcelProperty(value = "提交人")
+    @ApiModelProperty(value = "提交人")
+    private Long submitUserName;
+
+    @ExcelProperty(value = "提交时间")
+    @ApiModelProperty(value = "提交时间")
+    private Long submitTime;
+
+    public String getServiceUnitName() {
+        return serviceUnitName;
+    }
+
+    public void setServiceUnitName(String serviceUnitName) {
+        this.serviceUnitName = serviceUnitName;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public String getCustomName() {
+        return customName;
+    }
+
+    public void setCustomName(String customName) {
+        this.customName = customName;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public Long getApproachTime() {
+        return approachTime;
+    }
+
+    public void setApproachTime(Long approachTime) {
+        this.approachTime = approachTime;
+    }
+
+    public Long getDepartureTime() {
+        return departureTime;
+    }
+
+    public void setDepartureTime(Long departureTime) {
+        this.departureTime = departureTime;
+    }
+
+    public String getArchivesInfo() {
+        return archivesInfo;
+    }
+
+    public void setArchivesInfo(String archivesInfo) {
+        this.archivesInfo = archivesInfo;
+    }
+
+    public RoleTypeEnum getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(RoleTypeEnum roleType) {
+        this.roleType = roleType;
+    }
+
+    public String getSupplierName() {
+        return supplierName;
+    }
+
+    public void setSupplierName(String supplierName) {
+        this.supplierName = supplierName;
+    }
+
+    public Integer getActualDays() {
+        return actualDays;
+    }
+
+    public void setActualDays(Integer actualDays) {
+        this.actualDays = actualDays;
+    }
+
+    public Integer getWeekdays() {
+        return weekdays;
+    }
+
+    public void setWeekdays(Integer weekdays) {
+        this.weekdays = weekdays;
+    }
+
+    public Integer getWeekends() {
+        return weekends;
+    }
+
+    public void setWeekends(Integer weekends) {
+        this.weekends = weekends;
+    }
+
+    public Integer getLegalHolidays() {
+        return legalHolidays;
+    }
+
+    public void setLegalHolidays(Integer legalHolidays) {
+        this.legalHolidays = legalHolidays;
+    }
+
+    public Double getWorkHours() {
+        return workHours;
+    }
+
+    public void setWorkHours(Double workHours) {
+        this.workHours = workHours;
+    }
+
+    public Double getViolationDays() {
+        return violationDays;
+    }
+
+    public void setViolationDays(Double violationDays) {
+        this.violationDays = violationDays;
+    }
+
+    public Integer getDingExceptionCount() {
+        return dingExceptionCount;
+    }
+
+    public void setDingExceptionCount(Integer dingExceptionCount) {
+        this.dingExceptionCount = dingExceptionCount;
+    }
+
+    public Integer getRemainCount() {
+        return remainCount;
+    }
+
+    public void setRemainCount(Integer remainCount) {
+        this.remainCount = remainCount;
+    }
+
+    public Integer getExceptionCount() {
+        return exceptionCount;
+    }
+
+    public void setExceptionCount(Integer exceptionCount) {
+        this.exceptionCount = exceptionCount;
+    }
+
+    public DingSubmitStatusEnum getSubmitStatus() {
+        return submitStatus;
+    }
+
+    public void setSubmitStatus(DingSubmitStatusEnum submitStatus) {
+        this.submitStatus = submitStatus;
+    }
+
+    public Long getSubmitUserName() {
+        return submitUserName;
+    }
+
+    public void setSubmitUserName(Long submitUserName) {
+        this.submitUserName = submitUserName;
+    }
+
+    public Long getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Long submitTime) {
+        this.submitTime = submitTime;
+    }
+}

+ 48 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/params/DingSubmitParam.java

@@ -1,9 +1,56 @@
 package com.qmth.sop.business.bean.params;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 /**
  * @Description: 考勤提交参数
  * @Author: CaoZixuan
- * @Date: 2023-08-28
+ * @Date: 2023-08-29
  */
 public class DingSubmitParam {
+    @ApiModelProperty(value = "服务单元id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少服务单元id")
+    @Range(min = 1L, message = "缺少服务单元id")
+    private Long serviceUnitId;
+
+    @ApiModelProperty(value = "sop流水号")
+    @NotBlank(message = "缺少sop流水号")
+    private String sopNo;
+
+    @ApiModelProperty(value = "人员档案id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少人员档案id")
+    @Range(min = 1L, message = "缺少人员档案id")
+    private Long userArchivesId;
+
+    public Long getServiceUnitId() {
+        return serviceUnitId;
+    }
+
+    public void setServiceUnitId(Long serviceUnitId) {
+        this.serviceUnitId = serviceUnitId;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public Long getUserArchivesId() {
+        return userArchivesId;
+    }
+
+    public void setUserArchivesId(Long userArchivesId) {
+        this.userArchivesId = userArchivesId;
+    }
 }

+ 213 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/params/DingSubmitParamTmp.java

@@ -0,0 +1,213 @@
+package com.qmth.sop.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.sop.common.enums.DingSubmitStatusEnum;
+import com.qmth.sop.common.enums.RoleTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 考勤提交参数
+ * @Author: CaoZixuan
+ * @Date: 2023-08-28
+ */
+public class DingSubmitParamTmp {
+    @ApiModelProperty(value = "服务单元id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少服务单元id")
+    @Range(min = 1L, message = "缺少服务单元id")
+    private Long serviceId;
+
+    @ApiModelProperty(value = "sop流水号")
+    @NotBlank(message = "缺少sop流水号")
+    private String sopNo;
+
+    @ApiModelProperty(value = "人员档案id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少人员档案id")
+    @Range(min = 1L, message = "缺少人员档案id")
+    private Long userArchivesId;
+
+    @ApiModelProperty(value = "派单号")
+    @NotBlank(message = "缺少派单号")
+    private String crmNo;
+
+    @ApiModelProperty(value = "进场时间")
+    @NotNull(message = "缺少进场时间")
+    @Range(min = 1L, message = "缺少进场时间")
+    private Long approachTime;
+
+    @ApiModelProperty(value = "离场时间")
+    @NotNull(message = "缺少撤场时间")
+    @Range(min = 1L, message = "缺少撤场时间")
+    private Long departureTime;
+
+    @ApiModelProperty(value = "项目角色")
+    @NotNull(message = "缺少项目角色")
+    private RoleTypeEnum roleType;
+
+    @ApiModelProperty(value = "实际出勤(天)")
+    private Integer actualDays;
+
+    @ApiModelProperty(value = "工作日(天)")
+    private Integer weekdays;
+
+    @ApiModelProperty(value = "周末(天)")
+    private Integer weekends;
+
+    @ApiModelProperty(value = "法定节假日(天)")
+    private Integer legalHolidays;
+
+    @ApiModelProperty(value = "累计工时(小时)")
+    private Double workHours;
+
+    @ApiModelProperty(value = "违规工时")
+    private Double violationDays;
+
+    @ApiModelProperty(value = "提交人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @NotNull(message = "缺少提交人id")
+    @Range(min = 1L, message = "缺少提交人id")
+    private Long submitUserId;
+
+    @ApiModelProperty(value = "提交时间")
+    @NotNull(message = "缺少撤场时间")
+    @Range(min = 1L, message = "缺少撤场时间")
+    private Long submitTime;
+
+    @ApiModelProperty(value = "提交状态")
+    @NotNull(message = "缺少提交状态")
+    private DingSubmitStatusEnum submitStatus;
+
+    public Long getServiceId() {
+        return serviceId;
+    }
+
+    public void setServiceId(Long serviceId) {
+        this.serviceId = serviceId;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public Long getUserArchivesId() {
+        return userArchivesId;
+    }
+
+    public void setUserArchivesId(Long userArchivesId) {
+        this.userArchivesId = userArchivesId;
+    }
+
+    public String getCrmNo() {
+        return crmNo;
+    }
+
+    public void setCrmNo(String crmNo) {
+        this.crmNo = crmNo;
+    }
+
+    public Long getApproachTime() {
+        return approachTime;
+    }
+
+    public void setApproachTime(Long approachTime) {
+        this.approachTime = approachTime;
+    }
+
+    public Long getDepartureTime() {
+        return departureTime;
+    }
+
+    public void setDepartureTime(Long departureTime) {
+        this.departureTime = departureTime;
+    }
+
+    public RoleTypeEnum getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(RoleTypeEnum roleType) {
+        this.roleType = roleType;
+    }
+
+    public Integer getActualDays() {
+        return actualDays;
+    }
+
+    public void setActualDays(Integer actualDays) {
+        this.actualDays = actualDays;
+    }
+
+    public Integer getWeekdays() {
+        return weekdays;
+    }
+
+    public void setWeekdays(Integer weekdays) {
+        this.weekdays = weekdays;
+    }
+
+    public Integer getWeekends() {
+        return weekends;
+    }
+
+    public void setWeekends(Integer weekends) {
+        this.weekends = weekends;
+    }
+
+    public Integer getLegalHolidays() {
+        return legalHolidays;
+    }
+
+    public void setLegalHolidays(Integer legalHolidays) {
+        this.legalHolidays = legalHolidays;
+    }
+
+    public Double getWorkHours() {
+        return workHours;
+    }
+
+    public void setWorkHours(Double workHours) {
+        this.workHours = workHours;
+    }
+
+    public Double getViolationDays() {
+        return violationDays;
+    }
+
+    public void setViolationDays(Double violationDays) {
+        this.violationDays = violationDays;
+    }
+
+    public Long getSubmitUserId() {
+        return submitUserId;
+    }
+
+    public void setSubmitUserId(Long submitUserId) {
+        this.submitUserId = submitUserId;
+    }
+
+    public Long getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Long submitTime) {
+        this.submitTime = submitTime;
+    }
+
+    public DingSubmitStatusEnum getSubmitStatus() {
+        return submitStatus;
+    }
+
+    public void setSubmitStatus(DingSubmitStatusEnum submitStatus) {
+        this.submitStatus = submitStatus;
+    }
+}

+ 136 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/query/DingSubmitQuery.java

@@ -0,0 +1,136 @@
+package com.qmth.sop.business.bean.query;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考勤提交查询
+ * @Author: CaoZixuan
+ * @Date: 2023-08-29
+ */
+public class DingSubmitQuery {
+    @ApiModelProperty(value = "服务单元id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serviceUnitId;
+
+    @ApiModelProperty(value = "考勤提交状态")
+    private String dingSubmitStatusDesc;
+
+    @ApiModelProperty(value = "提交人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long submitUserId;
+
+    @ApiModelProperty(value = "档案名称")
+    private String archivesName;
+
+    @ApiModelProperty(value = "供应商id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long supplierId;
+
+    @ApiModelProperty(value = "客户名")
+    private String customName;
+
+    @ApiModelProperty(value = "sop号")
+    private String sopNo;
+
+    @ApiModelProperty(value = "违规工时限制")
+    private Integer violationHoursLimit;
+
+    @ApiModelProperty(value = "需处理异常考勤限制")
+    private Integer dingExceptionLimit;
+
+    @ApiModelProperty(value = "补卡限制")
+    private Integer remainLimit;
+
+    @ApiModelProperty(value = "异常限制")
+    private Integer exceptionLimit;
+
+    public Long getServiceUnitId() {
+        return serviceUnitId;
+    }
+
+    public void setServiceUnitId(Long serviceUnitId) {
+        this.serviceUnitId = serviceUnitId;
+    }
+
+    public String getDingSubmitStatusDesc() {
+        return dingSubmitStatusDesc;
+    }
+
+    public void setDingSubmitStatusDesc(String dingSubmitStatusDesc) {
+        this.dingSubmitStatusDesc = dingSubmitStatusDesc;
+    }
+
+    public Long getSubmitUserId() {
+        return submitUserId;
+    }
+
+    public void setSubmitUserId(Long submitUserId) {
+        this.submitUserId = submitUserId;
+    }
+
+    public String getArchivesName() {
+        return archivesName;
+    }
+
+    public void setArchivesName(String archivesName) {
+        this.archivesName = archivesName;
+    }
+
+    public Long getSupplierId() {
+        return supplierId;
+    }
+
+    public void setSupplierId(Long supplierId) {
+        this.supplierId = supplierId;
+    }
+
+    public String getCustomName() {
+        return customName;
+    }
+
+    public void setCustomName(String customName) {
+        this.customName = customName;
+    }
+
+    public String getSopNo() {
+        return sopNo;
+    }
+
+    public void setSopNo(String sopNo) {
+        this.sopNo = sopNo;
+    }
+
+    public Integer getViolationHoursLimit() {
+        return violationHoursLimit;
+    }
+
+    public void setViolationHoursLimit(Integer violationHoursLimit) {
+        this.violationHoursLimit = violationHoursLimit;
+    }
+
+    public Integer getDingExceptionLimit() {
+        return dingExceptionLimit;
+    }
+
+    public void setDingExceptionLimit(Integer dingExceptionLimit) {
+        this.dingExceptionLimit = dingExceptionLimit;
+    }
+
+    public Integer getRemainLimit() {
+        return remainLimit;
+    }
+
+    public void setRemainLimit(Integer remainLimit) {
+        this.remainLimit = remainLimit;
+    }
+
+    public Integer getExceptionLimit() {
+        return exceptionLimit;
+    }
+
+    public void setExceptionLimit(Integer exceptionLimit) {
+        this.exceptionLimit = exceptionLimit;
+    }
+}

+ 57 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/DingSubmitResult.java

@@ -22,6 +22,9 @@ public class DingSubmitResult {
     @ApiModelProperty(value = "sop流水号")
     private String sopNo;
 
+    @ApiModelProperty(value = "crm派单号")
+    private String crmNo;
+
     @ApiModelProperty(value = "客户名称")
     private String customName;
 
@@ -37,9 +40,19 @@ public class DingSubmitResult {
     @ApiModelProperty(value = "撤场时间")
     private Long departureTime;
 
+    @ApiModelProperty(value = "档案id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long archivesId;
+
+    @ApiModelProperty(value = "人员档案号")
+    private String archivesCodee;
+
     @ApiModelProperty(value = "姓名")
     private String archivesName;
 
+    @ApiModelProperty(value = "姓名(人员档案号)")
+    private String archivesInfo;
+
     @ApiModelProperty(value = "项目角色")
     private RoleTypeEnum roleType;
 
@@ -77,6 +90,10 @@ public class DingSubmitResult {
     @ApiModelProperty(value = "待处理异常数")
     private Integer exceptionCount;
 
+    @ApiModelProperty(value = "考勤提交id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long submitId;
+
     @ApiModelProperty(value = "提交状态")
     private DingSubmitStatusEnum submitStatus;
 
@@ -114,6 +131,14 @@ public class DingSubmitResult {
         this.sopNo = sopNo;
     }
 
+    public String getCrmNo() {
+        return crmNo;
+    }
+
+    public void setCrmNo(String crmNo) {
+        this.crmNo = crmNo;
+    }
+
     public String getCustomName() {
         return customName;
     }
@@ -154,6 +179,22 @@ public class DingSubmitResult {
         this.departureTime = departureTime;
     }
 
+    public Long getArchivesId() {
+        return archivesId;
+    }
+
+    public void setArchivesId(Long archivesId) {
+        this.archivesId = archivesId;
+    }
+
+    public String getArchivesCodee() {
+        return archivesCodee;
+    }
+
+    public void setArchivesCodee(String archivesCodee) {
+        this.archivesCodee = archivesCodee;
+    }
+
     public String getArchivesName() {
         return archivesName;
     }
@@ -162,6 +203,14 @@ public class DingSubmitResult {
         this.archivesName = archivesName;
     }
 
+    public String getArchivesInfo() {
+        return archivesInfo;
+    }
+
+    public void setArchivesInfo(String archivesInfo) {
+        this.archivesInfo = archivesInfo;
+    }
+
     public RoleTypeEnum getRoleType() {
         return roleType;
     }
@@ -258,6 +307,14 @@ public class DingSubmitResult {
         this.exceptionCount = exceptionCount;
     }
 
+    public Long getSubmitId() {
+        return submitId;
+    }
+
+    public void setSubmitId(Long submitId) {
+        this.submitId = submitId;
+    }
+
     public DingSubmitStatusEnum getSubmitStatus() {
         return submitStatus;
     }

+ 2 - 0
sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingSubmitMapper.java

@@ -53,6 +53,7 @@ public interface TBDingSubmitMapper extends BaseMapper<TBDingSubmit> {
      * @param serviceUnitId        服务单元id
      * @param dingSubmitStatusList 考勤提交状态
      * @param submitUserId         提交人id
+     * @param archivesId           用户档案id
      * @param archivesName         档案名称
      * @param supplierId           供应商id
      * @param customName           客户名
@@ -66,6 +67,7 @@ public interface TBDingSubmitMapper extends BaseMapper<TBDingSubmit> {
     List<DingSubmitResult> findDingSubmitList(@Param("serviceUnitId") Long serviceUnitId,
                                               @Param("dingSubmitStatusList") List<DingSubmitStatusEnum> dingSubmitStatusList,
                                               @Param("submitUserId") Long submitUserId,
+                                              @Param("archivesId") Long archivesId,
                                               @Param("archivesName") String archivesName,
                                               @Param("supplierId") Long supplierId,
                                               @Param("customName") String customName,

+ 43 - 3
sop-business/src/main/java/com/qmth/sop/business/service/TBDingSubmitService.java

@@ -2,10 +2,14 @@ package com.qmth.sop.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.sop.business.bean.dto.DingSubmitExportDto;
+import com.qmth.sop.business.bean.params.DingSubmitParam;
 import com.qmth.sop.business.bean.result.DingSubmitResult;
 import com.qmth.sop.business.bean.result.DingSubmitSubTotalResult;
 import com.qmth.sop.business.entity.TBDingSubmit;
 
+import java.util.List;
+
 /**
  * @Description: 考勤提交服务接口
  * @Author: CaoZixuan
@@ -56,9 +60,45 @@ public interface TBDingSubmitService extends IService<TBDingSubmit> {
                                                     Integer violationHoursLimit, Integer dingExceptionLimit,
                                                     Integer remainLimit, Integer exceptionLimit);
 
-    void submitDingBatch();
+    /**
+     * 考勤批量提交
+     *
+     * @param dingSubmitParamList 考勤提交参数
+     */
+    void submitDingBatch(List<DingSubmitParam> dingSubmitParamList);
 
-    void applyWithDraw(Long archivesId, String crmNo);
+    /**
+     * 申请考勤撤回
+     *
+     * @param dingSubmitParam 考勤提交参数
+     */
+    void applyWithdraw(DingSubmitParam dingSubmitParam);
 
-    void cancelWithDraw(Long archivesId, String crmNo);
+    /**
+     * 取消考勤撤回
+     *
+     * @param dingSubmitParam 考勤提交参数
+     */
+    void cancelWithdraw(DingSubmitParam dingSubmitParam);
+
+    /**
+     * 查询靠近提交导出集合
+     *
+     * @param serviceUnitId        服务单元id
+     * @param dingSubmitStatusDesc 考勤提交状态
+     * @param submitUserId         提交人id
+     * @param archivesName         档案名称
+     * @param supplierId           供应商id
+     * @param customName           客户名
+     * @param sopNo                sop号
+     * @param violationHoursLimit  违规工时限制
+     * @param dingExceptionLimit   需处理异常考勤限制
+     * @param remainLimit          补卡限制
+     * @param exceptionLimit       异常限制
+     * @return 考勤提交小计结果
+     */
+    List<DingSubmitExportDto> findDingSubmitExportList(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
+                                                       String archivesName, Long supplierId, String customName, String sopNo,
+                                                       Integer violationHoursLimit, Integer dingExceptionLimit,
+                                                       Integer remainLimit, Integer exceptionLimit);
 }

+ 207 - 4
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingSubmitServiceImpl.java

@@ -3,19 +3,26 @@ package com.qmth.sop.business.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.dto.DingSubmitExportDto;
+import com.qmth.sop.business.bean.params.DingSubmitParam;
 import com.qmth.sop.business.bean.result.DingSubmitResult;
 import com.qmth.sop.business.bean.result.DingSubmitSubTotalResult;
+import com.qmth.sop.business.entity.SysUser;
 import com.qmth.sop.business.entity.TBDingSubmit;
 import com.qmth.sop.business.mapper.TBDingSubmitMapper;
 import com.qmth.sop.business.service.TBDingSubmitService;
 import com.qmth.sop.common.contant.SystemConstant;
 import com.qmth.sop.common.enums.DingSubmitStatusEnum;
+import com.qmth.sop.common.enums.ExceptionResultEnum;
+import com.qmth.sop.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @Description: 考勤提交服务实现类
@@ -56,7 +63,7 @@ public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBD
         archivesName = SystemConstant.translateSpecificSign(archivesName);
         customName = SystemConstant.translateSpecificSign(customName);
         List<DingSubmitResult> dingSubmitResultList = this.baseMapper.findDingSubmitList(serviceUnitId, dingSubmitStatusEnumList,
-                submitUserId, archivesName, supplierId, customName, sopNo, violationHoursLimit, dingExceptionLimit, remainLimit, exceptionLimit);
+                submitUserId, null, archivesName, supplierId, customName, sopNo, violationHoursLimit, dingExceptionLimit, remainLimit, exceptionLimit);
 
         Integer dingCount = dingSubmitResultList.size();
         Integer willSubmitCount = Math.toIntExact(dingSubmitResultList.stream().filter(e -> e.getSubmitStatus().getSubmitDesc().equals("待提交")).count());
@@ -72,18 +79,214 @@ public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBD
         return dingSubmitSubTotalResult;
     }
 
+    @Transactional
     @Override
-    public void submitDingBatch() {
+    public void submitDingBatch(List<DingSubmitParam> dingSubmitParamList) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+
+        List<DingSubmitStatusEnum> dingSubmitStatusEnumList = new ArrayList<>();
+        dingSubmitStatusEnumList.add(DingSubmitStatusEnum.WILL_SUBMIT);
+        dingSubmitStatusEnumList.add(DingSubmitStatusEnum.AGREE_WITHDRAW);
+        List<TBDingSubmit> tbDingSubmitList = new ArrayList<>();
+
+        for (DingSubmitParam dingSubmitParam : dingSubmitParamList) {
+            Long serviceUnitId = dingSubmitParam.getServiceUnitId();
+            String sopNo = dingSubmitParam.getSopNo();
+            Long userArchivesId = dingSubmitParam.getUserArchivesId();
+            List<DingSubmitResult> dingSubmitResultList = this.baseMapper.findDingSubmitList(serviceUnitId, null,
+                    null, userArchivesId, null, null, null, sopNo,
+                    null, null, null, null);
+
+            if (dingSubmitResultList.size() != 1) {
+                throw ExceptionResultEnum.ERROR.exception(String.format("未找到服务单元id为[%s],sop流水号为[%s],用户档案号为[%s]的考勤信息", serviceUnitId, sopNo, userArchivesId));
+            }
+            DingSubmitResult dingSubmitResult = dingSubmitResultList.get(0);
+            String serviceUnitName = dingSubmitResult.getServiceUnitName();
+            String userArchivesName = dingSubmitResult.getArchivesName();
 
+
+            // 条件1 - 提交必须是待提交状态
+            DingSubmitStatusEnum submitStatus = dingSubmitResult.getSubmitStatus();
+            if (!dingSubmitStatusEnumList.contains(submitStatus)) {
+                throw ExceptionResultEnum.ERROR.exception(String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤的提交状态为[%s],不能提交",
+                        serviceUnitName, sopNo, userArchivesName, submitStatus.getSubmitDesc()));
+            }
+            // 条件2 - 待处理的异常数为0
+            Integer exceptionCount = dingSubmitResult.getExceptionCount();
+            if (exceptionCount != 0) {
+                throw ExceptionResultEnum.ERROR.exception(String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤待处理异常数为[%s],不能提交",
+                        serviceUnitName, sopNo, userArchivesName, exceptionCount));
+            }
+
+            Long submitId = dingSubmitResult.getSubmitUserId();
+            TBDingSubmit tbDingSubmit = new TBDingSubmit();
+            tbDingSubmit.setServiceId(serviceUnitId);
+            tbDingSubmit.setSopNo(sopNo);
+            tbDingSubmit.setCrmNo(dingSubmitResult.getCrmNo());
+            tbDingSubmit.setUserArchivesId(userArchivesId);
+            tbDingSubmit.setApproachTime(dingSubmitResult.getApproachTime());
+            tbDingSubmit.setDepartureTime(dingSubmitResult.getDepartureTime());
+            tbDingSubmit.setRoleType(dingSubmitResult.getRoleType());
+            tbDingSubmit.setActualDays(dingSubmitResult.getActualDays());
+            tbDingSubmit.setWeekdays(dingSubmitResult.getWeekdays());
+            tbDingSubmit.setWeekends(dingSubmitResult.getWeekends());
+            tbDingSubmit.setLegalHolidays(dingSubmitResult.getLegalHolidays());
+            tbDingSubmit.setWorkHours(dingSubmitResult.getWorkHours());
+            tbDingSubmit.setViolationDays(dingSubmitResult.getViolationDays());
+            tbDingSubmit.setSubmitUserId(requestUser.getId());
+            tbDingSubmit.setSubmitTime(System.currentTimeMillis());
+            tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.ALREADY_SUBMIT);
+            if (submitId != null && submitId > 0) {
+                tbDingSubmit.setId(submitId);
+            }
+            tbDingSubmitList.add(tbDingSubmit);
+        }
+        this.saveOrUpdateBatch(tbDingSubmitList);
     }
 
+    @Transactional
     @Override
-    public void applyWithDraw(Long archivesId, String crmNo) {
+    public void applyWithdraw(DingSubmitParam dingSubmitParam) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+
+        List<DingSubmitStatusEnum> dingSubmitStatusEnumList = new ArrayList<>();
+        dingSubmitStatusEnumList.add(DingSubmitStatusEnum.ALREADY_SUBMIT);
+        dingSubmitStatusEnumList.add(DingSubmitStatusEnum.APPLY_WITHDRAW);
+
+        Long serviceUnitId = dingSubmitParam.getServiceUnitId();
+        String sopNo = dingSubmitParam.getSopNo();
+        Long userArchivesId = dingSubmitParam.getUserArchivesId();
+        List<DingSubmitResult> dingSubmitResultList = this.baseMapper.findDingSubmitList(serviceUnitId, null,
+                null, userArchivesId, null, null, null, sopNo,
+                null, null, null, null);
 
+        if (dingSubmitResultList.size() != 1) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("未找到服务单元id为[%s],sop流水号为[%s],用户档案号为[%s]的考勤信息", serviceUnitId, sopNo, userArchivesId));
+        }
+        DingSubmitResult dingSubmitResult = dingSubmitResultList.get(0);
+        String serviceUnitName = dingSubmitResult.getServiceUnitName();
+        String userArchivesName = dingSubmitResult.getArchivesName();
+
+        DingSubmitStatusEnum submitStatus = dingSubmitResult.getSubmitStatus();
+        if (!dingSubmitStatusEnumList.contains(submitStatus)) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤的提交状态为[%s],不能申请撤回",
+                    serviceUnitName, sopNo, userArchivesName, submitStatus.getSubmitDesc()));
+        }
+
+        Long submitId = dingSubmitResult.getSubmitUserId();
+        if (submitId == null || submitId == 0) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤数据异常", serviceUnitName, sopNo, userArchivesName));
+        }
+        TBDingSubmit tbDingSubmit = new TBDingSubmit();
+        tbDingSubmit.setId(submitId);
+        tbDingSubmit.setServiceId(serviceUnitId);
+        tbDingSubmit.setSopNo(sopNo);
+        tbDingSubmit.setCrmNo(dingSubmitResult.getCrmNo());
+        tbDingSubmit.setUserArchivesId(userArchivesId);
+        tbDingSubmit.setApproachTime(dingSubmitResult.getApproachTime());
+        tbDingSubmit.setDepartureTime(dingSubmitResult.getDepartureTime());
+        tbDingSubmit.setRoleType(dingSubmitResult.getRoleType());
+        tbDingSubmit.setActualDays(dingSubmitResult.getActualDays());
+        tbDingSubmit.setWeekdays(dingSubmitResult.getWeekdays());
+        tbDingSubmit.setWeekends(dingSubmitResult.getWeekends());
+        tbDingSubmit.setLegalHolidays(dingSubmitResult.getLegalHolidays());
+        tbDingSubmit.setWorkHours(dingSubmitResult.getWorkHours());
+        tbDingSubmit.setViolationDays(dingSubmitResult.getViolationDays());
+        tbDingSubmit.setSubmitUserId(requestUser.getId());
+        tbDingSubmit.setSubmitTime(System.currentTimeMillis());
+        tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.APPLY_WITHDRAW);
+        this.updateById(tbDingSubmit);
     }
 
+    @Transactional
     @Override
-    public void cancelWithDraw(Long archivesId, String crmNo) {
+    public void cancelWithdraw(DingSubmitParam dingSubmitParam) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+
+        Long serviceUnitId = dingSubmitParam.getServiceUnitId();
+        String sopNo = dingSubmitParam.getSopNo();
+        Long userArchivesId = dingSubmitParam.getUserArchivesId();
+        List<DingSubmitResult> dingSubmitResultList = this.baseMapper.findDingSubmitList(serviceUnitId, null,
+                null, userArchivesId, null, null, null, sopNo,
+                null, null, null, null);
+
+        if (dingSubmitResultList.size() != 1) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("未找到服务单元id为[%s],sop流水号为[%s],用户档案号为[%s]的考勤信息", serviceUnitId, sopNo, userArchivesId));
+        }
+        DingSubmitResult dingSubmitResult = dingSubmitResultList.get(0);
+        String serviceUnitName = dingSubmitResult.getServiceUnitName();
+        String userArchivesName = dingSubmitResult.getArchivesName();
+
+        DingSubmitStatusEnum submitStatus = dingSubmitResult.getSubmitStatus();
+        if (!DingSubmitStatusEnum.APPLY_WITHDRAW.equals(submitStatus)) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤的提交状态为[%s],不能申请撤回",
+                    serviceUnitName, sopNo, userArchivesName, submitStatus.getSubmitDesc()));
+        }
+
+        Long submitId = dingSubmitResult.getSubmitUserId();
+        if (submitId == null || submitId == 0) {
+            throw ExceptionResultEnum.ERROR.exception(String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤数据异常", serviceUnitName, sopNo, userArchivesName));
+        }
+        TBDingSubmit tbDingSubmit = new TBDingSubmit();
+        tbDingSubmit.setId(submitId);
+        tbDingSubmit.setServiceId(serviceUnitId);
+        tbDingSubmit.setSopNo(sopNo);
+        tbDingSubmit.setCrmNo(dingSubmitResult.getCrmNo());
+        tbDingSubmit.setUserArchivesId(userArchivesId);
+        tbDingSubmit.setApproachTime(dingSubmitResult.getApproachTime());
+        tbDingSubmit.setDepartureTime(dingSubmitResult.getDepartureTime());
+        tbDingSubmit.setRoleType(dingSubmitResult.getRoleType());
+        tbDingSubmit.setActualDays(dingSubmitResult.getActualDays());
+        tbDingSubmit.setWeekdays(dingSubmitResult.getWeekdays());
+        tbDingSubmit.setWeekends(dingSubmitResult.getWeekends());
+        tbDingSubmit.setLegalHolidays(dingSubmitResult.getLegalHolidays());
+        tbDingSubmit.setWorkHours(dingSubmitResult.getWorkHours());
+        tbDingSubmit.setViolationDays(dingSubmitResult.getViolationDays());
+        tbDingSubmit.setSubmitUserId(requestUser.getId());
+        tbDingSubmit.setSubmitTime(System.currentTimeMillis());
+        tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.ALREADY_SUBMIT);
+        this.updateById(tbDingSubmit);
+    }
+
+    @Override
+    public List<DingSubmitExportDto> findDingSubmitExportList(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId, String archivesName, Long supplierId, String customName, String sopNo, Integer violationHoursLimit, Integer dingExceptionLimit, Integer remainLimit, Integer exceptionLimit) {
+        List<DingSubmitStatusEnum> dingSubmitStatusEnumList = new ArrayList<>();
+        if (dingSubmitStatusDesc != null && dingSubmitStatusDesc.length() > 0) {
+            dingSubmitStatusEnumList = Arrays.stream(DingSubmitStatusEnum.values())
+                    .filter(e -> e.getSubmitDesc().equals(dingSubmitStatusDesc))
+                    .collect(Collectors.toList());
+        }
+        archivesName = SystemConstant.translateSpecificSign(archivesName);
+        customName = SystemConstant.translateSpecificSign(customName);
+        List<DingSubmitResult> dingSubmitResultList = this.baseMapper.findDingSubmitList(serviceUnitId, dingSubmitStatusEnumList,
+                submitUserId, null, archivesName, supplierId, customName, sopNo, violationHoursLimit, dingExceptionLimit,
+                remainLimit, exceptionLimit);
 
+        return dingSubmitResultList.stream().flatMap(e -> {
+            DingSubmitExportDto dto = new DingSubmitExportDto();
+            dto.setServiceUnitName(e.getServiceUnitName());
+            dto.setSopNo(e.getSopNo());
+            dto.setCustomName(e.getCustomName());
+            dto.setProvince(e.getProvince());
+            dto.setCity(e.getCity());
+            dto.setApproachTime(e.getApproachTime());
+            dto.setDepartureTime(e.getDepartureTime());
+            dto.setArchivesInfo(e.getArchivesInfo());
+            dto.setRoleType(e.getRoleType());
+            dto.setSupplierName(e.getSupplierName());
+            dto.setActualDays(e.getActualDays());
+            dto.setWeekdays(e.getWeekdays());
+            dto.setWeekends(e.getWeekends());
+            dto.setLegalHolidays(e.getLegalHolidays());
+            dto.setWorkHours(e.getWorkHours());
+            dto.setViolationDays(e.getViolationDays());
+            dto.setDingExceptionCount(e.getDingExceptionCount());
+            dto.setRemainCount(e.getRemainCount());
+            dto.setExceptionCount(e.getExceptionCount());
+            dto.setSubmitStatus(e.getSubmitStatus());
+            dto.setSubmitUserName(e.getSubmitUserName());
+            dto.setSubmitTime(e.getSubmitTime());
+            return Stream.of(dto);
+        }).collect(Collectors.toList());
     }
 }

+ 75 - 0
sop-business/src/main/java/com/qmth/sop/business/templete/execute/AsyncDingSubmitExportService.java

@@ -0,0 +1,75 @@
+package com.qmth.sop.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.sop.business.bean.dto.DingSubmitExportDto;
+import com.qmth.sop.business.entity.BasicAttachment;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.templete.export.AsyncExportTaskTemplete;
+import com.qmth.sop.business.templete.service.TaskLogicService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskResultEnum;
+import com.qmth.sop.common.enums.TaskStatusEnum;
+import com.qmth.sop.common.enums.TaskTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description:
+ * @Author: CaoZixuan
+ * @Date:
+ */
+public class AsyncDingSubmitExportService extends AsyncExportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncDingSubmitExportService.class);
+    public static final String OBJ_TITLE = "考勤提交信息";
+
+    @Resource
+    TaskLogicService taskLogicService;
+
+    @Resource
+    TBTaskService tbTaskService;
+
+    @Override
+    public Result exportTask(Map<String, Object> map) throws Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        tbTask.setSummary(stringJoinerSummary.toString());
+        tbTaskService.updateById(tbTask);
+        try {
+            Map<String, Object> result = taskLogicService.executeExportDingSubmitLogic(map);
+            List<DingSubmitExportDto> dingSubmitExportDtoList = (List<DingSubmitExportDto>) result.get(SystemConstant.EXCEL_DATA);
+            BasicAttachment basicAttachment = (BasicAttachment) result.get(SystemConstant.EXCEL_ATTACHMENT);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, !CollectionUtils.isEmpty(dingSubmitExportDtoList) ? dingSubmitExportDtoList.size() : 0, FINISH_SIZE));
+
+            tbTask.setImportFileName(TaskTypeEnum.DING_SUBMIT_EXPORT.getTitle());
+            tbTask.setResultFilePath(basicAttachment.getPath());
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok();
+    }
+}

+ 13 - 2
sop-business/src/main/java/com/qmth/sop/business/templete/service/TaskLogicService.java

@@ -28,6 +28,7 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String, Object> executeExportUserArchivesLogic(Map<String, Object> map) throws Exception;
+
     /**
      * 处理客户表导入
      *
@@ -46,6 +47,7 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String, Object> executeExportSysMessageLogic(Map<String, Object> map) throws Exception;
+
     /**
      * 考勤打卡统计导出
      *
@@ -62,7 +64,7 @@ public interface TaskLogicService {
      * @return 结果
      * @throws Exception 异常
      */
-    Map<String, Object> executeExportDingAttendanceLogic(Map<String, Object> map)throws Exception;
+    Map<String, Object> executeExportDingAttendanceLogic(Map<String, Object> map) throws Exception;
 
     /**
      * 设备导入
@@ -71,5 +73,14 @@ public interface TaskLogicService {
      * @return 结果
      * @throws Exception 异常
      */
-    Map<String, Object> executeImportDeviceLogic(Map<String, Object> map)throws Exception;
+    Map<String, Object> executeImportDeviceLogic(Map<String, Object> map) throws Exception;
+
+    /**
+     * 考勤提交导出
+     *
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String, Object> executeExportDingSubmitLogic(Map<String, Object> map) throws Exception;
 }

+ 39 - 6
sop-business/src/main/java/com/qmth/sop/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -2,11 +2,9 @@ package com.qmth.sop.business.templete.service.impl;
 
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.qmth.sop.business.bean.dto.CustomImportDto;
-import com.qmth.sop.business.bean.dto.DeviceImportDto;
-import com.qmth.sop.business.bean.dto.SysMessageExportDto;
-import com.qmth.sop.business.bean.dto.UserArchivesImportDto;
+import com.qmth.sop.business.bean.dto.*;
 import com.qmth.sop.business.bean.params.UserArchivesParam;
+import com.qmth.sop.business.bean.query.DingSubmitQuery;
 import com.qmth.sop.business.bean.query.UserArchivesQuery;
 import com.qmth.sop.business.bean.result.SysMessageResult;
 import com.qmth.sop.business.bean.result.TBDingAttendanceResult;
@@ -79,6 +77,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     @Resource
     private SysDeviceService sysDeviceService;
 
+    @Resource
+    private TBDingSubmitService tbDingSubmitService;
+
     /**
      * 处理导入人员档案数据
      *
@@ -138,8 +139,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                 }
                 for (UserArchivesImportDto userArchivesImportDto : userArchivesImportDtoList) {
                     UserArchivesParam userArchivesParam = new UserArchivesParam();
-                    // TODO: 2023/8/15 临时生成编号方法
-
                     userArchivesParam.setName(userArchivesImportDto.getName());
                     userArchivesParam.setProvince(userArchivesImportDto.getProvince());
                     userArchivesParam.setCity(userArchivesImportDto.getCity());
@@ -417,6 +416,40 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return map;
     }
 
+    @Override
+    public Map<String, Object> executeExportDingSubmitLogic(Map<String, Object> map) throws Exception {
+        File fileTemp = null;
+        try {
+            fileTemp = SystemConstant.getFileTempVar(SystemConstant.XLSX_PREFIX);
+            //数据读取逻辑start
+            DingSubmitQuery query = (DingSubmitQuery) map.get(SystemConstant.QUERY);
+            Long serviceUnitId = query.getServiceUnitId();
+            String dingSubmitStatusDesc = query.getDingSubmitStatusDesc();
+            Long submitUserId = query.getSubmitUserId();
+            String archivesName = query.getArchivesName();
+            Long supplierId = query.getSupplierId();
+            String customName = query.getCustomName();
+            String sopNo = query.getSopNo();
+            Integer violationHoursLimit = query.getViolationHoursLimit();
+            Integer dingExceptionLimit = query.getDingExceptionLimit();
+            Integer remainLimit = query.getRemainLimit();
+            Integer exceptionLimit = query.getExceptionLimit();
+            List<DingSubmitExportDto> dingSubmitExportDtoList = tbDingSubmitService.findDingSubmitExportList(serviceUnitId, dingSubmitStatusDesc,
+                    submitUserId, archivesName, supplierId, customName, sopNo, violationHoursLimit, dingExceptionLimit, remainLimit, exceptionLimit);
+            //数据读取逻辑end
+            EasyExcel.write(fileTemp, DingSubmitExportDto.class).sheet("考勤提交导出").doWrite(dingSubmitExportDtoList);
+
+            BasicAttachment basicAttachment = basicAttachmentService.saveAttachment(fileTemp, UploadFileEnum.FILE);
+            map.computeIfAbsent(SystemConstant.EXCEL_DATA, v -> dingSubmitExportDtoList);
+            map.computeIfAbsent(SystemConstant.EXCEL_ATTACHMENT, v -> basicAttachment);
+        } finally {
+            if (Objects.nonNull(fileTemp)) {
+                fileTemp.delete();
+            }
+        }
+        return map;
+    }
+
     /**
      * 处理导出人员档案数据
      *

+ 10 - 0
sop-business/src/main/resources/mapper/TBDingSubmitMapper.xml

@@ -10,12 +10,16 @@
                  tbd.service_id AS serviceUnitId,
                  tbs.name AS serviceUnitName,
                  tbd.sop_no AS sopNo,
+                 tbd.crm_no AS crmNo,
                  sc.name AS customName,
                  sc.province AS province,
                  sc.city AS city,
                  tbd.approach_time AS approachTime,
                  tbd.departure_time AS departureTime,
+                 tbua.id AS archivesId,
+                 tbua.code AS archivesCode,
                  tbua.name AS archivesName,
+                 CONCAT(tbua.name,'(',tbua.code,')') AS archivesInfo,
                  tbd.role_type AS roleType,
                  ss.id AS supplierId,
                  ss.name AS supplierName,
@@ -28,6 +32,7 @@
                  tbd.ding_exception_count AS dingExceptionCount,
                  (sdg.reissue_card_count - tbd.submit_exception_count) AS remainCount,
                  tbd.exception_count AS exceptionCount,
+                 tbds.id AS submitId,
                  IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
                  tbds.submit_user_id AS submitUserId,
                  su.real_name AS submitUserName,
@@ -125,12 +130,16 @@
                  tbd.service_id AS serviceUnitId,
                  tbs.name AS serviceUnitName,
                  tbd.sop_no AS sopNo,
+                 tbd.crm_no AS crmNO,
                  sc.name AS customName,
                  sc.province AS province,
                  sc.city AS city,
                  tbd.approach_time AS approachTime,
                  tbd.departure_time AS departureTime,
+                 tbua.id AS archivesId,
+                 tbua.code AS archivesCode,
                  tbua.name AS archivesName,
+                 CONCAT(tbua.name,'(',tbua.code,')') AS archivesInfo,
                  tbd.role_type AS roleType,
                  ss.id AS supplierId,
                  ss.name AS supplierName,
@@ -143,6 +152,7 @@
                  tbd.ding_exception_count AS dingExceptionCount,
                  (sdg.reissue_card_count - tbd.submit_exception_count) AS remainCount,
                  tbd.exception_count AS exceptionCount,
+                 tbds.id AS submitId,
                  IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
                  tbds.submit_user_id AS submitUserId,
                  su.real_name AS submitUserName,

+ 1 - 0
sop-common/src/main/java/com/qmth/sop/common/contant/SystemConstant.java

@@ -163,6 +163,7 @@ public class SystemConstant {
     public static final String PREFIX_URL_VIOLATION = "/admin/tb/violation";
     public static final String PREFIX_URL_VIOLATION_DETAIL = "/admin/tb/violation/detail";
     public static final String PREFIX_URL_DING = "/admin/tb/ding";
+    public static final String PREFIX_URL_DING_SUBMIT = "/admin/tb/ding/submit";
     public static final String PREFIX_URL_QUALITY_PROBLEM_APPLY = "/admin/tb/quality/problem/apply";
     public static final String PREFIX_URL_CRM = "/admin/tb/crm";
     public static final String PREFIX_URL_DING_EXCEPTION_APPLY = "/admin/ding/exception/apply";

+ 1 - 2
sop-common/src/main/java/com/qmth/sop/common/enums/DingSubmitStatusEnum.java

@@ -7,9 +7,8 @@ package com.qmth.sop.common.enums;
  */
 public enum DingSubmitStatusEnum {
     WILL_SUBMIT("工程师未提交考勤或撤回了考勤提交的状态","待提交","--"),
-    ALREADY_SUBMIT("工程师提交或取消撤回考勤","已提交","已提交"),
+    ALREADY_SUBMIT("工程师提交考勤","已提交","已提交"),
     APPLY_WITHDRAW("工程师申请撤回考勤提交","已提交","申请撤回"),
-    CANCEL_WITHDRAW("工程师取消撤回申请","已提交","已提交"),
     AGREE_WITHDRAW("管理员同意撤回","待提交","已撤回"),
     AGREE_DING("管理员同意考勤申请","审核通过","审核通过")
     ;

+ 2 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/TaskTypeEnum.java

@@ -23,6 +23,8 @@ public enum TaskTypeEnum {
 
     DING_ATTENDANCE_EXPORT("考勤明细导出"),
 
+    DING_SUBMIT_EXPORT("考勤提交导出"),
+
     DEVICE_IMPORT("设备导入");
 
     private String title;

+ 159 - 0
sop-server/src/main/java/com/qmth/sop/server/api/TBDingSubmitController.java

@@ -0,0 +1,159 @@
+package com.qmth.sop.server.api;
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.sop.business.annotation.OperationLog;
+import com.qmth.sop.business.bean.params.DingSubmitParam;
+import com.qmth.sop.business.bean.query.DingSubmitQuery;
+import com.qmth.sop.business.bean.result.DingSubmitResult;
+import com.qmth.sop.business.entity.TBTask;
+import com.qmth.sop.business.service.TBDingSubmitService;
+import com.qmth.sop.business.service.TBTaskService;
+import com.qmth.sop.business.templete.execute.AsyncDingSubmitExportService;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.TaskTypeEnum;
+import com.qmth.sop.common.util.Result;
+import com.qmth.sop.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 考勤提交前端控制器
+ * @Author: CaoZixuan
+ * @Date: 2023-08-29
+ */
+@Api(tags = "考勤提交Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_DING_SUBMIT)
+public class TBDingSubmitController {
+    @Resource
+    private TBDingSubmitService tbDingSubmitService;
+    @Resource
+    private TBTaskService tbTaskService;
+    @Resource
+    private AsyncDingSubmitExportService asyncDingSubmitExportService;
+
+    @ApiOperation(value = "考勤提交-分页查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = DingSubmitResult.class)})
+    @OperationLog
+    public Result findDingSubmitPage(@ApiParam(value = "服务单元id") @RequestParam(required = false) String serviceUnitId,
+                                     @ApiParam(value = "考勤提交状态") @RequestParam(required = false) String dingSubmitStatusDesc,
+                                     @ApiParam(value = "提交人id") @RequestParam(required = false) String submitUserId,
+                                     @ApiParam(value = "档案名称") @RequestParam(required = false) String archivesName,
+                                     @ApiParam(value = "供应商id") @RequestParam(required = false) String supplierId,
+                                     @ApiParam(value = "客户名") @RequestParam(required = false) String customName,
+                                     @ApiParam(value = "sop号") @RequestParam(required = false) String sopNo,
+                                     @ApiParam(value = "违规工时限制") @RequestParam(required = false) Integer violationHoursLimit,
+                                     @ApiParam(value = "需处理异常考勤限制") @RequestParam(required = false) Integer dingExceptionLimit,
+                                     @ApiParam(value = "补卡限制") @RequestParam(required = false) Integer remainLimit,
+                                     @ApiParam(value = "异常限制") @RequestParam(required = false) Integer exceptionLimit,
+                                     @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                                     @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+
+        return ResultUtil.ok(tbDingSubmitService.findDingSubmitPage(SystemConstant.convertIdToLong(serviceUnitId),
+                dingSubmitStatusDesc, SystemConstant.convertIdToLong(submitUserId), archivesName,
+                SystemConstant.convertIdToLong(supplierId), customName, sopNo, violationHoursLimit,
+                dingExceptionLimit, remainLimit, exceptionLimit, pageNumber, pageSize));
+    }
+
+    @ApiOperation(value = "考勤提交-小计")
+    @RequestMapping(value = "/sub_total", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = DingSubmitResult.class)})
+    @OperationLog
+    public Result findDingSubmitSubTotal(@ApiParam(value = "服务单元id") @RequestParam(required = false) String serviceUnitId,
+                                         @ApiParam(value = "考勤提交状态") @RequestParam(required = false) String dingSubmitStatusDesc,
+                                         @ApiParam(value = "提交人id") @RequestParam(required = false) String submitUserId,
+                                         @ApiParam(value = "档案名称") @RequestParam(required = false) String archivesName,
+                                         @ApiParam(value = "供应商id") @RequestParam(required = false) String supplierId,
+                                         @ApiParam(value = "客户名") @RequestParam(required = false) String customName,
+                                         @ApiParam(value = "sop号") @RequestParam(required = false) String sopNo,
+                                         @ApiParam(value = "违规工时限制") @RequestParam(required = false) Integer violationHoursLimit,
+                                         @ApiParam(value = "需处理异常考勤限制") @RequestParam(required = false) Integer dingExceptionLimit,
+                                         @ApiParam(value = "补卡限制") @RequestParam(required = false) Integer remainLimit,
+                                         @ApiParam(value = "异常限制") @RequestParam(required = false) Integer exceptionLimit) {
+
+        return ResultUtil.ok(tbDingSubmitService.findDingSubmitSubTotal(SystemConstant.convertIdToLong(serviceUnitId),
+                dingSubmitStatusDesc, SystemConstant.convertIdToLong(submitUserId), archivesName,
+                SystemConstant.convertIdToLong(supplierId), customName, sopNo, violationHoursLimit,
+                dingExceptionLimit, remainLimit, exceptionLimit));
+    }
+
+    @ApiOperation(value = "考勤提交-批量提交")
+    @RequestMapping(value = "/submit_batch", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    @OperationLog
+    public Result submitBatch(@Valid @RequestBody List<DingSubmitParam> dingSubmitParamList, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        tbDingSubmitService.submitDingBatch(dingSubmitParamList);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "考勤提交-考勤撤回")
+    @RequestMapping(value = "/apply_withdram", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    @OperationLog
+    public Result applyWithdraw(@Valid @RequestBody DingSubmitParam dingSubmitParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        tbDingSubmitService.applyWithdraw(dingSubmitParam);
+        return ResultUtil.ok();
+    }
+
+    @ApiOperation(value = "考勤提交-取消撤回")
+    @RequestMapping(value = "/cancel_withdraw", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    @OperationLog
+    public Result submitBatch(@Valid @RequestBody DingSubmitParam dingSubmitParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        tbDingSubmitService.cancelWithdraw(dingSubmitParam);
+        return ResultUtil.ok();
+    }
+
+
+    @ApiOperation(value = "考勤提交-批量导出")
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = Object.class)})
+    public Result exportDingSubmit(@ApiParam(value = "服务单元id") @RequestParam(required = false) String serviceUnitId,
+                                   @ApiParam(value = "考勤提交状态") @RequestParam(required = false) String dingSubmitStatusDesc,
+                                   @ApiParam(value = "提交人id") @RequestParam(required = false) String submitUserId,
+                                   @ApiParam(value = "档案名称") @RequestParam(required = false) String archivesName,
+                                   @ApiParam(value = "供应商id") @RequestParam(required = false) String supplierId,
+                                   @ApiParam(value = "客户名") @RequestParam(required = false) String customName,
+                                   @ApiParam(value = "sop号") @RequestParam(required = false) String sopNo,
+                                   @ApiParam(value = "违规工时限制") @RequestParam(required = false) Integer violationHoursLimit,
+                                   @ApiParam(value = "需处理异常考勤限制") @RequestParam(required = false) Integer dingExceptionLimit,
+                                   @ApiParam(value = "补卡限制") @RequestParam(required = false) Integer remainLimit,
+                                   @ApiParam(value = "异常限制") @RequestParam(required = false) Integer exceptionLimit) throws Exception {
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.USER_ARCHIVES_EXPORT);
+        DingSubmitQuery query = new DingSubmitQuery();
+        query.setServiceUnitId(SystemConstant.convertIdToLong(serviceUnitId));
+        query.setDingSubmitStatusDesc(dingSubmitStatusDesc);
+        query.setSubmitUserId(SystemConstant.convertIdToLong(submitUserId));
+        query.setArchivesName(archivesName);
+        query.setSupplierId(SystemConstant.convertIdToLong(supplierId));
+        query.setCustomName(customName);
+        query.setSopNo(sopNo);
+        query.setViolationHoursLimit(violationHoursLimit);
+        query.setDingExceptionLimit(dingExceptionLimit);
+        query.setRemainLimit(remainLimit);
+        query.setExceptionLimit(exceptionLimit);
+        map.put(SystemConstant.QUERY, query);
+
+        asyncDingSubmitExportService.exportTask(map);
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        return ResultUtil.ok(tbTask.getId());
+    }
+}

+ 0 - 2
sop-server/src/main/java/com/qmth/sop/server/api/TBUserArchivesController.java

@@ -2,10 +2,8 @@ package com.qmth.sop.server.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.sop.business.annotation.OperationLog;
-import com.qmth.sop.business.bean.params.UserArchivesAllocationParam;
 import com.qmth.sop.business.bean.params.UserArchivesParam;
 import com.qmth.sop.business.bean.query.UserArchivesQuery;
-import com.qmth.sop.business.bean.result.ArchivesSourceResult;
 import com.qmth.sop.business.bean.result.UserArchivesResult;
 import com.qmth.sop.business.bean.result.UserArchivesSubTotalResult;
 import com.qmth.sop.business.entity.SysUser;