|  |  | 
 |  |  | import lombok.SneakyThrows; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  |  | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.*; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author pang.jiabao | 
 |  |  | 
 |  |  |         this.userId = userId; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 这个每一条数据解析都会来调用 | 
 |  |  |      */ | 
 |  |  |     private Set<String> uniquePackNos = new HashSet<>(); // 用于去重包装组号 | 
 |  |  |  | 
 |  |  |     @SneakyThrows | 
 |  |  |     @Override | 
 |  |  |     public void invoke(ImportOrderDto data, AnalysisContext context) { | 
 |  |  |         log.info("解析到第 {} 条数据:{}", ++count, JSON.toJSONString(data)); | 
 |  |  |  | 
 |  |  |         // 获取包装组号(column1) | 
 |  |  |         String packNo = data.getColumn1(); | 
 |  |  |         if (Cools.isEmpty(packNo)) { | 
 |  |  |             log.warn("包装组号为空,跳过该行!"); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 如果已经处理过该包装组号,则跳过 | 
 |  |  |         if (uniquePackNos.contains(packNo)) { | 
 |  |  |             log.info("重复的包装组号:{},跳过", packNo); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 首次出现,记录并处理 | 
 |  |  |         uniquePackNos.add(packNo); | 
 |  |  |         list.add(data); | 
 |  |  |  | 
 |  |  |         if (context.getCurrentRowNum() == 3) { | 
 |  |  |             String time = DateUtils.convert(new Date(),DateUtils.yyyyMMddHHmmss_F); | 
 |  |  |             Order order2 = orderService.selectByNo(list.get(0).getColumn2()); // 订单号 | 
 |  |  |             if(order2 != null) { | 
 |  |  |             String time = DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F); | 
 |  |  |             Order order2 = orderService.selectByNo(list.get(0).getColumn2()); | 
 |  |  |             if (order2 != null) { | 
 |  |  |                 throw new ExcelAnalysisException("单据已存在!"); | 
 |  |  |             } | 
 |  |  |             DocType docType = docTypeService.selectOrAdd(list.get(1).getColumn2(), Boolean.FALSE); // 订单类型 | 
 |  |  |             DocType docType = docTypeService.selectOrAdd(list.get(1).getColumn2(), Boolean.FALSE); | 
 |  |  |             if (docType == null) { | 
 |  |  |                 throw new ExcelAnalysisException("单据类型错误:" + list.get(1).getColumn2()); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             orderNo = list.get(0).getColumn2(); | 
 |  |  |             docTypeId = docType.getDocId(); | 
 |  |  |  | 
 |  |  |             Order order = new Order(); | 
 |  |  |             order.setUuid(String.valueOf(snowflakeIdWorker.nextId())); | 
 |  |  |             order.setOrderNo(orderNo); | 
 |  |  |             order.setOrderTime(time); | 
 |  |  |             order.setDocType(docType.getDocId()); | 
 |  |  | //            order.setCstmrName(Cools.isEmpty(list.get(2).getColumn2()) ? "" : list.get(2).getColumn2()); // 客户名称 | 
 |  |  | //            order.setMemo(Cools.isEmpty(list.get(3).getColumn2()) ? "" : list.get(3).getColumn2()); // 备注 | 
 |  |  |             order.setSettle(1L); | 
 |  |  |             order.setStatus(1); | 
 |  |  |             order.setCreateBy(userId); | 
 |  |  |             order.setCreateTime(new Date()); | 
 |  |  |  | 
 |  |  |             orderService.insert(order); | 
 |  |  |             Order order1 = orderService.selectByNo(orderNo); | 
 |  |  |             orderId = order1.getId(); | 
 |  |  | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM | 
 |  |  |         if (list.size() >= BATCH_COUNT) { | 
 |  |  |             saveData(); | 
 |  |  |             // 存储完成清理 list | 
 |  |  |             list.clear(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 所有数据解析完成了 都会来调用 | 
 |  |  |      */ |