在系统sku的设计中,需要代码生成数据
参考链接:电商系统sku设计
以下代码使用深度优先搜索组合生成mall_product_spec表
getProductSpec是数据接口,调用后即可生成代码
dfs是深度优先搜索算法,if用于处理边界值,在dep不加一的情况下执行最后一次排列组合,else为一般情况的递归调用模块,实现主要的属性生成,即value_ids(此属性为valueSpec表的主键id,以字符串格式append,以逗号分隔),生成的ansstr即为mall_product_spec表每一行的values_id。
getValueSpec与getSpecId类似,是数据添加接口,用于新建变量后插入数据库。
public ArrayList<Integer> specIdList=new ArrayList<>();
public ArrayList<String> result= new ArrayList<>();
private Integer productId;
@GetMapping("/productSpec")
private ResultVO genProductSpec(){
for (int i=1;i<52;i++){
this.getValueSpec(i);
}
return ResultVO.success();
}
public void getValueSpec(Integer productId){
this.productId=productId;
specIdList=getSpecId(productId);
specIdList=oneClear(specIdList);
dfs("",0);
for (String str:result){
ProductSpec productSpec= new ProductSpec();
productSpec.setProductId(productId);
productSpec.setValueIds(str);
productSpec.setPrice(new BigDecimal(10));
productSpec.setStock(new BigDecimal(10));
productSpecMapper.add(productSpec);
}
}
public void dfs(String ansstr,int dep){
if(dep>=specIdList.size()){
result.add(ansstr);//排列组合完了,这是一种排列情况
}
else {
List<ValueSpec> valueSpecs = valueSpecMapper.getByProductIdAndSpecId(productId,specIdList.get(dep));
for (ValueSpec valueSpec:valueSpecs){
dfs(ansstr+valueSpec.getId()+",",dep+1);
}
}
}
public ArrayList<Integer> getSpecId(int productId){
List<ValueSpec> valueSpecs=valueSpecMapper.getByProductId(productId);
ArrayList<Integer> resultList= new ArrayList<>();
for (ValueSpec v:valueSpecs){
resultList.add(v.getSpecId());
}
return resultList;
}
public ArrayList<Integer> oneClear(ArrayList<Integer> arr){
Set set = new HashSet();
for (int i=0;i<arr.size();i++){
set.add(arr.get(i));
}
ArrayList<Integer> result= new ArrayList<>();
for (Object ii:set.toArray())result.add((Integer)ii);
return result;
}
getSpecId为了得到数据库mall_value_spec表中的某个product_Id对应的spec_id列表。
onClaer为清空相同值,该方法利用了HashSet的不可重复性来实现去重的逻辑。