From 5d69a637a35b12ba10c4526b11ca567cc8fa5237 Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期四, 25 七月 2024 10:07:51 +0800
Subject: [PATCH] #

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java |  294 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 267 insertions(+), 27 deletions(-)

diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
index d9930f0..8315884 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/thread/impl/SurayShuttleThread.java
@@ -3,21 +3,27 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zy.asrs.common.utils.HttpHandler;
 import com.zy.asrs.framework.common.DateUtils;
 import com.zy.asrs.framework.common.SpringUtils;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wcs.common.ExecuteSupport;
+import com.zy.asrs.wcs.core.domain.param.ShuttleMoveLocParam;
+import com.zy.asrs.wcs.core.entity.BasLift;
 import com.zy.asrs.wcs.core.entity.BasShuttle;
 import com.zy.asrs.wcs.core.entity.Loc;
 import com.zy.asrs.wcs.core.model.NavigateNode;
 import com.zy.asrs.wcs.core.model.command.ShuttleCommand;
 import com.zy.asrs.wcs.core.model.command.ShuttleRedisCommand;
-import com.zy.asrs.wcs.core.model.enums.ShuttleCommandModeType;
-import com.zy.asrs.wcs.core.model.enums.ShuttleRunDirection;
+import com.zy.asrs.wcs.core.model.enums.*;
+import com.zy.asrs.wcs.core.service.BasLiftService;
 import com.zy.asrs.wcs.core.service.BasShuttleService;
 import com.zy.asrs.wcs.core.service.LocService;
+import com.zy.asrs.wcs.core.utils.LiftDispatcher;
 import com.zy.asrs.wcs.core.utils.NavigateUtils;
+import com.zy.asrs.wcs.core.utils.Utils;
 import com.zy.asrs.wcs.rcs.News;
 import com.zy.asrs.wcs.rcs.cache.OutputQueue;
 import com.zy.asrs.wcs.rcs.constant.DeviceRedisConstant;
@@ -29,18 +35,21 @@
 import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
 import com.zy.asrs.wcs.core.utils.RedisUtil;
 import com.zy.asrs.wcs.rcs.entity.Device;
+import com.zy.asrs.wcs.system.entity.Dict;
+import com.zy.asrs.wcs.system.service.DictService;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @Slf4j
 @SuppressWarnings("all")
 public class SurayShuttleThread implements ShuttleThread {
 
-    private static final String API_URL = "http://127.0.0.1:8082";
+    private static String API_URL = "http://127.0.0.1:8082";
 
     private Device device;
     private RedisUtil redisUtil;
@@ -49,6 +58,7 @@
     public SurayShuttleThread(Device device,RedisUtil redisUtil) {
         this.device = device;
         this.redisUtil = redisUtil;
+        API_URL = "http://" + device.getIp() + ":" + device.getPort();
     }
 
     @Override
@@ -107,12 +117,22 @@
                 if (deviceStatus == 255) {
                     //绂荤嚎
                     shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE);
+                }else if (deviceStatus == 3) {
+                    //灏辩华鐘舵�佷笖绂荤嚎
+                    if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE)) {
+                        shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+                    }
                 }
+
+                if(deviceStatus != 4 || deviceStatus != 6 || deviceStatus != 7 || deviceStatus != 8 || deviceStatus != 255 || deviceStatus != -1) {
+                    shuttleProtocol.setMode(1);//鑷姩鐘舵��
+                }
+
                 shuttleProtocol.setDeviceStatus(deviceStatus);
                 //褰撳墠浜岀淮鐮�
                 shuttleProtocol.setCurrentCode(data.getString("groundCode") == null ? "0" : data.getString("groundCode"));
                 //鐢垫睜鐢甸噺
-                shuttleProtocol.setBatteryPower(data.getString("battery") == null ? "0%" : data.getString("battery"));
+                shuttleProtocol.setBatteryPower(data.getString("battery") == null ? "0" : data.getString("battery"));
                 //鏁呴殰
                 shuttleProtocol.setErrorCode(deviceStatus == 6 ? "1" : "0");
 
@@ -131,10 +151,12 @@
                 extend.setStatusDescription(data.getString("statusDescription"));//鐘舵�佹弿杩�
                 shuttleProtocol.setExtend(extend);//鎵╁睍瀛楁
 
+                //鏈�杩戜竴娆″湪绾挎椂闂�
+                shuttleProtocol.setLastOnlineTime(System.currentTimeMillis());
                 ///璇诲彇鍥涘悜绌挎杞︾姸鎬�-end
 
                 //灏忚溅澶勪簬蹇欑鐘舵�侊紝灏嗘爣璁扮疆涓簍rue
-                if (!shuttleProtocol.getIdle()) {
+                if (deviceStatus == 1 || deviceStatus == 2 || deviceStatus == 5) {
                     shuttleProtocol.setPakMk(true);
                 }
 
@@ -172,6 +194,7 @@
                     basShuttle.setStatus(1);
                     basShuttle.setDeleted(0);
                     basShuttle.setHostId(device.getHostId());
+                    basShuttle.setDeviceId(device.getId().intValue());
                     shuttleService.save(basShuttle);
                 }
                 //浠诲姟鍙�
@@ -205,7 +228,15 @@
 
     @Override
     public ShuttleProtocol getStatus() {
-        return this.shuttleProtocol;
+        return getStatus(true);
+    }
+
+    @Override
+    public ShuttleProtocol getStatus(boolean clone) {
+        if (this.shuttleProtocol == null) {
+            return null;
+        }
+        return clone ? this.shuttleProtocol.clone() : this.shuttleProtocol;
     }
 
     @Override
@@ -216,6 +247,16 @@
     @Override
     public synchronized boolean movePath(List<NavigateNode> nodes, Integer taskNo) {
         try {
+            //榛樿鍦板浘姣嶈建鏂瑰悜x
+            String mapDirection = "x";
+            DictService dictService = SpringUtils.getBean(DictService.class);
+            Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>()
+                    .eq(Dict::getFlag, "direction_map")
+                    .eq(Dict::getStatus, 1));
+            if (dict != null) {
+                mapDirection = dict.getValue();
+            }
+
             String loginToken = requestLoginToken();
             if (loginToken == null) {
                 return false;
@@ -227,25 +268,37 @@
             ArrayList<HashMap<String, Object>> modes = new ArrayList<>();
             //鑾峰彇鍒嗘璺緞
             ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodes);
-            for (ArrayList<NavigateNode> sectionNodes : data) {
+            for (int idx = 0; idx < data.size(); idx++) {
+                ArrayList<NavigateNode> sectionNodes = data.get(idx);
+                boolean isRemoveFooterNode = false;//鏄惁鍓旈櫎灏捐妭鐐�
+                if (idx != data.size() - 1) {
+                    isRemoveFooterNode = true;//鍓旈櫎灏捐妭鐐�
+                }
+
                 boolean flag = true;
                 int oper;
                 //寮�濮嬭矾寰�
-                NavigateNode startPath = nodes.get(0);
-                if (ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT
+                NavigateNode startPath = sectionNodes.get(0);
+                //缁撴潫璺緞
+                NavigateNode targetPath = sectionNodes.get(sectionNodes.size() - 1);
+                if (mapDirection.equals("y") && ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.LEFT
                         || ShuttleRunDirection.get(startPath.getDirection()) == ShuttleRunDirection.RIGHT) {
                     //姣嶈建鏂瑰悜
                     oper = 5;
-                }else {
+                } else {
                     //瀛愯建鏂瑰悜
                     oper = 6;
                 }
 
-                for (NavigateNode node : sectionNodes) {
+                for (int i = 0; i < sectionNodes.size(); i++) {
+                    if (isRemoveFooterNode && i == sectionNodes.size() - 1) {
+                        continue;
+                    }
+                    NavigateNode node = sectionNodes.get(i);
                     HashMap<String, Object> map = new HashMap<>();
-                    map.put("nodexX", node.getX());
-                    map.put("nodexY", node.getY());
-                    map.put("nodexZ", node.getZ());
+                    map.put("nodeX", node.getX());
+                    map.put("nodeY", node.getY());
+                    map.put("nodeZ", node.getZ());
                     if (flag) {
                         map.put("oper", oper);
                         flag = false;
@@ -267,11 +320,16 @@
                     .setPath("/RDS/runRoute")
                     .setHeaders(headers)
                     .setJson(JSON.toJSONString(param))
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
             Integer code = jsonObject.getInteger("code");
+            System.out.println("璺緞涓嬪彂" + taskNo);
+            System.out.println(JSON.toJSONString(jsonObject));
+            System.out.println(JSON.toJSONString(param));
             if (code.equals(200)) {
+                System.out.println("璺緞涓嬪彂" + taskNo);
                 return true;
             }
         } catch (Exception e) {
@@ -296,11 +354,14 @@
                     .setPath("/RDS/runOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
             Integer code = jsonObject.getInteger("code");
+            System.out.println(JSON.toJSONString(command.getBody()));
             if (code.equals(200)) {
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
                 return true;
             }
         } catch (Exception e) {
@@ -325,11 +386,13 @@
                     .setPath("/RDS/actionOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
             Integer code = jsonObject.getInteger("code");
             if (code.equals(200)) {
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
                 return true;
             }
         } catch (Exception e) {
@@ -354,11 +417,13 @@
                     .setPath("/RDS/actionOrder")
                     .setHeaders(headers)
                     .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
                     .build()
                     .doPost();
             JSONObject jsonObject = JSON.parseObject(response);
             Integer code = jsonObject.getInteger("code");
             if (code.equals(200)) {
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
                 return true;
             }
         } catch (Exception e) {
@@ -369,6 +434,40 @@
 
     @Override
     public synchronized boolean reset(ShuttleCommand command) {
+        setSyncTaskNo(0);
+        setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+        enableMoveLoc(null, false);
+        return true;
+    }
+
+    @Override
+    public boolean updateLocation(ShuttleCommand command) {
+        try {
+            String loginToken = requestLoginToken();
+            if (loginToken == null) {
+                return false;
+            }
+
+            HashMap<String, Object> headers = new HashMap<>();
+            headers.put("Authorization", "Bearer " + loginToken);
+
+            String response = new HttpHandler.Builder()
+                    .setUri(API_URL)
+                    .setPath("/RDS/changeLocation")
+                    .setHeaders(headers)
+                    .setJson(command.getBody())
+                    .setTimeout(60, TimeUnit.SECONDS)
+                    .build()
+                    .doPost();
+            JSONObject jsonObject = JSON.parseObject(response);
+            Integer code = jsonObject.getInteger("code");
+            if (code.equals(200)) {
+                this.shuttleProtocol.setSendTime(System.currentTimeMillis());//鎸囦护涓嬪彂鏃堕棿
+                return true;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         return false;
     }
 
@@ -380,11 +479,13 @@
     @Override
     public boolean isIdle(ExecuteSupport support) {
         if (null != support) {
-            if (!support.judgement()) {
-                return false;
+            Boolean judgement = support.judgement();
+            if (judgement != null && !judgement) {
+                return true;
             }
         }
-        if (this.shuttleProtocol.getIdle() == null
+
+        if (this.shuttleProtocol.getDeviceStatus() == null
                 || this.shuttleProtocol.getPakMk() == null
                 || this.shuttleProtocol.getErrorCode() == null
                 || this.shuttleProtocol.getProtocolStatus() == null
@@ -392,17 +493,46 @@
             return false;
         }
 
-        boolean res = this.shuttleProtocol.getIdle()
+        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3 || this.shuttleProtocol.getDeviceStatus() == 11)
                 && this.shuttleProtocol.getPakMk()
                 && this.shuttleProtocol.getErrorCode().equals("0")
-                && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
+                && (this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
+                || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.WAITING.id
+                || this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.CHARGING_WAITING.id);
+        return res;
+    }
+
+    @Override
+    public boolean isDeviceIdle() {
+        return isDeviceIdle(null);
+    }
+
+    @Override
+    public boolean isDeviceIdle(ExecuteSupport support) {
+        if (null != support) {
+            Boolean judgement = support.judgement();
+            if (judgement != null && !judgement) {
+                return true;
+            }
+        }
+
+        if (this.shuttleProtocol.getDeviceStatus() == null
+                || this.shuttleProtocol.getPakMk() == null
+                || this.shuttleProtocol.getErrorCode() == null
+        ) {
+            return false;
+        }
+
+        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3 || this.shuttleProtocol.getDeviceStatus() == 11)
+                && this.shuttleProtocol.getPakMk()
+                && this.shuttleProtocol.getErrorCode().equals("0")
                 ;
         return res;
     }
 
     @Override
     public boolean isRequireCharge() {
-        if (this.shuttleProtocol.getIdle() == null
+        if (this.shuttleProtocol.getDeviceStatus() == null
                 || this.shuttleProtocol.getPakMk() == null
                 || this.shuttleProtocol.getErrorCode() == null
                 || this.shuttleProtocol.getProtocolStatus() == null
@@ -410,7 +540,7 @@
             return false;
         }
 
-        boolean res = this.shuttleProtocol.getIdle()
+        boolean res = (this.shuttleProtocol.getDeviceStatus() == 3)
                 && this.shuttleProtocol.getPakMk()
                 && this.shuttleProtocol.getErrorCode().equals("0")
                 && this.shuttleProtocol.getProtocolStatus() == ShuttleProtocolStatusType.IDLE.id
@@ -424,7 +554,7 @@
                 if (shuttleService == null) {
                     return false;
                 }
-                BasShuttle basShuttle = shuttleService.getById(this.device.getDeviceNo());
+                BasShuttle basShuttle = shuttleService.getOne(new LambdaQueryWrapper<BasShuttle>().eq(BasShuttle::getDeviceId, this.device.getId()));
                 if (basShuttle == null) {
                     return false;
                 }
@@ -434,7 +564,6 @@
                 }
                 return Integer.valueOf(this.shuttleProtocol.getBatteryPower()) < chargeLine;
             } catch (Exception e) {
-                News.error("fail", e);
                 return false;
             }
         }
@@ -455,11 +584,22 @@
 
     @Override
     public boolean isChargingCompleted() {
+        Integer maxPower = 100;
+        DictService dictService = SpringUtils.getBean(DictService.class);
+        if (dictService != null) {
+            Dict chargeMaxValue = dictService.getOne(new LambdaQueryWrapper<Dict>()
+                    .eq(Dict::getFlag, "chargeMaxValue")
+                    .eq(Dict::getStatus, 1));
+            if (chargeMaxValue != null) {
+                maxPower = Integer.parseInt(chargeMaxValue.getValue());
+            }
+        }
+
         if (this.shuttleProtocol.getBatteryPower() == null) {
             return false;
         }
 
-        if (Integer.valueOf(this.shuttleProtocol.getBatteryPower()) >= 100) {
+        if (Integer.valueOf(this.shuttleProtocol.getBatteryPower()) >= maxPower) {
             return true;
         }
         return false;
@@ -467,13 +607,22 @@
 
     @Override
     public List<NavigateNode> getMoveAdvancePath() {
+        ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class);
         ArrayList<NavigateNode> path = new ArrayList<>();
         if (shuttleProtocol.getTaskNo() != 0) {
             //瀛樺湪浠诲姟锛岃幏鍙栨寚浠�
-            Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_FLAG + shuttleProtocol.getTaskNo());
+            Object object = redisUtil.get(DeviceRedisConstant.SHUTTLE_WORK_FLAG + shuttleProtocol.getTaskNo());
             if (object != null) {
-                ShuttleRedisCommand redisCommand = JSON.parseObject(object.toString(), ShuttleRedisCommand.class);
+                ShuttleRedisCommand redisCommand = null;
+                try {
+                    redisCommand = objectMapper.readValue(String.valueOf(object), ShuttleRedisCommand.class);
+                } catch (JsonProcessingException e) {
+                    return path;
+                }
                 List<NavigateNode> nodes = redisCommand.getAssignCommand().getNodes();//绌挎杞﹂璁¤矾寰�
+                if (nodes == null) {
+                    return path;
+                }
                 if (!nodes.isEmpty()) {
                     path.addAll(nodes);
                 }
@@ -483,7 +632,70 @@
     }
 
     @Override
-    public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed) {
+    public int generateDeviceTaskNo(int taskNo, MotionCtgType motionCtgType) {
+        int deviceTaskNo = taskNo;
+        try {
+            deviceTaskNo = Utils.getTaskNo("SURAY_SHUTTLE");
+        } catch (Exception e) {
+            return taskNo;
+        }
+
+        switch (Objects.requireNonNull(MotionCtgType.get(String.valueOf(motionCtgType)))){
+            case SHUTTLE_MOVE://绌挎杞︾Щ鍔�
+            case SHUTTLE_MOVE_LIFT_PALLET://绌挎杞﹂《鍗囧苟绉诲姩
+            case SHUTTLE_MOVE_DOWN_PALLET://绌挎杞︾Щ鍔ㄥ苟鎵樼洏涓嬮檷
+            case SHUTTLE_MOVE_FROM_LIFT://鍑烘彁鍗囨満
+            case SHUTTLE_MOVE_TO_LIFT://杩涙彁鍗囨満
+                return deviceTaskNo;
+            default:
+                return taskNo;
+        }
+    }
+
+    @Override
+    public synchronized boolean setProtocolStatus(ShuttleProtocolStatusType status) {
+        this.shuttleProtocol.setProtocolStatus(status);
+        return true;
+    }
+
+    @Override
+    public synchronized boolean setSyncTaskNo(Integer taskNo) {
+        this.shuttleProtocol.setSyncTaskNo(taskNo);
+        return true;
+    }
+
+    @Override
+    public synchronized boolean setPakMk(boolean pakMk) {
+        this.shuttleProtocol.setPakMk(pakMk);
+        return true;
+    }
+
+    @Override
+    public boolean enableMoveLoc(ShuttleMoveLocParam param, boolean enable) {
+        if (enable) {
+            shuttleProtocol.setMoveLoc(true);//寮�鍚窇搴�
+            shuttleProtocol.setMoveType(param.getMoveType());
+            shuttleProtocol.setXStart(param.getStartX());
+            shuttleProtocol.setXTarget(param.getTargetX());
+            shuttleProtocol.setXCurrent(param.getStartX());
+            shuttleProtocol.setYStart(param.getStartY());
+            shuttleProtocol.setYTarget(param.getTargetY());
+            shuttleProtocol.setYCurrent(param.getStartY());
+        }else {
+            shuttleProtocol.setMoveLoc(false);
+            shuttleProtocol.setMoveType(0);
+            shuttleProtocol.setXStart(0);
+            shuttleProtocol.setXTarget(0);
+            shuttleProtocol.setXCurrent(0);
+            shuttleProtocol.setYStart(0);
+            shuttleProtocol.setYTarget(0);
+            shuttleProtocol.setYCurrent(0);
+        }
+        return true;
+    }
+
+    @Override
+    public ShuttleCommand getMoveCommand(Integer taskNo, String startCodeNum, String distCodeNum, Integer allDistance, Integer runDirection, Integer runSpeed, List<NavigateNode> nodes) {
         HashMap<String, Object> body = new HashMap<>();
         body.put("messageName", "runOrder");
         body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
@@ -500,6 +712,17 @@
         body.put("nodeX", loc.getRow());
         body.put("nodeY", loc.getBay());
         body.put("nodeZ", loc.getLev());
+
+        //妫�娴嬬洰鏍囩偣鏄惁涓烘彁鍗囨満
+        BasLiftService basLiftService = SpringUtils.getBean(BasLiftService.class);
+        BasLift basLift = basLiftService.getOne(new LambdaQueryWrapper<BasLift>().eq(BasLift::getRow, loc.getRow())
+                .eq(BasLift::getBay, loc.getBay())
+                .eq(BasLift::getHostId, this.device.getHostId()));
+        if (basLift != null) {
+            LiftDispatcher liftDispatcher = SpringUtils.getBean(LiftDispatcher.class);
+            Integer realLev = liftDispatcher.getLiftLevOffset(basLift.getDeviceId().intValue(), loc.getLev());
+            body.put("nodeZ", realLev);
+        }
 
         ShuttleCommand command = new ShuttleCommand();
         command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo()));
@@ -541,6 +764,23 @@
         return command;
     }
 
+    @Override
+    public ShuttleCommand getUpdateLocationCommand(Integer taskNo, String locNo) {
+        HashMap<String, Object> body = new HashMap<>();
+        body.put("messageName", "runOrder");
+        body.put("msgTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+        body.put("deviceNo", Integer.parseInt(this.device.getDeviceNo()));
+
+        String coord = "(" + Utils.getRow(locNo) + "," + Utils.getBay(locNo) + "," + Utils.getLev(locNo) + ")";
+        body.put("coord", coord);
+
+        ShuttleCommand command = new ShuttleCommand();
+        command.setShuttleNo(Integer.parseInt(this.device.getDeviceNo()));
+        command.setBody(JSON.toJSONString(body));
+        command.setMode(ShuttleCommandModeType.UPDATE_LOCATION.id);
+        return command;
+    }
+
     //***************璁惧灞傞�氳-涓嶅悓鍘傚晢璁惧閫氳鏂规涓嶄竴鑷�***************
 
     //璇锋眰鐧诲綍

--
Gitblit v1.9.1