Browse Source

add:考勤补卡剩余天数

caozixuan 1 year ago
parent
commit
5e46a1d0e1

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

@@ -47,6 +47,9 @@ public class DingElementResult {
     @ApiModelProperty("允许补卡次数")
     @ApiModelProperty("允许补卡次数")
     private Integer reissueCardCount;
     private Integer reissueCardCount;
 
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long dingGroupId;
+
     public Long getUserArchivesId() {
     public Long getUserArchivesId() {
         return userArchivesId;
         return userArchivesId;
     }
     }
@@ -142,4 +145,12 @@ public class DingElementResult {
     public void setReissueCardCount(Integer reissueCardCount) {
     public void setReissueCardCount(Integer reissueCardCount) {
         this.reissueCardCount = reissueCardCount;
         this.reissueCardCount = reissueCardCount;
     }
     }
+
+    public Long getDingGroupId() {
+        return dingGroupId;
+    }
+
+    public void setDingGroupId(Long dingGroupId) {
+        this.dingGroupId = dingGroupId;
+    }
 }
 }

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

@@ -40,6 +40,10 @@ public class DingSubmitResult {
     @ApiModelProperty(value = "撤场时间")
     @ApiModelProperty(value = "撤场时间")
     private Long departureTime;
     private Long departureTime;
 
 
+    @ApiModelProperty(value = "用户id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
     @ApiModelProperty(value = "档案id")
     @ApiModelProperty(value = "档案id")
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
     private Long archivesId;
     private Long archivesId;
@@ -382,4 +386,12 @@ public class DingSubmitResult {
     public void setCoordinatorId(Long coordinatorId) {
     public void setCoordinatorId(Long coordinatorId) {
         this.coordinatorId = coordinatorId;
         this.coordinatorId = coordinatorId;
     }
     }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
 }
 }

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

@@ -49,7 +49,7 @@ public interface TBDingMapper extends BaseMapper<TBDing> {
      * @param serviceUnitId 服务单元id
      * @param serviceUnitId 服务单元id
      * @return 打卡信息
      * @return 打卡信息
      */
      */
-    DingElementResult findDingResultByUserId(@Param("userId") Long userId, @Param("serviceUnitId") Long serviceUnitId);
+    List<DingElementResult> findDingResultByUserId(@Param("userId") Long userId, @Param("serviceUnitId") Long serviceUnitId);
 
 
     /**
     /**
      * 根据sopNo查询sop的状态和日期
      * 根据sopNo查询sop的状态和日期

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

@@ -78,4 +78,22 @@ public interface TBDingService extends IService<TBDing> {
      * @return 应签到日期
      * @return 应签到日期
      */
      */
     DateFormDto buildSignDateFormBySop(String sopNo);
     DateFormDto buildSignDateFormBySop(String sopNo);
+
+    /**
+     * 查询考勤组规则
+     *
+     * @param userId        用户id
+     * @param serviceUnitId 服务单元id
+     * @return 规则
+     */
+    DingElementResult findDingRule(Long userId, Long serviceUnitId);
+
+    /**
+     * 查询剩余补卡天数
+     *
+     * @param userId 用户id
+     * @param sopNo  流水号
+     * @return 剩余补卡天数
+     */
+    int findRemainCount(Long userId, String sopNo);
 }
 }

+ 2 - 1
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBCrmServiceImpl.java

@@ -352,7 +352,8 @@ public class TBCrmServiceImpl extends ServiceImpl<TBCrmMapper, TBCrm> implements
     public SopCrmInfo findSopCrmInfoBySop(String sopNo) {
     public SopCrmInfo findSopCrmInfoBySop(String sopNo) {
         List<SopCrmInfo> sopCrmInfoList = this.baseMapper.findSopCrmInfoBySopNo(sopNo);
         List<SopCrmInfo> sopCrmInfoList = this.baseMapper.findSopCrmInfoBySopNo(sopNo);
         if (CollectionUtils.isEmpty(sopCrmInfoList)) {
         if (CollectionUtils.isEmpty(sopCrmInfoList)) {
-            throw ExceptionResultEnum.ERROR.exception(String.format("未找到sop单号为[%s]的派单信息", sopNo));
+//            throw ExceptionResultEnum.ERROR.exception(String.format("未找到sop单号为[%s]的派单信息", sopNo));
+            return null;
         } else if (sopCrmInfoList.size() > 1) {
         } else if (sopCrmInfoList.size() > 1) {
             throw ExceptionResultEnum.ERROR.exception(String.format("sop单号为[%s]的派单信息异常", sopNo));
             throw ExceptionResultEnum.ERROR.exception(String.format("sop单号为[%s]的派单信息异常", sopNo));
         }
         }

+ 54 - 9
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.sop.business.bean.dto.DataPermissionDto;
 import com.qmth.sop.business.bean.dto.DataPermissionDto;
 import com.qmth.sop.business.bean.dto.DateFormDto;
 import com.qmth.sop.business.bean.dto.DateFormDto;
+import com.qmth.sop.business.bean.dto.RoleDto;
 import com.qmth.sop.business.bean.dto.SopCrmInfo;
 import com.qmth.sop.business.bean.dto.SopCrmInfo;
 import com.qmth.sop.business.bean.params.DingSaveParam;
 import com.qmth.sop.business.bean.params.DingSaveParam;
 import com.qmth.sop.business.bean.result.*;
 import com.qmth.sop.business.bean.result.*;
@@ -62,6 +63,8 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
     private TBDingHistoryService tbDingHistoryService;
     private TBDingHistoryService tbDingHistoryService;
     @Resource
     @Resource
     private SysUserService sysUserService;
     private SysUserService sysUserService;
+    @Resource
+    private SysDingObjService sysDingObjService;
 
 
     @Override
     @Override
     public DingElementResult findDingElements(String sopNo, Long userId) {
     public DingElementResult findDingElements(String sopNo, Long userId) {
@@ -69,7 +72,7 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
         SopCrmInfo sopCrmInfo = tbCrmService.findSopCrmInfoBySop(sopNo);
         SopCrmInfo sopCrmInfo = tbCrmService.findSopCrmInfoBySop(sopNo);
         Long serviceUnitId = sopCrmInfo.getServiceUnitId();
         Long serviceUnitId = sopCrmInfo.getServiceUnitId();
 
 
-        DingElementResult dingElementResult = this.baseMapper.findDingResultByUserId(userId, serviceUnitId);
+        DingElementResult dingElementResult = this.findDingRule(userId, serviceUnitId);
         if (Objects.nonNull(dingElementResult)) {
         if (Objects.nonNull(dingElementResult)) {
             Long userArchivesId = dingElementResult.getUserArchivesId();
             Long userArchivesId = dingElementResult.getUserArchivesId();
             String currentDayStr = DateFormatUtils.format(System.currentTimeMillis(), SystemConstant.DEFAULT_DATE_DAY_PATTERN);
             String currentDayStr = DateFormatUtils.format(System.currentTimeMillis(), SystemConstant.DEFAULT_DATE_DAY_PATTERN);
@@ -217,17 +220,11 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
                 formList.add(dingFormResult);
                 formList.add(dingFormResult);
             }
             }
         }
         }
-        SopCrmInfo sopCrmInfo = tbCrmService.findSopCrmInfoBySop(sopNo);
-        Long serviceUnitId = sopCrmInfo.getServiceUnitId();
-        DingElementResult dingElementResult = this.baseMapper.findDingResultByUserId(userId, serviceUnitId);
-        int reissueCardCount = dingElementResult != null ? dingElementResult.getReissueCardCount() : 0;
-        int applyCount = this.baseMapper.findDingExceptionApplyCount(userId, sopNo);
-
         DingStatisticResult dingStatisticResult = new DingStatisticResult();
         DingStatisticResult dingStatisticResult = new DingStatisticResult();
         dingStatisticResult.setDingFormList(formList);
         dingStatisticResult.setDingFormList(formList);
         dingStatisticResult.setWorkDays(workCount);
         dingStatisticResult.setWorkDays(workCount);
         dingStatisticResult.setExceptionCount(exceptionCount);
         dingStatisticResult.setExceptionCount(exceptionCount);
-        dingStatisticResult.setRemainCount(reissueCardCount != 0 ? reissueCardCount - applyCount : 0);
+        dingStatisticResult.setRemainCount(this.findRemainCount(userId, sopNo));
         return dingStatisticResult;
         return dingStatisticResult;
     }
     }
 
 
@@ -236,7 +233,10 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
         String sopNo = dingSaveParam.getSopNo();
         String sopNo = dingSaveParam.getSopNo();
         SopCrmInfo sopCrmInfo = tbCrmService.findSopCrmInfoBySop(sopNo);
         SopCrmInfo sopCrmInfo = tbCrmService.findSopCrmInfoBySop(sopNo);
         Long serviceUnitId = sopCrmInfo.getServiceUnitId();
         Long serviceUnitId = sopCrmInfo.getServiceUnitId();
-        DingElementResult dingElementResult = this.baseMapper.findDingResultByUserId(userId, serviceUnitId);
+        DingElementResult dingElementResult = this.findDingRule(userId, serviceUnitId);
+        if (Objects.isNull(dingElementResult)) {
+            throw ExceptionResultEnum.ERROR.exception("未能获取考勤相关规则");
+        }
 
 
         Long signTime = dingSaveParam.getSignTime();
         Long signTime = dingSaveParam.getSignTime();
         DingDateTypeEnum dateType = sysDingDateService.getDingDateType(DateDisposeUtils.timestampToLocalDate(signTime));
         DingDateTypeEnum dateType = sysDingDateService.getDingDateType(DateDisposeUtils.timestampToLocalDate(signTime));
@@ -469,4 +469,49 @@ public class TBDingServiceImpl extends ServiceImpl<TBDingMapper, TBDing> impleme
         }
         }
         return result;
         return result;
     }
     }
+
+    @Override
+    public DingElementResult findDingRule(Long userId, Long serviceUnitId) {
+        List<Long> roleIdList = sysRoleService.listRolesByUserId(userId).stream().map(RoleDto::getId).distinct().collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(roleIdList)) {
+            throw ExceptionResultEnum.ERROR.exception("用户缺少角色");
+        }
+        List<DingElementResult> dingElementResultList = this.baseMapper.findDingResultByUserId(userId, serviceUnitId);
+        List<Long> dingGroupIds = dingElementResultList.stream().map(DingElementResult::getDingGroupId).distinct().collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(dingGroupIds)) {
+            throw ExceptionResultEnum.ERROR.exception("缺少考勤组id");
+        }
+
+        List<SysDingObj> sysDingObjList = sysDingObjService.list(new QueryWrapper<SysDingObj>()
+                .lambda()
+                .in(SysDingObj::getDingGroupId, dingGroupIds)
+                .in(SysDingObj::getRoleId, roleIdList)
+                .eq(SysDingObj::getType, DingObjTypeEnum.DING));
+
+        if (CollectionUtils.isNotEmpty(sysDingObjList) && sysDingObjList.size() == 1) {
+            dingElementResultList = dingElementResultList
+                    .stream()
+                    .filter(e -> e.getDingGroupId()
+                            .equals(sysDingObjList.get(0).getDingGroupId()))
+                    .collect(Collectors.toList());
+            if (dingElementResultList.size() == 1) {
+                return dingElementResultList.get(0);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public int findRemainCount(Long userId, String sopNo) {
+        // TODO: 2023/11/8 查明为什么会有sop找不到对应的派单 
+        SopCrmInfo sopCrmInfo = tbCrmService.findSopCrmInfoBySop(sopNo);
+        if (Objects.isNull(sopCrmInfo)){
+            return 0;
+        }
+        Long serviceUnitId = sopCrmInfo.getServiceUnitId();
+        DingElementResult dingElementResult = this.findDingRule(userId, serviceUnitId);
+        int reissueCardCount = dingElementResult != null ? dingElementResult.getReissueCardCount() : 0;
+        int applyCount = this.baseMapper.findDingExceptionApplyCount(userId, sopNo);
+        return reissueCardCount != 0 ? reissueCardCount - applyCount : 0;
+    }
 }
 }

+ 9 - 3
sop-business/src/main/java/com/qmth/sop/business/service/impl/TBDingSubmitServiceImpl.java

@@ -38,6 +38,8 @@ import java.util.stream.Stream;
 public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBDingSubmit> implements TBDingSubmitService {
 public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBDingSubmit> implements TBDingSubmitService {
     @Resource
     @Resource
     private SysUserService sysUserService;
     private SysUserService sysUserService;
+    @Resource
+    private TBDingServiceImpl tbDingService;
 
 
     @Override
     @Override
     public IPage<DingSubmitResult> findDingSubmitPage(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
     public IPage<DingSubmitResult> findDingSubmitPage(Long serviceUnitId, String dingSubmitStatusDesc, Long submitUserId,
@@ -56,8 +58,12 @@ public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBD
 
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         DataPermissionDto dpr = sysUserService.buildUserDataPermission(requestUser.getId());
         DataPermissionDto dpr = sysUserService.buildUserDataPermission(requestUser.getId());
-        return this.baseMapper.findDingSubmitPage(new Page<>(pageNumber, pageSize), serviceUnitId, dingSubmitStatusEnumList,
+        IPage<DingSubmitResult> page = this.baseMapper.findDingSubmitPage(new Page<>(pageNumber, pageSize), serviceUnitId, dingSubmitStatusEnumList,
                 submitUserId, archivesName, supplierId, customName, sopNo, violationHoursLimit, dingExceptionLimit, remainLimit, exceptionLimit, dpr);
                 submitUserId, archivesName, supplierId, customName, sopNo, violationHoursLimit, dingExceptionLimit, remainLimit, exceptionLimit, dpr);
+        for (DingSubmitResult record : page.getRecords()) {
+            record.setRemainCount(tbDingService.findRemainCount(record.getUserId(), record.getSopNo()));
+        }
+        return page;
     }
     }
 
 
     @Override
     @Override
@@ -263,11 +269,11 @@ public class TBDingSubmitServiceImpl extends ServiceImpl<TBDingSubmitMapper, TBD
     @Override
     @Override
     public void agreeWithdraw(Long dingSubmitId) {
     public void agreeWithdraw(Long dingSubmitId) {
         TBDingSubmit tbDingSubmit = this.getById(dingSubmitId);
         TBDingSubmit tbDingSubmit = this.getById(dingSubmitId);
-        if (Objects.isNull(tbDingSubmit)){
+        if (Objects.isNull(tbDingSubmit)) {
             throw ExceptionResultEnum.ERROR.exception("未找到工时统计记录");
             throw ExceptionResultEnum.ERROR.exception("未找到工时统计记录");
         }
         }
         DingSubmitStatusEnum status = tbDingSubmit.getSubmitStatus();
         DingSubmitStatusEnum status = tbDingSubmit.getSubmitStatus();
-        if (!DingSubmitStatusEnum.APPLY_WITHDRAW.equals(status)){
+        if (!DingSubmitStatusEnum.APPLY_WITHDRAW.equals(status)) {
             throw ExceptionResultEnum.ERROR.exception("只有[申请撤回]状态的可以同意");
             throw ExceptionResultEnum.ERROR.exception("只有[申请撤回]状态的可以同意");
         }
         }
         tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.AGREE_WITHDRAW);
         tbDingSubmit.setSubmitStatus(DingSubmitStatusEnum.AGREE_WITHDRAW);

+ 2 - 1
sop-business/src/main/resources/mapper/TBDingMapper.xml

@@ -413,7 +413,8 @@
             sdg.sign_in_time AS signInTimeScope,
             sdg.sign_in_time AS signInTimeScope,
             sdg.sign_out_time AS signOutTimeScope,
             sdg.sign_out_time AS signOutTimeScope,
             sdg.reissue_card_count AS reissueCardCount,
             sdg.reissue_card_count AS reissueCardCount,
-            sdg.face_open AS faceOpen
+            sdg.face_open AS faceOpen,
+            sdg.id AS dingGroupId
         FROM
         FROM
             t_b_user_archives tbua
             t_b_user_archives tbua
                 LEFT JOIN
                 LEFT JOIN

+ 4 - 6
sop-business/src/main/resources/mapper/TBDingSubmitMapper.xml

@@ -16,6 +16,7 @@
                  sc.city AS city,
                  sc.city AS city,
                  tbd.approach_time AS approachTime,
                  tbd.approach_time AS approachTime,
                  tbd.departure_time AS departureTime,
                  tbd.departure_time AS departureTime,
+                 tbd.user_id AS userId,
                  tbua.id AS archivesId,
                  tbua.id AS archivesId,
                  tbua.code AS archivesCode,
                  tbua.code AS archivesCode,
                  tbua.name AS archivesName,
                  tbua.name AS archivesName,
@@ -30,7 +31,6 @@
                  tbd.work_hours AS workHours,
                  tbd.work_hours AS workHours,
                  tbd.violation_days AS violationDays,
                  tbd.violation_days AS violationDays,
                  tbd.ding_exception_count AS dingExceptionCount,
                  tbd.ding_exception_count AS dingExceptionCount,
-                 (sdg.reissue_card_count - IFNULL(sec.cnt,0)) AS remainCount,
                  IFNULL(ec.cnt,0) AS exceptionCount,
                  IFNULL(ec.cnt,0) AS exceptionCount,
                  tbds.id AS submitId,
                  tbds.id AS submitId,
                  IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
                  IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
@@ -87,8 +87,7 @@
                      LEFT JOIN t_b_user_archives_supplier tbuas ON tbuas.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_supplier ss ON tbuas.supplier_id = ss.id
                      LEFT JOIN sys_user su ON tbds.submit_user_id = su.id
                      LEFT JOIN sys_user su ON tbds.submit_user_id = su.id
-                     LEFT JOIN sys_ding_group sdg ON sdg.service_id = tbd.service_id
-                     AND sdg.supplier_id = ss.id) main
+                     ) main
         <where>
         <where>
             <if test="serviceUnitId != null">
             <if test="serviceUnitId != null">
                 AND main.serviceUnitId = #{serviceUnitId}
                 AND main.serviceUnitId = #{serviceUnitId}
@@ -164,6 +163,7 @@
                  sc.city AS city,
                  sc.city AS city,
                  tbd.approach_time AS approachTime,
                  tbd.approach_time AS approachTime,
                  tbd.departure_time AS departureTime,
                  tbd.departure_time AS departureTime,
+                 tbd.user_id AS userId,
                  tbua.id AS archivesId,
                  tbua.id AS archivesId,
                  tbua.code AS archivesCode,
                  tbua.code AS archivesCode,
                  tbua.name AS archivesName,
                  tbua.name AS archivesName,
@@ -178,7 +178,6 @@
                  tbd.work_hours AS workHours,
                  tbd.work_hours AS workHours,
                  tbd.violation_days AS violationDays,
                  tbd.violation_days AS violationDays,
                  tbd.ding_exception_count AS dingExceptionCount,
                  tbd.ding_exception_count AS dingExceptionCount,
-                 (sdg.reissue_card_count - IFNULL(sec.cnt,0)) AS remainCount,
                  IFNULL(ec.cnt,0) AS exceptionCount,
                  IFNULL(ec.cnt,0) AS exceptionCount,
                  tbds.id AS submitId,
                  tbds.id AS submitId,
                  IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
                  IFNULL(tbds.submit_status, 'WILL_SUBMIT') AS submitStatus,
@@ -235,8 +234,7 @@
                      LEFT JOIN t_b_user_archives_supplier tbuas ON tbuas.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_supplier ss ON tbuas.supplier_id = ss.id
                      LEFT JOIN sys_user su ON tbds.submit_user_id = su.id
                      LEFT JOIN sys_user su ON tbds.submit_user_id = su.id
-                     LEFT JOIN sys_ding_group sdg ON sdg.service_id = tbd.service_id
-                     AND sdg.supplier_id = ss.id) main
+                ) main
         <where>
         <where>
             <if test="serviceUnitId != null">
             <if test="serviceUnitId != null">
                 AND main.serviceUnitId = #{serviceUnitId}
                 AND main.serviceUnitId = #{serviceUnitId}