From 1abd27fc6e7d8e0202fbb3fe35db00add079ab29 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期四, 21 十二月 2023 15:24:51 +0800
Subject: [PATCH] Merge branch 'master' of http://47.97.1.152:5880/r/zy-asrs-master

---
 zy-asrs-common/src/main/resources/mapper/wms/ManMatMapper.xml                           |    5 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManTagController.java              |  234 ++++
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManTagService.java          |   10 
 zy-asrs-wms/src/main/webapp/views/manMat/manMat.html                                    |  465 ++++++++
 zy-asrs-common/src/main/java/com/zy/asrs/common/web/BaseController.java                 |    9 
 zy-asrs-common/src/main/java/com/zy/asrs/common/utils/NodeUtils.java                    |   46 
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManMatMapper.java            |   12 
 zy-asrs-common/src/main/resources/mapper/wms/ManTagMapper.xml                           |    5 
 zy-asrs-wms/src/main/webapp/static/js/manTag/manTag.js                                  |  338 ++++++
 zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatPrint.java             |   41 
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManMatService.java          |    8 
 zy-asrs-common/src/main/java/com/zy/asrs/common/utils/QrCode.java                       |   94 +
 zy-asrs-common/src/main/java/com/zy/asrs/common/utils/TreeUtils.java                    |   89 +
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManTag.java                  |  258 ++++
 zy-asrs-wms/src/main/webapp/views/manTag/manTag.html                                    |  216 +++
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManMatServiceImpl.java |   12 
 zy-asrs-common/pom.xml                                                                  |   15 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManMatController.java              |  105 +
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManMat.java                  |  449 ++++++++
 zy-asrs-common/src/main/java/manTag.sql                                                 |   18 
 zy-asrs-common/src/main/java/com/zy/asrs/common/utils/MatExcelListener.java             |  153 ++
 zy-asrs-wms/src/main/webapp/static/js/tagTree.js                                        |   86 +
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManTagServiceImpl.java |   32 
 zy-asrs-wms/src/main/webapp/static/js/manMat/manMat.js                                  |  480 ++++++++
 zy-asrs-common/src/main/java/com/zy/asrs/common/utils/ListUtils.java                    |   24 
 zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManTagMapper.java            |   12 
 zy-asrs-common/src/main/java/com/zy/asrs/common/utils/BarcodeUtils.java                 |   72 +
 zy-asrs-common/src/main/java/manMat.sql                                                 |   18 
 zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatExcel.java             |   23 
 29 files changed, 3,328 insertions(+), 1 deletions(-)

diff --git a/zy-asrs-common/pom.xml b/zy-asrs-common/pom.xml
index a3bfa55..0f76561 100644
--- a/zy-asrs-common/pom.xml
+++ b/zy-asrs-common/pom.xml
@@ -51,6 +51,21 @@
             <artifactId>springfox-boot-starter</artifactId>
             <version>3.0.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.3.2</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatExcel.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatExcel.java
new file mode 100644
index 0000000..5312561
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatExcel.java
@@ -0,0 +1,23 @@
+package com.zy.asrs.common.domain.entity;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.zy.asrs.common.wms.entity.ManMat;
+import lombok.Data;
+
+/**
+ * 0.A 1.B 2.C 3.D 4.E 5.F 6.G 7.H 8.I
+ * 9.J 10.K 11.L 12.M 13.N 14.O 15.P 16.Q 17.R 18.S
+ * 19.T 20.U 21.V 22.W 23.X 24.Y 25.Z
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatExcel extends ManMat {
+
+    @ExcelProperty(index = 0, value = "涓�绾у垎绫�")
+    private String priClass;
+
+    @ExcelProperty(index = 1, value = "浜岀骇鍒嗙被")
+    private String secClass;
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatPrint.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatPrint.java
new file mode 100644
index 0000000..774b212
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatPrint.java
@@ -0,0 +1,41 @@
+package com.zy.asrs.common.domain.entity;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020/6/8
+ */
+@Data
+public class MatPrint {
+
+    /**
+     * 鐗╂枡缂栫爜
+     */
+    private String matnr;
+
+    /**
+     * SKC
+     */
+    private String barcode;
+
+    /**
+     * 鐗╂枡鍚嶇О
+     */
+    private String maktx;
+
+    /**
+     * 鐗╂枡鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鐗╂枡瑙勬牸
+     */
+    private String specs;
+
+    /**
+     * 澶囨敞
+     */
+    private String memo;
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/BarcodeUtils.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/BarcodeUtils.java
new file mode 100644
index 0000000..5575bab
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/BarcodeUtils.java
@@ -0,0 +1,72 @@
+package com.zy.asrs.common.utils;
+
+import com.google.zxing.*;
+import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.common.HybridBinarizer;
+import com.google.zxing.oned.Code128Writer;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.util.HashMap;
+
+/**
+ * 鏉″舰鐮佸伐鍏�
+ * Created by vincent on 2020/6/6
+ */
+public class BarcodeUtils {
+
+    private static final int DEFAULT_WIDTH = 110;
+    private static final int DEFAULT_HEIGHT = 35;
+
+    /**
+     * 鏉″舰鐮佺紪鐮�
+     */
+    public static BufferedImage encode(String string){
+        return encode(string, null, null);
+    }
+
+    public static BufferedImage encode(String string, Integer width, Integer height){
+        try {
+            Code128Writer writer = new Code128Writer();
+            BitMatrix bar = writer.encode(string, BarcodeFormat.CODE_128, width==null?DEFAULT_WIDTH:width, height==null?DEFAULT_HEIGHT:height, new HashMap<>());
+            return MatrixToImageWriter.toBufferedImage(bar);
+        }
+        catch (WriterException e){ throw new RuntimeException(e); }
+    }
+
+    /**
+     * 鏉″舰鐮佽В鐮�
+     */
+    public static String decode(String imgPath) {
+        BufferedImage image = null;
+        Result result = null;
+        try {
+            image = ImageIO.read(new File(imgPath));
+            if (image == null) {
+                throw new RuntimeException("the decode image may be not exit.");
+            }
+            LuminanceSource source = new BufferedImageLuminanceSource(image);
+            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+            result = new MultiFormatReader().decode(bitmap, null);
+            return result.getText();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static void main(String[] args) {
+        String imgPath = "F:/zxing_EAN-13.png";
+        String contents = "6926557300360";
+        int width = 105, height = 50;
+        encode(contents, width, height);
+        System.out.println("finished zxing EAN-13 encode.");
+        String decodeContent = decode(imgPath);
+        System.out.println("瑙g爜鍐呭濡備笅锛�" + decodeContent);
+        System.out.println("finished zxing EAN-13 decode.");
+    }
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/ListUtils.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/ListUtils.java
new file mode 100644
index 0000000..88b4f67
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/ListUtils.java
@@ -0,0 +1,24 @@
+package com.zy.asrs.common.utils;
+
+import java.io.*;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by vincent on 2020/10/17
+ */
+public class ListUtils {
+
+    public static List<Map> deepCopy(List<Map> src) throws IOException, ClassNotFoundException {
+        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream(byteOut);
+        out.writeObject(src);
+
+        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
+        ObjectInputStream in = new ObjectInputStream(byteIn);
+        @SuppressWarnings("unchecked")
+        List<Map> dest = (List<Map>) in.readObject();
+        return dest;
+    }
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/MatExcelListener.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/MatExcelListener.java
new file mode 100644
index 0000000..200b6cc
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/MatExcelListener.java
@@ -0,0 +1,153 @@
+package com.zy.asrs.common.utils;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.common.domain.entity.MatExcel;
+import com.zy.asrs.common.wms.entity.ManMat;
+import com.zy.asrs.common.wms.entity.ManTag;
+import com.zy.asrs.common.wms.mapper.ManTagMapper;
+import com.zy.asrs.common.wms.service.ManMatService;
+import com.zy.asrs.common.wms.service.ManTagService;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.framework.exception.CoolException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by vincent on 2019-11-25
+ */
+@Slf4j
+public class MatExcelListener extends AnalysisEventListener<MatExcel> {
+
+    private int total = 0;
+    private Long userId;
+
+    public MatExcelListener() {
+    }
+
+    public MatExcelListener(Long userId) {
+        this.userId = userId;
+    }
+
+    /**
+     * 姣忛殧5鏉″瓨鍌ㄦ暟鎹簱锛屽疄闄呬娇鐢ㄤ腑鍙互3000鏉★紝鐒跺悗娓呯悊list 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 50;
+
+    private final List<MatExcel> list = new ArrayList<>();
+
+    /**
+     * 杩欓噷浼氫竴琛岃鐨勮繑鍥炲ご
+     */
+    @Override
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+    }
+
+    /**
+     * 杩欎釜姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤
+     */
+    @Override
+    public void invoke(MatExcel excel, AnalysisContext ctx) {
+        ManTagService tagService = SpringUtils.getBean(ManTagService.class);
+        ManTagMapper tagMapper = SpringUtils.getBean(ManTagMapper.class);
+        ManMatService matService = SpringUtils.getBean(ManMatService.class);
+        Date now = new Date();
+        Long tagId;
+        // 鍒嗙被
+        // 涓�绾у垎绫�
+        if (!Cools.isEmpty(excel.getPriClass()) && !Cools.isEmpty(excel.getSecClass())) {
+            ManTag priTag = tagService.getOne(new LambdaQueryWrapper<ManTag>().eq(ManTag::getName, excel.getPriClass()).eq(ManTag::getLevel, 2));
+            if (priTag == null) {
+                ManTag top = tagService.getTop();
+                NodeUtils nodeUtils = new NodeUtils();
+                nodeUtils.executePath(top.getId());
+                priTag = new ManTag(
+                        null,    // 缂栧彿
+                        excel.getPriClass(),    // 鍚嶇О
+                        top.getId(),    // 鐖剁骇
+                        top.getName(),    // 鐖剁骇鍚嶇О
+                        nodeUtils.path.toString(),    // 鍏宠仈璺緞
+                        nodeUtils.pathName.toString(),    // 鍏宠仈璺緞鍚�
+                        0,    // 绫诲瀷
+                        null,    // 璐熻矗浜�
+                        null,    // 鍥剧墖
+                        null,    // 绠�瑕佹弿杩�
+                        null,    // 鏁伴噺
+                        2,    // 绛夌骇
+                        null,    // 鎺掑簭
+                        1,    // 鐘舵��
+                        now,    // 娣诲姞鏃堕棿
+                        null,    // 娣诲姞浜哄憳
+                        now,    // 淇敼鏃堕棿
+                        null,    // 淇敼浜哄憳
+                        null    // 澶囨敞
+                );
+                if (tagMapper.insert(priTag) == 0) {
+                    throw new CoolException("淇濆瓨涓�绾у垎绫诲け璐�");
+                }
+            }
+            // 浜岀骇鍒嗙被
+            ManTag secTag = tagService.getOne(new LambdaQueryWrapper<ManTag>().eq(ManTag::getName, excel.getPriClass()).eq(ManTag::getLevel, 3));
+            if (secTag == null) {
+                NodeUtils nodeUtils = new NodeUtils();
+                nodeUtils.executePath(priTag.getId());
+                secTag = new ManTag(
+                        null,    // 缂栧彿
+                        excel.getSecClass(),    // 鍚嶇О
+                        priTag.getId(),    // 鐖剁骇
+                        priTag.getName(),    // 鐖剁骇鍚嶇О
+                        nodeUtils.path.toString(),    // 鍏宠仈璺緞
+                        nodeUtils.pathName.toString(),    // 鍏宠仈璺緞鍚�
+                        0,    // 绫诲瀷
+                        null,    // 璐熻矗浜�
+                        null,    // 鍥剧墖
+                        null,    // 绠�瑕佹弿杩�
+                        null,    // 鏁伴噺
+                        3,    // 绛夌骇
+                        null,    // 鎺掑簭
+                        1,    // 鐘舵��
+                        now,    // 娣诲姞鏃堕棿
+                        null,    // 娣诲姞浜哄憳
+                        now,    // 淇敼鏃堕棿
+                        null,    // 淇敼浜哄憳
+                        null    // 澶囨敞
+                );
+                if (tagMapper.insert(secTag) == 0) {
+                    throw new CoolException("淇濆瓨浜岀骇鍒嗙被澶辫触");
+                }
+            }
+            tagId = secTag.getId();
+        } else {
+            tagId = tagService.getTop().getId();
+        }
+        // 鍟嗗搧
+        ManMat mat = matService.getOne(new LambdaQueryWrapper<ManMat>().eq(ManMat::getMatnr, excel.getMatnr()));
+        if (mat == null) {
+            mat = excel;
+            mat.setTagId(tagId);
+            if (!matService.save(mat)) {
+                throw new CoolException("淇濆瓨鍟嗗搧淇℃伅澶辫触锛屽晢鍝佺紪鐮侊細" + excel.getMatnr());
+            }
+            total++;
+        }
+    }
+
+    /**
+     * 鎵�鏈夋暟鎹В鏋愬畬鎴愪簡璋冪敤
+     * 閫傚悎浜嬪姟
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext ctx) {
+        log.info("鏂板{}鏉$墿鏂欎俊鎭紒", total);
+    }
+
+    public int getTotal() {
+        return total;
+    }
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/NodeUtils.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/NodeUtils.java
new file mode 100644
index 0000000..3221fec
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/NodeUtils.java
@@ -0,0 +1,46 @@
+package com.zy.asrs.common.utils;
+
+import com.zy.asrs.common.wms.entity.ManTag;
+import com.zy.asrs.common.wms.service.ManTagService;
+import com.zy.asrs.framework.common.SpringUtils;
+
+/**
+ * Created by vincent on 2021/1/19
+ */
+public class NodeUtils {
+
+    public StringBuilder path = new StringBuilder();
+
+    public StringBuilder pathName = new StringBuilder();
+
+    public void executePath(ManTag tag) {
+        ManTagService bean = SpringUtils.getBean(ManTagService.class);
+        ManTag parent = bean.getById(tag.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);
+            }
+        }
+    }
+
+    public void executePath(Long parentId) {
+        ManTagService bean = SpringUtils.getBean(ManTagService.class);
+        ManTag parent = bean.getById(parentId);
+        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/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/QrCode.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/QrCode.java
new file mode 100644
index 0000000..66f11fa
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/QrCode.java
@@ -0,0 +1,94 @@
+package com.zy.asrs.common.utils;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by vincent on 2020-03-23
+ */
+public class QrCode {
+
+    private static final String CHARSET = "utf-8";
+    private static final String FORMAT_NAME = "JPG";
+    // 浜岀淮鐮佸昂瀵�
+    private static final int QRCODE_SIZE = 150;
+
+    public static BufferedImage createImg(String content) throws WriterException {
+        return createImg(content, QRCODE_SIZE, QRCODE_SIZE);
+    }
+
+    public static BufferedImage createImg(String content, Integer wid, Integer hei) throws WriterException {
+        ConcurrentHashMap<EncodeHintType, Object> hints = new ConcurrentHashMap<>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, wid, hei, hints);
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
+            }
+        }
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
+            }
+        }
+        return image;
+    }
+
+    private static InputStream convert(BufferedImage image){
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        try {
+            ImageIO.write(image, FORMAT_NAME, os);
+            return new ByteArrayInputStream(os.toByteArray());
+        } catch (IOException e) {
+            System.err.println(e);
+        }
+        return null;
+    }
+
+    public static void inputstreamtofile(InputStream ins, File file) {
+        try {
+            OutputStream os = new FileOutputStream(file);
+            int bytesRead = 0;
+            byte[] buffer = new byte[8192];
+            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+                os.write(buffer, 0, bytesRead);
+            }
+            os.close();
+            ins.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) throws WriterException {
+        String text = "1234567890";
+        String destPath = "/Users/vincent/Desktop/jam.jpg";
+        BufferedImage img = QrCode.createImg(text);
+        InputStream inputStream = convert(img);
+        inputstreamtofile(inputStream, new File(destPath));
+
+//        BufferedImage img = QrCode.createImg(String.valueOf(id));
+//        if (!ImageIO.write(img, "jpg", response.getOutputStream())) {
+//            throw new IOException("Could not write an image of format jpg");
+//        }
+//        response.getOutputStream().flush();
+//        response.getOutputStream().close();
+    }
+
+
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/TreeUtils.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/TreeUtils.java
new file mode 100644
index 0000000..4979aa4
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/utils/TreeUtils.java
@@ -0,0 +1,89 @@
+package com.zy.asrs.common.utils;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.common.wms.entity.ManTag;
+import com.zy.asrs.common.wms.service.ManTagService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 鏍戝舰鍥惧伐鍏�
+ * Created by vincent on 2020/10/16
+ */
+@Component
+public class TreeUtils {
+
+    @Autowired
+    private ManTagService tagService;
+
+    /******************************** 褰掔被鏍� *********************************/
+
+    /**
+     * 鑾峰彇鏍戝浘鏁版嵁缁撴瀯
+     */
+    @Cacheable(cacheNames="tagTree",key="#id")
+    public ArrayList<Map> getTree(String id){
+        ArrayList<Map> result = new ArrayList<>();
+        ManTag tag = tagService.getById(id);
+        // 涓昏妭鐐�
+        Map<String, Object> map = new HashMap<>();
+        map.put("title", tag.getName());
+        map.put("id", tag.getId());
+        map.put("spread", true);
+        List<Map> childrens = new ArrayList<>();
+        map.put("children", childrens);
+        dealTag(tag, childrens);
+        result.add(map);
+        // 寮�濮嬪鐞嗗瓧鑺傜偣
+//        deal(tag, childrens);
+        return result;
+    }
+
+    /**
+     * 閫掑綊鑾峰彇瀛愯妭鐐规暟鎹�
+     */
+    public void dealTag(ManTag parent, List<Map> list) {
+        List<ManTag> tags = tagService.list(
+                new LambdaQueryWrapper<ManTag>()
+                        .eq(ManTag::getParentId, parent.getId())
+                        .eq(ManTag::getStatus, "1"));
+        for (ManTag tag : tags) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("title", tag.getName());
+            map.put("id", tag.getId());
+            map.put("spread", true);
+            List<Map> childrens = new ArrayList<>();
+            map.put("children", childrens);
+            dealTag(tag, childrens);
+            list.add(map);
+        }
+    }
+
+
+    // -------------------------------------------------------------------------------------------------------
+
+    /**
+     * 鏉′欢绛涢��
+     */
+    @SuppressWarnings("unchecked")
+    public void remove(String condition, List<Map> list) {
+        Iterator<Map> iterator = list.iterator();
+        while (iterator.hasNext()) {
+            Map map = iterator.next();
+            if (map.get("children") != null) {
+                List<Map> children = (List<Map>) map.get("children");
+                if (children.size() > 0) {
+                    remove(condition, children);
+                } else {
+                    if (!String.valueOf(map.get("title")).contains(condition)) {
+                        iterator.remove();
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/web/BaseController.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/web/BaseController.java
index 2c489b2..054566f 100644
--- a/zy-asrs-common/src/main/java/com/zy/asrs/common/web/BaseController.java
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/web/BaseController.java
@@ -2,12 +2,13 @@
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zy.asrs.common.sys.entity.User;
 import com.zy.asrs.common.sys.entity.UserLogin;
 import com.zy.asrs.common.sys.service.UserLoginService;
 import com.zy.asrs.common.sys.service.UserService;
+import com.zy.asrs.common.wms.entity.ManTag;
+import com.zy.asrs.common.wms.service.ManTagService;
 import com.zy.asrs.framework.common.BaseRes;
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.controller.AbstractBaseController;
@@ -33,6 +34,8 @@
     private UserService userService;
     @Autowired
     private UserLoginService userLoginService;
+    @Autowired
+    private ManTagService manTagService;
 
     protected Long getHostId(){
         if (getUserId() == 9527) {
@@ -118,4 +121,8 @@
         return page;
     }
 
+    protected ManTag getOriginTag(){
+        return manTagService.getTop();
+    }
+
 }
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManMat.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManMat.java
new file mode 100644
index 0000000..93f6194
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManMat.java
@@ -0,0 +1,449 @@
+package com.zy.asrs.common.wms.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.zy.asrs.common.wms.service.ManTagService;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.common.sys.entity.User;
+import com.zy.asrs.common.sys.service.UserService;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("wms_man_mat")
+public class ManMat implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 鎵�灞炲綊绫�
+     */
+    @ApiModelProperty(value= "鎵�灞炲綊绫�")
+    private Long tagId;
+
+    /**
+     * 鍟嗗搧缂栧彿
+     */
+    @ApiModelProperty(value= "鍟嗗搧缂栧彿")
+    private String matnr;
+
+    /**
+     * 鍟嗗搧鍚嶇О
+     */
+    @ApiModelProperty(value= "鍟嗗搧鍚嶇О")
+    private String maktx;
+
+    /**
+     * 鍒悕
+     */
+    @ApiModelProperty(value= "鍒悕")
+    private String name;
+
+    /**
+     * 瑙勬牸
+     */
+    @ApiModelProperty(value= "瑙勬牸")
+    private String specs;
+
+    /**
+     * 鍨嬪彿
+     */
+    @ApiModelProperty(value= "鍨嬪彿")
+    private String model;
+
+    /**
+     * 棰滆壊
+     */
+    @ApiModelProperty(value= "棰滆壊")
+    private String color;
+
+    /**
+     * 鍝佺墝
+     */
+    @ApiModelProperty(value= "鍝佺墝")
+    private String brand;
+
+    /**
+     * 鍗曚綅
+     */
+    @ApiModelProperty(value= "鍗曚綅")
+    private String unit;
+
+    /**
+     * 鍗曚环
+     */
+    @ApiModelProperty(value= "鍗曚环")
+    private Double price;
+
+    /**
+     * sku
+     */
+    @ApiModelProperty(value= "sku")
+    private String sku;
+
+    /**
+     * 鍗曚綅閲�
+     */
+    @ApiModelProperty(value= "鍗曚綅閲�")
+    private Double units;
+
+    /**
+     * 鏉$爜
+     */
+    @ApiModelProperty(value= "鏉$爜")
+    private String barcode;
+
+    /**
+     * 浜у湴
+     */
+    @ApiModelProperty(value= "浜у湴")
+    private String origin;
+
+    /**
+     * 鍘傚
+     */
+    @ApiModelProperty(value= "鍘傚")
+    private String manu;
+
+    /**
+     * 鐢熶骇鏃ユ湡
+     */
+    @ApiModelProperty(value= "鐢熶骇鏃ユ湡")
+    private String manuDate;
+
+    /**
+     * 鍝侀」鏁�
+     */
+    @ApiModelProperty(value= "鍝侀」鏁�")
+    private String itemNum;
+
+    /**
+     * 瀹夊叏搴撳瓨閲�
+     */
+    @ApiModelProperty(value= "瀹夊叏搴撳瓨閲�")
+    private Double safeQty;
+
+    /**
+     * 閲嶉噺
+     */
+    @ApiModelProperty(value= "閲嶉噺")
+    private Double weight;
+
+    /**
+     * 闀垮害
+     */
+    @ApiModelProperty(value= "闀垮害")
+    private Double length;
+
+    /**
+     * 浣撶Н
+     */
+    @ApiModelProperty(value= "浣撶Н")
+    private Double volume;
+
+    /**
+     * 涓夋柟缂栫爜
+     */
+    @ApiModelProperty(value= "涓夋柟缂栫爜")
+    private String threeCode;
+
+    /**
+     * 渚涘簲鍟�
+     */
+    @ApiModelProperty(value= "渚涘簲鍟�")
+    private String supp;
+
+    /**
+     * 渚涘簲鍟嗙紪鐮�
+     */
+    @ApiModelProperty(value= "渚涘簲鍟嗙紪鐮�")
+    private String suppCode;
+
+    /**
+     * 鏄惁鎵规 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value= "鏄惁鎵规 1: 鏄�  0: 鍚�  ")
+    private Integer beBatch;
+
+    /**
+     * 淇濊川鏈�
+     */
+    @ApiModelProperty(value= "淇濊川鏈�")
+    private String deadTime;
+
+    /**
+     * 棰勮澶╂暟
+     */
+    @ApiModelProperty(value= "棰勮澶╂暟")
+    private Integer deadWarn;
+
+    /**
+     * 鍒惰喘 1: 鍒堕��  2: 閲囪喘  3: 澶栧崗
+     */
+    @ApiModelProperty(value= "鍒惰喘 1: 鍒堕��  2: 閲囪喘  3: 澶栧崗  ")
+    private Integer source;
+
+    /**
+     * 瑕佹眰妫�楠� 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value= "瑕佹眰妫�楠� 1: 鏄�  0: 鍚�  ")
+    private Integer inspect;
+
+    /**
+     * 鍗遍櫓鍝� 1: 鏄�  0: 鍚�
+     */
+    @ApiModelProperty(value= "鍗遍櫓鍝� 1: 鏄�  0: 鍚�  ")
+    private Integer danger;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public ManMat() {}
+
+    public ManMat(String uuid,Long tagId,String matnr,String maktx,String name,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) {
+        this.uuid = uuid;
+        this.tagId = tagId;
+        this.matnr = matnr;
+        this.maktx = maktx;
+        this.name = name;
+        this.specs = specs;
+        this.model = model;
+        this.color = color;
+        this.brand = brand;
+        this.unit = unit;
+        this.price = price;
+        this.sku = sku;
+        this.units = units;
+        this.barcode = barcode;
+        this.origin = origin;
+        this.manu = manu;
+        this.manuDate = manuDate;
+        this.itemNum = itemNum;
+        this.safeQty = safeQty;
+        this.weight = weight;
+        this.length = length;
+        this.volume = volume;
+        this.threeCode = threeCode;
+        this.supp = supp;
+        this.suppCode = suppCode;
+        this.beBatch = beBatch;
+        this.deadTime = deadTime;
+        this.deadWarn = deadWarn;
+        this.source = source;
+        this.inspect = inspect;
+        this.danger = danger;
+        this.status = status;
+        this.createBy = createBy;
+        this.createTime = createTime;
+        this.updateBy = updateBy;
+        this.updateTime = updateTime;
+        this.memo = memo;
+    }
+
+//    ManMat manMat = new ManMat(
+//            null,    // 缂栧彿
+//            null,    // 鎵�灞炲綊绫�
+//            null,    // 鍟嗗搧缂栧彿[闈炵┖]
+//            null,    // 鍟嗗搧鍚嶇О
+//            null,    // 鍒悕
+//            null,    // 瑙勬牸
+//            null,    // 鍨嬪彿
+//            null,    // 棰滆壊
+//            null,    // 鍝佺墝
+//            null,    // 鍗曚綅
+//            null,    // 鍗曚环
+//            null,    // sku
+//            null,    // 鍗曚綅閲�
+//            null,    // 鏉$爜
+//            null,    // 浜у湴
+//            null,    // 鍘傚
+//            null,    // 鐢熶骇鏃ユ湡
+//            null,    // 鍝侀」鏁�
+//            null,    // 瀹夊叏搴撳瓨閲�
+//            null,    // 閲嶉噺
+//            null,    // 闀垮害
+//            null,    // 浣撶Н
+//            null,    // 涓夋柟缂栫爜
+//            null,    // 渚涘簲鍟�
+//            null,    // 渚涘簲鍟嗙紪鐮�
+//            null,    // 鏄惁鎵规
+//            null,    // 淇濊川鏈�
+//            null,    // 棰勮澶╂暟
+//            null,    // 鍒惰喘
+//            null,    // 瑕佹眰妫�楠�
+//            null,    // 鍗遍櫓鍝�
+//            null,    // 鐘舵�乕闈炵┖]
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null    // 澶囨敞
+//    );
+
+    public String getTagId$(){
+        ManTagService manTagService = SpringUtils.getBean(ManTagService.class);
+        ManTag tag = manTagService.getById(this.tagId);
+        if (!Cools.isEmpty(tag)){
+            return String.valueOf(tag.getId());
+        }
+        return null;
+    }
+
+    public String getBeBatch$(){
+        if (null == this.beBatch){ return null; }
+        switch (this.beBatch){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.beBatch);
+        }
+    }
+
+    public String getSource$(){
+        if (null == this.source){ return null; }
+        switch (this.source){
+            case 1:
+                return "鍒堕��";
+            case 2:
+                return "閲囪喘";
+            case 3:
+                return "澶栧崗";
+            default:
+                return String.valueOf(this.source);
+        }
+    }
+
+    public String getInspect$(){
+        if (null == this.inspect){ return null; }
+        switch (this.inspect){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.inspect);
+        }
+    }
+
+    public String getDanger$(){
+        if (null == this.danger){ return null; }
+        switch (this.danger){
+            case 1:
+                return "鏄�";
+            case 0:
+                return "鍚�";
+            default:
+                return String.valueOf(this.danger);
+        }
+    }
+
+    public String 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.getById(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.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManTag.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManTag.java
new file mode 100644
index 0000000..9b11ae3
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManTag.java
@@ -0,0 +1,258 @@
+package com.zy.asrs.common.wms.entity;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.common.sys.entity.User;
+import com.zy.asrs.common.sys.service.UserService;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("wms_man_tag")
+public class ManTag implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ApiModelProperty(value= "ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 缂栧彿
+     */
+    @ApiModelProperty(value= "缂栧彿")
+    private String uuid;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 鐖剁骇
+     */
+    @ApiModelProperty(value= "鐖剁骇")
+    private Long parentId;
+
+    /**
+     * 鐖剁骇鍚嶇О
+     */
+    @ApiModelProperty(value= "鐖剁骇鍚嶇О")
+    private String parentName;
+
+    /**
+     * 鍏宠仈璺緞
+     */
+    @ApiModelProperty(value= "鍏宠仈璺緞")
+    private String path;
+
+    /**
+     * 鍏宠仈璺緞鍚�
+     */
+    @ApiModelProperty(value= "鍏宠仈璺緞鍚�")
+    private String pathName;
+
+    /**
+     * 绫诲瀷 1: 鐩掕  2: 琚嬭  0: 鍏朵粬  
+     */
+    @ApiModelProperty(value= "绫诲瀷 1: 鐩掕  2: 琚嬭  0: 鍏朵粬  ")
+    private Integer type;
+
+    /**
+     * 璐熻矗浜�
+     */
+    @ApiModelProperty(value= "璐熻矗浜�")
+    private String leading;
+
+    /**
+     * 鍥剧墖
+     */
+    @ApiModelProperty(value= "鍥剧墖")
+    private String img;
+
+    /**
+     * 绠�瑕佹弿杩�
+     */
+    @ApiModelProperty(value= "绠�瑕佹弿杩�")
+    private String brief;
+
+    /**
+     * 鏁伴噺
+     */
+    @ApiModelProperty(value= "鏁伴噺")
+    private Integer count;
+
+    /**
+     * 绛夌骇
+     */
+    @ApiModelProperty(value= "绛夌骇")
+    private Integer level;
+
+    /**
+     * 鎺掑簭
+     */
+    @ApiModelProperty(value= "鎺掑簭")
+    private Integer sort;
+
+    /**
+     * 鐘舵�� 1: 姝e父  0: 绂佺敤  
+     */
+    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 绂佺敤  ")
+    private Integer status;
+
+    /**
+     * 娣诲姞鏃堕棿
+     */
+    @ApiModelProperty(value= "娣诲姞鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 娣诲姞浜哄憳
+     */
+    @ApiModelProperty(value= "娣诲姞浜哄憳")
+    private Long createBy;
+
+    /**
+     * 淇敼鏃堕棿
+     */
+    @ApiModelProperty(value= "淇敼鏃堕棿")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 淇敼浜哄憳
+     */
+    @ApiModelProperty(value= "淇敼浜哄憳")
+    private Long updateBy;
+
+    /**
+     * 澶囨敞
+     */
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public ManTag() {}
+
+    public ManTag(String uuid,String name,Long parentId,String parentName,String path,String pathName,Integer type,String leading,String img,String brief,Integer count,Integer level,Integer sort,Integer status,Date createTime,Long createBy,Date updateTime,Long updateBy,String memo) {
+        this.uuid = uuid;
+        this.name = name;
+        this.parentId = parentId;
+        this.parentName = parentName;
+        this.path = path;
+        this.pathName = pathName;
+        this.type = type;
+        this.leading = leading;
+        this.img = img;
+        this.brief = brief;
+        this.count = count;
+        this.level = level;
+        this.sort = sort;
+        this.status = status;
+        this.createTime = createTime;
+        this.createBy = createBy;
+        this.updateTime = updateTime;
+        this.updateBy = updateBy;
+        this.memo = memo;
+    }
+
+//    ManTag manTag = new ManTag(
+//            null,    // 缂栧彿
+//            null,    // 鍚嶇О
+//            null,    // 鐖剁骇
+//            null,    // 鐖剁骇鍚嶇О
+//            null,    // 鍏宠仈璺緞
+//            null,    // 鍏宠仈璺緞鍚�
+//            null,    // 绫诲瀷
+//            null,    // 璐熻矗浜�
+//            null,    // 鍥剧墖
+//            null,    // 绠�瑕佹弿杩�
+//            null,    // 鏁伴噺
+//            null,    // 绛夌骇
+//            null,    // 鎺掑簭
+//            null,    // 鐘舵��
+//            null,    // 娣诲姞鏃堕棿
+//            null,    // 娣诲姞浜哄憳
+//            null,    // 淇敼鏃堕棿
+//            null,    // 淇敼浜哄憳
+//            null    // 澶囨敞
+//    );
+
+    public String getType$(){
+        if (null == this.type){ return null; }
+        switch (this.type){
+            case 1:
+                return "鐩掕";
+            case 2:
+                return "琚嬭";
+            case 0:
+                return "鍏朵粬";
+            default:
+                return String.valueOf(this.type);
+        }
+    }
+
+    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 getCreateTime$(){
+        if (Cools.isEmpty(this.createTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+    }
+
+    public String getCreateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.createBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+    public String getUpdateTime$(){
+        if (Cools.isEmpty(this.updateTime)){
+            return "";
+        }
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
+    }
+
+    public String getUpdateBy$(){
+        UserService service = SpringUtils.getBean(UserService.class);
+        User user = service.getById(this.updateBy);
+        if (!Cools.isEmpty(user)){
+            return String.valueOf(user.getNickname());
+        }
+        return null;
+    }
+
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManMatMapper.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManMatMapper.java
new file mode 100644
index 0000000..8d600f1
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManMatMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.common.wms.mapper;
+
+import com.zy.asrs.common.wms.entity.ManMat;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ManMatMapper extends BaseMapper<ManMat> {
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManTagMapper.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManTagMapper.java
new file mode 100644
index 0000000..1fc939e
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManTagMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.common.wms.mapper;
+
+import com.zy.asrs.common.wms.entity.ManTag;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ManTagMapper extends BaseMapper<ManTag> {
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManMatService.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManMatService.java
new file mode 100644
index 0000000..6f74734
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManMatService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.common.wms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.common.wms.entity.ManMat;
+
+public interface ManMatService extends IService<ManMat> {
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManTagService.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManTagService.java
new file mode 100644
index 0000000..0843b56
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManTagService.java
@@ -0,0 +1,10 @@
+package com.zy.asrs.common.wms.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.asrs.common.wms.entity.ManTag;
+
+public interface ManTagService extends IService<ManTag> {
+
+    ManTag getTop();
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManMatServiceImpl.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManMatServiceImpl.java
new file mode 100644
index 0000000..0b5882c
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManMatServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.common.wms.service.impl;
+
+import com.zy.asrs.common.wms.mapper.ManMatMapper;
+import com.zy.asrs.common.wms.entity.ManMat;
+import com.zy.asrs.common.wms.service.ManMatService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("manMatService")
+public class ManMatServiceImpl extends ServiceImpl<ManMatMapper, ManMat> implements ManMatService {
+
+}
diff --git a/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManTagServiceImpl.java b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManTagServiceImpl.java
new file mode 100644
index 0000000..c084e6a
--- /dev/null
+++ b/zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManTagServiceImpl.java
@@ -0,0 +1,32 @@
+package com.zy.asrs.common.wms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.common.wms.mapper.ManTagMapper;
+import com.zy.asrs.common.wms.entity.ManTag;
+import com.zy.asrs.common.wms.service.ManTagService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.asrs.framework.exception.CoolException;
+import org.springframework.stereotype.Service;
+
+@Service("manTagService")
+public class ManTagServiceImpl extends ServiceImpl<ManTagMapper, ManTag> implements ManTagService {
+
+    @Override
+    public synchronized ManTag getTop() {
+        ManTag top = this.getOne(new LambdaQueryWrapper<ManTag>().eq(ManTag::getLevel, 1));
+        if (top == null) {
+            top = new ManTag();
+            top.setName("鍏ㄩ儴");
+            top.setType(0);
+            top.setLevel(1);
+            top.setStatus(1);
+            top.setSort(0);
+            Integer insert = this.baseMapper.insert(top);
+            if (insert == 0) {
+                throw new CoolException("鏈嶅姟鍣ㄥ紓甯�");
+            }
+        }
+        return top;
+    }
+
+}
diff --git a/zy-asrs-common/src/main/java/manMat.sql b/zy-asrs-common/src/main/java/manMat.sql
new file mode 100644
index 0000000..f8d006b
--- /dev/null
+++ b/zy-asrs-common/src/main/java/manMat.sql
@@ -0,0 +1,18 @@
+-- save manMat record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manMat/manMat.html', 'manMat绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manMat#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manMat#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manMat#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manMat#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manMat#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manMat/manMat.html', N'manMat绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manMat#view', N'鏌ヨ', '', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manMat#btn-add', N'鏂板', '', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manMat#btn-edit', N'缂栬緫', '', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manMat#btn-delete', N'鍒犻櫎', '', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manMat#btn-export', N'瀵煎嚭', '', '3', '4', '1');
diff --git a/zy-asrs-common/src/main/java/manTag.sql b/zy-asrs-common/src/main/java/manTag.sql
new file mode 100644
index 0000000..f9f973a
--- /dev/null
+++ b/zy-asrs-common/src/main/java/manTag.sql
@@ -0,0 +1,18 @@
+-- save manTag record
+-- mysql
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manTag/manTag.html', 'manTag绠$悊', null , '2', null , '1');
+
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manTag#view', '鏌ヨ', '', '3', '0', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manTag#btn-add', '鏂板', '', '3', '1', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manTag#btn-edit', '缂栬緫', '', '3', '2', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manTag#btn-delete', '鍒犻櫎', '', '3', '3', '1');
+insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'manTag#btn-export', '瀵煎嚭', '', '3', '4', '1');
+
+-- sqlserver
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manTag/manTag.html', N'manTag绠$悊', null, '2', null, '1');
+
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manTag#view', N'鏌ヨ', '', '3', '0', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manTag#btn-add', N'鏂板', '', '3', '1', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manTag#btn-edit', N'缂栬緫', '', '3', '2', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manTag#btn-delete', N'鍒犻櫎', '', '3', '3', '1');
+insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'manTag#btn-export', N'瀵煎嚭', '', '3', '4', '1');
diff --git a/zy-asrs-common/src/main/resources/mapper/wms/ManMatMapper.xml b/zy-asrs-common/src/main/resources/mapper/wms/ManMatMapper.xml
new file mode 100644
index 0000000..6d5e898
--- /dev/null
+++ b/zy-asrs-common/src/main/resources/mapper/wms/ManMatMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.common.wms.mapper.ManMatMapper">
+
+</mapper>
diff --git a/zy-asrs-common/src/main/resources/mapper/wms/ManTagMapper.xml b/zy-asrs-common/src/main/resources/mapper/wms/ManTagMapper.xml
new file mode 100644
index 0000000..0337435
--- /dev/null
+++ b/zy-asrs-common/src/main/resources/mapper/wms/ManTagMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.common.wms.mapper.ManTagMapper">
+
+</mapper>
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManMatController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManMatController.java
new file mode 100644
index 0000000..632a5d9
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManMatController.java
@@ -0,0 +1,105 @@
+package com.zy.asrs.wms.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.asrs.common.wms.entity.ManMat;
+import com.zy.asrs.common.wms.service.ManMatService;
+import com.zy.asrs.framework.annotations.ManagerAuth;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.domain.KeyValueVo;
+import com.zy.asrs.framework.common.DateUtils;
+import com.zy.asrs.common.web.BaseController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class ManMatController extends BaseController {
+
+    @Autowired
+    private ManMatService manMatService;
+
+    @RequestMapping(value = "/manMat/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") Long id) {
+        return R.ok(manMatService.getById(id));
+    }
+
+    @RequestMapping(value = "/manMat/page/auth")
+    @ManagerAuth
+    public R page(@RequestParam(defaultValue = "1") Integer curr,
+                  @RequestParam(defaultValue = "10") Integer limit,
+                  @RequestParam(required = false) String condition,
+                  @RequestParam(required = false) String timeRange) {
+        LambdaQueryWrapper<ManMat> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(ManMat::getId, condition);
+        }
+        if (!Cools.isEmpty(timeRange)) {
+            String[] range = timeRange.split(RANGE_TIME_LINK);
+            wrapper.ge(ManMat::getCreateTime, DateUtils.convert(range[0]));
+            wrapper.le(ManMat::getCreateTime, DateUtils.convert(range[1]));
+        }
+        return R.ok(manMatService.page(new Page<>(curr, limit), wrapper));
+    }
+
+
+    @RequestMapping(value = "/manMat/add/auth")
+    @ManagerAuth
+    public R add(ManMat manMat) {
+        manMatService.save(manMat);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/manMat/update/auth")
+	@ManagerAuth
+    public R update(ManMat manMat){
+        if (Cools.isEmpty(manMat) || null==manMat.getId()){
+            return R.error();
+        }
+        manMatService.updateById(manMat);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/manMat/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            manMatService.removeById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/manMatQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        LambdaQueryWrapper<ManMat> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(ManMat::getId, condition);
+        Page<ManMat> page = manMatService.page(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (ManMat manMat : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", manMat.getId());
+            map.put("value", manMat.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping("/manMat/all/get/kv")
+    @ManagerAuth
+    public R getDataKV(@RequestParam(required = false) String condition) {
+        List<KeyValueVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<ManMat> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(ManMat::getId, condition);
+        }
+        manMatService.page(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.getId()), item.getId())));
+        return R.ok().add(vos);
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManTagController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManTagController.java
new file mode 100644
index 0000000..c17d05c
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManTagController.java
@@ -0,0 +1,234 @@
+package com.zy.asrs.wms.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.asrs.common.domain.CodeRes;
+import com.zy.asrs.common.domain.entity.MatExcel;
+import com.zy.asrs.common.domain.entity.MatPrint;
+import com.zy.asrs.common.utils.*;
+import com.zy.asrs.common.wms.entity.ManMat;
+import com.zy.asrs.common.wms.entity.ManTag;
+import com.zy.asrs.common.wms.service.ManMatService;
+import com.zy.asrs.common.wms.service.ManTagService;
+import com.zy.asrs.framework.annotations.ManagerAuth;
+import com.zy.asrs.framework.common.BaseRes;
+import com.zy.asrs.framework.common.Cools;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.domain.KeyValueVo;
+import com.zy.asrs.framework.common.DateUtils;
+import com.zy.asrs.common.web.BaseController;
+import com.zy.asrs.wms.config.AdminInterceptor;
+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.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.*;
+
+@RestController
+public class ManTagController extends BaseController {
+
+    @Autowired
+    private ManTagService manTagService;
+    @Autowired
+    private ManMatService manMatService;
+    @Autowired
+    private TreeUtils treeUtils;
+
+    @RequestMapping(value = "/manTag/{id}/auth")
+    @ManagerAuth
+    public R get(@PathVariable("id") String id) {
+        return R.ok(manTagService.getById(String.valueOf(id)));
+    }
+
+    @RequestMapping(value = "/manTag/page/auth")
+    @ManagerAuth
+    public R page(@RequestParam(defaultValue = "1") Integer curr,
+                  @RequestParam(defaultValue = "10") Integer limit,
+                  @RequestParam(required = false) String condition,
+                  @RequestParam(required = false) String timeRange) {
+        LambdaQueryWrapper<ManTag> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(ManTag::getId, condition);
+        }
+        if (!Cools.isEmpty(timeRange)) {
+            String[] range = timeRange.split(RANGE_TIME_LINK);
+            wrapper.ge(ManTag::getCreateTime, DateUtils.convert(range[0]));
+            wrapper.le(ManTag::getCreateTime, DateUtils.convert(range[1]));
+        }
+        return R.ok(manTagService.page(new Page<>(curr, limit), wrapper));
+    }
+
+
+    @RequestMapping(value = "/manTag/add/auth")
+    @ManagerAuth
+    public R add(ManTag manTag) {
+        manTagService.save(manTag);
+        return R.ok();
+    }
+
+	@RequestMapping(value = "/manTag/update/auth")
+	@ManagerAuth
+    public R update(ManTag manTag){
+        if (Cools.isEmpty(manTag) || null==manTag.getId()){
+            return R.error();
+        }
+        manTagService.updateById(manTag);
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/manTag/delete/auth")
+    @ManagerAuth
+    public R delete(@RequestParam(value="ids[]") Long[] ids){
+         for (Long id : ids){
+            manTagService.removeById(id);
+        }
+        return R.ok();
+    }
+
+    @RequestMapping(value = "/manTagQuery/auth")
+    @ManagerAuth
+    public R query(String condition) {
+        LambdaQueryWrapper<ManTag> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(ManTag::getId, condition);
+        Page<ManTag> page = manTagService.page(new Page<>(0, 10), wrapper);
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (ManTag manTag : page.getRecords()){
+            Map<String, Object> map = new HashMap<>();
+            map.put("id", manTag.getId());
+            map.put("value", manTag.getId());
+            result.add(map);
+        }
+        return R.ok(result);
+    }
+
+    @RequestMapping("/manTag/all/get/kv")
+    @ManagerAuth
+    public R getDataKV(@RequestParam(required = false) String condition) {
+        List<KeyValueVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<ManTag> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(ManTag::getId, condition);
+        }
+        manTagService.page(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.getId()), item.getId())));
+        return R.ok().add(vos);
+    }
+
+    @PostMapping(value = "/manTag/tree/auth")
+    @ManagerAuth
+    public R tree(@RequestParam(required = false, defaultValue = "") String condition) throws IOException, ClassNotFoundException {
+        ArrayList<Map> tree = treeUtils.getTree(String.valueOf(getOriginTag().getId()));
+        // 娣辨嫹璐�
+        List<Map> result = ListUtils.deepCopy(tree);
+        if (!Cools.isEmpty(condition)) {
+            treeUtils.remove(condition, result);
+            treeUtils.remove(condition, result);
+        }
+        return R.ok(result);
+    }
+
+    /*************************************** 鎵撳嵃鐩稿叧 ***********************************************/
+
+    @RequestMapping(value = "/mac/code/auth")
+//    @ManagerAuth(memo = "鐗╂枡缂栫爜鏉″舰鐮佽幏鍙�(type:1(鏉″舰鐮�);2(浜岀淮鐮�)")
+    public R matCodeBarcode(@RequestParam(defaultValue = "1") Integer type
+            , @RequestParam String param
+            , HttpServletResponse response) throws Exception {
+        AdminInterceptor.cors(response);
+        if (Cools.isEmpty(param)){
+            return R.parse(BaseRes.EMPTY);
+        }
+        BufferedImage img;
+        if (type == 1) {
+            img = BarcodeUtils.encode(param);
+        } else {
+            img = QrCode.createImg(param);
+        }
+        if (!ImageIO.write(img, "jpg", response.getOutputStream())) {
+            throw new IOException("Could not write an image of format jpg");
+        }
+        response.getOutputStream().flush();
+        response.getOutputStream().close();
+        return R.ok();
+    }
+
+    // 鎵撳嵃
+    @RequestMapping(value = "/mat/print/auth")
+    @ManagerAuth(memo = "鍟嗗搧缂栫爜鎵撳嵃")
+    public R matCodePrint(@RequestParam(value = "param[]") String[] param) {
+        if(Cools.isEmpty(param)) {
+            return R.parse(CodeRes.EMPTY);
+        }
+        List<MatPrint> res = new ArrayList<>();
+        for (String matnr : param){
+            ManMat mat = manMatService.getOne(new LambdaQueryWrapper<ManMat>().eq(ManMat::getMatnr, matnr));
+            // 鎵撳嵃鏁版嵁娉ㄥ叆
+            MatPrint print = new MatPrint();
+            print.setMatnr(mat.getMatnr());
+            print.setBarcode(mat.getBarcode());
+            print.setMaktx(mat.getMaktx());
+            print.setSpecs(mat.getSpecs());
+            print.setUnit(mat.getUnit());
+            print.setMemo(mat.getMemo());
+            res.add(print);
+        }
+        return R.ok().add(res);
+    }
+
+
+    /*************************************** 鏁版嵁鐩稿叧 ***********************************************/
+
+    /**
+     * excel瀵煎叆妯℃澘涓嬭浇
+     */
+    @RequestMapping(value = "/mat/excel/import/mould")
+    public void matExcelImportMould(HttpServletResponse response) throws IOException {
+        List<MatExcel> 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(), MatExcel.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+                .sheet("sheet1")
+                .doWrite(excels);
+    }
+
+    // excel瀵煎叆
+    @PostMapping(value = "/mat/excel/import/auth")
+    @ManagerAuth(memo = "鍟嗗搧妗f鏁版嵁瀵煎叆")
+    @Transactional
+    public R matExcelImport(MultipartFile file) throws IOException {
+        MatExcelListener listener = new MatExcelListener(getUserId());
+        EasyExcel.read(file.getInputStream(), MatExcel.class, listener).sheet().doRead();
+        return R.ok("鎴愬姛鍚屾"+listener.getTotal()+"鏉″晢鍝佹暟鎹�");
+    }
+
+    /*************************************** xm-select ***********************************************/
+
+    // xm-select 鎼滅储鍟嗗搧鍒楄〃
+    @RequestMapping("/mat/all/get/kv")
+    @ManagerAuth
+    public R getMatDataKV(@RequestParam(required = false) String condition) {
+        LambdaQueryWrapper<ManMat> wrapper = new LambdaQueryWrapper<ManMat>()
+                .like(ManMat::getMatnr, condition).or().like(ManMat::getMaktx, condition)
+                .orderByAsc(ManMat::getCreateTime);
+        List<ManMat> mats = manMatService.page(new Page<>(1, 30), wrapper).getRecords();
+        List<KeyValueVo> valueVos = new ArrayList<>();
+        for (ManMat mat : mats) {
+            KeyValueVo vo = new KeyValueVo();
+            vo.setName(mat.getMatnr() + " - " + mat.getMaktx());
+            vo.setValue(mat.getId());
+            valueVos.add(vo);
+        }
+        return R.ok().add(valueVos);
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/webapp/static/js/manMat/manMat.js b/zy-asrs-wms/src/main/webapp/static/js/manMat/manMat.js
new file mode 100644
index 0000000..d39793e
--- /dev/null
+++ b/zy-asrs-wms/src/main/webapp/static/js/manMat/manMat.js
@@ -0,0 +1,480 @@
+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+'/manTag/page/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+'/manMat/page/auth',
+        page: true,
+        limit: 16,
+        limits: [16, 30, 50, 100, 200, 500],
+        toolbar: '#toolbar',
+        cellMinWidth: 50,
+        height: 'full-105',
+        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(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+"/manMat/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+"/manMat/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 + "/manMat/auto/matnr/auth", null, function (res) {
+                        $('#matnr').val(res.data);
+                    })
+                }
+                // 琛ㄥ崟鎻愪氦浜嬩欢
+                form.on('submit(editSubmit)', function (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+"/manMat/"+(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+"/manMat/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 + "/manMat/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 + "/manMat/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/zy-asrs-wms/src/main/webapp/static/js/manTag/manTag.js b/zy-asrs-wms/src/main/webapp/static/js/manTag/manTag.js
new file mode 100644
index 0000000..c9c7c8b
--- /dev/null
+++ b/zy-asrs-wms/src/main/webapp/static/js/manTag/manTag.js
@@ -0,0 +1,338 @@
+var pageCurr;
+var pageCount = 0;
+layui.config({
+    base: baseUrl + "/static/layui/lay/modules/"
+}).use(['table','laydate', 'form', 'admin', 'xmSelect'], function(){
+    var table = layui.table;
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var layDate = layui.laydate;
+    var form = layui.form;
+    var admin = layui.admin;
+    var xmSelect = layui.xmSelect;
+
+    // 鏁版嵁娓叉煋
+    tableIns = table.render({
+        elem: '#manTag',
+        headers: {token: localStorage.getItem('token')},
+        url: baseUrl+'/manTag/page/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'}
+            ,{field: 'uuid', align: 'center',title: '缂栧彿'}
+            ,{field: 'name', align: 'center',title: '鍚嶇О'}
+            ,{field: 'parentId', align: 'center',title: '鐖剁骇'}
+            ,{field: 'parentName', align: 'center',title: '鐖剁骇鍚嶇О'}
+            ,{field: 'path', align: 'center',title: '鍏宠仈璺緞'}
+            ,{field: 'pathName', align: 'center',title: '鍏宠仈璺緞鍚�'}
+            ,{field: 'type$', align: 'center',title: '绫诲瀷'}
+            ,{field: 'leading', align: 'center',title: '璐熻矗浜�'}
+            ,{field: 'img', align: 'center',title: '鍥剧墖'}
+            ,{field: 'brief', align: 'center',title: '绠�瑕佹弿杩�'}
+            ,{field: 'count', align: 'center',title: '鏁伴噺'}
+            ,{field: 'level', align: 'center',title: '绛夌骇'}
+            ,{field: 'sort', align: 'center',title: '鎺掑簭'}
+            ,{field: 'status$', align: 'center',title: '鐘舵��'}
+            ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+            ,{field: 'createBy$', align: 'center',title: '娣诲姞浜哄憳'}
+            ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'}
+            ,{field: 'updateBy$', align: 'center',title: '淇敼浜哄憳'}
+            ,{field: 'memo', align: 'center',title: '澶囨敞'}
+
+            ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width:120}
+        ]],
+        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;pageCount=count;
+            limit();
+        }
+    });
+
+    // 鐩戝惉鎺掑簭浜嬩欢
+    table.on('sort(manTag)', 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(manTag)', 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 = {
+                        'manTag': exportData,
+                        'fields': fields
+                    };
+                    $.ajax({
+                        url: baseUrl+"/manTag/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(manTag)', 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) {
+                form.val('detail', mData);
+                layDateRender(mData);
+                form.on('submit(editSubmit)', function (data) {
+                    var loadIndex = layer.load(2);
+                    $.ajax({
+                        url: baseUrl+"/manTag/"+(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+"/manTag/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(true);
+    });
+
+    // 閲嶇疆
+    form.on('submit(reset)', function (data) {
+        pageCurr = 1;
+        clearFormVal($('#search-box'));
+        tableReload(true);
+    });
+
+    // 鏃堕棿閫夋嫨鍣�
+    function layDateRender(data) {
+        setTimeout(function () {
+            layDate.render({
+                elem: '.layui-laydate-range'
+                ,type: 'datetime'
+                ,range: true
+            });
+            layDate.render({
+                elem: '#createTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['createTime$']:null
+            });
+            layDate.render({
+                elem: '#updateTime\\$',
+                type: 'datetime',
+                value: data!==undefined?data['updateTime$']:null
+            });
+
+        }, 100);
+    }
+    layDateRender();
+
+    window.loadUserSel = function () {
+        return xmSelect.render({
+            el: '#userXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/user/all/get/kv",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: {
+                        condition: val
+                    },
+                    method: 'POST',
+                    success: function (res) {
+                        if (res.code === 200) {
+                            cb(res.data)
+                        } else {
+                            cb([]);
+                            layer.msg(res.msg, {icon: 2});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+    window.loadUserSel = function () {
+        return xmSelect.render({
+            el: '#userXmlSel',
+            autoRow: true,
+            filterable: true,
+            remoteSearch: true,
+            radio: true,
+            remoteMethod: function (val, cb, show) {
+                $.ajax({
+                    url: baseUrl + "/user/all/get/kv",
+                    headers: {'token': localStorage.getItem('token')},
+                    data: {
+                        condition: val
+                    },
+                    method: 'POST',
+                    success: function (res) {
+                        if (res.code === 200) {
+                            cb(res.data)
+                        } else {
+                            cb([]);
+                            layer.msg(res.msg, {icon: 2});
+                        }
+                    }
+                });
+            }
+        });
+    }
+
+
+
+});
+
+// 鍏抽棴鍔ㄤ綔
+$(document).on('click','#data-detail-close', function () {
+    parent.layer.closeAll();
+});
+
+function tableReload(search) {
+    if (pageCount === 0 || search) {
+        let searchData = {};
+        $.each($('#search-box [name]').serializeArray(), function() {
+            searchData[this.name] = this.value;
+        });
+        tableIns.reload({
+            where: searchData,
+            page: {curr: pageCurr}
+        });
+    } else {
+        $(".layui-laypage-btn")[0].click();
+    }
+}
diff --git a/zy-asrs-wms/src/main/webapp/static/js/tagTree.js b/zy-asrs-wms/src/main/webapp/static/js/tagTree.js
new file mode 100644
index 0000000..a7c2ae1
--- /dev/null
+++ b/zy-asrs-wms/src/main/webapp/static/js/tagTree.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+"/manTag/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: {tag_id: obj.data.id},
+                                page: {curr: 1}
+                            });
+                        }
+                    });
+                    treeData = res.data;
+                    if (isEmpty(condition) && init) {
+                        tableIns.reload({
+                            where: {tag_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/zy-asrs-wms/src/main/webapp/views/manMat/manMat.html b/zy-asrs-wms/src/main/webapp/views/manMat/manMat.html
new file mode 100644
index 0000000..3bddd64
--- /dev/null
+++ b/zy-asrs-wms/src/main/webapp/views/manMat/manMat.html
@@ -0,0 +1,465 @@
+<!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="matnr" 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" 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-gray">{{d.tagId$}}</span>
+</script>
+
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-print-batch" lay-event="btnPrintBatch">鎵归噺鎵撳嵃</button>
+        <button class="layui-btn layui-btn-sm layui-btn-normal" id="btn-add" lay-event="addData">鏂板</button>
+        <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/manMat/manMat.js" charset="utf-8"></script>
+<script type="text/javascript" src="../../static/js/tagTree.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">浠g爜</label>
+                    <div class="layui-input-block">
+                        <input name="model" type="number" placeholder="璇疯緭鍏ヤ唬鐮�" class="layui-input">
+                    </div>
+                </div>
+
+                <div class="layui-form-item">
+                    <label class="layui-form-label">搴撳瓨涓婇檺</label>
+                    <div class="layui-input-block">
+                        <input name="safeQty" 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/zy-asrs-wms/src/main/webapp/views/manTag/manTag.html b/zy-asrs-wms/src/main/webapp/views/manTag/manTag.html
new file mode 100644
index 0000000..3ea7243
--- /dev/null
+++ b/zy-asrs-wms/src/main/webapp/views/manTag/manTag.html
@@ -0,0 +1,216 @@
+<!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">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="condition" 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="timeRange" type="text" placeholder="璧峰鏃堕棿 - 缁堟鏃堕棿" autocomplete="off" style="width: 300px">
+                        </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="manTag" lay-filter="manTag"></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/manTag/manTag.js" charset="utf-8"></script>
+</body>
+<!-- 琛ㄥ崟寮圭獥 -->
+<script type="text/html" id="editDialog">
+    <div 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">缂栧彿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="uuid" placeholder="璇疯緭鍏ョ紪鍙�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍚嶇О: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="name" placeholder="璇疯緭鍏ュ悕绉�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐖剁骇: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="parentId" placeholder="璇疯緭鍏ョ埗绾�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐖剁骇鍚嶇О: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="parentName" placeholder="璇疯緭鍏ョ埗绾у悕绉�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍏宠仈璺緞: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="path" placeholder="璇疯緭鍏ュ叧鑱旇矾寰�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍏宠仈璺緞鍚�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="pathName" placeholder="璇疯緭鍏ュ叧鑱旇矾寰勫悕">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">绫诲瀷: </label>
+                    <div class="layui-input-block">
+                        <select name="type">
+                            <option value="">璇烽�夋嫨绫诲瀷</option>
+                            <option value="1">鐩掕</option>
+                            <option value="2">琚嬭</option>
+                            <option value="0">鍏朵粬</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">璐熻矗浜�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="leading" placeholder="璇疯緭鍏ヨ礋璐d汉">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鍥剧墖: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="img" placeholder="璇疯緭鍏ュ浘鐗�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">绠�瑕佹弿杩�: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="brief" placeholder="璇疯緭鍏ョ畝瑕佹弿杩�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鏁伴噺: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="count" placeholder="璇疯緭鍏ユ暟閲�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">绛夌骇: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="level" placeholder="璇疯緭鍏ョ瓑绾�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鎺掑簭: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="sort" placeholder="璇疯緭鍏ユ帓搴�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">鐘舵��: </label>
+                    <div class="layui-input-block">
+                        <select name="status">
+                            <option value="">璇烽�夋嫨鐘舵��</option>
+                            <option value="1">姝e父</option>
+                            <option value="0">绂佺敤</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">娣诲姞鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="createTime" id="createTime$" placeholder="璇疯緭鍏ユ坊鍔犳椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">娣诲姞浜哄憳: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="createBy" placeholder="璇疯緭鍏ユ坊鍔犱汉鍛�" style="display: none">
+                        <input id="createBy$" name="createBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ユ坊鍔犱汉鍛�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="userQueryBycreateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="userQueryBycreateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">淇敼鏃堕棿: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="璇疯緭鍏ヤ慨鏀规椂闂�">
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">淇敼浜哄憳: </label>
+                    <div class="layui-input-block cool-auto-complete">
+                        <input class="layui-input" name="updateBy" placeholder="璇疯緭鍏ヤ慨鏀逛汉鍛�" style="display: none">
+                        <input id="updateBy$" name="updateBy$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="璇疯緭鍏ヤ慨鏀逛汉鍛�" onfocus=this.blur()>
+                        <div class="cool-auto-complete-window">
+                            <input class="cool-auto-complete-window-input" data-key="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
+                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-form-item">
+                    <label class="layui-form-label">澶囨敞: </label>
+                    <div class="layui-input-block">
+                        <input class="layui-input" name="memo" 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>
+    </div>
+</script>
+</html>
+

--
Gitblit v1.9.1