فهرست منبع

呵呵商城优惠券

Aslee 3 سال پیش
والد
کامیت
1ed0bbea79
30فایلهای تغییر یافته به همراه1409 افزوده شده و 124 حذف شده
  1. 131 0
      src/main/java/com/caimei/controller/CouponApi.java
  2. 12 1
      src/main/java/com/caimei/controller/HeHeApi.java
  3. 7 3
      src/main/java/com/caimei/controller/OrderSubmitApi.java
  4. 13 8
      src/main/java/com/caimei/controller/ProductApi.java
  5. 2 1
      src/main/java/com/caimei/controller/ShoppingCartApi.java
  6. 150 0
      src/main/java/com/caimei/mapper/CouponMapper.java
  7. 20 0
      src/main/java/com/caimei/mapper/OrderSubmitMapper.java
  8. 20 0
      src/main/java/com/caimei/mapper/ProductMapper.java
  9. 22 0
      src/main/java/com/caimei/model/dto/CouponsDto.java
  10. 5 0
      src/main/java/com/caimei/model/po/CmOrderPo.java
  11. 42 0
      src/main/java/com/caimei/model/po/CouponOrderRecordPo.java
  12. 84 0
      src/main/java/com/caimei/model/po/CouponPo.java
  13. 36 0
      src/main/java/com/caimei/model/po/CouponSharePo.java
  14. 48 0
      src/main/java/com/caimei/model/po/ReceiveCouponPo.java
  15. 82 0
      src/main/java/com/caimei/model/vo/CouponVo.java
  16. 5 0
      src/main/java/com/caimei/model/vo/OrderVo.java
  17. 5 0
      src/main/java/com/caimei/model/vo/ProductVo.java
  18. 90 0
      src/main/java/com/caimei/service/CouponService.java
  19. 5 2
      src/main/java/com/caimei/service/OrderSubmitService.java
  20. 8 3
      src/main/java/com/caimei/service/ProductService.java
  21. 1 1
      src/main/java/com/caimei/service/ShoppingCartService.java
  22. 191 0
      src/main/java/com/caimei/service/impl/CouponServiceImpl.java
  23. 102 13
      src/main/java/com/caimei/service/impl/OrderSubmitServiceImpl.java
  24. 44 88
      src/main/java/com/caimei/service/impl/ProductServiceImpl.java
  25. 10 2
      src/main/java/com/caimei/service/impl/ShoppingCartServiceImpl.java
  26. 206 0
      src/main/resources/mapper/CouponMapper.xml
  27. 1 0
      src/main/resources/mapper/OrderMapper.xml
  28. 42 0
      src/main/resources/mapper/OrderSubmitMapper.xml
  29. 24 0
      src/main/resources/mapper/ProductMapper.xml
  30. 1 2
      src/main/resources/mapper/ShoppingCartMapper.xml

+ 131 - 0
src/main/java/com/caimei/controller/CouponApi.java

@@ -0,0 +1,131 @@
+package com.caimei.controller;
+
+import com.caimei.model.ResponseJson;
+import com.caimei.model.dto.CouponsDto;
+import com.caimei.model.vo.CouponVo;
+import com.caimei.model.vo.ProductVo;
+import com.caimei.service.CouponService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/10/26
+ */
+@Api(tags = "优惠券API")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/coupon")
+public class CouponApi {
+    private final CouponService couponService;
+
+
+    @ApiOperation("首页优惠券弹窗展示")
+    @ApiImplicitParam(name = "userId", value = "用户id", required = false)
+    @GetMapping("/display")
+    public ResponseJson<Map<String,Integer>> couponDisplay(Integer userId) {
+        return couponService.couponDisplay(userId);
+    }
+
+    @ApiOperation("领券中心")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = false, name = "userId", value = "机构用户id"),
+            @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
+            @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
+    })
+    @GetMapping("/center")
+    public ResponseJson<PageInfo<CouponVo>> couponCenter(Integer userId, @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                               @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        return couponService.couponCenter(userId, pageNum, pageSize);
+    }
+    @ApiOperation("领取优惠券")
+    @PostMapping("/collar")
+    public ResponseJson<String> collarCoupons(@RequestBody CouponsDto couponsDto) {
+        if (couponsDto.getCouponId() == null || couponsDto.getUserId() == null) {
+            return ResponseJson.error("参数异常", null);
+        }
+        return couponService.collarCoupons(couponsDto);
+    }
+
+    @ApiOperation("已领取优惠券中心")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "userId", value = "机构用户id"),
+            @ApiImplicitParam(required = false, name = "status", value = "使用状态: 1未使用 2已使用 3已失效"),
+            @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
+            @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
+    })
+    @GetMapping("/receive/list")
+    public ResponseJson<PageInfo<CouponVo>> receiveCouponList(Integer userId, Integer status,
+                                                         @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                         @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        if (userId == null || status == null) {
+            return ResponseJson.error("参数异常", null);
+        }
+        return couponService.receiveCouponList(userId, status, pageNum, pageSize);
+    }
+
+    @ApiOperation("商品详情优惠券")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = false, name = "productId", value = "机构用户id"),
+            @ApiImplicitParam(required = false, name = "userId", value = "机构用户id")
+    })
+    @GetMapping("/product/detail")
+    public ResponseJson<List<CouponVo>> productDetailCoupons(Integer productId, Integer userId) {
+        if (productId == null) {
+            return ResponseJson.error("参数异常", null);
+        }
+        return couponService.productDetailCoupons(productId, userId);
+    }
+
+    @ApiOperation("统计已领取优惠券数量")
+    @ApiImplicitParam(required = true, name = "userId", value = "机构用户id")
+    @GetMapping("/receive/count")
+    public ResponseJson<Map<String, Integer>> receiveCount(Integer userId) {
+        if (userId == null) {
+            return ResponseJson.error("参数异常", null);
+        }
+        return couponService.receiveCount(userId);
+    }
+
+    @ApiOperation("优惠券部分商品数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "couponId", value = "优惠券id"),
+            @ApiImplicitParam(required = true, name = "userId", value = "用户id"),
+            @ApiImplicitParam(required = false, name = "productName", value = "商品名称"),
+            @ApiImplicitParam(required = false, name = "pageNum", value = "页码"),
+            @ApiImplicitParam(required = false, name = "pageSize", value = "每页数量")
+    })
+    @GetMapping("/product/page")
+    public ResponseJson<PageInfo<ProductVo>> productPage(Integer couponId, Integer userId, String productName,
+                                                         @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
+                                                         @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
+        if (couponId == null || userId == null) {
+            return ResponseJson.error("参数异常", null);
+        }
+        return couponService.productPage(couponId, userId, productName, pageNum, pageSize);
+    }
+
+    @ApiOperation("根据商品id获取相关优惠券")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "userId", value = "用户id"),
+            @ApiImplicitParam(required = true, name = "productIds", value = "商品id,以逗号隔开")
+    })
+    @GetMapping("/productIds")
+    public ResponseJson<Map<String, Object>> couponsByProductIds(Integer userId, String productIds) {
+        if (null == userId || StringUtils.isEmpty(productIds)) {
+            return ResponseJson.error("参数异常", null);
+        }
+        return couponService.couponsByProductIds(userId, productIds);
+    }
+}

+ 12 - 1
src/main/java/com/caimei/controller/HeHeApi.java

@@ -3,10 +3,12 @@ package com.caimei.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei.model.ResponseJson;
+import com.caimei.service.CouponService;
 import com.caimei.util.HttpRequest;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
 
@@ -26,6 +28,9 @@ public class HeHeApi {
     @Value("${caimei.userUrl}")
     private String userUrl;
 
+    @Autowired
+    private CouponService couponService;
+
     @ApiOperation("微信授权登录")
     @GetMapping("/authorization")
     public ResponseJson<String> authorization(String code) throws Exception {
@@ -39,7 +44,13 @@ public class HeHeApi {
     public ResponseJson<String> mobileLogin(@RequestBody Map<String, Object> param) throws Exception {
         String url = userUrl + "/user/he/mobile/login";
         String parameters = HttpRequest.sendPost(url, param);
-        return getResponseJson(parameters);
+        ResponseJson<String> responseJson = getResponseJson(parameters);
+        Integer shareUserId = (Integer) param.get("shareUserId");
+        if (responseJson.getCode() == 0 && null != shareUserId) {
+            JSONObject data = JSONObject.parseObject(responseJson.getData());
+            couponService.saveCouponShareRecord(data,shareUserId);
+        }
+        return responseJson;
     }
 
     @ApiOperation("发送手机号验证码")

+ 7 - 3
src/main/java/com/caimei/controller/OrderSubmitApi.java

@@ -35,14 +35,15 @@ public class OrderSubmitApi {
      */
     @ApiOperation("商品结算")
     @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "机构用户id", required = true),
             @ApiImplicitParam(name = "cartIds", value = "购物车ID串用逗号隔开", required = false),
             @ApiImplicitParam(name = "productId", value = "立即购买商品ID", required = false),
             @ApiImplicitParam(name = "productCount", value = "立即购买商品数量", required = false),
             @ApiImplicitParam(name = "heUserId", value = "分销者用户id", required = false)
     })
     @GetMapping("/confirm")
-    public ResponseJson<Map<String, Object>> orderConfirm(String cartIds, Integer productId, Integer productCount, Integer heUserId) {
-        return orderSubmitService.orderConfirm(cartIds, productId, productCount, heUserId);
+    public ResponseJson<Map<String, Object>> orderConfirm(Integer userId, String cartIds, Integer productId, Integer productCount, Integer heUserId) {
+        return orderSubmitService.orderConfirm(userId, cartIds, productId, productCount, heUserId);
     }
 
     /**
@@ -52,6 +53,7 @@ public class OrderSubmitApi {
      *               *   "userId": 10708,        //机构用户ID
      *               *   "cartType":3,               //购买类型:(1购物车提交[对应表cm_cart],2直接购买提交)
      *               *   "addressId": 2732,          //地址ID
+     *               *   "couponId": 12             //优惠券ID
      *               *   "orderInfo": [
      *               *                   { "shopId":1001,    // 供应商ID
      *               *                     "note":备注,
@@ -80,6 +82,7 @@ public class OrderSubmitApi {
         Integer userId = null;
         Integer cartType = null;
         Integer addressId = null;
+        Integer couponId = null;
         List<Map<String, Object>> orderInfo = null;
         Map<String, Object> payInfo = null;
         Map<String, Object> orderInvoice = null;
@@ -101,6 +104,7 @@ public class OrderSubmitApi {
             if (null == addressId) {
                 return ResponseJson.error("地址数据异常", null);
             }
+            couponId = paramsMap.getInteger("couponId");
             orderInfo = (List<Map<String, Object>>) paramsMap.get("orderInfo");
             if (null == orderInfo) {
                 return ResponseJson.error("订单商品数据异常", null);
@@ -115,6 +119,6 @@ public class OrderSubmitApi {
         }
 
         log.info("****** 提交订单参数:【机构自己下单】:" + params);
-        return orderSubmitService.orderSubmit(userId, cartType, addressId, orderInfo, payInfo);
+        return orderSubmitService.orderSubmit(userId, cartType, addressId, couponId, orderInfo, payInfo);
     }
 }

+ 13 - 8
src/main/java/com/caimei/controller/ProductApi.java

@@ -40,21 +40,23 @@ public class ProductApi {
 
     @ApiOperation("首页楼层")
     @GetMapping("/floor")
-    public ResponseJson<List<FloorVo>> productFloor() {
-        return productService.productFloor();
+    @ApiImplicitParam(name = "userId", required = true, value = "用户id")
+    public ResponseJson<List<FloorVo>> productFloor(Integer userId) {
+        return productService.productFloor(userId);
     }
 
     @ApiOperation("首页楼层详情")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "floorId", value = "楼层Id", required = true),
+            @ApiImplicitParam(name = "userId", value = "机构用户Id", required = false),
             @ApiImplicitParam(name = "productName", value = "商品名称", required = false),
             @ApiImplicitParam(name = "pageNum", value = "第几页", required = false),
             @ApiImplicitParam(name = "pageSize", value = "一页多少条", required = false)
     })
     @GetMapping("/floor/detail")
-    public ResponseJson<PageInfo<ProductVo>> floorDetail(Integer floorId,String productName, @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
-                                             @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
-        return productService.floorDetail(floorId, productName, pageNum, pageSize);
+    public ResponseJson<PageInfo<ProductVo>> floorDetail(Integer floorId, Integer userId, String productName, @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
+                                                         @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        return productService.floorDetail(floorId, userId, productName, pageNum, pageSize);
     }
 
     @ApiOperation("商品列表")
@@ -71,10 +73,13 @@ public class ProductApi {
     }
 
     @ApiOperation("商品详情")
-    @ApiImplicitParam(name = "productId", required = true, value = "商品Id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "productId", required = true, value = "商品Id"),
+            @ApiImplicitParam(name = "userId", required = true, value = "机构用户Id")
+    })
     @GetMapping("/details")
-    public ResponseJson<ProductVo> productDetails(Integer productId) {
-        return productService.productDetails(productId);
+    public ResponseJson<ProductVo> productDetails(Integer productId, Integer userId) {
+        return productService.productDetails(productId, userId);
     }
 
     @ApiOperation("商品搜索历史记录")

+ 2 - 1
src/main/java/com/caimei/controller/ShoppingCartApi.java

@@ -71,10 +71,11 @@ public class ShoppingCartApi {
     @ApiOperation("更新购物车商品数量")
     @ApiImplicitParam(name = "params", value = "cartId:购物车id;productCount:商品数量", required = true)
     @PostMapping("/update")
-    public void updateNumber(@RequestBody Map<String, Integer> params) {
+    public ResponseJson updateNumber(@RequestBody Map<String, Integer> params) {
         Integer cartId = params.get("cartId");
         Integer productCount = params.get("productCount");
         shoppingCartService.updateNumber(cartId, productCount);
+        return ResponseJson.success("更新成功");
     }
 
     /**

+ 150 - 0
src/main/java/com/caimei/mapper/CouponMapper.java

@@ -0,0 +1,150 @@
+package com.caimei.mapper;
+
+import com.caimei.model.po.CouponPo;
+import com.caimei.model.po.CouponSharePo;
+import com.caimei.model.po.ReceiveCouponPo;
+import com.caimei.model.vo.*;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/10/26
+ */
+@Mapper
+public interface CouponMapper {
+
+    /**
+     * 优惠券类型
+     * @param couponType    劵类型 1活动券 2专享券 3新人券 4好友分享券 5好友消费券
+     * @return
+     */
+    Integer getCouponCount(int couponType);
+
+    /**
+     * 获取进行中的优惠券Id
+     * @param couponType    劵类型 1活动券 2专享券 3新人券 4好友分享券 5好友消费券
+     * @return
+     */
+    String getCurrentCouponIds(int couponType);
+
+
+    /**
+     * 校验该用户的领取期限是否到期
+     *
+     * @param couponId
+     * @param userId
+     * @return
+     */
+    boolean checkReceiveFlag(@Param("couponId") Integer couponId, @Param("userId") Integer userId);
+
+    /**
+     * 查询用户的注册时间
+     * @param userId
+     * @return
+     */
+    Date getUserRegisterTime(Integer userId);
+
+    /**
+     * 首页活动券券展示记录
+     *
+     * @param couponId 优惠券id
+     * @param userId   用户id
+     * @return
+     */
+    int getDisplayRecordCount(@Param("couponId") Integer couponId, @Param("userId") Integer userId);
+
+    /**
+     * 查询可领取的优惠券列表
+     *
+     * @param userId       用户id
+     * @param productIdArr
+     * @param registerTime
+     * @return
+     */
+    List<CouponVo> findCouponList(@Param("userId") Integer userId, @Param("productIdArr") String[] productIdArr, @Param("registerTime") Date registerTime, @Param("couponType") Integer couponType);
+
+    /**
+     * 查询已领取的优惠券列表
+     *
+     * @param userId
+     * @param productIdArr
+     * @param receiveCouponId
+     * @param status
+     * @return
+     */
+    List<CouponVo> findReceiveCouponList(@Param("userId") Integer userId, @Param("productIdArr") String[] productIdArr, @Param("receiveCouponId") Integer receiveCouponId, @Param("status") Integer status);
+
+    /**
+     * 查询已领取的优惠券数量
+     *
+     * @param userId
+     * @param status
+     * @return
+     */
+    Integer findCouponNum(Integer userId, int status);
+
+    /**
+     * 查询优惠券商品
+     * @param couponId  优惠券id
+     * @param productName
+     * @return
+     */
+    List<ProductVo> getCouponProduct(Integer couponId, String productName);
+
+    /**
+     * 查询优惠券所有商品id
+     * @param couponId
+     * @return
+     */
+    String getCouponProductIds(Integer couponId);
+
+    /**
+     * 保存优惠券弹窗记录
+     * @param couponId
+     * @param userId
+     */
+    void insertDisplayRecord(@Param("couponId") Integer couponId, @Param("userId") Integer userId);
+
+    /**
+     * 根据用户id和优惠券id查询已领取优惠券id
+     *
+     * @param userId
+     * @param couponId
+     * @return
+     */
+    Integer findReceiveCouponId(@Param("userId") Integer userId, @Param("couponId") Integer couponId);
+
+    /**
+     * 用户领取优惠券保存
+     * @param receiveCoupon
+     */
+    void insertReceiveCoupon(ReceiveCouponPo receiveCoupon);
+
+    /**
+     * 插入优惠券分享记录
+     * @param couponSharePo
+     */
+    void insertCouponShare(CouponSharePo couponSharePo);
+
+    /**
+     * 根据被分享者用户id查询优惠券分享记录Id
+     * @param receiveUserId
+     * @return
+     */
+    Integer getCouponShareId(Integer receiveUserId);
+
+    /**
+     * 更新优惠券分享记录的好友消费券id
+     *
+     * @param couponShareId
+     * @param consumeCouponIds
+     */
+    void updateCouponShareRecord(@Param("couponShareId") Integer couponShareId, @Param("consumeCouponIds") String consumeCouponIds);
+
+}

+ 20 - 0
src/main/java/com/caimei/mapper/OrderSubmitMapper.java

@@ -132,4 +132,24 @@ public interface OrderSubmitMapper {
      * @return
      */
     CartProductVo findProductById(Integer productId);
+
+    /**
+     * 查询购物车所有商品
+     * @param cartId    购物车id数组
+     * @return
+     */
+    List<CartProductVo> findCartProducts(String[] cartId);
+
+    /**
+     * 保存优惠券使用状态
+     * @param receiveCouponId
+     * @param orderID
+     */
+    void updateReceiveCouponStatus(@Param("receiveCouponId") Integer receiveCouponId, @Param("orderId") Long orderID);
+
+    /**
+     * 保存订单优惠记录
+     * @param orderRecord
+     */
+    void insertCouponOrderRecord(CouponOrderRecordPo orderRecord);
 }

+ 20 - 0
src/main/java/com/caimei/mapper/ProductMapper.java

@@ -187,4 +187,24 @@ public interface ProductMapper {
 
 
     FloorVo findFloorById(Integer floorId);
+
+    /**
+     * 查找全商城商品都可参加的优惠券数量
+     * @return
+     */
+    Integer findAllProductCouponCount();
+
+    /**
+     * 查找部分商品可参加的优惠券数量
+     * @return
+     */
+    Integer findPartProductCounponCount(Integer productId);
+
+    /**
+     * 查找商品内部优惠折扣
+     * @param productId
+     * @param userId
+     * @return
+     */
+    Integer findProductDiscount(@Param("productId") Integer productId, @Param("userId") Integer userId);
 }

+ 22 - 0
src/main/java/com/caimei/model/dto/CouponsDto.java

@@ -0,0 +1,22 @@
+package com.caimei.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/3/24
+ */
+@Data
+public class CouponsDto implements Serializable {
+
+    @ApiModelProperty("优惠券id")
+    private Integer couponId;
+
+    @ApiModelProperty("用户id")
+    private Integer userId;
+}

+ 5 - 0
src/main/java/com/caimei/model/po/CmOrderPo.java

@@ -315,5 +315,10 @@ public class CmOrderPo implements Serializable {
      */
     private Integer zeroCostFlag;
 
+    /**
+     * 优惠券金额(面值)
+     */
+    private BigDecimal couponAmount;
+
     private static final long serialVersionUID = 1L;
 }

+ 42 - 0
src/main/java/com/caimei/model/po/CouponOrderRecordPo.java

@@ -0,0 +1,42 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/8/30
+ */
+@Data
+public class CouponOrderRecordPo implements Serializable {
+    private Integer id;
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+    /**
+     * 用户领券id(对应cm_receive_coupon)
+     */
+    private Integer receiveCouponId;
+    /**
+     * 劵类型 1活动券 2专享券 3新人券 4好友分享券 5好友消费券
+     */
+    private Integer couponType;
+    /**
+     * 优惠券金额(面值)
+     */
+    private Double couponAmount;
+    /**
+     * 优惠满减条件金额
+     */
+    private Double touchPrice;
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+}
+

+ 84 - 0
src/main/java/com/caimei/model/po/CouponPo.java

@@ -0,0 +1,84 @@
+package com.caimei.model.po;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/8/12
+ */
+@Data
+public class CouponPo implements Serializable {
+    /**
+     * 优惠券id
+     */
+    private Integer id;
+
+    /**
+     * 优惠券金额(面值)
+     */
+    private BigDecimal couponAmount;
+
+    /**
+     * 优惠满减条件金额
+     */
+    private BigDecimal touchPrice;
+
+    /**
+     * 无门槛标记 0否 1是
+     */
+    private Integer noThresholdFlag;
+
+    /**
+     * 使用开始时间(有效期)
+     */
+    @JsonFormat(pattern = "yyyy.MM.dd", timezone = "GMT+8")
+    private Date startTime;
+
+    /**
+     * 使用结束时间(有效期)
+     */
+    @JsonFormat(pattern = "yyyy.MM.dd", timezone = "GMT+8")
+    private Date endTime;
+
+    /**
+     * 立即上架标记 0否 1是
+     */
+    private Integer startNowFlag;
+
+    /**
+     * 永久上架标记 0否 1是
+     */
+    private Integer permanentFlag;
+
+    /**
+     * 劵类型 1活动券 2专享券 3新人券 4好友分享券 5好友消费券
+     */
+    private Integer couponType;
+
+    /**
+     * 优惠商品:1全商城商品 2指定商品
+     */
+    private Integer productType;
+
+    /**
+     * 领取期限(天)
+     */
+    private Integer receivePeriod;
+
+    /**
+     * 领取期限同上下架时间标记(在上下架期间内都可领取)
+     */
+    private Integer receiveFlag;
+
+    /**
+     * 使用期限(天)
+     */
+    private Integer usePeriod;
+}

+ 36 - 0
src/main/java/com/caimei/model/po/CouponSharePo.java

@@ -0,0 +1,36 @@
+package com.caimei.model.po;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/11/3
+ */
+@Data
+public class CouponSharePo implements Serializable {
+    private Integer id;
+    /**
+     * 分享者用户id
+     */
+    private Integer shareUserId;
+    /**
+     * 被分享者用户id
+     */
+    private Integer receiveUserId;
+    /**
+     * 分享得到的好友分享券id,以,隔开
+     */
+    private String shareCouponIds;
+    /**
+     * 被分享者是否已消费,0未消费,1已消费
+     */
+    private Integer consumeFlag;
+    /**
+     * 分享对象消费后得到的好友消费券id
+     */
+    private String consumeCouponIds;
+}

+ 48 - 0
src/main/java/com/caimei/model/po/ReceiveCouponPo.java

@@ -0,0 +1,48 @@
+package com.caimei.model.po;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/10/28
+ */
+@Data
+public class ReceiveCouponPo implements Serializable {
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+
+    /**
+     * 用户id
+     */
+    private Integer userId;
+
+    /**
+     * 领取渠道:1小程序,2订单退回
+     */
+    private Integer source;
+
+    /**
+     * 状态:1未使用,2已使用
+     */
+    private Integer status;
+
+    /**
+     * 领取时间
+     */
+    private Date receiveTime;
+
+    /**
+     * 删除标志
+     */
+    private Integer delFlag;
+
+}

+ 82 - 0
src/main/java/com/caimei/model/vo/CouponVo.java

@@ -0,0 +1,82 @@
+package com.caimei.model.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author : plf
+ * @date : 2021/8/12
+ */
+@Data
+public class CouponVo implements Serializable {
+    /**
+     * 优惠券id
+     */
+    private Integer couponId;
+
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+
+    /**
+     * 优惠券金额(面值)
+     */
+    private BigDecimal couponAmount;
+
+    /**
+     * 优惠满减条件金额
+     */
+    private BigDecimal touchPrice;
+
+    /**
+     * 无门槛标记 0否 1是
+     */
+    private Integer noThresholdFlag;
+
+    /**
+     * 劵类型 1活动券 2专享券 3新人券 4好友分享券 5好友消费券
+     */
+    private Integer couponType;
+
+    /**
+     * 优惠商品:1全商城商品 2指定商品
+     */
+    private Integer productType;
+
+    /**
+     * 领取截止时间
+     */
+    private Date receivePeriod;
+
+    /**
+     * 使用截止时间
+     */
+    private Date usePeriod;
+
+    /**
+     * 使用状态: 0未领取 1未使用 2已使用 3已失效
+     */
+    private Integer useStatus;
+
+    /**
+     * 是否达到优惠条件:1达到,2未达到
+     */
+    private Integer touchFlag;
+
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+
+    /**
+     * 部分商品优惠券关联的商品id
+     */
+    private String productIds;
+}

+ 5 - 0
src/main/java/com/caimei/model/vo/OrderVo.java

@@ -164,6 +164,11 @@ public class OrderVo implements Serializable {
      */
     private BigDecimal freight;
 
+    /**
+     * 优惠券金额(面值)
+     */
+    private BigDecimal couponAmount;
+
     /**
      * 订单取消原因
      */

+ 5 - 0
src/main/java/com/caimei/model/vo/ProductVo.java

@@ -62,4 +62,9 @@ public class ProductVo implements Serializable {
      * 机构税率 :增值税默认13%,普通票6%取值范围[0-100]
      */
     private BigDecimal clubTaxPoint;
+
+    /**
+     * 优惠券标识是否显示
+     */
+    private Boolean couponsLogo = false;
 }

+ 90 - 0
src/main/java/com/caimei/service/CouponService.java

@@ -0,0 +1,90 @@
+package com.caimei.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.dto.CouponsDto;
+import com.caimei.model.vo.CouponVo;
+import com.caimei.model.vo.ProductVo;
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/10/26
+ */
+public interface CouponService {
+    /**
+     * 首页优惠券弹窗
+     * @param userId    用户id
+     * @return
+     */
+    ResponseJson<Map<String, Integer>> couponDisplay(Integer userId);
+
+    /**
+     * 领券中心
+     *
+     * @param userId   机构用户id
+     * @param pageNum  页码
+     * @param pageSize 每页数量
+     * @return
+     */
+    ResponseJson<PageInfo<CouponVo>> couponCenter(Integer userId, int pageNum, int pageSize);
+
+    /**
+     * 已领取优惠券中心
+     *
+     * @param userId   用户id
+     * @param status   使用状态: 1未使用 2已使用 3已失效
+     * @param pageNum  页码
+     * @param pageSize 每页数量
+     * @return
+     */
+    ResponseJson<PageInfo<CouponVo>> receiveCouponList(Integer userId, Integer status, int pageNum, int pageSize);
+
+    /**
+     * 统计已领取优惠券数量
+     * @param userId    用户id
+     * @return
+     */
+    ResponseJson<Map<String, Integer>> receiveCount(Integer userId);
+
+    /**
+     * 优惠券商品数据
+     * @param couponId  优惠券id
+     * @param userId    用户id
+     * @param productName
+     * @param pageNum   页码
+     * @param pageSize  每页数量
+     * @return
+     */
+    ResponseJson<PageInfo<ProductVo>> productPage(Integer couponId, Integer userId, String productName, int pageNum, int pageSize);
+
+    /**
+     * 领取优惠券
+     * @param couponsDto
+     * @return
+     */
+    ResponseJson<String> collarCoupons(CouponsDto couponsDto);
+
+
+    ResponseJson<List<CouponVo>> productDetailCoupons(Integer productId, Integer userId);
+
+    /**
+     * 根据商品id查询相关优惠券
+     * @param userId        用户id
+     * @param productIds    商品id,以逗号隔开
+     * @return
+     */
+    ResponseJson<Map<String, Object>> couponsByProductIds(Integer userId, String productIds);
+
+    /**
+     * 保存优惠券分享记录
+     * @param data
+     * @param shareUserId
+     */
+    void saveCouponShareRecord(JSONObject data, Integer shareUserId);
+}

+ 5 - 2
src/main/java/com/caimei/service/OrderSubmitService.java

@@ -15,13 +15,15 @@ public interface OrderSubmitService {
     /**
      * 商品结算
      *
+     *
+     * @param userId
      * @param cartIds      购物车ID串用逗号隔开。
      * @param productId    立即购买商品ID
      * @param productCount 立即购买商品数量
      * @param heUserId       用户id。
      * @return
      */
-    ResponseJson<Map<String, Object>> orderConfirm(String cartIds, Integer productId, Integer productCount, Integer heUserId);
+    ResponseJson<Map<String, Object>> orderConfirm(Integer userId, String cartIds, Integer productId, Integer productCount, Integer heUserId);
 
     /**
      * 提交订单
@@ -29,9 +31,10 @@ public interface OrderSubmitService {
      * @param userId
      * @param cartType
      * @param addressId
+     * @param couponId
      * @param orderInfo
      * @param payInfo
      * @return
      */
-    ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo);
+    ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, Integer couponId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo);
 }

+ 8 - 3
src/main/java/com/caimei/service/ProductService.java

@@ -40,7 +40,7 @@ public interface ProductService {
      * @param productId 商品id
      * @return
      */
-    ResponseJson<ProductVo> productDetails(Integer productId);
+    ResponseJson<ProductVo> productDetails(Integer productId, Integer userId);
 
     /**
      * 商品搜索历史记录
@@ -84,7 +84,7 @@ public interface ProductService {
      * 商品楼层
      * @return
      */
-    ResponseJson<List<FloorVo>> productFloor();
+    ResponseJson<List<FloorVo>> productFloor(Integer userId);
 
     /**
      * 楼层详情
@@ -93,5 +93,10 @@ public interface ProductService {
      * @param productName
      * @return
      */
-    ResponseJson<PageInfo<ProductVo>> floorDetail(Integer floorId, String productName, Integer pageNum, Integer pageSize);
+    ResponseJson<PageInfo<ProductVo>> floorDetail(Integer floorId, Integer userId, String productName, Integer pageNum, Integer pageSize);
+
+    /**
+     * 设置商品详情
+     */
+    void setProductDetails(ProductVo product, Integer userId);
 }

+ 1 - 1
src/main/java/com/caimei/service/ShoppingCartService.java

@@ -56,7 +56,7 @@ public interface ShoppingCartService {
     /**
      * 设置活动价格阶梯
      */
-    void setPrice(CartProductVo product);
+    void setPrice(CartProductVo product, Integer userId);
 
     /**
      * 再次购买,一键加入购物车

+ 191 - 0
src/main/java/com/caimei/service/impl/CouponServiceImpl.java

@@ -0,0 +1,191 @@
+package com.caimei.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei.mapper.CouponMapper;
+import com.caimei.model.ResponseJson;
+import com.caimei.model.dto.CouponsDto;
+import com.caimei.model.po.CouponPo;
+import com.caimei.model.po.CouponSharePo;
+import com.caimei.model.po.ReceiveCouponPo;
+import com.caimei.model.vo.*;
+import com.caimei.service.CouponService;
+import com.caimei.service.ProductService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * Description
+ *
+ * @author : Aslee
+ * @date : 2021/10/26
+ */
+@Service
+public class CouponServiceImpl implements CouponService {
+    @Resource
+    private CouponMapper couponMapper;
+    @Autowired
+    private ProductService productService;
+
+
+    @Override
+    public ResponseJson<Map<String, Integer>> couponDisplay(Integer userId) {
+        HashMap<String, Integer> map = new HashMap<>(2);
+        if (null == userId) {
+            // 查询进行中的新人券数量
+            Integer newUserCouponCount = couponMapper.getCouponCount(3);
+            // 查询进行中的活动券数量
+            Integer activityCouponCount = couponMapper.getCouponCount(1);
+            map.put("newUserCouponFlag", newUserCouponCount > 0 ? 1 : 0);
+            map.put("actCouponFlag", activityCouponCount > 0 ? 1 : 0);
+        } else {
+            // 是否展示新人券弹窗
+            boolean newUserDisplayFlag = checkDisplayFlag(userId ,3);
+            // 是否展示活动券弹窗
+            boolean actDisplayFlag = checkDisplayFlag(userId, 1);
+            // 是否有可展示的专享券
+            boolean singleCouponFlag = checkDisplayFlag(userId, 2);
+            // 是否有可展示的好友分享券
+            boolean shareCouponFlag = checkDisplayFlag(userId, 4);
+            // 是否有可展示的好友消费券
+            boolean consumeCouponFlag = checkDisplayFlag(userId, 5);
+            map.put("newUserCouponFlag", newUserDisplayFlag ? 1 : 0);
+            map.put("actCouponFlag", actDisplayFlag ? 1 : 0);
+            map.put("otherCouponFlag", singleCouponFlag || shareCouponFlag || consumeCouponFlag ? 1 : 0);
+        }
+        return ResponseJson.success(map);
+    }
+
+    private boolean checkDisplayFlag(Integer userId, Integer couponType) {
+        // 查询该用户的注册时间
+        Date registerTime = couponMapper.getUserRegisterTime(userId);
+        // 查询用户可领取该类型的优惠券
+        List<CouponVo> couponList = couponMapper.findCouponList(userId, null, registerTime, couponType);
+        boolean displayFlag = false;
+        CouponVo coupon = null;
+        if (couponList != null && couponList.size() > 0) {
+            coupon = couponList.get(0);
+        }
+        if (null == coupon) {
+            return false;
+        }
+        // 查询是否已经对该用户弹窗展示过
+        int displayCount = couponMapper.getDisplayRecordCount(coupon.getCouponId(), userId);
+        if (displayCount <= 0) {
+            couponMapper.insertDisplayRecord(coupon.getCouponId(), userId);
+            displayFlag = true;
+        }
+        return displayFlag;
+    }
+
+    @Override
+    public ResponseJson<PageInfo<CouponVo>> couponCenter(Integer userId, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        Date registerTime = couponMapper.getUserRegisterTime(userId);
+        List<CouponVo> couponList = couponMapper.findCouponList(userId, null, registerTime, null);
+        PageInfo<CouponVo> pageInfo = new PageInfo<>(couponList);
+        return ResponseJson.success(pageInfo);
+    }
+
+    @Override
+    public ResponseJson<PageInfo<CouponVo>> receiveCouponList(Integer userId, Integer status, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<CouponVo> couponList = couponMapper.findReceiveCouponList(userId, null, null, status);
+        couponList.forEach(coupon -> coupon.setUseStatus(status));
+        PageInfo<CouponVo> pageInfo = new PageInfo<>(couponList);
+        return ResponseJson.success(pageInfo);
+    }
+
+    @Override
+    public ResponseJson<Map<String, Integer>> receiveCount(Integer userId) {
+        Map<String, Integer> map = new HashMap<>(3);
+        Integer unusedNum = couponMapper.findCouponNum(userId, 1);
+        Integer usedNum = couponMapper.findCouponNum(userId, 2);
+        Integer expiredNum = couponMapper.findCouponNum(userId, 3);
+        map.put("unusedNum", unusedNum);
+        map.put("usedNum", usedNum);
+        map.put("expiredNum", expiredNum);
+        return ResponseJson.success(map);
+    }
+
+    @Override
+    public ResponseJson<PageInfo<ProductVo>> productPage(Integer couponId, Integer userId, String productName, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum, pageSize);
+        List<ProductVo> productList = couponMapper.getCouponProduct(couponId, productName);
+        productList.forEach(product -> productService.setProductDetails(product,userId));
+        PageInfo<ProductVo> pageInfo = new PageInfo<>(productList);
+        return ResponseJson.success(pageInfo);
+    }
+
+    @Override
+    public ResponseJson<String> collarCoupons(CouponsDto couponsDto) {
+        Integer receiveCouponId = couponMapper.findReceiveCouponId(couponsDto.getUserId(), couponsDto.getCouponId());
+        if (receiveCouponId != null && receiveCouponId > 0) {
+            return ResponseJson.error("已经领取过了", null);
+        }
+        ReceiveCouponPo receiveCoupon = new ReceiveCouponPo();
+        BeanUtils.copyProperties(couponsDto, receiveCoupon);
+        receiveCoupon.setSource(1);
+        receiveCoupon.setStatus(1);
+        receiveCoupon.setReceiveTime(new Date());
+        receiveCoupon.setDelFlag(0);
+        couponMapper.insertReceiveCoupon(receiveCoupon);
+        return ResponseJson.success("领取成功");
+    }
+
+    @Override
+    public ResponseJson<List<CouponVo>> productDetailCoupons(Integer productId, Integer userId) {
+        Date registerTime = couponMapper.getUserRegisterTime(userId);
+        // 所有优惠券列表
+        List<CouponVo> totalCouponList = new ArrayList<>();
+        // 可领取优惠券列表
+        String[] productArr = new String[1];
+        productArr[0] = productId + "";
+        List<CouponVo> couponList = couponMapper.findCouponList(userId, productArr, registerTime,null);
+        totalCouponList.addAll(couponList);
+        // 已领取优惠券列表
+        List<CouponVo> receiveCouponList;
+        if (null != userId && userId > 0) {
+            receiveCouponList = couponMapper.findReceiveCouponList(userId, productArr, null, 1);
+            if (null != receiveCouponList) {
+                receiveCouponList.forEach(receiveCoupon -> receiveCoupon.setUseStatus(1));
+                totalCouponList.addAll(receiveCouponList);
+            }
+        }
+        if (totalCouponList.size() > 0) {
+            totalCouponList.sort(Comparator.comparing(CouponVo::getCreateDate));
+        }
+        return ResponseJson.success(totalCouponList);
+    }
+
+    @Override
+    public ResponseJson<Map<String, Object>> couponsByProductIds(Integer userId, String productIds) {
+        Map<String,Object> couponsMap = new HashMap<>(2);
+        String[] productIdArr = productIds.split(",");
+        Date registerTime = couponMapper.getUserRegisterTime(userId);
+        // 包含productIds的可领取优惠券列表
+        List<CouponVo> ableCouponList = couponMapper.findCouponList(userId, productIdArr, registerTime, null);
+        // 包含productIds的已领取优惠券列表
+        List<CouponVo> receiveCouponList = couponMapper.findReceiveCouponList(userId, productIdArr, null, 1);
+        receiveCouponList.forEach(coupon -> coupon.setUseStatus(1));
+        couponsMap.put("ableCouponList", ableCouponList);
+        couponsMap.put("receiveCouponList", receiveCouponList);
+        return ResponseJson.success(couponsMap);
+    }
+
+    @Override
+    public void saveCouponShareRecord(JSONObject data, Integer shareUserId) {
+        Integer receiveUserId = (Integer) data.get("userId");
+        CouponSharePo couponSharePo = new CouponSharePo();
+        couponSharePo.setShareUserId(shareUserId);
+        couponSharePo.setReceiveUserId(receiveUserId);
+        String shareCouponIds = couponMapper.getCurrentCouponIds(4);
+        couponSharePo.setShareCouponIds(shareCouponIds);
+        couponMapper.insertCouponShare(couponSharePo);
+    }
+}

+ 102 - 13
src/main/java/com/caimei/service/impl/OrderSubmitServiceImpl.java

@@ -1,13 +1,11 @@
 package com.caimei.service.impl;
 
+import com.caimei.mapper.CouponMapper;
 import com.caimei.mapper.OrderSubmitMapper;
 import com.caimei.mapper.ProductMapper;
 import com.caimei.model.ResponseJson;
 import com.caimei.model.po.*;
-import com.caimei.model.vo.ActivityLadderVo;
-import com.caimei.model.vo.AddressVo;
-import com.caimei.model.vo.CartProductVo;
-import com.caimei.model.vo.ShopVo;
+import com.caimei.model.vo.*;
 import com.caimei.service.OrderSubmitService;
 import com.caimei.service.ShoppingCartService;
 import com.caimei.util.MathUtil;
@@ -15,6 +13,7 @@ import com.caimei.util.OrderNoUtils;
 import com.caimei.util.ProductUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -42,15 +41,18 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
     private ShoppingCartService shoppingCartService;
     @Resource
     private ProductMapper productMapper;
+    @Resource
+    private CouponMapper couponMapper;
     @Value("${caimei.oldapi}")
     private String domain;
 
     @Override
-    public ResponseJson<Map<String, Object>> orderConfirm(String cartIds, Integer productId, Integer productCount, Integer heUserId) {
+    public ResponseJson<Map<String, Object>> orderConfirm(Integer userId, String cartIds, Integer productId, Integer productCount, Integer heUserId) {
         Map<String, Object> confirmData = new HashMap<>(5);
         log.info("<<<<< 结算订单 >>>>>");
         //商品总金额
-        AtomicReference<BigDecimal> totalPrice = new AtomicReference<BigDecimal>(BigDecimal.ZERO);
+        AtomicReference<BigDecimal> totalPrice = new AtomicReference<>(BigDecimal.ZERO);
+        List<CartProductVo> totalProducts = new ArrayList<>();
         List<ShopVo> shopList = new ArrayList<>();
         if (productId != null && productId > 0) {
             //立即购买
@@ -61,25 +63,66 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
         }
         shopList.forEach(shop -> {
             shop.setLogo(ProductUtils.getImageURL("shopLogo", shop.getLogo(), 0, domain));
-            List<CartProductVo> products = new ArrayList<>();
+            List<CartProductVo> shopProducts = new ArrayList<>();
             if (productId != null && productId > 0) {
                 CartProductVo cartProduct = orderSubmitMapper.findProductById(productId);
                 cartProduct.setProductCount(productCount);
                 cartProduct.setHeUserId(heUserId);
-                products.add(cartProduct);
+                shopProducts.add(cartProduct);
             } else {
                 String[] cartId = cartIds.split(",");
-                products = orderSubmitMapper.findByShopCartProduct(shop.getShopId(), cartId);
+                shopProducts = orderSubmitMapper.findByShopCartProduct(shop.getShopId(), cartId);
             }
             BigDecimal shopTotalPrice = BigDecimal.ZERO;
-            for (CartProductVo product : products) {
-                shoppingCartService.setPrice(product);
+            for (CartProductVo product : shopProducts) {
+                shoppingCartService.setPrice(product, userId);
                 shopTotalPrice = MathUtil.add(shopTotalPrice, MathUtil.mul(product.getProductCount(), product.getPrice()));
             }
             shop.setShopTotalPrice(shopTotalPrice);
-            shop.setProductList(products);
+            shop.setProductList(shopProducts);
+            totalProducts.addAll(shopProducts);
             totalPrice.set(MathUtil.add(totalPrice.get(), shopTotalPrice));
         });
+        // 用户所有可用优惠券
+        List<CouponVo> receiveCouponList = couponMapper.findReceiveCouponList(userId, null,null, 1);
+        receiveCouponList.forEach(coupon -> {
+            // 能参与该优惠券的总金额
+            BigDecimal touchCouponAmount = BigDecimal.ZERO;
+            if (coupon.getProductType() == 1) {
+                //全商城商品
+                touchCouponAmount = totalPrice.get();
+            } else {
+                // 参与优惠券的所有商品id
+                String couponProductIds = couponMapper.getCouponProductIds(coupon.getCouponId());
+                if (productId != null && productId > 0) {
+                    CartProductVo cartProduct = totalProducts.get(0);
+                    if (couponProductIds.contains(cartProduct.getProductId().toString())) {
+                        touchCouponAmount = totalPrice.get();
+                    }
+                } else {
+                    for (CartProductVo product : totalProducts) {
+                        if (couponProductIds.contains(product.getProductId().toString())) {
+                            touchCouponAmount = MathUtil.add(touchCouponAmount, MathUtil.mul(product.getProductCount(), product.getPrice()));
+                        }
+                    }
+                }
+            }
+            if (coupon.getNoThresholdFlag() == 1 || touchCouponAmount.compareTo(coupon.getTouchPrice()) > 0) {
+                // 满足优惠条件
+                coupon.setTouchFlag(1);
+            } else {
+                coupon.setTouchFlag(0);
+            }
+        });
+        receiveCouponList.sort((o1, o2) -> {
+            // 按满足优惠条件/优惠金额进行排序
+            if (!o1.getTouchFlag().equals(o2.getTouchFlag()) ) {
+                return o1.getTouchFlag() - o2.getTouchFlag();
+            } else {
+                return o1.getCouponAmount().compareTo(o2.getCouponAmount());
+            }
+        });
+        confirmData.put("receiveCouponList", receiveCouponList);
         confirmData.put("totalPrice", totalPrice);
         confirmData.put("shopList", shopList);
         return ResponseJson.success(confirmData);
@@ -87,7 +130,7 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo) {
+    public ResponseJson<Map<String, String>> orderSubmit(Integer userId, Integer cartType, Integer addressId, Integer couponId, List<Map<String, Object>> orderInfo, Map<String, Object> payInfo) {
         /*
          * 逻辑处理 start
          */
@@ -249,6 +292,25 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
             }
         }
 
+        //处理优惠券
+        BigDecimal couponAmount = BigDecimal.ZERO;
+        CouponVo coupon = null;
+        // 已领取优惠券id
+        Integer receiveCouponId = null;
+        if (null != couponId && couponId > 0) {
+            receiveCouponId = couponMapper.findReceiveCouponId(userId, couponId);
+            List<CouponVo> receiveCouponList = couponMapper.findReceiveCouponList(userId, null, receiveCouponId, 1);
+            if (receiveCouponList == null || receiveCouponList.size() <= 0) {
+                // 设置手动回滚事务
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return ResponseJson.error("优惠券使用异常", null);
+            } else {
+                coupon = receiveCouponList.get(0);
+            }
+            couponAmount = coupon.getCouponAmount();
+        }
+        order.setCouponAmount(couponAmount);
+
         // 设置是否是二手订单
         order.setSecondHandOrderFlag("0");
         order.setPromotionFullReduction(BigDecimal.ZERO);
@@ -267,6 +329,7 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
         payTotalFee = productTotalFee;
         orderTotalFee = productTotalFee;
         order.setOrderTotalFee(orderTotalFee);
+        payTotalFee = MathUtil.sub(payTotalFee, couponAmount);
         order.setPayTotalFee(payTotalFee);
         payableAmount = payTotalFee;
         // 订单状态
@@ -394,6 +457,32 @@ public class OrderSubmitServiceImpl implements OrderSubmitService {
             return ResponseJson.error("订单地址异常", null);
         }
 
+        /*
+         * 保存优惠券使用情况
+         */
+        if (null != receiveCouponId && receiveCouponId > 0) {
+            // 修改优惠券使用情况
+            orderSubmitMapper.updateReceiveCouponStatus(receiveCouponId, order.getOrderID());
+            CouponOrderRecordPo orderRecord = new CouponOrderRecordPo();
+            orderRecord.setOrderId(order.getOrderID().intValue());
+            orderRecord.setReceiveCouponId(receiveCouponId);
+            orderRecord.setCouponType(coupon.getCouponType());
+            orderRecord.setCouponAmount(coupon.getCouponAmount().doubleValue());
+            orderRecord.setTouchPrice(1 == coupon.getNoThresholdFlag() ? 0 : coupon.getTouchPrice().doubleValue());
+            orderRecord.setCreateDate(new Date());
+            //保存订单优惠记录
+            orderSubmitMapper.insertCouponOrderRecord(orderRecord);
+        }
+
+        /*
+         * 保存好友消费券赠送记录
+         */
+        Integer couponShareId = couponMapper.getCouponShareId(userId);
+        if (null != couponShareId) {
+            String consumeCouponIds = couponMapper.getCurrentCouponIds(5);
+            couponMapper.updateCouponShareRecord(couponShareId, consumeCouponIds);
+        }
+
         log.info("******************** 提交订单逻辑处理 end *******************");
         /*
          * 构造返回参数

+ 44 - 88
src/main/java/com/caimei/service/impl/ProductServiceImpl.java

@@ -41,25 +41,7 @@ public class ProductServiceImpl implements ProductService {
     public ResponseJson<PageInfo<ProductVo>> productList(String name, Integer userId, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
         List<ProductVo> productList = productMapper.findProductList(name);
-        productList.forEach((product) -> {
-            product.setMainImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
-            Integer activityId = productMapper.findActivityByProductId(product.getProductId());
-            if (activityId != null && activityId > 0) {
-                product.setActiveStatus(1);
-                //活动阶梯
-                List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
-                if (ladderList != null && ladderList.size() > 0) {
-                    product.setPrice(ladderList.get(0).getBuyPrice());
-                }
-            }
-            //税费
-            boolean addTaxFlag = ("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())));
-            if (addTaxFlag) {
-                BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(product.getPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
-                BigDecimal price = MathUtil.add(product.getPrice(), addedValueTax);
-                product.setPrice(price);
-            }
-        });
+        productList.forEach(product -> setProductDetails(product, userId));
         PageInfo<ProductVo> pageInfo = new PageInfo<>(productList);
 
         //搜索关键字
@@ -80,7 +62,42 @@ public class ProductServiceImpl implements ProductService {
     }
 
     @Override
-    public ResponseJson<ProductVo> productDetails(Integer productId) {
+    public void setProductDetails(ProductVo product, Integer userId) {
+        product.setMainImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
+        Integer activityId = productMapper.findActivityByProductId(product.getProductId());
+        if (activityId != null && activityId > 0) {
+            product.setActiveStatus(1);
+            //活动阶梯
+            List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
+            if (ladderList != null && ladderList.size() > 0) {
+                product.setPrice(ladderList.get(0).getBuyPrice());
+            }
+        }
+        Integer discount = productMapper.findProductDiscount(product.getProductId(), userId);
+        if (null != discount && discount > 0) {
+            product.setPrice(MathUtil.div(MathUtil.mul(product.getPrice(), discount), 100));
+        }
+        //税费
+        boolean addTaxFlag = ("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())));
+        if (addTaxFlag) {
+            BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(product.getPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
+            BigDecimal price = MathUtil.add(product.getPrice(), addedValueTax);
+            product.setPrice(price);
+        }
+        // 正在进行的全商城商品优惠券数量
+        Integer allCount = productMapper.findAllProductCouponCount();
+        if (allCount > 0) {
+            product.setCouponsLogo(true);
+        }
+        // 该商品参与的正在进行的部分商品优惠券
+        Integer partCount = productMapper.findPartProductCounponCount(product.getProductId());
+        if (partCount > 0) {
+            product.setCouponsLogo(true);
+        }
+    }
+
+    @Override
+    public ResponseJson<ProductVo> productDetails(Integer productId, Integer userId) {
         ProductDetailsVo product = productMapper.findProductByProductId(productId);
         if (product == null) {
             //商品不存在
@@ -101,7 +118,6 @@ public class ProductServiceImpl implements ProductService {
             split = list.toArray(new String[list.size()]);
         }
         product.setTagsList(split);
-        product.setMainImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
         //商品图片
         List<String> list = new ArrayList<>();
         List<String> imageList = productMapper.findProductImages(product.getProductId());
@@ -124,30 +140,7 @@ public class ProductServiceImpl implements ProductService {
         //相关参数
         List<RelatedParametersVo> parametersList = productMapper.findParameters(product.getProductId());
         product.setParametersList(parametersList);
-
-        //税费
-        boolean addTaxFlag = ("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())));
-        Integer activityId = productMapper.findActivityByProductId(product.getProductId());
-        if (activityId != null && activityId > 0) {
-            product.setActiveStatus(1);
-            //活动阶梯
-            List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
-            if (ladderList != null && ladderList.size() > 0) {
-                product.setPrice(ladderList.get(0).getBuyPrice());
-                for (ActivityLadderVo ladder : ladderList) {
-                    if (addTaxFlag) {
-                        BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(ladder.getBuyPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
-                        ladder.setBuyPrice(MathUtil.add(addedValueTax, ladder.getBuyPrice()));
-                    }
-                }
-            }
-            product.setLadderList(ladderList);
-        }
-        if (addTaxFlag) {
-            BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(product.getPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
-            BigDecimal price = MathUtil.add(product.getPrice(), addedValueTax);
-            product.setPrice(price);
-        }
+        setProductDetails(product, userId);
         return ResponseJson.success(product);
     }
 
@@ -182,8 +175,7 @@ public class ProductServiceImpl implements ProductService {
         PageHelper.startPage(pageNum, pageSize);
         List<ProductVo> productList = productMapper.findActivityProduct(userId, activityId);
         productList.forEach(product -> {
-            product.setActiveStatus(1);
-            product.setMainImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
+            setProductDetails(product, userId);
         });
         PageInfo<ProductVo> pageInfo = new PageInfo<>(productList);
         map.put("image", image);
@@ -193,57 +185,21 @@ public class ProductServiceImpl implements ProductService {
 
 
     @Override
-    public ResponseJson<List<FloorVo>> productFloor() {
+    public ResponseJson<List<FloorVo>> productFloor(Integer userId) {
         List<FloorVo> floorList = productMapper.findAllFloor();
-        floorList.forEach(floor->{
+        floorList.forEach(floor -> {
             List<ProductVo> productList = productMapper.findFloorProductList(floor.getFloorId(), null, 6);
-            productList.forEach((product) -> {
-                product.setMainImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
-                Integer activityId = productMapper.findActivityByProductId(product.getProductId());
-                if (activityId != null && activityId > 0) {
-                    product.setActiveStatus(1);
-                    //活动阶梯
-                    List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
-                    if (ladderList != null && ladderList.size() > 0) {
-                        product.setPrice(ladderList.get(0).getBuyPrice());
-                    }
-                }
-                //税费
-                boolean addTaxFlag = ("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())));
-                if (addTaxFlag) {
-                    BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(product.getPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
-                    BigDecimal price = MathUtil.add(product.getPrice(), addedValueTax);
-                    product.setPrice(price);
-                }
-            });
+            productList.forEach(product -> setProductDetails(product, userId));
             floor.setProductList(productList);
         });
         return ResponseJson.success(floorList);
     }
 
     @Override
-    public ResponseJson<PageInfo<ProductVo>> floorDetail(Integer floorId, String productName, Integer pageNum, Integer pageSize) {
+    public ResponseJson<PageInfo<ProductVo>> floorDetail(Integer floorId, Integer userId, String productName, Integer pageNum, Integer pageSize) {
         PageHelper.startPage(pageNum, pageSize);
         List<ProductVo> productList = productMapper.findFloorProductList(floorId, productName, null);
-        productList.forEach((product) -> {
-            product.setMainImage(ProductUtils.getImageURL("product", product.getMainImage(), 0, domain));
-            Integer activityId = productMapper.findActivityByProductId(product.getProductId());
-            if (activityId != null && activityId > 0) {
-                product.setActiveStatus(1);
-                //活动阶梯
-                List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
-                if (ladderList != null && ladderList.size() > 0) {
-                    product.setPrice(ladderList.get(0).getBuyPrice());
-                }
-            }
-            //税费
-            boolean addTaxFlag = ("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())));
-            if (addTaxFlag) {
-                BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(product.getPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
-                BigDecimal price = MathUtil.add(product.getPrice(), addedValueTax);
-                product.setPrice(price);
-            }
-        });
+        productList.forEach(product -> setProductDetails(product, userId));
         PageInfo<ProductVo> pageInfo = new PageInfo<>(productList);
         return ResponseJson.success(pageInfo);
     }

+ 10 - 2
src/main/java/com/caimei/service/impl/ShoppingCartServiceImpl.java

@@ -67,7 +67,7 @@ public class ShoppingCartServiceImpl implements ShoppingCartService {
             BigDecimal shopTotalPrice = BigDecimal.ZERO;
             List<CartProductVo> productList = shoppingCartMapper.findByShopCartProduct(shop.getShopId(), userId);
             for (CartProductVo product : productList) {
-                setPrice(product);
+                setPrice(product, userId);
                 shopTotalPrice = MathUtil.add(shopTotalPrice, MathUtil.mul(product.getProductCount(), product.getPrice()));
             }
             shop.setShopTotalPrice(shopTotalPrice);
@@ -87,16 +87,24 @@ public class ShoppingCartServiceImpl implements ShoppingCartService {
      * 设置活动价格阶梯
      */
     @Override
-    public void setPrice(CartProductVo product) {
+    public void setPrice(CartProductVo product, Integer userId) {
         //税费
         boolean addTaxFlag = ("0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType())));
         Integer activityId = productMapper.findActivityByProductId(product.getProductId());
+        // 查询商品折扣
+        Integer discount = productMapper.findProductDiscount(product.getProductId(), userId);
+        if (null != discount && discount > 0) {
+            product.setPrice(MathUtil.div(MathUtil.mul(product.getPrice(), discount), 100));
+        }
         if (activityId != null && activityId > 0) {
             product.setActiveStatus(1);
             //活动阶梯
             List<ActivityLadderVo> ladderList = productMapper.findActivityLadder(activityId, product.getProductId());
             if (ladderList != null && ladderList.size() > 0) {
                 for (ActivityLadderVo ladder : ladderList) {
+                    if (null != discount && discount > 0) {
+                        ladder.setBuyPrice((MathUtil.div(MathUtil.mul(ladder.getBuyPrice(), discount), 100)));
+                    }
                     if (addTaxFlag) {
                         BigDecimal addedValueTax = MathUtil.div(MathUtil.mul(ladder.getBuyPrice(), product.getClubTaxPoint()), BigDecimal.valueOf(100), 2);
                         ladder.setBuyPrice(MathUtil.add(addedValueTax, ladder.getBuyPrice()));

+ 206 - 0
src/main/resources/mapper/CouponMapper.xml

@@ -0,0 +1,206 @@
+<?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.caimei.mapper.CouponMapper">
+    <insert id="insertDisplayRecord">
+        insert into cm_hehe_coupon_display_record (userId, couponId, addTime)
+        values (#{userId}, #{couponId}, NOW())
+    </insert>
+    <insert id="insertReceiveCoupon">
+        insert into cm_hehe_receive_coupon (userId, couponId, source, status, receiveTime, delFlag)
+        values (#{userId}, #{couponId}, #{source}, #{status}, #{receiveTime}, #{delFlag})
+    </insert>
+    <insert id="insertCouponShare">
+        insert into cm_hehe_coupon_share (shareUserId, receiveUserId, shareCouponIds,createTime)
+        values (#{shareUserId}, #{receiveUserId}, #{shareCouponIds},NOW())
+    </insert>
+    <update id="updateCouponShareRecord">
+        update cm_hehe_coupon_share set consumeFlag = 1 and consumeCouponIds = #{consumeCouponIds}
+    </update>
+    <select id="getCouponCount" resultType="java.lang.Integer">
+        select count(*) from cm_hehe_coupon
+        where couponType = #{couponType}
+          and if(startNowFlag = 1,true, NOW() <![CDATA[  >=  ]]> startTime )
+        and if(permanentFlag = 1,true,NOW() <![CDATA[  <=  ]]> endTime)
+    </select>
+    <select id="checkReceiveFlag" resultType="java.lang.Boolean">
+        select if(NOW() <![CDATA[  <  ]]>  date_add(if((select registerTime from user where userID = #{userId}) <![CDATA[  >=  ]]> chc.startTime,
+                                      (select registerTime from user where userID = #{userId}), chc.startTime), interval
+                                   chc.receivePeriod DAY), true, false)
+        from cm_hehe_coupon chc
+    </select>
+    <select id="getUserRegisterTime" resultType="java.util.Date">
+        select registerTime from user where userID = #{userId}
+    </select>
+    <select id="getDisplayRecordCount" resultType="java.lang.Integer">
+        select count(*)
+        from cm_hehe_coupon_display_record
+        where couponId = #{couponId}
+          and userId = #{userId}
+    </select>
+    <select id="findCouponList" resultType="com.caimei.model.vo.CouponVo">
+        select distinct chc.id as couponId,
+        name as couponName,
+        couponType,
+        productType,
+        couponAmount,
+        touchPrice,
+        noThresholdFlag,
+        0 as useStatus,
+        if(receiveFlag = 1,if(permanentFlag = 1,true,false),false) as permanentFlag,
+        if(receiveFlag = 1 ,if(permanentFlag = 1,null,endTime),
+            <if test="userId  == null or userId == 0">
+                date_add(startTime,interval receivePeriod DAY)
+            </if>
+            <if test="userId > 0">
+                date_add(if(#{registerTime} <![CDATA[ >= ]]> startTime,
+                    #{registerTime},startTime),interval receivePeriod DAY)
+            </if>
+        ) as receivePeriod,
+        chc.createDate,
+        if(productType = 2,group_concat(chcp.productId),null) as productIds
+        from cm_hehe_coupon chc
+        left join cm_hehe_coupon_product chcp on chc.id = chcp.couponId
+        where chc.delFlag = 0
+        and if(startNowFlag = 1, true, NOW() <![CDATA[  >=  ]]> startTime)
+        <if test="userId == null or userId == 0">
+            AND couponType not in (2,4,5)
+            and if(receiveFlag = 1,
+                if(permanentFlag = 1,true,NOW() <![CDATA[ < ]]> endTime),
+                NOW() <![CDATA[ < ]]> date_add(startTime,interval receivePeriod DAY))
+        </if>
+        <if test="productIdArr != null and productIdArr.length > 0">
+            and (chc.productType = 1 or chcp.productId in
+                <foreach item="productId" index="index" collection="productIdArr" open="(" separator="," close=")">
+                    #{productId}
+                </foreach>
+                )
+        </if>
+        <if test="userId > 0">
+            and chc.id not in (select couponId from cm_hehe_receive_coupon where userId = #{userId})
+            and (
+                (couponType = 1
+                or (couponType = 2 and chc.id in (select distinct couponId from cm_hehe_coupon_user where userId = #{userId}))
+                or (couponType = 3 and #{registerTime} <![CDATA[ >= ]]> startTime)
+                or (couponType = 4 and chc.id in (select group_concat(shareCouponIds) from cm_hehe_coupon_share where shareUserId = #{userId}))
+                or (couponType = 5 and chc.id in (select group_concat(consumeCouponIds) from cm_hehe_coupon_share where shareUserId = #{userId} and consumeFlag = 1))
+                )
+            and if(receiveFlag = 1,
+                    if(permanentFlag = 1,true,NOW() <![CDATA[ < ]]> endTime),
+                    NOW() <![CDATA[ < ]]> date_add(if(#{registerTime} <![CDATA[ >= ]]>
+                    startTime,#{registerTime},startTime),interval receivePeriod DAY)
+                )
+            )
+        </if>
+        <if test="couponType != null">
+            and couponType = #{couponType}
+        </if>
+        group by chc.id
+        order by chc.createDate desc
+    </select>
+    <select id="findReceiveCouponList" resultType="com.caimei.model.vo.CouponVo">
+        select distinct
+            chrc.couponId as couponId,
+            name as couponName,
+            couponType,
+            productType,
+            couponAmount,
+            touchPrice,
+            noThresholdFlag,
+            date_add(chrc.receiveTime, interval chc.usePeriod DAY) as usePeriod,
+            createDate,
+            if(productType = 2,group_concat(chcp.productId),null) as productIds
+        from cm_hehe_receive_coupon chrc left join cm_hehe_coupon chc on chrc.couponId = chc.id
+        left join cm_hehe_coupon_product chcp on chrc.couponId = chcp.couponId
+        where chrc.delFlag = 0 and chc.delFlag = 0 and chrc.userId = #{userId}
+        <if test="receiveCouponId != null and receiveCouponId>0">
+            and chrc.id = #{receiveCouponId}
+        </if>
+        <if test="productIdArr != null and productIdArr.length > 0">
+            and (chc.productType = 1 or chcp.productId in
+            <foreach item="productId" index="index" collection="productIdArr" open="(" separator="," close=")">
+                #{productId}
+            </foreach>
+            )
+        </if>
+        <if test="status == 1">
+            and chrc.status = 1
+            and NOW() <![CDATA[ <= ]]> date_add(chrc.receiveTime, interval chc.usePeriod DAY)
+            group by chrc.couponId
+            order by chrc.receiveTime desc
+        </if>
+        <if test="status == 2">
+            and chrc.status = 2
+            group by chrc.couponId
+            order by chrc.useTime desc
+        </if>
+        <if test="status == 3">
+            and chrc.status = 1
+            and NOW() <![CDATA[ > ]]> date_add(chrc.receiveTime, interval chc.usePeriod DAY)
+            group by chrc.couponId
+            order by date_add(chrc.receiveTime, interval chc.usePeriod DAY) desc
+        </if>
+    </select>
+    <select id="findCouponNum" resultType="java.lang.Integer">
+        select count(*)
+        from cm_hehe_receive_coupon chrc left join cm_hehe_coupon chc on chrc.couponId = chc.id
+        where chrc.delFlag = 0 and chc.delFlag = 0 and chrc.userId = #{userId}
+        <if test="status == 1">
+            and chrc.status = 1
+            and NOW() <![CDATA[ <= ]]> date_add(chrc.receiveTime, interval chc.usePeriod DAY)
+        </if>
+        <if test="status == 2">
+            and chrc.status = 2
+        </if>
+        <if test="status == 3">
+            and chrc.status = 1
+            and NOW() <![CDATA[ > ]]> date_add(chrc.receiveTime, interval chc.usePeriod DAY)
+        </if>
+    </select>
+    <select id="getCouponProduct" resultType="com.caimei.model.vo.ProductVo">
+        SELECT
+        chp.productId,
+        chp.price,
+        chp.includedTax,
+        chp.invoiceType,
+        chp.clubTaxPoint,
+        p.name,
+        P.unit,
+        p.mainImage
+        FROM
+            cm_hehe_coupon_product chcp
+            left join cm_hehe_product chp on chcp.productId = chp.productId
+            LEFT JOIN product p ON chp.productId = p.productID
+        WHERE
+            chcp.couponId = #{couponId}
+            and chp.validFlag = 1
+        <if test="productName != null and productName != ''">
+            AND p.name LIKE CONCAT('%',#{productName},'%')
+        </if>
+        ORDER BY -chcp.sort desc,chcp.addTime desc
+    </select>
+    <select id="getCouponProductIds" resultType="java.lang.String">
+        SELECT group_concat(chcp.productId)
+        FROM cm_hehe_coupon_product chcp
+        WHERE couponId = #{couponId}
+        group by couponId
+    </select>
+    <select id="findReceiveCouponId" resultType="java.lang.Integer">
+        select id
+        from cm_hehe_receive_coupon
+        where userId = #{userId}
+          and couponId = #{couponId}
+    </select>
+    <select id="getCurrentCouponIds" resultType="java.lang.String">
+        select group_concat(id)
+        from cm_hehe_coupon
+        where couponType = #{couponType} and if(startNowFlag = 1,true, NOW() <![CDATA[  >=  ]]> startTime )
+          and if(permanentFlag = 1,true,NOW() <![CDATA[  <=  ]]> endTime)
+        group by couponType
+    </select>
+    <select id="getCouponShareId" resultType="java.lang.Integer">
+        select id from cm_hehe_coupon_share where receiveUserId = #{receiveUserId} and consumeFlag != 1
+    </select>
+
+</mapper>

+ 1 - 0
src/main/resources/mapper/OrderMapper.xml

@@ -33,6 +33,7 @@
           co.clauseName,
           co.freePostFlag,
           co.freight,
+          co.couponAmount,
           co.paySuccessCounter,
           co.closeReason
     </sql>

+ 42 - 0
src/main/resources/mapper/OrderSubmitMapper.xml

@@ -246,6 +246,9 @@
             <if test="freight != null">
                 freight,
             </if>
+            <if test="couponAmount != null">
+                couponAmount,
+            </if>
             <if test="delFlag != null">
                 delFlag,
             </if>
@@ -425,6 +428,9 @@
             <if test="freight != null">
                 #{freight,jdbcType=DECIMAL},
             </if>
+            <if test="couponAmount != null">
+                #{couponAmount,jdbcType=DECIMAL},
+            </if>
             <if test="delFlag != null">
                 #{delFlag,jdbcType=CHAR},
             </if>
@@ -1495,6 +1501,13 @@
         </set>
         where orderID = #{orderID,jdbcType=BIGINT}
     </update>
+    <update id="updateReceiveCouponStatus">
+        update cm_hehe_receive_coupon
+        set status  = 2,
+            useTime = NOW(),
+            orderId = #{orderId}
+        where id = #{receiveCouponId}
+    </update>
 
     <select id="findByAddressId" resultType="com.caimei.model.vo.AddressVo">
         SELECT a.addressID AS addressId,
@@ -1603,6 +1616,10 @@
             </if>
         </trim>
     </insert>
+    <insert id="insertCouponOrderRecord">
+        INSERT INTO cm_hehe_coupon_order_record (orderId, receiveCouponId, couponType, couponAmount, touchPrice, createDate)
+        VALUES (#{orderId}, #{receiveCouponId}, #{couponType}, #{couponAmount}, #{touchPrice}, #{createDate})
+    </insert>
 
     <select id="findShopByProductId" resultType="com.caimei.model.vo.ShopVo">
         SELECT
@@ -1636,4 +1653,29 @@
           chp.validFlag = 1
           AND chp.productId = #{productId}
     </select>
+    <select id="findCartProducts" resultType="com.caimei.model.vo.CartProductVo">
+        SELECT
+        cc.cm_cartID AS cartId,
+        cc.productID AS productId,
+        cc.productCount,
+        cc.heUserId,
+        chp.price,
+        chp.includedTax,
+        chp.invoiceType,
+        chp.clubTaxPoint,
+        p.name AS productName,
+        p.shopID AS shopId,
+        p.mainImage,
+        p.unit
+        FROM
+        cm_cart cc
+        LEFT JOIN cm_hehe_product chp ON cc.productID = chp.productId
+        LEFT JOIN product p ON cc.productID = p.productID
+        WHERE
+        chp.validFlag = 1
+        AND cc.cm_cartID IN
+        <foreach item="cartId" index="index" collection="cartIds" open="(" separator="," close=")">
+            #{cartId}
+        </foreach>
+    </select>
 </mapper>

+ 24 - 0
src/main/resources/mapper/ProductMapper.xml

@@ -285,5 +285,29 @@
     <select id="findFloorById" resultType="com.caimei.model.vo.FloorVo">
         select id as floorId,title,description from cm_hehe_floor where id = #{floorId}
     </select>
+    <select id="findAllProductCouponCount" resultType="java.lang.Integer">
+        select count(*)
+        from cm_hehe_coupon chc
+        where chc.delFlag = 0 and chc.productType = 1
+        and if(startNowFlag = 1, true, NOW() <![CDATA[  >=  ]]> startTime)
+        and if(permanentFlag = 1, true, NOW() <![CDATA[  <=  ]]> endTime)
+    </select>
+    <select id="findPartProductCounponCount" resultType="java.lang.Integer">
+        select count(*)
+        from cm_hehe_coupon chc
+                 left join cm_hehe_coupon_product chcp on chc.id = chcp.couponId
+                 left join cm_hehe_product chp on chcp.productId = chp.id
+        where chc.delFlag = 0 and chc.productType = 2 and chp.productId = #{productId}
+          and if(startNowFlag = 1, true, NOW() <![CDATA[  >=  ]]> startTime)
+          and if(permanentFlag = 1, true, NOW() <![CDATA[  <=  ]]> endTime)
+    </select>
+    <select id="findProductDiscount" resultType="java.lang.Integer">
+        select chd.discount
+        from cm_hehe_discount chd
+                 left join cm_hehe_discount_product chdp on chd.id = chdp.discountId
+                 left join cm_hehe_discount_user chdu on chd.id = chdu.discountId
+        where chdp.productId = #{productId}
+          and chdu.userId = #{userId}
+    </select>
 
 </mapper>

+ 1 - 2
src/main/resources/mapper/ShoppingCartMapper.xml

@@ -38,8 +38,7 @@
         UPDATE
           cm_cart
         SET
-          productCount = #{productCount},
-          addTime = NOW()
+          productCount = #{productCount}
         WHERE
           cm_cartID = #{cartId}
     </update>