فهرست منبع

房间头像、加入房间允许口令为空

wuweihao 3 سال پیش
والد
کامیت
b87bf306b9

+ 13 - 4
gis_cms/src/main/java/com/gis/cms/controller/RoomController.java

@@ -53,11 +53,19 @@ public class RoomController {
         return entityService.detail(id);
     }
 
+//    @WebControllerLog(description = "房间管理-加入房间", addDb = true)
+//    @ApiOperation(value = "加入房间", notes = "使用房间创建者id, 这里不一定知道房间号")
+//    @GetMapping("/join/{code}/{creatorId}")
+//    public Result join(@PathVariable String code, @PathVariable Long creatorId) {
+//        return entityService.join(code, creatorId);
+//    }
+
+
     @WebControllerLog(description = "房间管理-加入房间", addDb = true)
-    @ApiOperation(value = "加入房间", notes = "使用房间创建者id, 这里不一定知道房间号")
-    @GetMapping("/join/{code}/{creatorId}")
-    public Result join(@PathVariable String code, @PathVariable Long creatorId) {
-        return entityService.join(code, creatorId);
+    @ApiOperation(value = "加入房间", notes = "code口令当验证码使用")
+    @GetMapping("/join/{roomId}")
+    public Result join(@PathVariable Long roomId, String code) {
+        return entityService.join(code, roomId);
     }
 
 
@@ -68,4 +76,5 @@ public class RoomController {
 
 
 
+
 }

+ 2 - 2
gis_cms/src/main/java/com/gis/cms/entity/dto/RoomDto.java

@@ -12,8 +12,8 @@ import javax.validation.constraints.NotBlank;
 @Data
 public class RoomDto {
 
-    @NotBlank(message = "口令不能为空")
-    @ApiModelProperty(value = "口令", required = true)
+//    @NotBlank(message = "口令不能为空")
+    @ApiModelProperty(value = "口令(允许为空)")
     private String code;
 
     @NotBlank(message = "结束时间不能为空")

+ 7 - 1
gis_cms/src/main/java/com/gis/cms/entity/po/RoomEntity.java

@@ -8,6 +8,8 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 房间表
@@ -22,7 +24,7 @@ public class RoomEntity extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "口令")
     private String code;
 
-    @ApiModelProperty(value = "口令")
+    @ApiModelProperty(value = "房间名称")
     private String name;
 
     @ApiModelProperty(value = "结束时间")
@@ -43,6 +45,10 @@ public class RoomEntity extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "状态:1:结束, 0:进行中")
     private Integer statusVo;
 
+    @TableField(exist  = false)
+    @ApiModelProperty(value = "房间用户头像集合")
+    private List<String> AvatarUrls = new ArrayList<>();
+
 
 
 

+ 20 - 0
gis_cms/src/main/java/com/gis/cms/entity/vo/RoomVo.java

@@ -0,0 +1,20 @@
+package com.gis.cms.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by owen on 2022/5/9 0009 14:02
+ */
+@Data
+public class RoomVo {
+
+    @ApiModelProperty(value = "房间id")
+    private Long roomId;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "用户头像")
+    private String avatarUrl;
+}

+ 4 - 0
gis_cms/src/main/java/com/gis/cms/mapper/RoomMapper.java

@@ -3,6 +3,7 @@ package com.gis.cms.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.gis.cms.entity.po.RoomEntity;
+import com.gis.cms.entity.vo.RoomVo;
 import com.gis.cms.entity.vo.WxUserVo;
 import com.gis.common.base.mapper.provider.BaseProvider;
 import org.apache.ibatis.annotations.Mapper;
@@ -21,6 +22,9 @@ public interface RoomMapper extends BaseMapper<RoomEntity> {
     List<RoomEntity> selectList(String sql);
 
     @SelectProvider(type = BaseProvider.class, method = "selectSql")
+    List<RoomVo> selectVoList(String sql);
+
+    @SelectProvider(type = BaseProvider.class, method = "selectSql")
     RoomEntity selectEntity(String toString);
 
     @SelectProvider(type = BaseProvider.class, method = "selectSql")

+ 2 - 1
gis_cms/src/main/java/com/gis/cms/service/RoomService.java

@@ -19,7 +19,8 @@ public interface RoomService extends IService<RoomEntity> {
 
     Result saveEntity(RoomDto param);
 
-    Result join(String code, Long creatorId);
+//    Result join(String code, Long creatorId);
+    Result join(String code, Long roomId);
 
     Result search(RoomListDto param);
 

+ 116 - 12
gis_cms/src/main/java/com/gis/cms/service/impl/RoomServiceImpl.java

@@ -1,24 +1,30 @@
 package com.gis.cms.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gis.cms.entity.dto.RoomDto;
 import com.gis.cms.entity.dto.RoomListDto;
 import com.gis.cms.entity.po.GameLogEntity;
 import com.gis.cms.entity.po.RoomEntity;
+import com.gis.cms.entity.vo.RoomVo;
 import com.gis.cms.entity.vo.WxUserVo;
 import com.gis.cms.mapper.RoomMapper;
 import com.gis.cms.service.GameLogService;
 import com.gis.cms.service.RoomService;
 import com.gis.common.base.exception.BaseRuntimeException;
 import com.gis.common.base.service.IBaseService;
+import com.gis.common.constant.ErrorEnum;
 import com.gis.common.util.BaseUtil;
 import com.gis.common.util.RedisUtil;
 import com.gis.common.util.Result;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -26,10 +32,13 @@ import org.springframework.stereotype.Service;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 
 /**
@@ -70,9 +79,12 @@ public class RoomServiceImpl extends ServiceImpl<RoomMapper, RoomEntity> impleme
         Long userId = iBaseService.getUserId();
         entity.setCreatorId(userId);
 
-        //检查房间号唯一性
-        RoomEntity room = baseMapper.findByCode(param.getCode(), userId);
-        BaseRuntimeException.isTrue(room != null, null, "房间口令已存在");
+        //检查房间号唯一性, 允许为空
+        String code = param.getCode();
+        if (StringUtils.isNotBlank(code)){
+            RoomEntity room = baseMapper.findByCode(param.getCode(), userId);
+            BaseRuntimeException.isTrue(room != null, null, "房间口令已存在");
+        }
 
         this.save(entity);
         return Result.success(entity);
@@ -80,18 +92,55 @@ public class RoomServiceImpl extends ServiceImpl<RoomMapper, RoomEntity> impleme
 
 
 
+//    @Override
+//    public Result join(String code, Long creatorId) {
+//        RoomEntity roomEntity = baseMapper.findByCode(code, creatorId);
+//        if (roomEntity==null){
+//            log.error("该房间号不存在: {}", code);
+//            return Result.failure("该房间不存在: " + code );
+//        }
+//
+//        LocalDateTime endTime = roomEntity.getEndTime();
+//        BaseRuntimeException.isTrue(endTime.isBefore(LocalDateTime.now())  , null, "活动已结束");
+//
+//        Long roomId = roomEntity.getId();
+//        Long userId = iBaseService.getUserId();
+//        String type = "activity";
+//        // 加入房间记录
+//        GameLogEntity entity = gameLogService.findByRoomIdAndUserId(roomId, userId, type);
+//        if (entity == null){
+//            log.info("需要创建该房间的游戏记录");
+//            // 用户加入房间
+//            entity = new GameLogEntity();
+//            entity.setCreatorId(userId);
+//            entity.setType(type);
+//            entity.setScore(0);
+//            entity.setRoomId(roomId);
+//            gameLogService.save(entity);
+//        }
+//
+//        return Result.success(entity);
+//    }
+
     @Override
-    public Result join(String code, Long creatorId) {
-        RoomEntity roomEntity = baseMapper.findByCode(code, creatorId);
-        if (roomEntity==null){
-            log.error("该房间号不存在: {}", code);
-            return Result.failure("该房间不存在: " + code );
-        }
+    public Result join(String code, Long roomId) {
+//        RoomEntity roomEntity = baseMapper.findByCode(code, creatorId);
+//        if (roomEntity==null){
+//            log.error("该房间号不存在: {}", code);
+//            return Result.failure("该房间不存在: " + code );
+//        }
+
+        RoomEntity roomEntity = this.getById(roomId);
+        BaseRuntimeException.isNull(roomEntity, ErrorEnum.FAILURE_SYS_2001);
 
         LocalDateTime endTime = roomEntity.getEndTime();
         BaseRuntimeException.isTrue(endTime.isBefore(LocalDateTime.now())  , null, "活动已结束");
 
-        Long roomId = roomEntity.getId();
+        // 验证口令
+        if (StringUtils.isNotBlank(code)){
+            BaseRuntimeException.isTrue(!StringUtils.equals(code, roomEntity.getCode()), null, "口令有误");
+        }
+
         Long userId = iBaseService.getUserId();
         String type = "activity";
         // 加入房间记录
@@ -118,7 +167,57 @@ public class RoomServiceImpl extends ServiceImpl<RoomMapper, RoomEntity> impleme
         // 每次请求接口前更新房间状态,使用redis, 缓存30分钟更新一次房间状态
         checkRoomStatus();
         // 获取用户房间列表
-        return Result.success(countByCreatorIdAndDate(param));
+        List<RoomEntity> rooms = countByCreatorIdAndDate(param);
+        // 获取房间用户头像
+       handleAvatarUrlByRoom(rooms);
+
+        return Result.success(rooms);
+    }
+
+    /**
+     * 封装房间头像
+     * @param rooms
+     * @return
+     */
+    private void handleAvatarUrlByRoom(List<RoomEntity> rooms) {
+        // 房间ids
+        List<Long> collect = rooms.stream().map(RoomEntity::getId).collect(Collectors.toList());
+        List<RoomVo> avatars = getAvatarUrlByRoomId(collect);
+        // 按房间分组
+        Map<Long, List<RoomVo>> roomMap = avatars.stream().collect(Collectors.groupingBy(RoomVo::getRoomId));
+        // 同一房间下的头像
+        List<String> roomImg;
+        for (RoomEntity room : rooms) {
+            roomImg = new ArrayList<>();
+            List<RoomVo> roomVos = roomMap.get(room.getId());
+            if (CollectionUtil.isNotEmpty(roomVos)){
+                for (RoomVo roomVo : roomVos) {
+                    roomImg.add(roomVo.getAvatarUrl());
+                }
+                // 更新头像组合
+                room.setAvatarUrls(roomImg);
+            }
+
+        }
+
+    }
+
+    /***
+     * 获取该房间的用户头像
+     * @param roomIds
+     * @return
+     */
+    private List<RoomVo> getAvatarUrlByRoomId(List<Long> roomIds){
+
+        System.out.println("11111: " + roomIds.toArray());
+        String roomIdsStr = CollectionUtil.join(roomIds, ",");
+        StringBuffer sql = new StringBuffer();
+        sql.append("select b.avatar_url, a.room_id, b.id as userId from tb_game_log a left join wx_user b on b.id=a.creator_id where a.is_delete=0 and  a.type='activity' ");
+        sql.append(" and a.room_id in (").append(roomIdsStr).append(")");
+        // 该房间的用户头像
+        List<RoomVo> avatarUrls = baseMapper.selectVoList(sql.toString());
+        return avatarUrls;
+
     }
 
     @Override
@@ -163,6 +262,9 @@ public class RoomServiceImpl extends ServiceImpl<RoomMapper, RoomEntity> impleme
 
 
 
+
+
+
     private List<RoomEntity> countByCreatorIdAndDate(RoomListDto param){
         Long creatorId = iBaseService.getUserId();
         StringBuffer sql = new StringBuffer();
@@ -170,7 +272,9 @@ public class RoomServiceImpl extends ServiceImpl<RoomMapper, RoomEntity> impleme
 
         sql.append("(select *, IF(end_time < NOW(),1,0) statusVo from tb_room where is_delete=0");
         if (param.getIsClose() == 1){
-            sql.append(" and status=1 ");
+            sql.append(" and status=1");
+        } else {
+            sql.append(" and status=0");
         }
 
         if (param.getIsJoin() == 1){