Przeglądaj źródła

收藏店铺、取消收藏、查询收藏列表功能开发

qizai 1 rok temu
rodzic
commit
3eff333bf8

+ 8 - 1
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/FavoriteDTO.java

@@ -1,10 +1,12 @@
 package com.chelvc.cloud.vehicle.api.dto;
+
 import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
 
+import java.io.Serializable;
 import java.util.Date;
 
 /**
@@ -17,7 +19,7 @@ import java.util.Date;
 @SuperBuilder
 @NoArgsConstructor
 @AllArgsConstructor
-public class FavoriteDTO{
+public class FavoriteDTO implements Serializable {
     /**
      * 主键
      */
@@ -42,4 +44,9 @@ public class FavoriteDTO{
      * 创建时间
      */
     private Date createTime;
+
+    /**
+     * 商家信息
+     */
+    private MerchantDTO merchant;
 }

+ 48 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/FavoriteQueryParam.java

@@ -0,0 +1,48 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 收藏记录查询参数
+ *
+ * @author qizai
+ * @date 2023/9/9
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class FavoriteQueryParam extends LocationQueryParam {
+
+    /**
+     * 偏移收藏记录ID
+     */
+    @Min(value = 1, message = "偏移收藏记录ID不能小于1")
+    private Long offset;
+
+    /**
+     * 查询数量
+     */
+    @NotNull(message = "查询数量不能为空")
+    @Min(value = 1, message = "查询数量不能小于1")
+    @Max(value = 20, message = "查询数量不能大于20")
+    private Integer size;
+
+    /**
+     * 收藏类型
+     */
+    @NotNull(message = "收藏类型不能为空")
+    private FavoriteType type;
+}

+ 14 - 1
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/FavoriteService.java

@@ -2,10 +2,15 @@ package com.chelvc.cloud.vehicle.api.service;
 
 import com.chelvc.cloud.vehicle.api.dto.FavoriteDTO;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
+import com.chelvc.cloud.vehicle.api.dto.UserCouponDTO;
 import com.chelvc.cloud.vehicle.api.param.FavoritePagingParam;
+import com.chelvc.cloud.vehicle.api.param.FavoriteQueryParam;
 import com.chelvc.cloud.vehicle.api.param.MerchantPagingParam;
+import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
 import com.chelvc.framework.common.model.Pagination;
 
+import java.util.List;
+
 /**
  * 商品收藏接口
  *
@@ -29,10 +34,18 @@ public interface FavoriteService {
     void deleteMineFavorite(Long id);
 
     /**
-     * 查询用户收藏店铺列表
+     * 查询收藏列表
      *
      * @param param 查询参数
      * @return 收藏店铺分页信息
      */
     Pagination<MerchantDTO> getFavoriteMerchantPaging(FavoritePagingParam param);
+
+    /**
+     * 查询用户收藏店铺列表
+     *
+     * @param param 查询参数
+     * @return 用户收藏店铺列表
+     */
+    List<FavoriteDTO> listFavoriteMerchants(FavoriteQueryParam param);
 }

+ 3 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/FavoriteCopier.java

@@ -1,8 +1,5 @@
 package com.chelvc.cloud.vehicle.server.copier;
 
-import java.util.Collection;
-import java.util.List;
-
 import com.chelvc.cloud.vehicle.api.dto.FavoriteDTO;
 import com.chelvc.cloud.vehicle.server.entity.Favorite;
 import org.mapstruct.Builder;
@@ -11,6 +8,9 @@ import org.mapstruct.Mapper;
 import org.mapstruct.Named;
 import org.mapstruct.factory.Mappers;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * 收藏信息拷贝接口
  *

+ 15 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/FavoriteMapper.java

@@ -1,8 +1,14 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.api.param.FavoriteQueryParam;
+import com.chelvc.cloud.vehicle.api.param.UserCouponQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Favorite;
+import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 用户收藏数据操作接口
@@ -18,5 +24,13 @@ public interface FavoriteMapper extends BaseMapper<Favorite> {
      * @param favorite 收藏信息
      * @return true/false
      */
-    boolean createOrIgnore(Favorite favorite);
+    boolean saveFavorite(Favorite favorite);
+
+    /**
+     * 查询用户收藏店铺列表
+     *
+     * @param param 查询参数
+     * @return 用户收藏店铺列表
+     */
+    List<Favorite> listFavoriteMerchants(@Param("userId") Long userId, @Param("param") FavoriteQueryParam param);
 }

+ 12 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Favorite.java

@@ -1,16 +1,19 @@
 package com.chelvc.cloud.vehicle.server.entity;
 
-import java.util.Date;
-
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
+import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
 import com.chelvc.framework.database.entity.Entity;
+import jdk.nashorn.internal.ir.annotations.Ignore;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
 
+import java.util.Date;
+
 /**
  * 用户收藏数据模型
  *
@@ -25,7 +28,7 @@ public class Favorite implements Entity<Long> {
     /**
      * 主键
      */
-    @TableId(type = IdType.ASSIGN_ID)
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     /**
@@ -47,4 +50,10 @@ public class Favorite implements Entity<Long> {
      * 创建时间
      */
     private Date createTime;
+
+    /**
+     * 商家信息
+     */
+    @TableField(exist = false)
+    private MerchantDTO merchant;
 }

+ 1 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Merchant.java

@@ -34,7 +34,7 @@ public class Merchant extends ModifyEntity<Long> {
     /**
      * 主键
      */
-    @TableId(type = IdType.ASSIGN_ID)
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     /**

+ 3 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/UserCoupon.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.server.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.chelvc.cloud.vehicle.api.constant.CouponType;
 import com.chelvc.framework.database.entity.ModifyEntity;
@@ -27,7 +28,7 @@ public class UserCoupon extends ModifyEntity<Long> {
     /**
      * 主键
      */
-    @TableId(type = IdType.ASSIGN_ID)
+    @TableId(type = IdType.AUTO)
     private Long id;
 
     /**
@@ -53,5 +54,6 @@ public class UserCoupon extends ModifyEntity<Long> {
     /**
      * 优惠券
      */
+    @TableField(exist = false)
     private Coupon coupon;
 }

+ 35 - 4
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/FavoriteServiceImpl.java

@@ -1,14 +1,23 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import java.util.Collections;
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.constant.FavoriteType;
+import com.chelvc.cloud.vehicle.api.constant.UserCouponStatus;
+import com.chelvc.cloud.vehicle.api.dto.FavoriteDTO;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
 import com.chelvc.cloud.vehicle.api.param.FavoritePagingParam;
+import com.chelvc.cloud.vehicle.api.param.FavoriteQueryParam;
+import com.chelvc.cloud.vehicle.server.copier.FavoriteCopier;
+import com.chelvc.cloud.vehicle.server.copier.UserCouponCopier;
 import com.chelvc.cloud.vehicle.server.dao.FavoriteMapper;
 import com.chelvc.cloud.vehicle.server.entity.Favorite;
+import com.chelvc.cloud.vehicle.server.entity.UserCoupon;
 import com.chelvc.cloud.vehicle.server.service.FavoriteService;
 import com.chelvc.framework.base.context.SessionContextHolder;
 import com.chelvc.framework.base.model.Session;
@@ -16,6 +25,7 @@ import com.chelvc.framework.base.util.ResourceUtils;
 import com.chelvc.framework.common.model.Pagination;
 import lombok.NonNull;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.util.CollectionUtils;
 
 /**
  * 用户收藏业务操作实现
@@ -28,10 +38,15 @@ public class FavoriteServiceImpl extends ServiceImpl<FavoriteMapper, Favorite> i
         com.chelvc.cloud.vehicle.api.service.FavoriteService {
     @Override
     public Long addMerchantFavorite(@NonNull Long merchantId) {
-        Favorite favorite = Favorite.builder().userId(SessionContextHolder.getId()).type(FavoriteType.MERCHANT)
+        Long userId = SessionContextHolder.getId();
+        Integer count = this.lambdaQuery()
+                .eq(Favorite::getUserId, userId)
+                .eq(Favorite::getType, FavoriteType.MERCHANT)
+                .eq(Favorite::getContentId, merchantId).count();
+        ResourceUtils.available(count <= 0, "收藏信息已存在");
+        Favorite favorite = Favorite.builder().userId(userId).type(FavoriteType.MERCHANT)
                 .contentId(merchantId).createTime(new Date()).build();
-        boolean success = this.baseMapper.createOrIgnore(favorite);
-        ResourceUtils.available(success, "收藏信息已存在");
+        this.baseMapper.saveFavorite(favorite);
         return favorite.getId();
     }
 
@@ -44,7 +59,23 @@ public class FavoriteServiceImpl extends ServiceImpl<FavoriteMapper, Favorite> i
 
     @Override
     public Pagination<MerchantDTO> getFavoriteMerchantPaging(FavoritePagingParam param) {
-        Session session = SessionContextHolder.getSession();
         return null;
     }
+
+    @Override
+    public List<FavoriteDTO> listFavoriteMerchants(@NonNull FavoriteQueryParam param) {
+        Long userId = SessionContextHolder.getId();
+        List<Favorite> favorites = this.baseMapper.listFavoriteMerchants(userId, param);
+        if (CollectionUtils.isEmpty(favorites)) {
+            return Collections.emptyList();
+        }
+        return favorites
+                .stream()
+                .map(o -> {
+                    FavoriteDTO favoriteDTO = FavoriteCopier.INSTANCE.copying(o);
+                    favoriteDTO.setMerchant(o.getMerchant());
+                    return favoriteDTO;
+                }).collect(Collectors.toList());
+
+    }
 }

+ 36 - 3
vehicle-server/src/main/resources/mapper/FavoriteMapper.xml

@@ -1,8 +1,41 @@
 <?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.chelvc.cloud.vehicle.server.dao.FavoriteMapper">
-    <insert id="createOrIgnore">
-        insert ignore into `favorite`(id, user_id, type, content_id, create_time)
-        values(#{id}, #{userId}, #{type}, #{contentId}, #{createTime})
+
+    <resultMap id="FAVORITE_RESULT_MAP" type="com.chelvc.cloud.vehicle.server.entity.Favorite">
+        <id column="id" property="id" jdbcType="BIGINT"/>
+        <result column="user_id" property="userId" jdbcType="BIGINT"/>
+        <result column="type" property="type" jdbcType="VARCHAR"/>
+        <result column="content_id" property="contentId" jdbcType="BIGINT"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+        <association property="merchant" javaType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
+            <id column="merchant_id" property="id" jdbcType="BIGINT"/>
+            <result column="name" property="name" jdbcType="VARCHAR"/>
+            <result column="logo" property="logo" jdbcType="VARCHAR"/>
+            <result column="score" property="score" jdbcType="DOUBLE"/>
+            <result column="sale" property="sale" jdbcType="INTEGER"/>
+            <result column="address" property="address" jdbcType="VARCHAR"/>
+            <result column="distance" property="distance" jdbcType="DOUBLE"/>
+        </association>
+    </resultMap>
+
+    <insert id="saveFavorite" useGeneratedKeys="true" keyProperty="id">
+        insert into `favorite`(user_id, type, content_id, create_time)
+        values(#{userId}, #{type}, #{contentId}, #{createTime})
     </insert>
+
+    <select id="listFavoriteMerchants" resultMap="FAVORITE_RESULT_MAP">
+        select fe.id,fe.content_id,mt.id as merchant_id, mt.name, mt.logo, mt.score, mt.sale, mt.address,
+        round(st_distance_sphere(
+        point(mt.longitude, mt.latitude), point(#{param.longitude}, #{param.latitude})
+        ),1) distance from favorite fe
+        inner join merchant mt on fe.content_id = mt.id and mt.status = 'ONLINE'
+        and mt.region = #{param.region}
+        where fe.user_id = #{userId} and fe.type = 'MERCHANT'
+        <if test="param.offset != null">
+            and fe.id > #{param.offset}
+        </if>
+        order by fe.create_time desc
+        limit #{param.size}
+    </select>
 </mapper>

+ 1 - 1
vehicle-server/src/main/resources/mapper/UserCouponMapper.xml

@@ -13,7 +13,7 @@
         <result column="updater" property="updater" jdbcType="BIGINT"/>
         <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
         <association property="coupon" javaType="com.chelvc.cloud.vehicle.server.entity.Coupon">
-            <id column="id" property="id" jdbcType="BIGINT"/>
+            <id column="coupon_id" property="id" jdbcType="BIGINT"/>
             <result column="merchant_id" property="merchantId" jdbcType="BIGINT"/>
             <result column="name" property="name" jdbcType="VARCHAR"/>
             <result column="amount" property="amount" jdbcType="DOUBLE"/>