From bc5fa0165da2b3e41b9c27bee5394ff6d47f096f Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 16 十二月 2024 09:29:34 +0800
Subject: [PATCH] #

---
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/CodeService.java                |   14 
 zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionStsType.java                |   27 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionServiceImpl.java     |  120 +
 zy-acs-fake/src/main/resources/application.yml                                    |    5 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvDetailServiceImpl.java  |   23 
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/CodeMapper.java                  |   16 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapDataDispatcher.java          |  253 +++
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ConfigMapper.java                |   13 
 zy-acs-fake/src/main/resources/mapper/RouteMapper.xml                             |   26 
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionMapper.java                |   26 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionTypeServiceImpl.java |   18 
 zy-acs-fake/src/main/java/com/zy/acs/fake/config/MapDataConfig.java               |   32 
 zy-acs-fake/src/main/java/com/zy/acs/fake/FakeProcessor.java                      |  122 +
 zy-acs-fake/src/main/resources/mapper/ActionStsMapper.xml                         |   29 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvDetailService.java           |   12 
 zy-acs-fake/src/main/java/com/zy/acs/fake/enums/MapNodeType.java                  |   20 
 zy-acs-fake/src/main/java/com/zy/acs/fake/FakeBoot.java                           |   39 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/RouteService.java               |   21 
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Code.java                        |  167 ++
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvDetailMapper.java             |   13 
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionType.java                  |  141 ++
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/JamService.java                 |   27 
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Agv.java                         |   91 +
 zy-acs-fake/src/main/resources/mapper/CodeMapper.xml                              |   56 
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionTypeMapper.java            |    9 
 zy-acs-fake/src/main/resources/mapper/AgvDetailMapper.xml                         |   47 
 zy-acs-fake/src/main/java/com/zy/acs/fake/enums/CodeNodeType.java                 |   17 
 zy-acs-fake/src/main/resources/mapper/ActionMapper.xml                            |  121 +
 zy-acs-fake/pom.xml                                                               |   71 
 zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ConfigType.java                   |   29 
 zy-acs-fake/src/main/java/com/zy/acs/fake/AgvSimulatorTask.java                   |  156 ++
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/AgvDetail.java                   |  275 ++++
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvService.java                 |   11 
 zy-acs-fake/src/main/java/com/zy/acs/fake/TestController.java                     |    8 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/JamServiceImpl.java        |  117 +
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvMapper.java                   |   16 
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionSts.java                   |  139 ++
 zy-acs-fake/src/main/java/com/zy/acs/fake/enums/DynamicNodeType.java              |   18 
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/RouteMapper.java                 |    8 
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Route.java                       |  202 +++
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ConfigServiceImpl.java     |  103 +
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Config.java                      |  162 ++
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionService.java              |   30 
 zy-acs-fake/src/main/resources/mapper/ActionTypeMapper.xml                        |   29 
 zy-acs-fake/src/main/resources/mapper/ConfigMapper.xml                            |    5 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Agv.java           |   12 
 zy-acs-fake/src/main/java/com/zy/acs/fake/enums/JamStateType.java                 |   11 
 zy-acs-fake/src/main/java/com/zy/acs/fake/domain/DynamicNode.java                 |   30 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionStsServiceImpl.java  |   17 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionStsService.java           |   10 
 zy-acs-fake/src/main/resources/mapper/AgvMapper.xml                               |    5 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionTypeService.java          |   11 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvServiceImpl.java        |   28 
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Jam.java                         |  233 +++
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/CodeServiceImpl.java       |   28 
 zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Action.java                      |  258 +++
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java                 |   64 
 zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionTypeType.java               |   45 
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionStsMapper.java             |    8 
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/RouteServiceImpl.java      |   99 +
 zy-acs-fake/src/main/resources/mapper/JamMapper.xml                               |   73 +
 zy-acs-fake/src/main/java/com/zy/acs/fake/service/ConfigService.java              |   12 
 zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/JamMapper.java                   |   17 
 63 files changed, 3,797 insertions(+), 48 deletions(-)

diff --git a/zy-acs-fake/pom.xml b/zy-acs-fake/pom.xml
index f5d9206..38bb6d4 100644
--- a/zy-acs-fake/pom.xml
+++ b/zy-acs-fake/pom.xml
@@ -23,16 +23,73 @@
     </properties>
 
     <dependencies>
+<!--        <dependency>-->
+<!--            <groupId>com.zy</groupId>-->
+<!--            <artifactId>acs-manager</artifactId>-->
+<!--            <version>1.0.0</version>-->
+<!--            <exclusions>-->
+<!--                <exclusion>-->
+<!--                    <groupId>org.springframework.cloud</groupId>-->
+<!--                    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+<!--        </dependency>-->
+
         <dependency>
             <groupId>com.zy</groupId>
-            <artifactId>acs-manager</artifactId>
+            <artifactId>acs-common</artifactId>
             <version>1.0.0</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.springframework.cloud</groupId>
-                    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
-                </exclusion>
-            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${mysql-driver.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+            <version>8.2.2.jre8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+            <version>1.9.19</version>  <!-- 纭繚浣跨敤鏈�鏂扮増鏈� -->
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+            <version>1.9.19</version>  <!-- 鐢ㄤ簬缁囧叆鍒囬潰 -->
+        </dependency>
+
+        <!-- druid -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.2.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>3.0.0</version>
         </dependency>
     </dependencies>
 
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/AgvSimulatorTask.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/AgvSimulatorTask.java
new file mode 100644
index 0000000..f7c88c9
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/AgvSimulatorTask.java
@@ -0,0 +1,156 @@
+package com.zy.acs.fake;
+
+import com.zy.acs.common.constant.RedisConstant;
+import com.zy.acs.common.domain.AgvProtocol;
+import com.zy.acs.common.domain.protocol.AGV_11_UP;
+import com.zy.acs.common.enums.AgvCompleteType;
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.fake.entity.Action;
+import com.zy.acs.fake.entity.Agv;
+import com.zy.acs.fake.entity.AgvDetail;
+import com.zy.acs.fake.entity.Code;
+import com.zy.acs.fake.enums.ActionStsType;
+import com.zy.acs.fake.enums.ActionTypeType;
+import com.zy.acs.fake.service.*;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by vincent on 11/11/2024
+ */
+@Slf4j
+public class AgvSimulatorTask implements Runnable {
+
+    public static final int WEBSOCKET_BROADCAST_INTERVAL = 200;
+
+    private final Agv agv;
+    private final AgvDetailService agvDetailService;
+    private final ActionService actionService;
+    private final CodeService codeService;
+    private final MapService mapService;
+    private final JamService jamService;
+    private final List<Action> actionList;
+
+    private final RedisSupport redis;
+
+    private final String groupId;
+
+    public AgvSimulatorTask(
+            Agv agv
+            , RedisSupport redis
+            , AgvDetailService agvDetailService
+            , ActionService actionService
+            , CodeService codeService
+            , MapService mapService
+            , JamService jamService
+            , List<Action> actionList
+    ) {
+        this.agv = agv;
+        this.redis = redis;
+        this.agvDetailService = agvDetailService;
+        this.actionService = actionService;
+        this.codeService = codeService;
+        this.mapService = mapService;
+        this.jamService = jamService;
+        this.actionList = actionList;
+
+        this.groupId = actionList.get(0).getGroupId();
+    }
+
+    @Override
+    public void run() {
+        try {
+            FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), true);
+            String qrCode = null;
+            for (Action action : actionList) {
+                processAction(agv, action);
+                qrCode = action.getCode();
+            }
+            this.finishActionList(qrCode);
+        } catch (Exception e) {
+            log.error("AgvSimulatorTask AGV[{}]", agv.getUuid(), e);
+        } finally {
+            FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), false);
+        }
+    }
+
+    private void processAction(Agv agv, Action action) throws InterruptedException {
+        AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId());
+        if (agvDetail == null) {
+            return;
+        }
+
+        switch (Objects.requireNonNull(ActionTypeType.get(action.getActionTypeEl()))) {
+            case TurnCorner:
+                simulateWalking(agv, agvDetail, action);
+                simulateRotating(agv, agvDetail, action);
+                break;
+            case StraightBackUnturnable:
+            case StraightBackTurnable:
+            case StraightAheadUnturnable:
+            case StraightAheadTurnable:
+            case FinishPath:
+            case DockingCharge:
+                simulateWalking(agv, agvDetail, action);
+                break;
+            case ReadyTakeFromShelvesLoc:
+            case ReadyReleaseToShelvesLoc:
+                break;
+            default:
+                log.warn("Unknown action type {} for AGV ID {}.", action.getActionType(), agv.getId());
+                break;
+        }
+    }
+
+
+    private void simulateWalking(Agv agv, AgvDetail agvDetail, Action action) throws InterruptedException {
+        Code code = codeService.selectByData(action.getCode());
+        agvDetail.setPos(1);
+        agvDetail.setCode(code.getId());
+        // 妯℃嫙鐢甸噺娑堣��
+//        agvDetail.setVol(agvDetail.getVol() - 0.1 * distanceToMove); // 鏍规嵁璺濈娑堣�楃數閲�
+
+        Thread.sleep(WEBSOCKET_BROADCAST_INTERVAL);
+
+        agvDetailService.updateById(agvDetail);
+
+        mapService.unlockPath(agv.getUuid(), code.getData());
+        jamService.checkIfFinish(agv.getId(), code.getData());
+
+        action.setActionSts(ActionStsType.FINISH.val());
+        actionService.updateById(action);
+    }
+
+    /**
+     * 妯℃嫙AGV鏃嬭浆
+     *
+     * @param agv        褰撳墠AGV
+     * @param agvDetail  AGV璇︾粏淇℃伅
+     * @param action     褰撳墠鍔ㄤ綔
+     */
+    private void simulateRotating(Agv agv, AgvDetail agvDetail, Action action) throws InterruptedException {
+        double actionAngle = Double.parseDouble(action.getParams());
+        agvDetail.setAgvAngle(actionAngle);
+        // 妯℃嫙鐢甸噺娑堣��?
+//        agvDetail.setVol(agvDetail.getVol() - 0.05 * (angleToRotate / 15.0)); // 鏍规嵁瑙掑害娑堣�楃數閲�
+
+        Thread.sleep(WEBSOCKET_BROADCAST_INTERVAL);
+        agvDetailService.updateById(agvDetail);
+        action.setActionSts(ActionStsType.FINISH.val());
+        actionService.updateById(action);
+    }
+
+    private void finishActionList(String qrCode) {
+        // 1.complete data
+        AGV_11_UP agv_11_up = new AGV_11_UP();
+        agv_11_up.setSerialNo(groupId);
+        agv_11_up.setCompleteCode(AgvCompleteType.ENTIRE_PATH_COMPLETE.getCode());
+        agv_11_up.setCompleteType(AgvCompleteType.ENTIRE_PATH_COMPLETE);
+        agv_11_up.setQrCode(qrCode);
+
+        AgvProtocol agvProtocol = AgvProtocol.build(this.agv.getUuid()).setMessageBody(agv_11_up);
+        redis.push(RedisConstant.AGV_COMPLETE_FLAG, agvProtocol);
+    }
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/FakeBoot.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/FakeBoot.java
index 720025e..713e191 100644
--- a/zy-acs-fake/src/main/java/com/zy/acs/fake/FakeBoot.java
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/FakeBoot.java
@@ -3,28 +3,27 @@
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.FilterType;
-import org.springframework.context.annotation.Import;
 
+//@MapperScan("com.zy.**.mapper")
+//@ComponentScan(value = "com.zy.acs.common.config")
+//@ComponentScan(
+//        basePackages ="com.zy.acs.manager.system.**",
+//        excludeFilters = @ComponentScan.Filter(
+//                type = FilterType.ASSIGNABLE_TYPE,
+//                classes = {
+////                        com.zy.acs.manager.system.service.UserService.class,
+//                        com.zy.acs.manager.system.controller.AuthController.class
+//                }
+//        )
+//)
+//@Import(value = {
+//        com.zy.acs.manager.common.config.ConfigProperties.class,
+//        org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.class
+//})
+//@ComponentScan(basePackages = "com.zy.acs.manager.manager.**")
+//@SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
+@SpringBootApplication
 @MapperScan("com.zy.**.mapper")
-@ComponentScan(value = "com.zy.acs.common.config")
-@ComponentScan(
-        basePackages ="com.zy.acs.manager.system.**",
-        excludeFilters = @ComponentScan.Filter(
-                type = FilterType.ASSIGNABLE_TYPE,
-                classes = {
-//                        com.zy.acs.manager.system.service.UserService.class,
-                        com.zy.acs.manager.system.controller.AuthController.class
-                }
-        )
-)
-@Import(value = {
-        com.zy.acs.manager.common.config.ConfigProperties.class,
-        org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder.class
-})
-@ComponentScan(basePackages = "com.zy.acs.manager.manager.**")
-@SpringBootApplication(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
 public class FakeBoot {
 
     public static void main(String[] args) {
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/FakeProcessor.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/FakeProcessor.java
new file mode 100644
index 0000000..22cc7ba
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/FakeProcessor.java
@@ -0,0 +1,122 @@
+package com.zy.acs.fake;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.constant.RedisConstant;
+import com.zy.acs.common.domain.AgvProtocol;
+import com.zy.acs.common.domain.protocol.AGV_01_DOWN;
+import com.zy.acs.common.domain.protocol.AGV_01_UP;
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.fake.entity.Action;
+import com.zy.acs.fake.entity.Agv;
+import com.zy.acs.fake.enums.ActionStsType;
+import com.zy.acs.fake.service.*;
+import com.zy.acs.framework.common.Cools;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Created by vincent on 11/9/2024
+ */
+@Slf4j
+@Component
+public class FakeProcessor {
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+    public static final Map<Long, Boolean> AGV_PROCESSING_MAP = new ConcurrentHashMap<>();
+
+    private ExecutorService executorService;
+
+    @Autowired
+    private AgvService agvService;
+    @Autowired
+    private AgvDetailService agvDetailService;
+    @Autowired
+    private ActionService actionService;
+    @Autowired
+    private ConfigService configService;
+    @Autowired
+    private CodeService codeService;
+    @Autowired
+    private MapService mapService;
+    @Autowired
+    private JamService jamService;
+
+    /**
+     * 1.AgvDataService.dataProcess [ agvDetail: vol, code, agvAngle, agvStatus ]
+     * 2.MainService.upDataSubscribe
+     * 3.AgvCmdService.executeRequest {@link com.zy.acs.manager.core.service.AgvCmdService#executeAgvActionCmd}
+     * 4.AgvServiceImpl.judgeOnline
+     * 5.
+     */
+    @Scheduled(cron = "0/1 * * * * ? ")
+    public void process() {
+        Boolean fakeSign = configService.getVal("fakeSign", Boolean.class);
+        if (null == fakeSign || !fakeSign) {
+            return;
+        }
+
+        List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, 1));
+        // init executorService
+        if (null == this.executorService) {
+            int count = agvList.size();
+            this.executorService = Executors.newFixedThreadPool(count);
+        }
+
+        this.responseTheRequest();
+
+        for (Agv agv : agvList) {
+            AGV_PROCESSING_MAP.putIfAbsent(agv.getId(), false);
+
+            this.processOnline(agv);
+
+            if (!AGV_PROCESSING_MAP.get(agv.getId())) {
+                List<Action> actionList = actionService.queryLatestGroup(agv.getId(), ActionStsType.ISSUED);
+                if (!Cools.isEmpty(actionList)) {
+                    executorService.submit(new AgvSimulatorTask(
+                            agv
+                            , redis
+                            , agvDetailService
+                            , actionService
+                            , codeService
+                            , mapService
+                            , jamService
+                            , actionList
+                    ));
+                }
+            }
+
+        }
+    }
+
+    private void processOnline(Agv agv) {
+        redis.setObject(RedisConstant.AGV_ONLINE_FLAG, agv.getUuid(), 1, 30);
+    }
+
+    private void responseTheRequest() {
+        AgvProtocol protocol = redis.pop(RedisConstant.AGV_PATH_DOWN_FLAG);
+        if (null != protocol) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException ignore) {}
+
+            AGV_01_DOWN agv_01_down = (AGV_01_DOWN) protocol.getMessageBody();
+
+            AGV_01_UP agv_01_up = new AGV_01_UP();
+            agv_01_up.setSerialNo(agv_01_down.getSerialNo());
+
+            redis.setObject(RedisConstant.AGV_PATH_UP_FLAG
+                    , protocol.getAgvNo() + "_" + agv_01_up.getSerialNo()
+                    , agv_01_up);
+        }
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/TestController.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/TestController.java
index 20b1cf9..4edc985 100644
--- a/zy-acs-fake/src/main/java/com/zy/acs/fake/TestController.java
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/TestController.java
@@ -1,11 +1,9 @@
 package com.zy.acs.fake;
 
+import com.zy.acs.fake.service.AgvService;
 import com.zy.acs.framework.common.R;
-import com.zy.acs.manager.core.service.AgvCmdService;
-import com.zy.acs.manager.system.service.ConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -15,11 +13,11 @@
 public class TestController {
 
     @Autowired
-    private ConfigService configService;
+    private AgvService agvService;
 
     @GetMapping("/fake")
     public R fake() {
-        return R.ok().add(configService.getVal("fakeSign", Boolean.class));
+        return R.ok().add(agvService.list());
     }
 
 }
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/config/MapDataConfig.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/config/MapDataConfig.java
new file mode 100644
index 0000000..cab53a6
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/config/MapDataConfig.java
@@ -0,0 +1,32 @@
+package com.zy.acs.fake.config;
+
+import com.zy.acs.fake.service.CodeService;
+import com.zy.acs.fake.service.MapDataDispatcher;
+import com.zy.acs.fake.service.RouteService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Created by vincent on 2023/7/14
+ */
+@Configuration
+public class MapDataConfig {
+
+    @Autowired
+    private CodeService codeService;
+    @Autowired
+    private RouteService routeService;
+
+    @Bean
+    public MapDataDispatcher getMapDataDispatcher() {
+        MapDataDispatcher dispatcher = new MapDataDispatcher(codeService, routeService);
+        String[][] codeMatrix = dispatcher.getCodeMatrix(null);
+        if (codeMatrix.length > 0) {
+            dispatcher.getDynamicMatrix(null);
+        }
+        return dispatcher;
+    }
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/domain/DynamicNode.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/domain/DynamicNode.java
new file mode 100644
index 0000000..2335cff
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/domain/DynamicNode.java
@@ -0,0 +1,30 @@
+package com.zy.acs.fake.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Created by vincent on 8/16/2024
+ */
+@Data
+public class DynamicNode implements Serializable {
+
+    private static final long serialVersionUID = 6334887510717610432L;
+
+    private String vehicle;
+
+    private Integer serial = -1;
+
+    public DynamicNode() {}
+
+    public DynamicNode(String vehicle) {
+        this.vehicle = vehicle;
+    }
+
+    public DynamicNode(String vehicle, Integer serial) {
+        this.vehicle = vehicle;
+        this.serial = serial;
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Action.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Action.java
new file mode 100644
index 0000000..fdfb3e0
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Action.java
@@ -0,0 +1,258 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zy.acs.fake.service.ActionStsService;
+import com.zy.acs.fake.service.ActionTypeService;
+import com.zy.acs.fake.service.AgvService;
+import com.zy.acs.framework.common.Cools;
+import com.zy.acs.framework.common.SpringUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_action")
+public class Action implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 鍔ㄤ綔缁�
+     */
+    @ApiModelProperty(value= "鍔ㄤ綔缁�")
+    private String groupId;
+
+    /**
+     * 鎬荤嚎
+     */
+    @ApiModelProperty(value= "鎬荤嚎")
+    private Long busId;
+
+    /**
+     * 浠诲姟
+     */
+    @ApiModelProperty(value= "浠诲姟")
+    private Long taskId;
+
+    /**
+     * 鍔ㄤ綔鍙�
+     */
+    @ApiModelProperty(value= "鍔ㄤ綔鍙�")
+    private String seqNum;
+
+    /**
+     * 浼樺厛绾�
+     * The large the value, the earlier it will be executed
+     */
+    @ApiModelProperty(value= "浼樺厛绾�")
+    private Integer priority;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 灞炴�у��
+     */
+    @ApiModelProperty(value= "灞炴�у��")
+    private Double val;
+
+    /**
+     * 鍦伴潰鐮�
+     */
+    @ApiModelProperty(value= "鍦伴潰鐮�")
+    private String code;
+
+    /**
+     * 鍔ㄤ綔鍙傛暟
+     */
+    @ApiModelProperty(value= "鍔ㄤ綔鍙傛暟")
+    private String params;
+
+    /**
+     * 鍔ㄤ綔绫诲瀷
+     */
+    @ApiModelProperty(value= "鍔ㄤ綔绫诲瀷")
+    private Long actionType;
+
+    /**
+     * 鍔ㄤ綔杩涘害
+     */
+    @ApiModelProperty(value= "鍔ㄤ綔杩涘害")
+    private Long actionSts;
+
+    /**
+     * AGV
+     */
+    @ApiModelProperty(value= "AGV")
+    private Long agvId;
+
+    /**
+     * 宸ヤ綔鏃堕棿
+     */
+    @ApiModelProperty(value= "宸ヤ綔鏃堕棿")
+    private Date ioTime;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value= "寮�濮嬫椂闂�")
+    private Date startTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "缁撴潫鏃堕棿")
+    private Date endTime;
+
+    /**
+     * 寮傚父鏃堕棿
+     */
+    @ApiModelProperty(value= "寮傚父鏃堕棿")
+    private Date errTime;
+
+    /**
+     * 寮傚父鎻忚堪
+     */
+    @ApiModelProperty(value= "寮傚父鎻忚堪")
+    private String errDesc;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public Action() {
+    }
+
+    public Action(String uuid, Long busId, Long taskId, String seqNum, Integer priority, String name, Double val, String code, String params, Long actionType, Long actionSts, Long agvId, Date ioTime) {
+        this.uuid = uuid;
+        this.busId = busId;
+        this.taskId = taskId;
+        this.seqNum = seqNum;
+        this.priority = priority;
+        this.name = name;
+        this.val = val;
+        this.code = code;
+        this.params = params;
+        this.actionType = actionType;
+        this.actionSts = actionSts;
+        this.agvId = agvId;
+        this.ioTime = ioTime;
+    }
+
+
+
+    public String getActionType$(){
+        ActionTypeService service = SpringUtils.getBean(ActionTypeService.class);
+        ActionType actionType = service.getById(this.actionType);
+        if (!Cools.isEmpty(actionType)){
+            return String.valueOf(actionType.getName());
+        }
+        return null;
+    }
+
+    public String getActionTypeEl(){
+        ActionTypeService service = SpringUtils.getBean(ActionTypeService.class);
+        ActionType type = service.getById(this.actionType);
+        if (!Cools.isEmpty(type)){
+            return String.valueOf(type.getUuid());
+        }
+        return null;
+    }
+
+    public String getActionSts$(){
+        ActionStsService service = SpringUtils.getBean(ActionStsService.class);
+        ActionSts actionSts = service.getById(this.actionSts);
+        if (!Cools.isEmpty(actionSts)){
+            return String.valueOf(actionSts.getName());
+        }
+        return null;
+    }
+
+    public String getAgvId$(){
+        AgvService service = SpringUtils.getBean(AgvService.class);
+        Agv agv = service.getById(this.agvId);
+        if (!Cools.isEmpty(agv)){
+            return String.valueOf(agv.getUuid());
+        }
+        return null;
+    }
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionSts.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionSts.java
new file mode 100644
index 0000000..d5e05c5
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionSts.java
@@ -0,0 +1,139 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_action_sts")
+public class ActionSts implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鏍囪瘑
+     */
+    @ApiModelProperty(value= "鏍囪瘑")
+    private String uuid;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public ActionSts() {}
+
+    public ActionSts(String uuid, String name, Integer status, Integer deleted, Long tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
+        this.uuid = uuid;
+        this.name = name;
+        this.status = status;
+        this.deleted = deleted;
+        this.tenantId = tenantId;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    ActionSts actionSts = new ActionSts(
+//            null,    // 鏍囪瘑
+//            null,    // 鍚嶇О
+//            null,    // 鐘舵�乕闈炵┖]
+//            null,    // 鏄惁鍒犻櫎[闈炵┖]
+//            null,    // 绉熸埛
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿[闈炵┖]
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "鍐荤粨";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionType.java
new file mode 100644
index 0000000..a3b9f9d
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/ActionType.java
@@ -0,0 +1,141 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_action_type")
+public class ActionType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鏍囪瘑
+     */
+    @ApiModelProperty(value= "鏍囪瘑")
+    private String uuid;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public ActionType() {}
+
+    public ActionType(String uuid, String name, Integer status, Integer deleted, Long tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
+        this.uuid = uuid;
+        this.name = name;
+        this.status = status;
+        this.deleted = deleted;
+        this.tenantId = tenantId;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    ActionType actionType = new ActionType(
+//            null,    // 鏍囪瘑
+//            null,    // 鍚嶇О
+//            null,    // 鐘舵�乕闈炵┖]
+//            null,    // 鏄惁鍒犻櫎[闈炵┖]
+//            null,    // 绉熸埛
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿[闈炵┖]
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "鍐荤粨";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Agv.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Agv.java
new file mode 100644
index 0000000..68ef448
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Agv.java
@@ -0,0 +1,91 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Created by vincent on 2023/5/22
+ */
+@Data
+@TableName("man_agv")
+public class Agv implements Serializable {
+
+    private static final long serialVersionUID = 6443628096282680964L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "缂栧彿")
+    private String uuid;
+
+    @ApiModelProperty(value = "璁惧鍚�")
+    private String name;
+
+    @ApiModelProperty(value = "ip鍦板潃")
+    private String ip;
+
+    @ApiModelProperty(value = "瀵嗛挜")
+    private String secret;
+
+    @ApiModelProperty(value= "宸ヤ綔鐘舵��")
+    private Long agvSts;
+
+    @ApiModelProperty(value= "杞﹀瀷")
+    private Long agvModel;
+
+    @ApiModelProperty(value= "鏆傚瓨鏁�")
+    private Integer stage;
+
+    @ApiModelProperty(value= "鍏呯數闃堝��")
+    private Integer chargeLine;
+
+    @ApiModelProperty(value = "鐘舵�亄1:姝e父,0:鍐荤粨}")
+    private Integer status;
+
+    @ApiModelProperty(value = "寮傚父{1:寮傚父,0:姝e父}")
+    private Integer error;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎{1:鏄�,0:鍚")
+    @TableLogic
+    private Integer deleted;
+
+    @ApiModelProperty(value = "绉熸埛[sys_tenant]")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "娣诲姞浜哄憳[sys_user]")
+    private Long createBy;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    @ApiModelProperty(value = "淇敼浜哄憳[sys_user]")
+    private Long updateBy;
+
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "澶囨敞")
+    private String memo;
+
+    @TableField(exist = false)
+    private Boolean online = Boolean.FALSE;
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/AgvDetail.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/AgvDetail.java
new file mode 100644
index 0000000..a060c8a
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/AgvDetail.java
@@ -0,0 +1,275 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zy.acs.common.enums.AgvStatusType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Optional;
+
+@Data
+@TableName("man_agv_detail")
+public class AgvDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * Agv
+     */
+    @ApiModelProperty(value= "Agv")
+    private Long agvId;
+
+    /**
+     * 鏍囬
+     */
+    @ApiModelProperty(value= "鏍囬")
+    private String title;
+
+    /**
+     * 瀹氫綅鐐� 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value= "瀹氫綅鐐� 1: 鏄�  0: 鍚�")
+    private Integer pos;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value= "鏉$爜")
+    private Long code;
+
+    /**
+     * 閭绘帴鏉$爜
+     */
+    @ApiModelProperty(value= "閭绘帴鏉$爜")
+    private Long lastCode;
+
+    /**
+     * 鍦伴潰鐮佸亸绉�
+     */
+    @ApiModelProperty(value= "鍦伴潰鐮佸亸绉�")
+    private String codeOffsert;
+
+    /**
+     * 鐩磋璺濈
+     */
+    @ApiModelProperty(value= "鐩磋璺濈")
+    private Double straightVal;
+
+    /**
+     * 褰撳墠瑙掑害
+     */
+    @ApiModelProperty(value= "褰撳墠瑙掑害")
+    private Double agvAngle;
+
+    /**
+     * 闄�铻轰华瑙掑害
+     */
+    @ApiModelProperty(value= "闄�铻轰华瑙掑害")
+    private Double gyroAngle;
+
+    /**
+     * 缂栫爜鍣ㄨ搴�
+     */
+    @ApiModelProperty(value= "缂栫爜鍣ㄨ搴�")
+    private Double encoderAngle;
+
+    /**
+     * 褰撳墠楂樺害
+     */
+    @ApiModelProperty(value= "褰撳墠楂樺害")
+    private Integer high;
+
+    /**
+     * 浼犳劅鍣ㄧ姸鎬�
+     */
+    @ApiModelProperty(value= "浼犳劅鍣ㄧ姸鎬�")
+    private Long sensorSts;
+
+    /**
+     * 鐢靛帇
+     */
+    @ApiModelProperty(value= "鐢靛帇")
+    private Integer vol;
+
+    /**
+     * 鐢甸噺
+     */
+    @ApiModelProperty(value= "鐢甸噺")
+    private Integer soc;
+
+    /**
+     * 鍋ュ悍
+     */
+    @ApiModelProperty(value= "鍋ュ悍")
+    private Integer soh;
+
+    /**
+     * 鐢垫睜鏁呴殰
+     */
+    @ApiModelProperty(value= "鐢垫睜鏁呴殰")
+    private Integer batteryFail;
+
+    /**
+     * 娓╁害
+     */
+    @ApiModelProperty(value= "娓╁害")
+    private String tempe;
+
+    /**
+     * 鐢垫満鏁呴殰
+     */
+    @ApiModelProperty(value= "鐢垫満鏁呴殰")
+    private String motorFail;
+
+    /**
+     * 鏁呴殰鏍囪瘑
+     */
+    @ApiModelProperty(value= "鏁呴殰鏍囪瘑")
+    private String failSign;
+
+    /**
+     * 寮�鏈烘椂闂�
+     */
+    @ApiModelProperty(value= "寮�鏈烘椂闂�")
+    private Integer bootTime;
+
+    /**
+     * 宸ヤ綔鏃堕棿
+     */
+    @ApiModelProperty(value= "宸ヤ綔鏃堕棿")
+    private Integer workTime;
+
+    /**
+     * 绱閲岀▼
+     */
+    @ApiModelProperty(value= "绱閲岀▼")
+    private Double workDistance;
+
+    /**
+     * 鏆傚瓨鏁伴噺
+     */
+    @ApiModelProperty(value= "鏆傚瓨鏁伴噺")
+    private String backpack;
+
+    /**
+     * 鏁呴殰淇℃伅
+     */
+    @ApiModelProperty(value= "鏁呴殰淇℃伅")
+    private String error;
+
+    /**
+     * 鏁呴殰鏃堕棿
+     */
+    @ApiModelProperty(value= "鏁呴殰鏃堕棿")
+    private Date errorTime;
+
+    /**
+     * 鐘舵��
+     */
+    @ApiModelProperty(value= "鐘舵��")
+    private Integer status;
+
+    @TableField(exist = false)
+    private AgvStatusType agvStatus;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public AgvDetail() {}
+
+    public Boolean getPosBool(){
+        if (null == this.pos){ return null; }
+        switch (this.pos){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+    public void setStatus(int status) {
+        this.status = status;
+        this.agvStatus = AgvStatusType.get(status);
+    }
+
+    public String getStatusDesc(){
+        return Optional.ofNullable(this.agvStatus).map(status -> status.desc).orElse("");
+    }
+
+    public Long getRecentCode() {
+//        if (this.code != null) {
+//            return this.code;
+//        }
+//        if (this.lastCode != null) {
+//            return this.lastCode;
+//        }
+        if (this.pos == 1) {
+            return this.code;
+        }
+        if (this.pos == 0) {
+            return this.lastCode;
+        }
+        return null;
+    }
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Code.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Code.java
new file mode 100644
index 0000000..2d1272a
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Code.java
@@ -0,0 +1,167 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_code")
+public class Code implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value= "鏉$爜")
+    private String data;
+
+    /**
+     * x鍧愭爣
+     */
+    @ApiModelProperty(value= "x鍧愭爣")
+    private Double x;
+
+    /**
+     * y鍧愭爣
+     */
+    @ApiModelProperty(value= "y鍧愭爣")
+    private Double y;
+
+    /**
+     * 杞 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "杞 1: 鏄�  0: 鍚�  ")
+    private Integer concer;
+
+    /**
+     * 缂╂斁
+     */
+    @ApiModelProperty(value= "缂╂斁")
+    private String scale;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public Code() {}
+
+    public Code(String uuid, String data, Double x, Double y, Integer concer, Integer status, Integer deleted, Long tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
+        this.uuid = uuid;
+        this.data = data;
+        this.x = x;
+        this.y = y;
+        this.concer = concer;
+        this.status = status;
+        this.deleted = deleted;
+        this.tenantId = tenantId;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    Code code = new Code(
+//            null,    // 缂栧彿
+//            null,    // 鏉$爜[闈炵┖]
+//            null,    // x鍧愭爣
+//            null,    // y鍧愭爣
+//            null,    // 杞[闈炵┖]
+//            null,    // 鐘舵�乕闈炵┖]
+//            null,    // 鏄惁鍒犻櫎[闈炵┖]
+//            null,    // 绉熸埛
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿[闈炵┖]
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+    public Boolean getCornerBool(){
+        if (null == this.concer){ return null; }
+        switch (this.concer){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Config.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Config.java
new file mode 100644
index 0000000..527ab50
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Config.java
@@ -0,0 +1,162 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zy.acs.framework.common.Cools;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("sys_config")
+public class Config implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 鏍囪瘑
+     */
+    @ApiModelProperty(value= "鏍囪瘑")
+    private String flag;
+
+    /**
+     * 绫诲瀷 1: boolean  2: number  3: string  4: json  5: date
+     */
+    @ApiModelProperty(value= "绫诲瀷 1: boolean  2: number  3: string  4: json  5: date  ")
+    private Integer type;
+
+    /**
+     * 瀛楀吀鍊�
+     */
+    @ApiModelProperty(value= "瀛楀吀鍊�")
+    private String val;
+
+    /**
+     * 瀛楀吀鏂囨湰
+     */
+    @ApiModelProperty(value= "瀛楀吀鏂囨湰")
+    private String content;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    @TableLogic
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public String getType$(){
+        if (null == this.type){ return null; }
+        switch (this.type){
+            case 1:
+                return "boolean";
+            case 2:
+                return "number";
+            case 3:
+                return "string";
+            case 4:
+                return "json";
+            case 5:
+                return "date";
+            default:
+                return String.valueOf(this.type);
+        }
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Jam.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Jam.java
new file mode 100644
index 0000000..d8514ad
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Jam.java
@@ -0,0 +1,233 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zy.acs.fake.service.AgvService;
+import com.zy.acs.fake.service.CodeService;
+import com.zy.acs.framework.common.Cools;
+import com.zy.acs.framework.common.SpringUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_jam")
+public class Jam implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鏍囪瘑
+     */
+    @ApiModelProperty(value= "鏍囪瘑")
+    private String uuid;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 杞﹁締
+     */
+    @ApiModelProperty(value= "杞﹁締")
+    private Long jamAgv;
+
+    /**
+     * 瀹氫綅
+     */
+    @ApiModelProperty(value= "瀹氫綅")
+    private Long jamCode;
+
+    /**
+     * 闃诲浠诲姟
+     */
+    @ApiModelProperty(value= "闃诲浠诲姟")
+    private Long jamSeg;
+
+    /**
+     * 闃诲璺緞
+     */
+    @ApiModelProperty(value= "闃诲璺緞")
+    private String jamPath;
+
+    /**
+     * 閬胯杞﹁締
+     */
+    @ApiModelProperty(value= "閬胯杞﹁締")
+    private Long avoAgv;
+
+    /**
+     * 閬胯瀹氫綅
+     */
+    @ApiModelProperty(value= "閬胯瀹氫綅")
+    private Long avoCode;
+
+    /**
+     * 閬胯浠诲姟
+     */
+    @ApiModelProperty(value= "閬胯浠诲姟")
+    private Long avoSeg;
+
+    /**
+     * 宓屽閬胯 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "宓屽閬胯 1: 鏄�  0: 鍚�  ")
+    private Integer cycleAvo;
+
+    /**
+     * 宓屽瀹氫綅
+     */
+    @ApiModelProperty(value= "宓屽瀹氫綅")
+    private Long cycleCode;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    @ApiModelProperty(value= "寮�濮嬫椂闂�")
+    private Date startTime;
+
+    /**
+     * 閫氱煡鏃堕棿
+     */
+    @ApiModelProperty(value= "閫氱煡鏃堕棿")
+    private Date notifyTime;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    @ApiModelProperty(value= "缁撴潫鏃堕棿")
+    private Date endTime;
+
+    /**
+     * 鎸佺画鏃堕暱
+     */
+    @ApiModelProperty(value= "鎸佺画鏃堕暱")
+    private Long duration;
+
+    /**
+     * 鎯呭喌
+     */
+    @ApiModelProperty(value= "鎯呭喌")
+    private String state;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public String getJamAgv$(){
+        AgvService service = SpringUtils.getBean(AgvService.class);
+        Agv agv = service.getById(this.jamAgv);
+        if (!Cools.isEmpty(agv)){
+            return String.valueOf(agv.getUuid());
+        }
+        return null;
+    }
+
+    public String getJamCode$(){
+        CodeService service = SpringUtils.getBean(CodeService.class);
+        Code code = service.getById(this.jamCode);
+        if (!Cools.isEmpty(code)){
+            return String.valueOf(code.getUuid());
+        }
+        return null;
+    }
+
+    public String getAvoAgv$(){
+        AgvService service = SpringUtils.getBean(AgvService.class);
+        Agv agv = service.getById(this.avoAgv);
+        if (!Cools.isEmpty(agv)){
+            return String.valueOf(agv.getUuid());
+        }
+        return null;
+    }
+
+    public String getAvoCode$(){
+        CodeService service = SpringUtils.getBean(CodeService.class);
+        Code code = service.getById(this.avoCode);
+        if (!Cools.isEmpty(code)){
+            return String.valueOf(code.getUuid());
+        }
+        return null;
+    }
+
+    public Boolean getCycleAvoBool(){
+        if (null == this.cycleAvo){ return null; }
+        switch (this.cycleAvo){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Route.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Route.java
new file mode 100644
index 0000000..60f9dbb
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/entity/Route.java
@@ -0,0 +1,202 @@
+package com.zy.acs.fake.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.zy.acs.fake.service.CodeService;
+import com.zy.acs.framework.common.SpringUtils;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("man_route")
+public class Route implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 璺緞鍚�
+     */
+    @ApiModelProperty(value= "璺緞鍚�")
+    private String name;
+
+    /**
+     * 璧风偣
+     */
+    @ApiModelProperty(value= "璧风偣")
+    private Long startCode;
+
+    /**
+     * 缁堢偣
+     */
+    @ApiModelProperty(value= "缁堢偣")
+    private Long endCode;
+
+    /**
+     * 鏉$爜缁�
+     */
+    @ApiModelProperty(value= "鏉$爜缁�")
+    private String codeArr;
+
+    /**
+     * 鏉$爜鏁版嵁
+     */
+    @ApiModelProperty(value= "鏉$爜鏁版嵁")
+    private String codeDataArr;
+
+    /**
+     * 鏂瑰悜 0: 鏃犲簭  1: 姝e悜  2: 鍙嶅悜  
+     */
+    @ApiModelProperty(value= "鏂瑰悜 0: 鏃犲簭  1: 姝e悜  2: 鍙嶅悜  ")
+    private Integer direction;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 鍐荤粨  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
+    private Integer status;
+
+    /**
+     * 鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  
+     */
+    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
+    private Integer deleted;
+
+    /**
+     * 绉熸埛
+     */
+    @ApiModelProperty(value= "绉熸埛")
+    private Long tenantId;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public Route() {}
+
+    public Route(String uuid, String name, Long startCode, Long endCode, String codeArr, String codeDataArr, Integer direction, Integer status, Integer deleted, Long tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
+        this.uuid = uuid;
+        this.name = name;
+        this.startCode = startCode;
+        this.endCode = endCode;
+        this.codeArr = codeArr;
+        this.codeDataArr = codeDataArr;
+        this.direction = direction;
+        this.status = status;
+        this.deleted = deleted;
+        this.tenantId = tenantId;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    Route route = new Route(
+//            null,    // 缂栧彿
+//            null,    // 璺緞鍚�
+//            null,    // 璧风偣[闈炵┖]
+//            null,    // 缁堢偣[闈炵┖]
+//            null,    // 鏉$爜缁刐闈炵┖]
+//            null,    // 鏉$爜鏁版嵁
+//            null,    // 鏂瑰悜[闈炵┖]
+//            null,    // 鐘舵�乕闈炵┖]
+//            null,    // 鏄惁鍒犻櫎[闈炵┖]
+//            null,    // 绉熸埛
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿[闈炵┖]
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+    public String getDirection$(){
+        if (null == this.direction){ return null; }
+        switch (this.direction){
+            case 0:
+                return "鏃犲簭";
+            case 1:
+                return "姝e悜";
+            case 2:
+                return "鍙嶅悜";
+            default:
+                return String.valueOf(this.direction);
+        }
+    }
+
+
+
+
+    public String getStartCode$() {
+        CodeService service = SpringUtils.getBean(CodeService.class);
+        Code entity = service.getById(this.startCode);
+        if (null != entity) {
+            return String.valueOf(entity.getData());
+        }
+        return null;
+    }
+
+    public String getEndCode$() {
+        CodeService service = SpringUtils.getBean(CodeService.class);
+        Code entity = service.getById(this.endCode);
+        if (null != entity) {
+            return String.valueOf(entity.getData());
+        }
+        return null;
+    }
+
+    public Boolean getStatusBool(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return true;
+            case 0:
+                return false;
+            default:
+                return null;
+        }
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionStsType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionStsType.java
new file mode 100644
index 0000000..f3a50c9
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionStsType.java
@@ -0,0 +1,27 @@
+package com.zy.acs.fake.enums;
+
+import com.zy.acs.fake.entity.ActionSts;
+import com.zy.acs.fake.service.ActionStsService;
+import com.zy.acs.framework.common.SpringUtils;
+
+public enum ActionStsType {
+
+    PREPARE,
+    ISSUED,
+    FINISH,
+    EXPIRED,
+    ;
+
+    ActionStsType() {
+    }
+
+    public long val() {
+        ActionStsService service = SpringUtils.getBean(ActionStsService.class);
+        ActionSts actionSts = service.selectByUuid(this.toString());
+        if (actionSts == null) {
+            throw new RuntimeException("ActionStsType Error!");
+        }
+        return actionSts.getId();
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionTypeType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionTypeType.java
new file mode 100644
index 0000000..9bc9a68
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ActionTypeType.java
@@ -0,0 +1,45 @@
+package com.zy.acs.fake.enums;
+
+import com.zy.acs.fake.entity.ActionType;
+import com.zy.acs.fake.service.ActionTypeService;
+import com.zy.acs.framework.common.SpringUtils;
+
+public enum ActionTypeType {
+
+    TurnCorner("杞集"), // 杞集
+    StraightBackUnturnable("宸烽亾鐩磋鍚庨��"), // 宸烽亾鐩磋鍚庨��
+    StraightBackTurnable("鐩磋鍚庨��"), // 鐩磋鍚庨��
+    StraightAheadUnturnable("宸烽亾鐩磋鍓嶈繘"), // 宸烽亾鐩磋鍓嶈繘
+    StraightAheadTurnable("鐩磋鍓嶈繘"), // 	鐩磋鍓嶈繘
+    ReadyTakeFromShelvesLoc("鍑嗗浠庤揣鏋跺彇璐�"), // 	鍑嗗浠庤揣鏋跺彇璐�
+    ReadyTakeFromAgvSite("鍑嗗浠嶢GV鏆傚瓨璐т綅鍙栬揣"), // 鍑嗗浠嶢GV鏆傚瓨璐т綅鍙栬揣
+    ReadyReleaseToShelvesLoc("鍑嗗浠庤揣鏋舵斁璐�"), // 	鍑嗗浠庤揣鏋舵斁璐�
+    ReadyReleaseToAgvSite("鍑嗗寰�AGV鏆傚瓨璐т綅鏀捐揣"), // 鍑嗗寰�AGV鏆傚瓨璐т綅鏀捐揣
+    FinishPath("鏁翠釜璺緞缁撴潫"), // 	鏁翠釜璺緞缁撴潫
+    DockingCharge("瀵规帴鍏呯數妗�"), // 	瀵规帴鍏呯數妗�
+    ;
+
+    ActionTypeType(String desc) {
+        this.desc = desc;
+    }
+    public String desc;
+
+    public long val() {
+        ActionTypeService service = SpringUtils.getBean(ActionTypeService.class);
+        ActionType actionType = service.selectByUuid(this.toString());
+        if (actionType == null) {
+            throw new RuntimeException("ActionTypeType Error!");
+        }
+        return actionType.getId();
+    }
+
+    public static ActionTypeType get(String el) {
+        for (ActionTypeType value : ActionTypeType.values()) {
+            if (el.equals(value.toString())) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/CodeNodeType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/CodeNodeType.java
new file mode 100644
index 0000000..b591ebd
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/CodeNodeType.java
@@ -0,0 +1,17 @@
+package com.zy.acs.fake.enums;
+
+public enum CodeNodeType {
+
+    NONE("NONE", "鏃犳潯鐮�"),
+    ;
+
+    public String val;
+
+    public String desc;
+
+    CodeNodeType(String val, String desc) {
+        this.val = val;
+        this.desc = desc;
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ConfigType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ConfigType.java
new file mode 100644
index 0000000..9d4e6d4
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/ConfigType.java
@@ -0,0 +1,29 @@
+package com.zy.acs.fake.enums;
+
+import com.zy.acs.framework.exception.CoolException;
+
+public enum ConfigType {
+
+    BOOLEAN(1),
+    NUMBER(2),
+    STRING(3),
+    JSON(4),
+    DATE(5),
+    ;
+
+    public int type;
+
+    ConfigType(int type) {
+        this.type = type;
+    }
+
+    public static ConfigType query(int type) {
+        for (ConfigType value : ConfigType.values()) {
+            if (type == value.type) {
+                return value;
+            }
+        }
+        throw new CoolException("ConfigType Error!");
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/DynamicNodeType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/DynamicNodeType.java
new file mode 100644
index 0000000..08414ec
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/DynamicNodeType.java
@@ -0,0 +1,18 @@
+package com.zy.acs.fake.enums;
+
+public enum DynamicNodeType {
+
+    BLOCK("-1", "闃诲"),
+    ACCESS("0", "閫氳"),
+    ;
+
+    public String val;
+
+    public String desc;
+
+    DynamicNodeType(String val, String desc) {
+        this.val = val;
+        this.desc = desc;
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/JamStateType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/JamStateType.java
new file mode 100644
index 0000000..1328f14
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/JamStateType.java
@@ -0,0 +1,11 @@
+package com.zy.acs.fake.enums;
+
+public enum JamStateType {
+
+    RUNNING,
+    FINISH,
+    FAIL,
+    DEPRECATED,
+    ;
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/MapNodeType.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/MapNodeType.java
new file mode 100644
index 0000000..617d800
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/enums/MapNodeType.java
@@ -0,0 +1,20 @@
+package com.zy.acs.fake.enums;
+
+public enum MapNodeType {
+
+    DISABLE(-1, "绂佺敤"),
+    LOCKED(0, "閿佸畾"),
+    ENABLE(1, "鍙敤"),
+    CHARGE(4, "鍏呯數妗�"),
+    VEHICLE(66, "杞﹁締"),
+    ;
+
+    public int val;
+
+    public String desc;
+
+    MapNodeType(int val, String desc) {
+        this.val = val;
+        this.desc = desc;
+    }
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionMapper.java
new file mode 100644
index 0000000..049c51b
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionMapper.java
@@ -0,0 +1,26 @@
+package com.zy.acs.fake.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.Action;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ActionMapper extends BaseMapper<Action> {
+
+    int updateStsByGroupId(@Param("groupId") String groupId, @Param("actionSts") Long actionSts);
+
+    List<Map<String, Object>> selectRecentForInout();
+
+    List<Map<String, Object>> selectCountGroupByType();
+
+    List<String> selectPrepareGroup();
+
+    List<Long> selectTaskIdsByGroupId(@Param("groupId") String groupId);
+
+    List<String> selectSortCodeByAgv(@Param("agvId") Long agvId);
+
+    List<Action> selectLatestOfGroup(@Param("agvId") Long agvId, @Param("actionSts") Long actionSts);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionStsMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionStsMapper.java
new file mode 100644
index 0000000..420c837
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionStsMapper.java
@@ -0,0 +1,8 @@
+package com.zy.acs.fake.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.ActionSts;
+
+public interface ActionStsMapper extends BaseMapper<ActionSts> {
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionTypeMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionTypeMapper.java
new file mode 100644
index 0000000..3986afb
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ActionTypeMapper.java
@@ -0,0 +1,9 @@
+package com.zy.acs.fake.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.ActionType;
+
+public interface ActionTypeMapper extends BaseMapper<ActionType> {
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvDetailMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvDetailMapper.java
new file mode 100644
index 0000000..e1ed4b3
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvDetailMapper.java
@@ -0,0 +1,13 @@
+package com.zy.acs.fake.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.AgvDetail;
+import org.apache.ibatis.annotations.Param;
+
+public interface AgvDetailMapper extends BaseMapper<AgvDetail> {
+
+    int updatePosCode(@Param("id") Long id, @Param("codeId") Long codeId);
+
+    int updateUnPosCode(@Param("id") Long id, @Param("lastCode") Long lastCode);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvMapper.java
new file mode 100644
index 0000000..f8355e3
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/AgvMapper.java
@@ -0,0 +1,16 @@
+package com.zy.acs.fake.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.Agv;
+
+/**
+ * AgvMapper
+ *
+ * @author vincent
+ * @since 2020-03-14 11:29:04
+ */
+public interface AgvMapper extends BaseMapper<Agv> {
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/CodeMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/CodeMapper.java
new file mode 100644
index 0000000..c52e559
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/CodeMapper.java
@@ -0,0 +1,16 @@
+package com.zy.acs.fake.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.Code;
+
+import java.util.Map;
+
+public interface CodeMapper extends BaseMapper<Code> {
+
+    Map<String, Object> selectMinAndMaxByPoint();
+
+    int selectDistinctCountFromX();
+
+    int selectDistinctCountFromY();
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ConfigMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ConfigMapper.java
new file mode 100644
index 0000000..e8d8b1b
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/ConfigMapper.java
@@ -0,0 +1,13 @@
+package com.zy.acs.fake.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.Config;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ConfigMapper extends BaseMapper<Config> {
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/JamMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/JamMapper.java
new file mode 100644
index 0000000..4a713be
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/JamMapper.java
@@ -0,0 +1,17 @@
+package com.zy.acs.fake.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.Jam;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface JamMapper extends BaseMapper<Jam> {
+
+    List<Jam> selectUnfinishedJamByAvo(@Param("avoAgv")Long avoAgv, @Param("currCode")Long currCode, @Param("currSeg")Long currSeg);
+
+    List<Jam> selectJamFromSegmentByAvo(@Param("jamSeg")Long jamSeg, @Param("avoAgv")Long avoAgv);
+
+    List<Jam> selectUnfinishedAvoSegByAvo(@Param("avoAgv")Long avoAgv, @Param("currSeg")Long currSeg);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/RouteMapper.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/RouteMapper.java
new file mode 100644
index 0000000..4bdd22f
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/mapper/RouteMapper.java
@@ -0,0 +1,8 @@
+package com.zy.acs.fake.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zy.acs.fake.entity.Route;
+
+public interface RouteMapper extends BaseMapper<Route> {
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionService.java
new file mode 100644
index 0000000..26387d1
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionService.java
@@ -0,0 +1,30 @@
+package com.zy.acs.fake.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.Action;
+import com.zy.acs.fake.enums.ActionStsType;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ActionService extends IService<Action> {
+
+    Boolean updateStsByGroupId(String groupId, Long actionSts);
+
+    List<Map<String, Object>> selectRecentForInout();
+
+    List<Map<String, Object>> selectCountGroupByType();
+
+    List<String> selectPrepareGroup();
+
+    List<Long> selectTaskIdsByGroupId(String groupId);
+
+    List<Action> optimizeSort(List<Action> actionList);
+
+    List<String> getPathListByAgv(String agvNo);
+
+    List<Action> queryLatestGroup(Long agvId, ActionStsType actionSts);
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionStsService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionStsService.java
new file mode 100644
index 0000000..1f8005b
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionStsService.java
@@ -0,0 +1,10 @@
+package com.zy.acs.fake.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.ActionSts;
+
+public interface ActionStsService extends IService<ActionSts> {
+
+    ActionSts selectByUuid(String uuid);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionTypeService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionTypeService.java
new file mode 100644
index 0000000..df71656
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ActionTypeService.java
@@ -0,0 +1,11 @@
+package com.zy.acs.fake.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.ActionType;
+
+public interface ActionTypeService extends IService<ActionType> {
+
+    ActionType selectByUuid(String uuid);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvDetailService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvDetailService.java
new file mode 100644
index 0000000..0fe1eb0
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvDetailService.java
@@ -0,0 +1,12 @@
+package com.zy.acs.fake.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.AgvDetail;
+
+public interface AgvDetailService extends IService<AgvDetail> {
+
+    AgvDetail selectByAgvId(Long agvId);
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvService.java
new file mode 100644
index 0000000..2361e7d
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/AgvService.java
@@ -0,0 +1,11 @@
+package com.zy.acs.fake.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.Agv;
+
+public interface AgvService extends IService<Agv> {
+
+    Agv selectByUuid(String uuid);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/CodeService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/CodeService.java
new file mode 100644
index 0000000..587cad5
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/CodeService.java
@@ -0,0 +1,14 @@
+package com.zy.acs.fake.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.Code;
+
+public interface CodeService extends IService<Code> {
+
+    Code selectByData(String data);
+
+    int selectDistinctCountFromX();
+
+    int selectDistinctCountFromY();
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ConfigService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ConfigService.java
new file mode 100644
index 0000000..11e7cfd
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/ConfigService.java
@@ -0,0 +1,12 @@
+package com.zy.acs.fake.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.Config;
+
+public interface ConfigService extends IService<Config> {
+
+    <T> T getVal(String key, Class<T> clazz);
+
+    <T> boolean setVal(String key, T val);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/JamService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/JamService.java
new file mode 100644
index 0000000..18317a9
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/JamService.java
@@ -0,0 +1,27 @@
+package com.zy.acs.fake.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.Jam;
+import com.zy.acs.fake.enums.JamStateType;
+
+import java.util.List;
+
+public interface JamService extends IService<Jam> {
+
+    Jam getJam(Long agvId, Long jamCode, Long jamSeg);
+
+    /**
+     * 涓昏涓� 閬胯杞�
+     * 闃诲浠诲姟 鏈� 瀹屾垚
+     * 閬胯浠诲姟 宸� 瀹屾垚
+     */
+    List<Jam> getUnfinishedOriginJamByAvo(Long avoAgv, Long currCode, Long currSeg);
+
+    Jam getCycleJam(Long jamAgv, Long jamSeg, String avoAgvNo);
+
+    List<Jam> queryByAvoid(Long avoAgv, JamStateType jamState);
+
+    Boolean checkIfFinish(Long avoAgv, String currCodeData);
+
+    boolean deprecate(Long id, Long loginUserId);
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapDataDispatcher.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapDataDispatcher.java
new file mode 100644
index 0000000..2998038
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapDataDispatcher.java
@@ -0,0 +1,253 @@
+package com.zy.acs.fake.service;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.constant.RedisConstant;
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.fake.domain.DynamicNode;
+import com.zy.acs.fake.entity.Code;
+import com.zy.acs.fake.enums.CodeNodeType;
+import com.zy.acs.fake.enums.DynamicNodeType;
+import com.zy.acs.fake.enums.MapNodeType;
+import com.zy.acs.framework.common.Cools;
+import com.zy.acs.framework.exception.CoolException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Created by vincent on 6/6/2024
+ */
+@Slf4j
+public class MapDataDispatcher {
+
+    public static final Integer MAP_DEFAULT_LEV = 1;
+
+    private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+    public static final Boolean CACHE_CODE_MATRIX = Boolean.FALSE;
+
+    private String[][] codeMatrix;
+
+    private final CodeService codeService;
+
+    private final RouteService routeService;
+
+    public MapDataDispatcher(CodeService codeService, RouteService routeService) {
+        this.codeService = codeService;
+        this.routeService = routeService;
+    }
+
+    public DynamicNode[][] getDynamicMatrix(Integer lev) {
+        lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV);
+        DynamicNode[][] dynamicMatrix;
+        String dynamicMatrixStr = redis.getValue(RedisConstant.AGV_MAP_ASTAR_DYNAMIC_FLAG, String.valueOf(lev));
+        if (Cools.isEmpty(dynamicMatrixStr)) {
+            throw new CoolException("the floor " + lev + " cannot found dynamic matrix !!!");
+        } else {
+            dynamicMatrix = JSON.parseObject(dynamicMatrixStr, DynamicNode[][].class);
+        }
+        if (null == dynamicMatrix) {
+            throw new CoolException("the floor " + lev + " cannot found dynamic matrix !!!");
+        }
+        return dynamicMatrix;
+    }
+
+    public void setDynamicMatrix(Integer lev, DynamicNode[][] dynamicMatrix) {
+        redis.setValue(RedisConstant.AGV_MAP_ASTAR_DYNAMIC_FLAG, String.valueOf(lev), JSON.toJSONString(dynamicMatrix));
+    }
+
+    public String[][] getCodeMatrix(Integer lev) {
+        lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV);
+        String[][] codeMatrix;
+        if (!CACHE_CODE_MATRIX) {
+            if (null == this.codeMatrix) {
+                codeMatrix = this.initCodeMatrix(lev);
+                setCodeMatrix(lev, codeMatrix);
+            } else {
+                codeMatrix = this.codeMatrix;
+            }
+        } else {
+            String codeMatrixStr = redis.getValue(RedisConstant.AGV_MAP_ASTAR_CODE_FLAG, String.valueOf(lev));
+            if (Cools.isEmpty(codeMatrixStr)) {
+                codeMatrix = this.initCodeMatrix(lev);
+                setCodeMatrix(lev, codeMatrix);
+            } else {
+                codeMatrix = JSON.parseObject(codeMatrixStr, String[][].class);
+            }
+        }
+        if (null == codeMatrix) {
+            throw new CoolException("the floor " + lev + " cannot found code matrix !!!");
+        }
+        return codeMatrix;
+    }
+
+    public void setCodeMatrix(Integer lev, String[][] codeMatrix) {
+        if (!CACHE_CODE_MATRIX) {
+            this.codeMatrix = codeMatrix;
+        } else {
+            redis.setValue(RedisConstant.AGV_MAP_ASTAR_CODE_FLAG, String.valueOf(lev), JSON.toJSONString(codeMatrix));
+        }
+    }
+
+
+
+
+    public synchronized String[][] initCodeMatrix(Integer lev) {
+        log.info("銆怉STAR銆戞鍦ㄨ绠楃煩闃垫暟鎹�......");
+        lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV);
+        List<Code> codeList = codeService.list(new LambdaQueryWrapper<Code>()
+                .eq(Code::getStatus, 1)
+                .orderByAsc(Code::getY)
+                .orderByAsc(Code::getX)
+        );
+//        int xCount = codeService.selectDistinctCountFromX();
+//        int yCount = codeService.selectDistinctCountFromY();
+//        // [][] 绗竴涓槸鎺掔殑鏁伴噺 绗簩涓槸鍒楃殑鏁伴噺
+//        String[][] codeMatrix = new String[yCount][xCount];
+
+        List<Double> xIdxList = new ArrayList<>();
+        List<Double> yIdxList = new ArrayList<>();
+        for (Code code : codeList) {
+            Double x = code.getX();
+            Double y = code.getY();
+            if (null == x || null == y) { continue; }
+            if (!xIdxList.contains(x)) {
+                xIdxList.add(x);
+            }
+            if (!yIdxList.contains(y)) {
+                yIdxList.add(y);
+            }
+        }
+        xIdxList.sort((o1, o2) -> (int) ((o1 * 100) - (o2 * 100)));
+        yIdxList.sort((o1, o2) -> (int) ((o1 * 100) - (o2 * 100)));
+
+        // [][] 绗竴涓槸鎺掔殑鏁伴噺 绗簩涓槸鍒楃殑鏁伴噺
+        String[][] codeMatrix = new String[yIdxList.size()][xIdxList.size()];
+
+        int idxX = -1;
+        int idxY = -1;
+        double lastX = -1;
+        double lastY = -1;
+        for (Code code : codeList) {
+            Double x = code.getX();
+            Double y = code.getY();
+//            if (y != lastY) {
+//                idxY ++;
+//                idxX = 0;
+//                lastY = y;
+//                lastX = x;
+//            }
+//            if (x != lastX) {
+//                idxX++;
+//                lastX = x;
+//            }
+//            codeMatrix[idxY][idxX] = code.getData();
+
+            codeMatrix[yIdxList.indexOf(y)][xIdxList.indexOf(x)] = code.getData();
+        }
+
+        for (int i = 0; i < codeMatrix.length; i++) {
+            for (int j = 0; j < codeMatrix[i].length; j++) {
+                if (codeMatrix[i][j] == null) {
+                    codeMatrix[i][j] = CodeNodeType.NONE.val;
+                }
+            }
+        }
+
+        printMatrix(codeMatrix);
+
+        return codeMatrix;
+    }
+
+    public int[] getCodeMatrixIdx(Integer lev, String codeData) {
+        if (Cools.isEmpty(codeData)) {
+            return null;
+        }
+        lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV);
+        String[][] codeMatrix = this.getCodeMatrix(lev);
+
+        for (int i = 0; i < codeMatrix.length; i++) {
+            for (int j = 0; j < codeMatrix[i].length; j++) {
+                if (codeMatrix[i][j].equals(codeData)) {
+                    return new int[]{i, j};
+                }
+            }
+        }
+        return null;
+    }
+
+
+    public void modifyDynamicMatrix(Integer lev, List<String> codeList, String vehicle) {
+        this.modifyDynamicMatrix(lev, codeList, vehicle, false);
+    }
+
+    public synchronized void modifyDynamicMatrix(Integer lev, List<String> codeList, String vehicle, boolean reset) {
+        lev = Optional.ofNullable(lev).orElse(MAP_DEFAULT_LEV);
+        DynamicNode[][] dynamicMatrix = getDynamicMatrix(lev);
+
+        if (!reset) {
+            if (Cools.isEmpty(codeList, vehicle)) {
+                return;
+            }
+            int serial = 1;
+            for (String code : codeList) {
+                int[] node = getCodeMatrixIdx(lev, code);
+                dynamicMatrix[node[0]][node[1]] = new DynamicNode(vehicle, serial);
+                serial++;
+            }
+        } else {
+            if (Cools.isEmpty(vehicle)) {
+                return;
+            }
+            for (int i = 0; i < dynamicMatrix.length; i++) {
+                for (int j = 0; j < dynamicMatrix[i].length; j++) {
+                    DynamicNode dynamicNode = dynamicMatrix[i][j];
+                    if (vehicle.equals(dynamicNode.getVehicle())) {
+                        dynamicMatrix[i][j] = new DynamicNode(DynamicNodeType.ACCESS.val);
+                    }
+                }
+            }
+        }
+
+        setDynamicMatrix(lev, dynamicMatrix);
+    }
+
+    public void clearDynamicMatrixByCodeList(Integer lev, List<String> codeList) {
+        this.modifyDynamicMatrix(lev, codeList, DynamicNodeType.ACCESS.val);
+    }
+
+    public int[][] filterMapData(int[][] mapMatrix, Integer lev, List<String> lockNodes) {
+        String[][] codeMatrix = getCodeMatrix(lev);
+        for (int i = 0; i < codeMatrix.length; i++) {
+            for (int j = 0; j < codeMatrix[i].length; j++) {
+                String code = codeMatrix[i][j];
+                if (lockNodes.contains(code)) {
+                    mapMatrix[i][j] = MapNodeType.LOCKED.val;
+                }
+            }
+        }
+        return mapMatrix;
+    }
+
+    public <T> void printMatrix(T[][] matrix) {
+        for (T[] list : matrix) {
+            for (T t : list) {
+                System.out.format("%10s", t);
+            }
+            System.out.println();
+        }
+    }
+
+    public void printMatrix(int[][] matrix) {
+        for (int[] list : matrix) {
+            for (int t : list) {
+                System.out.format("%10s", t);
+            }
+            System.out.println();
+        }
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java
new file mode 100644
index 0000000..1578c7a
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/MapService.java
@@ -0,0 +1,64 @@
+package com.zy.acs.fake.service;
+
+import com.zy.acs.fake.domain.DynamicNode;
+import com.zy.acs.framework.common.Cools;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by vincent on 2023/6/14
+ */
+@Slf4j
+@Component("mapService")
+public class MapService {
+
+    @Autowired
+    private MapDataDispatcher mapDataDispatcher;
+
+    public synchronized void unlockPath(String agvNo, String codeData) {
+        try {
+
+            if (Cools.isEmpty(agvNo, codeData)) {
+                return;
+            }
+
+            Integer lev = null;
+
+            String[][] codeMatrix = mapDataDispatcher.getCodeMatrix(null);
+            int[] codeMatrixIdx = mapDataDispatcher.getCodeMatrixIdx(lev, codeData);
+
+
+            DynamicNode[][] dynamicMatrix = mapDataDispatcher.getDynamicMatrix(lev);
+
+            DynamicNode dynamicNode = dynamicMatrix[codeMatrixIdx[0]][codeMatrixIdx[1]];
+
+
+            Integer serial = dynamicNode.getSerial();
+
+            List<String> resetCodeList = new ArrayList<>();
+
+            for (int i = 0; i < dynamicMatrix.length; i++) {
+                for (int j = 0; j < dynamicMatrix[i].length; j++) {
+                    DynamicNode node = dynamicMatrix[i][j];
+                    if (node.getVehicle().equals(agvNo) && node.getSerial() < serial) {
+                        resetCodeList.add(codeMatrix[i][j]);
+                    }
+                }
+            }
+
+            if (!Cools.isEmpty(resetCodeList)) {
+
+                mapDataDispatcher.clearDynamicMatrixByCodeList(lev, resetCodeList);
+            }
+
+        } catch (Exception e) {
+            log.error("TrafficService.unlockPath", e);
+        }
+
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/RouteService.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/RouteService.java
new file mode 100644
index 0000000..eb06c07
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/RouteService.java
@@ -0,0 +1,21 @@
+package com.zy.acs.fake.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.acs.fake.entity.Code;
+import com.zy.acs.fake.entity.Route;
+
+import java.util.List;
+
+public interface RouteService extends IService<Route> {
+
+    Route createRouteByCode(Code startCode, Code endCode);
+
+    Route createRouteByCode(Code startCode, Code endCode, Integer direction, Long userId);
+
+    List<String> findCodeDataOfSingle(Long code);
+
+    Route findByCodeOfBoth(Long startCode, Long endCode);
+
+    List<Long> getAdjacencyNode(Long codeId);
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionServiceImpl.java
new file mode 100644
index 0000000..41f73a1
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionServiceImpl.java
@@ -0,0 +1,120 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.fake.entity.Action;
+import com.zy.acs.fake.entity.Agv;
+import com.zy.acs.fake.enums.ActionStsType;
+import com.zy.acs.fake.enums.ActionTypeType;
+import com.zy.acs.fake.mapper.ActionMapper;
+import com.zy.acs.fake.service.ActionService;
+import com.zy.acs.fake.service.AgvService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Service("actionService")
+public class ActionServiceImpl extends ServiceImpl<ActionMapper, Action> implements ActionService {
+
+    @Autowired
+    private AgvService agvService;
+
+    @Override
+    public Boolean updateStsByGroupId(String groupId, Long actionSts) {
+        return baseMapper.updateStsByGroupId(groupId, actionSts) > 0;
+    }
+
+    @Override
+    public List<Map<String, Object>> selectRecentForInout() {
+        return this.baseMapper.selectRecentForInout();
+    }
+
+    @Override
+    public List<Map<String, Object>> selectCountGroupByType() {
+        return this.baseMapper.selectCountGroupByType();
+    }
+
+    @Override
+    public List<String> selectPrepareGroup() {
+        return this.baseMapper.selectPrepareGroup();
+    }
+
+    @Override
+    public List<Long> selectTaskIdsByGroupId(String groupId) {
+        return this.baseMapper.selectTaskIdsByGroupId(groupId);
+    }
+
+    @Override
+    public List<Action> optimizeSort(List<Action> actionList) {
+        long readyTakeFromAgvSite = ActionTypeType.ReadyTakeFromAgvSite.val();
+        long turnCorner = ActionTypeType.TurnCorner.val();
+        long readyReleaseToAgvSite = ActionTypeType.ReadyReleaseToAgvSite.val();
+        long readyReleaseToShelvesLoc = ActionTypeType.ReadyReleaseToShelvesLoc.val();
+        boolean hasFlag = false;
+        int destTaskFromAgvSiteIdx = -1;
+        for (int i = 0; i < actionList.size(); i++) {
+            Action curr = actionList.get(i);
+            if (curr.getActionType().equals(readyTakeFromAgvSite)) {
+                hasFlag = true;
+                destTaskFromAgvSiteIdx = i;
+                break;
+            }
+        }
+
+        List<Action> sortList = new ArrayList<>(actionList.size());
+        if (hasFlag) {
+            int turnCornerIdx = -1;
+            for (int i = 0; i < actionList.size(); i++) {
+                Action curr = actionList.get(i);
+                if (curr.getActionType().equals(turnCorner)) {
+                    turnCornerIdx = i;
+                }
+            }
+
+            if (turnCornerIdx != -1) {
+                Action tmp = actionList.get(destTaskFromAgvSiteIdx);//鍙栬揣鍔ㄤ綔
+                for (int i = 0; i < actionList.size(); i++) {
+                    Action curr = actionList.get(i);
+                    if (i == destTaskFromAgvSiteIdx) {
+                        continue;
+                    }
+                    sortList.add(curr);
+                    if (i == turnCornerIdx) {
+                        tmp.setCode(curr.getCode());//鏇存崲鏉$爜
+                        sortList.add(tmp);
+                    }
+                }
+            }else {
+                Action tmp = actionList.get(destTaskFromAgvSiteIdx);//鍙栬揣鍔ㄤ綔
+                for (int i = 0; i < actionList.size(); i++) {
+                    Action curr = actionList.get(i);
+                    if (i == destTaskFromAgvSiteIdx) {
+                        continue;
+                    }
+                    if (i == 0) {
+                        tmp.setCode(curr.getCode());//鏇存崲鏉$爜
+                        sortList.add(tmp);
+                    }
+                    sortList.add(curr);
+                }
+            }
+        }else {
+            sortList = actionList;
+        }
+        return sortList;
+    }
+
+    @Override
+    public List<String> getPathListByAgv(String agvNo) {
+        Agv agv = agvService.selectByUuid(agvNo);
+        return this.baseMapper.selectSortCodeByAgv(agv.getId());
+    }
+
+    @Override
+    public List<Action> queryLatestGroup(Long agvId, ActionStsType actionSts) {
+        return this.baseMapper.selectLatestOfGroup(agvId, actionSts.val());
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionStsServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionStsServiceImpl.java
new file mode 100644
index 0000000..c99f6d8
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionStsServiceImpl.java
@@ -0,0 +1,17 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.fake.entity.ActionSts;
+import com.zy.acs.fake.mapper.ActionStsMapper;
+import com.zy.acs.fake.service.ActionStsService;
+import org.springframework.stereotype.Service;
+
+@Service("actionStsService")
+public class ActionStsServiceImpl extends ServiceImpl<ActionStsMapper, ActionSts> implements ActionStsService {
+
+    @Override
+    public ActionSts selectByUuid(String uuid) {
+        return this.getOne(new LambdaQueryWrapper<ActionSts>().eq(ActionSts::getUuid, uuid));
+    }
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionTypeServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionTypeServiceImpl.java
new file mode 100644
index 0000000..2a7696d
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ActionTypeServiceImpl.java
@@ -0,0 +1,18 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.fake.entity.ActionType;
+import com.zy.acs.fake.mapper.ActionTypeMapper;
+import com.zy.acs.fake.service.ActionTypeService;
+import org.springframework.stereotype.Service;
+
+@Service("actionTypeService")
+public class ActionTypeServiceImpl extends ServiceImpl<ActionTypeMapper, ActionType> implements ActionTypeService {
+
+    @Override
+    public ActionType selectByUuid(String uuid) {
+        return this.getOne(new LambdaQueryWrapper<ActionType>().eq(ActionType::getUuid, uuid));
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvDetailServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvDetailServiceImpl.java
new file mode 100644
index 0000000..71c1438
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvDetailServiceImpl.java
@@ -0,0 +1,23 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.fake.entity.AgvDetail;
+import com.zy.acs.fake.mapper.AgvDetailMapper;
+import com.zy.acs.fake.service.AgvDetailService;
+import com.zy.acs.fake.service.AgvService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service("agvDetailService")
+public class AgvDetailServiceImpl extends ServiceImpl<AgvDetailMapper, AgvDetail> implements AgvDetailService {
+
+    @Autowired
+    private AgvService agvService;
+
+    @Override
+    public AgvDetail selectByAgvId(Long agvId) {
+        return this.getOne(new LambdaQueryWrapper<AgvDetail>().eq(AgvDetail::getAgvId, agvId));
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvServiceImpl.java
new file mode 100644
index 0000000..b533a7c
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/AgvServiceImpl.java
@@ -0,0 +1,28 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.fake.entity.Agv;
+import com.zy.acs.fake.mapper.AgvMapper;
+import com.zy.acs.fake.service.AgvService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 瀛楀吀鏁版嵁Service瀹炵幇
+ *
+ * @author vincent
+ * @since 2020-03-14 11:29:04
+ */
+@Slf4j
+@Service
+public class AgvServiceImpl extends ServiceImpl<AgvMapper, Agv> implements AgvService {
+
+    @Override
+    public Agv selectByUuid(String uuid) {
+        return this.getOne(new LambdaQueryWrapper<Agv>().eq(Agv::getUuid, uuid));
+    }
+
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/CodeServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/CodeServiceImpl.java
new file mode 100644
index 0000000..7453c63
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/CodeServiceImpl.java
@@ -0,0 +1,28 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.fake.entity.Code;
+import com.zy.acs.fake.mapper.CodeMapper;
+import com.zy.acs.fake.service.CodeService;
+import org.springframework.stereotype.Service;
+
+@Service("codeService")
+public class CodeServiceImpl extends ServiceImpl<CodeMapper, Code> implements CodeService {
+
+    @Override
+    public Code selectByData(String data) {
+        return this.getOne(new LambdaQueryWrapper<Code>().eq(Code::getData, data));
+    }
+
+    @Override
+    public int selectDistinctCountFromX() {
+        return this.baseMapper.selectDistinctCountFromX();
+    }
+
+    @Override
+    public int selectDistinctCountFromY() {
+        return this.baseMapper.selectDistinctCountFromY();
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ConfigServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ConfigServiceImpl.java
new file mode 100644
index 0000000..28e56f4
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/ConfigServiceImpl.java
@@ -0,0 +1,103 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.common.utils.GsonUtils;
+import com.zy.acs.fake.entity.Config;
+import com.zy.acs.fake.enums.ConfigType;
+import com.zy.acs.fake.mapper.ConfigMapper;
+import com.zy.acs.fake.service.ConfigService;
+import com.zy.acs.framework.common.DateUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by vincent on 8/30/2024
+ */
+@Service("configService")
+public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements ConfigService {
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T getVal(String key, Class<T> clazz) {
+        List<Config> list = this.list(new LambdaQueryWrapper<Config>().eq(Config::getFlag, key));
+        Config config = list.stream().findFirst().orElse(null);
+        if (null == config) {
+            return null;
+        }
+        String val = config.getVal();
+        switch (ConfigType.query(config.getType())) {
+            case BOOLEAN:
+                if (val.equals("1") || val.trim().toUpperCase().equals("TRUE")) {
+                    return (T) Boolean.TRUE;
+                }
+                return (T) Boolean.FALSE;
+            case NUMBER:
+                if (clazz == Integer.class) {
+                    return (T) Integer.valueOf(val);
+                } else if (clazz == Short.class) {
+                    return (T) Short.valueOf(val);
+                } else if (clazz == Long.class) {
+                    return (T) Long.valueOf(val);
+                } else if (clazz == Double.class) {
+                    return (T) Double.valueOf(val);
+                }
+                throw new UnsupportedOperationException("Unsupported type: " + clazz.getName());
+            case STRING:
+                return (T) val;
+            case JSON:
+                return GsonUtils.fromJson(val, clazz);
+            case DATE:
+                return (T) DateUtils.convert(val);
+            default:
+                return null;
+        }
+    }
+
+    @Override
+    public <T> boolean setVal(String key, T val) {
+        List<Config> list = this.list(new LambdaQueryWrapper<Config>().eq(Config::getFlag, key));
+        Config config = list.stream().findFirst().orElse(null);
+        if (config == null) {
+            return false;
+        }
+        ConfigType configType = ConfigType.query(config.getType());
+        switch (configType) {
+            case BOOLEAN:
+                if (!(val instanceof Boolean)) {
+                    throw new IllegalArgumentException("Expected Boolean value for key: " + key);
+                }
+                config.setVal((Boolean) val ? "TRUE" : "FALSE");
+                break;
+            case NUMBER:
+                if (val instanceof Integer || val instanceof Short || val instanceof Long || val instanceof Double) {
+                    config.setVal(String.valueOf(val));
+                } else {
+                    throw new IllegalArgumentException("Expected a numeric value for key: " + key);
+                }
+                break;
+            case STRING:
+                if (!(val instanceof String)) {
+                    throw new IllegalArgumentException("Expected a String value for key: " + key);
+                }
+                config.setVal((String) val);
+                break;
+            case JSON:
+                config.setVal(GsonUtils.toJson(val));
+                break;
+            case DATE:
+                if (!(val instanceof Date)) {
+                    throw new IllegalArgumentException("Expected a Date value for key: " + key);
+                }
+                config.setVal(DateUtils.convert((Date) val));
+                break;
+            default:
+                throw new UnsupportedOperationException("Unsupported ConfigType: " + configType);
+        }
+
+        return this.updateById(config);
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/JamServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/JamServiceImpl.java
new file mode 100644
index 0000000..6ee57ef
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/JamServiceImpl.java
@@ -0,0 +1,117 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.fake.entity.Code;
+import com.zy.acs.fake.entity.Jam;
+import com.zy.acs.fake.enums.JamStateType;
+import com.zy.acs.fake.mapper.JamMapper;
+import com.zy.acs.fake.service.AgvService;
+import com.zy.acs.fake.service.CodeService;
+import com.zy.acs.fake.service.JamService;
+import com.zy.acs.framework.common.Cools;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Slf4j
+@Service("jamService")
+public class JamServiceImpl extends ServiceImpl<JamMapper, Jam> implements JamService {
+
+    @Autowired
+    private CodeService codeService;
+    @Autowired
+    private AgvService agvService;
+
+    @Override
+    public Jam getJam(Long agvId, Long jamCode, Long jamSeg) {
+        List<Jam> jams = this.list(new LambdaQueryWrapper<Jam>()
+                .eq(Jam::getJamAgv, agvId)
+                .eq(Jam::getJamCode, jamCode)
+                .eq(Jam::getJamSeg, jamSeg)
+                .eq(Jam::getState, JamStateType.RUNNING.toString())
+        );
+        if (!Cools.isEmpty(jams)) {
+            return jams.stream().findFirst().orElse(null);
+        }
+        return null;
+    }
+
+    /**
+     * 鍥犱负浣犺�岄樆濉炵殑杞�,鐜板湪浣犲凡缁忓湪閬胯鐐逛簡
+     * 浣犵殑涓嬩竴涓猻egment鏄笉鏄張浼氬鑷撮樆濉�
+     */
+    @Override
+    public List<Jam> getUnfinishedOriginJamByAvo(Long avoAgv, Long currCode, Long currSeg) {
+        return this.baseMapper.selectUnfinishedJamByAvo(avoAgv, currCode, null);
+    }
+
+    @Override
+    public Jam getCycleJam(Long jamAgv, Long jamSeg, String avoAgvNo) {
+        List<Jam> jams = this.list(new LambdaQueryWrapper<Jam>()
+                .eq(Jam::getJamAgv, jamAgv)
+                .eq(Jam::getJamSeg, jamSeg)
+                .eq(Jam::getAvoAgv, agvService.selectByUuid(avoAgvNo).getId())
+                .eq(Jam::getCycleAvo, 1)
+                .ne(Jam::getState, JamStateType.DEPRECATED.toString())
+//                .eq(Jam::getState, JamStateType.RUNNING.toString())
+        );
+        if (!Cools.isEmpty(jams)) {
+            return jams.stream().findFirst().orElse(null);
+        }
+        return null;
+    }
+
+    @Override
+    public List<Jam> queryByAvoid(Long avoAgv, JamStateType jamState) {
+        if (null == avoAgv) {
+            return null;
+        }
+        LambdaQueryWrapper<Jam> wrapper = new LambdaQueryWrapper<Jam>().eq(Jam::getAvoAgv, avoAgv);
+        if (null != jamState) {
+            wrapper.eq(Jam::getState, jamState.toString());
+        }
+        return this.list(wrapper);
+    }
+
+    @Override
+    public Boolean checkIfFinish(Long avoAgv, String currCodeData) {
+        if (Cools.isEmpty(avoAgv, currCodeData)) {
+            return null;
+        }
+        Date now = new Date();
+        Code code = codeService.selectByData(currCodeData);
+        List<Jam> jams = this.list(new LambdaQueryWrapper<Jam>()
+                .eq(Jam::getAvoAgv, avoAgv)
+                .eq(Jam::getAvoCode, code.getId())
+                .eq(Jam::getState, JamStateType.RUNNING.toString())
+        );
+        for (Jam jam : jams) {
+            jam.setEndTime(now);
+            jam.setUpdateTime(now);
+            jam.setState(JamStateType.FINISH.toString());
+            if (!this.updateById(jam)) {
+                log.error("{}缂栧彿闃诲璁板綍瀹屾垚淇敼澶辫触锛侊紒锛�", jam.getUuid());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean deprecate(Long id, Long loginUserId) {
+        Jam jam = this.getById(id);
+        if (null == jam) {
+            return false;
+        }
+        Date now = new Date();
+        jam.setState(JamStateType.DEPRECATED.toString());
+        jam.setUpdateTime(now);
+        jam.setEndTime(now);
+        jam.setUpdateBy(loginUserId);
+        return this.updateById(jam);
+    }
+
+}
diff --git a/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/RouteServiceImpl.java b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/RouteServiceImpl.java
new file mode 100644
index 0000000..5fda494
--- /dev/null
+++ b/zy-acs-fake/src/main/java/com/zy/acs/fake/service/impl/RouteServiceImpl.java
@@ -0,0 +1,99 @@
+package com.zy.acs.fake.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.common.utils.GsonUtils;
+import com.zy.acs.fake.entity.Code;
+import com.zy.acs.fake.entity.Route;
+import com.zy.acs.fake.mapper.RouteMapper;
+import com.zy.acs.fake.service.CodeService;
+import com.zy.acs.fake.service.RouteService;
+import com.zy.acs.framework.exception.CoolException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service("routeService")
+public class RouteServiceImpl extends ServiceImpl<RouteMapper, Route> implements RouteService {
+
+    @Autowired
+    private CodeService codeService;
+
+    @Override
+    public Route createRouteByCode(Code startCode, Code endCode) {
+        return createRouteByCode(startCode, endCode, 0, null);
+    }
+
+    @Override
+    public Route createRouteByCode(Code startCode, Code endCode, Integer direction, Long userId) {
+        if (startCode.getData().equals(endCode.getData())) {
+            return null;
+        }
+        Route route = this.findByCodeOfBoth(startCode.getId(), endCode.getId());
+        direction = Optional.ofNullable(direction).orElse(0);
+        if (null == route) {
+            Date now = new Date();
+            route = new Route();
+            route.setUuid(startCode.getData() + "-" + endCode.getData());
+            route.setStartCode(startCode.getId());
+            route.setEndCode(endCode.getId());
+            route.setDirection(direction);
+            route.setCodeArr(GsonUtils.toJson(Arrays.asList(startCode.getId(), endCode.getId())));
+            route.setCreateBy(userId);
+            route.setCreateTime(now);
+            route.setUpdateBy(userId);
+            route.setUpdateTime(now);
+            if (!this.save(route)) {
+                throw new CoolException(route.getCodeArr()+" save fail![Route]");
+            }
+        }
+        return route;
+    }
+
+    @Override
+    public List<String> findCodeDataOfSingle(Long code) {
+        List<String> neighborCodeList = new ArrayList<>();
+
+        for (Route route : this.list(new LambdaQueryWrapper<Route>().eq(Route::getStartCode, code))) {
+            neighborCodeList.add(codeService.getById(route.getEndCode()).getData());
+        }
+        for (Route route : this.list(new LambdaQueryWrapper<Route>().eq(Route::getEndCode, code))) {
+            neighborCodeList.add(codeService.getById(route.getStartCode()).getData());
+        }
+
+        return neighborCodeList;
+    }
+
+    @Override
+    public Route findByCodeOfBoth(Long startCode, Long endCode) {
+        Route route = getOne(new LambdaQueryWrapper<Route>().eq(Route::getStartCode, startCode).eq(Route::getEndCode, endCode).eq(Route::getStatus, 1));
+        if (null == route) {
+            route = getOne(new LambdaQueryWrapper<Route>().eq(Route::getEndCode, startCode).eq(Route::getStartCode, endCode).eq(Route::getStatus, 1));
+        }
+        return route;
+    }
+
+    @Override
+    public List<Long> getAdjacencyNode(Long codeId) {
+
+        List<Long> result = new ArrayList<>();
+
+        result.addAll(this.list(new LambdaQueryWrapper<Route>()
+                .eq(Route::getStartCode, codeId)
+                .in(Route::getDirection, 0, 1)
+                .eq(Route::getStatus, 1)
+        ).stream().map(Route::getEndCode).distinct().collect(Collectors.toList()));
+
+        result.addAll(this.list(new LambdaQueryWrapper<Route>()
+                .eq(Route::getEndCode, codeId)
+                .in(Route::getDirection, 0, 2)
+                .eq(Route::getStatus, 1)
+        ).stream().map(Route::getStartCode).distinct().collect(Collectors.toList()));
+
+
+        return result.stream().distinct().collect(Collectors.toList());
+    }
+
+}
diff --git a/zy-acs-fake/src/main/resources/application.yml b/zy-acs-fake/src/main/resources/application.yml
index fb13215..19b0ffe 100644
--- a/zy-acs-fake/src/main/resources/application.yml
+++ b/zy-acs-fake/src/main/resources/application.yml
@@ -72,7 +72,4 @@
 
 logging:
   file:
-    path: /stock/out/@pom.artifactId@/logs
-
-floyd:
-  enable: false
\ No newline at end of file
+    path: /stock/out/@pom.artifactId@/logs
\ No newline at end of file
diff --git a/zy-acs-fake/src/main/resources/mapper/ActionMapper.xml b/zy-acs-fake/src/main/resources/mapper/ActionMapper.xml
new file mode 100644
index 0000000..337cb63
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/ActionMapper.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.fake.mapper.ActionMapper">
+
+    <!-- 鍏宠仈鏌ヨsql -->
+    <sql id="selectSql">
+        SELECT a.*
+        FROM man_action a
+        <where>
+            AND a.deleted = 0
+            <if test="param.id != null">
+                AND a.id = #{param.id}
+            </if>
+            <if test="param.seqNum != null">
+                AND a.seq_num = #{param.seqNum}
+            </if>
+            <if test="param.taskId != null">
+                AND a.task_id = #{param.taskId}
+            </if>
+            <if test="param.actionType != null">
+                AND a.action_type = #{param.actionType}
+            </if>
+            <if test="param.actionSts != null">
+                AND a.action_sts = #{param.actionSts}
+            </if>
+            <if test="param.status != null">
+                AND a.status = #{param.status}
+            </if>
+            <if test="param.keywords != null">
+                AND (
+                a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                OR a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                )
+            </if>
+        </where>
+        order by a.create_time desc
+    </sql>
+
+    <update id="updateStsByGroupId">
+        update man_action set action_sts = #{actionSts} where group_id = #{groupId}
+    </update>
+
+    <select id="selectRecentForInout" resultType="java.util.Map">
+        SELECT
+        magv.uuid AS agvNo,
+        mat.name
+        FROM man_action ma
+        LEFT JOIN man_action_type mat ON ma.action_type = mat.id
+        LEFT JOIN man_agv magv ON ma.agv_id = magv.id
+        WHERE 1=1
+        AND mat.uuid IN ('ReadyTakeFromShelvesLoc', 'ReadyTakeFromAgvSite', 'ReadyReleaseToShelvesLoc', 'ReadyReleaseToAgvSite')
+        ORDER BY ma.id DESC
+        LIMIT 0, 10
+    </select>
+
+    <select id="selectCountGroupByType" resultType="java.util.Map">
+        SELECT
+        mat.uuid,
+        mat.name,
+        COUNT(ma.action_type) AS count
+        FROM man_action_type mat
+        LEFT JOIN man_action ma ON ma.`action_type` = mat.`id`
+        WHERE 1=1
+        GROUP BY mat.uuid, mat.name
+        ORDER BY count DESC
+    </select>
+
+    <select id="selectPrepareGroup" resultType="java.lang.String">
+        SELECT
+        group_id
+        FROM man_action
+        WHERE 1=1
+        AND action_sts = (SELECT id FROM man_action_sts WHERE UUID = 'PREPARE')
+        AND group_id IS NOT NULL
+        GROUP BY group_id
+    </select>
+
+    <select id="selectTaskIdsByGroupId" resultType="java.lang.Long">
+        SELECT
+        DISTINCT task_id
+        FROM man_action
+        WHERE 1=1
+        AND group_id = #{groupId}
+        AND task_id IS NOT NULL
+    </select>
+
+    <select id="selectSortCodeByAgv" resultType="java.lang.String">
+        SELECT
+        ma.code
+        FROM man_action ma
+        WHERE 1=1
+        AND ma.action_sts IN (
+            SELECT id FROM man_action_sts WHERE UUID IN ('PREPARE', 'ISSUED')
+        )
+        AND ma.agv_id = #{agvId}
+        ORDER BY ma.priority DESC
+    </select>
+
+    <select id="selectLatestOfGroup" resultType="com.zy.acs.fake.entity.Action">
+        SELECT *
+        FROM man_action
+        WHERE 1=1
+        AND agv_id = #{agvId}
+        AND action_sts = #{actionSts}
+        AND group_id IN (
+            SELECT group_id
+            FROM man_action
+            WHERE agv_id = #{agvId}
+            AND action_sts = #{actionSts}
+            GROUP BY group_id
+            HAVING MAX(io_time) = (
+                SELECT MAX(io_time)
+                FROM man_action
+                WHERE agv_id = #{agvId}
+                AND action_sts = #{actionSts}
+            )
+        )
+        ORDER BY priority DESC
+    </select>
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/ActionStsMapper.xml b/zy-acs-fake/src/main/resources/mapper/ActionStsMapper.xml
new file mode 100644
index 0000000..6ca6bac
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/ActionStsMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.manager.fake.ActionStsMapper">
+
+    <!-- 鍏宠仈鏌ヨsql -->
+    <sql id="selectSql">
+        SELECT a.*
+        FROM man_action_sts a
+        <where>
+            AND a.deleted = 0
+            <if test="param.id != null">
+                AND a.id = #{param.id}
+            </if>
+            <if test="param.uuid != null">
+                AND a.uuid = #{param.uuid}
+            </if>
+            <if test="param.status != null">
+                AND a.status = #{param.status}
+            </if>
+            <if test="param.keywords != null">
+                AND (
+                a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                OR a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                )
+            </if>
+        </where>
+    </sql>
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/ActionTypeMapper.xml b/zy-acs-fake/src/main/resources/mapper/ActionTypeMapper.xml
new file mode 100644
index 0000000..89e6e7a
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/ActionTypeMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.manager.fake.ActionTypeMapper">
+
+    <!-- 鍏宠仈鏌ヨsql -->
+    <sql id="selectSql">
+        SELECT a.*
+        FROM man_action_type a
+        <where>
+            AND a.deleted = 0
+            <if test="param.id != null">
+                AND a.id = #{param.id}
+            </if>
+            <if test="param.uuid != null">
+                AND a.uuid = #{param.uuid}
+            </if>
+            <if test="param.status != null">
+                AND a.status = #{param.status}
+            </if>
+            <if test="param.keywords != null">
+                AND (
+                a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                OR a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                )
+            </if>
+        </where>
+    </sql>
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/AgvDetailMapper.xml b/zy-acs-fake/src/main/resources/mapper/AgvDetailMapper.xml
new file mode 100644
index 0000000..a5dd373
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/AgvDetailMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.manager.fake.AgvDetailMapper">
+
+    <!-- 鍏宠仈鏌ヨsql -->
+    <sql id="selectSql">
+        SELECT a.*
+        FROM man_agv_detail a
+        <where>
+            AND a.deleted = 0
+            <if test="param.id != null">
+                AND a.id = #{param.id}
+            </if>
+            <if test="param.agvId != null">
+                AND a.agv_id = #{param.agvId}
+            </if>
+            <if test="param.status != null">
+                AND a.status = #{param.status}
+            </if>
+            <if test="param.keywords != null">
+                AND (
+                a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                OR a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                )
+            </if>
+        </where>
+    </sql>
+
+    <update id="updatePosCode">
+        update man_agv_detail
+        set code = #{codeId},
+        last_code = null,
+        pos = 1
+        where 1=1
+        and id = #{id}
+    </update>
+
+    <update id="updateUnPosCode">
+        update man_agv_detail
+        set last_code = #{lastCode},
+        code = null,
+        pos = 0
+        where 1=1
+        and id = #{id}
+    </update>
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/AgvMapper.xml b/zy-acs-fake/src/main/resources/mapper/AgvMapper.xml
new file mode 100644
index 0000000..74419aa
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/AgvMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.manager.fake.AgvMapper">
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/CodeMapper.xml b/zy-acs-fake/src/main/resources/mapper/CodeMapper.xml
new file mode 100644
index 0000000..4489d70
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/CodeMapper.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.manager.fake.CodeMapper">
+
+    <!-- 鍏宠仈鏌ヨsql -->
+    <sql id="selectSql">
+        SELECT a.*
+        FROM man_code a
+        <where>
+            AND a.deleted = 0
+            <if test="param.id != null">
+                AND a.id = #{param.id}
+            </if>
+            <if test="param.data != null">
+                AND a.data = #{param.data}
+            </if>
+            <if test="param.status != null">
+                AND a.status = #{param.status}
+            </if>
+            <if test="param.keywords != null">
+                AND (
+                a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                OR a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                )
+            </if>
+        </where>
+    </sql>
+
+    <select id="selectMinAndMaxByPoint" resultType="java.util.Map">
+        SELECT
+        ROUND(MIN(X),1) AS min_x,
+        ROUND(MAX(X),1) AS max_x,
+        ROUND(MIN(Y),1) AS min_y,
+        ROUND(MAX(Y),1) AS max_y
+        FROM man_code where deleted = 0
+    </select>
+
+    <select id="selectDistinctCountFromX" resultType="java.lang.Integer">
+        SELECT
+        COUNT(DISTINCT X)
+        FROM man_code
+        WHERE 1=1
+        AND status = 1
+        AND deleted = 0
+    </select>
+
+    <select id="selectDistinctCountFromY" resultType="java.lang.Integer">
+        SELECT
+        COUNT(DISTINCT Y)
+        FROM man_code
+        WHERE 1=1
+        AND status = 1
+        AND deleted = 0
+    </select>
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/ConfigMapper.xml b/zy-acs-fake/src/main/resources/mapper/ConfigMapper.xml
new file mode 100644
index 0000000..481cef2
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/ConfigMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.fake.mapper.ConfigMapper">
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/JamMapper.xml b/zy-acs-fake/src/main/resources/mapper/JamMapper.xml
new file mode 100644
index 0000000..827926f
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/JamMapper.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.fake.mapper.JamMapper">
+
+    <!-- 鍏宠仈鏌ヨsql -->
+    <sql id="selectSql">
+        SELECT a.*
+        FROM man_jam a
+        <where>
+            AND a.deleted = 0
+            <if test="param.id != null">
+                AND a.id = #{param.id}
+            </if>
+            <if test="param.status != null">
+                AND a.status = #{param.status}
+            </if>
+            <if test="param.keywords != null">
+                AND (
+                a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                OR a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                )
+            </if>
+        </where>
+    </sql>
+
+    <select id="selectUnfinishedJamByAvo" resultType="com.zy.acs.fake.entity.Jam">
+        SELECT
+        mj.*
+        FROM man_jam mj
+        LEFT JOIN man_segment jam_seg ON mj.jam_seg = jam_seg.id
+        LEFT JOIN man_segment avo_seg ON mj.avo_seg = avo_seg.id
+        WHERE 1=1
+        AND mj.state != 'DEPRECATED'
+        AND jam_seg.state in ('INIT', 'WAITING')
+        AND avo_seg.state not in ('INIT', 'WAITING')
+        AND mj.avo_agv = #{avoAgv}
+        <if test="currSeg != null">
+            AND mj.avo_seg = #{currSeg}
+        </if>
+        <if test="currCode != null">
+            AND mj.avo_code = #{currCode}
+        </if>
+    </select>
+
+    <select id="selectJamFromSegmentByAvo" resultType="com.zy.acs.fake.entity.Jam">
+        SELECT
+        mj.*
+        FROM man_jam mj
+        LEFT JOIN man_segment jam_seg ON mj.jam_seg = jam_seg.id
+        LEFT JOIN man_segment avo_seg ON mj.avo_seg = avo_seg.id
+        WHERE 1=1
+        AND mj.state != 'DEPRECATED'
+        AND avo_seg.state NOT IN ('INIT', 'WAITING')
+        AND mj.jam_seg = #{jamSeg}
+        AND mj.avo_agv = #{avoAgv}
+    </select>
+
+    <select id="selectUnfinishedAvoSegByAvo" resultType="com.zy.acs.fake.entity.Jam">
+        SELECT
+        mj.*
+        FROM man_jam mj
+        LEFT JOIN man_segment jam_seg ON mj.jam_seg = jam_seg.id
+        LEFT JOIN man_segment avo_seg ON mj.avo_seg = avo_seg.id
+        WHERE 1=1
+        AND mj.state != 'DEPRECATED'
+        AND avo_seg.state IN ('INIT', 'WAITING')
+        AND mj.avo_agv = #{avoAgv}
+        <if test="currSeg != null">
+            AND mj.avo_seg = #{currSeg}
+        </if>
+    </select>
+
+</mapper>
diff --git a/zy-acs-fake/src/main/resources/mapper/RouteMapper.xml b/zy-acs-fake/src/main/resources/mapper/RouteMapper.xml
new file mode 100644
index 0000000..e98ec09
--- /dev/null
+++ b/zy-acs-fake/src/main/resources/mapper/RouteMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.acs.fake.mapper.RouteMapper">
+
+    <!-- 鍏宠仈鏌ヨsql -->
+    <sql id="selectSql">
+        SELECT a.*
+        FROM man_route a
+        <where>
+            AND a.deleted = 0
+            <if test="param.id != null">
+                AND a.id = #{param.id}
+            </if>
+            <if test="param.status != null">
+                AND a.status = #{param.status}
+            </if>
+            <if test="param.keywords != null">
+                AND (
+                a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                OR a.memo LIKE CONCAT('%', #{param.keywords}, '%')
+                )
+            </if>
+        </where>
+    </sql>
+
+</mapper>
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Agv.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Agv.java
index b2cc14c..89bf0ff 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Agv.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Agv.java
@@ -103,18 +103,6 @@
         return null;
     }
 
-    public String getStatus$(){
-        if (null == this.status){ return null; }
-        switch (this.status){
-            case 1:
-                return "姝e父";
-            case 0:
-                return "鍐荤粨";
-            default:
-                return String.valueOf(this.status);
-        }
-    }
-
     public Boolean getStatusBool(){
         if (null == this.status){ return null; }
         switch (this.status){

--
Gitblit v1.9.1