Commit 416a951c366bbb5d065df9b6c7361d0f95eb3d86

Authored by boyang
2 parents e606e341 2f1f173e

Merge branch 'refs/heads/search'

# Conflicts:
#	shop/src/main/java/com/canrd/shop/service/impl/ProductServiceImpl.java
shop/src/main/java/com/canrd/shop/service/impl/ProductServiceImpl.java
@@ -374,96 +374,74 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, ProductDO> im @@ -374,96 +374,74 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, ProductDO> im
374 } 374 }
375 375
376 private void suppleProducts(List<ProductDO> records) { 376 private void suppleProducts(List<ProductDO> records) {
377 - if (records == null || records.isEmpty()) { // 【修改1】先检查 records 是否为空  
378 - return;  
379 - }  
380 -  
381 Boolean productPriceShow = switchControlService.getEnabledByName(SwitchControlConstants.PRODUCT_PRICE_SHOW); 377 Boolean productPriceShow = switchControlService.getEnabledByName(SwitchControlConstants.PRODUCT_PRICE_SHOW);
382 -  
383 - List<String> productIds = records.stream()  
384 - .map(ProductDO::getId)  
385 - .filter(Objects::nonNull) // 【修改2】确保 productId 不为 null  
386 - .collect(Collectors.toList());  
387 -  
388 - if (productIds.isEmpty()) { // 【修改3】如果没有有效的 productId,则直接返回  
389 - return;  
390 - }  
391 - 378 + List<String> productIds = records.stream().map(ProductDO::getId).collect(Collectors.toList());
392 List<TicketTypeDO> tickeyTypeDOList = ticketTypeService.lambdaQuery() 379 List<TicketTypeDO> tickeyTypeDOList = ticketTypeService.lambdaQuery()
393 .func(wrapper -> { 380 .func(wrapper -> {
394 - if (CollUtil.isEmpty(productIds)) { 381 + if (CollUtil.isEmpty(productIds)){
395 wrapper.apply("1!=1"); 382 wrapper.apply("1!=1");
396 - } else { 383 + }else {
397 wrapper.in(TicketTypeDO::getProductId, productIds); 384 wrapper.in(TicketTypeDO::getProductId, productIds);
398 } 385 }
399 }) 386 })
400 .list(); 387 .list();
401 -  
402 - Map<String, BigDecimal> pId2ttMinPriceMap = new HashMap<>();  
403 - Map<String, BigDecimal> pId3ttMaxPriceMap = new HashMap<>();  
404 - 388 + Map<String,BigDecimal> pId2ttMinPriceMap = new HashMap<>();
  389 + Map<String,BigDecimal> pId3ttMaxPriceMap = new HashMap<>();
405 for (TicketTypeDO ticketTypeDO : tickeyTypeDOList) { 390 for (TicketTypeDO ticketTypeDO : tickeyTypeDOList) {
406 - String productId = ticketTypeDO.getProductId();  
407 - if (productId == null) continue; // 【修改4】确保 productId 不为空  
408 -  
409 - pId2ttMinPriceMap.compute(productId, (key, val) ->  
410 - (val == null || ticketTypeDO.getPrice().compareTo(val) < 0) ? ticketTypeDO.getPrice() : val);  
411 -  
412 - pId3ttMaxPriceMap.compute(productId, (key, val) ->  
413 - (val == null || ticketTypeDO.getPrice().compareTo(val) > 0) ? ticketTypeDO.getPrice() : val); 391 + if (Objects.isNull(pId2ttMinPriceMap.get(ticketTypeDO.getProductId()))){
  392 + pId2ttMinPriceMap.put(ticketTypeDO.getProductId(), ticketTypeDO.getPrice());
  393 + }else {
  394 + if (pId2ttMinPriceMap.get(ticketTypeDO.getProductId()).compareTo(ticketTypeDO.getPrice())>0){
  395 + pId2ttMinPriceMap.put(ticketTypeDO.getProductId(), ticketTypeDO.getPrice());
  396 + }
  397 + }
  398 + if (Objects.isNull(pId3ttMaxPriceMap.get(ticketTypeDO.getProductId()))){
  399 + pId3ttMaxPriceMap.put(ticketTypeDO.getProductId(), ticketTypeDO.getPrice());
  400 + }else {
  401 + if (pId3ttMaxPriceMap.get(ticketTypeDO.getProductId()).compareTo(ticketTypeDO.getPrice())<0){
  402 + pId3ttMaxPriceMap.put(ticketTypeDO.getProductId(), ticketTypeDO.getPrice());
  403 + }
  404 + }
414 } 405 }
415 406
416 records.forEach(product -> { 407 records.forEach(product -> {
417 - if (product == null || product.getId() == null) { // 【修改5】检查 product 是否为空  
418 - return;  
419 - }  
420 -  
421 - if (productPriceShow) {  
422 - if (pId2ttMinPriceMap.containsKey(product.getId())) { // 【修改6】确保 key 存在 408 + if (productPriceShow){
  409 + if (Objects.nonNull(pId2ttMinPriceMap.get(product.getId()))){
423 BigDecimal originMinPrice = pId2ttMinPriceMap.get(product.getId()) 410 BigDecimal originMinPrice = pId2ttMinPriceMap.get(product.getId())
424 .divide(new BigDecimal("0.7"), 2, RoundingMode.HALF_UP) 411 .divide(new BigDecimal("0.7"), 2, RoundingMode.HALF_UP)
425 .divide(new BigDecimal("0.5"), 2, RoundingMode.HALF_UP) 412 .divide(new BigDecimal("0.5"), 2, RoundingMode.HALF_UP)
426 .multiply(new BigDecimal("0.148")) 413 .multiply(new BigDecimal("0.148"))
427 .setScale(2, RoundingMode.HALF_UP); 414 .setScale(2, RoundingMode.HALF_UP);
428 -  
429 BigDecimal computedPrice = originMinPrice 415 BigDecimal computedPrice = originMinPrice
430 .multiply(new BigDecimal("0.5")) 416 .multiply(new BigDecimal("0.5"))
431 .setScale(2, RoundingMode.HALF_UP); 417 .setScale(2, RoundingMode.HALF_UP);
432 -  
433 product.setPrice(computedPrice); 418 product.setPrice(computedPrice);
434 product.setOriginMinPrice(originMinPrice); 419 product.setOriginMinPrice(originMinPrice);
435 } 420 }
436 -  
437 - if (pId3ttMaxPriceMap.containsKey(product.getId())) { // 【修改7】确保 key 存在 421 + if (Objects.nonNull(pId3ttMaxPriceMap.get(product.getId()))){
438 BigDecimal originMaxPrice = pId3ttMaxPriceMap.get(product.getId()) 422 BigDecimal originMaxPrice = pId3ttMaxPriceMap.get(product.getId())
439 .divide(new BigDecimal("0.7"), 2, RoundingMode.HALF_UP) 423 .divide(new BigDecimal("0.7"), 2, RoundingMode.HALF_UP)
440 .divide(new BigDecimal("0.5"), 2, RoundingMode.HALF_UP) 424 .divide(new BigDecimal("0.5"), 2, RoundingMode.HALF_UP)
441 .multiply(new BigDecimal("0.148")) 425 .multiply(new BigDecimal("0.148"))
442 .setScale(2, RoundingMode.HALF_UP); 426 .setScale(2, RoundingMode.HALF_UP);
443 -  
444 BigDecimal computedPrice = originMaxPrice 427 BigDecimal computedPrice = originMaxPrice
445 .multiply(new BigDecimal("0.5")) 428 .multiply(new BigDecimal("0.5"))
446 .setScale(2, RoundingMode.HALF_UP); 429 .setScale(2, RoundingMode.HALF_UP);
447 -  
448 product.setMaxPrice(computedPrice); 430 product.setMaxPrice(computedPrice);
449 product.setOriginMaxPrice(originMaxPrice); 431 product.setOriginMaxPrice(originMaxPrice);
450 } 432 }
451 } 433 }
452 -  
453 - // 解析 productimageliststore  
454 - if (product.getProductimageliststore() != null) { // 【修改8】确保不为 null 434 + //将productDO的productimageliststore解析为map
  435 + if (product.getProductimageliststore() != null) {
455 List<Map> maps = JSON.parseArray(product.getProductimageliststore(), Map.class); 436 List<Map> maps = JSON.parseArray(product.getProductimageliststore(), Map.class);
456 - if (maps != null && !maps.isEmpty()) { // 【修改9】确保 maps 不是空的 437 + if (CollUtil.isNotEmpty(maps)) {
457 Map map = maps.get(0); 438 Map map = maps.get(0);
458 - if (map != null && map.get("fileKey") != null) { // 【修改10】确保 map 及 fileKey 存在  
459 - product.setImageFileKey(map.get("fileKey").toString());  
460 - } 439 + product.setImageFileKey(map.get("fileKey").toString());
461 } 440 }
462 } 441 }
463 }); 442 });
464 } 443 }
465 444
466 -  
467 @Override 445 @Override
468 public ServerResult listBySimilar(ProductQueryVO productQueryVO){ 446 public ServerResult listBySimilar(ProductQueryVO productQueryVO){
469 if(StringUtils.isBlank(productQueryVO.getKeyword())){ 447 if(StringUtils.isBlank(productQueryVO.getKeyword())){
@@ -503,7 +481,7 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -503,7 +481,7 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
503 if (StringUtils.isNotBlank(productQueryVO.getKeyword())) { 481 if (StringUtils.isNotBlank(productQueryVO.getKeyword())) {
504 // String keyword = productQueryVO.getKeyword().trim(); 482 // String keyword = productQueryVO.getKeyword().trim();
505 483
506 - // 先精准匹配 484 + // 先精确匹配完整的关键字
507 List<TicketTypeDO> tickeyTypeDOList = ticketTypeService.lambdaQuery() 485 List<TicketTypeDO> tickeyTypeDOList = ticketTypeService.lambdaQuery()
508 .like(TicketTypeDO::getRank, keyword) 486 .like(TicketTypeDO::getRank, keyword)
509 .list(); 487 .list();
@@ -518,29 +496,23 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im @@ -518,29 +496,23 @@ public class ProductServiceImpl extends ServiceImpl&lt;ProductMapper, ProductDO&gt; im
518 } 496 }
519 497
520 if (productIds.isEmpty()) { 498 if (productIds.isEmpty()) {
521 - // 如果没有匹配到,进行分词处理  
522 - String[] keywords = Arrays.stream(keyword.split("\\s+"))  
523 - .filter(StringUtils::isNotBlank)  
524 - .toArray(String[]::new); 499 + // 如果没有匹配到,分词处理
  500 + String[] keywords = keyword.split("\\s+");
525 501
526 queryWapper.and(subQueryWapper -> { 502 queryWapper.and(subQueryWapper -> {
527 - // **必须包含所有分词** 503 + // 查询包含所有分词的记录
528 for (String key : keywords) { 504 for (String key : keywords) {
529 - subQueryWapper.like("p.name", key); 505 + subQueryWapper.like("p.name", key).or();
530 } 506 }
531 }); 507 });
532 -  
533 } else { 508 } else {
534 Set<String> finalProductIds = productIds; 509 Set<String> finalProductIds = productIds;
535 510
536 queryWapper.and(subQueryWapper -> { 511 queryWapper.and(subQueryWapper -> {
537 - subQueryWapper.like("p.name", keyword)  
538 - .or()  
539 - .in(CollUtil.isNotEmpty(finalProductIds), "p.id", finalProductIds); 512 + subQueryWapper.like("p.name", keyword).or().in(CollUtil.isNotEmpty(finalProductIds), "p.id", finalProductIds);
540 }); 513 });
541 } 514 }
542 } 515 }
543 -  
544 List<ProductDO> productDOS = this.baseMapper.queryList(queryWapper); 516 List<ProductDO> productDOS = this.baseMapper.queryList(queryWapper);
545 // Split the keyword into individual words 517 // Split the keyword into individual words
546 String[] keywords = keyword.split("\\s+"); 518 String[] keywords = keyword.split("\\s+");
shop/src/main/resources/application.yml
@@ -12,7 +12,7 @@ spring: @@ -12,7 +12,7 @@ spring:
12 host: smtp.mxhichina.com 12 host: smtp.mxhichina.com
13 port: 465 13 port: 465
14 username: overseas@canrd.com 14 username: overseas@canrd.com
15 - password: Canrd@overseas 15 + password: cccrd4C10bZuPjtT
16 protocol: smtps 16 protocol: smtps
17 properties: 17 properties:
18 mail: 18 mail: