package com.ruoyi.inspect.excel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.ruoyi.basic.pojo.IfsInventoryQuantity; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @Slf4j public class OrderSplitExcelListener extends AnalysisEventListener> { //表头模板 private static final String HEAD_TEMPLATE = "[零件编号, 系统编号, 规格, 零件批号, 库存数量1, 库存数量2, 绝缘颜色, 外护颜色, 印字信息, 盘号, 库位编号, 库位来源, 备注]"; AtomicInteger index = new AtomicInteger(0);//符合表格模板的行数 @Getter List dataList = new ArrayList<>();//导入的数据列表 IfsInventoryQuantity ifsInventoryQuantity;//对应报检ifs信息 public String errorMsg = ""; public OrderSplitExcelListener(IfsInventoryQuantity ifsInventoryQuantity) { this.ifsInventoryQuantity = ifsInventoryQuantity; } AtomicReference prePartLotBatchNo = new AtomicReference<>("");//上一条数据的零件批号 AtomicReference storeQty2Sum = new AtomicReference<>(BigDecimal.ZERO);//导入数据库存数量2的总和 @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { String temp = headMap.values().toString(); if(StringUtils.equals(HEAD_TEMPLATE,temp)){ index.getAndIncrement(); } } @Override public void invoke(Map mapData, AnalysisContext analysisContext) { Integer currentRowNum = analysisContext.getCurrentRowNum(); OrderSplitExcelData data = transformExcelData(mapData, currentRowNum); if(Objects.nonNull(data)){ dataList.add(data); } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { if(index.get()==0){ throw new RuntimeException("文件内容格式与模板不符"); } if(storeQty2Sum.get().compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){ throw new RuntimeException("库存数量2不能大于报检零件的抵达采购数量"); } } /** * 校验数据 * @param mapData * @param rowNumber */ private void validateRowData(Map mapData,Integer rowNumber){ String rowStr = "
第"+(rowNumber+1)+"行:"; List errorMsgList = new ArrayList<>(); //零件编号 if(Objects.isNull(mapData.get(0))){ errorMsgList.add("零件编号不能为空"); }else if(!StringUtils.equals(mapData.get(0).toString(),ifsInventoryQuantity.getPartNo())){ errorMsgList.add("零件编号与报检零件不一致"); } //零件批号 if(Objects.isNull(mapData.get(3))){ errorMsgList.add("零件批号不能为空"); }else if(StringUtils.equals(mapData.get(3).toString(),ifsInventoryQuantity.getLotBatchNo())){ errorMsgList.add("零件批号与报检零件批号相同"); }else if(StringUtils.equals(prePartLotBatchNo.get(),mapData.get(3).toString())){ errorMsgList.add("零件批号存在重复"); } prePartLotBatchNo.getAndSet(mapData.get(3).toString()); //库存数量2 if(Objects.isNull(mapData.get(5))){ errorMsgList.add("库存数量2不能为空"); }else{ BigDecimal storeQty2 = BigDecimal.ZERO; try{ storeQty2 = new BigDecimal(mapData.get(5).toString()); }catch (Exception e){ errorMsgList.add("库存数量2格式异常"); } if(storeQty2.compareTo(ifsInventoryQuantity.getPurQtyInStore())>0){ errorMsgList.add("库存数量2不能大于报检零件的抵达采购数量"); } BigDecimal oldSum = storeQty2Sum.get(); storeQty2Sum.getAndSet(oldSum.add(storeQty2)); } //库位编号 if(Objects.isNull(mapData.get(10))){ errorMsgList.add("库位编号不能为空"); }else if(!StringUtils.equals(mapData.get(10).toString(),ifsInventoryQuantity.getLocationNo())){ errorMsgList.add("库位编号与报检零件的库位编号不一致"); } if(!errorMsgList.isEmpty()){ String errorStr = String.join(";",errorMsgList); errorMsg+= rowStr + errorStr ; } } /** * 转换excel导入行数据 * @param mapData * @return */ private OrderSplitExcelData transformExcelData(Map mapData,Integer rowNumber){ validateRowData(mapData,rowNumber); if(StringUtils.isBlank(errorMsg)){ OrderSplitExcelData data = new OrderSplitExcelData(); data.setPartNo(mapData.get(0).toString()); data.setSystemNo(Objects.isNull(mapData.get(1))?"":mapData.get(1).toString()); data.setSpec(Objects.isNull(mapData.get(2))?"":mapData.get(2).toString()); data.setLotBatchNo(Objects.isNull(mapData.get(3))?"":mapData.get(3).toString()); data.setLength(new BigDecimal(mapData.get(4).toString())); data.setQtyStock(new BigDecimal(mapData.get(5).toString())); data.setInsulationColor(Objects.isNull(mapData.get(6))?"":mapData.get(6).toString()); data.setOuterColor(Objects.isNull(mapData.get(7))?"":mapData.get(7).toString()); data.setLetteringInfo(Objects.isNull(mapData.get(8))?"":mapData.get(8).toString()); data.setDrumNo(Objects.isNull(mapData.get(9))?"":mapData.get(9).toString()); data.setLocationNo(Objects.isNull(mapData.get(10))?"":mapData.get(10).toString()); data.setStockSource(Objects.isNull(mapData.get(11))?"":mapData.get(11).toString()); data.setRemark(Objects.isNull(mapData.get(12))?"":mapData.get(12).toString()); return data; } return null; } }