package com.panzhihua.common.listen; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; 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.community.ComMngBuildingExcelVO; import com.panzhihua.common.model.vos.community.ComMngPopulationImportErrorVO; import com.panzhihua.common.service.community.CommunityService; import com.panzhihua.common.service.grid.GridService; import com.panzhihua.common.utlis.DateUtils; import com.panzhihua.common.utlis.Snowflake; import com.panzhihua.common.utlis.StringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; /** * @description: 社区楼栋导入监听 * @author: xyh */ @Slf4j public class ComMngBuildingExcelListen extends AnalysisEventListener> { private static final int BATCH_COUNT = 5000; private static int headSize = 0; List> list = new ArrayList>(); private CommunityService communityService; private StringRedisTemplate stringRedisTemplate; private GridService gridService; private Long communityId; private Map headData; public ComMngBuildingExcelListen(CommunityService communityService, Long communityId, StringRedisTemplate stringRedisTemplate) { this.communityService = communityService; this.communityId = communityId; 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() { try { int index = 2; ArrayList voList = Lists.newArrayList(); List populationImportErrorVOList = new ArrayList<>(); ValueOperations valueOperations = stringRedisTemplate.opsForValue(); String key = Constants.BUILDING_ERROR_LIST + communityId; for (int i = 0; i < list.size(); i++) { Map oneData = list.get(i); ComMngBuildingExcelVO vo = new ComMngBuildingExcelVO(); vo.setId(Snowflake.getId()); // vo.setUseType(oneData.get(0)); // vo.setBuildType(oneData.get(1)); if (StringUtils.isEmpty(oneData.get(0))) { ComMngPopulationImportErrorVO importErrorVO = setError(oneData); importErrorVO.setErrorMsg("街路巷不能为空"); populationImportErrorVOList.add(importErrorVO); continue; } vo.setAlley(oneData.get(0)); vo.setVillageName(oneData.get(1)); if (StringUtils.isEmpty(oneData.get(2))) { ComMngPopulationImportErrorVO importErrorVO = setError(oneData); importErrorVO.setErrorMsg("街路巷号不能为空"); populationImportErrorVOList.add(importErrorVO); continue; } vo.setDoorNo(oneData.get(2)); if (StringUtils.isEmpty(oneData.get(3))) { ComMngPopulationImportErrorVO importErrorVO = setError(oneData); importErrorVO.setErrorMsg("楼栋号不能为空"); populationImportErrorVOList.add(importErrorVO); continue; } vo.setName(oneData.get(3)); // try { // vo.setUnitTotal(oneData.get(6) == null ? 0 : Integer.valueOf(oneData.get(6))); // } catch (Exception e1) { // vo.setUnitTotal(0); // } // try { // vo.setBuildFloorSum(oneData.get(7) == null ? 0 : Integer.valueOf(oneData.get(7))); // } catch (Exception e1) { // vo.setBuildFloorSum(0); // } // // try { // vo.setEveryFloorSum(oneData.get(8) == null ? 0 : Integer.valueOf(oneData.get(8))); // } catch (Exception e1) { // vo.setEveryFloorSum(0); // } // // try { // vo.setBuildUserSum(oneData.get(9) == null ? 0 : Integer.valueOf(oneData.get(9))); // } catch (Exception e1) { // vo.setBuildUserSum(0); // } // try { // vo.setElevatorTotal(oneData.get(10) == null ? 0 : Integer.valueOf(oneData.get(10))); // } catch (Exception e1) { // vo.setElevatorTotal(0); // } // // vo.setPropertyCompanyName(oneData.get(11)); // try { // SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); // vo.setBuildDate(sdf.parse(oneData.get(12))); // } catch (Exception e1) { // vo.setBuildDate(null); // } // vo.setRemark(oneData.get(13)); // vo.setGridId(oneData.get(14)); // vo.setGridName(oneData.get(14)); voList.add(vo); index++; } R r = communityService.listSaveBuildingExcelVO(voList, communityId); if (!R.isOk(r)) { List errorList = JSONArray.parseArray(JSONArray.toJSONString(r.getData()), ComMngPopulationImportErrorVO.class); if (!errorList.isEmpty()) { populationImportErrorVOList.addAll(errorList); } log.info("将错误数据存入redis中"); valueOperations.set(key, JSONArray.toJSONString(populationImportErrorVOList), 1, TimeUnit.HOURS); log.info("将错误数据存入redis中成功"); throw new ServiceException("500", key); } else { if (!populationImportErrorVOList.isEmpty()) { log.info("将错误数据存入redis中"); valueOperations.set(key, JSONArray.toJSONString(populationImportErrorVOList), 1, TimeUnit.HOURS); log.info("将错误数据存入redis中成功"); throw new ServiceException("500", key); } } } catch (NumberFormatException e) { e.printStackTrace(); } } private ComMngPopulationImportErrorVO setError(Map oneData){ ComMngPopulationImportErrorVO result = new ComMngPopulationImportErrorVO(); if(oneData != null){ // result.setUseType(oneData.get(0)); // result.setBuildType(oneData.get(1)); result.setAlley(oneData.get(0)); result.setVillageName(oneData.get(1)); result.setDoorNo(oneData.get(2)); result.setName(oneData.get(3)); // result.setUnitTotal(Integer.parseInt(oneData.get(6))); // result.setBuildFloorSum(Integer.parseInt(oneData.get(7))); // result.setEveryFloorSum(Integer.parseInt(oneData.get(8))); // result.setBuildUserSum(Integer.parseInt(oneData.get(9))); // result.setElevatorTotal(Integer.parseInt(oneData.get(10))); // result.setPropertyCompanyName(oneData.get(11)); // result.setBuildDate(DateUtils.stringToDate(oneData.get(12),DateUtils.format_yyyy)); // result.setRemark(oneData.get(13)); // result.setGridId(oneData.get(14)); } return result; } }