Commit 11a7fdb96ea1a9af9368a368146b45f27cc8bf2e

Authored by 曾国涛
1 parent 21febc88

feat(shop): 生成所有产品类别和功能的静态页面

- 新增 generateAllUrl 接口,用于生成所有产品类别和功能的静态页面
- 修改 ProductQueryVO,增加 rootProductCategoryIdIn 字段支持多对顶级分类的查询
- 更新 ProductCagegoryServiceImpl 和 ProductServiceImpl,以支持新的查询方式
- 修复静态页面生成时的产品价格显示问题
shop/src/main/java/com/canrd/shop/controller/ProductController.java
... ... @@ -12,10 +12,7 @@ import com.canrd.shop.module.dto.ImportProductRelatedJournal;
12 12 import com.canrd.shop.module.dto.ProductCategoryDO;
13 13 import com.canrd.shop.module.dto.ProductDO;
14 14 import com.canrd.shop.module.dto.ProductFunctionDO;
15   -import com.canrd.shop.module.vo.ImportRelatedCategoryVo;
16   -import com.canrd.shop.module.vo.ProductCategoryQueryVO;
17   -import com.canrd.shop.module.vo.ProductQueryVO;
18   -import com.canrd.shop.module.vo.ProductVO;
  15 +import com.canrd.shop.module.vo.*;
19 16 import com.canrd.shop.service.*;
20 17 import freemarker.template.Configuration;
21 18 import freemarker.template.Template;
... ... @@ -32,6 +29,8 @@ import org.springframework.web.multipart.MultipartFile;
32 29 import javax.annotation.Resource;
33 30 import java.io.*;
34 31 import java.util.*;
  32 +import java.util.stream.Collectors;
  33 +import java.util.stream.Stream;
35 34  
36 35 /**
37 36 * (Product)表控制层
... ... @@ -81,6 +80,54 @@ public class ProductController {
81 80 return productCategoryService.category(productCategoryQueryVO);
82 81 }
83 82  
  83 + @GetMapping("/generateAllUrl")
  84 + public ServerResult generateAllUrl(){
  85 + ProductCategoryQueryVO productCategoryQueryVO = new ProductCategoryQueryVO();
  86 + ServerResult<ProductCategoryResultVO> category = productCategoryService.category(productCategoryQueryVO);
  87 + ProductCategoryResultVO data = category.getData();
  88 + List<ProductCategoryDisplayVO> rootCategoryList = data.getRootCategoryList();
  89 +
  90 + Map<String, ProductCategoryDisplayVO> name2ProductCategoryDisplayVOMap = rootCategoryList.stream()
  91 + .collect(Collectors.toMap(ProductCategoryDisplayVO::getCategoryDisplayName, v -> v));
  92 +
  93 + List<ProductQueryVO> queries = name2ProductCategoryDisplayVOMap.entrySet().stream()
  94 + .flatMap(entry -> {
  95 + String rootCategoryName = entry.getKey();
  96 + ProductCategoryDisplayVO categoryDisplay = entry.getValue();
  97 + List<String> cateNames = categoryDisplay.getList().stream().map(ProductCategoryVO::getName).collect(Collectors.toList());
  98 + List<String> funNames = Optional.ofNullable(categoryDisplay.getProductFunctions()).orElse(new ArrayList<ProductFunctionVO>())
  99 + .stream().map(ProductFunctionVO::getName).collect(Collectors.toList());
  100 +
  101 + return cateNames.stream().flatMap(cateName -> {
  102 + if (CollUtil.isEmpty(funNames)) {
  103 + return Stream.of(ProductQueryVO.builder()
  104 + .rootProductCategoryName(rootCategoryName)
  105 + .productCategoryName(cateName)
  106 + .pageNo(1)
  107 + .pageSize(20)
  108 + .build());
  109 + } else {
  110 + return funNames.stream().map(funName -> ProductQueryVO.builder()
  111 + .rootProductCategoryName(rootCategoryName)
  112 + .productCategoryName(cateName)
  113 + .productFunctionName(funName)
  114 + .pageNo(1)
  115 + .pageSize(20)
  116 + .build());
  117 + }
  118 + });
  119 + })
  120 + .collect(Collectors.toList());
  121 + queries.forEach(query -> {
  122 + try {
  123 + generateList(query,"canrd@2024");
  124 + } catch (IOException | TemplateException e) {
  125 + throw new RuntimeException(e);
  126 + }
  127 + });
  128 + return ServerResult.success();
  129 + }
  130 +
84 131 @GetMapping("/categorySearch")
85 132 public ServerResult categorySearch(ProductQueryVO productQueryVO){
86 133 return productService.categorySearch(productQueryVO);
... ... @@ -121,13 +168,12 @@ public class ProductController {
121 168 }
122 169 }
123 170 if(StringUtils.isNotBlank(productQueryVO.getRootProductCategoryName())){
124   - Optional<ProductCategoryDO> productCategoryDOOpt = productCategoryService.lambdaQuery()
  171 + List<ProductCategoryDO> list = productCategoryService.lambdaQuery()
125 172 .eq(ProductCategoryDO::getName, productQueryVO.getRootProductCategoryName())
126   - .oneOpt();
  173 + .list();
  174 + List<String> collect = list.stream().map(ProductCategoryDO::getId).collect(Collectors.toList());
127 175 productQueryVO
128   - .setRootProductCategoryId(productCategoryDOOpt
129   - .orElseThrow(()-> new BusinessException("productCategoryName not exist"))
130   - .getId());
  176 + .setRootProductCategoryIdIn(collect);
131 177 }
132 178 if(StringUtils.isNotBlank(productQueryVO.getProductFunctionName())){
133 179 Optional<ProductFunctionDO> productFunctionDO = productFunctionService.lambdaQuery()
... ... @@ -140,7 +186,7 @@ public class ProductController {
140 186 String path = staticHtmlConfig.getUrl();
141 187 String fileName = (StringUtils.isNotBlank(productQueryVO.getRootProductCategoryName())?productQueryVO.getRootProductCategoryName():"-")
142 188 +"_"
143   - +(StringUtils.isNotBlank(productQueryVO.getProductCategoryName())?productQueryVO.getProductCategoryName():"-")
  189 + +(StringUtils.isNotBlank(productQueryVO.getProductCategoryName())?productQueryVO.getProductCategoryName().replace('/','-'):"-")
144 190 +"_"
145 191 +(StringUtils.isNotBlank(productQueryVO.getProductFunctionName())?productQueryVO.getProductFunctionName():"-")
146 192 +"_"
... ...
shop/src/main/java/com/canrd/shop/module/vo/ProductQueryVO.java
... ... @@ -36,6 +36,11 @@ public class ProductQueryVO extends BasePageVO implements Serializable {
36 36 private String rootProductCategoryId;
37 37  
38 38 /**
  39 + * 顶级产品分类
  40 + */
  41 + private List<String> rootProductCategoryIdIn;
  42 +
  43 + /**
39 44 * 产品分类id
40 45 */
41 46 private String productCategoryId;
... ...
shop/src/main/java/com/canrd/shop/service/ProductCategoryService.java
... ... @@ -5,6 +5,7 @@ import com.canrd.shop.common.constant.ServerResult;
5 5 import com.canrd.shop.module.dto.ProductCategoryDO;
6 6 import com.canrd.shop.module.dto.ProductDO;
7 7 import com.canrd.shop.module.vo.ProductCategoryQueryVO;
  8 +import com.canrd.shop.module.vo.ProductCategoryResultVO;
8 9 import com.canrd.shop.module.vo.ProductQueryVO;
9 10  
10 11 /**
... ... @@ -18,6 +19,6 @@ public interface ProductCategoryService extends IService&lt;ProductCategoryDO&gt; {
18 19 * @param productCategoryQueryVO
19 20 * @return
20 21 */
21   - ServerResult category(ProductCategoryQueryVO productCategoryQueryVO);
  22 + ServerResult<ProductCategoryResultVO> category(ProductCategoryQueryVO productCategoryQueryVO);
22 23  
23 24 }
... ...
shop/src/main/java/com/canrd/shop/service/impl/ProductCagegoryServiceImpl.java
... ... @@ -40,7 +40,7 @@ public class ProductCagegoryServiceImpl extends ServiceImpl&lt;ProductCategoryMappe
40 40 private ProductFunctionService productFunctionService;
41 41  
42 42 @Override
43   - public ServerResult category(ProductCategoryQueryVO productCategoryQueryVO) {
  43 + public ServerResult<ProductCategoryResultVO> category(ProductCategoryQueryVO productCategoryQueryVO) {
44 44 List<ProductCategoryDO> productCategoryDOList = this.list();
45 45 List<ProductCategoryVO> energyMaterialCategoryList = Lists.newArrayList();
46 46 List<ProductCategoryVO> laboratoryConsumables = Lists.newArrayList();
... ...
shop/src/main/java/com/canrd/shop/service/impl/ProductServiceImpl.java
... ... @@ -283,6 +283,7 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
283 283 queryWapper.eq("pc.id",productQueryVO.getProductCategoryId());
284 284 }else if (StringUtils.isNotBlank(productQueryVO.getRootProductCategoryId())){
285 285 queryWapper.eq("pc.id",productQueryVO.getRootProductCategoryId());
  286 + queryWapper.in(CollUtil.isNotEmpty(productQueryVO.getRootProductCategoryIdIn()),"pc.id",productQueryVO.getRootProductCategoryIdIn());
286 287 }
287 288 if(StringUtils.isNotBlank(productQueryVO.getProductFunctionId())){
288 289 queryWapper.eq("pf.id",productQueryVO.getProductFunctionId());
... ... @@ -390,6 +391,8 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
390 391 queryWapper.eq("pc.id",productQueryVO.getProductCategoryId());
391 392 }else if (StringUtils.isNotBlank(productQueryVO.getRootProductCategoryId())){
392 393 queryWapper.eq("pc.id",productQueryVO.getRootProductCategoryId());
  394 + queryWapper.in(CollUtil.isNotEmpty(productQueryVO.getRootProductCategoryIdIn()),"pc.id",productQueryVO.getRootProductCategoryIdIn());
  395 +
393 396 }
394 397 if(StringUtils.isNotBlank(productQueryVO.getProductFunctionId())){
395 398 queryWapper.eq("pf.id",productQueryVO.getProductFunctionId());
... ...
shop/src/main/resources/templates/canrud.ftl
... ... @@ -27202,7 +27202,7 @@
27202 27202 </div>
27203 27203 <div data-v-f467c4e7="" class="v-card-text tw-text-left font-weight-medium title">
27204 27204 <!--商品-->
27205   - <h3 data-v-f6bc2735="" style="color: red;"> ${item.price}</h3>
  27205 + <h3 data-v-f6bc2735="" style="color: red;"> ${item.price!""}</h3>
27206 27206 <h4 data-v-f467c4e7="">${item.name}</h4>
27207 27207 </div>
27208 27208 <!----><span class="v-card__overlay"></span><span
... ...