Commit 5d1bdf8e authored by liming's avatar liming

房间模式

parent 5556e11d
......@@ -11,4 +11,6 @@ public class GameMode {
public final static Integer COURSE_TRAINING = 40;
//团练
public final static Integer GROUP_TRAINING = 50;
//房间模式
public final static Integer ROOM_MODE = 60;
}
package com.antai.sport.http.server.constants;
public class RoomModeRecordStatus {
//未结束
public final static Integer UNFINISHED = 10;
//已结束
public final static Integer FINISHED = 20;
}
package com.antai.sport.http.server.constants;
public class RoomModeStatus {
//未结束
public final static Integer UNFINISHED = 10;
//已结束
public final static Integer FINISHED = 20;
}
package com.antai.sport.http.server.repository.roommode.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author liming
* @since 2022-04-11
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class RoomMode implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 房间名称
*/
private String name;
/**
* 地图名称
*/
private String map;
/**
* 路线名称
*/
private String path;
/**
* 距离
*/
private BigDecimal distance;
/**
* 爬坡高度
*/
private BigDecimal climbDistance;
/**
* 玩家数量
*/
private Integer playerNum;
/**
* 是否公开房间 0:不公开 1:公开
*/
private Boolean publicStatus;
/**
* 模式: 10:竞速模式 2:道具模式
*/
private Integer mode;
/**
* 状态 10:未结束 20:已结束
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 修改时间
*/
private LocalDateTime updateTime;
}
package com.antai.sport.http.server.repository.roommode.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
*
* </p>
*
* @author liming
* @since 2022-04-11
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class RoomModePlayerRecord implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 房间id
*/
private Long roomId;
/**
* 玩家id
*/
private Long playerId;
/**
* 比赛用时(秒)
*/
private Integer duration;
/**
* 比赛名次
*/
private Integer matchRank;
/**
* 骑行总长度
*/
private BigDecimal distance;
/**
* 爬坡距离
*/
private BigDecimal climbDistance;
/**
* 平均功率
*/
private BigDecimal avgFtp;
/**
* 平均速度
*/
private BigDecimal avgSpeed;
/**
* 比赛状态10:完成比赛 20:未完成比赛
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 修改时间
*/
private LocalDateTime updateTime;
}
package com.antai.sport.http.server.repository.roommode.mapper;
import com.antai.sport.http.server.repository.roommode.entity.RoomMode;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author liming
* @since 2022-04-11
*/
public interface RoomModeMapper extends BaseMapper<RoomMode> {
}
package com.antai.sport.http.server.repository.roommode.mapper;
import com.antai.sport.http.server.repository.roommode.entity.RoomModePlayerRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author liming
* @since 2022-04-11
*/
public interface RoomModePlayerRecordMapper extends BaseMapper<RoomModePlayerRecord> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.antai.sport.http.server.repository.roommode.mapper.RoomModeMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.antai.sport.http.server.repository.roommode.mapper.RoomModePlayerRecordMapper">
</mapper>
package com.antai.sport.http.server.server.api.business.roommode.conroller;
import com.antai.sport.http.server.common.base.Result;
import com.antai.sport.http.server.server.api.business.roommode.dto.ReqRoomInit;
import com.antai.sport.http.server.server.api.business.roommode.dto.RespRoomInit;
import com.antai.sport.http.server.server.api.business.roommode.service.RoomModeService;
import com.antai.sport.http.server.server.api.common.dto.CyclingDataDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import static com.antai.sport.http.server.common.util.ResultUtil.success;
@RequestMapping("/room/mode")
@RestController
@Api(tags = {"房间模式"})
public class RoomModeController {
@Resource
private RoomModeService roomModeService;
@ApiOperation(value = "初始化房间")
@PostMapping("/init")
public ResponseEntity<Result<RespRoomInit>> init(@RequestBody ReqRoomInit initParam) {
return success(roomModeService.init(initParam));
}
@ApiOperation("记录上传")
@PostMapping("/record/upload")
public ResponseEntity<Result> upload(@RequestBody List<CyclingDataDTO> dataList) {
roomModeService.upload(dataList);
return success();
}
@ApiOperation("关闭房间")
@GetMapping("/close/{roomId}")
public ResponseEntity<Result> closeRoom(@PathVariable("roomId") Long roomId) {
roomModeService.closeRoom(roomId);
return success();
}
}
package com.antai.sport.http.server.server.api.business.roommode.converter;
import com.antai.sport.http.server.repository.roommode.entity.RoomMode;
import com.antai.sport.http.server.repository.roommode.entity.RoomModePlayerRecord;
import com.antai.sport.http.server.server.api.business.roommode.dto.ReqRoomInit;
import com.antai.sport.http.server.server.api.common.dto.CyclingDataDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(componentModel = "spring")
public interface RoomModeConverter {
@Mapping(source = "status",target = "status")
RoomMode roomInitParamToRoomMode(ReqRoomInit reqRoomInit,Integer status);
@Mapping(source = "data.recordId",target = "id")
@Mapping(source = "status",target = "status")
RoomModePlayerRecord toRoomModePlayerRecord(CyclingDataDTO data,Integer status);
}
package com.antai.sport.http.server.server.api.business.roommode.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel("初始化房间对象")
public class ReqRoomInit {
@ApiModelProperty("房间名称")
private String name;
@ApiModelProperty("地图key")
private String map;
@ApiModelProperty("赛道key")
private String path;
@ApiModelProperty("距离(米)")
private BigDecimal distance;
@ApiModelProperty("爬坡高度(米)")
private BigDecimal climbDistance;
@ApiModelProperty("房间是否公开 0:不公开 1:公开")
private Boolean publicStatus ;
@ApiModelProperty("模式: 10:竞速模式 20:道具模式")
private Integer mode;
@ApiModelProperty("用户id列表")
private List<Long> userIdList;
}
package com.antai.sport.http.server.server.api.business.roommode.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
@Data
@ApiModel("房间初始化响应数据")
public class RespRoomInit {
@ApiModelProperty("运动模式 1.自行车 2.跑步")
private Integer sportType;
@ApiModelProperty("模式")
private Integer gameMode;
@ApiModelProperty("房间Id")
private Long roomId;
@ApiModelProperty("用户对应记录字典,key为用户id value为游戏记录id")
private Map<Long, Long> userRecordIdMap;
}
package com.antai.sport.http.server.server.api.business.roommode.service;
import com.antai.sport.http.server.common.exception.BusinessException;
import com.antai.sport.http.server.constants.*;
import com.antai.sport.http.server.repository.roommode.entity.RoomMode;
import com.antai.sport.http.server.repository.roommode.entity.RoomModePlayerRecord;
import com.antai.sport.http.server.repository.roommode.mapper.RoomModeMapper;
import com.antai.sport.http.server.repository.roommode.mapper.RoomModePlayerRecordMapper;
import com.antai.sport.http.server.repository.tour.entity.TourRecord;
import com.antai.sport.http.server.server.api.business.roommode.converter.RoomModeConverter;
import com.antai.sport.http.server.server.api.business.roommode.dto.ReqRoomInit;
import com.antai.sport.http.server.server.api.business.roommode.dto.RespRoomInit;
import com.antai.sport.http.server.server.api.common.dto.CyclingDataDTO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class RoomModeService {
@Resource
private RoomModeMapper roomModeMapper;
@Resource
private RoomModePlayerRecordMapper roomModePlayerRecordMapper;
@Resource
private RoomModeConverter roomModeConverter;
@Transactional
public RespRoomInit init(ReqRoomInit initParam) {
if (initParam.getUserIdList() == null || initParam.getUserIdList().size() == 0) {
throw new BusinessException("没有用户加入到房间");
}
//初始化房间参数
RespRoomInit resp = new RespRoomInit();
resp.setSportType(SportType.BICYCLE);
resp.setGameMode(GameMode.ROOM_MODE);
RoomMode room = roomModeConverter.roomInitParamToRoomMode(initParam,RoomModeStatus.UNFINISHED);
room.setPlayerNum(initParam.getUserIdList().size());
roomModeMapper.insert(room);
resp.setRoomId(room.getId());
//初始化玩家记录
Map<Long, Long> userRecordIdMap = new HashMap<>();
initParam.getUserIdList().forEach(userId -> {
RoomModePlayerRecord record = new RoomModePlayerRecord();
record.setRoomId(room.getId());
record.setPlayerId(userId);
record.setStatus(RoomModeRecordStatus.UNFINISHED);
roomModePlayerRecordMapper.insert(record);
userRecordIdMap.put(userId, record.getId());
});
resp.setUserRecordIdMap(userRecordIdMap);
return resp;
}
/**
* 上传数据
* @param dataList
*/
@Transactional
public void upload(List<CyclingDataDTO> dataList) {
dataList.forEach(item -> {
RoomModePlayerRecord record = roomModeConverter.toRoomModePlayerRecord(item,RoomModeRecordStatus.FINISHED);
roomModePlayerRecordMapper.updateById(record);
});
}
/**
* 关闭房间
* @param roomId
*/
public void closeRoom(Long roomId){
RoomMode roomMode = new RoomMode();
roomMode.setId(roomId);
roomMode.setStatus(RoomModeStatus.FINISHED);
roomModeMapper.updateById(roomMode);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment