Ver Fonte

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/GoodsService.java
#	vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/GoodsCopier.java
#	vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/GoodsServiceImpl.java
liude há 1 ano atrás
pai
commit
2e330f7942
34 ficheiros alterados com 585 adições e 192 exclusões
  1. 7 0
      vehicle-api/pom.xml
  2. 12 1
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/CommentDTO.java
  3. 8 2
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/GoodsDTO.java
  4. 36 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/GoodsDetailDTO.java
  5. 5 4
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/MerchantDetailDTO.java
  6. 37 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CommentQueryParam.java
  7. 41 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/GoodsQueryParam.java
  8. 41 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/LocationQueryParam.java
  9. 8 14
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/MerchantQueryParam.java
  10. 0 27
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/NearbyQueryParam.java
  11. 0 30
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/PointQueryParam.java
  12. 13 0
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/CommentService.java
  13. 18 15
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/GoodsService.java
  14. 6 6
      vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/MerchantService.java
  15. 7 0
      vehicle-server/pom.xml
  16. 6 22
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/GoodsCopier.java
  17. 13 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/CommentMapper.java
  18. 14 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/CouponMapper.java
  19. 15 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/GoodsMapper.java
  20. 14 6
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/MerchantMapper.java
  21. 7 2
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Comment.java
  22. 10 2
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Goods.java
  23. 5 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Merchant.java
  24. 12 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/CommentService.java
  25. 12 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/CouponService.java
  26. 15 3
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/GoodsService.java
  27. 32 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CommentServiceImpl.java
  28. 9 0
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java
  29. 46 13
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/GoodsServiceImpl.java
  30. 20 20
      vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/MerchantServiceImpl.java
  31. 25 0
      vehicle-server/src/main/resources/mapper/CommentMapper.xml
  32. 22 0
      vehicle-server/src/main/resources/mapper/CouponMapper.xml
  33. 18 2
      vehicle-server/src/main/resources/mapper/GoodsMapper.xml
  34. 51 20
      vehicle-server/src/main/resources/mapper/MerchantMapper.xml

+ 7 - 0
vehicle-api/pom.xml

@@ -16,10 +16,17 @@
     <version>1.0.0-SNAPSHOT</version>
 
     <properties>
+        <uc-api.version>1.0.0-SNAPSHOT</uc-api.version>
         <framework-base.version>1.0.0-RELEASE</framework-base.version>
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>com.chelvc.cloud</groupId>
+            <artifactId>uc-api</artifactId>
+            <version>${uc-api.version}</version>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>com.chelvc.framework</groupId>
             <artifactId>framework-base</artifactId>

+ 12 - 1
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/CommentDTO.java

@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
+import com.chelvc.cloud.uc.api.dto.UserDTO;
 import com.chelvc.framework.base.model.File;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -11,7 +12,7 @@ import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
 
 /**
- * 商家评论信息
+ * 商品评价信息
  *
  * @author xp
  * @data 2023/3/31
@@ -46,6 +47,11 @@ public class CommentDTO implements Serializable {
      */
     private Long merchantId;
 
+    /**
+     * 评价打分
+     */
+    private Double score;
+
     /**
      * 评论内容
      */
@@ -60,4 +66,9 @@ public class CommentDTO implements Serializable {
      * 创建时间
      */
     private Date createTime;
+
+    /**
+     * 用户信息
+     */
+    private UserDTO user;
 }

+ 8 - 2
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/GoodsDTO.java

@@ -4,6 +4,7 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
 import com.chelvc.cloud.vehicle.api.constant.GoodsStatus;
 import com.chelvc.framework.base.model.File;
 import lombok.AllArgsConstructor;
@@ -27,6 +28,11 @@ public class GoodsDTO implements Serializable {
      */
     private Long id;
 
+    /**
+     * 分类类型
+     */
+    private CategoryType type;
+
     /**
      * 分类ID
      */
@@ -78,9 +84,9 @@ public class GoodsDTO implements Serializable {
     private Integer sale;
 
     /**
-     * 优惠券列表
+     * 优惠券ID列表
      */
-    private String coupons;
+    private List<Long> couponIds;
 
     /**
      * 商品状态

+ 36 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/GoodsDetailDTO.java

@@ -0,0 +1,36 @@
+package com.chelvc.cloud.vehicle.api.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 商品详情
+ *
+ * @author Woody
+ * @date 2023/8/6
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class GoodsDetailDTO implements Serializable {
+    /**
+     * 商品信息
+     */
+    private GoodsDTO goods;
+
+    /**
+     * 优惠券列表
+     */
+    private List<CouponDTO> coupons;
+
+    /**
+     * 评价列表
+     */
+    private List<CommentDTO> comments;
+}

+ 5 - 4
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/dto/MerchantDetailDTO.java

@@ -3,6 +3,7 @@ package com.chelvc.cloud.vehicle.api.dto;
 import java.io.Serializable;
 import java.util.List;
 
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -25,12 +26,12 @@ public class MerchantDetailDTO implements Serializable {
     private MerchantDTO merchant;
 
     /**
-     * 分类列表
+     * 商品列表
      */
-    private List<CategoryDTO> categories;
+    private List<GoodsDTO> goods;
 
     /**
-     * 商品信息
+     * 分类类型列表
      */
-    private MerchantGoodsDTO goods;
+    private List<CategoryType> categories;
 }

+ 37 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/CommentQueryParam.java

@@ -0,0 +1,37 @@
+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 lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 商品评价查询参数
+ *
+ * @author Woody
+ * @date 2023/8/7
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CommentQueryParam implements Serializable {
+    /**
+     * 偏移评价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;
+}

+ 41 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/GoodsQueryParam.java

@@ -0,0 +1,41 @@
+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 com.chelvc.cloud.vehicle.api.constant.CategoryType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * @author Woody
+ * @date 2023/8/6
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class GoodsQueryParam implements Serializable {
+    /**
+     * 商品分类类型
+     */
+    private CategoryType type;
+
+    /**
+     * 偏移商品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;
+}

+ 41 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/LocationQueryParam.java

@@ -0,0 +1,41 @@
+package com.chelvc.cloud.vehicle.api.param;
+
+import java.io.Serializable;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 经纬度查询参数
+ *
+ * @author Woody
+ * @date 2023/5/5
+ */
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+public class LocationQueryParam implements Serializable {
+    /**
+     * 地区编码
+     */
+    @NotNull(message = "地区编码不能为空")
+    @Min(value = 100000, message = "地区编码不能小于100000")
+    private Integer region;
+
+    /**
+     * 经度
+     */
+    @NotNull(message = "经度不能为空")
+    private Double longitude;
+
+    /**
+     * 纬度
+     */
+    @NotNull(message = "纬度不能为空")
+    private Double latitude;
+}

+ 8 - 14
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/MerchantQueryParam.java

@@ -1,6 +1,6 @@
 package com.chelvc.cloud.vehicle.api.param;
 
-import java.io.Serializable;
+import java.util.List;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
@@ -9,7 +9,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 +24,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 {
     /**
      * 关键字
      */
@@ -66,4 +58,6 @@ public class MerchantQueryParam implements Serializable {
     @Min(value = 1, message = "查询数量不能小于1")
     @Max(value = 20, message = "查询数量不能大于20")
     private Integer size;
+
+    private List<String> a;
 }

+ 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;
-}

+ 0 - 30
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/param/PointQueryParam.java

@@ -1,30 +0,0 @@
-package com.chelvc.cloud.vehicle.api.param;
-
-import java.io.Serializable;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.experimental.SuperBuilder;
-
-/**
- * 经纬度查询参数
- *
- * @author Woody
- * @date 2023/5/5
- */
-@Data
-@SuperBuilder
-@NoArgsConstructor
-@AllArgsConstructor
-public class PointQueryParam implements Serializable {
-    /**
-     * 经度
-     */
-    private double longitude;
-
-    /**
-     * 纬度
-     */
-    private double latitude;
-}

+ 13 - 0
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/CommentService.java

@@ -1,5 +1,10 @@
 package com.chelvc.cloud.vehicle.api.service;
 
+import java.util.List;
+
+import com.chelvc.cloud.vehicle.api.dto.CommentDTO;
+import com.chelvc.cloud.vehicle.api.param.CommentQueryParam;
+
 /**
  * 商家评论业务接口
  *
@@ -7,4 +12,12 @@ package com.chelvc.cloud.vehicle.api.service;
  * @data 2023/3/31
  */
 public interface CommentService {
+    /**
+     * 获取商品评价列表
+     *
+     * @param goodsId 商品ID
+     * @param param   查询参数
+     * @return 评价列表
+     */
+    List<CommentDTO> listGoodsComments(Long goodsId, CommentQueryParam param);
 }

+ 18 - 15
vehicle-api/src/main/java/com/chelvc/cloud/vehicle/api/service/GoodsService.java

@@ -1,29 +1,32 @@
 package com.chelvc.cloud.vehicle.api.service;
 
+import java.util.List;
+
 import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
-import com.chelvc.cloud.vehicle.api.param.GoodsPagingParam;
-import com.chelvc.cloud.vehicle.api.param.MerchantPagingParam;
-import com.chelvc.framework.base.model.Pagination;
+import com.chelvc.cloud.vehicle.api.dto.GoodsDetailDTO;
+import com.chelvc.cloud.vehicle.api.param.GoodsQueryParam;
+
 /**
- * 商业务接口
+ * 商业务接口
  *
- * @author liude
- * @date 2023/7/18
+ * @author Woody
+ * @date 2023/8/6
  */
 public interface GoodsService {
     /**
-     * 查询服务
+     * 获取商品详情
      *
-     * @param param 查询参数
-     * @return 服务分页信息
+     * @param id 商品ID
+     * @return 商品详情
      */
-    Pagination<GoodsDTO> getGoodsPaging(GoodsPagingParam param);
+    GoodsDetailDTO getGoodsDetail(Long id);
 
     /**
-     * 查询服务详情
-     * @param id
-     * @return
+     * 查询商家商品
+     *
+     * @param merchantId 商家ID
+     * @param param      查询参数
+     * @return 商品列表
      */
-    GoodsDTO getGoods(Long id);
-
+    List<GoodsDTO> listMerchantSimpleGoods(Long merchantId, GoodsQueryParam param);
 }

+ 6 - 6
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,27 +15,28 @@ import com.chelvc.cloud.vehicle.api.param.PointQueryParam;
  */
 public interface MerchantService {
     /**
-     * 获取推荐商家
+     * 获取附近商家
      *
      * @param param 查询参数
      * @param size  商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listRecommendMerchants(PointQueryParam param, int size);
+    List<MerchantDTO> listNearbyMerchants(LocationQueryParam param, int size);
 
     /**
-     * 获取附近商家
+     * 获取推荐商家
      *
      * @param param 查询参数
      * @param size  商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listNearbyMerchants(NearbyQueryParam param, int size);
+    List<MerchantDTO> listRecommendMerchants(LocationQueryParam param, int size);
 
     /**
      * 查询商家
      *
      * @param param 查询参数
+     * @param size  商家数量
      * @return 商家信息列表
      */
     List<MerchantDTO> listSimpleMerchants(MerchantQueryParam param);

+ 7 - 0
vehicle-server/pom.xml

@@ -16,6 +16,7 @@
     <version>1.0.0-SNAPSHOT</version>
 
     <properties>
+        <uc-api.version>1.0.0-SNAPSHOT</uc-api.version>
         <vehicle-api.version>1.0.0-SNAPSHOT</vehicle-api.version>
         <framework-base.version>1.0.0-RELEASE</framework-base.version>
         <framework-redis.version>1.0.0-RELEASE</framework-redis.version>
@@ -24,6 +25,12 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>com.chelvc.cloud</groupId>
+            <artifactId>uc-api</artifactId>
+            <version>${uc-api.version}</version>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>com.chelvc.cloud</groupId>
             <artifactId>vehicle-api</artifactId>

+ 6 - 22
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/copier/GoodsCopier.java

@@ -3,19 +3,14 @@ package com.chelvc.cloud.vehicle.server.copier;
 import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
 import org.mapstruct.Builder;
-import org.mapstruct.IterableMapping;
 import org.mapstruct.Mapper;
-import org.mapstruct.Named;
 import org.mapstruct.factory.Mappers;
 
-import java.util.Collection;
-import java.util.List;
-
 /**
- * 服务信息拷贝接口
+ * 商品信息拷贝接口
  *
- * @author liude
- * @date 2023/7/22
+ * @author Woody
+ * @date 2023/8/6
  */
 @Mapper(builder = @Builder(disableBuilder = true))
 public interface GoodsCopier {
@@ -25,21 +20,10 @@ public interface GoodsCopier {
     GoodsCopier INSTANCE = Mappers.getMapper(GoodsCopier.class);
 
     /**
-     * 服务信息拷贝
+     * 商品信息拷贝
      *
-     * @param goods 服务信息
-     * @return 商信息
+     * @param detail 商品详情
+     * @return 商信息
      */
-    @Named("entity2dto")
     GoodsDTO copying(Goods goods);
-
-    /**
-     * 服务信息拷贝
-     *
-     * @param goods 服务信息集合
-     * @return 服务信息列表
-     */
-    @IterableMapping(qualifiedByName = "entity2dto")
-    List<GoodsDTO> copying(Collection<Goods> goods);
-
 }

+ 13 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/CommentMapper.java

@@ -1,8 +1,13 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
+import java.util.List;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.api.dto.CommentDTO;
+import com.chelvc.cloud.vehicle.api.param.CommentQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Comment;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 商家评价数据操作接口
@@ -12,4 +17,12 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface CommentMapper extends BaseMapper<Comment> {
+    /**
+     * 获取商品评价列表
+     *
+     * @param goodsId 商品ID
+     * @param param   查询参数
+     * @return 评价列表
+     */
+    List<CommentDTO> listGoodsComments(@Param("goodsId") Long goodsId, @Param("param") CommentQueryParam param);
 }

+ 14 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/CouponMapper.java

@@ -1,8 +1,13 @@
 package com.chelvc.cloud.vehicle.server.dao;
 
+import java.util.Collection;
+import java.util.List;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
 import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 优惠券数据操作接口
@@ -12,4 +17,13 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface CouponMapper extends BaseMapper<Coupon> {
+    /**
+     * 获取用户针对某个商品的可用优惠券
+     *
+     * @param userId         用户ID
+     * @param goodsCouponIds 商品优惠券ID集合
+     * @return 优惠券列表
+     */
+    List<CouponDTO> listUserGoodsActiveCoupons(@Param("userId") Long userId,
+                                               @Param("goodsCouponIds") Collection<Long> goodsCouponIds);
 }

+ 15 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/GoodsMapper.java

@@ -3,6 +3,9 @@ package com.chelvc.cloud.vehicle.server.dao;
 import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
+import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
+import com.chelvc.cloud.vehicle.api.param.GoodsQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -16,10 +19,19 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface GoodsMapper extends BaseMapper<Goods> {
     /**
-     * 获取商家商品分类ID
+     * 查询商家商品
      *
      * @param merchantId 商家ID
-     * @return 分类ID列表
+     * @param param      查询参数
+     * @return 商品列表
      */
-    List<Long> listMerchantGoodsCategoryIdentities(@Param("merchantId") Long merchantId);
+    List<GoodsDTO> listMerchantSimpleGoods(@Param("merchantId") Long merchantId, @Param("param") GoodsQueryParam param);
+
+    /**
+     * 获取商家商品分类类型
+     *
+     * @param merchantId 商家ID
+     * @return 分类类型列表
+     */
+    List<CategoryType> listMerchantGoodsCategoryTypes(@Param("merchantId") Long merchantId);
 }

+ 14 - 6
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/dao/MerchantMapper.java

@@ -4,8 +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.NearbyQueryParam;
-import com.chelvc.cloud.vehicle.api.param.PointQueryParam;
+import com.chelvc.cloud.vehicle.api.param.LocationQueryParam;
+import com.chelvc.cloud.vehicle.api.param.MerchantQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Merchant;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -19,20 +19,28 @@ import org.apache.ibatis.annotations.Param;
 @Mapper
 public interface MerchantMapper extends BaseMapper<Merchant> {
     /**
-     * 获取推荐商家
+     * 获取附近商家
      *
      * @param param 查询参数
      * @param size  商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listRecommendMerchants(@Param("param") PointQueryParam param, @Param("size") int size);
+    List<MerchantDTO> listNearbyMerchants(@Param("param") LocationQueryParam param, @Param("size") int size);
 
     /**
-     * 获取附近商家
+     * 获取推荐商家
      *
      * @param param 查询参数
      * @param size  商家数量
      * @return 商家信息列表
      */
-    List<MerchantDTO> listNearbyMerchants(@Param("param") NearbyQueryParam param, @Param("size") int size);
+    List<MerchantDTO> listRecommendMerchants(@Param("param") LocationQueryParam param, @Param("size") int size);
+
+    /**
+     * 查询商家
+     *
+     * @param param 查询参数
+     * @return 商家信息列表
+     */
+    List<MerchantDTO> listSimpleMerchants(MerchantQueryParam param);
 }

+ 7 - 2
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Comment.java

@@ -16,7 +16,7 @@ import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
 
 /**
- * 服务评价数据模型
+ * 商品评价数据模型
  *
  * @author xp
  * @data 2023/4/1
@@ -54,7 +54,12 @@ public class Comment implements Entity<Long> {
     private Long merchantId;
 
     /**
-     * 评论内容
+     * 评价打分
+     */
+    private Double score;
+
+    /**
+     * 评价内容
      */
     private String content;
 

+ 10 - 2
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/entity/Goods.java

@@ -6,10 +6,12 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
 import com.chelvc.cloud.vehicle.api.constant.GoodsStatus;
 import com.chelvc.framework.base.model.File;
 import com.chelvc.framework.database.entity.ModifyEntity;
 import com.chelvc.framework.database.interceptor.FilesTypeHandler;
+import com.chelvc.framework.database.interceptor.LongsTypeHandler;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -37,6 +39,11 @@ public class Goods extends ModifyEntity<Long> {
     @TableId(type = IdType.ASSIGN_ID)
     private Long id;
 
+    /**
+     * 分类类型
+     */
+    private CategoryType type;
+
     /**
      * 分类ID
      */
@@ -89,9 +96,10 @@ public class Goods extends ModifyEntity<Long> {
     private Integer sale;
 
     /**
-     * 优惠券列表
+     * 优惠券ID列表
      */
-    private String coupons;
+    @TableField(typeHandler = LongsTypeHandler.class)
+    private List<Long> couponIds;
 
     /**
      * 商品状态

+ 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;
+
     /**
      * 经度
      */

+ 12 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/CommentService.java

@@ -1,6 +1,10 @@
 package com.chelvc.cloud.vehicle.server.service;
 
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.chelvc.cloud.vehicle.api.dto.CommentDTO;
+import com.chelvc.cloud.vehicle.api.param.CommentQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Comment;
 
 /**
@@ -10,4 +14,12 @@ import com.chelvc.cloud.vehicle.server.entity.Comment;
  * @data 2023/3/31
  */
 public interface CommentService extends IService<Comment> {
+    /**
+     * 获取商品评价列表
+     *
+     * @param goodsId 商品ID
+     * @param param   查询参数
+     * @return 评价列表
+     */
+    List<CommentDTO> listGoodsComments(Long goodsId, CommentQueryParam param);
 }

+ 12 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/CouponService.java

@@ -1,6 +1,10 @@
 package com.chelvc.cloud.vehicle.server.service;
 
+import java.util.Collection;
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
 import com.chelvc.cloud.vehicle.server.entity.Coupon;
 
 /**
@@ -10,4 +14,12 @@ import com.chelvc.cloud.vehicle.server.entity.Coupon;
  * @date 2023/7/17
  */
 public interface CouponService extends IService<Coupon> {
+    /**
+     * 获取用户针对某个商品的可用优惠券
+     *
+     * @param userId         用户ID
+     * @param goodsCouponIds 商品优惠券ID集合
+     * @return 优惠券列表
+     */
+    List<CouponDTO> listUserGoodsActiveCoupons(Long userId, Collection<Long> goodsCouponIds);
 }

+ 15 - 3
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/GoodsService.java

@@ -3,6 +3,9 @@ package com.chelvc.cloud.vehicle.server.service;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
+import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
+import com.chelvc.cloud.vehicle.api.param.GoodsQueryParam;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
 
 /**
@@ -13,10 +16,19 @@ import com.chelvc.cloud.vehicle.server.entity.Goods;
  */
 public interface GoodsService extends IService<Goods> {
     /**
-     * 获取商家商品分类ID
+     * 获取商家商品分类类型
      *
      * @param merchantId 商家ID
-     * @return 分类ID列表
+     * @return 分类类型列表
      */
-    List<Long> listMerchantGoodsCategoryIdentities(Long merchantId);
+    List<CategoryType> listMerchantGoodsCategoryTypes(Long merchantId);
+
+    /**
+     * 查询商家商品
+     *
+     * @param merchantId 商家ID
+     * @param param      查询参数
+     * @return 商品列表
+     */
+    List<GoodsDTO> listMerchantSimpleGoods(Long merchantId, GoodsQueryParam param);
 }

+ 32 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CommentServiceImpl.java

@@ -1,10 +1,24 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.uc.api.dto.UserDTO;
+import com.chelvc.cloud.uc.api.service.UserService;
+import com.chelvc.cloud.vehicle.api.dto.CommentDTO;
+import com.chelvc.cloud.vehicle.api.param.CommentQueryParam;
 import com.chelvc.cloud.vehicle.server.dao.CommentMapper;
 import com.chelvc.cloud.vehicle.server.entity.Comment;
 import com.chelvc.cloud.vehicle.server.service.CommentService;
+import lombok.NonNull;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.util.CollectionUtils;
 
 /**
  * 商家评论业务操作实现
@@ -15,4 +29,22 @@ import org.apache.dubbo.config.annotation.DubboService;
 @DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.CommentService.class)
 public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> implements CommentService,
         com.chelvc.cloud.vehicle.api.service.CommentService {
+    @DubboReference
+    private UserService userService;
+
+    @Override
+    public List<CommentDTO> listGoodsComments(@NonNull Long goodsId, @NonNull CommentQueryParam param) {
+        // 获取商品评价列表
+        List<CommentDTO> comments = this.baseMapper.listGoodsComments(goodsId, param);
+
+        // 加载评价用户信息
+        Set<Long> userIds = CollectionUtils.isEmpty(comments) ? Collections.emptySet() :
+                comments.stream().map(CommentDTO::getUserId).filter(Objects::nonNull).collect(Collectors.toSet());
+        if (!CollectionUtils.isEmpty(userIds)) {
+            Map<Long, UserDTO> users = this.userService.listUsers(userIds).stream()
+                    .collect(Collectors.toMap(UserDTO::getId, user -> user));
+            comments.forEach(comment -> comment.setUser(users.get(comment.getUserId())));
+        }
+        return comments;
+    }
 }

+ 9 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/CouponServiceImpl.java

@@ -1,9 +1,14 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import java.util.Collection;
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.dto.CouponDTO;
 import com.chelvc.cloud.vehicle.server.dao.CouponMapper;
 import com.chelvc.cloud.vehicle.server.entity.Coupon;
 import com.chelvc.cloud.vehicle.server.service.CouponService;
+import lombok.NonNull;
 import org.springframework.stereotype.Service;
 
 /**
@@ -14,4 +19,8 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements CouponService {
+    @Override
+    public List<CouponDTO> listUserGoodsActiveCoupons(@NonNull Long userId, Collection<Long> goodsCouponIds) {
+        return this.baseMapper.listUserGoodsActiveCoupons(userId, goodsCouponIds);
+    }
 }

+ 46 - 13
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/GoodsServiceImpl.java

@@ -1,38 +1,71 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
 import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
-import com.chelvc.cloud.vehicle.api.param.GoodsPagingParam;
+import com.chelvc.cloud.vehicle.api.dto.GoodsDetailDTO;
+import com.chelvc.cloud.vehicle.api.param.CommentQueryParam;
+import com.chelvc.cloud.vehicle.api.param.GoodsQueryParam;
 import com.chelvc.cloud.vehicle.server.copier.GoodsCopier;
 import com.chelvc.cloud.vehicle.server.dao.GoodsMapper;
 import com.chelvc.cloud.vehicle.server.entity.Goods;
+import com.chelvc.cloud.vehicle.server.service.CommentService;
+import com.chelvc.cloud.vehicle.server.service.CouponService;
 import com.chelvc.cloud.vehicle.server.service.GoodsService;
-import com.chelvc.framework.base.model.Pagination;
-import com.chelvc.framework.base.util.StringUtils;
-import com.chelvc.framework.database.util.PagingUtils;
+import com.chelvc.framework.base.context.SessionContextHolder;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 
 /**
  * 商品业务操作实现
  *
- * @author liude
+ * @author Woody
  * @date 2023/7/17
  */
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
 @DubboService(interfaceClass = com.chelvc.cloud.vehicle.api.service.GoodsService.class)
 public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements GoodsService,
         com.chelvc.cloud.vehicle.api.service.GoodsService {
+    private final CouponService couponService;
+    private final CommentService commentService;
+
+    @Override
+    public List<CategoryType> listMerchantGoodsCategoryTypes(@NonNull Long merchantId) {
+        List<CategoryType> types = this.baseMapper.listMerchantGoodsCategoryTypes(merchantId);
+        if (!CollectionUtils.isEmpty(types)) {
+            types.sort(CategoryType::compareTo);
+        }
+        return types;
+    }
 
     @Override
-    public Pagination<GoodsDTO> getGoodsPaging(@NonNull GoodsPagingParam param) {
-        Page<Goods> page = this.lambdaQuery()
-                .like(StringUtils.nonEmpty(param.getName()), Goods::getName, param.getName())
-                .orderByAsc(Goods::getStatus).page(PagingUtils.convert(param.getPaging()));
-        return PagingUtils.convert(page, GoodsCopier.INSTANCE::copying);
+    public GoodsDetailDTO getGoodsDetail(@NonNull Long id) {
+        GoodsDetailDTO detail = GoodsDetailDTO.builder().build();
+
+        // 获取商品信息
+        Goods goods = DatabaseContextHolder.getRequireEntity(this, id, "商品不存在");
+        detail.setGoods(GoodsCopier.INSTANCE.copying(goods));
+
+        // 获取用户可用优惠券
+        if (!CollectionUtils.isEmpty(goods.getCouponIds())) {
+            Long userId = SessionContextHolder.getId();
+            detail.setCoupons(this.couponService.listUserGoodsActiveCoupons(userId, goods.getCouponIds()));
+        }
+
+        // 获取商品评价列表
+        CommentQueryParam param = CommentQueryParam.builder().size(10).build();
+        detail.setComments(this.commentService.listGoodsComments(id, param));
+        return detail;
     }
+
     @Override
-    public GoodsDTO getGoods(@NonNull Long id){
-        return GoodsCopier.INSTANCE.copying(this.getById(id));
+    public List<GoodsDTO> listMerchantSimpleGoods(@NonNull Long merchantId, @NonNull GoodsQueryParam param) {
+        return this.baseMapper.listMerchantSimpleGoods(merchantId, param);
     }
 }

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

@@ -3,21 +3,19 @@ package com.chelvc.cloud.vehicle.server.service.impl;
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.chelvc.cloud.vehicle.api.dto.CategoryDTO;
+import com.chelvc.cloud.vehicle.api.constant.CategoryType;
+import com.chelvc.cloud.vehicle.api.dto.GoodsDTO;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDTO;
 import com.chelvc.cloud.vehicle.api.dto.MerchantDetailDTO;
+import com.chelvc.cloud.vehicle.api.param.GoodsQueryParam;
+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;
 import com.chelvc.cloud.vehicle.server.entity.Merchant;
-import com.chelvc.cloud.vehicle.server.service.CategoryService;
 import com.chelvc.cloud.vehicle.server.service.GoodsService;
 import com.chelvc.cloud.vehicle.server.service.MerchantService;
-import com.chelvc.framework.base.util.ErrorUtils;
-import com.chelvc.framework.base.util.ObjectUtils;
+import com.chelvc.framework.database.context.DatabaseContextHolder;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -34,34 +32,36 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class MerchantServiceImpl extends ServiceImpl<MerchantMapper, Merchant> implements MerchantService,
         com.chelvc.cloud.vehicle.api.service.MerchantService {
     private final GoodsService goodsService;
-    private final CategoryService categoryService;
 
     @Override
-    public List<MerchantDTO> listRecommendMerchants(@NonNull PointQueryParam param, int size) {
-        return this.baseMapper.listRecommendMerchants(param, size);
+    public List<MerchantDTO> listNearbyMerchants(@NonNull LocationQueryParam param, int size) {
+        return this.baseMapper.listNearbyMerchants(param, size);
     }
 
     @Override
-    public List<MerchantDTO> listNearbyMerchants(@NonNull NearbyQueryParam param, int size) {
-        return this.baseMapper.listNearbyMerchants(param, size);
+    public List<MerchantDTO> listRecommendMerchants(@NonNull LocationQueryParam param, int size) {
+        return this.baseMapper.listRecommendMerchants(param, size);
     }
 
     @Override
     public List<MerchantDTO> listSimpleMerchants(@NonNull MerchantQueryParam param) {
-        return MerchantCopier.INSTANCE.copying(this.list());
+        return this.baseMapper.listSimpleMerchants(param);
     }
 
     @Override
     public MerchantDetailDTO getMerchantDetail(@NonNull Long id) {
         // 获取商家信息
-        MerchantDTO merchant = MerchantCopier.INSTANCE.copying(this.getById(id));
-        ErrorUtils.requireResource(merchant, "商家信息不存在");
+        MerchantDTO merchant = MerchantCopier.INSTANCE.copying(
+                DatabaseContextHolder.getRequireEntity(this, id, "商家不存在")
+        );
 
-        // 获取商家商品分类信息
-        List<Long> categoryIds = this.goodsService.listMerchantGoodsCategoryIdentities(id);
-        List<CategoryDTO> categories = CategoryCopier.INSTANCE.copying(
-                ObjectUtils.ifEmpty(categoryIds, this.categoryService::listByIds)
+        // 获取商家全部商品列表
+        List<GoodsDTO> goods = this.goodsService.listMerchantSimpleGoods(
+                id, GoodsQueryParam.builder().size(10).build()
         );
-        return MerchantDetailDTO.builder().merchant(merchant).categories(categories).build();
+
+        // 获取商家商品分类类型列表
+        List<CategoryType> types = this.goodsService.listMerchantGoodsCategoryTypes(id);
+        return MerchantDetailDTO.builder().merchant(merchant).goods(goods).categories(types).build();
     }
 }

+ 25 - 0
vehicle-server/src/main/resources/mapper/CommentMapper.xml

@@ -0,0 +1,25 @@
+<?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.CommentMapper">
+    <resultMap id="SIMPLE_COMMENT_RESULT_MAP" type="com.chelvc.cloud.vehicle.api.dto.CommentDTO">
+        <id column="id" property="id" jdbcType="BIGINT"/>
+        <result column="user_id" property="userId" jdbcType="BIGINT"/>
+        <result column="score" property="score" jdbcType="DOUBLE"/>
+        <result column="content" property="content" jdbcType="VARCHAR"/>
+        <result column="attachments" property="attachments" jdbcType="VARCHAR"
+                typeHandler="com.chelvc.framework.database.interceptor.FilesTypeHandler"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <select id="listGoodsComments" resultMap="SIMPLE_COMMENT_RESULT_MAP">
+        select id, user_id, score, content, attachments, create_time
+        from `comment`
+        <where>
+            goods_id = #{goodsId}
+            <if test="param.offset != null">
+                and id > #{param.offset}
+            </if>
+        </where>
+        order by create_time desc limit #{param.size}
+    </select>
+</mapper>

+ 22 - 0
vehicle-server/src/main/resources/mapper/CouponMapper.xml

@@ -0,0 +1,22 @@
+<?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.CouponMapper">
+    <select id="listUserGoodsActiveCoupons" resultType="com.chelvc.cloud.vehicle.api.dto.CouponDTO">
+        select cn.id, cn.type, cn.name, cn.amount, cn.reduce, cn.discount, cn.expiration
+        from `coupon` cn
+        left join `user_coupon` ucn on ucn.coupon_id = cn.id and ucn.user_id = #{userId}
+        <where>
+            ucn.id is null
+            and (
+            cn.merchant_id = 0
+            <if test="goodsCouponIds != null and !goodsCouponIds.isEmpty()">
+                or cn.id in
+                <foreach collection="goodsCouponIds" item="id" open="(" close=")" separator=",">
+                    #{id}
+                </foreach>
+            </if>
+            )
+            and cn.expiration > now() and cn.status = 'ONLINE'
+        </where>
+    </select>
+</mapper>

+ 18 - 2
vehicle-server/src/main/resources/mapper/GoodsMapper.xml

@@ -1,8 +1,24 @@
 <?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.GoodsMapper">
-    <select id="listMerchantGoodsCategoryIdentities" resultType="long">
-        select distinct category_id
+    <select id="listMerchantSimpleGoods" resultType="com.chelvc.cloud.vehicle.api.dto.GoodsDTO">
+        select id, name, logo, original_price, special_price, score, sale
+        from `goods`
+        <where>
+            merchant_id = #{merchantId}
+            <if test="param.offset != null">
+                and id > #{param.offset}
+            </if>
+            <if test="param.type != null">
+                and type = #{param.type}
+            </if>
+            and status = 'ONLINE'
+        </where>
+        limit #{param.size}
+    </select>
+
+    <select id="listMerchantGoodsCategoryTypes" resultType="com.chelvc.cloud.vehicle.api.constant.CategoryType">
+        select distinct type
         from `goods`
         where merchant_id = #{merchantId} and status = 'ONLINE'
     </select>

+ 51 - 20
vehicle-server/src/main/resources/mapper/MerchantMapper.xml

@@ -3,37 +3,68 @@
 <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="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.region = #{param.region} and mt.status = 'ONLINE'
+        order by distance asc limit #{size}
+    </select>
+
     <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 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 mt.region = #{param.region} and mt.status = 'ONLINE' and mt.recommend = 1
+        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="listSimpleMerchants" 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(#{longitude}, #{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
+        <if test="categoryId != null or (keyword != null and !keyword.isEmpty())">
+            left join `goods` gs on gs.merchant_id = mt.id
+            <if test="categoryId != null">
+                and gs.category_id = #{categoryId}
+            </if>
+            <if test="keyword != null and !keyword.isEmpty()">
+                and (gs.name like concat('%', #{keyword}, '%') or gs.description like concat('%', #{keyword}, '%'))
+            </if>
+            and gs.status = 'ONLINE'
+        </if>
+        <where>
+            <if test="offset != null">
+                mt.id > #{offset}
+            </if>
+            mt.region = #{region} and mt.status = 'ONLINE'
+            <if test="keyword != null and !keyword.isEmpty()">
+                and mt.name like concat('%', #{keyword}, '%')
+            </if>
+        </where>
+        <if test="sort != null and sort.name == 'SYNTHESE'">
+            order by mt.recommend desc
+        </if>
+        <if test="sort != null and sort.name == 'NEAREST'">
+            order by distance desc
+        </if>
+        <if test="sort != null and sort.name == 'FAVORITE'">
+            order by mt.score desc
+        </if>
+        <if test="sort != null and sort.name == 'BESTSELLING'">
+            order by mt.sale desc
+        </if>
+        limit #{size}
     </select>
 </mapper>