#
lsh
2024-09-06 eb151270cf5ec0166d11ad59af42785cf31b183c
#
3个文件已修改
4个文件已添加
737 ■■■■■ 已修改文件
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/LocInPrintMatExcel.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/OutLocOrderExcel.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/LocInPrintMatExcelListener.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/OutLocOrderExcelListener.java 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/TagController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/webapp/static/js/pakStore/stockOutOrder.js 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/webapp/views/pakStore/stockOutOrder.html 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/LocInPrintMatExcel.java
@@ -15,9 +15,9 @@
public class LocInPrintMatExcel extends Mat {
    @ExcelProperty(index = 0, value = "品号")
    private String matnr;
    @ExcelProperty(index = 1, value = "品名")
    private String matax;
    @ExcelProperty(index = 2, value = "打印数量")
//    @ExcelProperty(index = 1, value = "品名")
//    private String matax;
    @ExcelProperty(index = 1, value = "打印数量")
    private String anfme;
}
zy-asrs-common/src/main/java/com/zy/asrs/common/domain/entity/OutLocOrderExcel.java
New file
@@ -0,0 +1,26 @@
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.Mat;
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 OutLocOrderExcel extends Mat {
    @ExcelProperty(index = 0, value = "订单号")
    private String order;
    @ExcelProperty(index = 1, value = "单据类型")
    private String sign;
    @ExcelProperty(index = 2, value = "品号")
    private String matnr;
    @ExcelProperty(index = 3, value = "数量")
    private String anfme;
    @ExcelProperty(index = 4, value = "此列为备注==》不用填写==》订单号与单据类型只需要填写第一列即可")
    private String memo1;
}
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/LocInPrintMatExcelListener.java
@@ -6,8 +6,11 @@
import com.baomidou.mybatisplus.generator.config.IFileCreate;
import com.zy.asrs.common.domain.entity.LocInPrintMatExcel;
import com.zy.asrs.common.wms.entity.LocInPrintMat;
import com.zy.asrs.common.wms.entity.Mat;
import com.zy.asrs.common.wms.service.LocInPrintMatService;
import com.zy.asrs.common.wms.service.MatService;
import com.zy.asrs.framework.common.Cools;
import com.zy.asrs.framework.common.R;
import com.zy.asrs.framework.common.SpringUtils;
import com.zy.asrs.framework.exception.CoolException;
import lombok.Data;
@@ -29,7 +32,7 @@
    private int totalAnfme = 0;
    private Long userId;
    private Long hostId;
    List<String[]> OutLocBoxCs = new ArrayList<>();
    List<String[]> printMatList = new ArrayList<>();
    public LocInPrintMatExcelListener() {
    }
@@ -67,9 +70,14 @@
        } catch (Exception e){
            throw new CoolException("品号参数为空");
        }
        MatService matService = SpringUtils.getBean(MatService.class);
        Mat mat = matService.getOne(new LambdaQueryWrapper<Mat>().eq(Mat::getMatnr, matnr));
        if (Cools.isEmpty(mat)){
            throw new CoolException("品号:"+matnr+"不存在,请先新增商品档案!!!");
        }
        String matax = "";
        try{
            matax =  excel.getMatax();
            matax =  mat.getMaktx();
        } catch (Exception e){
            matax = "";
        }
@@ -93,7 +101,7 @@
        s[0] = matnr;
        s[1] = matax;
        s[2] = anfme;
        OutLocBoxCs.add(s);
        printMatList.add(s);
        total++;
        totalAnfme = totalAnfme+Integer.parseInt(anfme);
    }
@@ -104,13 +112,13 @@
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext ctx) {
        if (!Cools.isEmpty(OutLocBoxCs) && OutLocBoxCs.size() != 0) {
        if (!Cools.isEmpty(printMatList) && printMatList.size() != 0) {
            LocInPrintMatService locInPrintMatService = SpringUtils.getBean(LocInPrintMatService.class);
            Date now = new Date();
            for (String[] outLocBoxC:OutLocBoxCs){
                String matnr = outLocBoxC[0];
                String matax = outLocBoxC[1];
                String anfme = outLocBoxC[2];
            for (String[] printMat:printMatList){
                String matnr = printMat[0];
                String matax = printMat[1];
                String anfme = printMat[2];
                Integer intAnfme = 1;
                try{
                    Integer intAnfme1 = Integer.parseInt(anfme);
zy-asrs-common/src/main/java/com/zy/asrs/common/utils/OutLocOrderExcelListener.java
New file
@@ -0,0 +1,267 @@
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.dto.DetlDto;
import com.zy.asrs.common.domain.entity.OutLocOrderExcel;
import com.zy.asrs.common.domain.param.OrderDomainParam;
import com.zy.asrs.common.wms.entity.DocType;
import com.zy.asrs.common.wms.entity.Mat;
import com.zy.asrs.common.wms.entity.Order;
import com.zy.asrs.common.wms.entity.OrderDetl;
import com.zy.asrs.common.wms.service.DocTypeService;
import com.zy.asrs.common.wms.service.MatService;
import com.zy.asrs.common.wms.service.OrderDetlService;
import com.zy.asrs.common.wms.service.OrderService;
import com.zy.asrs.framework.common.*;
import com.zy.asrs.framework.exception.CoolException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.*;
/**
 * Created by vincent on 2019-11-25
 */
@Slf4j
public class OutLocOrderExcelListener extends AnalysisEventListener<OutLocOrderExcel> {
    private int total = 0;
    private String orderOneNo = null;
    private String orderSign = null;
    private Long orderSignId = null;
    private int totalAnfme = 0;
    private Long userId;
    private Long hostId;
    List<String[]> OutLocOrderCs = new ArrayList<>();
    List<List<String[]>> OutLocOrderList = new ArrayList<>();
    public OutLocOrderExcelListener() {
    }
    public OutLocOrderExcelListener(Long userId, Long hostId) {
        this.userId = userId;
        this.hostId = hostId;
    }
    /**
     * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 50;
    private final List<OutLocOrderExcel> list = new ArrayList<>();
    /**
     * 这里会一行行的返回头
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    }
    /**
     * 这个每一条数据解析都会来调用
     */
    @Override
    public void invoke(OutLocOrderExcel excel, AnalysisContext ctx) {
        if (Cools.isEmpty(orderOneNo)){
            if (!Cools.isEmpty(excel.getOrder())){
                orderOneNo = excel.getOrder();
            } else {
                throw new CoolException("订单号参数为空");
            }
        }
        if (Cools.isEmpty(orderSign)){
            if (!Cools.isEmpty(excel.getSign())){
                orderSign = excel.getSign();
                DocTypeService docTypeService = SpringUtils.getBean(DocTypeService.class);
                DocType docType = docTypeService.getOne(new LambdaQueryWrapper<DocType>().eq(DocType::getDocName, orderSign));
                if (Cools.isEmpty(docType)){
                    throw new CoolException("不存在的单据类型:"+orderSign);
                }
                orderSignId = docType.getDocId();
            } else {
                throw new CoolException("入出库标记参数为空");
            }
        }
        String matnr = "";
        try{
            matnr =  excel.getMatnr();
            if (Cools.isEmpty(matnr)){
                throw new CoolException("品号参数为空");
            }
        } catch (Exception e){
            throw new CoolException("品号参数为空");
        }
        MatService matService = SpringUtils.getBean(MatService.class);
        Mat mat = matService.getOne(new LambdaQueryWrapper<Mat>().eq(Mat::getMatnr, matnr));
        if (Cools.isEmpty(mat)){
            throw new CoolException("品号:"+matnr+"不存在,请先新增商品档案!!!");
        }
        String anfme = "0";
        try{
            String anfme1 = excel.getAnfme();
            try{
                Integer anfmeInt = Integer.parseInt(anfme1);
                if (!Cools.isEmpty(anfmeInt) && anfmeInt>0){
                    anfme = anfmeInt.toString();
                } else {
                    throw new CoolException("数量参数为空");
                }
            } catch (Exception e){
                throw new CoolException("数量参数为空");
            }
        } catch (Exception e){
            throw new CoolException("数量参数为空");
        }
        String[] s=new String[2];
        s[0] = matnr;
        s[1] = anfme;
        OutLocOrderCs.add(s);
        total++;
//        totalAnfme = totalAnfme+Integer.parseInt(anfme);
    }
    /**
     * 所有数据解析完成了调用
     * 适合事务
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext ctx) {
        if (!Cools.isEmpty(OutLocOrderCs) && OutLocOrderCs.size() != 0) {
            ArrayList<String> matnrSign = new ArrayList<>();
            for (String[] outLocOrderCs : OutLocOrderCs){
                if (!matnrSign.contains(outLocOrderCs[0])){
                    matnrSign.add(outLocOrderCs[0]);
                } else {
                    throw new CoolException("品号参数存在重复行:"+outLocOrderCs[0]);
                }
            }
            MatService matService = SpringUtils.getBean(MatService.class);
            OrderDomainParam orderDomainParam = new OrderDomainParam();
            orderDomainParam.setDocType(orderSignId);
            orderDomainParam.setOrderNo(orderOneNo);
            List<OrderDetl> orderDetlList = new ArrayList<>();
            for (String[] outLocOrderCs : OutLocOrderCs){
                OrderDetl orderDetl = new OrderDetl();
                orderDetl.setOrderNo(orderOneNo);
                orderDetl.setAnfme(Double.parseDouble(outLocOrderCs[1]));
                Mat mat = matService.getOne(new LambdaQueryWrapper<Mat>().eq(Mat::getMatnr, outLocOrderCs[0]));
                orderDetl.setMatnr(mat.getMatnr());
                orderDetl.setMaktx(mat.getMaktx());
                orderDetl.setBatch(mat.getBatch());
                orderDetl.setBarcode(mat.getBarcode());
                orderDetl.setSpecs(mat.getSpecs());
                orderDetl.setModel(mat.getModel());
                orderDetl.setStatus(1);
                orderDetl.setMemo(mat.getMemo());
                orderDetl.setHostId(hostId);
                orderDetlList.add(orderDetl);
            }
            orderDomainParam.setOrderDetlList(orderDetlList);
            boolean formAddOrder = formAddOrder(orderDomainParam);
            if (!formAddOrder){
                throw new CoolException("生成订单失败");
            }
        }
        log.info("成功导入{}条订单明细!", total);
    }
    public int[] getTotal() {
        return new int[]{total};
    }
    public boolean formAddOrder(OrderDomainParam param){
        OrderService orderService = SpringUtils.getBean(OrderService.class);
        JdbcTemplate jdbcTemplate = SpringUtils.getBean(JdbcTemplate.class);
        SnowflakeIdWorker snowflakeIdWorker = SpringUtils.getBean(SnowflakeIdWorker.class);
        OrderDetlService orderDetlService = SpringUtils.getBean(OrderDetlService.class);
        Order order = orderService.selectByNo(param.getOrderNo(), hostId);
        if (order != null) {
            throw new CoolException("单据编号已存在");
        }
        // 判断重复订单号
        Integer orderCount = Optional.ofNullable(jdbcTemplate.queryForObject("select count(1) from man_order where order_no = '" + param.getOrderNo() + "'", Integer.class)).orElse(0);
        Integer orderLogCount = Optional.ofNullable(jdbcTemplate.queryForObject("select count(1) from man_order_log where order_no = '" + param.getOrderNo() + "'", Integer.class)).orElse(0);
        if (orderCount > 0 || orderLogCount > 0) {
            throw new CoolException("单据编号已存在");
        }
        Date now = new Date();
        order = new Order(
                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                param.getOrderNo(),    // 订单编号
                DateUtils.convert(now),    // 单据日期
                param.getDocType(),    // 单据类型
                null,    // 项目编号
                null,    //
                null,    // 调拨项目编号
                null,    // 初始票据号
                null,    // 票据号
                null,    // 客户编号
                null,    // 客户
                null,    // 联系方式
                null,    // 操作人员
                null,    // 合计金额
                null,    // 优惠率
                null,    // 优惠金额
                null,    // 销售或采购费用合计
                null,    // 实付金额
                null,    // 付款类型
                null,    // 业务员
                null,    // 结算天数
                null,    // 邮费支付类型
                null,    // 邮费
                null,    // 付款时间
                null,    // 发货时间
                null,    // 物流名称
                null,    // 物流单号
                1L,    // 订单状态
                1,    // 状态
                userId,    // 添加人员
                now,    // 添加时间
                userId,    // 修改人员
                now,    // 修改时间
                null,    // 备注
                hostId
        );
        if (!orderService.save(order)) {
            throw new CoolException("保存订单主档失败");
        }
        List<DetlDto> list = new ArrayList<>();
        for (OrderDetl orderDetl : param.getOrderDetlList()) {
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch());
            if (DetlDto.has(list, dto)) {
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(), hostId);
                item.setAnfme(item.getAnfme() + orderDetl.getAnfme());
                if (!orderDetlService.updateById(item)) {
                    throw new CoolException("保存订单明细档失败");
                }
            } else {
                list.add(dto);
                orderDetl.setOrderId(order.getId());
                orderDetl.setOrderNo(order.getOrderNo());
                orderDetl.setCreateBy(userId);
                orderDetl.setCreateTime(now);
                orderDetl.setUpdateBy(userId);
                orderDetl.setUpdateTime(now);
                orderDetl.setStatus(1);
                orderDetl.setQty(0.0D);
                orderDetl.setWorkQty(0.0D);
                if (!orderDetlService.save(orderDetl)) {
                    throw new CoolException("保存订单明细档失败");
                }
            }
        }
        return true;
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/controller/TagController.java
@@ -8,6 +8,7 @@
import com.zy.asrs.common.domain.entity.LocInPrintMatExcel;
import com.zy.asrs.common.domain.entity.MatExcel;
import com.zy.asrs.common.domain.entity.MatPrint;
import com.zy.asrs.common.domain.entity.OutLocOrderExcel;
import com.zy.asrs.common.utils.*;
import com.zy.asrs.common.wms.entity.LocInPrintMat;
import com.zy.asrs.common.wms.entity.Mat;
@@ -324,4 +325,30 @@
        return R.ok("成功导入"+listener.getTotal()[0]+"种待打印物料信息,共生成"+listener.getTotal()[1]+"条待打印条码!");
    }
    /**
     * excel导入模板下载
     */
    @RequestMapping(value = "/out/loc/box/excel/import/out/mould")
    public void outLocBoxExcelImportOutMould(HttpServletResponse response) throws IOException {
        List<OutLocOrderExcel> excels = new ArrayList<>();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("导入订单信息出库模板", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), OutLocOrderExcel.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .sheet("出库模板")
                .doWrite(excels);
    }
    // excel导入
    @PostMapping(value = "/out/loc/box/excel/import/out/auth")
    @ManagerAuth(memo = "导入订单信息出库")
    @Transactional
    public R outLocBoxExcelImportOut(MultipartFile file) throws IOException {
        OutLocOrderExcelListener listener = new OutLocOrderExcelListener(getUserId(), getHostId());
        EasyExcel.read(file.getInputStream(), OutLocOrderExcel.class, listener).sheet().doRead();
        return R.ok("成功导入"+listener.getTotal()[0]+"条订单明细!");
    }
}
zy-asrs-wms/src/main/webapp/static/js/pakStore/stockOutOrder.js
New file
@@ -0,0 +1,243 @@
var locDetlLayerIdx;
var locDetlData = [];
var admin;
function getCol() {
    var cols = [
        // {field: 'count', align: 'center',title: '出库数量', edit:'text', width: 130,  style:'color: blue;font-weight: bold'},
        {field: 'anfme', align: 'center',title: '数量'}
        ,{field: 'locNo$', align: 'center',title: '库位号'}
    ];
    arrRemove(detlCols,  'field', 'anfme');
    cols.push.apply(cols, detlCols);
    cols.push({fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 80})
    return cols;
}
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function() {
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var form = layui.form;
    admin = layui.admin;
    tableIns = table.render({
        elem: '#chooseData',
        headers: {token: localStorage.getItem('token')},
        data: [],
        even: true,
        toolbar: '#toolbar',
        cellMinWidth: 50,
        limit: 500,
        cols: [getCol()],
        done: function(res, curr, count) {
            limit();
            getOutBound();
        }
    });
    // 页面修改
    table.on('edit(chooseData)', function (obj) {
        let index = obj.tr.attr("data-index");
        let data = locDetlData[index];
        let modify = true;
        // if (obj.field === 'count'){
        //     let vle = Number(obj.value);
        //     if (isNaN(vle)) {
        //         layer.msg("请输入数字", {icon: 2});
        //         modify = false;
        //     } else {
        //         if (vle <= 0) {
        //             layer.msg("数量必须大于零", {icon: 2});
        //             modify = false;
        //         }
        //         if (vle > Number(data.anfme)) {
        //             layer.msg("出库数量不得大于库存数量", {icon: 2});
        //             modify = false;
        //         }
        //     }
        // }
        if (modify) {
            data[obj.field] = obj.value;
        }
        tableIns.reload({data: locDetlData});
    });
    // 监听头工具栏事件
    table.on('toolbar(chooseData)', function (obj) {
        switch (obj.event) {
            case 'outbound':
                if (locDetlData.length === 0){
                    layer.msg('请先提取商品库存', {icon: 2});
                } else {
                    // var staNo = $("#staNoSelect").val();
                    // if (staNo === "" || staNo === null){
                    //     layer.msg("请选择出库口", {icon: 2});
                    //     return;
                    // }
                    var orderNo = $("#orderNo").val();
                    if (orderNo === "" || orderNo === null){
                        layer.msg("请输入出库单号", {icon: 2});
                        return;
                    }
                    for (var i=0;i<locDetlData.length;i++){
                        locDetlData[i]["orderNo"]=orderNo
                    }
                    console.log(locDetlData)
                    console.log(locDetlData[0])
                    let param = {
                        orderNo: orderNo,
                        locDetls: locDetlData
                    }
                    $.ajax({
                        url: baseUrl+"/plate/order/out/start",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            if (res.code === 200){
                                locDetlData = [];
                                tableIns.reload({data: locDetlData,done:function (res) {limit();getOutBound();}});
                                layer.msg(res.msg, {icon: 1});
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                }
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(chooseData)', function(obj){
        switch (obj.event) {
            case 'remove':
                let index = obj.tr.attr("data-index");
                locDetlData.splice(index, 1);
                tableIns.reload({data: locDetlData});
                break;
        }
    });
    // 获取出库口
    function getOutBound(){
        $.ajax({
            url: baseUrl+"/available/take/site",
            headers: {'token': localStorage.getItem('token')},
            method: 'POST',
            async: false,
            success: function (res) {
                if (res.code === 200){
                    var tpl = $("#takeSiteSelectTemplate").html();
                    var template = Handlebars.compile(tpl);
                    var html = template(res);
                    $('#staNoSelect').append(html);
                    form.render('select');
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg)
                }
            }
        })
    }
    $(document).on('click','#mat-query', function () {
        let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false});
        locDetlLayerIdx = layer.open({
            type: 2,
            title: false,
            closeBtn: false,
            maxmin: false,
            area: ['90%', '85%'],
            shadeClose: true,
            content: 'locDetlQuery.html',
            success: function(layero, index){
                layer.close(loadIndex);
            }
        });
    })
})
// 添加表格数据
function addTableData(data) {
    for (var i=0;i<data.length;i++){
        let pass = false;
        for (var j=0;j<locDetlData.length;j++){
            if (data[i].matnr === locDetlData[j].matnr && data[i].batch === locDetlData[j].batch && data[i].locNo$ === locDetlData[j].locNo$) {
                pass = true;
                break;
            }
        }
        if (pass) {
            data.splice(i--, 1);
        } else {
            data[i]["count"] = data[i]["anfme"];
        }
    }
    locDetlData.push.apply(locDetlData, data);
    tableIns.reload({data: locDetlData});
    layer.close(locDetlLayerIdx);
}
// excel导入模板下载
function excelMouldDownload(){
    layer.load(1, {shade: [0.1,'#fff']});
    location.href = baseUrl + "/out/loc/box/excel/import/out/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 + "/out/loc/box/excel/import/out/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});
}
zy-asrs-wms/src/main/webapp/views/pakStore/stockOutOrder.html
New file
@@ -0,0 +1,144 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
    <style>
        html {
            height: 100%;
            padding: 10px;
            background-color: #f1f1f1;
            box-sizing: border-box;
        }
        body {
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 0 3px rgba(0,0,0,.3);
            padding-bottom: 20px;
        }
        #staNoSpan {
            text-align: center;
            display: inline-block;
            width: 100px;
            font-size: 13px;
        }
        .layui-btn-container .layui-form-select {
            display: inline-block;
            width: 150px;
            height: 30px;
        }
        .layui-btn-container .layui-form-select.layui-form-selected {
            display: inline-block;
            width: 150px;
        }
        .layui-btn-container .layui-select-title input {
            font-size: 13px;
        }
        .layui-btn-container .layui-anim.layui-anim-upbit dd {
            font-size: 13px;
        }
        #btn-outbound {
            margin-left: 60px;
            display: none;
        }
        /*----------------------------------*/
        .function-area {
            padding: 20px 50px;
        }
        .function-btn {
            font-size: 16px;
            padding: 1px 2px;
            width: 100px;
            height: 50px;
            border-color: #2b425b;
            border-radius: 4px;
            border-width: 2px;
            background: none;
            border-style: solid;
            transition: 0.4s;
            cursor: pointer;
            letter-spacing: 1.5px;
        }
        .function-btn:hover {
            background-color: #2b425b;
            color: #fff;
        }
        #mat-query {
            display: none;
        }
    </style>
</head>
<body>
<!-- 功能区 -->
<div class="function-area">
    <button id="mat-query" class="function-btn">提取库存</button>
    <button class="function-btn" style="width: auto;float:right;" onclick="excelMouldDownload()">导入订单信息出库模板下载</button>
</div>
<hr>
<!-- 表格 -->
<div style="padding-bottom: 5px; margin-bottom: 45px">
    <!-- 头部 -->
    <script type="text/html" id="toolbar">
        <div class="layui-form">
            <div class="layui-form layui-card-header">
<!--                <span id="memeoSpan" style="margin-left: 25px">订单号:</span>-->
<!--                <div class="layui-inline">-->
<!--                    <div class="layui-input-inline">-->
<!--                        <input id="orderNo" class="layui-input" type="text" name="orderNo" placeholder="订单号" autocomplete="off" style="margin-left: 15px;width: 300px">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <button class="layui-btn layui-btn-lg" id="btn-outbound" lay-event="outbound">启动出库</button>-->
                <!-- 3.导入箱号出库 -->
                <button class="layui-btn layui-btn-lg" onclick="importExcel()" style="font-size: 12px;width: auto;">导入订单信息出库</button>
                <span style="display: none"><input id="importExcel" type="file" onchange="upload(this)">启动出库</span>
            </div>
<!--            <div class="layui-btn-container">-->
<!--                &lt;!&ndash; 1.选择出库口 &ndash;&gt;-->
<!--                <span id="staNoSpan">订单号:</span>-->
<!--                <select id="staNoSelect" lay-verify="required">-->
<!--                    <option value="">请选择站点</option>-->
<!--                </select>-->
                <!-- 2.启动出库 -->
<!--            </div>-->
        </div>
    </script>
    <!-- 行 -->
    <script type="text/html" id="operate">
        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="remove">移除</a>
    </script>
    <table class="layui-table" id="chooseData" lay-filter="chooseData"></table>
</div>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/pakStore/stockOutOrder.js" charset="utf-8"></script>
<script type="text/template" id="takeSiteSelectTemplate">
    {{#each data}}
    <option value="{{siteId}}">{{desc}}</option>
    {{/each}}
</script>
</body>
</html>