package com.panzhihua.common.listen; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSONObject; import com.panzhihua.common.exceptions.ServiceException; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.ComMngRealCompanyExcelVO; import com.panzhihua.common.service.community.CommunityService; import com.panzhihua.common.utlis.ListUtils; import com.panzhihua.common.utlis.StringUtils; import lombok.extern.slf4j.Slf4j; /** * @description: 实有单位导入监听 * @author: Null * @date: 2021/3/11 13:26 */ @Slf4j public class ComMngRealCompanyExcelListen extends AnalysisEventListener { private static final int BATCH_COUNT = 5000; private CommunityService communityService; private Long communityId; private List list = new ArrayList<>(); public ComMngRealCompanyExcelListen(CommunityService communityService, Long communityId) { this.communityService = communityService; this.communityId = communityId; } @Override public void invoke(ComMngRealCompanyExcelVO comMngRealCompanyExcelVO, AnalysisContext analysisContext) { if (StringUtils.isEmpty(comMngRealCompanyExcelVO.getCreditCode())) { throw new ServiceException("统一社会信用代码不可为空"); } list.add(comMngRealCompanyExcelVO); // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (list.size() >= BATCH_COUNT) { log.info("excel导入数据【{}】", JSONObject.toJSONString(list)); // 根据list中的creditCode来去重 List newVoList = list.stream() .filter(ListUtils.distinctByKey(ComMngRealCompanyExcelVO::getCreditCode)).collect(Collectors.toList()); R r = this.communityService.listSaveMngRealCompanyExcelVO(newVoList, this.communityId); if (!R.isOk(r)) { throw new ServiceException(r.getMsg()); } list.clear(); // 清空list } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { log.info("excel导入数据【{}】", JSONObject.toJSONString(list)); // 根据list中的creditCode来去重 List newVoList = list.stream() .filter(ListUtils.distinctByKey(ComMngRealCompanyExcelVO::getCreditCode)).collect(Collectors.toList()); R r = this.communityService.listSaveMngRealCompanyExcelVO(newVoList, this.communityId);// 确保最后遗留的数据保存在数据库中 if (!R.isOk(r)) { throw new ServiceException(r.getMsg()); } } }