分布式:中台仅支持模糊搜索,应用侧仅冗余部分数据且需要精确查找的复杂逻辑处理,附代码

精确搜索中台数据,中台未完全支持所有字段精确搜索,应用侧仅冗余部分数据的复杂逻辑处理

getStoreId()方法获取对应的storeId,用于应用侧的数据查询(因一致性的问题,应用侧仅冗余了storeId字段)!

应用侧: 店铺名精确查询、店铺Id精确查找、memberId精确查找

中台: 1、支持memberId精确、店铺名模糊

2、店铺名唯一、memberId与店铺名、店铺Id的关系: 1:1:1

 

大致思路: 通过memberId、storeName查询中台服务,根据返回的结果做进一步判断(匹配storeId、storeName等信息)!中台对于mermeberId字段仅支持精确查找,故不需对该字段进行过多处理!

写法一:

/**
* 按memberId、storeName字段查找数据
* 精确查找、应该查找到一个的几率最高、则优先考虑查到一条数据的情况
*
**/

private String getStoreId(String storeId, String memberId, String storeName) {
    // 以商家id、storeName初选数据
        if (StringUtils.isNotBlank(storeName) || StringUtils.isNotBlank(memberId)) {
          List<SearchStoresDto> storeRet = searchStoresByParam(storeName, memberId);
             if (storeRet.size() == 1) {// memberId 必定匹配(无需考虑)
                 if (StringUtils.isNotBlank(storeName)){//需考虑storeName空否
                     
                     if (StringUtils.isBlank(storeId)){
                         return storeRet.get(0).getStore_name().equals(storeName)  ? storeRet.get(0).getStore_id() : null;
                     }
                     //需考虑storeId空否,有值需匹配
                     return storeRet.get(0).getStore_id().equals(storeId)  ? storeRet.get(0).getStore_id() : null;
​
                 } else {//storeName空,必定是memberId查回来的数据
                     if (StringUtils.isBlank(storeId)){//storeId空直接返回
                         return storeRet.get(0).getStore_id();
                     }
                     //storeId非空,匹配数据的storeId
                     return storeRet.get(0).getStore_id().equals(storeId)  ? storeRet.get(0).getStore_id() : null;
                 }
            }
            // 以商家id、storeName初选数据为空,没有查到数据直接返回空,无需匹配storeId
            if (CollectionUtils.isEmpty(storeRet)) {
                return null;
            }
            // 必定是storeName查询,且存在查询字段是别的店铺名的子串现象
            if (storeRet.size() > 1) {
                // 应用侧是店铺名精确查找、筛选数据
                List<SearchStoresDto> dtoList = storeRet.stream().filter(a -> a.getStore_name().equals(storeName)).collect(Collectors.toList());
                if (!CollectionUtils.isEmpty(dtoList)) {//精确匹配到数据
                    if (StringUtils.isBlank(storeId)){// 需根据storeId匹配数据
                        return dtoList.get(0).getStore_id();
                    }
                    return dtoList.get(0).getStore_id().equals(storeId)  ? storeId : null;
                } else {
                    return null;
                }
            }
            // memberId、storeName均为空时,可以根据输入的storeId为依据返回,用于应用侧搜索数据        
        return storeId;
    }

写法二

/**
* 按memberId、storeName字段查找数据
* 精确查找、应该查找到一个的几率最高、则优先考虑查到一条数据的情况
*
**/

private String getStoreId(String storeId, String memberId, String storeName) {
        // 以商家id、storeName初选数据
        if (StringUtils.isNotBlank(storeName) || StringUtils.isNotBlank(memberId)) {
            List<SearchStoresDto> storeRet = searchStoresByParam(storeName, memberId);
            if (CollectionUtils.isEmpty(storeRet)) {
                return null;
            } else if (storeRet.size() == 1) {
                if (StringUtils.isNotBlank(storeName)) {
                    if (StringUtils.isBlank(storeId)) {
                        return storeRet.get(0).getStore_name().equals(storeName) ? storeRet.get(0).getStore_id() : null;
                    }
                    return storeRet.get(0).getStore_id().equals(storeId) ? storeId : null;
                }
                // 只找到一条数据、视storeId非空、匹配
                if (StringUtils.isNotBlank(storeId)) {
                    return storeRet.get(0).getStore_id().equals(storeId) ? storeId : null;
                }
                return storeRet.get(0).getStore_id();

            } else { // 存在多条记录、分a、b、c 三种情况
                // a: storeId、storeName同时不为空、匹配
                if (StringUtils.isNotBlank(storeId) && StringUtils.isNotBlank(storeName)) {
                    storeRet = storeRet.stream().filter(storeDto -> storeDto.getStore_id().equals(storeId) && storeDto.getStore_name().equals(storeName)).collect(Collectors.toList());
                    if (CollectionUtils.isEmpty(storeRet)) {
                        return null;
                    }
                    return storeRet.get(0).getStore_id();
                }
                // b: storeId不为空、匹配
                if (StringUtils.isNotBlank(storeId)) {
                    storeRet = storeRet.stream().filter(storeDto -> storeDto.getStore_id().equals(storeId)).collect(Collectors.toList());
                    if (CollectionUtils.isEmpty(storeRet)) {
                        return null;
                    }
                    return storeRet.get(0).getStore_id();
                }
                // c: storeName不为空、匹配
                if (StringUtils.isNotBlank(storeName)) {
                    storeRet = storeRet.stream().filter(storeDto -> storeDto.getStore_name().equals(storeName)).collect(Collectors.toList());
                    if (CollectionUtils.isEmpty(storeRet)) {
                        return null;
                    }
                    return storeRet.get(0).getStore_id();
                }
                return null;
            }
        }
}

 

中台服务支持memberId精确查找、storeName模糊查找、不支持storeId 搜索(或者掉另一个接口查询)

 

/**
     * 通过店铺名、商家账户搜素店铺
     *
     * @param storeName
     * @param memberId
     * @return
     */
    public List<SearchStoresDto> searchStoresByParam(String storeName, String memberId) {
        SearchStoresReqDto searchStoresReqDto = new SearchStoresReqDto();      
        searchStoresReqDto.setMemberId(StringUtils.isNotBlank(memberId) ? memberId : "");
        searchStoresReqDto.setStore_name(StringUtils.isNotBlank(storeName) ? storeName : "");
        searchStoresReqDto.setPage(1);
        searchStoresReqDto.setSize(100);
        BasePageRet<List<SearchStoresDto>> searchStoresRet = shopServer.searchAllStores(searchStoresReqDto);
        return searchStoresRet.getData();
    }
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页