pang.jiabao
2025-05-13 688e299d29bd76cbd30bf3d7267bdc9afad954b0
excel导入堆垛机异常码
4个文件已修改
2个文件已添加
174 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/CrnController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasCrnError.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/importexcle/ImportCrnErrDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/importexcle/ImportCrnErrListener.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/js/locMast/locMast.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/locMast/locMast.html 1 ●●●● 补丁 | 查看 | 原始文档 | 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>