From af2ebb4ebbcb69f6385947aa322a508464388494 Mon Sep 17 00:00:00 2001
From: lsh <lsh@163.com>
Date: 星期二, 25 十一月 2025 09:03:39 +0800
Subject: [PATCH] *

---
 src/main/webapp/views/deviceOperate/devpOperate.html         |  228 +++++
 src/main/java/com/zy/core/enums/RgvModeType.java             |   24 
 src/main/java/com/zy/asrs/controller/RgvController.java      |  759 ++++++++++--------
 src/main/java/com/zy/common/config/AdminInterceptor.java     |   15 
 src/main/java/com/zy/common/config/WebConfig.java            |   12 
 src/main/java/com/zy/asrs/domain/param/RingThroughParam.java |   17 
 src/main/webapp/views/deviceOperate/crnOperate.html          |  399 +++++++++
 src/main/webapp/views/deviceOperate/rgvOperate.html          |  212 +++++
 src/main/webapp/views/deviceOperate/wcsOperate.html          |  678 ++++++++++++++++
 9 files changed, 1,985 insertions(+), 359 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/RgvController.java b/src/main/java/com/zy/asrs/controller/RgvController.java
index 80b35a5..1b5aa62 100644
--- a/src/main/java/com/zy/asrs/controller/RgvController.java
+++ b/src/main/java/com/zy/asrs/controller/RgvController.java
@@ -2,381 +2,444 @@
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
 import com.core.common.R;
-import com.core.exception.CoolException;
-import com.zy.asrs.domain.enums.RgvStatusType;
-import com.zy.asrs.domain.param.CrnOperatorParam;
-import com.zy.asrs.domain.param.RgvOperatorParam;
-import com.zy.asrs.domain.vo.RgvMsgTableVo;
-import com.zy.asrs.domain.vo.RgvStateTableVo;
-import com.zy.asrs.entity.BasRgv;
-import com.zy.asrs.entity.BasRgvErr;
-import com.zy.asrs.entity.BasRgvMap;
-import com.zy.asrs.entity.WrkMast;
-import com.zy.asrs.mapper.BasRgvErrMapper;
-import com.zy.asrs.mapper.BasRgvMapMapper;
-import com.zy.asrs.service.BasRgvService;
-import com.zy.asrs.service.LocMastService;
-import com.zy.asrs.service.WrkMastService;
-import com.zy.asrs.service.impl.MainServiceImpl;
-import com.zy.core.cache.MessageQueue;
-import com.zy.core.cache.OutputQueue;
+import com.zy.asrs.domain.param.RingThroughParam;
+import com.zy.asrs.entity.BasDevpPosition;
+import com.zy.asrs.service.BasDevpPositionService;
+import com.zy.core.cache.RgvErrCache;
+import com.zy.core.cache.RgvStatusCache;
 import com.zy.core.cache.SlaveConnection;
-import com.zy.core.enums.RgvModeType;
-import com.zy.core.enums.RgvTaskModeType;
-import com.zy.core.enums.RgvTaskStatusType;
+import com.zy.core.cache.TaskProtocolCache;
 import com.zy.core.enums.SlaveType;
-import com.zy.core.model.RgvSlave;
-import com.zy.core.model.Task;
-import com.zy.core.model.command.RgvCommand;
 import com.zy.core.model.protocol.RgvProtocol;
-import com.zy.core.properties.SlaveProperties;
+import com.zy.core.model.protocol.TaskProtocol;
 import com.zy.core.thread.RgvThread;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Objects;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * RGV鎺ュ彛
+ * 杈撻�佽澶囨帴鍙�
  * Created by vincent on 2020-06-01
  */
-@Slf4j
 @RestController
 @RequestMapping("/rgv")
 public class RgvController {
 
     @Autowired
-    private SlaveProperties slaveProperties;
-    @Autowired
-    private WrkMastService wrkMastService;
-    @Autowired
-    private BasRgvErrMapper basRgvErrMapper;
-    @Autowired
-    private BasRgvService basRgvService;
-    @Autowired
-    private MainServiceImpl mainService;
-    @Autowired
-    private LocMastService locMastService;
-    @Autowired
-    private BasRgvMapMapper basRgvMapMapper;
-//    @ManagerAuth(memo = "瑙i攣灏忚溅")
-//    @PostMapping("/lock")
-//    public R lock(CrnOperatorParam param){
-//        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, param.getRgvNo());
-//        rgvThread.setPakMk(true);
-//        return R.ok();
-//    }
-//
-//    @PostMapping("/table/rgv/state")
-//    @ManagerAuth(memo = "RGV淇℃伅琛�")
-//    public R rgvStateTable() {
-//        List<RgvStateTableVo> list = new ArrayList<>();
-//        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
-//
-//        for (BasRgv basRgv : rgvs) {
-//            RgvStateTableVo vo = new RgvStateTableVo();
-//            vo.setRgvNo(basRgv.getRgvNo());   //  RGV鍙�
-//            list.add(vo);
-//
-//            // 鑾峰彇RGV淇℃伅
-//            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
-//            if (rgvThread == null) continue;
-//
-//            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-//            if (rgvProtocol == null) continue;
-//            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
-//
-//            vo.setStatusType(rgvProtocol.modeType.desc);   // 妯″紡鐘舵��
-//            vo.setStatus(String.valueOf(rgvProtocol.getMode())); // 鐘舵��
-//            vo.setWorkNo1(rgvProtocol.getTaskNo1());      // 宸ヤ綅1浠诲姟鍙�
-//            vo.setStatus1(rgvProtocol.getStatusType1().desc); // 宸ヤ綅1鐘舵��
-//            vo.setLoading1(rgvProtocol.getLoaded1() ? "鏈夌墿" : "鏃犵墿"); // 宸ヤ綅1鏈夌墿
-//            vo.setRgvPos(basRgvMap != null?basRgvMap.getNowRoute():0);
-//            vo.setRgvPos1(rgvProtocol.getRgvPosI2());
-//            vo.setWalkPos(Objects.equals(rgvProtocol.getWalkPos(), 1) ? "鍦ㄥ畾浣�" : "涓嶅湪瀹氫綅");
-//            vo.setPakMk(rgvThread.isPakMk() ? "鏃犻攣" : "閿佸畾");
-////            vo.setPakIn(rgvThread.isPakIn() ? "鍙叆" : "涓嶅彲鍏�");
-////            vo.setPakOut(rgvThread.isPakOut() ? "鍙嚭" : "涓嶅彲鍑�");
-////            vo.setPakRgv(rgvThread.isPakRgv() ? "鏃犻攣" : "閿佸畾");
-//            vo.setPaking(rgvThread.isPaking()? "鏃犻攣" : "閿佸畾");
-////            vo.setPakAll(rgvThread.isPakAll() ? "鏃犻攣" : "閿佸畾");
-////            vo.setPakToCrn(rgvThread.isPakToCrn() ? "鏃犻攣" : "閿佸畾");
-//
-//
-//            vo.setWorkNo2(rgvProtocol.getTaskNo2());      // 宸ヤ綅2浠诲姟鍙�
-////            vo.setStatus2(rgvProtocol.getStatusType2().desc); // 宸ヤ綅2鐘舵��
-//            vo.setLoading2(rgvProtocol.getLoaded2() ? "鏈夌墿" : "鏃犵墿"); // 宸ヤ綅2鏈夌墿
-//
-//            // --- 閬嶅巻 errX 瀛楁鐢熸垚 warnCode 鍜� alarm ---
-//            List<String> alarms = new ArrayList<>();
-//            List<String> warnCodes = new ArrayList<>();
-//            Field[] fields = rgvProtocol.getClass().getDeclaredFields();
-//            for (Field field : fields) {
-//                if (field.getName().startsWith("err") && field.getType().equals(Boolean.class)) {
-//                    field.setAccessible(true);
-//                    try {
-//                        Boolean value = (Boolean) field.get(rgvProtocol);
-//                        if (Boolean.TRUE.equals(value)) {
-//                            String numPart = field.getName().substring(3);
-//                            int errId = Integer.parseInt(numPart);
-//                            warnCodes.add(String.valueOf(errId));
-//
-//                            BasRgvErr rgvErr = basRgvErrMapper.selectById(errId);
-//                            alarms.add(rgvErr == null ? "鏈煡寮傚父(" + errId + ")" : rgvErr.getErrName());
-//                        }
-//                    } catch (IllegalAccessException e) {
-//                        e.printStackTrace();
-//                    }
-//                }
-//            }
-//
-//            vo.setWarnCode(String.join(",", warnCodes));
-//            vo.setAlarm(alarms.isEmpty() ? "" : String.join("锛�", alarms));
-//        }
-//
-//        return R.ok().add(list);
-//    }
+    private BasDevpPositionService basDevpPositionService;
 
-
-//    @PostMapping("/table/rgv/msg")
-//    @ManagerAuth(memo = "RGV鏁版嵁琛�")
-//    public R rgvMsgTable(){
-//        List<RgvMsgTableVo> list = new ArrayList<>();
-//        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
-//        for (BasRgv basRgv : rgvs) {
-//            // 琛ㄦ牸琛�
-//            RgvMsgTableVo vo = new RgvMsgTableVo();
-//            vo.setRgvNo(basRgv.getRgvNo());   //  RGV鍙�
-//            list.add(vo);
-//            // 鑾峰彇RGV淇℃伅
-//            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
-//            if (rgvThread == null) {
-//                continue;
-//            }
-//            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-//            if (rgvProtocol == null) {
-//                continue;
-//            }
-//
-//            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  宸ヤ綅1宸ヤ綔鍙�
-//            vo.setWorkNo2(rgvProtocol.getTaskNo2()); //宸ヤ綅2 宸ヤ綔鍙�
-//            vo.setStaNo(String.valueOf(rgvProtocol.getRgvPosDestination())); //灏忚溅鐩爣绔�
-//            vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc);   //  妯″紡鐘舵��
-//
-//        }
-//        return R.ok().add(list);
-//    }
-
-    @PostMapping("/output/site")
-    @ManagerAuth(memo = "RGV鎶ユ枃鏃ュ織杈撳嚭")
-    public R rgvOutput(){
-        StringBuilder str = new StringBuilder();
-        String s;
-        int i = 0;
-        while((s = OutputQueue.RGV.poll()) != null && i <=10) {
-            str.append("\n").append(s);
-            i++;
+    @GetMapping("/status/all")
+//    @ManagerAuth(memo = "鍏ㄩ儴淇℃伅")
+    public R allStatus(){
+        List<Map<String, Object>> res = new ArrayList<>();
+        ConcurrentHashMap<Integer, RgvProtocol> allRgvStatus = RgvStatusCache.getAllRgvStatus();
+        for (RgvProtocol rgvProtocol : allRgvStatus.values()){
+            Map<String, Object> map2 = new HashMap<>();
+            map2.put("rgvNo", rgvProtocol.getRgvNo());
+            map2.put("taskNo", rgvProtocol.getTaskNo());
+            map2.put("mode", rgvProtocol.getModeType().desc);
+            map2.put("status", rgvProtocol.getStatusType().desc);
+            map2.put("rgvPos", rgvProtocol.getRgvPos());
+            map2.put("rgvPosDestination", rgvProtocol.getRgvPosDestination());
+            map2.put("loaded", rgvProtocol.getLoaded().equals((short)-1)? "鏈煡":rgvProtocol.getLoaded()==1? "鏈夌墿":"鏃犵墿");
+            map2.put("errorRgv", RgvErrCache.getErrorDev(rgvProtocol.getRgvNo()));
+            res.add(map2);
         }
-        return R.ok().add(str.toString());
+        return R.ok().add(res);
     }
 
-//    /****************************************************************/
-//    /************************** 鎵嬪姩鎿嶄綔 ******************************/
-//    /****************************************************************/
-//
-//    @ManagerAuth(memo = "鍙栨斁璐�")
-//    @PostMapping("/operator/put")
-//    public R rgvFetchPut(RgvOperatorParam param){
-//        RgvCommand command = new RgvCommand();
-//        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
-//        command.setAckFinish1(false);  // 浠诲姟瀹屾垚纭浣�
-//        command.setTaskNo(0); // 宸ヤ綔鍙�
-//        command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 浠诲姟妯″紡: 鍙栨斁璐�
-//        command.setSourceStaNo1(param.getSourceStaNo1()); // 婧愮珯
-////        command.setDestinationStaNo1(param.getStaNo1());  // 鐩爣绔�
-//        command.setAckFinish2(false);  // 浠诲姟瀹屾垚纭浣�
-//        command.setTaskNo2(0); // 宸ヤ綔鍙�
-//        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 浠诲姟妯″紡: 鍙栨斁璐�
-//        command.setSourceStaNo2(param.getSourceStaNo2()); // 婧愮珯
-////        command.setDestinationStaNo2(param.getStaNo2());  // 鐩爣绔�
-//        command.setCommand(true);
-//
-//        return rgvControl(command)? R.ok(): R.error();
-//    }
+    @PostMapping("/task/cache/all")
+//    @ManagerAuth(memo = "鍏ㄩ儴淇℃伅")
+    public R allTaskCache(@RequestParam(defaultValue = "0")  Integer rgvNo){
+        List<Map<String, Object>> res = new ArrayList<>();
+        try{
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+            TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
+            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+            for (TaskProtocol taskProtocol : allTaskProtocol.values()){
+                Map<String, Object> map2 = new HashMap<>();
+                map2.put("rgvNo", rgvNo);
+                map2.put("taskNo", taskProtocol.getTaskNo());
+                map2.put("targetPosition", taskProtocol.getTargetPosition());
+                map2.put("isRunning", taskProtocol.getIsRunning());
+                map2.put("taskStatus", taskProtocol.getTaskStatus());
+                map2.put("direction", taskProtocol.isDirection());
+                res.add(map2);
+            }
+        } catch (Exception e){
+//            return R.error("寮傚父"+e.getMessage());
+        }
+        return R.ok().add(res);
+    }
 
-//    @ManagerAuth(memo = "鍙栬揣")
-//    @PostMapping("/operator/take")
-//    public R rgvFetch(RgvOperatorParam param){
-//        RgvCommand command = new RgvCommand();
-//        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
-//        command.setWrkTaskPri(param.getWorkSta());  //鎵ц宸ヤ綅
-//        command.setTaskNo(Math.toIntExact(param.getWorkNo())); // 宸ヤ綔鍙�
-//        command.setTaskStatus(RgvTaskStatusType.FETCH); // 浠诲姟妯″紡: 鍙栬揣
-//        command.setTargetPosition(Integer.valueOf(param.getStaNo()));  // 鐩爣绔�
-////        command.setTaskMode2(RgvTaskModeType.FETCH); // 浠诲姟妯″紡: 鍙栨斁璐�
-////        command.setAckFinish1(false);  // 浠诲姟瀹屾垚纭浣�
-////        command.setSourceStaNo1(param.getSourceStaNo1()); // 婧愮珯
-////        command.setAckFinish2(false);  // 浠诲姟瀹屾垚纭浣�
-////        command.setTaskNo2( 0); // 宸ヤ綔鍙�
-////        command.setSourceStaNo2(param.getSourceStaNo2()); // 婧愮珯
-////        command.setDestinationStaNo2(param.getStaNo2());  // 鐩爣绔�
-//        command.setCommand(true);
-//
-//        return rgvControl(command)? R.ok(): R.error();
-//    }
+    @PostMapping("/run/del")//Take  Put  Walk
+//    @ManagerAuth(memo = "娓呯┖浠诲姟")
+    public R rgvRunDel(@RequestParam(defaultValue = "0")  Integer rgvNo
+    ) {
+        if (rgvNo==null || rgvNo==0){
+            return R.error("璇烽�夋嫨灏忚溅");
+        }
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
 
-//    @ManagerAuth(memo = "鏀捐揣")
-//    @PostMapping("/operator/stockMove")
-//    public R rgvPut(RgvOperatorParam param){
-//        RgvCommand command = new RgvCommand();
-//        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
-//        command.setWrkTaskPri(param.getWorkSta());  //鎵ц宸ヤ綅
-//        command.setTaskNo(Math.toIntExact(param.getWorkNo())); // 宸ヤ綔鍙�
-//        command.setTaskStatus(RgvTaskStatusType.PUT); // 浠诲姟妯″紡: 鍙栬揣
-//        command.setTargetPosition(Integer.valueOf(param.getStaNo()));  // 鐩爣绔�
-////        command.setAckFinish1(false);  // 浠诲姟瀹屾垚纭浣�
-////        command.setSourceStaNo1(param.getSourceStaNo1()); // 婧愮珯
-////        command.setAckFinish2(false);  // 浠诲姟瀹屾垚纭浣�
-////        command.setTaskNo2( 0); // 宸ヤ綔鍙�
-////        command.setTaskMode2(RgvTaskModeType.FETCH); // 浠诲姟妯″紡: 鍙栨斁璐�
-////        command.setSourceStaNo2(param.getSourceStaNo2()); // 婧愮珯
-////        command.setDestinationStaNo2(param.getStaNo2());  // 鐩爣绔�
-//        command.setCommand(true);
-//
-//        return rgvControl(command)? R.ok(): R.error();
-//    }
+        try {
+            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+            for (TaskProtocol taskProtocol : allTaskProtocol.values()){
+                taskProtocolCache.removeTaskProtocol(taskProtocol.getTaskNoDirection());
+            }
+
+        } catch (Exception e) {
+            return R.error("浠诲姟鍒犻櫎澶辫触"+e.getMessage());
+        }
+
+        return R.ok("浠诲姟娓呯┖鎴愬姛");
+    }
+
+    @PostMapping("/run/del2")//Take  Put  Walk
+//    @ManagerAuth(memo = "娓呴櫎浣滀笟鍚姩涓�")
+    public R rgvRunDel2(@RequestParam(defaultValue = "0")  Integer rgvNo
+    ) {
+        if (rgvNo==null || rgvNo==0){
+            return R.error("璇烽�夋嫨灏忚溅");
+        }
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        try {
+            rgvThread.setWrkSign();
+        } catch (Exception e) {
+            return R.error("娓呴櫎浣滀笟鍚姩涓け璐�"+e.getMessage());
+        }
+
+        return R.ok("浠诲姟娓呯┖鎴愬姛");
+    }
+
+    @PostMapping("/run/walk")//Take  Put  Walk
+//    @ManagerAuth(memo = "灏忚溅琛岃蛋")
+    public R rgvRunWalk(@RequestParam(defaultValue = "0")  Integer rgvNo,
+                        @RequestParam(defaultValue = "9999")  Integer taskNo,
+                        @RequestParam(defaultValue = "0")  Integer rgvStaNoPut,
+                        @RequestParam(defaultValue = "0")  Long rgvPosDestination
+    ) {
+        if (rgvNo==null || rgvNo==0){
+            return R.error("璇烽�夋嫨灏忚溅");
+        }
+        if ((rgvStaNoPut == null || rgvStaNoPut == 0) && (rgvPosDestination==null || rgvPosDestination==0L)){
+            return R.error("鐩爣绔欑偣璇峰~鍐�");
+        }
+        if (rgvPosDestination == null || rgvPosDestination == 0){
+            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut));
+            if (Cools.isEmpty(basDevpPosition)){
+                return R.error("鐩爣绔欑偣涓嶅瓨鍦�");
+            }
+            rgvPosDestination = basDevpPosition.getPlcPosition();
+        }
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
+
+        TaskProtocol issued = new TaskProtocol();
+
+        try {
+            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+            if (allTaskProtocol.size() > 0) {
+                return R.error("瀛樺湪鎵ц涓换鍔★紝璇峰厛澶勭悊锛侊紒锛�");
+            }
+
+            //鎵ц
+            issued.setTaskNo(Long.valueOf(taskNo));
+            issued.setTaskStatus(1);
+            issued.setTaskNoDirection(issued.gettaskNoDirection$(issued.getTaskNo(), issued.getTaskStatus()));
+            issued.setTargetPosition(rgvPosDestination);
+            issued.setIsRunning(1);
+            issued.setDirection(true);
+
+            taskProtocolCache.updateTaskProtocol(issued);
+
+        } catch (Exception e) {
+            return R.error("浠诲姟鐢熸垚澶辫触"+e.getMessage());
+        }
+
+        return R.ok("浠诲姟鐢熸垚鎴愬姛");
+    }
+
+    @PostMapping("/run/put")//Take  Put  Walk
+//    @ManagerAuth(memo = "灏忚溅鏀捐揣")
+    public R rgvPutWalk(@RequestParam(defaultValue = "0")  Integer rgvNo,
+                        @RequestParam(defaultValue = "9999")  Integer taskNo,
+                        @RequestParam(defaultValue = "0")  Integer rgvStaNoPut,
+                        @RequestParam(defaultValue = "0")  Long rgvPosDestination
+    ) {
+        if (rgvNo==null || rgvNo==0){
+            return R.error("璇烽�夋嫨灏忚溅");
+        }
+        if (rgvStaNoPut == null || rgvStaNoPut == 0){
+            return R.error("鐩爣绔欑偣璇峰~鍐�");
+        }
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
+
+        TaskProtocol issuedPut = new TaskProtocol();
+
+        try {
+            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+            if (allTaskProtocol.size() > 0) {
+                return R.error("瀛樺湪鎵ц涓换鍔★紝璇峰厛澶勭悊锛侊紒锛�");
+            }
+
+            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut));
+            if (Cools.isEmpty(basDevpPosition)){
+                return R.error("鐩爣绔欑偣涓嶅瓨鍦�");
+            }
+            //鎵ц
+            issuedPut.setTaskNo(Long.valueOf(taskNo));
+            issuedPut.setTaskStatus(3);
+            issuedPut.setTargetPositionStaNo(basDevpPosition.getDevNo());
+            issuedPut.setTargetPositionStaNoPlcId(basDevpPosition.getPlcId());
+            issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
+            issuedPut.setTargetPosition(basDevpPosition.getPlcPosition());
+            issuedPut.setIsRunning(1);
+            issuedPut.setDirection(basDevpPosition.getRgvSign()==1);
+
+            taskProtocolCache.updateTaskProtocol(issuedPut);
+        } catch (Exception e) {
+            return R.error("浠诲姟鐢熸垚澶辫触"+e.getMessage());
+        }
+
+        return R.ok("浠诲姟鐢熸垚鎴愬姛");
+    }
+
+    @PostMapping("/run/take")//Take  Put  Walk
+//    @ManagerAuth(memo = "灏忚溅鍙栬揣")
+    public R rgvTakeWalk(@RequestParam(defaultValue = "0") Integer rgvNo,
+                         @RequestParam(defaultValue = "9999") Integer taskNo,
+                         @RequestParam(defaultValue = "0") Integer rgvStaNoTake,
+                         @RequestParam(defaultValue = "0") Long rgvPosDestination
+    ) {
+        if (rgvNo==null || rgvNo==0){
+            return R.error("璇烽�夋嫨灏忚溅");
+        }
+        if (rgvStaNoTake == null || rgvStaNoTake == 0){
+            return R.error("鍙栬揣绔欑偣璇峰~鍐�");
+        }
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
+
+        TaskProtocol issuedTake = new TaskProtocol();
+        try {
+            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+            if (allTaskProtocol.size() > 0) {
+                return R.error("瀛樺湪鎵ц涓换鍔★紝璇峰厛澶勭悊锛侊紒锛�");
+            }
+
+            BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoTake));
+            if (Cools.isEmpty(basDevpPosition)){
+                return R.error("鍙栬揣绔欑偣涓嶅瓨鍦�");
+            }
+            //鎵ц
+            issuedTake.setTaskNo(Long.valueOf(taskNo));
+            issuedTake.setTaskStatus(2);
+            issuedTake.setTargetPositionStaNo(basDevpPosition.getDevNo());
+            issuedTake.setTargetPositionStaNoPlcId(basDevpPosition.getPlcId());
+            issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
+            issuedTake.setTargetPosition(basDevpPosition.getPlcPosition());
+            issuedTake.setIsRunning(1);
+            issuedTake.setDirection(basDevpPosition.getRgvSign()==1);
+
+            taskProtocolCache.updateTaskProtocol(issuedTake);
+        } catch (Exception e) {
+            return R.error("浠诲姟鐢熸垚澶辫触"+e.getMessage());
+        }
+
+        return R.ok("浠诲姟鐢熸垚鎴愬姛");
+    }
+
+    @PostMapping("/run/TakeAndPut")//Take  Put  Walk
+//    @ManagerAuth(memo = "灏忚溅鍙栬揣")
+    public R rgvTakeAndPut(@RequestParam(defaultValue = "0") Integer rgvNo,
+                           @RequestParam(defaultValue = "9999") Integer taskNo,
+                           @RequestParam(defaultValue = "0") Integer rgvStaNoTake,
+                           @RequestParam(defaultValue = "0") Integer rgvStaNoPut,
+                           @RequestParam(defaultValue = "0") Long rgvPosDestination
+    ) {
+        if (rgvNo==null || rgvNo==0){
+            return R.error("璇烽�夋嫨灏忚溅");
+        }
+        if (rgvStaNoTake == null || rgvStaNoTake == 0){
+            return R.error("鍙栬揣绔欑偣璇峰~鍐�");
+        }
+        if (rgvStaNoPut == null || rgvStaNoPut == 0){
+            return R.error("鏀捐揣绔欑偣璇峰~鍐�");
+        }
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
+
+        TaskProtocol issuedTake = new TaskProtocol();
+        TaskProtocol issuedPut = new TaskProtocol();
+        try {
+            ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+            if (allTaskProtocol.size() > 0) {
+                return R.error("瀛樺湪鎵ц涓换鍔★紝璇峰厛澶勭悊锛侊紒锛�");
+            }
+
+            BasDevpPosition basDevpPositionTake = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoTake));
+            if (Cools.isEmpty(basDevpPositionTake)){
+                return R.error("鍙栬揣绔欑偣涓嶅瓨鍦�");
+            }
+            //鎵ц
+            issuedTake.setTaskNo(Long.valueOf(taskNo));
+            issuedTake.setTaskStatus(2);
+            issuedTake.setTargetPositionStaNo(basDevpPositionTake.getDevNo());
+            issuedTake.setTargetPositionStaNoPlcId(basDevpPositionTake.getPlcId());
+            issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(), issuedTake.getTaskStatus()));
+            issuedTake.setTargetPosition(basDevpPositionTake.getPlcPosition());
+            issuedTake.setIsRunning(1);
+            issuedTake.setDirection(basDevpPositionTake.getRgvSign()==1);
+
+            BasDevpPosition basDevpPositionPut = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStaNoPut));
+            if (Cools.isEmpty(basDevpPositionPut)){
+                return R.error("鐩爣绔欑偣涓嶅瓨鍦�");
+            }
+            //鎵ц
+            issuedPut.setTaskNo(Long.valueOf(taskNo));
+            issuedPut.setTaskStatus(3);
+            issuedPut.setTargetPositionStaNo(basDevpPositionPut.getDevNo());
+            issuedPut.setTargetPositionStaNoPlcId(basDevpPositionPut.getPlcId());
+            issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(), issuedPut.getTaskStatus()));
+            issuedPut.setTargetPosition(basDevpPositionPut.getPlcPosition());
+            issuedPut.setIsRunning(1);
+            issuedPut.setDirection(basDevpPositionPut.getRgvSign()==1);
+
+            taskProtocolCache.updateTaskProtocol(issuedTake);
+            taskProtocolCache.updateTaskProtocol(issuedPut);
+
+        } catch (Exception e) {
+            return R.error("浠诲姟鐢熸垚澶辫触"+e.getMessage());
+        }
+
+        return R.ok("浠诲姟鐢熸垚鎴愬姛");
+    }
+
+    @PostMapping("/run/delRgvTask")//Take  Put  Walk
+//    @ManagerAuth(memo = "灏忚溅鍙栬揣")
+    public R rgvDelRgvTask(@RequestParam(defaultValue = "0") Integer rgvNo
+    ) {
+        if (rgvNo==null || rgvNo==0){
+            return R.error("璇烽�夋嫨灏忚溅");
+        }
+
+        try {
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+            rgvThread.setDelRgvTask();
+        } catch (Exception e) {
+            return R.error("浠诲姟鐢熸垚澶辫触"+e.getMessage());
+        }
+
+        return R.ok("浠诲姟鐢熸垚鎴愬姛");
+    }
 
 
 
-//    @ManagerAuth(memo = "浠诲姟瀹屾垚")
-//    @PostMapping("/operator/taskComplete")
-//    public R rgvTaskComplete(RgvOperatorParam param){
-//        RgvCommand command = new RgvCommand();
-//        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
-//        command.setAckFinish1(true);  // 浠诲姟瀹屾垚纭浣�
-////        command.setTaskNo1(0); // 宸ヤ綔鍙�
-//        command.setTaskMode1(RgvTaskModeType.NONE); // 浠诲姟妯″紡
-//        command.setSourceStaNo1((short) 0); // 婧愮珯
-//        command.setDestinationStaNo1((short) 0);  // 鐩爣绔�
-//        command.setAckFinish2(true);  // 浠诲姟瀹屾垚纭浣�
-//        command.setTaskNo2( 0); // 宸ヤ綔鍙�
-//        command.setTaskMode2(RgvTaskModeType.NONE); // 浠诲姟妯″紡
-//        command.setSourceStaNo2((short) 0); // 婧愮珯
-//        command.setDestinationStaNo2((short) 0);  // 鐩爣绔�
-//        command.setCommand(true);
-//
-//        return rgvControl(command)? R.ok(): R.error();
-//    }
+    @PostMapping("/ring/through/rgv/position/data")
+//    @ManagerAuth(memo = "灏忚溅浣嶇疆淇℃伅")
+    public R ringThroughRgv(){
+        List<RingThroughParam> result = new ArrayList<>();
 
-//    @ManagerAuth(memo = "娓呴櫎鍛戒护")
-//    @PostMapping("/operator/clearCommand")
-//    public R rgvClearCommand(RgvOperatorParam param){
-//        if (param.getRgvNo() == null) {
-//            throw new CoolException("璇烽�夋嫨RGV鍙�");
-//        }
-//        RgvCommand command = new RgvCommand();
-//        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
-//        command.setWrkTaskPri(0);  //鎵ц宸ヤ綅
-//        command.setTaskNo(Math.toIntExact(0)); // 宸ヤ綔鍙�
-//        command.setTaskStatus((short)0); // 浠诲姟妯″紡: 鍙栬揣
-//        command.setTargetPosition(0);  // 鐩爣绔�
-//
-//        return rgvClear(command)? R.ok(): R.error();
-//    }
+        ConcurrentHashMap<Integer, RgvProtocol> allRgvStatus = RgvStatusCache.getAllRgvStatus();
+        for (RgvProtocol rgvProtocol : allRgvStatus.values()){
+            RingThroughParam ringThroughParam = new RingThroughParam();
 
-//    @ManagerAuth(memo = "鎵嬪姩澶嶄綅")
-//    @PostMapping("/operator/handleReset")
-//    public R handleReset(RgvOperatorParam param) throws Exception {
-//        if (param.getRgvNo() == null) {
-//            throw new CoolException("璇烽�夋嫨RGV");
-//        }
-//        // 鑾峰彇RGV缂撳瓨
-//        for (RgvSlave rgv : slaveProperties.getRgv()) {
-//            // 鑾峰彇RGV淇℃伅
-//            if (param.getRgvNo().equals(rgv.getId())) {
-//                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
-//                if (rgvThread == null) {
-//                    throw new CoolException("RGV涓嶅湪绾�");
-//                }
-//                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-//                if (rgvProtocol == null) {
-//                    throw new CoolException("RGV涓嶅湪绾�");
-//                }
-//                RgvCommand Command = new RgvCommand();
-//                Command.setRgvNo(rgv.getId()); // RGV缂栧彿
-//                Command.setTaskMode1(RgvTaskModeType.NONE);
-//                Command.setAckFinish1(true);  // 浠诲姟瀹屾垚纭浣�
-//                Command.setAckFinish2(true);  // 浠诲姟瀹屾垚纭浣�
-//                Command.setCommand(true);  // 浠诲姟瀹屾垚纭浣�
-//                // 寤舵椂鍙戦��
-//                Thread.sleep(1000L);
-//                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, Command))) {
-//                    return R.ok();
-//                } else {
-//                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
-//                }
-//
-//            }
-//        }
-//        return R.error();
-//    }
-//
-//    private boolean rgvControl(RgvCommand command){
-//        if (command.getRgvNo() == null) {
-//            throw new CoolException("璇烽�夋嫨RGV");
-//        }
-//        for (RgvSlave rgv : slaveProperties.getRgv()) {
-//            // 鑾峰彇RGV淇℃伅
-//            if (command.getRgvNo().equals(rgv.getId())) {
-//                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
-//                if (rgvThread == null) {
-//                    throw new CoolException("RGV涓嶅湪绾�");
-//                }
-//                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-//                if (rgvProtocol == null) {
-//                    throw new CoolException("RGV涓嶅湪绾�");
-//                }
-//                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(2, command))) {
-//                    return true;
-//                } else {
-//                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
-//                }
-//            }
-//        }
-//        return false;
-//    }
-//
-//    private boolean rgvClear(RgvCommand command){
-//        if (command.getRgvNo() == null) {
-//            throw new CoolException("璇烽�夋嫨RGV");
-//        }
-//        for (RgvSlave rgv : slaveProperties.getRgv()) {
-//            // 鑾峰彇RGV淇℃伅
-//            if (command.getRgvNo().equals(rgv.getId())) {
-//                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
-//                if (rgvThread == null) {
-//                    throw new CoolException("RGV涓嶅湪绾�");
-//                }
-//                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-//                if (rgvProtocol == null) {
-//                    throw new CoolException("RGV涓嶅湪绾�");
-//                }
-//                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(3, command))) {
-//                    return true;
-//                } else {
-//                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
-//                }
-//            }
-//        }
-//        return false;
-//
-//    }
+            ringThroughParam.setIndex(rgvProtocol.getRgvNo());
+//            ringThroughParam.setIndex(i);
+//            double[] doubles = Utils.RingThroughXY2(perimeter, NumUtils.GetRandomIntInRange(183));
+//            double[] doubles = Utils.RingThroughXYRgv(perimeter, perimeter-rgvProtocol.RgvPos.doubleValue());
+//            double[] doubles = Utils.getRgvPosNew(perimeter, rgvProtocol.RgvPos.doubleValue());
+//            double[] doubles = Utils.RingThroughXY2(183.0, 100*i );
 
-}
\ No newline at end of file
+            ringThroughParam.setValueX(rgvProtocol.getRgvNo()*100*1D);
+            ringThroughParam.setValueY(rgvProtocol.getRgvNo()*100*2D);
+            ringThroughParam.setModeColor(rgvProtocol.modeType.color);
+            ringThroughParam.setStatusColor(rgvProtocol.statusType.color);
+            result.add(ringThroughParam);
+        }
+        return R.ok().add(result);
+    }
+
+    @PostMapping("/ring/through/dev/position/data")
+//    @ManagerAuth(memo = "绔欑偣淇℃伅")
+    //  绔欑偣浣嶇疆淇℃伅
+    public R ringThroughDev(){
+        List<RingThroughParam> result = new ArrayList<>();
+        ArrayList<Integer> arrayList = new ArrayList<Integer>() {{
+            add(1001);
+            add(1002);
+            add(1003);
+            add(1004);
+            add(1005);
+            add(1006);
+            add(1007);
+            add(1008);
+            add(1009);
+            add(1010);
+            add(1011);
+            add(1012);
+            add(1013);
+            add(1014);
+            add(1015);
+            add(1016);
+            add(1017);
+            add(1018);
+            add(1019);
+            add(1020);
+            add(1021);
+            add(1022);
+            add(1023);
+        }};
+        for (Integer staNo : arrayList){
+            RingThroughParam ringThroughParam = new RingThroughParam();
+            ringThroughParam.setIndex(staNo);
+//            double[] doubles = Utils.RingThroughXYSta(perimeter, perimeter-basDevpPosition.getPlcPosition());
+//            ringThroughParam.setValueX(doubles[0]>50? doubles[0]+6:doubles[0]-1);
+//            ringThroughParam.setValueY(doubles[1]>50? doubles[1]+6:doubles[1]-1);
+//            double[] doubles = Utils.getRgvPosNew(basDevpPosition.getDevNo(),perimeter, basDevpPosition.getPlcPosition());
+            ringThroughParam.setValueX(staNo*100*1D);
+            ringThroughParam.setValueY(staNo*100*2D);
+            result.add(ringThroughParam);
+        }
+        return R.ok().add(result);
+    }
+
+    @PostMapping("/ring/through/track/position/data")
+//    @ManagerAuth(memo = "杞ㄩ亾PLC鐘舵�佷俊鎭�")
+    public R wnergyGatheringRingParamTrack(){
+        return R.ok();
+    }
+
+    @PostMapping("/ring/through/task/wrk/mast/position/data")
+//    @ManagerAuth(memo = "浣滀笟淇℃伅")
+    public R ringThroughTaskWrkMast(){
+        return R.ok();
+    }
+
+    @PostMapping("/ring/through/task/wrk/mast/position/data/v1")
+//    @ManagerAuth(memo = "浣滀笟淇℃伅")
+    public R ringThroughTaskWrkMastV1(){
+        return R.ok();
+    }
+
+    @PostMapping("/task/rgv/circular/shuttle/mast/position/data")
+//    @ManagerAuth(memo = "浣滀笟淇℃伅")
+    public R rgvCircularShuttle(){
+        return R.ok();
+    }
+
+    @PostMapping("/task/rgv/circular/shuttle/mast/position/data/v1")
+//    @ManagerAuth(memo = "浣滀笟淇℃伅")
+    public R rgvCircularShuttleV1(){
+        return R.ok();
+    }
+}
diff --git a/src/main/java/com/zy/asrs/domain/param/RingThroughParam.java b/src/main/java/com/zy/asrs/domain/param/RingThroughParam.java
new file mode 100644
index 0000000..f920c86
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/RingThroughParam.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+@Data
+public class RingThroughParam {
+    // RGV鍙�
+    private Integer index;
+
+    private Double valueX;
+
+    private Double valueY;
+
+    private String modeColor;
+
+    private String statusColor;
+}
diff --git a/src/main/java/com/zy/common/config/AdminInterceptor.java b/src/main/java/com/zy/common/config/AdminInterceptor.java
index 04ca10f..70355df 100644
--- a/src/main/java/com/zy/common/config/AdminInterceptor.java
+++ b/src/main/java/com/zy/common/config/AdminInterceptor.java
@@ -43,6 +43,21 @@
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        System.out.println("=== 鎷︽埅鍣ㄦ敹鍒拌姹� ===");
+        System.out.println("鏂规硶: " + request.getMethod());
+        System.out.println("URI: " + request.getRequestURI());
+
+        // 鍏抽敭淇锛氬繀椤绘斁琛� OPTIONS 棰勬璇锋眰
+        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
+            System.out.println("鉁� 鏀捐 OPTIONS 棰勬璇锋眰");
+            // 鎵嬪姩璁剧疆 CORS 澶�
+            response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8080");
+            response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
+            response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Token, token");
+            response.setHeader("Access-Control-Allow-Credentials", "true");
+            response.setStatus(HttpServletResponse.SC_OK);
+            return false; // OPTIONS 璇锋眰涓嶉渶瑕佺户缁悗缁鐞�
+        }
         cors(response);
         if (handler instanceof org.springframework.web.servlet.resource.ResourceHttpRequestHandler) {
             return true;
diff --git a/src/main/java/com/zy/common/config/WebConfig.java b/src/main/java/com/zy/common/config/WebConfig.java
index 11bb6b2..45cf5e3 100644
--- a/src/main/java/com/zy/common/config/WebConfig.java
+++ b/src/main/java/com/zy/common/config/WebConfig.java
@@ -2,6 +2,7 @@
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -20,5 +21,16 @@
                 .addPathPatterns("/**")
                 ;
     }
+//                .excludePathPatterns("/rgv/**");
 
+
+//    @Override
+//    public void addCorsMappings(CorsRegistry registry) {
+//        registry.addMapping("/**") // 瀵规墍鏈夋帴鍙g敓鏁�
+//                .allowedOrigins("http://127.0.0.1:8080") // 鍏抽敭锛氭寚瀹氭偍鐨勫墠鍦板潃
+//                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 鍏佽鐨勮姹傛柟娉�
+//                .allowedHeaders("*") // 鍏佽鎵�鏈夎姹傚ご
+//                .allowCredentials(true) // 鑻ュ墠绔姹傞渶瑕佹惡甯ookie绛夎璇佷俊鎭紝姝ら」璁句负true
+//                .maxAge(3600); // 棰勬璇锋眰鐨勭紦瀛樻椂闂达紙绉掞級
+//    }
 }
diff --git a/src/main/java/com/zy/core/enums/RgvModeType.java b/src/main/java/com/zy/core/enums/RgvModeType.java
index 139d63d..7682be5 100644
--- a/src/main/java/com/zy/core/enums/RgvModeType.java
+++ b/src/main/java/com/zy/core/enums/RgvModeType.java
@@ -2,42 +2,44 @@
 
 public enum RgvModeType {
 
-    NONE(-1, "绂荤嚎"),
-    STOP(0, "鍏虫満"),
-    HAND(1, "鎵嬪姩"),
-//    HALF_AUTO(2, "鍗婅嚜鍔�"),
-    AUTO(2, "鑷姩"),
-    AUTO2(100, "鍏跺畠"),
+    NONE(-1, "绂荤嚎","ffffff"),
+    STOP(2, "缁翠慨","ffffff"),
+    HAND(0, "鎵嬪姩","ffffff"),
+    HALF_AUTO(3, "鍗婅嚜鍔�","ffffff"),
+    AUTO(1, "鑷姩","ffffff"),
+    OTHER(100, "鍏跺畠","ffffff"),
     ;
 
     public Integer id;
     public String desc;
-    RgvModeType(Integer id, String desc) {
+    public String color;
+    RgvModeType(Integer id, String desc, String color) {
         this.id = id;
         this.desc = desc;
+        this.color = color;
     }
 
     public static RgvModeType get(Short id) {
         if (null == id) {
-            return null;
+            return OTHER;
         }
         for (RgvModeType type : RgvModeType.values()) {
             if (type.id.equals(id.intValue())) {
                 return type;
             }
         }
-        return null;
+        return OTHER;
     }
 
     public static RgvModeType get(RgvModeType type) {
         if (null == type) {
-            return null;
+            return OTHER;
         }
         for (RgvModeType rgvModeType : RgvModeType.values()) {
             if (rgvModeType == type) {
                 return rgvModeType;
             }
         }
-        return null;
+        return OTHER;
     }
 }
diff --git a/src/main/webapp/views/deviceOperate/crnOperate.html b/src/main/webapp/views/deviceOperate/crnOperate.html
new file mode 100644
index 0000000..abcc195
--- /dev/null
+++ b/src/main/webapp/views/deviceOperate/crnOperate.html
@@ -0,0 +1,399 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<title>鍫嗗灈鏈鸿澶�</title>
+	<link rel="stylesheet" href="../../static/wcs/css/element.css">
+	<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+	<script type="text/javascript" src="../../static/js/common.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/vue.min.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/element.js"></script>
+</head>
+
+<body>
+	<div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
+		<div style="width: 100%;">
+			<el-table ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
+				max-height="350" style="width: 100%">
+				<el-table-column property="crnNo" label="鍫嗗灈鏈�">
+				</el-table-column>
+				<el-table-column property="laneNo" label="宸烽亾鍙�">
+				</el-table-column>
+				<el-table-column property="workNo" label="宸ヤ綔鍙�">
+				</el-table-column>
+				<el-table-column property="statusType" label="妯″紡">
+				</el-table-column>
+				<el-table-column property="wrkStatus$" label="浠诲姟鐘舵��">
+				</el-table-column>
+				<el-table-column property="deviceStatus" label="璁惧鐘舵��">
+				</el-table-column>
+				<el-table-column property="taskComplete" label="浠诲姟瀹屾垚鎸囦护">
+				</el-table-column>
+				<el-table-column property="errorCrn" label="寮傚父鎻愮ず">
+				</el-table-column>
+				<el-table-column property="demo" label="婕旂ず">
+				</el-table-column>
+				<el-table-column property="demoValue$" label="婕旂ず鐘舵��">
+				</el-table-column>
+			</el-table>
+		</div>
+
+		<div style="width: 100%;display: flex;justify-content: center;margin-top: 10px;">
+			<div style="width: 55%;margin-right: 10px;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>璁惧璋冭瘯</span>
+					</div>
+					<div>
+						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
+<!--							<el-form-item label="婧愮珯/婧愬簱浣�">-->
+<!--								<el-input v-model="formParam.sourceStaNo" placeholder="婧愮珯/婧愬簱浣�"></el-input>-->
+<!--							</el-form-item>-->
+							<el-form-item label="鎺�">
+								<el-input v-model="formParam.sourceRow" placeholder="鎺�"></el-input>
+							</el-form-item>
+							<el-form-item label="鍒�">
+								<el-input v-model="formParam.sourceBay" placeholder="鍒�"></el-input>
+							</el-form-item>
+							<el-form-item label="灞�">
+								<el-input v-model="formParam.sourceLev" placeholder="灞�"></el-input>
+							</el-form-item>
+						</el-form>
+						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
+<!--							<el-form-item label="鐩爣绔�/鐩爣搴撲綅">-->
+<!--								<el-input v-model="formParam.staNo" placeholder="鐩爣绔�/鐩爣搴撲綅"></el-input>-->
+<!--							</el-form-item>-->
+							<el-form-item label="鎺�">
+								<el-input v-model="formParam.row" placeholder="鎺�"></el-input>
+							</el-form-item>
+							<el-form-item label="鍒�">
+								<el-input v-model="formParam.bay" placeholder="鍒�"></el-input>
+							</el-form-item>
+							<el-form-item label="灞�">
+								<el-input v-model="formParam.lev" placeholder="灞�"></el-input>
+							</el-form-item>
+						</el-form>
+						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
+							<el-form-item label="娴嬭瘯搴撲綅鏁伴噺">
+								<el-input v-model="formParam.locMastDemoCount" placeholder="娴嬭瘯搴撲綅鏁伴噺"></el-input>
+							</el-form-item>
+							<el-form-item label="鍘熷鍑哄簱搴撲綅">
+								<el-input v-model="formParam.locMastDemoF" placeholder="鍘熷鏈夌墿搴撲綅"></el-input>
+							</el-form-item>
+							<el-form-item label="鍘熷绌哄簱浣�">
+								<el-input v-model="formParam.locMastDemoE" placeholder="鍘熷鏈夌墿搴撲綅"></el-input>
+							</el-form-item>
+							<el-form-item label="鍫嗗灈鏈烘斁璐х珯鐐�">
+								<el-input v-model="formParam.staOutDemo" placeholder="鍫嗗灈鏈烘斁璐х珯鐐�"></el-input>
+							</el-form-item>
+							<el-form-item label="鍫嗗灈鏈哄彇璐х珯鐐�">
+								<el-input v-model="formParam.staIntDemo" placeholder="鍫嗗灈鏈哄彇璐х珯鐐�"></el-input>
+							</el-form-item>
+						</el-form>
+						<el-form label-position="top" :inline="true" class="demo-form-inline">
+							<el-form-item label="">
+								<el-checkbox @change="updateEnableInOut('in')" v-model="enableIn">鍙叆</el-checkbox>
+							</el-form-item>
+							<el-form-item label="">
+								<el-checkbox @change="updateEnableInOut('out')" v-model="enableOut">鍙嚭</el-checkbox>
+							</el-form-item>
+							<el-form-item label="">
+								<el-checkbox @change="updateDemo('demo')" v-model="hpMkDemo">婕旂ず</el-checkbox>
+							</el-form-item>
+						</el-form>
+						<div>
+<!--							<el-button @click="requestOperate('put')" type="primary">鍏ュ簱</el-button>-->
+<!--							<el-button @click="requestOperate('take')" type="primary">鍑哄簱</el-button>-->
+							<el-button @click="requestOperate('stockMove')" type="primary">搴撲綅杞Щ</el-button>
+
+							<div style="margin-top: 10px">
+								<el-button @click="requestOperate('taskComplete')" type="primary">浠诲姟瀹屾垚</el-button>
+								<el-button @click="requestOperate('taskCompleteClearCommand')" type="primary">浠诲姟瀹屾垚鎸囦护娓呴櫎</el-button>
+							</div>
+<!--							<el-button @click="requestOperate('siteMove')" type="primary">绔欏埌绔�</el-button>-->
+<!--							<el-button @click="requestOperate('clearCommand')" type="primary">娓呴櫎鍛戒护</el-button>-->
+<!--							<el-button @click="requestOperate('reset')" type="primary">澶嶄綅</el-button>-->
+							<br/>
+							<br/>
+<!--							<el-button @click="requestOperate('auto')" type="warning">鑱旀満</el-button>-->
+<!--							<el-button @click="requestOperate('semiAutomatic')" type="warning">鍗婅嚜鍔�</el-button>-->
+<!--							<el-button @click="requestOperate('hand')" type="warning">鎵嬪姩</el-button>-->
+<!--							<el-button @click="requestOperate('onlineWrk4')" type="warning">鎭㈠鑱旀満浠诲姟</el-button>-->
+<!--							<el-button @click="requestOperate('onlineWrk3')" type="warning">娓呴櫎鑱旀満浠诲姟</el-button>-->
+<!--							<el-button @click="requestOperate('onlineWrk1')" type="warning">鐢宠瀹屾垚浠诲姟</el-button>-->
+							<br/>
+							<br/>
+<!--							<el-button @click="requestOperate('onlineWrk2')" type="warning">鐢宠鍙栨秷浠诲姟</el-button>-->
+						</div>
+					</div>
+				</el-card>
+			</div>
+			<div style="width: 45%;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>璁惧鐘舵��</span>
+					</div>
+					<div>
+						<div v-if="currentIndex == null">
+							<el-empty description="璇烽�夋嫨璁惧"></el-empty>
+						</div>
+						<div v-else>
+							<el-descriptions :title="currentTitle" direction="vertical" :column="4" border>
+								<el-descriptions-item label="鍫嗗灈鏈�">{{ tableData[currentIndex].crnNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="宸ヤ綔鍙�">
+									{{ tableData[currentIndex].workNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="妯″紡">
+									<el-tag>{{ tableData[currentIndex].statusType }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="浠诲姟鐘舵��">
+									<div v-if="tableData[currentIndex].wrkStatus == 0">
+										<el-tag>{{ tableData[currentIndex].wrkStatus$ }}</el-tag>
+									</div>
+									<div v-else>
+										<el-tag type="success">{{ tableData[currentIndex].wrkStatus$ }}</el-tag>
+									</div>
+								</el-descriptions-item>
+								<el-descriptions-item label="璁惧鐘舵��">
+									<el-tag>{{ tableData[currentIndex].deviceStatus }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="鏈夌墿">
+									<el-tag>{{ tableData[currentIndex].loading }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="鍒�">{{ tableData[currentIndex].bay }}
+								</el-descriptions-item>
+								<el-descriptions-item label="灞�">{{ tableData[currentIndex].lev }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鏁呴殰浠g爜">{{ tableData[currentIndex].warnCode }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鏁呴殰鎻忚堪">{{ tableData[currentIndex].lev }}
+								</el-descriptions-item>
+								<el-descriptions-item label="婧愮珯">{{ tableData[currentIndex].sourceStaNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鐩爣绔�">{{ tableData[currentIndex].staNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="婧愬簱浣�">{{ tableData[currentIndex].sourceLocNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鐩爣搴撲綅">{{ tableData[currentIndex].locNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="璐у弶瀹氫綅">{{ tableData[currentIndex].forkOffset }}
+								</el-descriptions-item>
+								<el-descriptions-item label="杞借揣鍙板畾浣�">{{ tableData[currentIndex].liftPos }}
+								</el-descriptions-item>
+								<el-descriptions-item label="璧拌鍦ㄥ畾浣�">{{ tableData[currentIndex].walkPos }}
+								</el-descriptions-item>
+								<el-descriptions-item label="璧拌閫熷害(m/min)">{{ tableData[currentIndex].xspeed }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍗囬檷閫熷害(m/min)">{{ tableData[currentIndex].yspeed }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍙夌墮閫熷害(m/min)">{{ tableData[currentIndex].zspeed }}
+								</el-descriptions-item>
+								<el-descriptions-item label="璧拌璺濈(Km)">{{ tableData[currentIndex].xdistance }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍗囬檷璺濈(Km)">{{ tableData[currentIndex].ydistance }}
+								</el-descriptions-item>
+								<el-descriptions-item label="璧拌鏃堕暱(H)">{{ tableData[currentIndex].xduration }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍗囬檷鏃堕暱(H)">{{ tableData[currentIndex].yduration }}
+								</el-descriptions-item>
+								<el-descriptions-item label="寮傚父鎻愮ず">{{ tableData[currentIndex].errorCrn }}
+								</el-descriptions-item>
+							</el-descriptions>
+						</div>
+					</div>
+				</el-card>
+			</div>
+		</div>
+	</div>
+	<script>
+		var app = new Vue({
+			el: '#app',
+			data: {
+				tableData: [],
+				currentRow: null,
+				currentTitle: "鏈�夋嫨璁惧",
+				currentIndex: null,
+				formParam: {
+					crnNo: null,
+					sourceStaNo: null,
+					sourceRow: 1,
+					sourceBay: 0,
+					sourceLev: 1,
+					staNo: null,
+					locMastDemoCount: 3,
+					locMastDemoF: null,
+					locMastDemoE: null,
+					staOutDemo: null,
+					staIntDemo: null,
+					row: 1,
+					bay: 0,
+					lev: 1
+				},
+				enableIn: false,
+				enableOut: false,
+				hpMkDemo: false
+			},
+			created() {
+				this.init()
+			},
+			watch: {
+
+			},
+			methods: {
+				init() {
+					this.getTableData()
+
+					setInterval(() => {
+						this.getTableData()
+					}, 1000)
+				},
+				handleRowClick(row, col, event) {
+					const index = this.tableData.indexOf(row)
+					this.currentRow = row;
+					this.currentIndex = index
+					this.currentTitle = row.crnNo + "鍙峰爢鍨涙満"
+					this.formParam.crnNo = row.crnNo
+					this.enableIn = row.inEnable == "Y" ? true : false
+					this.enableOut = row.outEnable == "Y" ? true : false
+					this.hpMkDemo = row.hpMk == "Y" ? true : false
+				},
+				getTableData() {
+					let that = this;
+					$.ajax({
+						url: baseUrl + "/crn/list/auth",
+						headers: {
+							'token': localStorage.getItem('token')
+						},
+						data: {},
+						dataType: 'json',
+						contentType: 'application/json;charset=UTF-8',
+						method: 'GET',
+						success: function (res) {
+							that.tableData = res.data
+						}
+					});
+				},
+				requestOperate(method) {
+					let that = this
+					that.$confirm('姝ゆ搷浣滃瓨鍦ㄩ闄╋紝鏄惁缁х画','鎻愮ず',{
+						confirmButtonText: '纭畾',
+						cancelButtonText: '鍙栨秷',
+						type: 'warning'
+					}).then(()=>{
+						$.ajax({
+							url: baseUrl + "/crn/operator/" + method,
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: this.formParam,
+							method: 'POST',
+							success: function (res) {
+								if (res.code == 200) {
+									that.$message({
+										message: res.msg,
+										type: 'success'
+									});
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					})
+
+				},
+				updateEnableInOut(type) {
+					let that = this
+					let param = {}
+					if (type == "in") {
+						param = {
+							inEnable: this.enableIn ? "Y" : "N",
+							crnNo: this.formParam.crnNo
+						}
+					} else {
+						param = {
+							outEnable: this.enableOut ? "Y" : "N",
+							crnNo: this.formParam.crnNo
+						}
+					}
+
+					$.ajax({
+						url: baseUrl + "/basCrnp/update/auth",
+						headers: {
+							'token': localStorage.getItem('token')
+						},
+						data: param,
+						method: 'POST',
+						success: function (res) {
+							if (res.code == 200) {
+								that.$message({
+									message: res.msg,
+									type: 'success'
+								});
+							} else {
+								that.$message({
+									message: res.msg,
+									type: 'error'
+								});
+							}
+						}
+					});
+				},
+				updateDemo(type) {
+					let that = this
+					let param = {}
+					that.$confirm('灏嗗惎鍔ㄦ紨绀烘ā寮忥紝鏄惁缁х画','鎻愮ず',{
+						confirmButtonText: '纭畾',
+						cancelButtonText: '鍙栨秷',
+						type: 'warning'
+					}).then(()=>{
+						if (type == "demo") {
+							param = {
+								hpMk: this.hpMkDemo ? "Y" : "N",
+								staOutDemo: this.formParam.staOutDemo,
+								staIntDemo: this.formParam.staIntDemo,
+								locMastDemoF: this.formParam.locMastDemoF,
+								locMastDemoE: this.formParam.locMastDemoE,
+								locMastDemoCount: this.formParam.locMastDemoCount,
+								crnNo: this.formParam.crnNo
+							}
+						} else {
+							param = {
+								crnNo: this.formParam.crnNo
+							}
+						}
+
+
+						$.ajax({
+							url: baseUrl + "/basCrnp/update/demo/auth",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: param,
+							method: 'POST',
+							success: function (res) {
+								if (res.code == 200) {
+									that.$message({
+										message: res.msg,
+										type: 'success'
+									});
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					})
+				}
+			}
+		})
+	</script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/deviceOperate/devpOperate.html b/src/main/webapp/views/deviceOperate/devpOperate.html
new file mode 100644
index 0000000..fee7b07
--- /dev/null
+++ b/src/main/webapp/views/deviceOperate/devpOperate.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<title>杈撻�佺珯鐐硅澶�</title>
+	<link rel="stylesheet" href="../../static/wcs/css/element.css">
+	<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+	<script type="text/javascript" src="../../static/js/common.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/vue.min.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/element.js"></script>
+</head>
+
+<body>
+	<div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
+		<div style="width: 100%;">
+			<el-table ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
+				max-height="450" style="width: 100%">
+				<el-table-column property="devNo" label="绔欏彿">
+				</el-table-column>
+				<el-table-column property="workNo" label="宸ヤ綔鍙�">
+				</el-table-column>
+<!--				<el-table-column property="locType1" label="楂樹綆搴撲綅">-->
+<!--				</el-table-column>-->
+				<el-table-column property="pakMk" label="鍏ュ簱鏍囪">
+				</el-table-column>
+				<el-table-column property="pakMkRun" label="閫�鍥炴爣璁�">
+				</el-table-column>
+				<el-table-column property="pakMkTask" label="灏忚溅浠诲姟涓嬪彂鏍囪">
+				</el-table-column>
+				<el-table-column property="weight" label="绉伴噸">
+				</el-table-column>
+				<el-table-column property="barcode" label="鏉$爜">
+				</el-table-column>
+				<el-table-column property="errorDev" label="寮傚父鎻愮ず">
+				</el-table-column>
+			</el-table>
+		</div>
+
+		<div style="width: 100%;display: flex;justify-content: center;margin-top: 10px;">
+			<div style="width: 55%;margin-right: 10px;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>璁惧璋冭瘯</span>
+					</div>
+					<div>
+						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
+							<el-form-item label="宸ヤ綔鍙�">
+								<el-input v-model="formParam.workNo" placeholder="宸ヤ綔鍙�"></el-input>
+							</el-form-item>
+							<el-form-item label="鐩爣绔�">
+								<el-input v-model="formParam.staNo" placeholder="鐩爣绔�"></el-input>
+							</el-form-item>
+						</el-form>
+						<el-form label-position="top" :inline="true" class="demo-form-inline">
+							<el-form-item label="">
+								<el-checkbox v-model="formParam.inEnable">鍙叆</el-checkbox>
+							</el-form-item>
+							<el-form-item label="">
+								<el-checkbox v-model="formParam.outEnable">鍙嚭</el-checkbox>
+							</el-form-item>
+						</el-form>
+						<div>
+							<el-button @click="requestOperate('update')" type="primary">鏇存柊绔欑偣淇℃伅</el-button>
+<!--							<el-button @click="requestOperate('in')" type="warning">鏀捐揣瀹屾垚</el-button>-->
+						</div>
+						<div style="margin-top: 10px">
+							<el-button @click="requestOperate('pakMk')" type="warning">鍏ュ簱鏍囪澶嶄綅</el-button>
+							<el-button @click="requestOperate('pakMkRun')" type="warning">閫�搴撴爣璁板浣�</el-button>
+							<el-button @click="requestOperate('pakMkTask')" type="warning">灏忚溅浠诲姟涓嬪彂鏍囪澶嶄綅</el-button>
+							<el-button @click="requestOperate('pakMkWalk')" type="warning">WMS浠诲姟涓嬪彂鏍囪澶嶄綅</el-button>
+						</div>
+					</div>
+				</el-card>
+			</div>
+			<div style="width: 45%;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>璁惧鐘舵��</span>
+					</div>
+					<div>
+						<div v-if="currentIndex == null">
+							<el-empty description="璇烽�夋嫨璁惧"></el-empty>
+						</div>
+						<div v-else>
+							<el-descriptions :title="currentTitle" direction="vertical" :column="4" border>
+								<el-descriptions-item label="绔欑偣">{{ tableData[currentIndex].devNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="宸ヤ綔鍙�">
+									{{ tableData[currentIndex].workNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鑷姩">
+									<el-tag>{{ tableData[currentIndex].autoing }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="鏈夌墿">
+									<el-tag>{{ tableData[currentIndex].loading }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="鍙叆">
+									<el-tag>{{ tableData[currentIndex].inEnable }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="鍙嚭">
+									<el-tag>{{ tableData[currentIndex].outEnable }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="绌烘澘淇″彿">
+									<el-tag>{{ tableData[currentIndex].emptyMk }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item label="鐩爣绔�">{{ tableData[currentIndex].staNo }}
+								</el-descriptions-item>
+								<el-descriptions-item label="楂樹綆搴撲綅">{{ tableData[currentIndex].locType1 }}
+								</el-descriptions-item>
+								<el-descriptions-item label="閲嶉噺">{{ tableData[currentIndex].weight }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鏉$爜">{{ tableData[currentIndex].barcode }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍏ュ簱鏍囪">{{ tableData[currentIndex].pakMk }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍏ュ簱鍥為��鏍囪">{{ tableData[currentIndex].pakMkRun }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍏ュ簱灏忚溅浠诲姟涓嬪彂鏍囪">{{ tableData[currentIndex].pakMkTask }}
+								</el-descriptions-item>
+								<el-descriptions-item label="鍏ュ簱wms浠诲姟涓嬪彂鏍囪">{{ tableData[currentIndex].pakMkWalk }}
+								</el-descriptions-item>
+								<el-descriptions-item label="寮傚父鎻愮ず">{{ tableData[currentIndex].errorDev }}
+								</el-descriptions-item>
+							</el-descriptions>
+						</div>
+					</div>
+				</el-card>
+			</div>
+		</div>
+	</div>
+	<script>
+		var app = new Vue({
+			el: '#app',
+			data: {
+				tableData: [],
+				currentRow: null,
+				currentTitle: "鏈�夋嫨璁惧",
+				currentIndex: null,
+				formParam: {
+					devNo: null,
+					workNo: null,
+					staNo: null,
+					pakMk: null,
+					inEnable: false,
+					outEnable: false
+				}
+			},
+			created() {
+				this.init()
+			},
+			watch: {
+
+			},
+			methods: {
+				init() {
+					this.getTableData()
+
+					setInterval(() => {
+						this.getTableData()
+					}, 1000)
+				},
+				handleRowClick(row, col, event) {
+					const index = this.tableData.indexOf(row)
+					this.currentRow = row;
+					this.currentIndex = index
+					this.currentTitle = row.devNo + "绔欑偣"
+					
+					this.formParam.devNo = row.devNo
+					this.formParam.workNo = row.workNo
+					this.formParam.staNo = row.staNo
+					this.formParam.pakMk = row.pakMk
+					this.formParam.inEnable = row.inEnable == "Y" ? true : false
+					this.formParam.outEnable = row.outEnable == "Y" ? true : false
+				},
+				getTableData() {
+					let that = this;
+					$.ajax({
+						url: baseUrl + "/site/list/auth",
+						headers: {
+							'token': localStorage.getItem('token')
+						},
+						data: {},
+						dataType: 'json',
+						contentType: 'application/json;charset=UTF-8',
+						method: 'GET',
+						success: function (res) {
+							that.tableData = res.data
+						}
+					});
+				},
+				requestOperate(method) {
+					let that = this
+					that.$confirm('姝ゆ搷浣滃瓨鍦ㄩ闄╋紝鏄惁缁х画','鎻愮ず',{
+						confirmButtonText: '纭畾',
+						cancelButtonText: '鍙栨秷',
+						type: 'warning'
+					}).then(()=>{
+						$.ajax({
+							url: baseUrl + "/site/detl/"+method,
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: this.formParam,
+							method: 'POST',
+							success: function (res) {
+								if (res.code == 200) {
+									that.$message({
+										message: res.msg,
+										type: 'success'
+									});
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					})
+
+				}
+			}
+		})
+	</script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/deviceOperate/rgvOperate.html b/src/main/webapp/views/deviceOperate/rgvOperate.html
new file mode 100644
index 0000000..314d8a5
--- /dev/null
+++ b/src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+	<meta charset="UTF-8">
+	<title>杈撻�佺珯鐐硅澶�</title>
+	<link rel="stylesheet" href="../../static/wcs/css/element.css">
+	<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+	<script type="text/javascript" src="../../static/js/common.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/vue.min.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/element.js"></script>
+</head>
+
+<body>
+	<div id="app" style="display: flex;justify-content: center;flex-wrap: wrap;">
+		<div style="width: 100%;">
+			<el-table ref="singleTable" :data="tableData" highlight-current-row @row-click="handleRowClick"
+				max-height="450" style="width: 100%">
+				<el-table-column property="rgvNo" label="灏忚溅鍙�">
+				</el-table-column>
+				<el-table-column property="taskNo" label="宸ヤ綔鍙�">
+				</el-table-column>
+				<el-table-column property="mode" label="浣滀笟妯″紡">
+				</el-table-column>
+				<el-table-column property="status" label="鐘舵��">
+				</el-table-column>
+				<el-table-column property="rgvPos" label="褰撳墠瀹氫綅鍊�">
+				</el-table-column>
+				<el-table-column property="rgvPosDestination" label="鐩爣瀹氫綅缃�">
+				</el-table-column>
+				<el-table-column property="loaded" label="鎺㈢墿">
+				</el-table-column>
+				<el-table-column property="errorRgv" label="鎻愮ず">
+				</el-table-column>
+			</el-table>
+		</div>
+
+		<div style="width: 100%;display: flex;justify-content: center;margin-top: 10px;">
+			<div style="width: 55%;margin-right: 10px;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>璁惧璋冭瘯</span>
+					</div>
+					<div>
+						<el-form :model="formParam" label-position="top" :inline="true" class="demo-form-inline">
+							<el-form-item label="鐩爣瀹氫綅缃�">
+								<el-input v-model="formParam.rgvPosDestination" placeholder="鐩爣瀹氫綅缃�"></el-input>
+							</el-form-item>
+							<el-form-item label="鍙栬揣绔欑偣">
+								<el-input v-model="formParam.rgvStaNoTake" placeholder="鐩爣绔欑偣"></el-input>
+							</el-form-item>
+							<el-form-item label="鐩爣绔欑偣">
+								<el-input v-model="formParam.rgvStaNoPut" placeholder="鐩爣绔欑偣"></el-input>
+							</el-form-item>
+						</el-form>
+						<div>
+							<el-button @click="requestOperate('take')" type="primary">鍙栬揣</el-button>
+							<el-button @click="requestOperate('put')" type="primary">鏀捐揣</el-button>
+							<el-button @click="requestOperate('TakeAndPut')" type="primary">鍙栨斁璐�</el-button>
+							<el-button @click="requestOperate('walk')" type="warning">琛岃蛋</el-button>
+						</div>
+						<div style="margin-top: 10px">
+							<el-button @click="requestOperate('del')" type="warning">浠诲姟娓呯┖</el-button>
+							<el-button @click="requestOperate('del2')" type="warning">浣滀笟鍚姩涓姸鎬佸浣�</el-button>
+						</div>
+						<div style="margin-top: 10px">
+							<el-button @click="requestOperate('delRgvTask')" type="warning">娓呯┖wcs涓嬪彂鏁版嵁锛堣繍琛屾暟鎹渶瑕佺‖浠跺浣�9S锛�</el-button>
+						</div>
+					</div>
+				</el-card>
+			</div>
+			<div style="width: 45%;">
+				<el-card class="box-card">
+					<div slot="header" class="clearfix">
+						<span>璁惧褰撳墠浠诲姟</span>
+					</div>
+					<div>
+						<div v-if="currentIndex == null">
+							<el-empty description="璇烽�夋嫨璁惧"></el-empty>
+						</div>
+						<div v-else>
+							<el-table ref="singleTable" :data="taskAllData" highlight-current-row @row-click="handleRowClick"
+									  max-height="450" style="width: 100%">
+								<el-table-column property="rgvNo" label="灏忚溅鍙�">
+								</el-table-column>
+								<el-table-column property="taskNo" label="宸ヤ綔鍙�">
+								</el-table-column>
+								<el-table-column property="taskStatus" label="浣滀笟妯″紡">
+								</el-table-column>
+								<el-table-column property="isRunning" label="鐘舵��">
+								</el-table-column>
+								<el-table-column property="targetPosition" label="鐩爣瀹氫綅缃�">
+								</el-table-column>
+								<el-table-column property="direction" label="鏂瑰悜">
+								</el-table-column>
+							</el-table>
+						</div>
+					</div>
+				</el-card>
+			</div>
+		</div>
+	</div>
+	<script>
+		var app = new Vue({
+			el: '#app',
+			data: {
+				tableData: [],
+				taskAllData: [],
+				currentRow: null,
+				currentTitle: "鏈�夋嫨璁惧",
+				currentIndex: null,
+				formParam: {
+					rgvNo: 0,
+					rgvStaNoTake: 0,
+					rgvStaNoPut: 0,
+					rgvPosDestination: 0
+				}
+			},
+			created() {
+				this.init()
+			},
+			watch: {
+
+			},
+			methods: {
+				init() {
+					this.getTableData()
+
+					setInterval(() => {
+						this.getTableData()
+					}, 1000)
+				},
+				handleRowClick(row, col, event) {
+					const index = this.tableData.indexOf(row)
+					this.currentRow = row;
+					this.currentIndex = index
+					this.currentTitle = row.rgvNo + "灏忚溅"
+					
+					this.formParam.rgvNo = row.rgvNo
+					this.formParam.rgvStaNoTake = row.rgvStaNoTake
+					this.formParam.rgvStaNoPut = row.rgvStaNoPut
+					this.formParam.rgvPosDestination = row.rgvPosDestination
+
+					this.getTaskAllData(index+1)
+				},
+				getTaskAllData(index) {
+					let that = this;
+					$.ajax({
+						url: baseUrl + "/rgv/task/cache/all",
+						headers: {
+							'token': localStorage.getItem('token')
+						},
+						data: {rgvNo: index},
+						method: 'POST',
+						success: function (res) {
+							that.taskAllData = res.data
+						}
+					});
+				},
+				getTableData() {
+					let that = this;
+					$.ajax({
+						url: baseUrl + "/rgv/status/all",
+						headers: {
+							'token': localStorage.getItem('token')
+						},
+						data: {},
+						dataType: 'json',
+						contentType: 'application/json;charset=UTF-8',
+						method: 'GET',
+						success: function (res) {
+							that.tableData = res.data
+						}
+					});
+				},
+				requestOperate(method) {
+					let that = this
+					that.$confirm('姝ゆ搷浣滃瓨鍦ㄩ闄╋紝鏄惁缁х画','鎻愮ず',{
+						confirmButtonText: '纭畾',
+						cancelButtonText: '鍙栨秷',
+						type: 'warning'
+					}).then(()=>{
+						$.ajax({
+							url: baseUrl + "/rgv/run/"+method,
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: this.formParam,
+							method: 'POST',
+							success: function (res) {
+								if (res.code == 200) {
+									that.$message({
+										message: res.msg,
+										type: 'success'
+									});
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					})
+
+				}
+			}
+		})
+	</script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/deviceOperate/wcsOperate.html b/src/main/webapp/views/deviceOperate/wcsOperate.html
new file mode 100644
index 0000000..c97edfd
--- /dev/null
+++ b/src/main/webapp/views/deviceOperate/wcsOperate.html
@@ -0,0 +1,678 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<title>鐜舰绌挎杞︽櫤鑳界郴缁�</title>
+	<link rel="stylesheet" href="../../static/wcs/css/element.css">
+	<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+	<script type="text/javascript" src="../../static/js/common.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/vue.min.js"></script>
+	<script type="text/javascript" src="../../static/wcs/js/element.js"></script>
+	<style>
+		body {
+			font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+			margin: 0;
+			padding: 0;
+			background-color: #a0d2eb;
+			color: #ffffff;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 100vh;
+		}
+		header {
+			background-color: #2196F3;
+			color: white;
+			padding: 15px 20px;
+			text-align: center;
+			font-size: 24px;
+			letter-spacing: 1px;
+			box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
+		}
+		.map {
+			position: relative;
+			width: 52vw;
+			height: 80vh;
+			border-radius: 50%;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+		}
+		.inner-ring, .outer-ring {
+			position: absolute;
+			border-radius: 50%;
+		}
+		.inner-ring {
+			width: 72vh;
+			height: 72vh;
+			border: 4px solid #00E676;
+			box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5);
+		}
+		.outer-ring {
+			width: 80vh;
+			height: 80vh;
+			border: 4px solid #00E676;
+			box-shadow: inset 0 0 30px rgba(0, 230, 118, 0.5), 0 0 20px rgba(0, 230, 118, 0.5);
+		}
+		.station {
+			position: absolute;
+			width: 20px;
+			height: 14px;
+			text-align: center;
+			line-height: 1.5; /* 璋冩暣琛岄珮涓庡瓧浣撳ぇ灏忕殑姣斿�� */
+			font-size: 10px; /* 璁剧疆鏇村皬鐨勫瓧浣� */
+			font-weight: bold;
+			transition: transform 0.3s ease;
+			background-color: #ab1839;
+			transform: scale(1); /* 鍙�夛細濡傛灉涓嶉渶瑕佹斁澶ф晥鏋� */
+		}
+		.bus {
+			font-size: 10px;
+			background-color: #2196F3;
+			border: 10px solid #ffffff;
+			position: absolute;
+			width: 15px;
+			height: 15px;
+			border-radius: 50%;
+			text-align: center;
+			line-height: 15px;
+			font-weight: bold;
+			transition: transform 0.3s ease;
+		}
+		.station:hover, .bus:hover {
+			transform: scale(1.4);
+			z-index: 999;
+		}
+
+		.task-bar-left {
+			position: fixed;
+			top: 1%;
+			/*transform: translateY(-50%);*/
+			width: 25%; /* 璁剧疆瀹藉害 */
+			background-color: rgba(255, 255, 255, 0); /* 鍗婇�忔槑鑳屾櫙 */
+
+			border-radius: 5px;
+			padding: 10px;
+			box-shadow: 0 0 10px rgba(0, 0, 0, 0);
+			z-index: 1000; /* 纭繚鍦ㄥ叾浠栧厓绱犱箣涓� */
+		}
+
+		.task-bar-left1 {
+			position: fixed;
+			top: 8%;
+			/*transform: translateY(-50%);*/
+			width: 25%; /* 璁剧疆瀹藉害 */
+			background-color: rgba(255, 255, 255, 0); /* 鍗婇�忔槑鑳屾櫙 */
+
+			border-radius: 5px;
+			padding: 10px;
+			box-shadow: 0 0 10px rgba(0, 0, 0, 0);
+			z-index: 1000; /* 纭繚鍦ㄥ叾浠栧厓绱犱箣涓� */
+		}
+
+		.task-bar-right {
+			position: fixed;
+			top: 1%;
+			/*transform: translateY(-50%);*/
+			width: 25%; /* 璁剧疆瀹藉害 */
+			background-color: rgba(255, 255, 255, 0); /* 鍗婇�忔槑鑳屾櫙 */
+
+			border-radius: 5px;
+			padding: 10px;
+			box-shadow: 0 0 10px rgba(0, 0, 0, 0);
+			z-index: 1000; /* 纭繚鍦ㄥ叾浠栧厓绱犱箣涓� */
+		}
+
+		.task-bar-right1 {
+			position: fixed;
+			top: 5%;
+			/*transform: translateY(-50%);*/
+			width: 25%; /* 璁剧疆瀹藉害 */
+			background-color: rgba(255, 255, 255, 0); /* 鍗婇�忔槑鑳屾櫙 */
+
+			border-radius: 5px;
+			padding: 10px;
+			box-shadow: 0 0 10px rgba(0, 0, 0, 0);
+			z-index: 1000; /* 纭繚鍦ㄥ叾浠栧厓绱犱箣涓� */
+		}
+
+		.task-bar-div1 {
+			/*width: 100%; !* 璁剧疆瀹藉害 *!*/
+			background-color: rgba(255, 255, 255, 0.8); /* 鍗婇�忔槑鑳屾櫙 */
+			box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
+		}
+
+		.left-task-bar {
+			left: 20px; /* 璺濈宸﹁竟鐨勮窛绂� */
+			/*bottom: 100px;*/
+		}
+
+		.right-task-bar {
+			/*bottom: 100px;*/
+			right: 20px; /* 璺濈鍙宠竟鐨勮窛绂� */
+		}
+
+		.el-table .warning-row {
+			background: oldlace;
+		}
+
+		.el-table .success-row {
+			background: #f0f9eb;
+		}
+		.container {
+			width: 100vh;
+			height: 72vh;
+			position: absolute;
+			/*background: #8c939d;*/
+		}
+		.bus-station {
+			width: 100vh;
+			height: 72vh;
+			position: absolute;
+			display: flex;
+			/*background: #8c939d;*/
+		}
+		.bus-item-top {
+			background: red;
+			position: relative;
+			width: 40px;
+			height: 60px;
+			line-height: 60px;
+			top: 880px;
+			text-align: center;
+		}
+		.bus-item-left {
+			background: red;
+			position: relative;
+			width: 60px;
+			height: 40px;
+			line-height: 40px;
+			left: 1230px;
+			text-align: center;
+		}
+		.bus-item-left2 {
+			background: red;
+			position: relative;
+			width: 60px;
+			height: 40px;
+			line-height: 40px;
+			left: 1000px;
+			text-align: center;
+		}
+	</style>
+</head>
+<body>
+<!--<header>-->
+<!--    鐜舰绌挎杞︽櫤鑳界郴缁�-->
+<!--</header>-->
+<div id="app">
+	<div  class="map">
+		<div v-if="licenseDayI <=30 ">
+			<div style="color: red">{{licenseDay}}</div>
+		</div>
+		<svg class="container">
+			<path d="M 1200,750
+                        L 1200,100
+                        C 1200,100 1200,50 1150,50
+                        C 1150,50 1100,50 1100,100
+                        L 1100,700
+                        C 1100,700 1100,750 1050,750
+                        L 60,750
+                        C 60,750 10,750 10,800
+                        C 10,800 10,850 60,850
+                        L 1100,850
+                        C 1100,850 1200,850 1200,750
+"
+				  style="fill:none; stroke:blue; stroke-width:4;" />
+		</svg>
+		<div v-for="station in tableDataDev" class="station" :style="{ top: station.valueY + 'px', left: station.valueX + 'px' }">{{ station.index }}</div>
+		<div>
+			<el-switch
+					style="display: block"
+					v-model="valueSystem"
+					active-color="#13ce66"
+					inactive-color="#A64036"
+					active-text="绯荤粺杩愯涓�..."
+					inactive-text="绯荤粺宸插仠姝�!"
+					@change='upDateValueSystem'>
+			</el-switch>
+		</div>
+		<div v-for="bus in tableDataRgv" class="bus" :style="{ top: bus.valueY + 'px', left: bus.valueX + 'px' , borderColor: bus.modeColor, backgroundColor: bus.statusColor}">{{ bus.index }}</div>
+	</div>
+</div>
+
+<script>
+	var app = new Vue({
+		el: '#app',
+		data: {
+			activeNames: ['1'],
+			valueLeft: '0',
+			valueLeft1: '0',
+			valueRight: '0',
+			valueRight1: '0',
+			licenseDay: '宸茶繃鏈�',
+			licenseDayI: 100,
+			valueSystem: false,
+			tableDataRgv: [],
+			tableDataDev: [],
+			energyGatheringRing: [],
+			tableDataLeft: [],
+			tableDataLeft1: [],
+			tableDataRight: [],
+			tableDataRight1: [],
+			devpPos1:[
+				{dev_no: 116,pos:633980},
+				{dev_no: 117,pos:604043},
+				{dev_no: 118,pos:574323},
+				{dev_no: 119,pos:559534},
+				{dev_no: 120,pos:544682},
+				{dev_no: 121,pos:514912},
+				{dev_no: 122,pos:485227},
+				{dev_no: 123,pos:470367},
+				{dev_no: 124,pos:455514},
+				{dev_no: 125,pos:425768},
+				{dev_no: 126,pos:396268},
+				{dev_no: 127,pos:381106},
+				{dev_no: 128,pos:366311},
+				{dev_no: 129,pos:336638},
+				{dev_no: 130,pos:306820},
+				{dev_no: 131,pos:277067},
+				{dev_no: 132,pos:257418},
+				{dev_no: 133,pos:217730},
+			],
+			devpPos2:[
+				{dev_no: 112,pos:891000},
+				{dev_no: 113,pos:865000},
+				{dev_no: 114,pos:800000},
+				{dev_no: 115,pos:780000},
+			],
+			devpPos3:[
+				{dev_no: 101,pos:1269958},
+				{dev_no: 102,pos:1243454},
+				{dev_no: 103,pos:1229081},
+				{dev_no: 104,pos:1202099},
+				{dev_no: 105,pos:1187564},
+				{dev_no: 106,pos:1160630},
+				{dev_no: 107,pos:1146152},
+				{dev_no: 108,pos:1119463},
+				{dev_no: 109,pos:1105038},
+				{dev_no: 110,pos:1077961},
+				{dev_no: 111,pos:1063813},
+			],
+		},
+		created(){
+			this.init();
+			this.devpPos1.reverse()
+			this.devpPos3.reverse()
+		},
+		watch: {
+
+		},
+		methods: {
+			init(){
+				this.getTableDataRgv()
+				this.getTableDataDev()
+				this.getTableDataTrack()
+				this.getTableDataLeft()
+				this.getTableDataLeft1()
+				this.getTableDataRight()
+				this.getTableDataRight1()
+				this.getValueSystem()
+				this.getLicenseDays()
+
+				setInterval(() => {
+					this.getTableDataRgv()
+					this.getTableDataDev()
+					this.getTableDataTrack()
+					this.getTableDataLeft()
+					this.getTableDataLeft1()
+					this.getTableDataRight()
+					this.getTableDataRight1()
+					this.getValueSystem()
+					this.getLicenseDays()
+
+				}, 1000)
+			},
+
+			verifyPassword(callback) {
+				this.$prompt('璇疯緭鍏ョ鐞嗗憳瀵嗙爜: root', '楠岃瘉', {
+					confirmButtonText: '纭畾',
+					cancelButtonText: '鍙栨秷',
+					inputType: 'password',
+					inputPattern: /^root$/,
+					inputErrorMessage: '瀵嗙爜閿欒'
+				}).then(({ value }) => {
+					if (value === 'root') {
+						callback();
+					}
+				}).catch(() => {
+					this.$message.info('宸插彇娑堟搷浣�');
+				});
+			},
+			handleChange(val) {
+				console.log(val);
+				if (val.length === 0){
+					valueRight = '0';
+				} else {
+					console.log("2222"+val);
+
+					if (val.length >= 1){
+						this.handleChangeValueRight(1)
+					}
+				}
+			},
+			handleChange1(val) {
+				console.log(val);
+				if (val.length === 0){
+					valueRight1 = '0';
+				} else {
+					console.log("2222"+val);
+
+					if (val.length >= 1){
+						this.handleChangeValueRight1(1)
+					}
+				}
+			},
+			taskDelete(row) {
+				let that = this;
+				that.$confirm('纭瑕佸垹闄よ浠诲姟鍚�?', '鎻愮ず', {
+					confirmButtonText: '纭畾',
+					cancelButtonText: '鍙栨秷',
+					type: 'warning'
+				}).then(() => {
+					$.ajax({
+						url: baseUrl + "/rgv/disable/task/delete",
+						headers: {'token': localStorage.getItem('token')},
+						method: 'POST',
+						data: {
+							wrkNo: row.wrkNo
+						},
+						success: function (res) {
+							if (res.code === 200) {
+								that.$message.success('鍒犻櫎鎴愬姛');
+								// 鍒犻櫎褰撳墠琛�
+								that.tableDataRight.splice(that.tableDataRight.indexOf(row), 1);
+							} else {
+								that.$message.error('鍒犻櫎澶辫触');
+							}
+						}
+					});
+				});
+			},
+			taskDelete1(row) {
+				let that = this;
+				that.$confirm('纭瑕佸垵濮嬪寲璇ヤ换鍔″悧?', '鎻愮ず', {
+					confirmButtonText: '纭畾',
+					cancelButtonText: '鍙栨秷',
+					type: 'warning'
+				}).then(() => {
+					$.ajax({
+						url: baseUrl + "/rgv/disable/task/delete1",
+						headers: {'token': localStorage.getItem('token')},
+						method: 'POST',
+						data: {
+							wrkNo: row.wrkNo
+						},
+						success: function (res) {
+							if (res.code === 200) {
+								that.$message.success('鍒濆鍖栨垚鍔�');
+								// 鍒犻櫎褰撳墠琛�
+								// that.tableDataRight.splice(that.tableDataRight.indexOf(row), 1);
+							} else {
+								that.$message.error('鍒濆鍖栧け璐�');
+							}
+						}
+					});
+				});
+			},
+			toggleStatus(index, row) {
+				let that = this;
+				const currentStatus = row.status;
+				const targetStatus = currentStatus === 0 ? 1 : 0;
+
+				that.$confirm(`纭瑕�${currentStatus === 0 ? '绂佺敤' : '鍚敤'}璇ヨ澶囧悧?`, '鎻愮ず', {
+					confirmButtonText: '纭畾',
+					cancelButtonText: '鍙栨秷',
+					type: 'warning'
+				}).then(() => {
+					$.ajax({
+						url: baseUrl + "/rgv/disable/rgv/status",
+						headers: {'token': localStorage.getItem('token')},
+						method: 'POST',
+						data: {
+							rgvNo: row.rgvNo,
+							status: targetStatus
+						},
+						success: function (res) {
+							if (res.code === 200) {
+								that.$message.success(`鐘舵�佹洿鏂版垚鍔焋);
+								row.status$ = targetStatus; // 鏇存柊鍓嶇鐘舵��
+							} else {
+								that.$message.error('鐘舵�佹洿鏂板け璐�');
+							}
+						}
+					});
+				});
+			},
+			handleChangeValueRight(val) {
+				console.log("33333"+val);
+
+				switch (val){
+					case 1:
+						valueRight = '100';
+					case 2:
+						valueRight = '100';
+					case 3:
+						valueRight = '100';
+					case 4:
+						valueRight = '100';
+					default:
+						valueRight = '0';
+				}
+			},
+			handleChangeValueRight1(val) {
+				console.log("33333"+val);
+
+				switch (val){
+					case 1:
+						valueRight1 = '100';
+					case 2:
+						valueRight1 = '100';
+					case 3:
+						valueRight1 = '100';
+					case 4:
+						valueRight1 = '100';
+					default:
+						valueRight1 = '0';
+				}
+			},
+			tableRowClassName({row, rowIndex}) {
+				if (rowIndex === 1) {
+					return 'warning-row';
+				} else if (rowIndex === 3) {
+					return 'success-row';
+				}
+				return '';
+			},
+			getLicenseDays(){
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/license/getLicenseDays",
+					headers: {'token': localStorage.getItem('token')},
+					method: 'POST',
+					success: function (res) {
+						if (res.code == 200) {
+							if (res.data.day<0){
+								that.licenseDay = "宸茶繃鏈�"+res.data.day+"澶�";
+								that.licenseDayI = -1;
+							} else {
+								that.licenseDay = "璁稿彲璇佹湁鏁堟湡"+res.data.day+"澶�";
+								that.licenseDayI = res.data.day;
+							}
+						}else {
+							that.licenseDay = "宸茶繃鏈�";
+							that.licenseDayI = -1;
+						}
+					}
+				});
+				// setTimeout(function() {
+				//
+				// }, 1000);
+			},
+			getValueSystem() {
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/console/system/running/status",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.valueSystem = res.data.status
+					}
+				});
+			},
+			upDateValueSystem(){
+				let that = this;
+				let operatorTypeI = 0;
+				if (that.valueSystem){
+					operatorTypeI = 1;
+				}
+				this.verifyPassword(() => {
+					$.ajax({
+						url: baseUrl + "/console/system/switch",
+						headers: {'token': localStorage.getItem('token')},
+						data: {operatorType : operatorTypeI},
+						method: 'POST',
+						success: function (res) {
+							if (res.code === 200) {
+								that.valueSystem = res.data.status;
+							}
+						}
+					});
+				});
+			},
+			getTableDataLeft() {
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/rgv/ring/through/task/wrk/mast/position/data",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.tableDataLeft = res.data
+					}
+				});
+			},
+			getTableDataLeft1() {
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/rgv/ring/through/task/wrk/mast/position/data/v1",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.tableDataLeft1 = res.data
+					}
+				});
+			},
+			getTableDataRight() {
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/rgv/task/rgv/circular/shuttle/mast/position/data",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.tableDataRight = res.data
+					}
+				});
+			},
+			getTableDataRight1() {
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/rgv/task/rgv/circular/shuttle/mast/position/data/v1",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.tableDataRight1 = res.data
+					}
+				});
+			},
+			getTableDataRgv() {
+				let that = this;
+				// that.tableDataRgv = busPsto
+				// return
+				$.ajax({
+					url: baseUrl + "/rgv/ring/through/rgv/position/data",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.tableDataRgv = res.data
+					}
+				});
+			},
+			getTableDataDev() {
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/rgv/ring/through/dev/position/data",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.tableDataDev = res.data
+					}
+				});
+			},
+			getTableDataTrack() {
+				let that = this;
+				$.ajax({
+					url: baseUrl + "/rgv/ring/through/track/position/data",
+					headers: {
+						'token': localStorage.getItem('token')
+					},
+					data: {},
+					dataType: 'json',
+					contentType: 'application/json;charset=UTF-8',
+					method: 'post',
+					success: function (res) {
+						that.energyGatheringRing = res.data
+					}
+				});
+			}
+		}
+	})
+
+</script>
+</body>
+
+</html>

--
Gitblit v1.9.1