|
|
@ -1,5 +1,6 @@ |
|
|
|
package com.epmet.excel.handler; |
|
|
|
|
|
|
|
import cn.hutool.log.Log; |
|
|
|
import com.alibaba.excel.context.AnalysisContext; |
|
|
|
import com.alibaba.excel.event.AnalysisEventListener; |
|
|
|
import com.alibaba.excel.metadata.data.ReadCellData; |
|
|
@ -23,7 +24,10 @@ import com.epmet.entity.LingshanSpecialCrowdPersonEntity; |
|
|
|
import com.epmet.entity.LingshanSpecialCrowdPersonTypeEntity; |
|
|
|
import com.epmet.enums.LingShanSpecialCrowdTypeEnums; |
|
|
|
import com.epmet.excel.data.LingShanSpecialCrowdDetailBaseExcelData; |
|
|
|
import com.epmet.exceptions.ReadExcelHeaderOnlyException; |
|
|
|
import com.epmet.service.LingShanSpecialCrowdService; |
|
|
|
import lombok.Data; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.apache.commons.collections4.CollectionUtils; |
|
|
|
import org.apache.commons.collections4.ListUtils; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
@ -35,6 +39,8 @@ import java.util.stream.Collectors; |
|
|
|
/** |
|
|
|
* 灵山大屏-抽象的导入excel监听器 |
|
|
|
*/ |
|
|
|
@Data |
|
|
|
@Slf4j |
|
|
|
public abstract class AbstractLingShanSpecialCrowdExcelImportListener<T extends LingShanSpecialCrowdDetailBaseExcelData, E extends LingshanSpecialCrowdDetailBaseEntity> |
|
|
|
extends AnalysisEventListener<T> { |
|
|
|
|
|
|
@ -62,6 +68,15 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener<T extends |
|
|
|
*/ |
|
|
|
private List<String> headerZhList; |
|
|
|
|
|
|
|
/** |
|
|
|
* @description: 是否只校验表头 |
|
|
|
* @param null: |
|
|
|
* @return |
|
|
|
* @author: WangXianZhang |
|
|
|
* @date: 2023/4/19 5:16 PM |
|
|
|
*/ |
|
|
|
private Boolean validateHeaderOnly = false; |
|
|
|
|
|
|
|
/** |
|
|
|
* 当前表头读到了第几行 |
|
|
|
*/ |
|
|
@ -121,20 +136,37 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener<T extends |
|
|
|
|
|
|
|
if ((++currentHeadRowNum).equals(maxHeadRowNum)) { |
|
|
|
// 如果是表头最后一行,则校验表头
|
|
|
|
List<String> redundentHeaders = new ArrayList<>(); |
|
|
|
List<String> lackHeaders = new ArrayList<>(); |
|
|
|
|
|
|
|
Collection<String> headersFromFile = headMap.values(); |
|
|
|
// 2次循环,双向校验
|
|
|
|
for (String headerZh : headersFromFile) { |
|
|
|
if (StringUtils.isNotBlank(headerZh) && !headerZhList.contains(headerZh)) { |
|
|
|
throw new EpmetException("请确认表头内容与模板一致"); |
|
|
|
redundentHeaders.add(headerZh); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (String headerZh : headerZhList) { |
|
|
|
if (StringUtils.isNotBlank(headerZh) && !headersFromFile.contains(headerZh)) { |
|
|
|
throw new EpmetException("请确认表头内容与模板一致"); |
|
|
|
lackHeaders.add(headerZh); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 汇总错误字段,成一句话
|
|
|
|
String preValidTipStr = ""; |
|
|
|
if (CollectionUtils.isNotEmpty(redundentHeaders)) { |
|
|
|
preValidTipStr += "多余【" + String.join(",", redundentHeaders) + "】字段。"; |
|
|
|
} |
|
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(lackHeaders)) { |
|
|
|
preValidTipStr += "缺少【" + String.join(",", lackHeaders) + "】必填字段。"; |
|
|
|
} |
|
|
|
|
|
|
|
if (StringUtils.isNotBlank(preValidTipStr)) { |
|
|
|
log.error("【灵山街道-社会维稳导入】表格表头不对应," + preValidTipStr); |
|
|
|
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), null, "上传文件有误!" + preValidTipStr + "请确认表格格式正确"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -148,6 +180,10 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener<T extends |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public void invoke(T row, AnalysisContext context) { |
|
|
|
if (validateHeaderOnly) { |
|
|
|
// 如果仅解析表头,那么抛出异常,外层接住
|
|
|
|
throw new ReadExcelHeaderOnlyException(); |
|
|
|
} |
|
|
|
try { |
|
|
|
ValidatorUtils.validateEntity(row); |
|
|
|
} catch ( |
|
|
@ -168,6 +204,10 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener<T extends |
|
|
|
|
|
|
|
@Override |
|
|
|
public void doAfterAllAnalysed(AnalysisContext context) { |
|
|
|
if (validateHeaderOnly) { |
|
|
|
throw new ReadExcelHeaderOnlyException(); |
|
|
|
} |
|
|
|
|
|
|
|
if (originDatas.size() > 0) { |
|
|
|
saveBatchWithLock(); |
|
|
|
clear(); |
|
|
|