소스 검색

feat(miniprogram): 添加小程序商品浏览记录和收藏功能

- 在CustomerContactServiceImpl中修复角色ID比较逻辑
- 在CustomerInfoServiceImpl中完善远程用户创建流程
- 扩展ProductBaseService接口增加时间范围参数
- 实现小程序商品浏览记录的增删查功能
- 实现小程序商品收藏和收藏夹管理功能
- 添加小程序系统公告控制器
- 更新PC端浏览历史记录接口支持时间筛选
- 修复品牌和分类服务中的聚合桶转换问题
- 优化推荐链接排序字段为创建时间
- 添加Elasticsearch Java客户端依赖版本控制
肖路 3 주 전
부모
커밋
4759efbb65

+ 8 - 0
pom.xml

@@ -37,6 +37,7 @@
         <lombok.version>1.18.36</lombok.version>
         <logstash.version>7.4</logstash.version>
         <easy-es.version>3.0.0</easy-es.version>
+        <elasticsearch-java.version>8.11.0</elasticsearch-java.version>
         <skywalking-toolkit.version>9.3.0</skywalking-toolkit.version>
         <bouncycastle.version>1.80</bouncycastle.version>
         <mapstruct-plus.version>1.4.8</mapstruct-plus.version>
@@ -367,6 +368,13 @@
                 <version>${easy-es.version}</version>
             </dependency>
 
+            <!-- 强制指定 Elasticsearch Java Client 版本以兼容 Easy-ES 3.0.0 -->
+            <dependency>
+                <groupId>co.elastic.clients</groupId>
+                <artifactId>elasticsearch-java</artifactId>
+                <version>${elasticsearch-java.version}</version>
+            </dependency>
+
             <!-- skywalking 整合 logback -->
             <dependency>
                 <groupId>org.apache.skywalking</groupId>

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java

@@ -271,7 +271,7 @@ public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMappe
         validEntityBeforeSave(update);
         //查询角色有变更,如果角色有变更,则需要更新用户角色
         CustomerContact customerContact = baseMapper.selectById(bo.getId());
-        if (!customerContact.getRoleId().equals(update.getRoleId())) {
+        if (!Objects.equals(customerContact.getRoleId(), update.getRoleId())) {
             RemoteUserBo remoteUserBo = new RemoteUserBo();
             remoteUserBo.setUserId(customerContact.getUserId());
             remoteUserBo.setRoleId(update.getRoleId());

+ 1 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java

@@ -1254,6 +1254,7 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         Long userId = remoteUserService.addUser(remoteUserBo);
 
 
+        remoteUserBo.setUserId(userId);
         remoteUserService.addUserRole(remoteUserBo);
         // 添加客户联系人信息
         CustomerContact contact = new CustomerContact();

+ 121 - 8
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/mini/MiniProductController.java

@@ -6,22 +6,21 @@ import org.dromara.common.core.domain.R;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.product.domain.ProductBrowsingHistory;
+import org.dromara.product.domain.ProductCollect;
+import org.dromara.product.domain.ProductFavorites;
 import org.dromara.product.domain.ProductShoppingCart;
-import org.dromara.product.domain.bo.PcProductBo;
-import org.dromara.product.domain.bo.ProductBaseBo;
-import org.dromara.product.domain.bo.ProductShoppingCartBo;
+import org.dromara.product.domain.bo.*;
 import org.dromara.product.domain.vo.PcProductVo;
 import org.dromara.product.domain.vo.ProductBaseVo;
-import org.dromara.product.service.IProductBaseService;
-import org.dromara.product.service.IProductShoppingCartService;
+import org.dromara.product.service.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
-import java.util.Objects;
+import java.util.*;
 
 /**
- * 首页
+ * 小程序商品
  *
  * @author
  * @date 2026/1/26 下午6:41
@@ -38,6 +37,16 @@ public class MiniProductController {
     //购物车
     private final IProductShoppingCartService productShoppingCartService;
 
+
+    //商品浏览记录
+    private final IProductBrowsingHistoryService productBrowsingHistoryService;
+
+
+    //商品收藏
+    private final IProductCollectService productCollectService;
+    //商品收藏夹
+    private final IProductFavoritesService productFavoritesService;
+
     /**
      * 获取客户商品池的商品
      */
@@ -142,4 +151,108 @@ public class MiniProductController {
         bo.setCustomerId(LoginHelper.getLoginUser().getCustomerId());
         return productBaseService.getProtocolProductsPage(bo, pageQuery);
     }
+
+    /**
+     * 新增商品浏览记录
+     */
+    @PostMapping("/addProductBrowsingHistory/{productId}")
+    public R addProductBrowsingHistory(@PathVariable Long productId) {
+        ProductBrowsingHistoryBo productBrowsingHistoryBo = new ProductBrowsingHistoryBo();
+        productBrowsingHistoryBo.setProductId(productId);
+        productBrowsingHistoryBo.setUserId(LoginHelper.getUserId());
+        productBrowsingHistoryBo.setCustomerId(LoginHelper.getLoginUser().getCustomerId());
+        productBrowsingHistoryService.insertByBo(productBrowsingHistoryBo);
+        return R.ok();
+    }
+
+    /**
+     * 删除浏览记录
+     */
+    @DeleteMapping("/deleteProductBrowsingHistory/{ids}")
+    public R deleteProductBrowsingHistory(@PathVariable Long[] ids) {
+        productBrowsingHistoryService.remove(Wrappers.lambdaQuery(ProductBrowsingHistory.class)
+            .in(ProductBrowsingHistory::getProductId, ids)
+            .eq(ProductBrowsingHistory::getUserId, LoginHelper.getUserId())
+        );
+        return R.ok();
+    }
+
+    /**
+     * 浏览记录的商品
+     */
+    @GetMapping("/getProductBrowsingHistory")
+    public R<Map<String, List<PcProductVo>>> getProductBrowsingHistory(@RequestParam(required = false) Date startTime, @RequestParam(required = false) Date endTime) {
+        return R.ok(productBaseService.getProductBrowsingHistory(LoginHelper.getUserId(), startTime, endTime));
+    }
+
+    /**
+     * 收藏商品
+     */
+    @PostMapping("/addProductCollect")
+    public R addProductCollect(@RequestBody ProductCollectBo bo) {
+        //如果未传收藏夹id,则查询有没有默认收藏夹,如果没有就新增收藏夹
+        if (bo.getFavoritesId() == null) {
+            ProductFavorites one = productFavoritesService.getOne(Wrappers.lambdaQuery(ProductFavorites.class)
+                .eq(ProductFavorites::getUserId, LoginHelper.getUserId())
+                .eq(ProductFavorites::getIsDefault, "0")
+            );
+            if (one == null) {
+                one = new ProductFavorites();
+                one.setUserId(LoginHelper.getUserId());
+                one.setCustomerId(LoginHelper.getLoginUser().getCustomerId());
+                one.setTitle("默认收藏夹");
+                one.setIsDefault("0");
+                productFavoritesService.save(one);
+            }
+            bo.setFavoritesId(one.getId());
+        }
+        bo.setUserId(LoginHelper.getUserId());
+        bo.setCustomerId(LoginHelper.getLoginUser().getCustomerId());
+        productCollectService.insertByBo(bo);
+        return R.ok();
+    }
+
+    /**
+     * 取消收藏
+     */
+    @DeleteMapping("/cancelProductCollect")
+    public R cancelProductCollect(ProductCollectBo bo) {
+        productCollectService.remove(Wrappers.lambdaQuery(ProductCollect.class)
+            .eq(ProductCollect::getUserId, LoginHelper.getUserId())
+            .eq(ProductCollect::getProductId, bo.getProductId())
+        );
+        return R.ok();
+    }
+
+    /**
+     * 收藏夹商品列表
+     */
+    @GetMapping("/getFavoritesProductPage")
+    public TableDataInfo<PcProductVo> getFavoritesProductPage(Long favoritesId, PageQuery pageQuery) {
+        return productBaseService.getFavoritesProductPage(favoritesId, LoginHelper.getUserId(), pageQuery);
+    }
+
+    /**
+     * 查询商品是否在默认收藏夹收藏
+     */
+    @GetMapping("/isProductInDefaultCollect/{productIds}")
+    public R isProductInDefaultCollect(@PathVariable Long[] productIds) {
+        //查询商品是否在默认收藏夹收藏
+        ProductFavorites one = productFavoritesService.getOne(Wrappers.lambdaQuery(ProductFavorites.class)
+            .eq(ProductFavorites::getUserId, LoginHelper.getUserId())
+            .eq(ProductFavorites::getIsDefault, "0")
+        );
+        if (one == null) {
+            one = new ProductFavorites();
+            one.setUserId(LoginHelper.getUserId());
+            one.setTitle("默认收藏夹");
+            one.setIsDefault("0");
+            productFavoritesService.save(one);
+        }
+        return R.ok(productCollectService.exists(Wrappers.lambdaQuery(ProductCollect.class)
+            .eq(ProductCollect::getUserId, LoginHelper.getUserId())
+            .eq(ProductCollect::getFavoritesId, one.getId())
+            .in(ProductCollect::getProductId, productIds)));
+    }
+
 }

+ 3 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/MyProductController.java

@@ -21,11 +21,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 我的商品相关接口
@@ -84,8 +80,8 @@ public class MyProductController {
      * 浏览记录的商品
      */
     @GetMapping("/getProductBrowsingHistory")
-    public R<Map<String, List<PcProductVo>>> getProductBrowsingHistory() {
-        return R.ok(productBaseService.getProductBrowsingHistory(LoginHelper.getUserId()));
+    public R<Map<String, List<PcProductVo>>> getProductBrowsingHistory(@RequestParam(required = false) Date startTime, @RequestParam(required = false) Date endTime) {
+        return R.ok(productBaseService.getProductBrowsingHistory(LoginHelper.getUserId(), startTime, endTime));
     }
 
     /**

+ 2 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBaseService.java

@@ -8,6 +8,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -171,7 +172,7 @@ public interface IProductBaseService extends IService<ProductBase>{
     /**
     * PC端商品浏览记录
     * */
-    Map<String,List<PcProductVo>> getProductBrowsingHistory(Long userId);
+    Map<String,List<PcProductVo>> getProductBrowsingHistory(Long userId , Date startTime, Date endTime);
 
     /**
     * PC端商品收藏夹

+ 7 - 4
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -1593,10 +1593,13 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
      * @param userId
      */
     @Override
-    public Map<String,List<PcProductVo>> getProductBrowsingHistory(Long userId) {
-        List<ProductBrowsingHistoryVo> productBrowsingHistoryVos = productBrowsingHistoryMapper.selectVoList(Wrappers.lambdaQuery(ProductBrowsingHistory.class)
-            .eq(ProductBrowsingHistory::getUserId, userId)
-        );
+    public Map<String,List<PcProductVo>> getProductBrowsingHistory(Long userId, Date startTime, Date endTime) {
+        LambdaQueryWrapper<ProductBrowsingHistory> wrapper = Wrappers.lambdaQuery(ProductBrowsingHistory.class)
+            .eq(ProductBrowsingHistory::getUserId, userId);
+        if(ObjectUtil.isNotEmpty(startTime)){
+            wrapper.between(ProductBrowsingHistory::getCreateTime, DateUtil.beginOfDay(startTime), DateUtil.endOfDay(endTime));
+        }
+        List<ProductBrowsingHistoryVo> productBrowsingHistoryVos = productBrowsingHistoryMapper.selectVoList(wrapper);
         if (CollUtil.isNotEmpty(productBrowsingHistoryVos)) {
             //将浏览记录通过创建时间的日分组
             Map<String, List<ProductBrowsingHistoryVo>> collect =

+ 1 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBrandServiceImpl.java

@@ -366,7 +366,7 @@ public class ProductBrandServiceImpl  extends ServiceImpl<ProductBrandMapper, Pr
         if (CollUtil.isEmpty(buckets)) {
             return null;
         }
-        List<Long> brandIds = buckets.stream().map(LongTermsBucket::key).toList();
+        List<Long> brandIds = buckets.stream().map(bucket -> Long.parseLong(String.valueOf(bucket.key()))).toList();
         List<ProductBrandVo> productBrandVos = baseMapper.selectVoList(Wrappers.lambdaQuery(ProductBrand.class)
             .in(ProductBrand::getId, brandIds));
         return productBrandVos;

+ 1 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductCategoryRecommendedLinkServiceImpl.java

@@ -85,7 +85,7 @@ public class ProductCategoryRecommendedLinkServiceImpl  extends ServiceImpl<Prod
     private LambdaQueryWrapper<ProductCategoryRecommendedLink> buildQueryWrapper(ProductCategoryRecommendedLinkBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<ProductCategoryRecommendedLink> lqw = Wrappers.lambdaQuery();
-        lqw.orderByAsc(ProductCategoryRecommendedLink::getId);
+        lqw.orderByAsc(ProductCategoryRecommendedLink::getCreateTime);
         lqw.eq(StringUtils.isNotBlank(bo.getProductNo()), ProductCategoryRecommendedLink::getProductNo, bo.getProductNo());
         lqw.eq(bo.getCategoryId() != null, ProductCategoryRecommendedLink::getCategoryId, bo.getCategoryId());
         lqw.eq(bo.getSort() != null, ProductCategoryRecommendedLink::getSort, bo.getSort());

+ 1 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductCategoryServiceImpl.java

@@ -322,7 +322,7 @@ public class ProductCategoryServiceImpl  extends ServiceImpl<ProductCategoryMapp
         if (CollUtil.isEmpty(buckets)) {
             return null;
         }
-        List<Long> categoryIds = buckets.stream().map(LongTermsBucket::key).toList();
+        List<Long> categoryIds = buckets.stream().map(bucket -> Long.parseLong(String.valueOf(bucket.key()))).toList();
         List<ProductCategoryVo> productBrandVos = baseMapper.selectVoList(Wrappers.lambdaQuery(ProductCategory.class)
             .in(ProductCategory::getId, categoryIds));
         return productBrandVos;

+ 1 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProtocolInfoServiceImpl.java

@@ -64,6 +64,7 @@ public class ProtocolInfoServiceImpl  extends ServiceImpl<ProtocolInfoMapper, Pr
         //获取客户信息
         if (ObjectUtil.isNotEmpty(item.getCustomerId())){
             CustomerInfoDTO customerInfoDTO = remoteCustomerService.selectCustomerInfoById(item.getCustomerId());
+
             item.setCustomerName(customerInfoDTO.getCustomerName());
             item.setCustomerNo(customerInfoDTO.getCustomerNo());
         }

+ 52 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/mini/MiniSystemController.java

@@ -0,0 +1,52 @@
+package org.dromara.system.controller.mini;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.system.domain.SysAnnouncement;
+import org.dromara.system.service.ISysAnnouncementService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 小程序系统
+ *
+ * @author
+ * @date 2026/1/26 下午6:41
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/miniSystem")
+public class MiniSystemController {
+
+    //平台公告
+    private final ISysAnnouncementService sysAnnouncementService;
+
+
+    /**
+     * 优易咨迅(平台公告)
+     */
+    @GetMapping("/getYouYiZiXunPage")
+    public R<List<SysAnnouncement>> getYouYiZiXunPage(PageQuery pageQuery) {
+        List<SysAnnouncement> list = sysAnnouncementService.list(Wrappers.<SysAnnouncement>lambdaQuery(SysAnnouncement.class)
+            .eq(SysAnnouncement::getIsShow, 1)
+        );
+        return R.ok(list);
+    }
+
+    /**
+     * 咨迅详情
+     */
+    @GetMapping("/getYouYiZiXunInfo/{id}")
+    public R<SysAnnouncement> getYouYiZiXunInfo(@PathVariable Long id) {
+        SysAnnouncement sysAnnouncement = sysAnnouncementService.getById(id);
+        return R.ok(sysAnnouncement);
+    }
+}