package com.panzhihua.common.listen;
|
|
import cn.hutool.core.date.DateUtil;
|
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.BcDictionaryConstants;
|
import com.panzhihua.common.constants.Constants;
|
import com.panzhihua.common.enums.*;
|
import com.panzhihua.common.exceptions.ServiceException;
|
import com.panzhihua.common.model.vos.BcDictionaryVO;
|
import com.panzhihua.common.model.vos.R;
|
import com.panzhihua.common.model.vos.community.ComMngPopulationElderExcelVO;
|
import com.panzhihua.common.model.vos.community.ComMngPopulationElderMistakeExcelVO;
|
import com.panzhihua.common.model.vos.community.ComMngPopulationMistakeExcelVO;
|
import com.panzhihua.common.service.community.CommunityService;
|
import com.panzhihua.common.utlis.ListUtils;
|
import com.panzhihua.common.utlis.PayUtil;
|
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.Objects;
|
import java.util.concurrent.TimeUnit;
|
import java.util.stream.Collectors;
|
|
/**
|
* title: ComMngPopulationElderExcelListen 高龄老人导入监听
|
* projectName 成都呐喊信息技术有限公司-智慧社区项目
|
* description: 高龄老人导入监听
|
*
|
* @author txb
|
* @date 2021/9/01 15:12
|
*/
|
@Slf4j
|
public class ComMngPopulationElderExcelListen extends AnalysisEventListener<Map<Integer, String>> {
|
/**
|
* 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
|
*/
|
private static final int BATCH_COUNT = 5000;
|
private static int headSize = 0;
|
List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
|
private CommunityService communityService;
|
private Long communityId;
|
private Long userId;
|
private Map<Integer, String> headData;
|
private StringRedisTemplate stringRedisTemplate;
|
|
public ComMngPopulationElderExcelListen(CommunityService communityService, Long communityId, Long userId,
|
StringRedisTemplate stringRedisTemplate) {
|
this.communityService = communityService;
|
this.communityId = communityId;
|
this.userId = userId;
|
this.stringRedisTemplate = stringRedisTemplate;
|
}
|
|
@Override
|
public void invoke(Map<Integer, String> data, AnalysisContext context) {
|
list.add(data);
|
if (list.size() >= BATCH_COUNT) {
|
saveData();
|
list.clear();
|
}
|
}
|
|
/**
|
* 这里会一行行的返回头
|
*
|
* @param headMap
|
* @param context
|
*/
|
@Override
|
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
|
headSize = headMap.size();
|
headData = headMap;
|
}
|
|
@Override
|
public void doAfterAllAnalysed(AnalysisContext context) {
|
saveData();
|
log.info("所有数据解析完成!");
|
}
|
|
/**
|
* 不是固定的列只能手动处理
|
*/
|
private void saveData() {
|
R<List<BcDictionaryVO>> dictionaryR = communityService.listDictionaryByKey(BcDictionaryConstants.FAMILY);
|
log.info("开始导入高龄老人数据");
|
log.info("表格总数据:" + list.size());
|
if (list.size() == 0) {
|
throw new ServiceException("100", "导入数据为空!");
|
}
|
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
|
String key = Constants.ELDER_POPULATION_ERROR_LIST + communityId;
|
|
Map<String, String> dictMap = dictionaryR.getData().stream()
|
.collect(Collectors.toMap(BcDictionaryVO::getDictName, BcDictionaryVO::getDictValue));
|
// Map<String,Integer> dictMap = new HashMap<>();
|
// for(BcDictionaryVO vo : dictionaryR.getData()){
|
// dictMap.put(vo.getDictName(),Integer.valueOf(vo.getDictValue()));
|
// }
|
|
int index = 2;
|
try {
|
String[] parsePatterns = new String[] {"yyyy-MM-dd", "yyyy-M-dd", "yyyy-MM-d", "yyyy-M-d", "yyyy/MM/dd",
|
"yyyy/M/dd", "yyyy/MM/d", "yyyy/M/d"};
|
ArrayList<ComMngPopulationElderExcelVO> voList = Lists.newArrayList();
|
// List<ComMngPopulationImportErrorVO> populationImportErrorVOList = new ArrayList<>();
|
ArrayList<ComMngPopulationElderMistakeExcelVO> mistakes = Lists.newArrayList();
|
for (Map<Integer, String> oneData : list) {
|
ComMngPopulationElderExcelVO vo = new ComMngPopulationElderExcelVO();
|
if (StringUtils.isEmpty(oneData.get(0))) {
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
index++;
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("名字不可为空,请填写姓名");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setName(oneData.get(0));
|
if (StringUtils.isEmpty(oneData.get(1))) {
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
index++;
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("身份证号不可为空,请填写身份证");
|
mistakes.add(mistake);
|
continue;
|
}
|
|
// 判断身份证号码位数
|
if (oneData.get(1).length() != 18) {
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
index++;
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("身份证号位数有误,请检查身份证号码是否正确");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setCardNo(oneData.get(1).toUpperCase());
|
// 根据身份证号码解析年龄以及性别
|
// 获取用户生日
|
String birthday = vo.getCardNo().substring(6, 14);
|
if (StringUtils.isNotEmpty(birthday)) {
|
String year = birthday.substring(0, 4);
|
String month = birthday.substring(4, 6);
|
String day = birthday.substring(6, 8);
|
vo.setBirthday(year + "-" + month + "-" + day);
|
}
|
// //设置用户年龄
|
// vo.setAge(AgeUtils.getAgeFromBirthTime(birthday));
|
// 获取用户性别
|
int sex = Integer.parseInt(vo.getCardNo().substring(16, 17));
|
if (sex % 2 == 1) {
|
vo.setSex(PopulSexEnum.nan.getCode());
|
} else {
|
vo.setSex(PopulSexEnum.nv.getCode());
|
}
|
|
if (StringUtils.isNotEmpty(oneData.get(2))) {
|
vo.setNation(oneData.get(2));
|
}
|
if (StringUtils.isNotEmpty(oneData.get(3))) {
|
Integer isOk = PopulPoliticalOutlookEnum.getCodeByName(oneData.get(3));
|
if (isOk.equals(-1)) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的政治面貌有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setPoliticalOutlook(isOk);
|
}
|
if (StringUtils.isNotEmpty(oneData.get(4))) {
|
Integer isOk = PopulHouseUseEnum.getCodeByName(oneData.get(4));
|
if (isOk.equals(-1)) {
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
index++;
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的是否租住有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setIsRent(isOk);
|
} else {
|
vo.setIsRent(PopulHouseUseEnum.getCodeByName("否"));
|
}
|
if (StringUtils.isEmpty(oneData.get(5))) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("街路巷不可为空");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setRoad(oneData.get(5));
|
if (StringUtils.isEmpty(oneData.get(6))) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("小区号不可为空");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setDoorNo(oneData.get(6).trim());
|
// if(StringUtils.isEmpty(oneData.get(7))){
|
// index++;
|
// ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
// setElderMistake(oneData, mistake);
|
// mistake.setMistake("楼排号不可为空");
|
// mistakes.add(mistake);
|
// continue;
|
// }
|
if (StringUtils.isNotEmpty(oneData.get(7))) {
|
vo.setFloor(oneData.get(7).trim());
|
}
|
// if(StringUtils.isEmpty(oneData.get(8))){
|
// index++;
|
// ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
// setElderMistake(oneData, mistake);
|
// mistake.setMistake("单元号不可为空");
|
// mistakes.add(mistake);
|
// continue;
|
// }
|
if (StringUtils.isNotEmpty(oneData.get(8))) {
|
vo.setUnitNo(oneData.get(8).trim());
|
}
|
// if(StringUtils.isEmpty(oneData.get(9))){
|
// index++;
|
// ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
// setElderMistake(oneData, mistake);
|
// mistake.setMistake("户室不可为空");
|
// mistakes.add(mistake);
|
// continue;
|
// }
|
if (StringUtils.isNotEmpty(oneData.get(9))) {
|
vo.setHouseNo(oneData.get(9).trim());
|
}
|
if (StringUtils.isNotEmpty(oneData.get(10))) {
|
Integer isOk = PopulHouseStatusEnum.getCodeByName(oneData.get(10).trim());
|
if (isOk.equals(-1)) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的房屋状态有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setHouseStatus(isOk);
|
}
|
if (StringUtils.isNotEmpty(oneData.get(11))) {
|
Integer isOk = PopulHousePurposeEnum.getCodeByName(oneData.get(11).trim());
|
if (isOk.equals(-1)) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的房屋用途有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setHousePurpose(isOk);
|
}
|
if (StringUtils.isNotEmpty(oneData.get(12))) {
|
Integer isOk = PopulHouseControlStatusEnum.getCodeByName(oneData.get(12));
|
if (isOk.equals(-1)) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的管控状态有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setControlStatus(isOk);
|
}
|
if (StringUtils.isNotEmpty(oneData.get(13))) {
|
vo.setPhone(oneData.get(13).trim());
|
}
|
if (StringUtils.isNotEmpty(oneData.get(14))) {
|
vo.setNativePlace(oneData.get(14).trim());
|
}
|
if (StringUtils.isNotEmpty(oneData.get(15))) {
|
Integer isOk = PopulCultureLevelEnum.getCodeByName(oneData.get(15));
|
if (isOk.equals(-1)) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的文化程度有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setCultureLevel(isOk);
|
}
|
if (StringUtils.isNotEmpty(oneData.get(16))) {
|
Integer isOk = PopulMarriageEnum.getCodeByName(oneData.get(16));
|
if (isOk.equals(-1)) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的婚姻状况有误");
|
mistakes.add(mistake);
|
continue;
|
} else {
|
vo.setMarriage(isOk);
|
}
|
}
|
if (StringUtils.isNotEmpty(oneData.get(17))) {
|
vo.setHealthy(oneData.get(17).trim());
|
}
|
if (StringUtils.isNotEmpty(oneData.get(18))) {
|
Integer isOk = PopulOutOrLocalEnum.getCodeByName(oneData.get(18));
|
if (isOk.equals(-1)) {
|
index++;
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的本地/外地有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setOutOrLocal(isOk);
|
} else {
|
vo.setOutOrLocal(PopulOutOrLocalEnum.getCodeByName("本地"));
|
}
|
if (StringUtils.isNotEmpty(oneData.get(19))) {
|
vo.setCensusRegister(oneData.get(19).trim());
|
}
|
if (StringUtils.isNotEmpty(oneData.get(20))) {
|
Integer isOk = PopulHouseUseEnum.getCodeByName(oneData.get(20));
|
if (isOk.equals(-1)) {
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
index++;
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的高龄老人登记(是/否)有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setIsRegister(isOk);
|
} else {
|
vo.setIsRegister(PopulHouseUseEnum.getCodeByName("否"));
|
}
|
if (StringUtils.isNotEmpty(oneData.get(21))) {
|
Integer isOk = PopulHouseUseEnum.getCodeByName(oneData.get(21));
|
if (isOk.equals(-1)) {
|
ComMngPopulationElderMistakeExcelVO mistake = new ComMngPopulationElderMistakeExcelVO();
|
index++;
|
setElderMistake(oneData, mistake);
|
mistake.setMistake("您填写的健在(是/否)有误");
|
mistakes.add(mistake);
|
continue;
|
}
|
vo.setIsAlive(isOk);
|
} else {
|
vo.setIsAlive(PopulHouseUseEnum.getCodeByName("否"));
|
}
|
if (StringUtils.isNotEmpty(oneData.get(22))) {
|
vo.setReceiveAllowanceBegin(DateUtil.parse(oneData.get(22).trim(), parsePatterns));
|
}
|
if (StringUtils.isNotEmpty(oneData.get(23))) {
|
vo.setNowAddress(oneData.get(23).trim());
|
}
|
if (StringUtils.isNotEmpty(oneData.get(24))) {
|
vo.setRemark(oneData.get(24).trim());
|
}
|
vo.getUserTagStr().add("高龄老人");
|
for (int i = 25; i < headSize; i++) {
|
if (oneData.get(i) != null && oneData.get(i).equals("是")) {
|
vo.getUserTagStr().add(headData.get(i).substring(0, headData.get(i).indexOf("(")));
|
}
|
}
|
// 将重复的数据进行MD5加密实现去重
|
String distinct = vo.getName() + vo.getCardNo() + vo.getRoad() + vo.getDoorNo() + vo.getFloor()
|
+ vo.getUnitNo() + vo.getHouseNo();
|
try {
|
String distinctPass = PayUtil.MD5(distinct);
|
if (StringUtils.isNotEmpty(distinctPass)) {
|
vo.setDistinctPass(distinctPass);
|
}
|
} catch (Exception e) {
|
log.error("组装MD5加密字段失败,数据表格行数:" + index);
|
continue;
|
}
|
voList.add(vo);
|
index++;
|
}
|
// 客户需要暂时注释,等客户处理完成需要恢复
|
// if(populationImportErrorVOList.isEmpty()){
|
// R r = communityService.listSavePopulationServeExcelVO(voList, communityId);
|
// if (!R.isOk(r)) {
|
// throw new ServiceException(r.getMsg());
|
// }
|
// }else{
|
// throw new ServiceException("500", JSON.toJSONString(populationImportErrorVOList));
|
// }
|
// 根据list中的IdCard城市来去重
|
List<ComMngPopulationElderExcelVO> newVoList =
|
voList.stream().filter(ListUtils.distinctByKey(ComMngPopulationElderExcelVO::getDistinctPass))
|
.collect(Collectors.toList());
|
log.info("开始进入业务层处理逻辑");
|
R r = communityService.listSavePopulationElderExcelVO(newVoList, communityId, userId);
|
log.info("业务层处理逻辑完成");
|
if (!R.isOk(r)) {
|
log.info("业务层处理成功");
|
List<ComMngPopulationElderMistakeExcelVO> list =
|
JSONArray.parseArray(JSONArray.toJSONString(r.getData()), ComMngPopulationElderMistakeExcelVO.class);
|
// String errMsg = r.getMsg();
|
// List<ComMngPopulationImportErrorVO> errorList =
|
// JSON.parseArray(errMsg,ComMngPopulationImportErrorVO.class);
|
// if(!errorList.isEmpty()){
|
// populationImportErrorVOList.addAll(errorList);
|
// }
|
mistakes.addAll(list);
|
log.info("将错误数据存入redis中");
|
valueOperations.set(key, JSONArray.toJSONString(mistakes), 1, TimeUnit.HOURS);
|
log.info("将错误数据存入redis中成功");
|
throw new ServiceException("500", key);
|
} else {
|
log.info("业务层处理逻辑失败");
|
if (!mistakes.isEmpty()) {
|
log.info("业务层处理逻辑失败,将错误数据缓存到redis中");
|
valueOperations.set(key, JSONArray.toJSONString(mistakes), 1, TimeUnit.HOURS);
|
log.info("业务层处理逻辑失败,将错误数据缓存到redis中成功");
|
throw new ServiceException("500", key);
|
}
|
}
|
} catch (NumberFormatException e) {
|
log.info("处理数据时失败");
|
e.printStackTrace();
|
// List<ComMngPopulationImportErrorVO> populationImportErrorVOList = new ArrayList<>();
|
// ComMngPopulationImportErrorVO importErrorVO = new ComMngPopulationImportErrorVO();
|
// importErrorVO.setErrorPosition("第" + index + "行");
|
// importErrorVO.setErrorMsg("数据格式有误,请检查文档内数据");
|
// populationImportErrorVOList.add(importErrorVO);
|
log.error("数据格式有误,第" + index + "行");
|
throw new ServiceException("500", "NumberFormatException");
|
}
|
}
|
|
private void setElderMistake(Map<Integer, String> map, ComMngPopulationElderMistakeExcelVO vo) {
|
vo.setName(map.get(0));
|
vo.setCardNo(map.get(1));
|
vo.setNation(map.get(2));
|
vo.setPoliticalOutlook(map.get(3));
|
vo.setIsRent(map.get(4));
|
vo.setRoad(map.get(5));
|
vo.setDoorNo(map.get(6));
|
vo.setFloor(map.get(7));
|
vo.setUnitNo(map.get(8));
|
vo.setHouseNo(map.get(9));
|
vo.setHouseStatus(map.get(10));
|
vo.setHousePurpose(map.get(11));
|
vo.setControlStatus(map.get(12));
|
vo.setPhone(map.get(13));
|
vo.setNativePlace(map.get(14));
|
vo.setCultureLevel(map.get(15));
|
vo.setMarriage(map.get(16));
|
vo.setHealthy(map.get(17));
|
vo.setOutOrLocal(map.get(18));
|
vo.setCensusRegister(map.get(19));
|
vo.setIsRegister(map.get(20));
|
vo.setIsAlive(map.get(21));
|
vo.setReceiveAllowanceBegin(map.get(22));
|
vo.setNowAddress(map.get(23));
|
vo.setRemark(map.get(24));
|
}
|
}
|