111
tjx
14 小时以前 95e16a3a6877d104d61cb0f99321a31784fcceda
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
143
144
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
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
    @Transactional(rollbackFor = Exception.class)
    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
    @Transactional(rollbackFor = Exception.class)
    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
    @Transactional(rollbackFor = Exception.class)
    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);
    }
}