Excel导入大量数据,同时校验Excel中数据以及数据库是否存在重复数据

   1.共享数据,减少数据查询

      业务需求:  导入房屋信息,房屋信息包括项目编号,楼栋编号,楼层号,房屋号

      如果系统中已存在深圳大区,金色家园,1栋,102房屋,Excel中刚好有深圳大区,金色家园,1栋102房屋这条记录,又或者Excel中的信息是这样子的 --深圳大区,金色家园,1栋,102,仅仅是名字不一样了,或者信息不对。。。。

       思维:将数据库中的数据同步到redis,做文件导入的时候,一条一条的和缓存中数据对比,如果大区+楼栋+楼层不存在,可以插入,同理,如果大区+楼栋+楼层存在,数据库有数据,尽量避免修改。如果不存在,则增加到缓存中,否则,将数据加入新的集合返回给客户端。这样就可以保证Excel中的数据插入数据库唯一。

       注意:由于数据库中的数据大部分都是从CRM系统同步过来的,数据信息价值较高,然而,数据导入可能是由公司员工或者地区管理员使用,操作可能不够规范或者不正确。所以,当时我采取的措施是:尽量只能做新增操作,避免做更新操作。

@Component
public class AcsPropertyFactory {

    @Autowired
    private RedisOperatorManager redisOperatorManager;

    /*    private PropertyExcelVo crmPropertyEntity;

    public PropertyExcelVo getCrmPropertyEntity() {
        return crmPropertyEntity;
    }
    public void PropertyExcelVo(PropertyExcelVo crmPropertyEntity) {
        this.crmPropertyEntity = crmPropertyEntity;
    }*/

    /**
     * 享元模式:
     * 数据量大,集合太耗费资源,所以使用redis每次进行查询
     */

    //存数据库中该楼栋下所有的房屋名
    // private   Map persistDataPool ;
    //ufrData:key,单元-楼层-房号
    // private   Map ufrDataPool;


    /**
     * 存数据库中该楼栋下所有的房屋名
     *
     * @param property
     * @return
     */
    public boolean isHavePersistData(PropertyExcelVo property) {
        if (StringUtils.isNotBlank(property.getUnit()) && StringUtils.isNotBlank(property.getFloor()) && StringUtils.isNotBlank(property.getRoomNumber())) {
            String keyName = property.getPropertyName();
            Object hashObjValue = redisOperatorManager.getHashObjValue(CommonConstants.CRM_PROPETY_NAME, keyName, CommonConstants.CRM_REDIS_DB_INDEX);
            if (null != hashObjValue) {
                return true;
            } else {
                redisOperatorManager.addHashValue(CommonConstants.CRM_PROPETY_NAME, keyName, property, CommonConstants.CRM_REDIS_DB_INDEX);
                return false;
            }
        }
        return true;
    }

    /**
     * ufrData:key,单元-楼层-房号
     *
     * @param property
     * @return
     */
    public boolean isHaveUfrData(PropertyExcelVo property) {
        if (StringUtils.isNotBlank(property.getUnit()) && StringUtils.isNotBlank(property.getFloor()) && StringUtils.isNotBlank(property.getRoomNumber())) {
            String keyName = property.getUnit() + "-" + property.getFloor() + "-" + property.getRoomNumber();
            Object hashObjValue = redisOperatorManager.getHashObjValue(CommonConstants.CRM_PROPETY, keyName, CommonConstants.CRM_REDIS_DB_INDEX);
            if (null != hashObjValue) {
                return true;
            } else {
                redisOperatorManager.addHashValue(CommonConstants.CRM_PROPETY, keyName, property, CommonConstants.CRM_REDIS_DB_INDEX);
                return false;
            }
        }
        return true;
    }


 2.Excel数据处理

     //处理Excel数据
        for (PropertyExcelVo propertyExcelVo : propertyExcelVos) {
            String propertyName = propertyExcelVo.getPropertyName();
            String roomNumber = propertyExcelVo.getRoomNumber();
            String keyName = propertyExcelVo.getUnit() + "-" + propertyExcelVo.getFloor() + "-" + propertyExcelVo.getRoomNumber();
            // String setKeyName = vo.getUnit() + "-" + vo.getFloor() + "-" + vo.getRoomNumber() + "-" + vo.getPropertyName();
            //验证长度
            if (propertyName.length() > CommonConstants.PROPERTY_NAME_MAX_LENGTH
                    || roomNumber.length() > CommonConstants.ROOM_NUMBER_MAX_LENGTH
                    || propertyExcelVo.getUnit().length() > CommonConstants.UNIT_MAX_LENGTH
                    || propertyExcelVo.getFloor().length() > CommonConstants.FLOOR_MAX_LENGTH) {
                //fillData(propertyExcelVo, errList);
                propertyExcelVo.setCheckMsg("字段格式非法");
                errList.add(propertyExcelVo);
                continue;
            }
            //判断数据库是否已经存在该房子名
            if (acsPropertyFactory.isHavePersistData(propertyExcelVo)) {
                //该房屋名字已经存在
                //fillData(vo, errList);
                propertyExcelVo.setCheckMsg("房屋名已存在");
                errList.add(propertyExcelVo);
                continue;
            }
            //判断数据库是否已经存在 单元-楼层-房间号
            if (acsPropertyFactory.isHaveUfrData(propertyExcelVo)) {
                //该房间已经存在
                //fillData(propertyExcelVo, errList);
                propertyExcelVo.setCheckMsg("单元-楼层-房间号已存在");
                errList.add(propertyExcelVo);
                continue;
            } else {
                ufrData.put(keyName.trim(), "1");
            }
            //新增
            CrmPropertyEntity crmPropertyEntity = new CrmPropertyEntity();
            BeanUtils.copyProperties(propertyExcelVo, crmPropertyEntity);
            crmPropertyEntity.createId();
            crmPropertyEntity.setShortName("");
            crmPropertyEntity.setProjectCode(projectCode);
            crmPropertyEntity.setBuildingCode(buildingCode);
            crmPropertyEntity.setBuildingName(buildingName);
            crmPropertyEntity.setPropertyCode(UUID.randomUUID().toString().replace("-", ""));
            crmPropertyEntity.setActiveFlag(BasePlatEntity.ACTIVE_FLAG_NORMAL);
            crmPropertyEntity.setDataSource(CrmConstant.DATASOURCE_LOCAL);
            crmPropertyEntity.setOperateUser(getCurrentUser());
            crmPropertyEntity.setOperateDate(DateFormatUtils.format(System.currentTimeMillis(), CommonConstants.DATE_PATTERN_19));
            crmPropertyEntity.setRemarks("excel导入");
            crmPropertyEntity.setTenantLimit(CommonConstants.PROPERTY_TENANT_LIMIT_DEFAULT);
            addList.add(crmPropertyEntity);
        }

 

你可能感兴趣的:(项目开发)