Просмотр исходного кода

Merge remote-tracking branch 'origin/point_dev' into point_dev

wangzhijun 1 неделя назад
Родитель
Сommit
920f200981
17 измененных файлов с 680 добавлено и 114 удалено
  1. 1 1
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/CouponController.java
  2. 49 6
      nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/CouponReceiveController.java
  3. 3 2
      nightFragrance-common/src/main/java/com/ylx/common/utils/SecurityUtils.java
  4. 9 3
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/Coupon.java
  5. 59 48
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/CouponReceive.java
  6. 130 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/UserCouponRelation.java
  7. 162 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ClaimCouponRequestVO.java
  8. 23 5
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/CouponReceiveVo.java
  9. 6 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/CouponReceivesVO.java
  10. 23 0
      nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ReceiveVolutionVO.java
  11. 4 4
      nightFragrance-massage/src/main/java/com/ylx/massage/enums/DiscountTypeEnum.java
  12. 15 0
      nightFragrance-massage/src/main/java/com/ylx/massage/mapper/UserCouponRelationMapper.java
  13. 21 3
      nightFragrance-massage/src/main/java/com/ylx/massage/service/CouponReceiveService.java
  14. 150 10
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/CouponReceiveServiceImpl.java
  15. 3 2
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java
  16. 4 0
      nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TWxUserServiceImpl.java
  17. 18 30
      nightFragrance-massage/src/main/resources/mapper/massage/CouponReceiveMapper.xml

+ 1 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/CouponController.java

@@ -37,7 +37,7 @@ public class CouponController extends BaseController {
     private CouponService couponService;
 
     /**
-     * 分页查询所有数据
+     * 分页查询所有优惠券数据(PC端)
      *
      * @param page   分页对象
      * @param coupon 查询实体

+ 49 - 6
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/CouponReceiveController.java

@@ -1,6 +1,7 @@
 package com.ylx.web.controller.massage;
 
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.common.annotation.Log;
@@ -8,12 +9,14 @@ import com.ylx.common.enums.BusinessType;
 import com.ylx.massage.domain.Coupon;
 import com.ylx.massage.domain.CouponReceive;
 import com.ylx.common.core.domain.R;
+import com.ylx.massage.domain.vo.ClaimCouponRequestVO;
 import com.ylx.massage.domain.vo.CouponReceiveVo;
 import com.ylx.massage.domain.vo.CouponReceivesVO;
 import com.ylx.massage.service.CouponReceiveService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -62,26 +65,61 @@ public class CouponReceiveController {
     }
 
     /**
-     * 新增数据
+     * 领取优惠卷
      *
      * @param couponReceive 实体对象
-     * @return 新增结果
+     * @return R 新增结果
      */
     @PostMapping("submit")
     @ApiOperation("领取优惠卷")
     public R insert(@RequestBody CouponReceive couponReceive) {
-        return R.ok(this.couponReceiveService.submit(couponReceive));
+        try {
+            return R.ok(this.couponReceiveService.submit(couponReceive));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
+    /**
+     *首页领取优惠卷(批量领取优惠券)
+     *
+     * @param couponReceive
+     * @return R
+     */
     @PostMapping("submits")
     @ApiOperation("首页领取优惠卷")
     @Log(title = "首页领取优惠卷", businessType = BusinessType.INSERT)
     public R insert(@RequestBody CouponReceivesVO couponReceive) {
-        return R.ok(this.couponReceiveService.submits(couponReceive));
+        try {
+            return R.ok(this.couponReceiveService.submits(couponReceive));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    /**
+     * 用户领取劵中心的优惠劵
+     *
+     * @param claimCouponRequestVO
+     * @return R<?>
+     */
+    @ApiOperation(value="用户领取劵中心的优惠劵", notes="用户领取劵中心的优惠劵")
+    @PostMapping(value = "/receiveCoupon")
+    public R<?> receiveCoupon(@Validated @RequestBody ClaimCouponRequestVO claimCouponRequestVO) {
+        try {
+            log.info("用户领取劵中心的优惠劵请求参数:{}", JSON.toJSONString(claimCouponRequestVO));
+            return couponReceiveService.receiveVolution(claimCouponRequestVO);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.fail(e.getMessage());
+        }
     }
 
     /**
-     * 我的优惠卷
+     * 查询我的优惠卷
      *
      * @param couponReceive
      * @return R<List<CouponReceiveVo>>
@@ -89,7 +127,12 @@ public class CouponReceiveController {
     @PostMapping("myCoupon")
     @ApiOperation("我的优惠卷")
     public R<List<CouponReceiveVo>> myCoupon(@RequestBody CouponReceive couponReceive) {
-        return R.ok(this.couponReceiveService.getByOpenId(couponReceive.getOpenid()));
+        try {
+            return R.ok(this.couponReceiveService.getByOpenId(couponReceive.getReceiveOpenId()));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
 

+ 3 - 2
nightFragrance-common/src/main/java/com/ylx/common/utils/SecurityUtils.java

@@ -59,7 +59,7 @@ public class SecurityUtils {
     }
 
     /**
-     * 获取用户
+     * 获取用户(PC端)
      *
      * @return LoginUser 用户信息
      **/
@@ -67,7 +67,6 @@ public class SecurityUtils {
         try {
             Object principal = getAuthentication().getPrincipal();
             log.info("principal的值: {}", principal);
-
             return (LoginUser) getAuthentication().getPrincipal();
         } catch (Exception e) {
             e.printStackTrace();
@@ -90,6 +89,8 @@ public class SecurityUtils {
 
     /**
      * 获取Authentication
+     *
+     * @return Authentication
      */
     public static Authentication getAuthentication() {
         return SecurityContextHolder.getContext().getAuthentication();

+ 9 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/domain/Coupon.java

@@ -36,7 +36,9 @@ public class Coupon extends Model<Coupon> {
     @ApiModelProperty("优惠券类型,1:普通券")
     private Integer type;
 
-    //优惠类型,1:无门槛, 2:折扣, 3:满减
+    /**
+     * 优惠类型, 2:折扣, 3:满减
+     */
     @ApiModelProperty("优惠类型, 2:折扣, 3:满减")
     private Integer discountType;
 
@@ -56,7 +58,9 @@ public class Coupon extends Model<Coupon> {
     @ApiModelProperty("获取方式:1:手动领取 2,自动发放")
     private Integer obtainWay;
 
-    //优惠券有效期天数,0
+    /**
+     * 优惠券有效期天数
+     */
     @ApiModelProperty("优惠券有效期天数")
     private Integer termDays;
 
@@ -68,7 +72,9 @@ public class Coupon extends Model<Coupon> {
     @ApiModelProperty("已使用数量")
     private Integer usedNum;
 
-    //每个人限领的数量
+    /**
+     * 每个人限领的数量
+     */
     @ApiModelProperty("每个人限领的数量")
     private Integer userLimit;
 

+ 59 - 48
nightFragrance-massage/src/main/java/com/ylx/massage/domain/CouponReceive.java

@@ -1,79 +1,90 @@
 package com.ylx.massage.domain;
-
-
-import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 import lombok.experimental.Accessors;
-
-
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.Date;
-
 /**
  * 优惠券领取表(CouponReceive)表实体类
  *
  * @author makejava
  * @since 2024-05-14 11:25:44
  */
-@Setter
-@Getter
-@ApiModel(value = "CouponReceive" ,description = "优惠券领取")
-@Builder
-@Accessors(chain = true)
-@AllArgsConstructor
-@NoArgsConstructor
-public class CouponReceive extends Model<CouponReceive> {
-    //主键
-    @ApiModelProperty("id")
+
+@Data
+@TableName("coupon_receive")
+public class CouponReceive implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @TableId(type = IdType.ASSIGN_ID)
     private String id;
 
-    //用户openId
-    @ApiModelProperty("用户openId")
-    private String openid;
+    /** 发券人ID */
+    private String issuerCouponId;
 
-    //优惠券id
-    @ApiModelProperty("优惠券id")
+    /** 优惠券id */
     private String couponId;
 
-    //过期时间
-    @ApiModelProperty("过期时间")
+    /** 优惠券名称 */
+    private String couponName;
+
+    /** 优惠券类型 1-兑换券 2-折扣券 3-满减券 */
+    private String couponType;
+
+    /** 优惠券类型描述 */
+    private String couponTypeDesc;
+
+    /** 领取用户openID */
+    private String receiveOpenId;
+
+    /** 领取人手机号 */
+    private String receiveUserPhone;
+
+    /** 领取时间 */
+    private LocalDateTime receiveTime;
+
+    /** 有效期类型 1-固定日期范围, 2-领券后N天有效, 3-长期有效,4-三方赠送 */
+    private Integer validityType;
+
+    /** 有效期开始时间 */
+    private Date validStartTime;
+
+    /** 有效期结束时间 */
     private Date expirationTime;
 
-    //过期时间
-    @ApiModelProperty("使用状态 0:待使用,1:使用中,2:已完成")
+    /** 有效天数 */
+    private String validDays;
+
+    /** 核销使用时间 */
+    private LocalDateTime useTime;
+
+    /** 使用状态 0:待使用 1:使用中 2:已完成 */
     private Integer useState;
 
-    //创建时间
-    @ApiModelProperty("创建时间")
-    private Date createTime;
+    /** 关联的订单ID */
+    private String orderId;
 
-    //修改时间
-    @ApiModelProperty("修改时间")
-    private Date updateTime;
+    /** 订单类型 1-服务 2-商品 */
+    private String orderType;
 
-    @ApiModelProperty("部门id")
-    private String deptId;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
 
-    @ApiModelProperty("部门名称")
-    private String deptName;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
 
-    //是否删除0否1是
-    @ApiModelProperty("是否删除0否1是")
+    /** 是否删除 0否 1是 */
     @TableLogic
     private Integer isDelete;
-
-
-    /**
-     * 获取主键值
-     *
-     * @return 主键值
-     */
-    @Override
-    public Serializable pkVal() {
-        return this.id;
-    }
 }
 

+ 130 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/UserCouponRelation.java

@@ -0,0 +1,130 @@
+package com.ylx.massage.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("user_coupon_relation")
+public class UserCouponRelation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    /** 用户openId */
+    private String openId;
+
+    /** 优惠券id */
+    private String couponId;
+
+    /** 优惠券名称 */
+    private String couponName;
+
+    /** 券图URL */
+    private String imageUrl;
+
+    /** 优惠券类型 1-兑换券 2-折扣券 3-满减券 */
+    private String couponType;
+
+    /** 优惠券状态 0:待使用,1:使用中 2:已使用 3:已失效 */
+    private Integer status;
+
+    /** 使用有限期类型 1.用户领取后生效 2.三方用户赠送时间起 3.固定时间段 4.长期可用 */
+    private String useType;
+
+    /** 开始时间 */
+    private LocalDate startTime;
+
+    /** 结束时间 */
+    private LocalDate endTime;
+
+    /** 天数 */
+    private Integer dayNum;
+
+    /** 领取时间 */
+    private LocalDateTime receiveTime;
+
+    /** 订单号 */
+    private String orderNo;
+
+    /** 市场售价 */
+    private BigDecimal marketPrice;
+
+    /** 失效日期 */
+    private LocalDateTime expiringDate;
+
+    /** 失效原因 */
+    private String rejectReason;
+
+    /** 补充说明 */
+    private String additionalNote;
+
+    /** 券来源 0:券中心 1:专属好券 2:免费体验 3:生日好礼 4:每日好礼 */
+    private Integer ticketSource;
+
+    /** 券中心分享用户id */
+    private String centerShareUserId;
+
+    /** 关联类型 1-商品 2-商品分类 */
+    private String relatedType;
+
+    /** 关联ID(商品ID或分类ID) */
+    private String relatedId;
+
+    /** 关联名称 */
+    private String relatedName;
+
+    /** 门槛金额(分): 满X元生效,适用于满减/折扣 */
+    private BigDecimal ruleMinSpendAmount;
+
+    /** 折扣比: 如0.80表示8折,仅折扣券使用 */
+    private BigDecimal ruleDiscountRate;
+
+    /** 折扣封顶金额(分): 折扣最高优惠 */
+    private BigDecimal ruleDiscountCapAmount;
+
+    /** 满减金额(分): 仅满减券使用 */
+    private BigDecimal ruleReductionAmount;
+
+    /** 描述 */
+    private String description;
+
+    /** 券中心唯一ID */
+    private String ticketCenterId;
+
+    /** 所在地区码 */
+    private String country;
+
+    /** 所在地区全部码 */
+    private String countryAll;
+
+    /** 所在地区 */
+    private String locality;
+
+    /** 商户id */
+    private String merchantId;
+
+    /** 商户名称 */
+    private String storeName;
+
+    /** 创建者 */
+    private String createBy;
+
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    /** 修改者 */
+    private String updateBy;
+
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}

+ 162 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ClaimCouponRequestVO.java

@@ -0,0 +1,162 @@
+package com.ylx.massage.domain.vo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "领取优惠券请求参数VO")
+public class ClaimCouponRequestVO implements Serializable {
+
+    /**
+     * 发劵人id
+     */
+    @ApiModelProperty(value = "发劵人id")
+    private String userId;
+
+    /**
+     * 模板ID(优惠券ID)
+     */
+    @ApiModelProperty(value = "主键ID, 模板ID")
+    private String templateId;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String name;
+
+    /**
+     * 券图URL
+     */
+    @ApiModelProperty(value = "券图URL")
+    private String imageUrl;
+
+    /**
+     * 优惠券类型: 1-兑换券, 2-折扣券, 3-满减券
+     */
+    @ApiModelProperty(value = "优惠券类型: 1-兑换券, 2-折扣券, 3-满减券")
+    private String type;
+
+    /**
+     * 优惠券类型描述
+     */
+    @ApiModelProperty(value = "优惠券类型描述")
+    private String couponTypeDesc;
+
+    /**
+     * 关联类型: 1-商品, 2-商品分类
+     */
+    @ApiModelProperty(value = "关联类型: 1-商品, 2-商品分类")
+    private String relatedType;
+
+    /**
+     * 关联ID
+     */
+    @ApiModelProperty(value = "关联ID")
+    private String relatedId;
+
+    /**
+     * 关联名称 (商品名称或分类名称)
+     */
+    @ApiModelProperty(value = "关联名称 (商品名称或分类名称)")
+    private String relatedName;
+
+    /**
+     * 门槛金额(元): 满X元生效,适用于满减/折扣
+     */
+    @ApiModelProperty(value = "门槛金额(元): 满X元生效,适用于满减/折扣")
+    private BigDecimal ruleMinSpendAmount;
+
+    /**
+     * 折扣率: 如0.80表示8折,仅折扣券使用
+     */
+    @ApiModelProperty(value = "折扣率: 如0.80表示8折,仅折扣券使用")
+    private BigDecimal ruleDiscountRate;
+
+    /**
+     * 折扣封顶金额(元): 折扣最高优惠
+     */
+    @ApiModelProperty(value = "折扣封顶金额(元): 折扣最高优惠")
+    private BigDecimal ruleDiscountCapAmount;
+
+    /**
+     * 满减金额(元): 仅满减券使用
+     */
+    @ApiModelProperty(value = "满减金额(元): 仅满减券使用")
+    private BigDecimal ruleReductionAmount;
+
+    /**
+     * 有效期类型 1-固定日期范围, 2-领券后N天有效, 3-长期有效,4-三方赠送
+     */
+    @ApiModelProperty(value = "有效期类型: 1-固定日期范围, 2-领券后N天有效, 3-长期有效,4-三方赠送")
+    private String validityType;
+
+    /**
+     * 有效期开始时间
+     */
+    @ApiModelProperty(value = "有效期开始时间")
+    private Date validStartTime;
+
+    /**
+     * 有效期结束时间
+     */
+    @ApiModelProperty(value = "有效期结束时间")
+    private Date validEndTime;
+
+    /**
+     * 有效天数
+     */
+    @ApiModelProperty(value = "有效天数")
+    private String validDays;
+
+    /**
+     * 所在地区码
+     */
+    @ApiModelProperty(value = "所在地区码")
+    private String country;
+
+    /**
+     * 所在地区全部码
+     */
+    @ApiModelProperty(value = "所在地区全部码")
+    private String countryAll;
+
+    /**
+     * 所在地区
+     */
+    @ApiModelProperty(value = "所在地区")
+    private String locality;
+
+    /**
+     * 商户id
+     */
+    @ApiModelProperty(value = "商户id")
+    private String merchantId;
+
+    /**
+     * 商户名称
+     */
+    @ApiModelProperty(value = "商户名称")
+    private String storeName;
+
+    /**
+     * 商品ID(可多个)
+     */
+    @ApiModelProperty(value = "商品ID(可多个)")
+    private String productId;
+
+    /**
+     * 商品名称(可多个)
+     */
+    @ApiModelProperty(value = "商品名称(可多个)")
+    private String productName;
+
+    /**
+     * 商品价格(元)
+     */
+    @ApiModelProperty(value = "商品价格(元)")
+    private BigDecimal costPrice;
+}

+ 23 - 5
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/CouponReceiveVo.java

@@ -12,23 +12,41 @@ import java.util.Date;
  * @author jianlong
  * @date 2024-05-14 17:48
  */
-@EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel(value = "CouponReceiveVo" ,description = "优惠券vo")
-public class CouponReceiveVo extends Coupon {
+public class CouponReceiveVo{
 
+    /**
+     * 主键id
+     */
     @ApiModelProperty("id")
     private String id;
 
-    //用户openId
+    /**
+     * 用户openId
+     */
     @ApiModelProperty("用户openId")
     private String openid;
 
-    //优惠券id
+    /**
+     * 优惠券id
+     */
     @ApiModelProperty("优惠券id")
     private String couponId;
 
-    //过期时间
+    /**
+     * 优惠券名称
+     */
+    private String couponName;
+
+    /**
+     * 优惠券类型(1-兑换券, 2-折扣券, 3-满减券)
+     */
+    private String couponType;
+
+    /**
+     * 过期时间
+     */
     @ApiModelProperty("过期时间")
     private Date expirationTime;
 

+ 6 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/CouponReceivesVO.java

@@ -15,9 +15,15 @@ import java.util.List;
 @ApiModel(value = "CouponReceivesVO" ,description = "弹窗领取优惠卷")
 public class CouponReceivesVO {
 
+    /**
+     * 用户openId
+     */
     @ApiModelProperty("用户openId")
     private String openId;
 
+    /**
+     * 优惠卷id
+     */
     @ApiModelProperty("优惠卷id")
     private List<String> couponIds;
 

+ 23 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ReceiveVolutionVO.java

@@ -0,0 +1,23 @@
+package com.ylx.massage.domain.vo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 劵中心领取实体请求
+ */
+@Data
+@ApiModel(value = "劵中心领取实体请求")
+public class ReceiveVolutionVO {
+
+    @NotNull(message = "分享劵记录ID不能为空")
+    @ApiModelProperty(value = "分享劵记录ID不能为空", required = true, example = "123456")
+    private String shareVolutionId;
+
+    @NotBlank(message = "用户id不能为空")
+    @ApiModelProperty(value = "用户id不能为空", required = true, example = "user_123")
+    private String userId;
+
+}

+ 4 - 4
nightFragrance-massage/src/main/java/com/ylx/massage/enums/DiscountTypeEnum.java

@@ -1,14 +1,14 @@
 package com.ylx.massage.enums;
 
 /**
- * @author 优惠类型,1:无门槛, 2:折扣, 3:满减
+ * @author 优惠类型,1:兑换券, 2:折扣券, 3:满减券
  * @date 2024-05-15 10:33
  */
 public enum DiscountTypeEnum {
 
-    NO_THRESHOLD(1, "无门槛"),
-    DISCOUNT(2, "折扣"),
-    FULL_DISCOUNT(3, "满减");
+    VOUCHER(1, "兑换券"),
+    DISCOUNT(2, "折扣"),
+    FULL_DISCOUNT(3, "满减");
 
     private final Integer code;
     private final String info;

+ 15 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/UserCouponRelationMapper.java

@@ -0,0 +1,15 @@
+package com.ylx.massage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ylx.massage.domain.UserCouponRelation;
+import com.ylx.massage.domain.vo.CouponReceiveVo;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+/**
+ * 用户和优惠券关联表数据库访问层
+ */
+public interface UserCouponRelationMapper extends BaseMapper<UserCouponRelation> {
+
+}
+

+ 21 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/service/CouponReceiveService.java

@@ -1,8 +1,10 @@
 package com.ylx.massage.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.Coupon;
 import com.ylx.massage.domain.CouponReceive;
+import com.ylx.massage.domain.vo.ClaimCouponRequestVO;
 import com.ylx.massage.domain.vo.CouponReceiveVo;
 import com.ylx.massage.domain.vo.CouponReceivesVO;
 
@@ -16,11 +18,27 @@ import java.util.List;
  */
 public interface CouponReceiveService extends IService<CouponReceive> {
 
-    /*
-     * 领取优惠卷
+    /**
+     * 领取优惠券
+     * @param couponReceive
+     * @return Coupon
      */
     Coupon submit(CouponReceive couponReceive);
 
+    /**
+     * 领取优惠券
+     * @param couponReceive
+     * @return
+     */
+    Integer submits(CouponReceivesVO couponReceive);
+
+    /**
+     * 领取优惠券
+     * @param claimCouponRequestVO
+     * @return R<?>
+     */
+    R<?> receiveVolution(ClaimCouponRequestVO claimCouponRequestVO);
+
 
     List<CouponReceiveVo> getByOpenId(String openid);
 
@@ -29,6 +47,6 @@ public interface CouponReceiveService extends IService<CouponReceive> {
 
     List<Coupon> couponWindows(CouponReceive couponReceive);
 
-    Integer submits(CouponReceivesVO couponReceive);
+
 }
 

+ 150 - 10
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/CouponReceiveServiceImpl.java

@@ -5,26 +5,39 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ylx.common.core.domain.R;
+import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.massage.domain.Coupon;
+import com.ylx.massage.domain.UserCouponRelation;
+import com.ylx.massage.domain.vo.ClaimCouponRequestVO;
 import com.ylx.massage.domain.vo.CouponReceiveVo;
 import com.ylx.massage.domain.vo.CouponReceivesVO;
 import com.ylx.massage.mapper.CouponReceiveMapper;
 import com.ylx.massage.domain.CouponReceive;
+import com.ylx.massage.mapper.UserCouponRelationMapper;
 import com.ylx.massage.service.CouponReceiveService;
 import com.ylx.massage.service.CouponService;
 import com.ylx.massage.utils.DateTimeUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.compress.utils.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+import static com.ylx.common.utils.SecurityUtils.getWxLoginUser;
+
 /**
  * 优惠券领取表(CouponReceive)表服务实现类
  *
@@ -35,20 +48,30 @@ import java.util.stream.Collectors;
 @Service("couponReceiveService")
 public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, CouponReceive> implements CouponReceiveService {
 
+    private static final String SHARE_LOCK_KEY = "coupon_center:receiveCoupon:lock:";
+
+    private static final long LOCK_EXPIRE_TIME = 2L; // 锁过期时间2秒
+
     @Resource
     private CouponService couponService;
 
     @Resource
     private CouponReceiveMapper couponReceiveMapper;
 
+    @Resource
+    private UserCouponRelationMapper userCouponRelationMapper;
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
     @Override
     public Coupon submit(CouponReceive couponReceive) {
-        LambdaQueryWrapper<CouponReceive> queryWrapper = new LambdaQueryWrapper<>();
         Coupon coupon = couponService.getById(couponReceive.getCouponId());
         if (coupon == null) {
             return null;
         }
-        queryWrapper.eq(CouponReceive::getOpenid, couponReceive.getOpenid()).eq(CouponReceive::getCouponId, couponReceive.getCouponId());
+        LambdaQueryWrapper<CouponReceive> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(CouponReceive::getReceiveOpenId, couponReceive.getReceiveOpenId()).eq(CouponReceive::getCouponId, couponReceive.getCouponId());
         //限制领取数量
         List<CouponReceive> one = this.list(queryWrapper);
         if (coupon.getUserLimit() <= one.size()) {
@@ -62,7 +85,6 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer submits(CouponReceivesVO couponReceive) {
-
         LambdaQueryWrapper<Coupon> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.in(Coupon::getId, couponReceive.getCouponIds());
 
@@ -73,12 +95,12 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
         }
         ArrayList<CouponReceive> couponReceives = Lists.newArrayList();
         list.forEach(coupon -> {
-            CouponReceive couponRec= new CouponReceive();
+            CouponReceive couponRec = new CouponReceive();
             couponRec.setId(Long.toString(IdWorker.getId(couponRec)));
             couponRec.setCouponId(coupon.getId());
-            couponRec.setOpenid(couponReceive.getOpenId());
-            couponRec.setDeptId(coupon.getDeptId());
-            couponRec.setDeptName(coupon.getDeptName());
+            couponRec.setReceiveOpenId(couponReceive.getOpenId());
+            /*couponRec.setDeptId(coupon.getDeptId());
+            couponRec.setDeptName(coupon.getDeptName());*/
             couponRec.setUseState(0);
             couponRec.setExpirationTime(DateTimeUtils.addDays(new Date(), coupon.getTermDays()));
             couponReceives.add(couponRec);
@@ -86,11 +108,128 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
         return couponReceiveMapper.insertBatch(couponReceives);
     }
 
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R<?> receiveVolution(ClaimCouponRequestVO claimCouponRequestVO) {
+        // 1、查询用户信息
+        WxLoginUser wxLoginUser = getWxLoginUser();
+        log.info("当前用户的openId:{}", wxLoginUser.getCOpenid());
+        //2、保存优惠券信息到coupon_receive表
+        // 构建防重复提交的key:用户openId + 优惠卷id
+        String lockKey = SHARE_LOCK_KEY + wxLoginUser.getCOpenid() + ":" + claimCouponRequestVO.getTemplateId();
+        // 尝试获取锁,防止重复提交
+        Boolean lockResult = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", LOCK_EXPIRE_TIME, TimeUnit.SECONDS);
+        if (Boolean.FALSE.equals(lockResult)) {
+            return R.fail("操作过于频繁,请稍后再试");
+        }
+
+        CouponReceive couponReceive = new CouponReceive();
+        couponReceive.setIssuerCouponId(claimCouponRequestVO.getUserId());
+        couponReceive.setCouponId(claimCouponRequestVO.getTemplateId());
+        couponReceive.setCouponName(claimCouponRequestVO.getName());
+        couponReceive.setCouponType(claimCouponRequestVO.getType());
+        couponReceive.setCouponTypeDesc(claimCouponRequestVO.getCouponTypeDesc());
+        couponReceive.setReceiveOpenId(wxLoginUser.getCOpenid());
+        couponReceive.setReceiveTime(LocalDateTime.now());
+        //设置领取人手机号
+        couponReceive.setReceiveUserPhone(wxLoginUser.getCPhone());
+        //获取当前有效期类型
+        String validityType = claimCouponRequestVO.getValidityType();
+        switch (validityType) {
+            // 固定日期范围
+            case "1":
+                couponReceive.setValidityType(1);
+                couponReceive.setValidStartTime(claimCouponRequestVO.getValidStartTime());
+                couponReceive.setExpirationTime(claimCouponRequestVO.getValidEndTime());
+                break;
+            //领券后N天有效
+            case "2":
+                couponReceive.setValidityType(2);
+                couponReceive.setValidDays(claimCouponRequestVO.getValidDays());
+                break;
+            //长期有效
+            case "3":
+                couponReceive.setValidityType(3);
+                break;
+            default:
+                throw new IllegalArgumentException("有效期类型错误");
+        }
+        // 设置使用状态:待使用
+        couponReceive.setUseState(0);
+        int insert = couponReceiveMapper.insert(couponReceive);
+        if (insert == 0) {
+            return R.fail("优惠券领取失败");
+        }
+
+        // 3、将优惠券id和用户id做绑定插入用户优惠券关联表
+        UserCouponRelation userCouponRelation = new UserCouponRelation();
+        userCouponRelation.setOpenId(wxLoginUser.getCOpenid());
+        userCouponRelation.setCouponId(claimCouponRequestVO.getTemplateId());
+        userCouponRelation.setCouponName(claimCouponRequestVO.getName());
+        userCouponRelation.setImageUrl(claimCouponRequestVO.getImageUrl());
+        userCouponRelation.setCouponType(claimCouponRequestVO.getType());
+        //设置状态为未使用
+        userCouponRelation.setStatus(0);
+        switch (validityType) {
+            // 固定日期范围
+            case "1":
+                userCouponRelation.setUseType(validityType);
+                couponReceive.setValidStartTime(claimCouponRequestVO.getValidStartTime());
+                couponReceive.setExpirationTime(claimCouponRequestVO.getValidEndTime());
+                break;
+            //领券后N天有效
+            case "2":
+                userCouponRelation.setUseType(validityType);
+                couponReceive.setValidDays(claimCouponRequestVO.getValidDays());
+                break;
+            //长期有效
+            case "3":
+                userCouponRelation.setUseType(validityType);
+                break;
+            default:
+                throw new IllegalArgumentException("有效期类型错误");
+        }
+        //市场售价
+        BigDecimal marketPrice = BigDecimal.ZERO;
+        //2-折扣券
+        if ("2".equals(claimCouponRequestVO.getType())) {
+            marketPrice = claimCouponRequestVO.getRuleMinSpendAmount().multiply(claimCouponRequestVO.getRuleDiscountRate())
+                    .divide(new BigDecimal("10")).setScale(2, RoundingMode.HALF_UP);
+        } else if ("3".equals(claimCouponRequestVO.getType())) {
+            //满减券
+            marketPrice = claimCouponRequestVO.getRuleReductionAmount();
+        } else if ("1".equals(claimCouponRequestVO.getType())) {
+            //兑换券
+            marketPrice = claimCouponRequestVO.getCostPrice();
+        }
+        userCouponRelation.setMarketPrice(marketPrice);
+        // 设置券来源 0:券中心
+        userCouponRelation.setTicketSource(0);
+        userCouponRelation.setCountry(claimCouponRequestVO.getCountry());
+        userCouponRelation.setCountryAll(claimCouponRequestVO.getCountryAll());
+        userCouponRelation.setLocality(claimCouponRequestVO.getLocality());
+        userCouponRelation.setMerchantId(claimCouponRequestVO.getMerchantId());
+        userCouponRelation.setStoreName(claimCouponRequestVO.getStoreName());
+        userCouponRelation.setCenterShareUserId(claimCouponRequestVO.getUserId());
+        userCouponRelation.setRuleMinSpendAmount(claimCouponRequestVO.getRuleMinSpendAmount());
+        userCouponRelation.setRuleDiscountRate(claimCouponRequestVO.getRuleDiscountRate());
+        userCouponRelation.setRuleDiscountCapAmount(claimCouponRequestVO.getRuleDiscountCapAmount());
+        userCouponRelation.setRuleReductionAmount(claimCouponRequestVO.getRuleReductionAmount());
+        userCouponRelation.setReceiveTime(LocalDateTime.now());
+        userCouponRelationMapper.insert(userCouponRelation);
+        return R.ok("领取成功");
+    }
+
     @Override
     public List<CouponReceiveVo> getByOpenId(String openid) {
         List<CouponReceiveVo> CouponReceiveVos = couponReceiveMapper.getByOpenId(openid);
         CouponReceiveVos.forEach(couponReceiveVo -> {
-            couponReceiveVo.setExpirationTimeString(DateTimeUtils.formatDate(couponReceiveVo.getExpirationTime(), DateTimeUtils.DATE_FORMAT));
+            if(couponReceiveVo.getExpirationTime() == null){
+                couponReceiveVo.setExpirationTimeString("长期有效");
+            }else{
+                couponReceiveVo.setExpirationTimeString(DateTimeUtils.formatDate(couponReceiveVo.getExpirationTime(), DateTimeUtils.DATE_FORMAT));
+            }
         });
         return CouponReceiveVos;
     }
@@ -114,13 +253,14 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
         //判断是否领过优惠卷
         //查询领取优惠卷
         LambdaQueryWrapper<CouponReceive> query = new LambdaQueryWrapper<>();
-        query.eq(CouponReceive::getOpenid, couponReceive.getOpenid());
+        query.eq(CouponReceive::getReceiveOpenId, couponReceive.getReceiveOpenId());
         List<CouponReceive> couponReceive1 = this.list(query);
         //如果没有领取优惠卷
         if (CollectionUtil.isEmpty(couponReceive1)) {
             //查询优惠卷
             LambdaQueryWrapper<Coupon> couponLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            couponLambdaQueryWrapper.eq(Coupon::getStatus, 1).like(Coupon::getDeptName, couponReceive.getDeptName());
+            couponLambdaQueryWrapper.eq(Coupon::getStatus, 1);
+            //couponLambdaQueryWrapper.eq(Coupon::getStatus, 1).like(Coupon::getDeptName, couponReceive.getDeptName());
             //返回新人优惠卷列表
             return couponService.list(couponLambdaQueryWrapper);
         } else {

+ 3 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -247,11 +247,12 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         //过滤过期的优惠券
         coupons = coupons.stream().filter(coupon -> coupon.getExpirationTime().after(new Date())).collect(Collectors.toList());
         //无门槛优惠券
-        List<CouponReceiveVo> collect = coupons.stream().filter(coupon -> coupon.getDiscountType().equals(DiscountTypeEnum.NO_THRESHOLD.getCode())).collect(Collectors.toList());
+        //List<CouponReceiveVo> collect = coupons.stream().filter(coupon -> coupon.getDiscountType().equals(DiscountTypeEnum.NO_THRESHOLD.getCode())).collect(Collectors.toList());
         //支付成功 后 删除优惠卷
 //        couponReceiveService.removeCoupons(collect);
         //计算优惠金额
-        return collect.stream().map(CouponReceiveVo::getDiscountValue).reduce(BigDecimal.ZERO, BigDecimal::add);
+        //return collect.stream().map(CouponReceiveVo::getDiscountValue).reduce(BigDecimal.ZERO, BigDecimal::add);
+        return BigDecimal.ZERO;
     }
 
 

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TWxUserServiceImpl.java

@@ -72,6 +72,10 @@ public class TWxUserServiceImpl extends ServiceImpl<TWxUserMapper, TWxUser> impl
             user.setcPhone(phone);
             // 设置默认角色为普通用户
             user.setRole(0);
+            //设置默认头像
+            user.setcIcon("https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
+            //设置默认昵称
+            user.setcNickName("用户"+phone.substring(7,11));
             save(user);
         }
         return user;

+ 18 - 30
nightFragrance-massage/src/main/resources/mapper/massage/CouponReceiveMapper.xml

@@ -2,46 +2,24 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ylx.massage.mapper.CouponReceiveMapper">
 
-    <resultMap type="com.ylx.massage.domain.CouponReceive" id="CouponReceiveMap">
-        <result property="id" column="id" jdbcType="VARCHAR"/>
-        <result property="openid" column="openid" jdbcType="VARCHAR"/>
-        <result property="couponId" column="coupon_id" jdbcType="VARCHAR"/>
-        <result property="expirationTime" column="expiration_time" jdbcType="TIMESTAMP"/>
-        <result property="useState" column="use_state" jdbcType="INTEGER"/>
-        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
-        <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
-    </resultMap>
-
-
-
     <resultMap type="com.ylx.massage.domain.vo.CouponReceiveVo" id="CouponReceiveVoMap">
         <result property="id" column="id" jdbcType="VARCHAR"/>
-        <result property="openid" column="openid" jdbcType="VARCHAR"/>
+        <result property="openid" column="receive_open_id" jdbcType="VARCHAR"/>
         <result property="couponId" column="coupon_id" jdbcType="VARCHAR"/>
         <result property="expirationTime" column="expiration_time" jdbcType="TIMESTAMP"/>
         <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
         <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
         <result property="isDelete" column="is_delete" jdbcType="INTEGER"/>
-        <result property="name" column="name" jdbcType="VARCHAR"/>
-        <result property="type" column="type" jdbcType="INTEGER"/>
-        <result property="discountType" column="discount_type" jdbcType="INTEGER"/>
-        <result property="discountValue" column="discount_value" jdbcType="NUMERIC"/>
-        <result property="thresholdAmount" column="threshold_amount" jdbcType="NUMERIC"/>
-        <result property="obtainWay" column="obtain_way" jdbcType="INTEGER"/>
-        <result property="termDays" column="term_days" jdbcType="INTEGER"/>
-        <result property="status" column="status" jdbcType="INTEGER"/>
-        <result property="usedNum" column="used_num" jdbcType="INTEGER"/>
-        <result property="userLimit" column="user_limit" jdbcType="INTEGER"/>
-        <result property="extParam" column="ext_param" jdbcType="VARCHAR"/>
-        <result property="rebValue" column="reb_value" jdbcType="VARCHAR"/>
+        <result property="couponName" column="coupon_name" jdbcType="VARCHAR"/>
+        <result property="couponType" column="coupon_type" jdbcType="INTEGER"/>
     </resultMap>
 
-
     <sql id="selectCouponReceiveVo">
-        a.id, a.openid, a.coupon_id, a.expiration_time, a.create_time, a.update_time, a.is_delete,a.use_state,
-         b.name, b.type, b.discount_type, b.discount_value, b.threshold_amount, b.obtain_way, b.term_days, b.status, b.used_num, b.user_limit, b.ext_param,b.reb_value
+        a.id, a.receive_open_id, a.coupon_id, a.valid_start_time,a.expiration_time, a.create_time, a.update_time, a.is_delete,a.use_state,
+         b.coupon_name, b.image_url,b.coupon_type,b.use_type,b.rule_min_spend_amount,b.rule_discount_rate,b.rule_discount_cap_amount,b.rule_reduction_amount,
+            b.related_type,b.related_id,b.related_name
     </sql>
+
     <!-- 批量插入 -->
     <insert id="insertBatch" keyProperty="id">
         insert into coupon_receive(id,openid,coupon_id,expiration_time,dept_id,dept_name)
@@ -70,7 +48,7 @@
 
 
     <!-- 查询我的待使用的优惠券 -->
-    <select id="getByOpenId" resultMap="CouponReceiveVoMap">
+    <!--<select id="getByOpenId" resultMap="CouponReceiveVoMap">
         SELECT
             <include refid="selectCouponReceiveVo"/>
         FROM coupon_receive a
@@ -80,6 +58,16 @@
           AND a.use_state = 0
           and a.expiration_time &gt;= now()
           and a.openid = #{openid}
+    </select>-->
+
+    <select id="getByOpenId" resultMap="CouponReceiveVoMap">
+        SELECT
+        <include refid="selectCouponReceiveVo"/>
+        FROM coupon_receive a
+        LEFT JOIN user_coupon_relation b ON a.coupon_id = b.coupon_id
+        WHERE a.is_delete = 0
+        AND a.use_state = 0
+        and a.receive_open_id = #{openid}
     </select>
 
 </mapper>