浏览代码

add: 考勤提交

caozixuan 1 年之前
父节点
当前提交
775acfe4ed

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

@@ -14,11 +14,6 @@ import javax.validation.constraints.NotNull;
  * @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流水号")
@@ -30,14 +25,6 @@ public class DingSubmitParam {
     @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;
     }

+ 111 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBDingStatistic.java

@@ -31,10 +31,25 @@ public class TBDingStatistic extends BaseEntity {
     @ApiModelProperty(value = "crm单号")
     private String crmNo;
 
+    @ApiModelProperty(value = "客户名称")
+    private String customName;
+
+    @ApiModelProperty(value = "省份")
+    private String province;
+
+    @ApiModelProperty(value = "城市")
+    private String city;
+
     @ApiModelProperty(value = "人员档案id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long userArchivesId;
 
+    @ApiModelProperty(value = "人员档案名称")
+    private String userArchivesName;
+
+    @ApiModelProperty(value = "人员档案编号")
+    private String userArchivesCode;
+
     @ApiModelProperty(value = "扫描开始时间")
     private Long scanStartTime;
 
@@ -50,6 +65,13 @@ public class TBDingStatistic extends BaseEntity {
     @ApiModelProperty(value = "打卡时该用户在sop的身份集合")
     private String sopRoleType;
 
+    @ApiModelProperty(value = "供应商id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long supplierId;
+
+    @ApiModelProperty(value = "供应商名称")
+    private String supplierName;
+
     @ApiModelProperty(value = "实际出勤(天)")
     private Integer actualDays;
 
@@ -68,6 +90,15 @@ public class TBDingStatistic extends BaseEntity {
     @ApiModelProperty(value = "违规天数(天)")
     private Integer violationDays;
 
+    @ApiModelProperty(value = "考勤异常数")
+    private Integer dingExceptionCount;
+
+    @ApiModelProperty(value = "剩余补卡次数")
+    private Integer remainCount;
+
+    @ApiModelProperty(value = "待处理异常数")
+    private Integer exceptionCount;
+
     public Long getServiceId() {
         return serviceId;
     }
@@ -92,6 +123,30 @@ public class TBDingStatistic extends BaseEntity {
         this.crmNo = crmNo;
     }
 
+    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 getUserArchivesId() {
         return userArchivesId;
     }
@@ -100,6 +155,22 @@ public class TBDingStatistic extends BaseEntity {
         this.userArchivesId = userArchivesId;
     }
 
+    public String getUserArchivesName() {
+        return userArchivesName;
+    }
+
+    public void setUserArchivesName(String userArchivesName) {
+        this.userArchivesName = userArchivesName;
+    }
+
+    public String getUserArchivesCode() {
+        return userArchivesCode;
+    }
+
+    public void setUserArchivesCode(String userArchivesCode) {
+        this.userArchivesCode = userArchivesCode;
+    }
+
     public Long getScanStartTime() {
         return scanStartTime;
     }
@@ -140,6 +211,22 @@ public class TBDingStatistic extends BaseEntity {
         this.sopRoleType = sopRoleType;
     }
 
+    public Long getSupplierId() {
+        return supplierId;
+    }
+
+    public void setSupplierId(Long supplierId) {
+        this.supplierId = supplierId;
+    }
+
+    public String getSupplierName() {
+        return supplierName;
+    }
+
+    public void setSupplierName(String supplierName) {
+        this.supplierName = supplierName;
+    }
+
     public Integer getActualDays() {
         return actualDays;
     }
@@ -187,4 +274,28 @@ public class TBDingStatistic extends BaseEntity {
     public void setViolationDays(Integer 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;
+    }
 }

+ 44 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBDingSubmit.java

@@ -34,6 +34,18 @@ public class TBDingSubmit extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long userArchivesId;
 
+    @ApiModelProperty(value = "扫描开始时间")
+    private Long scanStartTime;
+
+    @ApiModelProperty(value = "扫描结束时间")
+    private Long scanEndTime;
+
+    @ApiModelProperty(value = "阅卷开始时间")
+    private Long markPaperStartTime;
+
+    @ApiModelProperty(value = "阅卷开始时间")
+    private Long markPaperEndTime;
+
     @ApiModelProperty(value = "进场时间")
     private Long approachTime;
 
@@ -103,6 +115,38 @@ public class TBDingSubmit extends BaseEntity implements Serializable {
         this.userArchivesId = userArchivesId;
     }
 
+    public Long getScanStartTime() {
+        return scanStartTime;
+    }
+
+    public void setScanStartTime(Long scanStartTime) {
+        this.scanStartTime = scanStartTime;
+    }
+
+    public Long getScanEndTime() {
+        return scanEndTime;
+    }
+
+    public void setScanEndTime(Long scanEndTime) {
+        this.scanEndTime = scanEndTime;
+    }
+
+    public Long getMarkPaperStartTime() {
+        return markPaperStartTime;
+    }
+
+    public void setMarkPaperStartTime(Long markPaperStartTime) {
+        this.markPaperStartTime = markPaperStartTime;
+    }
+
+    public Long getMarkPaperEndTime() {
+        return markPaperEndTime;
+    }
+
+    public void setMarkPaperEndTime(Long markPaperEndTime) {
+        this.markPaperEndTime = markPaperEndTime;
+    }
+
     public Long getApproachTime() {
         return approachTime;
     }

+ 1 - 1
sop-business/src/main/java/com/qmth/sop/business/service/TBCrmService.java

@@ -128,7 +128,7 @@ public interface TBCrmService extends IService<TBCrm> {
      *
      * @param sopNo       sopNo
      * @param crmDetailId 派单详情id
-     * @param crmNo       派单编号(如果传派单号不查询人员配置信息)
+     * @param crmNo       派单编号(如果传派单号不查询人员配置信息)
      * @return 项目派单信息
      */
     CrmProjectResult findCrmProjectInfo(String sopNo, Long crmDetailId, String crmNo);

+ 19 - 1
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingStatisticServiceImpl.java

@@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.sop.business.bean.dto.UserDto;
+import com.qmth.sop.business.bean.result.CrmProjectResult;
+import com.qmth.sop.business.bean.result.UserArchivesResult;
 import com.qmth.sop.business.entity.TBCrm;
 import com.qmth.sop.business.entity.TBCrmDetail;
 import com.qmth.sop.business.entity.TBDing;
@@ -56,6 +58,9 @@ public class TBDingStatisticServiceImpl extends ServiceImpl<TBDingStatisticMappe
     @Resource
     private SysUserRoleService sysUserRoleService;
 
+    @Resource
+    private TBUserArchivesService tbUserArchivesService;
+
     @Override
     public TBDingStatistic findBySopNoAndUserArchivesId(String sopNo, Long userArchivesId) {
         return this.getOne(new QueryWrapper<TBDingStatistic>().lambda().eq(TBDingStatistic::getSopNo, sopNo).eq(TBDingStatistic::getUserArchivesId, userArchivesId).last(SystemConstant.LIMIT1));
@@ -132,7 +137,7 @@ public class TBDingStatisticServiceImpl extends ServiceImpl<TBDingStatisticMappe
             log.error(String.format("crmNo[%s]未找到派单信息", crmNo));
             throw ExceptionResultEnum.ERROR.exception("未找到派单信息");
         }
-
+        CrmProjectResult crmProjectResult = tbCrmService.findCrmProjectInfo(null, null, crmNo);
         Long serviceUnitId = tbCrm.getServiceId();
 
         Long scanStartTime = tbCrmDetail.getScanStartTime();
@@ -144,6 +149,11 @@ public class TBDingStatisticServiceImpl extends ServiceImpl<TBDingStatisticMappe
         List<Long> userArchivesIdList = datasource.stream().filter(e -> Objects.equals(sopNo, e.getSopNo())).map(TBDing::getUserArchivesId).distinct().collect(Collectors.toList());
 
         for (Long userArchivesId : userArchivesIdList) {
+            UserArchivesResult tbUserArchives = tbUserArchivesService.findUserArchivesByArchivesIdORUserId(
+                    userArchivesId, null);
+            if (Objects.isNull(tbUserArchives)) {
+                throw ExceptionResultEnum.ERROR.exception("人员档案不存在");
+            }
             // 打卡数据集合
             List<TBDing> dingList = datasource.stream()
                     .filter(e -> Objects.equals(sopNo, e.getSopNo()) && Objects.equals(userArchivesId, e.getUserArchivesId())).collect(Collectors.toList());
@@ -203,18 +213,26 @@ public class TBDingStatisticServiceImpl extends ServiceImpl<TBDingStatisticMappe
             tbDingStatistic.setServiceId(serviceUnitId);
             tbDingStatistic.setSopNo(sopNo);
             tbDingStatistic.setCrmNo(crmNo);
+            tbDingStatistic.setCustomName(crmProjectResult.getCustomName());
+            tbDingStatistic.setProvince(crmProjectResult.getCustomProvince());
+            tbDingStatistic.setCity(crmProjectResult.getCustomCity());
             tbDingStatistic.setUserArchivesId(userArchivesId);
+            tbDingStatistic.setUserArchivesName(tbUserArchives.getName());
+            tbDingStatistic.setUserArchivesCode(tbUserArchives.getCode());
             tbDingStatistic.setScanStartTime(scanStartTime);
             tbDingStatistic.setScanEndTime(scanEndTime);
             tbDingStatistic.setMarkPaperStartTime(markPaperStartTime);
             tbDingStatistic.setMarkPaperEndTime(markPaperEndTime);
             tbDingStatistic.setSopRoleType(sopRoleType);
+            tbDingStatistic.setSupplierId(tbUserArchives.getSupplierId());
+            tbDingStatistic.setSupplierName(tbUserArchives.getSupplierName());
             tbDingStatistic.setActualDays(actualDays);
             tbDingStatistic.setWeekdays(weekDays);
             tbDingStatistic.setWeekends(weekends);
             tbDingStatistic.setLegalHolidays(legalHolidays);
             tbDingStatistic.setWorkHours(workHours);
             tbDingStatistic.setViolationDays(violationDays);
+            // TODO: 2024/5/24 差考勤异常数、剩余补卡数、待处理异常数的统计 -czx
             tbDingStatisticList.add(tbDingStatistic);
         }
         this.saveOrUpdateBatch(tbDingStatisticList);

+ 88 - 151
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingSubmitServiceImpl.java

@@ -14,6 +14,7 @@ import com.qmth.sop.business.mapper.TBDingSubmitMapper;
 import com.qmth.sop.business.service.SysUserService;
 import com.qmth.sop.business.service.TBDingSubmitService;
 import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.DingSubmitOperateEnum;
 import com.qmth.sop.common.enums.DingSubmitStatusEnum;
 import com.qmth.sop.common.enums.ExceptionResultEnum;
 import com.qmth.sop.common.enums.RoleTypeEnum;
@@ -123,167 +124,19 @@ public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBD
     @Transactional
     @Override
     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.getSubmitId();
-            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);
+        dingSubmitParamList.forEach(e -> this.dingSubmitOperate(e, DingSubmitOperateEnum.SUBMIT));
     }
 
     @Transactional
     @Override
     public void applyWithdraw(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.ALREADY_SUBMIT.equals(submitStatus)) {
-            throw ExceptionResultEnum.ERROR.exception(
-                    String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤的提交状态为[%s],不能申请撤回", serviceUnitName, sopNo,
-                            userArchivesName, submitStatus.getSubmitDesc()));
-        }
-
-        Long submitId = dingSubmitResult.getSubmitId();
-        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);
+        this.dingSubmitOperate(dingSubmitParam, DingSubmitOperateEnum.WITHDRAW);
     }
 
     @Transactional
     @Override
     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.getSubmitId();
-        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);
+        this.dingSubmitOperate(dingSubmitParam, DingSubmitOperateEnum.CANCEL_WITHDRAW);
     }
 
     @Transactional
@@ -360,4 +213,88 @@ public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBD
             return Stream.of(dto);
         }).collect(Collectors.toList());
     }
+
+    private void dingSubmitOperate(DingSubmitParam dingSubmitParam, DingSubmitOperateEnum dingSubmitOperateType) {
+        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+        String sopNo = dingSubmitParam.getSopNo();
+        Long userArchivesId = dingSubmitParam.getUserArchivesId();
+        List<DingSubmitResult> dingSubmitResultList = this.baseMapper.findDingSubmitList(null, null, null,
+                userArchivesId, null, null, null, sopNo, null, null, null, null);
+
+        if (dingSubmitResultList.size() != 1) {
+            throw ExceptionResultEnum.ERROR.exception(
+                    String.format("未找到sop流水号为[%s],用户档案号为[%s]的考勤信息", sopNo, userArchivesId));
+        }
+        DingSubmitResult dingSubmitResult = dingSubmitResultList.get(0);
+        String serviceUnitName = dingSubmitResult.getServiceUnitName();
+        String userArchivesName = dingSubmitResult.getArchivesName();
+        DingSubmitStatusEnum submitStatus = dingSubmitResult.getSubmitStatus();
+        TBDingSubmit tbDingSubmit = new TBDingSubmit();
+        tbDingSubmit.setServiceId(dingSubmitResult.getServiceUnitId());
+        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);
+
+        switch (dingSubmitOperateType) {
+        case SUBMIT:
+            // 条件1 - 提交必须是待提交状态
+            List<DingSubmitStatusEnum> dingSubmitStatusEnumList = new ArrayList<>();
+            dingSubmitStatusEnumList.add(DingSubmitStatusEnum.WILL_SUBMIT);
+            dingSubmitStatusEnumList.add(DingSubmitStatusEnum.AGREE_WITHDRAW);
+            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.getSubmitId();
+            if (submitId != null && submitId > 0) {
+                tbDingSubmit.setId(submitId);
+            }
+            tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.ALREADY_SUBMIT);
+            break;
+        case WITHDRAW:
+            if (!DingSubmitStatusEnum.ALREADY_SUBMIT.equals(submitStatus)) {
+                throw ExceptionResultEnum.ERROR.exception(
+                        String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤的提交状态为[%s],不能申请撤回", serviceUnitName, sopNo,
+                                userArchivesName, submitStatus.getSubmitDesc()));
+            }
+            if (dingSubmitResult.getSubmitId() == null || dingSubmitResult.getSubmitId() == 0) {
+                throw ExceptionResultEnum.ERROR.exception(
+                        String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤数据异常", serviceUnitName, sopNo, userArchivesName));
+            }
+            tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.APPLY_WITHDRAW);
+            break;
+        case CANCEL_WITHDRAW:
+            if (!DingSubmitStatusEnum.APPLY_WITHDRAW.equals(submitStatus)) {
+                throw ExceptionResultEnum.ERROR.exception(
+                        String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤的提交状态为[%s],不能申请取消撤回", serviceUnitName, sopNo,
+                                userArchivesName, submitStatus.getSubmitDesc()));
+            }
+            if (dingSubmitResult.getSubmitId() == null || dingSubmitResult.getSubmitId() == 0) {
+                throw ExceptionResultEnum.ERROR.exception(
+                        String.format("服务单元为[%s],sop流水号为[%s],用户档案为[%s]的考勤数据异常", serviceUnitName, sopNo, userArchivesName));
+            }
+            tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.ALREADY_SUBMIT);
+        }
+        this.saveOrUpdate(tbDingSubmit);
+    }
 }

+ 18 - 0
sop-business/src/main/resources/db/log/caozixuan_update_log.sql

@@ -146,3 +146,21 @@ ALTER TABLE t_b_ding_statistic
     DROP COLUMN submit_time,
     DROP COLUMN submit_user_id;
 
+ALTER TABLE t_b_ding_submit
+    ADD COLUMN scan_start_time BIGINT NULL COMMENT '扫描开始时间' AFTER user_archives_id,
+    ADD COLUMN scan_end_time BIGINT NULL COMMENT '扫描结束时间' AFTER scan_start_time,
+    ADD COLUMN mark_paper_start_time BIGINT NULL COMMENT '阅卷开始时间' AFTER scan_end_time,
+    ADD COLUMN mark_paper_end_time BIGINT NULL COMMENT '阅卷结束时间' AFTER mark_paper_start_time;
+
+ALTER TABLE t_b_ding_statistic
+    ADD COLUMN ding_exception_count BIGINT NULL COMMENT '考勤异常数' AFTER violation_days,
+    ADD COLUMN remain_count BIGINT NULL COMMENT '剩余补卡次数' AFTER ding_exception_count,
+    ADD COLUMN exception_count BIGINT NULL COMMENT '待处理异常数' AFTER remain_count,
+    ADD COLUMN custom_name VARCHAR(100) NULL COMMENT '客户名称' AFTER crm_no,
+    ADD COLUMN province VARCHAR(100) NULL COMMENT '省份' AFTER custom_name,
+    ADD COLUMN city VARCHAR(100) NULL COMMENT '城市' AFTER province,
+    ADD COLUMN user_archives_name VARCHAR(100) NULL COMMENT '档案名' AFTER user_archives_id,
+    ADD COLUMN user_archives_code VARCHAR(100) NULL COMMENT '档案编号' AFTER user_archives_name,
+    ADD COLUMN supplier_name VARCHAR(100) NULL COMMENT '供应商名称' AFTER sop_role_type,
+    ADD COLUMN supplier_id BIGINT NULL COMMENT '供应商id' AFTER sop_role_type;
+

+ 110 - 217
sop-business/src/main/resources/mapper/TBDingSubmitMapper.xml

@@ -4,302 +4,195 @@
 
     <select id="findDingSubmitPage" resultType="com.qmth.sop.business.bean.result.DingSubmitResult">
         SELECT
-            *
+            sta.service_id AS serviceUnitId,
+            tbs.name AS serviceUnitName,
+            sta.sop_no AS sopNo,
+            sta.crm_no AS crmNo,
+            sta.custom_name AS customName,
+            sta.province AS province,
+            sta.city AS city,
+            sta.user_archives_code AS archivesCode,
+            sta.user_archives_name AS archivesName,
+            CONCAT(sta.user_archives_name,
+                   '(',
+                   sta.user_archives_code,
+                   ')') AS archivesInfo,
+            sta.scan_start_time AS scanStartTime,
+            sta.scan_end_time AS scanEndTime,
+            sta.mark_paper_start_time AS markPaperStartTime,
+            sta.mark_paper_end_time AS markPaperEndTime,
+            sta.sop_role_type AS roleType,
+            sta.supplier_name AS supplierName,
+            sta.actual_days AS actualDays,
+            sta.weekdays AS weekdays,
+            sta.weekends AS weekends,
+            sta.legal_holidays AS legalHolidays,
+            sta.violation_days AS violationDays,
+            sta.ding_exception_count AS dingExceptionCount,
+            sta.remain_count AS remainCount,
+            sta.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
-                 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,
-                 tbd.user_id AS userId,
-                 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,
-                 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,
-                 IFNULL(ec.cnt,0) 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,
-                 tbds.submit_time AS submitTime,
-                 tbs.service_lead_id AS serviceUnitLeaderId,
-                 tbc.lead_id AS regionManagerId,
-                 tbc.region_coordinator_id AS coordinatorId,
-                 tbs.update_time AS serviceUpdateTime,
-                 tbs.status AS serviceStatus,
-                 tbc.update_time AS crmUpdateTime,
-                 tbd.sign_in_exception_count + tbd.sign_out_exception_count AS dingExceptionCount
-             FROM
-                 (SELECT
-                      service_id,
-                      sop_no,
-                      crm_no,
-                      user_archives_id,
-                      MAX(user_id) AS user_id,
-                      MAX(role_type) AS role_type,
-                      MIN(sign_in_time) AS approach_time,
-                      MAX(sign_out_time) AS departure_time,
-                      SUM(IF((sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 1, 0)) AS actual_days,
-                      SUM(IF(date_type = 'WEEKDAY' AND (sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 1, 0)) AS weekdays,
-                      SUM(IF(date_type = 'WEEKEND' AND (sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 1, 0)) AS weekends,
-                      SUM(IF(date_type = 'LEGAL_HOLIDAYS' AND (sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 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_in_time, 1, 10), '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(SUBSTRING(sign_out_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) AND (sign_in_time IS NOT NULL OR sign_out_time IS NOT NULL), 1, 0)) AS violation_days,
-                      SUM(IF(sign_in_time IS NULL, 1, 0)) AS sign_in_exception_count,
-                      SUM(IF(sign_out_time IS NULL, 1, 0)) AS sign_out_exception_count
-                  FROM
-                      t_b_ding
-                  GROUP BY service_id , sop_no , crm_no , user_archives_id) tbd
-                     LEFT JOIN (SELECT
-                                    COUNT(*) AS cnt, sop_no, crm_no, create_id
-                                FROM
-                                    t_b_ding_apply
-                                GROUP BY sop_no , crm_no , create_id) sec ON sec.sop_no = tbd.sop_no
-                     AND sec.crm_no = tbd.crm_no
-                     AND sec.create_id = tbd.user_id
-                     LEFT JOIN (SELECT
-                                    COUNT(*) AS cnt, sop_no, crm_no, create_id
-                                FROM
-                                    t_b_ding_apply
-                                WHERE approve IS NULL
-                                GROUP BY sop_no , crm_no , create_id) ec ON ec.sop_no = tbd.sop_no
-                     AND ec.crm_no = tbd.crm_no
-                     AND ec.create_id = tbd.user_id
-                     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 t_f_custom_flow_entity tfcfe ON tfcfe.code = tbd.sop_no
-                     LEFT JOIN t_f_flow_approve tffa ON tffa.flow_id = tfcfe.flow_id
-                     ) main
+            t_b_ding_statistic sta
+                LEFT JOIN
+            t_b_service tbs ON sta.service_id = tbs.id
+                LEFT JOIN
+            t_b_crm tbc ON sta.crm_no = tbc.crm_no
+                LEFT JOIN
+            t_b_ding_submit tbds ON sta.sop_no = tbds.sop_no
+                AND sta.user_archives_id = tbds.user_archives_id
+                LEFT JOIN
+            sys_user su ON tbds.submit_user_id = su.id
         <where>
-            AND main.serviceStatus = 'PUBLISH'
+            AND tbs.status = 'PUBLISH'
             <if test="serviceUnitId != null">
-                AND main.serviceUnitId = #{serviceUnitId}
+                AND sta.service_id = #{serviceUnitId}
             </if>
             <if test="dingSubmitStatusList != null and dingSubmitStatusList != '' and dingSubmitStatusList.size > 0">
-                AND main.submitStatus IN
+                AND IFNULL(tbds.submit_status, 'WILL_SUBMIT') IN
                 <foreach collection="dingSubmitStatusList" item="item" index="index" open="(" separator="," close=")">
                     #{item}
                 </foreach>
             </if>
             <if test="submitUserId != null">
-                AND main.submitUserId = #{serviceUnitId}
+                AND tbds.submit_user_id = #{serviceUnitId}
             </if>
             <if test="archivesName != null and archivesName != ''">
-                AND main.archivesName LIKE CONCAT('%',#{archivesName},'%')
+                AND sta.user_archives_name LIKE CONCAT('%',#{archivesName},'%')
             </if>
             <if test="supplierId != null">
-                AND main.supplierId = #{supplierId}
+                AND sta.supplier_id = #{supplierId}
             </if>
             <if test="customName != null and customName != ''">
-                AND main.customName LIKE CONCAT('%',#{customName},'%')
+                AND sta.custom_name LIKE CONCAT('%',#{customName},'%')
             </if>
             <if test="sopNo != null and sopNo != ''">
-                AND main.sopNo = #{sopNo}
+                AND sta.sop_no = #{sopNo}
             </if>
             <if test="violationHoursLimit != null">
-                AND main.violationDays > #{violationHoursLimit}
+                AND sta.violation_days > #{violationHoursLimit}
             </if>
             <if test="dingExceptionLimit != null">
-                AND main.dingExceptionCount > #{dingExceptionLimit}
+                AND sta.ding_exception_count > #{dingExceptionLimit}
             </if>
             <if test="exceptionLimit != null">
-                AND main.exceptionCount > #{exceptionLimit}
+                AND sta.exception_count > #{exceptionLimit}
             </if>
             <if test="dpr != null and !dpr.hasAdmin and !dpr.hasPmo">
                 <choose>
                     <when test="dpr.hasBusiness">
-                        AND main.serviceUnitLeaderId = #{dpr.requestUserId}
+                        AND tbs.service_lead_id = #{dpr.requestUserId}
                     </when>
                     <otherwise>
                         <choose>
                             <when test="dpr.hasRegionManager">
-                                AND main.regionManagerId = #{dpr.requestUserId}
+                                AND tbc.lead_id = #{dpr.requestUserId}
                             </when>
-                            <otherwise>
-                                <choose>
-                                    <when test="dpr.hasRegionCoordinator">
-                                        AND main.coordinatorId = #{dpr.requestUserId}
-                                    </when>
-                                </choose>
-                            </otherwise>
                         </choose>
                     </otherwise>
                 </choose>
             </if>
         </where>
-        ORDER BY main.serviceUpdateTime DESC,main.crmUpdateTime DESC
+        ORDER BY tbs.update_time DESC,tbc.update_time DESC
     </select>
 
     <select id="findDingSubmitList" resultType="com.qmth.sop.business.bean.result.DingSubmitResult">
         SELECT
-            *
+            sta.service_id AS serviceUnitId,
+            tbs.name AS serviceUnitName,
+            sta.sop_no AS sopNo,
+            sta.crm_no AS crmNo,
+            sta.custom_name AS customName,
+            sta.province AS province,
+            sta.city AS city,
+            sta.user_archives_code AS archivesCode,
+            sta.user_archives_name AS archivesName,
+            CONCAT(sta.user_archives_name,
+                   '(',
+                   sta.user_archives_code,
+                   ')') AS archivesInfo,
+            sta.scan_start_time AS scanStartTime,
+            sta.scan_end_time AS scanEndTime,
+            sta.mark_paper_start_time AS markPaperStartTime,
+            sta.mark_paper_end_time AS markPaperEndTime,
+            sta.sop_role_type AS roleType,
+            sta.supplier_name AS supplierName,
+            sta.actual_days AS actualDays,
+            sta.weekdays AS weekdays,
+            sta.weekends AS weekends,
+            sta.legal_holidays AS legalHolidays,
+            sta.violation_days AS violationDays,
+            sta.ding_exception_count AS dingExceptionCount,
+            sta.remain_count AS remainCount,
+            sta.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
-                 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,
-                 tbd.user_id AS userId,
-                 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,
-                 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,
-                 IFNULL(ec.cnt,0) 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,
-                 tbds.submit_time AS submitTime,
-                 tbs.service_lead_id AS serviceUnitLeaderId,
-                 tbc.lead_id AS regionManagerId,
-                 tbc.region_coordinator_id AS coordinatorId,
-                 tbs.update_time AS serviceUpdateTime,
-                 tbs.status AS serviceStatus,
-                 tbc.update_time AS crmUpdateTime,
-                 tbd.sign_in_exception_count + tbd.sign_out_exception_count AS dingExceptionCount
-             FROM
-                 (SELECT
-                      service_id,
-                      sop_no,
-                      crm_no,
-                      user_archives_id,
-                      MAX(user_id) AS user_id,
-                      MAX(role_type) AS role_type,
-                      MIN(sign_in_time) AS approach_time,
-                      MAX(sign_out_time) AS departure_time,
-                      SUM(IF((sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 1, 0)) AS actual_days,
-                      SUM(IF(date_type = 'WEEKDAY' AND (sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 1, 0)) AS weekdays,
-                      SUM(IF(date_type = 'WEEKEND' AND (sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 1, 0)) AS weekends,
-                      SUM(IF(date_type = 'LEGAL_HOLIDAYS' AND (sign_in_time IS NOT NULL AND sign_out_time IS NOT NULL), 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_in_time, 1, 10), '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(SUBSTRING(sign_out_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) AND (sign_in_time IS NOT NULL OR sign_out_time IS NOT NULL), 1, 0)) AS violation_days,
-                      SUM(IF(sign_in_time IS NULL, 1, 0)) AS sign_in_exception_count,
-                      SUM(IF(sign_out_time IS NULL, 1, 0)) AS sign_out_exception_count
-                  FROM
-                      t_b_ding
-                  GROUP BY service_id , sop_no , crm_no , user_archives_id) tbd
-                     LEFT JOIN (SELECT
-                                    COUNT(*) AS cnt, sop_no, crm_no, create_id
-                                FROM
-                                    t_b_ding_apply
-                                GROUP BY sop_no , crm_no , create_id) sec ON sec.sop_no = tbd.sop_no
-                     AND sec.crm_no = tbd.crm_no
-                     AND sec.create_id = tbd.user_id
-                     LEFT JOIN (SELECT
-                                    COUNT(*) AS cnt, sop_no, crm_no, create_id
-                                FROM
-                                    t_b_ding_apply
-                                WHERE approve IS NULL
-                                GROUP BY sop_no , crm_no , create_id) ec ON ec.sop_no = tbd.sop_no
-                     AND ec.crm_no = tbd.crm_no
-                     AND ec.create_id = tbd.user_id
-                     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 t_f_custom_flow_entity tfcfe ON tfcfe.code = tbd.sop_no
-                     LEFT JOIN t_f_flow_approve tffa ON tffa.flow_id = tfcfe.flow_id
-                ) main
+            t_b_ding_statistic sta
+                LEFT JOIN
+            t_b_service tbs ON sta.service_id = tbs.id
+                LEFT JOIN
+            t_b_crm tbc ON sta.crm_no = tbc.crm_no
+                LEFT JOIN
+            t_b_ding_submit tbds ON sta.sop_no = tbds.sop_no
+                AND sta.user_archives_id = tbds.user_archives_id
+                LEFT JOIN
+            sys_user su ON tbds.submit_user_id = su.id
         <where>
-            AND main.serviceStatus = 'PUBLISH'
+            AND tbs.status = 'PUBLISH'
             <if test="serviceUnitId != null">
-                AND main.serviceUnitId = #{serviceUnitId}
+                AND sta.service_id = #{serviceUnitId}
             </if>
             <if test="dingSubmitStatusList != null and dingSubmitStatusList != '' and dingSubmitStatusList.size > 0">
-                AND main.submitStatus IN
+                AND IFNULL(tbds.submit_status, 'WILL_SUBMIT') 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="archivesId != null">
-                AND main.archivesId = #{archivesId}
+                AND tbds.submit_user_id = #{serviceUnitId}
             </if>
             <if test="archivesName != null and archivesName != ''">
-                AND main.archivesName LIKE CONCAT('%',#{archivesName},'%')
+                AND sta.user_archives_name LIKE CONCAT('%',#{archivesName},'%')
             </if>
             <if test="supplierId != null">
-                AND main.supplierId = #{supplierId}
+                AND sta.supplier_id = #{supplierId}
             </if>
             <if test="customName != null and customName != ''">
-                AND main.customName LIKE CONCAT('%',#{customName},'%')
+                AND sta.custom_name LIKE CONCAT('%',#{customName},'%')
             </if>
             <if test="sopNo != null and sopNo != ''">
-                AND main.sopNo = #{sopNo}
+                AND sta.sop_no = #{sopNo}
             </if>
             <if test="violationHoursLimit != null">
-                AND main.violationDays > #{violationHoursLimit}
+                AND sta.violation_days > #{violationHoursLimit}
             </if>
             <if test="dingExceptionLimit != null">
-                AND main.dingExceptionCount > #{dingExceptionLimit}
+                AND sta.ding_exception_count > #{dingExceptionLimit}
             </if>
             <if test="exceptionLimit != null">
-                AND main.exceptionCount > #{exceptionLimit}
+                AND sta.exception_count > #{exceptionLimit}
             </if>
             <if test="dpr != null and !dpr.hasAdmin and !dpr.hasPmo">
                 <choose>
                     <when test="dpr.hasBusiness">
-                        AND main.serviceUnitLeaderId = #{dpr.requestUserId}
+                        AND tbs.service_lead_id = #{dpr.requestUserId}
                     </when>
                     <otherwise>
                         <choose>
                             <when test="dpr.hasRegionManager">
-                                AND main.regionManagerId = #{dpr.requestUserId}
+                                AND tbc.lead_id = #{dpr.requestUserId}
                             </when>
-                            <otherwise>
-                                <choose>
-                                    <when test="dpr.hasRegionCoordinator">
-                                        AND main.coordinatorId = #{dpr.requestUserId}
-                                    </when>
-                                </choose>
-                            </otherwise>
                         </choose>
                     </otherwise>
                 </choose>
             </if>
         </where>
-        ORDER BY main.serviceUpdateTime DESC,main.crmUpdateTime DESC
+        ORDER BY tbs.update_time DESC,tbc.update_time DESC
     </select>
 </mapper>

+ 21 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/DingSubmitOperateEnum.java

@@ -0,0 +1,21 @@
+package com.qmth.sop.common.enums;
+
+/**
+ * @Description: 考勤提交操作枚举
+ * @Author: CaoZixuan
+ * @Date: 2024-05-24
+ */
+public enum DingSubmitOperateEnum {
+    SUBMIT("考勤提交"), WITHDRAW("申请撤回"), CANCEL_WITHDRAW("取消撤回申请")
+    ;
+
+    private final String operate;
+
+    DingSubmitOperateEnum(String operate) {
+        this.operate = operate;
+    }
+
+    public String getOperate() {
+        return operate;
+    }
+}