소스 검색

用户分享

chunping 3 년 전
부모
커밋
21983a6855

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

@@ -432,11 +432,7 @@ public class UserController extends BaseApiController {
 
   public static void main(String[] args) {
     UserController userController = new UserController();
-    BASE64Encoder encoder = new BASE64Encoder();
-    String sessionKey = encoder.encode("f7a104e09d6c2e55445be2a45c4ab551".getBytes(
-        StandardCharsets.UTF_8));
-    System.out.println(sessionKey);
-    System.out.println(userController.weixinDecrypt("1U2iT7fucPip+hYDO+fcksOJCyFMIzxe5qXKGPbLZVfz2kwlKkbRDbfjECRHtjg0yFiTXpHuvR9gBShL9Id7p8KO1w2Y2vhgj5idU/VYSOhF7IRyXEObDApMCs4JSWuS997hIl/JMX3N43IHC99Ak5aeTuk4UHtvHeJsTYfvNKrp7c4fDt0n9yX9MJijsoOjFQ/TFh0jJuWKpzS2QwhdGg==", sessionKey, "C9Kc2ibw/cy7U0Vv6vneOg=="));
+    System.out.println(userController.weixinDecrypt("qvNE+SHdiP2GTbmNaqahrhhLw7EZetcMhUMV9yPXHxBbWOMcZ5gFxOGliXC9uojyC0NDUXCUi1xvFVDKMYREQ7rLXXrZIkB1jEleJNuUb9kO3LCDRucvbGAbVwm2EsTNsd5VbqI3fKdu0IOxmmSAWCLZNGXZBlki4ke62lI+ASg6dPohQmmCux8jwD2Js3ZnDQN2mb0JPRT68Qj716gYvA==", "QJ/WdeFANTIfIErOCJ2jNg==", "60YJmIckq4kaXp88wAGGHA=="));
   }
 
 }

+ 48 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserShareController.java

@@ -0,0 +1,48 @@
+package com.qs.mp.web.controller.api.user;
+
+import com.alibaba.fastjson.JSONObject;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.domain.AjaxResult.Type;
+import com.qs.mp.framework.service.IWxUrlLinkService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @auther zhongcp
+ * @create 2022-02-28 16:17:48
+ * @describe 用户分享前端控制器
+ */
+@Api("用户分享调用API")
+@RestController
+@RequestMapping("/api/v1/mp/user/share")
+@Component
+public class UserShareController extends BaseApiController {
+
+	@Autowired
+	private IWxUrlLinkService wxUrlLinkService;
+
+	@Value("${wx-user.appId}")
+	private String userAppId;
+
+	/**
+	 * 生成盲票详情小程序码
+	 *
+	 * @return
+	 */
+	@PostMapping("/code/generate")
+	public AjaxResult generateInviteCode(@RequestBody  JSONObject jsonObject) {
+		String boxId = jsonObject.getString("boxId"); // 票组ID
+		String type = jsonObject.getString("type"); // 分享类型,channel/user
+		Long userId = SecurityUtils.getUserId();
+		String rst = wxUrlLinkService.generateCode("pages/lucky/index", "boxId=" + boxId + "&suid=" + userId + "&type=" + type, userAppId);
+		return new AjaxResult(Type.SUCCESS, "", rst);
+	}
+}

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

@@ -26,6 +26,7 @@ import com.qs.mp.user.domain.UserTicketOrder;
 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.domain.vo.UserShareVO;
 import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.utils.SecurityUtils;
@@ -151,13 +152,13 @@ public class UserTicketOrderController extends BaseApiController {
    */
   @PostMapping("/order/submit")
   @ApiOperation(value = "提交订单" , notes = "在订单确认页面提交")
-  public AjaxResult submit(@RequestBody UserTicketOrder order) {
+  public AjaxResult submit(@RequestBody UserShareVO userShareVO) {
     Long userId = SecurityUtils.getLoginUser().getUserId();
     TicketOrderSettleVO orderSettleVO = redisCache.getCacheObject(RedisKey.build(RedisKey.USER_TICKET_ORDER_KEY, userId));
     if (null == orderSettleVO) {
       return AjaxResult.error("订单已过期,请重新下单");
     }
-    String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO);
+    String orderId = userTicketOrderService.submitOrder(userId, orderSettleVO, userShareVO);
     JSONObject jsonObject = new JSONObject();
     jsonObject.put("orderId", orderId);
     if (orderSettleVO.getPayAmt() > 0) {

+ 10 - 1
mp-service/src/main/java/com/qs/mp/framework/service/IWxUrlLinkService.java

@@ -25,11 +25,20 @@ public interface IWxUrlLinkService {
   String generateUrlSchema(String path, String query, String appId);
 
   /**
-   * 生成小程序码,返回的是base64字符串
+   * 生成小程序码(每个小程序限制10w个),返回图片名
    * @param path
    * @param scene
    * @param appId
    * @return
    */
   String generateCode(String path, String scene, String appId);
+
+  /**
+   * 生成小程序码(不受限制),返回图片名
+   * @param path
+   * @param scene
+   * @param appId
+   * @return
+   */
+  String generateUnlimitCode(String path, String scene, String appId);
 }

+ 31 - 1
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxUrlLinkServiceImpl.java

@@ -106,7 +106,7 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     InputStream in = HttpUtils.sendImagePost(
         "https://api.weixin.qq.com/wxa/getwxacode?access_token=" + accessToken,
         JSON.toJSONString(param));
-    LogUtil.info(logger, "小程序链接获取,path:{0},scene:{1}",
+    LogUtil.info(logger, "小程序获取,path:{0},scene:{1}",
         new Object[]{path, scene});
 //    JSONObject jsonObject = JSON.parseObject(res);
     if (null == in) {
@@ -124,4 +124,34 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     }
     return uuid;
   }
+
+  @Override
+  public String generateUnlimitCode(String path, String scene, String appId) {
+    Map<String, Object> param = new HashMap<String, Object>();
+    param.put("page", path); // 页面路径
+    param.put("scene", scene); // 参数
+//    param.put("check_path", true);// 为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在
+//    param.put("env_version", "release");
+    // 获取access_token
+    String accessToken = appTokenService.getAccessToken(appId);
+    InputStream in = HttpUtils.sendImagePost(
+        "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken,
+        JSON.toJSONString(param));
+    LogUtil.info(logger, "小程序码生成,path:{0},scene:{1}",
+        new Object[]{path, scene});
+//    JSONObject jsonObject = JSON.parseObject(res);
+    if (null == in) {
+      LogUtil.error(logger, "小程序码生成错误");
+      return null;
+    }
+    // 上传图片
+    String fileName = "s/" + UUIDUtils.newId();
+    try {
+      QcloudFileUtils.putStream(in, fileName, publicBucketName, ContentType.IMAGE_JPEG.getMimeType());
+    } catch (Exception e) {
+      LogUtil.error(logger, e, "小程序码获取错误");
+      return null;
+    }
+    return fileName;
+  }
 }

+ 1 - 1
mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java

@@ -55,7 +55,7 @@ public class PulsarConsumerImpl implements PulsarConsumer {
       LogUtil.error(logger, "收到盲票支付成功消息,订单结佣状态不是未结佣,忽略消息。orderId=" + orderId);
       return;
     }
-    // 先更新状态,防并发。如果最后生成失败了,暂时人工重新触发
+    // 先更新状态,防并发。
     boolean rst = userTicketOrderService.update(new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus, CommStatusEnum.DOING)
         .eq(UserTicketOrder::getOrderId, orderId).eq(UserTicketOrder::getCommStatus, CommStatusEnum.NO));
     if (!rst) {

+ 6 - 0
mp-service/src/main/java/com/qs/mp/user/domain/UserTicketOrder.java

@@ -92,6 +92,12 @@ public class UserTicketOrder implements Serializable {
   @TableField("coupon_info")
   private String couponInfo;
 
+  /**
+   * 分享信息
+   */
+  @TableField("share_info")
+  private String shareInfo;
+
   /**
    * 订单状态;-1 已取消 0:待付款 1:已完成
    */

+ 16 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/UserShareVO.java

@@ -0,0 +1,16 @@
+package com.qs.mp.user.domain.vo;
+
+import lombok.Data;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/31
+ */
+@Data
+public class UserShareVO {
+  private Long suid; // 分享者uid
+  private String type; // 分享者类型
+
+  public static final String SHARE_TYPE_USER = "user"; // 用户分享
+  public static final String SHARE_TYPE_SITE = "site"; // 经销商分享
+}

+ 3 - 1
mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java

@@ -4,6 +4,7 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserTicketOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
+import com.qs.mp.user.domain.vo.UserShareVO;
 import java.util.List;
 
 /**
@@ -20,9 +21,10 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
    * 提交盲票购买订单
    * @param userId
    * @param orderSettleVO
+   * @param userShareVO
    * @return
    */
-  String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO);
+  String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO, UserShareVO userShareVO);
 
   /**
    * 批量取消一个票组(线上)的订单(恢复优惠券、票组销量)

+ 28 - 5
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -2,7 +2,6 @@ package com.qs.mp.user.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.Ticket;
@@ -40,6 +39,7 @@ import com.qs.mp.user.domain.UserTicketOrder;
 import com.qs.mp.user.domain.UserTicketOrderItem;
 import com.qs.mp.user.domain.vo.TicketOrderSettleVO;
 import com.qs.mp.user.domain.vo.UserCouponVO;
+import com.qs.mp.user.domain.vo.UserShareVO;
 import com.qs.mp.user.mapper.UserTicketOrderMapper;
 import com.qs.mp.user.service.IUserCouponService;
 import com.qs.mp.user.service.IUserTicketOrderItemService;
@@ -106,16 +106,16 @@ public class UserTicketOrderServiceImpl extends
 
   @Override
   @Transactional
-  public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+  public String submitOrder(Long userId, TicketOrderSettleVO orderSettleVO, UserShareVO userShareVO) {
     if (StringUtils.isBlank(orderSettleVO.getTicketId())) {
-      return createOnlineOrder(userId, orderSettleVO);
+      return createOnlineOrder(userId, orderSettleVO, userShareVO);
     }
 
     // 线下票不需锁库存,待付款成功后再更新票组销量
     return createOfflineOrder(userId, orderSettleVO);
   }
 
-  private String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO) {
+  private String createOnlineOrder(Long userId, TicketOrderSettleVO orderSettleVO, UserShareVO userShareVO) {
     // 线上票更新票组销量,防止超卖
     TicketBox ticketBox = ticketBoxService.getById(orderSettleVO.getBoxId());
     if (ticketBox.getStatus() == TicketBoxStatusEnum.PUT_OFF
@@ -160,7 +160,30 @@ public class UserTicketOrderServiceImpl extends
     ChannelUserRel channelUserRel = channelUserRelService.getOne(
         new LambdaQueryWrapper<ChannelUserRel>()
             .eq(ChannelUserRel::getUserId, userId));
-    userTicketOrder.setChannelId(null == channelUserRel ? null : channelUserRel.getChannelId());
+    if (null != channelUserRel) {
+      userTicketOrder.setChannelId(channelUserRel.getChannelId());
+    } else {
+      // 没被绑定,看有没有分享者
+      if (null != userShareVO.getSuid() && 0 != userShareVO.getSuid()) {
+        if (UserShareVO.SHARE_TYPE_USER.equals(userShareVO.getType())) {
+          ChannelUserRel channelShareUserRel = channelUserRelService.getOne(
+              new LambdaQueryWrapper<ChannelUserRel>()
+                  .eq(ChannelUserRel::getUserId, userShareVO.getSuid()));
+          if (null != channelShareUserRel) {
+            userTicketOrder.setChannelId(channelShareUserRel.getChannelId());
+            userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
+          }
+        } else if (UserShareVO.SHARE_TYPE_SITE.equals(userShareVO.getType())) {
+          Channel channel = channelService.getOne(
+              new LambdaQueryWrapper<Channel>()
+                  .eq(Channel::getUserId, userShareVO.getSuid()));
+          if (null != channel) {
+            userTicketOrder.setChannelId(channel.getChannelId());
+            userTicketOrder.setShareInfo(JSONObject.toJSONString(userShareVO));
+          }
+        }
+      }
+    }
     save(userTicketOrder);
 
     for (int i = 0; i < orderSettleVO.getOrderNum(); i++) {

+ 2 - 1
mp-service/src/main/resources/mapper/user/UserTicketOrderMapper.xml

@@ -15,6 +15,7 @@
         <result column="memo" property="memo" />
         <result column="resource" property="resource" />
         <result column="coupon_info" property="couponInfo" />
+        <result column="share_info" property="shareInfo" />
         <result column="status" property="status" />
         <result column="comm_status" property="commStatus" />
         <result column="channel_id" property="channelId" />
@@ -24,7 +25,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        order_id, user_id, title, box_id, order_amt, discount_amt, pay_amt, ticket_num, memo, resource, coupon_info, status, comm_status, channel_id, created_time, updated_time
+        order_id, user_id, title, box_id, order_amt, discount_amt, pay_amt, ticket_num, memo, resource, coupon_info, share_info, status, comm_status, channel_id, created_time, updated_time
     </sql>
 
 </mapper>