From 3c1e34e86e18224acf34883039f7c31cab5a3d4d Mon Sep 17 00:00:00 2001
From: zyx <zyx123456>
Date: 星期二, 19 九月 2023 16:28:44 +0800
Subject: [PATCH] 平库增加

---
 src/main/webapp/static/js/saas/locDetl.js                         |  557 ++++
 src/main/java/com/zy/asrs/entity/param/InitPakoutParam.java       |   17 
 src/main/java/com/zy/system/service/impl/SaasLogServiceImpl.java  |   12 
 src/main/java/com/zy/asrs/service/impl/ManLocDetlServiceImpl.java |  203 +
 src/main/webapp/views/saas/matQuery.html                          |  194 +
 src/main/java/com/zy/asrs/entity/param/PakinParam.java            |   19 
 src/main/java/com/zy/system/entity/UserLogin.java                 |    2 
 src/main/webapp/views/saasLog/saasLog.html                        |  113 
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java       |   15 
 src/main/java/com/zy/asrs/service/impl/NodeServiceImpl.java       |  227 +
 src/main/webapp/static/js/common.js                               |    3 
 src/main/java/com/zy/common/entity/NodeExcelListener.java         |  146 +
 src/main/java/com/zy/asrs/utils/SaasUtils.java                    |   22 
 src/main/webapp/static/js/saas/locMove.js                         |  135 +
 src/main/java/com/zy/asrs/entity/OrderDetl.java                   |    7 
 src/main/webapp/static/js/pakStore/stockAdjust.js                 |    7 
 src/main/webapp/static/js/manLocDetl/manLocDetl.js                |  578 ++++
 src/main/java/com/zy/asrs/mapper/ManLocDetlMapper.java            |   92 
 src/main/resources/mapper/ManLocDetlMapper.xml                    |  377 +++
 src/main/webapp/views/saas/locDetl.html                           |   77 
 src/main/webapp/views/manLocDetl/manLocDetl.html                  |  136 +
 src/main/java/com/zy/system/entity/SaasLog.java                   |  101 
 src/main/java/com/zy/asrs/controller/NodeController.java          |  474 +++
 src/main/java/com/zy/common/utils/TreeUtils.java                  |   52 
 src/main/java/com/zy/common/utils/NodeUtils.java                  |   17 
 src/main/java/com/zy/system/mapper/SaasLogMapper.java             |   12 
 src/main/java/com/zy/asrs/entity/AdjDetl.java                     |   15 
 src/main/java/com/zy/common/web/BaseController.java               |   46 
 src/main/webapp/views/saas/locMove.html                           |  130 +
 src/main/webapp/views/saas/stockAdjust.html                       |  133 +
 src/main/webapp/static/js/node/node.js                            |  370 +++
 src/main/webapp/static/js/saas/stockAdjust.js                     |  243 +
 src/main/java/com/zy/asrs/entity/param/MatnrDto.java              |   19 
 src/main/webapp/static/js/nodeLoc/nodeLoc.js                      |  488 +++
 src/main/java/com/zy/asrs/entity/param/NodeInitPatam.java         |   29 
 src/main/webapp/views/nodeLoc/nodeLoc.html                        |  430 +++
 src/main/webapp/static/js/adjDetl/adjDetl.js                      |    7 
 src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java     |   60 
 src/main/webapp/static/js/nodeLoc/nodeLocTree.js                  |   86 
 src/main/java/com/zy/common/entity/NodeExcel.java                 |   18 
 src/main/java/com/zy/asrs/service/MobileService.java              |    2 
 src/main/java/com/zy/asrs/controller/ManLocDetlController.java    |  115 
 src/main/java/com/zy/asrs/mapper/NodeMapper.java                  |   20 
 src/main/java/com/zy/asrs/entity/Node.java                        |  437 +++
 src/main/webapp/static/js/saasLog/saasLog.js                      |  252 ++
 src/main/java/com/zy/asrs/controller/MobileController.java        |   29 
 src/main/java/com/zy/asrs/entity/ManLocDetl.java                  |  346 ++
 src/main/java/com/zy/system/service/SaasLogService.java           |    8 
 src/main/webapp/views/node/node.html                              |  203 +
 src/main/java/com/zy/asrs/entity/param/LocDetlAdjustParam.java    |   12 
 src/main/java/com/zy/asrs/service/ManLocDetlService.java          |   72 
 src/main/java/com/zy/asrs/service/NodeService.java                |   32 
 src/main/java/com/zy/system/controller/SaasLogController.java     |  126 +
 src/main/resources/application.yml                                |    4 
 54 files changed, 7,309 insertions(+), 18 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/ManLocDetlController.java b/src/main/java/com/zy/asrs/controller/ManLocDetlController.java
new file mode 100644
index 0000000..2c091db
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/ManLocDetlController.java
@@ -0,0 +1,115 @@
+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.ManLocDetl;
+import com.zy.asrs.entity.param.LocDetlAdjustParam;
+import com.zy.asrs.service.ManLocDetlService;
+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 java.util.Map;
+
+@RestController
+public class ManLocDetlController extends BaseController {
+
+    @Autowired
+    private ManLocDetlService manLocDetlService;
+
+    @RequestMapping(value = "/manLocDetl/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 Map<String, Object> param){
+        Long hostId = getHostId();
+        if (hostId != null) {
+            param.put("host_id", hostId);
+        }
+        Object nodeId = param.get("node_id");
+        if (Cools.isEmpty(nodeId)) {
+            nodeId = getOriginNode().getId();
+            param.put("node_id", String.valueOf(nodeId));
+        }
+        Object tagId = param.get("tag_id");
+        if (Cools.isEmpty(tagId)) {
+            tagId = getOriginTag().getId();
+            param.put("tag_id", String.valueOf(tagId));
+        }
+        if (!Cools.isEmpty(param.get("update_time"))){
+            String val = String.valueOf(param.get("update_time"));
+            if (val.contains(RANGE_TIME_LINK)) {
+                String[] dates = val.split(RANGE_TIME_LINK);
+                param.put("startTime", DateUtils.convert(dates[0]));
+                param.put("endTime", DateUtils.convert(dates[1]));
+                param.remove("update_time");
+            }
+        }
+        Page<ManLocDetl> page = manLocDetlService.getPage(toPage(curr, limit, param, ManLocDetl.class));
+        return R.ok(page);
+    }
+
+
+    @RequestMapping("/manLocDetl/list")
+    public R outList(@RequestParam(defaultValue = "1")Integer curr,
+                     @RequestParam(defaultValue = "10")Integer limit,
+                     @RequestParam(required = false)String orderByField,
+                     @RequestParam(required = false)String orderByType,
+                     @RequestParam Map<String, Object> param){
+
+        Page<ManLocDetl> manLocDetlPage = toPage(curr, limit, param, ManLocDetl.class);
+        Page<ManLocDetl> outPage = manLocDetlService.getOutPage(manLocDetlPage);
+//        Page<ManLocDetl> page = manLocDetlService.getPage(manLocDetlPage);
+        return R.ok(outPage);
+    }
+
+    @RequestMapping("/manLocDetl/adjust/start")
+    @ManagerAuth(memo = "搴撳瓨璋冩暣")
+    public R locDetlAdjustStart(@RequestBody LocDetlAdjustParam param) {
+        manLocDetlService.adjustLocDetl(param, getUserId(),getUser());
+        return R.ok("搴撳瓨璋冩暣鎴愬姛");
+    }
+
+    @RequestMapping(value = "/manLocDetl/asrsAndSaas/list")
+    @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){
+
+        Page<ManLocDetl> manLocDetlPage = toPage(curr, limit, param, ManLocDetl.class);
+        Page<ManLocDetl> all = manLocDetlService.selectAllPage(manLocDetlPage);
+        return R.ok().add(all);
+    }
+    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/MobileController.java b/src/main/java/com/zy/asrs/controller/MobileController.java
index c3ec8e0..1d05c39 100644
--- a/src/main/java/com/zy/asrs/controller/MobileController.java
+++ b/src/main/java/com/zy/asrs/controller/MobileController.java
@@ -47,6 +47,8 @@
     private BasDevpService basDevpService;
     @Autowired
     private PackService packService;
+    @Autowired
+    private ManLocDetlService manLocDetlService;
 
     // 缁勬墭 ----------------------------------------------------------------------------------------------------
 
@@ -320,5 +322,32 @@
         return R.ok("鐩樼偣鎴愬姛");
     }
 
+    /*
+    骞冲簱 搴撲綅鎺ㄨ崘
+     */
+    @RequestMapping("/node/recommend/loc")
+    @ManagerAuth(memo = "搴撲綅鎺ㄨ崘")
+    public R recommendNodeLoc(){
+
+
+        return R.ok();
+    }
+
+    /*
+    骞冲簱 璁㈠崟涓婃灦
+     */
+    @RequestMapping("/node/puttway")
+    @ManagerAuth(memo = "璁㈠崟涓婃灦")
+    public R putway(@RequestBody HashMap<String,String> params){
+        String zpallet = params.get("zpallet");
+        String locNo = params.get("locNo");
+
+        mobileService.nodePutway(zpallet,locNo,getUser());
+
+
+        return R.ok();
+    }
+
+
 
 }
diff --git a/src/main/java/com/zy/asrs/controller/NodeController.java b/src/main/java/com/zy/asrs/controller/NodeController.java
new file mode 100644
index 0000000..2c87cdd
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/NodeController.java
@@ -0,0 +1,474 @@
+package com.zy.asrs.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+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.core.exception.CoolException;
+import com.zy.asrs.entity.Node;
+import com.zy.asrs.entity.param.InitPakoutParam;
+import com.zy.asrs.entity.param.NodeInitPatam;
+import com.zy.asrs.entity.param.PakinParam;
+import com.zy.asrs.entity.result.KeyValueVo;
+import com.zy.asrs.mapper.ManLocDetlMapper;
+import com.zy.asrs.service.NodeService;
+import com.zy.common.entity.NodeExcel;
+import com.zy.common.entity.NodeExcelListener;
+import com.zy.common.entity.Parameter;
+import com.zy.common.utils.ListUtils;
+import com.zy.common.utils.NodeUtils;
+import com.zy.common.utils.TreeUtils;
+import com.zy.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.*;
+
+@RestController
+public class NodeController extends BaseController {
+
+    @Autowired
+    private NodeService nodeService;
+    @Autowired
+    private TreeUtils treeUtils;
+    @Autowired
+    private ManLocDetlMapper manLocDetlMapper;
+
+    @RequestMapping(value = "/node/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(nodeService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/node/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 Map<String, Object> param){
+        EntityWrapper<Node> wrapper = new EntityWrapper<>();
+        wrapper.eq("type",3);
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.ok(nodeService.selectPage(new Page<>(curr, limit), wrapper));
+    }
+
+    @RequestMapping(value = "/node/list/tree/auth")
+    @ManagerAuth
+    public R listTree(@RequestParam(defaultValue = "1")Integer curr,
+                      @RequestParam(defaultValue = "10")Integer limit,
+                      @RequestParam(required = false)String orderByField,
+                      @RequestParam(required = false)String orderByType,
+                      @RequestParam Map<String, Object> param){
+        EntityWrapper<Node> wrapper = new EntityWrapper<>();
+        wrapper.ne("type",3);
+        excludeTrash(param);
+        convert(param, wrapper);
+        hostEq(wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        return R.parse("0-鎿嶄綔鎴愬姛").add(nodeService.selectList(wrapper));
+    }
+
+    @RequestMapping(value = "/node/tree/auth")
+    @ManagerAuth
+    public R tree(@RequestParam(defaultValue = "1")Integer curr,
+                  @RequestParam(defaultValue = "10")Integer limit,
+                  @RequestParam(required = false)String orderByField,
+                  @RequestParam(required = false)String orderByType,
+                  @RequestParam Map<String, Object> param){
+        EntityWrapper<Node> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        hostEq(wrapper);
+        if (!Cools.isEmpty(orderByField)){
+            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
+        }
+        return R.parse("0-鎴愬姛").add(nodeService.selectList(wrapper));
+    }
+
+    private void convert(Map<String, Object> map, EntityWrapper 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 {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/node/add/auth")
+    @ManagerAuth
+    public R add(Node node) {
+        Node node1 = nodeService.selectByUuid(node.getName());
+        if (!Cools.isEmpty(node1)) {
+            throw new CoolException("璇ョ紪鍙�/鍚嶇О宸插瓨鍦�");
+        }
+        if (node.getType() != 1) {
+            Node parentNode = nodeService.selectById(node.getParentId());
+            if (parentNode == null || parentNode.getStatus() == 0) {
+                return R.error(node.getType()==2?"鎵�灞炰粨搴撲笉瀛樺湪":"鎵�灞炲簱鍖轰笉瀛樺湪");
+            }
+            node.setParentName(parentNode.getName());
+            node.setLevel(parentNode.getLevel() + 1);
+        }
+        // path
+        NodeUtils nodeUtils = new NodeUtils();
+        nodeUtils.executePath(node);
+        node.setHostId(getHostId());
+        node.setUuid(node.getName().toString());
+        node.setPath(nodeUtils.path.toString());
+        node.setNamePath(nodeUtils.pathName.toString());
+        node.setLevel(node.getType());
+        node.setCreateBy(getUserId());
+        node.setCreateTime(new Date());
+        node.setUpdateBy(getUserId());
+        node.setUpdateTime(new Date());
+        node.setStatus(1);
+        nodeService.insert(node);
+        return R.ok();
+    }
+
+
+
+    @RequestMapping(value = "/node/update/auth")
+    @ManagerAuth
+    public R update(Node node){
+        Node node1 = nodeService.selectByUuid(node.getName());
+        if (!Cools.isEmpty(node1)) {
+            throw new CoolException("璇ョ紪鍙�/鍚嶇О宸插瓨鍦�");
+        }
+        if (Cools.isEmpty(node) || null==node.getId()){
+            return R.error();
+        }
+        if (node.getType() != 1) {
+            Node parentNode = nodeService.selectById(node.getParentId());
+            if (parentNode == null || parentNode.getStatus() == 0) {
+                return R.error(node.getType()==2?"鎵�灞炰粨搴撲笉瀛樺湪":"鎵�灞炲簱鍖轰笉瀛樺湪");
+            }
+            node.setParentName(parentNode.getName());
+            node.setLevel(parentNode.getLevel() + 1);
+        }
+        // path
+        NodeUtils nodeUtils = new NodeUtils();
+        nodeUtils.executePath(node);
+        node.setPath(nodeUtils.path.toString());
+        node.setNamePath(nodeUtils.pathName.toString());
+        node.setUuid(node.getName());
+
+        manLocDetlMapper.updateLocNo0(node.getId(),node.getName());
+        node.setUpdateBy(getUserId());
+        node.setUpdateTime(new Date());
+        nodeService.updateById(node);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/node/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam String param){
+        List<Node> list = JSONArray.parseArray(param, Node.class);
+        if (Cools.isEmpty(list)){
+            return R.error();
+        }
+        for (Node entity : list){
+            nodeService.delete(new EntityWrapper<>(entity));
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/node/delete0/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+        for (Long id : ids){
+            nodeService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/node/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<Node> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("node"));
+        convert(map, wrapper);
+        List<Node> list = nodeService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/nodeQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<Node> wrapper = new EntityWrapper<>();
+        wrapper.like("name", condition).or().like("uuid", condition).eq("type", 3);
+        hostEq(wrapper);
+        Page<Node> page = nodeService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Node node : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", node.getId());
+            map.put("value", node.getUuid() + "锛�" +node.getName()+ "锛�");
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/node/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<Node> wrapper = new EntityWrapper<Node>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != nodeService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(Node.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+    @PostMapping(value = "/parent/node/group")
+    @ManagerAuth
+    public R getParentNodeGroup(@RequestParam(required = false) String condition,
+                                @RequestParam Integer type) {
+        EntityWrapper<Node> wrapper = new EntityWrapper<>();
+        wrapper.eq("type", type).eq("status", 1);
+        hostEq(wrapper);
+        List<Node> nodes = nodeService.selectList(wrapper);
+
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Node node : nodes) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("key", node.getId());
+            map.put("val", node.getName());
+            result.add(map);
+        }
+        return R.ok().add(result);
+    }
+
+    @PostMapping(value = "/node/tree/auth")
+    @ManagerAuth
+    public R tree(@RequestParam(required = false, defaultValue = "") String condition) throws IOException, ClassNotFoundException {
+        ArrayList<Map> tree = treeUtils.getNodeTree(String.valueOf(getOriginNode().getId()), getHostId());
+        // 娣辨嫹璐�
+        List<Map> result = ListUtils.deepCopy(tree);
+        if (!Cools.isEmpty(condition)) {
+            treeUtils.remove(condition, result);
+            treeUtils.remove(condition, result);
+        }
+        return R.ok(result);
+    }
+
+    /*************************************** 鏁版嵁鐩稿叧 ***********************************************/
+
+    /**
+     * excel瀵煎叆妯℃澘涓嬭浇
+     */
+    @RequestMapping(value = "/node/excel/import/mould")
+    public void nodeExcelImportMould(HttpServletResponse response) throws IOException {
+        List<NodeExcel> excels = new ArrayList<>();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = URLEncoder.encode("璐т綅妗fExcel瀵煎叆妯℃澘", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        EasyExcel.write(response.getOutputStream(), NodeExcel.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+                .sheet("sheet1")
+                .doWrite(excels);
+    }
+
+    // excel瀵煎叆
+    @PostMapping(value = "/node/excel/import/auth")
+    @ManagerAuth(memo = "璐т綅妗f鏁版嵁瀵煎叆")
+    @Transactional
+    public R nodeExcelImport(MultipartFile file) throws IOException {
+        NodeExcelListener listener = new NodeExcelListener(getUserId(), getHostId());
+        EasyExcel.read(file.getInputStream(), NodeExcel.class, listener).sheet().doRead();
+        return R.ok("鎴愬姛鍚屾"+listener.getTotal()+"涓揣浣�");
+    }
+
+    /*************************************** 鍏ュ簱鍑虹浉鍏� ***********************************************/
+
+    @RequestMapping("/work/stock/pakin")
+    @ManagerAuth(memo = "鍏ュ簱")
+    public R stockPakin(@RequestBody PakinParam number) {
+        Node node = nodeService.selectOne(new EntityWrapper<Node>()
+                .eq("id", number.getNodeId()));
+        if (node.getType() != 3) {
+          return R.error("浠呭彲閫夋嫨璐т綅");
+        }
+        return nodeService.stockPakin(number, getUserId(), getHostId(),getUser());
+    }
+
+    @RequestMapping("/work/stock/pakout")
+    @ManagerAuth(memo = "鍑哄簱")
+    public R initPakout(@RequestBody List<InitPakoutParam> params) {
+        return nodeService.initPakout(params, getUserId(), getHostId(),getUser());
+    }
+
+    @PostMapping(value = "/work/empty/stock")
+    public R getGroupEmptyStock(@RequestParam(required = false) String sourceLocNo) {
+        List<Node> allEmptys = nodeService.selectList(new EntityWrapper<Node>()
+                .eq("type","3"));
+        return R.ok().add(allEmptys);
+    }
+    @RequestMapping("/work/move/start")
+    @ManagerAuth(memo = "搴撲綅绉昏浆")
+    public R locMoveStart(@RequestParam String sourceLocNo,
+                          @RequestParam String targetLocNo) {
+        nodeService.locMove(sourceLocNo, targetLocNo, getUserId(),getUser());
+        return R.ok("绉诲簱鍚姩鎴愬姛");
+    }
+    @RequestMapping(value = "/node/select/{id}/auth")
+    @ManagerAuth
+    public R getById(@PathVariable("id") String id) {
+        Node node = nodeService.selectOne(new EntityWrapper<Node>()
+                .eq("uuid",id));
+        return R.ok(node);
+    }
+
+    @RequestMapping(value = "/node/init/auth")
+    @ManagerAuth(memo = "骞冲簱搴撲綅鍒濆鍖�")
+    @Transactional
+    public R init(NodeInitPatam param) {
+        List<Node> list = new ArrayList<>();
+        EntityWrapper<Node> nodeEntityWrapper = new EntityWrapper<>();
+        nodeEntityWrapper.eq("id",param.getValue());
+        nodeEntityWrapper.eq("name",param.getName());
+ //       nodeService.delete(new EntityWrapper<Node>().eq("parent_id",param.getValue()));
+        Node node = nodeService.selectOne(nodeEntityWrapper);
+        String[] string = node.getNamePath().split(",");
+        int tno=1; int no=1;
+        for (int b=param.getStartBay(); b<=param.getEndBay(); b++) {
+            for (int r=param.getStartRow(); r<=param.getEndRow(); r++){
+                for (int l=param.getStartLev(); l<=param.getEndLev(); l++) {
+                    // 鑾峰彇搴撲綅鍙�
+                    String locNo;
+
+                    if (param.getName().equals("DT-B")){
+                        if (b == 2 || b ==4 || b == 7){
+                            if (l == 1){
+                                locNo = param.getName()+"T-" +String.format("%02d", tno) + String.format("%02d", r) + String.format("%02d", l);
+                            }else {
+                                locNo = null;
+                            }
+
+
+                        }else {
+                            locNo = param.getName()+"-" +String.format("%02d", no) + String.format("%02d", r) + String.format("%02d", l);
+
+                        }
+                    }else if (param.getName().equals("DT-C") || param.getName().equals("DT-D")){
+                        if (b == 3 || b ==6 || b == 9 || b == 12 || b == 15 || b == 17 || b == 20 || b == 23){
+                            if (l == 1){
+                                locNo = param.getName()+"T-" +String.format("%02d", tno) + String.format("%02d", r) + String.format("%02d", l);
+                            }else {
+                                locNo = null;
+                            }
+
+                        }else {
+                            locNo = param.getName()+"-" +String.format("%02d", no) + String.format("%02d", r) + String.format("%02d", l);
+
+                        }
+
+                    }else {
+                        locNo = param.getName()+"-" +String.format("%02d", r) + String.format("%02d", b) + String.format("%02d", l);
+                    }
+
+
+
+
+                    if (locNo == null){
+                        continue;
+                    }
+
+                    Date now =  new Date();
+                    Node node1 = new Node();
+                    node1.setUuid(locNo);
+                    node1.setName(locNo);
+                    node1.setParentId(node.getId());
+                    node1.setParentName(node.getName());
+                    node1.setType(3);
+                    node1.setPath(node.getPath()+","+node.getId());
+                    node1.setNamePath(node.getNamePath()+","+node.getName());
+                    node1.setLevel(3);
+                    node1.setStatus(1);
+                    node1.setCreateBy(getUserId());
+                    node1.setCreateTime(now);
+                    node1.setUpdateBy(getUserId());
+                    node1.setUpdateTime(now);
+                    node1.setRow1(r);
+                    node1.setBay1(b);
+                    node1.setLev1(l);
+                    if (!nodeService.insert(node1)){
+                        return R.error("鏁版嵁鎻掑叆澶辫触");
+                    }
+
+                }
+            }
+            if (param.getName().equals("DT-B")){
+                if (b == 2 || b ==4 || b == 7){
+                    tno++;
+                }else {
+                    no++;
+                }
+            }else if (param.getName().equals("DT-C") || param.getName().equals("DT-D")){
+                if (b == 3 || b ==6 || b == 9 || b == 12 || b == 15 || b == 17 || b == 20 || b == 23){
+                    tno++;
+                }else {
+                    no++;
+                }
+
+            }
+
+
+        }
+//
+//        nodeService.delete(new EntityWrapper<Node>().eq("parent_id",param.getValue()));
+
+//        if (nodeService.insertBatch(list)){
+//            return R.error("鏁版嵁鎻掑叆澶辫触");
+//        }
+        return R.ok("鍒濆鍖栨垚鍔�");
+    }
+
+    @RequestMapping(value = "/node/init/pwd")
+    public R locMastInitPwd(@RequestParam(required = false) String pwd) {
+        if (Cools.isEmpty(pwd)) {
+            return R.error("璇疯緭鍏ュ彛浠�");
+        }
+        return R.ok().add(Parameter.get().getLocMastInitPwd().equals(pwd));
+    }
+
+    @RequestMapping(value = "/node/all/get/loc")
+    public R getarea(){
+        EntityWrapper<Node> nodeEntityWrapper = new EntityWrapper<>();
+        nodeEntityWrapper.eq("type",2);
+        List<Node> list = nodeService.selectList(nodeEntityWrapper);
+        List<KeyValueVo> keyValueVoList = new ArrayList<>();
+        for (Node node : list){
+            KeyValueVo vo = new KeyValueVo();
+            vo.setName(node.getName());
+            vo.setValue(node.getId());
+            keyValueVoList.add(vo);
+        }
+        return R.ok(keyValueVoList);
+
+    }
+
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/AdjDetl.java b/src/main/java/com/zy/asrs/entity/AdjDetl.java
index c76f4be..385e3ba 100644
--- a/src/main/java/com/zy/asrs/entity/AdjDetl.java
+++ b/src/main/java/com/zy/asrs/entity/AdjDetl.java
@@ -125,6 +125,21 @@
     @TableField("appe_time")
     private Date appeTime;
 
+    /*
+    璁㈠崟鍙�
+     */
+    private String orderNo;
+
+    /*
+    閿�鍞鍗曞彿
+     */
+    private String csocode;
+
+    /*
+    閿�鍞鍗曡鍙�
+     */
+    private String isoseq;
+
     public AdjDetl() {}
 
     public AdjDetl(String locNo, String matnr, String batch, Double oriCtns, Double oriQty, Double oriWt, Double adjCtns, Double adjQty, Double adjWt, String memo, Long modiUser, Date modiTime, Long appeUser, Date appeTime) {
diff --git a/src/main/java/com/zy/asrs/entity/ManLocDetl.java b/src/main/java/com/zy/asrs/entity/ManLocDetl.java
new file mode 100644
index 0000000..a63fe8b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/ManLocDetl.java
@@ -0,0 +1,346 @@
+package com.zy.asrs.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+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 com.core.common.SpringUtils;
+import com.zy.system.entity.Host;
+import com.zy.system.entity.User;
+import com.zy.system.service.HostService;
+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("man_loc_detl")
+public class ManLocDetl implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎵�灞為」鐩�
+     */
+    @ApiModelProperty(value= "鎵�灞為」鐩�")
+    @TableField("host_id")
+    private Long hostId;
+
+    /**
+     * 璐т綅缂栧彿
+     */
+    @ApiModelProperty(value= "璐т綅缂栧彿")
+    @TableField("loc_no")
+    private String locNo;
+
+    /**
+     * 鎵�灞炶揣浣�
+     */
+    @ApiModelProperty(value= "鎵�灞炶揣浣�")
+    @TableField("node_id")
+    private Long nodeId;
+
+    /**
+     * 鎵樼洏鐮�
+     */
+    @ApiModelProperty(value= "鎵樼洏鐮�")
+    private String zpallet;
+
+    /**
+     * 搴撳瓨浣欓噺
+     */
+    @ApiModelProperty(value= "搴撳瓨浣欓噺")
+    @ExcelProperty(value = "搴撳瓨鎬婚噺")
+    private Double anfme;
+
+    /**
+     * 鍟嗗搧缂栧彿
+     */
+    @ApiModelProperty(value= "鍟嗗搧缂栧彿")
+    @TableId(value = "matnr", type = IdType.INPUT)
+    @ExcelProperty(value = "鍟嗗搧缂栧彿")
+    private String matnr;
+
+    /**
+     * 鍟嗗搧鍚嶇О
+     */
+    @ApiModelProperty(value= "鍟嗗搧鍚嶇О")
+    @ExcelProperty(value = "鍟嗗搧鍚嶇О")
+    private String maktx;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 瑙勬牸
+     */
+    @ApiModelProperty(value= "瑙勬牸")
+    @ExcelProperty(value = "瑙勬牸")
+    private String specs;
+
+    /**
+     * 鍨嬪彿
+     */
+    @ApiModelProperty(value= "鍨嬪彿")
+    private String model;
+
+    /**
+     * 鎵瑰彿
+     */
+    @ApiModelProperty(value= "鎵瑰彿")
+    @TableId(value = "batch", type = IdType.INPUT)
+    private String batch;
+
+    /**
+     * 鍗曚綅
+     */
+    @ApiModelProperty(value= "鍗曚綅")
+    @ExcelProperty(value = "鍗曚綅")
+    private String unit;
+
+    /**
+     * SKC
+     */
+    @ApiModelProperty(value= "SKC")
+    @ExcelProperty(value = "SKC")
+    private String barcode;
+
+    /**
+     * 鍗曟嵁绫诲瀷
+     */
+    @ApiModelProperty(value= "鍗曟嵁绫诲瀷")
+    @TableField("doc_id")
+    private Long docId;
+
+    /**
+     * 鍗曟嵁缂栧彿
+     */
+    @ApiModelProperty(value= "鍗曟嵁缂栧彿")
+    @TableField("doc_num")
+    private String docNum;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
+    @ApiModelProperty(value= "瀹㈡埛鍚嶇О")
+    @TableField("cust_name")
+    private String custName;
+
+    /**
+     * 鍝侀」鏁�
+     */
+    @ApiModelProperty(value= "鍝侀」鏁�")
+    @TableField("item_num")
+    private Integer itemNum;
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value= "鏁伴噺")
+    private Integer count;
+
+
+    /**
+     * 鍗曚环
+     */
+    @ApiModelProperty(value= "鍗曚环")
+    private Double price;
+
+    /**
+     * 閲嶉噺
+     */
+    @ApiModelProperty(value= "閲嶉噺")
+    private Double weight;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("modi_time")
+    private Date modiTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    @ApiModelProperty(value= "鎷ユ湁鑰� 1: 鏉板厠   ")
+    private Integer owner;
+
+    /**
+     * 璐х墿褰㈡��:0锛氫唬閲囥��1锛氫粨鍌�
+     */
+    @ApiModelProperty(value= "璐х墿褰㈡��:0锛氫唬閲囥��1锛氫粨鍌�")
+    private Integer payment;
+
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("real_anfme")
+    private Date realAnfme;
+
+    @ApiModelProperty(value= "璁㈠崟鍙�")
+    @TableField("order_no")
+    private String orderNo;
+
+    @TableField("container_code")
+    private String containerCode;
+
+    private String csocode;
+
+    private String isoseq;
+
+//    LocDetl locDetl = new LocDetl(
+//            null,    // 璐т綅缂栧彿[闈炵┖]
+//            null,    // 鎵�灞炶揣浣�
+//            null,    // 鎵樼洏鐮�
+//            null,    // 搴撳瓨浣欓噺[闈炵┖]
+//            null,    // 鍟嗗搧缂栧彿[闈炵┖]
+//            null,    // 鍟嗗搧鍚嶇О
+//            null,    // 鍚嶇О
+//            null,    // 瑙勬牸
+//            null,    // 鍨嬪彿
+//            null,    // 鎵瑰彿
+//            null,    // 鍗曚綅
+//            null,    // SKC
+//            null,    // 鍗曟嵁绫诲瀷
+//            null,    // 鍗曟嵁缂栧彿
+//            null,    // 瀹㈡埛鍚嶇О
+//            null,    // 鍝侀」鏁�
+//            null,    // 鏁伴噺
+//            null,    // 閲嶉噺
+//            null,    // 鐘舵��
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+//    public String getOwner$(){
+//        LocOwnerService service = SpringUtils.getBean(LocOwnerService.class);
+//        LocOwner locOwner = service.selectById(this.owner);
+//        if (!Cools.isEmpty(locOwner)){
+//            return String.valueOf(locOwner.getOwner());
+//        }
+//        return null;
+//    }
+
+    public String getPayment$(){
+        if (null == this.payment){ return null; }
+        switch (this.payment){
+            case 1:
+                return "浠撳偍";
+            case 0:
+                return "浠i噰";
+            default:
+                return String.valueOf(this.payment);
+        }
+    }
+
+    public String getHostId$(){
+        HostService service = SpringUtils.getBean(HostService.class);
+        Host host = service.selectById(this.hostId);
+        if (!Cools.isEmpty(host)){
+            return String.valueOf(host.getName());
+        }
+        return null;
+    }
+
+    public Long getNodeId() {
+        return nodeId;
+    }
+
+//    public String getNodeId$(){
+//        NodeService service = SpringUtils.getBean(NodeService.class);
+//        Node node = service.selectById(this.nodeId);
+//        if (!Cools.isEmpty(node)){
+//            return String.valueOf(node.getName());
+//        }
+//        return null;
+//    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getModiTime$(){
+        if (Cools.isEmpty(this.modiTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.modiTime);
+    }
+
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/Node.java b/src/main/java/com/zy/asrs/entity/Node.java
new file mode 100644
index 0000000..c7632b2
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/Node.java
@@ -0,0 +1,437 @@
+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 com.core.common.SpringUtils;
+import com.zy.system.entity.Host;
+import com.zy.system.entity.User;
+import com.zy.system.service.HostService;
+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("man_node")
+public class Node implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鎵�灞為」鐩�
+     */
+    @ApiModelProperty(value= "鎵�灞為」鐩�")
+    @TableField("host_id")
+    private Long hostId;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 鐖剁骇
+     */
+    @ApiModelProperty(value= "鐖剁骇")
+    @TableField("parent_id")
+    private Long parentId;
+
+    /**
+     * 鐖剁骇鍚嶇О
+     */
+    @ApiModelProperty(value= "鐖剁骇鍚嶇О")
+    @TableField("parent_name")
+    private String parentName;
+
+    /**
+     * 绫诲瀷 1: 浠撳簱  2: 搴撳尯  3: 璐т綅
+     */
+    @ApiModelProperty(value= "绫诲瀷 1: 浠撳簱  2: 搴撳尯  3: 璐т綅  ")
+    private Integer type;
+
+    /**
+     * 鍏宠仈璺緞
+     */
+    @ApiModelProperty(value= "鍏宠仈璺緞")
+    private String path;
+
+    /**
+     * 鍏宠仈璺緞鍚�
+     */
+    @ApiModelProperty(value= "鍏宠仈璺緞鍚�")
+    @TableField("name_path")
+    private String namePath;
+
+    /**
+     * 绛夌骇
+     */
+    @ApiModelProperty(value= "绛夌骇")
+    private Integer level;
+
+    /**
+     * 璐熻矗浜�
+     */
+    @ApiModelProperty(value= "璐熻矗浜�")
+    private String leading;
+
+    /**
+     * 鎺掑簭
+     */
+    @ApiModelProperty(value= "鎺掑簭")
+    private Integer sort;
+
+    /**
+     * 鎺�
+     */
+    @ApiModelProperty(value= "鎺�")
+    private Integer row1;
+    /**
+     * 鍒�
+     */
+    @ApiModelProperty(value= "鍒�")
+    private Integer bay1;
+    /**
+     * 灞�
+     */
+    @ApiModelProperty(value= "灞�")
+    private Integer lev1;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value= "鏉$爜")
+    private String barcode;
+
+    /**
+     * 鎺ㄨ崘浣�
+     */
+    @ApiModelProperty(value= "鎺ㄨ崘浣�")
+    private Integer major;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    @TableField("create_by")
+    private Long createBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    @TableField("update_by")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+
+
+
+//    Node node = new Node(
+//            null,    // 缂栧彿
+//            null,    // 鍚嶇О
+//            null,    // 鐖剁骇
+//            null,    // 鐖剁骇鍚嶇О
+//            null,    // 绫诲瀷
+//            null,    // 鍏宠仈璺緞
+//            null,    // 鍏宠仈璺緞鍚�
+//            null,    // 绛夌骇
+//            null,    // 璐熻矗浜�
+//            null,    // 鎺掑簭
+//            null,    // 鏉$爜
+//            null,    // 鎺ㄨ崘浣�
+//            null,    // 鐘舵��
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getHostId() {
+        return hostId;
+    }
+
+    public void setHostId(Long hostId) {
+        this.hostId = hostId;
+    }
+
+    public String getHostId$(){
+        HostService service = SpringUtils.getBean(HostService.class);
+        Host host = service.selectById(this.hostId);
+        if (!Cools.isEmpty(host)){
+            return String.valueOf(host.getName());
+        }
+        return null;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Long getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getParentName() {
+        return parentName;
+    }
+
+    public void setParentName(String parentName) {
+        this.parentName = parentName;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public String getType$(){
+        if (null == this.type){ return null; }
+        switch (this.type){
+            case 1:
+                return "浠撳簱";
+            case 2:
+                return "搴撳尯";
+            case 3:
+                return "璐т綅";
+            default:
+                return String.valueOf(this.type);
+        }
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getNamePath() {
+        return namePath;
+    }
+
+    public void setNamePath(String namePath) {
+        this.namePath = namePath;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getLeading() {
+        return leading;
+    }
+
+    public void setLeading(String leading) {
+        this.leading = leading;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public String getBarcode() {
+        return barcode;
+    }
+
+    public void setBarcode(String barcode) {
+        this.barcode = barcode;
+    }
+
+    public Integer getMajor() {
+        return major;
+    }
+
+    public void setMajor(Integer major) {
+        this.major = major;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public String getStatus$(){
+        if (null == this.status){ return null; }
+        switch (this.status){
+            case 1:
+                return "姝e父";
+            case 0:
+                return "绂佺敤";
+            default:
+                return String.valueOf(this.status);
+        }
+    }
+
+    public String getRow1$(){
+        if (null == this.row1){ return null; }
+        return String.valueOf(this.row1);
+    }
+
+    public String getBay1$(){
+        if (null == this.lev1){ return null; }
+        return String.valueOf(this.lev1);
+    }
+
+    public String getLev1$(){
+        if (null == this.bay1){ return null; }
+        return String.valueOf(this.bay1);
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public String getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getCreateBy() {
+        return createBy;
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public void setCreateBy(Long createBy) {
+        this.createBy = createBy;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getUpdateBy() {
+        return updateBy;
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.selectById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getUsername());
+        }
+        return null;
+    }
+
+    public void setUpdateBy(Long updateBy) {
+        this.updateBy = updateBy;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/OrderDetl.java b/src/main/java/com/zy/asrs/entity/OrderDetl.java
index d1073af..2d20f94 100644
--- a/src/main/java/com/zy/asrs/entity/OrderDetl.java
+++ b/src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -285,13 +285,6 @@
     @ApiModelProperty(value= "澶囨敞")
     private String memo;
 
-    //寰呭嚭搴撴暟閲�
-    private Double amount;
-
-    public Double getAmount() {
-        return anfme - qty;
-    }
-
     public OrderDetl() {}
 
     public OrderDetl(Long orderId, String orderNo, Double anfme, Double qty, String matnr, String maktx, String batch, String specs, String model, String color, String brand, String unit, Double price, String sku, Double units, String barcode, String origin, String manu, String manuDate, String itemNum, Double safeQty, Double weight, Double length, Double volume, String threeCode, String supp, String suppCode, Integer beBatch, String deadTime, Integer deadWarn, Integer source, Integer inspect, Integer danger, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
diff --git a/src/main/java/com/zy/asrs/entity/param/InitPakoutParam.java b/src/main/java/com/zy/asrs/entity/param/InitPakoutParam.java
new file mode 100644
index 0000000..75a2218
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/InitPakoutParam.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2021/3/10
+ */
+@Data
+public class InitPakoutParam {
+
+    private Long nodeId;
+
+    private String matnr;
+
+    private Double count;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/LocDetlAdjustParam.java b/src/main/java/com/zy/asrs/entity/param/LocDetlAdjustParam.java
index c654988..a00c9ed 100644
--- a/src/main/java/com/zy/asrs/entity/param/LocDetlAdjustParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/LocDetlAdjustParam.java
@@ -30,10 +30,18 @@
         // 鍙樻洿鏁伴噺
         private Double count;
 
-        public LocDetlAdjust(String matnr, String batch, Double count) {
+        // 閿�鍞鍗曞彿
+        private String threeCode;
+
+        //閿�鍞鍗曡鍙�
+        private String deadTime;
+
+        public LocDetlAdjust(String matnr, String batch, Double count, String threeCode, String deadTime) {
             this.matnr = matnr;
             this.batch = batch;
             this.count = count;
+            this.threeCode = threeCode;
+            this.deadTime = deadTime;
         }
     }
 
@@ -52,7 +60,7 @@
                 }
             }
             if (!exit) {
-                copyList.add(new LocDetlAdjustParam.LocDetlAdjust(adjust.getMatnr(), adjust.getBatch(), adjust.getCount()));
+                copyList.add(new LocDetlAdjustParam.LocDetlAdjust(adjust.getMatnr(), adjust.getBatch(), adjust.getCount(), adjust.getThreeCode(), adjust.getDeadTime()));
             }
         }
         list = copyList;
diff --git a/src/main/java/com/zy/asrs/entity/param/MatnrDto.java b/src/main/java/com/zy/asrs/entity/param/MatnrDto.java
new file mode 100644
index 0000000..195550d
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/MatnrDto.java
@@ -0,0 +1,19 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2021/3/31
+ */
+@Data
+public class MatnrDto {
+
+    private String matnr;
+
+    private Double count;
+
+    private String orderNo;
+
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/NodeInitPatam.java b/src/main/java/com/zy/asrs/entity/param/NodeInitPatam.java
new file mode 100644
index 0000000..f6cc4d7
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/NodeInitPatam.java
@@ -0,0 +1,29 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+@Data
+public class NodeInitPatam {
+
+    private Integer startRow;
+
+    // 缁堟鎺�
+    private Integer endRow;
+
+    // 璧峰鍒�
+    private Integer startBay;
+
+    // 缁堟鍒�
+    private Integer endBay;
+
+    // 璧峰灞�
+    private Integer startLev;
+
+    // 缁堟灞�
+    private Integer endLev;
+
+    private Integer value;
+
+    private String name;
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/param/PakinParam.java b/src/main/java/com/zy/asrs/entity/param/PakinParam.java
new file mode 100644
index 0000000..33935f3
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/PakinParam.java
@@ -0,0 +1,19 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by vincent on 2021/3/26
+ */
+@Data
+public class PakinParam {
+
+    private String nodeId;
+
+    private List<MatnrDto> mats;
+
+    private Integer docType;
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/ManLocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/ManLocDetlMapper.java
new file mode 100644
index 0000000..f0ad47e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/ManLocDetlMapper.java
@@ -0,0 +1,92 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.ManLocDetl;
+import com.zy.asrs.entity.result.StockVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Mapper
+@Repository
+public interface ManLocDetlMapper extends BaseMapper<ManLocDetl> {
+    List<ManLocDetl> listByPage(Map<String, Object> map);
+
+    Integer listByPageCount(Map<String, Object> map);
+
+    ManLocDetl selectItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
+
+    int deleteItem(@Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
+
+    int updateAnfme(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
+
+    List<ManLocDetl> getStockOutPage(Map<String, Object> map);
+
+    Integer getStockOutPageCount(Map<String, Object> map);
+
+    @Update("update asr_loc_detl set loc_no = #{newLocNo}, modi_time=getDate() where loc_no = #{oldLocNo}")
+    int updateLocNo(String newLocNo, String oldLocNo);
+
+    @Select("SELECT ld.loc_no FROM asr_loc_detl ld LEFT JOIN asr_loc_mast lm ON ld.loc_no = lm.loc_no WHERE (1 = 1 AND ld.matnr = #{matnr} AND (lm.row1 >= #{start} AND lm.row1 <= #{end})  AND lm.loc_sts = 'F' AND DateDiff(dd, lm.appe_time, getdate()) = 0) ORDER BY lm.appe_time ASC")
+    List<String> selectSameDetlToday(@Param("matnr") String matnr, @Param("start") Integer start, @Param("end") Integer end);
+
+    List<ManLocDetl> getStockStatis(Map<String, Object> map);
+
+    Integer getStockStatisCount(Map<String, Object> map);
+
+    List<ManLocDetl> getStockStatisExcel();
+
+    @Select("select sum(a.anfme) as sum from asr_loc_detl a left join asr_loc_mast b on a.loc_no = b.loc_no where b.loc_sts = 'F' and a.matnr = #{matnr}")
+    Double selectSumAnfmeByMatnr(@Param("matnr") String matnr);
+
+    List<ManLocDetl> selectPakoutByRule(String matnr);
+
+    List<ManLocDetl> getAsrsLocDetl(String matnr);
+
+    Integer countLocNoNum(String locNo);
+
+    // -------------------------------------------------
+
+    List<ManLocDetl> queryStock(@Param("matnr")String matnr, @Param("batch")String batch, @Param("orderNo")String orderNo, @Param("locNos") Set<String> locNos);
+
+    Double queryStockAnfme(String matnr, String batch);
+
+    List<StockVo> queryStockTotal();
+
+
+    Integer sum();
+
+    List<ManLocDetl> unreason();
+
+    Double selectLocDetlSumQty(String locNo);
+
+    int updateLocNo0(Long nodeId, String locNo);
+
+    ManLocDetl selectLocNo0(String locNo, String matnr);
+
+    List<ManLocDetl> selectItem0(String locNo, String matnr);
+
+    int deleteLocNo0(String locNo, String matnr);
+
+    int updateAnfme0(double anfme, Long nodeId);
+
+    List<ManLocDetl> listByOutPage(Map<String, Object> condition);
+
+    long listByOutPageCount(Map<String, Object> condition);
+
+    List<ManLocDetl> selectAllPage(Map<String, Object> condition);
+
+    long selectAllPageSize(Map<String, Object> condition);
+
+    ManLocDetl selectInventory(String LocNo, String Matnr, String batch);
+
+    int deleteDatailed (String locNo, String matnr,String batch);
+
+    int increase(Double anfme,String locNo, String matnr,String batch,Double weight);
+}
diff --git a/src/main/java/com/zy/asrs/mapper/NodeMapper.java b/src/main/java/com/zy/asrs/mapper/NodeMapper.java
new file mode 100644
index 0000000..cca9d62
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/NodeMapper.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.asrs.entity.Node;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+@Repository
+public interface NodeMapper extends BaseMapper<Node> {
+    Node selectByUuid(@Param("uuid") String uuid, @Param("hostId") Long hostId);
+
+    List<Node> listByPage(Map<String, Object> map);
+
+    Integer listByPageCount(Map<String, Object> map);
+}
diff --git a/src/main/java/com/zy/asrs/service/ManLocDetlService.java b/src/main/java/com/zy/asrs/service/ManLocDetlService.java
new file mode 100644
index 0000000..2cbf39f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/ManLocDetlService.java
@@ -0,0 +1,72 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.asrs.entity.ManLocDetl;
+import com.zy.asrs.entity.param.LocDetlAdjustParam;
+import com.zy.asrs.entity.result.StockVo;
+import com.zy.system.entity.User;
+
+import java.util.List;
+import java.util.Set;
+
+public interface ManLocDetlService  extends IService<ManLocDetl> {
+    Page<ManLocDetl> getPage(Page<ManLocDetl> page);
+
+    ManLocDetl selectItem(String locNo, String matnr, String batch);
+
+    Page<ManLocDetl> getStockOut(Page<ManLocDetl> page);
+
+    /**
+     * 淇敼搴撳瓨鏄庣粏鏁伴噺锛屽鏋滄暟閲忎负0锛屽垯鍒犻櫎璁板綍
+     */
+    boolean updateAnfme(Double anfme, String locNo, String matnr, String batch);
+
+    boolean updateLocNo(String newLocNo, String oldLocNo);
+
+    /**
+     * 鑾峰彇褰撳ぉ鐩稿悓瑙勬牸璐х墿鐨勬繁搴撲綅鍙�
+     * @param matnr 鍟嗗搧缂栧彿
+     * @return locNo 搴撲綅鍙�
+     */
+    List<String> getSameDetlToday(String matnr, Integer start, Integer end);
+
+    Page<ManLocDetl> getStockStatis(Page<ManLocDetl> page);
+
+    Double getSumAnfme(String matnr);
+
+    List<ManLocDetl> selectPakoutByRule(String matnr);
+
+    List<ManLocDetl> getAsrsLocDetl(String matnr);
+
+    Integer countLocNoNum(String locNo);
+
+    // --------------------------------------------------
+
+    List<ManLocDetl> queryStock(String matnr, String batch, String orderNo, Set<String> locNos);
+
+    Double queryStockAnfme(String matnr, String batch);
+
+    List<StockVo> queryStockTotal();
+
+
+    Integer sum();
+
+    List<ManLocDetl> unreason();
+
+    Double getLocDetlSumQty(String locNo);
+
+    Page<ManLocDetl> getOutPage(Page<ManLocDetl> manLocDetlPage);
+
+
+    void adjustLocDetl(LocDetlAdjustParam param, Long userId ,User user);
+
+    Page<ManLocDetl> selectAllPage(Page<ManLocDetl> param);
+
+    ManLocDetl selectInventory(String LocNo,String Matnr,String batch);
+
+    int deleteDatailed (String locNo, String matnr,String batch);
+
+    int increase(Double anfme,String locNo, String matnr,String batch,Double weight);
+
+}
diff --git a/src/main/java/com/zy/asrs/service/MobileService.java b/src/main/java/com/zy/asrs/service/MobileService.java
index 51e6c59..a5e1182 100644
--- a/src/main/java/com/zy/asrs/service/MobileService.java
+++ b/src/main/java/com/zy/asrs/service/MobileService.java
@@ -2,6 +2,7 @@
 
 import com.zy.asrs.entity.param.CombParam;
 import com.zy.asrs.entity.param.MobileAdjustParam;
+import com.zy.system.entity.User;
 
 public interface MobileService {
 
@@ -17,4 +18,5 @@
 
     void packComb(CombParam param, Long userId);
 
+    void nodePutway(String zpallet, String locNo, User user);
 }
diff --git a/src/main/java/com/zy/asrs/service/NodeService.java b/src/main/java/com/zy/asrs/service/NodeService.java
new file mode 100644
index 0000000..ae259d8
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/NodeService.java
@@ -0,0 +1,32 @@
+package com.zy.asrs.service;
+
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.IService;
+import com.core.common.R;
+import com.zy.asrs.entity.Node;
+import com.zy.asrs.entity.param.InitPakoutParam;
+import com.zy.asrs.entity.param.PakinParam;
+import com.zy.system.entity.User;
+
+import java.util.List;
+
+public interface NodeService extends IService<Node> {
+
+        Node getTop();
+
+        Node selectByUuid(String uuid);
+
+        Node selectByUuid(String uuid, Long hostId);
+
+        Node selectByUuid(String uuid, Long hostId, Integer type);
+
+        Node selectByUuid(String uuid, Long hostId, Integer type, Long parentId);
+
+    R stockPakin(PakinParam number, Long userId, Long hostId, User user);
+
+        R initPakout(List<InitPakoutParam> params, Long userId, Long hostId,User user);
+
+    void locMove(String sourceLocNo, String targetLocNo, Long userId,User user);
+
+    Page<Node> getPage(Page<Node> page);
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/ManLocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/ManLocDetlServiceImpl.java
new file mode 100644
index 0000000..c9af0a1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/ManLocDetlServiceImpl.java
@@ -0,0 +1,203 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.ManLocDetl;
+import com.zy.asrs.entity.Mat;
+import com.zy.asrs.entity.Node;
+import com.zy.asrs.entity.param.LocDetlAdjustParam;
+import com.zy.asrs.entity.result.StockVo;
+import com.zy.asrs.mapper.ManLocDetlMapper;
+import com.zy.asrs.service.ManLocDetlService;
+import com.zy.asrs.service.MatService;
+import com.zy.asrs.service.NodeService;
+import com.zy.asrs.service.WaitPakinService;
+import com.zy.asrs.utils.SaasUtils;
+import com.zy.system.entity.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@Service("manLocDetlService")
+public class ManLocDetlServiceImpl extends ServiceImpl<ManLocDetlMapper, ManLocDetl> implements ManLocDetlService {
+    @Autowired
+    private MatService matService;
+    @Autowired
+    private NodeService nodeService;
+    @Autowired
+    private WaitPakinService waitPakinService;
+
+    @Override
+    public Page<ManLocDetl> getPage(Page<ManLocDetl> page) {
+        Map<String, Object> condition = page.getCondition();
+        List<ManLocDetl> manLocDetls = baseMapper.listByPage(condition);
+        page.setRecords(manLocDetls);
+        page.setTotal(baseMapper.listByPageCount(page.getCondition()));
+        return page;
+    }
+
+    @Override
+    public Page<ManLocDetl> getStockOut(Page<ManLocDetl> page) {
+        page.setRecords(baseMapper.getStockOutPage(page.getCondition()));
+        page.setTotal(baseMapper.getStockOutPageCount(page.getCondition()));
+        return page;
+    }
+
+    @Override
+    public boolean updateAnfme(Double anfme, String locNo, String matnr, String batch) {
+        if (anfme <= 0) {
+            return this.baseMapper.deleteItem(locNo, matnr, batch) > 0;
+        } else {
+            return baseMapper.updateAnfme(anfme, locNo, matnr, batch) > 0;
+        }
+    }
+
+
+    @Override
+    public boolean updateLocNo(String newLocNo, String oldLocNo) {
+        return baseMapper.updateLocNo(newLocNo, oldLocNo) > 0;
+    }
+
+    @Override
+    public List<String> getSameDetlToday(String matnr, Integer start, Integer end) {
+        return this.baseMapper.selectSameDetlToday(matnr, start, end);
+    }
+
+
+    @Override
+    public Page<ManLocDetl> getStockStatis(Page<ManLocDetl> page) {
+        page.setRecords(baseMapper.getStockStatis(page.getCondition()));
+        page.setTotal(baseMapper.getStockStatisCount(page.getCondition()));
+        return page;
+    }
+
+    @Override
+    public Double getSumAnfme(String matnr) {
+        return this.baseMapper.selectSumAnfmeByMatnr(matnr);
+    }
+
+    @Override
+    public List<ManLocDetl> selectPakoutByRule(String matnr) {
+        return this.baseMapper.selectPakoutByRule(matnr);
+    }
+
+    @Override
+    public List<ManLocDetl> getAsrsLocDetl(String matnr) {
+        return this.baseMapper.getAsrsLocDetl(matnr);
+    }
+
+    @Override
+    public Integer countLocNoNum(String locNo) {
+        return this.baseMapper.countLocNoNum(locNo);
+    }
+
+    @Override
+    public List<ManLocDetl> queryStock(String matnr, String batch, String orderNo, Set<String> locNos) {
+        return this.baseMapper.queryStock(matnr, batch, orderNo, locNos);
+    }
+
+    @Override
+    public Double queryStockAnfme(String matnr, String batch) {
+        return this.baseMapper.queryStockAnfme(matnr, batch);
+    }
+
+    @Override
+    public List<StockVo> queryStockTotal() {
+        return this.baseMapper.queryStockTotal();
+    }
+
+    /**
+     * 鑾峰彇搴撳瓨鎬绘暟
+     *
+     * @return
+     */
+    @Override
+    public Integer sum() {
+
+        return this.baseMapper.sum();
+    }
+
+    @Override
+    public List<ManLocDetl> unreason() {
+        return this.baseMapper.unreason();
+    }
+
+
+    @Override
+    public ManLocDetl selectItem(String locNo, String matnr, String batch) {
+        return this.baseMapper.selectItem(locNo, matnr, batch);
+    }
+
+    @Override
+    public Double getLocDetlSumQty(String locNo) {
+        return this.baseMapper.selectLocDetlSumQty(locNo);
+    }
+
+    @Override
+    public Page<ManLocDetl> getOutPage(Page<ManLocDetl> manLocDetlPage) {
+        Map<String, Object> condition = manLocDetlPage.getCondition();
+        List<ManLocDetl> manLocDetls = baseMapper.listByOutPage(condition);
+        manLocDetlPage.setRecords(manLocDetls);
+        manLocDetlPage.setTotal(baseMapper.listByOutPageCount(manLocDetlPage.getCondition()));
+        return manLocDetlPage;
+    }
+
+    @Transactional
+    @Override
+    public void adjustLocDetl(LocDetlAdjustParam param, Long userId, User user) {
+        Date now = new Date();
+        for (LocDetlAdjustParam.LocDetlAdjust locDetlAdjust : param.getList()) {
+            ManLocDetl manLocDetl = this.baseMapper.selectItem(param.getLocNo(), locDetlAdjust.getMatnr(), locDetlAdjust.getBatch());
+            this.baseMapper.delete(new EntityWrapper<ManLocDetl>()
+                    .eq("loc_no", param.getLocNo()).eq("matnr",locDetlAdjust.getMatnr()));
+            Mat mat = matService.selectOne(new EntityWrapper<Mat>()
+                    .eq("matnr", locDetlAdjust.getMatnr()));
+            if (mat == null) {
+                throw new CoolException("鏃犳硶鎵惧埌闇�瑕佽皟鏁寸殑鐗╂枡,璇疯仈绯荤鐞嗗憳");
+            }
+            Node node = nodeService.selectOne(new EntityWrapper<Node>()
+                    .eq("uuid", param.getLocNo()));
+            if (node == null) {
+                throw new CoolException("鏃犳硶鎵惧埌闇�瑕佽皟鏁寸殑搴撲綅,璇疯仈绯荤鐞嗗憳");
+
+            }
+            manLocDetl.setAnfme(locDetlAdjust.getCount());
+            manLocDetl.setUpdateBy(userId);
+            manLocDetl.setModiTime(now);
+            SaasUtils.insertLog(3,manLocDetl.getLocNo(), manLocDetl.getMatnr(),manLocDetl.getAnfme(),user.getUsername());
+            this.baseMapper.insert(manLocDetl);
+        }
+    }
+
+    @Override
+    public Page<ManLocDetl> selectAllPage(Page<ManLocDetl> param) {
+        Map<String, Object> condition = param.getCondition();
+        List<ManLocDetl> manLocDetls = baseMapper.selectAllPage(condition);
+        param.setRecords(manLocDetls);
+        param.setTotal(baseMapper.selectAllPageSize(condition));
+        return param;
+    }
+
+    @Override
+    public ManLocDetl selectInventory(String LocNo, String Matnr, String batch) {
+        return baseMapper.selectInventory(LocNo,Matnr,batch);
+    }
+
+    @Override
+    public int deleteDatailed(String locNo, String matnr, String batch) {
+        return baseMapper.deleteDatailed(locNo,matnr,batch);
+    }
+
+    @Override
+    public int increase(Double anfme,String locNo, String matnr, String batch,Double weight) {
+        return baseMapper.increase(anfme,locNo,matnr,batch,weight);
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
index ada3f54..fd8233c 100644
--- a/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -16,12 +16,15 @@
 import com.zy.asrs.task.core.ReturnT;
 import com.zy.asrs.task.handler.WorkLogHandler;
 import com.zy.asrs.utils.MatUtils;
+import com.zy.asrs.utils.SaasUtils;
 import com.zy.common.constant.MesConstant;
 import com.zy.common.entity.Parameter;
 import com.zy.common.model.DetlDto;
 import com.zy.common.model.MesCombParam;
 import com.zy.common.utils.HttpHandler;
+import com.zy.system.entity.User;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -63,6 +66,10 @@
     private ApiLogService apiLogService;
     @Autowired
     private WorkLogHandler workLogHandler;
+    @Autowired
+    private ManLocDetlService manLocDetlService;
+    @Autowired
+    private WaitPakinLogService waitPakinLogService;
 
     @Override
     @Transactional
@@ -125,7 +132,7 @@
 
                 waitPakin.setThreeCode(detlDto.getCsocode());
                 waitPakin.setDeadTime(detlDto.getIsoseq());
-                waitPakin.setSuppCode(detlDto.getCsocode());
+                waitPakin.setSuppCode(detlDto.getContainerCode());
                 if (!waitPakinService.insert(waitPakin)) {
                     throw new CoolException("淇濆瓨鍏ュ簱閫氱煡妗eけ璐�");
                 }
@@ -181,7 +188,7 @@
 
                 waitPakin.setThreeCode(detlDto.getCsocode());
                 waitPakin.setDeadTime(detlDto.getIsoseq());
-                waitPakin.setSuppCode(detlDto.getCsocode());
+                waitPakin.setSuppCode(detlDto.getContainerCode());
 
                 if (!waitPakinService.insert(waitPakin)) {
                     throw new CoolException("淇濆瓨鍏ュ簱閫氱煡妗eけ璐�");
@@ -433,4 +440,53 @@
         }
     }
 
+    @Transactional
+    public void nodePutway(String zpallet, String locNo, User user) {
+        Date now = new Date();
+
+        //澧炲姞骞冲簱搴撳瓨
+        List<WaitPakin> waitPakinList = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", zpallet));
+        waitPakinList.forEach(waitPakin -> {
+
+            //鏂欐兂鐮�
+            String containerCode = waitPakin.getSuppCode();
+            //濡傛灉褰撳墠鏂欐兂鐮佸凡瀛樺湪锛屽垯淇敼璇ユ枡鎯崇殑鐗╂枡鏁伴噺
+            ManLocDetl manLocDetl = manLocDetlService.selectOne(new EntityWrapper<ManLocDetl>().eq("container_code", containerCode));
+            if(Cools.isEmpty(manLocDetl)){
+                saveManlocDetl(manLocDetl,waitPakin,now,locNo);
+            }else{
+                if(Cools.eq(manLocDetl.getMatnr(),waitPakin.getMatnr())
+                        && Cools.eq(manLocDetl.getCsocode(),waitPakin.getThreeCode())
+                        && Cools.eq(manLocDetl.getIsoseq(),waitPakin.getDeadTime())){
+                    manLocDetl.setAnfme(manLocDetl.getAnfme() + waitPakin.getAnfme());
+                    manLocDetlService.update(manLocDetl,new EntityWrapper<ManLocDetl>()
+                            .eq("loc_no",manLocDetl.getLocNo())
+                            .eq("container_code",manLocDetl.getContainerCode()));
+                }else{
+                    saveManlocDetl(manLocDetl,waitPakin,now,locNo);
+                }
+            }
+            //鐢熸垚骞冲簱鍏ュ嚭搴撴棩蹇�
+            SaasUtils.insertLog(0,locNo,waitPakin.getMatnr(), waitPakin.getAnfme(),user.getUsername());
+
+        });
+        //鐢熸垚鍏ュ簱閫氱煡鍘嗗彶妗�
+        waitPakinLogService.save(zpallet);
+        //鍒犻櫎鍏ュ簱閫氱煡妗�
+        waitPakinService.delete(new EntityWrapper<WaitPakin>().eq("zpallet", zpallet));
+
+    }
+
+    private void saveManlocDetl(ManLocDetl manLocDetl, WaitPakin waitPakin, Date now, String locNo){
+        manLocDetl = new ManLocDetl();
+        BeanUtils.copyProperties(waitPakin,manLocDetl);
+        manLocDetl.setContainerCode(waitPakin.getSuppCode());
+        manLocDetl.setCsocode(waitPakin.getThreeCode());
+        manLocDetl.setIsoseq(waitPakin.getDeadTime());
+        manLocDetl.setCreateTime(now);
+        manLocDetl.setModiTime(now);
+        manLocDetl.setLocNo(locNo);
+        manLocDetlService.insert(manLocDetl);
+    }
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/NodeServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/NodeServiceImpl.java
new file mode 100644
index 0000000..8cbfb19
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/NodeServiceImpl.java
@@ -0,0 +1,227 @@
+package com.zy.asrs.service.impl;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.core.common.SnowflakeIdWorker;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.ManLocDetl;
+import com.zy.asrs.entity.Mat;
+import com.zy.asrs.entity.Node;
+import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.param.InitPakoutParam;
+import com.zy.asrs.entity.param.MatnrDto;
+import com.zy.asrs.entity.param.PakinParam;
+import com.zy.asrs.mapper.NodeMapper;
+import com.zy.asrs.service.*;
+import com.zy.asrs.utils.SaasUtils;
+import com.zy.system.entity.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service("nodeService")
+public class NodeServiceImpl extends ServiceImpl<NodeMapper, Node> implements NodeService {
+    @Autowired
+    private NodeService nodeService;
+    @Autowired
+    private MatService matService;
+    @Autowired
+    private SnowflakeIdWorker snowflakeIdWorker;
+    @Autowired
+    private ManLocDetlService manLocDetlService;
+    @Autowired
+    private OrderDetlService orderDetlService;
+    @Autowired
+    private OrderService orderService;
+    @Override
+    public Node getTop() {
+        Node top = this.selectOne(new EntityWrapper<Node>().eq("type", 0).eq("level", 0));
+        if (top == null) {
+            top = new Node();
+            top.setName("鍏ㄩ儴");
+            top.setUuid("鍏ㄩ儴");
+            top.setType(0);
+            top.setLevel(0);
+            top.setSort(0);
+            top.setStatus(1);
+            top.setCreateTime(new Date());
+            top.setUpdateTime(new Date());
+            Integer insert = this.baseMapper.insert(top);
+            if (insert == 0) {
+                throw new CoolException("鏈嶅姟鍣ㄥ紓甯�");
+            }
+        }
+        return top;
+    }
+
+    @Override
+    public Node selectByUuid(String uuid) {
+        return selectOne(new EntityWrapper<Node>().eq("uuid", uuid));
+    }
+
+    @Override
+    public Node selectByUuid(String uuid, Long hostId) {
+        return this.baseMapper.selectByUuid(uuid, hostId);
+    }
+
+    @Override
+    public Node selectByUuid(String uuid, Long hostId, Integer type) {
+        return selectOne(new EntityWrapper<Node>().eq("host_id", hostId).eq("uuid", uuid).eq("type", type));
+    }
+
+    @Override
+    public Node selectByUuid(String uuid, Long hostId, Integer type, Long parentId) {
+        return selectOne(new EntityWrapper<Node>().eq("host_id", hostId).eq("uuid", uuid).eq("type", type).eq("parent_id", parentId));
+    }
+
+    @Override
+    public R stockPakin(PakinParam param, Long userId, Long hostId, User user) {
+        Node node = nodeService.selectByUuid(param.getNodeId(), hostId);
+        if (node == null) {
+            node = nodeService.selectById(param.getNodeId());
+        }
+        if (node == null) {
+            return R.error("璐т綅涓嶅瓨鍦�");
+        }
+        if (Cools.isEmpty(param.getMats())) {
+            return R.error("鍏ュ簱鐗╂枡涓嶈兘涓虹┖");
+        }
+        Date now = new Date();
+        for (MatnrDto dto : param.getMats()) {
+
+            Mat mat = matService.selectByMatnr(dto.getMatnr());
+            if (mat == null) {
+                throw new CoolException("鐗╂枡鏁版嵁閿欒锛岃鑱旂郴绠$悊鍛�");
+            }
+            ManLocDetl check = manLocDetlService.selectOne(new EntityWrapper<ManLocDetl>()
+                    .eq("loc_no", node.getUuid())
+                    .eq("matnr", dto.getMatnr()));
+            if (check == null) {
+                ManLocDetl manLocDetl = new ManLocDetl();
+                manLocDetl.setLocNo(node.getUuid());
+                manLocDetl.setNodeId(node.getId());
+                manLocDetl.setZpallet(node.getUuid());
+                manLocDetl.setAnfme(dto.getCount());
+                manLocDetl.setMatnr(mat.getMatnr());
+                manLocDetl.setMaktx(mat.getMaktx());
+                manLocDetl.setName(mat.getName());
+                manLocDetl.setBatch(null);
+                manLocDetl.setSpecs(mat.getSpecs());
+                manLocDetl.setModel(mat.getModel());
+                manLocDetl.setCreateTime(now);
+                manLocDetl.setModiTime(now);
+                manLocDetl.setCreateBy(userId);
+                manLocDetl.setStatus(1);
+                manLocDetl.setPayment(1);
+                SaasUtils.insertLog(0,manLocDetl.getLocNo(),manLocDetl.getMatnr(), manLocDetl.getAnfme(),user.getUsername());
+                manLocDetlService.insert(manLocDetl);
+            }else {
+//                check.setAnfme(dto.getCount() + check.getAnfme());
+//                manLocDetlService.update(check,new EntityWrapper<ManLocDetl>()
+//                        .eq("loc_no", node.getUuid())
+//                        .eq("matnr", dto.getMatnr()));
+                return R.error("搴撲綅瀛樺湪鐗╂枡锛岃鍕块噸澶嶅叆搴�");
+            }
+            if (!Cools.isEmpty(dto.getOrderNo())) {
+                OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>()
+                        .eq("order_no", dto.getOrderNo())
+                        .eq("matnr", dto.getMatnr()));
+                orderDetl.setQty(orderDetl.getQty() + dto.getCount());
+                orderDetlService.updateById(orderDetl);
+                //orderService.checkSettleUpdate(orderDetl.getOrderId());
+            }
+        }
+        return R.ok("鍏ュ簱鎴愬姛");
+    }
+
+    @Transactional
+    @Override
+    public R initPakout(List<InitPakoutParam> params, Long userId, Long hostId,User user) {
+        if (!Cools.isEmpty(params)) {
+            Date now = new Date();
+            for (InitPakoutParam param : params) {
+                ManLocDetl manLocDetl = manLocDetlService.selectOne(new EntityWrapper<ManLocDetl>()
+                        .eq("node_id", param.getNodeId())
+                        .eq("matnr", param.getMatnr()));
+                Node node = nodeService.selectOne(new EntityWrapper<Node>()
+                        .eq("id", param.getNodeId()));
+                if (node == null) {
+                    return R.error("鎵句笉鍒拌搴撲綅,璇疯仈绯荤鐞嗗憳:" + param.getNodeId() );
+                }
+                if (manLocDetl == null) {
+                    return R.error("鐗╂枡:"+ param.getMatnr() + " 鍦ㄥ簱浣嶄腑涓嶅瓨鍦�");
+                }
+                if (manLocDetl.getAnfme() - param.getCount() < 0) {
+                    return R.error("鐗╂枡:"+ param.getMatnr() + " 鍦ㄥ簱浣嶄腑鏁伴噺涓嶈冻");
+                } else if (manLocDetl.getAnfme() - param.getCount() == 0) {
+                    SaasUtils.insertLog(1,manLocDetl.getLocNo(), manLocDetl.getMatnr(),param.getCount(),user.getUsername());
+                    manLocDetlService.delete(new EntityWrapper<ManLocDetl>()
+                            .eq("loc_no",node.getUuid())
+                            .eq("matnr",param.getMatnr()));
+                } else {
+
+                    manLocDetl.setAnfme(manLocDetl.getAnfme() - param.getCount());
+                    manLocDetlService.update(manLocDetl,new EntityWrapper<ManLocDetl>()
+                            .eq("loc_no",node.getUuid())
+                            .eq("matnr",param.getMatnr()));
+                    SaasUtils.insertLog(1,manLocDetl.getLocNo(), manLocDetl.getMatnr(),param.getCount(),user.getUsername());
+                }
+            }
+        }
+        return R.ok("鍑哄簱鎴愬姛");
+    }
+
+    @Transactional
+    @Override
+    public void locMove(String sourceLocNo, String targetLocNo, Long userId,User user) {
+        List<ManLocDetl> sourceManDetl = manLocDetlService.selectList(new EntityWrapper<ManLocDetl>()
+                .eq("loc_no", sourceLocNo));
+        for (ManLocDetl source : sourceManDetl) {
+            Node targetNode = nodeService.selectOne(new EntityWrapper<Node>()
+                    .eq("uuid", targetLocNo));
+            Node sourceNode = nodeService.selectOne(new EntityWrapper<Node>()
+                    .eq("uuid", sourceLocNo));
+            if (targetNode == null || targetNode.equals("")) {
+                throw new RuntimeException("鏃犳硶鏌ヨ鍒扮Щ搴撶殑鐩爣搴撲綅");
+            }
+            ManLocDetl check = manLocDetlService.selectOne(new EntityWrapper<ManLocDetl>()
+                    .eq("loc_no", targetNode.getUuid())
+                    .eq("matnr", source.getMatnr()));
+            if (check == null) {
+                manLocDetlService.delete(new EntityWrapper<ManLocDetl>().eq("loc_no", source.getLocNo())
+                        .eq("matnr", source.getMatnr()));
+                source.setLocNo(targetNode.getUuid());
+                source.setNodeId(targetNode.getId());
+
+                SaasUtils.insertLog(2,source.getLocNo(), source.getMatnr(), source.getAnfme(),user.getUsername());
+                manLocDetlService.insert(source);
+            }else {
+//                check.setAnfme(check.getAnfme() + source.getAnfme());
+//                manLocDetlService.update(check,new EntityWrapper<ManLocDetl>()
+//                        .eq("loc_no", targetNode.getUuid())
+//                        .eq("matnr", check.getMatnr()));
+//                manLocDetlService.delete(new EntityWrapper<ManLocDetl>()
+//                        .eq("loc_no", sourceNode.getUuid())
+//                        .eq("matnr", source.getMatnr()));
+                throw new RuntimeException("鐩爣搴撲綅鏈夌墿");
+            }
+
+        }
+    }
+
+    @Override
+    public Page<Node> getPage(Page<Node> page) {
+        Map<String, Object> condition = page.getCondition();
+        List<Node> manLocDetls = baseMapper.listByPage(condition);
+        page.setRecords(manLocDetls);
+        page.setTotal(baseMapper.listByPageCount(page.getCondition()));
+        return page;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index 3c2e7c0..5efb6d0 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -823,6 +823,12 @@
                         adjDetl.setModiUser(userId);
                         adjDetl.setAppeTime(now);
                         adjDetl.setAppeUser(userId);
+
+                        UUID uuid = UUID.randomUUID();
+                        adjDetl.setOrderNo(uuid.toString());
+                        adjDetl.setCsocode(locDetl.getThreeCode());
+                        adjDetl.setIsoseq(locDetl.getDeadTime());
+
                         adjDetlService.save(adjDetl, userId);
                     }
                     iterator.remove();
@@ -848,6 +854,7 @@
             adjDetl.setModiUser(userId);
             adjDetl.setAppeTime(now);
             adjDetl.setAppeUser(userId);
+
             adjDetlService.save(adjDetl, userId);
         }
 
@@ -864,6 +871,8 @@
             locDetl.setModiTime(now);
             locDetl.setAppeUser(userId);
             locDetl.setAppeTime(now);
+            locDetl.setThreeCode(adjust.getThreeCode());
+            locDetl.setDeadTime(adjust.getDeadTime());
             if (!locDetlService.insert(locDetl)) {
                 throw new CoolException("娣诲姞" + locDetl.getLocNo() + "搴撲綅锛�" + locDetl.getMatnr() + "鍟嗗搧锛�" + locDetl.getBatch() + "搴忓垪鐮佸簱瀛樻槑缁嗗け璐�");
             }
@@ -878,6 +887,12 @@
             adjDetl.setModiUser(userId);
             adjDetl.setAppeTime(now);
             adjDetl.setAppeUser(userId);
+
+            UUID uuid = UUID.randomUUID();
+            adjDetl.setOrderNo(uuid.toString());
+            adjDetl.setCsocode(locDetl.getThreeCode());
+            adjDetl.setIsoseq(locDetl.getDeadTime());
+
             adjDetlService.save(adjDetl, userId);
         }
         // 淇敼搴撲綅鐘舵��
diff --git a/src/main/java/com/zy/asrs/utils/SaasUtils.java b/src/main/java/com/zy/asrs/utils/SaasUtils.java
new file mode 100644
index 0000000..40589f4
--- /dev/null
+++ b/src/main/java/com/zy/asrs/utils/SaasUtils.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.utils;
+
+import com.core.common.SpringUtils;
+import com.zy.system.entity.SaasLog;
+import com.zy.system.service.SaasLogService;
+
+import java.util.Date;
+
+public class SaasUtils {
+    public static void insertLog(Integer type, String locNo, String matnr,Double anfme,String user){
+        SaasLogService bean = SpringUtils.getBean(SaasLogService.class);
+        SaasLog saasLog = new SaasLog();
+        saasLog.setType(type);
+        saasLog.setLocNo(locNo);
+        saasLog.setMatnr(matnr);
+        saasLog.setIoTime(new Date());
+        saasLog.setAnfme(anfme);
+        saasLog.setCreateBy(1L);
+        saasLog.setCreateByName(user);
+        bean.insert(saasLog);
+    }
+}
diff --git a/src/main/java/com/zy/common/entity/NodeExcel.java b/src/main/java/com/zy/common/entity/NodeExcel.java
new file mode 100644
index 0000000..8547df8
--- /dev/null
+++ b/src/main/java/com/zy/common/entity/NodeExcel.java
@@ -0,0 +1,18 @@
+package com.zy.common.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+@ExcelIgnoreUnannotated
+public class NodeExcel {
+    @ExcelProperty(index = 0, value = "浠撳簱")
+    private String warehouse;
+
+    @ExcelProperty(index = 1, value = "搴撳尯")
+    private String area;
+
+    @ExcelProperty(index = 2, value = "璐т綅")
+    private String allo;
+}
diff --git a/src/main/java/com/zy/common/entity/NodeExcelListener.java b/src/main/java/com/zy/common/entity/NodeExcelListener.java
new file mode 100644
index 0000000..7cd45bf
--- /dev/null
+++ b/src/main/java/com/zy/common/entity/NodeExcelListener.java
@@ -0,0 +1,146 @@
+package com.zy.common.entity;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
+import com.core.exception.CoolException;
+import com.zy.asrs.entity.Node;
+import com.zy.asrs.mapper.NodeMapper;
+import com.zy.asrs.service.NodeService;
+import com.zy.common.utils.NodeUtils;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public class NodeExcelListener extends AnalysisEventListener<NodeExcel> {
+    private int total = 0;
+    private Long userId;
+    private Long hostId;
+
+    public NodeExcelListener() {
+    }
+
+    public NodeExcelListener(Long userId, Long hostId) {
+        this.userId = userId;
+        this.hostId = hostId;
+    }
+
+    /**
+     * 姣忛殧5鏉″瓨鍌ㄦ暟鎹簱锛屽疄闄呬娇鐢ㄤ腑鍙互3000鏉★紝鐒跺悗娓呯悊list 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 50;
+
+    private final List<NodeExcel> list = new ArrayList<>();
+
+    /**
+     * 杩欓噷浼氫竴琛岃鐨勮繑鍥炲ご
+     */
+    @Override
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+    }
+
+    /**
+     * 杩欎釜姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤
+     */
+    @Override
+    public void invoke(NodeExcel excel, AnalysisContext ctx) {
+        NodeService nodeService = SpringUtils.getBean(NodeService.class);
+        NodeMapper nodeMapper = SpringUtils.getBean(NodeMapper.class);
+        Date now = new Date();
+        Node top = nodeService.getTop();
+        // 浠撳簱
+        if (!Cools.isEmpty(excel.getWarehouse())) {
+            Node wareHouse = nodeService.selectByUuid(excel.getWarehouse(), hostId, 1, top.getId());
+            if (wareHouse == null) {
+                wareHouse = new Node();
+                wareHouse.setHostId(this.hostId);
+                wareHouse.setUuid(excel.getWarehouse());
+                wareHouse.setName(excel.getWarehouse());
+                wareHouse.setType(1);
+                wareHouse.setParentId(top.getId());
+                wareHouse.setParentName(top.getName());
+                wareHouse.setLevel(top.getLevel() + 1);
+                NodeUtils nodeUtils = new NodeUtils();
+                nodeUtils.executePath(wareHouse);
+                wareHouse.setPath(nodeUtils.path.toString());
+                wareHouse.setNamePath(nodeUtils.pathName.toString());
+                wareHouse.setStatus(1);
+                wareHouse.setCreateTime(now);
+                wareHouse.setUpdateTime(now);
+                if (nodeMapper.insert(wareHouse) == 0) {
+                    throw new CoolException("淇濆瓨浠撳簱鏁版嵁澶辫触");
+                }
+                total ++;
+            }
+
+            // 搴撳尯
+            if (!Cools.isEmpty(excel.getArea())) {
+                Node area = nodeService.selectByUuid(excel.getArea(), hostId, 2, wareHouse.getId());
+                if (area == null) {
+                    area = new Node();
+                    area.setHostId(this.hostId);
+                    area.setUuid(excel.getArea());
+                    area.setName(excel.getArea());
+                    area.setType(2);
+                    area.setParentId(wareHouse.getId());
+                    area.setParentName(wareHouse.getName());
+                    area.setLevel(wareHouse.getLevel() + 1);
+                    NodeUtils nodeUtils = new NodeUtils();
+                    nodeUtils.executePath(area);
+                    area.setPath(nodeUtils.path.toString());
+                    area.setNamePath(nodeUtils.pathName.toString());
+                    area.setStatus(1);
+                    area.setCreateTime(now);
+                    area.setUpdateTime(now);
+                    if (nodeMapper.insert(area) == 0) {
+                        throw new CoolException("淇濆瓨搴撳尯鏁版嵁澶辫触");
+                    }
+                    total ++;
+                }
+
+                // 璐т綅
+                if (!Cools.isEmpty(excel.getAllo())) {
+                    Node allo = nodeService.selectByUuid(excel.getAllo(), hostId, 3);
+                    if (allo == null) {
+                        allo = new Node();
+                        allo.setHostId(this.hostId);
+                        allo.setUuid(excel.getAllo());
+                        allo.setName(excel.getAllo());
+                        allo.setType(3);
+                        allo.setParentId(area.getId());
+                        allo.setParentName(area.getName());
+                        allo.setLevel(area.getLevel() + 1);
+                        NodeUtils nodeUtils = new NodeUtils();
+                        nodeUtils.executePath(allo);
+                        allo.setPath(nodeUtils.path.toString());
+                        allo.setNamePath(nodeUtils.pathName.toString());
+                        allo.setStatus(1);
+                        allo.setCreateTime(now);
+                        allo.setUpdateTime(now);
+                        if (nodeMapper.insert(allo) == 0) {
+                            throw new CoolException("淇濆瓨璐т綅鏁版嵁澶辫触");
+                        }
+                        total ++;
+                    }
+                }
+
+            }
+        }
+    }
+
+    /**
+     * 鎵�鏈夋暟鎹В鏋愬畬鎴愪簡璋冪敤
+     * 閫傚悎浜嬪姟
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext ctx) {
+        //log.info("鏂板{}鏉$墿鏂欎俊鎭紒", total);
+    }
+
+    public int getTotal() {
+        return total;
+    }
+}
diff --git a/src/main/java/com/zy/common/utils/NodeUtils.java b/src/main/java/com/zy/common/utils/NodeUtils.java
index 1703cdb..1c986d1 100644
--- a/src/main/java/com/zy/common/utils/NodeUtils.java
+++ b/src/main/java/com/zy/common/utils/NodeUtils.java
@@ -1,7 +1,9 @@
 package com.zy.common.utils;
 
 import com.core.common.SpringUtils;
+import com.zy.asrs.entity.Node;
 import com.zy.asrs.entity.Tag;
+import com.zy.asrs.service.NodeService;
 import com.zy.asrs.service.TagService;
 
 /**
@@ -43,4 +45,19 @@
         }
     }
 
+    public void executePath(Node node) {
+        NodeService bean = SpringUtils.getBean(NodeService.class);
+        Node parent = bean.selectById(node.getParentId());
+        if (null != parent) {
+            path.insert(0, parent.getId()).insert(0,",");
+            pathName.insert(0, parent.getName()).insert(0,",");
+            if (parent.getParentId() != null) {
+                executePath(parent);
+            } else {
+                path.deleteCharAt(0);
+                pathName.deleteCharAt(0);
+            }
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/common/utils/TreeUtils.java b/src/main/java/com/zy/common/utils/TreeUtils.java
index 271ee28..76f567c 100644
--- a/src/main/java/com/zy/common/utils/TreeUtils.java
+++ b/src/main/java/com/zy/common/utils/TreeUtils.java
@@ -1,7 +1,10 @@
 package com.zy.common.utils;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.zy.asrs.entity.Node;
 import com.zy.asrs.entity.Tag;
+import com.zy.asrs.service.NodeService;
 import com.zy.asrs.service.TagService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
@@ -18,6 +21,8 @@
 
     @Autowired
     private TagService tagService;
+    @Autowired
+    private NodeService nodeService;
 
     /******************************** 褰掔被鏍� *********************************/
 
@@ -86,4 +91,51 @@
         }
     }
 
+    /**
+     * 鑾峰彇鏍戝浘鏁版嵁缁撴瀯
+     */
+    @Cacheable(cacheNames="nodeTree",key="#id")
+    public ArrayList<Map> getNodeTree(String id, Long hostId){
+        ArrayList<Map> result = new ArrayList<>();
+        Node node = nodeService.selectById(id);
+        // 涓昏妭鐐�
+        Map<String, Object> map = new HashMap<>();
+        map.put("title", node.getName());
+        map.put("id", node.getId());
+        map.put("spread", true);
+        List<Map> childrens = new ArrayList<>();
+        map.put("children", childrens);
+        dealNode(node, childrens, hostId);
+        result.add(map);
+        // 寮�濮嬪鐞嗗瓧鑺傜偣
+//        deal(tag, childrens);
+        return result;
+    }
+
+    /**
+     * 閫掑綊鑾峰彇瀛愯妭鐐规暟鎹�
+     */
+    public void dealNode(Node parent, List<Map> list, Long hostId) {
+        Wrapper<Node> wrapper = new EntityWrapper<Node>()
+                .eq("parent_id", parent.getId())
+                .eq("status", "1")
+                .ne("type",3);
+        if (hostId != null) {
+            wrapper.eq("host_id", hostId);
+        }
+        List<Node> nodes = nodeService.selectList(wrapper);
+        for (Node node : nodes) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("title", node.getName());
+            map.put("id", node.getId());
+            map.put("spread", true);
+            List<Map> childrens = new ArrayList<>();
+            map.put("children", childrens);
+            dealNode(node, childrens, hostId);
+            list.add(map);
+        }
+    }
+
+
+
 }
diff --git a/src/main/java/com/zy/common/web/BaseController.java b/src/main/java/com/zy/common/web/BaseController.java
index a61e965..42e2e08 100644
--- a/src/main/java/com/zy/common/web/BaseController.java
+++ b/src/main/java/com/zy/common/web/BaseController.java
@@ -1,6 +1,5 @@
 package com.zy.common.web;
 
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotations.TableField;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
@@ -8,9 +7,13 @@
 import com.core.common.Cools;
 import com.core.controller.AbstractBaseController;
 import com.core.exception.CoolException;
+import com.zy.asrs.entity.Node;
 import com.zy.asrs.entity.Tag;
+import com.zy.asrs.service.NodeService;
 import com.zy.asrs.service.TagService;
 import com.zy.system.entity.User;
+import com.zy.system.entity.UserLogin;
+import com.zy.system.service.UserLoginService;
 import com.zy.system.service.UserService;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +36,11 @@
     private UserService userService;
     @Autowired
     private TagService tagService;
+    @Autowired
+    private NodeService nodeService;
+
+    @Autowired
+    private UserLoginService userLoginService;
 
     protected Long getUserId(){
         return Long.parseLong(String.valueOf(request.getAttribute("userId")));
@@ -58,6 +66,14 @@
 
     protected Tag getOriginTag(){
         return tagService.getTop();
+    }
+
+    protected Node getOriginNode(){
+        Node node = nodeService.getTop();
+        if (node == null) {
+            throw new CoolException("搴撳尯鏁版嵁閿欒");
+        }
+        return node;
     }
 
     /**
@@ -158,4 +174,32 @@
             }
         }
     }
+
+    protected <T> void hostEq(EntityWrapper<T> wrapper){
+        Long hostId = getHostId();
+        if (hostId != null) {
+            wrapper.eq("host_id", hostId);
+        }
+    }
+
+    protected Long getHostId(){
+        if (getUserId() == 9527) {
+            return null;
+        }
+        User user = getUser();
+        if (user.getRoleId() == 1) {
+            String hostId = String.valueOf(request.getAttribute("hostId"));
+            if (Cools.isEmpty(hostId)) {
+                UserLogin userLogin = userLoginService.selectOne(new EntityWrapper<UserLogin>().eq("user_id", user.getId()));
+                if (userLogin != null) {
+                    //return userLogin.getHostId();
+                    return 1L;
+                }
+            }
+            return Long.parseLong(hostId);
+        } else {
+            return user.getHostId();
+        }
+    }
+
 }
diff --git a/src/main/java/com/zy/system/controller/SaasLogController.java b/src/main/java/com/zy/system/controller/SaasLogController.java
new file mode 100644
index 0000000..95eff11
--- /dev/null
+++ b/src/main/java/com/zy/system/controller/SaasLogController.java
@@ -0,0 +1,126 @@
+package com.zy.system.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+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.common.web.BaseController;
+import com.zy.system.entity.SaasLog;
+import com.zy.system.service.SaasLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class SaasLogController extends BaseController {
+
+    @Autowired
+    private SaasLogService saasLogService;
+
+    @RequestMapping(value = "/saasLog/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(saasLogService.selectById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/saasLog/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 Map<String, Object> param){
+        EntityWrapper<SaasLog> wrapper = new EntityWrapper<>();
+        excludeTrash(param);
+        convert(param, wrapper);
+        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
+        wrapper.orderBy("io_time",false);
+        return R.ok(saasLogService.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 {
+                wrapper.like(entry.getKey(), val);
+            }
+        }
+    }
+
+    @RequestMapping(value = "/saasLog/add/auth")
+    @ManagerAuth
+    public R add(SaasLog saasLog) {
+        saasLogService.insert(saasLog);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/saasLog/update/auth")
+	@ManagerAuth
+    public R update(SaasLog saasLog){
+        if (Cools.isEmpty(saasLog) || null==saasLog.getId()){
+            return R.error();
+        }
+        saasLogService.updateById(saasLog);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/saasLog/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            saasLogService.deleteById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/saasLog/export/auth")
+    @ManagerAuth
+    public R export(@RequestBody JSONObject param){
+        EntityWrapper<SaasLog> wrapper = new EntityWrapper<>();
+        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+        Map<String, Object> map = excludeTrash(param.getJSONObject("saasLog"));
+        convert(map, wrapper);
+        List<SaasLog> list = saasLogService.selectList(wrapper);
+        return R.ok(exportSupport(list, fields));
+    }
+
+    @RequestMapping(value = "/saasLogQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        EntityWrapper<SaasLog> wrapper = new EntityWrapper<>();
+        wrapper.like("id", condition);
+        Page<SaasLog> page = saasLogService.selectPage(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (SaasLog saasLog : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", saasLog.getId());
+            map.put("value", saasLog.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping(value = "/saasLog/check/column/auth")
+    @ManagerAuth
+    public R query(@RequestBody JSONObject param) {
+        Wrapper<SaasLog> wrapper = new EntityWrapper<SaasLog>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+        if (null != saasLogService.selectOne(wrapper)){
+            return R.parse(BaseRes.REPEAT).add(getComment(SaasLog.class, String.valueOf(param.get("key"))));
+        }
+        return R.ok();
+    }
+
+}
diff --git a/src/main/java/com/zy/system/entity/SaasLog.java b/src/main/java/com/zy/system/entity/SaasLog.java
new file mode 100644
index 0000000..63dd39a
--- /dev/null
+++ b/src/main/java/com/zy/system/entity/SaasLog.java
@@ -0,0 +1,101 @@
+package com.zy.system.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("sys_saas_log")
+public class SaasLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ApiModelProperty(value= "id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * {0:鍏ュ簱,1:鍑哄簱}
+     */
+    @ApiModelProperty(value= "{0:鍏ュ簱,1:鍑哄簱}")
+    private Integer type;
+
+    @ApiModelProperty(value= "")
+    @TableField("loc_no")
+    private String locNo;
+
+    @ApiModelProperty(value= "")
+    private String matnr;
+
+    @ApiModelProperty(value= "")
+    @TableField("io_time")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date ioTime;
+
+    @ApiModelProperty(value= "")
+    @TableField("create_by")
+    private Long createBy;
+
+    @TableField("anfme")
+    private Double anfme;
+
+    @ApiModelProperty(value= "")
+    @TableField("create_by_name")
+    private String createByName;
+
+    public SaasLog() {}
+
+    public SaasLog(Long id, Integer type, String locNo, String matnr, Date ioTime, Long createBy) {
+        this.id = id;
+        this.type = type;
+        this.locNo = locNo;
+        this.matnr = matnr;
+        this.ioTime = ioTime;
+        this.createBy = createBy;
+    }
+
+//    SaasLog saasLog = new SaasLog(
+//            null,    // id[闈炵┖]
+//            null,    // {0:鍏ュ簱,1:鍑哄簱}
+//            null,    // 
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+    public String getIoTime$(){
+        if (Cools.isEmpty(this.ioTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.ioTime);
+    }
+
+    public String getType$(){
+        if (this.type ==0) {
+            return "鍏ュ簱";
+           } else if (this.type == 1) {
+            return "鍑哄簱";
+        } else if (this.type == 2) {
+            return "搴撲綅绉昏浆";
+        } else if (this.type == 3) {
+            return "搴撳瓨璋冩暣";
+        }else {
+            return "";
+        }
+
+    }
+
+
+}
diff --git a/src/main/java/com/zy/system/entity/UserLogin.java b/src/main/java/com/zy/system/entity/UserLogin.java
index 52d5a5a..550db54 100644
--- a/src/main/java/com/zy/system/entity/UserLogin.java
+++ b/src/main/java/com/zy/system/entity/UserLogin.java
@@ -7,12 +7,14 @@
 import com.zy.system.service.UserService;
 import com.core.common.Cools;
 import com.core.common.SpringUtils;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
 @TableName("sys_user_login")
+@Data
 public class UserLogin implements Serializable {
 
     private static final long serialVersionUID = 1L;
diff --git a/src/main/java/com/zy/system/mapper/SaasLogMapper.java b/src/main/java/com/zy/system/mapper/SaasLogMapper.java
new file mode 100644
index 0000000..e99397e
--- /dev/null
+++ b/src/main/java/com/zy/system/mapper/SaasLogMapper.java
@@ -0,0 +1,12 @@
+package com.zy.system.mapper;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.zy.system.entity.SaasLog;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface SaasLogMapper extends BaseMapper<SaasLog> {
+
+}
diff --git a/src/main/java/com/zy/system/service/SaasLogService.java b/src/main/java/com/zy/system/service/SaasLogService.java
new file mode 100644
index 0000000..1d8693b
--- /dev/null
+++ b/src/main/java/com/zy/system/service/SaasLogService.java
@@ -0,0 +1,8 @@
+package com.zy.system.service;
+
+import com.baomidou.mybatisplus.service.IService;
+import com.zy.system.entity.SaasLog;
+
+public interface SaasLogService extends IService<SaasLog> {
+
+}
diff --git a/src/main/java/com/zy/system/service/impl/SaasLogServiceImpl.java b/src/main/java/com/zy/system/service/impl/SaasLogServiceImpl.java
new file mode 100644
index 0000000..733913b
--- /dev/null
+++ b/src/main/java/com/zy/system/service/impl/SaasLogServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.system.service.impl;
+
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.system.entity.SaasLog;
+import com.zy.system.mapper.SaasLogMapper;
+import com.zy.system.service.SaasLogService;
+import org.springframework.stereotype.Service;
+
+@Service("saasLogService")
+public class SaasLogServiceImpl extends ServiceImpl<SaasLogMapper, SaasLog> implements SaasLogService {
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index d84dd0c..264e07c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -10,8 +10,8 @@
     enabled: false
   datasource:
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-    #url: jdbc:sqlserver://192.168.4.15:1433;databasename=tzskasrs
-    url: jdbc:sqlserver://localhost:1433;databasename=tzskasrs
+    url: jdbc:sqlserver://192.168.4.15:1433;databasename=tzskasrs
+    #url: jdbc:sqlserver://localhost:1433;databasename=tzskasrs
     username: sa
     password: sa@123
   mvc:
diff --git a/src/main/resources/mapper/ManLocDetlMapper.xml b/src/main/resources/mapper/ManLocDetlMapper.xml
new file mode 100644
index 0000000..395c9db
--- /dev/null
+++ b/src/main/resources/mapper/ManLocDetlMapper.xml
@@ -0,0 +1,377 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.ManLocDetlMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.ManLocDetl">
+        <result column="host_id" property="hostId" />
+        <result column="loc_no" property="locNo" />
+        <result column="node_id" property="nodeId" />
+        <result column="zpallet" property="zpallet" />
+        <result column="anfme" property="anfme" />
+        <result column="matnr" property="matnr" />
+        <result column="maktx" property="maktx" />
+        <result column="name" property="name" />
+        <result column="specs" property="specs" />
+        <result column="model" property="model" />
+        <result column="batch" property="batch" />
+        <result column="unit" property="unit" />
+        <result column="barcode" property="barcode" />
+        <result column="doc_id" property="docId" />
+        <result column="doc_num" property="docNum" />
+        <result column="cust_name" property="custName" />
+        <result column="item_num" property="itemNum" />
+        <result column="count" property="count" />
+        <result column="price" property="price" />
+        <result column="weight" property="weight" />
+        <result column="status" property="status" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="modi_time" property="modiTime" />
+        <result column="memo" property="memo" />
+        <result column="owner" property="owner" />
+        <result column="payment" property="payment" />
+        <result column="real_anfme" property="realAnfme" />
+        <result column="order_no" property="orderNo" />
+    </resultMap>
+
+    <sql id="locDetlCondition">
+        <if test="host_id != null and host_id != ''">
+            and mld.host_id = #{host_id}
+        </if>
+        <if test="loc_no != null and loc_no != ''">
+            and mld.loc_no like concat('%',#{loc_no},'%')
+        </if>
+        <if test="locNo != null and locNo != ''">
+            and mld.loc_no like concat('%',#{loc_no},'%')
+        </if>
+        <if test="matnr != null and matnr != ''">
+            and mld.matnr like concat('%',#{matnr},'%')
+        </if>
+        <if test="maktx != null and maktx != ''">
+            and mld.maktx like concat('%',#{maktx},'%')
+        </if>
+        <if test="zpallet != null and zpallet != ''">
+            and mld.zpallet like concat('%',#{zpallet},'%')
+        </if>
+        <if test="startTime!=null and endTime!=null">
+            and mld.update_time between #{startTime} and #{endTime}
+        </if>
+    </sql>
+    <sql id="locDetlCondition2">
+        <if test="host_id != null and host_id != ''">
+            and v.host_id = #{host_id}
+        </if>
+        <if test="loc_no != null and loc_no != ''">
+            and v.loc_no like concat('%',#{loc_no},'%')
+        </if>
+        <if test="locNo != null and locNo != ''">
+            and v.loc_no like concat('%',#{loc_no},'%')
+        </if>
+        <if test="matnr != null and matnr != ''">
+            and v.matnr like concat('%',#{matnr},'%')
+        </if>
+        <if test="maktx != null and maktx != ''">
+            and v.maktx like concat('%',#{maktx},'%')
+        </if>
+        <if test="startTime!=null and endTime!=null">
+            and v.update_time between #{startTime} and #{endTime}
+        </if>
+    </sql>
+
+    <select id="listByPage" resultMap="BaseResultMap" parameterType="java.util.Map">
+        select * from
+        (
+        SELECT
+        ROW_NUMBER() over (order by mld.create_time desc) as row,
+        mld.*
+        FROM man_loc_detl mld
+        LEFT JOIN man_node mn ON mld.node_id = mn.id
+        LEFT JOIN man_mat mm ON mld.matnr = mm.matnr
+        LEFT JOIN man_tag mt ON mm.tag_id = mt.id
+        WHERE 1=1
+         AND (CHARINDEX(#{node_id}, mn.path) > 0 OR mn.id = #{node_id})
+        <include refid="locDetlCondition"></include>
+        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+    </select>
+
+    <select id="listByPageCount" parameterType="java.util.Map" resultType="java.lang.Integer">
+        select
+        count(1)
+        FROM man_loc_detl mld
+        LEFT JOIN man_node mn ON mld.node_id = mn.id
+        LEFT JOIN man_mat mm ON mld.matnr = mm.matnr
+        LEFT JOIN man_tag mt ON mm.tag_id = mt.id
+        WHERE 1=1
+        AND (CHARINDEX(#{node_id}, mn.path) > 0 OR mn.id = #{node_id})
+        <include refid="locDetlCondition"></include>
+    </select>
+
+    <select id="selectByLocNoAndMatnr" resultMap="BaseResultMap">
+        select top 1 *
+        from man_loc_detl
+        where 1=1
+        and anfme > 0
+        <if test="nodeId != null and nodeId != ''">
+            and node_id = #{nodeId}
+        </if>
+        <if test="matnr != null and matnr != ''">
+            and matnr = #{matnr}
+        </if>
+        order by create_time asc
+    </select>
+
+    <select id="selectCountByMatnr" resultType="java.lang.Double">
+       select sum(anfme) as count from man_loc_detl where 1=1 and matnr = #{matnr} and host_id = #{hostId}
+    </select>
+
+    <update id="reduceStock">
+        update man_loc_detl
+        set anfme = anfme - #{anfme}
+        , update_time = getdate()
+        where 1=1
+        and node_id = #{nodeId}
+        and matnr = #{matnr}
+    </update>
+
+    <update id="incrementStock">
+        update man_loc_detl
+        set anfme = anfme + #{anfme}
+        , update_time = getdate()
+        where 1=1
+        and node_id = #{nodeId}
+        and matnr = #{matnr}
+    </update>
+
+    <update id="removeStock">
+        delete from man_loc_detl
+        where 1=1
+        and node_id = #{nodeId}
+        and matnr = #{matnr}
+    </update>
+
+    <select id="selectByPrior" resultMap="BaseResultMap">
+        select
+        mld.*
+        from man_loc_detl mld
+        left join man_prior mp on mld.node_id = mp.node_id and mld.matnr = mp.matnr
+        where 1=1
+        <if test="hostId != null and hostId != ''">
+            and mld.host_id = #{hostId}
+        </if>
+        <if test="nodeId != null and nodeId != ''">
+            and mld.node_id = #{nodeId}
+        </if>
+        <if test="matnr != null and matnr != ''">
+            and mld.matnr = #{matnr}
+        </if>
+        and mld.anfme > 0
+        and mp.status = 1
+        order by mp.prio desc, mld.create_time asc
+    </select>
+
+    <select id="getLocDetlStatis" resultMap="BaseResultMap">
+        select
+        ROW_NUMBER() over (order by sum(a.anfme) desc) as row
+        , a.matnr
+        , sum(a.anfme) as anfme
+        from man_loc_detl a
+        where 1=1
+        group by a.matnr
+    </select>
+
+    <select id="selectByNodeUuid" resultMap="BaseResultMap">
+        select * from man_loc_detl mld left join man_node mn on mld.node_id = mn.id
+        where 1=1
+        and mn.uuid = #{uuid}
+        and mld.hostId = #{hostId}
+        and mld.status = 1
+        order by mld.create_time
+    </select>
+
+    <select id="getStockStatis" resultMap="BaseResultMap">
+        select * from
+        (
+        select
+        ROW_NUMBER() over (order by a.matnr, sum(a.anfme) desc) as row
+        , a.matnr
+        , sum(a.anfme) as anfme
+        from man_loc_detl a
+        where 1=1
+        <include refid="stockOutCondition"></include>
+        group by a.matnr
+        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+    </select>
+
+    <select id="getStockStatisCount" parameterType="java.util.Map" resultType="java.lang.Integer">
+        select count(1) as count from
+        (
+        select
+        a.matnr
+        from man_loc_detl a
+        where 1=1
+        <include refid="stockOutCondition"></include>
+        group by a.matnr
+        ) b
+    </select>
+
+    <sql id="stockOutCondition">
+        <if test="host_id!=null and host_id!='' ">
+            and a.host_id = #{host_id}
+        </if>
+        <if test="node_id!=null and node_id!='' ">
+            and a.node_id like '%' + #{node_id} + '%'
+        </if>
+        <if test="loc_no!=null and loc_no!='' ">
+            and a.loc_no like '%' + #{loc_no} + '%'
+        </if>
+        <if test="matnr!=null and matnr!='' ">
+            and a.matnr like '%' + #{matnr} + '%'
+        </if>
+        <if test="maktx!=null and maktx!='' ">
+            and a.maktx like '%' + #{maktx} + '%'
+        </if>
+    </sql>
+
+    <select id="getStockStatisExcel" resultMap="BaseResultMap">
+        select
+        ROW_NUMBER() over (order by a.matnr, sum(a.anfme) desc) as row
+        , a.matnr
+        , sum(a.anfme) as anfme
+        from man_loc_detl a
+        where 1=1
+        and a.host_id = #{hostId}
+        group by a.matnr
+    </select>
+    <select id="selectLocDetlSumQty" resultType="java.lang.Double"></select>
+
+    <select id="selectLocNo0" resultMap="BaseResultMap">
+        select * from man_loc_detl
+        where loc_no = #{locNo}
+        and matnr = #{matnr}
+    </select>
+    <select id="selectItem" resultMap="BaseResultMap">
+        select top 1 * from man_loc_detl
+        where loc_no = #{locNo}
+        and matnr = #{matnr}
+        <if test="batch!=null and batch!='' ">
+            and batch = #{batch}
+        </if>
+        <!--        <choose>-->
+        <!--            <when test="batch != null and batch != ''">-->
+        <!--                and batch = #{batch}-->
+        <!--            </when>-->
+        <!--            <otherwise>-->
+        <!--                and (batch IS NULL OR batch = '')-->
+        <!--            </otherwise>-->
+        <!--        </choose>-->
+    </select>
+
+    <select id="listByOutPage" resultMap="BaseResultMap">
+        select * from
+        (
+        SELECT
+        ROW_NUMBER() over (order by mld.create_time desc) as row,
+        mld.*
+        FROM man_loc_detl mld
+        LEFT JOIN man_node mn ON mld.node_id = mn.id
+        LEFT JOIN man_mat mm ON mld.matnr = mm.matnr
+        LEFT JOIN man_tag mt ON mm.tag_id = mt.id
+        WHERE 1=1
+        <include refid="locDetlCondition"></include>
+        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+    </select>
+    <select id="listByOutPageCount" resultType="java.lang.Long">
+        select
+        count(1)
+        FROM man_loc_detl mld
+        LEFT JOIN man_node mn ON mld.node_id = mn.id
+        LEFT JOIN man_mat mm ON mld.matnr = mm.matnr
+        LEFT JOIN man_tag mt ON mm.tag_id = mt.id
+        WHERE 1=1
+        <include refid="locDetlCondition"></include>
+    </select>
+    <select id="selectAllPage" resultMap="BaseResultMap">
+        select * from
+        (
+        SELECT
+        ROW_NUMBER() over (order by v.loc_no desc) as row,
+            v.*
+        FROM [dbo].[man_view_asrs_saas] v
+        WHERE 1=1
+        <include refid="locDetlCondition2"></include>
+        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+    </select>
+    <select id="selectAllPageSize" resultType="java.lang.Long">
+        select
+        count(1)
+        FROM [dbo].[man_view_asrs_saas] v
+        WHERE 1=1
+        <include refid="locDetlCondition2"></include>
+    </select>
+
+
+    <update id="updateLocNo0">
+        update man_loc_detl set loc_no = #{locNo}
+        where node_id = #{nodeId}
+    </update>
+
+    <delete id="deleteLocNo0">
+        delete from man_loc_detl
+        where loc_no = #{locNo}
+        and matnr = #{matnr}
+    </delete>
+
+    <update id="updateAnfme0">
+        update man_loc_detl set anfme = #{anfme}
+        where node_id = #{nodeId} ;
+    </update>
+
+    <select id="selectInventory" resultMap="BaseResultMap">
+        select top 1 * from man_loc_detl
+        where loc_no=#{LocNo}
+        and 1=1
+        and matnr=#{Matnr}
+        <choose>
+            <when test="batch != null and batch != ''">
+                and batch = #{batch}
+            </when>
+            <otherwise>
+                and (batch IS NULL OR batch = '')
+            </otherwise>
+        </choose>
+    </select>
+    <delete id="deleteDatailed">
+        delete from man_loc_detl
+        where loc_no = #{locNo}
+        and matnr = #{matnr}
+        <choose>
+            <when test="batch != null and batch != ''">
+                and batch = #{batch}
+            </when>
+            <otherwise>
+                and (batch IS NULL OR batch = '')
+            </otherwise>
+        </choose>
+    </delete>
+
+    <update id="increase">
+        update man_loc_detl
+        set  anfme= #{anfme}
+        , modi_time = getdate()
+        ,weight=#{weight}
+        where 1=1
+        and loc_no = #{locNo}
+        and matnr = #{matnr}
+<!--        <choose>-->
+<!--            <when test="batch != null and batch!=''  ">-->
+<!--                and batch = #{batch}-->
+<!--            </when>-->
+<!--            <otherwise>-->
+<!--                and (batch IS NULL OR batch = '')-->
+<!--            </otherwise>-->
+<!--        </choose>-->
+    </update>
+
+</mapper>
diff --git a/src/main/webapp/static/js/adjDetl/adjDetl.js b/src/main/webapp/static/js/adjDetl/adjDetl.js
index 299230f..93703be 100644
--- a/src/main/webapp/static/js/adjDetl/adjDetl.js
+++ b/src/main/webapp/static/js/adjDetl/adjDetl.js
@@ -21,9 +21,12 @@
             // {type: 'checkbox'}
 //            ,{field: 'id', title: 'ID', sort: true,align: 'center', fixed: 'left', width: 80}
 //             {field: 'adjId', align: 'center',title: '搴忓彿'}
-            {field: 'locNo', align: 'center',title: '搴撲綅鍙�'}
+            {field: 'orderNo', align: 'center',title: '璁㈠崟鍙�'}
+            ,{field: 'locNo', align: 'center',title: '搴撲綅鍙�'}
             ,{field: 'matnr', align: 'center',title: '鐗╂枡鍙�'}
-            ,{field: 'batch', align: 'center',title: '搴忓垪鐮�'}
+            ,{field: 'csocode', align: 'center',title: '閿�鍞鍗曞彿'}
+            ,{field: 'isoseq', align: 'center',title: '閿�鍞鍗曡鍙�'}
+            ,{field: 'batch', align: 'center',title: '搴忓垪鐮�',hide: true}
             // ,{field: 'oriCtns', align: 'center',title: '鍘熺鏁�'}
             ,{field: 'oriQty', align: 'center',title: '鍘熸暟閲�'}
             // ,{field: 'oriWt', align: 'center',title: '鍘熼噸閲�'}
diff --git a/src/main/webapp/static/js/common.js b/src/main/webapp/static/js/common.js
index 368fff0..448053b 100644
--- a/src/main/webapp/static/js/common.js
+++ b/src/main/webapp/static/js/common.js
@@ -229,8 +229,9 @@
     ,{field: 'matnr', align: 'center',title: '瀛樿揣缂栫爜'}
     ,{field: 'batch', align: 'center',title: '搴忓垪鐮�', width: 300, sort:true, hide: true}
     ,{field: 'maktx', align: 'center',title: '瀛樿揣鍚嶇О'}
+    ,{field: 'orderNo', align: 'center',title: '鍗曟嵁缂栧彿', hide: false}
     ,{field: 'threeCode', align: 'center',title: '閿�鍞鍗曞彿'}
-    ,{field: 'dead_time', align: 'center',title: '閿�鍞鍗曡鍙�'}
+    ,{field: 'deadTime', align: 'center',title: '閿�鍞鍗曡鍙�'}
     ,{field: 'specs', align: 'center',title: '瑙勬牸鍨嬪彿', hide: false}
     ,{field: 'model', align: 'center',title: '閫氱敤鍨嬪彿', hide: false}
 
diff --git a/src/main/webapp/static/js/manLocDetl/manLocDetl.js b/src/main/webapp/static/js/manLocDetl/manLocDetl.js
new file mode 100644
index 0000000..e1d3c38
--- /dev/null
+++ b/src/main/webapp/static/js/manLocDetl/manLocDetl.js
@@ -0,0 +1,578 @@
+var pageCurr;
+function getCol() {
+    var cols = [
+        {field: 'locNo', align: 'center',title: '搴撲綅鍙�'}
+        ,{field: 'suppCode', align: 'center',title: '鏂欐兂鐮�', sort:true}
+        ,{field: 'matnr', align: 'center',title: '瀛樿揣缂栫爜', sort:true}
+        ,{field: 'maktx', align: 'center',title: '瀛樿揣鍚嶇О', sort:true}
+        ,{field: 'docNum', align: 'center',title: '鍗曟嵁缂栧彿', hide: true}
+        ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+        ,{field: 'threeCode', align: 'center',title: '閿�鍞鍗曞彿'}
+        ,{field: 'dead_time', align: 'center',title: '閿�鍞鍗曡鍙�'}
+        ,{field: 'specs', align: 'center',title: '瑙勬牸鍨嬪彿', hide: false}
+        ,{field: 'model', align: 'center',title: '閫氱敤鍨嬪彿', hide: false}
+        ,{field: 'brand', align: 'center',title: '瀛樿揣鍒嗙被缂栫爜', hide: true}
+        ,{field: 'color', align: 'center',title: '瀛樿揣鍒嗙被鍚嶇О', hide: true}
+        ,{field: 'unit', align: 'center',title: '璁¢噺鍗曚綅', hide: true}
+        ,{field: 'price', align: 'center',title: '杩涢」绋�', hide: true}
+        ,{field: 'units', align: 'center',title: '閿�椤圭◣', hide: true}
+        ,{field: 'dsDate', align: 'center',title: '鍚敤鏃ユ湡', hide: true}
+        ,{field: 'supp', align: 'center',title: '寤烘。浜�', hide: true}
+        ,{field: 'dInvCreateDatetime', align: 'center',title: '寤烘。鏃ユ湡', hide: true}
+
+        // ,{field: 'specs', align: 'center',title: '瑙勬牸'}
+        // ,{field: 'weight', align: 'center',title: '搴撲綅鎬婚噸閲�', hide: false}
+        //
+        // ,{field: 'batch', align: 'center',title: '鎵瑰彿', width: 300, sort:true, hide: true}
+        // ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+        // ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜'}
+        // ,{field: 'model', align: 'center',title: '浠g爜', 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: '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}
+        // ,{field: 'owner$', align: 'center',title: '璐т富', hide: false}
+        // ,{field: 'status$', align: 'center',title: '鏄庣粏閿�', hide: false}
+        // ,{field: 'payment$', align: 'center',title: '璐х墿褰㈡��', hide: false}
+
+    ];
+
+    // cols.push.apply(cols, detlCols);
+    cols.push({field: 'modiUser$', align: 'center',title: '淇敼浜哄憳',hide: true}
+        ,{field: 'modiTime$', align: 'center',title: '淇敼鏃堕棿'}
+    )
+    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+'/manLocDetl/list/auth',
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        even: true,
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        cols: [getCol()],
+        request: {
+            pageName: 'curr',
+            pageSize: 'limit'
+        },
+        parseData: function (res) {
+            console.log(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';
+                }
+            });
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    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+"/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+"/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+"/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+"/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);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    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 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/node/node.js b/src/main/webapp/static/js/node/node.js
new file mode 100644
index 0000000..e53d167
--- /dev/null
+++ b/src/main/webapp/static/js/node/node.js
@@ -0,0 +1,370 @@
+var insTb;
+var admin;
+var areas;
+var matXmSelect;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).extend({
+    dropdown: 'dropdown/dropdown',
+}).use(['form','treeTable', 'admin', 'xmSelect', 'dropdown', 'element','layer'], function() {
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var form = layui.form;
+    admin = layui.admin;
+    var treeTable = layui.treeTable;
+    var xmSelect = layui.xmSelect;
+    var tbDataList = [];
+
+    insTb = treeTable.render({
+        elem: '#node',
+        url: baseUrl+'/node/list/tree/auth',
+        headers: {token: localStorage.getItem('token')},
+        height: 'full-200',
+        toolbar: '#toolbar',
+        treeLinkage:false,
+        tree: {
+            iconIndex: 2,           // 鎶樺彔鍥炬爣鏄剧ず鍦ㄧ鍑犲垪
+            isPidData: true,        // 鏄惁鏄痠d銆乸id褰㈠紡鏁版嵁
+            idName: 'id',           // id瀛楁鍚嶇О
+            pidName: 'parentId'     // pid瀛楁鍚嶇О
+        },
+        cols: [[
+            {type: 'checkbox'},
+            {type: 'numbers'}
+            ,{field: 'name', align: 'left',title: '缂栧彿/鍚嶇О', minWidth: 150}
+            // ,{field: 'uuid', left: 'center',title: '缂栧彿/鍚嶇О', minWidth: 150}
+            ,{field: 'type$', align: 'center',title: '绫诲瀷', templet: '#typeTpl'}
+            // ,{field: 'leading', align: 'center',title: '璐熻矗浜�'}
+            // ,{field: 'img', align: 'center',title: '鍥剧墖', hide: true}
+            // ,{field: 'brief', align: 'center',title: '绠�瑕佹弿杩�'}
+            // ,{field: 'count', align: 'center',title: '鏁伴噺'}
+            // ,{field: 'sort', align: 'center',title: '鎺掑簭'}
+            ,{field: 'status$', align: 'center',title: '鐘舵��', hide: true}
+            ,{field: 'row1$', align: 'center',title: '鎺�'}
+            ,{field: 'bay1$', align: 'center',title: '鍒�'}
+            ,{field: 'lev1$', align: 'center',title: '灞�'}
+            ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'}
+            ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳'}
+            ,{field: 'memo', align: 'center',title: '澶囨敞', hide: true}
+
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:150}
+        ]],
+        done: function (data) {
+            console.log(data)
+            $('.ew-tree-table-box').css('height', '100%');
+            insTb.expandAll();
+            tbDataList = data;
+
+        }
+    });
+
+    /* 琛ㄦ牸澶村伐鍏锋爮鐐瑰嚮浜嬩欢 */
+    treeTable.on('toolbar(node)', function (obj) {
+        var checkRows = insTb.checkStatus();
+        if (obj.event === 'add') { // 娣诲姞
+            showEditModel();
+        } else if (obj.event === 'del') { // 鍒犻櫎
+            if (checkRows.length === 0) {
+                layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                return;
+            }
+            var ids = checkRows.map(function (d) {
+                if (!d.LAY_INDETERMINATE) {
+                    return d.id;
+                } else {
+                    return null;
+                }
+            });
+            doDel({ids: ids});
+        } else if (obj.event === 'printBatch') {
+            if (checkRows.length === 0) {
+                layer.msg('璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁', {icon: 2});
+                return;
+            }
+            var printContent = checkRows.map(function (d) {
+                if (!d.LAY_INDETERMINATE && d.type === 3) {
+                    return d.name;
+                } else {
+                    return null;
+                }
+            });
+            printBatch(printContent, 1);
+        }else if (obj.event === 'nodeInit'){
+            nodeInit();
+        }
+    });
+
+    /* 琛ㄦ牸鎿嶄綔鍒楃偣鍑讳簨浠� */
+    treeTable.on('tool(node)', function (obj) {
+        if (obj.event === 'edit') { // 淇敼
+            showEditModel(obj.data);
+        } else if (obj.event === 'del') { // 鍒犻櫎
+            doDel(obj);
+        }
+    });
+
+    /* 鏄剧ず琛ㄥ崟寮圭獥 */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '璐т綅',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                // 鍥炴樉琛ㄥ崟鏁版嵁
+                form.val('detail', mData);
+                // 琛ㄥ崟鎻愪氦浜嬩欢
+                form.on('submit(editSubmit)', function (data) {
+                    data.field.parentId = insXmSel.getValue('valueStr');
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/node/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                insTb.refresh();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                // 娓叉煋涓嬫媺鏍�
+                var insXmSel = xmSelect.render({
+                    el: '#nodeParentSel',
+                    height: '250px',
+                    data: insTb.options.data,
+                    initValue: mData ? [mData.parentId] : [],
+                    model: {label: {type: 'text'}},
+                    prop: {
+                        name: 'name',
+                        value: 'id'
+                    },
+                    radio: true,
+                    clickClose: true,
+                    tree: {
+                        show: true,
+                        indent: 15,
+                        strict: false,
+                        expandedKeys: true
+                    }
+                });
+                // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function doDel(obj) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            var ids;
+            if (obj.data) {
+                ids = [];
+                ids[0] = obj.data.id;
+            } else {
+                ids = obj.ids;
+            }
+            $.ajax({
+                url: baseUrl+"/node/delete0/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        insTb.refresh();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎵归噺鎵撳嵃
+    function printBatch(printMsgList, type) {
+        var data = [];
+        for (var i = 0; i<printMsgList.length; i ++) {
+            if (printMsgList[i] != null && printMsgList[i] !== '') {
+                var barcodeUrl;
+                if (type === 1) {
+                    barcodeUrl = baseUrl+"/barcode/qrcode/auth?type="+type+"&param="+printMsgList[i]+"&width="+200+"&height="+70;
+                } else {
+                    barcodeUrl = baseUrl+"/barcode/qrcode/auth?type="+type+"&param="+printMsgList[i]+"&width="+400+"&height="+180;
+                }
+                data.push({
+                    item: printMsgList[i],
+                    barcodeUrl: barcodeUrl
+                })
+            }
+        }
+        var tpl = $('#locPrintTpl').html();
+        var template = Handlebars.compile(tpl);
+        var html = template({data: data});
+        var box = $("#printBox");
+        box.html(html);
+        box.show();
+        box.print({mediaPrint:true});
+        box.hide();
+    }
+
+
+    function nodeInit(){
+        layer.prompt({title: '璇疯緭鍏ュ彛浠わ紝骞堕噸缃簱浣�', formType: 1,   shadeClose: true}, function(pass, idx){
+            http.get(baseUrl+"/node/init/pwd", {pwd: pass}, function (res) {
+                if (res.data) {
+                    layer.open({
+                        type: 1,
+                        title: '鍒濆鍖栧簱浣�',
+                        area: ["400px"],
+                        maxmin: true,
+                        shadeClose: true,
+                        content: $("#resetLocDiv"),
+                        success: function (layero, index) {
+
+
+                            // 娓叉煋鐗╂枡閫夋嫨
+                            matXmSelect = xmSelect.render({
+                                el: '#mat',
+                                style: {
+                                    width: '200px'                                    ,
+                                    height: 'auto'
+                                },
+                                autoRow: true,
+                                toolbar: { show: true },
+                                filterable: true,
+                                remoteSearch: true,
+                                radio: true,
+                                clickClose: true,
+                                remoteMethod: function(val, cb, show){
+                                    $.ajax({
+                                        url: baseUrl+"/node/all/get/loc",
+                                        headers: {'token': localStorage.getItem('token')},
+                                        method: 'POST',
+                                        success: function (res) {
+                                            if (res.code === 200){
+                                                cb(res.data)
+                                            } else {
+                                                cb([]);
+                                                layer.msg(res.msg, {icon: 2});
+                                            }
+                                        }
+                                    });
+                                }
+                            })
+                        }
+                    })
+                } else {
+                    layer.msg("鍙d护閿欒");
+                }
+                layer.close(idx);
+            })
+        });
+    }
+
+    // 鍒濆鍖栦繚瀛�
+    form.on('submit(initDo)', function (data) {
+        areas =  matXmSelect.getValue();
+        data.field.value = areas[0].value;
+        data.field.name = areas[0].name;
+        console.log(data.field);
+        $.ajax({
+            url: baseUrl+"/node/init/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: data.field,
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200){
+                    layer.msg(res.msg);
+                    layer.closeAll();
+                    // tableReload(false);
+                } else if (res.code === 403){
+                    parent.location.href = "/";
+                }else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    });
+
+
+
+});
+
+// excel瀵煎叆妯℃澘涓嬭浇
+function excelMouldDownload(){
+    layer.load(1, {shade: [0.1,'#fff']});
+    location.href = baseUrl + "/node/excel/import/mould";
+    layer.closeAll('loading');
+}
+
+// excel瀵煎叆
+function importExcel() {
+    $("#importExcel").trigger("click");
+}
+function upload(obj){
+    if(!obj.files) {
+        return;
+    }
+    var file = obj.files[0];
+    admin.confirm('纭鍚屾 [' + file.name +'] 鏂囦欢鍚楋紵', function (index) {
+        layer.load(1, {shade: [0.1,'#fff']});
+        var url = baseUrl + "/node/excel/import/auth";
+        var form = new FormData();
+        form.append("file", file);
+        xhr = new XMLHttpRequest();
+        xhr.open("post", url, true); //post鏂瑰紡锛寀rl涓烘湇鍔″櫒璇锋眰鍦板潃锛宼rue 璇ュ弬鏁拌瀹氳姹傛槸鍚﹀紓姝ュ鐞嗐��
+        xhr.setRequestHeader('token', localStorage.getItem('token'));
+        xhr.onload = uploadComplete; //璇锋眰瀹屾垚
+        xhr.onerror =  uploadFailed; //璇锋眰澶辫触
+        xhr.onloadend = function () { // // 涓婁紶瀹屾垚閲嶇疆鏂囦欢娴�
+            layer.closeAll('loading');
+            $("#importExcel").val("");
+        };
+        // xhr.upload.onprogress = progressFunction;//銆愪笂浼犺繘搴﹁皟鐢ㄦ柟娉曞疄鐜般��
+        xhr.upload.onloadstart = function(){//涓婁紶寮�濮嬫墽琛屾柟娉�
+            ot = new Date().getTime();   //璁剧疆涓婁紶寮�濮嬫椂闂�
+            oloaded = 0;//璁剧疆涓婁紶寮�濮嬫椂锛屼互涓婁紶鐨勬枃浠跺ぇ灏忎负0
+        };
+        xhr.send(form);
+    }, function(index){
+        $("#importExcel").val("");
+    });
+}
+function uploadComplete(evt) {
+    var res = JSON.parse(evt.target.responseText);
+    if(res.code === 200) {
+        layer.msg(res.msg, {icon: 1});
+        insTb.refresh();
+    } else {
+        layer.msg(res.msg, {icon: 2});
+    }
+}
+function uploadFailed(evt) {
+    var res = JSON.parse(evt.target.responseText);
+    layer.msg(res.msg, {icon: 2});
+}
+
+// excel瀵煎嚭
+function exportExcel() {
+
+}
\ No newline at end of file
diff --git a/src/main/webapp/static/js/nodeLoc/nodeLoc.js b/src/main/webapp/static/js/nodeLoc/nodeLoc.js
new file mode 100644
index 0000000..d144f92
--- /dev/null
+++ b/src/main/webapp/static/js/nodeLoc/nodeLoc.js
@@ -0,0 +1,488 @@
+var pageCurr;
+var printMatCodeNos = [];
+var admin;
+function getCol() {
+    var cols = [
+        {type: 'checkbox'}
+        ,{field: 'tagId$', align: 'center',title: '褰掔被', templet: '#tagTpl'}
+    ];
+    cols.push.apply(cols, matCols);
+    cols.push(
+        {fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:150}
+    )
+    return cols;
+}
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).extend({
+    dropdown: 'dropdown/dropdown',
+}).use(['table','laydate', 'form', 'treeTable', 'admin', 'xmSelect', 'dropdown', 'element'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    admin = layui.admin;
+    var treeTable = layui.treeTable;
+    var xmSelect = layui.xmSelect;
+
+    // 鍟嗗搧鍒嗙被鏁版嵁
+    var insTb = treeTable.render({
+        elem: '#tag',
+        url: baseUrl+'/node/list/auth',
+        headers: {token: localStorage.getItem('token')},
+        tree: {
+            iconIndex: 2,           // 鎶樺彔鍥炬爣鏄剧ず鍦ㄧ鍑犲垪
+            isPidData: true,        // 鏄惁鏄痠d銆乸id褰㈠紡鏁版嵁
+            idName: 'id',           // id瀛楁鍚嶇О
+            pidName: 'parentId'     // pid瀛楁鍚嶇О
+        },
+        cols: [],
+        done: function (data) {
+            $('.ew-tree-table-box').css('height', '100%');
+            insTb.expandAll();
+        }
+    });
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#mat',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/node/list/auth',
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-105',
+        cols: [[
+            {type: 'checkbox'},
+            {field: 'name', align: 'center',title: '搴撲綅鍚�', hide: false},
+            {field: 'parentName', align: 'center',title: '搴撳尯', hide: false},
+            {field: 'createBy$', align: 'center',title: '鍒涘缓浜�', hide: false},
+            {field: 'createTime$', align: 'center',title: '鍒涘缓鏃堕棿', hide: false},
+            {field: 'type$', align: 'center',title: '绫诲瀷', templet: '#tagTpl', hide: false}
+        ]],
+        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';
+                }
+            });
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(locMast)', 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(mat)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id);
+        switch(obj.event) {
+            case 'addData':
+                showEditModel()
+                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+"/node/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 = {
+                        'mat': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/node/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;
+            // 鎵归噺鎵撳嵃
+            case "btnPrintBatch":
+                printMatCodeNos = [];
+                var data = checkStatus.data;
+                if (data.length === 0){
+                    layer.msg('璇烽�夋嫨鎵撳嵃鏁版嵁');
+                } else {
+                    layer.open({
+                        type: 1,
+                        title: '鎵归噺鎵撳嵃 [鏁伴噺'+ data.length +']',
+                        area: ['500px'],
+                        shadeClose: true,
+                        content: $('#printDataDiv'),
+                        success: function(layero, index){
+                            for (var i = 0; i<data.length;i++) {
+                                printMatCodeNos.push(data[i].matnr);
+                            }
+                        },
+                        end: function () {
+                        }
+                    });
+                }
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(mat)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            // 鎵撳嵃
+            case "btnPrint":
+                printMatCodeNos = [];
+                layer.open({
+                    type: 1,
+                    title: data.matnr + ' [鏁伴噺锛�1]',
+                    area: ['500px'],
+                    shadeClose: true,
+                    content: $('#printDataDiv'),
+                    success: function(layero, index){
+                        layer.iframeAuto(index);
+                        printMatCodeNos.push(data.matnr);
+                    },
+                    end: function () {
+                    }
+                });
+                break;
+            // 缂栬緫
+            case 'edit':
+                showEditModel(data)
+                break;
+        }
+    });
+
+    /* 鏄剧ず琛ㄥ崟寮圭獥 */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '鍟嗗搧',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                // 鍥炴樉琛ㄥ崟鏁版嵁
+                form.val('detail', mData);
+                // 鏂板鑷姩鐢熸垚鍟嗗搧缂栧彿
+                if (!mData) {
+                    http.get(baseUrl + "/node/auto/matnr/auth", null, function (res) {
+                        $('#matnr').val(res.data);
+                    })
+                }
+                // 琛ㄥ崟鎻愪氦浜嬩欢
+                form.on('submit(editSubmit)', function (data) {
+                    console.log(data)
+                    data.field.tagId = insXmSel.getValue('valueStr');
+                    if (isEmpty(data.field.tagId)) {
+                        layer.msg('鍒嗙被涓嶈兘涓虹┖', {icon: 2});
+                        return false;
+                    }
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/node/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                $(".layui-laypage-btn")[0].click();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                // 娓叉煋涓嬫媺鏍�
+                var insXmSel = xmSelect.render({
+                    el: '#tagSel',
+                    height: '250px',
+                    data: insTb.options.data,
+                    initValue: mData ? [mData.tagId] : [],
+                    model: {label: {type: 'text'}},
+                    prop: {
+                        name: 'name',
+                        value: 'id'
+                    },
+                    radio: true,
+                    clickClose: true,
+                    tree: {
+                        show: true,
+                        indent: 15,
+                        strict: false,
+                        expandedKeys: true
+                    }
+                });
+                // 寮圭獥涓嶅嚭鐜版粴鍔ㄦ潯
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    // 妯℃澘閫夋嫨
+    form.on('radio(selectTemplateRadio)', function (data) {
+        $('.template-preview').hide();
+        $('#template-preview-'+data.value).show();
+    });
+
+    // 寮�濮嬫墦鍗�
+    form.on('submit(doPrint)', function (data) {
+        var templateNo = data.field.selectTemplate;
+        $.ajax({
+            url: baseUrl+"/node/print/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: {param: printMatCodeNos},
+            method: 'POST',
+            async: false,
+            success: function (res) {
+                if (res.code === 200){
+                    layer.closeAll();
+                    for (let i=0;i<res.data.length;i++){
+                        var templateDom = $("#templatePreview"+templateNo);
+                        var className = templateDom.attr("class");
+                        if (className === 'template-barcode') {
+                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=1&param="+res.data[i].matnr;
+                        } else {
+                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=2&param="+res.data[i].matnr;
+                        }
+                    }
+                    var tpl = templateDom.html();
+                    var template = Handlebars.compile(tpl);
+                    var html = template(res);
+                    var box = $("#box");
+                    box.html(html);box.show();
+                    box.print({mediaPrint:true});
+                    box.hide();
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                }else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    });
+
+    // 鎼滅储鏍忔悳绱簨浠�
+    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: '#createTime\\$',
+        type: 'datetime'
+    });
+    layDate.render({
+        elem: '#updateTime\\$',
+        type: 'datetime'
+    });
+
+
+});
+
+// excel瀵煎叆妯℃澘涓嬭浇
+function excelMouldDownload(){
+    layer.load(1, {shade: [0.1,'#fff']});
+    location.href = baseUrl + "/node/excel/import/mould";
+    layer.closeAll('loading');
+}
+
+// excel瀵煎叆
+function importExcel() {
+    $("#importExcel").trigger("click");
+}
+function upload(obj){
+    if(!obj.files) {
+        return;
+    }
+    var file = obj.files[0];
+    admin.confirm('纭鍚屾 [' + file.name +'] 鏂囦欢鍚楋紵', function (index) {
+        layer.load(1, {shade: [0.1,'#fff']});
+        var url = baseUrl + "/node/excel/import/auth";
+        var form = new FormData();
+        form.append("file", file);
+        xhr = new XMLHttpRequest();
+        xhr.open("post", url, true); //post鏂瑰紡锛寀rl涓烘湇鍔″櫒璇锋眰鍦板潃锛宼rue 璇ュ弬鏁拌瀹氳姹傛槸鍚﹀紓姝ュ鐞嗐��
+        xhr.setRequestHeader('token', localStorage.getItem('token'));
+        xhr.onload = uploadComplete; //璇锋眰瀹屾垚
+        xhr.onerror =  uploadFailed; //璇锋眰澶辫触
+        xhr.onloadend = function () { // // 涓婁紶瀹屾垚閲嶇疆鏂囦欢娴�
+            layer.closeAll('loading');
+            $("#importExcel").val("");
+        };
+        // xhr.upload.onprogress = progressFunction;//銆愪笂浼犺繘搴﹁皟鐢ㄦ柟娉曞疄鐜般��
+        xhr.upload.onloadstart = function(){//涓婁紶寮�濮嬫墽琛屾柟娉�
+            ot = new Date().getTime();   //璁剧疆涓婁紶寮�濮嬫椂闂�
+            oloaded = 0;//璁剧疆涓婁紶寮�濮嬫椂锛屼互涓婁紶鐨勬枃浠跺ぇ灏忎负0
+        };
+        xhr.send(form);
+    }, function(index){
+        $("#importExcel").val("");
+    });
+}
+function uploadComplete(evt) {
+    var res = JSON.parse(evt.target.responseText);
+    if(res.code === 200) {
+        layer.msg(res.msg, {icon: 1});
+        loadTree("");
+    } else {
+        layer.msg(res.msg, {icon: 2});
+    }
+}
+function uploadFailed(evt) {
+    var res = JSON.parse(evt.target.responseText);
+    layer.msg(res.msg, {icon: 2});
+}
+
+// excel瀵煎嚭
+function exportExcel() {
+
+}
+
+
+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 clearFormVal(el) {
+    $(':input', el)
+        .val('')
+        .removeAttr('checked')
+        .removeAttr('selected');
+}
+
+$('body').keydown(function () {
+    if (event.keyCode === 13) {
+        $("#search").click();
+    }
+});
diff --git a/src/main/webapp/static/js/nodeLoc/nodeLocTree.js b/src/main/webapp/static/js/nodeLoc/nodeLocTree.js
new file mode 100644
index 0000000..72b511e
--- /dev/null
+++ b/src/main/webapp/static/js/nodeLoc/nodeLocTree.js
@@ -0,0 +1,86 @@
+var currentTemId;
+var currentTemName;
+var currentTemSsbm;
+var init = false;
+
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"  // 閰嶇疆妯″潡鎵�鍦ㄧ殑鐩綍
+}).use(['table','laydate', 'form', 'tree', 'xmSelect'], function() {
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var tree = layui.tree;
+    var xmSelect = layui.xmSelect;
+    var selObj, treeData;  // 宸︽爲閫変腑鏁版嵁
+
+    var organizationTree;
+    window.loadTree = function(condition){
+        var loadIndex = layer.load(2);
+        $.ajax({
+            url: baseUrl+"/node/tree/auth",
+            headers: {'token': localStorage.getItem('token')},
+            data: {
+                'condition': condition
+            },
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    layer.close(loadIndex);
+                    // 鏍戝舰鍥�
+                    organizationTree = tree.render({
+                        elem: '#organizationTree',
+                        id: 'organizationTree',
+                        onlyIconControl: true,
+                        data: res.data,
+                        click: function (obj) {
+                            currentTemId = obj.data.id;
+                            currentTemName = obj.data.title.split(" - ")[0];
+                            currentTemSsbm = obj.data.title.split(" - ")[1];
+                            selObj = obj;
+                            $('#organizationTree').find('.ew-tree-click').removeClass('ew-tree-click');
+                            $(obj.elem).children('.layui-tree-entry').addClass('ew-tree-click');
+                            tableIns.reload({
+                                where: {parent_id: obj.data.id},
+                                page: {curr: 1}
+                            });
+                        }
+                    });
+                    treeData = res.data;
+                    if (isEmpty(condition) && init) {
+                        tableIns.reload({
+                            where: {parent_id: ""},
+                            page: {curr: 1}
+                        });
+                    }
+                    if (!init) {
+                        init = true;
+                    }
+                } else if (res.code === 403){
+                    top.location.href = baseUrl+"/";
+                } else {
+                    layer.msg(res.msg)
+                }
+            }
+        })
+    }
+    loadTree();
+
+    /* 鏍戝舰鍥鹃噸缃� */
+    $('#treeReset').click(function () {
+        $("#condition").val("");
+        loadTree("");
+    })
+
+})
+
+function closeDialog() {
+    layer.closeAll();
+}
+
+/* 鏍戝舰鍥炬悳绱� */
+function findData(el) {
+    var condition = $(el).val();
+    loadTree(condition)
+}
\ No newline at end of file
diff --git a/src/main/webapp/static/js/pakStore/stockAdjust.js b/src/main/webapp/static/js/pakStore/stockAdjust.js
index 52d8db1..f6be988 100644
--- a/src/main/webapp/static/js/pakStore/stockAdjust.js
+++ b/src/main/webapp/static/js/pakStore/stockAdjust.js
@@ -7,10 +7,15 @@
     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'}
+        ,{field: 'batch', align: 'center',title: '搴忓垪鐮�', edit: true, style: 'font-weight:bold'}
+        ,{field: 'threeCode', align: 'center',title: '閿�鍞鍗曞彿', edit: true, style: 'font-weight:bold'}
+        ,{field: 'deadTime', align: 'center',title: '閿�鍞鍗曡鍙�', edit: true, style: 'font-weight:bold'}
     ];
+    arrRemove(detlCols, "field", "zpallet");
     arrRemove(detlCols, "field", "anfme");
     arrRemove(detlCols, "field", "batch");
+    arrRemove(detlCols, "field", "threeCode");
+    arrRemove(detlCols, "field", "dead_time");
     cols.push.apply(cols, detlCols);
     cols.push({fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:80})
     return cols;
diff --git a/src/main/webapp/static/js/saas/locDetl.js b/src/main/webapp/static/js/saas/locDetl.js
new file mode 100644
index 0000000..9bd259e
--- /dev/null
+++ b/src/main/webapp/static/js/saas/locDetl.js
@@ -0,0 +1,557 @@
+var pageCurr;
+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, hide: true}
+        ,{field: 'batch', align: 'center',title: '鎵瑰彿', width: 300, sort:true , hide: true}
+        ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+        ,{field: 'zpallet', align: 'center',title: '鎵樼洏鏉$爜', hide: true}
+        ,{field: 'specs', align: 'center',title: '閰嶇疆' , hide: true}
+        ,{field: 'model', align: 'center',title: '浠g爜', 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: '淇敼鏃堕棿', hide: true}
+    )
+    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+'/manLocDetl/asrsAndSaas/list',
+        page: true,
+        limit: 16,
+        limits: [16, 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';
+                }
+            });
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    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+"/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+"/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+"/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+"/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);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    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 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/saas/locMove.js b/src/main/webapp/static/js/saas/locMove.js
new file mode 100644
index 0000000..fb558bf
--- /dev/null
+++ b/src/main/webapp/static/js/saas/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+'/manLocDetl/list'
+        , where: {loc_no: el.value}
+        , done:function (res) {
+            limit();
+            clearSelect();
+            // 鑾峰彇鍚屼竴鍫嗗灈鏈虹殑绌哄簱浣�
+            http.post(baseUrl + "/work/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 + "/work/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/saas/stockAdjust.js b/src/main/webapp/static/js/saas/stockAdjust.js
new file mode 100644
index 0000000..cb68ae0
--- /dev/null
+++ b/src/main/webapp/static/js/saas/stockAdjust.js
@@ -0,0 +1,243 @@
+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+"/manLocDetl/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 loc_no = data.field.loc_no;
+        if (loc_no === "") {
+            inputTip($("#searchLocNo"));
+            layer.msg("璇疯緭鍏ュ簱浣嶅彿");
+            return;
+        }
+        init(loc_no);
+    });
+
+    // 閲嶇疆浜嬩欢
+    form.on('submit(reset)', function (data) {
+        reset();
+    });
+
+    function init(locNo) {
+        http.post(baseUrl + "/manLocDetl/list", {loc_no: 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+"/node/select/"+locNo+"/auth", null, function (res) {
+                console.log(res);
+                let data = res.data;
+                if (data != null) {
+                    $(".retrieve").show();
+                    // $("#locMsg").html(locNo + "&nbsp;,搴撲綅鐘舵�侊細" + data.locSts$);
+                    $("#locMsg").html(locNo + "&nbsp;");
+                    $('.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/saasLog/saasLog.js b/src/main/webapp/static/js/saasLog/saasLog.js
new file mode 100644
index 0000000..1c6c43e
--- /dev/null
+++ b/src/main/webapp/static/js/saasLog/saasLog.js
@@ -0,0 +1,252 @@
+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;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#saasLog',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/saasLog/list/auth',
+        page: true,
+        limit: 15,
+        limits: [15, 30, 50, 100, 200, 500],
+        // toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-120',
+        cols: [[
+            {type: 'checkbox'}
+            ,{field: 'id', align: 'center',title: 'id', hide:true}
+            ,{field: 'locNo', align: 'center',title: '搴撲綅'}
+            ,{field: 'type$', align: 'center',title: '鎿嶄綔绫诲瀷'}
+            ,{field: 'matnr', align: 'center',title: '鐗╂枡鍙�'}
+            ,{field: 'anfme', align: 'center',title: '鏁伴噺'}
+            ,{field: 'createByName', align: 'center',title: '鎿嶄綔浜�'}
+            ,{field: 'ioTime$', align: 'center',title: '鎿嶄綔鏃堕棿'}
+            ,{field: 'createBy', align: 'center',title: '', hide:true}
+
+
+        ]],
+        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();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(saasLog)', 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}
+        });
+    });
+
+    // 鐩戝惉澶村伐鍏锋爮浜嬩欢
+    table.on('toolbar(saasLog)', function (obj) {
+        var checkStatus = table.checkStatus(obj.config.id).data;
+        switch(obj.event) {
+            case 'addData':
+                showEditModel();
+                break;
+            case 'deleteData':
+               if (checkStatus.length === 0) {
+                   layer.msg('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁', {icon: 2});
+                   return;
+               }
+               del(checkStatus.map(function (d) {
+                   return d.id;
+               }));
+               break;
+            case 'exportData':
+                admin.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 = {
+                        'saasLog': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/saasLog/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, {icon: 2})
+                            }
+                        }
+                    });
+                });
+                break;
+        }
+    });
+
+    // 鐩戝惉琛屽伐鍏蜂簨浠�
+    table.on('tool(saasLog)', function(obj){
+        var data = obj.data;
+        switch (obj.event) {
+            case 'edit':
+                showEditModel(data);
+                break;
+            case "del":
+                del([data.id]);
+                break;
+        }
+    });
+
+    /* 寮圭獥 - 鏂板銆佷慨鏀� */
+    function showEditModel(mData) {
+        admin.open({
+            type: 1,
+            area: '600px',
+            title: (mData ? '淇敼' : '娣诲姞') + '璁㈠崟鐘舵��',
+            content: $('#editDialog').html(),
+            success: function (layero, dIndex) {
+                layDateRender(mData);
+                form.val('detail', mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/saasLog/"+(mData?'update':'add')+"/auth",
+                        headers: {'token': localStorage.getItem('token')},
+                        data: data.field,
+                        method: 'POST',
+                        success: function (res) {
+                            layer.close(loadIndex);
+                            if (res.code === 200){
+                                layer.close(dIndex);
+                                layer.msg(res.msg, {icon: 1});
+                                tableReload();
+                            } else if (res.code === 403){
+                                top.location.href = baseUrl+"/";
+                            }else {
+                                layer.msg(res.msg, {icon: 2});
+                            }
+                        }
+                    })
+                    return false;
+                });
+                $(layero).children('.layui-layer-content').css('overflow', 'visible');
+                layui.form.render('select');
+            }
+        });
+    }
+
+    /* 鍒犻櫎 */
+    function del(ids) {
+        layer.confirm('纭畾瑕佸垹闄ら�変腑鏁版嵁鍚楋紵', {
+            skin: 'layui-layer-admin',
+            shade: .1
+        }, function (i) {
+            layer.close(i);
+            var loadIndex = layer.load(2);
+            $.ajax({
+                url: baseUrl+"/saasLog/delete/auth",
+                headers: {'token': localStorage.getItem('token')},
+                data: {ids: ids},
+                method: 'POST',
+                success: function (res) {
+                    layer.close(loadIndex);
+                    if (res.code === 200){
+                        layer.msg(res.msg, {icon: 1});
+                        tableReload();
+                    } else if (res.code === 403){
+                        top.location.href = baseUrl+"/";
+                    } else {
+                        layer.msg(res.msg, {icon: 2});
+                    }
+                }
+            })
+        });
+    }
+
+    // 鎼滅储
+    form.on('submit(search)', function (data) {
+        pageCurr = 1;
+        tableReload(false);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(false);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '#ioTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['ioTime\\$']:null
+            });
+
+        }, 300);
+    }
+    layDateRender();
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(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;
+    });
+    tableIns.reload({
+        where: searchData,
+        page: {curr: pageCurr}
+     });
+}
diff --git a/src/main/webapp/views/manLocDetl/manLocDetl.html b/src/main/webapp/views/manLocDetl/manLocDetl.html
new file mode 100644
index 0000000..60039c9
--- /dev/null
+++ b/src/main/webapp/views/manLocDetl/manLocDetl.html
@@ -0,0 +1,136 @@
+<!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/tree.css" media="all">
+    <style>
+        body {
+            color: #595959;
+            background-color: #f5f7f9;
+        }
+        .layui-fluid {
+            padding: 15px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            /*margin: 15px 0 35px 0;*/
+            width: 100%;
+            border-width: 1px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            height: calc(100vh - 160px);
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            margin: 0;
+        }
+        #search-box {
+            padding: 30px 30px 10px 0px;
+            margin-left: 0px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            height: 100%;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <!-- 宸� -->
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md3">
+            <div class="layui-card">
+                <div class="layui-card-body" style="padding: 10px;">
+                    <!-- 鏍戝伐鍏锋爮 -->
+                    <div class="layui-form toolbar" id="organizationTreeBar">
+                        <div class="layui-inline" style="max-width: 200px;">
+                            <input id="condition" onkeyup="findData(this)" type="text" class="layui-input" placeholder="璇疯緭鍏ュ叧閿瓧" autocomplete="off">
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn icon-btn  layui-btn-sm" id="treeReset" style="padding: 0 10px;">
+                                <i class="layui-icon layui-icon-close"></i>
+                            </button>
+                        </div>
+                    </div>
+                    <!-- 鏍� -->
+                    <div class="layui-form toolbar" id="organizationTree"></div>
+                </div>
+            </div>
+        </div>
+        <!-- 鍙� -->
+        <div class="layui-col-md9">
+            <div class="layui-card">
+                <div class="layui-card-body" style="padding: 10px;">
+                    <!-- 琛ㄦ牸宸ュ叿鏍�2 -->
+                    <div id="search-box" class="layui-form toolbar"  style="padding-top: 5px">
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">璐т綅:</label>
+                            <div class="layui-input-inline">
+                                <input name="loc_no" style="width: 120px" class="layui-input" placeholder="杈撳叆璐т綅"/>
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鍟嗗搧缂栧彿:</label>
+                            <div class="layui-input-inline">
+                                <input name="matnr" style="width: 120px" class="layui-input" placeholder="杈撳叆鍟嗗搧缂栧彿"/>
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鍟嗗搧鍚嶇О:</label>
+                            <div class="layui-input-inline">
+                                <input name="maktx" style="width: 120px" class="layui-input" placeholder="杈撳叆鍟嗗搧鍚嶇О"/>
+                            </div>
+                        </div>
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">鎵樼洏鐮�:</label>
+                            <div class="layui-input-inline">
+                                <input name="zpallet" style="width: 120px" class="layui-input" placeholder="杈撳叆鎵樼洏鐮�"/>
+                            </div>
+                        </div>
+                        <div class="layui-inline">&emsp;
+                            <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                                <i class="layui-icon">&#xe615;</i>鎼滅储
+                            </button>
+                            <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                                <i class="layui-icon">&#xe666;</i>閲嶇疆
+                            </button>
+                        </div>
+                    </div>
+                    <table class="layui-hide" id="locDetl" lay-filter="locDetl"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <!--        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>-->
+        <!--<button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>-->
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right;margin-right: -10px">瀵煎嚭</button>
+    </div>
+</script>
+<script type="text/html" id="locNoTpl">
+    <span name="locNo" class="layui-badge layui-badge-gray">{{d.locNo}}</span>
+</script>
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">璇︽儏</a>
+    <!--    <a class="layui-btn layui-btn-xs btn-edit" lay-event="edit">缂栬緫</a>-->
+</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/manLocDetl/manLocDetl.js" charset="utf-8"></script>
+<!--<script type="text/javascript" src="../../static/js/tagTree.js" charset="utf-8"></script>-->
+<script type="text/javascript" src="../../static/js/nodeTree.js" charset="utf-8"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/node/node.html b/src/main/webapp/views/node/node.html
new file mode 100644
index 0000000..b049dd7
--- /dev/null
+++ b/src/main/webapp/views/node/node.html
@@ -0,0 +1,203 @@
+<!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">
+    <style>
+        #detail {
+            padding: 25px 30px 0 0;
+        }
+        .ew-tree-table-box {
+            height: 100%;
+        }
+    </style>
+</head>
+<body>
+
+<!-- 姝f枃寮�濮� -->
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <!-- 鏁版嵁琛ㄦ牸 -->
+            <table id="node"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container" style="width: 100%">
+        <button lay-event="add" class="layui-btn layui-btn-sm layui-btn-normal icon-btn"><i class="layui-icon">&#xe654;</i>娣诲姞</button>&nbsp;
+        <button lay-event="del" class="layui-btn layui-btn-sm layui-btn-danger icon-btn"><i class="layui-icon">&#xe640;</i>鍒犻櫎</button>
+        <button class="layui-btn layui-btn-sm" id="btn-print-batch" lay-event="printBatch">鎵归噺鎵撳嵃</button>
+        <button class="layui-btn layui-btn-sm layui-btn-warm" id="btn-node-init" lay-event="nodeInit">搴撲綅鍒濆鍖�</button>
+
+    </div>
+</script>
+
+<script type="text/html" id="typeTpl">
+    {{# if( d.type === 1){ }}
+    <span name="type" class="layui-badge layui-badge-red" ><span style="display: none">{{d.number}}</span>浠撳簱</span>
+    {{# } else if(d.type === 2){ }}
+    <span name="type" class="layui-badge layui-badge-blue" ><span style="display: none">{{d.number}}</span>搴撳尯</span>
+    {{# } else if(d.type === 3){ }}
+    <span name="type" class="layui-badge layui-badge-green" ><span style="display: none">{{d.number}}</span>璐т綅</span>
+    {{# } else { }}
+    <span name="type" class="layui-badge layui-badge-gray" ><span style="display: none">{{d.number}}</span>鍏朵粬</span>
+    {{# } }}
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-del" lay-event="del">鍒犻櫎</a>
+</script>
+
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form">
+        <input name="id" type="hidden">
+        <input name="uuid" type="hidden">
+        <input name="path" type="hidden">
+        <input name="pathName" type="hidden">
+        <input name="level" type="hidden">
+        <input name="sort" type="hidden">
+        <input name="leading" type="hidden">
+        <input name="barcode" type="hidden">
+        <input name="major" type="hidden">
+        <input name="createTime$" type="hidden">
+        <input name="createBy" type="hidden">
+        <input name="updateTime$" type="hidden">
+        <input name="updateBy" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md6">
+                <div class="layui-form-item">
+                    <label class="layui-form-label">涓婄骇鑿滃崟</label>
+                    <div class="layui-input-block">
+                        <div id="nodeParentSel" class="ew-xmselect-tree"></div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">绫诲瀷</label>
+                    <div class="layui-input-block">
+                        <select name="type" lay-vertype="tips" lay-verify="required" required="">
+                            <option value="">璇烽�夋嫨绫诲瀷</option>
+                            <option value="1">浠撳簱</option>
+                            <option value="2">搴撳尯</option>
+                            <option value="3">璐т綅</option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="layui-col-md6">
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">缂栧彿/鍚嶇О</label>
+                    <div class="layui-input-block">
+                        <input name="name" placeholder="璇疯緭鍏ョ紪鍙�/鍚嶇О" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">澶囨敞</label>
+                    <div class="layui-input-block">
+                        <input name="memo" placeholder="璇疯緭鍏ュ娉�" class="layui-input">
+                    </div>
+                </div>
+            </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+<!-- 鎵撳嵃妯℃澘 -->
+<script type="text/template" id="locPrintTpl">
+    {{#each data}}
+    <img class="template-code" src="{{this.barcodeUrl}}" width="100%">
+    <div style="letter-spacing: 2px;margin-top: 1px; text-align: center">
+        <span>{{this.item}}</span>
+    </div>
+    {{/each}}
+</script>
+<div id="printBox" style="display: none;"></div>
+<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
+<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
+<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.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/node/node.js" charset="utf-8"></script>
+
+<!-- 閲嶇疆搴撲綅寮圭獥 -->
+<div id="resetLocDiv" style="margin: 20px 0 10px 30px; display: none">
+    <div class="layui-form layui-form-pane">
+
+        <!-- 搴撲綅绫诲瀷 -->
+        <div class="layui-form-item">
+            <label class="layui-form-label">搴撳尯</label>
+            <div class="layui-input-inline">
+                    <div id="mat" name="areaId">
+                    </div>
+            </div>
+        </div>
+
+        <!-- 鎺� -->
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">璧锋鎺�</label>
+                <div class="layui-input-inline" style="width: 100px;">
+                    <input type="text" name="startRow" autocomplete="off" class="layui-input" lay-verify="required|number">
+                </div>
+                <div class="layui-form-mid">-</div>
+                <div class="layui-input-inline" style="width: 100px;">
+                    <input type="text" name="endRow" autocomplete="off" class="layui-input" lay-verify="required|number">
+                </div>
+            </div>
+        </div>
+        <!-- 鍒� -->
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">璧锋鍒�</label>
+                <div class="layui-input-inline" style="width: 100px;">
+                    <input type="text" name="startBay" autocomplete="off" class="layui-input" lay-verify="required|number">
+                </div>
+                <div class="layui-form-mid">-</div>
+                <div class="layui-input-inline" style="width: 100px;">
+                    <input type="text" name="endBay" autocomplete="off" class="layui-input" lay-verify="required|number">
+                </div>
+            </div>
+        </div>
+        <!-- 灞� -->
+        <div class="layui-form-item">
+            <div class="layui-inline">
+                <label class="layui-form-label">璧锋灞�</label>
+                <div class="layui-input-inline" style="width: 100px;">
+                    <input type="text" name="startLev" autocomplete="off" class="layui-input" lay-verify="required|number">
+                </div>
+                <div class="layui-form-mid">-</div>
+                <div class="layui-input-inline" style="width: 100px;">
+                    <input type="text" name="endLev" autocomplete="off" class="layui-input" lay-verify="required|number">
+                </div>
+            </div>
+        </div>
+
+
+        <div id="prompt" style="text-indent: 10px;">
+            <span class="not-null">鍒濆鍖栧簱浣嶅悗灏嗗垹闄ゅ簱瀛樻槑缁嗭紝璇疯皑鎱庢搷浣滐紒</span>
+        </div>
+        <!-- 鎸夐挳 -->
+        <div style="text-align: center; margin-top: 20px">
+            <button class="layui-btn layui-btn-radius layui-btn-normal" id="initDo" lay-submit lay-filter="initDo">纭畾</button>
+        </div>
+    </div>
+</div>
+
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/nodeLoc/nodeLoc.html b/src/main/webapp/views/nodeLoc/nodeLoc.html
new file mode 100644
index 0000000..3b14a5c
--- /dev/null
+++ b/src/main/webapp/views/nodeLoc/nodeLoc.html
@@ -0,0 +1,430 @@
+<!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/tree.css" media="all">
+    <style>
+        body {
+            color: #595959;
+            background-color: #f5f7f9;
+        }
+        .layui-fluid {
+            padding: 15px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            /*margin: 15px 0 35px 0;*/
+            width: 100%;
+            border-width: 1px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            height: calc(100vh - 160px);
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            margin: 0;
+        }
+        #search-box {
+            padding: 30px 30px 10px 0px;
+            margin-left: 0px;
+        }
+        .layui-form.layui-border-box.layui-table-view {
+            height: 100%;
+        }
+
+        .admin-form {
+            padding: 25px 30px 0 0 !important;
+            margin: 0 !important;
+        }
+
+        /* ------------------------- 鎵撳嵃琛ㄦ牸 -----------------------  */
+        .template-preview {
+            height: 200px;
+            display: inline-block;
+        }
+        .contain td {
+            border: 1px solid #000;
+            /*font-family: 榛戜綋;*/
+            /*font-weight: bold;*/
+            /*color: #000000;*/
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <!-- 宸� -->
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md3">
+            <div class="layui-card">
+                <div class="layui-card-body" style="padding: 10px;">
+                    <!-- 鏍戝伐鍏锋爮 -->
+                    <div class="layui-form toolbar" id="organizationTreeBar">
+                        <div class="layui-inline" style="max-width: 200px;">
+                            <input id="condition" onkeyup="findData(this)" type="text" class="layui-input" placeholder="璇疯緭鍏ュ叧閿瓧" autocomplete="off">
+                        </div>
+                        <div class="layui-inline">
+                            <button class="layui-btn icon-btn layui-btn-sm" id="treeReset" style="padding: 0 10px">
+                                <i class="layui-icon layui-icon-close"></i>
+                            </button>
+                        </div>
+                    </div>
+                    <!-- 鏍� -->
+                    <div class="layui-form toolbar" id="organizationTree"></div>
+                </div>
+            </div>
+        </div>
+        <!-- 鍙� -->
+        <div class="layui-col-md9">
+            <div class="layui-card">
+                <div class="layui-card-body" style="padding: 10px;">
+                    <!-- 琛ㄦ牸宸ュ叿鏍�2 -->
+                    <div id="search-box" class="layui-form toolbar"  style="padding-top: 5px">
+                        <div class="layui-inline">
+                            <label class="layui-form-label" style="padding: 8px 15px 8px 15px">搴撳尯:</label>
+                            <div class="layui-input-inline">
+                                <input name="parent_name" class="layui-input" placeholder="杈撳叆鍟嗗搧缂栧彿"/>
+                            </div>
+                        </div>
+                        <div class="layui-inline">&emsp;
+                            <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                                <i class="layui-icon">&#xe615;</i>鎼滅储
+                            </button>
+                            <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                                <i class="layui-icon">&#xe666;</i>閲嶇疆
+                            </button>
+                        </div>
+                    </div>
+                    <table class="layui-hide" id="mat" lay-filter="mat"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="tagTpl">
+    <span name="tagId" class="layui-badge layui-badge-blue">{{d.type$}}</span>
+</script>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <!-- 鍟嗗搧/鐗╂枡 鏁版嵁涓績 -->
+<!--        <div class="dropdown-menu" style="float: right">-->
+<!--            <button class="layui-btn layui-btn-primary layui-border-black icon-btn layui-btn-sm">&nbsp;鏁版嵁鍚屾 <i class="layui-icon layui-icon-drop"></i></button>-->
+<!--            <ul class="dropdown-menu-nav dark">-->
+<!--                <div class="dropdown-anchor"></div>-->
+<!--                <li class="title">1st menu</li>-->
+<!--                <li><a onclick="excelMouldDownload()" style="font-size: 12px"><i class="layui-icon layui-icon-template-1"></i>妯℃澘涓嬭浇</a></li>-->
+<!--                <li><a onclick="importExcel()" style="font-size: 12px"><i class="layui-icon layui-icon-upload"></i>瀵煎叆 Excel</a></li>-->
+<!--                <li style="display: none"><input id="importExcel" type="file" onchange="upload(this)" ></li>-->
+<!--                <hr>-->
+<!--                <li class="title">2nd menu</li>-->
+<!--                <li><a onclick="exportExcel()" style="font-size: 12px"><i class="layui-icon layui-icon-export"></i>瀵煎嚭 Excel</a></li>-->
+<!--            </ul>-->
+<!--        </div>-->
+        <!--        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right;margin-right: -10px">瀵煎嚭</button>-->
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-xs btn-edit layui-btn-primary" lay-event="edit">淇敼</a>
+    <button class="layui-btn layui-btn-xs btn-print" lay-event="btnPrint">鎵撳嵃</button>
+</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/jquery/jQuery.print.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" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/nodeLoc/nodeLoc.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/nodeLoc/nodeLocTree.js" charset="utf-8"></script>
+
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form">
+        <input name="id" type="hidden">
+        <input name="uuid" type="hidden">
+        <input name="nodeId" type="hidden">
+        <input name="tag_id" type="hidden">
+        <input name="model" type="hidden">
+        <input name="name" type="hidden">
+        <input name="batch" type="hidden">
+        <input name="docId" type="hidden">
+        <input name="docNum" type="hidden">
+        <input name="custName" type="hidden">
+        <input name="itemNum" type="hidden">
+        <input name="count" type="hidden">
+        <input name="weight" type="hidden">
+        <input name="status" type="hidden">
+        <input name="createBy" type="hidden">
+        <input name="updateTime$" type="hidden">
+        <input name="updateBy" type="hidden">
+        <div class="layui-row">
+
+            <div class="layui-col-md6">
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍒嗙被</label>
+                    <div class="layui-input-block">
+                        <div id="tagSel" class="ew-xmselect-tree"></div>
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">鍟嗗搧鍚嶇О</label>
+                    <div class="layui-input-block">
+                        <input name="maktx" placeholder="璇疯緭鍏ュ晢鍝佸悕绉�" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">閰嶇疆</label>
+                    <div class="layui-input-block">
+                        <input name="specs" placeholder="璇疯緭鍏ラ厤缃�" class="layui-input">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍗曠鍑�閲�</label>
+                    <div class="layui-input-block">
+                        <input name="weight" placeholder="璇疯緭鍏ュ崟绠卞噣閲嶆牸" class="layui-input">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍗曠浣撶Н</label>
+                    <div class="layui-input-block">
+                        <input name="volume" placeholder="璇疯緭鍏ュ崟绠变綋绉�" class="layui-input">
+                    </div>
+                </div>
+
+            </div>
+
+            <div class="layui-col-md6">
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">鍟嗗搧缂栧彿</label>
+                    <div class="layui-input-block">
+                        <input id="matnr" name="matnr" placeholder="璇疯緭鍏ュ晢鍝佺紪鍙�" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">瑙勬牸</label>
+                    <div class="layui-input-block">
+                        <input name="specs" placeholder="璇疯緭鍏ヤ唬鐮�" class="layui-input">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">澶囨敞</label>
+                    <div class="layui-input-block">
+                        <input name="memo" placeholder="璇疯緭鍏ュ娉�" class="layui-input">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍗曠姣涢噸</label>
+                    <div class="layui-input-block">
+                        <input name="length" placeholder="璇疯緭鍏ュ崟绠辨瘺閲�" class="layui-input">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍗曠浣撶Н</label>
+                    <div class="layui-input-block">
+                        <input name="threeCode" placeholder="璇疯緭鍏ョ瀛愬昂瀵�" class="layui-input">
+                    </div>
+                </div>
+
+            </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+
+<!-- 鎵撳嵃鎿嶄綔寮圭獥 -->
+<div id="printDataDiv" style="display: none;padding: 20px">
+    <div class="layui-form" style="text-align: center">
+        <hr>
+        <!--鍗曢�夋-->
+        <div class="layui-form-item" style="display: inline-block; margin-bottom: 10px">
+            <input type="radio" name="selectTemplate" value="1" title="妯℃澘涓�"  lay-filter="selectTemplateRadio" checked="">
+            <input type="radio" name="selectTemplate" value="2" title="妯℃澘浜�" lay-filter="selectTemplateRadio">
+            <input type="radio" name="selectTemplate" value="3" title="妯℃澘涓�" lay-filter="selectTemplateRadio">
+        </div>
+        <fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;text-align: left;">
+            <legend>鎵撳嵃棰勮</legend>
+            <div id="template-container" style="margin: 20px;text-align: center">
+
+                <!-- 棰勮鍥� 1 -->
+                <div id="template-preview-1" class="template-preview" style="display: inline-block">
+                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
+                        <tr style="height: 74px">
+                            <td colspan="3" align="center" scope="col">鍟嗗搧缂栫爜</td>
+                            <td class="barcode" colspan="9" align="center" scope="col">
+                                <img class="template-code template-barcode" src="" width="90%;">
+                                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center;">
+                                    <span>xxxxxx</span>
+                                </div>
+                            </td>
+                        </tr>
+                        <tr style="height: 74px">
+                            <td align="center" colspan="3">鍟嗗搧</td>
+                            <td align="center" colspan="5">xxxxxx-xx/xx</td>
+                            <td align="center" colspan="2">澶囨敞</td>
+                            <td align="center" colspan="2">xx</td>
+                        </tr>
+                    </table>
+                </div>
+
+                <!-- 棰勮鍥� 2 -->
+                <div id="template-preview-2" class="template-preview" style="display: none">
+                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
+                        <tr style="height: 30px">
+                            <td align="center" width="20%">鍟嗗搧</td>
+                            <td align="center" width="80%" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">xxxxxxx</td>
+                        </tr>
+                        <tr style="height: 30px">
+                            <td align="center" width="20%">澶囨敞</td>
+                            <td align="center" width="80%">xxxxxxxx</td>
+                        </tr>
+                        <tr style="height: 75px;">
+                            <td align="center" colspan="2" width="100%" style="border: none">
+                                <img class="template-code template-barcode" src="" width="80%">
+                                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center">
+                                    <span>xxxxxx</span>
+                                </div>
+                            </td>
+                        </tr>
+                    </table>
+                </div>
+
+                <!-- 棰勮鍥� 3 -->
+                <div id="template-preview-3" class="template-preview" style="display: none">
+                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
+                        <tr style="height: 74px">
+                            <td align="center" scope="col" colspan="1">鍟嗗搧</td>
+                            <td align="center" scope="col" colspan="1" style="">xxxxxx-xx/xx</td>
+                            <td align="center" scope="col" colspan="2" rowspan="2">
+                                <img class="template-code template-qrcode" src="" width="80%">
+                                <div style="letter-spacing: 1px;margin-top: 1px; text-align: center">
+                                    <span>xxxxxx</span>
+                                </div>
+                            </td>
+                        </tr>
+                        <tr style="height: 74px">
+                            <td align="center" colspan="1">澶囨敞</td>
+                            <td align="center" colspan="1" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">xxxxxxx</td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+        </fieldset>
+
+        <button class="layui-btn" id="doPrint" lay-submit lay-filter="doPrint" style="margin-top: 20px">纭畾</button>
+    </div>
+</div>
+
+<div id="box" style="display: block"></div>
+
+<!-- 鍒濆鍖栨墦鍗版ā鏉跨殑鏉″舰鐮� -->
+<script type="text/javascript">
+    $('.template-barcode').attr("src", baseUrl+"/mac/code/auth?type=1&param=123");
+    $('.template-qrcode').attr("src", baseUrl+"/mac/code/auth?type=2&param=123");
+</script>
+
+<!-- 妯℃澘寮曟搸 -->
+<!-- 妯℃澘1 -->
+<script type="text/template" id="templatePreview1" class="template-barcode">
+    {{#each data}}
+    <table class="contain" width="280" style="overflow: hidden;font-size: small;table-layout: fixed;">
+        <tr style="height: 74px">
+            <td align="center" colspan="3" scope="col">鍟嗗搧缂栫爜</td>
+            <td align="center" class="barcode" colspan="9" scope="col">
+                <img class="template-code" src="{{this.barcodeUrl}}" width="90%">
+                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center">
+                    <span>{{this.matnr}}</span>
+                </div>
+            </td>
+        </tr>
+        <tr style="height: 74px">
+            <td align="center" colspan="3">鍟嗗搧</td>
+            <td align="center" colspan="5" style="overflow: hidden; white-space: nowrap;text-overflow: ellipsis;">{{this.maktx}}</td>
+            <td align="center" colspan="2">澶囨敞</td>
+            <td align="center" colspan="2">{{this.memo}}</td>
+        </tr>
+    </table>
+    {{/each}}
+</script>
+<!-- 妯℃澘2 -->
+<script type="text/template" id="templatePreview2" class="template-barcode">
+    {{#each data}}
+    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
+        <tr style="height: 35px">
+            <td align="center" width="20%">鍟嗗搧</td>
+            <td align="center" width="80%" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.maktx}}</td>
+        </tr>
+        <tr style="height: 35px">
+            <td align="center" width="20%">澶囨敞</td>
+            <td align="center" width="80%">{{this.memo}}</td>
+        </tr>
+        <tr style="height: 79px;">
+            <td align="center" colspan="2" width="100%" style="border: none">
+                <img class="template-code" src="{{this.barcodeUrl}}" width="80%">
+                <div style="letter-spacing: 2px;margin-top: 1px; text-align: center">
+                    <span>{{this.matnr}}</span>
+                </div>
+            </td>
+        </tr>
+    </table>
+    {{/each}}
+</script>
+<!-- 妯℃澘3 -->
+<script type="text/template" id="templatePreview3" class="template-qrcode">
+    {{#each data}}
+    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
+        <tr style="height: 74px" >
+            <td align="center" scope="col" colspan="1">鍟嗗搧</td>
+            <td align="center" scope="col" colspan="1" style="
+                display: inline-block;
+                line-height: 20px;
+                vertical-align: middle;
+                border: none;
+                border-top: 1px solid #000;
+                overflow: hidden;
+                text-overflow: ellipsis;
+                display: -webkit-box;
+                -webkit-line-clamp: 3;
+                -webkit-box-orient: vertical;
+                    ">
+                {{this.maktx}}
+            </td>
+            <td align="center" scope="col" colspan="2" rowspan="2">
+                <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" width="80%">
+                <div style="letter-spacing: 1px;margin-top: 1px; text-align: center">
+                    <span>{{this.matnr}}</span>
+                </div>
+            </td>
+        </tr>
+        <tr style="height: 74px">
+            <td align="center" colspan="1">澶囨敞</td>
+            <td align="center" colspan="1" style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.memo}}</td>
+        </tr>
+    </table>
+    {{/each}}
+</script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/saas/locDetl.html b/src/main/webapp/views/saas/locDetl.html
new file mode 100644
index 0000000..4b127b0
--- /dev/null
+++ b/src/main/webapp/views/saas/locDetl.html
@@ -0,0 +1,77 @@
+<!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/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/saas/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/saas/locMove.html b/src/main/webapp/views/saas/locMove.html
new file mode 100644
index 0000000..d28fbec
--- /dev/null
+++ b/src/main/webapp/views/saas/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/saas/locMove.js" charset="utf-8"></script>
+
+<script type="text/template" id="emptyLocStock">
+    <option value="">璇疯緭鍏ュ苟閫夋嫨</option>
+    {{#each data}}
+    <option value="{{this.uuid}}">{{this.uuid}}</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/saas/matQuery.html b/src/main/webapp/views/saas/matQuery.html
new file mode 100644
index 0000000..351d3d1
--- /dev/null
+++ b/src/main/webapp/views/saas/matQuery.html
@@ -0,0 +1,194 @@
+<!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;
+        }
+    </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="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="update_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="matCode" lay-filter="matCode"></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', fixed: 'left'}
+        ];
+        cols.push.apply(cols, matCols);
+        cols.push(
+            {field: 'updateBy$', align: 'center',title: '淇敼浜哄憳', hide: true},
+            {field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'}
+        )
+        return cols;
+    }
+    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;
+        // 鐗╂枡鏌ヨ鏁版嵁琛�
+        matQueryTable = table.render({
+            elem: '#matCode',
+            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(matCode)', 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) {
+            pageCurr = 1;
+            tableReload(false);
+        });
+
+        // 鎼滅储鏍忛噸缃簨浠�
+        form.on('submit(reset)', function (data) {
+            pageCurr = 1;
+            clearFormVal($('#search-box'));
+            tableReload();
+        });
+
+        layDate.render({
+            elem: '.layui-laydate-range'
+            ,type: 'datetime'
+            ,range: true
+        });
+    })
+
+    function tableReload(child) {
+        var searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        matQueryTable.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;
+                }
+            }
+        });
+    }
+
+    function clearFormVal(el) {
+        $(':input', el)
+            .val('')
+            .removeAttr('checked')
+            .removeAttr('selected');
+    }
+</script>
+</html>
+
diff --git a/src/main/webapp/views/saas/stockAdjust.html b/src/main/webapp/views/saas/stockAdjust.html
new file mode 100644
index 0000000..63d49fb
--- /dev/null
+++ b/src/main/webapp/views/saas/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/saas/stockAdjust.js" charset="utf-8"></script>
+
+</body>
+</html>
+
diff --git a/src/main/webapp/views/saasLog/saasLog.html b/src/main/webapp/views/saasLog/saasLog.html
new file mode 100644
index 0000000..2211671
--- /dev/null
+++ b/src/main/webapp/views/saasLog/saasLog.html
@@ -0,0 +1,113 @@
+<!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">
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body">
+            <div class="layui-form toolbar" id="search-box">
+                <div class="layui-form-item">
+                    <div class="layui-inline">
+                        <label class="layui-form-label">缂栧彿:</label>
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="id" placeholder="缂栧彿" autocomplete="off">
+                        </div>
+                    </div>
+                    <div class="layui-inline">&emsp;
+                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
+                            <i class="layui-icon">&#xe615;</i>鎼滅储
+                        </button>
+                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
+                            <i class="layui-icon">&#xe666;</i>閲嶇疆
+                        </button>
+                    </div>
+                </div>
+            </div>
+            <table class="layui-hide" id="saasLog" lay-filter="saasLog"></table>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>
+        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
+    </div>
+</script>
+
+<script type="text/html" id="operate">
+    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">淇敼</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">鍒犻櫎</a>
+</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/saasLog/saasLog.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
+        <input name="id" type="hidden">
+        <div class="layui-row">
+            <div class="layui-col-md12">
+                <div class="layui-form-item">
+                    <label class="layui-form-label layui-form-required">id: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="id" placeholder="璇疯緭鍏d" lay-vertype="tips" lay-verify="required">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">{0:鍏ュ簱,1:鍑哄簱}: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="type" placeholder="璇疯緭鍏0:鍏ュ簱,1:鍑哄簱}">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="locNo" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="matnr" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="ioTime" id="ioTime$" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="createBy" placeholder="璇疯緭鍏�">
+                    </div>
+                </div>
+
+             </div>
+        </div>
+        <hr class="layui-bg-gray">
+        <div class="layui-form-item text-right">
+            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">淇濆瓨</button>
+            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">鍙栨秷</button>
+        </div>
+    </form>
+</script>
+</html>
+

--
Gitblit v1.9.1