caozixuan пре 1 година
родитељ
комит
2ca511e9f5

+ 34 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/dto/DateFormDto.java

@@ -0,0 +1,34 @@
+package com.qmth.sop.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description: 日期表单对象
+ * @Author: CaoZixuan
+ * @Date: 2023-09-04
+ */
+public class DateFormDto {
+    @ApiModelProperty("sop已经结束?")
+    private Boolean sopIsEnd;
+
+    @ApiModelProperty("日期表单")
+    private List<String> dateFormList;
+
+    public Boolean getSopIsEnd() {
+        return sopIsEnd;
+    }
+
+    public void setSopIsEnd(Boolean sopIsEnd) {
+        this.sopIsEnd = sopIsEnd;
+    }
+
+    public List<String> getDateFormList() {
+        return dateFormList;
+    }
+
+    public void setDateFormList(List<String> dateFormList) {
+        this.dateFormList = dateFormList;
+    }
+}

+ 121 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/DingElementResult.java

@@ -0,0 +1,121 @@
+package com.qmth.sop.business.bean.result;
+
+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-09-01
+ */
+public class DingElementResult {
+    // 用户档案信息
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty("用户档案id")
+    private Long userArchivesId;
+    @ApiModelProperty("用户档案名")
+    private String userArchivesName;
+    @ApiModelProperty("档案照片")
+    private String basePhotoPath;
+
+    // 签到信息
+    @ApiModelProperty("签到时间")
+    private Long signInTime;
+    @ApiModelProperty("签到地址")
+    private String signInAddress;
+    @ApiModelProperty("签到时间段")
+    private String signInTimeScope;
+
+    // 签退信息
+    @ApiModelProperty("签退时间")
+    private Long signOutTime;
+    @ApiModelProperty("签退地址")
+    private String signOutAddress;
+    @ApiModelProperty("签退时间段")
+    private String signOutTimeScope;
+
+    // 实际打卡的sop
+    @ApiModelProperty("实际打卡的sop")
+    private String dingSopNo;
+
+    public Long getUserArchivesId() {
+        return userArchivesId;
+    }
+
+    public void setUserArchivesId(Long userArchivesId) {
+        this.userArchivesId = userArchivesId;
+    }
+
+    public String getUserArchivesName() {
+        return userArchivesName;
+    }
+
+    public void setUserArchivesName(String userArchivesName) {
+        this.userArchivesName = userArchivesName;
+    }
+
+    public String getBasePhotoPath() {
+        return basePhotoPath;
+    }
+
+    public void setBasePhotoPath(String basePhotoPath) {
+        this.basePhotoPath = basePhotoPath;
+    }
+
+    public Long getSignInTime() {
+        return signInTime;
+    }
+
+    public void setSignInTime(Long signInTime) {
+        this.signInTime = signInTime;
+    }
+
+    public String getSignInAddress() {
+        return signInAddress;
+    }
+
+    public void setSignInAddress(String signInAddress) {
+        this.signInAddress = signInAddress;
+    }
+
+    public String getSignInTimeScope() {
+        return signInTimeScope;
+    }
+
+    public void setSignInTimeScope(String signInTimeScope) {
+        this.signInTimeScope = signInTimeScope;
+    }
+
+    public Long getSignOutTime() {
+        return signOutTime;
+    }
+
+    public void setSignOutTime(Long signOutTime) {
+        this.signOutTime = signOutTime;
+    }
+
+    public String getSignOutAddress() {
+        return signOutAddress;
+    }
+
+    public void setSignOutAddress(String signOutAddress) {
+        this.signOutAddress = signOutAddress;
+    }
+
+    public String getSignOutTimeScope() {
+        return signOutTimeScope;
+    }
+
+    public void setSignOutTimeScope(String signOutTimeScope) {
+        this.signOutTimeScope = signOutTimeScope;
+    }
+
+    public String getDingSopNo() {
+        return dingSopNo;
+    }
+
+    public void setDingSopNo(String dingSopNo) {
+        this.dingSopNo = dingSopNo;
+    }
+}

+ 5 - 4
sop-business/src/main/java/com/qmth/sop/business/bean/result/DingInfoResult.java

@@ -1,5 +1,6 @@
 package com.qmth.sop.business.bean.result;
 
+import com.qmth.sop.common.enums.DingStatusEnum;
 import com.qmth.sop.common.enums.InOutTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -9,8 +10,8 @@ import io.swagger.annotations.ApiModelProperty;
  * @Date: 2023-08-29
  */
 public class DingInfoResult {
-    @ApiModelProperty("签到状态(1-正常签到,0-未签到)")
-    private Boolean status;
+    @ApiModelProperty("签到状态")
+    private DingStatusEnum status;
 
     @ApiModelProperty("签到/签退")
     private InOutTypeEnum inOutType;
@@ -27,11 +28,11 @@ public class DingInfoResult {
     @ApiModelProperty("y坐标")
     private String axisY;
 
-    public Boolean getStatus() {
+    public DingStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(Boolean status) {
+    public void setStatus(DingStatusEnum status) {
         this.status = status;
     }
 

+ 11 - 0
sop-business/src/main/java/com/qmth/sop/business/entity/TBDing.java

@@ -26,6 +26,9 @@ public class TBDing extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "sop单号")
     private String sopNo;
 
+    @ApiModelProperty(value = "sop单号(实际打卡)")
+    private String dingSopNo;
+
     @ApiModelProperty(value = "crm单号")
     private String crmNo;
 
@@ -96,6 +99,14 @@ public class TBDing extends BaseEntity implements Serializable {
         this.sopNo = sopNo;
     }
 
+    public String getDingSopNo() {
+        return dingSopNo;
+    }
+
+    public void setDingSopNo(String dingSopNo) {
+        this.dingSopNo = dingSopNo;
+    }
+
     public String getCrmNo() {
         return crmNo;
     }

+ 21 - 7
sop-business/src/main/java/com/qmth/sop/business/mapper/TBDingMapper.java

@@ -2,11 +2,9 @@ package com.qmth.sop.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.qmth.sop.business.bean.result.TBDingAttendanceCountResult;
-import com.qmth.sop.business.bean.result.TBDingAttendanceResult;
-import com.qmth.sop.business.bean.result.TBDingCountQueryResult;
-import com.qmth.sop.business.bean.result.TBDingCountResult;
+import com.qmth.sop.business.bean.result.*;
 import com.qmth.sop.business.entity.TBDing;
+import com.qmth.sop.business.entity.TFFlowApprove;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -36,9 +34,25 @@ public interface TBDingMapper extends BaseMapper<TBDing> {
 
     TBDingCountResult count(@Param("serviceId") Long serviceId, @Param("createId") Long createId, @Param("userName") String userName, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo);
 
-    IPage<TBDingAttendanceResult> attendanceQuery(IPage<Map> iPage, @Param("serviceId") Long serviceId , @Param("userName") String userName, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("type") String type, @Param("status") String status);
+    IPage<TBDingAttendanceResult> attendanceQuery(IPage<Map> iPage, @Param("serviceId") Long serviceId, @Param("userName") String userName, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("type") String type, @Param("status") String status);
 
-    TBDingAttendanceCountResult attendanceCount(@Param("serviceId") Long serviceId , @Param("userName") String userName , @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo);
+    TBDingAttendanceCountResult attendanceCount(@Param("serviceId") Long serviceId, @Param("userName") String userName, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo);
 
-    List<TBDingAttendanceResult> attendanceQuery(@Param("serviceId") Long serviceId , @Param("userName") String userName, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("type") String type, @Param("status") String status);
+    List<TBDingAttendanceResult> attendanceQuery(@Param("serviceId") Long serviceId, @Param("userName") String userName, @Param("startTime") Long startTime, @Param("endTime") Long endTime, @Param("supplierId") Long supplierId, @Param("custom") String custom, @Param("sopNo") String sopNo, @Param("type") String type, @Param("status") String status);
+
+    /**
+     * 根据用户id查询打卡信息
+     *
+     * @param userId 用户id
+     * @return 打卡信息
+     */
+    DingElementResult findDingResultByUserId(@Param("userId") Long userId);
+
+    /**
+     * 根据sopNo查询sop的状态和日期
+     *
+     * @param sopNo sopNo
+     * @return 状态 开始时间 更新时间
+     */
+    List<TFFlowApprove> findDateAndStatusBySopNo(@Param("sopNo") String sopNo);
 }

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

@@ -2,6 +2,7 @@ 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.DateFormDto;
 import com.qmth.sop.business.bean.result.*;
 import com.qmth.sop.business.entity.TBDing;
 import com.qmth.sop.common.enums.DingResultEnum;
@@ -21,7 +22,15 @@ import java.util.Map;
  */
 public interface TBDingService extends IService<TBDing> {
     // -- 考勤打卡部分
-    Object findDingElements();
+
+    /**
+     * 根据sop查询打卡界面元素
+     *
+     * @param sopNo  sop编号
+     * @param userId 用户id
+     * @return 打卡元素
+     */
+    DingElementResult findDingElements(String sopNo, Long userId);
 
     /**
      * 考勤结果统计
@@ -51,4 +60,12 @@ public interface TBDingService extends IService<TBDing> {
     TBDingAttendanceCountResult attendanceCount(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo);
 
     List<TBDingAttendanceResult> attendanceQuery(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo, InOutTypeEnum type, DingResultEnum status);
+
+    /**
+     * 根据sop单号构建打卡日期表单
+     *
+     * @param sopNo sop单号
+     * @return 应签到日期
+     */
+    DateFormDto buildSignDateFormBySop(String sopNo);
 }

+ 172 - 55
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java

@@ -3,18 +3,24 @@ package com.qmth.sop.business.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.sop.business.bean.dto.DateFormDto;
 import com.qmth.sop.business.bean.result.*;
 import com.qmth.sop.business.entity.TBDing;
+import com.qmth.sop.business.entity.TFFlowApprove;
 import com.qmth.sop.business.mapper.TBDingMapper;
 import com.qmth.sop.business.service.TBDingService;
-import com.qmth.sop.common.enums.DingResultEnum;
-import com.qmth.sop.common.enums.InOutTypeEnum;
+import com.qmth.sop.common.contant.SystemConstant;
+import com.qmth.sop.common.enums.*;
+import com.qmth.sop.common.util.DateDisposeUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * 考勤打卡表 服务实现.
@@ -28,71 +34,153 @@ import java.util.Objects;
 @Service
 public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> implements TBDingService {
 
-
     @Override
-    public Object findDingElements() {
-        return null;
+    public DingElementResult findDingElements(String sopNo, Long userId) {
+        DingElementResult dingElementResult = this.baseMapper.findDingResultByUserId(userId);
+        Long userArchivesId = dingElementResult.getUserArchivesId();
+        String currentDayStr = DateFormatUtils.format(System.currentTimeMillis(), SystemConstant.DEFAULT_DATE_DAY_PATTERN);
+        List<TBDing> tbDingList = this.list(new QueryWrapper<TBDing>()
+                .lambda()
+                .eq(TBDing::getSopNo, sopNo)
+                .eq(TBDing::getUserArchivesId, userArchivesId)
+                .eq(TBDing::getSignDate, currentDayStr));
+        if (CollectionUtils.isNotEmpty(tbDingList)) {
+            // 有考勤记录
+            if (tbDingList.size() > 1) {
+                throw ExceptionResultEnum.ERROR.exception("考勤记录异常");
+            }
+            TBDing tbDing = tbDingList.get(0);
+            Long signInTime = tbDing.getSignInTime();
+            String singInAddress = tbDing.getSignInAddress();
+            Long signOutTime = tbDing.getSignOutTime();
+            String signOutAddress = tbDing.getSignOutAddress();
+
+            dingElementResult.setSignInTime(signInTime);
+            dingElementResult.setSignInAddress(singInAddress);
+            dingElementResult.setSignOutAddress(signOutAddress);
+            dingElementResult.setSignOutTime(signOutTime);
+        }
+        return dingElementResult;
     }
 
     @Override
     public DingStatisticResult findDingStatistic(Long serviceUnitId, String sopNo, Long userArchivesId) {
-        List<TBDing> tbDingList = this.list(new QueryWrapper<TBDing>().lambda()
-                .eq(TBDing::getServiceId, serviceUnitId)
-                .eq(TBDing::getSopNo, sopNo)
-                .eq(TBDing::getUserArchivesId, userArchivesId)
-                .orderByAsc(TBDing::getId));
+        // 根据sopNo查询日期表单
+        DateFormDto dateFormDto = this.buildSignDateFormBySop(sopNo);
+
+        List<String> dateFormList = dateFormDto.getDateFormList();
+
+        int workCount = 0;
+        int exceptionCount = 0;
         List<DingFormResult> formList = new ArrayList<>();
-        int exceptionDays = 0;
-        for (TBDing tbDing : tbDingList) {
-            String signDate = tbDing.getSignDate();
-            Long signInTime = tbDing.getSignInTime();
-            String signInAddress = tbDing.getSignInAddress();
-            String axisInX = tbDing.getAxisInX();
-            String axisInY = tbDing.getAxisInY();
-
-            DingInfoResult signInInfo = new DingInfoResult();
-            if (signInTime == null || signInTime == 0) {
-                signInInfo.setStatus(false);
-            } else {
-                signInInfo.setStatus(true);
-                signInInfo.setInOutType(InOutTypeEnum.IN);
-                signInInfo.setSignTime(signInTime);
-                signInInfo.setSignAddress(signInAddress);
-                signInInfo.setAxisX(axisInX);
-                signInInfo.setAxisY(axisInY);
+        if (CollectionUtils.isNotEmpty(dateFormList)) {
+            Boolean sopIsEnd = dateFormDto.getSopIsEnd();
+
+            List<TBDing> tbDingList = this.list(new QueryWrapper<TBDing>().lambda()
+                    .eq(TBDing::getServiceId, serviceUnitId)
+                    .eq(TBDing::getSopNo, sopNo)
+                    .eq(TBDing::getUserArchivesId, userArchivesId)
+                    .orderByAsc(TBDing::getId));
+
+            // 签到表
+            List<DingFormResult> formDingList = new ArrayList<>();
+            for (TBDing tbDing : tbDingList) {
+                String signDate = tbDing.getSignDate();
+                Long signInTime = tbDing.getSignInTime();
+                String signInAddress = tbDing.getSignInAddress();
+                String axisInX = tbDing.getAxisInX();
+                String axisInY = tbDing.getAxisInY();
+                String dingSopNo = tbDing.getDingSopNo();
+
+                DingInfoResult signInInfo = new DingInfoResult();
+                if (signInTime == null || signInTime == 0) {
+                    if (sopIsEnd) {
+                        signInInfo.setStatus(DingStatusEnum.RE_SIGN);
+                    } else {
+                        signInInfo.setStatus(DingStatusEnum.NO_SIGN);
+                    }
+                } else {
+                    if (sopNo.equals(dingSopNo)) {
+                        signInInfo.setStatus(DingStatusEnum.SIGN);
+                    } else {
+                        signInInfo.setStatus(DingStatusEnum.OTHER);
+                    }
+                    signInInfo.setInOutType(InOutTypeEnum.IN);
+                    signInInfo.setSignTime(signInTime);
+                    signInInfo.setSignAddress(signInAddress);
+                    signInInfo.setAxisX(axisInX);
+                    signInInfo.setAxisY(axisInY);
+                }
+
+                Long signOutTime = tbDing.getSignOutTime();
+                String signOutAddress = tbDing.getSignInAddress();
+                String axisOutX = tbDing.getAxisInX();
+                String axisOutY = tbDing.getAxisInY();
+
+                DingInfoResult signOutInfo = new DingInfoResult();
+                if (signOutTime == null || signOutTime == 0) {
+                    if (sopIsEnd) {
+                        signOutInfo.setStatus(DingStatusEnum.RE_SIGN);
+                    } else {
+                        signOutInfo.setStatus(DingStatusEnum.NO_SIGN);
+                    }
+                } else {
+                    if (sopNo.equals(dingSopNo)) {
+                        signOutInfo.setStatus(DingStatusEnum.SIGN);
+                    } else {
+                        signOutInfo.setStatus(DingStatusEnum.OTHER);
+                    }
+                    signOutInfo.setInOutType(InOutTypeEnum.OUT);
+                    signOutInfo.setSignTime(signOutTime);
+                    signOutInfo.setSignAddress(signOutAddress);
+                    signOutInfo.setAxisX(axisOutX);
+                    signOutInfo.setAxisY(axisOutY);
+                }
+                DingFormResult formResult = new DingFormResult();
+                formResult.setDingId(tbDing.getId());
+                formResult.setSignDate(signDate);
+                formResult.setSignInInfo(signInInfo);
+                formResult.setSignOutInfo(signOutInfo);
+                formDingList.add(formResult);
             }
 
-            Long signOutTime = tbDing.getSignOutTime();
-            String signOutAddress = tbDing.getSignInAddress();
-            String axisOutX = tbDing.getAxisInX();
-            String axisOutY = tbDing.getAxisInY();
-
-            DingInfoResult signOutInfo = new DingInfoResult();
-            if (signOutTime == null || signOutTime == 0) {
-                signOutInfo.setStatus(false);
-            } else {
-                signOutInfo.setStatus(true);
-                signOutInfo.setInOutType(InOutTypeEnum.OUT);
-                signOutInfo.setSignTime(signOutTime);
-                signOutInfo.setSignAddress(signOutAddress);
-                signOutInfo.setAxisX(axisOutX);
-                signOutInfo.setAxisY(axisOutY);
-            }
-            DingFormResult formResult = new DingFormResult();
-            formResult.setDingId(tbDing.getId());
-            formResult.setSignDate(signDate);
-            formResult.setSignInInfo(signInInfo);
-            formResult.setSignOutInfo(signOutInfo);
-            formList.add(formResult);
-
-            if (!signInInfo.getStatus() || !signOutInfo.getStatus()) {
-                exceptionDays++;
+
+            for (String date : dateFormList) {
+                List<DingFormResult> dingFormResultList = formDingList.stream()
+                        .filter(e -> date.equals(e.getSignDate()))
+                        .collect(Collectors.toList());
+
+                DingFormResult dingFormResult = new DingFormResult();
+                dingFormResult.setSignDate(date);
+                if (CollectionUtils.isNotEmpty(dingFormResultList)) {
+                    // 有这一天的打卡记录
+
+                    dingFormResult = dingFormResultList.get(0);
+                    // 考勤异常天数增加
+                    if (dingFormResult.getSignInInfo().getStatus().equals(DingStatusEnum.RE_SIGN) || dingFormResult.getSignOutInfo().getStatus().equals(DingStatusEnum.RE_SIGN)) {
+                        exceptionCount++;
+                    }
+                    // 出勤天数增加
+                    if ((dingFormResult.getSignInInfo().getStatus().equals(DingStatusEnum.SIGN) && dingFormResult.getSignOutInfo().getStatus().equals(DingStatusEnum.SIGN)) ||
+                            (dingFormResult.getSignInInfo().getStatus().equals(DingStatusEnum.OTHER) && dingFormResult.getSignOutInfo().getStatus().equals(DingStatusEnum.OTHER))) {
+                        workCount++;
+                    }
+                } else {
+                    // 完全没有这天的打卡记录
+                    DingInfoResult in = new DingInfoResult();
+                    in.setStatus(DingStatusEnum.NO_SIGN);
+                    DingInfoResult out = new DingInfoResult();
+                    out.setStatus(DingStatusEnum.NO_SIGN);
+                    dingFormResult.setSignInInfo(in);
+                    dingFormResult.setSignOutInfo(out);
+                    exceptionCount++;
+                }
             }
         }
         DingStatisticResult dingStatisticResult = new DingStatisticResult();
         dingStatisticResult.setDingFormList(formList);
-        dingStatisticResult.setWorkDays(formList.size());
-        dingStatisticResult.setExceptionCount(exceptionDays);
+        dingStatisticResult.setWorkDays(workCount);
+        dingStatisticResult.setExceptionCount(exceptionCount);
         return dingStatisticResult;
     }
 
@@ -132,4 +220,33 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
     public List<TBDingAttendanceResult> attendanceQuery(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo, InOutTypeEnum type, DingResultEnum status) {
         return this.baseMapper.attendanceQuery(serviceId, userName, startTime, endTime, supplierId, custom, sopNo, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(status) ? status.name() : null);
     }
+
+    @Override
+    public DateFormDto buildSignDateFormBySop(String sopNo) {
+        DateFormDto result = new DateFormDto();
+        List<String> dateList;
+        if (sopNo != null && sopNo.length() > 0) {
+            List<TFFlowApprove> tfFlowApproves = this.baseMapper.findDateAndStatusBySopNo(sopNo);
+            if (CollectionUtils.isNotEmpty(tfFlowApproves)) {
+                if (tfFlowApproves.size() > 1) {
+                    throw ExceptionResultEnum.ERROR.exception(String.format("sop编号为[%s]的有多条流程审核记录", sopNo));
+                }
+                TFFlowApprove tfFlowApprove = tfFlowApproves.get(0);
+                FlowStatusEnum flowStatusEnum = tfFlowApprove.getStatus();
+                Long createTime = tfFlowApprove.getCreateTime();
+                Long updateTime = tfFlowApprove.getUpdateTime();
+                Long currentTime = System.currentTimeMillis();
+
+                if (FlowStatusEnum.FINISH.equals(flowStatusEnum)) {
+                    dateList = DateDisposeUtils.getDaysBetween(createTime, updateTime, SystemConstant.DEFAULT_DATE_DAY_PATTERN);
+                    result.setSopIsEnd(true);
+                } else {
+                    dateList = DateDisposeUtils.getDaysBetween(createTime, currentTime, SystemConstant.DEFAULT_DATE_DAY_PATTERN);
+                    result.setSopIsEnd(false);
+                }
+                result.setDateFormList(dateList);
+            }
+        }
+        return result;
+    }
 }

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

@@ -220,3 +220,8 @@ UPDATE sys_privilege SET related = NULL WHERE (id = '5');
 INSERT INTO sequence (name, current_value, increment) VALUES ('deviceInOutCode', '0', '1');
 ALTER TABLE t_b_device_in_out
     ADD COLUMN serial_no VARCHAR(20) NOT NULL COMMENT '出入库流水号' AFTER id;
+
+-- 2023-09-04
+ALTER TABLE t_b_ding
+    ADD COLUMN ding_sop_no VARCHAR(100) NOT NULL COMMENT '实际打卡对应的sop单号' AFTER sop_no,
+    CHANGE COLUMN sop_no sop_no VARCHAR(100) NOT NULL COMMENT 'sop单号';

+ 38 - 0
sop-business/src/main/resources/mapper/TBDingMapper.xml

@@ -254,4 +254,42 @@
         </where>
 
     </select>
+    <select id="findDingResultByUserId" resultType="com.qmth.sop.business.bean.result.DingElementResult">
+        SELECT
+            tbua.id AS userArchivesId,
+            tbua.name AS userArchivesName,
+            tbua.base_photo_path AS basePhotoPath,
+            sdg.sign_in_time AS signInTimeScope,
+            sdg.sign_out_time AS signOutTimeScope
+        FROM
+            t_b_user_archives tbua
+                LEFT JOIN
+            sys_user su ON tbua.mobile_number = su.mobile_number
+                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_ding_group sdg ON sdg.supplier_id = ss.id
+        <where>
+            <if test="userId != null">
+                AND su.id = #{userId}
+            </if>
+        </where>
+    </select>
+    <select id="findDateAndStatusBySopNo" resultType="com.qmth.sop.business.entity.TFFlowApprove">
+        SELECT
+            tffa.status AS status,
+            tffa.create_time AS createTime,
+            tffa.update_time AS updateTime
+        FROM
+            t_f_flow_approve tffa
+                LEFT JOIN
+            t_f_custom_flow_entity tfcfe ON tffa.flow_id = tfcfe.flow_id
+        <where>
+            <if test="sopNo != null and sopNo != ''">
+                AND tfcfe.code = #{sopNo}
+            </if>
+        </where>
+    </select>
 </mapper>

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

@@ -80,6 +80,7 @@ public class SystemConstant {
     public static final String DEFAULT_DATE_YMD_PATTERN = "yyyy-MM-dd";
     public static final String DEFAULT_DATE_CODE_PATTERN = "yyyyMMdd";
     public static final String DEFAULT_DATE_ATTACHMENT_PATTERN = "/yyyy/MM/dd";
+    public static final String DEFAULT_DATE_DAY_PATTERN = "MM月dd日";
     public static final String JSON_PREFIX = ".json";
     public static final String XLSX_PREFIX = ".xlsx";
     public static final String XLS_PREFIX = "xls";

+ 29 - 0
sop-common/src/main/java/com/qmth/sop/common/enums/DingStatusEnum.java

@@ -0,0 +1,29 @@
+package com.qmth.sop.common.enums;
+
+/**
+ * @Description: 签到状态枚举
+ * @Author: CaoZixuan
+ * @Date: 2023-09-04
+ */
+public enum DingStatusEnum {
+    SIGN("打卡", "正常打卡"),
+    NO_SIGN("未打卡", "未打卡"),
+    RE_SIGN("补卡", "sop结束才可以申请补卡"),
+    OTHER("在其他sop打卡", "打卡记录在同时进行的其他sop上");
+
+    DingStatusEnum(String title, String desc) {
+        this.title = title;
+        this.desc = desc;
+    }
+
+    private final String title;
+    private final String desc;
+
+    public String getTitle() {
+        return title;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 68 - 6
sop-common/src/main/java/com/qmth/sop/common/util/DateDisposeUtils.java

@@ -1,18 +1,16 @@
 package com.qmth.sop.common.util;
 
-/**
- * @Description: 时间处理工具类
- * @Author: CaoZixuan
- * @Date:
- */
-
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.commons.lang3.time.DateUtils;
 
 import java.lang.management.ManagementFactory;
+import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 时间工具类
@@ -166,4 +164,68 @@ public class DateDisposeUtils extends DateUtils {
         Date d1 = new Date(date);
         return simpleDateFormat.format(d1);
     }
+
+    /**
+     * 查询两个日期之间的所有日期集合
+     *
+     * @param startTime 开始日期   2023-09-01
+     * @param endTime   结束日期   2023-09-04
+     * @return 所有日期集合  [2023-09-01, 2023-09-02, 2023-09-03, 2023-09-04]
+     */
+    public static List<String> getDaysBetween(String startTime, String endTime) {
+        // 返回的日期集合
+        List<String> days = new ArrayList<>();
+
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        try {
+            Date start = dateFormat.parse(startTime);
+            Date end = dateFormat.parse(endTime);
+
+            Calendar tempStart = Calendar.getInstance();
+            tempStart.setTime(start);
+
+            Calendar tempEnd = Calendar.getInstance();
+            tempEnd.setTime(end);
+            tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
+            while (tempStart.before(tempEnd)) {
+                days.add(dateFormat.format(tempStart.getTime()));
+                tempStart.add(Calendar.DAY_OF_YEAR, 1);
+            }
+
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        return days;
+    }
+
+    /**
+     * 查询两个日期之间的所有日期集合
+     *
+     * @param startTime 1693497600000L
+     * @param endTime   1693756800000L
+     * @param pattern   MM月dd日
+     * @return 所有日期集合 [09月01日, 09月02日, 09月03日, 09月04日]
+     */
+    public static List<String> getDaysBetween(Long startTime, Long endTime, String pattern) {
+        // 返回的日期集合
+        List<String> days = new ArrayList<>();
+
+        DateFormat dateFormat = new SimpleDateFormat(pattern);
+        Date start = new Date(startTime);
+        Date end = new Date(endTime);
+
+        Calendar tempStart = Calendar.getInstance();
+        tempStart.setTime(start);
+
+        Calendar tempEnd = Calendar.getInstance();
+        tempEnd.setTime(end);
+        tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
+        while (tempStart.before(tempEnd)) {
+            days.add(dateFormat.format(tempStart.getTime()));
+            tempStart.add(Calendar.DAY_OF_YEAR, 1);
+        }
+
+        return days;
+    }
 }