多个区域(省、市、区)匹配少个区域(省、市、区)问题解决方案
前情提要
- 产品有两个分类,主产品与资金方产品(产品表:loan_base_product),先配置产品的信息(产品分类,涉及区域等)
- 每个产品都可以选择一个或多个涉及区域(省市区)(产品区域表:loan_base_product_region)
- 资金方产品表,每个资金方可以设置拥有多个资金方产品(副产品客户表:funding_product)
需求:一个流程项目中(项目主表:loan_item_apply)需要根据主产品筛选出适合的资金方,先选择主产品A,然后根据A产品配置的区域,可以查询出匹配区域的资金方产品,哪个资金方配置了资金方产品B,就可以供流程项目选择
筛选规则:资金方产品的涉及区域包含主产品的涉及区域,比如主产品的涉及区域为:广东省广州市、湖南省长沙市芙蓉区,有四个资金方,资金方一的资金方产品一的涉及区域为:广东省广州市、广东省深圳市、湖南省长沙市;资金方二的资金方产品二的涉及区域为:广东省广州市、广东省深圳市福田区、湖南省郴州市;资金方三的资金方产品三的涉及区域为:广东省、湖南省长沙市;资金方四的资金方产品四涉及区域为:广东省广州市、广东省深圳市龙华区、福建省厦门市;则应该筛选出资金方一的资金方产品一、资金方三的资金方产品三
项目表:loan_item_apply
项目id:item_apply_id(主键)
产品id:product_id
资金方产品表:funding_product
主键id:ccc_id
资金方id:funding_id
产品id:product_id
产品表:loan_base_product
产品id:product_id(主键)
产品分类:product_class
产品区域表:loan_base_product_region
主键:bbbId
产品id:prouctId
省:province
市:city
区:area
解决思路1
- 先获取资金方产品表中的所有信息(即资金方配置的资金方产品)(funding_product表中的所有数据:fundingProductList),获取项目选中的主产品的所有涉及区域(loan_base_product_region,根据主产品id获取的所有数据:regionList)
- 循环遍历fundingProductList,根据产品id获取资金方涉及的区域(loan_base_product_region,根据fundingProductList每一个元素的productId获取的所有数据:fundingRegionList)
- 定义一个匹配表示数count,循环遍历资金方产品区域List(fundingRegionList),在循环里面遍历主产品区域List(regionList),比较省、市、区,如果匹配上则count++,资金方产品的区域如果包含了主产品的区域,那么count的长度就是regionList.size()
- 然后去做相关操作即可
系统代码
/**
* 资金方产品区域匹配
* @param fundingProductList 资金方产品列表
* @param regionList 主产品区域列表
* @return
*/
public List<Long> fundMatching(List<FundingProduct> fundingProductList, List<LoanBaseProductRegion> regionList) {
List<Long> productIdList = new ArrayList<>();
if (null != fundingProductList){
// 匹配资金方
for (FundingProduct fundingProductItem : fundingProductList) {
if (null != fundingProductItem.getFundProducId()){
QueryFilter regionFilter = new QueryFilter();
regionFilter.addFilter("baseProductId", fundingProductItem.getProductId());
// 资金方列表(产品id,区域)
List<LoanBaseProductRegion> fundingRegionList = loanBaseProductRegionService.getBySqlKeyAll(regionFilter, "getFundingRegion");
int count = 0; // 一个区域匹配上就加一,全部匹配上,即等于regionList.size()
// 资金方没有区域则不参与匹配
if (null != fundingRegionList){
for (int i = 0; i < fundingRegionList.size(); i++) { // 遍历资金方产品区域列表与主产品区域列表,比对区域
LoanBaseProductRegion productRegionItem = fundingRegionList.get(i); // 资金方产品区域
for (int j = 0; j < regionList.size(); j++) {
LoanBaseProductRegion item = regionList.get(j); // 主产品区域
if(item.getProvince().equals(productRegionItem.getProvince())) { // 省匹配上
// 判断主产品是否有市,资金方产品是否有市,
if(StringUtil.isNotEmpty(item.getCity()) && StringUtil.isEmpty(productRegionItem.getCity())){ // 主产品有市,资金方产品没有市,则此资金方产品匹配通过
count++;
}else if (StringUtil.isEmpty(item.getCity()) && StringUtil.isEmpty(productRegionItem.getCity())){ // 都没有市,但是省匹配上,则此资金方产品匹配通过
count++;
} else { // 都有市,比对市,相等则看区
if (item.getCity().equals(productRegionItem.getCity())){ // 市匹配上了
if(StringUtil.isNotEmpty(item.getArea()) && StringUtil.isEmpty(productRegionItem.getArea())){ // 主产品有区,资金方产品没有区,则此资金方产品匹配通过
count++;
}else if (StringUtil.isEmpty(item.getArea()) && StringUtil.isEmpty(productRegionItem.getArea())){ // 都没有区,但市匹配上,则此资金方产品通过
count++;
} else{ // 都有区,比对
if (item.getArea().equals(productRegionItem.getArea())){
count++;
}else{
}
}
}
}
}
}
}
}
// 存储匹配上的资金方产品id
if (count == regionList.size()){
productIdList.add(fundingProductItem.getProductId());
}
}
}
}
return productIdList;
}
解决思路2(未实现)
想通过sql,同时属实比较愚笨,后续再看看
心得体会
如果数据无法全部通过sql处理完,就不要纠结,简单分步骤,然后用代码进行处理