| | |
| | | import com.alibaba.excel.context.AnalysisContext; |
| | | import com.alibaba.excel.event.AnalysisEventListener; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.common.DateUtils; |
| | | import com.core.common.SnowflakeIdWorker; |
| | | import com.zy.asrs.entity.OrderDetl; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.Review; |
| | | import com.zy.asrs.entity.ReviewDetl; |
| | | import com.zy.asrs.service.ReviewDetlService; |
| | | import com.zy.asrs.service.ReviewService; |
| | | import lombok.SneakyThrows; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.transaction.PlatformTransactionManager; |
| | | import org.springframework.transaction.TransactionStatus; |
| | | |
| | | import java.util.*; |
| | | |
| | |
| | | /** |
| | | * 每隔1000条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 |
| | | */ |
| | | private static final int BATCH_COUNT = 400; |
| | | private static final int BATCH_COUNT = 2000; |
| | | |
| | | private int count = 0; |
| | | |
| | | private String orderNo; |
| | | |
| | | private long orderId; |
| | | |
| | | private long docTypeId; |
| | | |
| | | List<ImportReviewDto> list = new ArrayList<>(); |
| | | /** |
| | | * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 |
| | | */ |
| | | private final PlatformTransactionManager transactionManager; |
| | | private ReviewService reviewService; |
| | | private ReviewDetlService reviewDetlService; |
| | | private final SnowflakeIdWorker snowflakeIdWorker; |
| | | private final Long userId; |
| | | private TransactionStatus transactionStatus; |
| | | |
| | | /** |
| | | * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来 |
| | | */ |
| | | public ImportReviewListener(SnowflakeIdWorker snowflakeIdWorker, Long userId) { |
| | | public ImportReviewListener(PlatformTransactionManager transactionManager, ReviewService reviewService, ReviewDetlService reviewDetlService, SnowflakeIdWorker snowflakeIdWorker, Long userId) { |
| | | this.transactionManager = transactionManager; |
| | | this.reviewService = reviewService; |
| | | this.reviewDetlService = reviewDetlService; |
| | | this.snowflakeIdWorker = snowflakeIdWorker; |
| | | this.userId = userId; |
| | | } |
| | |
| | | public void invoke(ImportReviewDto data, AnalysisContext context) { |
| | | log.info("解析到第 {} 条数据:{}", ++count, JSON.toJSONString(data)); |
| | | |
| | | // 获取包装组号(column1) |
| | | String packNo = data.getColumn1(); |
| | | if (Cools.isEmpty(packNo)) { |
| | | log.warn("包装组号为空,跳过该行!"); |
| | | if (Cools.isEmpty(data.getColumn2())) { |
| | | log.warn("规格型号,跳过该行!"); |
| | | return; |
| | | } |
| | | |
| | | // 如果已经处理过该包装组号,则跳过 |
| | | if (uniquePackNos.contains(packNo)) { |
| | | log.info("重复的包装组号:{},跳过", packNo); |
| | | if (Cools.isEmpty(data.getColumn4())) { |
| | | log.info("重复的包装组号:{},跳过", data.getColumn5()); |
| | | return; |
| | | } |
| | | |
| | | if (Cools.isEmpty(data.getColumn7())) { |
| | | log.info("重复的包装组号:{},跳过", data.getColumn7()); |
| | | return; |
| | | } |
| | | // 首次出现,记录并处理 |
| | | uniquePackNos.add(packNo); |
| | | list.add(data); |
| | | uniquePackNos.add(data.getColumn1()); |
| | | |
| | | if (context.getCurrentRowNum() == 3) { |
| | | String time = DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F); |
| | | Review review = reviewService.selectOne(new EntityWrapper<Review>().eq("order_no", data.getColumn1())); |
| | | if (review == null) { |
| | | review = new Review(); |
| | | review.setUuid(String.valueOf(snowflakeIdWorker.nextId())); |
| | | review.setOrderNo(data.getColumn1()); |
| | | review.setOrderTime(time); |
| | | review.setSettle(1L); |
| | | review.setStatus(1); |
| | | review.setCreateBy(userId); |
| | | review.setCreateTime(new Date()); |
| | | |
| | | return; |
| | | reviewService.insert(review); |
| | | review = reviewService.selectOne(new EntityWrapper<Review>().eq("order_no", data.getColumn1())); |
| | | }else { |
| | | log.info("已存在该订单:{},", data.getColumn1()); |
| | | throw new CoolException("订单已存在!"); |
| | | } |
| | | |
| | | data.setOrderId(review.getId()); |
| | | list.add(data); |
| | | if (list.size() >= BATCH_COUNT) { |
| | | saveData(); |
| | | list.clear(); |
| | |
| | | */ |
| | | private void saveData() { |
| | | log.info("{}条数据,开始存储数据库!", list.size()); |
| | | log.info("单据号:{},数据:{},", orderNo, JSON.toJSONString(list)); |
| | | log.info("数据:{},", JSON.toJSONString(list)); |
| | | |
| | | List<OrderDetl> orderDetlList = new ArrayList<>(); |
| | | List<ReviewDetl> orderDetlList = new ArrayList<>(); |
| | | for (ImportReviewDto importOrderDto : list) { |
| | | OrderDetl orderDetl = new OrderDetl(); |
| | | ReviewDetl orderDetl = new ReviewDetl(); |
| | | |
| | | if (docTypeId == 24) { |
| | | orderDetl.setSpecs(String.format("%07d", Integer.parseInt(importOrderDto.getColumn1()))); // 源库位 |
| | | if (importOrderDto.getColumn2() != null) { |
| | | orderDetl.setModel(String.format("%07d", Integer.parseInt(importOrderDto.getColumn2()))); // 目标库位 |
| | | } |
| | | if (importOrderDto.getColumn3() != null) { |
| | | orderDetl.setBeBatch(Integer.parseInt(importOrderDto.getColumn3())); // 巷道 |
| | | } |
| | | } else { |
| | | orderDetl.setBrand(importOrderDto.getColumn1()); |
| | | orderDetl.setSupp(importOrderDto.getColumn3()); |
| | | orderDetl.setMemo(importOrderDto.getColumn4()); |
| | | } |
| | | orderDetl.setOrderNo(importOrderDto.getColumn1()); |
| | | orderDetl.setMatnr(importOrderDto.getColumn2()); |
| | | orderDetl.setMaktx(importOrderDto.getColumn3()); |
| | | orderDetl.setSpecs(importOrderDto.getColumn4()); |
| | | orderDetl.setUnit(importOrderDto.getColumn5()); |
| | | //orderDetl.set(importOrderDto.getColumn6()); |
| | | orderDetl.setBatch(importOrderDto.getColumn7()); |
| | | orderDetl.setModel(importOrderDto.getColumn8()); |
| | | orderDetl.setAnfme(importOrderDto.getColumn9()); |
| | | orderDetl.setDeadTime(importOrderDto.getColumn10()); |
| | | |
| | | orderDetl.setBatch(""); |
| | | orderDetl.setOrderId(orderId); |
| | | orderDetl.setOrderNo(orderNo); |
| | | orderDetl.setOrderId(importOrderDto.getOrderId()); |
| | | orderDetl.setCreateBy(9527L); |
| | | orderDetl.setCreateTime(new Date()); |
| | | orderDetl.setUpdateBy(9527L); |
| | | orderDetl.setUpdateTime(new Date()); |
| | | orderDetl.setStatus(1); |
| | | orderDetl.setQty(0.0D); |
| | | orderDetl.setAnfme(1.0); |
| | | |
| | | orderDetlList.add(orderDetl); |
| | | } |
| | | |
| | | // ✅ 关键点:分批提交 |
| | | for (int i = 0; i < orderDetlList.size(); i += MAX_BATCH_SIZE) { |
| | | int end = Math.min(i + MAX_BATCH_SIZE, orderDetlList.size()); |
| | | List<OrderDetl> batch = orderDetlList.subList(i, end); |
| | | //reviewDetlService.batchDetls(batch); |
| | | for (ReviewDetl d : orderDetlList) { |
| | | reviewDetlService.insert(d); |
| | | } |
| | | |
| | | log.info("存储数据库成功!"); |
| | | } |
| | | |