소스 검색

生产发版

1811872455@163.com 1 주 전
부모
커밋
588a98a9fe

+ 33 - 28
storlead-centre-api/src/main/java/com/storlead/centre/dispatch/AttendanceSignDispatchTask.java

@@ -10,6 +10,7 @@ import javax.annotation.Resource;
 import java.text.ParseException;
 import java.time.LocalTime;
 import java.util.Date;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * @program: storlead-centre-platform
@@ -25,6 +26,8 @@ public class AttendanceSignDispatchTask {
     @Resource
     private AttendanceSignRecordService attendanceSignRecordService;
 
+    private final ReentrantLock syncLock = new ReentrantLock();
+
     @Value("${environment}")
     private  String environment;
     /**
@@ -34,42 +37,44 @@ public class AttendanceSignDispatchTask {
     @Scheduled(cron ="0 * * * * ? ")
     public void syncSignData() throws ParseException {
 
-        log.error("environment---"+environment);
-        if(!"prod".equals(environment)) {
+        if (!syncLock.tryLock()) {
+            log.warn("syncSignData 正在执行中,本次调度跳过");
             return;
         }
-        LocalTime now = LocalTime.now();
+        try {
+            if(!"prod".equals(environment)) {
+                return;
+            }
+            LocalTime now = LocalTime.now();
 
-        // ===== 总时间窗:06:00 – 22:30 =====
-        if (now.isBefore(LocalTime.of(6, 0))
-                || now.isAfter(LocalTime.of(22, 30))) {
-            return;
-        }
+            // ===== 总时间窗:06:00 – 22:30 =====
+            if (now.isBefore(LocalTime.of(6, 0))
+                    || now.isAfter(LocalTime.of(22, 30))) {
+                return;
+            }
 
-        boolean morningHighFrequency =
-                (now.getHour() == 8 && now.getMinute() >= 30)
-                        || (now.getHour() == 9 && now.getMinute() <= 10);
+            boolean morningHighFrequency =
+                    (now.getHour() == 8 && now.getMinute() >= 30)
+                            || (now.getHour() == 9 && now.getMinute() <= 10);
 
-        boolean eveningHighFrequency =
-                (now.getHour() == 18)
-                        || (now.getHour() == 19 && now.getMinute() <= 40);
+            boolean eveningHighFrequency =
+                    (now.getHour() == 18)
+                            || (now.getHour() == 19 && now.getMinute() <= 40);
 
-        boolean highFrequency = morningHighFrequency || eveningHighFrequency;
-        // 非高频时间:只允许 5 分钟一次
-        if (!highFrequency && now.getMinute() % 5 != 0) {
-            return;
-        }
-        log.info("oa company dept job user sync task starting ----");
-        try {
-            attendanceSignRecordService.getSaveSignRecord();
-        }catch (Exception e) {
-            log.error("----getSaveSignRecord------error-"+e);
-        }
+            boolean highFrequency = morningHighFrequency || eveningHighFrequency;
+            // 非高频时间:只允许 5 分钟一次
+            if (!highFrequency && now.getMinute() % 5 != 0) {
+                return;
+            }
 
-        try {
+            attendanceSignRecordService.getSaveSignRecord();
             attendanceSignRecordService.getDelayedSign();
-        }catch (Exception e) {
-            log.error("----syncSignData------error-"+e);
+
+        } catch (Exception e) {
+            log.error("syncSignData error ----",e);
+        } finally {
+            // 👉 确保一定释放锁(防死锁)
+            syncLock.unlock();
         }
     }
 

+ 80 - 66
storlead-centre-api/src/main/java/com/storlead/centre/dispatch/SyncAttendanceSignToOaTask.java

@@ -24,6 +24,7 @@ import java.text.ParseException;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 /**
@@ -48,89 +49,102 @@ public class SyncAttendanceSignToOaTask {
     @Value("${environment}")
     private  String environment;
 
+    private final ReentrantLock syncLock = new ReentrantLock();
+
     @Scheduled(cron ="0 * * * * ? ")
-    public void syncSignData() throws ParseException {
-        log.error("environment---"+environment);
+    public void syncSignDataToOA() throws ParseException {
         if(!"prod".equals(environment)) {
             return;
         }
 
-        LocalTime now = LocalTime.now();
-        // ===== 总时间窗:06:00 – 22:30 =====
-        if (now.isBefore(LocalTime.of(6, 0))
-                || now.isAfter(LocalTime.of(22, 30))) {
+        if (!syncLock.tryLock()) {
+            log.warn("syncSignData 正在执行中,本次调度跳过");
             return;
         }
 
-        boolean morningHighFrequency =
-                (now.getHour() == 8 && now.getMinute() >= 30)
-                        || (now.getHour() == 9 && now.getMinute() <= 10);
+        try {
 
-        boolean eveningHighFrequency =
-                (now.getHour() == 18)
-                        || (now.getHour() == 19 && now.getMinute() <= 40);
+            LocalTime now = LocalTime.now();
+            // ===== 总时间窗:06:00 – 22:30 =====
+            if (now.isBefore(LocalTime.of(6, 0))
+                    || now.isAfter(LocalTime.of(22, 30))) {
+                return;
+            }
 
-        boolean highFrequency = morningHighFrequency || eveningHighFrequency;
-        // 非高频时间:只允许 5 分钟一次
-        if (!highFrequency && now.getMinute() % 5 != 0) {
-            return;
-        }
+            boolean morningHighFrequency =
+                    (now.getHour() == 8 && now.getMinute() >= 30)
+                            || (now.getHour() == 9 && now.getMinute() <= 10);
 
-        // 获取未同步的数据到
-        LambdaQueryWrapper<AttendanceSignRecordEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-        lambdaQueryWrapper.eq(AttendanceSignRecordEntity::getSyncOa,Integer.valueOf(0));
-        List<AttendanceSignRecordEntity> attendances = attendanceSignRecordService.list(lambdaQueryWrapper);
+            boolean eveningHighFrequency =
+                    (now.getHour() == 18)
+                            || (now.getHour() == 19 && now.getMinute() <= 40);
 
-        if (CollectionUtils.isEmpty(attendances)) {
-            return;
-        }
-        List<Long> ids = attendances.stream().map(AttendanceSignRecordEntity::getId).collect(Collectors.toList());
-        List<Long> bmd = new ArrayList<>();
-        SystemConfigItemEntity systemConfig =  systemConfigItemService.getSystemConfigItem("ATTENDANCE_SGIN_PRIORITY_USER_ID");
-        if (Objects.nonNull(systemConfig)) {
-           String values = systemConfig.getItemFormatValue();
-           if (StrUtil.isNotBlank(values)) {
-               bmd = Arrays.stream(values.split(","))
-                       .map(String::trim)        // 去空格,防止 " 1"
-                       .filter(s -> !s.isEmpty())// 防止空字符串
-                       .map(Long::valueOf)
-                       .collect(Collectors.toList());;
-           }
-        }
-        LambdaUpdateWrapper<AttendanceSignRecordEntity> oawp = new LambdaUpdateWrapper<>();
-        oawp.set(AttendanceSignRecordEntity::getSyncOa,Integer.valueOf(1));
-        oawp.in(AttendanceSignRecordEntity::getId,ids);
-        attendanceSignRecordService.update(oawp);
-        //同步OA数据
-        List<HrmschedulesignEntity> hrmschedulesignsDb ;
-        List<HrmschedulesignEntity> hrmschedulesigns = SignDataConvert.attendanceListToOaSignVoList(attendances);
-        if (!CollectionUtils.isEmpty(hrmschedulesigns)) {
-            if (!CollectionUtils.isEmpty(bmd)) {
-                List<Long> finalBmd = bmd;
-                hrmschedulesignsDb = hrmschedulesigns.stream().filter(e -> finalBmd.contains(e.getUserid())).collect(Collectors.toList());
-            } else {
-                hrmschedulesignsDb = hrmschedulesigns;
-            }
-            if (!CollectionUtils.isEmpty(hrmschedulesignsDb)) {
-                hrmschedulesignService.saveBatch(hrmschedulesignsDb);
+            boolean highFrequency = morningHighFrequency || eveningHighFrequency;
+            // 非高频时间:只允许 5 分钟一次
+            if (!highFrequency && now.getMinute() % 5 != 0) {
+                return;
             }
-        }
 
-        List<HrmschedulesignRemindEntity> hrmschedulesignremindsDb ;
-        List<HrmschedulesignRemindEntity> hrmschedulesignreminds = SignDataConvert.attendanceListToOaSignRemindVoList(attendances);
-        if (!CollectionUtils.isEmpty(hrmschedulesignreminds)) {
-            if (!CollectionUtils.isEmpty(bmd)) {
-                List<Long> finalBmd = bmd;
-                hrmschedulesignremindsDb = hrmschedulesignreminds.stream().filter(e ->finalBmd.contains(e.getUserid())).collect(Collectors.toList());
-            } else {
-                hrmschedulesignremindsDb = hrmschedulesignreminds;
+            // 获取未同步的数据到
+            LambdaQueryWrapper<AttendanceSignRecordEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(AttendanceSignRecordEntity::getSyncOa, Integer.valueOf(0));
+            List<AttendanceSignRecordEntity> attendances = attendanceSignRecordService.list(lambdaQueryWrapper);
+
+            if (CollectionUtils.isEmpty(attendances)) {
+                return;
             }
-            if (!CollectionUtils.isEmpty(hrmschedulesignremindsDb)) {
-                hrmschedulesignRemindService.saveBatch(hrmschedulesignremindsDb);
+            List<Long> ids = attendances.stream().map(AttendanceSignRecordEntity::getId).collect(Collectors.toList());
+            List<Long> bmd = new ArrayList<>();
+            SystemConfigItemEntity systemConfig = systemConfigItemService.getSystemConfigItem("ATTENDANCE_SGIN_PRIORITY_USER_ID");
+            if (Objects.nonNull(systemConfig)) {
+                String values = systemConfig.getItemFormatValue();
+                if (StrUtil.isNotBlank(values)) {
+                    bmd = Arrays.stream(values.split(","))
+                            .map(String::trim)        // 去空格,防止 " 1"
+                            .filter(s -> !s.isEmpty())// 防止空字符串
+                            .map(Long::valueOf)
+                            .collect(Collectors.toList());
+                    ;
+                }
             }
+            LambdaUpdateWrapper<AttendanceSignRecordEntity> oawp = new LambdaUpdateWrapper<>();
+            oawp.set(AttendanceSignRecordEntity::getSyncOa, Integer.valueOf(1));
+            oawp.in(AttendanceSignRecordEntity::getId, ids);
+            attendanceSignRecordService.update(oawp);
+            //同步OA数据
+            List<HrmschedulesignEntity> hrmschedulesignsDb;
+            List<HrmschedulesignEntity> hrmschedulesigns = SignDataConvert.attendanceListToOaSignVoList(attendances);
+            if (!CollectionUtils.isEmpty(hrmschedulesigns)) {
+                if (!CollectionUtils.isEmpty(bmd)) {
+                    List<Long> finalBmd = bmd;
+                    hrmschedulesignsDb = hrmschedulesigns.stream().filter(e -> finalBmd.contains(e.getUserid())).collect(Collectors.toList());
+                } else {
+                    hrmschedulesignsDb = hrmschedulesigns;
+                }
+                if (!CollectionUtils.isEmpty(hrmschedulesignsDb)) {
+                    hrmschedulesignService.saveBatch(hrmschedulesignsDb);
+                }
+            }
+
+            List<HrmschedulesignRemindEntity> hrmschedulesignremindsDb;
+            List<HrmschedulesignRemindEntity> hrmschedulesignreminds = SignDataConvert.attendanceListToOaSignRemindVoList(attendances);
+            if (!CollectionUtils.isEmpty(hrmschedulesignreminds)) {
+                if (!CollectionUtils.isEmpty(bmd)) {
+                    List<Long> finalBmd = bmd;
+                    hrmschedulesignremindsDb = hrmschedulesignreminds.stream().filter(e -> finalBmd.contains(e.getUserid())).collect(Collectors.toList());
+                } else {
+                    hrmschedulesignremindsDb = hrmschedulesignreminds;
+                }
+                if (!CollectionUtils.isEmpty(hrmschedulesignremindsDb)) {
+                    hrmschedulesignRemindService.saveBatch(hrmschedulesignremindsDb);
+                }
+            }
+        } catch (Exception e) {
+            log.error("syncSignDataToOA error ----",e);
+        } finally {
+            // 👉 确保一定释放锁(防死锁)
+            syncLock.unlock();
         }
     }
 
-
-
 }

+ 97 - 90
storlead-centre-service/src/main/java/com/storlead/centre/service/impl/AttendanceSignRecordServiceImpl.java

@@ -60,61 +60,64 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
 
     @Override
     public void getSaveSignRecord() {
-
-        LambdaQueryWrapper<UserEntity> lm = new LambdaQueryWrapper<>();
-        lm.isNotNull(UserEntity::getXworkUserId);
-        lm.ne(UserEntity::getXworkUserId,"");
-        lm.eq(UserEntity::getIsDelete,CommonConstant.DEL_FLAG_0);
-        lm.eq(UserEntity::getEnabled,1);
-        List<UserEntity> userEntities = userService.list(lm);
-        if (CollectionUtils.isEmpty(userEntities)) {
-            return;
-        }
-        Map<String, UserEntity> userMap = userEntities.stream()
-                .filter(u -> u.getXworkUserId() != null)
-                .collect(Collectors.toMap(
-                        UserEntity::getXworkUserId,
-                        userEntity -> userEntity,
-                        (oldVal, newVal) -> oldVal
-                ));
-        List<String> wxUserIds = userEntities.stream().map(UserEntity::getXworkUserId).collect(Collectors.toList());
-        List<CheckinDataBO> checkins = new ArrayList<>();
-
-        Long currentTime = System.currentTimeMillis() / 1000;
-        Long starttime =  systemConfigItemService.getCheckinDataTime();
-        Long endtime = currentTime;
-
-        int batchSize = 90;
-        for (int i = 0; i < wxUserIds.size(); i += batchSize) {
-            int end = Math.min(i + batchSize, wxUserIds.size());
-            List<String> subList = wxUserIds.subList(i, end);
-            List<CheckinDataBO> batchResult = getSaveSignRecord(subList,3,starttime,endtime);
-            if (batchResult != null && !batchResult.isEmpty()) {
-                checkins.addAll(batchResult);
+        try {
+            LambdaQueryWrapper<UserEntity> lm = new LambdaQueryWrapper<>();
+            lm.isNotNull(UserEntity::getXworkUserId);
+            lm.ne(UserEntity::getXworkUserId, "");
+            lm.eq(UserEntity::getIsDelete, CommonConstant.DEL_FLAG_0);
+            lm.eq(UserEntity::getEnabled, 1);
+            List<UserEntity> userEntities = userService.list(lm);
+            if (CollectionUtils.isEmpty(userEntities)) {
+                return;
+            }
+            Map<String, UserEntity> userMap = userEntities.stream()
+                    .filter(u -> u.getXworkUserId() != null)
+                    .collect(Collectors.toMap(
+                            UserEntity::getXworkUserId,
+                            userEntity -> userEntity,
+                            (oldVal, newVal) -> oldVal
+                    ));
+            List<String> wxUserIds = userEntities.stream().map(UserEntity::getXworkUserId).collect(Collectors.toList());
+            List<CheckinDataBO> checkins = new ArrayList<>();
+
+            Long currentTime = System.currentTimeMillis() / 1000;
+            Long starttime = systemConfigItemService.getCheckinDataTime();
+            Long endtime = currentTime;
+
+            int batchSize = 90;
+            for (int i = 0; i < wxUserIds.size(); i += batchSize) {
+                int end = Math.min(i + batchSize, wxUserIds.size());
+                List<String> subList = wxUserIds.subList(i, end);
+                List<CheckinDataBO> batchResult = getSaveSignRecord(subList, 3, starttime, endtime);
+                if (batchResult != null && !batchResult.isEmpty()) {
+                    checkins.addAll(batchResult);
+                }
             }
-        }
 
-        LocalDateTime dateTime = timestampToLocalDateTime(endtime);
-        String time = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-        log.error(endtime+"---------跑到了这里-----"+time);
-        systemConfigItemService.setCheckinDataTime(endtime);
-        if (CollectionUtils.isEmpty(checkins)) {
-            return;
-        }
-        List<AttendanceSignRecordEntity> signls = appPageInfoListToAppPageTreeVoList(checkins);
-        if (CollectionUtils.isEmpty(signls)) {
-            return ;
-        }
-        for (AttendanceSignRecordEntity signRecord : signls) {
-            UserEntity user = userMap.get(signRecord.getWxUserId());
-            if (Objects.nonNull(user)) {
-                signRecord.setUserId(user.getId());
-                signRecord.setUserName(user.getRealName());
-                signRecord.setDeptId(user.getDeptId());
+            LocalDateTime dateTime = timestampToLocalDateTime(endtime);
+            String time = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            log.error(endtime + "---------跑到了这里-----" + time);
+            systemConfigItemService.setCheckinDataTime(endtime);
+            if (CollectionUtils.isEmpty(checkins)) {
+                return;
+            }
+            List<AttendanceSignRecordEntity> signls = appPageInfoListToAppPageTreeVoList(checkins);
+            if (CollectionUtils.isEmpty(signls)) {
+                return;
             }
+            for (AttendanceSignRecordEntity signRecord : signls) {
+                UserEntity user = userMap.get(signRecord.getWxUserId());
+                if (Objects.nonNull(user)) {
+                    signRecord.setUserId(user.getId());
+                    signRecord.setUserName(user.getRealName());
+                    signRecord.setDeptId(user.getDeptId());
+                }
+            }
+            // 保存打卡记录
+            this.saveBatch(signls);
+        }catch (Exception e) {
+            log.error("getSaveSignRecord----error---",e);
         }
-        // 保存打卡记录
-        this.saveBatch(signls);
     }
     /**
      * 获取打卡信息
@@ -136,48 +139,52 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
      */
     @Override
     public void getDelayedSign() {
-        LambdaQueryWrapper<AttendanceSignCompensateRecordEntity> compensate = new LambdaQueryWrapper<>();
-        compensate.eq(AttendanceSignCompensateRecordEntity::getIsCheckin,Integer.valueOf(0));
-        compensate.eq(AttendanceSignCompensateRecordEntity::getIsDelete,CommonConstant.DEL_FLAG_0);
-        List<AttendanceSignCompensateRecordEntity>  attendanceSignls = signCompensateRecordService.list(compensate);
-        if (CollectionUtils.isEmpty(attendanceSignls)) {
-            return;
-        }
-
-        for (AttendanceSignCompensateRecordEntity attendanceSign : attendanceSignls) {
-            UserEntity user = userService.getById(attendanceSign.getId());
-            if (Objects.isNull(user) || StrUtil.isBlank(user.getXworkUserId())) {
-                continue;
-            }
-            List<String> subList = Arrays.asList(user.getXworkUserId());
-            LocalDate date =  attendanceSign.getCheckinDate();
-            ZoneId zoneId = ZoneId.of("Asia/Shanghai");
-            long starttime = date
-                    .atTime(0, 0, 0)
-                    .atZone(zoneId)
-                    .toEpochSecond();
-
-            long endtime = date
-                    .atTime(23, 59, 59)
-                    .atZone(zoneId)
-                    .toEpochSecond();
-
-            List<CheckinDataBO> batchResult = getSaveSignRecord(subList,3,starttime,endtime);
-            if (CollectionUtils.isEmpty(batchResult)) {
-                continue;
+        try {
+            LambdaQueryWrapper<AttendanceSignCompensateRecordEntity> compensate = new LambdaQueryWrapper<>();
+            compensate.eq(AttendanceSignCompensateRecordEntity::getIsCheckin, Integer.valueOf(0));
+            compensate.eq(AttendanceSignCompensateRecordEntity::getIsDelete, CommonConstant.DEL_FLAG_0);
+            List<AttendanceSignCompensateRecordEntity> attendanceSignls = signCompensateRecordService.list(compensate);
+            if (CollectionUtils.isEmpty(attendanceSignls)) {
+                return;
             }
 
-            List<AttendanceSignRecordEntity> signls = appPageInfoListToAppPageTreeVoList(batchResult);
-            if (CollectionUtils.isEmpty(signls)) {
-                return ;
+            for (AttendanceSignCompensateRecordEntity attendanceSign : attendanceSignls) {
+                UserEntity user = userService.getById(attendanceSign.getId());
+                if (Objects.isNull(user) || StrUtil.isBlank(user.getXworkUserId())) {
+                    continue;
+                }
+                List<String> subList = Arrays.asList(user.getXworkUserId());
+                LocalDate date = attendanceSign.getCheckinDate();
+                ZoneId zoneId = ZoneId.of("Asia/Shanghai");
+                long starttime = date
+                        .atTime(0, 0, 0)
+                        .atZone(zoneId)
+                        .toEpochSecond();
+
+                long endtime = date
+                        .atTime(23, 59, 59)
+                        .atZone(zoneId)
+                        .toEpochSecond();
+
+                List<CheckinDataBO> batchResult = getSaveSignRecord(subList, 3, starttime, endtime);
+                if (CollectionUtils.isEmpty(batchResult)) {
+                    continue;
+                }
+
+                List<AttendanceSignRecordEntity> signls = appPageInfoListToAppPageTreeVoList(batchResult);
+                if (CollectionUtils.isEmpty(signls)) {
+                    return;
+                }
+                // 保存打卡记录
+                this.saveBatch(signls);
+
+                LambdaUpdateWrapper<AttendanceSignCompensateRecordEntity> updateWrapper = new LambdaUpdateWrapper<>();
+                updateWrapper.eq(AttendanceSignCompensateRecordEntity::getId, attendanceSign.getId());
+                updateWrapper.set(AttendanceSignCompensateRecordEntity::getIsCheckin, Integer.valueOf(1));
+                signCompensateRecordService.update(updateWrapper);
             }
-            // 保存打卡记录
-            this.saveBatch(signls);
-
-            LambdaUpdateWrapper<AttendanceSignCompensateRecordEntity> updateWrapper = new LambdaUpdateWrapper<>();
-            updateWrapper.eq(AttendanceSignCompensateRecordEntity::getId,attendanceSign.getId());
-            updateWrapper.set(AttendanceSignCompensateRecordEntity::getIsCheckin,Integer.valueOf(1));
-            signCompensateRecordService.update(updateWrapper);
+        }catch (Exception e) {
+            log.error("----getDelayedSign------error-"+e);
         }
 
     }