From 77d56ad27c0b5d1533688781fee8217003b3add4 Mon Sep 17 00:00:00 2001 From: ddyd <2073699128@qq.com> Date: Fri, 5 Sep 2025 21:40:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E4=B8=8A=E6=9E=B6=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/controller/SpuInfoController.java | 17 +- .../bookmall/product/dao/AttrDao.java | 6 +- .../bookmall/product/dao/SpuInfoDao.java | 4 +- .../product/feign/SearchFeignService.java | 16 + .../product/feign/WareFeignService.java | 19 + .../bookmall/product/service/AttrService.java | 7 + .../product/service/SkuInfoService.java | 3 + .../product/service/SpuInfoService.java | 10 + .../product/service/impl/AttrServiceImpl.java | 9 + .../service/impl/SkuInfoServiceImpl.java | 7 + .../service/impl/SpuInfoServiceImpl.java | 126 +++++- .../bookmall/product/to/SkuHasStockTo.java | 10 + .../main/resources/mapper/product/AttrDao.xml | 8 +- .../resources/mapper/product/SpuInfoDao.xml | 4 +- .../ware/controller/WareSkuController.java | 17 +- .../bookmall/ware/dao/WareSkuDao.java | 4 +- .../ware/feign/ProductFeignService.java | 2 +- .../bookmall/ware/service/WareSkuService.java | 4 + .../ware/service/impl/WareSkuServiceImpl.java | 22 + .../bookmall/ware/to/SkuHasStockTo.java | 10 + .../main/resources/mapper/ware/WareSkuDao.xml | 4 +- mall-common/mall-common.iml | 1 + mall-common/pom.xml | 6 + .../common/constant/ProductConstant.java | 20 + .../common/exception/BizCodeEnume.java | 3 +- .../bookstore/common/to/es/SkuEsModel.java | 51 +++ .../java/com/bookstore/common/utils/R.java | 17 +- mall-search/.gitattributes | 2 + mall-search/pom.xml | 75 ++++ .../search/MallSearchApplication.java | 16 + .../config/mallElasticSearchConfig.java | 35 ++ .../bookmall/search/constant/EsConstant.java | 6 + .../controller/ElasticSaveController.java | 40 ++ .../search/service/ProductSaveService.java | 12 + .../service/impl/ProductSaveServiceImpl.java | 57 +++ .../src/main/resources/application.properties | 5 + .../src/main/resources/product-mapping.txt | 71 +++ .../search/MallSearchApplicationTests.java | 22 + .../src/views/modules/common/brand-select.vue | 2 - .../modules/common/category-cascader.vue | 2 - .../src/views/modules/product/attrgroup.vue | 403 ++++++++---------- .../src/views/modules/product/baseattr.vue | 2 - .../src/views/modules/product/category.vue | 2 - .../src/views/modules/product/spu.vue | 2 - 44 files changed, 912 insertions(+), 249 deletions(-) create mode 100644 book-product/src/main/java/com/bookstore/bookmall/product/feign/SearchFeignService.java create mode 100644 book-product/src/main/java/com/bookstore/bookmall/product/feign/WareFeignService.java create mode 100644 book-product/src/main/java/com/bookstore/bookmall/product/to/SkuHasStockTo.java create mode 100644 book-ware/src/main/java/com/bookstore/bookmall/ware/to/SkuHasStockTo.java create mode 100644 mall-common/src/main/java/com/bookstore/common/to/es/SkuEsModel.java create mode 100644 mall-search/.gitattributes create mode 100644 mall-search/pom.xml create mode 100644 mall-search/src/main/java/com/bookstore/bookmall/search/MallSearchApplication.java create mode 100644 mall-search/src/main/java/com/bookstore/bookmall/search/config/mallElasticSearchConfig.java create mode 100644 mall-search/src/main/java/com/bookstore/bookmall/search/constant/EsConstant.java create mode 100644 mall-search/src/main/java/com/bookstore/bookmall/search/controller/ElasticSaveController.java create mode 100644 mall-search/src/main/java/com/bookstore/bookmall/search/service/ProductSaveService.java create mode 100644 mall-search/src/main/java/com/bookstore/bookmall/search/service/impl/ProductSaveServiceImpl.java create mode 100644 mall-search/src/main/resources/application.properties create mode 100644 mall-search/src/main/resources/product-mapping.txt create mode 100644 mall-search/src/test/java/com/bookstore/bookmall/search/MallSearchApplicationTests.java diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/controller/SpuInfoController.java b/book-product/src/main/java/com/bookstore/bookmall/product/controller/SpuInfoController.java index 79690e9..373743d 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/controller/SpuInfoController.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/controller/SpuInfoController.java @@ -6,11 +6,7 @@ import java.util.Map; import com.bookstore.bookmall.product.vo.SpuSaveVo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.bookstore.bookmall.product.entity.SpuInfoEntity; import com.bookstore.bookmall.product.service.SpuInfoService; @@ -32,6 +28,17 @@ public class SpuInfoController { @Autowired private SpuInfoService spuInfoService; + + //POST /product/spuinfo/{spuId}/up 商品上架(保存在es) + @PostMapping("/{spuId}/up") + //@RequiresPermissions("product:spuinfo:list") + public R list(@PathVariable("spuId") Long spuId){ + spuInfoService.up(spuId); + + return R.ok(); + } + + /** * 列表 */ diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/dao/AttrDao.java b/book-product/src/main/java/com/bookstore/bookmall/product/dao/AttrDao.java index 4d1ea1c..efa8c77 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/dao/AttrDao.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/dao/AttrDao.java @@ -3,6 +3,9 @@ package com.bookstore.bookmall.product.dao; import com.bookstore.bookmall.product.entity.AttrEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 商品属性 @@ -13,5 +16,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface AttrDao extends BaseMapper { - + + List selectSearchAttrIds(@Param("attrIds") List attrIds); } diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/dao/SpuInfoDao.java b/book-product/src/main/java/com/bookstore/bookmall/product/dao/SpuInfoDao.java index 9079136..4732a6e 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/dao/SpuInfoDao.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/dao/SpuInfoDao.java @@ -3,6 +3,7 @@ package com.bookstore.bookmall.product.dao; import com.bookstore.bookmall.product.entity.SpuInfoEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * spu信息 @@ -13,5 +14,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface SpuInfoDao extends BaseMapper { - + + void updateSpuStatus(@Param("spuId") Long spuId, @Param("code") int code); } diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/feign/SearchFeignService.java b/book-product/src/main/java/com/bookstore/bookmall/product/feign/SearchFeignService.java new file mode 100644 index 0000000..9eed538 --- /dev/null +++ b/book-product/src/main/java/com/bookstore/bookmall/product/feign/SearchFeignService.java @@ -0,0 +1,16 @@ +package com.bookstore.bookmall.product.feign; + +import com.bookstore.common.to.es.SkuEsModel; +import com.bookstore.common.utils.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient("mall-search") +public interface SearchFeignService { + + @PostMapping("/search/save/product") + R productStatusUp(@RequestBody List skuEsModels); +} diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/feign/WareFeignService.java b/book-product/src/main/java/com/bookstore/bookmall/product/feign/WareFeignService.java new file mode 100644 index 0000000..f9f422d --- /dev/null +++ b/book-product/src/main/java/com/bookstore/bookmall/product/feign/WareFeignService.java @@ -0,0 +1,19 @@ +package com.bookstore.bookmall.product.feign; + + +import com.bookstore.bookmall.product.to.SkuHasStockTo; +import com.bookstore.common.utils.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient("mall-ware") +public interface WareFeignService { + + //查询sku是否有库存 + @PostMapping("ware/waresku/hasstock") + R getSkusHasStock(@RequestBody List skuIds); + +} diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/service/AttrService.java b/book-product/src/main/java/com/bookstore/bookmall/product/service/AttrService.java index 91cfe4a..e52a58f 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/service/AttrService.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/service/AttrService.java @@ -32,6 +32,13 @@ public interface AttrService extends IService { PageUtils getNoRelationAttr(Map params, Long attrgroupId); + + /** + * 在指定的所有集合里,挑出检索属性 + * @param attrIds + * @return + */ + List selectSearchAttrIds(List attrIds); } diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/service/SkuInfoService.java b/book-product/src/main/java/com/bookstore/bookmall/product/service/SkuInfoService.java index 6a15a54..2c82ec1 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/service/SkuInfoService.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/service/SkuInfoService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.bookstore.common.utils.PageUtils; import com.bookstore.bookmall.product.entity.SkuInfoEntity; +import java.util.List; import java.util.Map; /** @@ -20,5 +21,7 @@ public interface SkuInfoService extends IService { void saveSkuInfo(SkuInfoEntity skuInfoEntity); PageUtils queryPageByCondition(Map params); + + List getSkusBySpuId(Long spuId); } diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/service/SpuInfoService.java b/book-product/src/main/java/com/bookstore/bookmall/product/service/SpuInfoService.java index 5c1cc7b..18e3cf7 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/service/SpuInfoService.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/service/SpuInfoService.java @@ -23,5 +23,15 @@ public interface SpuInfoService extends IService { void saveBaseSpuInfo(SpuInfoEntity spuInfoEntity); PageUtils queryPageByCondition(Map params); + + /* + * @Description: 商品上架 + * @param: spuId + * @return: + * @Author: + * @date: + */ + + void up(Long spuId); } diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/AttrServiceImpl.java b/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/AttrServiceImpl.java index 55e21d3..591a1fa 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/AttrServiceImpl.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/AttrServiceImpl.java @@ -266,5 +266,14 @@ public class AttrServiceImpl extends ServiceImpl implements return pageUtils; } + @Override + public List selectSearchAttrIds(List attrIds) { + // SELECT attr_id FROM `pms_attr` WHERE attr_id IN (?) AND search_type = 1 + + return baseMapper.selectSearchAttrIds(attrIds); + + + } + } \ No newline at end of file diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SkuInfoServiceImpl.java b/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SkuInfoServiceImpl.java index 43abd7f..20cda6b 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SkuInfoServiceImpl.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SkuInfoServiceImpl.java @@ -4,6 +4,7 @@ import com.mysql.cj.util.StringUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -88,4 +89,10 @@ public class SkuInfoServiceImpl extends ServiceImpl i return new PageUtils(page); } + @Override + public List getSkusBySpuId(Long spuId){ + List skus = this.list(new QueryWrapper().eq("spu_id", spuId)); + return skus; + } + } \ No newline at end of file diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SpuInfoServiceImpl.java b/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SpuInfoServiceImpl.java index 9ed08a1..1564f3a 100644 --- a/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SpuInfoServiceImpl.java +++ b/book-product/src/main/java/com/bookstore/bookmall/product/service/impl/SpuInfoServiceImpl.java @@ -1,11 +1,17 @@ package com.bookstore.bookmall.product.service.impl; +import com.alibaba.fastjson.TypeReference; import com.bookstore.bookmall.product.entity.*; import com.bookstore.bookmall.product.feign.CouponFeignService; +import com.bookstore.bookmall.product.feign.SearchFeignService; +import com.bookstore.bookmall.product.feign.WareFeignService; import com.bookstore.bookmall.product.service.*; +import com.bookstore.bookmall.product.to.SkuHasStockTo; import com.bookstore.bookmall.product.vo.*; +import com.bookstore.common.constant.ProductConstant; import com.bookstore.common.to.SkuReductionTo; import com.bookstore.common.to.SpuBoundsTo; +import com.bookstore.common.to.es.SkuEsModel; import com.bookstore.common.utils.R; import com.fasterxml.jackson.databind.annotation.JsonAppend; import com.mysql.cj.util.StringUtils; @@ -16,9 +22,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -50,6 +54,14 @@ public class SpuInfoServiceImpl extends ServiceImpl i SkuSaleAttrValueService skuSaleAttrValueService; @Autowired CouponFeignService couponFeignService; + @Autowired + BrandService brandService; + @Autowired + CategoryService categoryService; + @Autowired + WareFeignService wareFeignService; + @Autowired + SearchFeignService searchFeignService; @Override public PageUtils queryPage(Map params) { @@ -232,5 +244,113 @@ public class SpuInfoServiceImpl extends ServiceImpl i return new PageUtils(page); } + //商品上架 + @Override + public void up(Long spuId) { + + //查出所有skuinfo + List skus = skuInfoService.getSkusBySpuId(spuId); + + //TODO 查出当前sku可以被检索的规格属性 + + List valueEntities = valueService.baseAttrlistforspu(spuId); + List attrIds = valueEntities.stream().map(entity -> { + return entity.getAttrId(); + }).collect(Collectors.toList()); + + List selectSearchAttrs = attrService.selectSearchAttrIds(attrIds); + Set idSet = new HashSet<>(selectSearchAttrs); + + + List attrsList = valueEntities.stream().filter(item -> { + return idSet.contains(item.getAttrId()); + }).map(item->{ + SkuEsModel.Attrs attrs1= new SkuEsModel.Attrs(); + BeanUtils.copyProperties(item, attrs1); + return attrs1; + }).collect(Collectors.toList()); + + List skuIds = skus.stream().map(item -> { + return item.getSkuId(); + }).collect(Collectors.toList()); + + Map stockMap = null; + try { + //TODO 远程调用库存服务,查询是否有库存 + R skusHasStock = wareFeignService.getSkusHasStock(skuIds); + TypeReference> typeReference = new TypeReference>() { + }; + stockMap = skusHasStock.getData(typeReference).stream() + .collect(Collectors.toMap(SkuHasStockTo::getSkuId, item -> item.getHasStock())); + }catch (Exception e) { + log.error("库存服务查询异常:原因{}", e); + } + + Map finalStockMap = stockMap; + List esModels = skus.stream().map((sku) -> { + //组装需要的数据 + SkuEsModel skuEsModel = new SkuEsModel(); + BeanUtils.copyProperties(sku, skuEsModel); + + //skuPrice, skuImg, hotStock, hotScore + skuEsModel.setSkuPrice(sku.getPrice()); + skuEsModel.setSkuImg(sku.getSkuDefaultImg()); + //hotStock + if (finalStockMap == null) { + skuEsModel.setHasStock(true); + }else { + skuEsModel.setHasStock(finalStockMap.get(sku.getSkuId())); + } + //TODO 热度评分 默认0 + skuEsModel.setHotScore(0L); + + +// /* +// * private String brandName; +// +// private String brandImg; +// +// private String catalogName; +// +// * */ + + BrandEntity brand = brandService.getById(sku.getBrandId()); + skuEsModel.setBrandName(brand.getName()); + skuEsModel.setBrandImg(brand.getLogo()); + + CategoryEntity categoryEntity = categoryService.getById(sku.getCatalogId()); + skuEsModel.setCatalogName(categoryEntity.getName()); + + +// @Data +// public static class Attrs { +// +// private Long attrId; +// +// private String attrName; +// +// private String attrValue; +// +// } + skuEsModel.setAttrs(attrsList); + + + + return skuEsModel; + }).collect(Collectors.toList()); + + //TODO 将数据发送给es保存 + R r = searchFeignService.productStatusUp(esModels); + if (r.getCode() == 0) { + //远程调用成功 + //TODO 修改商品上架状态 + baseMapper.updateSpuStatus(spuId, ProductConstant.StatusEnum.SPU_UP.getCode()); + }else { + //远程调用失败 + //重复调用,接口幂等性 + } + } + + } \ No newline at end of file diff --git a/book-product/src/main/java/com/bookstore/bookmall/product/to/SkuHasStockTo.java b/book-product/src/main/java/com/bookstore/bookmall/product/to/SkuHasStockTo.java new file mode 100644 index 0000000..ca30825 --- /dev/null +++ b/book-product/src/main/java/com/bookstore/bookmall/product/to/SkuHasStockTo.java @@ -0,0 +1,10 @@ +package com.bookstore.bookmall.product.to; + + +import lombok.Data; + +@Data +public class SkuHasStockTo { + private Long skuId; + private Boolean hasStock; +} diff --git a/book-product/src/main/resources/mapper/product/AttrDao.xml b/book-product/src/main/resources/mapper/product/AttrDao.xml index 2b86b96..df763c2 100644 --- a/book-product/src/main/resources/mapper/product/AttrDao.xml +++ b/book-product/src/main/resources/mapper/product/AttrDao.xml @@ -16,6 +16,12 @@ - + \ No newline at end of file diff --git a/book-product/src/main/resources/mapper/product/SpuInfoDao.xml b/book-product/src/main/resources/mapper/product/SpuInfoDao.xml index a8c9509..fdcc6ab 100644 --- a/book-product/src/main/resources/mapper/product/SpuInfoDao.xml +++ b/book-product/src/main/resources/mapper/product/SpuInfoDao.xml @@ -15,6 +15,8 @@ - + + UPDATE `pms_spu_info` SET publish_status=#{code}, update_time=NOW() WHERE id=#{spuId} + \ No newline at end of file diff --git a/book-ware/src/main/java/com/bookstore/bookmall/ware/controller/WareSkuController.java b/book-ware/src/main/java/com/bookstore/bookmall/ware/controller/WareSkuController.java index 1dd6427..af009a4 100644 --- a/book-ware/src/main/java/com/bookstore/bookmall/ware/controller/WareSkuController.java +++ b/book-ware/src/main/java/com/bookstore/bookmall/ware/controller/WareSkuController.java @@ -1,15 +1,13 @@ package com.bookstore.bookmall.ware.controller; import java.util.Arrays; +import java.util.List; import java.util.Map; +import com.bookstore.bookmall.ware.to.SkuHasStockTo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.bookstore.bookmall.ware.entity.WareSkuEntity; import com.bookstore.bookmall.ware.service.WareSkuService; @@ -31,6 +29,15 @@ public class WareSkuController { @Autowired private WareSkuService wareSkuService; + //查询sku是否有库存 + @PostMapping("/hasstock") + public R getSkusHasStock(@RequestBody List skuIds) { + List vos = wareSkuService.getSkusHasStock(skuIds); + + return R.ok().setData(vos); + } + + /** * 列表 */ diff --git a/book-ware/src/main/java/com/bookstore/bookmall/ware/dao/WareSkuDao.java b/book-ware/src/main/java/com/bookstore/bookmall/ware/dao/WareSkuDao.java index b4ef605..6fd0d55 100644 --- a/book-ware/src/main/java/com/bookstore/bookmall/ware/dao/WareSkuDao.java +++ b/book-ware/src/main/java/com/bookstore/bookmall/ware/dao/WareSkuDao.java @@ -3,6 +3,7 @@ package com.bookstore.bookmall.ware.dao; import com.bookstore.bookmall.ware.entity.WareSkuEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 商品库存 @@ -13,5 +14,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface WareSkuDao extends BaseMapper { - + + Long getSkuStock(Long skuId); } diff --git a/book-ware/src/main/java/com/bookstore/bookmall/ware/feign/ProductFeignService.java b/book-ware/src/main/java/com/bookstore/bookmall/ware/feign/ProductFeignService.java index 7aea882..705f0e5 100644 --- a/book-ware/src/main/java/com/bookstore/bookmall/ware/feign/ProductFeignService.java +++ b/book-ware/src/main/java/com/bookstore/bookmall/ware/feign/ProductFeignService.java @@ -4,5 +4,5 @@ package com.bookstore.bookmall.ware.feign; import org.springframework.cloud.openfeign.FeignClient; @FeignClient("book-product") -public class ProductFeignService { +public interface ProductFeignService { } diff --git a/book-ware/src/main/java/com/bookstore/bookmall/ware/service/WareSkuService.java b/book-ware/src/main/java/com/bookstore/bookmall/ware/service/WareSkuService.java index a96ca2f..ae61dae 100644 --- a/book-ware/src/main/java/com/bookstore/bookmall/ware/service/WareSkuService.java +++ b/book-ware/src/main/java/com/bookstore/bookmall/ware/service/WareSkuService.java @@ -1,9 +1,11 @@ package com.bookstore.bookmall.ware.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.bookstore.bookmall.ware.to.SkuHasStockTo; import com.bookstore.common.utils.PageUtils; import com.bookstore.bookmall.ware.entity.WareSkuEntity; +import java.util.List; import java.util.Map; /** @@ -16,5 +18,7 @@ import java.util.Map; public interface WareSkuService extends IService { PageUtils queryPage(Map params); + + List getSkusHasStock(List skuIds); } diff --git a/book-ware/src/main/java/com/bookstore/bookmall/ware/service/impl/WareSkuServiceImpl.java b/book-ware/src/main/java/com/bookstore/bookmall/ware/service/impl/WareSkuServiceImpl.java index 1a156fe..1d5c860 100644 --- a/book-ware/src/main/java/com/bookstore/bookmall/ware/service/impl/WareSkuServiceImpl.java +++ b/book-ware/src/main/java/com/bookstore/bookmall/ware/service/impl/WareSkuServiceImpl.java @@ -1,8 +1,13 @@ package com.bookstore.bookmall.ware.service.impl; +import com.bookstore.bookmall.ware.to.SkuHasStockTo; import com.mysql.cj.util.StringUtils; import org.springframework.stereotype.Service; + +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -43,4 +48,21 @@ public class WareSkuServiceImpl extends ServiceImpl i return new PageUtils(page); } + @Override + public List getSkusHasStock(List skuIds) { + List collect = skuIds.stream().map(skuId -> { + SkuHasStockTo vo = new SkuHasStockTo(); + + //查询当前库存 + //SELECT SUM(stock-stock_locked) FROM `wms_ware_sku` WHERE sku_id=1 + Long count = baseMapper.getSkuStock(skuId); + + vo.setHasStock(count == null ? false : count>0); + vo.setSkuId(skuId); + return vo; + }).collect(Collectors.toList()); + + return collect; + } + } \ No newline at end of file diff --git a/book-ware/src/main/java/com/bookstore/bookmall/ware/to/SkuHasStockTo.java b/book-ware/src/main/java/com/bookstore/bookmall/ware/to/SkuHasStockTo.java new file mode 100644 index 0000000..71280c6 --- /dev/null +++ b/book-ware/src/main/java/com/bookstore/bookmall/ware/to/SkuHasStockTo.java @@ -0,0 +1,10 @@ +package com.bookstore.bookmall.ware.to; + + +import lombok.Data; + +@Data +public class SkuHasStockTo { + private Long skuId; + private Boolean hasStock; +} diff --git a/book-ware/src/main/resources/mapper/ware/WareSkuDao.xml b/book-ware/src/main/resources/mapper/ware/WareSkuDao.xml index 9b5ada7..4340385 100644 --- a/book-ware/src/main/resources/mapper/ware/WareSkuDao.xml +++ b/book-ware/src/main/resources/mapper/ware/WareSkuDao.xml @@ -12,6 +12,8 @@ - + \ No newline at end of file diff --git a/mall-common/mall-common.iml b/mall-common/mall-common.iml index d1c70a5..0b4ccbd 100644 --- a/mall-common/mall-common.iml +++ b/mall-common/mall-common.iml @@ -39,6 +39,7 @@ + diff --git a/mall-common/pom.xml b/mall-common/pom.xml index dd9fa07..a47b9af 100644 --- a/mall-common/pom.xml +++ b/mall-common/pom.xml @@ -51,6 +51,12 @@ validation-api 2.0.1.Final + + + com.alibaba + fastjson + 1.2.79 + diff --git a/mall-common/src/main/java/com/bookstore/common/constant/ProductConstant.java b/mall-common/src/main/java/com/bookstore/common/constant/ProductConstant.java index b0fdf65..40eb5f6 100644 --- a/mall-common/src/main/java/com/bookstore/common/constant/ProductConstant.java +++ b/mall-common/src/main/java/com/bookstore/common/constant/ProductConstant.java @@ -21,4 +21,24 @@ public class ProductConstant { } + public enum StatusEnum{ + SPU_NEW(0, "新建"), SPU_UP(1,"商品上架"), SPU_DOWN(2,"商品下架"); + + private int code; + private String msg; + + StatusEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public int getCode() { + return code; + } + public String getMsg() { + return msg; + } + + } + } diff --git a/mall-common/src/main/java/com/bookstore/common/exception/BizCodeEnume.java b/mall-common/src/main/java/com/bookstore/common/exception/BizCodeEnume.java index 3b0ce57..957c8bf 100644 --- a/mall-common/src/main/java/com/bookstore/common/exception/BizCodeEnume.java +++ b/mall-common/src/main/java/com/bookstore/common/exception/BizCodeEnume.java @@ -17,7 +17,8 @@ import java.sql.Struct; public enum BizCodeEnume { UNKNOW_EXCEPTION(10000, "系统未知错误"), - VAILD_EXCEPTION(10001, "参数格式校验失败"); + VAILD_EXCEPTION(10001, "参数格式校验失败"), + PRODUCT_EXPRESSION(11000, "商品上架异常"); private int code; private String message; diff --git a/mall-common/src/main/java/com/bookstore/common/to/es/SkuEsModel.java b/mall-common/src/main/java/com/bookstore/common/to/es/SkuEsModel.java new file mode 100644 index 0000000..762cbf3 --- /dev/null +++ b/mall-common/src/main/java/com/bookstore/common/to/es/SkuEsModel.java @@ -0,0 +1,51 @@ +package com.bookstore.common.to.es; + + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class SkuEsModel { + + private Long skuId; + + private Long spuId; + + private String skuTitle; + + private BigDecimal skuPrice; + + private String skuImg; + + private Long saleCount; + + private Boolean hasStock; + + private Long hotScore; + + private Long brandId; + + private Long catalogId; + + private String brandName; + + private String brandImg; + + private String catalogName; + + private List attrs; + + @Data + public static class Attrs { + + private Long attrId; + + private String attrName; + + private String attrValue; + + } + +} diff --git a/mall-common/src/main/java/com/bookstore/common/utils/R.java b/mall-common/src/main/java/com/bookstore/common/utils/R.java index 50fbf0b..7ae3bbf 100644 --- a/mall-common/src/main/java/com/bookstore/common/utils/R.java +++ b/mall-common/src/main/java/com/bookstore/common/utils/R.java @@ -8,6 +8,8 @@ package com.bookstore.common.utils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; import org.apache.http.HttpStatus; import java.util.HashMap; @@ -18,9 +20,22 @@ import java.util.Map; * * @author Mark sunlightcs@gmail.com */ +//!!!!以后设计R时加上泛型 public class R extends HashMap { private static final long serialVersionUID = 1L; - + + public T getData(TypeReference typeReference) { + Object data = get("data"); + String s = JSON.toJSONString(data); + T t = JSON.parseObject(s, typeReference); + return t; + } + + public R setData(Object data){ + put("data", data); + return this; + } + public R() { put("code", 0); put("msg", "success"); diff --git a/mall-search/.gitattributes b/mall-search/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/mall-search/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/mall-search/pom.xml b/mall-search/pom.xml new file mode 100644 index 0000000..81e010f --- /dev/null +++ b/mall-search/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.1 + + + com.bookstore.bookmall + mall-search + 0.0.1-SNAPSHOT + mall-search + Demo project for Spring Boot + + + + + + + + + + + + + + + 1.8 + 7.11.1 + + + + com.bookstore.bookmall + mall-common + 0.0.1-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.11.1 + + + junit + junit + 4.13.2 + test + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/mall-search/src/main/java/com/bookstore/bookmall/search/MallSearchApplication.java b/mall-search/src/main/java/com/bookstore/bookmall/search/MallSearchApplication.java new file mode 100644 index 0000000..5ef253b --- /dev/null +++ b/mall-search/src/main/java/com/bookstore/bookmall/search/MallSearchApplication.java @@ -0,0 +1,16 @@ +package com.bookstore.bookmall.search; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; + +@EnableDiscoveryClient +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) +public class MallSearchApplication { + + public static void main(String[] args) { + SpringApplication.run(MallSearchApplication.class, args); + } + +} diff --git a/mall-search/src/main/java/com/bookstore/bookmall/search/config/mallElasticSearchConfig.java b/mall-search/src/main/java/com/bookstore/bookmall/search/config/mallElasticSearchConfig.java new file mode 100644 index 0000000..14e449b --- /dev/null +++ b/mall-search/src/main/java/com/bookstore/bookmall/search/config/mallElasticSearchConfig.java @@ -0,0 +1,35 @@ +package com.bookstore.bookmall.search.config; + + + + +import org.apache.http.HttpHost; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class mallElasticSearchConfig { + + public static final RequestOptions COMMON_OPTIONS; + static { + RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder(); +// builder.addHeader("Authorization", "Bearer " + TOKEN); +// builder.setHttpAsyncResponseConsumerFactory( +// new HttpAsyncResponseConsumerFactory +// .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024)); + COMMON_OPTIONS = builder.build(); + } + + + @Bean + public RestHighLevelClient esRestClient() { + RestHighLevelClient client = new RestHighLevelClient( + RestClient.builder( + new HttpHost("192.168.88.131", 9200, "http"))); + return client; + } + +} diff --git a/mall-search/src/main/java/com/bookstore/bookmall/search/constant/EsConstant.java b/mall-search/src/main/java/com/bookstore/bookmall/search/constant/EsConstant.java new file mode 100644 index 0000000..4e346ed --- /dev/null +++ b/mall-search/src/main/java/com/bookstore/bookmall/search/constant/EsConstant.java @@ -0,0 +1,6 @@ +package com.bookstore.bookmall.search.constant; + + +public class EsConstant { + public static final String PRODUCT_INDEX = "product"; //sku数据在es中的索引 +} diff --git a/mall-search/src/main/java/com/bookstore/bookmall/search/controller/ElasticSaveController.java b/mall-search/src/main/java/com/bookstore/bookmall/search/controller/ElasticSaveController.java new file mode 100644 index 0000000..a17571b --- /dev/null +++ b/mall-search/src/main/java/com/bookstore/bookmall/search/controller/ElasticSaveController.java @@ -0,0 +1,40 @@ +package com.bookstore.bookmall.search.controller; + +import com.bookstore.bookmall.search.service.ProductSaveService; +import com.bookstore.common.exception.BizCodeEnume; +import com.bookstore.common.to.es.SkuEsModel; +import com.bookstore.common.utils.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +import java.util.List; + +@Slf4j +@RequestMapping("/search/save") +@RestController +public class ElasticSaveController { + + @Autowired + ProductSaveService productSaveService; + //上架商品 + @PostMapping("/product") + public R productStatusUp(@RequestBody List skuEsModels) { + boolean b = false; + try { + b = productSaveService.productStatusUp(skuEsModels); + }catch (Exception e){ + log.error("商品上架异常:{}",e); + return R.error(BizCodeEnume.PRODUCT_EXPRESSION.getCode(), BizCodeEnume.PRODUCT_EXPRESSION.getMessage()); + } + if (b) { + return R.ok(); + } else { + return R.error(BizCodeEnume.PRODUCT_EXPRESSION.getCode(), BizCodeEnume.PRODUCT_EXPRESSION.getMessage()); + } + } +} diff --git a/mall-search/src/main/java/com/bookstore/bookmall/search/service/ProductSaveService.java b/mall-search/src/main/java/com/bookstore/bookmall/search/service/ProductSaveService.java new file mode 100644 index 0000000..45ea1d9 --- /dev/null +++ b/mall-search/src/main/java/com/bookstore/bookmall/search/service/ProductSaveService.java @@ -0,0 +1,12 @@ +package com.bookstore.bookmall.search.service; + + +import com.bookstore.common.to.es.SkuEsModel; + +import java.io.IOException; +import java.util.List; + +public interface ProductSaveService { + + boolean productStatusUp(List skuEsModels) throws IOException; +} diff --git a/mall-search/src/main/java/com/bookstore/bookmall/search/service/impl/ProductSaveServiceImpl.java b/mall-search/src/main/java/com/bookstore/bookmall/search/service/impl/ProductSaveServiceImpl.java new file mode 100644 index 0000000..c1e8075 --- /dev/null +++ b/mall-search/src/main/java/com/bookstore/bookmall/search/service/impl/ProductSaveServiceImpl.java @@ -0,0 +1,57 @@ +package com.bookstore.bookmall.search.service.impl; + + +import com.bookstore.bookmall.search.config.mallElasticSearchConfig; +import com.bookstore.bookmall.search.constant.EsConstant; +import com.bookstore.bookmall.search.service.ProductSaveService; +import com.bookstore.common.to.es.SkuEsModel; +import lombok.extern.slf4j.Slf4j; +import org.elasticsearch.action.bulk.BulkRequest; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.common.xcontent.XContentType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import com.alibaba.fastjson.JSON; + +@Slf4j +@Service +public class ProductSaveServiceImpl implements ProductSaveService { + + @Autowired + RestHighLevelClient restHighLevelClient; + + @Override + public boolean productStatusUp(List skuEsModels) throws IOException { + //保存到es + //1、给es中建立索引,product,建立好映射关系 + + //2、在es中保存这些数据 + BulkRequest bulkRequest = new BulkRequest(); + for (SkuEsModel skuEsModel : skuEsModels) { + + IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX); + indexRequest.id(skuEsModel.getSkuId().toString()); + String s = JSON.toJSONString(skuEsModel); + indexRequest.source(s, XContentType.JSON); + + bulkRequest.add(indexRequest); + } + BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, mallElasticSearchConfig.COMMON_OPTIONS); + + boolean b = bulk.hasFailures(); + List collect = Arrays.stream(bulk.getItems()).map(item -> { + return item.getId(); + }).collect(Collectors.toList()); + + log.error("商品上架错误:{}", collect); + return !b; + } +} diff --git a/mall-search/src/main/resources/application.properties b/mall-search/src/main/resources/application.properties new file mode 100644 index 0000000..770e1cf --- /dev/null +++ b/mall-search/src/main/resources/application.properties @@ -0,0 +1,5 @@ +spring.application.name=mall-search + +spring.cloud.nacos.config.server-addr=127.0.0.1:8848 + +server.port=12000 \ No newline at end of file diff --git a/mall-search/src/main/resources/product-mapping.txt b/mall-search/src/main/resources/product-mapping.txt new file mode 100644 index 0000000..42a6204 --- /dev/null +++ b/mall-search/src/main/resources/product-mapping.txt @@ -0,0 +1,71 @@ +PUT product +{ + "mappings": { + "properties": { + "skuId": { + "type": "long" + }, + "spuId": { + "type": "long" + }, + "skuTitle": { + "type": "text", + "analyzer": "ik_smart" + }, + "skuPrice": { + "type": "keyword" + }, + "skuImg": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "saleCount": { + "type": "long" + }, + "hosStock": { + "type": "boolean" + }, + "hotScore": { + "type": "long" + }, + "brandId": { + "type": "long" + }, + "catelogId": { + "type": "long" + }, + "brandName": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "brandImg": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "catelogName": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "attrs": { + "type": "nested", + "properties": { + "attrId": { + "type": "long" + }, + "attrName": { + "type": "keyword", + "index": false, + "doc_values": false + }, + "attrValue": { + "type": "keyword" + } + } + } + } + } +} \ No newline at end of file diff --git a/mall-search/src/test/java/com/bookstore/bookmall/search/MallSearchApplicationTests.java b/mall-search/src/test/java/com/bookstore/bookmall/search/MallSearchApplicationTests.java new file mode 100644 index 0000000..ed2322b --- /dev/null +++ b/mall-search/src/test/java/com/bookstore/bookmall/search/MallSearchApplicationTests.java @@ -0,0 +1,22 @@ +package com.bookstore.bookmall.search; + +import org.elasticsearch.client.RestHighLevelClient; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +class MallSearchApplicationTests { + + @Autowired + private RestHighLevelClient client; + + @Test + public void contextLoads() { + System.out.println(client); + } + +} diff --git a/renren-fast-vue/src/views/modules/common/brand-select.vue b/renren-fast-vue/src/views/modules/common/brand-select.vue index 6e2c108..ea5dda6 100644 --- a/renren-fast-vue/src/views/modules/common/brand-select.vue +++ b/renren-fast-vue/src/views/modules/common/brand-select.vue @@ -76,5 +76,3 @@ export default { activated() {} //如果页面有keep-alive缓存功能,这个函数会触发 }; - - \ No newline at end of file diff --git a/renren-fast-vue/src/views/modules/common/category-cascader.vue b/renren-fast-vue/src/views/modules/common/category-cascader.vue index c211e95..3f99936 100644 --- a/renren-fast-vue/src/views/modules/common/category-cascader.vue +++ b/renren-fast-vue/src/views/modules/common/category-cascader.vue @@ -74,5 +74,3 @@ export default { } }; - - \ No newline at end of file diff --git a/renren-fast-vue/src/views/modules/product/attrgroup.vue b/renren-fast-vue/src/views/modules/product/attrgroup.vue index 62611e3..fc16eff 100644 --- a/renren-fast-vue/src/views/modules/product/attrgroup.vue +++ b/renren-fast-vue/src/views/modules/product/attrgroup.vue @@ -1,217 +1,186 @@ - - - - - \ No newline at end of file + + + + + diff --git a/renren-fast-vue/src/views/modules/product/baseattr.vue b/renren-fast-vue/src/views/modules/product/baseattr.vue index ba25b2b..ba2d741 100644 --- a/renren-fast-vue/src/views/modules/product/baseattr.vue +++ b/renren-fast-vue/src/views/modules/product/baseattr.vue @@ -247,5 +247,3 @@ export default { } }; - - \ No newline at end of file diff --git a/renren-fast-vue/src/views/modules/product/category.vue b/renren-fast-vue/src/views/modules/product/category.vue index 4db7cc1..5b5bd4a 100644 --- a/renren-fast-vue/src/views/modules/product/category.vue +++ b/renren-fast-vue/src/views/modules/product/category.vue @@ -379,5 +379,3 @@ export default { activated() {} //如果页面有keep-alive缓存功能,这个函数会触发 }; - - \ No newline at end of file diff --git a/renren-fast-vue/src/views/modules/product/spu.vue b/renren-fast-vue/src/views/modules/product/spu.vue index daaa309..c15e42e 100644 --- a/renren-fast-vue/src/views/modules/product/spu.vue +++ b/renren-fast-vue/src/views/modules/product/spu.vue @@ -91,5 +91,3 @@ export default { activated() {} //如果页面有keep-alive缓存功能,这个函数会触发 }; - - \ No newline at end of file