From 6b9657a5a68d7493a53a9958f08478e7e89881b9 Mon Sep 17 00:00:00 2001
From: tjx <t2856754968@163.com>
Date: 星期二, 23 十二月 2025 15:59:59 +0800
Subject: [PATCH] 111

---
 src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java |  244 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 239 insertions(+), 5 deletions(-)

diff --git a/src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java b/src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java
index e2ab79c..8e3997b 100644
--- a/src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java
+++ b/src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java
@@ -4,10 +4,12 @@
 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;
 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;
@@ -21,7 +23,6 @@
 class DeviceReceivingApplicationTests {
 
 
-
     @Autowired
     private VwCjScSjTsBbService vwCjScSjTsBbService;
 
@@ -30,6 +31,12 @@
 
     @Autowired
     private QwStaffMapper qwStaffMapper;
+
+    @Autowired
+    private QwCheckinDataService qwCheckinDataService;
+
+    @Autowired
+    private QwCheckinDayDataService qwCheckinDayDataService;
 
     /**
      * 娴嬭瘯瀵煎嚭鐢熶骇鏁版嵁骞跺彂閫侀拤閽夋秷鎭�
@@ -62,15 +69,41 @@
     void testGetCheckinDataByQwStaff() {
         System.out.println("=== 寮�濮嬫祴璇曢�氳繃QW_STAFF琛ㄨ幏鍙栨墦鍗℃暟鎹� ===");
 
+        // 浼佷笟寰俊鎵撳崱鎺ュ彛闄愬埗锛�
+        // 1. 鑾峰彇璁板綍鏃堕棿璺ㄥ害涓嶈秴杩�30澶�
+        // 2. 鐢ㄦ埛鍒楄〃涓嶈秴杩�100涓�傝嫢鐢ㄦ埛瓒呰繃100涓紝璇峰垎鎵硅幏鍙栵紙宸插湪Service灞傚疄鐜拌嚜鍔ㄥ垎鎵癸級
+        // 3. 鎺ュ彛杩斿洖鏈�澶�3000鏉℃墦鍗℃暟鎹�
+        // 4. 鏍囧噯鎵撳崱鏃堕棿鍙浜庡浐瀹氭帓鐝拰鑷畾涔夋帓鐝袱绉嶇被鍨嬫湁鏁�
+        // 5. 鎺ュ彛璋冪敤棰戠巼闄愬埗涓�600娆�/鍒嗛挓锛堝凡鍦⊿ervice灞傚疄鐜版壒娆¢棿寤惰繜锛�
+
         try {
             long currentTime = System.currentTimeMillis() / 1000;
             long oneDaySeconds = 86400;
+            long thirtyDaysSeconds = 30 * oneDaySeconds;
 
             long endTime = (currentTime / oneDaySeconds) * oneDaySeconds - 1;
             long startTime = endTime - oneDaySeconds + 1;
 
+            // 楠岃瘉鏃堕棿璺ㄥ害涓嶈秴杩�30澶�
+            long timeSpan = endTime - startTime;
+            if (timeSpan > thirtyDaysSeconds) {
+                System.out.println("鉁� 鏃堕棿璺ㄥ害瓒呰繃30澶╅檺鍒�: " + (timeSpan / oneDaySeconds) + "澶�");
+                return;
+            }
+
             System.out.println("  - 寮�濮嬫椂闂�: " + new java.util.Date(startTime * 1000));
             System.out.println("  - 缁撴潫鏃堕棿: " + new java.util.Date(endTime * 1000));
+            System.out.println("  - 鏃堕棿璺ㄥ害: " + (timeSpan / oneDaySeconds) + "澶� (闄愬埗: 鈮�30澶�)");
+
+            // 鑾峰彇鐢ㄦ埛鎬绘暟
+            long totalUsers = qwStaffMapper.selectCount(new LambdaQueryWrapper<QwStaff>()
+                    .isNotNull(QwStaff::getAccount)
+                    .ne(QwStaff::getAccount, ""));
+            System.out.println("  - QW_STAFF琛ㄧ敤鎴锋�绘暟: " + totalUsers);
+            if (totalUsers > 100) {
+                int batchCount = (int) ((totalUsers + 99) / 100);
+                System.out.println("  - 灏嗚嚜鍔ㄥ垎鎵瑰鐞�: " + batchCount + "鎵� (姣忔壒鈮�100鐢ㄦ埛)");
+            }
 
             List<WorkWXService.CheckinData> checkinDataList = workWXService.getCheckinDataByQwStaff(startTime, endTime);
 
@@ -85,6 +118,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琛ㄦ棤鏁版嵁鎴栨椂闂磋寖鍥村唴鏃犳墦鍗¤褰曪級");
             }
@@ -112,12 +150,26 @@
         try {
             long currentTime = System.currentTimeMillis() / 1000;
             long oneDaySeconds = 86400;
+            long thirtyDaysSeconds = 30 * oneDaySeconds;
 
-            long endTime = (currentTime / oneDaySeconds) * oneDaySeconds - 1;
-            long startTime = endTime - oneDaySeconds + 1;
+            // 鏄ㄥぉ缁撴潫鏃堕棿锛�23:59:59锛�
+            long yesterdayEnd = ((currentTime / oneDaySeconds) - 1) * oneDaySeconds + oneDaySeconds - 1;
+            // 20澶╁墠寮�濮嬫椂闂达紙00:00:00锛�
+            long twentyDaysAgoStart = yesterdayEnd - 20 * oneDaySeconds + 1;
 
-            System.out.println("  - 寮�濮嬫椂闂�: " + new java.util.Date(startTime * 1000));
-            System.out.println("  - 缁撴潫鏃堕棿: " + new java.util.Date(endTime * 1000));
+            long endTime = yesterdayEnd;
+            long startTime = twentyDaysAgoStart;
+
+            // 楠岃瘉鏃堕棿璺ㄥ害涓嶈秴杩�30澶�
+            long timeSpan = endTime - startTime;
+            if (timeSpan > thirtyDaysSeconds) {
+                System.out.println("鉁� 鏃堕棿璺ㄥ害瓒呰繃30澶╅檺鍒�: " + (timeSpan / oneDaySeconds) + "澶�");
+                return;
+            }
+
+            System.out.println("  - 寮�濮嬫椂闂�: " + new java.util.Date(startTime * 1000) + " (20澶╁墠)");
+            System.out.println("  - 缁撴潫鏃堕棿: " + new java.util.Date(endTime * 1000) + " (鏄ㄥぉ)");
+            System.out.println("  - 鏃堕棿璺ㄥ害: " + (timeSpan / oneDaySeconds) + "澶�");
 
             List<String> useridList = new java.util.ArrayList<>();
             useridList.add(qwStaff.getAccount());
@@ -188,4 +240,186 @@
         System.out.println("=== 娴嬭瘯缁撴潫 ===");
     }
 
+    /**
+     * 娴嬭瘯鑾峰彇鎵撳崱鏃ユ姤鏁版嵁
+     * 鎺ュ彛闄愬埗锛�100娆�/鍒嗛挓锛屾椂闂磋法搴︿笉瓒呰繃30澶�
+     */
+    @Test
+    void testGetCheckinDayData() {
+        System.out.println("=== 寮�濮嬫祴璇曡幏鍙栨墦鍗℃棩鎶ユ暟鎹� ===");
+
+        try {
+            long currentTime = System.currentTimeMillis() / 1000;
+            long oneDaySeconds = 86400;
+
+            // 鑾峰彇鏄ㄥぉ鐨勬棩鎶ユ暟鎹紙starttime鍜宔ndtime闇�瑕佹槸鍚屼竴澶╋級
+            long yesterdayStart = ((currentTime / oneDaySeconds) - 1) * oneDaySeconds;
+            long startTime = yesterdayStart;
+            long endTime = yesterdayStart;  // 鏃ユ姤鎺ュ彛starttime鍜宔ndtime闇�鐩稿悓
+
+            System.out.println("  - 鏌ヨ鏃ユ湡: " + new java.util.Date(startTime * 1000));
+
+            // 鑾峰彇鐢ㄦ埛鎬绘暟
+            long totalUsers = qwStaffMapper.selectCount(new LambdaQueryWrapper<QwStaff>()
+                    .isNotNull(QwStaff::getAccount)
+                    .ne(QwStaff::getAccount, ""));
+            System.out.println("  - QW_STAFF琛ㄧ敤鎴锋�绘暟: " + totalUsers);
+
+            List<WorkWXService.CheckinDayData> dayDataList = workWXService.getCheckinDayDataByQwStaff(startTime, endTime);
+
+            if (dayDataList != null && !dayDataList.isEmpty()) {
+                System.out.println("鉁� 鎴愬姛鑾峰彇鎵撳崱鏃ユ姤鏁版嵁");
+                System.out.println("  - 鏃ユ姤璁板綍鎬绘暟: " + dayDataList.size());
+                System.out.println("  - 鍓�5鏉℃暟鎹�:");
+                dayDataList.stream().limit(5).forEach(data -> {
+                    WorkWXService.BaseInfo baseInfo = data.getBaseInfo();
+                    WorkWXService.SummaryInfo summaryInfo = data.getSummaryInfo();
+                    System.out.println("    * 濮撳悕: " + (baseInfo != null ? baseInfo.getName() : "N/A") +
+                            ", 璐﹀彿: " + (baseInfo != null ? baseInfo.getAcctid() : "N/A") +
+                            ", 閮ㄩ棬: " + (baseInfo != null ? baseInfo.getDepartsName() : "N/A") +
+                            ", 鎵撳崱娆℃暟: " + (summaryInfo != null ? summaryInfo.getCheckinCount() : 0) +
+                            ", 瀹為檯宸ユ椂(绉�): " + (summaryInfo != null ? summaryInfo.getRegularWorkSec() : 0) +
+                            ", 鏍囧噯宸ユ椂(绉�): " + (summaryInfo != null ? summaryInfo.getStandardWorkSec() : 0));
+
+                    // 鎵撳嵃寮傚父淇℃伅
+                    if (data.getExceptionInfos() != null && !data.getExceptionInfos().isEmpty()) {
+                        data.getExceptionInfos().forEach(ex -> {
+                            String exType = getExceptionTypeName(ex.getException());
+                            System.out.println("      寮傚父: " + exType + ", 娆℃暟: " + ex.getCount() + ", 鏃堕暱(绉�): " + ex.getDuration());
+                        });
+                    }
+                });
+
+                // 淇濆瓨鍒版暟鎹簱
+                System.out.println("  - 寮�濮嬩繚瀛樻墦鍗℃棩鎶ユ暟鎹埌鏁版嵁搴�...");
+                int insertCount = qwCheckinDayDataService.saveDayDataBatch(dayDataList);
+                System.out.println("鉁� 淇濆瓨瀹屾垚锛屾柊澧炶褰曟暟: " + insertCount + ", 鏇存柊(宸插瓨鍦�): " + (dayDataList.size() - insertCount));
+            } else {
+                System.out.println("鉁� 鑾峰彇鐨勬墦鍗℃棩鎶ユ暟鎹负绌�");
+            }
+        } catch (IOException e) {
+            System.out.println("鉁� 鑾峰彇鎵撳崱鏃ユ姤鏁版嵁澶辫触: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+        System.out.println("=== 娴嬭瘯缁撴潫 ===");
+    }
+
+    /**
+     * 娴嬭瘯鑾峰彇鎸囧畾鍛樺伐鐨勬墦鍗℃棩鎶ユ暟鎹�
+     */
+    @Test
+    void testGetCheckinDayDataById() {
+        System.out.println("=== 寮�濮嬫祴璇曡幏鍙栨寚瀹氬憳宸ユ墦鍗℃棩鎶ユ暟鎹� ===");
+
+        QwStaff qwStaff = qwStaffMapper.selectById(3);
+
+        if (qwStaff == null || qwStaff.getAccount() == null || qwStaff.getAccount().isEmpty()) {
+            System.out.println("鉁� 鏈壘鍒癐D涓�3鐨勫憳宸ユ垨鍛樺伐account涓虹┖");
+            return;
+        }
+
+        System.out.println("  - 鍛樺伐濮撳悕: " + qwStaff.getName());
+        System.out.println("  - 鍛樺伐璐﹀彿: " + qwStaff.getAccount());
+
+        try {
+            long currentTime = System.currentTimeMillis() / 1000;
+            long oneDaySeconds = 86400;
+
+            // 鑾峰彇鏄ㄥぉ鐨勬棩鎶�
+            long yesterdayStart = ((currentTime / oneDaySeconds) - 1) * oneDaySeconds;
+            long startTime = yesterdayStart;
+            long endTime = yesterdayStart;
+
+            System.out.println("  - 鏌ヨ鏃ユ湡: " + new java.util.Date(startTime * 1000));
+
+            List<String> useridList = new java.util.ArrayList<>();
+            useridList.add(qwStaff.getAccount());
+
+            List<WorkWXService.CheckinDayData> dayDataList = workWXService.getCheckinDayData(startTime, endTime, useridList);
+
+            if (dayDataList != null && !dayDataList.isEmpty()) {
+                System.out.println("鉁� 鎴愬姛鑾峰彇鎵撳崱鏃ユ姤鏁版嵁");
+                dayDataList.forEach(data -> {
+                    WorkWXService.BaseInfo baseInfo = data.getBaseInfo();
+                    WorkWXService.SummaryInfo summaryInfo = data.getSummaryInfo();
+
+                    System.out.println("  鍩虹淇℃伅:");
+                    System.out.println("    - 濮撳悕: " + (baseInfo != null ? baseInfo.getName() : "N/A"));
+                    System.out.println("    - 閮ㄩ棬: " + (baseInfo != null ? baseInfo.getDepartsName() : "N/A"));
+                    System.out.println("    - 瑙勫垯: " + (baseInfo != null && baseInfo.getRuleInfo() != null ? baseInfo.getRuleInfo().getGroupname() : "N/A"));
+
+                    System.out.println("  姹囨�讳俊鎭�:");
+                    System.out.println("    - 鎵撳崱娆℃暟: " + (summaryInfo != null ? summaryInfo.getCheckinCount() : 0));
+                    System.out.println("    - 瀹為檯宸ユ椂: " + (summaryInfo != null ? formatSeconds(summaryInfo.getRegularWorkSec()) : "0"));
+                    System.out.println("    - 鏍囧噯宸ユ椂: " + (summaryInfo != null ? formatSeconds(summaryInfo.getStandardWorkSec()) : "0"));
+
+                    if (data.getExceptionInfos() != null && !data.getExceptionInfos().isEmpty()) {
+                        System.out.println("  寮傚父淇℃伅:");
+                        data.getExceptionInfos().forEach(ex -> {
+                            String exType = getExceptionTypeName(ex.getException());
+                            System.out.println("    - " + exType + ": " + ex.getCount() + "娆�, 鏃堕暱: " + formatSeconds(ex.getDuration()));
+                        });
+                    }
+
+                    if (data.getOtInfo() != null && data.getOtInfo().getOtStatus() != null && data.getOtInfo().getOtStatus() > 0) {
+                        System.out.println("  鍔犵彮淇℃伅:");
+                        System.out.println("    - 鍔犵彮鏃堕暱: " + formatSeconds(data.getOtInfo().getOtDuration()));
+                    }
+                });
+            } else {
+                System.out.println("鉁� 璇ュ憳宸ュ湪鎸囧畾鏃ユ湡鏃犳墦鍗℃棩鎶ユ暟鎹�");
+            }
+        } catch (IOException e) {
+            System.out.println("鉁� 鑾峰彇鎵撳崱鏃ユ姤鏁版嵁澶辫触: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+        System.out.println("=== 娴嬭瘯缁撴潫 ===");
+    }
+
+    /**
+     * 鏍煎紡鍖栫鏁颁负鏃跺垎绉�
+     */
+    private String formatSeconds(Integer seconds) {
+        if (seconds == null || seconds == 0) {
+            return "0绉�";
+        }
+        int hours = seconds / 3600;
+        int minutes = (seconds % 3600) / 60;
+        int secs = seconds % 60;
+
+        StringBuilder sb = new StringBuilder();
+        if (hours > 0) sb.append(hours).append("灏忔椂");
+        if (minutes > 0) sb.append(minutes).append("鍒嗛挓");
+        if (secs > 0) sb.append(secs).append("绉�");
+        return sb.toString();
+    }
+
+    /**
+     * 鑾峰彇寮傚父绫诲瀷鍚嶇О
+     * @param exceptionType 寮傚父绫诲瀷浠g爜锛�1-杩熷埌锛�2-鏃╅��锛�3-缂哄崱锛�4-鏃峰伐锛�5-鍦扮偣寮傚父锛�6-璁惧寮傚父
+     */
+    private String getExceptionTypeName(Integer exceptionType) {
+        if (exceptionType == null) {
+            return "鏈煡";
+        }
+        switch (exceptionType) {
+            case 1:
+                return "杩熷埌";
+            case 2:
+                return "鏃╅��";
+            case 3:
+                return "缂哄崱";
+            case 4:
+                return "鏃峰伐";
+            case 5:
+                return "鍦扮偣寮傚父";
+            case 6:
+                return "璁惧寮傚父";
+            default:
+                return "鏈煡";
+        }
+    }
+
 }

--
Gitblit v1.9.3