| src/main/java/com/gs/dingtalk/entity/QwCheckinDayData.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/dingtalk/mapper/QwCheckinDayDataMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/dingtalk/service/QwCheckinDayDataService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/dingtalk/service/impl/QwCheckinDayDataServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/QwCheckinDayDataMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/gs/dingtalk/entity/QwCheckinDayData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,170 @@ package com.gs.dingtalk.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * ä¼ä¸å¾®ä¿¡æå¡æ¥æ¥æ°æ® * @TableName QW_CHECKIN_DAY_DATA */ @TableName(value = "QW_CHECKIN_DAY_DATA") @Data @KeySequence(value = "SEQ_QW_CHECKIN_DAY_DATA", dbType = DbType.ORACLE) public class QwCheckinDayData implements Serializable { @TableField(exist = false) private static final long serialVersionUID = 1L; /** * 主é®ID */ @TableId private Long id; /** * æ¥æ¥æ¥æï¼Unixæ¶é´æ³ï¼ */ private Long reportDate; /** * æ¥æ¥æ¥æï¼è½¬æ¢åçæ¥æï¼ */ private Date reportDatetime; /** * ç¨æ·è´¦å·(userid) */ private String acctid; /** * åå·¥å§å */ private String name; /** * åå·¥å«å */ private String nameEx; /** * æå±é¨é¨ï¼å¤ä¸ªé¨é¨ä»¥åå·åéï¼ */ private String departsName; /** * è®°å½ç±»åï¼1-åºå®ä¸ä¸çï¼3-æç次ä¸ä¸çï¼4-èªç±ç¾å°ï¼5-å çï¼7-æ è§å */ private Integer recordType; /** * æ¥æ¥ç±»åï¼0-工使¥æ¥æ¥ï¼1-伿¯æ¥æ¥æ¥ */ private Integer dayType; /** * è§åID */ private Integer groupid; /** * è§ååç§° */ private String groupname; /** * çæ¬¡ID */ private Integer scheduleid; /** * çæ¬¡åç§° */ private String schedulename; /** * 彿¥æå¡æ¬¡æ° */ private Integer checkinCount; /** * 彿¥å®é 工使¶é¿ï¼ç§ï¼ */ private Integer regularWorkSec; /** * 彿¥æ å工使¶é¿ï¼ç§ï¼ */ private Integer standardWorkSec; /** * 彿¥ææ©æå¡æ¶é´ï¼è·0ç¹ç§æ°ï¼ */ private Integer earliestTime; /** * 彿¥æææå¡æ¶é´ï¼è·0ç¹ç§æ°ï¼ */ private Integer lastestTime; /** * è¿å°æ¬¡æ° */ private Integer lateCount; /** * è¿å°æ¶é¿ï¼ç§ï¼ */ private Integer lateDuration; /** * æ©éæ¬¡æ° */ private Integer earlyLeaveCount; /** * æ©éæ¶é¿ï¼ç§ï¼ */ private Integer earlyLeaveDuration; /** * ç¼ºå¡æ¬¡æ° */ private Integer absentCount; /** * æ·å·¥æ¬¡æ° */ private Integer absenteeismCount; /** * æ·å·¥æ¶é¿ï¼ç§ï¼ */ private Integer absenteeismDuration; /** * å°ç¹å¼å¸¸æ¬¡æ° */ private Integer locationExCount; /** * 设å¤å¼å¸¸æ¬¡æ° */ private Integer deviceExCount; /** * å çç¶æï¼0-æ å çï¼1-æ£å¸¸ï¼2-缺æ¶é¿ */ private Integer otStatus; /** * å çæ¶é¿ï¼ç§ï¼ */ private Integer otDuration; /** * å建æ¶é´ */ private Date createTime; } src/main/java/com/gs/dingtalk/mapper/QwCheckinDayDataMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.gs.dingtalk.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gs.dingtalk.entity.QwCheckinDayData; import org.apache.ibatis.annotations.Mapper; /** * ä¼ä¸å¾®ä¿¡æå¡æ¥æ¥æ°æ®Mapper */ @Mapper public interface QwCheckinDayDataMapper extends BaseMapper<QwCheckinDayData> { } src/main/java/com/gs/dingtalk/service/QwCheckinDayDataService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,46 @@ package com.gs.dingtalk.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gs.dingtalk.entity.QwCheckinDayData; import java.io.IOException; import java.util.List; /** * ä¼ä¸å¾®ä¿¡æå¡æ¥æ¥æ°æ®Service */ public interface QwCheckinDayDataService extends IService<QwCheckinDayData> { /** * å°CheckinDayData转æ¢ä¸ºQwCheckinDayDataå®ä½ * * @param dayData ä¼ä¸å¾®ä¿¡æå¡æ¥æ¥æ°æ® * @return QwCheckinDayDataå®ä½ */ QwCheckinDayData convertToEntity(WorkWXService.CheckinDayData dayData); /** * æ¹éä¿åæå¡æ¥æ¥æ°æ®ï¼èªå¨å»éï¼æacctid+report_dateï¼ * * @param dayDataList æå¡æ¥æ¥æ°æ®å表 * @return æ°å¢è®°å½æ° */ int saveDayDataBatch(List<WorkWXService.CheckinDayData> dayDataList); /** * 忥æå®æ¥æçæå¡æ¥æ¥æ°æ®å°æ°æ®åº * * @param date æ¥æï¼Unixæ¶é´æ³ï¼é为å½å¤©0ç¹ï¼ * @return æ°å¢è®°å½æ° * @throws IOException è·åæå¡æ¥æ¥æ°æ®å¼å¸¸ */ int syncDayData(long date) throws IOException; /** * 忥æ¨å¤©çæå¡æ¥æ¥æ°æ®å°æ°æ®åº * * @return æ°å¢è®°å½æ° * @throws IOException è·åæå¡æ¥æ¥æ°æ®å¼å¸¸ */ int syncYesterdayDayData() throws IOException; } src/main/java/com/gs/dingtalk/service/impl/QwCheckinDayDataServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,178 @@ 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<QwCheckinDayDataMapper, QwCheckinDayData> 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<WorkWXService.ExceptionInfo> 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<WorkWXService.CheckinDayData> 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<QwCheckinDayData> 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<WorkWXService.CheckinDayData> 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); } } src/main/resources/mapper/QwCheckinDayDataMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.gs.dingtalk.mapper.QwCheckinDayDataMapper"> </mapper> src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java
@@ -9,6 +9,7 @@ import com.gs.dingtalk.service.SimpleExample; import com.gs.dingtalk.service.VwCjScSjTsBbService; import com.gs.dingtalk.service.WorkWXService; import com.gs.dingtalk.service.QwCheckinDayDataService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -33,6 +34,9 @@ @Autowired private QwCheckinDataService qwCheckinDataService; @Autowired private QwCheckinDayDataService qwCheckinDayDataService; /** * æµè¯å¯¼åºçäº§æ°æ®å¹¶åéééæ¶æ¯ @@ -285,6 +289,11 @@ }); } }); // ä¿åå°æ°æ®åº System.out.println(" - å¼å§ä¿åæå¡æ¥æ¥æ°æ®å°æ°æ®åº..."); int insertCount = qwCheckinDayDataService.saveDayDataBatch(dayDataList); System.out.println("â ä¿åå®æï¼æ°å¢è®°å½æ°: " + insertCount + ", æ´æ°(å·²åå¨): " + (dayDataList.size() - insertCount)); } else { System.out.println("â è·åçæå¡æ¥æ¥æ°æ®ä¸ºç©º"); }