Kaynağa Gözat

add:考勤提交

caozixuan 1 yıl önce
ebeveyn
işleme
5285f2e4a5

+ 9 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/params/DingSubmitParam.java

@@ -0,0 +1,9 @@
+package com.qmth.sop.business.bean.params;
+
+/**
+ * @Description: 考勤提交参数
+ * @Author: CaoZixuan
+ * @Date: 2023-08-28
+ */
+public class DingSubmitParam {
+}

+ 39 - 1
sop-business/src/main/java/com/qmth/sop/business/bean/result/TBDingSubmitResult.java → sop-business/src/main/java/com/qmth/sop/business/bean/result/DingSubmitResult.java

@@ -1,5 +1,7 @@
 package com.qmth.sop.business.bean.result;
 
+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;
@@ -9,7 +11,11 @@ import io.swagger.annotations.ApiModelProperty;
  * @Author: CaoZixuan
  * @Date: 2023-08-25
  */
-public class TBDingSubmitResult {
+public class DingSubmitResult {
+    @ApiModelProperty(value = "服务单元id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long serviceUnitId;
+
     @ApiModelProperty(value = "服务单元")
     private String serviceUnitName;
 
@@ -37,6 +43,10 @@ public class TBDingSubmitResult {
     @ApiModelProperty(value = "项目角色")
     private RoleTypeEnum roleType;
 
+    @ApiModelProperty("供应商id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long supplierId;
+
     @ApiModelProperty(value = "供应商")
     private String supplierName;
 
@@ -70,12 +80,24 @@ public class TBDingSubmitResult {
     @ApiModelProperty(value = "提交状态")
     private DingSubmitStatusEnum submitStatus;
 
+    @ApiModelProperty(value = "提交人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long submitUserId;
+
     @ApiModelProperty(value = "提交人")
     private Long submitUserName;
 
     @ApiModelProperty(value = "提交时间")
     private Long submitTime;
 
+    public Long getServiceUnitId() {
+        return serviceUnitId;
+    }
+
+    public void setServiceUnitId(Long serviceUnitId) {
+        this.serviceUnitId = serviceUnitId;
+    }
+
     public String getServiceUnitName() {
         return serviceUnitName;
     }
@@ -148,6 +170,14 @@ public class TBDingSubmitResult {
         this.roleType = roleType;
     }
 
+    public Long getSupplierId() {
+        return supplierId;
+    }
+
+    public void setSupplierId(Long supplierId) {
+        this.supplierId = supplierId;
+    }
+
     public String getSupplierName() {
         return supplierName;
     }
@@ -236,6 +266,14 @@ public class TBDingSubmitResult {
         this.submitStatus = submitStatus;
     }
 
+    public Long getSubmitUserId() {
+        return submitUserId;
+    }
+
+    public void setSubmitUserId(Long submitUserId) {
+        this.submitUserId = submitUserId;
+    }
+
     public Long getSubmitUserName() {
         return submitUserName;
     }

+ 65 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/DingSubmitSubTotalResult.java

@@ -0,0 +1,65 @@
+package com.qmth.sop.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考勤提交小计
+ * @Author: CaoZixuan
+ * @Date: 2023-08-28
+ */
+public class DingSubmitSubTotalResult {
+    @ApiModelProperty("考勤总计")
+    private Integer dingCount;
+
+    @ApiModelProperty("待提交")
+    private Integer willSubmitCount;
+
+    @ApiModelProperty("已提交")
+    private Integer submitCount;
+
+    @ApiModelProperty("累计人天")
+    private Integer totalActualDays;
+
+    @ApiModelProperty("累计工时")
+    private Double totalWorkHours;
+
+    public Integer getDingCount() {
+        return dingCount;
+    }
+
+    public void setDingCount(Integer dingCount) {
+        this.dingCount = dingCount;
+    }
+
+    public Integer getWillSubmitCount() {
+        return willSubmitCount;
+    }
+
+    public void setWillSubmitCount(Integer willSubmitCount) {
+        this.willSubmitCount = willSubmitCount;
+    }
+
+    public Integer getSubmitCount() {
+        return submitCount;
+    }
+
+    public void setSubmitCount(Integer submitCount) {
+        this.submitCount = submitCount;
+    }
+
+    public Integer getTotalActualDays() {
+        return totalActualDays;
+    }
+
+    public void setTotalActualDays(Integer totalActualDays) {
+        this.totalActualDays = totalActualDays;
+    }
+
+    public Double getTotalWorkHours() {
+        return totalWorkHours;
+    }
+
+    public void setTotalWorkHours(Double totalWorkHours) {
+        this.totalWorkHours = totalWorkHours;
+    }
+}

+ 55 - 25
sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingSubmitMapper.java

@@ -3,11 +3,13 @@ package com.qmth.sop.business.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.sop.business.bean.result.TBDingSubmitResult;
+import com.qmth.sop.business.bean.result.DingSubmitResult;
 import com.qmth.sop.business.entity.TBDingSubmit;
 import com.qmth.sop.common.enums.DingSubmitStatusEnum;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * @Description: 考勤提交mapper
  * @Author: CaoZixuan
@@ -18,30 +20,58 @@ public interface TBDingSubmitMapper extends BaseMapper<TBDingSubmit> {
     /**
      * 考勤提交分页查询
      *
-     * @param iPage               分页参数
-     * @param serviceUnitId       服务单元id
-     * @param dingSubmitStatus    考勤提交状态
-     * @param submitUserId        提交人id
-     * @param archivesName        档案名称
-     * @param supplierId          供应商id
-     * @param customName          客户名
-     * @param sopNo               sop号
-     * @param violationHoursLimit 违规工时限制
-     * @param dingExceptionLimit  需处理异常考勤限制
-     * @param remainLimit         补卡限制
-     * @param exceptionLimit      异常限制
+     * @param iPage                分页参数
+     * @param serviceUnitId        服务单元id
+     * @param dingSubmitStatusList 考勤提交状态
+     * @param submitUserId         提交人id
+     * @param archivesName         档案名称
+     * @param supplierId           供应商id
+     * @param customName           客户名
+     * @param sopNo                sop号
+     * @param violationHoursLimit  违规工时限制
+     * @param dingExceptionLimit   需处理异常考勤限制
+     * @param remainLimit          补卡限制
+     * @param exceptionLimit       异常限制
+     * @return 考勤提交分页查询结果
+     */
+    IPage<DingSubmitResult> findDingSubmitPage(@Param("iPage") Page<DingSubmitResult> iPage,
+                                               @Param("serviceUnitId") Long serviceUnitId,
+                                               @Param("dingSubmitStatusList") List<DingSubmitStatusEnum> dingSubmitStatusList,
+                                               @Param("submitUserId") Long submitUserId,
+                                               @Param("archivesName") String archivesName,
+                                               @Param("supplierId") Long supplierId,
+                                               @Param("customName") String customName,
+                                               @Param("sopNo") String sopNo,
+                                               @Param("violationHoursLimit") Integer violationHoursLimit,
+                                               @Param("dingExceptionLimit") Integer dingExceptionLimit,
+                                               @Param("remainLimit") Integer remainLimit,
+                                               @Param("exceptionLimit") Integer exceptionLimit);
+
+    /**
+     * 考勤提交列表查询
+     *
+     * @param serviceUnitId        服务单元id
+     * @param dingSubmitStatusList 考勤提交状态
+     * @param submitUserId         提交人id
+     * @param archivesName         档案名称
+     * @param supplierId           供应商id
+     * @param customName           客户名
+     * @param sopNo                sop号
+     * @param violationHoursLimit  违规工时限制
+     * @param dingExceptionLimit   需处理异常考勤限制
+     * @param remainLimit          补卡限制
+     * @param exceptionLimit       异常限制
      * @return 考勤提交分页查询结果
      */
-    IPage<TBDingSubmitResult> findDingSubmitPage(@Param("iPage") Page<TBDingSubmitResult> iPage,
-                                                 @Param("serviceUnitId") Long serviceUnitId,
-                                                 @Param("dingSubmitStatus") DingSubmitStatusEnum dingSubmitStatus,
-                                                 @Param("submitUserId") Long submitUserId,
-                                                 @Param("archivesName") String archivesName,
-                                                 @Param("supplierId") Long supplierId,
-                                                 @Param("customName") String customName,
-                                                 @Param("sopNo") String sopNo,
-                                                 @Param("violationHoursLimit") Integer violationHoursLimit,
-                                                 @Param("dingExceptionLimit") Integer dingExceptionLimit,
-                                                 @Param("remainLimit") Integer remainLimit,
-                                                 @Param("exceptionLimit") Integer exceptionLimit);
+    List<DingSubmitResult> findDingSubmitList(@Param("serviceUnitId") Long serviceUnitId,
+                                              @Param("dingSubmitStatusList") List<DingSubmitStatusEnum> dingSubmitStatusList,
+                                              @Param("submitUserId") Long submitUserId,
+                                              @Param("archivesName") String archivesName,
+                                              @Param("supplierId") Long supplierId,
+                                              @Param("customName") String customName,
+                                              @Param("sopNo") String sopNo,
+                                              @Param("violationHoursLimit") Integer violationHoursLimit,
+                                              @Param("dingExceptionLimit") Integer dingExceptionLimit,
+                                              @Param("remainLimit") Integer remainLimit,
+                                              @Param("exceptionLimit") Integer exceptionLimit);
 }

+ 44 - 7
sop-business/src/main/java/com/qmth/sop/business/service/TBDingSubmitService.java

@@ -2,9 +2,9 @@ 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.result.TBDingSubmitResult;
+import com.qmth.sop.business.bean.result.DingSubmitResult;
+import com.qmth.sop.business.bean.result.DingSubmitSubTotalResult;
 import com.qmth.sop.business.entity.TBDingSubmit;
-import com.qmth.sop.common.enums.DingSubmitStatusEnum;
 
 /**
  * @Description: 考勤提交服务接口
@@ -12,12 +12,49 @@ import com.qmth.sop.common.enums.DingSubmitStatusEnum;
  * @Date: 2023-08-25
  */
 public interface TBDingSubmitService extends IService<TBDingSubmit> {
-    IPage<TBDingSubmitResult> findDingSubmitPage(Long serviceUnitId, DingSubmitStatusEnum dingSubmitStatus, Long submitUserId,
-                                                 String archivesName, Long supplierId, String customName, String sopNo,
-                                                 Integer violationHoursLimit, Integer dingExceptionLimit,
-                                                 Integer remainLimit, Integer exceptionLimit, Integer pageNumber, Integer pageSize);
+    /**
+     * 考勤提交分页查询
+     *
+     * @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       异常限制
+     * @param pageNumber           分页页数
+     * @param pageSize             分页容量
+     * @return 考勤提交分页查询结果
+     */
+    IPage<DingSubmitResult> findDingSubmitPage(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
+                                               String archivesName, Long supplierId, String customName, String sopNo,
+                                               Integer violationHoursLimit, Integer dingExceptionLimit,
+                                               Integer remainLimit, Integer exceptionLimit, Integer pageNumber, Integer pageSize);
 
-    Object findDingSubmitSubTotal();
+    /**
+     * 考勤提交小计
+     *
+     * @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 考勤提交小计结果
+     */
+    DingSubmitSubTotalResult findDingSubmitSubTotal(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
+                                                    String archivesName, Long supplierId, String customName, String sopNo,
+                                                    Integer violationHoursLimit, Integer dingExceptionLimit,
+                                                    Integer remainLimit, Integer exceptionLimit);
 
     void submitDingBatch();
 

+ 53 - 5
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingSubmitServiceImpl.java

@@ -1,27 +1,75 @@
 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.result.TBDingSubmitResult;
+import com.qmth.sop.business.bean.result.DingSubmitResult;
+import com.qmth.sop.business.bean.result.DingSubmitSubTotalResult;
 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 org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 考勤提交服务实现类
  * @Author: CaoZixuan
  * @Date: 2023/08/25
  */
+@Service
 public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBDingSubmit> implements TBDingSubmitService {
     @Override
-    public IPage<TBDingSubmitResult> findDingSubmitPage(Long serviceUnitId, DingSubmitStatusEnum dingSubmitStatus, Long submitUserId, String archivesName, Long supplierId, String customName, String sopNo, Integer violationHoursLimit, Integer dingExceptionLimit, Integer remainLimit, Integer exceptionLimit, Integer pageNumber, Integer pageSize) {
-        return null;
+    public IPage<DingSubmitResult> findDingSubmitPage(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
+                                                      String archivesName, Long supplierId, String customName, String sopNo,
+                                                      Integer violationHoursLimit, Integer dingExceptionLimit, Integer remainLimit, Integer exceptionLimit,
+                                                      Integer pageNumber, Integer pageSize) {
+
+        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);
+        return this.baseMapper.findDingSubmitPage(new Page<>(pageNumber, pageSize), serviceUnitId, dingSubmitStatusEnumList,
+                submitUserId, archivesName, supplierId, customName, sopNo, violationHoursLimit, dingExceptionLimit, remainLimit, exceptionLimit);
     }
 
     @Override
-    public Object findDingSubmitSubTotal() {
-        return null;
+    public DingSubmitSubTotalResult findDingSubmitSubTotal(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, 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());
+        Integer submitCount = Math.toIntExact(dingSubmitResultList.stream().filter(e -> e.getSubmitStatus().getSubmitDesc().equals("已提交")).count());
+        Integer totalActualDays = dingSubmitResultList.stream().mapToInt(DingSubmitResult::getActualDays).sum();
+        Double totalWorkHours = dingSubmitResultList.stream().mapToDouble(DingSubmitResult::getWorkHours).sum();
+        DingSubmitSubTotalResult dingSubmitSubTotalResult = new DingSubmitSubTotalResult();
+        dingSubmitSubTotalResult.setDingCount(dingCount);
+        dingSubmitSubTotalResult.setWillSubmitCount(willSubmitCount);
+        dingSubmitSubTotalResult.setSubmitCount(submitCount);
+        dingSubmitSubTotalResult.setTotalActualDays(totalActualDays);
+        dingSubmitSubTotalResult.setTotalWorkHours(totalWorkHours);
+        return dingSubmitSubTotalResult;
     }
 
     @Override

+ 226 - 31
sop-business/src/main/resources/mapper/TBDingSubmitMapper.xml

@@ -2,38 +2,233 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.sop.business.mapper.TBDingSubmitMapper">
 
-    <select id="findDingSubmitPage" resultType="com.qmth.sop.business.bean.result.TBDingSubmitResult">
+    <select id="findDingSubmitPage" resultType="com.qmth.sop.business.bean.result.DingSubmitResult">
         SELECT
-            service_id,
-            sop_no,
-            crm_no,
-            user_archives_id,
-            MAX(role_type) AS roleType,
-            MIN(sign_in_time) AS approachTime,
-            MAX(sign_out_time) AS departureTime,
-            COUNT(1) AS actualDays,
-            SUM(IF(date_type = 'WEEKDAY', 1, 0)) AS weekdays,
-            SUM(IF(date_type = 'WEEKEND', 1, 0)) AS weekends,
-            SUM(IF(date_type = 'LEGAL_HOLIDAYS', 1, 0)) AS legalHolidays,
-            ROUND(SUM(IF(sign_out_time IS NOT NULL
-                             AND sign_in_time IS NOT NULL,
-                         TIMESTAMPDIFF(MINUTE,
-                                       FROM_UNIXTIME(SUBSTRING(sign_out_time, 1, 10),
-                                                     '%Y-%m-%d %H:%i:%s'),
-                                       FROM_UNIXTIME(SUBSTRING(sign_in_time, 1, 10),
-                                                     '%Y-%m-%d %H:%i:%s')),
-                         0)) / 60,
-                  1) AS workHours,
-            SUM(IF((sign_in_time IS NULL
-                OR sign_out_time IS NULL),
-                   1,
-                   0)) AS violationDays,
-            SUM(IF((sign_in_time IS NULL
-                OR sign_out_time IS NULL),
-                   1,
-                   0)) AS dingExceptionCount
+            *
         FROM
-            t_b_ding
-        GROUP BY service_id , sop_no , crm_no , user_archives_id;
+            (SELECT
+                 tbd.service_id AS serviceUnitId,
+                 tbs.name AS serviceUnitName,
+                 tbd.sop_no AS sopNo,
+                 sc.name AS customName,
+                 sc.province AS province,
+                 sc.city AS city,
+                 tbd.approach_time AS approachTime,
+                 tbd.departure_time AS departureTime,
+                 tbua.name AS archivesName,
+                 tbd.role_type AS roleType,
+                 ss.id AS supplierId,
+                 ss.name AS supplierName,
+                 tbd.actual_days AS actualDays,
+                 tbd.weekdays AS weekdays,
+                 tbd.weekends AS weekends,
+                 tbd.legal_holidays AS legalHolidays,
+                 tbd.work_hours AS workHours,
+                 tbd.violation_days AS violationDays,
+                 tbd.ding_exception_count AS dingExceptionCount,
+                 (sdg.reissue_card_count - tbd.submit_exception_count) AS remainCount,
+                 tbd.exception_count AS exceptionCount,
+                 IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
+                 tbds.submit_user_id AS submitUserId,
+                 su.real_name AS submitUserName,
+                 tbds.submit_time AS submitTime
+             FROM
+                 (SELECT
+                      service_id,
+                      sop_no,
+                      crm_no,
+                      user_archives_id,
+                      MAX(role_type) AS role_type,
+                      MIN(sign_in_time) AS approach_time,
+                      MAX(sign_out_time) AS departure_time,
+                      COUNT(1) AS actual_days,
+                      SUM(IF(date_type = 'WEEKDAY', 1, 0)) AS weekdays,
+                      SUM(IF(date_type = 'WEEKEND', 1, 0)) AS weekends,
+                      SUM(IF(date_type = 'LEGAL_HOLIDAYS', 1, 0)) AS legal_holidays,
+                      ROUND(SUM(IF(sign_out_time IS NOT NULL
+                                       AND sign_in_time IS NOT NULL, TIMESTAMPDIFF(MINUTE, FROM_UNIXTIME(SUBSTRING(sign_out_time, 1, 10), '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(SUBSTRING(sign_in_time, 1, 10), '%Y-%m-%d %H:%i:%s')), 0)) / 60, 1) AS work_hours,
+                      SUM(IF((sign_in_time IS NULL
+                          OR sign_out_time IS NULL), 1, 0)) AS violation_days,
+                      SUM(IF((sign_in_time IS NULL
+                          OR sign_out_time IS NULL), 1, 0)) AS ding_exception_count,
+                      (SELECT
+                           COUNT(*)
+                       FROM
+                           t_b_ding_apply
+                       WHERE
+                           ding_id = id) AS submit_exception_count,
+                      (SELECT
+                           COUNT(*)
+                       FROM
+                           t_b_ding_apply
+                       WHERE
+                           ding_id = id AND approve IS NULL) AS exception_count
+                  FROM
+                      t_b_ding
+                  GROUP BY service_id , sop_no , crm_no , user_archives_id) tbd
+                     LEFT JOIN t_b_ding_submit tbds ON tbd.sop_no = tbds.sop_no
+                     AND tbd.user_archives_id = tbds.user_archives_id
+                     LEFT JOIN t_b_service tbs ON tbd.service_id = tbs.id AND tbs.enable
+                     LEFT JOIN t_b_crm tbc ON tbd.crm_no = tbc.crm_no
+                     LEFT JOIN sys_custom sc ON tbc.custom_id = sc.id
+                     LEFT JOIN t_b_user_archives tbua ON tbd.user_archives_id = tbua.id
+                     LEFT JOIN t_b_user_archives_supplier tbuas ON tbuas.user_archives_id = tbua.id
+                     LEFT JOIN sys_supplier ss ON tbuas.supplier_id = ss.id
+                     LEFT JOIN sys_user su ON tbds.submit_user_id = su.id
+                     LEFT JOIN sys_ding_group sdg ON sdg.service_id = tbd.service_id
+                     AND sdg.supplier_id = ss.id) main
+        <where>
+            <if test="serviceUnitId != null">
+                AND main.serviceUnitId = #{serviceUnitId}
+            </if>
+            <if test="dingSubmitStatusList != null and dingSubmitStatusList != '' and dingSubmitStatusList.size > 0">
+                AND main.submitStatus IN
+                <foreach collection="dingSubmitStatusList" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="submitUserId != null">
+                AND main.submitUserId = #{serviceUnitId}
+            </if>
+            <if test="archivesName != null and archivesName != ''">
+                AND main.archivesName LIKE CONCAT('%',#{archivesName},'%')
+            </if>
+            <if test="supplierId != null">
+                AND main.supplierId = #{supplierId}
+            </if>
+            <if test="customName != null and customName != ''">
+                AND main.customName LIKE CONCAT('%',#{customName},'%')
+            </if>
+            <if test="sopNo != null and sopNo != ''">
+                AND main.sopNo = #{sopNo}
+            </if>
+            <if test="violationHoursLimit != null">
+                AND main.violationDays > #{violationHoursLimit}
+            </if>
+            <if test="dingExceptionLimit != null">
+                AND main.dingExceptionCount > #{dingExceptionLimit}
+            </if>
+            <if test="remainLimit != null">
+                AND main.remainCount > #{remainLimit}
+            </if>
+            <if test="exceptionLimit != null">
+                AND main.exceptionCount > #{exceptionLimit}
+            </if>
+        </where>
+    </select>
+
+    <select id="findDingSubmitList" resultType="com.qmth.sop.business.bean.result.DingSubmitResult">
+        SELECT
+            *
+        FROM
+            (SELECT
+                 tbd.service_id AS serviceUnitId,
+                 tbs.name AS serviceUnitName,
+                 tbd.sop_no AS sopNo,
+                 sc.name AS customName,
+                 sc.province AS province,
+                 sc.city AS city,
+                 tbd.approach_time AS approachTime,
+                 tbd.departure_time AS departureTime,
+                 tbua.name AS archivesName,
+                 tbd.role_type AS roleType,
+                 ss.id AS supplierId,
+                 ss.name AS supplierName,
+                 tbd.actual_days AS actualDays,
+                 tbd.weekdays AS weekdays,
+                 tbd.weekends AS weekends,
+                 tbd.legal_holidays AS legalHolidays,
+                 tbd.work_hours AS workHours,
+                 tbd.violation_days AS violationDays,
+                 tbd.ding_exception_count AS dingExceptionCount,
+                 (sdg.reissue_card_count - tbd.submit_exception_count) AS remainCount,
+                 tbd.exception_count AS exceptionCount,
+                 IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
+                 tbds.submit_user_id AS submitUserId,
+                 su.real_name AS submitUserName,
+                 tbds.submit_time AS submitTime
+             FROM
+                 (SELECT
+                      service_id,
+                      sop_no,
+                      crm_no,
+                      user_archives_id,
+                      MAX(role_type) AS role_type,
+                      MIN(sign_in_time) AS approach_time,
+                      MAX(sign_out_time) AS departure_time,
+                      COUNT(1) AS actual_days,
+                      SUM(IF(date_type = 'WEEKDAY', 1, 0)) AS weekdays,
+                      SUM(IF(date_type = 'WEEKEND', 1, 0)) AS weekends,
+                      SUM(IF(date_type = 'LEGAL_HOLIDAYS', 1, 0)) AS legal_holidays,
+                      ROUND(SUM(IF(sign_out_time IS NOT NULL
+                                       AND sign_in_time IS NOT NULL, TIMESTAMPDIFF(MINUTE, FROM_UNIXTIME(SUBSTRING(sign_out_time, 1, 10), '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(SUBSTRING(sign_in_time, 1, 10), '%Y-%m-%d %H:%i:%s')), 0)) / 60, 1) AS work_hours,
+                      SUM(IF((sign_in_time IS NULL
+                          OR sign_out_time IS NULL), 1, 0)) AS violation_days,
+                      SUM(IF((sign_in_time IS NULL
+                          OR sign_out_time IS NULL), 1, 0)) AS ding_exception_count,
+                      (SELECT
+                           COUNT(*)
+                       FROM
+                           t_b_ding_apply
+                       WHERE
+                           ding_id = id) AS submit_exception_count,
+                      (SELECT
+                           COUNT(*)
+                       FROM
+                           t_b_ding_apply
+                       WHERE
+                           ding_id = id AND approve IS NULL) AS exception_count
+                  FROM
+                      t_b_ding
+                  GROUP BY service_id , sop_no , crm_no , user_archives_id) tbd
+                     LEFT JOIN t_b_ding_submit tbds ON tbd.sop_no = tbds.sop_no
+                     AND tbd.user_archives_id = tbds.user_archives_id
+                     LEFT JOIN t_b_service tbs ON tbd.service_id = tbs.id AND tbs.enable
+                     LEFT JOIN t_b_crm tbc ON tbd.crm_no = tbc.crm_no
+                     LEFT JOIN sys_custom sc ON tbc.custom_id = sc.id
+                     LEFT JOIN t_b_user_archives tbua ON tbd.user_archives_id = tbua.id
+                     LEFT JOIN t_b_user_archives_supplier tbuas ON tbuas.user_archives_id = tbua.id
+                     LEFT JOIN sys_supplier ss ON tbuas.supplier_id = ss.id
+                     LEFT JOIN sys_user su ON tbds.submit_user_id = su.id
+                     LEFT JOIN sys_ding_group sdg ON sdg.service_id = tbd.service_id
+                     AND sdg.supplier_id = ss.id) main
+        <where>
+            <if test="serviceUnitId != null">
+                AND main.serviceUnitId = #{serviceUnitId}
+            </if>
+            <if test="dingSubmitStatusList != null and dingSubmitStatusList != '' and dingSubmitStatusList.size > 0">
+                AND main.submitStatus IN
+                <foreach collection="dingSubmitStatusList" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="submitUserId != null">
+                AND main.submitUserId = #{serviceUnitId}
+            </if>
+            <if test="archivesName != null and archivesName != ''">
+                AND main.archivesName LIKE CONCAT('%',#{archivesName},'%')
+            </if>
+            <if test="supplierId != null">
+                AND main.supplierId = #{supplierId}
+            </if>
+            <if test="customName != null and customName != ''">
+                AND main.customName LIKE CONCAT('%',#{customName},'%')
+            </if>
+            <if test="sopNo != null and sopNo != ''">
+                AND main.sopNo = #{sopNo}
+            </if>
+            <if test="violationHoursLimit != null">
+                AND main.violationDays > #{violationHoursLimit}
+            </if>
+            <if test="dingExceptionLimit != null">
+                AND main.dingExceptionCount > #{dingExceptionLimit}
+            </if>
+            <if test="remainLimit != null">
+                AND main.remainCount > #{remainLimit}
+            </if>
+            <if test="exceptionLimit != null">
+                AND main.exceptionCount > #{exceptionLimit}
+            </if>
+        </where>
     </select>
 </mapper>