111
tjx
昨天 ab0994824a3b26a82c4333bf0b45315a944a25fc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package com.gs.dingtalk.service.impl;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gs.dingtalk.entity.QwCheckinData;
import com.gs.dingtalk.mapper.QwCheckinDataMapper;
import com.gs.dingtalk.service.QwCheckinDataService;
import com.gs.dingtalk.service.WorkWXService;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.io.IOException;
import java.util.Date;
import java.util.List;
 
/**
 * @description 针对表【QW_CHECKIN_DATA】企业微信打卡数据的数据库操作Service实现
 */
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class QwCheckinDataServiceImpl extends ServiceImpl<QwCheckinDataMapper, QwCheckinData>
        implements QwCheckinDataService {
 
    private static final Logger log = LoggerFactory.getLogger(QwCheckinDataServiceImpl.class);
 
    private final WorkWXService workWXService;
 
    @Override
    public QwCheckinData convertToEntity(WorkWXService.CheckinData checkinData) {
        if (checkinData == null) {
            return null;
        }
 
        QwCheckinData entity = new QwCheckinData();
        entity.setUserid(checkinData.getUserid());
        entity.setGroupname(checkinData.getGroupname());
        entity.setCheckinType(checkinData.getCheckinType());
        entity.setExceptionType(checkinData.getExceptionType());
        entity.setCheckinTime(checkinData.getCheckinTime());
        entity.setLocationTitle(checkinData.getLocationTitle());
        entity.setLocationDetail(checkinData.getLocationDetail());
        entity.setWifiname(checkinData.getWifiname());
        entity.setNotes(checkinData.getNotes());
        entity.setWifimac(checkinData.getWifimac());
        entity.setDeviceid(checkinData.getDeviceid());
 
        // 转换Unix时间戳为Date
        if (checkinData.getCheckinTime() != null) {
            entity.setCheckinDate(new Date(checkinData.getCheckinTime() * 1000));
        }
        if (checkinData.getSchCheckinTime() != null) {
            entity.setSchCheckinTime(checkinData.getSchCheckinTime());
            entity.setSchCheckinDate(new Date(checkinData.getSchCheckinTime() * 1000));
        }
 
        // 转换经纬度(接口返回的是Double,需要转为Long存储)
        if (checkinData.getLat() != null) {
            entity.setLat(checkinData.getLat().longValue());
        }
        if (checkinData.getLng() != null) {
            entity.setLng(checkinData.getLng().longValue());
        }
 
        // 转换mediaids列表为逗号分隔的字符串
        if (checkinData.getMediaids() != null && !checkinData.getMediaids().isEmpty()) {
            entity.setMediaids(String.join(",", checkinData.getMediaids()));
        }
 
        // 转换groupid、scheduleId、timelineId
        if (checkinData.getGroupid() != null) {
            entity.setGroupid(checkinData.getGroupid().longValue());
        }
        if (checkinData.getScheduleId() != null) {
            entity.setScheduleId(checkinData.getScheduleId().longValue());
        }
        if (checkinData.getTimelineId() != null) {
            entity.setTimelineId(checkinData.getTimelineId().longValue());
        }
 
        entity.setCreateTime(new Date());
        return entity;
    }
 
    @Override
    public int saveCheckinDataBatch(List<WorkWXService.CheckinData> checkinDataList) {
        if (checkinDataList == null || checkinDataList.isEmpty()) {
            return 0;
        }
 
        int insertCount = 0;
        for (WorkWXService.CheckinData checkinData : checkinDataList) {
            // 检查是否已存在(根据userid、checkin_time、checkin_type判断)
            LambdaQueryWrapper<QwCheckinData> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(QwCheckinData::getUserid, checkinData.getUserid())
                    .eq(QwCheckinData::getCheckinTime, checkinData.getCheckinTime())
                    .eq(QwCheckinData::getCheckinType, checkinData.getCheckinType());
 
            if (this.count(queryWrapper) == 0) {
                QwCheckinData entity = convertToEntity(checkinData);
                this.save(entity);
                insertCount++;
            }
        }
 
        log.info("批量保存打卡数据完成,总数: {}, 新增: {}, 跳过(已存在): {}",
                checkinDataList.size(), insertCount, checkinDataList.size() - insertCount);
        return insertCount;
    }
 
    @Override
    public int syncCheckinData(long startTime, long endTime) throws IOException {
        log.info("开始同步打卡数据,时间范围: {} - {}", new Date(startTime * 1000), new Date(endTime * 1000));
 
        List<WorkWXService.CheckinData> checkinDataList = workWXService.getCheckinDataByQwStaff(startTime, endTime);
 
        if (checkinDataList == null || checkinDataList.isEmpty()) {
            log.info("未获取到打卡数据");
            return 0;
        }
 
        log.info("获取到打卡数据 {} 条,开始保存到数据库", checkinDataList.size());
        return saveCheckinDataBatch(checkinDataList);
    }
 
    @Override
    public int syncYesterdayCheckinData() throws IOException {
        long currentTime = System.currentTimeMillis() / 1000;
        long oneDaySeconds = 86400;
 
        // 昨天开始时间(00:00:00)
        long startTime = ((currentTime / oneDaySeconds) - 1) * oneDaySeconds;
        // 昨天结束时间(23:59:59)
        long endTime = startTime + oneDaySeconds - 1;
 
        log.info("同步昨天打卡数据,时间范围: {} - {}", new Date(startTime * 1000), new Date(endTime * 1000));
        return syncCheckinData(startTime, endTime);
    }
}