Browse Source

Merge branch 'dev' into 'mp-server-test'

Dev

See merge request quanshu/mp-server!684
jiang hao 2 years ago
parent
commit
3cd89d31ac
20 changed files with 337 additions and 66 deletions
  1. 1 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java
  2. 4 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java
  3. 2 7
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  4. 6 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java
  5. 1 1
      mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java
  6. 32 0
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelCommissionResourceEnum.java
  7. 84 0
      mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java
  8. 19 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCommission.java
  9. 39 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelCommParam.java
  10. 6 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java
  11. 7 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelUserRelService.java
  12. 24 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java
  13. 15 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelUserRelServiceImpl.java
  14. 4 0
      mp-service/src/main/java/com/qs/mp/framework/domain/AsyncTask.java
  15. 1 1
      mp-service/src/main/java/com/qs/mp/framework/redis/RedisLockKey.java
  16. 5 0
      mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java
  17. 37 0
      mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java
  18. 9 7
      mp-service/src/main/java/com/qs/mp/mq/impl/PulsarConsumerImpl.java
  19. 2 1
      mp-service/src/main/java/com/qs/mp/user/service/IUserTicketOrderService.java
  20. 39 43
      mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

+ 1 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -200,8 +200,7 @@ public class ChannelOrderMgrController extends BaseApiController {
 		if(null != shipParam && null != shipParam.getPkgIds()
 				&& shipParam.getPkgIds().size() > 0) {
 			ChannelOrder channelOrder = new ChannelOrder();
-
-
+			channelOrder.setType(order.getType());
 
 			if (DeliverTypeEnum.NO_DELIVER.getValue().equals(deliveryType)) {
 				// 无需物流,设置发货时间为当前时间

+ 4 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/TicketBoxMgrController.java

@@ -24,6 +24,7 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
+import com.qs.mp.common.utils.AESUtil;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.RSAUtil;
 import com.qs.mp.system.domain.SysUser;
@@ -399,13 +400,13 @@ public class TicketBoxMgrController extends BaseApiController {
 						&& StringUtils.isNotBlank(ticket.getDrawNum())
 						&& StringUtils.isNotBlank(ticket.getCipherLuckyNum())) {
 					TicketExcel ticketExcel = new TicketExcel();
+					ticketExcel.setSerialNo(ticket.getSerialNo());
 					if (ticketBox.getIsEncrypt() == 1){
 						// 加密序列号
-						ticketExcel.setSerialNo(RSAUtil.encrypt(ticket.getSerialNo()));
+						ticketExcel.setSerialNo(AESUtil.encrypt(ticket.getSerialNo()));
 					}else {
-						ticketExcel.setSerialNo(ticket.getSerialNo());
+						ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
 					}
-					ticketExcel.setUrl(exportUrl + ticket.getSerialNo());
 					ticketExcel.setDrawNum(formatDraw(ticket.getDrawNum()));
 					if (!ServerEnvEnum.PROD.getCode().equals(env)) {
 						ticketExcel.setCipherLuckyNum(RSAUtil.decrypt(ticket.getCipherLuckyNum()));

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

@@ -381,13 +381,8 @@ public class ChannelOrderController extends BaseApiController {
     if (!channelId.equals(channelOrder.getChannelId())) {
       return AjaxResult.error("非法操作他人订单");
     }
-
-    // 更新用户提货订单状态为已完成,并且设置收货时间
-    ChannelOrder param = new ChannelOrder();
-    param.setOrderId(order.getOrderId());
-    param.setStatus(ChannelOrderStatusEnum.FINISHED);
-    param.setConfirmTime(new Date());
-    channelOrderService.updateById(param);
+    // 确认收货
+    channelOrderService.confirm(order);
 
     return AjaxResult.success();
   }

+ 6 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java

@@ -217,6 +217,12 @@ public class UserTicketController extends BaseApiController {
       return AjaxResult.error("参数异常,盲票不存在");
     }
 
+    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+    if (ticketBox.getIsEncrypt() == 1 && match) {
+      return AjaxResult.error("非法访问!");
+    }
+
+
     /*if (ticket.getStatus() == TicketStatusEnum.CASHED) {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
     }*/
@@ -226,7 +232,6 @@ public class UserTicketController extends BaseApiController {
       return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1023);
     }
 
-    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
 
     TicketVO ticketVO = new TicketVO();
     ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(ticket.getBoxId()));

+ 1 - 1
mp-common/src/main/java/com/qs/mp/common/enums/AsyncTaskTypeEnum.java

@@ -11,7 +11,7 @@ import io.swagger.annotations.ApiModel;
  */
 @ApiModel("异步任务类型枚举")
 public enum AsyncTaskTypeEnum implements IEnum<Integer> {
-    PRE_COMMISSION(1,"预付票分佣");
+    CHANNEL_CONFIRM_RECEIPT(1,"经销商确认收货任务");
 
     private Integer value;
     private String desc;

+ 32 - 0
mp-common/src/main/java/com/qs/mp/common/enums/ChannelCommissionResourceEnum.java

@@ -0,0 +1,32 @@
+package com.qs.mp.common.enums;
+
+import com.baomidou.mybatisplus.annotation.IEnum;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 渠道分佣订单来源枚举类
+ * @author Cup
+ * @date 2022/6/7
+ */
+@ApiModel("渠道分佣订单来源枚举类")
+public enum ChannelCommissionResourceEnum implements IEnum<Integer> {
+    USER(1, "用户"),
+    CHANNEL(2,"经销商");
+
+    private Integer value;
+    private String desc;
+
+    ChannelCommissionResourceEnum(Integer value, String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 84 - 0
mp-quartz/src/main/java/com/qs/mp/quartz/task/AsyncConsumeTask.java

@@ -0,0 +1,84 @@
+package com.qs.mp.quartz.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.qs.mp.common.core.redis.DistributedLocker;
+import com.qs.mp.common.enums.AsyncTaskTypeEnum;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.framework.domain.AsyncTask;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.framework.redis.RedisLockKey;
+import com.qs.mp.framework.service.IAsyncTaskService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 异步消息消费任务
+ * @author Cup
+ * @date 2022/6/7
+ */
+@Component("asyncConsumeTask")
+public class AsyncConsumeTask {
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+    @Autowired
+    private IAsyncTaskService asyncTaskService;
+
+    @Autowired
+    private DistributedLocker distributedLocker;
+
+    public void processingTask(){
+
+        List<AsyncTask> asyncTaskList = asyncTaskService.list(new LambdaQueryWrapper<AsyncTask>().eq(AsyncTask::getStatus, 0));
+        if (CollectionUtils.isEmpty(asyncTaskList)) {
+            return;
+        }
+
+        for (AsyncTask asyncTask : asyncTaskList) {
+            String lockKey = RedisLockKey.build(RedisLockKey.ASYNC_TASK_KEY, asyncTask.getId());
+            // 加锁,自动续期
+            if (!distributedLocker.tryLock(lockKey,0,-1, TimeUnit.SECONDS)) {
+                continue;
+            }
+            try {
+                this.execute(asyncTask);
+            } catch (Exception e) {
+                // 更新异步任务执行次数
+                asyncTaskService.update(new LambdaUpdateWrapper<AsyncTask>()
+                        .set(AsyncTask::getOperateNum, asyncTask.getOperateNum() + 1)
+                        .eq(AsyncTask::getId, asyncTask.getId()));
+                LogUtil.error(logger, e, "异步任务处理异常。任务id:{0}", asyncTask.getId());
+            } finally {
+                // 释放锁
+                distributedLocker.unlock(lockKey);
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void execute(AsyncTask asyncTask){
+        if (AsyncTaskTypeEnum.CHANNEL_CONFIRM_RECEIPT.getValue().equals(asyncTask.getType())) {
+            // 确认收货后相关任务处理
+            asyncTaskService.channelConfirmReceipt(asyncTask);
+        }
+
+        // 更新异步任务状态
+        boolean rtn = asyncTaskService.update(new LambdaUpdateWrapper<AsyncTask>()
+                .set(AsyncTask::getOperateNum, asyncTask.getOperateNum() + 1)
+                .set(AsyncTask::getStatus, 1)
+                .eq(AsyncTask::getId, asyncTask.getId()));
+
+        Assert.isFalse(rtn,"异步任务状态更新失败, id:{0}", asyncTask.getId());
+    }
+
+}

+ 19 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelCommission.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 /**
@@ -16,6 +19,7 @@ import lombok.Data;
  */
 @TableName("mp_channel_commission")
 @Data
+@ApiModel("渠道佣金记录实体类")
 public class ChannelCommission implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -23,66 +27,81 @@ public class ChannelCommission implements Serializable {
   /**
    * 主键
    */
+  @ApiModelProperty("主键")
   @TableId(value = "id" , type = IdType.AUTO)
   private Long id;
 
   /**
    * 渠道ID
    */
+  @ApiModelProperty("渠道id")
   @TableField("channel_id")
   private Long channelId;
 
   /**
    * 用户订单ID
    */
+  @ApiModelProperty("用户订单ID")
   @TableField("order_id")
   private String orderId;
 
   /**
    * 盲票组ID
    */
+  @ApiModelProperty("盲票组id")
   @TableField("box_id")
   private String boxId;
 
+  @ApiModelProperty("订单来源1用户,2经销商")
+  @TableField("resource")
+  private Integer resource;
+
   /**
    * 销售金额
    */
+  @ApiModelProperty("销售金额")
   @TableField("sale_amt")
   private Integer saleAmt;
 
   /**
    * 参与分佣的销售金额比例
    */
+  @ApiModelProperty("参与分佣的销售金额比例")
   @TableField("sale_comm_rate")
   private BigDecimal saleCommRate;
 
   /**
    * 参与分佣的销售金额
    */
+  @ApiModelProperty("参与分佣的销售金额")
   @TableField("sale_comm_amt")
   private Integer saleCommAmt;
 
   /**
    * 佣金比例
    */
+  @ApiModelProperty("佣金比例")
   @TableField("comm_rate")
   private BigDecimal commRate;
 
   /**
    * 佣金金额
    */
+  @ApiModelProperty("佣金金额")
   @TableField("comm_amt")
   private Integer commAmt;
 
   /**
    * 创建时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("created_time")
   private Date createdTime;
 
   /**
    * 更新时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("updated_time")
   private Date updatedTime;
 

+ 39 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelCommParam.java

@@ -0,0 +1,39 @@
+package com.qs.mp.channel.domain.param;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.common.enums.CommStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 渠道分佣入参类
+ * @author Cup
+ * @date 2022/6/7
+ */
+@ApiModel("渠道分佣入参类")
+@Data
+public class ChannelCommParam {
+
+    @ApiModelProperty("订单id")
+    private String orderId;
+
+    @ApiModelProperty("盲票组id")
+    private String boxId;
+
+    @ApiModelProperty("渠道id")
+    private Long channelId;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("实付金额")
+    private Integer payAmt;
+
+    @ApiModelProperty("结佣标识,1代表已结佣 0代表未结佣")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private CommStatusEnum commStatus;
+
+}

+ 6 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java

@@ -81,4 +81,10 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
 	 * @return
 	 */
     boolean cancelOrderByAdmin(ChannelOrderCancelParam param);
+
+	/**
+	 * 订单确认收货
+	 * @param order
+	 */
+    void confirm(ChannelOrder order);
 }

+ 7 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelUserRelService.java

@@ -26,4 +26,11 @@ public interface IChannelUserRelService extends IService<ChannelUserRel> {
 	 * @return
 	 */
 	int getChannelNewUserCnt(String channelNo, int days);
+
+	/**
+	 * 经销商绑定用户关系
+	 * @param userId
+	 * @param channelId
+	 */
+	void bindUser(Long userId,Long channelId);
 }

+ 24 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -14,6 +15,8 @@ import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.framework.domain.AsyncTask;
+import com.qs.mp.framework.service.IAsyncTaskService;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.user.domain.UserAddr;
@@ -86,6 +89,9 @@ public class ChannelOrderServiceImpl extends
   @Autowired
   private IPayOrderService payOrderService;
 
+  @Autowired
+  private IAsyncTaskService asyncTaskService;
+
   @Override
   @Transactional
   public String submitOrder(Long channelId, String memo, ChannelOrderSettleVO orderSettleVO) {
@@ -236,6 +242,24 @@ public class ChannelOrderServiceImpl extends
         return true;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void confirm(ChannelOrder order) {
+        // 更新用户提货订单状态为已完成,并且设置收货时间
+        ChannelOrder param = new ChannelOrder();
+        param.setOrderId(order.getOrderId());
+        param.setStatus(ChannelOrderStatusEnum.FINISHED);
+        param.setConfirmTime(new Date());
+        boolean rtn = channelOrderService.updateById(param);
+        Assert.isFalse(rtn,"更新提货订单状态失败,orderId:{0}", order.getOrderId());
+
+        // 提交异步任务
+        AsyncTask asyncTask = new AsyncTask();
+        asyncTask.setType(AsyncTaskTypeEnum.CHANNEL_CONFIRM_RECEIPT.getValue());
+        asyncTask.setBizId(order.getOrderId());
+        Assert.isFalse(asyncTaskService.save(asyncTask),"提交经销商提货订单确认收货任务失败,orderId:{0}", order.getOrderId());
+    }
+
     /**
      * 回滚盲票组销量和状态
      * @param orderItem

+ 15 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelUserRelServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qs.mp.channel.domain.ChannelUserRel;
 import com.qs.mp.channel.mapper.ChannelUserRelMapper;
 import com.qs.mp.channel.service.IChannelUserRelService;
@@ -26,4 +27,18 @@ public class ChannelUserRelServiceImpl extends ServiceImpl<ChannelUserRelMapper,
 	public int getChannelNewUserCnt(String channelNo, int days) {
 		return getBaseMapper().getChannelNewUserCnt(channelNo, days == 1?0:days);
 	}
+
+	@Override
+	public void bindUser(Long userId, Long channelId) {
+		// 线下票如果用户没被绑定,则保存经销商用户绑定关系
+		ChannelUserRel channelUserRel = this.getOne(
+				new LambdaQueryWrapper<ChannelUserRel>()
+						.eq(ChannelUserRel::getUserId, userId));
+		if (null == channelUserRel) {
+			channelUserRel = new ChannelUserRel();
+			channelUserRel.setChannelId(channelId);
+			channelUserRel.setUserId(userId);
+			this.save(channelUserRel);
+		}
+	}
 }

+ 4 - 0
mp-service/src/main/java/com/qs/mp/framework/domain/AsyncTask.java

@@ -48,6 +48,10 @@ public class AsyncTask implements Serializable {
     @TableField("biz_id")
     private String bizId;
 
+    @ApiModelProperty("任务状态-1已取消,0未完成,1已完成")
+    @TableField("status")
+    private Integer status;
+
     /**
      * 操作次数
      */

+ 1 - 1
mp-service/src/main/java/com/qs/mp/framework/redis/RedisLockKey.java

@@ -9,7 +9,7 @@ import com.qs.mp.common.utils.MessageHelper;
  *
  */
 public enum RedisLockKey {
-
+    ASYNC_TASK_KEY("async_task_key_{0}", "异步任务key"),
     MARKETING_REAL_NUM_LOCK("marketing_real_num_lock_{0}", "活动真实人数增加锁"),
     MARKETING_LOTTERY_KEY("marketing_lottery_key_{0}","免费抽奖活动开奖"),
     USER_TICKET_CASH_LOCK("user_ticket_cash_lock_{0}", "盲票兑奖锁");

+ 5 - 0
mp-service/src/main/java/com/qs/mp/framework/service/IAsyncTaskService.java

@@ -13,4 +13,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IAsyncTaskService extends IService<AsyncTask> {
 
+    /**
+     * 经销商确认收货后相关任务处理
+     * @param asyncTask
+     */
+    void channelConfirmReceipt(AsyncTask asyncTask);
 }

+ 37 - 0
mp-service/src/main/java/com/qs/mp/framework/service/impl/AsyncTaskServiceImpl.java

@@ -1,10 +1,22 @@
 package com.qs.mp.framework.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.enums.ChannelCommissionResourceEnum;
+import com.qs.mp.common.enums.ChannelOrderTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.framework.domain.AsyncTask;
 import com.qs.mp.framework.mapper.AsyncTaskMapper;
 import com.qs.mp.framework.service.IAsyncTaskService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.user.service.IUserTicketOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
 
 /**
  * <p>
@@ -17,4 +29,29 @@ import org.springframework.stereotype.Service;
 @Service
 public class AsyncTaskServiceImpl extends ServiceImpl<AsyncTaskMapper, AsyncTask> implements IAsyncTaskService {
 
+    @Autowired
+    private IChannelOrderService channelOrderService;
+
+    @Autowired
+    private IUserTicketOrderService userTicketService;;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void channelConfirmReceipt(AsyncTask asyncTask) {
+        // 获取供应商订单编号
+        String orderId = asyncTask.getBizId();
+
+        // 查询订单
+        ChannelOrder channelOrder = channelOrderService.getById(orderId);
+        if (Objects.isNull(channelOrder)) {
+            throw new ServiceException("经销商订单不存在,OrderId:" + orderId);
+        }
+
+        if (ChannelOrderTypeEnum.RETAIL.equals(channelOrder.getType())) {
+            return;
+        }
+
+        // 分佣
+        userTicketService.commToChannel(orderId, ChannelCommissionResourceEnum.CHANNEL.getValue());
+    }
 }

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

@@ -10,12 +10,8 @@ import com.qs.mp.admin.service.ITicketBoxSerialService;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
-import com.qs.mp.common.enums.CommStatusEnum;
-import com.qs.mp.common.enums.MqTopicType;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
-import com.qs.mp.common.enums.TicketTypeEnum;
-import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.pulsar.PulsarConsumer;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.user.domain.UserTicketOrder;
@@ -55,6 +51,9 @@ public class PulsarConsumerImpl implements PulsarConsumer {
   @Autowired
   private ITicketService ticketService;
 
+  @Autowired
+  private IChannelUserRelService channelUserRelService;
+
   @Override
   @Async("threadPoolTaskExecutor")
   public void wsConsumer(String topicType, String mqData) {
@@ -97,6 +96,9 @@ public class PulsarConsumerImpl implements PulsarConsumer {
           .eq(TicketPackage::getPkgId, ticketPackage.getPkgId()));
     }
 
+    // 用户关系绑定
+    channelUserRelService.bindUser(ticketOrder.getUserId(), ticketOrder.getChannelId());
+
     if (ticketOrder.getCommStatus() != CommStatusEnum.NO) {
       LogUtil.warn(logger, "收到盲票支付成功消息,订单结佣状态不是未结佣,忽略消息。orderId=" + orderId);
       return;
@@ -108,7 +110,7 @@ public class PulsarConsumerImpl implements PulsarConsumer {
       LogUtil.error(logger, "收到盲票支付成功消息,更新订单结佣状态为结佣中失败。orderId=" + orderId);
       return;
     }
-    userTicketOrderService.commToChannel(orderId);
+    userTicketOrderService.commToChannel(orderId, ChannelCommissionResourceEnum.USER.getValue());
   }
 
   private void processTicketGenerateMsg(String mqData) {

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

@@ -63,9 +63,10 @@ public interface IUserTicketOrderService extends IService<UserTicketOrder> {
   /**
    * 给渠道分润
    * @param orderId
+   * @param resource 订单来源1用户,2经销商
    * @return
    */
-  boolean commToChannel(String orderId);
+  boolean commToChannel(String orderId,Integer resource);
   
   
   /**

+ 39 - 43
mp-service/src/main/java/com/qs/mp/user/service/impl/UserTicketOrderServiceImpl.java

@@ -14,26 +14,11 @@ import com.qs.mp.admin.domain.vo.*;
 import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.admin.service.ITicketService;
-import com.qs.mp.channel.domain.Channel;
-import com.qs.mp.channel.domain.ChannelCommission;
-import com.qs.mp.channel.domain.ChannelMoneyLog;
-import com.qs.mp.channel.domain.ChannelOrderDetail;
-import com.qs.mp.channel.domain.ChannelUserRel;
-import com.qs.mp.channel.service.IChannelCommissionService;
-import com.qs.mp.channel.service.IChannelMoneyLogService;
-import com.qs.mp.channel.service.IChannelOrderDetailService;
-import com.qs.mp.channel.service.IChannelService;
-import com.qs.mp.channel.service.IChannelUserRelService;
+import com.qs.mp.channel.domain.*;
+import com.qs.mp.channel.domain.param.ChannelCommParam;
+import com.qs.mp.channel.service.*;
 import com.qs.mp.common.core.redis.RedisCache;
-import com.qs.mp.common.enums.ChannelMoneyEnum;
-import com.qs.mp.common.enums.CommStatusEnum;
-import com.qs.mp.common.enums.ErrorCodeEnum;
-import com.qs.mp.common.enums.TicketBoxStatusEnum;
-import com.qs.mp.common.enums.TicketPkgSaleStatusEnum;
-import com.qs.mp.common.enums.TicketStatusEnum;
-import com.qs.mp.common.enums.TicketTypeEnum;
-import com.qs.mp.common.enums.UserCouponStatusEnum;
-import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
+import com.qs.mp.common.enums.*;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
@@ -61,6 +46,7 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -110,6 +96,12 @@ public class UserTicketOrderServiceImpl extends
   @Autowired
   private ITicketPackageService ticketPackageService;
 
+  @Autowired
+  private IChannelOrderService channelOrderService;
+
+  @Autowired
+  private IChannelOrderItemService channelOrderItemService;
+
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
@@ -432,16 +424,30 @@ public class UserTicketOrderServiceImpl extends
 
   @Override
   @Transactional(rollbackFor = Exception.class)
-  public boolean commToChannel(String orderId) {
-    UserTicketOrder ticketOrder = getById(orderId);
-    Assert.isTrue(ticketOrder.getCommStatus() == CommStatusEnum.DOING,
-        "结佣处理,结佣状态异常,不是结佣中。orderId=" + orderId);
-
-    if (null != ticketOrder.getChannelId()) {
+  public boolean commToChannel(String orderId, Integer resource) {
+    ChannelCommParam channelCommParam = new ChannelCommParam();
+    if (ChannelCommissionResourceEnum.USER.getValue().equals(resource)) {
+      UserTicketOrder ticketOrder = getById(orderId);
+      BeanUtils.copyProperties(ticketOrder, channelCommParam);
+      Assert.isTrue(channelCommParam.getCommStatus() == CommStatusEnum.DOING,
+              "结佣处理,结佣状态异常,不是结佣中。orderId=" + orderId);
+    } else {
+      ChannelOrder channelOrder = channelOrderService.getById(orderId);
+      ChannelOrderItem channelOrderItem = channelOrderItemService.getOne(new LambdaQueryWrapper<ChannelOrderItem>()
+              .eq(ChannelOrderItem::getOrderId, orderId));
+      channelCommParam.setBoxId(channelOrderItem.getBoxId());
+      channelCommParam.setChannelId(channelOrder.getChannelId());
+      channelCommParam.setOrderId(channelOrder.getOrderId());
+      channelCommParam.setPayAmt(channelOrder.getPayAmt());
+    }
+    if (channelCommParam.getPayAmt() == 0) {
+      return true;
+    }
+    if (null != channelCommParam.getChannelId()) {
       // 线下购票,优先给当前票的经销商渠道分润
-      TicketBox ticketBox = ticketBoxService.getById(ticketOrder.getBoxId());
-      Channel channel = channelService.getById(ticketOrder.getChannelId());
-      ChannelCommission siteCommission = saveSiteCommAmt(ticketOrder, ticketBox, channel);
+      TicketBox ticketBox = ticketBoxService.getById(channelCommParam.getBoxId());
+      Channel channel = channelService.getById(channelCommParam.getChannelId());
+      ChannelCommission siteCommission = saveSiteCommAmt(channelCommParam, ticketBox, channel);
       // 经销商账户余额增加
       changeMoney(channel, siteCommission);
 
@@ -463,19 +469,9 @@ public class UserTicketOrderServiceImpl extends
         channelCommissionService.save(channelCommission);
         sumCommAmt += channelCommission.getCommAmt();
       }
-      // 线下票如果用户没被绑定,则保存经销商用户绑定关系
-      ChannelUserRel channelUserRel = channelUserRelService.getOne(
-          new LambdaQueryWrapper<ChannelUserRel>()
-              .eq(ChannelUserRel::getUserId, ticketOrder.getUserId()));
-      if (null == channelUserRel) {
-        channelUserRel = new ChannelUserRel();
-        channelUserRel.setChannelId(ticketOrder.getChannelId());
-        channelUserRel.setUserId(ticketOrder.getUserId());
-        channelUserRelService.save(channelUserRel);
-      }
     } else {
       LogUtil.info(logger, "渠道结佣时,订单对应的渠道不存在,无需结佣。orderId:{0}",
-          ticketOrder.getOrderId());
+          channelCommParam.getOrderId());
     }
     boolean rst = update(
         new LambdaUpdateWrapper<UserTicketOrder>().set(UserTicketOrder::getCommStatus,
@@ -496,13 +492,13 @@ public class UserTicketOrderServiceImpl extends
     channelMoneyLogService.changeMoney(moneyLog);
   }
 
-  private ChannelCommission saveSiteCommAmt(UserTicketOrder ticketOrder, TicketBox ticketBox,
+  private ChannelCommission saveSiteCommAmt(ChannelCommParam channelCommParam, TicketBox ticketBox,
       Channel channel) {
     ChannelCommission siteCommission = new ChannelCommission();
     siteCommission.setChannelId(channel.getChannelId());
-    siteCommission.setOrderId(ticketOrder.getOrderId());
-    siteCommission.setBoxId(ticketOrder.getBoxId());
-    siteCommission.setSaleAmt(ticketOrder.getPayAmt());
+    siteCommission.setOrderId(channelCommParam.getOrderId());
+    siteCommission.setBoxId(channelCommParam.getBoxId());
+    siteCommission.setSaleAmt(channelCommParam.getPayAmt());
     siteCommission.setSaleCommRate(ticketBox.getSaleCommRate());
     siteCommission.setSaleCommAmt(new BigDecimal(siteCommission.getSaleAmt()).multiply(
             siteCommission.getSaleCommRate()).divide(new BigDecimal(100), 0, RoundingMode.DOWN)