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.QwCheckinDayData; import com.gs.dingtalk.mapper.QwCheckinDayDataMapper; import com.gs.dingtalk.service.QwCheckinDayDataService; 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 QwCheckinDayDataServiceImpl extends ServiceImpl implements QwCheckinDayDataService { private static final Logger log = LoggerFactory.getLogger(QwCheckinDayDataServiceImpl.class); private final WorkWXService workWXService; @Override public QwCheckinDayData convertToEntity(WorkWXService.CheckinDayData dayData) { if (dayData == null) { return null; } QwCheckinDayData entity = new QwCheckinDayData(); // 基础信息 WorkWXService.BaseInfo baseInfo = dayData.getBaseInfo(); if (baseInfo != null) { entity.setReportDate(baseInfo.getDate()); if (baseInfo.getDate() != null) { entity.setReportDatetime(new Date(baseInfo.getDate() * 1000)); } entity.setAcctid(baseInfo.getAcctid()); entity.setName(baseInfo.getName()); entity.setNameEx(baseInfo.getNameEx()); entity.setDepartsName(baseInfo.getDepartsName()); entity.setRecordType(baseInfo.getRecordType()); entity.setDayType(baseInfo.getDayType()); // 规则信息 WorkWXService.RuleInfo ruleInfo = baseInfo.getRuleInfo(); if (ruleInfo != null) { entity.setGroupid(ruleInfo.getGroupid()); entity.setGroupname(ruleInfo.getGroupname()); entity.setScheduleid(ruleInfo.getScheduleid()); entity.setSchedulename(ruleInfo.getSchedulename()); } } // 汇总信息 WorkWXService.SummaryInfo summaryInfo = dayData.getSummaryInfo(); if (summaryInfo != null) { entity.setCheckinCount(summaryInfo.getCheckinCount()); entity.setRegularWorkSec(summaryInfo.getRegularWorkSec()); entity.setStandardWorkSec(summaryInfo.getStandardWorkSec()); entity.setEarliestTime(summaryInfo.getEarliestTime()); entity.setLastestTime(summaryInfo.getLastestTime()); } // 异常信息 - 初始化默认值 entity.setLateCount(0); entity.setLateDuration(0); entity.setEarlyLeaveCount(0); entity.setEarlyLeaveDuration(0); entity.setAbsentCount(0); entity.setAbsenteeismCount(0); entity.setAbsenteeismDuration(0); entity.setLocationExCount(0); entity.setDeviceExCount(0); // 解析异常信息 List exceptionInfos = dayData.getExceptionInfos(); if (exceptionInfos != null && !exceptionInfos.isEmpty()) { for (WorkWXService.ExceptionInfo ex : exceptionInfos) { if (ex.getException() == null) continue; switch (ex.getException()) { case 1: // 迟到 entity.setLateCount(ex.getCount() != null ? ex.getCount() : 0); entity.setLateDuration(ex.getDuration() != null ? ex.getDuration() : 0); break; case 2: // 早退 entity.setEarlyLeaveCount(ex.getCount() != null ? ex.getCount() : 0); entity.setEarlyLeaveDuration(ex.getDuration() != null ? ex.getDuration() : 0); break; case 3: // 缺卡 entity.setAbsentCount(ex.getCount() != null ? ex.getCount() : 0); break; case 4: // 旷工 entity.setAbsenteeismCount(ex.getCount() != null ? ex.getCount() : 0); entity.setAbsenteeismDuration(ex.getDuration() != null ? ex.getDuration() : 0); break; case 5: // 地点异常 entity.setLocationExCount(ex.getCount() != null ? ex.getCount() : 0); break; case 6: // 设备异常 entity.setDeviceExCount(ex.getCount() != null ? ex.getCount() : 0); break; } } } // 加班信息 entity.setOtStatus(0); entity.setOtDuration(0); WorkWXService.OtInfo otInfo = dayData.getOtInfo(); if (otInfo != null) { entity.setOtStatus(otInfo.getOtStatus() != null ? otInfo.getOtStatus() : 0); entity.setOtDuration(otInfo.getOtDuration() != null ? otInfo.getOtDuration() : 0); } entity.setCreateTime(new Date()); return entity; } @Override public int saveDayDataBatch(List dayDataList) { if (dayDataList == null || dayDataList.isEmpty()) { return 0; } int insertCount = 0; for (WorkWXService.CheckinDayData dayData : dayDataList) { QwCheckinDayData entity = convertToEntity(dayData); if (entity == null || entity.getAcctid() == null || entity.getReportDate() == null) { continue; } // 检查是否已存在(按acctid + report_date去重) LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(QwCheckinDayData::getAcctid, entity.getAcctid()) .eq(QwCheckinDayData::getReportDate, entity.getReportDate()); QwCheckinDayData existing = this.getOne(wrapper); if (existing != null) { // 已存在则更新 entity.setId(existing.getId()); this.updateById(entity); log.debug("更新打卡日报数据: acctid={}, date={}", entity.getAcctid(), entity.getReportDatetime()); } else { // 不存在则插入 this.save(entity); insertCount++; log.debug("新增打卡日报数据: acctid={}, date={}", entity.getAcctid(), entity.getReportDatetime()); } } log.info("打卡日报数据保存完成,新增: {}, 总处理: {}", insertCount, dayDataList.size()); return insertCount; } @Override public int syncDayData(long date) throws IOException { List dayDataList = workWXService.getCheckinDayDataByQwStaff(date, date); return saveDayDataBatch(dayDataList); } @Override public int syncYesterdayDayData() throws IOException { long currentTime = System.currentTimeMillis() / 1000; long oneDaySeconds = 86400; long yesterdayStart = ((currentTime / oneDaySeconds) - 1) * oneDaySeconds; log.info("开始同步昨天({})的打卡日报数据", new Date(yesterdayStart * 1000)); return syncDayData(yesterdayStart); } }