自动化立体仓库 - WMS系统
zyx
2024-01-25 439dd3583f2ea745aa5e70ce26f3489d75c90912
pla增加库位导入功能
货主档案增加导入导出功能
pla表头固定
6个文件已修改
2个文件已添加
241 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/LocOwnerController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocOwner.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Pla.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/LocOwnerExcelListener.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/PlaExcelListener.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/entity/LocOwnerExcel.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locOwner/locOwner.js 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/locOwner/locOwner.html 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocOwnerController.java
@@ -1,5 +1,7 @@
package com.zy.asrs.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -9,12 +11,20 @@
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocOwner;
import com.zy.asrs.service.LocOwnerService;
import com.zy.asrs.utils.LocOwnerExcelListener;
import com.zy.common.entity.LocOwnerExcel;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -139,4 +149,34 @@
        return R.ok();
    }
    /**
     * excel导入模板下载
     */
    @RequestMapping(value = "/locOwner/excel/import/mould")
    public void plaExcelImportMould(HttpServletResponse response) throws IOException {
        List<LocOwnerExcel> 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(), LocOwnerExcel.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .sheet("sheet1")
                .doWrite(excels);
    }
    // excel导入
    @PostMapping(value = "/locOwner/excel/import/auth")
    @ManagerAuth(memo = "货主档案数据导入")
    @Transactional
    public R matExcelImport(MultipartFile file) throws IOException {
        LocOwnerExcelListener listener = new LocOwnerExcelListener(getUserId());
        try {
            EasyExcel.read(file.getInputStream(), LocOwnerExcel.class, listener).sheet().doRead();
        }catch (Exception e){
            throw new CoolException("导入的数据格式错误,原因:" + e.getMessage());
        }
        return R.ok("成功同步"+listener.getTotal()+"条pla物料数据");
    }
}
src/main/java/com/zy/asrs/entity/LocOwner.java
@@ -1,5 +1,6 @@
package com.zy.asrs.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
@@ -19,10 +20,13 @@
    private Long id;
    @ApiModelProperty(value= "")
    @ExcelProperty(value = "客户名称")
    private String owner;
    @ExcelProperty(value = "客户电话")
    private String phone;
    @ExcelProperty(value = "客户地址")
    private String addr;
    public LocOwner() {}
src/main/java/com/zy/asrs/entity/Pla.java
@@ -214,7 +214,7 @@
    //库位
    @TableField("loc_no")
    //@ExcelProperty(value = "库位")
    @ExcelProperty(value = "库位")
    private String locNo;
    //状态
src/main/java/com/zy/asrs/utils/LocOwnerExcelListener.java
New file
@@ -0,0 +1,91 @@
package com.zy.asrs.utils;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocOwner;
import com.zy.asrs.service.LocOwnerService;
import com.zy.common.entity.LocOwnerExcel;
import com.zy.common.entity.MatExcel;
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 LocOwnerExcelListener extends AnalysisEventListener<LocOwnerExcel> {
    private int total = 0;
    private Long userId;
    public LocOwnerExcelListener() {
    }
    public LocOwnerExcelListener(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(LocOwnerExcel excel, AnalysisContext ctx) {
        LocOwnerService locOwnerService = SpringUtils.getBean(LocOwnerService.class);
        Date now = new Date();
        // 商品
        if(Cools.isEmpty(excel.getOwner())){
            return;
        }
        LocOwner locOwner = locOwnerService.selectOne(new EntityWrapper<LocOwner>().eq("owner",excel.getOwner()));
        if (locOwner == null) {
            locOwner = excel;
            if (!locOwnerService.insert(locOwner)) {
                throw new CoolException("保存客户信息失败,客户名称:" + excel.getOwner());
            }
            total++;
        }else {
            locOwner.setOwner(excel.getOwner());
            locOwner.setAddr(excel.getAddr());
            locOwner.setPhone(excel.getPhone());
            locOwnerService.updateById(locOwner);
            total++;
        }
    }
    /**
     * 所有数据解析完成了调用
     * 适合事务
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext ctx) {
        log.info("新增{}条物料信息!", total);
    }
    public int getTotal() {
        return total;
    }
}
src/main/java/com/zy/asrs/utils/PlaExcelListener.java
@@ -5,8 +5,10 @@
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Node;
import com.zy.asrs.entity.Pla;
import com.zy.asrs.entity.param.GlobleParameter;
import com.zy.asrs.service.NodeService;
import com.zy.asrs.service.PlaService;
import com.zy.common.entity.MatExcel;
import com.zy.common.entity.PlaExcel;
@@ -54,6 +56,7 @@
    @Override
    public void invoke(PlaExcel excel, AnalysisContext ctx) {
        PlaService plaService = SpringUtils.getBean(PlaService.class);
        NodeService nodeService = SpringUtils.getBean(NodeService.class);
        Date now = new Date();
        // 商品
@@ -68,6 +71,16 @@
            pla.setModifyTime(new Date());
            pla.setStatus(GlobleParameter.PLA_STATUS_00);
            pla.setStockFreeze(1);
            if(!Cools.isEmpty(pla.getLocNo())){
                Node node = nodeService.selectByUuid(pla.getLocNo());
                if(Cools.isEmpty(node)){
                    throw new CoolException("未能找到相应的库位信息");
                }
                pla.setStash(node.getParentName());
                pla.setLocNo(node.getUuid());
                pla.setStatus(GlobleParameter.PLA_STATUS_1);
                pla.setPakinTime(new Date());
            }
            if (!plaService.insert(pla)) {
                throw new CoolException("保存商品信息失败,商品编码:" + excel.getMatnr());
            }
src/main/java/com/zy/common/entity/LocOwnerExcel.java
New file
@@ -0,0 +1,10 @@
package com.zy.common.entity;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.zy.asrs.entity.LocOwner;
import lombok.Data;
@Data
@ExcelIgnoreUnannotated
public class LocOwnerExcel extends LocOwner {
}
src/main/webapp/static/js/locOwner/locOwner.js
@@ -1,13 +1,16 @@
var pageCurr;
var admin;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
}).extend({
    dropdown: 'dropdown/dropdown',
}).use(['table','laydate', 'form', 'admin', 'dropdown'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
@@ -240,3 +243,56 @@
        page: {curr: pageCurr}
     });
}
// excel导入模板下载
function excelMouldDownload(){
    layer.load(1, {shade: [0.1,'#fff']});
    location.href = baseUrl + "/locOwner/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 + "/locOwner/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});
}
src/main/webapp/views/locOwner/locOwner.html
@@ -18,9 +18,9 @@
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <label class="layui-form-label">客户编号:</label>
                        <label class="layui-form-label">客户名称:</label>
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="客户编号" autocomplete="off">
                            <input class="layui-input" type="text" name="owner" placeholder="客户名称" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
@@ -41,7 +41,22 @@
<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>-->
        <!-- 商品/物料 数据中心 -->
        <div class="dropdown-menu" style="float: right">
            <button id="syncData" 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">导出</button>
    </div>
</script>