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<String, String> persistDataPool ;
//ufrData:key,单元-楼层-房号
// private Map<String, String> 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);
}