1811872455@163.com 2 недель назад
Родитель
Сommit
b83f789c1f

+ 11 - 1
storlead-centre-api/src/main/java/com/storlead/centre/dispatch/AttendanceSignDispatchTask.java

@@ -31,6 +31,16 @@ public class AttendanceSignDispatchTask {
     public void syncSignData() throws ParseException {
         log.error("开始时间--"+new Date());
         log.info("oa company dept job user sync task starting ----");
-        attendanceSignRecordService.getSaveSignRecord();
+        try {
+            attendanceSignRecordService.getSaveSignRecord();
+        }catch (Exception e) {
+            log.error("----getSaveSignRecord------error-"+e);
+        }
+
+        try {
+            attendanceSignRecordService.getDelayedSign();
+        }catch (Exception e) {
+            log.error("----syncSignData------error-"+e);
+        }
     }
 }

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

@@ -1,14 +1,17 @@
 package com.storlead.centre.dispatch;
 
+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.AttendanceSignRecordEntity;
 import com.storlead.centre.entity.HrmschedulesignEntity;
 import com.storlead.centre.entity.HrmschedulesignRemindEntity;
+import com.storlead.centre.entity.SystemConfigItemEntity;
 import com.storlead.centre.service.AttendanceSignRecordService;
 import com.storlead.centre.service.HrmschedulesignRemindService;
 import com.storlead.centre.service.HrmschedulesignService;
+import com.storlead.centre.service.SystemConfigItemService;
 import com.storlead.centre.vo.SignDataConvert;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -37,6 +40,8 @@ public class SyncAttendanceSignToOaTask {
     private HrmschedulesignRemindService hrmschedulesignRemindService;
     @Resource
     private HrmschedulesignService hrmschedulesignService;
+    @Resource
+    private SystemConfigItemService systemConfigItemService;
 
     @Scheduled(cron ="0 */5 6-23 * * ? ")
     public void syncSignData() throws ParseException {
@@ -49,18 +54,29 @@ public class SyncAttendanceSignToOaTask {
             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 = new ArrayList<>();
+        List<HrmschedulesignEntity> hrmschedulesignsDb ;
         List<HrmschedulesignEntity> hrmschedulesigns = SignDataConvert.attendanceListToOaSignVoList(attendances);
         if (!CollectionUtils.isEmpty(hrmschedulesigns)) {
-            List<Long> bmd = Arrays.asList(408L);
             if (!CollectionUtils.isEmpty(bmd)) {
-                hrmschedulesignsDb = hrmschedulesigns.stream().filter(e ->bmd.contains(e.getUserid())).collect(Collectors.toList());
+                List<Long> finalBmd = bmd;
+                hrmschedulesignsDb = hrmschedulesigns.stream().filter(e -> finalBmd.contains(e.getUserid())).collect(Collectors.toList());
             } else {
                 hrmschedulesignsDb = hrmschedulesigns;
             }
@@ -69,12 +85,12 @@ public class SyncAttendanceSignToOaTask {
             }
         }
 
-        List<HrmschedulesignRemindEntity> hrmschedulesignremindsDb = new ArrayList<>();
+        List<HrmschedulesignRemindEntity> hrmschedulesignremindsDb ;
         List<HrmschedulesignRemindEntity> hrmschedulesignreminds = SignDataConvert.attendanceListToOaSignRemindVoList(attendances);
         if (!CollectionUtils.isEmpty(hrmschedulesignreminds)) {
-            List<Integer> bmd = Arrays.asList(408);
             if (!CollectionUtils.isEmpty(bmd)) {
-                hrmschedulesignremindsDb = hrmschedulesignreminds.stream().filter(e ->bmd.contains(e.getUserid())).collect(Collectors.toList());
+                List<Long> finalBmd = bmd;
+                hrmschedulesignremindsDb = hrmschedulesignreminds.stream().filter(e ->finalBmd.contains(e.getUserid())).collect(Collectors.toList());
             } else {
                 hrmschedulesignremindsDb = hrmschedulesignreminds;
             }
@@ -84,4 +100,6 @@ public class SyncAttendanceSignToOaTask {
         }
     }
 
+
+
 }

+ 1 - 0
storlead-centre-api/src/main/java/com/storlead/centre/dispatch/SyncOaBaseDataTask.java

@@ -8,6 +8,7 @@ import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.text.ParseException;
 
+
 /**
  * @program: storlead-centre-platform
  * @description:

+ 20 - 0
storlead-centre-service/src/main/java/com/storlead/centre/controller/AttendanceSignCompensateRecordController.java

@@ -0,0 +1,20 @@
+package com.storlead.centre.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 考勤补偿记录 前端控制器
+ * </p>
+ *
+ * @author chenkq
+ * @since 2026-01-15
+ */
+@RestController
+@RequestMapping("/attendance-sign-compensate-record-entity")
+public class AttendanceSignCompensateRecordController {
+
+}

+ 61 - 0
storlead-centre-service/src/main/java/com/storlead/centre/entity/AttendanceSignCompensateRecordEntity.java

@@ -0,0 +1,61 @@
+package com.storlead.centre.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.storlead.framework.mybatis.entity.SysBaseField;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 考勤补偿记录
+ * </p>
+ *
+ * @author chenkq
+ * @since 2026-01-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("attendance_sign_compensate_record")
+@ApiModel(value="AttendanceSignCompensateRecordEntity对象", description="考勤补偿记录")
+public class AttendanceSignCompensateRecordEntity extends SysBaseField {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "员工ID")
+    @TableField("user_id")
+    private Long userId;
+
+    @ApiModelProperty(value = "员工姓名(冗余)")
+    @TableField("user_name")
+    private String userName;
+
+    @ApiModelProperty(value = "0:上班卡,没下班卡,指定类型:")
+    @TableField("checkin_type")
+    private Integer checkinType;
+
+    @ApiModelProperty(value = "打卡日期(yyyy-MM-dd,用于查询与汇总)")
+    @TableField("checkin_date")
+    private LocalDate checkinDate;
+
+    @ApiModelProperty(value = "0:未处理,1:已处理")
+    @TableField("is_checkin")
+    private Integer isCheckin;
+
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    private String remark;
+
+
+}

+ 16 - 0
storlead-centre-service/src/main/java/com/storlead/centre/mapper/AttendanceSignCompensateRecordMapper.java

@@ -0,0 +1,16 @@
+package com.storlead.centre.mapper;
+
+import com.storlead.centre.entity.AttendanceSignCompensateRecordEntity;
+import com.storlead.framework.mybatis.mapper.MyBaseMapper;
+
+/**
+ * <p>
+ * 考勤补偿记录 Mapper 接口
+ * </p>
+ *
+ * @author chenkq
+ * @since 2026-01-15
+ */
+public interface AttendanceSignCompensateRecordMapper extends MyBaseMapper<AttendanceSignCompensateRecordEntity> {
+
+}

+ 37 - 0
storlead-centre-service/src/main/java/com/storlead/centre/mapper/xml/AttendanceSignCompensateRecordMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.storlead.centre.mapper.AttendanceSignCompensateRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.storlead.centre.entity.AttendanceSignCompensateRecordEntity">
+        <id column="id" property="id" />
+    <result column="sort" property="sort" />
+    <result column="create_time" property="createTime" />
+    <result column="update_by" property="updateBy" />
+    <result column="update_time" property="updateTime" />
+    <result column="is_delete" property="isDelete" />
+    <result column="enabled" property="enabled" />
+    <result column="create_by" property="createBy" />
+    <result column="owner_by" property="ownerBy" />
+        <result column="user_id" property="userId" />
+        <result column="user_name" property="userName" />
+        <result column="checkin_type" property="checkinType" />
+        <result column="checkin_date" property="checkinDate" />
+        <result column="is_checkin" property="isCheckin" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        sort,
+        create_time,
+        update_by,
+        update_time,
+        is_delete,
+        enabled,
+        create_by,
+        owner_by,
+        id, user_id, user_name, checkin_type, checkin_date, is_checkin, remark
+    </sql>
+
+</mapper>

+ 16 - 0
storlead-centre-service/src/main/java/com/storlead/centre/service/AttendanceSignCompensateRecordService.java

@@ -0,0 +1,16 @@
+package com.storlead.centre.service;
+
+import com.storlead.centre.entity.AttendanceSignCompensateRecordEntity;
+import com.storlead.framework.mybatis.service.MyBaseService;
+
+/**
+ * <p>
+ * 考勤补偿记录 服务类
+ * </p>
+ *
+ * @author chenkq
+ * @since 2026-01-15
+ */
+public interface AttendanceSignCompensateRecordService extends MyBaseService<AttendanceSignCompensateRecordEntity> {
+
+}

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

@@ -23,4 +23,7 @@ public interface AttendanceSignRecordService extends MyBaseService<AttendanceSig
     List<CheckinDataBO> getSaveSignRecord(List<String> wxUserIds,Integer opencheckindatatype,Long starttime,Long endtime);
 
     List<AttendanceSignRecordEntity> getSignSyncRecord();
+
+    void getDelayedSign();
+
 }

+ 20 - 0
storlead-centre-service/src/main/java/com/storlead/centre/service/impl/AttendanceSignCompensateRecordServiceImpl.java

@@ -0,0 +1,20 @@
+package com.storlead.centre.service.impl;
+
+import com.storlead.centre.entity.AttendanceSignCompensateRecordEntity;
+import com.storlead.centre.mapper.AttendanceSignCompensateRecordMapper;
+import com.storlead.centre.service.AttendanceSignCompensateRecordService;
+import com.storlead.framework.mybatis.service.impl.MyBaseServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 考勤补偿记录 服务实现类
+ * </p>
+ *
+ * @author chenkq
+ * @since 2026-01-15
+ */
+@Service
+public class AttendanceSignCompensateRecordServiceImpl extends MyBaseServiceImpl<AttendanceSignCompensateRecordMapper, AttendanceSignCompensateRecordEntity> implements AttendanceSignCompensateRecordService {
+
+}

+ 60 - 4
storlead-centre-service/src/main/java/com/storlead/centre/service/impl/AttendanceSignRecordServiceImpl.java

@@ -4,8 +4,11 @@ import cn.hutool.core.date.DateUtil;
 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.mapper.AttendanceSignRecordMapper;
+import com.storlead.centre.service.AttendanceSignCompensateRecordService;
 import com.storlead.centre.service.SystemConfigItemService;
 import com.storlead.framework.common.constant.CommonConstant;
 import com.storlead.framework.common.util.DateUtils;
@@ -22,15 +25,13 @@ import org.springframework.stereotype.Service;
 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.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -51,6 +52,9 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
     @Resource
     private SystemConfigItemService systemConfigItemService;
 
+    @Resource
+    private AttendanceSignCompensateRecordService signCompensateRecordService;
+
     @Resource
     private IUserService userService;
 
@@ -127,6 +131,56 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
         return checkinds;
     }
 
+    /**
+     * 获取指定考勤记录
+     */
+    @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;
+            }
+
+            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);
+        }
+
+    }
     /**
      * 获取需要同步的数据进行同步
      * @return
@@ -222,4 +276,6 @@ public class AttendanceSignRecordServiceImpl extends MyBaseServiceImpl<Attendanc
         LocalDateTime dateTime = timestampToLocalDateTime(1767840360L);
         log.error("---------"+dateTime);
     }
+
+    // 处理指定人员异常数据
 }

+ 37 - 0
storlead-centre-service/src/main/resources/mapper/AttendanceSignCompensateRecordMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.storlead.centre.mapper.AttendanceSignCompensateRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.storlead.centre.entity.AttendanceSignCompensateRecordEntity">
+        <id column="id" property="id" />
+    <result column="sort" property="sort" />
+    <result column="create_time" property="createTime" />
+    <result column="update_by" property="updateBy" />
+    <result column="update_time" property="updateTime" />
+    <result column="is_delete" property="isDelete" />
+    <result column="enabled" property="enabled" />
+    <result column="create_by" property="createBy" />
+    <result column="owner_by" property="ownerBy" />
+        <result column="user_id" property="userId" />
+        <result column="user_name" property="userName" />
+        <result column="checkin_type" property="checkinType" />
+        <result column="checkin_date" property="checkinDate" />
+        <result column="is_checkin" property="isCheckin" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        sort,
+        create_time,
+        update_by,
+        update_time,
+        is_delete,
+        enabled,
+        create_by,
+        owner_by,
+        id, user_id, user_name, checkin_type, checkin_date, is_checkin, remark
+    </sql>
+
+</mapper>