数据导入必然存在校验问题,只有符合一定条件的数据才可导入,作为需求数据使用。个人总结大概有三个方面下面一一作出简单整理。
校验文件为否为空
文件导入时判断是否存在数据,可利用数据条数进行作为依据,记录数据条数,如没有数据,则条数为0,直接返回结果。
//创建记录数据集合,作为参数传至读文件中
List<Integer> nums = new ArrayList<>();
EasyExcel.read(fileParams.getFile().getInputStream(), BaseBusinessInfoExcelReadDTO.class,
new BaseBusinessInfoListener(
fileParams.getGuid(),
this,
1,
baseFileErrorVOS,
businessCodes,map,nums
)).sheet().doRead();
//读文件定义变量
private List<Integer> num;
//解析数据重写方法中获取文件数据条数
num.add(index);
index++;
//返回在Impl后对文件数据书进行判断处理
if (CollectionUtil.isEmpty(num)) {
baseFileMsgVO.setFileEmpty(true);
}else{
baseFileMsgVO.setFileEmpty(false);
}
//结果传至Controller层,将其结果返回给用户
BaseFileMsgVO baseFileMsgVO = baseBusinessInfoService.importExcelData(file);
if (baseFileMsgVO.getFileEmpty()) {
return R.failed("文件为空!");
}else {
return R.ok(baseFileMsgVO);
}
校验文件中数据是否为空
某些数据的导入需要和数据库中数据进行对比,以防数据错乱,只有符合要求的数据才能导入。
首先对其数据库相应数据进行查询,存放在集合中,后与其文件中数据进行对比。
//查询数据,作为参数传值读文件中
List<String> businessCodes = baseMapper.getBusinessCodes();
List<LinigAreaDto> liningAreaDtoList = liningAreaService.selectLiningAreaDto();
Map<String,LinigAreaDto> map = liningAreaDtoList.stream().collect(Collectors.toMap(LinigAreaDto::getFullName,t->t));
//读文件 定义变量
private List<String> businessCodes;
private Map<String,BaseBusinessInfo> map;
//读文件重写方法中重载方法进行数据对比处理
StringBuilder stringBuilder = new StringBuilder();
//校验数据重复
if(businessCodes.contains(data.getBusinessCode())){
exitBusiCodes.add(data.getBusinessCode());
}
if(thisTimeCodes.contains(data.getBusinessCode())){
stringBuilder.append("第" + index + "行数据,商业体编码重复。");
return stringBuilder;
}
//校验数据时间格式
if(StringUtils.isNotBlank(data.getOpenTime())){
try{
Date date = sdf.parse(data.getOpenTime());
}catch(Exception e){
stringBuilder.append("第" + index + "行数据,日期格式必须为yyyy/MM/dd。");
return stringBuilder;
}
}
//校验数据是否为空
if(StringUtils.isBlank(data.getBusinessName())){
stringBuilder.append("第" + index + "行数据,商业体名称不能为空。");
return stringBuilder;
}
//校验数据是否符合要求
if(!("已开业".equals(data.getOpenState()) || "未开业".equals(data.getOpenState()))){
stringBuilder.append("第" + index + "行数据,开业状态仅支持'已开业'和'未开业'。");
return stringBuilder;
}
校验数据是否在权限内
导入时首先判断是否有数据权限,只有在权限内才可以进行导入,又或某些数据不在数据权限内也不能导入其中。
//获取当前登录人以及数据权限 并将其作为参数传至读文件中
PigUser user = SecurityUtils.getUser();
List<SysDataRole> sdrList = dataRoleService.getDataRoleByUserId(user.getUsername());
//定义变量
private List<SysDataRole> sdrList;
//获取数据,进行对比分析
SysDataRole sdr = new SysDataRole();
LinigAreaDto dto = LinigAreaDtoMap.get(fullName);
sdr.setRegion(dto.getRegion());
sdr.setProvincial(dto.getProvincial());
sdr.setProvince(dto.getProvince());
sdr.setCity(dto.getCity());
sdr.setDistrict(dto.getDistrict());
boolean canExport = baseCustomerBusinessService.checkExport(sdrList,sdr);
if(!canExport){
stringBuilder.append("第" + index + "行数据,超出区域权限。");
return stringBuilder;
}
//checkExport(sdrList,sdr)
//方法进行数据查询对比
boolean checkExport(List<SysDataRole> sdrList, SysDataRole sdr);
//实现方法
@Override
public boolean checkExport(List<SysDataRole> sdrList, SysDataRole sdr) {
List<SysDataRole> onlyRegion = new ArrayList<>();//大区
List<SysDataRole> onlyPrivancial = new ArrayList<>();//省区
List<SysDataRole> onlyPrivance = new ArrayList<>();//省份
List<SysDataRole> onlyCity = new ArrayList<>();//城市
List<SysDataRole> areaInfos = new ArrayList<>();
for (SysDataRole sysDataRoleVo : sdrList) {
if(StringUtils.isEmpty(sysDataRoleVo.getProvincial()) && StringUtils.isEmpty(sysDataRoleVo.getProvince()) && StringUtils.isEmpty(sysDataRoleVo.getCity()) && StringUtils.isEmpty(sysDataRoleVo.getDistrict())){
onlyRegion.add(sysDataRoleVo);
}
else if(StringUtils.isEmpty(sysDataRoleVo.getProvince()) && StringUtils.isEmpty(sysDataRoleVo.getCity()) && StringUtils.isEmpty(sysDataRoleVo.getDistrict())){
onlyPrivancial.add(sysDataRoleVo);
}
else if(StringUtils.isEmpty(sysDataRoleVo.getCity()) && StringUtils.isEmpty(sysDataRoleVo.getDistrict())){
onlyPrivance.add(sysDataRoleVo);
}else if(StringUtils.isEmpty(sysDataRoleVo.getDistrict())){
onlyCity.add(sysDataRoleVo);
}else{
areaInfos.add(sysDataRoleVo);
}
}
if(CollectionUtil.isNotEmpty(onlyRegion)){
for (SysDataRole sysDataRole : onlyRegion) {
if(sysDataRole.getRegion().equals(sdr.getRegion())){
return true;
}
}
}
if(CollectionUtil.isNotEmpty(onlyPrivancial)){
for (SysDataRole sysDataRole : onlyPrivancial) {
if(sysDataRole.getRegion().equals(sdr.getRegion()) && sysDataRole.getProvincial().equals(sdr.getProvincial())){
return true;
}
}
}
if(CollectionUtil.isNotEmpty(onlyPrivance)){
for (SysDataRole sysDataRole : onlyPrivance) {
if(sysDataRole.getRegion().equals(sdr.getRegion())
&& sysDataRole.getProvincial().equals(sdr.getProvincial())
&& sysDataRole.getProvince().equals(sdr.getProvince())){
return true;
}
}
}
if(CollectionUtil.isNotEmpty(onlyCity)){
for (SysDataRole sysDataRole : onlyCity) {
if(sysDataRole.getRegion().equals(sdr.getRegion())
&& sysDataRole.getProvincial().equals(sdr.getProvincial())
&& sysDataRole.getProvince().equals(sdr.getProvince())
&& sysDataRole.getCity().equals(sdr.getCity())){
return true;
}
}
}
if(CollectionUtil.isNotEmpty(areaInfos)){
for (SysDataRole sysDataRole : areaInfos) {
if(sysDataRole.getRegion().equals(sdr.getRegion())
&& sysDataRole.getProvincial().equals(sdr.getProvincial())
&& sysDataRole.getProvince().equals(sdr.getProvince())
&& sysDataRole.getCity().equals(sdr.getCity())
&& sysDataRole.getDistrict().equals(sdr.getDistrict())){
return true;
}
}
}
return false;
}