src/main/java/com/zy/asrs/controller/CrnController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/BasCrnError.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/importexcle/ImportCrnErrDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/importexcle/ImportCrnErrListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/static/wms/js/locMast/locMast.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/views/locMast/locMast.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -1,5 +1,6 @@ package com.zy.asrs.controller; import com.alibaba.excel.EasyExcel; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; @@ -14,8 +15,11 @@ import com.zy.asrs.domain.vo.CrnMsgTableVo; import com.zy.asrs.domain.vo.CrnStateTableVo; import com.zy.asrs.entity.*; import com.zy.asrs.importexcle.ImportCrnErrDto; import com.zy.asrs.importexcle.ImportCrnErrListener; import com.zy.asrs.mapper.BasCrnErrorMapper; import com.zy.asrs.mapper.TaskWrkMapper; import com.zy.asrs.service.BasCrnErrorService; import com.zy.asrs.service.BasCrnpService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; @@ -35,9 +39,12 @@ import com.zy.core.properties.SystemProperties; import lombok.extern.slf4j.Slf4j; 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.annotation.Resource; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -66,6 +73,27 @@ @Resource private TaskWrkMapper taskWrkMapper; @Resource private BasCrnErrorService basCrnErrorService; @PostMapping("/importCrnErr") @ManagerAuth(memo = "导入堆垛机异常表") public R importCrnErr(@RequestParam("file") MultipartFile multipartFile) { try { importCrnErrExec(multipartFile); } catch (Exception e) { e.printStackTrace(); return R.error(e.getMessage()); } return R.ok("导入成功"); } @Transactional(rollbackFor = Exception.class) public void importCrnErrExec(MultipartFile multipartFile) throws IOException { EasyExcel.read(multipartFile.getInputStream(), ImportCrnErrDto.class, new ImportCrnErrListener(basCrnErrorService)).sheet().doReadSync(); } @ManagerAuth(memo = "进行中的命令") @PostMapping("/crn/command/ongoing") src/main/java/com/zy/asrs/entity/BasCrnError.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.core.common.Cools; import com.core.common.SpringUtils; import com.zy.system.entity.User; @@ -23,7 +22,7 @@ * 异常代号 */ @ApiModelProperty(value = "异常代号") @TableId(value = "error_code", type = IdType.AUTO) @TableId(value = "error_code") @TableField("error_code") private Long errorCode; src/main/java/com/zy/asrs/importexcle/ImportCrnErrDto.java
New file @@ -0,0 +1,20 @@ package com.zy.asrs.importexcle; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; /** * @author pang.jiabao * @description 导入堆垛机异常代码dto * @createDate 2024/9/2 9:55 */ @Data public class ImportCrnErrDto { @ExcelProperty(value = "序号",index = 0) private Long column1; @ExcelProperty(value = "异常描述",index = 1) private String column2; } src/main/java/com/zy/asrs/importexcle/ImportCrnErrListener.java
New file @@ -0,0 +1,96 @@ package com.zy.asrs.importexcle; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import com.zy.asrs.entity.BasCrnError; import com.zy.asrs.service.BasCrnErrorService; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.List; /** * @author pang.jiabao * @description 导入垛机异常表监听器 * @createDate 2024/9/2 9:56 */ @Slf4j public class ImportCrnErrListener extends AnalysisEventListener<ImportCrnErrDto> { /** * 每隔1000条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 400; private int count = 0; List<ImportCrnErrDto> list = new ArrayList<>(); /** * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 */ private final BasCrnErrorService basCrnErrorService; /** * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 */ public ImportCrnErrListener(BasCrnErrorService basCrnErrorService) { this.basCrnErrorService = basCrnErrorService; } /** * 这个每一条数据解析都会来调用 */ @SneakyThrows @Override public void invoke(ImportCrnErrDto data, AnalysisContext context) { log.info("解析到第 {} 条数据:{}", ++count, JSON.toJSONString(data)); if (!data.getColumn2().equals("<No value>")) { list.add(data); } // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (list.size() >= BATCH_COUNT) { saveData(); // 存储完成清理 list list.clear(); } } /** * 所有数据解析完成了 都会来调用 */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // 这里也要保存数据,确保最后遗留的数据也存储到数据库 if (list.size() > 0) { saveData(); } log.info("所有数据解析完成!"); } /** * 加上存储数据库 */ private void saveData() { log.info("{}条数据,开始存储数据库!", list.size()); List<BasCrnError> basCrnErrors = new ArrayList<>(); list.forEach(importCrnErrDto -> { BasCrnError basCrnError = new BasCrnError(); basCrnError.setErrorCode(importCrnErrDto.getColumn1()); basCrnError.setErrName(importCrnErrDto.getColumn2()); basCrnErrors.add(basCrnError); }); basCrnErrorService.insertBatch(basCrnErrors); log.info("存储数据库成功!"); } /** *解析出现错误会进入该方法 具体看源代码或文档 */ @Override public void onException(Exception exception, AnalysisContext context) throws Exception { log.error("处理异常:" + exception.getMessage()); throw exception; } } src/main/webapp/static/wms/js/locMast/locMast.js
@@ -1,11 +1,11 @@ var pageCurr; layui.use(['table','laydate', 'form'], function(){ layui.use(['table','laydate', 'form','upload','layer'], function(){ var table = layui.table; var $ = layui.jquery; var layer = layui.layer; var layDate = layui.laydate; var form = layui.form; var upload = layui.upload; // 数据渲染 tableIns = table.render({ elem: '#locMast', @@ -93,6 +93,28 @@ } }); upload.render({ elem: '#uploadExcel', // 绑定元素 url: baseUrl+'/importCrnErr', // 上传接口,替换为你的后端接口 headers:{'token': localStorage.getItem('token')}, accept: 'file', // 允许上传的文件类型 exts: 'xls|xlsx', // 允许上传的文件后缀 done: function(res){ // 上传完毕回调 if(res.code === 200){ layer.msg(res.msg); console.log('文件数据:', res.data); } else { layer.msg(res.msg || '上传失败'); } }, error: function(){ // 请求异常回调 layer.msg('上传失败,请重试'); } }); // 监听排序事件 table.on('sort(locMast)', function (obj) { var searchData = {}; src/main/webapp/views/locMast/locMast.html
@@ -90,6 +90,7 @@ <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button> <button class="layui-btn layui-btn-sm" id="btn-delete" lay-event="deleteData">删除</button> <button class="layui-btn layui-btn-primary" id="btn-init" lay-event="init">初始化</button> <!-- <button id="uploadExcel" class="layui-btn layui-btn-primary layui-btn-sm" >产品校验</button>--> <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">导出</button> </div> </script>