张世豪
4 小时以前 100f4dcea20a32663a07e91525de111f7515eb79
可发布版本202517.25
已修改14个文件
440 ■■■■■ 文件已修改
bin/chushihua/lunxun$PollingTask.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/chushihua/lunxun.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/xitongshezhi/kuaisuquka$1.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/xitongshezhi/kuaisuquka$2.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/xitongshezhi/kuaisuquka$3.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/xitongshezhi/kuaisuquka$4.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/xitongshezhi/kuaisuquka$SlotButtonListener.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/xitongshezhi/kuaisuquka$SlotStatus.class 补丁 | 查看 | 原始文档 | blame | 历史
bin/xitongshezhi/kuaisuquka.class 补丁 | 查看 | 原始文档 | blame | 历史
err.properties 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
log.properties 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/chushihua/lunxun.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/xitongshezhi/SystemDebugDialog.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/xitongshezhi/kuaisuquka.java 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/chushihua/lunxun$PollingTask.class
Binary files differ
bin/chushihua/lunxun.class
Binary files differ
bin/xitongshezhi/kuaisuquka$1.class
Binary files differ
bin/xitongshezhi/kuaisuquka$2.class
Binary files differ
bin/xitongshezhi/kuaisuquka$3.class
Binary files differ
bin/xitongshezhi/kuaisuquka$4.class
Binary files differ
bin/xitongshezhi/kuaisuquka$SlotButtonListener.class
Binary files differ
bin/xitongshezhi/kuaisuquka$SlotStatus.class
Binary files differ
bin/xitongshezhi/kuaisuquka.class
Binary files differ
err.properties
@@ -1,4 +1,10 @@
#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Fri Nov 21 15:10:10 CST 2025
#Fri Nov 21 15:10:10 CST 2025
#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Fri Nov 21 15:53:26 CST 2025
#Fri Nov 21 15:53:26 CST 2025
log_1763709005376_be67189d=[2025-11-21 15\:10\:05] 取卡操作:12132232
log_1763709010792_533f9544=[2025-11-21 15\:10\:10] 取卡操作:卡槽14被管理员取卡
log_1763711606778_258ce9b3=[2025-11-21 15\:53\:26] [15\:53\:26.776] 发送失败,正在重试 (1/2)
log_1763711606820_621ce6a5=[2025-11-21 15\:53\:26] [15\:53\:26.820] 发送失败,正在重试 (1/2)
log_1763711606821_a4bb65ce=[2025-11-21 15\:53\:26] [15\:53\:26.821] 发送失败,正在重试 (1/2)
log_1763711606822_e9cc5b23=[2025-11-21 15\:53\:26] [15\:53\:26.822] 发送失败,正在重试 (1/2)
log_1763711606823_1da1f119=[2025-11-21 15\:53\:26] [15\:53\:26.823] 发送失败,正在重试 (1/2)
log_1763711606824_15788a29=[2025-11-21 15\:53\:26] lunxun连续失败次数过多,暂停轮询
log.properties
@@ -1,5 +1,5 @@
#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Fri Nov 21 15:46:19 CST 2025
#Fri Nov 21 15:46:19 CST 2025
#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Fri Nov 21 17:13:04 CST 2025
#Fri Nov 21 17:13:04 CST 2025
log_1763709005376_be67189d=[2025-11-21 15\:10\:05] 取卡操作:卡槽14被管理员取卡
log_1763709010792_533f9544=[2025-11-21 15\:10\:10] 取卡操作:卡槽14被管理员取卡
log_1763710366394_3e2ee73b=[2025-11-21 15\:32\:46] 取卡操作:卡槽1被管理员取卡
@@ -197,3 +197,71 @@
log_1763711176319_38854f73=[2025-11-21 15\:46\:16] 取卡操作:卡槽55被管理员取卡
log_1763711176620_41d8db8a=[2025-11-21 15\:46\:16] 取卡操作:卡槽55被管理员取卡
log_1763711179015_2952f952=[2025-11-21 15\:46\:19] 管理员已将全部卡槽已经打开请取卡
log_1763713705096_9d5670de=[2025-11-21 16\:28\:25] DDCC0008F00C515AA55AA5027A81;type2控制打开12柜门
log_1763713705463_ebe6da20=[2025-11-21 16\:28\:25] 取卡操作:卡槽12被管理员取卡
log_1763715591886_1ac9cc5a=[2025-11-21 16\:59\:51] DDCC0008F013515AA55AA502BB6F;type2控制打开19柜门
log_1763715592224_8af42a4f=[2025-11-21 16\:59\:52] 取卡操作:卡槽19被管理员取卡
log_1763715735797_38b1a47b=[2025-11-21 17\:02\:15] DDCC0008F00D515AA55AA502BA91;type2控制打开13柜门
log_1763716227580_f95bc09a=[2025-11-21 17\:10\:27] DDCC0008F00C515AA55AA5027A81;type2控制打开12柜门
log_1763716227937_a73d3b5b=[2025-11-21 17\:10\:27] 取卡操作:卡槽12被管理员取卡
log_1763716377421_6577a6ec=[2025-11-21 17\:12\:57] 取卡操作:卡槽1被管理员取卡
log_1763716377517_f6fe46de=[2025-11-21 17\:12\:57] 取卡操作:卡槽2被管理员取卡
log_1763716377617_d4676872=[2025-11-21 17\:12\:57] 取卡操作:卡槽3被管理员取卡
log_1763716377717_f8ce2321=[2025-11-21 17\:12\:57] 取卡操作:卡槽4被管理员取卡
log_1763716377817_f2002ba4=[2025-11-21 17\:12\:57] 取卡操作:卡槽5被管理员取卡
log_1763716377916_112dc429=[2025-11-21 17\:12\:57] 取卡操作:卡槽6被管理员取卡
log_1763716378018_4f02bd40=[2025-11-21 17\:12\:58] 取卡操作:卡槽7被管理员取卡
log_1763716378116_91cb3159=[2025-11-21 17\:12\:58] 取卡操作:卡槽8被管理员取卡
log_1763716378217_d21090a4=[2025-11-21 17\:12\:58] 取卡操作:卡槽9被管理员取卡
log_1763716378316_eee62d13=[2025-11-21 17\:12\:58] 取卡操作:卡槽10被管理员取卡
log_1763716378416_49dfa52f=[2025-11-21 17\:12\:58] 取卡操作:卡槽11被管理员取卡
log_1763716378516_97fd0ebf=[2025-11-21 17\:12\:58] 取卡操作:卡槽12被管理员取卡
log_1763716378617_14298d78=[2025-11-21 17\:12\:58] 取卡操作:卡槽13被管理员取卡
log_1763716378716_89f7fe99=[2025-11-21 17\:12\:58] 取卡操作:卡槽14被管理员取卡
log_1763716378867_1ee85650=[2025-11-21 17\:12\:58] 取卡操作:卡槽15被管理员取卡
log_1763716378968_de0d5066=[2025-11-21 17\:12\:58] 取卡操作:卡槽16被管理员取卡
log_1763716379065_030b8980=[2025-11-21 17\:12\:59] 取卡操作:卡槽17被管理员取卡
log_1763716379166_2af275ec=[2025-11-21 17\:12\:59] 取卡操作:卡槽18被管理员取卡
log_1763716379267_b667a29e=[2025-11-21 17\:12\:59] 取卡操作:卡槽19被管理员取卡
log_1763716379367_2498a809=[2025-11-21 17\:12\:59] 取卡操作:卡槽20被管理员取卡
log_1763716379467_bfe1598a=[2025-11-21 17\:12\:59] 取卡操作:卡槽21被管理员取卡
log_1763716379567_cb9eb62b=[2025-11-21 17\:12\:59] 取卡操作:卡槽22被管理员取卡
log_1763716379666_688ebc2f=[2025-11-21 17\:12\:59] 取卡操作:卡槽23被管理员取卡
log_1763716379766_0087530c=[2025-11-21 17\:12\:59] 取卡操作:卡槽24被管理员取卡
log_1763716379867_4611e338=[2025-11-21 17\:12\:59] 取卡操作:卡槽25被管理员取卡
log_1763716379967_fdaa10ff=[2025-11-21 17\:12\:59] 取卡操作:卡槽26被管理员取卡
log_1763716380067_7066ebe8=[2025-11-21 17\:13\:00] 取卡操作:卡槽27被管理员取卡
log_1763716380167_daa20dbf=[2025-11-21 17\:13\:00] 取卡操作:卡槽28被管理员取卡
log_1763716380266_a7c6e4f7=[2025-11-21 17\:13\:00] 取卡操作:卡槽29被管理员取卡
log_1763716380366_1dc8dacf=[2025-11-21 17\:13\:00] 取卡操作:卡槽30被管理员取卡
log_1763716380516_d28c278d=[2025-11-21 17\:13\:00] 取卡操作:卡槽31被管理员取卡
log_1763716380616_8e7dc215=[2025-11-21 17\:13\:00] 取卡操作:卡槽32被管理员取卡
log_1763716380716_2d57a4ef=[2025-11-21 17\:13\:00] 取卡操作:卡槽33被管理员取卡
log_1763716380817_27f8849c=[2025-11-21 17\:13\:00] 取卡操作:卡槽34被管理员取卡
log_1763716380915_556a565a=[2025-11-21 17\:13\:00] 取卡操作:卡槽35被管理员取卡
log_1763716381016_a66e5689=[2025-11-21 17\:13\:01] 取卡操作:卡槽36被管理员取卡
log_1763716381116_2f621f7e=[2025-11-21 17\:13\:01] 取卡操作:卡槽37被管理员取卡
log_1763716381216_8ee638c7=[2025-11-21 17\:13\:01] 取卡操作:卡槽38被管理员取卡
log_1763716381316_4a494195=[2025-11-21 17\:13\:01] 取卡操作:卡槽39被管理员取卡
log_1763716381417_d2e4fce3=[2025-11-21 17\:13\:01] 取卡操作:卡槽40被管理员取卡
log_1763716381516_ad2c841b=[2025-11-21 17\:13\:01] 取卡操作:卡槽41被管理员取卡
log_1763716381616_f769b6ee=[2025-11-21 17\:13\:01] 取卡操作:卡槽42被管理员取卡
log_1763716381716_749a04bd=[2025-11-21 17\:13\:01] 取卡操作:卡槽43被管理员取卡
log_1763716381816_36768fce=[2025-11-21 17\:13\:01] 取卡操作:卡槽44被管理员取卡
log_1763716381916_8dfccd10=[2025-11-21 17\:13\:01] 取卡操作:卡槽45被管理员取卡
log_1763716382066_05896cc1=[2025-11-21 17\:13\:02] 取卡操作:卡槽46被管理员取卡
log_1763716382167_4f94fd40=[2025-11-21 17\:13\:02] 取卡操作:卡槽47被管理员取卡
log_1763716382267_e13e3734=[2025-11-21 17\:13\:02] 取卡操作:卡槽48被管理员取卡
log_1763716382367_b5591084=[2025-11-21 17\:13\:02] 取卡操作:卡槽49被管理员取卡
log_1763716382465_8b6a0f92=[2025-11-21 17\:13\:02] 取卡操作:卡槽50被管理员取卡
log_1763716382566_039d11f4=[2025-11-21 17\:13\:02] 取卡操作:卡槽51被管理员取卡
log_1763716382667_97480314=[2025-11-21 17\:13\:02] 取卡操作:卡槽52被管理员取卡
log_1763716382767_1ce157e6=[2025-11-21 17\:13\:02] 取卡操作:卡槽53被管理员取卡
log_1763716382867_2128e536=[2025-11-21 17\:13\:02] 取卡操作:卡槽54被管理员取卡
log_1763716382967_f3041239=[2025-11-21 17\:13\:02] 取卡操作:卡槽55被管理员取卡
log_1763716383066_ea1f332b=[2025-11-21 17\:13\:03] 取卡操作:卡槽56被管理员取卡
log_1763716383166_9d894f87=[2025-11-21 17\:13\:03] 取卡操作:卡槽57被管理员取卡
log_1763716383267_b0a3c9a1=[2025-11-21 17\:13\:03] 取卡操作:卡槽58被管理员取卡
log_1763716383368_65a77f09=[2025-11-21 17\:13\:03] 取卡操作:卡槽59被管理员取卡
log_1763716383468_1d41c7bb=[2025-11-21 17\:13\:03] 取卡操作:卡槽60被管理员取卡
log_1763716384559_af7c9cc7=[2025-11-21 17\:13\:04] 管理员已将全部卡槽已经打开请取卡
src/chushihua/lunxun.java
@@ -365,7 +365,7 @@
            while (isRunning && !Thread.currentThread().isInterrupted() && !shouldStop.get()) {
                try {
                    //                    System.out.println("查询中.....线程");
//                    System.out.println("查询中.....线程");
                    // 检查是否暂停
                    if (isPaused) {
                        synchronized (lunxun.class) {
@@ -427,9 +427,13 @@
                                        } else {
                                            status = "无卡";
                                        }
                                        SystemDebugDialog.appendAsciiData(
                                                String.format("Slot %d (%s) 查询成功,间隔: %dms\n",
                                                        slotNumber, status, queryInterval));
                                        if (DEBUG_ENABLED) {
                                            StringBuilder debugMsg = new StringBuilder(50);
                                            debugMsg.append("Slot ").append(slotNumber)
                                                    .append(" (").append(status).append(") 查询成功,间隔: ")
                                                    .append(queryInterval).append("ms\n");
                                            SystemDebugDialog.appendAsciiData(debugMsg.toString());
                                        }
                                    }
                                } else {
                                    consecutiveFailures++;
@@ -480,7 +484,7 @@
            try {
                // 使用缓存的查询指令                
                String queryCommand = getCachedQueryCommand(slotNumber);
                // System.out.println("指令是:"+queryCommand);
//                 System.out.println("指令是:"+queryCommand);
                if (DEBUG_ENABLED) {
                    SystemDebugDialog.appendAsciiData("send to "+slotNumber+" queryCommand");
                }
src/xitongshezhi/SystemDebugDialog.java
@@ -327,6 +327,7 @@
                staticDataTextArea.setCaretPosition(staticDataTextArea.getDocument().getLength());
            }
            appendAsciiData("[" + getCurrentTime() + "] 开始显示数据\n");
            lunxun.resumePolling();
            lunxun.DEBUG_ENABLED=true;
        } else {
            scrollButton.setText("暂停");
src/xitongshezhi/kuaisuquka.java
@@ -18,9 +18,7 @@
    // 屏幕尺寸常量 - 适配7寸竖屏
    private static final int SCREEN_WIDTH = 600;
    private static final int SCREEN_HEIGHT = 1024;
    // 新增:记录进入快速取卡页面前的轮询状态
    private boolean wasPollingRunning = false;
    private boolean wasPollingPaused = false;
    // 颜色常量
    private static final Color PRIMARY_COLOR = new Color(52, 152, 219);
    private static final Color PRIMARY_DARK_COLOR = new Color(41, 128, 185);
@@ -60,32 +58,47 @@
    // 统计信息
    private JLabel cardsCountLabel;
    
    // 优化的对话框管理
    private JDialog progressDialog;
    private JDialog resultDialog;
    // 共享的事件监听器
    private final SlotButtonListener slotButtonListener;
    
    private SlotManager slotManager;
    private Timer refreshTimer; // 新增:刷新定时器
    public kuaisuquka(JFrame parent) {
        super(parent, "快速取卡", true);
        slotManager = new SlotManager();
        slotButtons = new ArrayList<>(60);
        slotStatuses = new ArrayList<>(60);
        slotButtonListener = new SlotButtonListener();
        
        // 记录进入快速取卡页面前的轮询状态
        recordPollingStateBeforeEntering();
        initializeUI();
        initializeSlots();
        startAutoRefresh(); // 新增:启动自动刷新
        startAutoRefresh();
        
        // 进入快速取卡页面时暂停轮询
        pausePollingWhenEntering();
        // 调试信息
        //System.out.println("快速取卡页面初始化完成,开始显示卡槽状态");
        debugSlotStatus();
    }
    /**
     * 调试方法:打印卡槽状态信息
     */
    private void debugSlotStatus() {
        Fkj[] slotArray = SlotManager.getSlotArray();
        if (slotArray == null) {
            //System.out.println("SlotManager.getSlotArray() 返回 null");
            return;
        }
        //System.out.println("=== 卡槽状态调试信息 ===");
        for (int i = 0; i < Math.min(slotArray.length, 60); i++) {
            Fkj slot = slotArray[i];
            if (slot != null) {
                System.out.printf("卡槽 %d: hasCard=%s, cardNumber=%s%n",
                    i + 1, slot.getHasCard(), slot.getCardNumber());
            } else {
                System.out.printf("卡槽 %d: null%n", i + 1);
            }
        }
        //System.out.println("======================");
    }
    
    /**
@@ -102,74 +115,113 @@
    }
    
    /**
     * 从SlotManager刷新卡槽状态
     * 从SlotManager刷新卡槽状态 - 彻底重写版本
     */
    private void refreshSlotStatusFromManager() {
        boolean statusChanged = false;
        Fkj[] slotArray = SlotManager.getSlotArray();
        
        for (int i = 0; i < 60; i++) {
            int slotId = i + 1;
            String hasCardStatus = SlotManager.getSlotHasCardStatus(slotId);
        if (slotArray == null) {
            //System.out.println("刷新卡槽状态: slotArray 为 null");
            return;
        }
        for (int i = 0; i < 60 && i < slotArray.length; i++) {
            Fkj slotInfo = slotArray[i];
            if (slotInfo == null) {
                // 如果卡槽信息为null,设置为无卡状态
                if (i < slotStatuses.size() && slotStatuses.get(i) != SlotStatus.NO_CARD) {
                    slotStatuses.set(i, SlotStatus.NO_CARD);
                    statusChanged = true;
                }
                continue;
            }
            
            // 检查是否有卡并且有有效的卡号
            String hasCardStatus = slotInfo.getHasCard();
            String cardNumber = slotInfo.getCardNumber();
            // 调试单个卡槽
            if (i < 5) { // 只打印前5个卡槽的调试信息
                System.out.printf("刷新卡槽 %d: hasCard=%s, cardNumber=%s%n",
                    i + 1, hasCardStatus, cardNumber);
            }
            // 简化的判断逻辑 - 重点调试
            boolean reallyHasCard = false;
            if ("1".equals(hasCardStatus)) {
                Fkj slotInfo = slotManager.getSlotInfo(slotId);
                String cardNumber = slotInfo != null ? slotInfo.getCardNumber() : "-1";
                // 只有当卡号不是-1、null且不为空时,才认为真正有卡
                reallyHasCard = !("-1".equals(cardNumber) && cardNumber != null && !cardNumber.trim().isEmpty());
                // 如果hasCard为"1",进一步检查卡号
                if (cardNumber != null && !cardNumber.trim().isEmpty()) {
                    // 放宽条件:只要卡号不为空且不是"0000"和"-1",就认为有卡
                    reallyHasCard = !"0000".equals(cardNumber) && !"-1".equals(cardNumber);
                } else {
                    // 卡号为null或空,但有卡状态为1,显示为有卡但卡号未知
                    reallyHasCard = true;
                }
            }
            
            SlotStatus newStatus = reallyHasCard ? SlotStatus.HAS_CARD : SlotStatus.NO_CARD;
            SlotStatus currentStatus = slotStatuses.get(i);
            
            // 检查状态是否发生变化
            if (newStatus != currentStatus) {
                slotStatuses.set(i, newStatus);
            // 确保slotStatuses有足够的元素
            if (i >= slotStatuses.size()) {
                slotStatuses.add(newStatus);
                statusChanged = true;
            } else {
                SlotStatus currentStatus = slotStatuses.get(i);
                if (newStatus != currentStatus) {
                    slotStatuses.set(i, newStatus);
                    statusChanged = true;
                    // 调试状态变化
                    System.out.printf("卡槽 %d 状态变化: %s -> %s (hasCard=%s, cardNumber=%s)%n",
                        i + 1, currentStatus, newStatus, hasCardStatus, cardNumber);
                }
            }
            // 更新按钮显示
            updateSlotButtonDisplay(i, slotInfo, newStatus);
        }
        
        // 如果状态发生变化,更新显示
        // 如果状态发生变化,更新统计信息
        if (statusChanged) {
            updateCardSlotsDisplay();
            updateStatistics();
        } else {
            // 即使状态没变,也要检查卡号是否更新
            updateCardSlotsDisplay();
        }
    }
    /**
     * 记录进入快速取卡页面前的轮询状态
     */
    private void recordPollingStateBeforeEntering() {
        wasPollingRunning = chushihua.lunxun.isPolling();
        wasPollingPaused = chushihua.lunxun.isPaused();
        //System.out.println("进入快速取卡页面,记录轮询状态 - 运行: " + wasPollingRunning + ", 暂停: " + wasPollingPaused);
    }
    /**
     * 进入快速取卡页面时暂停轮询
     */
    private void pausePollingWhenEntering() {
        if (chushihua.lunxun.isPolling() && !chushihua.lunxun.isPaused()) {
            chushihua.lunxun.pausePolling();
            System.out.println("进入快速取卡页面,轮询已暂停");
        }
    }
    
    /**
     * 退出快速取卡页面时恢复轮询
     */
    private void resumePollingWhenExiting() {
        // 只有进入快速取卡页面时轮询是运行状态且未被暂停,才恢复轮询
        if (wasPollingRunning && !wasPollingPaused) {
            if (chushihua.lunxun.isPolling() && chushihua.lunxun.isPaused()) {
                chushihua.lunxun.resumePolling();
                System.out.println("退出快速取卡页面,轮询已恢复");
    private void updateSlotButtonDisplay(int index, Fkj slotInfo, SlotStatus status) {
        if (index < 0 || index >= slotButtons.size()) {
            return;
        }
        JButton slotButton = slotButtons.get(index);
        // 更新按钮背景颜色
        slotButton.setBackground(status.getColor());
        // 更新状态标签
        Component[] components = slotButton.getComponents();
        for (Component comp : components) {
            if (comp instanceof JLabel) {
                JLabel label = (JLabel) comp;
                // 找到状态标签(较小的字体)
                if (label.getFont().getSize() == 11) {
                    String displayText;
                    if (status == SlotStatus.HAS_CARD) {
                        // 显示实际卡号,如果卡号无效则显示"有卡"
                        String cardNumber = slotInfo.getCardNumber();
                        if (cardNumber != null && !cardNumber.trim().isEmpty() &&
                            !"0000".equals(cardNumber) && !"-1".equals(cardNumber)) {
                            displayText = cardNumber;
                        } else {
                            displayText = "有卡";
                        }
                    } else {
                        displayText = "无卡";
                    }
                    label.setText(displayText);
                    break;
                }
            }
        } else {
            //System.out.println("退出快速取卡页面,保持原有轮询状态 - 运行: " + wasPollingRunning + ", 暂停: " + wasPollingPaused);
        }
    }
    
@@ -332,53 +384,98 @@
    }
    
    private void initializeSlots() {
        // 从 SlotManager 获取卡槽状态
        for (int i = 0; i < 60; i++) {
            int slotId = i + 1;
            String hasCardStatus = SlotManager.getSlotHasCardStatus(slotId);
            // 检查是否有卡并且有有效的卡号
            boolean reallyHasCard = false;
            if ("1".equals(hasCardStatus)) {
                Fkj slotInfo = slotManager.getSlotInfo(slotId);
                String cardNumber = slotInfo != null ? slotInfo.getCardNumber() : "-1";
                // 只有当卡号不是-1、null且不为空时,才认为真正有卡
                reallyHasCard = !("-1".equals(cardNumber) && cardNumber != null && !cardNumber.trim().isEmpty());
        // 清空现有状态
        slotStatuses.clear();
        // 直接从 SlotManager 获取最新数据
        Fkj[] slotArray = SlotManager.getSlotArray();
        //System.out.println("初始化卡槽状态,slotArray: " + (slotArray != null ? "非空" : "空"));
        if (slotArray != null) {
            for (int i = 0; i < 60 && i < slotArray.length; i++) {
                Fkj slotInfo = slotArray[i];
                SlotStatus status = SlotStatus.NO_CARD;
                if (slotInfo != null) {
                    String hasCardStatus = slotInfo.getHasCard();
                    String cardNumber = slotInfo.getCardNumber();
                    // 简化的判断逻辑
                    boolean reallyHasCard = false;
                    if ("1".equals(hasCardStatus)) {
                        if (cardNumber != null && !cardNumber.trim().isEmpty()) {
                            reallyHasCard = !"0000".equals(cardNumber) && !"-1".equals(cardNumber);
                        } else {
                            // 卡号为null或空,但有卡状态为1,显示为有卡
                            reallyHasCard = true;
                        }
                    }
                    status = reallyHasCard ? SlotStatus.HAS_CARD : SlotStatus.NO_CARD;
                    // 调试前几个卡槽
                    if (i < 5) {
                        System.out.printf("初始化卡槽 %d: hasCard=%s, cardNumber=%s, 判断为: %s%n",
                            i + 1, hasCardStatus, cardNumber, status);
                    }
                }
                slotStatuses.add(status);
            }
            SlotStatus status = reallyHasCard ? SlotStatus.HAS_CARD : SlotStatus.NO_CARD;
            slotStatuses.add(status);
        } else {
            // 如果slotArray为null,全部初始化为无卡
            //System.out.println("slotArray为null,全部初始化为无卡");
            for (int i = 0; i < 60; i++) {
                slotStatuses.add(SlotStatus.NO_CARD);
            }
        }
        
        createCardSlots();
        updateStatistics();
        // 立即刷新一次状态
        refreshSlotStatusFromManager();
    }
    
    private void createCardSlots() {
        cardSlotsPanel.removeAll();
        slotButtons.clear();
        
        Fkj[] slotArray = SlotManager.getSlotArray();
        for (int i = 0; i < 60; i++) {
            final int slotId = i + 1;
            SlotStatus status = slotStatuses.get(i);
            // 获取当前卡槽的实际状态
            Fkj slotInfo = null;
            if (slotArray != null && i < slotArray.length) {
                slotInfo = slotArray[i];
            }
            SlotStatus currentStatus = i < slotStatuses.size() ? slotStatuses.get(i) : SlotStatus.NO_CARD;
            // 创建 final 副本用于内部类
            final SlotStatus finalStatus = currentStatus;
            
            JButton slotButton = new JButton();
            slotButton.setLayout(new BorderLayout());
            slotButton.setBackground(status.getColor());
            slotButton.setBackground(currentStatus.getColor());
            slotButton.setForeground(Color.WHITE);
            slotButton.setFocusPainted(false);
            slotButton.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5));
            
            // 添加鼠标悬停效果
            // 添加鼠标悬停效果 - 使用 finalStatus 而不是 status
            slotButton.addMouseListener(new java.awt.event.MouseAdapter() {
                public void mouseEntered(java.awt.event.MouseEvent evt) {
                    if (status == SlotStatus.HAS_CARD) {
                        slotButton.setBackground(brighterColor(status.getColor()));
                    if (finalStatus == SlotStatus.HAS_CARD) {
                        slotButton.setBackground(brighterColor(finalStatus.getColor()));
                    }
                }
                
                public void mouseExited(java.awt.event.MouseEvent evt) {
                    slotButton.setBackground(status.getColor());
                    slotButton.setBackground(finalStatus.getColor());
                }
            });
            
@@ -387,14 +484,16 @@
            slotIdLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 16));
            slotIdLabel.setForeground(Color.WHITE);
            
            // 卡槽状态 - 修改:有卡时显示卡号,无卡时显示"无卡"
            // 卡槽状态 - 根据实际状态显示
            String displayText;
            if (status == SlotStatus.HAS_CARD) {
                // 从SlotManager获取卡号
                Fkj slotInfo = slotManager.getSlotInfo(slotId);
                String cardNumber = slotInfo != null ? slotInfo.getCardNumber() : "-1";
                // 显示实际卡号
                displayText = cardNumber;
            if (currentStatus == SlotStatus.HAS_CARD && slotInfo != null) {
                String cardNumber = slotInfo.getCardNumber();
                if (cardNumber != null && !cardNumber.trim().isEmpty() &&
                    !"0000".equals(cardNumber) && !"-1".equals(cardNumber)) {
                    displayText = cardNumber;
                } else {
                    displayText = "有卡";
                }
            } else {
                displayText = "无卡";
            }
@@ -442,62 +541,23 @@
        }
    }
    
    // 优化的卡槽显示更新
 // 修改更新卡槽显示的方法
    private void updateCardSlotsDisplay() {
        for (int i = 0; i < 60; i++) {
            JButton slotButton = slotButtons.get(i);
            SlotStatus status = slotStatuses.get(i);
            // 只更新改变的状态
            if (!slotButton.getBackground().equals(status.getColor())) {
                slotButton.setBackground(status.getColor());
            }
            // 更新状态标签 - 修改:有卡时显示卡号,无卡时显示"无卡"
            Component[] components = slotButton.getComponents();
            for (Component comp : components) {
                if (comp instanceof JLabel) {
                    JLabel label = (JLabel) comp;
                    // 找到状态标签(较小的字体)
                    if (label.getFont().getSize() == 11) {
                        String displayText;
                        if (status == SlotStatus.HAS_CARD) {
                            // 从SlotManager获取卡号
                            Fkj slotInfo = slotManager.getSlotInfo(i + 1);
                            String cardNumber = slotInfo != null ? slotInfo.getCardNumber() : "-1";
                            // 显示实际卡号
                            displayText = cardNumber;
                        } else {
                            displayText = "无卡";
                        }
                        label.setText(displayText);
                        break;
                    }
                }
            }
        }
        cardSlotsPanel.revalidate();
        cardSlotsPanel.repaint();
    }
    private void openAllSlots() {        
        Sendmsg.openAllSlots(2);
        Sendmsg.openAllSlots(2);
    }
    
    // 优化的统计计算
    private void updateStatistics() {
        int hasCardCount = 0;
        for (SlotStatus status : slotStatuses) {
            if (status == SlotStatus.HAS_CARD) {
        for (int i = 0; i < 60 && i < slotStatuses.size(); i++) {
            if (slotStatuses.get(i) == SlotStatus.HAS_CARD) {
                hasCardCount++;
            }
        }
        
        cardsCountLabel.setText("有卡: " + hasCardCount + "/60");
        // 调试统计信息
        //System.out.println("更新统计信息: 有卡 " + hasCardCount + "/60");
    }
    
    private Color brighterColor(Color color) {
@@ -547,19 +607,10 @@
        if (slotStatuses != null) {
            slotStatuses.clear();
        }
        if (progressDialog != null) {
            progressDialog.dispose();
            progressDialog = null;
        }
        if (resultDialog != null) {
            resultDialog.dispose();
            resultDialog = null;
        }
        // 恢复轮询状态
        resumePollingWhenExiting();
        
        super.dispose();
        //System.out.println("快速取卡页面已关闭");
    }
    
    // 静态方法:从系统设置页面调用