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