自动化立体仓库 - WMS系统
Junjie
2023-04-28 ae674442480bf1126dbfa430b246cd9a706666cc
商品档案数据导出和新商品编号同步
8个文件已修改
1个文件已添加
224 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MatController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Mat.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/MatMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MatService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/MatExcel2Listener.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/MatMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/mat/mat.js 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/mat/mat.html 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MatController.java
@@ -17,6 +17,7 @@
import com.zy.asrs.entity.result.KeyValueVo;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.MatService;
import com.zy.asrs.utils.MatExcel2Listener;
import com.zy.asrs.utils.MatExcelListener;
import com.zy.common.CodeRes;
import com.zy.common.config.AdminInterceptor;
@@ -33,6 +34,8 @@
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.*;
@@ -153,8 +156,8 @@
        return R.ok();
    }
    @RequestMapping(value = "/mat/update/auth")
    @ManagerAuth
    @RequestMapping(value = "/mat/update/auth")
    @ManagerAuth
    public R update(Mat mat){
        if (Cools.isEmpty(mat) || null==mat.getId()){
            return R.error();
@@ -309,6 +312,29 @@
        return R.ok("成功同步"+listener.getTotal()+"条商品数据");
    }
    // 新商品编号同步
    @PostMapping(value = "/mat/excel/importNewMatnr/auth")
    @ManagerAuth(memo = "新商品编号同步")
    @Transactional
    public R matExcelImportNewMatnr(MultipartFile file) throws IOException {
        MatExcel2Listener listener = new MatExcel2Listener(getUserId());
        EasyExcel.read(file.getInputStream(), MatExcel.class, listener).sheet().doRead();
        return R.ok("成功同步"+listener.getTotal()+"条商品数据");
    }
    @RequestMapping(value = "/mat/excel/export/auth")
    @ManagerAuth(memo = "商品档案数据导出")
    @Transactional
    public void matExcelExport(@RequestParam Map<String, Object> param, HttpServletResponse response) throws IOException {
        List<Mat> data = matService.exportData(param.get("matnr"), param.get("maktx"), param.get("specs"));
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), Mat.class).sheet("模板").doWrite(data);
    }
    /*************************************** xm-select ***********************************************/
    // xm-select 搜索商品列表
src/main/java/com/zy/asrs/entity/Mat.java
@@ -59,9 +59,16 @@
     * 商品编号
     */
    @ApiModelProperty(value= "商品编号")
    @ExcelProperty(value = "商品编码")
    @ExcelProperty(value = "商品编号")
    private String matnr;
    /**
     * 商品编号
     */
    @ApiModelProperty(value= "新商品编号")
    @ExcelProperty(value = "新商品编号")
    private String matnrNew;
    /**
     * 商品名称
src/main/java/com/zy/asrs/mapper/MatMapper.java
@@ -17,4 +17,6 @@
    Mat selectByMatnr(@Param("matnr")String matnr);
    List<Mat> exportData(Object matnr, Object maktx, Object specs);
}
src/main/java/com/zy/asrs/service/MatService.java
@@ -4,10 +4,14 @@
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.Mat;
import java.util.List;
public interface MatService extends IService<Mat> {
    Page<Mat> getPage(Page page, String tagId, Object matnr, Object maktx, Object specs);
    Mat selectByMatnr(String matnr);
    List<Mat> exportData(Object matnr, Object maktx, Object specs);
}
src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java
@@ -7,6 +7,8 @@
import com.zy.asrs.mapper.MatMapper;
import com.zy.asrs.service.MatService;
import java.util.List;
@Service("matService")
public class MatServiceImpl extends ServiceImpl<MatMapper, Mat> implements MatService {
@@ -21,5 +23,8 @@
        return this.baseMapper.selectByMatnr(matnr);
    }
    @Override
    public List<Mat> exportData(Object matnr, Object maktx, Object specs) {
        return this.baseMapper.exportData(matnr, maktx, specs);
    }
}
src/main/java/com/zy/asrs/utils/MatExcel2Listener.java
New file
@@ -0,0 +1,79 @@
package com.zy.asrs.utils;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.Tag;
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.MatService;
import com.zy.asrs.service.TagService;
import com.zy.common.entity.MatExcel;
import com.zy.common.utils.NodeUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Slf4j
public class MatExcel2Listener extends AnalysisEventListener<MatExcel> {
    private int total = 0;
    private Long userId;
    public MatExcel2Listener() {
    }
    public MatExcel2Listener(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) {
        MatService matService = SpringUtils.getBean(MatService.class);
        Date now = new Date();
        // 商品
        Mat mat = matService.selectByMatnr(excel.getMatnr());
        if (mat != null) {
            mat.setMatnrNew(excel.getMatnrNew());
            mat.setUpdateBy(this.userId);
            mat.setUpdateTime(now);
            if (matService.updateById(mat)) {
                total++;
            }
        }
    }
    /**
     * 所有数据解析完成了调用
     * 适合事务
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext ctx) {
        log.info("同步{}条物料信息!", total);
    }
    public int getTotal() {
        return total;
    }
}
src/main/resources/mapper/MatMapper.xml
@@ -8,6 +8,7 @@
        <result column="uuid" property="uuid" />
        <result column="tag_id" property="tagId" />
        <result column="matnr" property="matnr" />
        <result column="matnr_new" property="matnrNew" />
        <result column="maktx" property="maktx" />
        <result column="name" property="name" />
        <result column="specs" property="specs" />
@@ -80,4 +81,18 @@
    <select id="selectByMatnr" resultMap="BaseResultMap">
        select top 1 * from man_mat where 1=1 and matnr = #{matnr}
    </select>
    <select id="exportData" resultMap="BaseResultMap">
        select * from man_mat
        where 1=1
        <if test="matnr != null and matnr != ''">
            and matnr like '%' + #{matnr} + '%'
        </if>
        <if test="maktx != null and maktx != ''">
            and maktx like '%' + #{maktx} + '%'
        </if>
        <if test="specs != null and specs != ''">
            and specs like '%' + #{specs} + '%'
        </if>
    </select>
</mapper>
src/main/webapp/static/js/mat/mat.js
@@ -5,6 +5,7 @@
    var cols = [
        {type: 'checkbox'}
        ,{field: 'tagId$', align: 'center',title: '归类', templet: '#tagTpl'}
        ,{field: 'matnrNew', align: 'center',title: '新商品编号', width: 180}
    ];
    cols.push.apply(cols, matCols);
    cols.push(
@@ -433,9 +434,79 @@
// excel导出
function exportExcel() {
    // window.location.href = baseUrl + "/mat/excel/export/auth"
    const url = baseUrl + "/mat/excel/export/auth"; //记得拼接参数
    const xhr = new XMLHttpRequest();
    var params = '';
    $.each($('#search-box [name]').serializeArray(), function() {
        params += this.name + '=' + this.value + '&';
    });
    params = params.substring(0, params.length - 1);
    xhr.open('POST', url, true);
    xhr.setRequestHeader('token', localStorage.getItem('token'));
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.responseType = 'blob'; // 返回类型blob
    xhr.onload = function(e) {
        if (this.status === 200) {
            const blob = this.response;
            const reader = new FileReader();
            reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
            reader.onload = function(e) {
                const a = document.createElement('a');
                a.download = new Date().getTime() + '_export_data.xlsx';
                a.href = e.target.result;
                document.documentElement.appendChild(a);
                a.click();
                a.remove(); // 等价于document.documentElement.removeChild(a);
            };
        }
    };
    xhr.send(params); // 发送ajax请求
}
// 同步新商品编号
function importNewMatnr() {
    $("#importNewMatnr").trigger("click");
}
function uploadNewMatnr(obj){
    if(!obj.files) {
        return;
    }
    var file = obj.files[0];
    var filename = file.name
    var filenameArr = filename.split(".")
    var filetype = filenameArr[filenameArr.length - 1] //文件类型
    if (filetype != "xlsx") {
        layer.msg("请上传xlsx格式文件");
        return;
    }
    admin.confirm('确认同步 [' + file.name +'] 文件吗?', function (index) {
        layer.load(1, {shade: [0.1,'#fff']});
        var url = baseUrl + "/mat/excel/importNewMatnr/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 tableReload(child) {
    var searchData = {};
src/main/webapp/views/mat/mat.html
@@ -137,9 +137,14 @@
                <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>
                <li><a onclick="importNewMatnr()" style="font-size: 12px"><i class="layui-icon layui-icon-upload"></i>同步新商品编号</a></li>
                <li style="display: none"><input id="importNewMatnr" type="file" onchange="uploadNewMatnr(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>
                <li>
                    <a onclick="exportExcel()" style="font-size: 12px"><i class="layui-icon layui-icon-export"></i>导出 Excel</a>
                    <a href="#" id="downloadLink" style="display: none;"></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>-->