Browse Source

Merge branch 'saas_2022_05_17_activity' of http://git.dayaedu.com/yonge/mec into zouxuan-2022-05-27

zouxuan 3 năm trước cách đây
mục cha
commit
54b5a32ce5

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TempLittleArtistTrainingCampUserRelation.java

@@ -48,6 +48,10 @@ public class TempLittleArtistTrainingCampUserRelation implements Serializable {
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
+    @TableField("apply_time_")
+    @ApiModelProperty(value = "报名时间")
+    private Date applyTime;
+
     public Integer getId() {
         return id;
     }
@@ -96,5 +100,12 @@ public class TempLittleArtistTrainingCampUserRelation implements Serializable {
         this.createTime = createTime;
     }
 
+    public Date getApplyTime() {
+        return applyTime;
+    }
+
+    public void setApplyTime(Date applyTime) {
+        this.applyTime = applyTime;
+    }
 }
 

+ 12 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/vo/ImLiveBroadcastRoomVo.java

@@ -74,11 +74,12 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     @ApiModelProperty(value = "是否在首页推广 0否 1是 - 每个机构只能有一个直播间在首页推广")
     private Integer popularize;
 
-    /**
-     * 是否预约过该直播间 0否 1是
-     */
+    @ApiModelProperty(value = "是否预约过该直播间 0否 1是")
     private Integer reserve;
 
+    @ApiModelProperty(value = "当前登录人是否是黑名单用户 0否 1是")
+    private Integer blacklistFlag = 0;
+
     @ApiModelProperty(value = "点赞数")
     private Integer likeNum;
     @ApiModelProperty(value = "当前观看人数")
@@ -275,5 +276,13 @@ public class ImLiveBroadcastRoomVo implements Serializable {
     public void setReserve(Integer reserve) {
         this.reserve = reserve;
     }
+
+    public Integer getBlacklistFlag() {
+        return blacklistFlag;
+    }
+
+    public void setBlacklistFlag(Integer blacklistFlag) {
+        this.blacklistFlag = blacklistFlag;
+    }
 }
 

+ 41 - 32
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -225,11 +225,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void update(ImLiveBroadcastRoomDto dto) {
+        Date now = new Date();
+        if (now.getTime() > dto.getLiveStartTime().getTime()) {
+            throw new BizException("设置的直播开始时间不能小于当前时间");
+        }
         ImLiveBroadcastRoom obj = this.getById(dto.getId());
         BeanUtils.copyProperties(dto, obj);
         obj.setRoomConfig(JSONObject.toJSONString(dto.getRoomConfig()));
         obj.setUpdatedBy(getSysUser().getId());
-        obj.setUpdatedTime(new Date());
+        obj.setUpdatedTime(now);
         log.info("update room  >>>  :{}", JSONObject.toJSONString(obj));
         this.updateById(obj);
     }
@@ -326,6 +330,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         Map<String, Object> param = new HashMap<>();
         param.put("tenantId", TenantContextHolder.getTenantId());
         param.put("popularize", 1);
+        param.put("liveState", 1);
         List<ImLiveBroadcastRoomVo> list = baseMapper.queryPage(param);
         if (CollectionUtils.isNotEmpty(list)) {
             return list.get(0);
@@ -338,11 +343,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * 销毁主讲人退出超过30分钟的直播间
      */
     public void destroyExpiredLiveRoom() {
-        //查询已经开始并且没有删除及销毁的直播间
-        List<ImLiveBroadcastRoom> list = this.list(new WrapperUtil<ImLiveBroadcastRoom>()
-                .hasEq("live_state_", 1)
-                .hasEq("room_state_", 0)
-                .queryWrapper());
+        //查询状态是 未开始和已开始 的直播间
+        List<ImLiveBroadcastRoom> list = this.list(Wrappers.<ImLiveBroadcastRoom>lambdaQuery()
+                .in(ImLiveBroadcastRoom::getLiveState, 0, 1)
+                .eq(ImLiveBroadcastRoom::getRoomState, 0));
         if (CollectionUtils.isEmpty(list)) {
             return;
         }
@@ -365,35 +369,35 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
     private void destroyExpiredLiveRoom(Date now, ImLiveBroadcastRoom room, int expiredMinute) {
         log.error("roomDestroy destroyExpiredLiveRoom >>>> now {} roomInfo : {} expiredMinute:{}", now, JSONObject.toJSONString(room), expiredMinute);
+        //过期时间 = LiveStartTime + expiredMinute
+        Date expiredTime = DateUtil.addMinutes(room.getLiveStartTime(), expiredMinute);
+        //当前时间 小于 过期时间 则不销毁
+        if (now.getTime() <= expiredTime.getTime()) {
+            return;
+        }
         //获取直播间主讲人信息
         RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString()));
         if (speakerCache.isExists()) {
             RoomSpeakerInfo speakerInfo = speakerCache.get();
-            //过期时间= 房间正式开始时间+expiredMinute 分钟
-            Date expiredTime = DateUtil.addMinutes(room.getLiveStartTime(), expiredMinute);
-            //先决条件 当前时间 大于(创建房间时填入的开播时间 + 设置的过期分钟数)
-            if (now.getTime() >= expiredTime.getTime()) {
-
-                //1.主播没有进入房间,则直接销毁房间
-                if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
-                    log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
-                    roomDestroy(room);
-                    return;
-                }
+            //1.主播没有进入房间,则直接销毁房间
+            if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
+                log.info("roomDestroy not joinRoom >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
+                roomDestroy(room);
+                return;
+            }
 
-                //如果主播已经进入了房间 就判断是否退出过房间
-                if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
-                    //如果退出过房间 判断退出时间是否大于进入时
-                    if (speakerInfo.getExitRoomTime().getTime() > speakerInfo.getJoinRoomTime().getTime()) {
-                        //如果退出时间大于进入时间,就将退出时间+expiredMinute分钟
-                        Date exitExpiredTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
-                        if (now.getTime() >= exitExpiredTime.getTime()) {
-                            log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
-                            roomDestroy(room);
-                        }
+            //2.已知主播已进入了房间 就判断是否退出过房间
+            if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
+                //如果退出时间 大于 进入时间,则证明退出后再也没有进入房间
+                if (speakerInfo.getExitRoomTime().getTime() > speakerInfo.getJoinRoomTime().getTime()) {
+                    //最终过期时间 =  退出时间+expiredMinute过期时间
+                    Date exitExpiredTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
+                    //现在时间 大于等于 最终过期时间 则证明退出后至少30分钟没进入过房间
+                    if (now.getTime() >= exitExpiredTime.getTime()) {
+                        log.info("roomDestroy exitExpiredTime >>>> cache : {}", JSONObject.toJSONString(test(room.getRoomUid())));
+                        roomDestroy(room);
                     }
                 }
-
             }
         }
     }
@@ -897,6 +901,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             });
         }, 2, 1, TimeUnit.MINUTES);
         if (!b) {
+            try {
+                Thread.sleep(200L);
+            } catch (InterruptedException e) {
+                log.error("asyncOpsLiveLookTime error: {}", e.getMessage());
+            }
             this.asyncOpsLiveLookTime(roomUid, type, now);
         }
     }
@@ -907,7 +916,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      */
     public void createLiveRoom() {
         RBucket<Object> createLock = redissonClient.getBucket("IM:LIVE_ROOM_CREATE_LOCK");
-        if (!createLock.trySet(1,1, TimeUnit.MINUTES)) {
+        if (!createLock.trySet(1, 1, TimeUnit.MINUTES)) {
             return;
         }
         Date now = new Date();
@@ -1234,7 +1243,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
      * @param unit     时间单位
      * @return true 锁成功  false 锁失败
      */
-    public boolean runIfLockCanGet(final String lockName, Runnable runnable, final long waitTime, final long timeout, TimeUnit unit) {
+    private boolean runIfLockCanGet(final String lockName, Runnable runnable, final long waitTime, final long timeout, TimeUnit unit) {
         RLock lock = redissonClient.getLock(lockName);
         if (Objects.isNull(lock)) {
             log.info("runIfLockCanGet lock is null lockName : {}", lockName);
@@ -1251,7 +1260,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             }
         } catch (Exception e) {
             log.error("runIfLockCanGet error lockName : {}", lockName, e);
-            throw new RuntimeException("runIfLockCanGet error lockName :" + lockName, e);
+            throw new BizException("runIfLockCanGet error lockName :" + lockName, e);
         } finally {
             this.unlock(lock);
         }
@@ -1260,7 +1269,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     /**
      * 解锁
      */
-    public void unlock(RLock lock) {
+    private void unlock(RLock lock) {
         if (lock.getHoldCount() != 0) {
             lock.unlock();
         }

+ 5 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TempLittleArtistTrainingCampUserRelationServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.TempLittleArtistTrainingCampUserRelationDao;
+import com.ym.mec.biz.dal.entity.SysConfig;
 import com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation;
 import com.ym.mec.biz.dal.vo.TempCampUserQualificationsVo;
 import com.ym.mec.biz.service.SysConfigService;
@@ -20,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
@@ -59,7 +61,7 @@ public class TempLittleArtistTrainingCampUserRelationServiceImpl extends Service
     public void add(Integer campId) {
         SysUser user = getUser();
         RBucket<Object> addCamp = redissonClient.getBucket("TEMP:CAMP_ADD:" + user.getId());
-        if (!addCamp.trySet(1,10, TimeUnit.SECONDS)) {
+        if (!addCamp.trySet(1, 10, TimeUnit.SECONDS)) {
             throw new BizException("正在登记训练营,请勿重复提交");
         }
         TempLittleArtistTrainingCampUserRelation one = this.getOne(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaQuery()
@@ -82,6 +84,7 @@ public class TempLittleArtistTrainingCampUserRelationServiceImpl extends Service
         this.update(Wrappers.<TempLittleArtistTrainingCampUserRelation>lambdaUpdate()
                 .set(TempLittleArtistTrainingCampUserRelation::getActivityId, campId)
                 .set(TempLittleArtistTrainingCampUserRelation::getState, TempLittleArtistTrainingCampUserRelation.APPLY)
+                .set(TempLittleArtistTrainingCampUserRelation::getApplyTime, new Date())
                 .eq(TempLittleArtistTrainingCampUserRelation::getUserId, user.getId()));
         addCamp.delete();
     }
@@ -115,6 +118,7 @@ public class TempLittleArtistTrainingCampUserRelationServiceImpl extends Service
         this.setValue("temp_little_artist_training_camp_content", vo::setContent);
         this.setValue("temp_little_artist_training_camp_title", vo::setCampTitle);
         this.setValue("temp_little_artist_training_camp_url", vo::setUrl);
+        this.setValue(SysConfigService.BASE_API_URL, (a) -> vo.setUrl(a + vo.getUrl()));
 
         vo.setCampId(relation.getActivityId());
         vo.setUserName(user.getUsername());

+ 4 - 3
mec-biz/src/main/resources/config/mybatis/TempLittleArtistTrainingCampUserRelationMapper.xml

@@ -8,20 +8,21 @@
         <result column="im_group_id_" jdbcType="VARCHAR" property="imGroupId"/>
         <result column="state_" jdbcType="VARCHAR" property="state"/>
         <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="apply_time_" jdbcType="TIMESTAMP" property="applyTime"/>
     </resultMap>
 
     <sql id="Base_Column_List">
         id_
-        , activity_id_, user_id_, im_group_id_, state_, create_time_
+        , activity_id_, user_id_, im_group_id_, state_, create_time_,apply_time_
     </sql>
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.ym.mec.biz.dal.entity.TempLittleArtistTrainingCampUserRelation">
         insert into temp_little_artist_training_camp_user_relation(activity_id_, user_id_, im_group_id_, state_,
-        create_time_)
+        create_time_,apply_time_)
         values
         <foreach collection="entities" item="entity" separator=",">
-            (#{entity.activityId}, #{entity.userId}, #{entity.imGroupId}, #{entity.state}, #{entity.createTime})
+            (#{entity.activityId}, #{entity.userId}, #{entity.imGroupId}, #{entity.state}, #{entity.createTime},#{entity.applyTime})
         </foreach>
     </insert>
 

+ 6 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImRoomMessage.java

@@ -18,6 +18,12 @@ public class ImRoomMessage extends BaseMessage {
     //objectName 类型-商品变更
     public static final String LIVE_GOODS_CHANGE = "DY:LIVE_GOODS_CHANGE";
 
+    //objectName 类型-在黑名单中添加该用户
+    public static final String BLOCK_BLACK_USER = "RC:BLOCK_BLACK_USER";
+
+    //objectName 类型-在黑名单中解除该用户
+    public static final String UNBLOCK_BLACK_USER = "RC:UNBLOCK_BLACK_USER";
+
     /**
      * <p>必传
      * 消息类型