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 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 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 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 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); } }