caozixuan před 1 rokem
rodič
revize
4a621e9bdb

+ 54 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/DingFormResult.java

@@ -0,0 +1,54 @@
+package com.qmth.sop.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 考勤打卡表单
+ * @Author: CaoZixuan
+ * @Date: 2023-08-29
+ */
+public class DingFormResult {
+    @ApiModelProperty("签到表id")
+    private Long dingId;
+
+    @ApiModelProperty("签到日期")
+    private String signDate;
+
+    @ApiModelProperty("签到信息")
+    private DingInfoResult signInInfo;
+
+    @ApiModelProperty("签退信息")
+    private DingInfoResult signOutInfo;
+
+    public Long getDingId() {
+        return dingId;
+    }
+
+    public void setDingId(Long dingId) {
+        this.dingId = dingId;
+    }
+
+    public String getSignDate() {
+        return signDate;
+    }
+
+    public void setSignDate(String signDate) {
+        this.signDate = signDate;
+    }
+
+    public DingInfoResult getSignInInfo() {
+        return signInInfo;
+    }
+
+    public void setSignInInfo(DingInfoResult signInInfo) {
+        this.signInInfo = signInInfo;
+    }
+
+    public DingInfoResult getSignOutInfo() {
+        return signOutInfo;
+    }
+
+    public void setSignOutInfo(DingInfoResult signOutInfo) {
+        this.signOutInfo = signOutInfo;
+    }
+}

+ 77 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/DingInfoResult.java

@@ -0,0 +1,77 @@
+package com.qmth.sop.business.bean.result;
+
+import com.qmth.sop.common.enums.InOutTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 签到/签退信息
+ * @Author: CaoZixuan
+ * @Date: 2023-08-29
+ */
+public class DingInfoResult {
+    @ApiModelProperty("签到状态(1-正常签到,0-未签到)")
+    private Boolean status;
+
+    @ApiModelProperty("签到/签退")
+    private InOutTypeEnum inOutType;
+
+    @ApiModelProperty("打卡时间")
+    private Long signTime;
+
+    @ApiModelProperty("打卡地点")
+    private String signAddress;
+
+    @ApiModelProperty("x坐标")
+    private String axisX;
+
+    @ApiModelProperty("y坐标")
+    private String axisY;
+
+    public Boolean getStatus() {
+        return status;
+    }
+
+    public void setStatus(Boolean status) {
+        this.status = status;
+    }
+
+    public InOutTypeEnum getInOutType() {
+        return inOutType;
+    }
+
+    public void setInOutType(InOutTypeEnum inOutType) {
+        this.inOutType = inOutType;
+    }
+
+    public Long getSignTime() {
+        return signTime;
+    }
+
+    public void setSignTime(Long signTime) {
+        this.signTime = signTime;
+    }
+
+    public String getSignAddress() {
+        return signAddress;
+    }
+
+    public void setSignAddress(String signAddress) {
+        this.signAddress = signAddress;
+    }
+
+    public String getAxisX() {
+        return axisX;
+    }
+
+    public void setAxisX(String axisX) {
+        this.axisX = axisX;
+    }
+
+    public String getAxisY() {
+        return axisY;
+    }
+
+    public void setAxisY(String axisY) {
+        this.axisY = axisY;
+    }
+}

+ 56 - 0
sop-business/src/main/java/com/qmth/sop/business/bean/result/DingStatisticResult.java

@@ -0,0 +1,56 @@
+package com.qmth.sop.business.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description: 考勤打卡统计结果
+ * @Author: CaoZixuan
+ * @Date: 2023-08-29
+ */
+public class DingStatisticResult {
+    @ApiModelProperty(value = "客户名称")
+    private String customName;
+
+    @ApiModelProperty(value = "出勤天数")
+    private Integer workDays;
+
+    @ApiModelProperty(value = "异常共计")
+    private Integer exceptionCount;
+
+    @ApiModelProperty(value = "打卡表单")
+    private List<DingFormResult> dingFormList;
+
+    public String getCustomName() {
+        return customName;
+    }
+
+    public void setCustomName(String customName) {
+        this.customName = customName;
+    }
+
+    public Integer getWorkDays() {
+        return workDays;
+    }
+
+    public void setWorkDays(Integer workDays) {
+        this.workDays = workDays;
+    }
+
+    public Integer getExceptionCount() {
+        return exceptionCount;
+    }
+
+    public void setExceptionCount(Integer exceptionCount) {
+        this.exceptionCount = exceptionCount;
+    }
+
+    public List<DingFormResult> getDingFormList() {
+        return dingFormList;
+    }
+
+    public void setDingFormList(List<DingFormResult> dingFormList) {
+        this.dingFormList = dingFormList;
+    }
+}

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

@@ -45,7 +45,7 @@ public class DingSubmitResult {
     private Long archivesId;
 
     @ApiModelProperty(value = "人员档案号")
-    private String archivesCodee;
+    private String archivesCode;
 
     @ApiModelProperty(value = "姓名")
     private String archivesName;
@@ -187,12 +187,12 @@ public class DingSubmitResult {
         this.archivesId = archivesId;
     }
 
-    public String getArchivesCodee() {
-        return archivesCodee;
+    public String getArchivesCode() {
+        return archivesCode;
     }
 
-    public void setArchivesCodee(String archivesCodee) {
-        this.archivesCodee = archivesCodee;
+    public void setArchivesCode(String archivesCode) {
+        this.archivesCode = archivesCode;
     }
 
     public String getArchivesName() {

+ 54 - 8
sop-business/src/main/java/com/qmth/sop/business/entity/TBDing.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.sop.common.base.BaseEntity;
 import com.qmth.sop.common.enums.DingDateTypeEnum;
+import com.qmth.sop.common.enums.RoleTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -32,6 +33,13 @@ public class TBDing extends BaseEntity implements Serializable {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long serviceId;
 
+    @ApiModelProperty(value = "用户档案id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userArchivesId;
+
+    @ApiModelProperty("角色类型")
+    private RoleTypeEnum roleType;
+
     @ApiModelProperty(value = "用户id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long userId;
@@ -53,6 +61,9 @@ public class TBDing extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "签到时间")
     private Long signInTime;
 
+    @ApiModelProperty(value = "签到地址")
+    private String signInAddress;
+
     @ApiModelProperty(value = "坐标轴X")
     private String axisInX;
 
@@ -65,6 +76,9 @@ public class TBDing extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "签退时间")
     private Long signOutTime;
 
+    @ApiModelProperty(value = "签退地址")
+    private String signOutAddress;
+
     @ApiModelProperty(value = "坐标轴X")
     private String axisOutX;
 
@@ -98,6 +112,22 @@ public class TBDing extends BaseEntity implements Serializable {
         this.serviceId = serviceId;
     }
 
+    public Long getUserArchivesId() {
+        return userArchivesId;
+    }
+
+    public void setUserArchivesId(Long userArchivesId) {
+        this.userArchivesId = userArchivesId;
+    }
+
+    public RoleTypeEnum getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(RoleTypeEnum roleType) {
+        this.roleType = roleType;
+    }
+
     public Long getUserId() {
         return userId;
     }
@@ -130,6 +160,14 @@ public class TBDing extends BaseEntity implements Serializable {
         this.signDate = signDate;
     }
 
+    public DingDateTypeEnum getDateType() {
+        return dateType;
+    }
+
+    public void setDateType(DingDateTypeEnum dateType) {
+        this.dateType = dateType;
+    }
+
     public Long getSignInTime() {
         return signInTime;
     }
@@ -138,6 +176,14 @@ public class TBDing extends BaseEntity implements Serializable {
         this.signInTime = signInTime;
     }
 
+    public String getSignInAddress() {
+        return signInAddress;
+    }
+
+    public void setSignInAddress(String signInAddress) {
+        this.signInAddress = signInAddress;
+    }
+
     public String getAxisInX() {
         return axisInX;
     }
@@ -170,6 +216,14 @@ public class TBDing extends BaseEntity implements Serializable {
         this.signOutTime = signOutTime;
     }
 
+    public String getSignOutAddress() {
+        return signOutAddress;
+    }
+
+    public void setSignOutAddress(String signOutAddress) {
+        this.signOutAddress = signOutAddress;
+    }
+
     public String getAxisOutX() {
         return axisOutX;
     }
@@ -193,12 +247,4 @@ public class TBDing extends BaseEntity implements Serializable {
     public void setFaceOutError(Boolean faceOutError) {
         this.faceOutError = faceOutError;
     }
-
-    public DingDateTypeEnum getDateType() {
-        return dateType;
-    }
-
-    public void setDateType(DingDateTypeEnum dateType) {
-        this.dateType = dateType;
-    }
 }

+ 21 - 23
sop-business/src/main/java/com/qmth/sop/business/service/TBDingService.java

@@ -2,10 +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.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.common.enums.DingResultEnum;
 import com.qmth.sop.common.enums.InOutTypeEnum;
@@ -22,15 +19,29 @@ import java.util.Map;
  * @email: shudonghui@qmth.com.cn
  * @Company: www.qmth.com.cn
  */
-public interface TBDingService extends IService<TBDing>{
+public interface TBDingService extends IService<TBDing> {
+    // -- 考勤打卡部分
+    Object findDingElements();
 
     /**
-    * 查询列表
-    *
-    * @param iPage
-    * @return
-    */
+     * 考勤结果统计
+     *
+     * @param serviceUnitId  服务单元id
+     * @param sopNo          sop单号
+     * @param userArchivesId 档案id
+     * @return 考勤结果统计
+     */
+    DingStatisticResult findDingStatistic(Long serviceUnitId, String sopNo, Long userArchivesId);
+
+
+    /**
+     * 查询列表
+     *
+     * @param iPage
+     * @return
+     */
     IPage<TBDingCountQueryResult> query(IPage<Map> iPage, Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days);
+
     List<TBDingCountQueryResult> query(Long serviceId, String status, Long createId, String userName, Long supplierId, String custom, String sopNo, Long days);
 
     TBDingCountResult count(Long serviceId, Long createId, String userName, Long supplierId, String custom, String sopNo);
@@ -40,17 +51,4 @@ 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);
-
-
-//    // -- 考勤提交部分接口 --
-//    IPage<Object> findDingSubmitPage();
-//
-//    Object findDingSubmitSubTotal();
-//
-//    Object findDingSubmitUserDetail();
-//
-//    void submitDing();
-
-
-
 }

+ 74 - 8
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java

@@ -1,11 +1,9 @@
 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.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.mapper.TBDingMapper;
 import com.qmth.sop.business.service.TBDingService;
@@ -13,6 +11,7 @@ import com.qmth.sop.common.enums.DingResultEnum;
 import com.qmth.sop.common.enums.InOutTypeEnum;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -30,6 +29,73 @@ import java.util.Objects;
 public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> implements TBDingService {
 
 
+    @Override
+    public Object findDingElements() {
+        return null;
+    }
+
+    @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));
+        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);
+            }
+
+            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++;
+            }
+        }
+        DingStatisticResult dingStatisticResult = new DingStatisticResult();
+        dingStatisticResult.setDingFormList(formList);
+        dingStatisticResult.setWorkDays(formList.size());
+        dingStatisticResult.setExceptionCount(exceptionDays);
+        return dingStatisticResult;
+    }
+
     /**
      * 查询列表
      *
@@ -48,22 +114,22 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
     }
 
     @Override
-    public TBDingCountResult count(Long serviceId,  Long createId, String userName, Long supplierId, String custom, String sopNo) {
+    public TBDingCountResult count(Long serviceId, Long createId, String userName, Long supplierId, String custom, String sopNo) {
         return this.baseMapper.count(serviceId, createId, userName, supplierId, custom, sopNo);
     }
 
     @Override
     public IPage<TBDingAttendanceResult> attendanceQuery(IPage<Map> iPage, Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo, InOutTypeEnum type, DingResultEnum status) {
-        return this.baseMapper.attendanceQuery(iPage,serviceId,userName,startTime,endTime, supplierId, custom, sopNo, Objects.nonNull(type)?type.name():null,Objects.nonNull(status)?status.name():null);
+        return this.baseMapper.attendanceQuery(iPage, serviceId, userName, startTime, endTime, supplierId, custom, sopNo, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(status) ? status.name() : null);
     }
 
     @Override
     public TBDingAttendanceCountResult attendanceCount(Long serviceId, String userName, Long startTime, Long endTime, Long supplierId, String custom, String sopNo) {
-        return this.baseMapper.attendanceCount(serviceId,userName,startTime,endTime, supplierId, custom, sopNo);
+        return this.baseMapper.attendanceCount(serviceId, userName, startTime, endTime, supplierId, custom, sopNo);
     }
 
     @Override
     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);
+        return this.baseMapper.attendanceQuery(serviceId, userName, startTime, endTime, supplierId, custom, sopNo, Objects.nonNull(type) ? type.name() : null, Objects.nonNull(status) ? status.name() : null);
     }
 }

+ 22 - 1
sop-business/src/main/resources/db/log/caozixuan_update_log.sql

@@ -190,4 +190,25 @@ UPDATE sys_privilege SET related = '2036' WHERE (id = '168');
 UPDATE sys_privilege SET related = '2036' WHERE (id = '169');
 
 ALTER TABLE t_b_device_in_out
-    CHANGE COLUMN service_id service_id BIGINT NULL COMMENT '服务单元id' ;
+    CHANGE COLUMN service_id service_id BIGINT NULL COMMENT '服务单元id' ;
+
+-- 2023-08-30
+ALTER TABLE t_b_ding
+    ADD COLUMN sign_in_address VARCHAR(100) NULL COMMENT '签到地址' AFTER sign_in_time,
+    ADD COLUMN sign_out_address VARCHAR(100) NULL COMMENT '签退地址' AFTER sign_out_time;
+
+
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('2037', '考勤提交-分页查询', '/api/admin/tb/ding/submit/page', 'URL', '28', '1', 'AUTH', '1', '1', '0');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('2038', '考勤提交-小计', '/api/admin/tb/ding/submit/sub_total', 'URL', '28', '2', 'AUTH', '1', '1', '0');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('2039', '考勤提交-批量提交', '/api/admin/tb/ding/submit/submit_batch', 'URL', '28', '3', 'AUTH', '1', '1', '0');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('2040', '考勤提交-考勤撤回', '/api/admin/tb/ding/submit/apply_withdram', 'URL', '28', '4', 'AUTH', '1', '1', '0');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('2041', '考勤提交-取消撤回', '/api/admin/tb/ding/submit/cancel_withdraw', 'URL', '28', '5', 'AUTH', '1', '1', '0');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('2042', '考勤提交-批量导出', '/api/admin/tb/ding/submit/export', 'URL', '28', '6', 'AUTH', '1', '1', '0');
+
+UPDATE sys_privilege SET related = '2037,2038' WHERE (id = '141');
+UPDATE sys_privilege SET related = '2039' WHERE (id = '142');
+UPDATE sys_privilege SET related = '2037,2038' WHERE (id = '143');
+UPDATE sys_privilege SET related = '2037,2038' WHERE (id = '144');
+UPDATE sys_privilege SET related = '2042' WHERE (id = '145');
+UPDATE sys_privilege SET related = '2039' WHERE (id = '146');
+UPDATE sys_privilege SET related = '2040,2041' WHERE (id = '147');

+ 5 - 2
sop-business/src/main/resources/mapper/TBDingSubmitMapper.xml

@@ -51,7 +51,7 @@
                       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,
+                                       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), 1, 0)) AS violation_days,
                       SUM(IF((sign_in_time IS NULL
@@ -171,7 +171,7 @@
                       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,
+                                       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), 1, 0)) AS violation_days,
                       SUM(IF((sign_in_time IS NULL
@@ -215,6 +215,9 @@
             <if test="submitUserId != null">
                 AND main.submitUserId = #{serviceUnitId}
             </if>
+            <if test="archivesId != null">
+                AND main.archivesId = #{archivesId}
+            </if>
             <if test="archivesName != null and archivesName != ''">
                 AND main.archivesName LIKE CONCAT('%',#{archivesName},'%')
             </if>