1811872455@163.com 1 settimana fa
parent
commit
a8fe69c532

+ 2 - 0
storlead-centre-api/src/main/java/com/storlead/centre/dispatch/AttendanceSignDispatchTask.java

@@ -70,6 +70,8 @@ public class AttendanceSignDispatchTask {
 
             attendanceSignRecordService.getDelayedSign();
 
+            attendanceSignRecordService.syncSignDataToOA();
+
         } catch (Exception e) {
             log.error("syncSignData error ----",e);
         } finally {

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

@@ -49,102 +49,102 @@ public class SyncAttendanceSignToOaTask {
     @Value("${environment}")
     private  String environment;
 
-    private final ReentrantLock syncLock = new ReentrantLock();
-
-    @Scheduled(cron ="0 * * * * ? ")
-    public void syncSignDataToOA() throws ParseException {
-        if(!"prod".equals(environment)) {
-            return;
-        }
-
-        if (!syncLock.tryLock()) {
-            log.warn("syncSignData 正在执行中,本次调度跳过");
-            return;
-        }
-
-        try {
-
-            LocalTime now = LocalTime.now();
-            // ===== 总时间窗: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 eveningHighFrequency =
-                    (now.getHour() == 18)
-                            || (now.getHour() == 19 && now.getMinute() <= 40);
-
-            boolean highFrequency = morningHighFrequency || eveningHighFrequency;
-            // 非高频时间:只允许 5 分钟一次
-            if (!highFrequency && now.getMinute() % 5 != 0) {
-                return;
-            }
-
-            // 获取未同步的数据到
-            LambdaQueryWrapper<AttendanceSignRecordEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-            lambdaQueryWrapper.eq(AttendanceSignRecordEntity::getSyncOa, Integer.valueOf(0));
-            List<AttendanceSignRecordEntity> attendances = attendanceSignRecordService.list(lambdaQueryWrapper);
-
-            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);
-                }
-            }
-
-            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();
-        }
-    }
+//    private final ReentrantLock syncLock = new ReentrantLock();
+
+//    @Scheduled(cron ="0 * * * * ? ")
+//    public void syncSignDataToOA() throws ParseException {
+//        if(!"prod".equals(environment)) {
+//            return;
+//        }
+//
+//        if (!syncLock.tryLock()) {
+//            log.warn("syncSignData 正在执行中,本次调度跳过");
+//            return;
+//        }
+//
+//        try {
+//
+//            LocalTime now = LocalTime.now();
+//            // ===== 总时间窗: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 eveningHighFrequency =
+//                    (now.getHour() == 18)
+//                            || (now.getHour() == 19 && now.getMinute() <= 40);
+//
+//            boolean highFrequency = morningHighFrequency || eveningHighFrequency;
+//            // 非高频时间:只允许 5 分钟一次
+//            if (!highFrequency && now.getMinute() % 5 != 0) {
+//                return;
+//            }
+//
+//            // 获取未同步的数据到
+//            LambdaQueryWrapper<AttendanceSignRecordEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+//            lambdaQueryWrapper.eq(AttendanceSignRecordEntity::getSyncOa, Integer.valueOf(0));
+//            List<AttendanceSignRecordEntity> attendances = attendanceSignRecordService.list(lambdaQueryWrapper);
+//
+//            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);
+//                }
+//            }
+//
+//            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();
+//        }
+//    }
 
 }

+ 2 - 0
storlead-centre-service/src/main/java/com/storlead/centre/service/AttendanceSignRecordService.java

@@ -26,4 +26,6 @@ public interface AttendanceSignRecordService extends MyBaseService<AttendanceSig
 
     void getDelayedSign();
 
+
+    void syncSignDataToOA();
 }

+ 82 - 9
storlead-centre-service/src/main/java/com/storlead/centre/service/impl/AttendanceSignRecordServiceImpl.java

@@ -5,11 +5,10 @@ import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.storlead.centre.entity.AttendanceSignCompensateRecordEntity;
-import com.storlead.centre.entity.AttendanceSignRecordEntity;
+import com.storlead.centre.entity.*;
 import com.storlead.centre.mapper.AttendanceSignRecordMapper;
-import com.storlead.centre.service.AttendanceSignCompensateRecordService;
-import com.storlead.centre.service.SystemConfigItemService;
+import com.storlead.centre.service.*;
+import com.storlead.centre.vo.SignDataConvert;
 import com.storlead.framework.common.constant.CommonConstant;
 import com.storlead.framework.common.util.DateUtils;
 import com.storlead.user.pojo.entity.JobEntity;
@@ -17,7 +16,6 @@ import com.storlead.user.pojo.entity.UserEntity;
 import com.storlead.user.service.IUserService;
 import com.storlead.user.service.impl.UserServiceImpl;
 import com.storlead.wx.pojo.vo.CheckinDataBO;
-import com.storlead.centre.service.AttendanceSignRecordService;
 import com.storlead.framework.mybatis.service.impl.MyBaseServiceImpl;
 import com.storlead.wx.service.CorpWeChatService;
 import lombok.extern.log4j.Log4j2;
@@ -26,10 +24,7 @@ import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.lang.reflect.Array;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Function;
@@ -51,6 +46,12 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
     private CorpWeChatService corpWeChatService;
     @Resource
     private SystemConfigItemService systemConfigItemService;
+    @Resource
+    private AttendanceSignRecordService attendanceSignRecordService;
+    @Resource
+    private HrmschedulesignRemindService hrmschedulesignRemindService;
+    @Resource
+    private HrmschedulesignService hrmschedulesignService;
 
     @Resource
     private AttendanceSignCompensateRecordService signCompensateRecordService;
@@ -175,6 +176,14 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
                 if (CollectionUtils.isEmpty(signls)) {
                     return;
                 }
+
+                for (AttendanceSignRecordEntity signRecord : signls) {
+                    if (Objects.nonNull(user)) {
+                        signRecord.setUserId(user.getId());
+                        signRecord.setUserName(user.getRealName());
+                        signRecord.setDeptId(user.getDeptId());
+                    }
+                }
                 // 保存打卡记录
                 this.saveBatch(signls);
 
@@ -188,6 +197,70 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
         }
 
     }
+
+    @Override
+    public void syncSignDataToOA() {
+        try {
+
+            // 获取未同步的数据到
+            LambdaQueryWrapper<AttendanceSignRecordEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(AttendanceSignRecordEntity::getSyncOa, Integer.valueOf(0));
+            List<AttendanceSignRecordEntity> attendances = attendanceSignRecordService.list(lambdaQueryWrapper);
+
+            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);
+                }
+            }
+
+            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);
+        }
+    }
+
     /**
      * 获取需要同步的数据进行同步
      * @return

+ 105 - 0
storlead-centre-service/src/main/java/com/storlead/centre/vo/SignDataConvert.java

@@ -0,0 +1,105 @@
+package com.storlead.centre.vo;
+
+import com.alibaba.fastjson.JSON;
+import com.storlead.centre.entity.AttendanceSignRecordEntity;
+import com.storlead.centre.entity.HrmschedulesignEntity;
+import com.storlead.centre.entity.HrmschedulesignRemindEntity;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.util.CollectionUtils;
+
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @program: storlead-centre-platform
+ * @description:
+ * @author: chenkq
+ * @create: 2026-01-09 10:51
+ */
+@Log4j2
+public class SignDataConvert {
+
+    private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+    public static List<HrmschedulesignEntity> attendanceListToOaSignVoList(List<AttendanceSignRecordEntity> vals) {
+        if (CollectionUtils.isEmpty(vals)) {
+            return null;
+        }
+        List<HrmschedulesignEntity> departmentTrees = vals.stream().map(SignDataConvert::attendanceToOaSignVo).filter(obj -> !Objects.isNull(obj)).collect(Collectors.toList());
+        return departmentTrees;
+    }
+
+    public static HrmschedulesignEntity  attendanceToOaSignVo(AttendanceSignRecordEntity attendance) {
+        if (null == attendance) {
+            return null;
+        }
+        try {
+            HrmschedulesignEntity entity = new HrmschedulesignEntity();
+            entity.setUserid(attendance.getUserId());
+            // 1 签到,2:签退
+            if ("上班打卡".equals(attendance.getCheckinType())) {
+                entity.setSigntype("1");
+            } else if ("下班打卡".equals(attendance.getCheckinType())){
+                entity.setSigntype("2");
+            }
+            String checkData = attendance.getCheckinDate().format(formatter);
+            entity.setUsertype("1");
+            entity.setSigndate(checkData);
+            entity.setSigntime(attendance.getCheckinTime());
+            entity.setClientAddress(attendance.getLocationTitle());
+            entity.setIsincom("1");
+            if ("外出打卡".equals(attendance.getCheckinType())) {
+                entity.setSignfrom("Wechat_out");
+            } else {
+                entity.setSignfrom("Wechat");
+            }
+            entity.setLatitude(attendance.getLatitude());
+            entity.setLongitude(attendance.getLongitude());
+            entity.setAddr(attendance.getLocationTitle());
+            entity.setTimeZone("GMT+8");
+            entity.setBelongdate(checkData);
+            Map map = new HashMap();
+            map.put("deviceId",attendance.getDeviceId());
+            entity.setDeviceInfo(JSON.toJSONString(map));
+            return entity;
+        }catch (Exception e) {
+            return null;
+        }
+    }
+
+
+    public static List<HrmschedulesignRemindEntity> attendanceListToOaSignRemindVoList(List<AttendanceSignRecordEntity> vals) {
+        if (CollectionUtils.isEmpty(vals)) {
+            return null;
+        }
+        List<HrmschedulesignRemindEntity> departmentTrees = vals.stream().map(SignDataConvert::attendanceToOaSignRemindVo).filter(obj -> !Objects.isNull(obj)).collect(Collectors.toList());
+        return departmentTrees;
+    }
+
+    public static HrmschedulesignRemindEntity  attendanceToOaSignRemindVo(AttendanceSignRecordEntity attendance) {
+        if (null == attendance) {
+            return null;
+        }
+        try {
+            HrmschedulesignRemindEntity entity = new HrmschedulesignRemindEntity();
+            entity.setUserid(attendance.getUserId().intValue());
+            // 1 签到,2:签退
+            if ("上班打卡".equals(attendance.getCheckinType())) {
+                entity.setSigntype("1");
+            } else if ("下班打卡".equals(attendance.getCheckinType())){
+                entity.setSigntype("2");
+            }
+            String checkData = attendance.getCheckinDate().format(formatter);
+            entity.setSigndate(checkData);
+            entity.setSigntime(attendance.getCheckinTime());
+            entity.setBelongdate(checkData);
+            return entity;
+        }catch (Exception e) {
+            return null;
+        }
+    }
+}