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 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 checkinDataList) { if (checkinDataList == null || checkinDataList.isEmpty()) { return 0; } int insertCount = 0; for (WorkWXService.CheckinData checkinData : checkinDataList) { // 检查是否已存在(根据userid、checkin_time、checkin_type判断) LambdaQueryWrapper 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 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); } }