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<Map<Integer,Object>> { 
 | 
  
 | 
    //表头模板 
 | 
    private static final String HEAD_TEMPLATE = "[零件编号, 系统编号, 规格, 零件批号, 库存数量1, 库存数量2, 绝缘颜色, 外护颜色, 印字信息, 盘号, 库位编号, 库位来源, 备注]"; 
 | 
  
 | 
    AtomicInteger index = new AtomicInteger(0);//符合表格模板的行数 
 | 
  
 | 
    @Getter 
 | 
    List<OrderSplitExcelData> dataList = new ArrayList<>();//导入的数据列表 
 | 
  
 | 
    IfsInventoryQuantity ifsInventoryQuantity;//对应报检ifs信息 
 | 
  
 | 
    public String errorMsg = ""; 
 | 
  
 | 
    public OrderSplitExcelListener(IfsInventoryQuantity ifsInventoryQuantity) { 
 | 
        this.ifsInventoryQuantity = ifsInventoryQuantity; 
 | 
    } 
 | 
  
 | 
    AtomicReference<String> prePartLotBatchNo = new AtomicReference<>("");//上一条数据的零件批号 
 | 
  
 | 
    AtomicReference<BigDecimal> storeQty2Sum = new AtomicReference<>(BigDecimal.ZERO);//导入数据库存数量2的总和 
 | 
  
 | 
    @Override 
 | 
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { 
 | 
        String temp = headMap.values().toString(); 
 | 
        if(StringUtils.equals(HEAD_TEMPLATE,temp)){ 
 | 
            index.getAndIncrement(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void invoke(Map<Integer,Object> 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<Integer,Object> mapData,Integer rowNumber){ 
 | 
        String rowStr = "</br>第"+(rowNumber+1)+"行:"; 
 | 
        List<String> 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<Integer,Object> 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; 
 | 
    } 
 | 
  
 | 
} 
 |