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;
|
}
|
|
}
|