From 2e7cf0157390b2b89a4657a6a78c7147afc09ea8 Mon Sep 17 00:00:00 2001
From: tjx <t2856754968@163.com>
Date: 星期二, 25 十一月 2025 15:38:49 +0800
Subject: [PATCH] 新增企业微信的接口
---
src/main/java/com/gs/xky/service/WorkWXService.java | 101 +++++++++++++++++++++++++++++++++
src/test/java/com/gs/xky/XkyApplicationTests.java | 50 ++++++++++++++++
2 files changed, 151 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/gs/xky/service/WorkWXService.java b/src/main/java/com/gs/xky/service/WorkWXService.java
index 6aa3594..44996b2 100644
--- a/src/main/java/com/gs/xky/service/WorkWXService.java
+++ b/src/main/java/com/gs/xky/service/WorkWXService.java
@@ -11,6 +11,7 @@
import org.springframework.stereotype.Service;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -133,6 +134,77 @@
}
}
+ public List<CheckinData> getCheckinData(long startTime, long endTime, List<String> useridList) throws IOException {
+ String accessToken = getAccessToken();
+ String url = String.format("https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata?access_token=%s", accessToken);
+
+ List<CheckinData> allCheckinData = new ArrayList<>();
+
+ int batchSize = 100;
+ int totalUsers = useridList.size();
+ int batchCount = (totalUsers + batchSize - 1) / batchSize;
+
+ log.info("寮�濮嬭幏鍙栨墦鍗℃暟鎹紝鎬荤敤鎴锋暟: {}, 鍒嗘壒鏁�: {}, 鏃堕棿鑼冨洿: {} - {}", totalUsers, batchCount, startTime, endTime);
+
+ for (int i = 0; i < batchCount; i++) {
+ int fromIndex = i * batchSize;
+ int toIndex = Math.min((i + 1) * batchSize, totalUsers);
+
+ List<String> batchUserList = useridList.subList(fromIndex, toIndex);
+ log.info("姝e湪鑾峰彇绗� {}/{} 鎵规墦鍗℃暟鎹紝鐢ㄦ埛鏁�: {}", i + 1, batchCount, batchUserList.size());
+
+ Map<String, Object> requestBody = new HashMap<>();
+ requestBody.put("opencheckindatatype", 3);
+ requestBody.put("starttime", startTime);
+ requestBody.put("endtime", endTime);
+ requestBody.put("useridlist", batchUserList);
+
+ MediaType mediaType = MediaType.parse("application/json; charset=UTF-8");
+ String jsonBody = objectMapper.writeValueAsString(requestBody);
+ RequestBody body = RequestBody.create(mediaType, jsonBody);
+
+ Request request = new Request.Builder()
+ .url(url)
+ .post(body)
+ .addHeader("Content-Type", "application/json; charset=UTF-8")
+ .build();
+
+ try (Response response = client.newCall(request).execute()) {
+ if (!response.isSuccessful()) {
+ log.error("鑾峰彇鎵撳崱鏁版嵁澶辫触锛孒TTP鐘舵�佺爜: {}", response.code());
+ throw new IOException("鑾峰彇鎵撳崱鏁版嵁澶辫触: " + response.message());
+ }
+
+ String responseBody = response.body().string();
+
+ WorkWXCheckinResponse checkinResponse = objectMapper.readValue(responseBody, WorkWXCheckinResponse.class);
+
+ if (checkinResponse.getErrcode() != 0) {
+ log.error("鑾峰彇鎵撳崱鏁版嵁澶辫触锛岄敊璇爜: {}, 閿欒淇℃伅: {}",
+ checkinResponse.getErrcode(), checkinResponse.getErrmsg());
+ throw new IOException("鑾峰彇鎵撳崱鏁版嵁澶辫触: " + checkinResponse.getErrmsg());
+ }
+
+ if (checkinResponse.getCheckindata() != null) {
+ allCheckinData.addAll(checkinResponse.getCheckindata());
+ log.info("绗� {}/{} 鎵硅幏鍙栧埌鎵撳崱璁板綍鏁�: {}", i + 1, batchCount, checkinResponse.getCheckindata().size());
+ }
+ }
+
+ if (i < batchCount - 1) {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ log.warn("鎵规闂寸瓑寰呰涓柇");
+ }
+ }
+ }
+
+ log.info("鎵撳崱鏁版嵁鑾峰彇瀹屾垚锛屾�昏褰曟暟: {}", allCheckinData.size());
+ return allCheckinData;
+ }
+
@Data
private static class WorkWXTokenResponse {
private Integer errcode;
@@ -165,4 +237,33 @@
@JsonProperty("open_userid")
private String openUserid;
}
+
+ @Data
+ private static class WorkWXCheckinResponse {
+ private Integer errcode;
+ private String errmsg;
+ private List<CheckinData> checkindata;
+ }
+
+ @Data
+ public static class CheckinData {
+ private String userid;
+ private String groupname;
+ @JsonProperty("checkin_type")
+ private String checkinType;
+ @JsonProperty("exception_type")
+ private String exceptionType;
+ @JsonProperty("checkin_time")
+ private Long checkinTime;
+ @JsonProperty("location_title")
+ private String locationTitle;
+ @JsonProperty("location_detail")
+ private String locationDetail;
+ private String wifiname;
+ private String notes;
+ private String wifimac;
+ private String mediaids;
+ private Double lat;
+ private Double lng;
+ }
}
diff --git a/src/test/java/com/gs/xky/XkyApplicationTests.java b/src/test/java/com/gs/xky/XkyApplicationTests.java
index 8447194..8c68c97 100644
--- a/src/test/java/com/gs/xky/XkyApplicationTests.java
+++ b/src/test/java/com/gs/xky/XkyApplicationTests.java
@@ -7,6 +7,7 @@
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
@SpringBootTest
@@ -129,4 +130,53 @@
System.out.println("=== 娴嬭瘯缁撴潫 ===");
}
+
+ /**
+ * 娴嬭瘯鑾峰彇浼佷笟寰俊鎵撳崱鏁版嵁
+ * 鍔熻兘锛氳幏鍙栨寚瀹氭椂闂磋寖鍥村唴鐨勫憳宸ユ墦鍗¤褰�
+ */
+ @Test
+ void testGetCheckinData() {
+ System.out.println("=== 寮�濮嬫祴璇曡幏鍙栦紒涓氬井淇℃墦鍗℃暟鎹� ===");
+
+ try {
+ List<WorkWXService.WorkWXUser> userList = workWXService.getUserList();
+
+ if (userList == null || userList.isEmpty()) {
+ System.out.println("鉁� 鏈幏鍙栧埌鐢ㄦ埛鍒楄〃锛屾棤娉曠户缁祴璇�");
+ return;
+ }
+
+ List<String> useridList = new ArrayList<>();
+ userList.forEach(user -> useridList.add(user.getUserid()));
+
+ long endTime = System.currentTimeMillis() / 1000;
+ long startTime = endTime - 86400;
+
+ System.out.println(" - 鐢ㄦ埛鎬绘暟: " + useridList.size());
+ System.out.println(" - 寮�濮嬫椂闂�: " + new java.util.Date(startTime * 1000));
+ System.out.println(" - 缁撴潫鏃堕棿: " + new java.util.Date(endTime * 1000));
+
+ List<WorkWXService.CheckinData> checkinDataList = workWXService.getCheckinData(startTime, endTime, useridList);
+
+ if (checkinDataList != null && !checkinDataList.isEmpty()) {
+ System.out.println("鉁� 鎴愬姛鑾峰彇鎵撳崱鏁版嵁");
+ System.out.println(" - 鎵撳崱璁板綍鎬绘暟: " + checkinDataList.size());
+ System.out.println(" - 鍓�3鏉℃暟鎹�:");
+ checkinDataList.stream().limit(3).forEach(data -> {
+ System.out.println(" * userid: " + data.getUserid() +
+ ", 鎵撳崱鏃堕棿: " + new java.util.Date(data.getCheckinTime() * 1000) +
+ ", 鎵撳崱绫诲瀷: " + data.getCheckinType() +
+ ", 鍦扮偣: " + data.getLocationDetail());
+ });
+ } else {
+ System.out.println("鉁� 鑾峰彇鐨勬墦鍗℃暟鎹负绌�");
+ }
+ } catch (IOException e) {
+ System.out.println("鉁� 鑾峰彇鎵撳崱鏁版嵁澶辫触: " + e.getMessage());
+ e.printStackTrace();
+ }
+
+ System.out.println("=== 娴嬭瘯缁撴潫 ===");
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3