增加了商品库相关的方法

This commit is contained in:
Jack 2025-06-18 23:24:24 +08:00
parent 5948a22142
commit 7d1715bd45
18 changed files with 557 additions and 2 deletions

View File

@ -14,16 +14,21 @@ import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.service.GeTuiPushService; import com.suisung.mall.common.service.GeTuiPushService;
import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.common.utils.UserInfoService; import com.suisung.mall.common.utils.UserInfoService;
import com.suisung.mall.common.utils.phone.PhoneNumberUtils; import com.suisung.mall.common.utils.phone.PhoneNumberUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -34,6 +39,7 @@ import java.util.Map;
* @author Xinze * @author Xinze
* @since 2021-03-30 * @since 2021-03-30
*/ */
@Log4j
@Api(tags = "用户基本信息表") @Api(tags = "用户基本信息表")
@RestController @RestController
@RequestMapping("/mobile/account/login") @RequestMapping("/mobile/account/login")
@ -72,7 +78,27 @@ public class LoginController extends BaseControllerImpl {
clinkContent = ""; clinkContent = "";
} }
return geTuiPushService.pushMessageToCid(paramsJSON.getStr("cid"), title, paramsJSON.getStr("message"), clickType, clinkContent); String message = paramsJSON.getStr("message") + System.currentTimeMillis();
JSONObject transmission = new JSONObject();
transmission.put("title", "小发同城");
transmission.put("message", message);
transmission.put("order", StringUtils.genLklOrderNo(8));
List<String> cidList = new ArrayList<>();
cidList.add("5932378d5a63fd1d028d47ac7a8f0c03");
cidList.add("d4df466ea274314ec1025bafa0043f8b");
Pair<Boolean, String> pair1 = geTuiPushService.pushTransmissionToCid("5932378d5a63fd1d028d47ac7a8f0c03", transmission.toString());
Pair<Boolean, String> pair2 = geTuiPushService.pushTransmissionToCid("d4df466ea274314ec1025bafa0043f8b", transmission.toString());
Pair<Boolean, String> pair3 = geTuiPushService.pushMessageToCid("5932378d5a63fd1d028d47ac7a8f0c03", title, message, clickType, clinkContent);
Pair<Boolean, String> pair4 = geTuiPushService.pushMessageToCid("d4df466ea274314ec1025bafa0043f8b", title, message, clickType, clinkContent);
log.info("透传h5 {}" + pair1.getSecond());
log.info("透传android {}" + pair2.getSecond());
log.info("消息h5 {}" + pair3.getSecond());
log.info("消息android {}" + pair4.getSecond());
return geTuiPushService.pushMessageToCid("d4df466ea274314ec1025bafa0043f8b", title, paramsJSON.getStr("message"), clickType, clinkContent);
} }
@RequestMapping(value = "/testcase", method = RequestMethod.GET) @RequestMapping(value = "/testcase", method = RequestMethod.GET)

View File

@ -0,0 +1,61 @@
package com.suisung.mall.common.modules.library;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("library_product")
@ApiModel(value = "商品库的商品", description = "商品库的商品表")
public class LibraryProduct implements Serializable {
@TableId(value = "id", type = IdType.INPUT)
@ApiModelProperty(value = "商品ID", position = 1, example = "1001")
private Long id;
@ApiModelProperty(value = "商品名", position = 2, example = "小米12 Pro")
private String name;
@ApiModelProperty(value = "条形码/Barcode", position = 3, example = "6923450657713")
private String barcode;
@ApiModelProperty(value = "商品分类", position = 4, example = "手机")
private String category;
@ApiModelProperty(value = "商品原价", position = 5, example = "4999.00")
private BigDecimal price;
@ApiModelProperty(value = "商品关键字", position = 6, example = "智能手机,5G,骁龙8Gen1")
private String keywords;
@ApiModelProperty(value = "封面图主图", position = 7, example = "/media/images/product/1001.jpg")
private String thumb;
@ApiModelProperty(value = "排序值,越小越前面", position = 8, example = "50")
private Integer seq;
@ApiModelProperty(value = "来源ID", position = 9, example = "vendor_001")
private String source;
@ApiModelProperty(value = "状态 1-有效 2-无效", position = 10, example = "1")
private Integer status;
@ApiModelProperty(value = "创建时间", position = 11, example = "2023-01-01 12:00:00")
private Date createdAt;
@ApiModelProperty(value = "更新时间", position = 12, example = "2023-01-02 15:30:00")
private Date updatedAt;
}

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.common.modules.library;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("library_product_image")
@ApiModel(value = "商品库的商品图片", description = "商品库的商品图片表")
public class LibraryProductImage implements Serializable {
@TableId(value = "id", type = IdType.INPUT)
@ApiModelProperty(value = "图片ID", position = 1, example = "5001")
private Long id;
@ApiModelProperty(value = "商品ID", position = 2, example = "1001")
private Long productId;
@ApiModelProperty(value = "图片地址", position = 3,
example = "/media/images/product/1001.jpg")
private String imageUrl;
@ApiModelProperty(value = "是否主图 1-主图 0-副图", position = 4, example = "1")
private Boolean isMain;
@ApiModelProperty(value = "排序值,越小越前面", position = 5, example = "10")
private Integer seq;
@ApiModelProperty(value = "状态 1-有效 2-无效", position = 6, example = "1")
private Integer status;
@ApiModelProperty(value = "创建时间", position = 7, example = "2023-01-01 12:30:00")
private Date createdAt;
@ApiModelProperty(value = "更新时间", position = 8, example = "2023-01-01 13:15:00")
private Date updatedAt;
}

View File

@ -0,0 +1,74 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.common.pojo.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "商品库的商品信息", description = "商品库的商品信息")
public class LibraryProductDTO implements Serializable {
private Long id;
private String name;
private String barcode;
private String keywords;
private String thumb;
private BigDecimal price;
private List<ProductImage> product_image_list;
/**
* 处理所有图片URL添加域名前缀
*
* @param imageDomain 图片域名
*/
public void processImageUrls(String imageDomain) {
// 处理主图
this.thumb = addDomainPrefix(imageDomain, this.thumb);
// 处理图片列表
if (this.product_image_list != null) {
for (ProductImage image : this.product_image_list) {
if (image != null) {
image.image_url = addDomainPrefix(imageDomain, image.getImage_url());
}
}
}
}
/**
* 为URL添加域名前缀如果URL不是以http/https开头
*
* @param imageDomain 图片域名
* @param url 图片URL
* @return 添加域名前缀后的URL
*/
private String addDomainPrefix(String imageDomain, String url) {
if (url == null || url.startsWith("http://") || url.startsWith("https://")) {
return url;
}
return imageDomain + (url.startsWith("/") ? url : "/" + url);
}
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "商品库的商品图片", description = "商品库的商品图片")
public static class ProductImage implements Serializable {
private Long product_id;
private String image_url;
private Integer is_main;
private Integer seq;
}
}

View File

@ -13,6 +13,7 @@ import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.service.GeTuiPushService; import com.suisung.mall.common.service.GeTuiPushService;
import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.shop.lakala.service.LakalaApiService; import com.suisung.mall.shop.lakala.service.LakalaApiService;
import com.suisung.mall.shop.library.service.LibraryProductService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -24,6 +25,8 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "拉卡拉相关接口 - 前端控制器") @Api(tags = "拉卡拉相关接口 - 前端控制器")
@RestController @RestController
@ -36,15 +39,24 @@ public class LakalaController extends BaseControllerImpl {
@Resource @Resource
private GeTuiPushService geTuiPushService; private GeTuiPushService geTuiPushService;
@Resource
private LibraryProductService libraryProductService;
@ApiOperation(value = "测试案例", notes = "测试案例") @ApiOperation(value = "测试案例", notes = "测试案例")
@RequestMapping(value = "/testcase", method = RequestMethod.POST) @RequestMapping(value = "/testcase", method = RequestMethod.POST)
public Object testcase(@RequestBody JSONObject paramsJSON) { public Object testcase(@RequestBody JSONObject paramsJSON) {
return lakalaPayService.applyLedgerMerEc(paramsJSON.getStr("mchMobile")); // return lakalaPayService.applyLedgerMerEc(paramsJSON.getStr("mchMobile"));
// return lakalaPayService.LedgerMerEcDownload(975790666910121984L); // return lakalaPayService.LedgerMerEcDownload(975790666910121984L);
// return geTuiPushService.pushMessageToSingleByCid("f9da7081a7951cff6d7f1d4e2d2f270b", "", "从 shop 发消息", "none", ""); // return geTuiPushService.pushMessageToSingleByCid("f9da7081a7951cff6d7f1d4e2d2f270b", "", "从 shop 发消息", "none", "");
// return ""; // return "";
List<String> tags = new ArrayList<>();
tags.add("纯净水");
tags.add("放心");
return libraryProductService.matchLibraryProducts(paramsJSON.getStr("barcode"), paramsJSON.getStr("productName"), tags);
} }
@ApiOperation(value = "本地文件转base64", notes = "本地文件转base64") @ApiOperation(value = "本地文件转base64", notes = "本地文件转base64")

View File

@ -0,0 +1,17 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.shop.library.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suisung.mall.common.modules.library.LibraryProductImage;
import org.springframework.stereotype.Repository;
@Repository
public interface LibraryProductImageMapper extends BaseMapper<LibraryProductImage> {
}

View File

@ -0,0 +1,33 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.shop.library.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suisung.mall.common.modules.library.LibraryProduct;
import com.suisung.mall.common.pojo.dto.LibraryProductDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface LibraryProductMapper extends BaseMapper<LibraryProduct> {
/**
* 匹配商品
* 如果 barcode 匹配到数据其他条件不会被匹配
* 如果 barcode 未匹配到数据则其他条件会正常去匹配
*
* @param barcode 国标条形码
* @param productName 商品名称
* @param keywords 多个商品标签,商品关键字
* @return
*/
List<LibraryProductDTO> matchLibraryProducts(@Param("barcode") String barcode, @Param("productName") String productName, @Param("keywords") List<String> keywords);
}

View File

@ -0,0 +1,12 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.shop.library.service;
public interface LibraryProductImageService {
}

View File

@ -0,0 +1,28 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.shop.library.service;
import com.suisung.mall.common.pojo.dto.LibraryProductDTO;
import java.util.List;
public interface LibraryProductService {
/**
* 匹配商品
* 如果 barcode 匹配到数据其他条件不会被匹配
* 如果 barcode 未匹配到数据则其他条件会正常去匹配
*
* @param barcode 国标条形码
* @param productName 商品名称
* @param keywords 多个商品标签,商品关键字
* @return
*/
List<LibraryProductDTO> matchLibraryProducts(String barcode, String productName, List<String> keywords);
}

View File

@ -0,0 +1,19 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.shop.library.service.impl;
import com.suisung.mall.common.modules.library.LibraryProductImage;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.library.mapper.LibraryProductImageMapper;
import com.suisung.mall.shop.library.service.LibraryProductImageService;
import org.springframework.stereotype.Service;
@Service
public class LibraryProductImageServiceImpl extends BaseServiceImpl<LibraryProductImageMapper, LibraryProductImage> implements LibraryProductImageService {
}

View File

@ -0,0 +1,61 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.shop.library.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.suisung.mall.common.modules.library.LibraryProduct;
import com.suisung.mall.common.pojo.dto.LibraryProductDTO;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.library.mapper.LibraryProductMapper;
import com.suisung.mall.shop.library.service.LibraryProductService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
@Service
public class LibraryProductImpl extends BaseServiceImpl<LibraryProductMapper, LibraryProduct> implements LibraryProductService {
@Resource
private LibraryProductMapper libraryProductMapper;
@Value("${static_domain}")
private String staticDomain;
/**
* 匹配商品
* 如果 barcode 匹配到数据其他条件不会被匹配
* 如果 barcode 未匹配到数据则其他条件会正常去匹配
*
* @param barcode 国标条形码
* @param productName 商品名称
* @param keywords 多个商品标签,商品关键字
* @return
*/
@Override
public List<LibraryProductDTO> matchLibraryProducts(String barcode, String productName, List<String> keywords) {
if (StringUtils.isAllBlank(barcode, productName) && CollUtil.isEmpty(keywords)) {
return Collections.emptyList();
}
List<LibraryProductDTO> list = libraryProductMapper.matchLibraryProducts(barcode, productName, keywords);
if (CollectionUtil.isEmpty(list)) {
return Collections.emptyList();
}
// 使用 Stream 处理图片 URLs
list.forEach(product -> product.processImageUrls(staticDomain));
return list;
}
}

View File

@ -118,6 +118,7 @@ logging:
springfox: error springfox: error
# 项目主域名 # 项目主域名
main_domain: @project.domain@ main_domain: @project.domain@
static_domain: @project.static_domain@
# 个推 # 个推
getui: getui:
# Url前缀 # Url前缀

View File

@ -118,6 +118,7 @@ logging:
springfox: error springfox: error
# 项目主域名 # 项目主域名
main_domain: @project.domain@ main_domain: @project.domain@
static_domain: @project.static_domain@
# 个推 # 个推
getui: getui:
# Url前缀 # Url前缀

View File

@ -124,6 +124,7 @@ logging:
springfox: error springfox: error
# 项目主域名 # 项目主域名
main_domain: @project.domain@ main_domain: @project.domain@
static_domain: @project.static_domain@
# 个推 # 个推
getui: getui:
# Url前缀 # Url前缀

View File

@ -122,6 +122,7 @@ logging:
springfox: error springfox: error
# 项目主域名 # 项目主域名
main_domain: @project.domain@ main_domain: @project.domain@
static_domain: @project.static_domain@
# 个推 # 个推
getui: getui:
# Url前缀 # Url前缀

View File

@ -122,6 +122,7 @@ logging:
springfox: error springfox: error
# 项目主域名 # 项目主域名
main_domain: @project.domain@ main_domain: @project.domain@
static_domain: @project.static_domain@
# 个推 # 个推
getui: getui:
# Url前缀 # Url前缀

View File

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.suisung.mall.shop.library.mapper.LibraryProductMapper">
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
*
</sql>
<resultMap id="LibraryProductDTOResult" type="com.suisung.mall.common.pojo.dto.LibraryProductDTO">
<!--商品库商品对象映射-->
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="barcode" column="barcode"/>
<result property="keywords" column="keywords"/>
<result property="thumb" column="thumb"/>
<result property="price" column="price"/>
<!-- 商品库商品图片集合映射-->
<collection property="product_image_list"
ofType="com.suisung.mall.common.pojo.dto.LibraryProductDTO$ProductImage">
<result property="product_id" column="product_id"/>
<result property="image_url" column="image_url"/>
<result property="is_main" column="is_main"/>
<result property="seq" column="seq"/>
</collection>
</resultMap>
<select id="matchLibraryProducts" resultMap="LibraryProductDTOResult">
<!-- 使用 UNION ALL 组合两个查询 -->
<choose>
<!-- 情况1如果 barcode 不为空,优先查询 barcode -->
<when test="barcode != null and barcode != ''">
SELECT
p.id,
p.name,
p.barcode,
p.price,
p.keywords,
p.thumb,
pi.product_id,
pi.image_url,
pi.is_main,
pi.seq,
1 AS query_priority <!-- 标记为第一优先级查询 -->
FROM library_product p
JOIN library_product_image pi ON p.id = pi.product_id
WHERE p.barcode = #{barcode}
UNION ALL
<!-- 仅当 barcode 不存在时才执行此查询 -->
SELECT
p.id,
p.name,
p.barcode,
p.price,
p.keywords,
p.thumb,
pi.product_id,
pi.image_url,
pi.is_main,
pi.seq,
2 AS query_priority <!-- 标记为第二优先级查询 -->
FROM library_product p
JOIN library_product_image pi ON p.id = pi.product_id
WHERE
p.barcode != #{barcode}
<choose>
<when test="productName != null and productName != '' and keywords != null and keywords.size > 0">
AND (
p.name LIKE CONCAT('%', #{productName}, '%')
OR
<foreach collection="keywords" item="keyword" separator="OR">
p.keywords LIKE CONCAT('%', #{keyword}, '%')
</foreach>
)
</when>
<otherwise>
<if test="productName != null and productName != ''">
AND p.name LIKE CONCAT('%', #{productName}, '%')
</if>
<if test="keywords != null and keywords.size > 0">
AND (
<foreach collection="keywords" item="keyword" separator="OR">
p.keywords LIKE CONCAT('%', #{keyword}, '%')
</foreach>
)
</if>
</otherwise>
</choose>
AND NOT EXISTS ( <!-- 确保 barcode 在库中不存在 -->
SELECT 1 FROM library_product WHERE barcode = #{barcode}
)
</when>
<!-- 情况2如果 barcode 为空,直接查询 name -->
<otherwise>
SELECT
p.id,
p.name,
p.barcode,
p.price,
p.keywords,
p.thumb,
pi.product_id,
pi.image_url,
pi.is_main,
pi.seq,
1 AS query_priority
FROM library_product p
JOIN library_product_image pi ON p.id = pi.product_id
<where>
<choose>
<when test="productName != null and productName != '' and keywords != null and keywords.size > 0">
AND (
p.name LIKE CONCAT('%', #{productName}, '%')
OR
<foreach collection="keywords" item="keyword" separator="OR">
p.keywords LIKE CONCAT('%', #{keyword}, '%')
</foreach>
)
</when>
<otherwise>
<if test="productName != null and productName != ''">
AND p.name LIKE CONCAT('%', #{productName}, '%')
</if>
<if test="keywords != null and keywords.size > 0">
AND (
<foreach collection="keywords" item="keyword" separator="OR">
p.keywords LIKE CONCAT('%', #{keyword}, '%')
</foreach>
)
</if>
</otherwise>
</choose>
</where>
</otherwise>
</choose>
<!-- 按优先级和 ID 排序 -->
ORDER BY query_priority, id DESC
</select>
</mapper>

View File

@ -346,6 +346,7 @@
<upload.filepath>D:/wwwroot/mall/public/static</upload.filepath> <upload.filepath>D:/wwwroot/mall/public/static</upload.filepath>
<!--项目域名--> <!--项目域名-->
<project.domain>https://mall.gpxscs.cn</project.domain> <project.domain>https://mall.gpxscs.cn</project.domain>
<project.static_domain>https://static.gpxscs.cn</project.static_domain>
</properties> </properties>
<activation> <activation>
<activeByDefault>false</activeByDefault> <activeByDefault>false</activeByDefault>