소스 검색

微信授权登录

chunping 3 년 전
부모
커밋
2910d90564
21개의 변경된 파일380개의 추가작업 그리고 399개의 파일을 삭제
  1. 5 4
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  2. 5 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java
  3. 66 138
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  4. 16 10
      mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java
  5. 1 1
      mp-admin/src/main/resources/application.yml
  6. 6 1
      mp-common/src/main/java/com/qs/mp/common/constant/Constants.java
  7. 43 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelRoleEnum.java
  8. 6 4
      mp-common/src/main/java/com/qs/mp/common/enums/UserIdentityEnum.java
  9. 27 136
      mp-framework/src/main/java/com/qs/mp/framework/web/service/SysLoginService.java
  10. 7 0
      mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java
  11. 1 1
      mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java
  12. 12 7
      mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java
  13. 0 18
      mp-service/src/main/java/com/qs/mp/framework/redis/RedisKeyBuilder.java
  14. 66 72
      mp-service/src/main/java/com/qs/mp/framework/service/impl/AppTokenServiceImpl.java
  15. 1 1
      mp-service/src/main/java/com/qs/mp/user/domain/vo/TicketOrderSettleVO.java
  16. 76 0
      mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java
  17. 8 0
      mp-service/src/main/java/com/qs/mp/user/mapper/UserCouponMapper.java
  18. 8 0
      mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java
  19. 15 0
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java
  20. 3 2
      mp-service/src/main/resources/mapper/admin/CouponMapper.xml
  21. 8 1
      mp-service/src/main/resources/mapper/user/UserCouponMapper.xml

+ 5 - 4
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -37,6 +37,7 @@ import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.framework.redis.RedisKey;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
@@ -89,7 +90,7 @@ public class ChannelOrderController extends BaseApiController {
   @Autowired
   private RedisCache redisCache;
 
-  private final String CHANNEL_ORDER_CACHE_KEY = "channel_settle_order_";
+
 
   /**
    * 订单列表
@@ -177,7 +178,7 @@ public class ChannelOrderController extends BaseApiController {
     orderSettleVO.setPkgNum(pkgNum);
 
     // 缓存订单结算对象
-    redisCache.setCacheObject(CHANNEL_ORDER_CACHE_KEY + channelId, orderSettleVO, 10, TimeUnit.MINUTES);
+    redisCache.setCacheObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, channelId), orderSettleVO, 10, TimeUnit.MINUTES);
     return AjaxResult.success(orderSettleVO);
   }
 
@@ -193,7 +194,7 @@ public class ChannelOrderController extends BaseApiController {
       LogUtil.info(logger, "账号未认证。channelId:{0}", channelId);
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1016);
     }
-    ChannelOrderSettleVO orderSettleVO = redisCache.getCacheObject(CHANNEL_ORDER_CACHE_KEY + channelId);
+    ChannelOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, channelId));
     if (null == orderSettleVO) {
       return AjaxResult.error("订单已过期,请重新下单");
     }
@@ -203,7 +204,7 @@ public class ChannelOrderController extends BaseApiController {
     String orderId = channelOrderService.submitOrder(channelId, order.getMemo(), orderSettleVO);
 
     // 清除缓存的订单
-    redisCache.deleteObject(CHANNEL_ORDER_CACHE_KEY + channelId);
+    redisCache.deleteObject(RedisKey.build(RedisKey.CHANNEL_ORDER_KEY, channelId));
 
     return AjaxResult.success(orderId);
   }

+ 5 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java

@@ -163,7 +163,7 @@ public class UserController extends BaseApiController {
   public AjaxResult wxauthMobile(@RequestBody WxLoginParams wxLoginParams) {
     String appId = userAppId;
     String appSecret = userAppSecret;
-    if (UserIdentityEnum.isChannel(UserIdentityEnum.valueOf(wxLoginParams.getIdentity()))) {
+    if (UserIdentityEnum.isChannel(wxLoginParams.getIdentity())) {
       appId = channelAppId;
       appSecret = channelAppSecret;
     }
@@ -195,8 +195,10 @@ public class UserController extends BaseApiController {
       sysUser.setNickName(phoneNumber);
       sysUserService.registerUser(sysUser);
     }
-    String token = sysLoginService.wxAuthLogin(phoneNumber, wxLoginParams.getIdentity());
-    ajax.put(Constants.TOKEN, token);
+    Map<String, String> result = sysLoginService.wxAuthLogin(phoneNumber, wxLoginParams.getIdentity());
+    for (String key : result.keySet()) {
+      ajax.put(key, result.get(key));
+    }
     return ajax;
   }
 

+ 66 - 138
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -12,6 +12,7 @@ package com.qs.mp.web.controller.api.user;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Coupon;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketAwardsPrize;
 import com.qs.mp.admin.domain.TicketBox;
@@ -23,18 +24,29 @@ import com.qs.mp.admin.domain.vo.TicketVO;
 import com.qs.mp.admin.service.ITicketAwardsPrizeService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelAddr;
 import com.qs.mp.channel.domain.ChannelCart;
+import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.ChannelOrderParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.ChannelCertifyStatusEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
 import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.domain.param.TicketOrderParam;
+import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
+import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserHitPrizeService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
 import com.qs.mp.utils.SecurityUtils;
@@ -76,174 +88,90 @@ public class UserTicketOrderController extends BaseApiController {
   @Autowired
   private IUserHitPrizeService userHitPrizeService;
 
+  @Autowired
+  private IUserCouponService userCouponService;
+
   @Autowired
   private MapperFacade mapperFacade;
 
+  @Autowired
+  private RedisCache redisCache;
+
 
   /**
    * 订单结算,每次更换优惠券时需重新请求此接口
    */
   @PostMapping("/order/settle")
   @ApiOperation(value = "订单结算" , notes = "购物车里点结算或者单个盲票组商品上点立即购买")
-  public AjaxResult settle(@Valid @RequestBody ChannelOrderParam param) {
-    Long channelId = SecurityUtils.getLoginUser().getChannelId();
-
-    ChannelOrderSettleVO orderSettleVO = new ChannelOrderSettleVO();
-/*
-    // 收货地址,如果用户选了地址,则此处不做处理
-    if (null == param.getAddrId() || 0 == param.getAddrId()) {
-      //读取默认地址
-      ChannelAddr addr = channelAddrService.getDefaultChannelAddr(channelId);
-      if (null != addr) {
-        orderSettleVO.setAddr(addr);
-      }
+  public AjaxResult settle(@Valid @RequestBody TicketOrderParam param) {
+    if (StringUtils.isBlank(param.getTicketId()) && StringUtils.isBlank(param.getBoxId())) {
+      return AjaxResult.error("参数缺失");
     }
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+
+    TicketOrderSettleVO orderSettleVO = new TicketOrderSettleVO();
+
 
     // 订单金额计算
     Integer orderAmt = 0;
-    Integer pkgNum = 0;
-    if (!CollectionUtils.isEmpty(param.getCartIds())){
-      // 购物车里下单的
-      List<ChannelCart> channelCarts = channelCartService.listByIds(param.getCartIds());
-      for (ChannelCart channelCart : channelCarts) {
-        TicketBox ticketBox = ticketBoxService.getById(channelCart.getBoxId());
-        orderAmt += ticketBox.getPkgSalePrice() * channelCart.getOrderNum();
-        ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
-        cartVO.setCartId(channelCart.getCartId());
-        cartVO.setOrderNum(channelCart.getOrderNum());
-        orderSettleVO.getItems().add(cartVO);
-        pkgNum += channelCart.getOrderNum();
-      }
+    Integer discountAmt = 0;
+    String picUrl;
+    if (StringUtils.isNotBlank(param.getTicketId())) {
+      // 线下扫码购票
+      Ticket ticket = ticketService.getById(param.getTicketId());
+      TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+      orderAmt = ticketBox.getSalePrice();
+      picUrl = ticketBox.getPicUrl();
     } else {
+      // 线上购票
       TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
-      orderAmt += ticketBox.getPkgSalePrice() * param.getOrderNum();
-      ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
-      cartVO.setOrderNum(param.getOrderNum());
-      orderSettleVO.getItems().add(cartVO);
-      pkgNum += param.getOrderNum();
+      orderAmt = ticketBox.getSalePrice() * param.getOrderNum();
+      picUrl = ticketBox.getPicUrl();
+    }
+
+    if (param.getAutoCoupon() == 1) {
+      // 系统自动选择优惠券,按照金额从大到小排序
+      List<UserCouponVO> userCouponList = userCouponService.listTicketOrderCoupon(userId);
+      for (UserCouponVO userCouponVO : userCouponList) {
+        if (orderAmt >= userCouponVO.getMinOrderAmt() && orderAmt >= userCouponVO.getDiscount()) {
+          orderSettleVO.getCouponList().add(userCouponVO);
+          discountAmt = userCouponVO.getDiscount();
+        }
+      }
+    } else {
+      // 查询指定券
     }
     orderSettleVO.setOrderAmt(orderAmt);
+    orderSettleVO.setDiscountAmt(discountAmt);
     // 当前没有运费和优惠,实付金额=订单金额
-    orderSettleVO.setPayAmt(orderAmt);
-    orderSettleVO.setPkgNum(pkgNum);
+    orderSettleVO.setPayAmt(orderAmt - discountAmt);
+    orderSettleVO.setOrderNum(param.getOrderNum());
+    orderSettleVO.setBoxId(param.getBoxId());
+    orderSettleVO.setTicketId(param.getTicketId());
+    orderSettleVO.setPicUrl(picUrl);
 
     // 缓存订单结算对象
-    redisCache.setCacheObject(CHANNEL_ORDER_CACHE_KEY + channelId, orderSettleVO, 10, TimeUnit.MINUTES);*/
+    redisCache.setCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId), orderSettleVO, 10, TimeUnit.MINUTES);
     return AjaxResult.success(orderSettleVO);
   }
 
 
   /**
-   * 查看盲票详情
-   */
-  @PostMapping("/mall/ticket/detail")
-  @ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
-  public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
-    if (StringUtils.isBlank(param.getBoxId())) {
-      return AjaxResult.error("参数异常,盲票组ID缺失");
-    }
-    TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
-    TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
-    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
-        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
-    return AjaxResult.success(ticketBoxVO);
-  }
-
-  /**
-   * 扫码查看盲票幸运数字
-   */
-  @PostMapping("/ticket/queryLuckyNum")
-  @ApiOperation(value = "查看盲票幸运数字" , notes = "根据盲票组ID,获取盲票幸运数字")
-  public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    if (StringUtils.isBlank(param.getTicketId())) {
-      return AjaxResult.error("参数异常,盲票ID缺失");
-    }
-
-    Ticket ticket = ticketService.getById(param.getTicketId());
-    if (null == ticket) {
-      return AjaxResult.error("参数异常,盲票不存在");
-    }
-
-    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
-    }
-
-    // 已付款的盲票,需要校验当前用户是否有权限查看
-    if (ticket.getStatus() == TicketStatusEnum.ACTIVATED) {
-      UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, param.getTicketId());
-      if (null == orderItem) {
-        return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
-      }
-    }
-
-    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
-
-    TicketVO ticketVO = new TicketVO();
-    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
-        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
-    ticketVO.setTicketId(ticket.getTicketId());
-    ticketVO.setBoxId(ticket.getBoxId());
-    ticketVO.setTitle(ticketBox.getTitle());
-    ticketVO.setSerialNo(ticket.getSerialNo());
-    ticketVO.setFacePrice(ticket.getFacePrice());
-    ticketVO.setSalePrice(ticketBox.getSalePrice());
-    ticketVO.setPlainLuckyNum(ticket.getPlainLuckyNum());
-    ticketVO.setStatus(ticket.getStatus().getValue());
-
-    return AjaxResult.success(ticketVO);
-  }
-
-  /**
-   * 查看能兑奖的奖品
-   */
-  @PostMapping("/ticket/queryHitPrizeList")
-  @ApiOperation(value = "查看兑奖奖品" , notes = "根据盲票ID,查看兑奖奖品")
-  public AjaxResult queryHitPrizeList(@RequestBody TicketParam param) {
-    Long userId = SecurityUtils.getLoginUser().getUserId();
-    if (StringUtils.isBlank(param.getTicketId())) {
-      return AjaxResult.error("参数异常,盲票ID缺失");
-    }
-
-    Ticket ticket = ticketService.getById(param.getTicketId());
-    if (null == ticket) {
-      return AjaxResult.error("参数异常,盲票不存在");
-    }
-    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
-    }
-    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
-    }
-
-    List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
-    return AjaxResult.success(ticketAwardsPrizes);
-  }
-
-  /**
-   * 兑奖
+   * 提交订单
    */
-  @PostMapping("/ticket/cashPrize")
-  @ApiOperation(value = "兑奖" , notes = "选择奖品兑奖")
-  public AjaxResult cashPrize(@RequestBody TicketParam param) {
+  @PostMapping("/order/submit")
+  @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
+  public AjaxResult submit(@RequestBody UserTicketOrder order) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
-    if (StringUtils.isBlank(param.getTicketId()) || StringUtils.isBlank(param.getAwardsId())
-    || StringUtils.isBlank(param.getPrizeId())) {
-      return AjaxResult.error("参数缺失");
+    TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
+    if (null == orderSettleVO) {
+      return AjaxResult.error("订单已过期,请重新下单");
     }
+    //String orderId = channelOrderService.submitOrder(channelId, order.getMemo(), orderSettleVO);
 
-    Ticket ticket = ticketService.getById(param.getTicketId());
-    if (null == ticket) {
-      return AjaxResult.error("参数异常,盲票不存在");
-    }
-    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
-    }
-    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
-      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
-    }
+    // 清除缓存的订单
+    redisCache.deleteObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
 
-    userHitPrizeService.cashPrize(ticket, userId, param.getAwardsId(), param.getPrizeId());
     return AjaxResult.success();
   }
 

+ 16 - 10
mp-admin/src/main/java/com/qs/mp/web/controller/system/SysLoginController.java

@@ -26,7 +26,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 /**
  * 登录验证
- * 
+ *
  * @author ygp
  */
 @RestController
@@ -46,7 +46,7 @@ public class SysLoginController
 
     /**
      * 登录方法
-     * 
+     *
      * @param loginBody 登录信息
      * @return 结果
      */
@@ -59,9 +59,11 @@ public class SysLoginController
             loginBody.getUuid());
 
         // 生成令牌
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+        Map<String, String> result = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                 loginBody.getUuid(), loginBody.getIdentity());
-        ajax.put(Constants.TOKEN, token);
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
         return ajax;
     }
 
@@ -70,9 +72,11 @@ public class SysLoginController
     {
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
-        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
+        Map<String, String> result = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
             loginBody.getUuid(), loginBody.getIdentity());
-        ajax.put(Constants.TOKEN, token);
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
         return ajax;
     }
 
@@ -84,14 +88,16 @@ public class SysLoginController
             return AjaxResult.error("请输入6位验证码");
         }
         AjaxResult ajax = AjaxResult.success();
-        String token = loginService.login(smsCode);
-        ajax.put(Constants.TOKEN, token);
+        Map<String, String> result = loginService.login(smsCode);
+        for (String key : result.keySet()) {
+            ajax.put(key, result.get(key));
+        }
         return ajax;
     }
 
     /**
      * 获取用户信息
-     * 
+     *
      * @return 用户信息
      */
     @GetMapping("getInfo")
@@ -111,7 +117,7 @@ public class SysLoginController
 
     /**
      * 获取路由信息
-     * 
+     *
      * @return 路由信息
      */
     @GetMapping("getRouters")

+ 1 - 1
mp-admin/src/main/resources/application.yml

@@ -127,7 +127,7 @@ cloud:
 wx-channel:
   appId: wxc3a684f1196f6e15
   appSecret: 7708655ba65f04de2a42f23d20ab4134
-#渠道端小程序appid和密钥
+#用户端小程序appid和密钥
 wx-user:
   appId: wx8533800e393dbd6b
   appSecret: f7a104e09d6c2e55445be2a45c4ab551

+ 6 - 1
mp-common/src/main/java/com/qs/mp/common/constant/Constants.java

@@ -4,7 +4,7 @@ import io.jsonwebtoken.Claims;
 
 /**
  * 通用常量信息
- * 
+ *
  * @author ygp
  */
 public class Constants
@@ -94,6 +94,11 @@ public class Constants
      */
     public static final String TOKEN = "token";
 
+    /**
+     * 渠道端角色
+     */
+    public static final String CHANNEL_ROLE = "channelRole";
+
     /**
      * 令牌前缀
      */

+ 43 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelRoleEnum.java

@@ -0,0 +1,43 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ *
+ * 渠道角色
+ *
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum ChannelRoleEnum implements IEnum<String> {
+
+  CHANNEL("channel", "渠道"),
+  SALESITE("salesite", "经销商");
+
+  private final String value;
+  private final String desc;
+
+  ChannelRoleEnum(final String value, final String desc) {
+    this.value = value;
+    this.desc = desc;
+  }
+
+  @Override
+  public String getValue() {
+    return value;
+  }
+
+  /**
+   * 重写toString,单个转化成json
+   * @return
+   */
+  @Override
+  public String toString() {
+    JSONObject object = new JSONObject();
+    object.put("value",value);
+    object.put("desc", desc);
+    return object.toString();
+  }
+}

+ 6 - 4
mp-common/src/main/java/com/qs/mp/common/enums/UserIdentityEnum.java

@@ -8,13 +8,15 @@ package com.qs.mp.common.enums;
  */
 public enum UserIdentityEnum {
 
-	CHANNEL, // 代理渠道
-	SALESITE, // 经销商
+	CHANNEL, // 渠道端
 	USER, // 用户
 	ADMIN // 管理后台
 	;
-	public static boolean isChannel(UserIdentityEnum identity) {
-		return identity == CHANNEL || identity == SALESITE;
+	public static boolean isChannel(int identity) {
+		return identity == CHANNEL.ordinal();
+	}
+	public static boolean isUser(int identity) {
+		return identity == USER.ordinal();
 	}
 
 	public static UserIdentityEnum valueOf(int ordinal) {

+ 27 - 136
mp-framework/src/main/java/com/qs/mp/framework/web/service/SysLoginService.java

@@ -1,9 +1,11 @@
 package com.qs.mp.framework.web.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.enums.ChannelRoleEnum;
 import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.exception.user.CaptchaException;
@@ -22,6 +24,8 @@ import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.service.ISysConfigService;
 import com.qs.mp.system.service.ISysUserService;
 
+import java.util.HashMap;
+import java.util.Map;
 import javax.annotation.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -75,7 +79,7 @@ public class SysLoginService
      * @param identity 唯一标识
      * @return 结果
      */
-    public String login(String username, String password, String code, String uuid, int identity)
+    public Map<String, String> login(String username, String password, String code, String uuid, int identity)
     {
         // 用户验证
         Authentication authentication = null;
@@ -101,99 +105,35 @@ public class SysLoginService
         }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
-        recordLoginInfo(loginUser.getUser());
-
-        loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
-        if (!loginUser.getUsername().equals("admin") && UserIdentityEnum.isChannel(loginUser.getIdentity())) {
-            fillChannelInfo(loginUser);
-        }
-/*
-        // 根据用户身份,设置对应的属性
-        loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
-
-        if(loginUser.isCustomer()){
-            fillCustomerInfo(loginUser);
-        }*/
-//        if(loginUser.isMerchant()){
-//            fillMerchantInfoByStaffs(loginUser);
-//        }
-        // 生成token
-        return tokenService.createToken(loginUser);
+        return buildUserToken(identity, loginUser);
     }
 
-    public String wxAuthLogin(String username, int identity)
-    {
-        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
-        LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(username);
+    private Map<String, String> buildUserToken(int identity, LoginUser loginUser) {
         recordLoginInfo(loginUser.getUser());
+        HashMap<String, String> result = new HashMap<>();
 
         loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
-        if (!loginUser.getUsername().equals("admin") && UserIdentityEnum.isChannel(loginUser.getIdentity())) {
-            fillChannelInfo(loginUser);
+        if (!loginUser.getUsername().equals("admin") && UserIdentityEnum.isChannel(
+            loginUser.getIdentity().ordinal())) {
+            ChannelRoleEnum roleEnum = fillChannelInfo(loginUser);
+            result.put(Constants.CHANNEL_ROLE, roleEnum.getValue());
         }
 
         // 生成token
-        return tokenService.createToken(loginUser);
+        String token = tokenService.createToken(loginUser);
+        result.put(Constants.TOKEN, token);
+
+        return result;
     }
 
-    /**
-     * 登录验证
-     *
-     * @param username 用户名
-     * @param code 验证码
-     * @param uuid 唯一标识
-     * @param identity 唯一标识
-     * @return 结果
-     */
-    public String loginBySms(String username, String code, String uuid, int identity)
+    public Map<String, String> wxAuthLogin(String username, int identity)
     {
-        // 校验短信验证码
-        validateSMSCaptcha(username, code, uuid);
-
-        // 用户验证
-        Authentication authentication = null;
-        try
-        {
-            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
-            authentication = authenticationManager
-                    .authenticate(new UsernamePasswordAuthenticationToken(username, code));
-        }
-        catch (Exception e)
-        {
-            if (e instanceof BadCredentialsException)
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
-                throw new UserPasswordNotMatchException();
-            }
-            else
-            {
-                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
-                throw new ServiceException(e.getMessage());
-            }
-        }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
-        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
-        recordLoginInfo(loginUser.getUser());
-
-        loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
-        if (!loginUser.getUsername().equals("admin") && UserIdentityEnum.isChannel(loginUser.getIdentity())) {
-            fillChannelInfo(loginUser);
-        }
-/*
-        // 根据用户身份,设置对应的属性
-        loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
-
-        if(loginUser.isCustomer()){
-            fillCustomerInfo(loginUser);
-        }*/
-//        if(loginUser.isMerchant()){
-//            fillMerchantInfoByStaffs(loginUser);
-//        }
-        // 生成token
-        return tokenService.createToken(loginUser);
+        LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(username);
+        return buildUserToken(identity, loginUser);
     }
 
-    public String login(SmsCode smsCode)
+    public Map<String, String> login(SmsCode smsCode)
     {
         // 用户验证
         Authentication authentication = null;
@@ -220,29 +160,7 @@ public class SysLoginService
         }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(smsCode.getMobile(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
-        recordLoginInfo(loginUser.getUser());
-
-        loginUser.setIdentity(UserIdentityEnum.valueOf(smsCode.getIdentity()));
-        if (!loginUser.getUsername().equals("admin") && UserIdentityEnum.isChannel(loginUser.getIdentity())) {
-            fillChannelInfo(loginUser);
-        }
-/*
-        // 根据用户身份,设置对应的属性
-        loginUser.setIdentity(UserIdentityEnum.valueOf(smsCode.getIdentity()));
-        logger.info("login user info :"+ JSONObject.toJSONString(loginUser));
-
-        if(loginUser.isCustomer()){
-            fillCustomerInfo(loginUser);
-        }*/
-//        if(loginUser.isMerchant()){
-//            fillMerchantInfoByStaffs(loginUser);
-//        }
-
-        logger.info("prepare create token 。。。");
-        String token = tokenService.createToken(loginUser);
-        logger.info("token:"+token);
-        // 生成token
-        return token;
+        return buildUserToken(smsCode.getIdentity(), loginUser);
     }
 
     /**
@@ -270,31 +188,6 @@ public class SysLoginService
         }
     }
 
-    /**
-     * 校验验证码
-     *
-     * @param username 用户名
-     * @param code 短信验证码
-     * @param uuid 唯一标识
-     * @return 结果
-     */
-    public void validateSMSCaptcha(String username, String code, String uuid)
-    {
-        String verifyKey = Constants.SMS_CAPTCHA_CODE_KEY + uuid;
-        String captcha = redisCache.getCacheObject(verifyKey);
-        redisCache.deleteObject(verifyKey);
-        if (captcha == null)
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
-            throw new CaptchaExpireException();
-        }
-        if (!code.equalsIgnoreCase(captcha))
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
-            throw new CaptchaException();
-        }
-    }
-
     /**
      * 记录登录信息
      */
@@ -309,21 +202,19 @@ public class SysLoginService
      * 填充注入Channel 渠道/经销商  信息
      * @param loginUser
      */
-    public void fillChannelInfo(LoginUser loginUser){
+    public ChannelRoleEnum fillChannelInfo(LoginUser loginUser){
     	Channel channel = channelService.getChannelByUserId(loginUser.getUserId());
         if (null != channel && null != channel.getChannelId()){
-            // 校验渠道身份标识
-            if (loginUser.getIdentity() == UserIdentityEnum.CHANNEL && channel.getLevel() <= 0) {
-                throw new ServiceException("此账号的渠道不存在");
-            } else if (loginUser.getIdentity() == UserIdentityEnum.SALESITE && channel.getLevel() != 0) {
-                throw new ServiceException("此账号的经销商不存在");
-            }
           loginUser.setChannelId(channel.getChannelId());
           loginUser.setChannelNo(channel.getChannelNo());
+          if (channel.getLevel() == 0) {
+              return ChannelRoleEnum.SALESITE;
+          } else {
+              return ChannelRoleEnum.CHANNEL;
+          }
         } else {
             throw new ServiceException("登录账号不存在");
         }
-
     }
 
 

+ 7 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/Coupon.java

@@ -76,6 +76,13 @@ public class Coupon implements Serializable {
   @TableField("min_order_amt")
   private Integer minOrderAmt;
 
+  /**
+   * 渠道代金券,渠道承担比例
+   */
+  @TableField("channel_shared_rate")
+  private Integer channelSharedRate;
+
+
   /**
    * 状态;off下架 on正常
    */

+ 1 - 1
mp-service/src/main/java/com/qs/mp/admin/service/impl/CouponServiceImpl.java

@@ -60,7 +60,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
     userCoupon.setCouponId(coupon.getCouponId());
     if (coupon.getDueDays() > 0) {
       userCoupon.setValidStart(DateUtils.getToday());
-      userCoupon.setValidEnd(DateUtils.addDays(userCoupon.getValidStart(), coupon.getDueDays()));
+      userCoupon.setValidEnd(DateUtils.addDays(userCoupon.getValidStart(), coupon.getDueDays() - 1));
     } else {
       userCoupon.setValidStart(coupon.getValidStart());
       userCoupon.setValidEnd(coupon.getValidEnd());

+ 12 - 7
mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java

@@ -1,21 +1,26 @@
 package com.qs.mp.framework.redis;
 
+import com.qs.mp.common.utils.MessageHelper;
+
 /**
  * redis Key管理模版
- * 
+ *
  * @author duota
  *
  */
 public enum RedisKey {
-    
-    App_Secret_Key("app_secret:{appId}", new String[] { "appId"}),
-    User_Token_Key("user_token:{token}", new String[] { "token"});
+    WX_APP_TOKEN_KEY("app_token_key_{0}", "小程序app token"),
+    CHANNEL_ORDER_KEY("channel_order_{0}", "经销商下的盲票采购单"),
+    USER_TICKET_ORDER_KEY("user_ticket_order_key_{0}", "用户购票订单");
 
     public String keyTemplate;
-    public String[] keyNames;
+    public String desc;
 
-    RedisKey(String keyTemplate, String[] keyNames) {
+    RedisKey(String keyTemplate, String desc) {
         this.keyTemplate = keyTemplate;
-        this.keyNames = keyNames;
+        this.desc = desc;
+    }
+    public static String build(RedisKey redisKey, Object... param) {
+        return MessageHelper.formatMsg(redisKey.keyTemplate, param);
     }
 }

+ 0 - 18
mp-service/src/main/java/com/qs/mp/framework/redis/RedisKeyBuilder.java

@@ -1,18 +0,0 @@
-package com.qs.mp.framework.redis;
-
-import java.util.Map;
-
-public class RedisKeyBuilder {
-    
-    public static String build(RedisKey redisKey, Map<String, String> params) {
-        String key = redisKey.keyTemplate;
-        String[] keyNames = redisKey.keyNames;
-        for (String keyName : keyNames) {
-            String param = params.get(keyName);
-            param = param == null ? "*" : param;
-
-            key = key.replace("{" + keyName + "}", param);
-        }
-        return key;
-    }
-}

+ 66 - 72
mp-service/src/main/java/com/qs/mp/framework/service/impl/AppTokenServiceImpl.java

@@ -10,12 +10,9 @@ import com.qs.mp.common.utils.http.HttpUtils;
 import com.qs.mp.framework.domain.AppToken;
 import com.qs.mp.framework.mapper.AppTokenMapper;
 import com.qs.mp.framework.redis.RedisKey;
-import com.qs.mp.framework.redis.RedisKeyBuilder;
 import com.qs.mp.framework.redis.RedisUtil;
 import com.qs.mp.framework.service.IAppTokenService;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,82 +20,79 @@ import org.springframework.stereotype.Service;
 
 @Service
 public class AppTokenServiceImpl implements IAppTokenService {
-    protected final Logger logger = LoggerFactory.getLogger(AppTokenServiceImpl.class);
 
-    @Autowired
-    private AppTokenMapper appTokenMapper;
+  protected final Logger logger = LoggerFactory.getLogger(AppTokenServiceImpl.class);
 
+  @Autowired
+  private AppTokenMapper appTokenMapper;
 
-    @Autowired
-    private RedisUtil redis;
-    
-    @Override
-    public AppToken selectByPrimaryKey(String appId) {
-        return appTokenMapper.selectByPrimaryKey(appId);
-    }
 
-    @Override
-    public String getAccessToken(String appId) {
-        Map<String, String> keyParams = new HashMap<String, String>();
-        keyParams.put("appId", appId);
-        String cacheKey = RedisKeyBuilder.build(RedisKey.App_Secret_Key, keyParams);
-
-        boolean updateCache = false;
-
-        String appInfo = redis.get(cacheKey);
-        AppToken token = null;
-        if (StringUtils.isBlank(appInfo)) {
-            token = selectByPrimaryKey(appId);
-            if (null == token) {
-                LogUtil.error(logger, "app_token记录不存在,appId:{0}", appId);
-                throw new ServiceException();
-            }
-            updateCache = true;
-        } else {
-            token = JSON.parseObject(appInfo, AppToken.class);
-        }
-
-        LogUtil.info(logger, "token: {0}", JSON.toJSONString(token));
-        if (token.getExpireTimestamp().getTime() < System.currentTimeMillis()) {
-            String res = wxGetAccessToken(appId, token.getAppSecret());
-            if (StringUtils.isEmpty(res)){
-                LogUtil.error(logger, "获取access_token为空,appId:{0}, res:{1}", new Object[]{appId,
-                                                                                          res});
-                throw new ServiceException();
-            }
-            JSONObject jsonObject = JSONObject.parseObject(res);
-            String accessToken = jsonObject.getString("access_token");
-            Integer expiresIn = jsonObject.getInteger("expires_in");
-            if(StringUtils.isEmpty(accessToken)){
-                LogUtil.error(logger, "获取access_token为空,appId:{0}, res:{1}",
-                        new Object[] { appId, res });
-                throw new ServiceException();
-            }
-            token.setAccessToken(accessToken);
-            // 防止时间不同步,此处提前100s超时
-            token.setExpireTimestamp(DateUtils.addSeconds(new Date(), expiresIn-100));
-            appTokenMapper.updateByPrimaryKeySelective(token);
-            updateCache = true;
-
-        }
-
-        if(updateCache) {
-            boolean result = redis.set(cacheKey, JSON.toJSONString(token));
-            if (!result) {
-                LogUtil.error(logger, "appsecret key set error.cacheKey:", cacheKey);
-            }
-        }
-
-
-
-        return token.getAccessToken();
+  @Autowired
+  private RedisUtil redis;
+
+  @Override
+  public AppToken selectByPrimaryKey(String appId) {
+    return appTokenMapper.selectByPrimaryKey(appId);
+  }
+
+  @Override
+  public String getAccessToken(String appId) {
+    String cacheKey = RedisKey.build(RedisKey.WX_APP_TOKEN_KEY, appId);
+
+    boolean updateCache = false;
+
+    String appInfo = redis.get(cacheKey);
+    AppToken token = null;
+    if (StringUtils.isBlank(appInfo)) {
+      token = selectByPrimaryKey(appId);
+      if (null == token) {
+        LogUtil.error(logger, "app_token记录不存在,appId:{0}", appId);
+        throw new ServiceException();
+      }
+      updateCache = true;
+    } else {
+      token = JSON.parseObject(appInfo, AppToken.class);
     }
 
-    private String wxGetAccessToken(String appId, String appSecret) {
-        String param = "appid=" + appId + "&secret=" + appSecret + "&grant_type=client_credential";
-        String res = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/token", param);
-        return res;
+    LogUtil.info(logger, "token: {0}", JSON.toJSONString(token));
+    if (token.getExpireTimestamp().getTime() < System.currentTimeMillis()) {
+      String res = wxGetAccessToken(appId, token.getAppSecret());
+      if (StringUtils.isEmpty(res)) {
+        LogUtil.error(logger, "获取access_token为空,appId:{0}, res:{1}", appId,
+            res);
+        throw new ServiceException();
+      }
+      JSONObject jsonObject = JSONObject.parseObject(res);
+      String accessToken = jsonObject.getString("access_token");
+      Integer expiresIn = jsonObject.getInteger("expires_in");
+      if (StringUtils.isEmpty(accessToken)) {
+        LogUtil.error(logger, "获取access_token为空,appId:{0}, res:{1}",
+            appId, res);
+        throw new ServiceException();
+      }
+      token.setAccessToken(accessToken);
+      // 防止时间不同步,此处提前100s超时
+      token.setExpireTimestamp(DateUtils.addSeconds(new Date(), expiresIn - 100));
+      appTokenMapper.updateByPrimaryKeySelective(token);
+      updateCache = true;
 
     }
 
+    if (updateCache) {
+      boolean result = redis.set(cacheKey, JSON.toJSONString(token));
+      if (!result) {
+        LogUtil.error(logger, "appsecret key set error.cacheKey:", cacheKey);
+      }
+    }
+
+    return token.getAccessToken();
+  }
+
+  private String wxGetAccessToken(String appId, String appSecret) {
+    String param = "appid=" + appId + "&secret=" + appSecret + "&grant_type=client_credential";
+    String res = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/token", param);
+    return res;
+
+  }
+
 }

+ 1 - 1
mp-service/src/main/java/com/qs/mp/user/domain/vo/TicketOrderSettleVO.java

@@ -58,6 +58,6 @@ public class TicketOrderSettleVO {
   /**
    * 使用优惠券列表
    */
-  List<Coupon> couponList;
+  List<UserCouponVO> couponList = new ArrayList<>();
 
 }

+ 76 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserCouponVO.java

@@ -0,0 +1,76 @@
+package com.qs.mp.user.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.qs.mp.common.enums.CouponDiscountTypeEnum;
+import com.qs.mp.common.enums.CouponDistributeTypeEnum;
+import com.qs.mp.common.enums.CouponStatusEnum;
+import com.qs.mp.common.enums.CouponTypeEnum;
+import com.qs.mp.common.enums.CouponUseAreaEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.user.domain.UserCoupon;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * @describe 用户的优惠券
+ * @auther zhongcp
+ * @create 2022-03-07 20:45:43
+ */
+@Data
+public class UserCouponVO extends UserCoupon {
+  /**
+   * 标题
+   */
+  private String title;
+
+  /**
+   * 类型;1用户盲票购买优惠券、2用户门店消费优惠券、3经销商盲票采购优惠券
+   */
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponTypeEnum type;
+
+  /**
+   * 图片
+   */
+  private String picUrl;
+
+  /**
+   * 使用说明
+   */
+  private String description;
+
+  /**
+   * 优惠类型;1代金券、2折扣券、3兑换券
+   */
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponDiscountTypeEnum discountType;
+
+  /**
+   * 优惠金额(比例)
+   */
+  private Integer discount;
+
+  /**
+   * 最低消费金额
+   */
+  private Integer minOrderAmt;
+
+  /**
+   * 使用范围;0通用 1生成券时指定范围 2发放时动态指定范围
+   */
+  @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+  private CouponUseAreaEnum useArea;
+
+  /**
+   * 叠加使用;0不允许 1允许
+   */
+  private Integer compositeUse;
+
+
+}

+ 8 - 0
mp-service/src/main/java/com/qs/mp/user/mapper/UserCouponMapper.java

@@ -1,7 +1,14 @@
 package com.qs.mp.user.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.user.domain.UserCoupon;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qs.mp.user.domain.vo.UserCouponVO;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * @auther quanshu
@@ -10,4 +17,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface UserCouponMapper extends BaseMapper<UserCoupon> {
 
+  List<UserCouponVO> listUserCouponVO(@Param(Constants.WRAPPER) Wrapper<UserCoupon> queryWrapper);
 }

+ 8 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserCouponService.java

@@ -2,6 +2,8 @@ package com.qs.mp.user.service;
 
 import com.qs.mp.user.domain.UserCoupon;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qs.mp.user.domain.vo.UserCouponVO;
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +15,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IUserCouponService extends IService<UserCoupon> {
 
+  /**
+   * 查询用户当前可用于盲票购买的优惠券,按优惠大小排序
+   * @param userId
+   * @return
+   */
+  List<UserCouponVO> listTicketOrderCoupon(Long userId);
 }

+ 15 - 0
mp-service/src/main/java/com/qs/mp/user/service/impl/UserCouponServiceImpl.java

@@ -1,9 +1,15 @@
 package com.qs.mp.user.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.common.enums.CouponTypeEnum;
+import com.qs.mp.common.enums.UserCouponStatusEnum;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.user.domain.UserCoupon;
+import com.qs.mp.user.domain.vo.UserCouponVO;
 import com.qs.mp.user.mapper.UserCouponMapper;
 import com.qs.mp.user.service.IUserCouponService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.List;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +23,13 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements IUserCouponService {
 
+  @Override
+  public List<UserCouponVO> listTicketOrderCoupon(Long userId) {
+    List<UserCouponVO> userCouponVOList = getBaseMapper().listUserCouponVO(new QueryWrapper<UserCoupon>()
+        .eq("t1.user_id", userId).eq("t2.type", CouponTypeEnum.TICKET_ORDER)
+        .eq("t1.status", UserCouponStatusEnum.UNUSED)
+        .le("t1.valid_start", DateUtils.getToday()).ge("t1.valid_end", DateUtils.getToday())
+        .orderByDesc("t2.discount"));
+    return userCouponVOList;
+  }
 }

+ 3 - 2
mp-service/src/main/resources/mapper/admin/CouponMapper.xml

@@ -12,6 +12,7 @@
         <result column="discount_type" property="discountType" />
         <result column="discount" property="discount" />
         <result column="min_order_amt" property="minOrderAmt" />
+        <result column="channel_shared_rate" property="channelSharedRate" />
         <result column="status" property="status" />
         <result column="use_area" property="useArea" />
         <result column="distribute_type" property="distributeType" />
@@ -27,7 +28,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        coupon_id, title, type, pic_url, description, discount_type, discount, min_order_amt, status, use_area, distribute_type, composite_use, due_days, valid_start, valid_end, quantity, distribute_qty, created_time, updated_time
+        coupon_id, title, type, pic_url, description, discount_type, discount, min_order_amt, channel_shared_rate, status, use_area, distribute_type, composite_use, due_days, valid_start, valid_end, quantity, distribute_qty, created_time, updated_time
     </sql>
 
-</mapper>
+</mapper>

+ 8 - 1
mp-service/src/main/resources/mapper/user/UserCouponMapper.xml

@@ -22,4 +22,11 @@
         id, user_id, verify_code, coupon_id, valid_start, valid_end, order_id, verify_time, status, created_time, updated_time
     </sql>
 
-</mapper>
+    <select id="listUserCouponVO" resultType="com.qs.mp.user.domain.vo.UserCouponVO">
+        select t1.*, t2.coupon_id, t2.title, t2.type, t2.pic_url, t2.description, t2.discount_type, t2.discount, t2.min_order_amt, t2.use_area, t2.distribute_type, t2.composite_use
+        from mp_user_coupon t1
+        left join mp_coupon t2 on t1.coupon_id = t2.coupon_id
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>