From 83b2c23efd1c1ba3d995193b3240f3d868f4d592 Mon Sep 17 00:00:00 2001
From: zyx <zyx123456>
Date: 星期二, 22 八月 2023 16:28:34 +0800
Subject: [PATCH] AGV出入库作业 库存汇总页面 库存规则 分析页加上AGV数据 AGV库存明细统计 AGV库位地图

---
 src/main/webapp/static/js/agvPakStore/stockOut.js                 |  177 +
 src/main/webapp/views/allLocDetl/locDetl_detail.html              |  168 +
 src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java |   48 
 src/main/java/com/zy/asrs/controller/AgvLocDetlController.java    |   82 
 src/main/webapp/views/home/console.html                           |    8 
 src/main/webapp/views/agvPakStore/emptyIn.html                    |   76 
 src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java |   34 
 src/main/java/com/zy/asrs/controller/AgvBasDevpController.java    |   16 
 src/main/java/com/zy/asrs/controller/AgvIoWorkController.java     |  173 +
 src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java     |   50 
 src/main/java/com/zy/asrs/utils/Utils.java                        |   10 
 src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java    |  159 +
 src/main/java/com/zy/asrs/service/AllLocDetlService.java          |    8 
 src/main/webapp/static/js/common.js                               |    1 
 src/main/java/com/zy/asrs/controller/AgvMapController.java        |  258 ++
 src/main/java/com/zy/asrs/service/impl/AgvBasMapServiceImpl.java  |   23 
 src/main/webapp/static/js/agvPakStore/locCheckOut.js              |  161 +
 src/main/webapp/views/agvPakStore/pakStore.html                   |  133 +
 src/main/webapp/static/js/agvPakStore/emptyIn.js                  |   62 
 src/main/java/com/zy/asrs/service/AgvBasMapService.java           |   13 
 src/main/webapp/views/home/agvMap.html                            | 1069 +++++++++
 src/main/resources/mapper/ViewStayTimeMapper.xml                  |   67 
 src/main/java/com/zy/asrs/controller/AgvOpenController.java       |   18 
 src/main/java/com/zy/asrs/service/impl/AllLocDetlServiceImpl.java |   11 
 src/main/webapp/views/agvPakStore/emptyOut.html                   |  150 +
 src/main/webapp/views/agvBasDevp/basDevpWaitPakinDetail.html      |    6 
 src/main/java/com/zy/common/service/AgvCommonService.java         |    8 
 src/main/webapp/views/agvPakStore/locMove.html                    |  130 +
 src/main/webapp/static/js/agvLocDetlStatis/locDetlStatis.js       |  256 ++
 src/main/webapp/views/agvBasDevpVisualized/basDevp.html           |   13 
 src/main/webapp/views/agvPakStore/locDetlQuery.html               |  189 +
 src/main/java/com/zy/asrs/mapper/AgvBasMapMapper.java             |   20 
 src/main/java/com/zy/asrs/service/AgvBasDevpService.java          |    3 
 src/main/java/com/zy/asrs/mapper/AllLocDetlMapper.java            |   12 
 src/main/webapp/static/js/agvPakStore/stockAdjust.js              |  241 ++
 src/main/java/com/zy/common/model/AgvBasDevpDto.java              |    4 
 src/main/java/com/zy/asrs/controller/AllLocDetlController.java    |   84 
 src/main/java/com/zy/asrs/entity/AgvBasMap.java                   |  100 
 src/main/webapp/views/agvPakStore/stockAdjust.html                |  133 +
 src/main/webapp/views/agvPakStore/locCheckOut.html                |  132 +
 src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java           |    6 
 src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java           |   35 
 src/main/java/com/zy/asrs/service/AgvLocDetlService.java          |   11 
 src/main/webapp/static/js/allLocDetl/locDetl.js                   |  601 +++++
 src/main/webapp/static/js/agvPakStore/emptyOut.js                 |  204 +
 src/main/webapp/views/allLocDetl/locDetl.html                     |   81 
 src/main/java/com/zy/asrs/entity/param/StockOutParam.java         |    3 
 src/main/webapp/static/js/agvPakStore/pakStore.js                 |  202 +
 src/main/java/com/zy/asrs/service/AgvWorkService.java             |   18 
 src/main/java/com/zy/asrs/entity/AllLocDetl.java                  |  266 ++
 src/main/java/com/zy/asrs/mapper/AgvLocMastMapper.java            |   13 
 src/main/java/com/zy/asrs/entity/param/EmptyPlateOutParam.java    |    5 
 src/main/java/com/zy/asrs/mapper/AgvBasDevpMapper.java            |    8 
 src/main/java/com/zy/asrs/service/AgvLocMastService.java          |    5 
 src/main/webapp/views/agvPakStore/matQuery.html                   |  173 +
 src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java            |   41 
 src/main/webapp/views/agvPakStore/stockOut.html                   |  131 +
 src/main/webapp/static/js/agvPakStore/locMove.js                  |  135 +
 src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java |   16 
 src/main/webapp/views/agvPakStore/locDetlCheckQuery.html          |  230 ++
 src/main/webapp/views/agvLocDetlStatis/locDetlStatis.html         |   59 
 src/main/java/com/zy/asrs/controller/ReportQueryController.java   |    6 
 62 files changed, 6,456 insertions(+), 99 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/AgvBasDevpController.java b/src/main/java/com/zy/asrs/controller/AgvBasDevpController.java
index 241d8cd..36413b6 100644
--- a/src/main/java/com/zy/asrs/controller/AgvBasDevpController.java
+++ b/src/main/java/com/zy/asrs/controller/AgvBasDevpController.java
@@ -158,6 +158,9 @@
         return R.ok();
     }
 
+    /*
+    绔欑偣鏄庣粏
+     */
     @RequestMapping(value = "/basDevp/detail/list/auth")
     public R basDevpDetailList(@RequestParam(defaultValue = "1")Integer curr,
                                @RequestParam(defaultValue = "10")Integer limit,
@@ -185,14 +188,13 @@
             }
         }
 
-        return R.error("鏁版嵁寮傚父");
+        return R.ok();
     }
 
     @RequestMapping(value = "/basDevp/visualized/list/auth")
     public R visualizedList(@RequestBody JSONObject param){
 
         String stationCode = param.get("stationCode").toString();
-
 
         Map<String, Object> result = agvBasDevpService.getAgvBasDevpDtoByStationCode(stationCode);
 
@@ -208,8 +210,8 @@
         List<String> devNos = (List<String>) map.get("devNo");
         List<AgvWrkMast> agvWrkMastList = devNos.stream().map(devNo -> {
             AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo));
-            if(agvWrkMast.getIoType() == 103){
-                throw new CoolException("宸ヤ綔鍙蜂负" + agvWrkMast.getWrkNo() + "绫诲瀷涓�103.鎷f枡鍏ュ簱锛屾棤娉曟墽琛屽鍣ㄧ鍦轰换鍔★紝璇烽噸鏂伴�夋嫨绔欑偣銆�");
+            if(agvWrkMast.getIoType() != 101 && agvWrkMast.getIoType() != 110){
+                throw new CoolException("宸ヤ綔鍙蜂负" + agvWrkMast.getWrkNo() + "绫诲瀷涓嶄负101.鍑哄簱锛屾棤娉曟墽琛屽鍣ㄧ鍦轰换鍔★紝璇烽噸鏂伴�夋嫨绔欑偣銆�");
             }
             return agvWrkMast;
         }).collect(Collectors.toList());
@@ -219,7 +221,7 @@
            if(code == 0){
                //灏嗗伐浣滃厷鐘舵�佹敼涓哄鍣ㄧ鍦�
                agvWrkMastList.forEach(agvWrkMast -> {
-                   agvWrkMast.setWrkSts(207L);
+                   agvWrkMast.setWrkSts(206L);
                    agvWrkMastService.updateById(agvWrkMast);
                });
                //淇敼绔欑偣鐘舵��
@@ -239,7 +241,7 @@
     }
 
     /*
-    鎷f枡鍏ュ簱
+    鎷f枡/鐩樼偣鍏ュ簱
      */
     @RequestMapping(value = "/basDevp/visualized/container/pickIn")
     public R visualiZedPickIn(@RequestBody Map<String,Object> map){
@@ -247,7 +249,7 @@
         List<AgvWrkMast> agvWrkMastList = devNos.stream().map(devNo -> {
             AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo));
             if(agvWrkMast.getIoType() == 101){
-                throw new CoolException("宸ヤ綔鍙蜂负" + agvWrkMast.getWrkNo() + "绫诲瀷涓�101.鍏ュ簱锛屾棤娉曟墽琛屾嫞鏂欏叆搴撲换鍔★紝璇烽噸鏂伴�夋嫨绔欑偣銆�");
+                throw new CoolException("宸ヤ綔鍙蜂负" + agvWrkMast.getWrkNo() + "绫诲瀷涓�101.鍑哄簱锛屾棤娉曟墽琛屾嫞鏂欏叆搴撲换鍔★紝璇烽噸鏂伴�夋嫨绔欑偣銆�");
             }
             return agvWrkMast;
         }).collect(Collectors.toList());
diff --git a/src/main/java/com/zy/asrs/controller/AgvIoWorkController.java b/src/main/java/com/zy/asrs/controller/AgvIoWorkController.java
new file mode 100644
index 0000000..e7f1044
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/AgvIoWorkController.java
@@ -0,0 +1,173 @@
+package com.zy.asrs.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.asrs.entity.AgvLocDetl;
+import com.zy.asrs.entity.AgvLocMast;
+import com.zy.asrs.entity.param.EmptyPlateOutParam;
+import com.zy.asrs.entity.param.StockOutParam;
+import com.zy.asrs.service.AgvBasDevpService;
+import com.zy.asrs.service.AgvLocDetlService;
+import com.zy.asrs.service.AgvLocMastService;
+import com.zy.asrs.service.AgvWorkService;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/agv")
+public class AgvIoWorkController extends BaseController {
+
+    @Autowired
+    AgvLocDetlService agvLocDetlService;
+    @Autowired
+    AgvLocMastService agvLocMastService;
+    @Autowired
+    AgvWorkService agvWorkService;
+    @Autowired
+    AgvBasDevpService agvBasDevpService;
+
+    @RequestMapping(value = "/stock/out/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param,
+                  @RequestParam(required = false)Boolean unreason){
+        if (!Cools.isEmpty(unreason) && unreason) {
+
+            return R.ok(agvLocDetlService.selectPage(new Page<>(curr, limit), new EntityWrapper<AgvLocDetl>()
+                    .where(" DATALENGTH( batch ) != 11 or\n" +
+                            "            batch LIKE '%[a-z]%'")));
+        }
+        param.remove("unreason");
+        String row = "";
+        EntityWrapper<AgvLocDetl> wrapper = new EntityWrapper<>();
+        if (param.get("row") != null) {
+            String chooseRow = (String) param.get("row");
+            if (chooseRow.length() == 1) {
+                row = "0" + chooseRow;
+                param.remove("row");
+            }else {
+                row = chooseRow;
+                param.remove("row");
+            }
+        }
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(AgvLocDetl.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        if (!row.equals("")){
+            wrapper.and()
+                    .where("loc_no like '" +row +"%'");
+        }
+        Page<AgvLocDetl> agvLocDetlPage = agvLocDetlService.selectPage(new Page<>(curr, limit), wrapper);
+        List<AgvLocDetl> collect = agvLocDetlPage.getRecords().stream().filter(agvLocDetl -> {
+            AgvLocMast agvLocMast = agvLocMastService.selectById(agvLocDetl.getLocNo());
+            return agvLocMast.getLocSts().equals("F");
+        }).collect(Collectors.toList());
+        agvLocDetlPage.setRecords(collect);
+        return R.ok(agvLocDetlPage);
+    }
+
+    @RequestMapping(value = "/locDetl/auth")
+    @ManagerAuth
+    public R stockOutList(@RequestParam(value = "locNos[]") List<String> locNos){
+        if (!locNos.isEmpty()) {
+            List<AgvLocDetl> res = new ArrayList<>();
+            for (String locNo : new HashSet<>(locNos)) {
+                List<AgvLocDetl> locDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo));
+                if (!locDetls.isEmpty()) {
+                    res.addAll(locDetls);
+                }
+            }
+            return R.ok().add(res);
+        }
+        return R.parse(BaseRes.EMPTY);
+    }
+
+    @RequestMapping("/locCheck/out/start")
+    @ManagerAuth(memo = "AGV鐩樼偣鍑哄簱")
+    public R locCheckOutStart(@RequestBody StockOutParam param) {
+        agvWorkService.locCheckOut(param, getUserId());
+        return R.ok("鍑哄簱鍚姩鎴愬姛");
+    }
+
+    @PostMapping(value = "/group/empty/stock")
+    @ManagerAuth(memo = "鑾峰彇鍚屼竴妤煎眰鐨勭┖搴撲綅")
+    public R getGroupEmptyStock(@RequestParam(required = false) String sourceLocNo) {
+
+        if(Cools.isEmpty(sourceLocNo)){
+            return null;
+        }
+        AgvLocMast agvLocMast = agvLocMastService.selectById(sourceLocNo);
+        if(Cools.isEmpty(agvLocMast)){
+            return null;
+        }
+
+        int floor =  Integer.parseInt(sourceLocNo.split("@")[1]);
+
+        List<String> locNoList = agvLocMastService.queryGroupEmptyStock(floor);
+
+        return R.ok().add(locNoList);
+    }
+
+    @RequestMapping("/loc/move/start")
+    @ManagerAuth(memo = "搴撲綅绉昏浆")
+    public R locMoveStart(@RequestParam String sourceLocNo,
+                          @RequestParam String targetLocNo) {
+
+        agvWorkService.locMove(sourceLocNo, targetLocNo, getUserId());
+        return R.ok("绉诲簱鍚姩鎴愬姛");
+    }
+
+    @RequestMapping("/available/empty/put/site")
+    @ManagerAuth(memo = "鍙敤绔欑偣閫夋嫨")
+    public R availableEmptyPutSite(){
+        return R.ok().add(agvBasDevpService.getAvailableEmptyInSite());
+    }
+
+    @RequestMapping("/empty/plate/in/start")
+    @ManagerAuth(memo = "绌烘澘鍏ュ簱")
+    public R emptyPlateInStart(@RequestParam String sourceStaNo) {
+        return R.ok("鍏ュ簱鍚姩鎴愬姛").add(agvWorkService.emptyPlateIn(sourceStaNo, getUserId()));
+    }
+
+    @RequestMapping("/empty/plate/out/start")
+    @ManagerAuth(memo = "绌烘澘鍑哄簱")
+    public R emptyPlateOutStart(EmptyPlateOutParam param) {
+        agvWorkService.emptyPlateOut(param, getUserId());
+        return R.ok("鍑哄簱鍚姩鎴愬姛");
+    }
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                if (entry.getKey().equals("locNo")) {
+                    wrapper.eq("loc_no", String.valueOf(entry.getValue()));
+                } else {
+                    wrapper.like(entry.getKey(), String.valueOf(entry.getValue()));
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/AgvLocDetlController.java b/src/main/java/com/zy/asrs/controller/AgvLocDetlController.java
index ac62291..c909439 100644
--- a/src/main/java/com/zy/asrs/controller/AgvLocDetlController.java
+++ b/src/main/java/com/zy/asrs/controller/AgvLocDetlController.java
@@ -1,5 +1,8 @@
 package com.zy.asrs.controller;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
 import com.core.annotations.ManagerAuth;
@@ -7,13 +10,21 @@
 import com.core.common.DateUtils;
 import com.core.common.R;
 import com.zy.asrs.entity.AgvLocDetl;
+import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.Mat;
 import com.zy.asrs.service.AgvLocDetlService;
+import com.zy.asrs.service.MatService;
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.List;
 import java.util.Map;
 
 @RestController
@@ -22,6 +33,8 @@
 
     @Autowired
     private AgvLocDetlService agvLocDetlService;
+    @Autowired
+    private MatService matService;
 
     @RequestMapping(value = "/locDetl/list/auth")
     @ManagerAuth
@@ -63,6 +76,75 @@
         return R.ok(agvLocDetlService.selectPage(new Page<>(curr, limit), wrapper));
     }
 
+    @RequestMapping(value = "/locDetl/statis/auth")
+    @ManagerAuth(memo = "AGV搴撳瓨鏄庣粏缁熻")
+    public R statis(@RequestParam(defaultValue = "1")Integer curr,
+                    @RequestParam(defaultValue = "10")Integer limit,
+                    @RequestParam Map<String, Object> param) {
+        Page<AgvLocDetl> stockStatis = agvLocDetlService.getStockStatis(toPage(curr, limit, param, AgvLocDetl.class));
+        for (AgvLocDetl locDetl : stockStatis.getRecords()) {
+            Mat mat = matService.selectByMatnr(locDetl.getMatnr());
+            if (mat != null) {
+                locDetl.sync(mat);
+            }
+        }
+        return R.ok().add(stockStatis);
+    }
+
+    /*
+    鑾峰彇搴撳瓨鎬绘暟
+     */
+    @RequestMapping("/locDetl/count")
+    public R getAllCount(){
+        Integer sum = agvLocDetlService.sum();
+        return R.ok(sum);
+    }
+
+    @RequestMapping(value = "/locDetl/statis/export")
+    public void statisExport(HttpServletResponse response) throws IOException {
+        List<AgvLocDetl> excel = agvLocDetlService.getStockStatisExcel();
+        for (AgvLocDetl locDetl : excel) {
+            Mat mat = matService.selectByMatnr(locDetl.getMatnr());
+            if (mat != null) {
+                locDetl.sync(mat);
+            }
+        }
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = URLEncoder.encode("搴撳瓨鏄庣粏缁熻鎶ヨ〃", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        EasyExcel.write(response.getOutputStream(), LocDetl.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+                .sheet("琛�1")
+                .doWrite(excel);
+    }
+
+    @RequestMapping(value = "/locDetl/export/auth")
+    @ManagerAuth(memo = "搴撲綅鏄庣粏瀵煎嚭")
+    public synchronized R export(@RequestBody JSONObject param){
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        EntityWrapper<AgvLocDetl> wrapper = new EntityWrapper<>();
+        Map<String, Object> map = excludeTrash(param.getJSONObject("locDetl"));
+        String row = "";
+        if (map.get("row") != null) {
+            String chooseRow = (String) map.get("row");
+            if (chooseRow.length() == 1) {
+                row = "0" + chooseRow;
+                map.remove("row");
+            }else {
+                row = chooseRow;
+                map.remove("row");
+            }
+        }
+        convert(map, wrapper);
+        if (!row.equals("")){
+            wrapper.and()
+                    .where("loc_no like '" +row +"%'");
+        }
+        List<AgvLocDetl> list = agvLocDetlService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
     private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
         for (Map.Entry<String, Object> entry : map.entrySet()){
             String val = String.valueOf(entry.getValue());
diff --git a/src/main/java/com/zy/asrs/controller/AgvMapController.java b/src/main/java/com/zy/asrs/controller/AgvMapController.java
new file mode 100644
index 0000000..defe628
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/AgvMapController.java
@@ -0,0 +1,258 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.core.annotations.ManagerAuth;
+import com.core.common.R;
+import com.zy.asrs.entity.AgvLocDetl;
+import com.zy.asrs.entity.AgvLocMast;
+import com.zy.asrs.entity.BasMap;
+import com.zy.asrs.service.AgvBasMapService;
+import com.zy.asrs.service.AgvLocDetlService;
+import com.zy.asrs.service.AgvLocMastService;
+import com.zy.asrs.utils.Utils;
+import com.zy.common.utils.RedisUtil;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/agv")
+public class AgvMapController extends BaseController {
+
+    @Autowired
+    private AgvLocMastService agvLocMastService;
+    @Autowired
+    private AgvLocDetlService agvLocDetlService;
+    @Autowired
+    private AgvBasMapService agvBasMapService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    private static final List<String> DISABLE_LOC_NO = new ArrayList<String>() {{
+//        add("0200101");
+//        add("0300101");
+//        add("0400101");
+//        add("0500101");
+//        add("0600101");
+//        add("0700101");
+//        add("0800101");
+//        add("0900101");
+//        add("1000101");
+//        add("1100101");
+//        add("1200101");
+    }};
+
+    @GetMapping("/map/getData/{floor}/{lev}/auth")
+    @ManagerAuth
+    public String getMapData(@PathVariable("floor") Integer floor, @PathVariable("lev") Integer lev) {
+        BasMap basMap = agvBasMapService.selectLatestMap(lev,floor);
+        //瑙f瀽json鍦板浘鏁版嵁
+        List<ArrayList> arrayLists = JSON.parseArray(basMap.getData(), ArrayList.class);
+
+
+        //鑾峰彇褰撳墠妤煎眰搴撲綅鏁版嵁
+        List<AgvLocMast> locMasts = agvLocMastService.selectLocByLevAndFloor(lev,floor);
+        for (AgvLocMast locMast : locMasts) {
+            Integer row = locMast.getRow1();
+            Integer bay = locMast.getBay1();
+
+
+            int x = bay;
+            int y = row;
+            //1妤�
+            if(floor == 1){
+                x = generateMap1Row(row);
+                y = generateMap1Bay(bay);
+            }
+            //3妤�
+            if(floor == 3){
+                y = generateMap3Row(row);
+                x = generateMap3Bay(bay);
+            }
+
+
+            ArrayList rowData = arrayLists.get(x);
+            Object o = rowData.get(y);
+
+            JSONObject jsonObject = JSON.parseObject(o.toString());
+            if (DISABLE_LOC_NO.contains(locMast.getLocNo())) {
+                //绂佹搴撲綅
+                jsonObject.put("value", 10);//灏嗙鐢ㄥ簱浣嶈繘琛岃缃�
+            }
+            jsonObject.put("locNo", locMast.getLocNo());//璁剧疆搴撲綅鍙�
+            jsonObject.put("locSts", locMast.getLocSts());//搴撲綅鐘舵��
+            //鏇存柊list
+            rowData.set(y, jsonObject);
+            arrayLists.set(x, rowData);
+        }
+
+        return JSONObject.toJSONString(arrayLists);
+    }
+
+    private Integer generateMap1Row(int row){
+        int x = 21-row;
+        if(row > 1){
+            x --;
+        }
+        if(row > 3){
+            x --;
+        }
+        if(row > 4){
+            x --;
+        }
+        if(row > 6){
+            x --;
+        }
+        if(row > 8){
+            x --;
+        }
+        if(row > 10){
+            x --;
+        }
+        if(row > 12){
+            x --;
+        }
+        return x;
+
+    }
+
+    private Integer generateMap1Bay(int bay){
+        int y = bay;
+        if(y > 28){
+            y ++;
+        }
+        if(y > 57){
+            y ++;
+        }
+        return y;
+    }
+
+    private Integer generateMap3Row(int row){
+        int x = row;
+        Integer[] rowAdd = {2,4,6,8,9,11,12,14,16,18,19,21,23,25,27,29,31,33};
+        for(int i=0; i<rowAdd.length; i++){
+            if(row >= rowAdd[i]){
+                x ++;
+            }
+        }
+        return x;
+    }
+
+    private Integer generateMap3Bay(int bay){
+        int y = 73-bay;
+        if(bay >= 15) y --;
+        if(bay >= 47) y --;
+        return y;
+    }
+
+    @RequestMapping("/map/searchData/auth")
+    @ManagerAuth
+    public R searchLoc(@RequestParam("lev") Integer lev,
+                       @RequestParam("locNo") String locNo,
+                       @RequestParam("orderNo") String orderNo,
+                       @RequestParam("specs") String specs,
+                       @RequestParam("matnr") String matnr,
+                       @RequestParam("maktx") String maktx
+                       ) {
+
+        List<AgvLocDetl> locDetls = agvLocDetlService.searchByLike(orderNo, matnr, maktx, specs, locNo);
+        ArrayList<AgvLocDetl> lists = new ArrayList<>();
+        for (AgvLocDetl locDetl : locDetls) {//杩囨护鎺変笉鏄綋鍓嶆ゼ灞傜殑鏁版嵁
+            int lev1 = Utils.getAgvLev(locDetl.getLocNo());
+            if (lev1 == lev) {
+                lists.add(locDetl);
+            }
+        }
+
+        //鎼滅储鎸囧畾搴撲綅鍙凤紝鍗充娇搴撲綅涓虹┖锛屼篃鍙互杩斿洖鏁版嵁
+        AgvLocMast locMast = agvLocMastService.selectById(locNo);
+        if (locMast != null) {
+            AgvLocDetl locDetl = new AgvLocDetl();
+            locDetl.setLocNo(locMast.getLocNo());
+            lists.add(locDetl);
+        }
+        return R.ok().add(lists);
+    }
+
+    /*
+    @GetMapping("/map/realtime/getData/{lev}/auth")
+    @ManagerAuth
+    public String getRealtimeMapData(@PathVariable("lev") Integer lev) {
+        BasMap basMap = basMapService.selectLatestMap(lev);
+        //瑙f瀽json鍦板浘鏁版嵁
+        List<ArrayList> arrayLists = JSON.parseArray(basMap.getData(), ArrayList.class);
+//        ArrayList<HashMap<String, Integer>> lineRows = new ArrayList<>();
+//        int dataRow = 0;
+//        int dataRowCount = 0;
+//        for (int i = 1; i < arrayLists.size(); i++) {
+//            boolean flag = true;
+//            ArrayList rows = arrayLists.get(i);
+//            for (int j = 1; j < rows.size() - 1; j++) {
+//                Object o = rows.get(j);
+//                JSONObject jsonObject = JSON.parseObject(o.toString());
+//                int value = Integer.parseInt(jsonObject.get("value").toString());
+//                if (value >= 0 && value != 3) {
+//                    //鍙湁璇ヨ涓殑浠讳竴涓�鍒楁湁鏁版嵁锛屽垯涓嶉渶瑕佸垱寤虹┖鐧借
+//                    flag = false;
+//                }
+//            }
+//
+//            if (flag) {
+//                //绌虹櫧琛岄渶瑕佽烦杩�
+//                HashMap<String, Integer> map = new HashMap<>();
+//                map.put("start", dataRow);
+//                int end = i - 1 - dataRowCount;
+//                map.put("end", end);
+//                map.put("count", dataRowCount);
+//                dataRow = end;
+//                dataRowCount++;
+//                lineRows.add(map);
+//            }
+//        }
+
+        //鑾峰彇褰撳墠妤煎眰搴撲綅鏁版嵁
+        List<LocMast> locMasts = locMastService.selectLocByLev(lev);
+        for (LocMast locMast : locMasts) {
+            Integer row = locMast.getRow1();
+            Integer bay = locMast.getBay1();
+//            for (HashMap<String, Integer> lineRow : lineRows) {
+//                if (row > lineRow.get("start") && row <= lineRow.get("end")) {
+//                    row += lineRow.get("count");
+//                    break;
+//                }
+//            }
+
+            ArrayList rowData = arrayLists.get(row);
+            Object o = rowData.get(bay);
+            JSONObject jsonObject = JSON.parseObject(o.toString());
+            if (DISABLE_LOC_NO.contains(locMast.getLocNo())) {
+                //绂佹搴撲綅
+                jsonObject.put("value", 10);//灏嗙鐢ㄥ簱浣嶈繘琛岃缃�
+            }
+            jsonObject.put("locNo", locMast.getLocNo());//璁剧疆搴撲綅鍙�
+            jsonObject.put("locSts", locMast.getLocSts());//搴撲綅鐘舵��
+            //鏇存柊list
+            rowData.set(bay, jsonObject);
+            arrayLists.set(row, rowData);
+        }
+
+        return JSONObject.toJSONString(arrayLists);
+    } */
+
+//    @GetMapping("/map/resetMap/{lev}/auth")
+//    @ManagerAuth
+//    public R resetMap(@PathVariable("lev") Integer lev) {
+//        Object o = redisUtil.get("realtimeBasMap_" + lev);
+//        if (o == null) {
+//            return R.error();
+//        }
+//        redisUtil.del("realtimeBasMap_" + lev);
+//        basMapService.deleteByLev(lev);
+//        return R.ok();
+//    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/AgvOpenController.java b/src/main/java/com/zy/asrs/controller/AgvOpenController.java
index 9ad92d1..8b2d906 100644
--- a/src/main/java/com/zy/asrs/controller/AgvOpenController.java
+++ b/src/main/java/com/zy/asrs/controller/AgvOpenController.java
@@ -107,10 +107,14 @@
             //淇敼AGV宸ヤ綔妗g殑宸ヤ綔鐘舵�佷负205.宸ヤ綔瀹屾垚
             agvWrkMastService.updateWrkStsByWrkNo(agvWrkMast.getWrkNo(),205);
 
-            //鍑哄簱浠诲姟 101.鍑哄簱 || 103.鎷f枡鍑哄簱
-            if(agvWrkMast.getIoType() == 101 || agvWrkMast.getIoType() == 103){
+            //鍑哄簱浠诲姟 101.鍑哄簱 || 103.鎷f枡鍑哄簱 || 107.鐩樼偣鍑哄簱
+            if(agvWrkMast.getIoType() == 101 || agvWrkMast.getIoType() == 103 || agvWrkMast.getIoType() == 107){
                 //淇敼鍑哄簱绔欑偣鐘舵��
                 agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode());
+            }
+            //鍑哄簱浠诲姟 110.绌烘澘鍑哄簱
+            if(agvWrkMast.getIoType() == 110){
+                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"D",agvWrkMast.getBarcode());
             }
         }
 
@@ -154,16 +158,10 @@
         @Transactional
         public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
 
-            //鍏ュ簱浠诲姟 || 鎷f枡鍏ュ簱浠诲姟
-            if(agvWrkMast.getIoType() == 1 || agvWrkMast.getIoType() == 53){
+            //鍏ュ簱浠诲姟 || 鎷f枡鍏ュ簱浠诲姟 ||鐩樼偣鍐嶅叆搴� ||绌烘澘鍏ュ簱
+            if(agvWrkMast.getIoType() == 1 || agvWrkMast.getIoType() == 53 || agvWrkMast.getIoType() == 57 || agvWrkMast.getIoType() == 10){
                 //淇敼婧愮珯鐐圭姸鎬佷负O.绌猴紝浠ュ強瑙g粦鎵樼洏鏉$爜
                 agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(),"O","");
-            }
-
-            //鍑哄簱浠诲姟 101.鍑哄簱 || 103.鎷f枡鍑哄簱
-            if(agvWrkMast.getIoType() == 101 || agvWrkMast.getIoType() == 103){
-                //淇敼婧愬簱浣嶇姸鎬�
-
             }
 
             //淇敼AGV宸ヤ綔妗g殑宸ヤ綔鐘舵�佷负203.RCS鏀捐揣涓�
diff --git a/src/main/java/com/zy/asrs/controller/AllLocDetlController.java b/src/main/java/com/zy/asrs/controller/AllLocDetlController.java
new file mode 100644
index 0000000..91f3ed5
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/AllLocDetlController.java
@@ -0,0 +1,84 @@
+package com.zy.asrs.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.R;
+import com.zy.asrs.entity.AllLocDetl;
+import com.zy.asrs.service.AllLocDetlService;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("/all")
+public class AllLocDetlController extends BaseController {
+
+    @Autowired
+    private AllLocDetlService allLocDetlService;
+
+    @RequestMapping(value = "/locDetl/list/auth")
+    @ManagerAuth
+    public R list(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam(required = false)String condition,
+                  @RequestParam Map<String, Object> param,
+                  @RequestParam(required = false)Boolean unreason){
+        if (!Cools.isEmpty(unreason) && unreason) {
+
+            return R.ok(allLocDetlService.selectPage(new Page<>(curr, limit), new EntityWrapper<AllLocDetl>()
+                    .where(" DATALENGTH( batch ) != 11 or\n" +
+                            "            batch LIKE '%[a-z]%'")));
+        }
+        param.remove("unreason");
+        String row = "";
+        EntityWrapper<AllLocDetl> wrapper = new EntityWrapper<>();
+        if (param.get("row") != null) {
+            String chooseRow = (String) param.get("row");
+            if (chooseRow.length() == 1) {
+                row = "0" + chooseRow;
+                param.remove("row");
+            }else {
+                row = chooseRow;
+                param.remove("row");
+            }
+        }
+        excludeTrash(param);
+        convert(param, wrapper);
+        allLike(AllLocDetl.class, param.keySet(), wrapper, condition);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        if (!row.equals("")){
+            wrapper.and()
+                    .where("loc_no like '" +row +"%'");
+        }
+
+        return R.ok(allLocDetlService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+
+    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
+        for (Map.Entry<String, Object> entry : map.entrySet()){
+            String val = String.valueOf(entry.getValue());
+            if (val.contains(RANGE_TIME_LINK)){
+                String[] dates = val.split(RANGE_TIME_LINK);
+                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+            } else {
+                if (entry.getKey().equals("locNo")) {
+                    wrapper.eq("loc_no", String.valueOf(entry.getValue()));
+                } else {
+                    wrapper.like(entry.getKey(), String.valueOf(entry.getValue()));
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/controller/ReportQueryController.java b/src/main/java/com/zy/asrs/controller/ReportQueryController.java
index cd42ffc..c05293c 100644
--- a/src/main/java/com/zy/asrs/controller/ReportQueryController.java
+++ b/src/main/java/com/zy/asrs/controller/ReportQueryController.java
@@ -71,8 +71,10 @@
 		if (!Cools.isEmpty(locNo) && !locNo.equals("null")) {
 			bean.setLoc_no(locNo);
 		}
-		List<ViewStayTimeBean> list = reportQueryMapper.queryViewStayTimeList(bean);
-		int count = reportQueryMapper.getViewStayTimeCount(bean);
+//		List<ViewStayTimeBean> list = reportQueryMapper.queryViewStayTimeList(bean);
+//		int count = reportQueryMapper.getViewStayTimeCount(bean);
+		List<ViewStayTimeBean> list = reportQueryMapper.queryAllViewStayTimeList(bean);
+		int count = reportQueryMapper.getAllViewStayTimeCount(bean);
 		Page<ViewStayTimeBean> page = new Page<>();
 		page.setRecords(list);
 		page.setTotal(count);
diff --git a/src/main/java/com/zy/asrs/entity/AgvBasMap.java b/src/main/java/com/zy/asrs/entity/AgvBasMap.java
new file mode 100644
index 0000000..7b8b25e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/AgvBasMap.java
@@ -0,0 +1,100 @@
+package com.zy.asrs.entity;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+import com.core.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("agv_bas_map")
+public class AgvBasMap implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 鍦板浘鏁版嵁
+     */
+    @ApiModelProperty(value= "鍦板浘鏁版嵁")
+    private String data;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @ApiModelProperty(value= "鍒涘缓鏃堕棿")
+    @TableField("create_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @ApiModelProperty(value= "鏇存柊鏃堕棿")
+    @TableField("update_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 鏇存柊鍓嶅湴鍥炬暟鎹�
+     */
+    @ApiModelProperty(value= "鏇存柊鍓嶅湴鍥炬暟鎹�")
+    @TableField("last_data")
+    private String lastData;
+
+    /**
+     * 灞�
+     */
+    @ApiModelProperty(value= "灞�")
+    private Integer lev;
+
+    /**
+     * 妤�
+     */
+    @ApiModelProperty(value= "妤�")
+    private Integer floor;
+
+    public AgvBasMap() {}
+
+    public AgvBasMap(String data, Date createTime, Date updateTime, String lastData, Integer lev) {
+        this.data = data;
+        this.createTime = createTime;
+        this.updateTime = updateTime;
+        this.lastData = lastData;
+        this.lev = lev;
+    }
+
+//    BasMap basMap = new BasMap(
+//            null,    // 鍦板浘鏁版嵁
+//            null,    // 鍒涘缓鏃堕棿
+//            null,    // 鏇存柊鏃堕棿
+//            null,    // 鏇存柊鍓嶅湴鍥炬暟鎹�
+//            null    // 妤煎眰
+//    );
+
+    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);
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/AllLocDetl.java b/src/main/java/com/zy/asrs/entity/AllLocDetl.java
new file mode 100644
index 0000000..a532bda
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/AllLocDetl.java
@@ -0,0 +1,266 @@
+package com.zy.asrs.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.zy.asrs.service.LocMastService;
+import com.zy.common.utils.Synchro;
+import com.zy.system.entity.User;
+import com.zy.system.service.UserService;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Data
+@TableName("all_loc_detl")
+@ExcelIgnoreUnannotated
+public class AllLocDetl implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "搴撲綅鍙�")
+    @TableField("loc_no")
+    private String locNo;
+
+    @ApiModelProperty(value= "鎵樼洏鏉$爜")
+    private String zpallet;
+
+    @ApiModelProperty(value= "鏁伴噺")
+    @ExcelProperty("鏁伴噺")
+    private Double anfme;
+
+    @ApiModelProperty(value= "鐗╂枡鍙�")
+    @ExcelProperty("鐗╂枡鍙�")
+    private String matnr;
+
+    @ApiModelProperty(value= "鐗╂枡鍙�")
+    @ExcelProperty("鐗╂枡鍙�")
+    private String maktx;
+
+    @ApiModelProperty(value= "搴忓垪鐮�")
+    @ExcelProperty("搴忓垪鐮�")
+    private String batch;
+
+    @ApiModelProperty(value= "鍗曟嵁缂栧彿")
+    @ExcelProperty("鍗曟嵁缂栧彿")
+    @TableField("order_no")
+    private String orderNo;
+
+    @ApiModelProperty(value= "瑙勬牸")
+    private String specs;
+
+    @ApiModelProperty(value= "鎵规")
+    private String model;
+
+    @ApiModelProperty(value= "棰滆壊")
+    private String color;
+
+    @ApiModelProperty(value= "鍝佺墝")
+    private String brand;
+
+    @ApiModelProperty(value= "鍗曚綅")
+    private String unit;
+
+    @ApiModelProperty(value= "鍗曚环")
+    private Double price;
+
+    @ApiModelProperty(value= "sku")
+    private String sku;
+
+    @ApiModelProperty(value= "鍖呮暟")
+    private Double units;
+
+    @ApiModelProperty(value= "鏉$爜")
+    private String barcode;
+
+    @ApiModelProperty(value= "鐗╂枡鐘舵��")
+    private String origin;
+
+    @ApiModelProperty(value= "鍘傚")
+    private String manu;
+
+    @ApiModelProperty(value= "鍗曟嵁鏃堕棿")
+    @TableField("manu_date")
+    private String manuDate;
+
+    @ApiModelProperty(value= "鍝侀」鏁�")
+    @TableField("item_num")
+    private String itemNum;
+
+    @ApiModelProperty(value= "瀹夊叏搴撳瓨閲�")
+    @TableField("safe_qty")
+    private Double safeQty;
+
+    @ApiModelProperty(value= "閲嶉噺")
+    private Double weight;
+
+    @ApiModelProperty(value= "闀垮害")
+    private Double length;
+
+    @ApiModelProperty(value= "浣撶Н")
+    private Double volume;
+
+    @ApiModelProperty(value= "涓夋柟缂栫爜")
+    @TableField("three_code")
+    private String threeCode;
+
+    @ApiModelProperty(value= "渚涘簲鍟�")
+    private String supp;
+
+    @ApiModelProperty(value= "渚涘簲鍟嗙紪鐮�")
+    @TableField("supp_code")
+    private String suppCode;
+
+    @ApiModelProperty(value= "鏄惁鎵规 1: 鏄�  0: 鍚�  ")
+    @TableField("be_batch")
+    private Integer beBatch;
+
+    @ApiModelProperty(value= "淇濊川鏈�")
+    @TableField("dead_time")
+    private String deadTime;
+
+    @ApiModelProperty(value= "棰勮澶╂暟")
+    @TableField("dead_warn")
+    private Integer deadWarn;
+
+    @ApiModelProperty(value= "鍒惰喘 1: 鍒堕��  2: 閲囪喘  3: 澶栧崗  ")
+    private Integer source;
+
+    @ApiModelProperty(value= "瑕佹眰妫�楠� 1: 鏄�  0: 鍚�  ")
+    private Integer inspect;
+
+    @ApiModelProperty(value= "鍗遍櫓鍝� 1: 鏄�  0: 鍚�  ")
+    private Integer danger;
+
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("modi_user")
+    private Long modiUser;
+
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("modi_time")
+    private Date modiTime;
+
+    @ApiModelProperty(value= "鍒涘缓鑰�")
+    @TableField("appe_user")
+    private Long appeUser;
+
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("appe_time")
+    private Date appeTime;
+
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    @TableField("stock_freeze")
+    @ApiModelProperty(value= "搴撳瓨鍐荤粨{1:姝e父,0:鍐荤粨}")
+    private Integer stockFreeze;
+
+    public String getLocNo$(){
+        LocMastService service = SpringUtils.getBean(LocMastService.class);
+        LocMast locMast = service.selectById(this.locNo);
+        if (!Cools.isEmpty(locMast)){
+            return String.valueOf(locMast.getLocNo());
+        }
+        return null;
+    }
+
+    public String getBeBatch$(){
+        if (null == this.beBatch){ return null; }
+        switch (this.beBatch){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.beBatch);
+        }
+    }
+
+    public String getSource$(){
+        if (null == this.source){ return null; }
+        switch (this.source){
+            case 1:
+                return "鍒堕��";
+            case 2:
+                return "閲囪喘";
+            case 3:
+                return "澶栧崗";
+            default:
+                return String.valueOf(this.source);
+        }
+    }
+
+    public String getInspect$(){
+        if (null == this.inspect){ return null; }
+        switch (this.inspect){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.inspect);
+        }
+    }
+
+    public String getDanger$(){
+        if (null == this.danger){ return null; }
+        switch (this.danger){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.danger);
+        }
+    }
+
+    public String getModiUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.modiUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public String getModiTime$(){
+        if (Cools.isEmpty(this.modiTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
+    }
+
+    public String getAppeUser$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.appeUser);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public String getAppeTime$(){
+        if (Cools.isEmpty(this.appeTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
+    }
+
+    public void sync(Object source) {
+        Synchro.Copy(source, this);
+    }
+
+    public String getStockFreeze$() {
+        if (Cools.isEmpty(this.stockFreeze)){
+            return "";
+        }
+        return this.stockFreeze == 1 ? "姝e父" : "鍐荤粨";
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/EmptyPlateOutParam.java b/src/main/java/com/zy/asrs/entity/param/EmptyPlateOutParam.java
index 17ca693..38656a4 100644
--- a/src/main/java/com/zy/asrs/entity/param/EmptyPlateOutParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/EmptyPlateOutParam.java
@@ -1,14 +1,19 @@
 package com.zy.asrs.entity.param;
 
+import lombok.Data;
+
 import java.util.List;
 
 /**
  * Created by vincent on 2020/6/13
  */
+@Data
 public class EmptyPlateOutParam {
 
     // 鍑虹珯鍙�
     private Integer outSite;
+    // AGV鍑虹珯鍙�
+    private String stationCode;
 
     // 搴撲綅鍙烽泦鍚�
     private List<String> locNos;
diff --git a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
index e864f9b..2c3ef14 100644
--- a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -13,6 +13,9 @@
     // 鍑虹珯鍙�
     private Integer outSite;
 
+    // AGV鍑烘垬鍙�
+    private String station;
+
     // 鐗╂枡缂栧彿闆嗗悎
     private List<LocDetl> locDetls;
 
diff --git a/src/main/java/com/zy/asrs/mapper/AgvBasDevpMapper.java b/src/main/java/com/zy/asrs/mapper/AgvBasDevpMapper.java
index 3609fa9..b5e060a 100644
--- a/src/main/java/com/zy/asrs/mapper/AgvBasDevpMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/AgvBasDevpMapper.java
@@ -4,12 +4,18 @@
 import com.zy.asrs.entity.AgvBasDevp;
 import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
 import org.springframework.stereotype.Repository;
+
+import java.util.List;
 
 @Mapper
 @Repository
 public interface AgvBasDevpMapper extends BaseMapper<AgvBasDevp> {
 
     @Delete("delete from agv_bas_devp")
-    public void deleteAll();
+    void deleteAll();
+
+    @Select("select dev_no from agv_bas_devp where loc_sts = 'O'")
+    List<String> getAvailableEmptyInSite();
 }
diff --git a/src/main/java/com/zy/asrs/mapper/AgvBasMapMapper.java b/src/main/java/com/zy/asrs/mapper/AgvBasMapMapper.java
new file mode 100644
index 0000000..48be966
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/AgvBasMapMapper.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.AgvBasMap;
+import com.zy.asrs.entity.BasMap;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface AgvBasMapMapper extends BaseMapper<AgvBasMap> {
+
+    @Select("select top 1 * from agv_bas_map where lev = #{lev} and floor = #{floor} order by id desc")
+    BasMap selectLatestMap(@Param("lev")Integer lev, @Param("floor")Integer floor);//鑾峰彇鏈�鏂板湴鍥炬暟鎹�
+
+    boolean deleteByLev(Integer lev);//鍒犻櫎鎸囧畾妤煎眰鍦板浘
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java
index beef7e1..e2e6631 100644
--- a/src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java
@@ -2,9 +2,6 @@
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.zy.asrs.entity.AgvLocDetl;
-import com.zy.asrs.entity.LocDetl;
-import com.zy.asrs.entity.result.StockVo;
-import com.zy.common.model.QueryStockPreDo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -18,4 +15,42 @@
 @Repository
 public interface AgvLocDetlMapper extends BaseMapper<AgvLocDetl> {
 
+    @Update("update agv_loc_detl set loc_no = '${targetLoc}' where loc_no = '${sourceLoc}' ")
+    void updateStock(@Param("sourceLoc")String sourceLoc, @Param("targetLoc")String targetLoc);
+
+    @Select("select * from\n" +
+            "(\n" +
+            "\t\tselect\n" +
+            "\t\tROW_NUMBER() over (order by sum(a.anfme) desc) as row\n" +
+            "\t\t, a.matnr\n" +
+            "\t\t, sum(a.anfme) as anfme\n" +
+            "\t\tfrom agv_loc_detl a\n" +
+            "\t\twhere 1=1\n" +
+            "\t\tgroup by a.matnr\n" +
+            " ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})")
+    List<AgvLocDetl> getStockStatis(Map<String, Object> map);
+
+    @Select("select count(1) as count from\n" +
+            "        (\n" +
+            "        select\n" +
+            "        a.matnr\n" +
+            "        from agv_loc_detl a\n" +
+            "        where 1=1\n" +
+            "        \n" +
+            "        group by a.matnr\n" +
+            "     ) b")
+    Integer getStockStatisCount(Map<String, Object> map);
+
+    @Select("SELECT SUM(anfme) FROM agv_loc_detl")
+    Integer sum();
+
+    @Select("select\n" +
+            "        ROW_NUMBER() over (order by sum(a.anfme) desc) as row\n" +
+            "        , a.matnr\n" +
+            "        , sum(a.anfme) as anfme\n" +
+            "        from agv_loc_detl a\n" +
+            "        where 1=1\n" +
+            "        group by a.matnr")
+    List<AgvLocDetl> getStockStatisExcel();
+
 }
diff --git a/src/main/java/com/zy/asrs/mapper/AgvLocMastMapper.java b/src/main/java/com/zy/asrs/mapper/AgvLocMastMapper.java
index 7192e4f..0c93dc9 100644
--- a/src/main/java/com/zy/asrs/mapper/AgvLocMastMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/AgvLocMastMapper.java
@@ -2,10 +2,7 @@
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.zy.asrs.entity.AgvLocMast;
-import org.apache.ibatis.annotations.Delete;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-import org.apache.ibatis.annotations.Update;
+import org.apache.ibatis.annotations.*;
 
 import java.util.List;
 
@@ -24,4 +21,12 @@
 
     List<AgvLocMast> queryFreeLocMast2(Short locType1, Integer rowBeg, Integer rowEnd, Integer bayBeg, Integer bayEnd, Integer levBeg, Integer levEnd);
 
+    @Select("select loc_no " +
+            "from agv_loc_mast " +
+            "where loc_sts = 'O' and floor = ${floor}")
+    List<String> queryGroupEmptyStock(@Param("floor")int floor);
+
+
+    @Select("SELECT * FROM agv_loc_mast WHERE lev1 = #{lev} And floor = #{floor}")
+    List<AgvLocMast> selectLocByLevAndFloor(@Param("lev")int lev, @Param("floor")int floor);
 }
diff --git a/src/main/java/com/zy/asrs/mapper/AllLocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/AllLocDetlMapper.java
new file mode 100644
index 0000000..dfefbab
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/AllLocDetlMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.AllLocDetl;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface AllLocDetlMapper extends BaseMapper<AllLocDetl> {
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java b/src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
index a816b9c..71723d3 100644
--- a/src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
@@ -23,6 +23,12 @@
 	//涓嶅垎椤垫煡璇㈡墍鏈変俊鎭紝鐢ㄤ簬excel瀵煎嚭
 	public List<ViewStayTimeBean> getViewStayTimeAll(ViewStayTimeBean viewStayTime);
 
+	//鍒嗛〉鏌ヨAGV鍜屽洓椤瑰簱搴撳瓨婊炵暀鏃堕棿
+	public List<ViewStayTimeBean> queryAllViewStayTimeList(ViewStayTimeBean viewStayTime);
+	public int getAllViewStayTimeCount(ViewStayTimeBean viewStayTime);
+	//涓嶅垎椤垫煡璇GV鍜屽洓椤瑰簱鎵�鏈変俊鎭紝鐢ㄤ簬excel瀵煎嚭
+	public List<ViewStayTimeBean> getAllViewStayTimeAll(ViewStayTimeBean viewStayTime);
+
 //	// 搴撲綅Map
 	@Select("select distinct row1 from asr_loc_mast order by row1 asc")
 	List<Integer> getViewLocRowTotal();
diff --git a/src/main/java/com/zy/asrs/service/AgvBasDevpService.java b/src/main/java/com/zy/asrs/service/AgvBasDevpService.java
index 755e724..3bdd91a 100644
--- a/src/main/java/com/zy/asrs/service/AgvBasDevpService.java
+++ b/src/main/java/com/zy/asrs/service/AgvBasDevpService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.service.IService;
 import com.zy.asrs.entity.AgvBasDevp;
 
+import java.util.List;
 import java.util.Map;
 
 public interface AgvBasDevpService extends IService<AgvBasDevp> {
@@ -14,4 +15,6 @@
     public void updateLocStsAndBarcodeByDevNo(String devNo, String locSts, String barcode);
 
     public Map<String, Object> getAgvBasDevpDtoByStationCode(String stationCode);
+
+    public List<String> getAvailableEmptyInSite();
 }
diff --git a/src/main/java/com/zy/asrs/service/AgvBasMapService.java b/src/main/java/com/zy/asrs/service/AgvBasMapService.java
new file mode 100644
index 0000000..0d95bf1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/AgvBasMapService.java
@@ -0,0 +1,13 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.AgvBasMap;
+import com.zy.asrs.entity.BasMap;
+
+public interface AgvBasMapService extends IService<AgvBasMap> {
+
+    BasMap selectLatestMap(Integer lev, Integer floor);//鑾峰彇鏈�鏂板湴鍥炬暟鎹�
+
+    boolean deleteByLev(Integer lev);//鍒犻櫎鎸囧畾妤煎眰鍦板浘
+
+}
diff --git a/src/main/java/com/zy/asrs/service/AgvLocDetlService.java b/src/main/java/com/zy/asrs/service/AgvLocDetlService.java
index 8cfd7f0..eb52bf6 100644
--- a/src/main/java/com/zy/asrs/service/AgvLocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/AgvLocDetlService.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.service;
 
+import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.IService;
 import com.zy.asrs.entity.AgvLocDetl;
 import com.zy.common.model.LocDto;
@@ -12,4 +13,14 @@
 
     public double queryStockAndSetLocDto(String matnr, String batch, String orderNo, List<LocDto> locDtoList, double issued);
 
+    public void updateStock(String sourceLoc, String targetLoc);
+
+    Page<AgvLocDetl> getStockStatis(Page<AgvLocDetl> page);
+
+    Integer sum();
+
+    List<AgvLocDetl> getStockStatisExcel();
+
+    List<AgvLocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo);
+
 }
diff --git a/src/main/java/com/zy/asrs/service/AgvLocMastService.java b/src/main/java/com/zy/asrs/service/AgvLocMastService.java
index 2271da4..afcb341 100644
--- a/src/main/java/com/zy/asrs/service/AgvLocMastService.java
+++ b/src/main/java/com/zy/asrs/service/AgvLocMastService.java
@@ -19,4 +19,9 @@
     void updateLocType2ByRBL(Integer locType2, AgvLocRule locRule);
 
     public void updateLocStsByLocNo(String locNo, String locSts);
+
+    public List<String> queryGroupEmptyStock(int floor);
+
+    List<AgvLocMast> selectLocByLevAndFloor(int lev, int floor);
+
 }
diff --git a/src/main/java/com/zy/asrs/service/AgvWorkService.java b/src/main/java/com/zy/asrs/service/AgvWorkService.java
index f97aa5d..3379e72 100644
--- a/src/main/java/com/zy/asrs/service/AgvWorkService.java
+++ b/src/main/java/com/zy/asrs/service/AgvWorkService.java
@@ -2,6 +2,8 @@
 
 import com.zy.asrs.entity.AgvBasDevp;
 import com.zy.asrs.entity.AgvWrkMast;
+import com.zy.asrs.entity.param.EmptyPlateOutParam;
+import com.zy.asrs.entity.param.StockOutParam;
 import com.zy.common.model.StartupDto;
 import com.zy.common.model.TaskDto;
 
@@ -24,5 +26,21 @@
      */
     void pickIn(List<AgvWrkMast> agvWrkMastList);
 
+    /*
+    鐩樼偣鍑哄簱
+     */
+    void locCheckOut(StockOutParam param, Long userId);
+
+    /*
+    搴撲綅绉昏浆
+     */
+    void locMove(String sourceLocNo, String targetLocNo, Long userId);
+
+    /*
+    绌烘澘鍏ュ簱
+     */
+    String emptyPlateIn(String sourceStaion, Long userId);
+
+    void emptyPlateOut(EmptyPlateOutParam param, Long userId);
 
 }
diff --git a/src/main/java/com/zy/asrs/service/AllLocDetlService.java b/src/main/java/com/zy/asrs/service/AllLocDetlService.java
new file mode 100644
index 0000000..1770fa5
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/AllLocDetlService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.AllLocDetl;
+
+public interface AllLocDetlService extends IService<AllLocDetl> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java
index 069fae5..f9759e6 100644
--- a/src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java
@@ -109,16 +109,11 @@
                 AgvBasDevpDto agvBasDevpDto = new AgvBasDevpDto();
                 BeanUtils.copyProperties(agvBasDevp, agvBasDevpDto);
 
-//                if (Cools.isEmpty(agvBasDevpDto.getBarcode())) {
-//                    return agvBasDevpDto;
-//                }
-
+                //濡傛灉宸ヤ綔浣嶇姸鎬佷负0.绌哄簱浣�,鍒欑洿鎺ヨ繑鍥�
                 if("O".equals(agvBasDevpDto.getLocSts())){
                     return agvBasDevpDto;
                 }
 
-//              AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>()
-//                        .eq("barcode", agvBasDevpDto.getBarcode()));
                 AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>()
                         .eq("loc_no", agvBasDevpDto.getDevNo())
                         .or().eq("source_loc_no",agvBasDevpDto.getDevNo()));
@@ -139,6 +134,8 @@
                     }
                 }
 
+                setFlagForAgvBasDevpDto(agvWrkMast,agvBasDevpDto);
+
                 return agvBasDevpDto;
 
             }).collect(Collectors.toList());
@@ -153,4 +150,29 @@
         return result;
     }
 
+    private void setFlagForAgvBasDevpDto(AgvWrkMast agvWrkMast, AgvBasDevpDto agvBasDevpDto){
+        //褰撳伐浣滄。绫诲瀷涓�101.鍑哄簱 骞朵笖 宸ヤ綔浣嶇姸鎬佷负F.鍦ㄥ簱鏃讹紝鏄剧ず瀹瑰櫒绂诲満鎸夐挳
+        if(agvWrkMast.getIoType() == 101 && "F".equals(agvBasDevpDto.getLocSts())){
+            agvBasDevpDto.setContainerMoveOutFlag(true);
+        }
+
+        //褰撳伐浣滄。绫诲瀷涓�101.鍑哄簱 骞朵笖 宸ヤ綔浣嶇姸鎬佷负F.鍦ㄥ簱鏃讹紝鏄剧ず瀹瑰櫒绂诲満鎸夐挳
+        if(agvWrkMast.getIoType() == 110 && "D".equals(agvBasDevpDto.getLocSts())){
+            agvBasDevpDto.setContainerMoveOutFlag(true);
+        }
+
+        //褰撳伐浣滄。绫诲瀷涓�103.鎷f枡鍑哄簱 骞朵笖 宸ヤ綔浣嶇姸鎬佷负F.鍦ㄥ簱鏃讹紝鏄剧ず鎷f枡/鐩樼偣鍏ュ簱鎸夐挳
+        if(agvWrkMast.getIoType() == 103 && "F".equals(agvBasDevpDto.getLocSts())){
+            agvBasDevpDto.setPickInFlag(true);
+        }
+        //褰撳伐浣滄。绫诲瀷涓�107.鐩樼偣鍑哄簱 骞朵笖 宸ヤ綔浣嶇姸鎬佷负F.鍦ㄥ簱鏃讹紝鏄剧ず鎷f枡/鐩樼偣鍏ュ簱鎸夐挳
+        if(agvWrkMast.getIoType() == 107 && "F".equals(agvBasDevpDto.getLocSts())){
+            agvBasDevpDto.setPickInFlag(true);
+        }
+    }
+
+    public List<String> getAvailableEmptyInSite() {
+        return this.baseMapper.getAvailableEmptyInSite();
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/AgvBasMapServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/AgvBasMapServiceImpl.java
new file mode 100644
index 0000000..2869e4d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/AgvBasMapServiceImpl.java
@@ -0,0 +1,23 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.AgvBasMap;
+import com.zy.asrs.entity.BasMap;
+import com.zy.asrs.mapper.AgvBasMapMapper;
+import com.zy.asrs.service.AgvBasMapService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AgvBasMapServiceImpl extends ServiceImpl<AgvBasMapMapper, AgvBasMap> implements AgvBasMapService {
+
+    @Override
+    public BasMap selectLatestMap(Integer lev, Integer floor) {
+        return this.baseMapper.selectLatestMap(lev,floor);
+    }
+
+    @Override
+    public boolean deleteByLev(Integer lev) {
+        return this.baseMapper.deleteByLev(lev);
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java
index 736601e..597f97d 100644
--- a/src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.core.common.Cools;
 import com.zy.asrs.entity.AgvLocDetl;
@@ -80,6 +81,53 @@
 
     }
 
+    /*
+    鏇存柊搴撳瓨鏄庣粏
+     */
+    public void updateStock(String sourceLoc, String targetLoc) {
+        this.baseMapper.updateStock(sourceLoc,targetLoc);
+    }
+
+    public Page<AgvLocDetl> getStockStatis(Page<AgvLocDetl> page) {
+        page.setRecords(baseMapper.getStockStatis(page.getCondition()));
+        page.setTotal(baseMapper.getStockStatisCount(page.getCondition()));
+        return page;
+    }
+
+    /*
+    鑾峰彇搴撳瓨鎬绘暟
+     */
+    public Integer sum() {
+        return this.baseMapper.sum();
+    }
+
+    public List<AgvLocDetl> getStockStatisExcel(){
+        return this.baseMapper.getStockStatisExcel();
+    }
+
+    public List<AgvLocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo) {
+        if (Cools.isEmpty(orderNo) && Cools.isEmpty(matnr) && Cools.isEmpty(maktx) && Cools.isEmpty(specs) && Cools.isEmpty(locNo)) {
+            return new ArrayList<AgvLocDetl>();
+        }
+        EntityWrapper<AgvLocDetl> wrapper = new EntityWrapper<>();
+        if(Cools.isEmpty(orderNo)){
+            wrapper.like("order_no",orderNo);
+        }
+        if(Cools.isEmpty(matnr)){
+            wrapper.like("matnr",matnr);
+        }
+        if(Cools.isEmpty(maktx)){
+            wrapper.like("maktx",maktx);
+        }
+        if(Cools.isEmpty(specs)){
+            wrapper.like("specs",specs);
+        }
+        if(Cools.isEmpty()){
+            wrapper.like("loc_no",locNo);
+        }
+        return this.selectList(wrapper);
+    }
+
     private List<String> queryAgvStaNosByFloor(int floor){
         List<String> agvStaNos = new ArrayList<>();
         if(floor == 1){
diff --git a/src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java
index 8f3d445..e67221b 100644
--- a/src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.service.impl;
 
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
 import com.zy.asrs.entity.AgvLocMast;
 import com.zy.asrs.entity.AgvLocRule;
@@ -18,10 +19,10 @@
 public class AgvLocMastServiceImpl extends ServiceImpl<AgvLocMastMapper, AgvLocMast> implements AgvLocMastService {
 
     @Autowired
-    AgvLocMastMapper agvLockMastMapper;
+    AgvLocMastMapper agvLocMastMapper;
 
     public void clearLoc(){
-        agvLockMastMapper.deleteAll();
+        agvLocMastMapper.deleteAll();
     }
 
     public void initLocFloor1() {
@@ -94,4 +95,15 @@
         this.updateById(agvLocMast);
     }
 
+    public List<String> queryGroupEmptyStock(int floor) {
+        return this.baseMapper.queryGroupEmptyStock(floor);
+    }
+
+    public List<AgvLocMast> selectLocByLevAndFloor(int lev, int floor) {
+
+        List<AgvLocMast> agvLocMastList = this.selectList(new EntityWrapper<AgvLocMast>().eq("lev1", lev).eq("floor", floor));
+        return agvLocMastList;
+        //return this.agvLocMastMapper.selectLocByLevAndFloor(lev,floor);
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
index f5ea49e..faa8d95 100644
--- a/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -5,6 +5,8 @@
 import com.core.common.Cools;
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.param.EmptyPlateOutParam;
+import com.zy.asrs.entity.param.StockOutParam;
 import com.zy.asrs.service.*;
 import com.zy.common.model.LocDto;
 import com.zy.common.model.OrderDto;
@@ -38,7 +40,7 @@
     @Autowired
     private AgvBasDevpService agvBasDevpService;
     @Autowired
-    private AgvLocMastService agvLockMastService;
+    private AgvLocMastService agvLocMastService;
     @Autowired
     private AgvLocDetlService agvLocDetlService;
     @Autowired
@@ -104,7 +106,7 @@
 
         agvTaskDtos.forEach(taskDto -> {
 
-            AgvLocMast agvLocMast = agvLockMastService.selectById(taskDto.getLocNo());
+            AgvLocMast agvLocMast = agvLocMastService.selectById(taskDto.getLocNo());
             AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", taskDto.getLocNo()));
 
             //宸ヤ綔妗f墍闇�鍙傛暟
@@ -128,7 +130,7 @@
             modifyOrderDetl(taskDto.getLocDtos().get(0), userId);
             //鏇存柊婧愮珯鐐逛俊鎭�
             String locSts = ioType == 101 ? "R" : "P";
-            updateAgvLocMast(agvLockMastService.selectById(sourceLocNo),locSts);
+            updateAgvLocMast(agvLocMastService.selectById(sourceLocNo),locSts);
             //鏇存柊鐩爣绔欑偣鐘舵��
             //locSts = ioType == 101 ? "S" : "Q";
             updateAgvBasDevp(agvBasDevpService.selectById(targetLocNo),"S");
@@ -143,7 +145,11 @@
         agvWrkMastList.forEach(agvWrkMast -> {
             //淇敼宸ヤ綔鍏�
             agvWrkMast.setWrkSts(201L);
-            agvWrkMast.setIoType(53);
+
+            //鏍规嵁鍑哄簱绫诲瀷 璁剧疆鍏ュ簱绫诲瀷 53鎷f枡鍏ュ簱 57鐩樼偣鍏ュ簱
+            int ioType = agvWrkMast.getIoType() == 103 ? 53 : 57;
+
+            agvWrkMast.setIoType(ioType);
             String locNo = agvWrkMast.getLocNo();
             agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo());
             agvWrkMast.setSourceLocNo(locNo);
@@ -151,22 +157,139 @@
             agvWrkMastService.updateById(agvWrkMast);
 
             AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
-            AgvLocMast agvLocMast = agvLockMastService.selectById(agvWrkMast.getLocNo());
+            AgvLocMast agvLocMast = agvLocMastService.selectById(agvWrkMast.getLocNo());
             AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocMast.getLocNo()));
             AgvBasDevp agvBasDevp = agvBasDevpService.selectById(agvWrkMast.getSourceLocNo());
-            //淇敼宸ヤ綔鍏氭槑缁�
-            agvWrkDetl.setAnfme(agvLocDetl.getAnfme() - agvWrkDetl.getAnfme());
-            agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("wrk_no",agvWrkDetl.getWrkNo()));
-            //淇敼搴撳瓨淇℃伅
-            agvLocDetl.setAnfme(agvWrkDetl.getAnfme());
-            agvLocDetlService.update(agvLocDetl,new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocDetl.getLocNo()));
-            //淇敼搴撲綅淇℃伅
-            agvLocMast.setLocSts("Q");
-            agvLockMastService.selectById(agvLocMast);
-            //淇敼绔欑偣淇℃伅
-            agvBasDevp.setLocSts("R");
-            agvBasDevpService.updateById(agvBasDevp);
 
+            //鎷f枡鍏ュ簱
+            if(ioType == 53){
+                //淇敼宸ヤ綔鍏氭槑缁�
+                agvWrkDetl.setAnfme(agvLocDetl.getAnfme() - agvWrkDetl.getAnfme());
+                agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("wrk_no",agvWrkDetl.getWrkNo()));
+                //淇敼搴撳瓨淇℃伅
+                agvLocDetl.setAnfme(agvWrkDetl.getAnfme());
+                agvLocDetlService.update(agvLocDetl,new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocDetl.getLocNo()));
+            }
+            //淇敼搴撲綅淇℃伅
+            updateAgvLocMast(agvLocMast,"Q");
+            //淇敼绔欑偣淇℃伅
+            updateAgvBasDevp(agvBasDevp,"R");
+
+        });
+    }
+
+    /*
+    鐩樼偣鍑哄簱
+     */
+    @Transactional
+    public void locCheckOut(StockOutParam param, Long userId) {
+        String station = param.getStation();
+        List<AgvBasDevp> agvBasDevpList = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>()
+                .eq("station_code", station)
+                .eq("loc_sts","O"));
+
+        if(param.getLocDetls().size() > agvBasDevpList.size()){
+            throw new CoolException("褰撳墠绔欑偣鍙敤缂撳瓨璐ф灦鏁伴噺涓�" + agvBasDevpList.size() + ",灏戜簬闇�瑕佺洏鐐瑰嚭搴撳簱浣嶆暟閲忥紝璇烽噸鏂伴�夋嫨鐩樼偣搴撲綅");
+        }
+
+        param.getLocDetls().forEach(locDetl -> {
+            AgvLocMast agvLocMast = agvLocMastService.selectById(locDetl.getLocNo());
+            AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", locDetl.getLocNo()));
+            AgvBasDevp agvBasDevp = agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>()
+                    .eq("station_code", station)
+                    .eq("loc_sts","O"));
+            Date now = new Date();
+
+            //鐢熸垚宸ヤ綔鍏�
+            AgvWrkMast wrkMast = createWrkMast(107, 21L, locDetl.getLocNo(), agvBasDevp.getDevNo(), agvLocDetl.getZpallet(), now, userId);
+            //鐢熸垚宸ヤ綔鏄庣粏妗�
+            createWrkDetlReWrite(locDetl.getMatnr(),wrkMast.getWrkNo(),null,locDetl.getBatch(),locDetl.getCount(),wrkMast.getBarcode(),now,userId);
+            //淇敼搴撲綅淇℃伅
+            updateAgvLocMast(agvLocMast,"P");
+            //淇敼绔欑偣淇℃伅
+            updateAgvBasDevp(agvBasDevp,"S");
+
+        });
+
+    }
+
+    /*
+    搴撲綅绉昏浆
+     */
+    @Transactional
+    public void locMove(String sourceLocNo, String targetLocNo, Long userId) {
+        AgvLocMast sourceLocMast = agvLocMastService.selectById(sourceLocNo);
+        AgvLocMast targetLocMast = agvLocMastService.selectById(targetLocNo);
+        AgvLocDetl sourceLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", sourceLocMast.getLocNo()));
+
+        if(!sourceLocMast.getLocSts().equals("F")){
+            throw new CoolException(sourceLocMast.getLocNo() + "婧愬簱浣嶅嚭搴撳け璐ワ紝鐘舵�侊細"+sourceLocMast.getLocSts$());
+        }
+        if(!targetLocMast.getLocSts().equals("O")){
+            throw new CoolException("绉昏浆澶辫触锛岀洰鏍囧簱浣嶇姸鎬侊細"+targetLocMast.getLocSts$());
+        }
+
+        Date now = new Date();
+        //鐢熸垚绉诲簱宸ヤ綔妗�
+        AgvWrkMast wrkMast = createWrkMast(11, 21L, sourceLocNo, targetLocNo, sourceLocDetl.getZpallet(), now, userId);
+        //鐢熸垚宸ヤ綔鍏氭槑缁�
+        createWrkDetlReWrite(sourceLocDetl.getMatnr(),wrkMast.getWrkNo(),null,sourceLocDetl.getBatch(),sourceLocDetl.getAnfme(),sourceLocDetl.getZpallet(),now,userId);
+        //淇敼鐩爣搴撲綅鐘舵��
+        updateAgvLocMast(targetLocMast,"S");
+        //淇敼鍘熷簱浣嶇姸鎬�
+        updateAgvLocMast(sourceLocMast,"R");
+    }
+
+    /*
+    绌烘澘鍏ュ簱
+     */
+    @Transactional
+    public String emptyPlateIn(String sourceStaion, Long userId) {
+        Date now = new Date();
+        // 婧愮珯鐐圭姸鎬佹娴�
+        AgvBasDevp agvBasDevp = agvBasDevpService.selectById(sourceStaion);
+        if(!agvBasDevp.getLocSts().equals("O")){
+            throw new CoolException("褰撳墠宸ヤ綔浣嶇姸鎬佷负" + agvBasDevp.getLocSts()+",鏃犳硶杩涜绌烘澘鍏ュ簱");
+        }
+        // 妫�绱㈠簱浣�
+        AgvLocMast locMast = agvCommonService.getLocNo(null, agvBasDevp.getFloor());
+        // 鐢熸垚宸ヤ綔妗� 10.绌烘澘鍏ュ簱
+        createWrkMast(10,201L,agvBasDevp.getDevNo(),locMast.getLocNo(),null,now,userId);
+        //鏇存柊婧愮珯鐐圭姸鎬�
+        updateAgvBasDevp(agvBasDevp,"R");
+        //鏇存柊鐩爣搴撲綅鐘舵��
+        updateAgvLocMast(locMast,"S");
+        return locMast.getLocNo();
+    }
+
+    /*
+    绌烘澘鍑哄簱
+     */
+    @Transactional
+    public void emptyPlateOut(EmptyPlateOutParam param, Long userId) {
+        Date now = new Date();
+        //鍒ゆ柇鎵�閫夊伐浣滅珯绌轰綑宸ヤ綔浣嶆暟閲忔槸鍚︽弧瓒冲嚭搴撴暟閲�
+        List<AgvBasDevp> agvBasDevpList = agvBasDevpService.selectList(new EntityWrapper<AgvBasDevp>()
+                .eq("station_code", param.getStationCode())
+                .eq("loc_sts","O"));
+        if(agvBasDevpList.size() < param.getLocNos().size()){
+            throw new CoolException("褰撳墠宸ヤ綔绔欏彲鍑哄簱宸ヤ綔浣嶆暟閲忎负"+ agvBasDevpList.size() + "锛屽皬浜庤鍑哄簱鐨勫簱浣嶆暟閲忥紝璇烽噸鏂伴�夋嫨鍑哄簱搴撲綅");
+        }
+        param.getLocNos().forEach(locNo -> {
+            AgvLocMast agvLocMast = agvLocMastService.selectById(locNo);
+            if(!agvLocMast.getLocSts().equals("D")){
+                throw new CoolException(agvLocMast.getLocNo() + "搴撲綅鐘舵�佸凡缁忎笉涓篋.绌烘《/绌烘爤鏉匡紝璇烽噸鏂伴�夋嫨搴撲綅杩涜绌烘澘鍑哄簱");
+            }
+            //妫�绱㈠伐浣滀綅
+            AgvBasDevp agvBasDevp = agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>()
+                    .eq("station_code", param.getStationCode())
+                    .eq("loc_sts", "O"));
+            //鐢熸垚宸ヤ綔妗�
+            createWrkMast(110,21L,locNo,agvBasDevp.getDevNo(),null,now,userId);
+            //淇敼婧愬簱浣嶇姸鎬�
+            updateAgvLocMast(agvLocMast,"R");
+            //淇敼鐩爣宸ヤ綔浣嶇姸鎬�
+            updateAgvBasDevp(agvBasDevp,"S");
         });
     }
 
@@ -175,7 +298,7 @@
      */
     private void updateAgvLocMast(AgvLocMast locMast, String locSts){
         locMast.setLocSts(locSts);
-        agvLockMastService.updateById(locMast);
+        agvLocMastService.updateById(locMast);
     }
 
     /*
diff --git a/src/main/java/com/zy/asrs/service/impl/AllLocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/AllLocDetlServiceImpl.java
new file mode 100644
index 0000000..6484393
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/AllLocDetlServiceImpl.java
@@ -0,0 +1,11 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.asrs.entity.AllLocDetl;
+import com.zy.asrs.mapper.AllLocDetlMapper;
+import com.zy.asrs.service.AllLocDetlService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AllLocDetlServiceImpl extends ServiceImpl<AllLocDetlMapper, AllLocDetl> implements AllLocDetlService {
+}
diff --git a/src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java b/src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
index a706936..cc08129 100644
--- a/src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
+++ b/src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
@@ -34,14 +34,17 @@
 
 
     /*
-    瀹氭椂澶勭悊AGV宸ヤ綔妗d腑宸ヤ綔鐘舵�佷负205.宸ヤ綔瀹屾垚 涓� 锛�1.鍏ュ簱 || 53锛屾嫞鏂欏叆搴�)鐨勬暟鎹�
+    瀹氭椂澶勭悊AGV宸ヤ綔妗d腑宸ヤ綔鐘舵�佷负205.宸ヤ綔瀹屾垚 涓� 锛�1.鍏ュ簱 || 53锛屾嫞鏂欏叆搴� || 57.鐩樼偣鍏ュ簱 || 10.绌烘澘鍏ュ簱 || 11.搴撴牸绉昏浇)鐨勬暟鎹�
      */
     @Scheduled(cron = "0/5 * * * * ? ")
     public void excutePutwayWrk(){
         List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                 .eq("wrk_sts", 205)
                 .andNew().eq("io_type",53)
-                .or().eq("io_type",1));
+                .or().eq("io_type",1)
+                .or().eq("io_type",57)
+                .or().eq("io_type",10)
+                .or().eq("io_type",11));
         if(!Cools.isEmpty(agvWrkMastList)){
             agvWrkMastList.stream().forEach(agvWrkMast -> {
                 ReturnT<String> returnT = agvWrkMastHandler.completedPutWayWrk(agvWrkMast);
@@ -50,13 +53,14 @@
     }
 
     /*
-    瀹氭椂澶勭悊AGV宸ヤ綔妗d腑宸ヤ綔鐘舵�佷负205.宸ヤ綔瀹屾垚 涓� 101鍑哄簱绫诲瀷鐨勬暟鎹�
+    瀹氭椂澶勭悊AGV宸ヤ綔妗d腑宸ヤ綔鐘舵�佷负206.瀹瑰櫒绂诲満瀹屾垚 涓� (101.鍑哄簱 || 110.绌烘澘鍑哄簱)
      */
     @Scheduled(cron = "0/5 * * * * ? ")
     public void excuteCarryWrk(){
         List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
-                .eq("wrk_sts", 207)
-                .eq("io_type",101));
+                .eq("wrk_sts", 206)
+                .andNew().eq("io_type",110)
+                .or().eq("io_type",101));
         if(!Cools.isEmpty(agvWrkMastList)){
             agvWrkMastList.stream().forEach(agvWrkMast -> {
                 ReturnT<String> returnT = agvWrkMastHandler.completedCarryWrk(agvWrkMast);
@@ -66,15 +70,17 @@
 
     /*
     putaway锛氫笂鏋�
+    瀹氭椂澶勭悊AGV宸ヤ綔妗d腑宸ヤ綔鐘舵�佷负201.鐢熸垚鍏ュ簱浠诲姟ID 涓�(鍑哄簱绫诲瀷涓� 53.鎷f枡鍐嶅叆搴� || 1.鍏ュ簱 || 10.绌烘澘鍏ュ簱鏍� || 57.鐩樼偣鍐嶅叆搴�)鐨勬暟鎹�
      */
     @Scheduled(cron = "0/5 * * * * ? ")
     public void startPutwayWrk(){
-
         List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectPage(new Page<>(1, 50)
                 ,new EntityWrapper<AgvWrkMast>()
-                .eq("wrk_sts", 201)   //201.鐢熸垚鍏ュ簱浠诲姟ID
-                .andNew().eq("io_type", 53).or() //53.鎷f枡鍐嶅叆搴�
-                .eq("io_type", 1)).getRecords();
+                .eq("wrk_sts", 201)
+                .andNew().eq("io_type", 53)
+                .or().eq("io_type", 1)
+                .or().eq("io_type", 10)
+                .or().eq("io_type", 57)).getRecords();
 
         if(!Cools.isEmpty(agvWrkMastList)){
             try {
@@ -87,15 +93,18 @@
 
     /*
     carry锛氭惉杩愶紝缁熸寚鍑哄簱銆佺Щ搴撱�佺偣鍒扮偣鎼繍绛�
+    瀹氭椂澶勭悊AGV宸ヤ綔妗d腑宸ヤ綔鐘舵�佷负21.鐢熸垚鍑哄簱浠诲姟 涓�(鍑哄簱绫诲瀷涓� 101.鍑哄簱 || 103.鎷f枡鍑哄簱 || 11.搴撴牸绉绘牻 || 110.绌烘澘鍑哄簱 || 107.鐩樼偣鍑哄簱)鐨勬暟鎹�
      */
     @Scheduled(cron = "0/5 * * * * ? ")
     public void startCarryWrk(){
-
         List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectPage(new Page<>(1, 50)
                 ,new EntityWrapper<AgvWrkMast>()
-                        .eq("wrk_sts", 21)   //21.鐢熸垚鍑哄簱浠诲姟
-                        .andNew().eq("io_type", 101).or()
-                        .eq("io_type", 103)).getRecords();
+                        .eq("wrk_sts", 21)
+                        .andNew().eq("io_type", 101)
+                        .or().eq("io_type", 103)
+                        .or().eq("io_type", 11)
+                        .or().eq("io_type", 110)
+                        .or().eq("io_type", 107)).getRecords();
 
         if(!Cools.isEmpty(agvWrkMastList)){
             try {
diff --git a/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
index 8084635..c49c3ec 100644
--- a/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -46,11 +46,16 @@
         String barcode = agvWrkMast.getBarcode();
         String orderNo = getOrderNoByWrkNo(wrkNo);
 
-        //淇敼宸ヤ綔妗g姸鎬佷负206.搴撳瓨鏇存柊瀹屾垚
-        agvWrkMast.setWrkSts(206L);
+        //淇敼宸ヤ綔妗g姸鎬佷负207.搴撳瓨鏇存柊瀹屾垚
+        agvWrkMast.setWrkSts(207L);
         agvWrkMastService.updateById(agvWrkMast);
-        //淇敼鐩爣搴撲綅鐘舵�佷负F.鍦ㄥ簱
-        agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F");
+        if(agvWrkMast.getIoType() == 10){
+            // 绌烘澘鍏ュ簱 璁剧疆搴撲綅鐘舵�佷负D.绌烘《/绌烘爤鏉�
+            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D");
+        }else{
+            //淇敼鐩爣搴撲綅鐘舵�佷负F.鍦ㄥ簱
+            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F");
+        }
         //鐢熸垚AGV宸ヤ綔鍘嗗彶妗�
         agvWrkMastLogService.save(wrkNo);
         //鐢熸垚AGV宸ヤ綔鏄庣粏鍘嗗彶妗�
@@ -59,6 +64,7 @@
         agvWrkMastService.deleteById(wrkNo);
         //鍒犻櫎AGV宸ヤ綔鏄庣粏妗�
         agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
+        //绫诲瀷涓哄嚭搴撴椂
         if(agvWrkMast.getIoType() == 1){
             //鏇存柊鐩爣搴撲綅鏄庣粏
             agvLocDetlService.addLocDetlInfo(agvWrkMast.getLocNo(),wrkNo);
@@ -66,7 +72,13 @@
             agvWaitPakinLogService.save(barcode);
             //鍒犻櫎鍏ュ簱閫氱煡妗�
             agvWaitPakinService.delete(new EntityWrapper<AgvWaitPakin>().eq("zpallet",barcode));
-
+        }
+        //绫诲瀷涓哄簱浣嶇Щ杞椂
+        if(agvWrkMast.getIoType() == 11){
+            //鏇存柊搴撳瓨鏄庣粏
+            agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(),agvWrkMast.getLocNo());
+            //淇敼婧愬簱浣嶇姸鎬佷负O
+            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O");
         }
         if(!isJSON(orderNo)){
             //妫�鏌ヨ鍗曟槸鍚﹀凡瀹屾垚
@@ -82,17 +94,21 @@
         return SUCCESS;
     }
 
+
     @Transactional
     public ReturnT<String> completedCarryWrk(AgvWrkMast agvWrkMast) {
         int wrkNo = agvWrkMast.getWrkNo();
         String orderNo = getOrderNoByWrkNo(wrkNo);
-        //淇敼宸ヤ綔妗g姸鎬佷负206.搴撳瓨鏇存柊瀹屾垚
-        agvWrkMast.setWrkSts(206L);
+        //淇敼宸ヤ綔妗g姸鎬佷负207.搴撳瓨鏇存柊瀹屾垚
+        agvWrkMast.setWrkSts(207L);
         agvWrkMastService.updateById(agvWrkMast);
         //淇敼婧愬簱浣嶇姸鎬佷负O
         agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O");
-        //鏇存柊鐩爣搴撲綅鏄庣粏
-        agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo()));
+        if(agvWrkMast.getIoType() == 101){
+            //鏇存柊鐩爣搴撲綅鏄庣粏 101.鍑哄簱 鍒犻櫎婧愬簱浣嶅簱瀛樻槑缁�
+            agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo()));
+        }
+
         //鐢熸垚AGV宸ヤ綔鍘嗗彶妗�
         agvWrkMastLogService.save(wrkNo);
         //鐢熸垚AGV宸ヤ綔鏄庣粏鍘嗗彶妗�
@@ -124,7 +140,7 @@
         if(code == 0){
             agvWrkMastList.forEach(agvWrkMast -> {
                 //202.RCS鍙栬揣涓�
-                agvWrkMast.setWrkSts((long)202);
+                agvWrkMast.setWrkSts(202L);
                 agvWrkMastService.updateById(agvWrkMast);
                 if(agvWrkMast.getIoType() == 1){
                     //淇敼AGV鍏ュ簱閫氱煡妗g姸鎬佸叆鍑虹姸鎬佷负Y
@@ -146,7 +162,7 @@
         if(code == 0){
             agvWrkMastList.forEach(agvWrkMast -> {
                 //202.RCS鍙栬揣涓�
-                agvWrkMast.setWrkSts((long)202);
+                agvWrkMast.setWrkSts(202L);
                 agvWrkMastService.updateById(agvWrkMast);
             });
             //agvWrkMastService.updateBatchById(agvWrkMastList);
@@ -159,16 +175,10 @@
 
     private String getOrderNoByWrkNo(int wrkNo){
         AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", wrkNo));
+        if(Cools.isEmpty(agvWrkDetl)){
+            return null;
+        }
         return agvWrkDetl.getOrderNo();
-    }
-
-    public static void main(String[] args) {
-        String order = "[{\"anfme\":50.0,\"orderNo\":\"CS110011001111\"},{\"anfme\":50.0,\"orderNo\":\"CS110011001110\"}]";
-        List<Map> maps = JSONArray.parseArray(order, Map.class);
-        maps.forEach(map -> {
-            Object orderNo = map.get("orderNo");
-            System.out.println(orderNo );
-        });
     }
 
     private boolean isJSON(String str) {
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index 250745d..078066f 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -168,6 +168,16 @@
     }
 
     /**
+     * 閫氳繃搴撲綅鍙疯幏鍙� 灞�
+     */
+    public static int getAgvLev(String locNo) {
+        if (!Cools.isEmpty(locNo)) {
+            return Integer.parseInt(locNo.substring(11, 13));
+        }
+        throw new RuntimeException("搴撲綅瑙f瀽寮傚父");
+    }
+
+    /**
      * 褰撴绱㈠埌鍙屾繁搴撲綅鐨勬祬搴撲綅鏃讹紝濡傛灉娣卞簱浣嶆棤璐э紝鍒欐斁鍏ュ搴旂殑娣卞簱浣�
      */
     public static void toDeepIfEmptyByShallow(String shallowLoc) {
diff --git a/src/main/java/com/zy/common/model/AgvBasDevpDto.java b/src/main/java/com/zy/common/model/AgvBasDevpDto.java
index 0f0047f..1d4e2fb 100644
--- a/src/main/java/com/zy/common/model/AgvBasDevpDto.java
+++ b/src/main/java/com/zy/common/model/AgvBasDevpDto.java
@@ -18,4 +18,8 @@
 
     private AgvWrkDetl agvWrkDetl;
 
+    private boolean containerMoveOutFlag;
+
+    private boolean pickInFlag;
+
 }
diff --git a/src/main/java/com/zy/common/service/AgvCommonService.java b/src/main/java/com/zy/common/service/AgvCommonService.java
index 9049ce8..579de34 100644
--- a/src/main/java/com/zy/common/service/AgvCommonService.java
+++ b/src/main/java/com/zy/common/service/AgvCommonService.java
@@ -72,9 +72,11 @@
         AgvLocMast locMast = null;
 
         //搴撲綅瑙勫垯
-        locMast = getLocByLocRule(agvWaitPakinList.get(0),floor);
-        if(!Cools.isEmpty(locMast)){
-            return locMast;
+        if(!Cools.isEmpty(agvWaitPakinList)){
+            locMast = getLocByLocRule(agvWaitPakinList.get(0),floor);
+            if(!Cools.isEmpty(locMast)){
+                return locMast;
+            }
         }
 
         // 闈犺繎鎽嗘斁瑙勫垯 --- 鐩稿悓璁㈠崟鍙�, 鍚屽ぉ鍚岃鏍肩墿鏂�
diff --git a/src/main/resources/mapper/ViewStayTimeMapper.xml b/src/main/resources/mapper/ViewStayTimeMapper.xml
index 7c9b42d..b4fbba3 100644
--- a/src/main/resources/mapper/ViewStayTimeMapper.xml
+++ b/src/main/resources/mapper/ViewStayTimeMapper.xml
@@ -90,6 +90,51 @@
 	) a
 </select>
 
+<!-- 鍒嗛〉鏌ヨAGV鍜屽洓椤瑰簱鎵�鏈変俊鎭� -->
+<select id="queryAllViewStayTimeList" parameterType="com.zy.asrs.entity.ViewStayTimeBean" resultType="com.zy.asrs.entity.ViewStayTimeBean">
+	select
+		*
+	from (
+			 select
+				 ROW_NUMBER() over (order by stay_time desc) as row
+		, *
+			 from
+				 (
+					 SELECT
+						 GETDATE() AS today
+						  , CONVERT(decimal, DATEDIFF(second,all_loc_detl.appe_time, GETDATE()) / 86400.0, 9) AS stay_time
+						  , all_loc_detl.*
+					 FROM all_loc_detl
+					 where 1=1
+					 <include refid="viewStayTimeConditionSql"></include>
+				 ) t
+					 left join (select matnr as c ,store_max_date,store_max,store_min from man_mat) b
+							   on t.matnr = b.c
+					 left join (select matnr as f,sum(asr_loc_detl.anfme) as sum_qty from asr_loc_detl group by asr_loc_detl.matnr ) as z
+							   on z.f= b.c
+
+		 ) a  where a.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+</select>
+<select id="getAllViewStayTimeCount" parameterType="com.zy.asrs.entity.ViewStayTimeBean" resultType="Integer">
+	select
+		count(1)
+	from (
+			 select
+				 ROW_NUMBER() over (order by stay_time desc) as row
+		, *
+			 from
+				 (
+					 SELECT
+						 GETDATE() AS today
+						  , CONVERT(decimal, DATEDIFF(second,all_loc_detl.appe_time, GETDATE()) / 86400.0, 9) AS stay_time
+						  , all_loc_detl.*
+					 FROM all_loc_detl
+					 where 1=1
+					 <include refid="viewStayTimeConditionSql"></include>
+				 ) t
+		 ) a
+</select>
+
 <!-- 涓嶅垎椤垫煡璇㈡墍鏈変俊鎭紝鐢ㄤ簬excel瀵煎嚭 -->
 <select id="getViewStayTimeAll" parameterType="com.zy.asrs.entity.ViewStayTimeBean" resultType="com.zy.asrs.entity.ViewStayTimeBean">
 	select
@@ -112,4 +157,26 @@
 	) a
 </select>
 
+<!-- 涓嶅垎椤垫煡璇GV鍜屽洓椤瑰簱鎵�鏈変俊鎭紝鐢ㄤ簬excel瀵煎嚭 -->
+<select id="getAllViewStayTimeAll" parameterType="com.zy.asrs.entity.ViewStayTimeBean" resultType="com.zy.asrs.entity.ViewStayTimeBean">
+	SELECT
+		*
+	FROM
+		(
+			SELECT
+				ROW_NUMBER ( ) OVER ( ORDER BY stay_time DESC ) AS row, *
+			FROM
+				(
+					SELECT
+						GETDATE( ) AS today,
+						CONVERT ( DECIMAL, DATEDIFF( SECOND, all_loc_detl.appe_time, GETDATE( ) ) / 86400.0, 9 ) AS stay_time,
+						dbo.all_loc_detl.*
+					FROM
+						all_loc_detl
+					where 1=1
+					<include refid="viewStayTimeConditionSql"></include>
+				) t
+		) a
+</select>
+
 </mapper>
diff --git a/src/main/webapp/static/js/agvLocDetlStatis/locDetlStatis.js b/src/main/webapp/static/js/agvLocDetlStatis/locDetlStatis.js
new file mode 100644
index 0000000..7ddff9f
--- /dev/null
+++ b/src/main/webapp/static/js/agvLocDetlStatis/locDetlStatis.js
@@ -0,0 +1,256 @@
+var pageCurr;
+function getCol() {
+    var cols = [
+        {field: 'anfme', align: 'center',title: '搴撳瓨鏁伴噺', style: 'font-weight: bold'}
+    ];
+    arrRemove(detlCols, "field", "anfme")
+    arrRemove(detlCols, "field", "zpallet")
+    cols.push.apply(cols, detlCols);
+    // cols.push({field: 'anfme', align: 'center',title: '鏁伴噺', style: 'font-weight: bold'}
+    // )
+    return cols;
+}
+
+layui.use(['table','laydate', 'form'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#locDetlStatis',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/agv/locDetl/statis/auth',
+        page: true,
+        limit: 20,
+        limits: [20, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [getCol()],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+            form.on('checkbox(tableCheckbox)', function (data) {
+                var _index = $(data.elem).attr('table-index')||0;
+                if(data.elem.checked){
+                    res.data[_index][data.value] = 'Y';
+                }else{
+                    res.data[_index][data.value] = 'N';
+                }
+            });
+            /**
+             * 鏄剧ず搴撳瓨鎬绘暟閲�
+             */
+            $.ajax({
+                url: baseUrl+"/agv/locDetl/count",
+                headers: {'token': localStorage.getItem('token')},
+                contentType:'application/json;charset=UTF-8',
+                method: 'POST',
+                success: function (res) {
+                    $("#countNum").text(res.data + '涓�');
+                }
+            });
+
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(locDetlStatis)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {
+                curr: 1
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                limit();
+            }
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(locDetlStatis)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            case 'exportAll':
+                layer.closeAll();
+                layer.load(1, {shade: [0.1,'#fff']});
+                location.href = baseUrl + "/agv/locDetl/statis/export";
+                layer.closeAll('loading');
+                break;
+            case 'exportData':
+                layer.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'locDetl': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/agv/locDetl/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(locDetlStatis)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            // 璇︽儏
+            case 'detail':
+                layer.open({
+                    type: 2,
+                    title: '璇︽儏',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: false,
+                    content: 'locDetl_detail.html',
+                    success: function(layero, index){
+                        setFormVal(layer.getChildFrame('#detail', index), data, true);
+                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                        layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                        layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                    }
+                });
+                break;
+
+        }
+    });
+
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '#modiTime\\$',
+        type: 'datetime'
+    });
+    layDate.render({
+        elem: '#appeTime\\$',
+        type: 'datetime'
+    });
+
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr-1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+        }
+    });
+}
+
+function detailScreen(index) {
+    var detail = layer.getChildFrame('#data-detail', index);
+    var height = detail.height()+60;
+    if (height > ($(window).height()*0.9)) {
+        height = ($(window).height()*0.8);
+    }
+    layer.style(index, {
+//        top: (($(window).height()-height)/3)+"px",
+        height: height+'px'
+    });
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/agvPakStore/emptyIn.js b/src/main/webapp/static/js/agvPakStore/emptyIn.js
new file mode 100644
index 0000000..ce508e8
--- /dev/null
+++ b/src/main/webapp/static/js/agvPakStore/emptyIn.js
@@ -0,0 +1,62 @@
+var pageCurr;
+layui.use(['table','laydate', 'form'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    getInBound();
+    limit();
+
+    // 鑾峰彇鍏ュ簱鍙�
+    function getInBound(){
+        $.ajax({
+            url: baseUrl+"/agv/available/empty/put/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200){
+                    var tpl = $("#putSiteSelectTemplate").html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    $('#inSiteSelect').append(html);
+                    form.render('select');
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    }
+
+    // 绌烘澘鍏ュ簱
+    form.on('submit(inbound)', function (data) {
+        var inSite = $('#inSiteSelect').val();
+        layer.confirm('璇风‘淇濊宸ヤ綔浣嶄笂宸叉斁鏈夌┖鏉�', function(){
+            $.ajax({
+                url: baseUrl+"/agv/empty/plate/in/start",
+                headers: {'token': localStorage.getItem('token')},
+                method: 'POST',
+                data: {sourceStaNo: inSite},
+                async: false,
+                success: function (res) {
+                    if (res.code === 200){
+                        layer.msg("鍏ュ簱鍚姩鎴愬姛锛岀洰鏍囧簱浣嶏細" + res.data);
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    }else {
+                        layer.msg(res.msg)
+                    }
+                }
+            })
+        });
+
+    });
+
+
+
+})
+
diff --git a/src/main/webapp/static/js/agvPakStore/emptyOut.js b/src/main/webapp/static/js/agvPakStore/emptyOut.js
new file mode 100644
index 0000000..23f2365
--- /dev/null
+++ b/src/main/webapp/static/js/agvPakStore/emptyOut.js
@@ -0,0 +1,204 @@
+var pageCurr;
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    // 鑾峰彇鍑哄簱鍙�
+    function getOutBound(){
+        // $.ajax({
+        //     url: baseUrl+"/agv/available/empty/put/site",
+        //     headers: {'token': localStorage.getItem('token')},
+        //     method: 'POST',
+        //     async: false,
+        //     success: function (res) {
+        //         if (res.code === 200){
+        //             var tpl = $("#takeSiteSelectTemplate").html();
+        //             var template = Handlebars.compile(tpl);
+        //             var html = template(res);
+        //             $('#staNoSelect').append(html);
+        //             form.render('select');
+        //         } else if (res.code === 403){
+        //             top.location.href = baseUrl+"/";
+        //         }else {
+        //             layer.msg(res.msg)
+        //         }
+        //     }
+        // })
+    }
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#locMast',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/agv/locMast/list/auth',
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        where: {loc_sts: "D",floor:$('#floorSelect option:selected').val()},
+        even: true,
+        toolbar: '#toolbar',
+        defaultToolbar: ['filter'],
+        cellMinWidth: 50,
+        cols: [[
+            {type: 'checkbox', fixed: 'left'}
+            ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�',sort:true}
+            ,{field: 'locSts$', align: 'center',title: '搴撲綅鐘舵��',width:200}
+            // ,{field: 'whsType$', align: 'center',title: '搴撲綅绫诲瀷'}
+            ,{field: 'row1', align: 'center',title: '鎺�'}
+            ,{field: 'bay1', align: 'center',title: '鍒�'}
+            ,{field: 'lev1', align: 'center',title: '灞�'}
+            // ,{field: 'fullPlt', align: 'center',title: '婊℃澘', templet:function(row){
+            //         var html = "<input value='fullPlt' type='checkbox' disabled=鈥榙isabled鈥� lay-skin='primary' lay-filter='tableCheckbox' table-index='"+row.LAY_TABLE_INDEX+"'";
+            //         if(row.fullPlt === 'Y'){html += " checked ";}
+            //         html += ">";
+            //         return html;
+            //     },width:80}
+            ,{field: 'modiUser$', align: 'center',title: '淇敼浜哄憳',event: 'modiUser'}
+            ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'}
+        ]],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            getOutBound();
+            limit();
+            form.on('checkbox(tableCheckbox)', function (data) {
+                var _index = $(data.elem).attr('table-index')||0;
+                if(data.elem.checked){
+                    res.data[_index][data.value] = 'Y';
+                }else{
+                    res.data[_index][data.value] = 'N';
+                }
+            });
+        }
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(locMast)', function (obj) {
+        var data = table.checkStatus(obj.config.id).data;
+        switch (obj.event) {
+            case 'outbound':
+                var staNo = $("#staNoSelect").val();
+                if (staNo === "" || staNo === null){
+                    layer.msg("璇烽�夋嫨鍑哄簱鍙�");
+                    return;
+                }
+                var locNos = [];
+                data.forEach(function(elem) {
+                    locNos.push(elem.locNo);
+                });
+                if (data.length === 0){
+                    layer.msg('璇疯嚦灏戦�変腑涓�琛屾暟鎹�');
+                } else {
+                    $.ajax({
+                        url: baseUrl+"/agv/empty/plate/out/start",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: {
+                            stationCode: staNo,
+                            locNos: locNos
+                        },
+                        method: 'POST',
+                        traditional:true,
+                        success: function (res) {
+                            if (res.code === 200){
+                                tableReload(); // 閲嶈浇琛ㄦ牸
+                                getOutBound(); // 閲嶈浇鍑哄簱鍙�
+                                layer.msg(res.msg);
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    });
+                }
+                break;
+        }
+    });
+
+    function changeStation(){
+        var floor = $('#floorSelect option:selected').val();
+        $('#staNoSelect').empty();
+        if(floor == 1){
+            $('#staNoSelect').append("<option value=CS-101>CS-101</option>");
+            $('#staNoSelect').append("<option value=CS-102>CS-102</option>")
+        }
+        if(floor == 3){
+            $('#staNoSelect').append("<option value=CS-305>CS-305</option>");
+            $('#staNoSelect').append("<option value=CS-306>CS-306</option>")
+            $('#staNoSelect').append("<option value=CS-307>CS-307</option>")
+        }
+        form.render();
+    }
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        $('#detlTable').css("display", 'none');
+        tableReload(false);
+        getOutBound();
+        changeStation();
+    });
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        $('#detlTable').css("display", 'none');
+        tableReload(false);
+        getOutBound();
+    });
+
+})
+
+function tableReload(child) {
+    var searchData = {};
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr-1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+        }
+    });
+}
diff --git a/src/main/webapp/static/js/agvPakStore/locCheckOut.js b/src/main/webapp/static/js/agvPakStore/locCheckOut.js
new file mode 100644
index 0000000..0f5d610
--- /dev/null
+++ b/src/main/webapp/static/js/agvPakStore/locCheckOut.js
@@ -0,0 +1,161 @@
+var locDetlLayerIdx;
+var tableIns;
+var form;
+var locDetlData = [];
+function getCol() {
+    var cols = [
+        {field: 'locNo', align: 'center',title: '搴撲綅鍙�', merge: true, style: 'font-weight: bold'}
+    ];
+    cols.push.apply(cols, detlCols);
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin', 'tableMerge'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    form = layui.form;
+    var admin = layui.admin;
+    var tableMerge = layui.tableMerge;
+
+    tableIns = table.render({
+        elem: '#chooseData',
+        headers: {token: localStorage.getItem('token')},
+        data: [],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [getCol()],
+        done: function(res, curr, count) {
+            tableMerge.render(this);
+            limit();
+            getOutBound();
+        }
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(chooseData)', function (obj) {
+        switch (obj.event) {
+            case 'outbound':
+                if (locDetlData.length === 0){
+                    layer.msg('璇峰厛娣诲姞鐩樼偣搴撳瓨', {icon: 2});
+                } else {
+                    var staNo = $("#staNoSelect").val();
+                    if (staNo === "" || staNo === null){
+                        layer.msg("璇烽�夋嫨鐩樼偣绔�", {icon: 2});
+                        return;
+                    }
+                    let param = {
+                        station: staNo,
+                        locDetls: locDetlData
+                    }
+                    $.ajax({
+                        url: baseUrl+"/agv/locCheck/out/start",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            if (res.code === 200){
+                                locDetlData = [];
+                                tableIns.reload({data: locDetlData});
+                                layer.msg(res.msg, {icon: 1});
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                }
+                break;
+        }
+    });
+
+    // 鑾峰彇鍑哄簱鍙�
+    function getOutBound(){
+        $.ajax({
+            url: baseUrl+"/available/take/check/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200){
+                    var tpl = $("#takeSiteSelectTemplate").html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    $('#staNoSelect').append(html);
+                    form.render('select');
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    }
+
+    $(document).on('click','#mat-query', function () {
+        let loadIndex = layer.msg('璇锋眰涓�...', {icon: 16, shade: 0.01, time: false});
+        locDetlLayerIdx = layer.open({
+            type: 2,
+            title: false,
+            closeBtn: false,
+            maxmin: false,
+            area: ['90%', '85%'],
+            shadeClose: true,
+            content: 'locDetlCheckQuery.html',
+            success: function(layero, index){
+                layer.close(loadIndex);
+            }
+        });
+    })
+
+})
+
+// 娣诲姞琛ㄦ牸鏁版嵁
+function addTableData(data,floor) {
+    if(locDetlData[0]){
+        if(floor != locDetlData[0].locNo.split('@')[1]){
+            return false;
+        }
+    }
+
+    for (let i=0;i<data.length;i++){
+        let pass = false;
+        for (let j=0;j<locDetlData.length;j++){
+            if (data[i].matnr === locDetlData[j].matnr && data[i].batch === locDetlData[j].batch && data[i].locNo === locDetlData[j].locNo) {
+                pass = true;
+                break;
+            }
+        }
+        if (pass) {
+            data.splice(i--, 1);
+        } else {
+            data[i]["count"] = data[i]["anfme"];
+        }
+
+    }
+    locDetlData.push.apply(locDetlData, data);
+    tableIns.reload({data: locDetlData});
+    layer.close(locDetlLayerIdx);
+    return true;
+}
+
+// 娣诲姞鐩樼偣绔欓�夋嫨
+function addStationData(data) {
+    $('#staNoSelect').empty();
+    if(data == 1){
+        $('#staNoSelect').append("<option value=CS-101>CS-101</option>");
+        $('#staNoSelect').append("<option value=CS-102>CS-102</option>")
+    }
+    if(data == 3){
+        $('#staNoSelect').append("<option value=CS-305>CS-305</option>");
+        $('#staNoSelect').append("<option value=CS-306>CS-306</option>")
+        $('#staNoSelect').append("<option value=CS-307>CS-307</option>")
+    }
+    form.render();
+}
diff --git a/src/main/webapp/static/js/agvPakStore/locMove.js b/src/main/webapp/static/js/agvPakStore/locMove.js
new file mode 100644
index 0000000..0f2a120
--- /dev/null
+++ b/src/main/webapp/static/js/agvPakStore/locMove.js
@@ -0,0 +1,135 @@
+var pageCurr = 0;
+var tableIns;
+function getCol() {
+    var cols = [
+        {field: 'locNo', align: 'center',title: '搴撲綅鍙�', merge: true, style: 'font-weight: bold'}
+    ];
+    cols.push.apply(cols, detlCols);
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'tableMerge'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var form = layui.form;
+    var tableMerge = layui.tableMerge;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#locMatCode',
+        headers: {token: localStorage.getItem('token')},
+        // url: baseUrl+'/locDetl/list/auth',
+        data:[],
+        page: true,
+        limit: 16,
+        limits: [16, 50, 100, 200, 500],
+        even: true,
+        cellMinWidth: 50,
+        cols: [getCol()],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            tableMerge.render(this);
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            limit();
+            clearSelect();
+        }
+    });
+
+});
+
+// 鎼滅储搴撲綅鐗╂枡
+function getLoc(el) {
+    tableIns.reload({
+        url: baseUrl+'/agv/locDetl/list/auth'
+        , where: {loc_no: el.value}
+        , done:function (res) {
+            limit();
+            clearSelect();
+            // 鑾峰彇鍚屼竴鍫嗗灈鏈虹殑绌哄簱浣�
+            http.post(baseUrl + "/agv/group/empty/stock", {sourceLocNo: el.value}, function (res) {
+                if (res.data != null) {
+                    var tpl = $("#emptyLocStock").html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    $('#targetLocNo').append(html);
+                    layui.form.render('select');
+                }
+            });
+        }
+    });
+}
+
+// 绉诲簱鍚姩
+function locMove() {
+    var sourceLocNo = $("#sourceLocNo").val();
+    var targetLocNo = $("#targetLocNo").val();
+    if (sourceLocNo === null || sourceLocNo === ""){
+        $("#sourceLocNo").css("border-color", "red");
+        setTimeout(function () {
+            $("#sourceLocNo").css("border-color", "#b8b8b8");
+        }, 1000);
+        layer.msg("璇疯緭鍏ユ簮搴撲綅");
+        return;
+    }
+    if (targetLocNo === null || targetLocNo === "") {
+        $(".layui-select-title .layui-input").css("border-color", "red");
+        setTimeout(function () {
+            $(".layui-select-title .layui-input").css("border-color", "#b8b8b8");
+        }, 1000);
+        layer.msg("璇疯緭鍏ョ洰鏍囧簱浣�");
+        return;
+    }
+    $.ajax({
+        url: baseUrl + "/agv/loc/move/start",
+        headers: {'token': localStorage.getItem('token')},
+        dataType: 'json',
+        data: {
+            sourceLocNo: sourceLocNo,
+            targetLocNo: targetLocNo
+        },
+        method: 'POST',
+        success: function (res) {
+            if (res.code === 200) {
+                $("#sourceLocNo").val("");
+                $("#targetLocNo").empty();
+                layui.form.render('select');
+                tableIns.reload({
+                    data: [],
+                    url: '',
+                    done:function (res) {
+                        limit();clearSelect();
+                    }
+                });
+                layer.msg(res.msg);
+            } else if (res.code === 403) {
+                top.location.href = baseUrl + "/";
+            } else {
+                layer.msg(res.msg);
+            }
+        }
+    })
+}
+
+function clearSelect() {
+    $("#targetLocNo").empty();
+    layui.form.render('select');
+}
diff --git a/src/main/webapp/static/js/agvPakStore/pakStore.js b/src/main/webapp/static/js/agvPakStore/pakStore.js
new file mode 100644
index 0000000..dd0f6cb
--- /dev/null
+++ b/src/main/webapp/static/js/agvPakStore/pakStore.js
@@ -0,0 +1,202 @@
+var matCodeLayerIdx;
+var initCountVal = 0;
+var matCodeData = [];
+function getCol() {
+    var cols = [
+        {fixed: 'left', field: 'anfme', title: '鏁伴噺锛堝繀濉級', align: 'center', edit:'text', width: 120,  style:'color: blue;font-weight: bold'},
+        {field: 'batch', title: '搴忓垪鐮侊紙閫夊~锛�', align: 'center', edit:'text', width: 200,  style:'color: block;font-weight: bold'}
+    ];
+    cols.push.apply(cols, matCols);
+    cols.push({fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 80})
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['admin', 'table','laydate', 'form'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    tableIns = table.render({
+        elem: '#chooseData',
+        data: [],
+        even: true,
+        limit: 500,
+        cellMinWidth: 50,
+        toolbar: '#toolbar',
+        cols: [getCol()],
+        done: function (res, curr, count) {
+            limit();
+            getInBound();
+        }
+    });
+
+    // 椤甸潰淇敼
+    table.on('edit(chooseData)', function (obj) {
+        let index = obj.tr.attr("data-index");
+        let data = matCodeData[index];
+        let modify = true;
+        if (obj.field === 'anfme'){
+            let vle = Number(obj.value);
+            if (isNaN(vle)) {
+                layer.msg("璇疯緭鍏ユ暟瀛�", {icon: 2});
+                modify = false;
+            } else {
+                if (vle <= 0) {
+                    layer.msg("鏁伴噺蹇呴』澶т簬闆�", {icon: 2});
+                    modify = false;
+                }
+            }
+        }
+        if (modify) {
+            data[obj.field] = obj.value;
+        }
+        tableIns.reload({data: matCodeData});
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(chooseData)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        var data = checkStatus.data;
+        switch(obj.event) {
+            case 'comb':
+                // 鍒ゆ柇鏄惁瀛樺湪鐗╂枡
+                if (matCodeData.length === 0) {
+                    layer.msg("璇峰厛鎻愬彇鍟嗗搧", {icon: 2});
+                    return;
+                }
+                // 鍒ゆ柇鐗╂枡鏁伴噺鏄惁瀛樺湪寮傚父
+                for (var i=0;i<matCodeData.length;i++){
+                    if (isNaN(matCodeData[i].anfme)) {
+                        layer.msg("璇疯緭鍏ユ暟瀛�", {icon: 2});
+                        return;
+                    }
+                    if (matCodeData[i].anfme <= 0){
+                        layer.msg("鏁伴噺蹇呴』澶т簬闆�", {icon: 2});
+                        return;
+                    }
+                }
+                let devpNo = $('#putSiteSelect').val();
+                if (isEmpty(devpNo)) {
+                    layer.msg("璇烽�夋嫨鍏ュ簱绔�", {icon: 2});
+                    return;
+                }
+                $.ajax({
+                    url: baseUrl+"/full/store/put/start",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: JSON.stringify({
+                        devpNo: Number(devpNo),
+                        list: matCodeData
+                    }),
+                    contentType:'application/json;charset=UTF-8',
+                    method: 'POST',
+                    async: false,
+                    success: function (res) {
+                        if (res.code === 200){
+                            layer.msg("鍏ュ簱鍚姩鎴愬姛锛岀洰鏍囧簱浣嶏細" + res.data, {icon: 1});
+                            matCodeData = [];
+                            $('#focusMatByMat').val("");
+                            tableIns.reload({data: matCodeData,done:function (res) { limit(); getInBound();}});
+                        } else if (res.code === 403){
+                            top.location.href = baseUrl+"/";
+                        }else {
+                            layer.msg(res.msg, {icon: 2})
+                        }
+                    }
+                })
+                break;
+            default:
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(chooseData)', function(obj){
+        switch (obj.event) {
+            case 'remove':
+                let index = obj.tr.attr("data-index");
+                matCodeData.splice(index, 1);
+                tableIns.reload({data: matCodeData});
+                break;
+        }
+    });
+
+    // 鑾峰彇鍙敤鍏ュ簱绔欑偣
+    function getInBound() {
+        $.ajax({
+            url: baseUrl + "/available/put/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    var tpl = $("#putSiteSelectTemplate").html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    $('#putSiteSelect').append(html);
+                    form.render('select');
+                } else if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                } else {
+                    layer.msg(res.msg, {icon: 2})
+                }
+            }
+        })
+    }
+
+    // 鎻愬彇鐗╂枡
+    $(document).on('click','#mat-query', function () {
+        let loadIndex = layer.msg('璇锋眰涓�...', {icon: 16, shade: 0.01, time: false});
+        matCodeLayerIdx = admin.open({
+            type: 2,
+            title: false,
+            closeBtn: false,
+            maxmin: false,
+            area: ['90%', '85%'],
+            shadeClose: true,
+            content: 'matQuery.html',
+            success: function(layero, index){
+                layer.close(loadIndex);
+            }
+        });
+    })
+
+});
+
+
+
+// 鎵爜
+function focusMat(el) {
+    if (isEmpty(el.value)) {
+        return
+    }
+    $.ajax({
+        url: baseUrl + "/mat/" + el.value + "/auth",
+        headers: {'token': localStorage.getItem('token')},
+        method: 'GET',
+        success: function (res) {
+            if (res.code === 200) {
+                matCodeData = [];
+                var param = new Array();
+                param[0] = res.data;
+                addTableData(param);
+            } else if (res.code === 403) {
+                top.location.href = baseUrl + "/";
+            } else {
+                layer.msg(res.msg, {icon: 2})
+            }
+        }
+    })
+}
+
+// 娣诲姞琛ㄦ牸鏁版嵁
+function addTableData(list) {
+    list.map(function (d) {
+        d['anfme'] = initCountVal;
+    })
+    matCodeData.push.apply(matCodeData, list);
+    tableIns.reload({data: matCodeData});
+    layer.close(matCodeLayerIdx);
+}
diff --git a/src/main/webapp/static/js/agvPakStore/stockAdjust.js b/src/main/webapp/static/js/agvPakStore/stockAdjust.js
new file mode 100644
index 0000000..52d8db1
--- /dev/null
+++ b/src/main/webapp/static/js/agvPakStore/stockAdjust.js
@@ -0,0 +1,241 @@
+var initCountVal = 0;
+var initAnfmeVal = "-";
+var matCodeData = [];
+var currLocNo;
+var matCodeLayerIdx;
+function getCol() {
+    var cols = [
+        {fixed: 'left', field: 'count', title: '瀹為檯鏁伴噺', align: 'center', edit:'text', width: 120,  style:'color: blue;font-weight: bold'}
+        ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+        ,{field: 'batch', align: 'center',title: '搴忓垪鐮侊紙缂栬緫锛�', edit: true, style: 'font-weight:bold'}
+    ];
+    arrRemove(detlCols, "field", "anfme");
+    arrRemove(detlCols, "field", "batch");
+    cols.push.apply(cols, detlCols);
+    cols.push({fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:80})
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    tableIns = table.render({
+        elem: '#chooseData',
+        data: [],
+        even: true,
+        limit: 500,
+        cellMinWidth: 50,
+        toolbar: '#toolbar',
+        cols: [getCol()],
+        done: function (res, curr, count) {
+            limit();
+        }
+    });
+
+    // 椤甸潰淇敼
+    table.on('edit(chooseData)', function (obj) {
+        let index = obj.tr.attr("data-index");
+        let data = matCodeData[index];
+        let modify = true;
+        if (obj.field === 'count'){
+            let vle = Number(obj.value);
+            if (isNaN(vle)) {
+                layer.msg("璇疯緭鍏ユ暟瀛�", {icon: 2});
+                modify = false;
+            } else {
+                if (vle <= 0) {
+                    layer.msg("鏁伴噺蹇呴』澶т簬闆�", {icon: 2});
+                    modify = false;
+                }
+            }
+        }
+        if (modify) {
+            data[obj.field] = obj.value;
+        }
+        tableIns.reload({data: matCodeData});
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(chooseData)', function (obj) {
+        switch(obj.event) {
+            case 'adjust':
+                if (isEmpty(currLocNo)) {
+                    layer.msg("璇峰厛妫�绱㈠簱浣�", {icon: 2})
+                    inputTip($("#searchLocNo"));
+                    return;
+                }
+                if (matCodeData.length === 0) {
+                    layer.msg("璇峰厛娣诲姞鏄庣粏", {icon: 2});
+                    return;
+                }
+                for (var i=0;i<matCodeData.length;i++){
+                    if (isNaN(matCodeData[i].count)) {
+                        layer.msg("璇疯緭鍏ユ暟瀛�", {icon: 2});
+                        return;
+                    }
+                    if (matCodeData[i].count < 0){
+                        layer.msg("鏁伴噺涓嶈兘灏忎簬闆�", {icon: 2});
+                        return;
+                    }
+                }
+                layer.confirm('纭畾璋冩暣'+currLocNo+'搴撲綅鐨勬槑缁嗗悧锛�', {shadeClose: true}, function(){
+                    $.ajax({
+                        url: baseUrl+"/locDdetl/adjust/start",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify({
+                            locNo: currLocNo,
+                            list: matCodeData
+                        }),
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        async: false,
+                        success: function (res) {
+                            if (res.code === 200){
+                                layer.msg(currLocNo + res.msg, {icon: 1});
+                                init(currLocNo)
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    })
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(chooseData)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'remove':
+                let index = obj.tr.attr("data-index");
+                matCodeData.splice(index, 1);
+                tableIns.reload({data: matCodeData});
+                break;
+        }
+    });
+
+    // 妫�绱簨浠�
+    form.on('submit(search)', function (data) {
+        let locNo = data.field.loc_no;
+        if (locNo === "") {
+            inputTip($("#searchLocNo"));
+            layer.msg("璇疯緭鍏ュ簱浣嶅彿");
+            return;
+        }
+        init(locNo);
+    });
+
+    // 閲嶇疆浜嬩欢
+    form.on('submit(reset)', function (data) {
+        reset();
+    });
+
+    function init(locNo) {
+        http.post(baseUrl + "/locDetl/list/auth", {locNo: locNo,limit: 1000}, function (res) {
+            matCodeData = [];
+            matCodeData = res.data.records;
+            for (var i = 0; i<matCodeData.length; i++) {
+                matCodeData[i]["count"] = matCodeData[i]["anfme"];
+            }
+            locTips(true, locNo);
+            tableReload();
+        })
+    }
+
+    function reset() {
+        clearFormVal($('#search-box'));
+        matCodeData = [];
+        tableReload();
+        locTips(false);
+    }
+
+    // 閲嶈浇琛ㄦ牸
+    function tableReload() {
+        tableIns.reload({data: matCodeData});
+    }
+
+    // 搴撲綅鎻愮ず妗�
+    function locTips(retrieve, locNo) {
+        if (retrieve) {
+            http.post(baseUrl+"/locMast/"+locNo+"/auth", null, function (res) {
+                let data = res.data;
+                if (data != null) {
+                    $(".retrieve").show();
+                    $("#locMsg").html(locNo + "&nbsp;,搴撲綅鐘舵�侊細" + data.locSts$);
+                    $('.not-retrieve').hide();
+                    currLocNo = locNo;
+                } else {
+                    layer.msg("璇疯緭鍏ユ湁鏁堝簱浣嶅彿", {icon: 2});
+                    $('.not-retrieve').show();
+                    $("#locMsg").html("");
+                    $(".retrieve").hide();
+                    currLocNo = null;
+                    inputTip($("#searchLocNo"));
+                }
+            })
+        } else {
+            $('.not-retrieve').show();
+            $("#locMsg").html("");
+            $(".retrieve").hide();
+            currLocNo = null;
+        }
+    }
+
+    $(document).on('click','#mat-query', function () {
+        if (isEmpty(currLocNo)) {
+            layer.msg("璇峰厛妫�绱㈠簱浣�")
+            inputTip($("#searchLocNo"));
+            return;
+        }
+        let loadIndex = layer.msg('璇锋眰涓�...', {icon: 16, shade: 0.01, time: false});
+        matCodeLayerIdx = admin.open({
+            type: 2,
+            title: false,
+            closeBtn: false,
+            maxmin: false,
+            area: ['90%', '85%'],
+            shadeClose: true,
+            content: 'matQuery.html',
+            success: function(layero, index){
+                layer.close(loadIndex);
+            }
+        });
+    })
+
+})
+
+// 鎼滅储妗嗙┖鍊兼彁绀�
+function inputTip(el) {
+    el.css("border-color", "red");
+    setTimeout(function () {
+        el.css("border-color", "#b8b8b8");
+    }, 1000);
+}
+
+// 娣诲姞琛ㄦ牸鏁版嵁
+function addTableData(data) {
+    for (let i=0;i<data.length;i++){
+        for (let j=0;j<matCodeData.length;j++){
+            if (data[i].matnr === matCodeData[j].matnr && data[i].batch === matCodeData[j].batch) {
+                data.splice(i, 1);
+                break;
+            } else {
+                data[i]['anfme'] = initAnfmeVal;
+                data[i]['count'] = initCountVal;
+            }
+        }
+    }
+    matCodeData.push.apply(matCodeData, data);
+    tableIns.reload({data: matCodeData});
+    layer.close(matCodeLayerIdx);
+}
diff --git a/src/main/webapp/static/js/agvPakStore/stockOut.js b/src/main/webapp/static/js/agvPakStore/stockOut.js
new file mode 100644
index 0000000..d9b2580
--- /dev/null
+++ b/src/main/webapp/static/js/agvPakStore/stockOut.js
@@ -0,0 +1,177 @@
+var locDetlLayerIdx;
+var locDetlData = [];
+function getCol() {
+    var cols = [
+        {field: 'count', align: 'center',title: '鍑哄簱鏁伴噺', edit:'text', width: 130,  style:'color: blue;font-weight: bold'}
+        ,{field: 'anfme', align: 'center',title: '搴撳瓨鏁伴噺'}
+        ,{field: 'locNo$', align: 'center',title: '搴撲綅鍙�'}
+    ];
+    arrRemove(detlCols,  'field', 'anfme');
+    cols.push.apply(cols, detlCols);
+    cols.push({fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 80})
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var form = layui.form;
+    var admin = layui.admin;
+
+    tableIns = table.render({
+        elem: '#chooseData',
+        headers: {token: localStorage.getItem('token')},
+        data: [],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        limit: 500,
+        cols: [getCol()],
+        done: function(res, curr, count) {
+            limit();
+            getOutBound();
+        }
+    });
+
+    // 椤甸潰淇敼
+    table.on('edit(chooseData)', function (obj) {
+        let index = obj.tr.attr("data-index");
+        let data = locDetlData[index];
+        let modify = true;
+        if (obj.field === 'count'){
+            let vle = Number(obj.value);
+            if (isNaN(vle)) {
+                layer.msg("璇疯緭鍏ユ暟瀛�", {icon: 2});
+                modify = false;
+            } else {
+                if (vle <= 0) {
+                    layer.msg("鏁伴噺蹇呴』澶т簬闆�", {icon: 2});
+                    modify = false;
+                }
+                if (vle > Number(data.anfme)) {
+                    layer.msg("鍑哄簱鏁伴噺涓嶅緱澶т簬搴撳瓨鏁伴噺", {icon: 2});
+                    modify = false;
+                }
+            }
+        }
+        if (modify) {
+            data[obj.field] = obj.value;
+        }
+        tableIns.reload({data: locDetlData});
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(chooseData)', function (obj) {
+        switch (obj.event) {
+            case 'outbound':
+                if (locDetlData.length === 0){
+                    layer.msg('璇峰厛鎻愬彇鍟嗗搧搴撳瓨', {icon: 2});
+                } else {
+                    var staNo = $("#staNoSelect").val();
+                    if (staNo === "" || staNo === null){
+                        layer.msg("璇烽�夋嫨鍑哄簱鍙�", {icon: 2});
+                        return;
+                    }
+                    let param = {
+                        outSite: staNo,
+                        locDetls: locDetlData
+                    }
+                    $.ajax({
+                        url: baseUrl+"/plate/out/start",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            if (res.code === 200){
+                                locDetlData = [];
+                                tableIns.reload({data: locDetlData,done:function (res) {limit();getOutBound();}});
+                                layer.msg(res.msg, {icon: 1});
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg, {icon: 2})
+                            }
+                        }
+                    });
+                }
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(chooseData)', function(obj){
+        switch (obj.event) {
+            case 'remove':
+                let index = obj.tr.attr("data-index");
+                locDetlData.splice(index, 1);
+                tableIns.reload({data: locDetlData});
+                break;
+        }
+    });
+
+    // 鑾峰彇鍑哄簱鍙�
+    function getOutBound(){
+        $.ajax({
+            url: baseUrl+"/available/take/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200){
+                    var tpl = $("#takeSiteSelectTemplate").html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    $('#staNoSelect').append(html);
+                    form.render('select');
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    }
+
+
+    $(document).on('click','#mat-query', function () {
+        let loadIndex = layer.msg('璇锋眰涓�...', {icon: 16, shade: 0.01, time: false});
+        locDetlLayerIdx = layer.open({
+            type: 2,
+            title: false,
+            closeBtn: false,
+            maxmin: false,
+            area: ['90%', '85%'],
+            shadeClose: true,
+            content: 'locDetlQuery.html',
+            success: function(layero, index){
+                layer.close(loadIndex);
+            }
+        });
+    })
+
+})
+
+// 娣诲姞琛ㄦ牸鏁版嵁
+function addTableData(data) {
+    for (var i=0;i<data.length;i++){
+        let pass = false;
+        for (var j=0;j<locDetlData.length;j++){
+            if (data[i].matnr === locDetlData[j].matnr && data[i].batch === locDetlData[j].batch && data[i].locNo$ === locDetlData[j].locNo$) {
+                pass = true;
+                break;
+            }
+        }
+        if (pass) {
+            data.splice(i--, 1);
+        } else {
+            data[i]["count"] = data[i]["anfme"];
+        }
+    }
+    locDetlData.push.apply(locDetlData, data);
+    tableIns.reload({data: locDetlData});
+    layer.close(locDetlLayerIdx);
+}
diff --git a/src/main/webapp/static/js/allLocDetl/locDetl.js b/src/main/webapp/static/js/allLocDetl/locDetl.js
new file mode 100644
index 0000000..073a915
--- /dev/null
+++ b/src/main/webapp/static/js/allLocDetl/locDetl.js
@@ -0,0 +1,601 @@
+var pageCurr;
+var tableData;
+function getCol() {
+    var cols = [
+        {field: 'locNo', align: 'center',title: '搴撲綅鍙�'},
+        {field: 'matnr', align: 'center',title: '鐗╂枡鍙�', sort:true}
+        ,{field: 'maktx', align: 'center',title: '鐗╂枡鍚嶇О', sort:true}
+        ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿', hide: false}
+        ,{field: 'batch', align: 'center',title: '搴忓垪鐮�', width: 300, sort:true}
+        ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+        ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
+
+        ,{field: 'specs', align: 'center',title: '瑙勬牸'}
+        ,{field: 'model', align: 'center',title: '閫氱敤鍨嬪彿', hide: true}
+        ,{field: 'color', align: 'center',title: '棰滆壊', hide: true}
+        ,{field: 'brand', align: 'center',title: '鍝佺墝', hide: true}
+        ,{field: 'unit', align: 'center',title: '鍗曚綅', hide: true}
+        ,{field: 'price', align: 'center',title: '鍗曚环', hide: true}
+        ,{field: 'sku', align: 'center',title: 'sku', hide: true}
+        ,{field: 'units', align: 'center',title: '鍖呮暟', hide: true}
+        ,{field: 'barcode', align: 'center',title: '鏉$爜', hide: true}
+        ,{field: 'origin', align: 'center',title: '鐗╂枡鐘舵��', hide: true}
+        ,{field: 'manu', align: 'center',title: '鍘傚', hide: true}
+        ,{field: 'manuDate', align: 'center',title: '鍗曟嵁鏃堕棿', hide: true}
+        ,{field: 'itemNum', align: 'center',title: '鍝侀」鏁�', hide: true}
+        ,{field: 'safeQty', align: 'center',title: '瀹夊叏搴撳瓨閲�', hide: true}
+        ,{field: 'weight', align: 'center',title: '鍗曠鍑�閲�', hide: true}
+        ,{field: 'length', align: 'center',title: '鍗曠姣涢噸', hide: true}
+        ,{field: 'volume', align: 'center',title: '鍗曠浣撶Н', hide: true}
+        ,{field: 'threeCode', align: 'center',title: '绠卞瓙灏哄', hide: true}
+        ,{field: 'supp', align: 'center',title: '渚涘簲鍟�', hide: true}
+        ,{field: 'suppCode', align: 'center',title: '渚涘簲鍟嗙紪鐮�', hide: true}
+        ,{field: 'beBatch$', align: 'center',title: '鏄惁鎵规', hide: true}
+        ,{field: 'deadTime', align: 'center',title: '淇濊川鏈�', hide: true}
+        ,{field: 'deadWarn', align: 'center',title: '棰勮澶╂暟', hide: true}
+        ,{field: 'source$', align: 'center',title: '鍒惰喘', hide: true}
+        ,{field: 'check$', align: 'center',title: '瑕佹眰妫�楠�', hide: true}
+        ,{field: 'danger$', align: 'center',title: '鍗遍櫓鍝�', hide: true}
+
+    ];
+
+    // cols.push.apply(cols, detlCols);
+    cols.push({field: 'modiUser$', align: 'center',title: '淇敼浜哄憳',hide: true}
+        ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'}
+        ,{field: 'stockFreeze', align: 'center',title: '搴撳瓨鍐荤粨', templet: '#stockFreezeTpl'}
+    )
+    return cols;
+}
+
+layui.use(['table','laydate', 'form'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#locDetl',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/all/locDetl/list/auth',
+        page: true,
+        limit: 20,
+        where:{
+          unreason: false
+        },
+        limits: [20, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [getCol()],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            return {
+                'code': res.code,
+                'msg': res.msg,
+                'count': res.data.total,
+                'data': res.data.records
+            }
+        },
+        response: {
+            statusCode: 200
+        },
+        done: function(res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            tableData = table.cache.locDetl;
+            pageCurr=curr;
+            limit();
+            form.on('checkbox(tableCheckbox)', function (data) {
+                var _index = $(data.elem).attr('table-index')||0;
+                if(data.elem.checked){
+                    res.data[_index][data.value] = 'Y';
+                }else{
+                    res.data[_index][data.value] = 'N';
+                }
+            });
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(locDetl)', function (obj) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        searchData['orderByField'] = obj.field;
+        searchData['orderByType'] = obj.type;
+        tableIns.reload({
+            where: searchData,
+            page: {
+                curr: 1
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+                limit();
+            }
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(locDetl)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            case 'addData':
+                layer.open({
+                    type: 2,
+                    title: '鏂板',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: false,
+                    content: 'locDetl_detail.html',
+                    success: function(layero, index){
+                        layer.getChildFrame('#data-detail-submit-edit', index).hide();
+                    	clearFormVal(layer.getChildFrame('#detail', index));
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                    }
+                });
+                break;
+            case 'refreshData':
+                tableIns.reload({
+                    page: {
+                        curr: pageCurr
+                    }
+                });
+                limit();
+                break;
+            case 'deleteData':
+                var data = checkStatus.data;
+                if (data.length === 0){
+                    layer.msg('璇烽�夋嫨鏁版嵁');
+                } else {
+                    layer.confirm('纭畾鍒犻櫎'+(data.length===1?'姝�':data.length)+'鏉℃暟鎹悧', function(){
+                        $.ajax({
+                            url: baseUrl+"/all/locDetl/delete/auth",
+                            headers: {'token': localStorage.getItem('token')},
+                            data: {param: JSON.stringify(data)},
+                            method: 'POST',
+                            traditional:true,
+                            success: function (res) {
+                                if (res.code === 200){
+                                    layer.closeAll();
+                                    tableReload(false);
+                                } else if (res.code === 403){
+                                    top.location.href = baseUrl+"/";
+                                } else {
+                                    layer.msg(res.msg)
+                                }
+                            }
+                        })
+                    });
+                }
+                break;
+            case 'exportData':
+                layer.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
+                    var titles=[];
+                    var fields=[];
+                    obj.config.cols[0].map(function (col) {
+                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
+                            titles.push(col.title);
+                            fields.push(col.field);
+                        }
+                    });
+                    var exportData = {};
+                    $.each($('#search-box [name]').serializeArray(), function() {
+                        exportData[this.name] = this.value;
+                    });
+                    var param = {
+                        'locDetl': exportData,
+                        'fields': fields
+                    };
+                    var loadIndex = layer.msg('姝e湪瀵煎嚭...', {icon: 16, shade: 0.01, time: false});
+                    $.ajax({
+                        url: baseUrl+"/all/locDetl/export/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: JSON.stringify(param),
+                        dataType:'json',
+                        contentType:'application/json;charset=UTF-8',
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            layer.closeAll();
+                            if (res.code === 200) {
+                                table.exportFile(titles,res.data,'xls');
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl+"/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(locDetl)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            // 璇︽儏
+            case 'detail':
+                layer.open({
+                    type: 2,
+                    title: '璇︽儏',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: false,
+                    content: 'locDetl_detail.html',
+                    success: function(layero, index){
+                        setFormVal(layer.getChildFrame('#detail', index), data, true);
+                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                        layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                        layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                    }
+                });
+                break;
+            // 缂栬緫
+            case 'edit':
+                layer.open({
+                    type: 2,
+                    title: '淇敼',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: false,
+                    content: 'locDetl_detail.html',
+                    success: function(layero, index){
+                        layer.getChildFrame('#data-detail-submit-save', index).hide();
+                        setFormVal(layer.getChildFrame('#detail', index), data, false);
+                        top.convertDisabled(layer.getChildFrame('#data-detail :input', index), false);
+                        top.convertDisabled(layer.getChildFrame('#locNo,#matnr', index), true);
+                        layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                        layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                        layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                    }
+                });
+                break;
+            case 'locNo':
+                var param = top.reObject(data).locNo;
+                if (param === undefined) {
+                    layer.msg("鏃犳暟鎹�");
+                } else {
+                   layer.open({
+                       type: 2,
+                       title: '搴撲綅鍙疯鎯�',
+                       maxmin: true,
+                       area: [top.detailWidth, top.detailHeight],
+                       shadeClose: false,
+                       content: '../locMast/locMast_detail.html',
+                       success: function(layero, index){
+                           $.ajax({
+                               url: baseUrl+"/all/locMast/"+ param +"/auth",
+                               headers: {'token': localStorage.getItem('token')},
+                               method: 'GET',
+                               success: function (res) {
+                                   if (res.code === 200){
+                                       setFormVal(layer.getChildFrame('#detail', index), res.data, true);
+                                       top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                                       layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                                       layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                                   } else if (res.code === 403){
+                                       parent.location.href = "/";
+                                   }else {
+                                       layer.msg(res.msg)
+                                   }
+                               }
+                           })
+                       }
+                   });
+                }
+                break;
+            case 'modiUser':
+                var param = top.reObject(data).modiUser;
+                if (param === undefined) {
+                    layer.msg("鏃犳暟鎹�");
+                } else {
+                   layer.open({
+                       type: 2,
+                       title: '淇敼浜哄憳璇︽儏',
+                       maxmin: true,
+                       area: [top.detailWidth, top.detailHeight],
+                       shadeClose: false,
+                       content: '../user/user_detail.html',
+                       success: function(layero, index){
+                           $.ajax({
+                               url: baseUrl+"/user/"+ param +"/auth",
+                               headers: {'token': localStorage.getItem('token')},
+                               method: 'GET',
+                               success: function (res) {
+                                   if (res.code === 200){
+                                       setFormVal(layer.getChildFrame('#detail', index), res.data, true);
+                                       top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                                       layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                                       layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                                   } else if (res.code === 403){
+                                       parent.location.href = "/";
+                                   }else {
+                                       layer.msg(res.msg)
+                                   }
+                               }
+                           })
+                       }
+                   });
+                }
+                break;
+            case 'appeUser':
+                var param = top.reObject(data).appeUser;
+                if (param === undefined) {
+                    layer.msg("鏃犳暟鎹�");
+                } else {
+                   layer.open({
+                       type: 2,
+                       title: '鍒涘缓鑰呰鎯�',
+                       maxmin: true,
+                       area: [top.detailWidth, top.detailHeight],
+                       shadeClose: false,
+                       content: '../user/user_detail.html',
+                       success: function(layero, index){
+                           $.ajax({
+                               url: baseUrl+"/user/"+ param +"/auth",
+                               headers: {'token': localStorage.getItem('token')},
+                               method: 'GET',
+                               success: function (res) {
+                                   if (res.code === 200){
+                                       setFormVal(layer.getChildFrame('#detail', index), res.data, true);
+                                       top.convertDisabled(layer.getChildFrame('#data-detail :input', index), true);
+                                       layer.getChildFrame('#data-detail-submit-save,#data-detail-submit-edit,#prompt', index).hide();
+                                       layer.iframeAuto(index);layer.style(index, {top: (($(window).height()-layer.getChildFrame('#data-detail', index).height())/3)+"px"});
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('select');
+                                       layero.find('iframe')[0].contentWindow.layui.form.render('checkbox');
+                                   } else if (res.code === 403){
+                                       parent.location.href = "/";
+                                   }else {
+                                       layer.msg(res.msg)
+                                   }
+                               }
+                           })
+                       }
+                   });
+                }
+                break;
+
+        }
+    });
+
+    // 鏁版嵁淇濆瓨鍔ㄤ綔
+    form.on('submit(save)', function () {
+        if (banMsg != null){
+            layer.msg(banMsg);
+            return;
+        }
+        method("add");
+    });
+
+    // 鏁版嵁淇敼鍔ㄤ綔
+    form.on('submit(edit)', function () {
+        method("update")
+    });
+
+    function method(name){
+        var index = layer.load(1, {
+            shade: [0.5,'#000'] //0.1閫忔槑搴︾殑鑳屾櫙
+        });
+        var data = {
+//            id: $('#id').val(),
+            locNo: $('#locNo').val(),
+            matnr: $('#matnr').val(),
+            lgnum: $('#lgnum').val(),
+            tbnum: $('#tbnum').val(),
+            tbpos: $('#tbpos').val(),
+            zmatid: $('#zmatid').val(),
+            maktx: $('#maktx').val(),
+            werks: $('#werks').val(),
+            anfme: $('#anfme').val(),
+            altme: $('#altme').val(),
+            zpallet: $('#zpallet').val(),
+            bname: $('#bname').val(),
+            memo: $('#memo').val(),
+            modiUser: $('#modiUser').val(),
+            modiTime: top.strToDate($('#modiTime\\$').val()),
+            appeUser: $('#appeUser').val(),
+            appeTime: top.strToDate($('#appeTime\\$').val()),
+
+        };
+        $.ajax({
+            url: baseUrl+"/all/locDetl/"+name+"/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: top.reObject(data),
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    parent.layer.closeAll();
+                    parent.$(".layui-laypage-btn")[0].click();
+                    $("#data-detail :input").each(function () {
+                        $(this).val("");
+                    });
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+                layer.close(index);
+            }
+        })
+    }
+
+    // 澶嶉�夋浜嬩欢
+    form.on('checkbox(detailCheckbox)', function (data) {
+        var el = data.elem;
+        if (el.checked) {
+            $(el).val('Y');
+        } else {
+            $(el).val('N');
+        }
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+
+    // 鎼滅储鏍忛噸缃簨浠�
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    //鏌ョ湅寮傚父鏁版嵁
+    form.on('submit(unreason)', function (data) {
+        pageCurr = 1;
+
+        tableIns.reload({
+            where: {
+                unreason: true
+            },
+            page: {
+                curr: pageCurr
+            },
+            done: function (res, curr, count) {
+
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+                pageCurr=curr;
+
+                limit(child);
+            }
+        });
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    layDate.render({
+        elem: '#modiTime\\$',
+        type: 'datetime'
+    });
+    layDate.render({
+        elem: '#appeTime\\$',
+        type: 'datetime'
+    });
+
+    form.on('switch(stockFreezeSwitch)', function (obj) {
+        let index  = obj.othis.parents('tr').attr("data-index");
+        let data = tableData[index];
+        data[this.stockFreeze] = obj.elem.checked?1:0;
+        http.post(baseUrl + "/all/locDetl/updateStockFreeze/auth", {
+            locNo: data.locNo,
+            matnr: data.matnr,
+            stockFreeze: data[this.stockFreeze]
+        }, function (res) {
+            layer.msg(res.msg, {icon: 1});
+        });
+    })
+
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(child) {
+    var searchData = {
+        unreason: false
+    };
+    $.each($('#search-box [name]').serializeArray(), function() {
+        searchData[this.name] = this.value;
+    });
+    (child ? parent.tableIns : tableIns).reload({
+        where: searchData,
+        page: {
+            curr: pageCurr
+        },
+        done: function (res, curr, count) {
+            if (res.code === 403) {
+                top.location.href = baseUrl+"/";
+            }
+            pageCurr=curr;
+            if (res.data.length === 0 && count !== 0) {
+                tableIns.reload({
+                    where: searchData,
+                    page: {
+                        curr: pageCurr-1
+                    }
+                });
+                pageCurr -= 1;
+            }
+            limit(child);
+        }
+    });
+}
+
+function setFormVal(el, data, showImg) {
+    for (var val in data) {
+        var find = el.find(":input[id='" + val + "']");
+        if (find[0]!=null){
+            if (find[0].type === 'checkbox'){
+                if (data[val]==='Y'){
+                    find.attr("checked","checked");
+                    find.val('Y');
+                } else {
+                    find.remove("checked");
+                    find.val('N');
+                }
+                continue;
+            }
+        }
+        find.val(data[val]);
+        if (showImg){
+            var next = find.next();
+            if (next.get(0)){
+                if (next.get(0).localName === "img") {
+                    find.hide();
+                    next.attr("src", data[val]);
+                    next.show();
+                }
+            }
+        }
+    }
+}
+
+function clearFormVal(el) {
+    $(':input', el)
+        .val('')
+        .removeAttr('checked')
+        .removeAttr('selected');
+}
+
+function detailScreen(index) {
+    var detail = layer.getChildFrame('#data-detail', index);
+    var height = detail.height()+60;
+    if (height > ($(window).height()*0.9)) {
+        height = ($(window).height()*0.8);
+    }
+    layer.style(index, {
+//        top: (($(window).height()-height)/3)+"px",
+        height: height+'px'
+    });
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 5f5f4ca..795b739 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -222,6 +222,7 @@
 var detlCols = [
     ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜', hide: true}
     ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜', hide: false}
+    ,{field: 'matnr', align: 'center',title: '鐗╂枡鍙�',hide: true}
     ,{field: 'matnr', align: 'center',title: '鐗╂枡鍙�'}
     ,{field: 'batch', align: 'center',title: '搴忓垪鐮�', width: 300, sort:true, hide: false}
     ,{field: 'maktx', align: 'center',title: '鐗╂枡鍚嶇О'}
diff --git a/src/main/webapp/views/agvBasDevp/basDevpWaitPakinDetail.html b/src/main/webapp/views/agvBasDevp/basDevpWaitPakinDetail.html
index 1318a19..ae20a09 100644
--- a/src/main/webapp/views/agvBasDevp/basDevpWaitPakinDetail.html
+++ b/src/main/webapp/views/agvBasDevp/basDevpWaitPakinDetail.html
@@ -70,6 +70,12 @@
                 pageSize: 'limit'
             },
             parseData: function (res) {
+                if(!res.data){
+                    return {
+                        'code': res.code,
+                        'msg': res.msg,
+                    }
+                }
                 return {
                     'code': res.code,
                     'msg': res.msg,
diff --git a/src/main/webapp/views/agvBasDevpVisualized/basDevp.html b/src/main/webapp/views/agvBasDevpVisualized/basDevp.html
index acec6aa..d39c441 100644
--- a/src/main/webapp/views/agvBasDevpVisualized/basDevp.html
+++ b/src/main/webapp/views/agvBasDevpVisualized/basDevp.html
@@ -61,15 +61,16 @@
 <!--                        <button type="button" class="layui-btn layui-btn-normal" value="{{devNo}}">鎷f枡鍏ュ簱</button>-->
 <!--                    </div>-->
 
-                    {{#if agvWrkDetl}}
+                    {{#if containerMoveOutFlag}}
                     <div style=" padding-bottom: 20px">
-
                         <button type="button" class="layui-btn layui-btn-normal" value="{{devNo}}" lay-submit lay-filter="containerMoveOut">瀹瑰櫒绂诲満</button>
-                        <button type="button" class="layui-btn layui-btn-normal" value="{{devNo}}" lay-submit lay-filter="pickIn">鎷f枡鍏ュ簱</button>
-
                     </div>
                     {{/if}}
-
+                    {{#if pickInFlag}}
+                    <div style=" padding-bottom: 20px">
+                        <button type="button" class="layui-btn layui-btn-normal" value="{{devNo}}" lay-submit lay-filter="pickIn">鎷f枡/鐩樼偣鍏ュ簱</button>
+                    </div>
+                    {{/if}}
                     <div>
                         宸ヤ綔绔欑紪鐮侊細{{devNo}} </br>
                         绔欑偣鐘舵�侊細{{locSts$}}
@@ -204,7 +205,7 @@
 
         });
 
-        //鎷f枡鍏ュ簱
+        //鎷f枡/鐩樼偣鍏ュ簱
         form.on('submit(pickIn)', function () {
             var devNoList = [];
             devNoList.push(this.value);
diff --git a/src/main/webapp/views/agvLocDetlStatis/locDetlStatis.html b/src/main/webapp/views/agvLocDetlStatis/locDetlStatis.html
new file mode 100644
index 0000000..bcfc8b6
--- /dev/null
+++ b/src/main/webapp/views/agvLocDetlStatis/locDetlStatis.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="matnr" placeholder="鐗╂枡鍙�" autocomplete="off">
+        </div>
+    </div>
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储
+        </button>
+        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆
+        </button>
+    </div>
+    <div class="layui-inline">
+        <fieldset class="layui-elem-field">
+            <legend>鎬昏鏁伴噺</legend>
+            <div class="layui-field-box" id="countNum">
+                璇风◢绛�
+            </div>
+        </fieldset>
+    </div>
+</div>
+
+<!-- 琛ㄦ牸 -->
+<div class="layui-form">
+    <table class="layui-hide" id="locDetlStatis" lay-filter="locDetlStatis"></table>
+</div>
+<script type="text/html" id="toolbar">
+
+    <div class="layui-btn-container layui-col-md1">
+        <button class="layui-btn" lay-event="exportAll" style="margin-top: -0px">瀵煎嚭鍏ㄩ儴</button>
+    </div>
+</script>
+
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/agvLocDetlStatis/locDetlStatis.js" charset="utf-8"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/emptyIn.html b/src/main/webapp/views/agvPakStore/emptyIn.html
new file mode 100644
index 0000000..bbcb3d3
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/emptyIn.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+        }
+
+        .function-area {
+            padding: 50px 80px;
+        }
+        .layui-form-label {
+            width: 120px;
+        }
+        .function-area .layui-form {
+            width: 300px;
+        }
+
+        #btn-inbound {
+            display: none;
+        }
+    </style>
+</head>
+<body>
+
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <div class="layui-form layui-form-pane">
+        <div class="layui-form-item" style="margin-bottom: 30px">
+            <label class="layui-form-label" style="">绌烘澘鍏ュ簱鍙�</label>
+            <div class="layui-input-block">
+                <select id="inSiteSelect" lay-verify="required" lay-search="">
+                    <option value="">璇烽�夋嫨绔欑偣</option>
+                </select>
+            </div>
+        </div>
+        <hr style="margin-top: 10px">
+        <div style="text-align: left; margin-top: 30px">
+            <button class="layui-btn layui-btn-lg layui-btn-radius layui-btn-normal" id="btn-inbound" lay-submit lay-filter="inbound">鍚姩鍏ュ簱</button>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/agvPakStore/emptyIn.js" charset="utf-8"></script>
+
+<script type="text/template" id="putSiteSelectTemplate">
+    {{#each data}}
+    <option value="{{this}}">{{this}}</option>
+    {{/each}}
+</script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/emptyOut.html b/src/main/webapp/views/agvPakStore/emptyOut.html
new file mode 100644
index 0000000..3ba806e
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/emptyOut.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+            padding-bottom: 20px;
+        }
+        #search-box {
+            padding: 30px 0 20px 0;
+        }
+        #search-box .layui-inline:first-child {
+            margin-left: 30px;
+        }
+        #search-box .layui-inline {
+            margin-right: 5px;
+        }
+
+        #data-search-btn {
+            margin-left: 10px;
+            display: inline-block;
+        }
+        #data-search-btn.layui-btn-container .layui-btn {
+            margin-right: 20px;
+        }
+
+        #staNoSpan {
+            text-align: center;
+            display: inline-block;
+            width: 100px;
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-form-select {
+            display: inline-block;
+            width: 150px;
+            height: 30px;
+        }
+        .layui-btn-container .layui-form-select.layui-form-selected {
+            display: inline-block;
+            width: 150px;
+        }
+        .layui-btn-container .layui-select-title input {
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-anim.layui-anim-upbit dd {
+            font-size: 13px;
+        }
+
+        #btn-outbound {
+            margin-left: 60px;
+            display: none;
+        }
+
+    </style>
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <select id="floorSelect" name="floor" lay-filter="floorSelect">
+                <option value="1">1妤�</option>
+                <option value="3">3妤�</option>
+            </select>
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="loc_no" placeholder="搴撲綅鍙�" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="row1" placeholder="鎺�" lay-verify="number"  autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="bay1" placeholder="鍒�" lay-verify="number" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="lev1" placeholder="灞�" lay-verify="number" autocomplete="off">
+        </div>
+    </div>
+
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆</button>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-form">
+        <div class="layui-btn-container">
+            <!-- 1.閫夋嫨鍑哄簱鍙� -->
+            <span id="staNoSpan">绌烘澘鍑哄簱鍙o細</span>
+            <select id="staNoSelect" lay-verify="required">
+                <option value="CS-101">CS-101</option>
+                <option value="CS-102">CS-102</option>
+            </select>
+            <!-- 2.鍚姩鍑哄簱 -->
+            <button class="layui-btn layui-btn-lg" id="btn-outbound" lay-event="outbound">鍚姩鍑哄簱</button>
+        </div>
+    </div>
+</script>
+
+<!-- 绌烘澘搴撲綅琛� -->
+<table class="layui-hide" id="locMast" lay-filter="locMast"></table>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/agvPakStore/emptyOut.js" charset="utf-8"></script>
+
+<!--鍚姩鍑哄簱-->
+<div id="outboundDiv">
+
+</div>
+
+<script type="text/template" id="takeSiteSelectTemplate">
+    {{#each data}}
+    <option value="{{this}}">{{this}}</option>
+    {{/each}}
+</script>
+</body>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/locCheckOut.html b/src/main/webapp/views/agvPakStore/locCheckOut.html
new file mode 100644
index 0000000..548e175
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/locCheckOut.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+        }
+        #staNoSpan {
+            text-align: center;
+            display: inline-block;
+            width: 100px;
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-form-select {
+            display: inline-block;
+            width: 150px;
+            height: 30px;
+        }
+        .layui-btn-container .layui-form-select.layui-form-selected {
+            display: inline-block;
+            width: 150px;
+        }
+        .layui-btn-container .layui-select-title input {
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-anim.layui-anim-upbit dd {
+            font-size: 13px;
+        }
+
+        #btn-outbound {
+            margin-left: 60px;
+        }
+
+        /*----------------------------------*/
+        .function-area {
+            padding: 20px 50px;
+        }
+        .function-btn {
+            font-size: 16px;
+            padding: 1px 2px;
+            width: 100px;
+            height: 50px;
+            border-color: #2b425b;
+            border-radius: 4px;
+            border-width: 2px;
+            background: none;
+            border-style: solid;
+            transition: 0.4s;
+            cursor: pointer;
+            letter-spacing: 1.5px;
+        }
+        .function-btn:hover {
+            background-color: #2b425b;
+            color: #fff;
+        }
+
+        #mat-query {
+            display: none;
+        }
+        #btn-outbound {
+            display: none;
+        }
+    </style>
+</head>
+<body style="padding-bottom: 30px">
+
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <button id="mat-query" class="function-btn">鎻愬彇搴撳瓨</button>
+</div>
+
+<hr>
+
+<!-- 琛ㄦ牸 -->
+<div style="padding-bottom: 5px; margin-bottom: 45px">
+
+    <!-- 澶撮儴 -->
+    <script type="text/html" id="toolbar">
+        <div class="layui-form">
+            <div class="layui-btn-container">
+                <!-- 1.閫夋嫨鍑哄簱鍙� -->
+                <span id="staNoSpan">鐩樼偣绔欙細</span>
+                <select id="staNoSelect" lay-verify="required">
+                    <option value="">璇烽�夋嫨绔欑偣</option>
+                </select>
+                <!-- 2.鍚姩鍑哄簱 -->
+                <button class="layui-btn layui-btn-lg" id="btn-outbound" lay-event="outbound">鐩樼偣鍑哄簱</button>
+            </div>
+        </div>
+    </script>
+
+    <!-- 琛� -->
+    <script type="text/html" id="operate">
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">绉婚櫎</a>
+    </script>
+
+    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+</div>
+
+<script type="text/template" id="takeSiteSelectTemplate">
+    {{#each data}}
+    <option value="{{this}}">{{this}}</option>
+    {{/each}}
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/agvPakStore/locCheckOut.js" charset="utf-8"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/locDetlCheckQuery.html b/src/main/webapp/views/agvPakStore/locDetlCheckQuery.html
new file mode 100644
index 0000000..faf54f8
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/locDetlCheckQuery.html
@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        body {
+            padding: 0 20px;
+        }
+        .layui-table-box {
+            border-right: 1px solid #9F9F9F;
+            border-left: 1px solid #9F9F9F;
+        }
+
+        #search-box {
+            padding: 30px 0 20px 0;
+        }
+        #search-box .layui-inline:first-child {
+            margin-left: 30px;
+        }
+        #search-box .layui-inline {
+            margin-right: 5px;
+        }
+
+        #data-search-btn {
+            margin-left: 10px;
+            display: inline-block;
+        }
+        #data-search-btn.layui-btn-container .layui-btn {
+            margin-right: 20px;
+        }
+
+    </style>
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<fieldset class="layui-elem-field site-demo-button" style="margin: 20px;">
+    <legend>鎼滅储鏍�</legend>
+    <!-- 鎼滅储鏍� -->
+    <div id="search-box" class="layui-form layui-card-header">
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="loc_no" placeholder="搴撲綅鍙�" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="matnr" placeholder="鐗╂枡鍙�"  autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="maktx" placeholder="鐗╂枡鎻忚堪" autocomplete="off">
+            </div>
+        </div>
+        <!-- 鏃ユ湡鑼冨洿 -->
+        <div class="layui-inline" style="width: 300px">
+            <div class="layui-input-inline">
+                <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+            </div>
+        </div>
+        <!-- 寰呮坊鍔� -->
+        <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+            <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+            <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆</button>
+        </div>
+    </div>
+</fieldset>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn" id="btn-confirm" lay-event="confirm" style="">鎻愬彇</button>
+    </div>
+</script>
+
+<div class="layui-form">
+    <table class="layui-hide" id="stockOut" lay-filter="stockOut"></table>
+</div>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+
+</body>
+<script>
+
+    function getCol() {
+        let cols = [
+            {type: 'checkbox', merge: ['locNo']}
+            ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�', merge: true, width:150, style: 'font-weight: bold'}
+        ];
+        cols.push.apply(cols, detlCols);
+        cols.push({field: 'modiUser$', align: 'center',title: '淇敼浜哄憳', hide: true}
+            ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'})
+        return cols;
+    }
+
+    layui.config({
+        base: baseUrl + "/static/layui/lay/modules/"
+    }).use(['table','laydate', 'form', 'admin', 'tableMerge'], function() {
+        var table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var layDate = layui.laydate;
+        var form = layui.form;
+        var admin = layui.admin;
+        var tableMerge = layui.tableMerge;
+
+        // 鏁版嵁娓叉煋
+        locDetlTableIns = table.render({
+            elem: '#stockOut',
+            headers: {token: localStorage.getItem('token')},
+            url: baseUrl+'/agv/stock/out/list/auth',
+            page: true,
+            limit: 20,
+            limits: [20, 50, 100, 200, 500],
+            even: true,
+            toolbar: '#toolbar',
+            cellMinWidth: 50,
+            cols: [getCol()],
+            request: {
+                pageName: 'curr',
+                pageSize: 'limit'
+            },
+            parseData: function (res) {
+                return {
+                    'code': res.code,
+                    'msg': res.msg,
+                    'count': res.data.total,
+                    'data': res.data.records
+                }
+            },
+            response: {
+                statusCode: 200
+            },
+            done: function(res, curr, count) {
+                tableMerge.render(this);
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+            }
+        });
+
+        // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+        table.on('toolbar(stockOut)', function (obj) {
+            var checkStatus = table.checkStatus(obj.config.id);
+            var data = checkStatus.data;
+            switch(obj.event) {
+                case 'confirm':
+                    if (data.length === 0){
+                        layer.msg("璇烽�夋嫨鏁版嵁", {icon: 2});
+                        return;
+                    }
+                    //鍒ゆ柇鏄惁1妤煎拰3妤煎簱浣嶅悓鏃惰鍕鹃��
+                    var floor = data[0].locNo.split('@')[1];
+                    var flag = true;
+                    let locNos = [];
+                    data.forEach(function(elem) {
+                        if(floor != elem.locNo.split('@')[1]){
+                            flag = false;
+                        }
+                        locNos.push(elem.locNo);
+                    });
+                    if(!flag){
+                        layer.msg("褰撳墠閫夋嫨鐨勫簱浣嶅彿瀛樺湪涓嶅悓妤煎眰锛岃閫夋嫨鍚屼竴妤煎眰涓嬬殑搴撲綅", {icon: 2});
+                        return;
+                    }
+
+                    $.ajax({
+                        url: baseUrl+"/agv/locDetl/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: {locNos:locNos},
+                        method: 'POST',
+                        async: false,
+                        success: function (res) {
+                            if (res.code === 200) {
+                                data = res.data;
+                            } else if (res.code === 403) {
+                                top.location.href = baseUrl + "/";
+                            } else {
+                                layer.msg(res.msg)
+                            }
+                        }
+                    })
+                    flag = parent.addTableData(data,floor);
+                    if(flag){
+                        parent.addStationData(floor);
+                    }else{
+                        layer.msg("褰撳墠閫夋嫨鐨勫簱浣嶅彿瀛樺湪涓嶅悓妤煎眰锛岃閫夋嫨鍚屼竴妤煎眰涓嬬殑搴撲綅", {icon: 2});
+                        return;
+                    }
+                    break;
+            }
+        });
+
+        // 鎼滅储鏍忔悳绱簨浠�
+        form.on('submit(search)', function (data) {
+            tableReload();
+        });
+
+        layDate.render({
+            elem: '.layui-laydate-range'
+            ,type: 'datetime'
+            ,range: true
+        });
+    })
+
+    function tableReload() {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        locDetlTableIns.reload({
+            where: searchData
+        });
+    }
+
+</script>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/locDetlQuery.html b/src/main/webapp/views/agvPakStore/locDetlQuery.html
new file mode 100644
index 0000000..c23ef35
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/locDetlQuery.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        body {
+        }
+        .layui-table-box {
+            border-right: 1px solid #9F9F9F;
+            border-left: 1px solid #9F9F9F;
+        }
+
+        #search-box {
+            padding: 30px 0 20px 0;
+        }
+        #search-box .layui-inline:first-child {
+            margin-left: 30px;
+        }
+        #search-box .layui-inline {
+            margin-right: 5px;
+        }
+
+        #data-search-btn {
+            margin-left: 10px;
+            display: inline-block;
+        }
+        #data-search-btn.layui-btn-container .layui-btn {
+            margin-right: 20px;
+        }
+    </style>
+</head>
+<body>
+<div style="padding: 25px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">
+    <span style="font-size: large; font-weight: bold">鎻愬彇搴撳瓨鍟嗗搧</span>
+</div>
+<!-- 鎼滅储鏍� -->
+<fieldset class="layui-elem-field site-demo-button" style="margin: 20px;">
+    <legend>鎼滅储鏍�</legend>
+    <!-- 鎼滅储鏍� -->
+    <div id="search-box" class="layui-form layui-card-header">
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="loc_no" placeholder="搴撲綅鍙�" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="matnr" placeholder="鐗╂枡鍙�"  autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline">
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="maktx" placeholder="鐗╂枡鎻忚堪" autocomplete="off">
+            </div>
+        </div>
+        <!-- 鏃ユ湡鑼冨洿 -->
+        <div class="layui-inline" style="width: 300px">
+            <div class="layui-input-inline">
+                <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+            </div>
+        </div>
+        <!-- 寰呮坊鍔� -->
+        <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+            <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+        </div>
+    </div>
+</fieldset>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn" id="btn-confirm" lay-event="confirm" style="">鎻愬彇</button>
+    </div>
+</script>
+
+<div class="layui-form">
+    <table class="layui-hide" id="stockOut" lay-filter="stockOut"></table>
+</div>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+
+</body>
+<script>
+
+    function getCol() {
+        var cols = [
+            {type: 'checkbox'}
+            ,{field: 'locNo$', align: 'center',title: '搴撲綅鍙�'}
+        ];
+        cols.push.apply(cols, detlCols);
+        cols.push({field: 'modiUser$', align: 'center',title: '淇敼浜哄憳', hide: true}
+            ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'})
+        return cols;
+    }
+
+    layui.config({
+        base: baseUrl + "/static/layui/lay/modules/"
+    }).use(['table','laydate', 'form', 'admin'], function() {
+        var table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var layDate = layui.laydate;
+        var form = layui.form;
+        var admin = layui.admin;
+
+        // 鏁版嵁娓叉煋
+        locDetlTableIns = table.render({
+            elem: '#stockOut',
+            headers: {token: localStorage.getItem('token')},
+            url: baseUrl+'/stock/out/list/auth',
+            page: true,
+            limits: [16, 30, 50, 100, 200, 500],
+            limit: 16,
+            even: true,
+            toolbar: '#toolbar',
+            cellMinWidth: 50,
+            cols: [getCol()],
+            request: {
+                pageName: 'curr',
+                pageSize: 'limit'
+            },
+            parseData: function (res) {
+                return {
+                    'code': res.code,
+                    'msg': res.msg,
+                    'count': res.data.total,
+                    'data': res.data.records
+                }
+            },
+            response: {
+                statusCode: 200
+            },
+            done: function(res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl+"/";
+                }
+            }
+        });
+
+        // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+        table.on('toolbar(stockOut)', function (obj) {
+            var checkStatus = table.checkStatus(obj.config.id);
+            var data = checkStatus.data;
+            switch(obj.event) {
+                case 'confirm':
+                    if (data.length === 0){
+                        layer.msg("璇烽�夋嫨鏁版嵁");
+                        return;
+                    }
+                    parent.addTableData(data);
+                    break;
+            }
+        });
+
+        // 鎼滅储鏍忔悳绱簨浠�
+        form.on('submit(search)', function (data) {
+            tableReload();
+        });
+
+        layDate.render({
+            elem: '.layui-laydate-range'
+            ,type: 'datetime'
+            ,range: true
+        });
+    })
+
+    function tableReload() {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        locDetlTableIns.reload({
+            where: searchData,
+        });
+    }
+</script>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/locMove.html b/src/main/webapp/views/agvPakStore/locMove.html
new file mode 100644
index 0000000..d71c086
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/locMove.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+            padding-bottom: 20px;
+        }
+        .function-area {
+            padding: 50px 80px 50px 70px;
+            display: inline-block;
+        }
+        .cool-auto-complete-div {
+            height: 40px;
+            border-radius: 5px;
+            border: 1px solid #b8b8b8;
+            color: #888;
+            box-shadow: inset 0 1px 2px #ECECEC;
+            -moz-box-shadow: inset 0 1px 2px #ECECEC;
+            -webkit-box-shadow: inset 0 1px 2px #ECECEC;
+        }
+
+        .function-btn {
+            margin-left: 15px;
+            background: #E27575;
+            border: none;
+            padding: 10px 25px 10px 25px;
+            color: #FFF;
+            box-shadow: 1px 1px 5px #B6B6B6;
+            border-radius: 3px;
+            text-shadow: 1px 1px 1px #9E3F3F;
+            cursor: pointer;
+        }
+        .function-btn:hover {
+            opacity: 0.8
+        }
+
+        .layui-layer-lan .layui-layer-btn a {
+            background: #4476A7;
+            border-color: #4476A7;
+            color: #fff;
+        }
+        .layui-layer-lan .layui-layer-btn .layui-layer-btn1 {
+            background: #fff;
+            color: #333;
+            border-color: #E9E7E7;
+        }
+        .layui-layer-lan .layui-layer-btn .layui-layer-btn1:hover {
+            background-color: #f7f7f7;
+        }
+
+        #loc-move-btn {
+            display: none;
+        }
+    </style>
+</head>
+<body>
+
+<div class="function-area layui-form">
+    <!-- 婧愬簱浣� -->
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input id="sourceLocNo" class="layui-input" onkeyup="getLoc(this)" type="text" placeholder="婧愬簱浣�" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-form-mid" style="float: none; display: inline-block; margin-left: 10px">-</div>
+    <div class="layui-input-inline">
+        <select id="targetLocNo" name="modules" lay-verify="required" lay-search="">
+            <option value="">鐩爣绌哄簱浣�</option>
+        </select>
+    </div>
+    <button id="loc-move-btn" class="function-btn" onclick="locMove()" style="background: #4476A7;text-shadow: inherit;height: 45px;font-size: 15px;margin-left: 20px">搴撲綅绉昏浆</button>
+</div>
+
+<hr>
+
+<table class="layui-table" id="locMatCode" lay-filter="locMatCode"></table>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/agvPakStore/locMove.js" charset="utf-8"></script>
+
+<script type="text/template" id="emptyLocStock">
+    <option value="">璇疯緭鍏ュ苟閫夋嫨</option>
+    {{#each data}}
+    <option value="{{this}}">{{this}}</option>
+    {{/each}}
+</script>
+
+<div id="locMoveWindow" style="height: 100%;display: none">
+    <div style="float: left;width: 35%;height: 100%">
+        <div>
+            <span style="display: block">婧愬簱浣�</span>
+            <input type="text">
+        </div>
+    </div>
+    <div style="float: left;width: 30%;height: 100%;position: relative;">
+        <span style="position:absolute;top: 45%;left: 50%;color: #666;transform: translateX(-50%);;display: block">绉昏浆鑷�</span>
+        <hr style="position: absolute; top: 50%;width: 100%;border: none;height: 1px;background-color: #666">
+
+    </div>
+    <div style="float: right;width: 35%;height: 100%">
+        <div>
+            <span style="display: block">鐩爣搴撲綅</span>
+            <input type="text">
+        </div>
+    </div>
+</div>
+</body>
+</html>
diff --git a/src/main/webapp/views/agvPakStore/matQuery.html b/src/main/webapp/views/agvPakStore/matQuery.html
new file mode 100644
index 0000000..433d45c
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/matQuery.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        body {
+            /*overflow: hidden;*/
+        }
+        .layui-table-box {
+            border-right: 1px solid #9F9F9F;
+            border-left: 1px solid #9F9F9F;
+        }
+    </style>
+</head>
+<body>
+<div style="padding: 25px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">
+    <span style="font-size: large; font-weight: bold">閫夋嫨鍟嗗搧</span>
+</div>
+<div class="layui-card" style="padding: 0 20px; overflow: scroll;">
+    <fieldset class="layui-elem-field site-demo-button" style="margin: 20px;">
+        <legend>鎼滅储鏍�</legend>
+        <div id="search-box" class="layui-form layui-card-header">
+            <div class="layui-inline">
+                <div class="layui-input-inline">
+                    <input class="layui-input" type="text" name="matnr" placeholder="鐗╂枡鍙�" autocomplete="off">
+                </div>
+            </div>
+            <div class="layui-inline">
+                <div class="layui-input-inline">
+                    <input class="layui-input" type="text" name="maktx" placeholder="鐗╂枡鍙�" autocomplete="off">
+                </div>
+            </div>
+            <!-- 鏃ユ湡鑼冨洿 -->
+            <div class="layui-inline" style="width: 300px">
+                <div class="layui-input-inline">
+                    <input class="layui-input layui-laydate-range" name="modi_time" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                </div>
+            </div>
+            <div class="layui-inline">
+                <div class="layui-input-inline">
+                    <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+                </div>
+            </div>
+            <!-- 寰呮坊鍔� -->
+            <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+                <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+            </div>
+        </div>
+    </fieldset>
+
+    <div class="layui-form">
+        <table class="layui-hide" id="mat" lay-filter="mat"></table>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn" id="btn-confirm" lay-event="confirm" style="">鎻愬彇</button>
+    </div>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+
+</body>
+<script>
+    function getCol() {
+        let cols = [
+            {type: 'checkbox', fixed: 'left'}
+        ];
+        cols.push.apply(cols, matCols);
+        cols.push(
+            {field: 'modiUser$', align: 'center',title: '淇敼浜哄憳', hide: true},
+            {field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'}
+        )
+        return cols;
+    }
+
+    layui.config({
+        base: baseUrl + "/static/layui/lay/modules/"
+    }).use(['table','laydate', 'form', 'admin'], function() {
+        var table = layui.table;
+        var $ = layui.jquery;
+        var layer = layui.layer;
+        var layDate = layui.laydate;
+        var form = layui.form;
+        var admin = layui.admin;
+
+        // 鐗╂枡鏌ヨ鏁版嵁琛�
+        matQueryTable = table.render({
+            elem: '#mat',
+            headers: {token: localStorage.getItem('token')},
+            url: baseUrl + '/mat/list/auth',
+            page: true,
+            limit: 7,
+            limits: [7, 10, 30,50,100],
+            even: true,
+            cellMinWidth: 50,
+            toolbar: '#toolbar',
+            cols: [getCol()],
+            request: {
+                pageName: 'curr',
+                pageSize: 'limit'
+            },
+            parseData: function (res) {
+                return {
+                    'code': res.code,
+                    'msg': res.msg,
+                    'count': res.data.total,
+                    'data': res.data.records
+                }
+            },
+            response: {
+                statusCode: 200
+            },
+            done: function (res, curr, count) {
+                if (res.code === 403) {
+                    top.location.href = baseUrl + "/";
+                }
+            }
+        });
+
+        // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+        table.on('toolbar(mat)', function (obj) {
+            let checkStatus = table.checkStatus(obj.config.id);
+            let data = checkStatus.data;
+            switch(obj.event) {
+                case 'confirm':
+                    if (data.length === 0){
+                        layer.msg("璇烽�夋嫨鏁版嵁", {icon: 2});
+                        return;
+                    }
+                    parent.addTableData(data);
+                    break;
+            }
+        });
+
+        // 鎼滅储鏍忔悳绱簨浠�
+        form.on('submit(search)', function (data) {
+            tableReload();
+        });
+
+        layDate.render({
+            elem: '.layui-laydate-range'
+            ,type: 'datetime'
+            ,range: true
+        });
+    })
+
+    function tableReload() {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        matQueryTable.reload({
+            where: searchData
+        });
+    }
+
+</script>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/pakStore.html b/src/main/webapp/views/agvPakStore/pakStore.html
new file mode 100644
index 0000000..820bbee
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/pakStore.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+        }
+
+        .function-area {
+            padding: 20px 50px;
+        }
+        .function-btn {
+            font-size: 16px;
+            padding: 1px 2px;
+            width: 100px;
+            height: 50px;
+            border-color: #2b425b;
+            border-radius: 4px;
+            border-width: 2px;
+            background: none;
+            border-style: solid;
+            transition: 0.4s;
+            cursor: pointer;
+            letter-spacing: 1.5px;
+        }
+        .function-btn:hover {
+            background-color: #2b425b;
+            color: #fff;
+        }
+
+        .layui-layer-page .layui-layer-content {
+            position: relative;
+            overflow: visible !important;
+        }
+
+        #mat-query {
+            display: none;
+        }
+
+        #staNoSpan {
+            text-align: center;
+            display: inline-block;
+            width: 100px;
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-form-select {
+            display: inline-block;
+            width: 150px;
+            height: 30px;
+        }
+        .layui-btn-container .layui-form-select.layui-form-selected {
+            display: inline-block;
+            width: 150px;
+        }
+        .layui-btn-container .layui-select-title input {
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-anim.layui-anim-upbit dd {
+            font-size: 13px;
+        }
+
+        #btn-comb {
+            margin-left: 60px;
+            display: none;
+        }
+    </style>
+</head>
+<body>
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <button id="mat-query" class="function-btn">鎻愬彇鍟嗗搧</button>
+</div>
+
+<hr>
+
+<!-- 琛ㄦ牸 -->
+<div style="padding-bottom: 5px; margin-bottom: 45px">
+
+    <!-- 澶撮儴 -->
+    <script type="text/html" id="toolbar">
+        <div class="layui-form">
+            <div class="layui-btn-container">
+                <!-- 1.閫夋嫨鍏ュ簱鍙� -->
+                <span id="staNoSpan">鍏ュ簱鍙o細</span>
+                <select id="putSiteSelect" lay-verify="required">
+                    <option value="">璇烽�夋嫨绔欑偣</option>
+                </select>
+                <!-- 2.鍚姩鍑哄簱 -->
+                <button class="layui-btn layui-btn-normal layui-btn-lg" id="btn-comb" lay-event="comb" style="">鍚姩鍏ュ簱</button>
+            </div>
+        </div>
+    </script>
+
+    <!-- 琛� -->
+    <script type="text/html" id="operate">
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">绉婚櫎</a>
+    </script>
+
+    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+</div>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/pakStore/pakStore.js" charset="utf-8"></script>
+
+<script type="text/template" id="putSiteSelectTemplate">
+    {{#each data}}
+        <option value="{{this}}">{{this}}</option>
+    {{/each}}
+</script>
+</body>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/stockAdjust.html b/src/main/webapp/views/agvPakStore/stockAdjust.html
new file mode 100644
index 0000000..bd758e9
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/stockAdjust.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+        }
+
+        /* search */
+        .layui-card-header {
+            border-bottom: none;
+        }
+        #search-box {
+            padding: 30px 0 10px 0;
+        }
+        #search-box .layui-inline:first-child {
+            margin-left: 30px;
+        }
+        #search-box .layui-inline {
+            margin-right: 5px;
+        }
+
+        #data-search-btn {
+            margin-left: 10px;
+            display: inline-block;
+        }
+        #data-search-btn.layui-btn-container .layui-btn {
+            margin-right: 20px;
+        }
+
+        /* add */
+        .function-area {
+            padding: 15px 0 20px 40px;
+        }
+        .function-btn {
+            font-size: 16px;
+            padding: 1px 1px 1px 1px;
+            width: 120px;
+            height: 40px;
+            border-color: #2b425b;
+            border-radius: 4px;
+            border-width: 1px;
+            background: none;
+            border-style: solid;
+            transition: 0.4s;
+            cursor: pointer;
+        }
+        .function-btn:hover {
+            background-color: #2b425b;
+            color: #fff;
+        }
+
+        #mat-query {
+            display: none;
+        }
+        #btn-adjust {
+            display: none;
+        }
+    </style>
+</head>
+<body style="padding-bottom: 30px">
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input id="searchLocNo" class="layui-input" type="text" name="loc_no" placeholder="搴撲綅鍙�" autocomplete="off"  style="height: 45px;border-color: #b8b8b8">
+        </div>
+    </div>
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">妫�绱�</button>
+        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆</button>
+    </div>
+    <!-- 搴撲綅鎻愮ず -->
+    <div style="display: inline-block; font-size: 20px;font-weight: 300">
+        <div class="not-retrieve" style="color: #ff0000;font-family: '榛戜綋';">
+            璇峰厛妫�绱㈠簱浣�
+        </div>
+        <div class="retrieve" style="display: none;color: #0097ff;font-family: '榛戜綋';">
+            褰撳墠妫�绱㈠簱浣�:&nbsp; <span id="locMsg" style=""></span>
+        </div>
+
+    </div>
+</div>
+
+<hr>
+
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <button id="mat-query" class="function-btn">鏂板搴撳瓨</button>
+</div>
+
+<!-- 澶撮儴 -->
+<script type="text/html" id="toolbar">
+    <button class="layui-btn layui-btn-lg" id="btn-adjust" lay-event="adjust" style="">璋冩暣搴撳瓨</button>
+</script>
+
+<!-- 琛� -->
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">绉婚櫎</a>
+</script>
+
+<!-- 琛ㄦ牸 -->
+<table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/pakStore/stockAdjust.js" charset="utf-8"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/agvPakStore/stockOut.html b/src/main/webapp/views/agvPakStore/stockOut.html
new file mode 100644
index 0000000..3e02f19
--- /dev/null
+++ b/src/main/webapp/views/agvPakStore/stockOut.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+    <style>
+        html {
+            height: 100%;
+            padding: 10px;
+            background-color: #f1f1f1;
+            box-sizing: border-box;
+        }
+        body {
+            background-color: #fff;
+            border-radius: 5px;
+            box-shadow: 0 0 3px rgba(0,0,0,.3);
+            padding-bottom: 20px;
+        }
+
+        #staNoSpan {
+            text-align: center;
+            display: inline-block;
+            width: 100px;
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-form-select {
+            display: inline-block;
+            width: 150px;
+            height: 30px;
+        }
+        .layui-btn-container .layui-form-select.layui-form-selected {
+            display: inline-block;
+            width: 150px;
+        }
+        .layui-btn-container .layui-select-title input {
+            font-size: 13px;
+        }
+        .layui-btn-container .layui-anim.layui-anim-upbit dd {
+            font-size: 13px;
+        }
+
+        #btn-outbound {
+            margin-left: 60px;
+            display: none;
+        }
+
+        /*----------------------------------*/
+        .function-area {
+            padding: 20px 50px;
+        }
+        .function-btn {
+            font-size: 16px;
+            padding: 1px 2px;
+            width: 100px;
+            height: 50px;
+            border-color: #2b425b;
+            border-radius: 4px;
+            border-width: 2px;
+            background: none;
+            border-style: solid;
+            transition: 0.4s;
+            cursor: pointer;
+            letter-spacing: 1.5px;
+        }
+        .function-btn:hover {
+            background-color: #2b425b;
+            color: #fff;
+        }
+
+        #mat-query {
+            display: none;
+        }
+    </style>
+</head>
+<body>
+
+<!-- 鍔熻兘鍖� -->
+<div class="function-area">
+    <button id="mat-query" class="function-btn">鎻愬彇搴撳瓨</button>
+</div>
+
+<hr>
+
+<!-- 琛ㄦ牸 -->
+<div style="padding-bottom: 5px; margin-bottom: 45px">
+
+    <!-- 澶撮儴 -->
+    <script type="text/html" id="toolbar">
+        <div class="layui-form">
+            <div class="layui-btn-container">
+                <!-- 1.閫夋嫨鍑哄簱鍙� -->
+                <span id="staNoSpan">鍑哄簱鍙o細</span>
+                <select id="staNoSelect" lay-verify="required">
+                    <option value="">璇烽�夋嫨绔欑偣</option>
+                </select>
+                <!-- 2.鍚姩鍑哄簱 -->
+                <button class="layui-btn layui-btn-lg" id="btn-outbound" lay-event="outbound">鍚姩鍑哄簱</button>
+            </div>
+        </div>
+    </script>
+
+    <!-- 琛� -->
+    <script type="text/html" id="operate">
+        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">绉婚櫎</a>
+    </script>
+
+    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
+</div>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+<script type="text/javascript" src="../../static/js/pakStore/stockOut.js" charset="utf-8"></script>
+
+<script type="text/template" id="takeSiteSelectTemplate">
+    {{#each data}}
+    <option value="{{siteId}}">{{desc}}</option>
+    {{/each}}
+</script>
+</body>
+</html>
+
diff --git a/src/main/webapp/views/allLocDetl/locDetl.html b/src/main/webapp/views/allLocDetl/locDetl.html
new file mode 100644
index 0000000..7ad2afa
--- /dev/null
+++ b/src/main/webapp/views/allLocDetl/locDetl.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<body>
+
+<!-- 鎼滅储鏍� -->
+<div id="search-box" class="layui-form layui-card-header">
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="loc_no" placeholder="搴撲綅鍙�" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="zpallet" placeholder="鎵樼洏鐮�" autocomplete="off">
+        </div>
+    </div>
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="matnr" placeholder="鐗╂枡鍙�" autocomplete="off">
+        </div>
+    </div>
+<!--    <div class="layui-inline">-->
+<!--        <div class="layui-input-inline">-->
+<!--            <input class="layui-input" type="text" name="row" placeholder="鎺掓暟" autocomplete="off">-->
+<!--        </div>-->
+<!--    </div>-->
+    <div class="layui-inline">
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="condition" placeholder="璇疯緭鍏�" autocomplete="off">
+        </div>
+
+    </div>
+
+    <!-- 寰呮坊鍔� -->
+    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
+        <button id="search" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="search">鎼滅储</button>
+        <button id="reset" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="reset">閲嶇疆</button>
+<!--        <button id="unreason" class="layui-btn layui-btn-primary layui-btn-radius" lay-submit lay-filter="unreason">鏌ョ湅寮傚父鏁版嵁</button>-->
+    </div>
+
+</div>
+
+<!-- 琛ㄦ牸 -->
+<div class="layui-form">
+    <table class="layui-hide" id="locDetl" lay-filter="locDetl"></table>
+</div>
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="margin-top: 10px">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">璇︽儏</a>
+</script>
+
+<script type="text/html" id="stockFreezeTpl">
+    <input type="checkbox" name="stockFreeze" value="{{d.stockFreeze}}" lay-skin="switch" lay-text="姝e父|鍐荤粨" lay-filter="stockFreezeSwitch" {{ d.stockFreeze === 1 ? 'checked' : '' }}>
+</script>
+
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/allLocDetl/locDetl.js" charset="utf-8"></script>
+
+<iframe id="detail-iframe" scrolling="auto" style="display:none;"></iframe>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/allLocDetl/locDetl_detail.html b/src/main/webapp/views/allLocDetl/locDetl_detail.html
new file mode 100644
index 0000000..7684ede
--- /dev/null
+++ b/src/main/webapp/views/allLocDetl/locDetl_detail.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title></title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/common.css" media="all">
+</head>
+<body>
+
+<!-- 璇︽儏 -->
+<div id="data-detail" class="layer_self_wrap">
+    <form id="detail" class="layui-form">
+    <!--
+        <div class="layui-inline"  style="display: none">
+            <label class="layui-form-label"><span class="not-null">*</span>缂栥��銆�鍙凤細</label>
+            <div class="layui-input-inline">
+                <input id="id" class="layui-input" type="text" placeholder="缂栧彿">
+            </div>
+        </div>
+    -->
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label"><span class="not-null">*</span>搴� 浣� 鍙凤細</label>
+            <div class="layui-input-inline cool-auto-complete">
+                <input id="locNo" class="layui-input" type="text" onkeyup="check(this.id, 'locDetl')" lay-verify="required"  style="display: none">
+                <input id="locNo$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏�..." onfocus=this.blur()>
+                <div class="cool-auto-complete-window">
+                    <input class="cool-auto-complete-window-input" data-key="locMastQueryBylocNo" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                    <select class="cool-auto-complete-window-select" data-key="locMastQueryBylocNoSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                    </select>
+                </div>
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label"><span class="not-null">*</span>鐗┿��銆�鏂欙細</label>
+            <div class="layui-input-inline">
+                <input id="matnr" class="layui-input" type="text" onkeyup="check(this.id, 'locDetl')" lay-verify="required" >
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">浠� 搴� 鍙凤細</label>
+            <div class="layui-input-inline">
+                <input id="lgnum" class="layui-input" type="text" >
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label" style="font-size: x-small">杞偍璇锋眰缂栧彿锛�</label>
+            <div class="layui-input-inline">
+                <input id="tbnum" class="layui-input" type="text" lay-verify="number" >
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">琛� 椤� 鐩細</label>
+            <div class="layui-input-inline">
+                <input id="tbpos" class="layui-input" type="text" lay-verify="number" >
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label" style="font-size: x-small">鐗╂枡鏍囩ID锛�</label>
+            <div class="layui-input-inline">
+                <input id="zmatid" class="layui-input" type="text" >
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">鐗╂枡鎻忚堪锛�</label>
+            <div class="layui-input-inline">
+                <input id="maktx" class="layui-input" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">宸ャ��銆�鍘傦細</label>
+            <div class="layui-input-inline">
+                <input id="werks" class="layui-input" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">鏁般��銆�閲忥細</label>
+            <div class="layui-input-inline">
+                <input id="anfme" class="layui-input" type="text" lay-verify="number" >
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">鍗曘��銆�浣嶏細</label>
+            <div class="layui-input-inline">
+                <input id="altme" class="layui-input" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">鎵樼洏鏉$爜锛�</label>
+            <div class="layui-input-inline">
+                <input id="zpallet" class="layui-input" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">鐢ㄦ埛ID锛�</label>
+            <div class="layui-input-inline">
+                <input id="bname" class="layui-input" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;">
+            <label class="layui-form-label">澶囥��銆�娉細</label>
+            <div class="layui-input-inline">
+                <input id="memo" class="layui-input" type="text">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">淇敼浜哄憳锛�</label>
+            <div class="layui-input-inline cool-auto-complete">
+                <input id="modiUser" class="layui-input" type="text" lay-verify="number"  style="display: none">
+                <input id="modiUser$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏�..." onfocus=this.blur()>
+                <div class="cool-auto-complete-window">
+                    <input class="cool-auto-complete-window-input" data-key="userQueryBymodiUser" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                    <select class="cool-auto-complete-window-select" data-key="userQueryBymodiUserSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                    </select>
+                </div>
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">淇敼鏃堕棿锛�</label>
+            <div class="layui-input-inline">
+                <input id="modiTime$" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">鍒� 寤� 鑰咃細</label>
+            <div class="layui-input-inline cool-auto-complete">
+                <input id="appeUser" class="layui-input" type="text" lay-verify="number"  style="display: none">
+                <input id="appeUser$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏�..." onfocus=this.blur()>
+                <div class="cool-auto-complete-window">
+                    <input class="cool-auto-complete-window-input" data-key="userQueryByappeUser" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                    <select class="cool-auto-complete-window-select" data-key="userQueryByappeUserSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                    </select>
+                </div>
+            </div>
+        </div>
+        <div class="layui-inline"  style="width:31%;display: none">
+            <label class="layui-form-label">娣诲姞鏃堕棿锛�</label>
+            <div class="layui-input-inline">
+                <input id="appeTime$" class="layui-input" type="text" autocomplete="off">
+            </div>
+        </div>
+
+
+        <hr class="layui-bg-gray">
+
+        <div id="data-detail-btn" class="layui-btn-container layui-form-item">
+            <div id="data-detail-submit-save" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="save">淇濆瓨</div>
+            <div id="data-detail-submit-edit" type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="edit">淇敼</div>
+            <div id="data-detail-close" type="button" class="layui-btn" lay-submit lay-filter="close">鍏抽棴</div>
+        </div>
+
+        <div id="prompt">
+            娓╅Θ鎻愮ず锛氳浠旂粏濉啓鐩稿叧淇℃伅锛�<span class="extrude"><span class="not-null">*</span> 涓哄繀濉�夐」銆�</span>
+        </div>
+    </form>
+</div>
+</body>
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/locDetl/locDetl.js" charset="utf-8"></script>
+</html>
+
diff --git a/src/main/webapp/views/home/agvMap.html b/src/main/webapp/views/home/agvMap.html
new file mode 100644
index 0000000..e3c0e7a
--- /dev/null
+++ b/src/main/webapp/views/home/agvMap.html
@@ -0,0 +1,1069 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>搴撲綅鍦板浘</title>
+    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
+    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
+    <link rel="stylesheet" href="../../static/css/element.css">
+    <script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../../static/layui/layui.js"></script>
+    <script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
+    <script type="text/javascript" src="../../static/js/common.js"></script>
+    <script type="text/javascript" src="../../static/js/vue.min.js"></script>
+    <script type="text/javascript" src="../../static/js/element.js"></script>
+    <style>
+        .pointContainer {
+            display: flex;
+            justify-content: center;
+            margin-top: 1px;
+        }
+
+        .pointBox {
+            background: #bababa;
+            width: 40px;
+            height: 40px;
+            margin-right: 1px;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            font-size: 14px;
+            user-select: none;
+            color: #fff;
+        }
+
+        .pointBox:hover{
+            background: #00ff7f;
+        }
+
+        .pointBoxEmpty {
+            background: #c2c934;
+        }
+
+        .pointBoxOut {
+            background: #f1aa19;
+        }
+
+        .pointBoxOutYy {
+            background: #618593;
+        }
+
+        .pointBoxInYy {
+            background: #fa736f;
+        }
+
+        .pointBoxGreen {
+            background: #00ff7f;
+        }
+
+        .pointBoxBlue {
+            background: #55aaff;
+        }
+
+        .pointBoxRed {
+            background: #ff0000;
+        }
+
+        .pointBoxStart {
+            background: #ffaa00;
+        }
+
+        .pointBoxEnd {
+            background: #ff55ff;
+        }
+
+        .pointBoxStation {
+            background: #ffff00;
+        }
+
+        .chargeStation {
+            background: #ffaa7f;
+        }
+
+        .pointBoxDefault {
+            background: #86779d;
+        }
+
+        .pointBoxSelected {
+            background: #00ff7f !important;
+        }
+
+        .pointBoxSearch {
+            background: #9900ff;
+        }
+
+        .crnLine{
+            width: auto;
+            height: 2px;
+            margin: 10px 0;
+            background: #000;
+            position: relative;
+        }
+
+        .popBox {
+            position: absolute;
+        }
+
+        /*鍗$墖鏍峰紡start*/
+        .apple-card {
+            width: 190px;
+            height: 254px;
+            margin: 0 auto;
+            background-color: #011522;
+            border-radius: 8px;
+            z-index: 1;
+            animation:fadeInOut 0.5s 1;
+        }
+
+        .apple-card .tools {
+            display: flex;
+            align-items: center;
+            padding: 9px;
+        }
+
+        .apple-card .circle {
+            padding: 0 4px;
+        }
+
+        .apple-card .box {
+            display: inline-block;
+            align-items: center;
+            width: 10px;
+            height: 10px;
+            padding: 1px;
+            border-radius: 50%;
+        }
+
+        .apple-card .red {
+            background-color: #ff605c;
+            position: relative;
+        }
+
+        .apple-card .red:hover{
+            background-color: #ff0300;
+        }
+
+        .apple-card .red:hover::before {
+            content: "x";
+            font-size: 11px;
+            color: #fff;
+            width: 10px;
+            height: 10px;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            position: absolute;
+            animation:fadeInOut 0.5s 1;
+        }
+
+        .apple-card .yellow {
+            background-color: #ffbd44;
+        }
+
+        .apple-card .green {
+            background-color: #00ca4e;
+        }
+
+        .apple-card .card-content{
+            color: #fff;
+            padding: 10px;
+        }
+        /*鍗$墖鏍峰紡end*/
+
+        /*婊戝姩鍗$墖start*/
+        .hoverCard {
+            width: 150px;
+            height: 224px;
+            border-radius: 20px;
+            background: #f5f5f5;
+            position: relative;
+            padding: 1.8rem;
+            border: 2px solid #c3c6ce;
+            transition: 0.5s ease-out;
+            overflow: visible;
+            margin-top: 30px;
+        }
+
+        .hoverCard .card-details {
+            color: black;
+            height: 100%;
+            gap: .5em;
+            display: grid;
+            place-content: center;
+        }
+
+        .hoverCard .card-button {
+            transform: translate(-50%, 125%);
+            width: 60%;
+            border-radius: 1rem;
+            border: none;
+            background-color: #008bf8;
+            color: #fff;
+            font-size: 1rem;
+            padding: .5rem 1rem;
+            position: absolute;
+            left: 50%;
+            bottom: 0;
+            opacity: 0;
+            transition: 0.3s ease-out;
+        }
+
+        .hoverCard .text-body {
+            color: rgb(134, 134, 134);
+        }
+
+        /*Text*/
+        .hoverCard .text-title {
+            font-size: 1.5em;
+            font-weight: bold;
+        }
+
+        /*Hover*/
+        .hoverCard:hover {
+            border-color: #008bf8;
+            box-shadow: 0 4px 18px 0 rgba(0, 0, 0, 0.25);
+        }
+
+        .hoverCard:hover .card-button {
+            transform: translate(-50%, 50%);
+            opacity: 1;
+        }
+        /*婊戝姩鍗$墖end*/
+
+        /*妤煎眰鎺у埗start*/
+        .floorSelect {
+            --text: #414856;
+            --radio: #7C96B2;
+            --radio-checked: #4F29F0;
+            --radio-size: 20px;
+            --width: 150px;
+            --height: 200px;
+            --border-radius: 10px;
+            width: var(--width);
+            height: var(--height);
+            border-radius: var(--border-radius);
+            color: var(--text);
+            position: relative;
+            box-shadow: 0 10px 30px rgba(65, 72, 86, 0.05);
+            display: grid;
+            grid-template-columns: auto var(--radio-size);
+            align-items: center;
+        }
+
+        .floorSelect label {
+            cursor: pointer;
+        }
+
+        .floorSelect input[type="radio"] {
+            -webkit-appearance: none;
+            -moz-appearance: none;
+            position: relative;
+            height: var(--radio-size);
+            width: var(--radio-size);
+            outline: none;
+            margin: 0;
+            cursor: pointer;
+            border: 2px solid var(--radio);
+            background: transparent;
+            border-radius: 50%;
+            display: grid;
+            justify-self: end;
+            justify-items: center;
+            align-items: center;
+            overflow: hidden;
+            transition: border .5s ease;
+        }
+
+        .floorSelect input[type="radio"]::before, .floorSelect input[type="radio"]::after {
+            content: "";
+            display: flex;
+            justify-self: center;
+            border-radius: 50%;
+        }
+
+        .floorSelect input[type="radio"]::before {
+            position: absolute;
+            width: 100%;
+            height: 100%;
+            z-index: 1;
+            opacity: var(--opacity, 1);
+        }
+
+        .floorSelect input[type="radio"]::after {
+            position: relative;
+            width: calc(100% /2);
+            height: calc(100% /2);
+            background: var(--radio-checked);
+            top: var(--y, 100%);
+            transition: top 0.5s cubic-bezier(0.48, 1.97, 0.5, 0.63);
+        }
+
+        .floorSelect input[type="radio"]:checked {
+            --radio: var(--radio-checked);
+        }
+
+        .floorSelect input[type="radio"]:checked::after {
+            --y: 0%;
+            animation: stretch-animate .3s ease-out .17s;
+        }
+
+        .floorSelect input[type="radio"]:checked::before {
+            --opacity: 0;
+        }
+
+        .floorSelect input[type="radio"]:checked ~ input[type="radio"]::after {
+            --y: -100%;
+        }
+
+        .floorSelect input[type="radio"]:not(:checked)::before {
+            --opacity: 1;
+            transition: opacity 0s linear .5s;
+        }
+
+        @keyframes stretch-animate {
+            0% {
+                transform: scale(1, 1);
+            }
+
+            28% {
+                transform: scale(1.15, 0.85);
+            }
+
+            50% {
+                transform: scale(0.9, 1.1);
+            }
+
+            100% {
+                transform: scale(1, 1);
+            }
+        }
+        /*妤煎眰鎺у埗end*/
+
+        /*鎼滅储start*/
+        .search-input {
+            line-height: 28px;
+            border: 2px solid transparent;
+            border-bottom-color: #777;
+            padding: .2rem 0;
+            outline: none;
+            background-color: transparent;
+            color: #0d0c22;
+            transition: .3s cubic-bezier(0.645, 0.045, 0.355, 1);
+        }
+
+        .search-input:focus, .search-input:hover {
+            outline: none;
+            padding: .2rem 1rem;
+            border-radius: 1rem;
+            border-color: #7a9cc6;
+        }
+
+        .search-input::placeholder {
+            color: #777;
+        }
+
+        .search-input:focus::placeholder {
+            opacity: 0;
+            transition: opacity .3s;
+        }
+        /*鎼滅储end*/
+
+        @keyframes fadeInOut {
+            0%{
+                opacity: 0;
+            }
+            100%{
+                opacity: 1;
+            }
+        }
+    </style>
+</head>
+<body>
+<div id="app" style="display: flex;justify-content: space-around;margin-top: 50px;flex-wrap: wrap;" @click="bgClick()">
+
+    <div style="margin-top: 20px;"><button class="layui-btn" @click="currentFloor = 1" :style="{background: currentFloor==1?'red':''}">1妤�</button></div>
+    <div style="margin-top: 20px;"><button class="layui-btn" @click="currentFloor = 3" :style="{background: currentFloor==3?'red':''}">3妤�</button></div>
+
+    <div style="flex: 18;display: flex;justify-content: center;" :style="{zoom:showScale/100.0,marginTop:(showScale)*4 + 'px'}">
+        <div style="margin-top: -110px;">
+            <div class="pointContainer" v-for="(x,index) in map" :key="index">
+                <div v-if="index != 0 && (index != map.length-1)" v-for="(y,idx) in x" :key="idx">
+                    <div v-if="idx != 0 && (idx != map[index].length-1)">
+                        <div v-if="map[index][idx].value < 0" style="visibility: hidden;" class="pointBox"></div>
+
+                        <!--搴撲綅-->
+                        <div v-else-if="map[index][idx].value  == 0" @contextmenu.prevent="rightEvent(index,idx,$event)">
+                            <div v-if="map[index][idx].locSts == 'O'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxBlue">{{ map[index][idx].locSts }}</div>
+                            <div v-else-if="map[index][idx].locSts == 'F'" @click.left="selectLoc(index,idx)" :class="{'pointBoxSelected':map[index][idx].locOutSelected,'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxRed">{{ map[index][idx].locSts }}</div>
+                            <div v-else-if="map[index][idx].locSts == 'D'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxEmpty">{{ map[index][idx].locSts }}</div>
+                            <div v-else-if="map[index][idx].locSts == 'P'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxOut">{{ map[index][idx].locSts }}</div>
+                            <div v-else-if="map[index][idx].locSts == 'R'" :class="{'pointBoxSearch':map[index][idx].searchStatus}" class="pointBox pointBoxOutYy">{{ map[index][idx].locSts }}</div>
+                            <div v-else-if="map[index][idx].locSts == 'S'" class="pointBox pointBoxInYy">{{ map[index][idx].locSts }}</div>
+                            <div v-else class="pointBox pointBoxDefault" :class="{'pointBoxSearch':map[index][idx].searchStatus}">{{ map[index][idx].locSts }}</div>
+                        </div>
+
+                        <!--姣嶈建閬�-->
+                        <div v-else-if="map[index][idx].value  == 3">
+                            <div class="pointBox" style="visibility: hidden;"></div>
+                        </div>
+
+                        <!--绔欑偣-->
+                        <div v-else-if="map[index][idx].value  == 4" class="pointBox pointBoxStation" style="visibility: hidden;"></div>
+                        <div v-else-if="map[index][idx].value  == 5" class="pointBox chargeStation"
+                             @contextmenu.prevent="rightEvent(index,idx,$event)"></div>
+                        <div v-else-if="map[index][idx].value  == 9" class="pointBox pointBoxRed"
+                             @contextmenu.prevent="rightEvent(index,idx,$event)"></div>
+
+                    </div>
+                </div>
+
+                <div style="width: 40px;display: flex;justify-content: center;align-items: center;">
+                    {{ getRealRowByX(index) }}
+                </div>
+
+            </div>
+        </div>
+
+        <div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 1" :style="{background: currentLev==1?'red':''}">1F</button></div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 2" :style="{background: currentLev==2?'red':''}">2F</button></div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 3" :style="{background: currentLev==3?'red':''}">3F</button></div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 4" :style="{background: currentLev==4?'red':''}">4F</button></div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 5" :style="{background: currentLev==5?'red':''}">5F</button></div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 6" :style="{background: currentLev==6?'red':''}">6F</button></div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 7" :style="{background: currentLev==7?'red':''}">7F</button></div>
+            <div style="margin-top: 20px;"><button class="layui-btn" @click="currentLev = 8" :style="{background: currentLev==8?'red':''}">8F</button></div>
+            <div class="lev-for-floor3" style="margin-top: 20px; display: none;"><button class="layui-btn" @click="currentLev = 8" :style="{background: currentLev==8?'red':''}">9F</button></div>
+            <div class="lev-for-floor3" style="margin-top: 20px; display: none;"><button class="layui-btn" @click="currentLev = 8" :style="{background: currentLev==8?'red':''}">10F</button></div>
+            <div class="lev-for-floor3" style="margin-top: 20px; display: none;"><button class="layui-btn" @click="currentLev = 8" :style="{background: currentLev==8?'red':''}">11F</button></div>
+            <div class="lev-for-floor3" style="margin-top: 20px; display: none;"><button class="layui-btn" @click="currentLev = 8" :style="{background: currentLev==8?'red':''}">12F</button></div>
+        </div>
+    </div>
+    <div style="padding: 40px 20px 10px 10px;" :style="window.innerWidth < 2000 ? 'margin-top: 0px;' : 'flex: 5;margin-top: -70px;'">
+        <el-slider v-model="showScale" :marks="showScaleMarks"></el-slider>
+        <div style="display: flex;justify-content: space-between;flex-wrap: wrap;">
+            <div class="hoverCard" style="width: 100%;">
+                <div class="card-details" style="place-content: normal;height: auto;">
+                    <div class="text-body" style="display: flex;flex-wrap: wrap;">
+                        <div style="width: 100%;margin-bottom: 20px;">
+                            <div style="display: flex;justify-content: space-between;">
+                                <div><input v-model="searchMatnr" placeholder="鐗╂枡鍙�" type="text" class="search-input"></div>
+                                <div><input v-model="searchOrderNo" placeholder="璁㈠崟鍙�" type="text" class="search-input"></div>
+                            </div>
+                            <div style="display: flex;justify-content: space-between;margin-top: 10px;">
+                                <div><input style="width: 110px;" v-model="searchMaktx" placeholder="鐗╂枡鍚嶇О" type="text" class="search-input"></div>
+                                <div><input style="width: 110px;" v-model="searchSpecs" placeholder="瑙勬牸" type="text" class="search-input"></div>
+                                <div><input style="width: 110px;" v-model="searchLocNo" placeholder="搴撲綅鍙�" type="text" class="search-input"></div>
+                            </div>
+                            <button style="width: 100%;margin-top: 10px;" @click="searchLoc" class="layui-btn layui-btn-sm">鎼滅储</button>
+                        </div>
+<!--                        <div>-->
+<!--                            <button @click="locToLoc2" class="layui-btn layui-btn-sm">渚ц竟绉诲簱</button>-->
+<!--                        </div>-->
+                        <div>
+                            <button @click="init" class="layui-btn layui-btn-sm">鍒锋柊</button>
+                        </div>
+                        <div style="margin-left: 10px;">
+                            <button @click="resetSearch" class="layui-btn layui-btn-sm">閲嶇疆</button>
+                        </div>
+                        <div v-if="!locOutStatus" style="margin-left: 10px;">
+                            <button @click="locOutStatus = true" class="layui-btn layui-btn-sm">鍑哄簱閫夋嫨</button>
+                        </div>
+                        <div v-else style="margin-left: 10px;border: 1px red solid;display: flex;">
+                            <div>
+                                <button @click="cancelSelectLoc" class="layui-btn layui-btn-sm">鍙栨秷閫夋嫨</button>
+                            </div>
+                            <div style="display: flex;justify-content: center;align-items: center;">
+                                <select v-model="outSite">
+                                    <option v-for="(item,index) in outSites" :key="index" :value="item.siteId">{{ item.desc }}</option>
+                                </select>
+                            </div>
+                            <div>
+                                <button @click="locOut" class="layui-btn layui-btn-sm">鍑哄簱</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <button class="card-button">鍔熻兘鍖�</button>
+            </div>
+
+            <div class="hoverCard">
+                <div class="card-details">
+                    <div class="text-body" style="display: flex;justify-content: space-around;flex-wrap: wrap;">
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">绌哄簱浣�</div><div class="pointBox pointBoxBlue">O</div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">鍦ㄥ簱</div><div class="pointBox pointBoxRed">F</div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">绌烘澘</div><div class="pointBox pointBoxEmpty">D</div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">鍑哄簱涓�</div><div class="pointBox pointBoxOut">P</div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">鍑哄簱棰勭害</div><div class="pointBox pointBoxOutYy">R</div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">鍏ュ簱棰勭害</div><div class="pointBox pointBoxInYy">S</div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">鎼滅储缁撴灉</div><div class="pointBox pointBoxSearch"></div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">閫夋嫨缁撴灉</div><div class="pointBox pointBoxSelected"></div>
+                        </div>
+                        <div style="flex: 1;margin-top: 10px;">
+                            <div style="font-size: 10px;">鍏朵粬</div><div class="pointBox pointBoxDefault">鍏朵粬</div>
+                        </div>
+                    </div>
+                </div>
+                <button class="card-button">搴撲綅鐘舵��</button>
+            </div>
+
+<!--            <div class="hoverCard">-->
+<!--                <div class="card-details">-->
+<!--                    <p class="text-title" style="text-align: center;">妤煎眰 {{currentLev}}F</p>-->
+<!--                    <div class="text-body" style="display: flex;">-->
+<!--                        <div class="floorSelect">-->
+<!--                            <label for="01">1F</label>-->
+<!--                            <input id="01" type="radio" name="r" v-model="currentLev" value="1" checked="">-->
+<!--                            <label for="02">2F</label>-->
+<!--                            <input id="02" type="radio" v-model="currentLev" name="r" value="2">-->
+<!--                            <label for="03">3F</label>-->
+<!--                            <input id="03" type="radio" v-model="currentLev" name="r" value="3">-->
+<!--                            <label for="04">4F</label>-->
+<!--                            <input id="04" type="radio" v-model="currentLev" name="r" value="4">-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                </div>-->
+<!--                <button class="card-button">妤煎眰 {{currentLev}}F</button>-->
+<!--            </div>-->
+
+        </div>
+    </div>
+
+    <div v-if="rightBox" @click.stop="" :style="{left: rightBoxLeft,top: rightBoxTop}" class="popBox">
+        <div class="apple-card">
+            <div class="tools">
+                <div class="circle" @click.stop="rightBox = false">
+                    <span class="red box"></span>
+                </div>
+                <div class="circle">
+                    <span class="yellow box"></span>
+                </div>
+                <div class="circle">
+                    <span class="green box"></span>
+                </div>
+            </div>
+            <div class="card-content">
+                <div>
+                    搴撲綅鍙�: {{ map[mapI][mapJ].locNo }}
+                </div>
+                <div style="margin-top: 10px;">
+                    搴撲綅鐘舵��: {{ getLocSts(map[mapI][mapJ].locSts) }}
+                </div>
+                <div style="margin-top: 10px;display: flex;justify-content: space-between;flex-wrap: wrap;">
+                    <div style="margin-top: 5px;">
+                        <button class="layui-btn layui-btn-sm" @click="openLocDetail(map[mapI][mapJ].locNo)">搴撲綅璇︽儏</button>
+                    </div>
+<!--                    <div style="margin-top: 5px;">-->
+<!--                        <button v-if="map[mapI][mapJ].locSts == 'F'" class="layui-btn layui-btn-sm" @click="locMove(map[mapI][mapJ].locNo)">搴撲綅绉昏浆</button>-->
+<!--                        <button v-else-if="map[mapI][mapJ].locSts == 'D'" class="layui-btn layui-btn-sm" @click="locMove(map[mapI][mapJ].locNo)">搴撲綅绉昏浆</button>-->
+<!--                        <button v-else class="layui-btn layui-btn-sm layui-btn-disabled" disabled>搴撲綅绉昏浆</button>-->
+<!--                    </div>-->
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div v-if="crnBox" @click.stop="" :style="{left: crnBoxLeft,top: crnBoxTop}" class="popBox">
+        <div class="apple-card">
+            <div class="tools">
+                <div class="circle" @click.stop="crnBox = false">
+                    <span class="red box"></span>
+                </div>
+                <div class="circle">
+                    <span class="yellow box"></span>
+                </div>
+                <div class="circle">
+                    <span class="green box"></span>
+                </div>
+            </div>
+            <div class="card-content">
+                <div>鍫嗗灈鏈哄彿锛歿{crnList[crnBox - 1].crnNo}}</div>
+                <div>宸ヤ綔鍙凤細{{crnList[crnBox - 1].wrkNo}}</div>
+                <div>婧愬簱浣嶏細{{crnList[crnBox - 1].frmLocno}}</div>
+                <div>鐩爣搴撲綅锛歿{crnList[crnBox - 1].toLocno}}</div>
+                <div>鍙叆锛歿{crnList[crnBox - 1].inEnable}}</div>
+                <div>鍙嚭锛歿{crnList[crnBox - 1].outEnable}}</div>
+                <div>鐘舵�侊細{{crnList[crnBox - 1].crnSts$}}</div>
+                <div>寮傚父锛歿{crnList[crnBox - 1].crnErr$}}</div>
+            </div>
+        </div>
+    </div>
+
+</div>
+<script>
+
+    var $layui = layui.config({
+        base: baseUrl + "/static/layui/lay/modules/"
+    }).use(['layer','form'], function () {})
+
+    var app = new Vue({
+        el: '#app',
+        data: {
+            map: [],
+            mapData: "",
+            importData: null,
+            startPosition: "0500501",
+            endPosition: "0802501",
+            mapI: 0,
+            mapJ: 0,
+            rightBox: false,
+            rightBoxTop: "0px",
+            rightBoxLeft: "0px",
+            pointContainerWidth: 0,
+            currentLev: 1,
+            currentFloor: 1,
+            crnList: null,
+            crnBox: false,
+            crnBoxTop: "0px",
+            crnBoxLeft: "0px",
+            locOutStatus: false,
+            locOutLocNo: [],
+            searchMatnr: "",
+            searchOrderNo: "",
+            searchSpecs: "",
+            searchMaktx: "",
+            searchLocNo: "",
+            outSite: null,
+            outSites: null,
+            showScale: 65, //鎺у埗鍦板浘鏄剧ず澶у皬姣斾緥
+            showScaleMarks: {//姣斾緥婊戝姩鏉℃樉绀烘爣璁�
+                0: "0%",
+                50: {
+                    style: {
+                        color: '#1989FA'
+                    },
+                    label: "50%"
+                },
+                100: "100%",
+            },
+            locStsList: [],//搴撲綅鐘舵�佸垪琛�
+        },
+        created(){
+            this.init()
+
+            this.getOutSite()
+        },
+        watch: {
+            map: {
+                deep: true,
+                handler(val) {
+                    this.printData()
+                }
+            },
+            currentLev: {
+                deep: true,
+                handler(val) {
+                    this.init()
+                    if (this.searchMatnr != ""
+                        || this.searchOrderNo != ""
+                        || this.searchSpecs != ""
+                        || this.searchMaktx != ""
+                        || this.searchLocNo != "") {
+                        this.searchLoc()
+                    }
+                }
+            },
+            currentFloor: {
+                deep: true,
+                handler(val) {
+                    if(this.currentFloor == 3){
+                        $(".lev-for-floor3").show();
+                    }else{
+                        $(".lev-for-floor3").hide();
+                    }
+
+                    this.init()
+                    if (this.searchMatnr != ""
+                        || this.searchOrderNo != ""
+                        || this.searchSpecs != ""
+                        || this.searchMaktx != ""
+                        || this.searchLocNo != "") {
+                        this.searchLoc()
+                    }
+                }
+            }
+        },
+        methods: {
+            init(){
+                let that = this
+                var floor = $('#floorSelect option:selected').val();
+                $.ajax({
+                    url: baseUrl + "/agv/map/getData/" + this.currentFloor + "/" +this.currentLev + "/auth",
+                    headers: {'token': localStorage.getItem('token')},
+                    method: "get",
+                    success: (data) => {
+                        that.importDataClick(data)
+                    }
+                })
+
+                this.locOutStatus = false
+                this.locOutLocNo = []
+
+                this.getLocStsList();//鑾峰彇搴撲綅鐘舵�佸垪琛�
+            },
+            resetSearch(){
+                this.searchMatnr = ""
+                this.searchOrderNo = ""
+                this.searchSpecs = ""
+                this.searchMaktx = ""
+                this.searchLocNo = ""
+                this.searchLoc()
+            },
+            printData() {
+                this.mapData = JSON.stringify(this.map)
+            },
+            importDataClick(mapData) {
+                let tmp = JSON.parse(mapData);
+                let data = []
+                tmp.forEach((item, index) => {
+                    let data2 = []
+                    item.forEach((val, idx) => {
+                        val.searchStatus = false//鎼滅储鏍囪
+                        data2.push(val)
+                    })
+                    this.pointContainerWidth = item.length * (40+1)
+                    data.push(data2)
+                })
+                this.map = data
+                this.printData()
+            },
+            getRealRowByX(x) {
+                //鑾峰彇鐪熷疄搴撲綅琛屽彿锛岄�氳繃鍧愭爣x
+                let data = this.map
+                let rowData = data[x]
+                for (var i = 1; i < rowData.length; i++) {
+                    if (rowData[i].locNo != undefined) {
+                        let locNo = rowData[i].locNo;
+                        return "#" + parseInt(locNo.substr(0, 2));
+                    }
+                }
+
+                return "";
+            },
+            rightEvent(x, y, e) {
+                this.rightBox = true
+                this.mapI = x
+                this.mapJ = y
+                this.rightBoxTop = e.y + "px"
+                this.rightBoxLeft = e.x + "px"
+            },
+            bgClick() {
+                this.rightBox = false
+                this.crnBox = false
+            },
+            openLocDetail(locNo) {
+                url = '/agv/locDetl/list/auth';
+                $layui.layer.open({
+                    type: 2,
+                    title: '搴撲綅鐗╂枡',
+                    maxmin: true,
+                    area: [top.detailWidth, top.detailHeight],
+                    shadeClose: true,
+                    content: '../report/locDetl.html?locNo=' + locNo,
+                    success: function(layero, index){
+                    }
+                });
+            },
+            getLocStsList() {
+                //鑾峰彇搴撲綅鐘舵�佸垪琛�
+                let that = this
+                $.ajax({
+                    url: baseUrl + "/basLocSts/list/auth",
+                    headers: {'token': localStorage.getItem('token')},
+                    method: "get",
+                    success: (res) => {
+                        that.locStsList = res.data.records
+                    }
+                })
+            },
+            getLocSts(locSts) {
+                //鑾峰彇搴撲綅鐘舵��
+                let locStsList = this.locStsList
+                let locDesc = ""
+                locStsList.forEach((item,index) => {
+                    if (item.locSts == locSts) {
+                        locDesc = item.locDesc
+                    }
+                })
+                return locDesc
+            },
+            locMove(locNo) {
+                //搴撲綅绉昏浆
+                let that = this
+                $.ajax({
+                    url: baseUrl + "/loc/move/start",
+                    headers: {'token': localStorage.getItem('token')},
+                    dataType: 'json',
+                    data: {
+                        sourceLocNo: locNo
+                    },
+                    method: 'POST',
+                    success: function (res) {
+                        if (res.code === 200) {
+                            $layui.layer.msg(res.msg);
+                            that.init()
+                        } else if (res.code === 403) {
+                            top.location.href = baseUrl + "/";
+                        } else {
+                            $layui.layer.msg(res.msg);
+                        }
+                    }
+                })
+            },
+            clickCrnBox(e,crnNo) {
+                this.crnBox = crnNo
+                this.crnBoxTop = e.y + "px"
+                this.crnBoxLeft = e.x + "px"
+            },
+            locOut() {
+                //鍑哄簱
+                let that = this
+                let locOutLocNo = this.locOutLocNo
+                if (locOutLocNo.length == 0) {
+                    $layui.layer.msg("璇峰厛閫夋嫨搴撲綅");
+                    return;
+                }
+
+                let map = this.map
+                //宸烽亾list
+                let bayList = []
+                // 灏嗙敤鎴烽�夊畾鐨勫簱浣嶉�氳繃宸烽亾杩涜鍒嗙粍
+                locOutLocNo.forEach((item,index) => {
+                    let obj = {
+                        x: item.x,
+                        y: item.y,
+                        locNo: map[item.x][item.y].locNo
+                    }
+
+                    if (bayList[item.y] == undefined) {
+                        bayList[item.y] = [obj]
+                    }else {
+                        bayList[item.y].push(obj)
+                    }
+                })
+
+                //杩涜鎺掑簭
+                bayList.forEach((item,index) => {
+                    for (var i = 0; i < item.length; i++) {
+                        for (var j = i+1; j < item.length; j++) {
+                            if (item[i].x > item[j].x) {
+                                //浜ゆ崲
+                                let tmp = item[j];
+                                item[j] = item[i]
+                                item[i] = tmp
+                            }
+                        }
+                    }
+                })
+
+                //鍑嗗鍑哄簱
+                if (this.outSite == null) {
+                    $layui.layer.msg("璇烽�夋嫨鍑哄簱绔欑偣");
+                    return;
+                }
+
+                let locNos = []
+                bayList.forEach((item,index) => {
+                    item.forEach((val,idx) => {
+                        locNos.push(val.locNo)
+                    })
+                })
+
+                let locDetls = []
+                $.ajax({
+                    url: baseUrl+"/agv/locDetl/auth",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: {locNos:locNos},
+                    method: 'POST',
+                    async: false,
+                    success: function (res) {
+                        if (res.code === 200) {
+                            locDetls = res.data
+                        } else if (res.code === 403) {
+                            top.location.href = baseUrl + "/";
+                        } else {
+                            layer.msg(res.msg)
+                        }
+                    }
+                })
+
+                locDetls.forEach((item,index) => {
+                    item.count = item.anfme
+                })
+
+                $.ajax({
+                    url: baseUrl + "/plate/out/start",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: JSON.stringify({
+                        outSite: this.outSite,
+                        locDetls: locDetls
+                    }),
+                    contentType:'application/json;charset=UTF-8',
+                    method: 'POST',
+                    success: function (res) {
+                        if (res.code === 200){
+                            $layui.layer.msg(res.msg);
+                            that.init()
+                        } else if (res.code === 403){
+                            top.location.href = baseUrl+"/";
+                        } else {
+                            $layui.layer.msg(res.msg)
+                        }
+                    }
+                });
+            },
+            searchDataIndex(data,dist) {
+                //鎼滅储璧峰鐐�
+                let searchStartPoint = -1;
+                dist.forEach((val,idx) => {
+                    if (val.x == data.x && val.y == data.y) {
+                        //鎵惧埌鐐逛綅
+                        searchStartPoint = idx
+                    }
+                })
+                return searchStartPoint;
+            },
+            selectLoc(x, y) {
+                //閫夋嫨搴撲綅
+                if (this.locOutStatus) {
+                    let tmp = this.map
+                    let selected = tmp[x][y].locOutSelected ? 0 : 1
+                    tmp[x][y].locOutSelected = selected
+
+                    if (selected) {
+                        this.locOutLocNo.push({
+                            x: x,
+                            y: y
+                        });
+                    }else {
+                        //鍓旈櫎鎺変笉閫夋嫨鍏冪礌
+                        let locOutLocNo = this.locOutLocNo
+                        let tmp = []
+                        locOutLocNo.forEach((item,index) => {
+                            if (item.x !== x || item.y !== y) {
+                                tmp.push(item)
+                            }
+                        })
+                        this.locOutLocNo = tmp
+                    }
+
+                    this.map = tmp
+                    this.$forceUpdate()
+                }
+            },
+            cancelSelectLoc() {
+                //鍙栨秷閫夋嫨搴撲綅
+                let data = this.locOutLocNo
+                let tmp = this.map
+                data.forEach((item,index) => {
+                    tmp[item.x][item.y].locOutSelected = 0;
+                })
+                this.locOutLocNo = []
+                this.map = tmp
+                this.locOutStatus = false
+            },
+            searchLoc() {
+                //閫氳繃鐗╂枡缂栧彿鎼滅储搴撲綅鍙�
+                // if (this.searchValue == "") {
+                //     $layui.layer.msg("璇疯緭鍏ョ墿鏂欑紪鍙锋垨璁㈠崟鍙�");
+                //     return;
+                // }
+
+                let that = this;
+                $.ajax({
+                    url: baseUrl + "/agv/map/searchData/auth",
+                    headers: {'token': localStorage.getItem('token')},
+                    dataType: 'json',
+                    data: {
+                        lev: this.currentLev,
+                        locNo: this.searchLocNo,
+                        orderNo: this.searchOrderNo,
+                        specs: this.searchSpecs,
+                        matnr: this.searchMatnr,
+                        maktx: this.searchMaktx
+                    },
+                    method: 'POST',
+                    success: function (res) {
+                        if (res.code === 200) {
+                            let tmp = that.map
+                            let data = res.data
+                            tmp.forEach((item,index) => {//娓呯┖涔嬪墠鐨勬悳绱㈢粨鏋�
+                                item.forEach((val,idx) => {
+                                    if (tmp[index][idx].searchStatus != undefined) {
+                                        tmp[index][idx].searchStatus = false;//鎼滅储鏍囪
+                                    }
+
+                                })
+                            })
+
+                            tmp.forEach((item,index) => {//娓呯┖涔嬪墠鐨勬悳绱㈢粨鏋�
+                                item.forEach((val,idx) => {
+                                    if (tmp[index][idx].searchStatus != undefined) {
+                                        tmp[index][idx].searchStatus = false;//鎼滅储鏍囪
+                                    }
+
+                                })
+                            })
+
+                            data.forEach((item,i) => {
+                                let locNo = item.locNo
+                                tmp.forEach((item,index) => {
+                                    item.forEach((val,idx) => {
+                                        if (tmp[index][idx].locNo == locNo) {
+                                            tmp[index][idx].searchStatus = true//鎼滅储鏍囪
+                                        }
+                                    })
+                                })
+                            })
+                            that.map = tmp
+                            $layui.layer.msg("鎼滅储鎴愬姛");
+                        } else if (res.code === 403) {
+                            top.location.href = baseUrl + "/";
+                        } else {
+                            $layui.layer.msg(res.msg);
+                        }
+                    }
+                })
+            },
+            getOutSite() {
+                let that = this
+                $.ajax({
+                    url: baseUrl + "/agv/available/take/site",
+                    headers: {'token': localStorage.getItem('token')},
+                    dataType: 'json',
+                    data: {},
+                    method: 'POST',
+                    success: function (res) {
+                        if (res.code === 200) {
+                            that.outSites = res.data
+                            that.outSite = res.data[0].siteId
+                        } else if (res.code === 403) {
+                            top.location.href = baseUrl + "/";
+                        } else {
+                            $layui.layer.msg(res.msg);
+                        }
+                    }
+                })
+            },
+        }
+    })
+
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/views/home/console.html b/src/main/webapp/views/home/console.html
index aff7c04..0441f9f 100644
--- a/src/main/webapp/views/home/console.html
+++ b/src/main/webapp/views/home/console.html
@@ -266,11 +266,11 @@
         var cols = [
             //{field: 'appeTime$', title: '鍏ュ簱鏃堕棿', align: 'center', width: 165}
             {field: 'stay_time', align: 'center',title: '婊炵暀澶╂暟',width: 90}
-            ,{field: 'store_max_date', align: 'center',title: '搴撻緞涓婇檺',width: 90}
-            ,{field: 'store_min', title: '搴撳瓨涓嬮檺', align: 'center'}
+            //,{field: 'store_max_date', align: 'center',title: '搴撻緞涓婇檺',width: 90}
+            //,{field: 'store_min', title: '搴撳瓨涓嬮檺', align: 'center'}
             ,{field: 'sum_qty', title: '搴撳瓨鎬绘暟', align: 'center'}
-            ,{field: 'store_max', title: '搴撳瓨涓婇檺', align: 'center'}
-            ,{field: 'loc_no', align: 'center',title: '搴撲綅鍙�',width: 90}
+            //,{field: 'store_max', title: '搴撳瓨涓婇檺', align: 'center'}
+            ,{field: 'loc_no', align: 'center',title: '搴撲綅鍙�'}
 
         ];
         cols.push.apply(cols, detlCols);

--
Gitblit v1.9.1