package com.panzhihua.common.listen; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSONArray; import com.google.common.collect.Lists; import com.panzhihua.common.constants.Constants; import com.panzhihua.common.exceptions.ServiceException; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.partybuilding.excel.ComPbCheckUnitErrorExcelVO; import com.panzhihua.common.model.vos.partybuilding.excel.ComPbCheckUnitExcelVO; import com.panzhihua.common.model.vos.partybuilding.excel.ComPbMemberRoleErrorExcelVo; import com.panzhihua.common.model.vos.partybuilding.excel.ComPbMemberRoleExcelVo; import com.panzhihua.common.service.partybuilding.ComPbCheckUnitFeign; import com.panzhihua.common.service.partybuilding.PartyBuildingService; import com.panzhihua.common.utlis.ListUtils; import com.panzhihua.common.utlis.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * title: 社区党委导入监听 * @author : lyq */ @Slf4j public class ComPbMemberRoleExcelListen extends AnalysisEventListener> { /** * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 3000; private static int headSize = 0; List> list = new ArrayList>(); private PartyBuildingService partyBuildingService;; private Long communityId; private Long userId; private Map headData; private StringRedisTemplate stringRedisTemplate; public ComPbMemberRoleExcelListen(PartyBuildingService partyBuildingService, Long communityId, Long userId, StringRedisTemplate stringRedisTemplate) { this.partyBuildingService = partyBuildingService; this.communityId = communityId; this.userId = userId; this.stringRedisTemplate = stringRedisTemplate; } @Override public void invoke(Map data, AnalysisContext context) { list.add(data); if (list.size() >= BATCH_COUNT) { saveData(); list.clear(); } } /** * 这里会一行行的返回头 * * @param headMap * @param context */ @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { headSize = headMap.size(); headData = headMap; } @Override public void doAfterAllAnalysed(AnalysisContext context) { saveData(); log.info("所有数据解析完成!"); } /** * 不是固定的列只能手动处理 */ private void saveData() { log.info("表格总数据:" + list.size()); if (list.size() == 0) { throw new ServiceException("000", "导入数据为空!"); } ValueOperations valueOperations = stringRedisTemplate.opsForValue(); String key = Constants.PB_MEMBER_ROLE_ERROR_LIST + communityId; int index = 2; try { ArrayList voList = Lists.newArrayList(); ArrayList mistakes = Lists.newArrayList(); for (Map oneData : list) { ComPbMemberRoleExcelVo vo = new ComPbMemberRoleExcelVo(); if (StringUtils.isEmpty(oneData.get(0))) { index++; mistakes.add(setErrorObject(oneData,"党员姓名不可为空,请填写党员姓名")); continue; }else{ //判断导入的名字的长度是否超过30 if(oneData.get(0).length() > 10){ index++; mistakes.add(setErrorObject(oneData,"党员姓名长度不可超过10,请重新填写党员姓名")); continue; } } vo.setName(oneData.get(0)); if (StringUtils.isEmpty(oneData.get(1))) { index++; mistakes.add(setErrorObject(oneData,"身份证号不可为空,请填写身份证号")); continue; } vo.setIdCard(oneData.get(1)); if (StringUtils.isEmpty(oneData.get(2))) { index++; mistakes.add(setErrorObject(oneData,"手机号不可为空,请填写手机号")); continue; } vo.setPhone(oneData.get(2)); if (StringUtils.isNotEmpty(oneData.get(3))) { vo.setTypeName(oneData.get(3)); } if (StringUtils.isEmpty(oneData.get(4))) { index++; mistakes.add(setErrorObject(oneData,"入党日期不可为空,请填写入党日期")); continue; } vo.setJoinTime(oneData.get(4)); if (StringUtils.isNotEmpty(oneData.get(5))) { vo.setEmploymentTime(oneData.get(5)); } if (StringUtils.isNotEmpty(oneData.get(6))) { vo.setPosition(oneData.get(6)); } if (StringUtils.isNotEmpty(oneData.get(7))) { vo.setJobResponsibilities(oneData.get(7)); } if (StringUtils.isNotEmpty(oneData.get(8))) { vo.setOrg(oneData.get(8)); } voList.add(vo); index++; } List newVoList = voList.stream().filter(ListUtils.distinctByKey(ComPbMemberRoleExcelVo::getIdCard)) .collect(Collectors.toList()); R r = partyBuildingService.importPbMemberRole(newVoList, communityId, userId); if (!R.isOk(r)) { List list = JSONArray.parseArray(JSONArray.toJSONString(r.getData()), ComPbMemberRoleErrorExcelVo.class); mistakes.addAll(list); valueOperations.set(key, JSONArray.toJSONString(mistakes), 1, TimeUnit.HOURS); throw new ServiceException("500", key); } else { if (!mistakes.isEmpty()) { valueOperations.set(key, JSONArray.toJSONString(mistakes), 1, TimeUnit.HOURS); throw new ServiceException("500", key); } } } catch (NumberFormatException e) { e.printStackTrace(); throw new ServiceException("500", "导入失败"); } } private void setError(Map map, ComPbMemberRoleErrorExcelVo vo) { vo.setName(map.get(0)); vo.setIdCard(map.get(1)); vo.setPhone(map.get(2)); vo.setTypeName(map.get(3)); vo.setJoinTime(map.get(4)); vo.setEmploymentTime(map.get(5)); vo.setPosition(map.get(6)); vo.setJobResponsibilities(map.get(7)); } /** * 组装错误信息 * @param oneData 数据表格对象 * @param error 错误信息 * @return 错误对象 */ private ComPbMemberRoleErrorExcelVo setErrorObject(Map oneData, String error){ ComPbMemberRoleErrorExcelVo mistake = new ComPbMemberRoleErrorExcelVo(); setError(oneData, mistake); mistake.setError(error); return mistake; } }