Explorar o código

更新商家查询逻辑

woody hai 1 ano
pai
achega
1dc1e45d50

+ 6 - 3
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/PointQueryParam.java → vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/LocationQueryParam.java

@@ -1,6 +1,7 @@
 package com.chelvc.cloud.vehicle.api.param;
 
 import java.io.Serializable;
+import javax.validation.constraints.NotNull;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -17,14 +18,16 @@ import lombok.experimental.SuperBuilder;
 @SuperBuilder
 @NoArgsConstructor
 @AllArgsConstructor
-public class PointQueryParam implements Serializable {
+public class LocationQueryParam implements Serializable {
     /**
      * 经度
      */
-    private double longitude;
+    @NotNull(message = "经度不能为空")
+    private Double longitude;
 
     /**
      * 纬度
      */
-    private double latitude;
+    @NotNull(message = "纬度不能为空")
+    private Double latitude;
 }

+ 5 - 23
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/MerchantQueryParam.java

@@ -1,7 +1,5 @@
 package com.chelvc.cloud.vehicle.api.param;
 
-import java.io.Serializable;
-import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
@@ -9,7 +7,9 @@ import javax.validation.constraints.Size;
 import com.chelvc.cloud.vehicle.api.constant.Sort;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import lombok.ToString;
 import lombok.experimental.SuperBuilder;
 
 /**
@@ -22,19 +22,9 @@ import lombok.experimental.SuperBuilder;
 @SuperBuilder
 @NoArgsConstructor
 @AllArgsConstructor
-public class MerchantQueryParam implements Serializable {
-    /**
-     * 经度
-     */
-    @NotNull(message = "经度不能为空")
-    private Double longitude;
-
-    /**
-     * 纬度
-     */
-    @NotNull(message = "纬度不能为空")
-    private Double latitude;
-
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+public class MerchantQueryParam extends LocationQueryParam {
     /**
      * 关键字
      */
@@ -58,12 +48,4 @@ public class MerchantQueryParam implements Serializable {
      */
     @NotNull(message = "排序规则不能为空")
     private Sort sort;
-
-    /**
-     * 查询数量
-     */
-    @NotNull(message = "查询数量不能为空")
-    @Min(value = 1, message = "查询数量不能小于1")
-    @Max(value = 20, message = "查询数量不能大于20")
-    private Integer size;
 }

+ 0 - 27
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/NearbyQueryParam.java

@@ -1,27 +0,0 @@
-package com.chelvc.cloud.vehicle.api.param;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-import lombok.ToString;
-import lombok.experimental.SuperBuilder;
-
-/**
- * 附近信息查询参数
- *
- * @author Woody
- * @date 2023/5/5
- */
-@Data
-@SuperBuilder
-@NoArgsConstructor
-@AllArgsConstructor
-@ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
-public class NearbyQueryParam extends PointQueryParam {
-    /**
-     * 距离(米)
-     */
-    private int distance;
-}

+ 15 - 12
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/MerchantService.java

@@ -4,9 +4,8 @@ import java.util.List;
 
 import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDetailDTO;
+import com.chelvc.cloud.vehicle.api.param.LocationQueryParam;
 import com.chelvc.cloud.vehicle.api.param.MerchantQueryParam;
-import com.chelvc.cloud.vehicle.api.param.NearbyQueryParam;
-import com.chelvc.cloud.vehicle.api.param.PointQueryParam;
 
 /**
  * 商家业务接口
@@ -16,30 +15,34 @@ import com.chelvc.cloud.vehicle.api.param.PointQueryParam;
  */
 public interface MerchantService {
     /**
-     * 获取推荐商家
+     * 获取附近商家
      *
-     * @param param 查询参数
-     * @param size  商家数量
+     * @param region 所属地区
+     * @param param  查询参数
+     * @param size   商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listRecommendMerchants(PointQueryParam param, int size);
+    List<MerchantDTO> listNearbyMerchants(int region, LocationQueryParam param, int size);
 
     /**
-     * 获取附近商家
+     * 获取推荐商家
      *
-     * @param param 查询参数
-     * @param size  商家数量
+     * @param region 所属地区
+     * @param param  查询参数
+     * @param size   商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listNearbyMerchants(NearbyQueryParam param, int size);
+    List<MerchantDTO> listRecommendMerchants(int region, LocationQueryParam param, int size);
 
     /**
      * 查询商家
      *
-     * @param param 查询参数
+     * @param region 所属地区
+     * @param param  查询参数
+     * @param size   商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listSimpleMerchants(MerchantQueryParam param);
+    List<MerchantDTO> listSimpleMerchants(int region, MerchantQueryParam param, int size);
 
     /**
      * 获取商家详情

+ 18 - 12
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/MerchantMapper.java

@@ -4,9 +4,8 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
+import com.chelvc.cloud.vehicle.api.param.LocationQueryParam;
 import com.chelvc.cloud.vehicle.api.param.MerchantQueryParam;
-import com.chelvc.cloud.vehicle.api.param.NearbyQueryParam;
-import com.chelvc.cloud.vehicle.api.param.PointQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Merchant;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -20,28 +19,35 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface MerchantMapper extends BaseMapper<Merchant> {
     /**
-     * 获取推荐商家
+     * 获取附近商家
      *
-     * @param param 查询参数
-     * @param size  商家数量
+     * @param region 所属地区
+     * @param param  查询参数
+     * @param size   商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listRecommendMerchants(@Param("param") PointQueryParam param, @Param("size") int size);
+    List<MerchantDTO> listNearbyMerchants(@Param("region") int region, @Param("param") LocationQueryParam param,
+                                          @Param("size") int size);
 
     /**
-     * 获取附近商家
+     * 获取推荐商家
      *
-     * @param param 查询参数
-     * @param size  商家数量
+     * @param region 所属地区
+     * @param param  查询参数
+     * @param size   商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listNearbyMerchants(@Param("param") NearbyQueryParam param, @Param("size") int size);
+    List<MerchantDTO> listRecommendMerchants(@Param("region") int region, @Param("param") LocationQueryParam param,
+                                             @Param("size") int size);
 
     /**
      * 查询商家
      *
-     * @param param 查询参数
+     * @param region 所属地区
+     * @param param  查询参数
+     * @param size   商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listSimpleMerchants(MerchantQueryParam param);
+    List<MerchantDTO> listSimpleMerchants(@Param("region") int region, @Param("param") MerchantQueryParam param,
+                                          @Param("size") int size);
 }

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

@@ -88,6 +88,11 @@ public class Merchant extends ModifyEntity<Long> {
      */
     private Integer sale;
 
+    /**
+     * 所属地区
+     */
+    private Integer region;
+
     /**
      * 经度
      */

+ 7 - 8
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantServiceImpl.java

@@ -6,9 +6,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.chelvc.cloud.vehicle.api.dto.CategoryDTO;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDetailDTO;
+import com.chelvc.cloud.vehicle.api.param.LocationQueryParam;
 import com.chelvc.cloud.vehicle.api.param.MerchantQueryParam;
-import com.chelvc.cloud.vehicle.api.param.NearbyQueryParam;
-import com.chelvc.cloud.vehicle.api.param.PointQueryParam;
 import com.chelvc.cloud.vehicle.server.copier.CategoryCopier;
 import com.chelvc.cloud.vehicle.server.copier.MerchantCopier;
 import com.chelvc.cloud.vehicle.server.dao.MerchantMapper;
@@ -37,18 +36,18 @@ public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> i
     private final CategoryService categoryService;
 
     @Override
-    public List<MerchantDTO> listRecommendMerchants(@NonNull PointQueryParam param, int size) {
-        return this.baseMapper.listRecommendMerchants(param, size);
+    public List<MerchantDTO> listNearbyMerchants(int region, @NonNull LocationQueryParam param, int size) {
+        return this.baseMapper.listNearbyMerchants(region, param, size);
     }
 
     @Override
-    public List<MerchantDTO> listNearbyMerchants(@NonNull NearbyQueryParam param, int size) {
-        return this.baseMapper.listNearbyMerchants(param, size);
+    public List<MerchantDTO> listRecommendMerchants(int region, @NonNull LocationQueryParam param, int size) {
+        return this.baseMapper.listRecommendMerchants(region, param, size);
     }
 
     @Override
-    public List<MerchantDTO> listSimpleMerchants(@NonNull MerchantQueryParam param) {
-        return this.baseMapper.listSimpleMerchants(param);
+    public List<MerchantDTO> listSimpleMerchants(int region, @NonNull MerchantQueryParam param, int size) {
+        return this.baseMapper.listSimpleMerchants(region, param, size);
     }
 
     @Override

+ 57 - 24
vehicle-server/src/main/resources/mapper/MerchantMapper.xml

@@ -3,45 +3,78 @@
 <mapper namespace="com.chelvc.cloud.vehicle.server.dao.MerchantMapper">
     <sql id="BASIC_MERCHANT_SELECT">
         select mt.id, mt.user_id, mt.name, mt.logo, mt.banners, mt.liaison, mt.mobile, mt.opening, mt.address,
-        mt.score, mt.sale, mt.longitude, mt.latitude, mt.recommend, mt.status, mt.creator, mt.create_time,
+        mt.score, mt.sale, mt.region, mt.longitude, mt.latitude, mt.recommend, mt.status, mt.creator, mt.create_time,
         mt.updater, mt.update_time
         from `merchant` mt
     </sql>
 
-    <select id="listRecommendMerchants" resultType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
-        select mt.id, mt.user_id, mt.name, mt.logo, mt.banners, mt.liaison, mt.mobile, mt.opening, mt.address,
-        mt.score, mt.sale, mt.longitude, mt.latitude, mt.recommend, mt.status, mt.creator, mt.create_time,
-        mt.updater, mt.update_time,
+    <select id="listNearbyMerchants" resultType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
+        select mt.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})
         )) distance
         from `merchant` mt
-        where mt.status = 'ONLINE' and mt.recommend = 1
-        order by mt.create_time desc limit #{size}
+        <where>
+            <if test="region > 0">
+                mt.region = #{region}
+            </if>
+            and mt.status = 'ONLINE'
+        </where>
+        order by distance asc limit #{size}
     </select>
 
-    <select id="listNearbyMerchants" resultType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
-        select mt.id, mt.user_id, mt.name, mt.logo, mt.banners, mt.liaison, mt.mobile, mt.opening, mt.address,
-        mt.score, mt.sale, mt.longitude, mt.latitude, mt.recommend, mt.status, mt.creator, mt.create_time,
-        mt.updater, mt.update_time, t.distance
+    <select id="listRecommendMerchants" resultType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
+        select mt.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})
+        )) distance
         from `merchant` mt
-        inner join (
-            select id,
-            round(st_distance_sphere(
-                point(longitude, latitude), point(#{param.longitude}, #{param.latitude})
-            )) distance
-            from `merchant`
-            where status = 'ONLINE'
-            having distance <![CDATA[<=]]> #{param.distance}
-            order by distance asc limit #{size}
-        ) t on t.id = mt.id
+        <where>
+            <if test="region > 0">
+                mt.region = #{region}
+            </if>
+            and mt.status = 'ONLINE' and mt.recommend = 1
+        </where>
+        order by distance asc limit #{size}
     </select>
 
     <select id="listSimpleMerchants" resultType="com.chelvc.cloud.vehicle.api.dto.MerchantDTO">
-        select
-        from `merchant`
+        select mt.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})
+        )) distance
+        from `merchant` mt
+        <if test="param.categoryId != null or (param.keyword != null and !keyword.isEmpty())">
+            inner join `goods` gs on gs.merchant_id = mt.id
+            <if test="param.categoryId != null">
+                and gs.category_id = #{param.categoryId}
+            </if>
+            <if test="param.keyword != null and !keyword.isEmpty()">
+                and (gs.name like concat('%', #{param.keyword}, '%') or gs.description like concat('%', #{param.keyword}, '%'))
+            </if>
+            and gs.status = 'ONLINE'
+        </if>
         <where>
-
+            <if test="param.offset != null">
+                mt.id > #{param.offset}
+            </if>
+            <if test="region > 0">
+                and mt.region = #{region}
+            </if>
+            and mt.status = 'ONLINE'
         </where>
+        <if test="param.sort != null and param.sort.name == 'SYNTHESE'">
+            order by mt.recommend desc
+        </if>
+        <if test="param.sort != null and param.sort.name == 'NEAREST'">
+            order by distance desc
+        </if>
+        <if test="param.sort != null and param.sort.name == 'FAVORITE'">
+            order by mt.score desc
+        </if>
+        <if test="param.sort != null and param.sort.name == 'BESTSELLING'">
+            order by mt.sale desc
+        </if>
+        limit #{size}
     </select>
 </mapper>