From 65539f6fb4d836180f784c2c4e0bc441764cd23f Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期一, 19 一月 2026 11:02:44 +0800
Subject: [PATCH] agv逻辑调整

---
 src/main/java/com/zy/system/controller/UserController.java  |    6 
 src/main/java/com/zy/asrs/task/handler/AgvHandler.java      |   80 +++++-----
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java |   68 +++++++++
 src/main/webapp/views/user/user.html                        |   16 ++
 src/main/java/com/zy/system/entity/User.java                |   28 ++++
 src/main/resources/logback-spring.xml                       |   52 ++++++-
 src/main/java/com/zy/asrs/task/AgvScheduler.java            |   96 ++++++++-----
 src/main/webapp/static/js/user/user.js                      |   43 ++++++
 src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java |    5 
 src/main/resources/mapper/UserMapper.xml                    |    1 
 10 files changed, 303 insertions(+), 92 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index c4c7790..5f49418 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -118,6 +118,11 @@
         if (!Cools.isEmpty(param.getStatus())) {
             switch (param.getStatus()) {
                 case "Assigned":
+                    // AGV宸叉淳杞︼紝纭鎺ユ敹鍛戒护锛岃褰曠‘璁ゆ椂闂�
+                    if (task.getPlcStrTime() == null) {
+                        task.setPlcStrTime(new Date());
+//                        log.info("AGV宸茬‘璁ゆ帴鏀跺懡浠わ紝璁板綍纭鏃堕棿锛宼askId锛歿}", taskId);
+                    }
                     if (Cools.isEmpty(robotGroup)) {
                         task.setInvWh(param.getRobotName());
                     }
diff --git a/src/main/java/com/zy/asrs/task/AgvScheduler.java b/src/main/java/com/zy/asrs/task/AgvScheduler.java
index cd317c9..4139ec6 100644
--- a/src/main/java/com/zy/asrs/task/AgvScheduler.java
+++ b/src/main/java/com/zy/asrs/task/AgvScheduler.java
@@ -203,7 +203,10 @@
 
     /**
      * 妫�鏌GV浠诲姟瀵瑰簲鐨勫伐浣滄。鏄惁宸插畬鎴愭垨宸茶浆鍘嗗彶妗e苟瀹岀粨
-     * 澶勭悊琚烦杩囩殑AGV浠诲姟锛氬鏋滃伐浣滄。宸插畬鎴愶紙wrk_sts=4,5,14,15锛夋垨宸茶浆鍘嗗彶妗e苟瀹岀粨锛屽垯瀹岀粨AGV浠诲姟
+     * 澶勭悊琚烦杩囩殑AGV浠诲姟锛�
+     * 1. 濡傛灉宸ヤ綔妗e凡瀹屾垚锛坵rk_sts=4,5,14,15锛夋垨宸茶浆鍘嗗彶妗e苟瀹岀粨锛屽垯瀹岀粨AGV浠诲姟
+     * 2. 濡傛灉宸ヤ綔妗e拰鍘嗗彶妗i兘娌℃湁鏁版嵁锛屼絾鏄疉GV宸茬‘璁ゆ帴鏀跺懡浠ゅ悗瓒呰繃1灏忔椂澶勪簬鎼繍涓紙鐘舵��8锛夛紝涔熺粨鏉烝GV浠诲姟
+     *    娉ㄦ剰锛氬彧鏈堿GV纭鎺ユ敹鍛戒护鍚庯紙plcStrTime涓嶄负绌猴級鎵嶅紑濮嬭鏃讹紝濡傛灉AGV鎺ュ彈鍛戒护澶辫触锛屼細缁х画鍛煎彨AGV
      */
     @Scheduled(cron = "0/10 * * * * ? ")
     private void checkCompletedTasksInHistory() {
@@ -216,7 +219,6 @@
                 new EntityWrapper<Task>()
                     .eq("task_type", "agv")
                     .eq("wrk_sts", 8L)  // 宸插懠鍙獳GV鐘舵��
-                    .isNotNull("wrk_no")
             );
             
             if (agvTasks.isEmpty()) {
@@ -226,6 +228,8 @@
             Date now = new Date();
             int completedCount = 0;
             List<Task> completedTasks = new ArrayList<>();
+            // 1灏忔椂鐨勬绉掓暟锛堜粠AGV纭鎺ユ敹鍛戒护寮�濮嬭鏃讹級
+            long oneHourInMillis = 60 * 60 * 1000L;
             
             for (Task agvTask : agvTasks) {
                 boolean isCompleted = false;
@@ -237,6 +241,24 @@
                     wrkMast = wrkMastService.selectOne(
                         new EntityWrapper<WrkMast>().eq("wrk_no", agvTask.getWrkNo())
                     );
+                }
+                
+                // 妫�鏌ュ巻鍙叉。鏄惁瀛樺湪锛堟棤璁哄伐浣滄。鏄惁瀛樺湪閮介渶瑕佹鏌ワ級
+                WrkMastLog wrkMastLog = null;
+                // 浼樺厛閫氳繃wrk_no鏌ヨ鍘嗗彶妗�
+                if (agvTask.getWrkNo() != null) {
+                    wrkMastLog = wrkMastLogService.selectOne(
+                        new EntityWrapper<WrkMastLog>().eq("wrk_no", agvTask.getWrkNo())
+                    );
+                }
+                // 濡傛灉閫氳繃wrk_no娌℃壘鍒帮紝涓旀湁鏉$爜锛屽垯閫氳繃鏉$爜鏌ヨ
+                if (wrkMastLog == null && !Cools.isEmpty(agvTask.getBarcode())) {
+                    List<WrkMastLog> logList = wrkMastLogService.selectList(
+                        new EntityWrapper<WrkMastLog>().eq("barcode", agvTask.getBarcode())
+                    );
+                    if (!logList.isEmpty()) {
+                        wrkMastLog = logList.get(0); // 鍙栫涓�涓�
+                    }
                 }
                 
                 // 濡傛灉宸ヤ綔妗e瓨鍦紝妫�鏌ユ槸鍚﹀凡瀹屾垚
@@ -258,47 +280,45 @@
                             reason = String.format("宸ヤ綔妗e凡瀹屾垚锛岀姸鎬侊細%d", wrkSts);
                         }
                     }
-                } else {
-                    // 濡傛灉宸ヤ綔妗d笉瀛樺湪锛屾鏌ュ巻鍙叉。
-                    WrkMastLog wrkMastLog = null;
+                }
+                
+                // 濡傛灉宸ヤ綔妗d笉瀛樺湪鎴栨湭瀹屾垚锛屾鏌ュ巻鍙叉。鏄惁宸插畬缁�
+                if (!isCompleted && wrkMastLog != null) {
+                    Integer ioType = agvTask.getIoType();
+                    long logWrkSts = wrkMastLog.getWrkSts();
                     
-                    // 浼樺厛閫氳繃wrk_no鏌ヨ鍘嗗彶妗�
-                    if (agvTask.getWrkNo() != null) {
-                        wrkMastLog = wrkMastLogService.selectOne(
-                            new EntityWrapper<WrkMastLog>().eq("wrk_no", agvTask.getWrkNo())
-                        );
-                    }
-                    
-                    // 濡傛灉閫氳繃wrk_no娌℃壘鍒帮紝涓旀湁鏉$爜锛屽垯閫氳繃鏉$爜鏌ヨ
-                    if (wrkMastLog == null && !Cools.isEmpty(agvTask.getBarcode())) {
-                        List<WrkMastLog> logList = wrkMastLogService.selectList(
-                            new EntityWrapper<WrkMastLog>().eq("barcode", agvTask.getBarcode())
-                        );
-                        if (!logList.isEmpty()) {
-                            wrkMastLog = logList.get(0); // 鍙栫涓�涓�
+                    if (ioType != null) {
+                        // 鍏ュ簱浠诲姟锛氱姸鎬�5锛堝簱瀛樻洿鏂板畬鎴愶級
+                        if ((ioType == 1 || ioType == 10 || ioType == 53 || ioType == 57) &&
+                            logWrkSts == 5L) {
+                            isCompleted = true;
+                            reason = String.format("宸ヤ綔妗e凡杞巻鍙叉。骞跺畬缁擄紝鍘嗗彶妗g姸鎬侊細%d", logWrkSts);
+                        }
+                        // 鍑哄簱浠诲姟锛氱姸鎬�15锛堝嚭搴撴洿鏂板畬鎴愶級
+                        else if ((ioType == 101 || ioType == 110 || ioType == 103 || ioType == 107) &&
+                                 logWrkSts == 15L) {
+                            isCompleted = true;
+                            reason = String.format("宸ヤ綔妗e凡杞巻鍙叉。骞跺畬缁擄紝鍘嗗彶妗g姸鎬侊細%d", logWrkSts);
                         }
                     }
+                }
+                
+                // 濡傛灉宸ヤ綔妗e拰鍘嗗彶妗i兘娌℃湁鏁版嵁锛屾鏌ユ槸鍚﹁秴杩�1灏忔椂锛堜粠AGV纭鎺ユ敹鍛戒护寮�濮嬭鏃讹級
+                if (!isCompleted && wrkMast == null && wrkMastLog == null) {
+                    // 鍙湁AGV纭鎺ユ敹鍛戒护鍚庯紙plcStrTime涓嶄负绌猴級鎵嶅紑濮嬭鏃�
+                    // 濡傛灉plcStrTime涓虹┖锛岃鏄嶢GV杩樻病鏈夌‘璁ゆ帴鏀跺懡浠わ紝浼氱户缁懠鍙紝涓嶇粨鏉熶换鍔�
+                    Date agvConfirmedTime = agvTask.getPlcStrTime();
                     
-                    // 濡傛灉鍘嗗彶妗e瓨鍦ㄤ笖宸插畬缁擄紝鍒欏畬缁揂GV浠诲姟
-                    if (wrkMastLog != null) {
-                        Integer ioType = agvTask.getIoType();
-                        long logWrkSts = wrkMastLog.getWrkSts();
-                        
-                        if (ioType != null) {
-                            // 鍏ュ簱浠诲姟锛氱姸鎬�5锛堝簱瀛樻洿鏂板畬鎴愶級
-                            if ((ioType == 1 || ioType == 10 || ioType == 53 || ioType == 57) &&
-                                logWrkSts == 5L) {
-                                isCompleted = true;
-                                reason = String.format("宸ヤ綔妗e凡杞巻鍙叉。骞跺畬缁擄紝鍘嗗彶妗g姸鎬侊細%d", logWrkSts);
-                            }
-                            // 鍑哄簱浠诲姟锛氱姸鎬�15锛堝嚭搴撴洿鏂板畬鎴愶級
-                            else if ((ioType == 101 || ioType == 110 || ioType == 103 || ioType == 107) &&
-                                     logWrkSts == 15L) {
-                                isCompleted = true;
-                                reason = String.format("宸ヤ綔妗e凡杞巻鍙叉。骞跺畬缁擄紝鍘嗗彶妗g姸鎬侊細%d", logWrkSts);
-                            }
+                    if (agvConfirmedTime != null) {
+                        long timeDiff = now.getTime() - agvConfirmedTime.getTime();
+                        if (timeDiff >= oneHourInMillis) {
+                            isCompleted = true;
+                            long hours = timeDiff / (60 * 60 * 1000L);
+                            long minutes = (timeDiff % (60 * 60 * 1000L)) / (60 * 1000L);
+                            reason = String.format("宸ヤ綔妗e拰鍘嗗彶妗i兘涓嶅瓨鍦紝AGV纭鎺ユ敹鍛戒护鍚庤秴杩�1灏忔椂锛堝疄闄咃細%d灏忔椂%d鍒嗛挓锛夊浜庢惉杩愪腑锛岃嚜鍔ㄧ粨鏉�", hours, minutes);
                         }
                     }
+                    // 濡傛灉plcStrTime涓虹┖锛岃鏄嶢GV杩樻病鏈夌‘璁ゆ帴鏀跺懡浠わ紝涓嶇粨鏉熶换鍔★紝缁х画绛夊緟鍛煎彨
                 }
                 
                 // 濡傛灉宸插畬鎴愶紝鏇存柊AGV浠诲姟鐘舵�佸苟鏀堕泦鍒板垪琛�
@@ -325,7 +345,7 @@
             }
             
             if (completedCount > 0) {
-                log.info("鏈妫�鏌ュ畬缁撲簡{}涓狝GV鍛煎彨鍗曪紙宸ヤ綔妗e凡瀹屾垚鎴栧凡杞巻鍙叉。锛�", completedCount);
+                log.info("鏈妫�鏌ュ畬缁撲簡{}涓狝GV鍛煎彨鍗曪紙宸ヤ綔妗e凡瀹屾垚鎴栧凡杞巻鍙叉。鎴栫‘璁ゆ帴鏀跺悗瓒呮椂锛�", completedCount);
             }
         } catch (Exception e) {
             log.error("妫�鏌ュ伐浣滄。宸插畬鎴愭垨鍘嗗彶妗e畬缁撲换鍔″苟瀹岀粨AGV鍛煎彨鍗曞紓甯�", e);
diff --git a/src/main/java/com/zy/asrs/task/handler/AgvHandler.java b/src/main/java/com/zy/asrs/task/handler/AgvHandler.java
index 7d8fa87..69db13d 100644
--- a/src/main/java/com/zy/asrs/task/handler/AgvHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/AgvHandler.java
@@ -80,7 +80,7 @@
         for (Task task : taskList) {
             // 濡傛灉浠诲姟鐘舵�佸凡缁忔槸8锛堝凡鍛煎彨AGV锛屾鍦ㄦ惉杩愶級锛屽垯涓嶅啀鍙戦�佹寚浠�
             if (task.getWrkSts() != null && task.getWrkSts() == 8L) {
-                log.debug("浠诲姟ID锛歿}鐘舵�佸凡鏄�8锛堟鍦ㄦ惉杩愶級锛岃烦杩囧彂閫�", task.getId());
+                // log.debug("浠诲姟ID锛歿}鐘舵�佸凡鏄�8锛堟鍦ㄦ惉杩愶級锛岃烦杩囧彂閫�", task.getId());
                 continue;
             }
             
@@ -90,7 +90,7 @@
                 String errorMsg = allocateSiteForTask(task);
                 if (errorMsg != null) {
                     // 鏃犳硶鍒嗛厤绔欑偣锛屽彧鍦ㄦ棩蹇椾腑璁板綍锛屼笉璁板綍鍒颁换鍔′腑锛坅pp涓嶉渶瑕佺煡閬擄級
-                    log.warn("浠诲姟ID锛歿}鏃犳硶鍒嗛厤绔欑偣锛歿}", task.getId(), errorMsg);
+                    // log.warn("浠诲姟ID锛歿}鏃犳硶鍒嗛厤绔欑偣锛歿}", task.getId(), errorMsg);
                     continue;
                 }
                 // 妫�鏌ユ槸鍚︽垚鍔熷垎閰嶄簡绔欑偣锛堝鏋滆繑鍥瀗ull涓攕taNo浠嶄负绌猴紝璇存槑鎵�鏈夌珯鐐归兘鍦ㄦ惉杩愶紝绛夊緟涓嬫鍐嶈瘯锛�
@@ -99,7 +99,7 @@
                     // 鎵�鏈夌珯鐐归兘鍦ㄦ惉杩愶紝鏆備笉鍒嗛厤锛岀瓑寰呬笅娆″畾鏃朵换鍔″啀灏濊瘯
                     continue;
                 }
-                log.info("浠诲姟ID锛歿}宸插垎閰嶇珯鐐癸細{}", task.getId(), staNo);
+                // log.info("浠诲姟ID锛歿}宸插垎閰嶇珯鐐癸細{}", task.getId(), staNo);
             }
             
             // 妫�鏌ョ洰鏍囩珯鐐规槸鍚︽湁鏁堬紙涓嶄负0涓斿瓨鍦級
@@ -108,18 +108,18 @@
                     Integer siteNo = Integer.parseInt(staNo);
                     // 妫�鏌ョ珯鐐规槸鍚︿负0锛堟棤鏁堢珯鐐癸級锛屽鏋滄槸0鍒欎笉鍙戦�侊紝浣嗕笉娓呯┖绔欑偣
                     if (siteNo == null || siteNo == 0) {
-                        log.warn("浠诲姟ID锛歿}鐨勭洰鏍囩珯鐐箋}鏃犳晥锛堜负0锛夛紝璺宠繃鍙戦�侊紝淇濈暀绔欑偣鍒嗛厤", task.getId(), staNo);
+                        // log.warn("浠诲姟ID锛歿}鐨勭洰鏍囩珯鐐箋}鏃犳晥锛堜负0锛夛紝璺宠繃鍙戦�侊紝淇濈暀绔欑偣鍒嗛厤", task.getId(), staNo);
                         continue;
                     }
                     List<BasDevp> basDevpList = basDevpMapper.selectList(new EntityWrapper<BasDevp>().eq("dev_no", siteNo));
                     if (basDevpList == null || basDevpList.isEmpty()) {
                         // 绔欑偣涓嶅瓨鍦紝璺宠繃鍙戦�侊紝涓嶆竻绌虹珯鐐�
-                        log.warn("浠诲姟ID锛歿}鐨勭洰鏍囩珯鐐箋}涓嶅瓨鍦紝璺宠繃鍙戦�侊紝淇濈暀绔欑偣鍒嗛厤", task.getId(), staNo);
+                        // log.warn("浠诲姟ID锛歿}鐨勭洰鏍囩珯鐐箋}涓嶅瓨鍦紝璺宠繃鍙戦�侊紝淇濈暀绔欑偣鍒嗛厤", task.getId(), staNo);
                         continue;
                     }
                 } catch (NumberFormatException e) {
                     // 绔欑偣鏍煎紡閿欒锛岃烦杩囧彂閫侊紝涓嶆竻绌虹珯鐐�
-                    log.warn("浠诲姟ID锛歿}鐨勭洰鏍囩珯鐐箋}鏍煎紡閿欒锛岃烦杩囧彂閫侊紝淇濈暀绔欑偣鍒嗛厤", task.getId(), staNo);
+                    // log.warn("浠诲姟ID锛歿}鐨勭洰鏍囩珯鐐箋}鏍煎紡閿欒锛岃烦杩囧彂閫侊紝淇濈暀绔欑偣鍒嗛厤", task.getId(), staNo);
                     continue;
                 }
             } else {
@@ -155,8 +155,8 @@
                 );
                 
                 if (!transportingTasks.isEmpty()) {
-                    log.info("绔欑偣{}鏈墈}涓鍦ㄦ惉杩愮殑{}AGV浠诲姟锛岃烦杩囧綋鍓嶄换鍔D锛歿}", 
-                            staNo, transportingTasks.size(), taskType, task.getId());
+                    // log.info("绔欑偣{}鏈墈}涓鍦ㄦ惉杩愮殑{}AGV浠诲姟锛岃烦杩囧綋鍓嶄换鍔D锛歿}", 
+                    //         staNo, transportingTasks.size(), taskType, task.getId());
                     continue;
                 }
             }
@@ -193,8 +193,8 @@
             
             // 濡傛灉閲嶈瘯娆℃暟宸茶揪鍒版渶澶у�硷紝璺宠繃鏈鍙戦��
             if (retryEnabled && currentRetryCount >= maxRetryCount) {
-                log.warn("{}鍛煎彨agv鎼繍 - 浠诲姟ID锛歿}宸茶揪鍒版渶澶ч噸璇曟鏁帮紙{}锛夛紝鍋滄閲嶈瘯", 
-                        namespace, task.getId(), maxRetryCount);
+                // log.warn("{}鍛煎彨agv鎼繍 - 浠诲姟ID锛歿}宸茶揪鍒版渶澶ч噸璇曟鏁帮紙{}锛夛紝鍋滄閲嶈瘯", 
+                //         namespace, task.getId(), maxRetryCount);
                 // 璁板綍鏈�缁堝け璐ヤ俊鎭�
                 task.setErrorTime(new Date());
                 task.setErrorMemo(String.format("AGV鍛煎彨澶辫触锛屽凡杈惧埌鏈�澶ч噸璇曟鏁帮紙%d娆★級", maxRetryCount));
@@ -203,12 +203,12 @@
             }
             
             // 鎵撳嵃璇锋眰淇℃伅锛堝寘鍚噸璇曟鏁帮級
-            if (currentRetryCount > 0) {
-                log.info("{}鍛煎彨agv鎼繍锛堢{}娆¢噸璇曪級 - 璇锋眰鍦板潃锛歿}", namespace, currentRetryCount + 1, url);
-            } else {
-                log.info("{}鍛煎彨agv鎼繍 - 璇锋眰鍦板潃锛歿}", namespace, url);
-            }
-            log.info("{}鍛煎彨agv鎼繍 - 璇锋眰鍙傛暟锛歿}", namespace, body);
+            // if (currentRetryCount > 0) {
+            //     log.info("{}鍛煎彨agv鎼繍锛堢{}娆¢噸璇曪級 - 璇锋眰鍦板潃锛歿}", namespace, currentRetryCount + 1, url);
+            // } else {
+            //     log.info("{}鍛煎彨agv鎼繍 - 璇锋眰鍦板潃锛歿}", namespace, url);
+            // }
+            // log.info("{}鍛煎彨agv鎼繍 - 璇锋眰鍙傛暟锛歿}", namespace, body);
             
             try {
                 // 浣跨敤浠欏伐M4鎺ュ彛
@@ -219,12 +219,12 @@
                         .build()
                         .doPost();
                 // 鎵撳嵃杩斿洖鍙傛暟
-                log.info("{}鍛煎彨agv鎼繍 - 杩斿洖鍙傛暟锛歿}", namespace, response);
+                // log.info("{}鍛煎彨agv鎼繍 - 杩斿洖鍙傛暟锛歿}", namespace, response);
                 
                 // 妫�鏌ュ搷搴旀槸鍚︿负绌�
                 if (response == null || response.trim().isEmpty()) {
                     String errorMsg = "AGV鎺ュ彛杩斿洖涓虹┖";
-                    log.error("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛寋}", namespace, task.getId(), errorMsg);
+                    // log.error("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛寋}", namespace, task.getId(), errorMsg);
                     handleCallFailure(task, namespace, errorMsg, retryEnabled, maxRetryCount, currentRetryCount);
                     continue;
                 }
@@ -232,7 +232,7 @@
                 JSONObject jsonObject = JSON.parseObject(response);
                 if (jsonObject == null) {
                     String errorMsg = "鍝嶅簲JSON瑙f瀽澶辫触锛屽搷搴斿唴瀹癸細" + response;
-                    log.error("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛寋}", namespace, task.getId(), errorMsg);
+                    // log.error("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛寋}", namespace, task.getId(), errorMsg);
                     handleCallFailure(task, namespace, errorMsg, retryEnabled, maxRetryCount, currentRetryCount);
                     continue;
                 }
@@ -246,17 +246,17 @@
                     task.setErrorTime(null);
                     task.setErrorMemo(null);
                     taskService.updateById(task);
-                    log.info("{}鍛煎彨agv鎼繍鎴愬姛 - 浠诲姟ID锛歿}", namespace, task.getId());
+                    // log.info("{}鍛煎彨agv鎼繍鎴愬姛 - 浠诲姟ID锛歿}", namespace, task.getId());
                 } else {
                     String message = jsonObject.getString("message");
                     String errorMsg = String.format("閿欒鐮侊細%s锛岄敊璇俊鎭細%s", code, message);
-                    log.error("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛寋}", namespace, task.getId(), errorMsg);
+                    // log.error("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛寋}", namespace, task.getId(), errorMsg);
                     handleCallFailure(task, namespace, errorMsg, retryEnabled, maxRetryCount, currentRetryCount);
                 }
             } catch (Exception e) {
                 String errorMsg = "寮傚父淇℃伅锛�" + e.getMessage();
-                log.error("{}鍛煎彨agv鎼繍寮傚父 - 浠诲姟ID锛歿}锛岃姹傚湴鍧�锛歿}锛岃姹傚弬鏁帮細{}锛寋}", 
-                        namespace, task.getId(), url, body, errorMsg, e);
+                // log.error("{}鍛煎彨agv鎼繍寮傚父 - 浠诲姟ID锛歿}锛岃姹傚湴鍧�锛歿}锛岃姹傚弬鏁帮細{}锛寋}", 
+                //         namespace, task.getId(), url, body, errorMsg, e);
                 handleCallFailure(task, namespace, errorMsg, retryEnabled, maxRetryCount, currentRetryCount);
             } finally {
                 try {
@@ -271,7 +271,7 @@
                             success
                     );
                 } catch (Exception e) {
-                    log.error(namespace + "鍛煎彨agv淇濆瓨鎺ュ彛鏃ュ織寮傚父:", e);
+                    // log.error(namespace + "鍛煎彨agv淇濆瓨鎺ュ彛鏃ュ織寮傚父:", e);
                 }
             }
         }
@@ -295,8 +295,8 @@
             task.setErrorTime(new Date());
             task.setErrorMemo(String.format("AGV鍛煎彨澶辫触锛堢%d娆¢噸璇曪級锛�%s", newRetryCount, errorMsg));
             taskService.updateById(task);
-            log.info("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛屽凡閲嶈瘯{}娆★紝灏嗗湪涓嬫瀹氭椂浠诲姟鏃剁户缁噸璇曪紙鏈�澶歿}娆★級", 
-                    namespace, task.getId(), newRetryCount, maxRetryCount);
+            // log.info("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛屽凡閲嶈瘯{}娆★紝灏嗗湪涓嬫瀹氭椂浠诲姟鏃剁户缁噸璇曪紙鏈�澶歿}娆★級", 
+            //         namespace, task.getId(), newRetryCount, maxRetryCount);
         } else {
             // 涓嶅惎鐢ㄩ噸璇曟垨宸茶揪鍒版渶澶ч噸璇曟鏁帮紝鍋滄閲嶈瘯
             task.setErrorTime(new Date());
@@ -306,8 +306,8 @@
                 task.setErrorMemo(String.format("AGV鍛煎彨澶辫触锛堥噸璇曟湭鍚敤锛夛細%s", errorMsg));
             }
             taskService.updateById(task);
-            log.warn("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛屽仠姝㈤噸璇曘�傞敊璇俊鎭細{}", 
-                    namespace, task.getId(), errorMsg);
+            // log.warn("{}鍛煎彨agv鎼繍澶辫触 - 浠诲姟ID锛歿}锛屽仠姝㈤噸璇曘�傞敊璇俊鎭細{}", 
+            //         namespace, task.getId(), errorMsg);
         }
     }
 
@@ -390,7 +390,7 @@
             fromBin = task.getSourceStaNo();
         }
         if (fromBin == null || fromBin.isEmpty() || "0".equals(fromBin)) {
-            log.warn("浠诲姟{}鐨勬簮搴撲綅鍜屾簮绔欑偣閮戒负绌猴紝浣跨敤榛樿鍊�", task.getId());
+            // log.warn("浠诲姟{}鐨勬簮搴撲綅鍜屾簮绔欑偣閮戒负绌猴紝浣跨敤榛樿鍊�", task.getId());
             fromBin = "0";
         }
         object.put("fromBin", fromBin);
@@ -449,12 +449,12 @@
             // 榛樿浣跨敤涓滀晶
             targetStations = agvProperties.getEastStations();
             groupKey = "east";
-            log.warn("浠诲姟ID锛歿}鐨勬満鍣ㄤ汉缁剓}鏈瘑鍒紝浣跨敤榛樿涓滀晶绔欑偣", task.getId(), robotGroup);
+            // log.warn("浠诲姟ID锛歿}鐨勬満鍣ㄤ汉缁剓}鏈瘑鍒紝浣跨敤榛樿涓滀晶绔欑偣", task.getId(), robotGroup);
         }
         
         if (targetStations.isEmpty()) {
             String errorMsg = "娌℃湁鍙敤鐨勭洰鏍囩珯鐐归厤缃�";
-            log.warn("浠诲姟ID锛歿}", errorMsg, task.getId());
+            // log.warn("浠诲姟ID锛歿}", errorMsg, task.getId());
             return errorMsg;
         }
         
@@ -476,7 +476,7 @@
         
         if (sites.isEmpty()) {
             String errorMsg = "娌℃湁鑳藉叆绔欑偣";
-            log.warn("浠诲姟ID锛歿}", errorMsg, task.getId());
+            // log.warn("浠诲姟ID锛歿}", errorMsg, task.getId());
             return errorMsg;
         }
         
@@ -492,7 +492,7 @@
         
         if (devListWithConfig.isEmpty()) {
             // 绔欑偣閰嶇疆涓嶅厑璁稿叆搴擄紙canining != "Y"锛夛紝鏆備笉鍒嗛厤锛岀瓑寰呴厤缃紑閫氾紙鍙湪瀹氭椂浠诲姟涓褰曟棩蹇楋級
-            log.warn("浠诲姟ID锛歿}娌℃湁鍙叆绔欑偣锛堢珯鐐规湭寮�閫氬彲鍏ュ厑璁革細canining='Y'锛夛紝鏆備笉鍒嗛厤绔欑偣锛岀瓑寰呴厤缃紑閫�", task.getId());
+            // log.warn("浠诲姟ID锛歿}娌℃湁鍙叆绔欑偣锛堢珯鐐规湭寮�閫氬彲鍏ュ厑璁革細canining='Y'锛夛紝鏆備笉鍒嗛厤绔欑偣锛岀瓑寰呴厤缃紑閫�", task.getId());
             return null; // 杩斿洖null锛岃〃绀烘殏涓嶅垎閰嶏紝绛夊緟閰嶇疆寮�閫�
         }
         
@@ -503,7 +503,7 @@
         List<Integer> canInSites = basDevpMapper.getCanInSites(configuredSites);
         if (canInSites.isEmpty()) {
             // 鎵�鏈夊凡閰嶇疆鍙叆鐨勭珯鐐归兘鏈夊嚭搴撲换鍔★紝鏆備笉鍒嗛厤锛岀瓑寰呬笅娆″畾鏃朵换鍔″啀灏濊瘯锛堝彧鍦ㄥ畾鏃朵换鍔′腑璁板綍鏃ュ織锛�
-            log.warn("浠诲姟ID锛歿}娌℃湁鍙叆绔欑偣锛堣绛夊緟鍑哄簱瀹屾垚锛夛紝鏆備笉鍒嗛厤绔欑偣锛岀瓑寰呬笅娆″畾鏃朵换鍔″啀灏濊瘯", task.getId());
+            // log.warn("浠诲姟ID锛歿}娌℃湁鍙叆绔欑偣锛堣绛夊緟鍑哄簱瀹屾垚锛夛紝鏆備笉鍒嗛厤绔欑偣锛岀瓑寰呬笅娆″畾鏃朵换鍔″啀灏濊瘯", task.getId());
             return null; // 杩斿洖null锛岃〃绀烘殏涓嶅垎閰嶏紝绛夊緟涓嬫瀹氭椂浠诲姟鍐嶅皾璇�
         }
         
@@ -520,7 +520,7 @@
         if (devList.isEmpty()) {
             // 鐞嗚涓婁笉搴旇鍒拌繖閲岋紝鍥犱负鍓嶉潰宸茬粡妫�鏌ヨ繃浜嗭紝浣嗕负浜嗗畨鍏ㄨ捣瑙佽繕鏄繚鐣�
             String errorMsg = "娌℃湁鍙叆绔欑偣锛坕n_enable='Y'涓攃anining='Y'锛�";
-            log.warn("浠诲姟ID锛歿}", errorMsg, task.getId());
+            // log.warn("浠诲姟ID锛歿}", errorMsg, task.getId());
             return errorMsg;
         }
         
@@ -599,15 +599,15 @@
                 isTransporting = !transportingTasks.isEmpty();
                 
                 if (isTransporting) {
-                    log.debug("绔欑偣{}鏈墈}涓鍦ㄦ惉杩愮殑{}AGV浠诲姟锛屾鏌ヤ笅涓�涓珯鐐�", 
-                        staNo, transportingTasks.size(), taskTypeName);
+                    // log.debug("绔欑偣{}鏈墈}涓鍦ㄦ惉杩愮殑{}AGV浠诲姟锛屾鏌ヤ笅涓�涓珯鐐�", 
+                    //     staNo, transportingTasks.size(), taskTypeName);
                     continue; // 璇ョ珯鐐规鍦ㄦ惉杩愶紝妫�鏌ヤ笅涓�涓珯鐐�
                 }
             }
             
             // 鎵惧埌绗竴涓┖闂茬珯鐐癸紝鍒嗛厤
             selectedSite = dev;
-            log.info("浠诲姟ID锛歿}鎸夎鍒欏簲鍒嗛厤鍒扮珯鐐箋}锛岃绔欑偣绌洪棽锛屽垎閰嶆垚鍔�", task.getId(), staNo);
+            // log.info("浠诲姟ID锛歿}鎸夎鍒欏簲鍒嗛厤鍒扮珯鐐箋}锛岃绔欑偣绌洪棽锛屽垎閰嶆垚鍔�", task.getId(), staNo);
             break;
         }
         
@@ -623,7 +623,7 @@
         // 妫�鏌ョ珯鐐规槸鍚︽湁鏁堬紙涓嶈兘涓�0鎴杗ull锛�
         if (endSite == null || endSite == 0) {
             String errorMsg = String.format("鍒嗛厤鐨勭珯鐐规棤鏁堬紙dev_no=%s锛�", endSite);
-            log.error("浠诲姟ID锛歿}锛寋}", task.getId(), errorMsg);
+            // log.error("浠诲姟ID锛歿}锛寋}", task.getId(), errorMsg);
             return errorMsg;
         }
         
@@ -634,7 +634,7 @@
         task.setStaNo(String.valueOf(endSite));
         taskService.updateById(task);
         
-        log.info("浠诲姟ID锛歿}宸插垎閰嶇珯鐐癸細{}", task.getId(), endSite);
+        // log.info("浠诲姟ID锛歿}宸插垎閰嶇珯鐐癸細{}", task.getId(), endSite);
         return null; // 鍒嗛厤鎴愬姛锛岃繑鍥瀗ull
     }
 
diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 399614d..b8114ca 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -629,9 +629,40 @@
     public ReturnT<String> agvDoOut(Task task) {
         if (task.getIoType().equals(101)) {
             Date now = new Date();
+            
+            // 妫�鏌ourceLocNo鏄惁涓虹┖
+            if (task.getSourceLocNo() == null || task.getSourceLocNo().isEmpty()) {
+//                log.warn("浠诲姟ID锛歿}鐨剆ourceLocNo涓虹┖锛岃烦杩囧簱浣嶆搷浣滐紙鍙兘鏄粠绔欑偣鍏ュ簱鐨勪换鍔★級", task.getId());
+                task.setWrkSts(15L);
+                if (!taskService.updateById(task)) {
+                    throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+                }
+                return SUCCESS;
+            }
+            
+            // 鏌ヨ搴撲綅淇℃伅
             LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", task.getSourceLocNo()));
             if (Objects.isNull(locMast)) {
-                throw new RuntimeException("鏁版嵁閿欒锛氬簱浣嶄俊鎭笉鑳戒负绌猴紒锛�");
+                // 濡傛灉鏌ヨ涓嶅埌搴撲綅锛屽彲鑳芥槸sourceLocNo鏄珯鐐瑰彿鑰屼笉鏄簱浣嶅彿
+                // 妫�鏌asDevp琛ㄤ腑鏄惁瀛樺湪璇ョ珯鐐�
+                try {
+                    Integer siteNo = Integer.parseInt(task.getSourceLocNo());
+                    List<BasDevp> basDevpList = basDevpMapper.selectList(new EntityWrapper<BasDevp>().eq("dev_no", siteNo));
+                    if (basDevpList != null && !basDevpList.isEmpty()) {
+                        // sourceLocNo鏄珯鐐瑰彿锛岃繖鏄粠绔欑偣鍏ュ簱鐨勪换鍔★紝涓嶉渶瑕佸鐞嗗簱浣�
+//                        log.info("浠诲姟ID锛歿}鐨剆ourceLocNo鏄珯鐐瑰彿锛歿}锛岃烦杩囧簱浣嶆搷浣滐紙浠庣珯鐐瑰叆搴撲换鍔★級", task.getId(), task.getSourceLocNo());
+                        task.setWrkSts(15L);
+                        if (!taskService.updateById(task)) {
+                            throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+                        }
+                        return SUCCESS;
+                    }
+                } catch (NumberFormatException e) {
+                    // sourceLocNo涓嶆槸鏁板瓧锛屽彲鑳芥槸搴撲綅鍙锋牸寮忛敊璇�
+                    log.warn("浠诲姟ID锛歿}鐨剆ourceLocNo锛歿}涓嶆槸鏈夋晥鐨勬暟瀛楁牸寮�", task.getId(), task.getSourceLocNo());
+                }
+                // 鏃笉鏄簱浣嶄篃涓嶆槸绔欑偣锛屾姏鍑哄紓甯�
+                throw new RuntimeException("鏁版嵁閿欒锛氬簱浣嶄俊鎭笉鑳戒负绌猴紒锛佷换鍔D锛�" + task.getId() + "锛宻ourceLocNo锛�" + task.getSourceLocNo());
             }
             List<TaskDetl> wrkDetls101 = taskDetlService.selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo()));
             if (wrkDetls101.isEmpty()) {
@@ -1182,9 +1213,42 @@
         if (ioType == 1 || ioType == 10 || ioType == 53 || ioType == 57) {
             // ioType == 1 闇�瑕佸鐞嗙粍鎵樻暟鎹�
             if (ioType == 1) {
+                // 妫�鏌ocNo鏄惁涓虹┖
+                if (wrkMast.getLocNo() == null || wrkMast.getLocNo().isEmpty()) {
+                    log.warn("浠诲姟ID锛歿}鐨刲ocNo涓虹┖锛岃烦杩囧簱浣嶆搷浣滐紙鍙兘鏄粠绔欑偣鍏ュ簱鐨勪换鍔★級", wrkMast.getId());
+                    // 鏇存柊浠诲姟鐘舵�佷负5锛堝簱瀛樻洿鏂板畬鎴愶級
+                    wrkMast.setWrkSts(5L);
+                    wrkMast.setModiTime(new Date());
+                    if (!taskService.updateById(wrkMast)) {
+                        throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+                    }
+                    return SUCCESS;
+                }
+                
                 LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo()));
                 if (Objects.isNull(locCache)) {
-                    throw new CoolException("鏁版嵁閿欒锛屽簱浣嶄笉瀛樺湪锛侊紒");
+                    // 濡傛灉鏌ヨ涓嶅埌搴撲綅锛屽彲鑳芥槸locNo鏄珯鐐瑰彿鑰屼笉鏄簱浣嶅彿
+                    // 妫�鏌asDevp琛ㄤ腑鏄惁瀛樺湪璇ョ珯鐐�
+                    try {
+                        Integer siteNo = Integer.parseInt(wrkMast.getLocNo());
+                        List<BasDevp> basDevpList = basDevpMapper.selectList(new EntityWrapper<BasDevp>().eq("dev_no", siteNo));
+                        if (basDevpList != null && !basDevpList.isEmpty()) {
+                            // locNo鏄珯鐐瑰彿锛岃繖鏄粠绔欑偣鍏ュ簱鐨勪换鍔★紝涓嶉渶瑕佸鐞嗗簱浣嶆槑缁�
+                            log.info("浠诲姟ID锛歿}鐨刲ocNo鏄珯鐐瑰彿锛歿}锛岃烦杩囧簱浣嶆搷浣滐紙浠庣珯鐐瑰叆搴撲换鍔★級", wrkMast.getId(), wrkMast.getLocNo());
+                            // 鏇存柊浠诲姟鐘舵�佷负5锛堝簱瀛樻洿鏂板畬鎴愶級
+                            wrkMast.setWrkSts(5L);
+                            wrkMast.setModiTime(new Date());
+                            if (!taskService.updateById(wrkMast)) {
+                                throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+                            }
+                            return SUCCESS;
+                        }
+                    } catch (NumberFormatException e) {
+                        // locNo涓嶆槸鏁板瓧锛屽彲鑳芥槸搴撲綅鍙锋牸寮忛敊璇�
+                        log.warn("浠诲姟ID锛歿}鐨刲ocNo锛歿}涓嶆槸鏈夋晥鐨勬暟瀛楁牸寮�", wrkMast.getId(), wrkMast.getLocNo());
+                    }
+                    // 鏃笉鏄簱浣嶄篃涓嶆槸绔欑偣锛屾姏鍑哄紓甯�
+                    throw new CoolException("鏁版嵁閿欒锛屽簱浣嶄笉瀛樺湪锛侊紒浠诲姟ID锛�" + wrkMast.getId() + "锛宭ocNo锛�" + wrkMast.getLocNo());
                 }
                 if (!locCache.getLocSts().equals(LocStsType.LOC_STS_TYPE_S.type)) {
                     throw new CoolException("褰撳墠搴撲綅鐘舵�佷负锛�" + LocStsType.LOC_STS_TYPE_S.type + "." + LocStsType.LOC_STS_TYPE_S.desc + "锛屼笉鏄嚭搴撻绾︾姸鎬�");
diff --git a/src/main/java/com/zy/system/controller/UserController.java b/src/main/java/com/zy/system/controller/UserController.java
index 72b7101..f7a0b4d 100644
--- a/src/main/java/com/zy/system/controller/UserController.java
+++ b/src/main/java/com/zy/system/controller/UserController.java
@@ -120,6 +120,12 @@
         if (user.getDeptId() != null) {
             entity.setDeptId(user.getDeptId());
         }
+        if (user.getAdLogin() != null) {
+            entity.setAdLogin(user.getAdLogin());
+        }
+        if (user.getEmail() != null) {
+            entity.setEmail(user.getEmail());
+        }
         userService.updateById(entity);
         return R.ok();
     }
diff --git a/src/main/java/com/zy/system/entity/User.java b/src/main/java/com/zy/system/entity/User.java
index 1ebf235..d8a463e 100644
--- a/src/main/java/com/zy/system/entity/User.java
+++ b/src/main/java/com/zy/system/entity/User.java
@@ -92,6 +92,12 @@
      */
     private Integer status;
 
+    /**
+     * AD鐧诲綍 1: 鍚敤 0: 绂佺敤
+     */
+    @TableField("ad_login")
+    private Integer adLogin;
+
     public Long getId() {
         return id;
     }
@@ -260,4 +266,26 @@
         this.status = status;
     }
 
+    public Integer getAdLogin() {
+        return adLogin;
+    }
+
+    public void setAdLogin(Integer adLogin) {
+        this.adLogin = adLogin;
+    }
+
+    public String getAdLogin$() {
+        if (null == this.adLogin) {
+            return "绂佺敤";
+        }
+        switch (this.adLogin) {
+            case 1:
+                return "鍚敤";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.adLogin);
+        }
+    }
+
 }
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index fb78c11..089a235 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -10,9 +10,10 @@
     <property name="CONSOLE_LOG_PATTERN"
               value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(-%5p) ${PID:-} [%15.15t] %-40.40logger{39} : %m%n">
     </property>
-    <property name="LOG_PATH" value="/stock/out/wms/logs"/>
+    <!-- 鏃ュ織璺緞锛欴鐩橈紙Windows鐜锛夛紝Linux鐜浣跨敤/stock/out/wms/logs -->
+    <property name="LOG_PATH" value="D:/stock/out/wms/logs"/>
 
-    <!--鎺у埗鍙�-->
+    <!--鎺у埗鍙拌緭鍑�-->
     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
             <pattern>${CONSOLE_LOG_PATTERN}</pattern>
@@ -20,23 +21,27 @@
         </encoder>
     </appender>
 
-    <!--info绾у埆-->
+    <!--INFO绾у埆鏃ュ織-->
     <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${LOG_PATH}/info.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <FileNamePattern>${LOG_PATH}/info_%d{yyyy-MM-dd}.%i.log</FileNamePattern>
-            <maxHistory>10</maxHistory>
+            <!-- 淇濈暀15澶� -->
+            <maxHistory>15</maxHistory>
+            <!-- 鎬诲ぇ灏忛檺鍒�15GB锛堥槻姝㈡棩蹇楀崰鐢ㄨ繃澶氱┖闂达級 -->
+            <totalSizeCap>15GB</totalSizeCap>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-                <maxFileSize>10MB</maxFileSize>
+                <!-- 鍗曚釜鏂囦欢100MB锛堝噺灏戞枃浠舵暟閲忥級 -->
+                <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
         </rollingPolicy>
         <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
     </appender>
 
-    <!--error绾у埆-->
+    <!--ERROR绾у埆鏃ュ織-->
     <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>ERROR</level>
@@ -44,13 +49,39 @@
         <file>${LOG_PATH}/error.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <FileNamePattern>${LOG_PATH}/error_%d{yyyy-MM-dd}.%i.log</FileNamePattern>
-            <maxHistory>10</maxHistory>
+            <!-- 閿欒鏃ュ織淇濈暀30澶� -->
+            <maxHistory>30</maxHistory>
+            <!-- 閿欒鏃ュ織鎬诲ぇ灏忛檺鍒�5GB -->
+            <totalSizeCap>5GB</totalSizeCap>
             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-                <maxFileSize>10MB</maxFileSize>
+                <maxFileSize>100MB</maxFileSize>
             </timeBasedFileNamingAndTriggeringPolicy>
         </rollingPolicy>
         <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <!--WARN绾у埆鏃ュ織锛堝彲閫夛級-->
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+        <file>${LOG_PATH}/warn.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <FileNamePattern>${LOG_PATH}/warn_%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <!-- 璀﹀憡鏃ュ織淇濈暀15澶� -->
+            <maxHistory>15</maxHistory>
+            <totalSizeCap>2GB</totalSizeCap>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>50MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
             <charset>UTF-8</charset>
         </encoder>
     </appender>
@@ -59,5 +90,6 @@
         <appender-ref ref="CONSOLE"/>
         <appender-ref ref="INFO_FILE"/>
         <appender-ref ref="ERROR_FILE"/>
+        <appender-ref ref="WARN_FILE"/>
     </root>
 </configuration>
\ No newline at end of file
diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml
index df40f6c..8275533 100644
--- a/src/main/resources/mapper/UserMapper.xml
+++ b/src/main/resources/mapper/UserMapper.xml
@@ -16,6 +16,7 @@
         <result column="sex" property="sex" />
         <result column="create_time" property="createTime" />
         <result column="status" property="status" />
+        <result column="ad_login" property="adLogin" />
 
     </resultMap>
 
diff --git a/src/main/webapp/static/js/user/user.js b/src/main/webapp/static/js/user/user.js
index 7bb9f95..440901c 100644
--- a/src/main/webapp/static/js/user/user.js
+++ b/src/main/webapp/static/js/user/user.js
@@ -31,6 +31,7 @@
             ,{field: 'roleName', align: 'center',title: '瑙掕壊'}
             ,{field: 'email', align: 'center',title: '閭'}
             // ,{field: 'sex$', align: 'center',title: '鎬у埆'}
+            ,{field: 'adLogin$', align: 'center',title: 'AD鐧诲綍', templet: '#adLoginTpl', width: 100, unresize: true}
             ,{field: 'createTime$', align: 'center',title: '娉ㄥ唽鏃堕棿', hide: true}
             ,{field: 'status$', align: 'center',title: '鐘舵��', templet: '#statusTpl', width: 120, unresize: true}
 
@@ -92,6 +93,16 @@
         })
     })
 
+    // 淇敼AD鐧诲綍鐘舵��
+    form.on('switch(adLoginSwitch)', function (obj) {
+        var index  = obj.othis.parents('tr').attr("data-index");
+        var data = tableData[index];
+        data[this.name] = obj.elem.checked?1:0;
+        http.post(baseUrl+"/user/edit/auth", {id: data.id, adLogin: data[this.name]}, function (res) {
+            layer.msg(res.msg, {icon: 1});
+        })
+    })
+
     /* 琛ㄦ牸2宸ュ叿鏉$偣鍑讳簨浠� */
     table.on('tool(userTable)', function (obj) {
         var data = obj.data;
@@ -132,7 +143,31 @@
             content: $('#editDialog').html(),
             success: function (layero, dIndex) {
                 // 鍥炴樉琛ㄥ崟鏁版嵁
-                form.val('detail', mData);
+                if (mData) {
+                    form.val('detail', mData);
+                    // 澶勭悊AD鐧诲綍澶嶉�夋鐨勫洖鏄撅紙缂栬緫鐢ㄦ埛鏃讹級
+                    if (mData.adLogin === 1 || mData.adLogin === '1') {
+                        $('input[name="adLogin"]').prop('checked', true);
+                    } else {
+                        $('input[name="adLogin"]').prop('checked', false);
+                    }
+                } else {
+                    // 鏂板鐢ㄦ埛鏃讹紝纭繚AD鐧诲綍榛樿涓烘湭閫変腑
+                    $('input[name="adLogin"]').prop('checked', false);
+                    // 娓呯┖琛ㄥ崟
+                    form.val('detail', {
+                        username: '',
+                        mobile: '',
+                        email: '',
+                        roleId: '',
+                        roleName: '',
+                        deptId: '',
+                        deptName: '',
+                        adLogin: 0
+                    });
+                }
+                // 閲嶆柊娓叉煋琛ㄥ崟锛岀‘淇濆紑鍏虫帶浠舵纭樉绀�
+                form.render('checkbox');
                 // 琛ㄥ崟鎻愪氦浜嬩欢
                 form.on('submit(editSubmit)', function (data) {
                     if (isEmpty(data.field.roleId)) {
@@ -143,6 +178,12 @@
                         layer.msg('璇烽�夋嫨閮ㄩ棬', {icon: 2});
                         return false;
                     }
+                    // 澶勭悊AD鐧诲綍澶嶉�夋鐨勫��
+                    if (data.field.adLogin === '1' || data.field.adLogin === true) {
+                        data.field.adLogin = 1;
+                    } else {
+                        data.field.adLogin = 0;
+                    }
                     var loadIndex = layer.load(2);
                     $.ajax({
                         url: baseUrl+"/user/"+(mData?'update':'add')+"/auth",
diff --git a/src/main/webapp/views/user/user.html b/src/main/webapp/views/user/user.html
index ef10b06..1d8bd18 100644
--- a/src/main/webapp/views/user/user.html
+++ b/src/main/webapp/views/user/user.html
@@ -67,6 +67,10 @@
     <input type="checkbox" name="status" value="{{d.status}}" lay-skin="switch" lay-text="姝e父|绂佺敤" lay-filter="statusSwitch" {{ d.status === 1 ? 'checked' : '' }}>
 </script>
 
+    <script type="text/html" id="adLoginTpl">
+    <input type="checkbox" name="adLogin" value="{{d.adLogin}}" lay-skin="switch" lay-text="鍚敤|绂佺敤" lay-filter="adLoginSwitch" {{ d.adLogin === 1 ? 'checked' : '' }}>
+</script>
+
     <script type="text/html" id="operate">
     <a class="layui-btn layui-btn-xs btn-edit" lay-event="edit">缂栬緫</a>
     <a class="layui-btn layui-btn-xs btn-edit layui-btn-warm" lay-event="resetPwd">閲嶇疆瀵嗙爜</a>
@@ -150,10 +154,20 @@
                         </div>
                     </div>
                 </div>
-
             </div>
         </div>
         <hr class="layui-bg-gray">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+                <div class="layui-form-item">
+                    <label class="layui-form-label">AD鐧诲綍</label>
+                    <div class="layui-input-block">
+                        <input type="checkbox" name="adLogin" value="1" title="鍚敤AD鐧诲綍" lay-skin="switch" lay-text="鍚敤|绂佺敤" lay-filter="adLoginFormSwitch">
+                        <div class="layui-form-mid layui-word-aux" style="margin-left: 10px;">寮�鍚悗锛岀敤鎴峰彲浠ヤ娇鐢ˋD鍩熻处鍙风櫥褰曠郴缁�</div>
+                    </div>
+                </div>
+            </div>
+        </div>
         <div class="layui-form-item text-right">
             <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
             <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>

--
Gitblit v1.9.1