package com.zy.asrs.importexcle;
|
|
import com.alibaba.excel.context.AnalysisContext;
|
import com.alibaba.excel.event.AnalysisEventListener;
|
import com.alibaba.fastjson.JSON;
|
import com.core.exception.CoolException;
|
import com.zy.asrs.entity.LocDetl;
|
import com.zy.asrs.entity.LocMast;
|
import com.zy.asrs.mapper.LocDetlMapper;
|
import com.zy.asrs.service.LocMastService;
|
import lombok.SneakyThrows;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
|
/**
|
* @author pang.jiabao
|
* @description 监听立库已有物料excel数据导入
|
* @createDate 2023/10/9 11:13
|
*/
|
@Slf4j
|
public class LocMatListener extends AnalysisEventListener<LocMat> {
|
|
/**
|
* 每隔1000条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
|
*/
|
private static final int BATCH_COUNT = 50;
|
|
private static int num = 1;
|
|
private int count = 0;
|
|
List<LocMat> list = new ArrayList<>();
|
/**
|
* 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
|
*/
|
private final LocMastService locMastService;
|
private final LocDetlMapper locDetlMapper;
|
private final Long userId;
|
|
/**
|
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
|
*/
|
public LocMatListener(LocMastService locMastService,LocDetlMapper locDetlMapper, Long userId) {
|
this.locMastService = locMastService;
|
this.locDetlMapper = locDetlMapper;
|
this.userId = userId;
|
}
|
|
/**
|
* 这个每一条数据解析都会来调用
|
*/
|
@SneakyThrows
|
@Override
|
public void invoke(LocMat data, AnalysisContext context) {
|
log.info("解析到第 {} 条数据:{}", ++count, JSON.toJSONString(data));
|
|
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<LocDetl> locDetls = new ArrayList<>();
|
list.forEach(locMat -> {
|
LocMast locMast = locMastService.selectById(locMat.getA());
|
if (locMast == null) {
|
throw new CoolException(locMat.getA() + ":库位不存在!");
|
}
|
if (!locMast.getLocSts().equals("O")) {
|
throw new CoolException(locMat.getA() + ":库位不为空!");
|
}
|
Date now = new Date();
|
String flag = "A" + num;
|
if ("F".equals(locMat.getB())) {
|
LocDetl locDetl = new LocDetl();
|
locDetl.setLocNo(locMat.getA());
|
locDetl.setMatnr("3μm×10mm");
|
locDetl.setMaktx("3μm×10mm");
|
locDetl.setBatch("");
|
locDetl.setUnit(flag);
|
locDetl.setModel(flag);
|
locDetl.setBrand(flag);
|
locDetl.setOrigin("中");
|
locDetl.setColor(locMat.getC());
|
locDetl.setManu(flag);
|
locDetl.setSku("10");
|
locDetl.setItemNum("10");
|
locDetl.setManuDate("2024-02-01 23:12:21");
|
locDetl.setWeight(900.0);
|
locDetl.setVolume(1000.0);
|
locDetl.setSpecs("1");
|
locDetl.setLength(800.0);
|
locDetl.setZpallet(flag);
|
locDetl.setBarcode(flag);
|
locDetl.setAnfme(1.0);
|
locDetl.setModiTime(now);
|
locDetl.setModiUser(userId);
|
locDetl.setAppeTime(now);
|
locDetl.setAppeUser(userId);
|
|
// 添加进库存明细列表
|
locDetls.add(locDetl);
|
locMast.setBarcode(flag);
|
num ++;
|
}
|
|
// 更新库位状态
|
locMast.setLocSts(locMat.getB());
|
locMast.setBarcode(flag);
|
|
locMastService.updateById(locMast);
|
});
|
// 批量插入库存明细
|
if (!locDetls.isEmpty()) {
|
locDetlMapper.batchDetls(locDetls);
|
}
|
|
log.info("存储数据库成功!");
|
}
|
|
/**
|
*解析出现错误会进入该方法 具体看源代码或文档
|
*/
|
@Override
|
public void onException(Exception exception, AnalysisContext context) throws Exception {
|
log.error("处理异常:" + exception.getMessage());
|
throw exception;
|
}
|
}
|