#
Junjie
2023-12-21 b3920dae6a87fcb297e898441d204e087c3ebe90
#
27个文件已添加
2个文件已修改
3329 ■■■■■ 已修改文件
zy-asrs-common/pom.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatExcel.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatPrint.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/BarcodeUtils.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/ListUtils.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/MatExcelListener.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/NodeUtils.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/QrCode.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/TreeUtils.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/web/BaseController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManMat.java 449 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManTag.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManMatMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManTagMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManMatService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManTagService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManMatServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManTagServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/manMat.sql 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/manTag.sql 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/resources/mapper/wms/ManMatMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/resources/mapper/wms/ManTagMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManMatController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManTagController.java 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/webapp/static/js/manMat/manMat.js 480 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/webapp/static/js/manTag/manTag.js 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/webapp/static/js/tagTree.js 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/webapp/views/manMat/manMat.html 465 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/webapp/views/manTag/manTag.html 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatExcel.java
New file
@@ -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;
}
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/MatPrint.java
New file
@@ -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;
}
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/BarcodeUtils.java
New file
@@ -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("解码内容如下:" + decodeContent);
        System.out.println("finished zxing EAN-13 decode.");
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/ListUtils.java
New file
@@ -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;
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/MatExcelListener.java
New file
@@ -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;
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/NodeUtils.java
New file
@@ -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);
            }
        }
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/QrCode.java
New file
@@ -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();
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/TreeUtils.java
New file
@@ -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();
                    }
                }
            }
        }
    }
}
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();
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManMat.java
New file
@@ -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: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  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 "正常";
            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);
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/entity/ManTag.java
New file
@@ -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: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  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 "正常";
            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;
    }
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManMatMapper.java
New file
@@ -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> {
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/mapper/ManTagMapper.java
New file
@@ -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> {
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManMatService.java
New file
@@ -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> {
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/ManTagService.java
New file
@@ -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();
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManMatServiceImpl.java
New file
@@ -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 {
}
zy-asrs-common/src/main/java/com/zy/asrs/common/wms/service/impl/ManTagServiceImpl.java
New file
@@ -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;
    }
}
zy-asrs-common/src/main/java/manMat.sql
New file
@@ -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');
zy-asrs-common/src/main/java/manTag.sql
New file
@@ -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');
zy-asrs-common/src/main/resources/mapper/wms/ManMatMapper.xml
New file
@@ -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>
zy-asrs-common/src/main/resources/mapper/wms/ManTagMapper.xml
New file
@@ -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>
zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManMatController.java
New file
@@ -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);
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/ManTagController.java
New file
@@ -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("商品档案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 = "商品档案数据导入")
    @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);
    }
}
zy-asrs-wms/src/main/webapp/static/js/manMat/manMat.js
New file
@@ -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,        // 是否是id、pid形式数据
            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方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
        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();
    }
});
zy-asrs-wms/src/main/webapp/static/js/manTag/manTag.js
New file
@@ -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();
    }
}
zy-asrs-wms/src/main/webapp/static/js/tagTree.js
New file
@@ -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)
}
zy-asrs-wms/src/main/webapp/views/manMat/manMat.html
New file
@@ -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">代码</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>
zy-asrs-wms/src/main/webapp/views/manTag/manTag.html
New file
@@ -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="请输入负责人">
                    </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">正常</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>