| src/main/java/com/gs/dingtalk/entity/QwCheckinData.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/dingtalk/mapper/QwCheckinDataMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/dingtalk/service/QwCheckinDataService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/dingtalk/service/impl/QwCheckinDataServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/QwCheckinDataMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/gs/dingtalk/entity/QwCheckinData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,130 @@ package com.gs.dingtalk.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * ä¼ä¸å¾®ä¿¡æå¡æ°æ® * @TableName QW_CHECKIN_DATA */ @TableName(value = "QW_CHECKIN_DATA") @Data @KeySequence(value = "SEQ_QW_CHECKIN_DATA", dbType = DbType.ORACLE) public class QwCheckinData implements Serializable { @TableField(exist = false) private static final long serialVersionUID = 1L; /** * 主é®ID */ @TableId private Long id; /** * ç¨æ·id */ private String userid; /** * æå¡è§ååç§° */ private String groupname; /** * æå¡ç±»åï¼ä¸çæå¡ï¼ä¸çæå¡ï¼å¤åºæå¡ï¼ä» è®°å½æå¡æ¶é´åä½ç½® */ private String checkinType; /** * å¼å¸¸ç±»åï¼æ¶é´å¼å¸¸ï¼å°ç¹å¼å¸¸ï¼æªæå¡ï¼wifiå¼å¸¸ï¼é常ç¨è®¾å¤ï¼å¤ä¸ªå¼å¸¸ä»¥åå·é´éï¼ */ private String exceptionType; /** * æå¡æ¶é´ï¼Unixæ¶é´æ³ï¼ */ private Long checkinTime; /** * æå¡æ¶é´ï¼è½¬æ¢åçæ¥ææ¶é´ï¼ */ private Date checkinDate; /** * æå¡å°ç¹title */ private String locationTitle; /** * æå¡å°ç¹è¯¦æ */ private String locationDetail; /** * æå¡wifiåç§° */ private String wifiname; /** * æå¡å¤æ³¨ */ private String notes; /** * æå¡çMACå°å/bssid */ private String wifimac; /** * æå¡çéä»¶media_idï¼å¤ä¸ªä»¥éå·åéï¼ */ private String mediaids; /** * ä½ç½®æå¡å°ç¹çº¬åº¦ï¼å®é 纬度ç1000000åï¼GCJ-02åæ ç³»ï¼ */ private Long lat; /** * ä½ç½®æå¡å°ç¹ç»åº¦ï¼å®é ç»åº¦ç1000000åï¼GCJ-02åæ ç³»ï¼ */ private Long lng; /** * æå¡è®¾å¤id */ private String deviceid; /** * æ åæå¡æ¶é´ï¼Unixæ¶é´æ³ï¼ */ private Long schCheckinTime; /** * æ åæå¡æ¶é´ï¼è½¬æ¢åçæ¥ææ¶é´ï¼ */ private Date schCheckinDate; /** * è§åid */ private Long groupid; /** * çæ¬¡id */ private Long scheduleId; /** * æ¶æ®µid */ private Long timelineId; /** * å建æ¶é´ */ private Date createTime; } src/main/java/com/gs/dingtalk/mapper/QwCheckinDataMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.gs.dingtalk.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gs.dingtalk.entity.QwCheckinData; /** * @description é对表ãQW_CHECKIN_DATAãä¼ä¸å¾®ä¿¡æå¡æ°æ®çæ°æ®åºæä½Mapper * @Entity com.gs.dingtalk.entity.QwCheckinData */ public interface QwCheckinDataMapper extends BaseMapper<QwCheckinData> { } src/main/java/com/gs/dingtalk/service/QwCheckinDataService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ package com.gs.dingtalk.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gs.dingtalk.entity.QwCheckinData; import java.io.IOException; import java.util.List; /** * @description é对表ãQW_CHECKIN_DATAãä¼ä¸å¾®ä¿¡æå¡æ°æ®çæ°æ®åºæä½Service */ public interface QwCheckinDataService extends IService<QwCheckinData> { /** * å°CheckinData转æ¢ä¸ºQwCheckinDataå®ä½ * * @param checkinData ä¼ä¸å¾®ä¿¡æå¡æ°æ® * @return QwCheckinDataå®ä½ */ QwCheckinData convertToEntity(WorkWXService.CheckinData checkinData); /** * æ¹éä¿åæå¡æ°æ®ï¼èªå¨å»éï¼ * * @param checkinDataList æå¡æ°æ®å表 * @return æ°å¢è®°å½æ° */ int saveCheckinDataBatch(List<WorkWXService.CheckinData> checkinDataList); /** * 忥æå®æ¶é´èå´å çæå¡æ°æ®å°æ°æ®åº * * @param startTime å¼å§æ¶é´ï¼Unixæ¶é´æ³ï¼ * @param endTime ç»ææ¶é´ï¼Unixæ¶é´æ³ï¼ * @return æ°å¢è®°å½æ° * @throws IOException è·åæå¡æ°æ®å¼å¸¸ */ int syncCheckinData(long startTime, long endTime) throws IOException; /** * 忥æ¨å¤©çæå¡æ°æ®å°æ°æ®åº * * @return æ°å¢è®°å½æ° * @throws IOException è·åæå¡æ°æ®å¼å¸¸ */ int syncYesterdayCheckinData() throws IOException; } src/main/java/com/gs/dingtalk/service/impl/QwCheckinDataServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,144 @@ 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); } } src/main/resources/mapper/QwCheckinDataMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,7 @@ <?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.QwCheckinDataMapper"> </mapper> src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java
@@ -4,6 +4,7 @@ import com.gs.dingtalk.config.URLEncoder; import com.gs.dingtalk.entity.QwStaff; import com.gs.dingtalk.mapper.QwStaffMapper; import com.gs.dingtalk.service.QwCheckinDataService; import com.gs.dingtalk.service.SendDingtalkService; import com.gs.dingtalk.service.SimpleExample; import com.gs.dingtalk.service.VwCjScSjTsBbService; @@ -29,6 +30,9 @@ @Autowired private QwStaffMapper qwStaffMapper; @Autowired private QwCheckinDataService qwCheckinDataService; /** * æµè¯å¯¼åºçäº§æ°æ®å¹¶åéééæ¶æ¯ @@ -67,6 +71,68 @@ // 3. æ¥å£è¿åæå¤3000æ¡æå¡æ°æ® // 4. æ åæå¡æ¶é´åªå¯¹äºåºå®æçåèªå®ä¹æç两ç§ç±»åææ // 5. æ¥å£è°ç¨é¢çéå¶ä¸º600次/åéï¼å·²å¨Serviceå±å®ç°æ¹æ¬¡é´å»¶è¿ï¼ //æ¥å£è¿åçåå§æ°æ® //{ // "errcode":0, // "errmsg":"ok", // "checkindata": [{ // "userid" : "james", // "groupname" : "æå¡ä¸ç»", // "checkin_type" : "ä¸çæå¡", // "exception_type" : "å°ç¹å¼å¸¸", // "checkin_time" : 1492617610, // "location_title" : "便¾åº", // "location_detail" : "åå·çæé½å¸æ¦ä¾¯åºçå·å¤§é䏿®µ784å·éè¿", // "wifiname" : "åå ¬ä¸åº", // "notes" : "è·¯ä¸å µè½¦ï¼è¿å°äº5åé", // "wifimac" : "3c:46:d8:0c:7a:70", // "mediaids":["WWCISP_G8PYgRaOVHjXWUWFqchpBqqqUpGj0OyR9z6WTwhnMZGCPHxyviVstiv_2fTG8YOJq8L8zJT2T2OvTebANV-2MQ"], // "sch_checkin_time" : 1492617610, // "groupid" : 1, // "schedule_id" : 0, // "timeline_id" : 2 // },{ // "userid" : "paul", // "groupname" : "æå¡äºç»", // "checkin_type" : "å¤åºæå¡", // "exception_type" : "æ¶é´å¼å¸¸", // "checkin_time" : 1492617620, // "location_title" : "éåºåºå£å å·¥åº", // "location_detail" : "éåºå¸æ¸ååºéæ¸å¤§é101å·éæ¸å¤§é", // "wifiname" : "åå ¬å®¤äºåº", // "notes" : "", // "wifimac" : "3c:46:d8:0c:7a:71", // "mediaids":["WWCISP_G8PYgRaOVHjXWUWFqchpBqqqUpGj0OyR9z6WTwhnMZGCPHxyviVstiv_2fTG8YOJq8L8zJT2T2OvTebANV-2MQ"], // "lat": 30547645, // "lng": 104063236, // "deviceid":"E5FA89F6-3926-4972-BE4F-4A7ACF4701E2", // "sch_checkin_time" : 1492617610, // "groupid" : 2, // "schedule_id" : 3, // "timeline_id" : 1 // }] //} //checkindataçåæ®µè¯´æ //userid ç¨æ·id //groupname æå¡è§ååç§° //checkin_type æå¡ç±»åãå符串ï¼ç®åæï¼ä¸çæå¡ï¼ä¸çæå¡ï¼å¤åºæå¡ï¼ä» è®°å½æå¡æ¶é´åä½ç½® //exception_type å¼å¸¸ç±»åï¼å符串ï¼å æ¬ï¼æ¶é´å¼å¸¸ï¼å°ç¹å¼å¸¸ï¼æªæå¡ï¼wifiå¼å¸¸ï¼é常ç¨è®¾å¤ã妿æå¤ä¸ªå¼å¸¸ï¼ä»¥åå·é´é //checkin_time æå¡æ¶é´ãUnixæ¶é´æ³ //location_title æå¡å°ç¹title //location_detail æå¡å°ç¹è¯¦æ //wifiname æå¡wifiåç§° //notes æå¡å¤æ³¨ //wifimac æå¡çMACå°å/bssid //mediaids æå¡çéä»¶media_idï¼å¯ä½¿ç¨media/getè·åéä»¶ //lat ä½ç½®æå¡å°ç¹çº¬åº¦ï¼æ¯å®é 纬度ç1000000åï¼ä¸è ¾è®¯å°å¾ä¸è´éç¨GCJ-02åæ ç³»ç»æ å //lng ä½ç½®æå¡å°ç¹ç»åº¦ï¼æ¯å®é ç»åº¦ç1000000åï¼ä¸è ¾è®¯å°å¾ä¸è´éç¨GCJ-02åæ ç³»ç»æ å //deviceid æå¡è®¾å¤id //sch_checkin_time æ åæå¡æ¶é´ï¼ææ¤æ¬¡æå¡æ¶é´å¯¹åºçæ åä¸çæ¶é´ææ åä¸çæ¶é´ //groupid è§åidï¼è¡¨ç¤ºæå¡è®°å½æå±è§åçid //schedule_id çæ¬¡idï¼è¡¨ç¤ºæå¡è®°å½æå±è§åä¸ï¼æå±ç次çid //timeline_id æ¶æ®µidï¼è¡¨ç¤ºæå¡è®°å½æå±è§åä¸ï¼æä¸ç次ä¸çæä¸æ¶æ®µçidï¼å¦ä¸ä¸çæ¶é´ä¸º9:00-12:00ã13:00-18:00ççæ¬¡ä¸ï¼9:00-12:00ä¸ºå ¶ä¸ä¸ç»æ¶æ®µ try { long currentTime = System.currentTimeMillis() / 1000; @@ -110,6 +176,11 @@ ", å¼å¸¸ç±»å: " + data.getExceptionType() + ", å°ç¹: " + data.getLocationDetail()); }); // ä¿åå°æ°æ®åº System.out.println(" - å¼å§ä¿åå°æ°æ®åº..."); int insertCount = qwCheckinDataService.saveCheckinDataBatch(checkinDataList); System.out.println("â ä¿åå®æï¼æ°å¢è®°å½æ°: " + insertCount + ", è·³è¿(å·²åå¨): " + (checkinDataList.size() - insertCount)); } else { System.out.println("â è·åçæå¡æ°æ®ä¸ºç©ºï¼å¯è½QW_STAFFè¡¨æ æ°æ®ææ¶é´èå´å æ æå¡è®°å½ï¼"); }