浏览代码

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

# Conflicts:
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
#	cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml
liweifan 2 年之前
父节点
当前提交
75483b7f1e
共有 22 个文件被更改,包括 320 次插入58 次删除
  1. 2 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PianoRoomChangeRecordController.java
  2. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java
  3. 18 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java
  4. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomChangeRecord.java
  5. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java
  6. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  7. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java
  8. 7 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
  9. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  10. 0 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PianoRoomChangeRecordService.java
  11. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java
  12. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
  13. 111 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  14. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java
  15. 19 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  16. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomChangeRecordServiceImpl.java
  17. 51 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  18. 7 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml
  19. 7 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml
  20. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PianoRoomChangeRecordMapper.xml
  21. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  22. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml

+ 2 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PianoRoomChangeRecordController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -59,6 +60,7 @@ public class PianoRoomChangeRecordController extends BaseController {
 			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
 		pianoRoomChangeRecord.setCreateBy(user.getId());
+		pianoRoomChangeRecord.setSourceType(SourceTypeEnum.PLATFORM);
     	return status(pianoRoomChangeRecordService.add(pianoRoomChangeRecord));
 	}
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java

@@ -43,4 +43,14 @@ public interface ActivityPlanRewardDao extends BaseMapper<ActivityPlanReward>{
 
 	List<ActivityPlanReward> getDelRewardList(@Param("activityId")Long activityId,@Param("rewardIds")  List<Long> rewardIds);
 
+
+
+
+	/**
+	 * 减少库存
+	 *
+	 * @param activityId 活动id
+	 * @param rewardId   奖品id
+	 */
+	int reduceStock(@Param("activityId") Long activityId, @Param("rewardId") Long rewardId);
 }

+ 18 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java

@@ -10,12 +10,13 @@ import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 
 
-public interface ActivityRewardDao extends BaseMapper<ActivityReward>{
+public interface ActivityRewardDao extends BaseMapper<ActivityReward> {
 	/**
 	 * 查询详情
-     * @author liweifan
-     * @date 2022-08-04 10:19:49
-     * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
+	 *
+	 * @author liweifan
+	 * @date 2022-08-04 10:19:49
+	 * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
 	 */
 	ActivityRewardVo detail(@Param("id") Long id);
 
@@ -23,16 +24,26 @@ public interface ActivityRewardDao extends BaseMapper<ActivityReward>{
 
 	/**
 	 * 分页查询
-     * @author liweifan
-     * @date 2022-08-04 10:19:49
-     * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
+	 *
+	 * @author liweifan
+	 * @date 2022-08-04 10:19:49
+	 * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
 	 */
 	List<ActivityRewardVo> selectPage(@Param("page") IPage page, @Param("param") ActivityRewardSearch activityReward);
 
 	/**
 	 * 列表查询
+	 *
 	 * @param activityReward
 	 * @return
 	 */
 	List<ActivityRewardVo> selectAll(@Param("param") ActivityRewardSearch activityReward);
+
+	/**
+	 * 活动奖品
+	 *
+	 * @param activityPlanId 活动id
+	 * @return
+	 */
+    List<ActivityReward> getActivityReward(@Param("activityPlanId") Long activityPlanId);
 }

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomChangeRecord.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -53,6 +54,29 @@ public class PianoRoomChangeRecord implements Serializable {
     @TableField(value = "create_by_")
     private Long createBy;
 
+    @ApiModelProperty("来源   ACTIVITY:活动  PLATFORM:平台")
+    @TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
+
+    @ApiModelProperty("活动id ")
+    @TableField(value = "biz_id_")
+    private String bizId;
+
+    public SourceTypeEnum getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(SourceTypeEnum sourceType) {
+        this.sourceType = sourceType;
+    }
+
+    public String getBizId() {
+        return bizId;
+    }
+
+    public void setBizId(String bizId) {
+        this.bizId = bizId;
+    }
 
     public Long getId() {
         return id;

+ 13 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -26,7 +27,7 @@ public class VipCardRecord implements Serializable {
     @ApiModelProperty("用户id ")
 	@TableField(value = "user_id_")
     private Long userId;
-    @ApiModelProperty("订单号 ")
+    @ApiModelProperty("订单号 活动id")
 	@TableField(value = "order_no_")
     private String orderNo;
     @ApiModelProperty("订单详情号 ")
@@ -40,6 +41,9 @@ public class VipCardRecord implements Serializable {
     @ApiModelProperty("用户类型 学生:STUDENT 老师 :TEACHER")
     private ClientEnum clientType;
 
+    @ApiModelProperty("来源类型 : ACTIVITY :活动 ,ORDER:订单")
+    @TableField(value = "source_type_")
+    private SourceTypeEnum sourceType;
 
     @ApiModelProperty("会员卡开始时间 ")
 	@TableField(value = "start_time_")
@@ -69,6 +73,14 @@ public class VipCardRecord implements Serializable {
     @TableField(value = "msg_status_")
     private Integer msgStatus;
 
+    public SourceTypeEnum getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(SourceTypeEnum sourceType) {
+        this.sourceType = sourceType;
+    }
+
     public ClientEnum getClientType() {
         return clientType;
     }

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -97,11 +97,12 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     VIDEO_COURSE_OUT_SALE_REASON("老师视频课下架通知"),
     ACTIVITY_JOIN_MESSAGE("活动参与通知"),
 
-    PIANO_ROOM_TIMES_ADD("后台增加琴房时长通知"),
-    PIANO_ROOM_TIMES_SUB("后台扣除琴房时长通知"),
+    PIANO_ROOM_TIMES_ADD("增加琴房时长通知"),
+    PIANO_ROOM_TIMES_SUB("扣除琴房时长通知"),
 
     PIANO_ROOM_ADJUST("琴房课调整"),
     PRACTICE_ADJUST("陪练课调整"),
+    ACTIVITY_WIN("获奖消息"),
 
     ;
 

+ 6 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java

@@ -12,7 +12,12 @@ import com.yonge.toolset.base.enums.BaseEnum;
 public enum SourceTypeEnum implements BaseEnum<String, AuditStatusEnum> {
 
     TEACHER("TEACHER"),
-    PLATFORM("PLATFORM");
+    PLATFORM("PLATFORM"),
+    ACTIVITY("ACTIVITY"),
+    ORDER("ORDER"),
+
+
+    ;
 
     @EnumValue
     private String code;

+ 7 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java

@@ -63,4 +63,11 @@ public interface ActivityPlanRewardService extends IService<ActivityPlanReward>
      * @return
      */
     Boolean recoveryReward(ActivityPlanReward reward);
+	/**
+	 * 减少库存
+	 *  @param activityId 活动id
+	 * @param rewardId   奖品id
+	 * @return
+	 */
+    int reduceStock(Long activityId, Long rewardId);
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.MemberPriceSettingsVo;
 import com.yonge.cooleshow.biz.dal.dto.search.MemberPriceSettingsSearch;
 import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
@@ -56,6 +58,17 @@ public interface MemberPriceSettingsService extends IService<MemberPriceSettings
     void orderSuccess(UserOrderDetailVo orderDetailVo);
 
     /**
+     * 活动构建vip card record 对象
+     *
+     * @param userId 用户id
+     * @param client 客户端类型
+     * @param activityReward 活动奖品
+     * @param activityId 活动id
+     * @return
+     */
+    void activityReward(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId);
+
+    /**
      * 老师分享VIP 分润
      *
      * @param sysUser 推荐人信息

+ 0 - 9
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PianoRoomChangeRecordService.java

@@ -29,13 +29,4 @@ public interface PianoRoomChangeRecordService extends IService<PianoRoomChangeRe
     IPage<PianoRoomChangeRecordVo> selectPage(IPage<PianoRoomChangeRecordVo> page, PianoRoomChangeRecordSearch query);
 
 	boolean add(PianoRoomChangeRecord pianoRoomChangeRecord);
-
-	/**
-	 * 增/减老师琴房课时长
-	 *
-	 * @param userId 老师id
-	 * @param times 时长
-	 * @param inOrOut 增/减
-	 */
-	void setPianoRoomTime(Long userId, Integer times, InOrOutEnum inOrOut);
 }

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
@@ -42,6 +44,17 @@ public interface VipCardRecordService extends IService<VipCardRecord> {
     VipCardRecord buildVipCardRecordByOrderDetail(UserOrderDetailVo orderDetailVo);
 
     /**
+     * 活动构建vip card record 对象
+     *
+     * @param userId 用户id
+     * @param client 客户端类型
+     * @param activityReward 活动奖品
+     * @param activityId 活动id
+     * @return
+     */
+    VipCardRecord buildVipCardRecordByOrderDetail(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId);
+
+    /**
      * 分页查询
      *
      * @author liweifan

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

@@ -170,4 +170,9 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
         return false;
     }
 
+    @Override
+    public int reduceStock(Long activityId, Long rewardId) {
+        return baseMapper.reduceStock(activityId,rewardId);
+    }
+
 }

+ 111 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanDao;
 import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
@@ -10,28 +11,37 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
 import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
 import com.yonge.cooleshow.biz.dal.entity.UserOrder;
+import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
+import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.RewardTypeEnum;
 import com.yonge.cooleshow.common.enums.UnitEnum;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.util.DistributedLock;
+import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
+import org.redisson.RedissonMultiLock;
+import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.dao.ActivityRewardDao;
-import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -44,6 +54,23 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private ActivityPlanService activityPlanService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private SysMessageService sysMessageService;
+    @Autowired
+    private PianoRoomChangeRecordService pianoRoomChangeRecordService;
+
+
+    @Autowired
+    private ActivityPlanRewardService activityPlanRewardService;
+
+    @Autowired
+    private MemberPriceSettingsService memberPriceSettingsService;
+
     @Override
     public ActivityRewardVo detail(Long id) {
         return baseMapper.detail(id);
@@ -88,10 +115,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
     @Override
     public List<ActivityReward> getActivityReward(Long activityPlanId) {
-        return this.lambdaQuery()
-                .eq(ActivityReward::getActivityId, activityPlanId)
-                .list();
-
+        return baseMapper.getActivityReward(activityPlanId);
     }
 
     @Override
@@ -130,4 +154,84 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     public IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockSearch> page, ActivityRewardChangeStockSearch query) {
         return null;
     }
+
+
+    private void sendReward(Long userId,Long activityId) {
+        ActivityPlan activityPlan = activityPlanService.getById(activityId);
+        if (activityPlan == null) {
+            log.warn("活动不存在");
+            return;
+        }
+
+        List<ActivityReward> activityRewardList = getActivityReward(activityId);
+        StringBuilder activityRewardName = new StringBuilder();
+
+
+        // 级联锁同时处理奖品库存
+        List<RLock>  lockList = new ArrayList<>();
+        for (ActivityReward activityReward : activityRewardList) {
+            lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(activityReward.getId())));
+        }
+
+        RedissonMultiLock lock = new RedissonMultiLock(lockList.toArray(new RLock[lockList.size()]));
+
+        try {
+            lock.lock();
+            for (ActivityReward activityReward : activityRewardList) {
+                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getId());
+                if (update == 0) {
+                    continue;
+                }
+                if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
+                    PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
+                    pianoRoomChangeRecord.setUserId(userId);
+                    pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
+                    pianoRoomChangeRecord.setTimes(activityReward.getNum());
+                    pianoRoomChangeRecord.setBizId(activityId.toString());
+                    pianoRoomChangeRecord.setCreateTime(new Date());
+                    pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
+                    pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
+                } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
+                    memberPriceSettingsService.activityReward(userId,activityPlan.getActivityClient(),activityReward,activityId);
+                }
+
+                activityRewardName.append(activityReward.getRewardName());
+            }
+            // 发送活动获奖推送
+            if (!StringUtil.isEmpty(activityRewardName)) {
+                sendActivityMessage(userId, activityPlan.getActivityName(), activityRewardName.toString(), activityPlan.getActivityClient());
+            }
+        } finally {
+            if (lock.getHoldCount() >0)
+                lock.unlock();
+        }
+
+    }
+
+    /**
+     * 获奖人员发送
+     *
+     * @param userId  用户id
+     * @param activityName 活动名
+     * @param activityRewardName 活动奖品名
+     */
+    private void sendActivityMessage(Long userId, String activityName, String activityRewardName,ClientEnum clientType) {
+        SysUser user = sysUserFeignService.queryUserById(userId);
+        if (user == null) {
+            log.warn("用户未找到");
+            return;
+        }
+
+        try {
+            Map<Long, String> receivers = new HashMap<>();
+            receivers.put(userId, user.getPhone());
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_ADJUST, receivers, null,
+                                               0, null,clientType.getCode(), user.getUsername(), "陪练课", activityName, activityRewardName);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获奖消息发送失败,{}",e.getMessage());
+        }
+
+    }
 }

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

@@ -74,7 +74,7 @@ public class HomeServiceImpl implements HomeService {
         Integer entryNum = 0;
         Integer liveNum = 0;
         Integer musicianNum = 0;
-        Integer tagNum  = 0 ;
+        Integer tagNum  = tagList.stream().collect(Collectors.groupingBy(TagTotalTeacher::getUserId)).size();
         Integer styleTagNum = 0;
         Integer videoTagNum = 0;
         Integer liveTagNum = 0;
@@ -117,7 +117,6 @@ public class HomeServiceImpl implements HomeService {
             entryNum += totalTeacher.getEntryNum();
             liveNum += totalTeacher.getLiveNum();
             musicianNum += totalTeacher.getMusicianNum();
-            tagNum += totalTeacher.getTagNum();
             styleTagNum += totalTeacher.getStyleTagNum();
             videoTagNum += totalTeacher.getVideoTagNum();
             liveTagNum += totalTeacher.getLiveTagNum();

+ 19 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java

@@ -7,9 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
-import com.yonge.cooleshow.biz.dal.entity.PlatformCashAccountRecord;
 import com.yonge.cooleshow.biz.dal.entity.VipCardRecord;
-import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
 
 import com.yonge.cooleshow.biz.dal.vo.ShareProfitVo;
@@ -21,8 +19,8 @@ import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.string.MessageFormatter;
-import com.yonge.cooleshow.common.enums.PostStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.springframework.beans.BeanUtils;
@@ -93,10 +91,26 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(orderDetailVo);
 
-        UserVipInfoVo userVipInfoVo = getVipInfo(orderDetailVo.getOrderClient(),orderDetailVo.getUserId());
+        UserVipInfoVo userVipInfoVo = getUserVipInfoVo(vipCardRecord);
+        //会员购买消息推送
+        authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN),orderDetailVo.getOrderClient());
+    }
+
+
+    @Override
+    public void activityReward(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId) {
+
+        VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(userId,client,activityReward,activityId);
+
+        getUserVipInfoVo(vipCardRecord);
+    }
+
+    private UserVipInfoVo getUserVipInfoVo(VipCardRecord vipCardRecord) {
+        UserVipInfoVo userVipInfoVo = getVipInfo(vipCardRecord.getClientType(), vipCardRecord.getUserId());
 
         if (userVipInfoVo == null) {
             log.error("未找到用户信息");
+            throw new BizException("未找到用户信息");
         }
 
         if (null == userVipInfoVo.getMembershipEndTime() || userVipInfoVo.getMembershipEndTime().before(new Date())) {
@@ -113,8 +127,7 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
 
         //会员购买记录入库
         vipCardRecordService.save(vipCardRecord);
-        //会员购买消息推送
-        authSend(userVipInfoVo.getUserId(), userVipInfoVo.getPhone(), DateUtil.format(vipCardRecord.getEndTime(), DateUtil.DEFAULT_PATTERN),orderDetailVo.getOrderClient());
+        return userVipInfoVo;
     }
 
     private void updateUser(UserVipInfoVo userVipInfoVo) {

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomChangeRecordServiceImpl.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.entity.PianoRoomTime;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.PianoRoomTimeService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
@@ -74,8 +75,7 @@ public class PianoRoomChangeRecordServiceImpl extends ServiceImpl<PianoRoomChang
      * @param times 时长
      * @param inOrOut 增/减
      */
-    @Override
-    public void setPianoRoomTime(Long userId, Integer times, InOrOutEnum inOrOut) {
+    private void setPianoRoomTime(Long userId, Integer times, InOrOutEnum inOrOut) {
         DistributedLock.of(redissonClient)
                        .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(userId)
                                , (o) -> {

+ 51 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java

@@ -3,10 +3,12 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.MemberPriceSettingsDao;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.entity.MemberPriceSettings;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.PeriodEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
@@ -76,17 +78,50 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         if (null == detail) {
             return null;
         }
+        // 按时间区分 个数
+        Integer timeNum = 0;
+        String periodType  = null;
 
+        if (PeriodEnum.DAY.equals(detail.getPeriod())) {
+            timeNum = 1;
+            periodType = PeriodEnum.DAY.getCode();
+        } else if (PeriodEnum.MONTH.equals(detail.getPeriod())) {
+            timeNum = 1;
+            periodType = PeriodEnum.MONTH.getCode();
+        } else if (PeriodEnum.QUARTERLY.equals(detail.getPeriod())) {
+            timeNum = 3;
+            periodType = PeriodEnum.MONTH.getCode();
+        } else if (PeriodEnum.YEAR_HALF.equals(detail.getPeriod())) {
+            timeNum = 6;
+            periodType = PeriodEnum.MONTH.getCode();
+        } else if (PeriodEnum.YEAR.equals(detail.getPeriod())) {
+            timeNum = 1;
+            periodType = PeriodEnum.YEAR.getCode();
+        }
+
+        return getVipCardRecord(orderDetailVo.getUserId(),orderDetailVo.getOrderClient(),orderDetailVo.getOrderNo(),
+                                orderDetailVo.getSubOrderNo(),periodType,detail.getId(),timeNum,SourceTypeEnum.ORDER);
+    }
+
+    @Override
+    public  VipCardRecord buildVipCardRecordByOrderDetail(Long userId,ClientEnum client, ActivityReward activityReward,Long activityId) {
+
+        return getVipCardRecord(userId,client,activityId.toString(),null,activityReward.getUnit().toString(),
+                                null,activityReward.getNum(),SourceTypeEnum.ACTIVITY);
+    }
+
+    private VipCardRecord getVipCardRecord(Long userId,ClientEnum client,String orderNo,String subOrderNo,
+                               String periodType,Long memberPriceSettingsId,Integer timeNum,SourceTypeEnum sourceType) {
         //修改用户会员时长
         Date membershipEndTime = null;
-        if (orderDetailVo.getOrderClient().equals(ClientEnum.STUDENT)) {
-            StudentVo studentVo = studentService.detail(orderDetailVo.getUserId());
+        if (client.equals(ClientEnum.STUDENT)) {
+            StudentVo studentVo = studentService.detail(userId);
             if (null == studentVo) {
                 return null;
             }
             membershipEndTime = studentVo.getMembershipEndTime();
-        } else if (orderDetailVo.getOrderClient().equals(ClientEnum.TEACHER)){
-            TeacherVo teacherVo = teacherService.detail(orderDetailVo.getUserId());
+        } else if (client.equals(ClientEnum.TEACHER)){
+            TeacherVo teacherVo = teacherService.detail(userId);
             if (null == teacherVo) {
                 return null;
             }
@@ -96,12 +131,13 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         }
 
         VipCardRecord vipCardRecord = new VipCardRecord();
-        vipCardRecord.setUserId(orderDetailVo.getUserId());
-        vipCardRecord.setOrderNo(orderDetailVo.getOrderNo());
-        vipCardRecord.setSubOrderNo(orderDetailVo.getSubOrderNo());
-        vipCardRecord.setVipCardId(detail.getId());
+        vipCardRecord.setUserId(userId);
+        vipCardRecord.setOrderNo(orderNo);
+        vipCardRecord.setSubOrderNo(subOrderNo);
+        vipCardRecord.setVipCardId(memberPriceSettingsId);
         vipCardRecord.setMsgStatus(0);
-        vipCardRecord.setClientType(orderDetailVo.getOrderClient());
+        vipCardRecord.setSourceType(sourceType);
+        vipCardRecord.setClientType(client);
 
         if (null == membershipEndTime || membershipEndTime.before(new Date())) {
             //没有会员、会员已过期 会员卡生效时间为当前时间
@@ -112,16 +148,12 @@ public class VipCardRecordServiceImpl extends ServiceImpl<VipCardRecordDao, VipC
         Calendar cal = Calendar.getInstance();
         cal.setTime(vipCardRecord.getStartTime());
 
-        if (PeriodEnum.DAY.equals(detail.getPeriod())) {
-            cal.add(Calendar.DAY_OF_MONTH, 1);
-        } else if (PeriodEnum.MONTH.equals(detail.getPeriod())) {
-            cal.add(Calendar.MONTH, 1);
-        } else if (PeriodEnum.QUARTERLY.equals(detail.getPeriod())) {
-            cal.add(Calendar.MONTH, 3);
-        } else if (PeriodEnum.YEAR_HALF.equals(detail.getPeriod())) {
-            cal.add(Calendar.MONTH, 6);
-        } else if (PeriodEnum.YEAR.equals(detail.getPeriod())) {
-            cal.add(Calendar.YEAR, 1);
+        if (PeriodEnum.DAY.getCode().equals(periodType)) {
+            cal.add(Calendar.DAY_OF_MONTH, timeNum);
+        } else if (PeriodEnum.MONTH.getCode().equals(periodType)) {
+            cal.add(Calendar.MONTH, timeNum);
+        } else if (PeriodEnum.YEAR.getCode().equals(periodType)) {
+            cal.add(Calendar.YEAR, timeNum);
         }
         vipCardRecord.setEndTime(cal.getTime());
         return vipCardRecord;

+ 7 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml

@@ -32,7 +32,7 @@
         FROM activity_plan_reward t
         where t.activity_id_ = #{activityId} and t.reward_id_ = #{rewardId}
     </select>
-    
+
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo">
 		SELECT         
         	<include refid="baseColumns" />
@@ -80,4 +80,10 @@
         </if>
     </select>
 
+
+	<update id="reduceStock">
+
+        update activity_plan_reward set reward_num_ = reward_num_ - 1 where #{activityId} = activity_id_ and #{rewardId} = reward_id_ and reward_num_ > 0
+
+    </update>
 </mapper>

+ 7 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml

@@ -78,4 +78,11 @@
     <select id="selectAll" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo">
         <include refid="selectSql"/>
     </select>
+
+    <select id="getActivityReward" resultMap="BaseResultMap">
+        select ar.*
+        from activity_plan_reward apr
+        left join activity_reward ar on apr.reward_id_ = ar.id_
+        where apr.activity_id_ = #{activityPlanId}
+    </select>
 </mapper>

+ 4 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/PianoRoomChangeRecordMapper.xml

@@ -9,6 +9,8 @@
         <result column="reason_" property="reason" />
         <result column="create_time_" property="createTime" />
         <result column="create_by_" property="createBy" />
+        <result column="source_type_" property="sourceType" />
+        <result column="biz_id_" property="bizId" />
     </resultMap>
 
     <!-- 表字段 -->
@@ -20,6 +22,8 @@
         , t.reason_ as reason
         , t.create_time_ as createTime
         , t.create_by_ as createBy
+        , t.source_type_ as sourceType
+        , t.biz_id_ as bizId
     </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.PianoRoomChangeRecordVo">

+ 2 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -237,7 +237,8 @@
                 (st.first_video_time_ is null and od.good_type_ = 'VIDEO') or
                 (st.first_live_time_ is null and od.good_type_ = 'LIVE') or
                 (st.first_activity_time_ is null and od.good_type_ = 'ACTI_REGIST') or
-                (st.first_music_time_ is null and od.good_type_ = 'MUSIC')
+                (st.first_music_time_ is null and od.good_type_ = 'MUSIC')  or
+                (st.first_pay_time_ is null and t.actual_price_ &gt; 0)
             )
         )
         <if test="param.startTime !=null">

+ 2 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml

@@ -12,6 +12,7 @@
 	        <result column="update_time_" property="updateTime" />
 	        <result column="end_time_" property="endTime" />
             <result column="msg_status_" property="msgStatus" />
+            <result column="source_type_" property="sourceType" />
 		</resultMap>
 
     <!-- 表字段 -->
@@ -27,6 +28,7 @@
         , t.end_time_ as endTime
         , t.msg_status_ as msgStatus
         ,t.client_type_ as clientType
+        ,t.source_type_ as sourceType
         </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.VipCardRecordVo">