菜鸟bug之导入校验

文章讲述了在数据导入过程中如何进行校验,包括检查文件是否为空,验证文件数据是否与数据库中的数据冲突,以及确认数据是否在用户的权限范围内。具体步骤涉及读取文件、对比数据库数据、日期格式检查以及权限验证方法的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据导入必然存在校验问题,只有符合一定条件的数据才可导入,作为需求数据使用。个人总结大概有三个方面下面一一作出简单整理。

校验文件为否为空

文件导入时判断是否存在数据,可利用数据条数进行作为依据,记录数据条数,如没有数据,则条数为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;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值