src/main/java/com/zy/asrs/controller/MatController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/Mat.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/mapper/MatMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/MatService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MatServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/utils/MatExcel2Listener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/MatMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/static/js/mat/mat.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/mat/mat.html | ●●●●● 补丁 | 查看 | 原始文档 | 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.*; @@ -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>-->