建设拼多多一样网站需要多少钱,免费的网页游戏,北京商场需要几天核酸,上海专业微信网站建设文章目录 一#xff0c;131-商城业务-商品上架-构造sku检索属性1#xff0c;开发目标2#xff0c;详细设计2.1#xff0c;根据spu_id获取所有的规格参数2.2#xff0c;根据上一步中查询结果进一步确认是否可搜索2.3#xff0c;将可搜索的属性封装到Java模型中 二#xf… 文章目录 一131-商城业务-商品上架-构造sku检索属性1开发目标2详细设计2.1根据spu_id获取所有的规格参数2.2根据上一步中查询结果进一步确认是否可搜索2.3将可搜索的属性封装到Java模型中 二132-商城业务-商品上架-远程查询库存泛型结果封装1开发目标2详细设计2.1 调用库存服务的接口2.2库存服务根据sku_id查询库存量2.3根据查询结果填充模型 一131-商城业务-商品上架-构造sku检索属性
1开发目标
这一节的主要内容是完成获取规格属性信息的功能
从数据库中获取与 SPU 关联的所有规格属性。筛选出可被用于搜索的属性并转换为 ES 所需的格式。注意点1SPU的规格参数是这个SPU下所有SKU公用的查询一次即可。注意点2规程参数分为两类一类是可搜索的一类是不可搜索的。这里需要的是可搜索的规格参数。
2详细设计
① 从pms_product_attr_value表中根据spu_id查出这个spu下所有的属性。② 根据属性Id从属性表中pms_attr查询属性是否可搜索。③ 将可搜索的属性信息封装到Es的Java模型中。
2.1根据spu_id获取所有的规格参数
ListProductAttrValueEntity baseAttrs productAttrValueService.baseAttrList4Spu(spuId);对应的Service实现非常简单。 public ListProductAttrValueEntity baseAttrList4Spu(Long spuId) {ListProductAttrValueEntity attrValueEntityList this.baseMapper.selectList(new QueryWrapperProductAttrValueEntity().eq(spu_id, spuId));return attrValueEntityList;}2.2根据上一步中查询结果进一步确认是否可搜索
汇总所有属性Id一次性查询出其中所有可搜索的属性Id。
ListLong attrIds baseAttrs.stream().map(ProductAttrValueEntity::getAttrId).collect(Collectors.toList());// 查询可搜索的规格属性ListLong searchAttrIds attrService.selectSearchableAttrs(attrIds);对应的Service实现如下。 Overridepublic ListLong selectSearchableAttrs(ListLong attrIds) {ListLong searchAttrIds this.baseMapper.selectSearchAttrIds(attrIds);return searchAttrIds;}对应的Sql如下。
select idselectSearchAttrIds resultTypejava.lang.LongSELECT attr_id FROM pms_attr WHERE attr_id INforeach collectionattrIds itemid separator, open( close)#{id}/foreachAND search_type 1/select注意search_type 1 表示这个属性可搜索。
2.3将可搜索的属性封装到Java模型中
将前两步的结果结合起来把spu下所有可搜索的属性封装到Java模型中。 SetLong idSet new HashSet(searchAttrIds);ListSkuEsModel.Attrs attrsList baseAttrs.stream().filter(item - idSet.contains(item.getAttrId())).map(item - {SkuEsModel.Attrs attrs new SkuEsModel.Attrs();BeanUtils.copyProperties(item, attrs);return attrs;}).collect(Collectors.toList());二132-商城业务-商品上架-远程查询库存泛型结果封装
1开发目标
获取库存信息
通过远程调用库存服务获取每个 SKU 的库存状态。库存状态用于确定 SKU 是否有货。
2详细设计
① 调用库存服务的接口② 库存服务根据sku_id查询库存量③ 根据查询结果填充模型
2.1 调用库存服务的接口
通过Feign调用库存服务的接口并处理返回结果。 ListLong skuIdList skuInfoEntities.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());R skuHasStock wareFeignService.getSkuHasStock(skuIdList);TypeReferenceListSkuHasStockVo typeReference new TypeReferenceListSkuHasStockVo() {};stockMap skuHasStock.getData(typeReference).stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item - item.getHasStock()));通过Feign将spu下所有的sku_id传递给库存服务。
2.2库存服务根据sku_id查询库存量
① ware服务WareSkuController中定义供调用的接口。 PostMapping(value /hasStock)public R getSkuHasStock(RequestBody ListLong skuIds) {//skuId stockListSkuHasStockVo vos wareSkuService.getSkuHasStock(skuIds);return R.ok().setData(vos);}对应的Service实现如下。 Overridepublic ListSkuHasStockVo getSkuHasStock(ListLong skuIds) {ListSkuHasStockVo skuHasStockVos skuIds.stream().map(item - {Long count this.baseMapper.getSkuStock(item);SkuHasStockVo skuHasStockVo new SkuHasStockVo();skuHasStockVo.setSkuId(item);skuHasStockVo.setHasStock(count null?false:count 0);return skuHasStockVo;}).collect(Collectors.toList());return skuHasStockVos;}对应的Dao层Sql如下逻辑非常简单查询可用库存大于0的sku_id。 select idlistWareIdHasSkuStock resultTypejava.lang.LongSELECTware_idFROMwms_ware_skuWHEREsku_id #{skuId}AND stock - stock_locked 0/select2.3根据查询结果填充模型
调用库存接口查询到结果之后从响应R中取出数据注意因为R本质是一个Map所以需要将Map中的数据序列化为我们需要的类型这里使用了阿里的FastJson工具包中的TypeReference完成这个任务。 R skuHasStock wareFeignService.getSkuHasStock(skuIdList);TypeReferenceListSkuHasStockVo typeReference new TypeReferenceListSkuHasStockVo() {};stockMap skuHasStock.getData(typeReference).stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item - item.getHasStock()));public T T getData(TypeReferenceT typeReference) {Object data get(data); //默认是mapString jsonString JSON.toJSONString(data);T t JSON.parseObject(jsonString, typeReference);return t;}拿到结果之后在遍历Sku的循环体中填充库存信息。 // 4.2 设置库存信息if (finalStockMap null) {esModel.setHasStock(true);} else {esModel.setHasStock(finalStockMap.get(sku.getSkuId()));}这样注意从响应中取得结果的方式是开发中常用的技巧。