Browse Source

运营活动开发

liweifan 3 years ago
parent
commit
3d5f1d50b1

+ 43 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java

@@ -11,39 +11,48 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 
 
 public interface ActivityRewardDao extends BaseMapper<ActivityReward> {
-	/**
-	 * 查询详情
-	 *
-	 * @author liweifan
-	 * @date 2022-08-04 10:19:49
-	 * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
-	 */
-	ActivityRewardVo detail(@Param("id") Long id);
-
-	ActivityRewardVo detailByActivityId(@Param("id") Long id);
-
-	/**
-	 * 分页查询
-	 *
-	 * @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
-	 */
+    /**
+     * 查询详情
+     *
+     * @author liweifan
+     * @date 2022-08-04 10:19:49
+     * @return: com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo
+     */
+    ActivityRewardVo detail(@Param("id") Long id);
+
+    ActivityRewardVo detailByActivityId(@Param("id") Long id);
+
+    /**
+     * 分页查询
+     *
+     * @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);
+
+    /**
+     * 判断用户是否发过奖
+     *
+     * @param userId
+     * @param activityId
+     * @return
+     */
+    Boolean userRewarded(@Param("userId") Long userId, @Param("activityId") Long activityId);
 }

+ 10 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserFirstTimeDao.java

@@ -1,9 +1,18 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 
 public interface UserFirstTimeDao extends BaseMapper<UserFirstTime>{
-	
+    /**
+     * 查询集合
+     * @param param
+     * @return
+     */
+    List<UserFirstTime> selectAllList(@Param("param") UserFirstTimeSearch param);
 }

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

@@ -0,0 +1,75 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022-08-18 10:03:38
+ */
+@ApiModel(value = "UserFirstTimeSearch对象", description = "时间记录表查询对象")
+public class UserFirstTimeSearch extends QueryInfo{
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("用户id ")
+	private Long userId;
+	@ApiModelProperty("用户类型:STUDENT 学生 TEACHER 老师 ")
+	private String userType;
+	@ApiModelProperty("时间类型:ENTRY 达人认证 LIVEING 开通直播 ")
+	private String timeType;
+	@ApiModelProperty(value = "活动开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date startTime;
+	@ApiModelProperty(value = "活动结束时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date endTime;
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public String getUserType() {
+		return userType;
+	}
+
+	public void setUserType(String userType) {
+		this.userType = userType;
+	}
+
+	public String getTimeType() {
+		return timeType;
+	}
+
+	public void setTimeType(String timeType) {
+		this.timeType = timeType;
+	}
+
+	public Date getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(Date startTime) {
+		this.startTime = startTime;
+	}
+
+	public Date getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(Date endTime) {
+		this.endTime = endTime;
+	}
+}

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanStandard.java

@@ -1,9 +1,9 @@
 package com.yonge.cooleshow.biz.dal.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.common.enums.ConditionMethodEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -27,7 +27,7 @@ public class ActivityPlanStandard implements Serializable {
     private String condition;
     @ApiModelProperty("计算方式:AND 全部满足 OR 满足其一 ")
 	@TableField(value = "calculation_method")
-    private String calculationMethod;
+    private ConditionMethodEnum calculationMethod;
     @ApiModelProperty("创建时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -61,11 +61,11 @@ public class ActivityPlanStandard implements Serializable {
         this.condition = condition;
     }
     
-	public String getCalculationMethod() {
+	public ConditionMethodEnum getCalculationMethod() {
         return calculationMethod;
     }
 
-    public void setCalculationMethod(String calculationMethod) {
+    public void setCalculationMethod(ConditionMethodEnum calculationMethod) {
         this.calculationMethod = calculationMethod;
     }
     

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

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
 import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 时间记录表 服务类
@@ -14,6 +16,11 @@ import java.util.Date;
  */
 public interface UserFirstTimeService extends IService<UserFirstTime>  {
     /**
+     * 查询集合
+     * @return
+     */
+    List<UserFirstTime> selectAllList(UserFirstTimeSearch param);
+    /**
      * 记录时间
      * @param userId(用户id)
      * @param userType (用户类型)

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

@@ -1,19 +1,41 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
+import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
+import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
+import com.yonge.cooleshow.common.enums.ConditionEnum;
+import com.yonge.cooleshow.common.enums.ConditionMethodEnum;
+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.ActivityPlanStandard;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao;
-import com.yonge.cooleshow.biz.dal.service.ActivityPlanStandardService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 @Service
 public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanStandardDao, ActivityPlanStandard> implements ActivityPlanStandardService {
     private final static Logger log = LoggerFactory.getLogger(ActivityPlanStandardServiceImpl.class);
 
+    @Autowired
+    private ActivityPlanService activityPlanService;
+    @Autowired
+    private UserFirstTimeService userFirstTimeService;
+    @Autowired
+    private ActivityRewardService activityRewardService;
+
     @Override
     public boolean createOrUpdate(ActivityPlanDto activityPlan) {
         ActivityPlanStandard planExpand = activityPlan.getPlanStandard();
@@ -22,7 +44,7 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
             planExpand.setCreateBy(activityPlan.getUserId());
             planExpand.setUpdateBy(activityPlan.getUserId());
             save(planExpand);
-        }else{
+        } else {
             planExpand.setUpdateBy(activityPlan.getUserId());
             updateById(planExpand);
         }
@@ -31,7 +53,58 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
 
     @Override
     public void activityIng(Object param) {
+        //查询当前进行的活动
+        List<ActivityPlan> activityIds = activityPlanService.list(Wrappers.<ActivityPlan>lambdaQuery()
+                .eq(ActivityPlan::getActivityType, ActivityTypeEnum.STANDARD_GIFT)
+                .eq(ActivityPlan::getActivityState, 1)
+                .select(ActivityPlan::getId));
 
+        for (ActivityPlan activityPlan : activityIds) {
+            ActivityPlanVo detail = activityPlanService.detail(activityPlan.getId());
+
+            dealActivityIng(detail);
+        }
+
+    }
+
+    private void dealActivityIng(ActivityPlanVo detail) {
+        if(null == detail){
+            return;
+        }
+        ActivityPlanStandard planStandard = detail.getPlanStandard();
+        if(null == planStandard){
+            return;
+        }
+
+        UserFirstTimeSearch search = new UserFirstTimeSearch();
+        search.setStartTime(detail.getActivityStart());
+        search.setEndTime(detail.getActivityEnd());
+        search.setUserType(detail.getActivityClient().getCode());
+
+        String timeType = planStandard.getCondition();
+        search.setTimeType(timeType);
+        List<String> timeTypes = WrapperUtil.toList(timeType);
+
+        List<UserFirstTime> userFirstTimes = userFirstTimeService.selectAllList(search);
+        if(CollectionUtils.isEmpty(userFirstTimes)){
+            return;
+        }
+        Map<Long, List<UserFirstTime>> userMap = userFirstTimes.stream().collect(Collectors.groupingBy(UserFirstTime::getUserId));
+        if(ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())){
+            for(Long userId : userMap.keySet()){
+                //给用户发奖
+                activityRewardService.sendReward(userId,detail.getId());
+            }
+        }else{
+            for(Long userId : userMap.keySet()){
+                List<UserFirstTime> firstTimes = userMap.get(userId);
+                if(firstTimes.size() == timeTypes.size()){
+                    //给用户发奖
+                    activityRewardService.sendReward(userId,detail.getId());
+                }
+            }
+
+        }
     }
 
     @Override

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

@@ -153,6 +153,9 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     @Override
     @Transactional(rollbackFor = Exception.class)
     public List<Long> sendReward(Long userId, Long activityId) {
+        if (userRewarded(userId, activityId)) {
+            return null;
+        }
         ActivityPlan activityPlan = activityPlanService.getById(activityId);
         if (activityPlan == null) {
             log.warn("活动不存在");
@@ -164,7 +167,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
 
         // 级联锁同时处理奖品库存
-        List<RLock>  lockList = new ArrayList<>();
+        List<RLock> lockList = new ArrayList<>();
         for (ActivityReward activityReward : activityRewardList) {
             lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_EXECUTE_ORDER.getRedisKey(activityReward.getId())));
         }
@@ -189,7 +192,7 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                     pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
                     pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
                 } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
-                    memberPriceSettingsService.activityReward(userId,activityPlan.getActivityClient(),activityReward,activityId);
+                    memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(), activityReward, activityId);
                 }
 
                 activityRewardName.append(activityReward.getRewardName());
@@ -200,21 +203,25 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
                 sendActivityMessage(userId, activityPlan.getActivityName(), activityRewardName.toString(), activityPlan.getActivityClient());
             }
         } finally {
-            if (lock.getHoldCount() >0)
+            if (lock.getHoldCount() > 0)
                 lock.unlock();
         }
 
         return activityRewardIdList;
     }
 
+    private Boolean userRewarded(Long userId, Long activityId) {
+        return baseMapper.userRewarded(userId, activityId);
+    }
+
     /**
      * 获奖人员发送
      *
-     * @param userId  用户id
-     * @param activityName 活动名
+     * @param userId             用户id
+     * @param activityName       活动名
      * @param activityRewardName 活动奖品名
      */
-    private void sendActivityMessage(Long userId, String activityName, String activityRewardName,ClientEnum clientType) {
+    private void sendActivityMessage(Long userId, String activityName, String activityRewardName, ClientEnum clientType) {
         SysUser user = sysUserFeignService.queryUserById(userId);
         if (user == null) {
             log.warn("用户未找到");
@@ -226,10 +233,10 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             receivers.put(userId, user.getPhone());
 
             sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_ADJUST, receivers, null,
-                                               0, null,clientType.getCode(), user.getUsername(), "陪练课", activityName, activityRewardName);
+                    0, null, clientType.getCode(), user.getUsername(), "陪练课", activityName, activityRewardName);
         } catch (Exception e) {
             e.printStackTrace();
-            log.error("获奖消息发送失败,{}",e.getMessage());
+            log.error("获奖消息发送失败,{}", e.getMessage());
         }
 
     }

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

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.enums.UserFirstTimeTypeEnum;
 import org.springframework.stereotype.Service;
@@ -12,6 +13,7 @@ import com.yonge.cooleshow.biz.dal.dao.UserFirstTimeDao;
 import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
 
 import java.util.Date;
+import java.util.List;
 
 
 @Service
@@ -19,6 +21,11 @@ public class UserFirstTimeServiceImpl extends ServiceImpl<UserFirstTimeDao, User
     private final static Logger log = LoggerFactory.getLogger(UserFirstTimeServiceImpl.class);
 
     @Override
+    public List<UserFirstTime> selectAllList(UserFirstTimeSearch param) {
+        return baseMapper.selectAllList(param);
+    }
+
+    @Override
     public Boolean recordTime(Long userId, ClientEnum userType, UserFirstTimeTypeEnum firstTimeTypeEnum) {
         return recordTime(userId, userType, firstTimeTypeEnum, new Date());
     }

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

@@ -85,4 +85,9 @@
         left join activity_reward ar on apr.reward_id_ = ar.id_
         where apr.activity_id_ = #{activityPlanId}
     </select>
+
+    <select id="userRewarded" resultType="java.lang.Boolean">
+        select (count(1)>0) as flag from activity_user_reward
+        where activity_id_ = #{activityId} and user_id_ = #{userId}
+    </select>
 </mapper>

+ 24 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserFirstTimeMapper.xml

@@ -16,7 +16,30 @@
         , t.user_id_ as userId
         , t.user_type_ as userType
         , t.time_type_ as timeType
-        , t.time_ as time
+        , t.time_ as `time`
         , t.create_time_ as createTime
         </sql>
+
+    <select id="selectAllList" resultType="com.yonge.cooleshow.biz.dal.entity.UserFirstTime">
+        SELECT
+            <include refid="baseColumns"/>
+        FROM user_first_time t
+        <where>
+            <if test="param.userId != null">
+                and t.user_id_ = #{param.userId}
+            </if>
+            <if test="param.userType != null and param.userType != ''">
+                and find_in_set(t.user_type_ , #{param.userType})
+            </if>
+            <if test="param.timeType != null and param.userType != ''">
+                and find_in_set(t.time_type_ , #{param.timeType})
+            </if>
+            <if test="param.startTime != null">
+                and t.time_ &gt;= #{param.startTime}
+            </if>
+            <if test="param.endTime != null">
+                and t.time_ &lt;= #{param.endTime}
+            </if>
+        </where>
+    </select>
 </mapper>