Parcourir la source

Merge branch 'dev_1_3_2_20220815'

liweifan il y a 3 ans
Parent
commit
21f4e1f419
33 fichiers modifiés avec 647 ajouts et 103 suppressions
  1. 0 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ConditionEnum.java
  2. 5 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityPlanController.java
  3. 12 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java
  4. 2 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PianoRoomChangeRecordController.java
  5. 20 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java
  6. 18 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java
  7. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityPlanSearch.java
  8. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityRewardChangeStockSearch.java
  9. 13 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityRewardChangeStock.java
  10. 24 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomChangeRecord.java
  11. 13 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/VipCardRecord.java
  12. 3 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  13. 6 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/SourceTypeEnum.java
  14. 42 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
  15. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java
  16. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MemberPriceSettingsService.java
  17. 0 9
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PianoRoomChangeRecordService.java
  18. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/VipCardRecordService.java
  19. 10 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java
  20. 144 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
  21. 18 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  22. 122 14
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  23. 1 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/HomeServiceImpl.java
  24. 19 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  25. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomChangeRecordServiceImpl.java
  26. 14 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  27. 51 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VipCardRecordServiceImpl.java
  28. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ActivityRewardChangeStockVo.java
  29. 29 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml
  30. 7 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml
  31. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/PianoRoomChangeRecordMapper.xml
  32. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml
  33. 2 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/VipCardRecordMapper.xml

+ 0 - 1
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ConditionEnum.java

@@ -17,7 +17,6 @@ public enum ConditionEnum implements BaseEnum<String, ConditionEnum> {
     LIVE("首次创建直播课"),
     VIDEO("首次创建视频课"),
     BIND_STUDENT("学员绑定")
-
     ;
 
     @EnumValue

+ 5 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityPlanController.java

@@ -15,6 +15,7 @@ import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -117,7 +118,7 @@ public class ActivityPlanController extends BaseController {
     /**
      * 修改奖品
      */
-    @GetMapping("/saveOrUpdateReward")
+    @PostMapping("/saveOrUpdateReward")
     @ApiOperation(value = "修改奖品")
     @PreAuthorize("@pcs.hasPermissions('activityPlan/updateReward')")
     public HttpResponseResult saveOrUpdateReward(@Validated @RequestBody List<ActivityPlanRewardDto> updateRewardDtoList) {
@@ -125,6 +126,9 @@ public class ActivityPlanController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        if (CollectionUtils.isEmpty(updateRewardDtoList)) {
+            return failed("参数异常");
+        }
         try {
             return HttpResponseResult.succeed(activityPlanService.saveOrUpdateReward(updateRewardDtoList));
         } catch (BizException e) {

+ 12 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java

@@ -3,7 +3,9 @@ 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.dto.ActivityRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -122,7 +124,7 @@ public class ActivityRewardController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
         activityRewardChangeStock.setCreateBy(user.getId());
-
+        activityRewardChangeStock.setSource("ADMIN");
         try {
             activityRewardService.updateStock(activityRewardChangeStock);
             return HttpResponseResult.succeed();
@@ -134,6 +136,15 @@ public class ActivityRewardController extends BaseController {
         }
     }
 
+    /**
+     * 库存变更记录查询分页
+     */
+    @PostMapping("/selectChangeStockPage")
+    @ApiOperation(value = "库存变更记录查询分页", notes = "传入activityRewardChangeStockSearch")
+    public HttpResponseResult<PageInfo<ActivityRewardChangeStockVo>> selectChangeStockPage(@RequestBody ActivityRewardChangeStockSearch query) {
+        IPage<ActivityRewardChangeStockVo> pages = activityRewardService.selectChangeStockPage(PageUtil.getPage(query), query);
+        return succeed(PageUtil.pageInfo(pages));
+    }
 
 
 }

+ 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));
 	}
 }

+ 20 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java

@@ -19,7 +19,13 @@ public interface ActivityPlanRewardDao extends BaseMapper<ActivityPlanReward>{
      * @return: com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo
 	 */
 	ActivityPlanRewardVo detail(@Param("id") Long id);
-
+	/**
+	 * 通过活动id和奖品id查询详情
+	 * @author liweifan
+	 * @date 2022-08-17 11:13:13
+	 * @return: com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo
+	 */
+	ActivityPlanReward detailByActivityIdAndRewardId(@Param("activityId") Long activityId,@Param("rewardId") Long rewardId);
 	/**
 	 * 分页查询
      * @author liweifan
@@ -34,4 +40,17 @@ public interface ActivityPlanRewardDao extends BaseMapper<ActivityPlanReward>{
 	 * @return
 	 */
     List<ActivityPlanRewardDto> queryActivityPlanReward(@Param("activityId")Long activityId);
+
+	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);
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityPlanSearch.java

@@ -43,6 +43,14 @@ public class ActivityPlanSearch extends QueryInfo{
 		this.activityName = activityName;
 	}
 
+	public ClientEnum getActivityClient() {
+		return activityClient;
+	}
+
+	public void setActivityClient(ClientEnum activityClient) {
+		this.activityClient = activityClient;
+	}
+
 	public Integer getDraftFlag() {
 		return draftFlag;
 	}

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityRewardChangeStockSearch.java

@@ -0,0 +1,14 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-08-17 16:28:03
+ */
+@ApiModel(value = "ActivityRewardChangeStockSearch对象", description = "活动奖品库存调整记录表查询对象")
+public class ActivityRewardChangeStockSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+}

+ 13 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityRewardChangeStock.java

@@ -39,6 +39,9 @@ public class ActivityRewardChangeStock implements Serializable {
 	@TableField(value = "change_type_")
     @NotNull(message = "调整类型不能为空")
     private InOrOutEnum changeType;
+    @ApiModelProperty("变更来源:ADMIN 后台调整 ACTIVITY 活动分配 ")
+    @TableField(value = "source_")
+    private String source;
     @ApiModelProperty("创建时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -79,8 +82,16 @@ public class ActivityRewardChangeStock implements Serializable {
     public void setChangeType(InOrOutEnum changeType) {
         this.changeType = changeType;
     }
-    
-	public Date getCreateTime() {
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    public Date getCreateTime() {
         return createTime;
     }
 

+ 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;

+ 42 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java

@@ -11,29 +11,63 @@ import java.util.List;
 
 /**
  * 活动计划奖品表 服务类
+ *
  * @author liweifan
  * @date 2022-08-17
  */
-public interface ActivityPlanRewardService extends IService<ActivityPlanReward>  {
+public interface ActivityPlanRewardService extends IService<ActivityPlanReward> {
 
-	/**
+    /**
      * 查询详情
+     *
      * @author liweifan
- 	 * @date 2022-08-17
+     * @date 2022-08-17
      */
-	ActivityPlanRewardVo detail(Long id);
+    ActivityPlanRewardVo detail(Long id);
 
+    ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId);
     /**
      * 分页查询
+     *
      * @author liweifan
- 	 * @date 2022-08-17
+     * @date 2022-08-17
      */
     IPage<ActivityPlanRewardVo> selectPage(IPage<ActivityPlanRewardVo> page, ActivityPlanRewardSearch query);
 
+    /**
+     * 查询活动下的奖品
+     *
+     * @param activityId
+     * @return
+     */
+    List<ActivityPlanRewardDto> queryActivityPlanReward(Long activityId);
+
+    /**
+     * 查询活动被删除的奖品
+     *
+     * @param activityId 活动id
+     * @param rewardIds 当前奖品
+     * @return
+     */
+    List<ActivityPlanReward> getDelRewardList(Long activityId, List<Long> rewardIds);
+
+    /**
+     * 新增或修改活动奖品
+     * @param rewardDto
+     * @return
+     */
+    Boolean saveOrUpdateReward(ActivityPlanRewardDto rewardDto);
+    /**
+     * 回收活动奖品数
+     * @param reward
+     * @return
+     */
+    Boolean recoveryReward(ActivityPlanReward reward);
 	/**
-	 * 查询活动下的奖品
-	 * @param activityId
+	 * 减少库存
+	 *  @param activityId 活动id
+	 * @param rewardId   奖品id
 	 * @return
 	 */
-	List<ActivityPlanRewardDto> queryActivityPlanReward(Long activityId);
+    int reduceStock(Long activityId, Long rewardId);
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java

@@ -4,7 +4,9 @@ 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.ActivityRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
@@ -71,4 +73,5 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 */
 	Boolean updateStock(ActivityRewardChangeStock activityRewardChangeStock);
 
+	IPage<ActivityRewardChangeStockVo> selectChangeStockPage(IPage<ActivityRewardChangeStockSearch> page, ActivityRewardChangeStockSearch query);
 }

+ 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

+ 10 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
 import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
@@ -17,6 +18,7 @@ import org.slf4j.LoggerFactory;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanEvaluationDao;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanEvaluationService;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -38,7 +40,7 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
             planExpand.setCreateBy(activityPlan.getUserId());
             planExpand.setUpdateBy(activityPlan.getUserId());
             save(planExpand);
-        }else{
+        } else {
             planExpand.setUpdateBy(activityPlan.getUserId());
             updateById(planExpand);
         }
@@ -62,10 +64,15 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void successActivity(Long activityId) {
         List<ActivityUserReward> activityUserRewardList = baseMapper.getUserReward(activityId);
-
-        //todo 发奖逻辑
         activityUserRewardService.saveBatch(activityUserRewardList);
+
+        //调用奖品发奖逻辑
+        for (ActivityUserReward reward : activityUserRewardList) {
+            //传入用户id和活动id
+
+        }
     }
 }

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

@@ -2,7 +2,19 @@ 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.ActivityRewardChangeStockDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
+import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
+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;
@@ -12,20 +24,47 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityPlanRewardSearch;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanRewardDao;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
 
 
 @Service
 public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewardDao, ActivityPlanReward> implements ActivityPlanRewardService {
     private final static Logger log = LoggerFactory.getLogger(ActivityPlanRewardServiceImpl.class);
 
-	@Override
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private ActivityRewardService activityRewardService;
+
+    @Resource
+    private ActivityRewardChangeStockDao changeStockDao;
+
+    //奖品发放
+    public static final Map<RewardTypeEnum, Consumer<Long>> rewardGrant = new HashMap<>();
+
+    @PostConstruct
+    private void init() {
+
+    }
+
+    @Override
     public ActivityPlanRewardVo detail(Long id) {
         return baseMapper.detail(id);
     }
-    
+
     @Override
-    public IPage<ActivityPlanRewardVo> selectPage(IPage<ActivityPlanRewardVo> page, ActivityPlanRewardSearch query){
+    public ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId) {
+        return baseMapper.detailByActivityIdAndRewardId(activityId, rewardId);
+    }
+
+    @Override
+    public IPage<ActivityPlanRewardVo> selectPage(IPage<ActivityPlanRewardVo> page, ActivityPlanRewardSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 
@@ -34,4 +73,106 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
         return baseMapper.queryActivityPlanReward(activityId);
     }
 
+    @Override
+    public List<ActivityPlanReward> getDelRewardList(Long activityId, List<Long> rewardIds) {
+        return baseMapper.getDelRewardList(activityId, rewardIds);
+    }
+
+    @Override
+    public Boolean saveOrUpdateReward(ActivityPlanRewardDto rewardDto) {
+        DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(rewardDto.getId())
+                        , (out) -> {
+                            DistributedLock.of(redissonClient)
+                                    .runIfLockToFunction(CacheNameEnum.LOCK_REWARD_STOCK.getRedisKey(out.getId())
+                                            , (param) -> {
+                                                ActivityRewardVo detail = activityRewardService.detail(param.getRewardId());
+
+                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId());
+                                                if (null == old) {
+                                                    Integer stock = detail.getStock() - param.getRewardNum();
+                                                    if (stock < 0) {
+                                                        throw new BizException("奖品库存不足");
+                                                    }
+                                                    save(param);
+
+                                                    //入库存变更记录
+                                                    ActivityRewardChangeStock changeStock = new ActivityRewardChangeStock();
+                                                    changeStock.setRewardId(param.getRewardId());
+                                                    changeStock.setStock(param.getRewardNum());
+                                                    changeStock.setChangeType(InOrOutEnum.OUT);
+                                                    changeStock.setSource("ACTIVITY");
+                                                    changeStockDao.insert(changeStock);
+
+                                                    detail.setStock(stock);
+                                                    activityRewardService.updateById(detail);
+                                                } else {
+                                                    param.setId(old.getId());
+                                                    updateById(param);
+
+                                                    Integer changeStock = param.getRewardNum() - old.getRewardNum();
+                                                    if (changeStock == 0) {
+                                                        return true;
+                                                    }
+
+                                                    Integer stock = detail.getStock() - changeStock;
+                                                    if (stock < 0) {
+                                                        throw new BizException("奖品库存不足");
+                                                    }
+
+                                                    //入库存变更记录
+                                                    ActivityRewardChangeStock changeStockObj = new ActivityRewardChangeStock();
+                                                    changeStockObj.setRewardId(param.getRewardId());
+                                                    changeStockObj.setStock(param.getRewardNum());
+                                                    changeStockObj.setChangeType(
+                                                            detail.getStock() < stock ? InOrOutEnum.IN : InOrOutEnum.OUT);
+                                                    changeStockObj.setSource("ACTIVITY");
+                                                    changeStockDao.insert(changeStockObj);
+
+                                                    detail.setStock(stock);
+                                                    activityRewardService.updateById(detail);
+                                                }
+                                                return true;
+                                            }, out, 10l);
+                            return true;
+                        }, rewardDto, 10l);
+        return true;
+    }
+
+    @Override
+    public Boolean recoveryReward(ActivityPlanReward reward) {
+        DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(reward.getId())
+                        , (out) -> {
+                            DistributedLock.of(redissonClient)
+                                    .runIfLockToFunction(CacheNameEnum.LOCK_REWARD_STOCK.getRedisKey(out.getId())
+                                            , (param) -> {
+                                                ActivityRewardVo detail = activityRewardService.detail(param.getRewardId());
+
+                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId());
+
+                                                if (old.getRewardNum() > 0) {
+                                                    //入库存变更记录
+                                                    ActivityRewardChangeStock changeStockObj = new ActivityRewardChangeStock();
+                                                    changeStockObj.setRewardId(param.getRewardId());
+                                                    changeStockObj.setStock(param.getRewardNum());
+                                                    changeStockObj.setChangeType(InOrOutEnum.IN);
+                                                    changeStockObj.setSource("ACTIVITY");
+                                                    changeStockDao.insert(changeStockObj);
+
+                                                    detail.setStock(detail.getStock() + old.getRewardNum());
+                                                    activityRewardService.updateById(detail);
+                                                }
+                                                return true;
+                                            }, out, 10l);
+                            return true;
+                        }, reward, 10l);
+        return false;
+    }
+
+    @Override
+    public int reduceStock(Long activityId, Long rewardId) {
+        return baseMapper.reduceStock(activityId,rewardId);
+    }
+
 }

+ 18 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanDao;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanEvaluationDao;
+import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
@@ -49,6 +50,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
 
 @Service
@@ -81,6 +83,9 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Resource
+    private ActivityRewardChangeStockDao changeStockDao;
+
     @Autowired
     private RedissonClient redissonClient;
 
@@ -396,7 +401,7 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
             }
         }
 
-        //活动发奖
+        //活动完成
         List<ActivityPlan> rewardList = baseMapper.activityReward();
         for (ActivityPlan activityPlan : rewardList) {
             //活动置为已发奖(已完成)
@@ -414,22 +419,23 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean saveOrUpdateReward(List<ActivityPlanRewardDto> updateRewardDtoList) {
+        Long activityId = updateRewardDtoList.get(0).getActivityId();
+
         for (ActivityPlanRewardDto rewardDto : updateRewardDtoList) {
-            DistributedLock.of(redissonClient)
-                    .runIfLockToFunction(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(rewardDto.getId())
-                            , this::dosaveOrUpdateReward, rewardDto, 10l);
+            activityPlanRewardService.saveOrUpdateReward(rewardDto);
+        }
+        //还有删除的
+        List<Long> rewardIds = updateRewardDtoList.stream().map(ActivityPlanRewardDto::getRewardId).collect(Collectors.toList());
+        List<ActivityPlanReward> delList = activityPlanRewardService.getDelRewardList(activityId, rewardIds);
+        for (ActivityPlanReward reward : delList) {
+            //修改库存
+            activityPlanRewardService.recoveryReward(reward);
+            //删除活动奖品
+            activityPlanRewardService.removeById(reward.getId());
         }
         return true;
     }
 
-    private Boolean dosaveOrUpdateReward(ActivityPlanRewardDto rewardDto) {
-        //奖品
-        ActivityRewardVo detail = activityRewardService.detail(rewardDto.getRewardId());
-
-        return false;
-    }
-
-
     /**
      * 参与活动消息
      */

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

@@ -2,34 +2,46 @@ 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;
 import com.yonge.cooleshow.biz.dal.dto.ActivityRewardDto;
+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
@@ -42,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);
@@ -76,23 +105,17 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             activityReward.setCreateBy(user.getId());
             baseMapper.insert(activityReward);
         } else {
-            DistributedLock.of(redissonClient)
-                    .runIfLockToFunction(CacheNameEnum.LOCK_REWARD_STOCK.getRedisKey(activityReward.getId())
-                            , (param) -> {
-                                param.setUpdateBy(user.getId());
-                                baseMapper.updateById(param);
-                                return true;
-                            }, activityReward, 10l);
+            activityReward.setStock(null);
+
+            activityReward.setUpdateBy(user.getId());
+            baseMapper.updateById(activityReward);
         }
         return true;
     }
 
     @Override
     public List<ActivityReward> getActivityReward(Long activityPlanId) {
-        return this.lambdaQuery()
-                .eq(ActivityReward::getActivityId, activityPlanId)
-                .list();
-
+        return baseMapper.getActivityReward(activityPlanId);
     }
 
     @Override
@@ -126,4 +149,89 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                             return true;
                         }, changeStock, 10l);
     }
+
+    @Override
+    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) -> {

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

@@ -37,6 +37,7 @@ import org.springframework.stereotype.Service;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -47,13 +48,13 @@ import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.TEACHER_TEMP
 public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> implements TeacherService {
     @Autowired
     private TeacherStyleVideoService teacherStyleVideoService;
-    @Autowired
+    @Resource
     private SysUserFeignService userFeignService;
     @Autowired
     private TeacherAuthEntryRecordService entryRecordService;
     @Autowired
     private TeacherAuthMusicianRecordService musicianRecordService;
-    @Autowired
+    @Resource
     private EmployeeDao employeeDao;
     @Autowired
     private RedissonClient redissonClient;
@@ -189,7 +190,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
             // 添加标签
             this.setTeacherTag(id, TeacherTagEnum.LIVE);
-
             return HttpResponseResult.status(true);
         } else {
             return HttpResponseResult.failed("不满足开通条件");
@@ -399,9 +399,11 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         //修改老师信息
         int i = baseMapper.updateById(teacherDto);
         List<TeacherStyleVideo> styleVideo = teacherDto.getStyleVideo();
+
         List<TeacherStyleVideo> createList = styleVideo.stream().filter(o -> o.getId() == null)
                 .collect(Collectors.toList());
 
+
         createList.forEach(o -> {
             o.setUserId(teacherDto.getUserId());
             o.setAuthStatus(AuthStatusEnum.DOING);
@@ -414,11 +416,17 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         teacherStyleVideoService.removeByUserIdAndOldIds(teacherDto.getUserId(), oldIds);
         //保存新视频
         teacherStyleVideoService.batchAddStyleVideo(createList);
-        return HttpResponseResult.succeed(detail(teacherDto.getUserId()));
-    }
-
 
+        styleVideo.removeAll(createList);
 
+        //修改视频封面
+        styleVideo.forEach(o->{
+            teacherStyleVideoService.update(Wrappers.<TeacherStyleVideo>lambdaUpdate()
+                    .set(TeacherStyleVideo::getCover,o.getCover())
+                    .eq(TeacherStyleVideo::getId,o.getId()));
+        });
+        return HttpResponseResult.succeed(detail(teacherDto.getUserId()));
+    }
 
     @Override
     public HttpResponseResult<Boolean> addHomeBrowse(Long userId) {

+ 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;

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ActivityRewardChangeStockVo.java

@@ -0,0 +1,13 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-08-17 16:28:03
+ */
+@ApiModel(value = "ActivityRewardChangeStockVo对象", description = "活动奖品库存调整记录表查询视图对象")
+public class ActivityRewardChangeStockVo extends ActivityRewardChangeStock{
+	private static final long serialVersionUID = 1L;
+}

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

@@ -24,7 +24,15 @@
         FROM activity_plan_reward t
         where t.id_ = #{id}
     </select>
-    
+
+    <select id="detailByActivityIdAndRewardId"
+            resultType="com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward">
+        SELECT
+            <include refid="baseColumns"/>
+        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" />
@@ -58,4 +66,24 @@
         left join activity_reward ar on t.reward_id_ = ar.id_
         where t.activity_id_ = #{activityId}
     </select>
+
+    <select id="getDelRewardList" resultType="com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward">
+        SELECT
+            <include refid="baseColumns" />
+        FROM activity_plan_reward t
+        where t.activity_id_ = #{activityId}
+        <if test="rewardIds != null and rewardIds.size() != 0">
+            and t.reward_id_ not in
+            <foreach collection="rewardIds" separator="," close=")" open="(" item="item">
+                #{item}
+            </foreach>
+        </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">