| | |
| | | import com.alibaba.excel.context.AnalysisContext; |
| | | import com.alibaba.excel.event.AnalysisEventListener; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.google.common.collect.Lists; |
| | | import com.panzhihua.common.exceptions.ServiceException; |
| | | import com.panzhihua.common.model.vos.R; |
| | | import com.panzhihua.common.model.vos.community.ComMngPopulationServeExcelVO; |
| | | import com.panzhihua.common.model.vos.community.ComMngVillageServeExcelVO; |
| | | import com.panzhihua.common.service.community.CommunityService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import static com.sun.xml.internal.ws.spi.db.BindingContextFactory.LOGGER; |
| | | |
| | | /** |
| | | * @description: 实有人口导入监听 |
| | | * @author: llming |
| | | */ |
| | | @Slf4j |
| | | public class ComMngPopulationServeExcelListen extends AnalysisEventListener<ComMngPopulationServeExcelVO> { |
| | | |
| | | public class ComMngPopulationServeExcelListen extends AnalysisEventListener<Map<Integer, String>> { |
| | | private CommunityService communityService; |
| | | |
| | | private Long communityId; |
| | | |
| | | private static int headSize = 0; |
| | | |
| | | private Map<Integer, String> headData; |
| | | |
| | | |
| | | public ComMngPopulationServeExcelListen(CommunityService communityService, Long communityId) { |
| | | this.communityService = communityService; |
| | | this.communityId = communityId; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收 |
| | | */ |
| | | private static final int BATCH_COUNT = 100; |
| | | private List<ComMngPopulationServeExcelVO> list = new ArrayList<>(); |
| | | |
| | | List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>(); |
| | | |
| | | @Override |
| | | public void invoke(ComMngPopulationServeExcelVO comMngPopulationServeExcelVO, AnalysisContext analysisContext) { |
| | | list.add(comMngPopulationServeExcelVO); |
| | | // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM |
| | | public void invoke(Map<Integer, String> data, AnalysisContext context) { |
| | | list.add(data); |
| | | if (list.size() >= BATCH_COUNT) { |
| | | log.info("excel导入数据【{}】", JSONObject.toJSONString(list)); |
| | | R r = communityService.listSavePopulationServeExcelVO(list, this.communityId); |
| | | if (!R.isOk(r)) { |
| | | throw new ServiceException(r.getMsg()); |
| | | } |
| | | //清空list |
| | | saveData(); |
| | | list.clear(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 这里会一行行的返回头 |
| | | * |
| | | * @param headMap |
| | | * @param context |
| | | */ |
| | | @Override |
| | | public void doAfterAllAnalysed(AnalysisContext analysisContext) { log.info("excel导入数据【{}】", JSONObject.toJSONString(list)); |
| | | //确保最后遗留的数据保存在数据库中 |
| | | R r = this.communityService.listSavePopulationServeExcelVO(list, this.communityId); |
| | | if (!R.isOk(r)) { |
| | | throw new ServiceException(r.getMsg()); |
| | | } |
| | | public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { |
| | | headSize = headMap.size(); |
| | | headData = headMap; |
| | | } |
| | | |
| | | @Override |
| | | public void doAfterAllAnalysed(AnalysisContext context) { |
| | | saveData(); |
| | | LOGGER.info("所有数据解析完成!"); |
| | | } |
| | | |
| | | /** |
| | | * 不是固定的列只能手动处理 |
| | | */ |
| | | private void saveData() { |
| | | int index = 2; |
| | | try { |
| | | ArrayList<ComMngPopulationServeExcelVO> voList = Lists.newArrayList(); |
| | | for (Map<Integer, String> oneData : list) { |
| | | ComMngPopulationServeExcelVO vo = new ComMngPopulationServeExcelVO(); |
| | | vo.setName(oneData.get(0)); |
| | | vo.setSex(Integer.valueOf(oneData.get(1))); |
| | | vo.setAge(Integer.valueOf(oneData.get(2))); |
| | | vo.setIsRent(Integer.valueOf(oneData.get(3))); |
| | | vo.setRoad(oneData.get(4)); |
| | | vo.setDoorNo(Integer.valueOf(oneData.get(5))); |
| | | vo.setFloor(Integer.valueOf(oneData.get(6))); |
| | | vo.setUnitNo(Integer.valueOf(oneData.get(7))); |
| | | vo.setHouseNo(Integer.valueOf(oneData.get(8))); |
| | | vo.setNation(oneData.get(9)); |
| | | vo.setPoliticalOutlook(oneData.get(10)); |
| | | vo.setCardNo(oneData.get(11)); |
| | | vo.setPhone(oneData.get(12)); |
| | | vo.setNativePlace(oneData.get(13)); |
| | | vo.setWorkCompany(oneData.get(14)); |
| | | for (int i = 15; i < headSize; i++) { |
| | | if (oneData.get(i).equals("是")) { |
| | | vo.getUserTagStr().add(headData.get(i)); |
| | | } |
| | | } |
| | | voList.add(vo); |
| | | index++; |
| | | } |
| | | R r = communityService.listSavePopulationServeExcelVO(voList, communityId); |
| | | if (!R.isOk(r)) { |
| | | throw new ServiceException(r.getMsg()); |
| | | } |
| | | } catch (NumberFormatException e) { |
| | | throw new ServiceException("500", "填写数据类型错误:第" + index + "行" + e.getMessage()); |
| | | } |
| | | } |
| | | } |