소스 검색

增加酷乐秀优惠券流程

Eric 2 년 전
부모
커밋
d16ba80e16

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -38,8 +38,8 @@ public class OrderReq {
     private String orderDesc;
     @ApiModelProperty("用户备注 ")
     private String userNote;
-    @ApiModelProperty(value = "优惠券id")
-    private Long couponId;
+    @ApiModelProperty(value = "优惠券id;多个使用,隔开")
+    private String couponId;
     @ApiModelProperty(value = "推荐用户id(有推荐人的情况)")
     private Long recomUserId;
 
@@ -218,11 +218,11 @@ public class OrderReq {
         this.userNote = userNote;
     }
 
-    public Long getCouponId() {
+    public String getCouponId() {
         return couponId;
     }
 
-    public void setCouponId(Long couponId) {
+    public void setCouponId(String couponId) {
         this.couponId = couponId;
     }
 

+ 6 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CouponInfo.java

@@ -8,6 +8,9 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponValidTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -48,11 +51,11 @@ public class CouponInfo implements Serializable {
 
     @ApiModelProperty("客户端类型")
     @TableField("client_type_")
-    private String clientType;
+    private ClientEnum clientType;
 
     @ApiModelProperty("可用品类")
     @TableField("category_")
-    private String category;
+    private CouponCategoryEnum category;
 
     @ApiModelProperty("使用门槛")
     @TableField("use_limit_")
@@ -64,7 +67,7 @@ public class CouponInfo implements Serializable {
 
     @ApiModelProperty("优惠券类型")
     @TableField("coupon_type_")
-    private String couponType;
+    private CouponTypeEnum couponType;
 
     @ApiModelProperty("有效期类型")
     @TableField("valid_type_")

+ 44 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponCategoryEnum.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.biz.dal.enums.coupon;
 
 import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.google.common.collect.Lists;
 import com.yonge.toolset.base.enums.BaseEnum;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
 
 /**
  * 优惠券可用品类
@@ -10,23 +14,25 @@ import com.yonge.toolset.base.enums.BaseEnum;
  */
 public enum CouponCategoryEnum implements BaseEnum<String, CouponCategoryEnum> {
 
-    UNIVERSAL("全场通用"),
-    VIP("小酷Ai"),
-    PIANO("云酷琴房"),
-    MALL("商场购物券"),
-    MUSIC("单曲点播券"),
-    SPARRING("陪练课购买券"),
-    LIVE("直播课购买券"),
-    VIDEO("视频课购买券"),
+    UNIVERSAL("全场通用", "UNIVERSAL"),
+    VIP("小酷Ai", "VIP"),
+    PIANO("云酷琴房", "PINAO_ROOM"),
+    MALL("商场购物券", "MALL"),
+    MUSIC("单曲点播券", "MUSIC"),
+    SPARRING("陪练课购买券", "PRACTICE"),
+    LIVE("直播课购买券", "LIVE"),
+    VIDEO("视频课购买券", "VIDEO"),
     ;
 
     @EnumValue
     private String code;
     private String msg;
+    private String goodsType;
 
-    CouponCategoryEnum(String msg) {
+    CouponCategoryEnum(String msg, String goodsType) {
         this.code = this.name();
         this.msg = msg;
+        this.goodsType = goodsType;
     }
 
     public String getCode() {
@@ -37,4 +43,33 @@ public enum CouponCategoryEnum implements BaseEnum<String, CouponCategoryEnum> {
         return this.msg;
     }
 
+    public String getGoodsType() {
+        return goodsType;
+    }
+
+    /**
+     * 商品对应优惠券类型
+     * @param goodsType 商品类型
+     * @return List<CouponCategoryEnum>
+     */
+    public static List<CouponCategoryEnum> getCategory(String goodsType) {
+
+        List<CouponCategoryEnum> retlist = Lists.newArrayList(UNIVERSAL);
+
+        if (StringUtils.isNotEmpty(goodsType)) {
+
+            CouponCategoryEnum[] values = CouponCategoryEnum.values();
+
+            for (CouponCategoryEnum value : values) {
+
+                if (value.getGoodsType().equals(goodsType)) {
+
+                    retlist.add(value);
+                }
+            }
+
+        }
+
+        return retlist;
+    }
 }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CouponInfoMapper.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
@@ -70,4 +71,12 @@ public interface CouponInfoMapper extends BaseMapper<CouponInfo> {
      * @return
      */
     int updateStock(@Param("couponId") Long couponId, @Param("size") int size, @Param("inOrOut") InOrOutEnum inOrOut);
+
+    /**
+     * 用户订单优惠券信息
+     * @param userid 用户ID
+     * @param query CouponInfoQuery.CouponOrderQuery
+     * @return List<CouponOrderWrapper.CouponInfo>
+     */
+    List<CouponOrderWrapper.CouponInfo> selectUserOrderCouponInfo(@Param("userId") Long userid, @Param("record") CouponInfoQuery.CouponOrderQuery query);
 }

+ 40 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponInfoQuery.java

@@ -9,8 +9,11 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
 
 import java.io.Serializable;
+import java.util.List;
+import java.util.Optional;
 
 /**
  * 优惠券查询条件
@@ -75,4 +78,41 @@ public class CouponInfoQuery implements Serializable {
             return this;
         }
     }
+
+    /**
+     * 用户发放优惠券信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class CouponOrderQuery implements Serializable {
+
+        // 客户端类型
+        private ClientEnum clientType;
+
+        // 优惠券类型
+        private List<CouponCategoryEnum> couponTypes;
+
+        // 优惠券发放ID
+        private List<Long> issueIds;
+
+        // 可用状态
+        private CouponUseStateEnum useState;
+
+        // 当前时间
+        private Long timestamp;
+
+        // 订单支付金额
+        private Double amount;
+
+        public Double getAmount() {
+            return Optional.ofNullable(amount).orElse(0D);
+        }
+
+        public List<CouponCategoryEnum> getCouponTypes() {
+
+            return Optional.ofNullable(couponTypes).filter(CollectionUtils::isNotEmpty).orElse(null);
+        }
+    }
 }

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInfoService.java

@@ -9,6 +9,9 @@ import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
+
+import java.util.List;
 
 /**
  * <p>
@@ -51,6 +54,22 @@ public interface CouponInfoService extends IService<CouponInfo> {
     IPage<CouponInventoryWrapper> queryCouponInventoryPageInfo(IPage<CouponInventoryWrapper> page, CouponInventoryQuery query);
 
     /**
+     * 查询订单优惠券信息
+     * @param userid 用户ID
+     * @param query CouponInfoQuery.CouponOrderQuery
+     * @return CouponOrderWrapper
+     */
+    CouponOrderWrapper queryUserOrderCouponInfo(Long userid, CouponInfoQuery.CouponOrderQuery query);
+
+    /**
+     * 更新用户订单优惠券状态
+     * @param userid 用户ID
+     * @param wrapper CouponOrderWrapper
+     * @return int 受影响的行数
+     */
+    int updateUserOrderCouponInfo(Long userid, CouponOrderWrapper wrapper);
+
+    /**
      * 新增优惠券库存量调整信息
      * @param inventory CouponInventory
      * @return int 入库行数

+ 97 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInfoServiceImp.java

@@ -2,16 +2,19 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
 import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
+import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponInventoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.mapper.CouponInfoMapper;
 import com.yonge.cooleshow.biz.dal.mapper.CouponInventoryMapper;
+import com.yonge.cooleshow.biz.dal.mapper.CouponIssueMapper;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
@@ -19,6 +22,7 @@ import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
@@ -48,6 +52,8 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
     private SysUserMapper sysUserMapper;
     @Autowired
     private CouponInventoryMapper couponInventoryMapper;
+    @Autowired
+    private CouponIssueMapper couponIssueMapper;
 
     /**
      * 分页查询优惠券信息
@@ -185,6 +191,97 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
     }
 
     /**
+     * 查询订单优惠券信息
+     *
+     * @param userid 用户ID
+     * @param query  CouponInfoQuery.CouponOrderQuery
+     * @return CouponOrderWrapper
+     */
+    @Override
+    public CouponOrderWrapper queryUserOrderCouponInfo(Long userid, CouponInfoQuery.CouponOrderQuery query) {
+
+        CouponOrderWrapper wrapper = CouponOrderWrapper.builder()
+                .discountedPrices(0D)
+                .couponInfos(Lists.newArrayList())
+                .build();
+
+        // 查询用户订单优惠券信息
+        List<CouponOrderWrapper.CouponInfo> couponInfos = getBaseMapper().selectUserOrderCouponInfo(userid, query);
+
+        // 计算抵扣金额
+        double discountPrices = 0;
+        // 订单金额
+        double amount = query.getAmount();
+
+        for (CouponOrderWrapper.CouponInfo item : couponInfos) {
+
+            if (amount >= item.getUseLimit()) {
+
+                // 重置数据选中状态
+                item.setSelected(true);
+                // 重新计算优惠券门槛金额
+                amount += item.getUseLimit();
+                // 叠加优惠券优惠金额
+                discountPrices += item.getDiscountPrice();
+            }
+        }
+
+        return wrapper.discountedPrices(discountPrices).couponInfos(couponInfos);
+    }
+
+    /**
+     * 更新用户订单优惠券状态
+     *
+     * @param userid  用户ID
+     * @param wrapper CouponOrderWrapper
+     * @return int 受影响的行数
+     */
+    @Override
+    public int updateUserOrderCouponInfo(Long userid, CouponOrderWrapper wrapper) {
+
+        // 更新数据信息
+        List<CouponOrderWrapper.CouponIssue> couponIssues = Lists.newArrayList();
+
+        if (wrapper.getReset()) {
+
+            // 重置订单优惠券使用状态
+            List<CouponIssue> issues = couponIssueMapper.selectList(Wrappers.<CouponIssue>lambdaQuery()
+                            .eq(CouponIssue::getUserId, userid)
+                    .eq(CouponIssue::getOrderNo, wrapper.getOrderNo()));
+
+            for (CouponIssue item : issues) {
+
+                couponIssues.add(CouponOrderWrapper.CouponIssue.builder()
+                        .id(item.getId())
+                        .useState(CouponUseStateEnum.USABLE)
+                        .useTime(0L)
+                        .build());
+            }
+        } else {
+
+            // 更新优惠券为已使用
+            List<CouponOrderWrapper.CouponInfo> couponInfos = wrapper.getCouponInfos().stream()
+                    .filter(CouponOrderWrapper.CouponInfo::getSelected).collect(Collectors.toList());
+
+            for (CouponOrderWrapper.CouponInfo item : couponInfos) {
+
+                couponIssues.add(CouponOrderWrapper.CouponIssue.builder()
+                                .id(item.getIssueId())
+                                .useState(CouponUseStateEnum.USED)
+                                .useTime(DateTime.now().getMillis())
+                        .build());
+            }
+        }
+
+        for (CouponOrderWrapper.CouponIssue item : couponIssues) {
+
+            couponIssueMapper.updateById(JSON.parseObject(item.jsonString(), CouponIssue.class));
+        }
+
+        return CollectionUtils.size(couponIssues);
+    }
+
+    /**
      * 新增优惠券库存量调整信息
      *
      * @param inventory CouponInventory

+ 38 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.dao.UserOrderDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -10,11 +11,15 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderPayRes;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ActivityResourceEnum;
@@ -33,6 +38,8 @@ import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
 import com.yonge.toolset.payment.util.DistributedLock;
+import org.apache.commons.collections.CollectionUtils;
+import org.joda.time.DateTime;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,6 +56,7 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Service
 public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> implements UserOrderService {
@@ -96,6 +104,8 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
     @Autowired
     private ActivityUserRewardService activityUserRewardService;
+    @Autowired
+    private CouponInfoService couponInfoService;
 
     //验证订单是否可以下单,获取订单金额信息
     private static final Map<GoodTypeEnum, Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>>> orderCreate = new HashMap<>();
@@ -287,6 +297,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
         //验证参数,必须验证参数
         BigDecimal actualPrice = BigDecimal.ZERO;
+        // 订单优惠券信息
+        CouponOrderWrapper couponOrderWrapper = CouponOrderWrapper.builder().couponInfos(Lists.newArrayList()).build();
+
         for (OrderReq.OrderReqInfo info : orderReq.getOrderInfos()) {
             Function<OrderReq.OrderReqInfo, HttpResponseResult<OrderCreateRes>> createFunction = orderCreate.get(info.getGoodType());
             if (Objects.isNull(createFunction)) {
@@ -306,8 +319,20 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 return HttpResponseResult.failed(StringUtil.isEmpty(createResult.getMsg()) ? "订单商品信息获取失败" : createResult.getMsg());
             }
             createRes.setGoodType(info.getGoodType());
+
+            // 计算优惠券金额
+            couponOrderWrapper = couponInfoService.queryUserOrderCouponInfo(orderReq.getUserId(),
+                    CouponInfoQuery.CouponOrderQuery.builder()
+                            .clientType(orderReq.getOrderClient())
+                            .couponTypes(CouponCategoryEnum.getCategory(orderReq.getOrderType().getCode()))
+                            .issueIds(Arrays.stream(orderReq.getCouponId().split(",")).map(Long::parseLong).collect(Collectors.toList()))
+                            .useState(CouponUseStateEnum.USABLE)
+                            .timestamp(DateTime.now().getMillis())
+                            .amount(createRes.getExpectPrice().doubleValue())
+                            .build());
+
             //todo 优惠券优惠金额,暂时为0
-            BigDecimal couponAmount = BigDecimal.ZERO;
+            BigDecimal couponAmount = BigDecimal.valueOf(couponOrderWrapper.getDiscountedPrices());
             if (createRes.getCouponAmount() != null) {
                 couponAmount = createRes.getCouponAmount();
             }
@@ -333,6 +358,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         //验证成功后,订单入库
         UserOrderVo orderVo = insertOrder(orderReq);
 
+        // 更新用户订单优惠券使用状态
+        if (CollectionUtils.isNotEmpty(couponOrderWrapper.getCouponInfos())) {
+
+            couponInfoService.updateUserOrderCouponInfo(orderReq.getUserId(), couponOrderWrapper.orderNo(orderReq.getOrderNo()));
+        }
+
         List<UserOrderDetailVo> orderDetailList = orderVo.getOrderDetailList();
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(orderReq.getUserId());
@@ -732,6 +763,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
         userOrder.setStatus(orderStatus);
         userOrder.setUpdateTime(new Date());
         baseMapper.updateById(userOrder);
+
+        // 重置优惠券状态
+        couponInfoService.updateUserOrderCouponInfo(userOrder.getUserId(), CouponOrderWrapper.builder()
+                        .orderNo(userOrder.getOrderNo())
+                        .reset(true)
+                .build());
     }
 
     private void orderSuccess(UserOrderVo detail) {

+ 119 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/coupon/CouponOrderWrapper.java

@@ -0,0 +1,119 @@
+package com.yonge.cooleshow.biz.dal.wrapper.coupon;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 优惠券订单信息
+ * Created by Eric.Shang on 2022/9/6.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CouponOrderWrapper implements Serializable {
+
+    // 优惠券叠加优惠金额
+    private Double discountedPrices;
+
+    // 订单优惠券信息
+    private List<CouponInfo> couponInfos;
+
+    // 优惠券状态重置标识
+    private Boolean reset;
+    // 订单编号
+    private String orderNo;
+
+    public String jsonString() {
+
+        return JSON.toJSONString(this);
+    }
+
+    public Boolean getReset() {
+        return Optional.ofNullable(reset).orElse(false);
+    }
+
+    public CouponOrderWrapper discountedPrices(Double discountedPrices) {
+        this.discountedPrices = discountedPrices;
+        return this;
+    }
+
+    public CouponOrderWrapper couponInfos(List<CouponInfo> couponInfos) {
+        this.couponInfos = couponInfos;
+        return this;
+    }
+
+    public CouponOrderWrapper reset(Boolean reset) {
+        this.reset = reset;
+        return this;
+    }
+
+    public CouponOrderWrapper orderNo(String orderNo) {
+        this.orderNo = orderNo;
+        return this;
+    }
+
+    /**
+     * 用户优惠券信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class CouponInfo implements Serializable {
+
+        // 优惠券ID
+        private Long id;
+        // 优惠券名称
+        private String name;
+        // 使用门槛
+        private Double useLimit;
+        // 抵扣金额
+        private Double discountPrice;
+        // 使用状态
+        private Boolean selected;
+        // 发放ID
+        private Long issueId;
+
+        public Double getUseLimit() {
+            return Optional.ofNullable(useLimit).orElse(0D);
+        }
+
+        public Double getDiscountPrice() {
+            return Optional.ofNullable(discountPrice).orElse(0D);
+        }
+
+        public Boolean getSelected() {
+            return Optional.ofNullable(selected).orElse(false);
+        }
+    }
+
+    /**
+     * 订单
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class CouponIssue implements Serializable {
+
+        // 发放ID
+        private Long id;
+        // 使用状态
+        private CouponUseStateEnum useState;
+        // 使用时间
+        private Long useTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+}

+ 35 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponInfoMapper.xml

@@ -117,6 +117,40 @@
         GROUP BY t1.coupon_id_
     </select>
 
+    <!--用户订单优惠券信息-->
+    <resultMap id="UserOrderCouponInfoResultMap" type="com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponOrderWrapper$CouponInfo">
+        <id column="id_" property="id" />
+        <result column="name_" property="name" />
+        <result column="use_limit_" property="useLimit" />
+        <result column="discount_price_" property="discountPrice" />
+        <result column="issue_id" property="issueId" />
+    </resultMap>
+    <select id="selectUserOrderCouponInfo" resultMap="UserOrderCouponInfoResultMap">
+        SELECT t1.id_, t1.name_, t1.use_limit_, t1.discount_price_, t2.id_ AS issue_id
+        FROM coupon_info t1 JOIN coupon_issue t2 ON t1.id_ = t2.coupon_id_
+        <where>
+            <if test="userId != null">
+                AND t2.user_id_ = #{userId}
+            </if>
+            <if test="record.issueIds != null">
+                AND t2.id_ IN (<foreach collection="record.issueIds" separator="," item="item">#{item}</foreach>)
+            </if>
+            <if test="record.clientType != null">
+                AND t2.client_type_ = #{record.clientType}
+            </if>
+            <if test="record.useState != null">
+                AND t2.use_state_ = #{record.useState}
+            </if>
+            <if test="record.timestamp != null">
+                AND (t2.start_time_ &lt;= #{record.timestamp} AND #{record.timestamp} &lt;= t2.end_time_)
+            </if>
+            <if test="record.couponTypes != null">
+                AND t1.coupon_type_ IN (<foreach collection="record.couponTypes" separator="," item="item">#{item}</foreach>)
+            </if>
+        </where>
+    </select>
+    <!--用户订单优惠券信息-->
+
     <update id="updateStock">
         update coupon_info set inventory_ = inventory_
         <choose>
@@ -128,7 +162,7 @@
                 where inventory_ - #{size} &gt;= 0
             </when>
         </choose>
+    </update>
 
 
-    </update>
 </mapper>