tjx
11 小时以前 aba1ce5635af560d69b4e3adcf6ecdd025cea8fb
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
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.QwHardwareCheckinData;
import com.gs.dingtalk.mapper.QwHardwareCheckinDataMapper;
import com.gs.dingtalk.service.QwHardwareCheckinDataService;
import com.gs.dingtalk.service.WorkWXService;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
 
import java.io.IOException;
import java.util.Date;
import java.util.List;
 
/**
 * 企业微信设备打卡数据Service实现
 */
@Service
@RequiredArgsConstructor
public class QwHardwareCheckinDataServiceImpl extends ServiceImpl<QwHardwareCheckinDataMapper, QwHardwareCheckinData>
        implements QwHardwareCheckinDataService {
 
    private static final Logger log = LoggerFactory.getLogger(QwHardwareCheckinDataServiceImpl.class);
 
    private final WorkWXService workWXService;
 
    @Override
    public QwHardwareCheckinData convertToEntity(WorkWXService.HardwareCheckinData data) {
        if (data == null) {
            return null;
        }
 
        QwHardwareCheckinData entity = new QwHardwareCheckinData();
        entity.setUserid(data.getUserid());
        entity.setCheckinTime(data.getCheckinTime());
        if (data.getCheckinTime() != null) {
            entity.setCheckinDatetime(new Date(data.getCheckinTime() * 1000));
        }
        entity.setDeviceSn(data.getDeviceSn());
        entity.setDeviceName(data.getDeviceName());
        entity.setCreateTime(new Date());
 
        return entity;
    }
 
    @Override
    public int saveHardwareDataBatch(List<WorkWXService.HardwareCheckinData> dataList) {
        if (dataList == null || dataList.isEmpty()) {
            return 0;
        }
 
        int insertCount = 0;
        for (WorkWXService.HardwareCheckinData data : dataList) {
            QwHardwareCheckinData entity = convertToEntity(data);
            if (entity == null || entity.getUserid() == null || entity.getCheckinTime() == null) {
                continue;
            }
 
            // 检查是否已存在(按userid + checkin_time + device_sn去重)
            LambdaQueryWrapper<QwHardwareCheckinData> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(QwHardwareCheckinData::getUserid, entity.getUserid())
                    .eq(QwHardwareCheckinData::getCheckinTime, entity.getCheckinTime())
                    .eq(QwHardwareCheckinData::getDeviceSn, entity.getDeviceSn());
 
            QwHardwareCheckinData existing = this.getOne(wrapper);
            if (existing != null) {
                // 已存在则更新
                entity.setId(existing.getId());
                this.updateById(entity);
                log.debug("更新设备打卡数据: userid={}, time={}, device={}",
                        entity.getUserid(), entity.getCheckinDatetime(), entity.getDeviceSn());
            } else {
                // 不存在则插入
                this.save(entity);
                insertCount++;
                log.debug("新增设备打卡数据: userid={}, time={}, device={}",
                        entity.getUserid(), entity.getCheckinDatetime(), entity.getDeviceSn());
            }
        }
 
        log.info("设备打卡数据保存完成,新增: {}, 总处理: {}", insertCount, dataList.size());
        return insertCount;
    }
 
    @Override
    public int syncHardwareData(long startTime, long endTime) throws IOException {
        List<WorkWXService.HardwareCheckinData> dataList = workWXService.getHardwareCheckinDataByQwStaff(startTime, endTime);
        return saveHardwareDataBatch(dataList);
    }
 
    @Override
    public int syncYesterdayHardwareData() throws IOException {
        long currentTime = System.currentTimeMillis() / 1000;
        long oneDaySeconds = 86400;
        // 昨天0点
        long yesterdayStart = ((currentTime / oneDaySeconds) - 1) * oneDaySeconds;
        // 昨天23:59:59
        long yesterdayEnd = yesterdayStart + oneDaySeconds - 1;
 
        log.info("开始同步昨天({} ~ {})的设备打卡数据",
                new Date(yesterdayStart * 1000), new Date(yesterdayEnd * 1000));
        return syncHardwareData(yesterdayStart, yesterdayEnd);
    }
}