通话逻辑
This commit is contained in:
@@ -1,10 +1,18 @@
|
|||||||
package com.ruoyi.cai.chat;
|
package com.ruoyi.cai.chat;
|
||||||
|
|
||||||
|
import com.ruoyi.cai.config.CaiProperties;
|
||||||
import com.ruoyi.cai.domain.CaiAnchor;
|
import com.ruoyi.cai.domain.CaiAnchor;
|
||||||
import com.ruoyi.cai.domain.CaiUser;
|
import com.ruoyi.cai.domain.CaiUser;
|
||||||
import com.ruoyi.cai.dto.app.query.AnchorListQuery;
|
import com.ruoyi.cai.domain.CaiUserCall;
|
||||||
|
import com.ruoyi.cai.dto.app.dto.GuardNum;
|
||||||
import com.ruoyi.cai.dto.app.query.CallReq;
|
import com.ruoyi.cai.dto.app.query.CallReq;
|
||||||
|
import com.ruoyi.cai.dto.app.vo.chat.CallResp;
|
||||||
|
import com.ruoyi.cai.dto.app.vo.chat.GetRoomResp;
|
||||||
|
import com.ruoyi.cai.enums.SystemConfigEnum;
|
||||||
|
import com.ruoyi.cai.manager.SystemConfigManager;
|
||||||
import com.ruoyi.cai.service.CaiAnchorService;
|
import com.ruoyi.cai.service.CaiAnchorService;
|
||||||
|
import com.ruoyi.cai.service.CaiGuardTotalService;
|
||||||
|
import com.ruoyi.cai.service.CaiUserCallService;
|
||||||
import com.ruoyi.cai.service.CaiUserService;
|
import com.ruoyi.cai.service.CaiUserService;
|
||||||
import com.ruoyi.cai.ws.manager.WebSocketManager;
|
import com.ruoyi.cai.ws.manager.WebSocketManager;
|
||||||
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
@@ -13,6 +21,12 @@ import com.ruoyi.common.utils.StringUtils;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class ChatManager {
|
public class ChatManager {
|
||||||
@Autowired
|
@Autowired
|
||||||
@@ -21,27 +35,94 @@ public class ChatManager {
|
|||||||
private CaiAnchorService anchorService;
|
private CaiAnchorService anchorService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private WebSocketManager webSocketManager;
|
private WebSocketManager webSocketManager;
|
||||||
|
@Autowired
|
||||||
|
private CaiUserCallService userCallService;
|
||||||
|
@Autowired
|
||||||
|
private SystemConfigManager systemConfigManager;
|
||||||
|
@Autowired
|
||||||
|
private CaiProperties properties;
|
||||||
|
@Autowired
|
||||||
|
private CaiGuardTotalService guardTotalService;
|
||||||
|
|
||||||
public void call(CallReq callReq){
|
public CallResp call(CallReq callReq){
|
||||||
Long userId = LoginHelper.getUserId();
|
Long userId = LoginHelper.getUserId();
|
||||||
CaiUser formUser = userService.getById(userId);
|
CaiUser fromUser = userService.getById(userId);
|
||||||
CaiUser toUser = userService.getById(callReq.getToUid());
|
CaiUser toUser = userService.getById(callReq.getToUid());
|
||||||
if(toUser.getIsAnchor() != 1){
|
if(toUser.getIsAnchor() != 1){
|
||||||
throw new ServiceException("对方未通过女神认证,不能接听视频");
|
throw new ServiceException("对方未通过女神认证,不能接听视频");
|
||||||
}
|
}
|
||||||
if(formUser.getGender() == 1 && toUser.getGender() == 1){
|
if(fromUser.getGender() == 1 && toUser.getGender() == 1){
|
||||||
throw new ServiceException("主播和主播之间,不可以拨打视频哦~");
|
throw new ServiceException("主播和主播之间,不可以拨打视频哦~");
|
||||||
}
|
}
|
||||||
CaiAnchor anchor = anchorService.getByUserId(toUser.getId());
|
CaiAnchor anchor = anchorService.getByUserId(toUser.getId());
|
||||||
if(anchor == null){
|
if(anchor == null){
|
||||||
throw new ServiceException("主播技能不存在");
|
throw new ServiceException("主播技能不存在");
|
||||||
}
|
}
|
||||||
String roomId = webSocketManager.checkOnlineRoom(formUser.getId(), toUser.getId());
|
String roomId = webSocketManager.checkOnlineRoom(fromUser.getId(), toUser.getId());
|
||||||
if (StringUtils.isNotEmpty(roomId)) {
|
if(StringUtils.isEmpty(roomId)){
|
||||||
|
CaiUserCall call = userCallService.createCall(fromUser, toUser, anchor);
|
||||||
|
roomId = webSocketManager.createRoom(call.getId());
|
||||||
|
}
|
||||||
|
String weSocketUrl = String.format(properties.getWebSocketUrl(),"token",roomId);
|
||||||
|
Long guardPrice = systemConfigManager.getSystemConfigOfLong(SystemConfigEnum.GUARD_PRICE);
|
||||||
|
// 获取鉴黄规则 TODO
|
||||||
|
CallResp callResp = new CallResp();
|
||||||
|
callResp.setRoomId(roomId);
|
||||||
|
callResp.setFromUid(fromUser.getId());
|
||||||
|
callResp.setFromNickname(fromUser.getNickname());
|
||||||
|
callResp.setFromAvatar(fromUser.getAvatar());
|
||||||
|
callResp.setToUid(toUser.getId());
|
||||||
|
callResp.setToNickname(toUser.getNickname());
|
||||||
|
callResp.setToAvatar(toUser.getAvatar());
|
||||||
|
callResp.setSocketUrl(weSocketUrl);
|
||||||
|
callResp.setSkillName(anchor.getSkillName());
|
||||||
|
callResp.setSkillIcon(anchor.getSkillIcon());
|
||||||
|
callResp.setPrice(anchor.getPrice());
|
||||||
|
callResp.setScore(anchor.getGiveScore());
|
||||||
|
callResp.setServiceCount(anchor.getServiceCount());
|
||||||
|
callResp.setServiceTime(anchor.getServiceTime());
|
||||||
|
GuardNum guardNum = guardTotalService.getGuardNum(fromUser.getId(), toUser.getId());
|
||||||
|
callResp.setGuardDiffNum(guardNum.getDiffNum());
|
||||||
|
callResp.setGuardPrice(guardPrice);
|
||||||
|
return callResp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GetRoomResp getRoom(String roomId){
|
||||||
|
Long userId = LoginHelper.getUserId();
|
||||||
|
CaiUserCall userCall = userCallService.getById(roomId);
|
||||||
|
if(userCall == null){
|
||||||
|
throw new ServiceException("房间不存在");
|
||||||
|
}
|
||||||
|
if(!userCall.getFromUid().equals(userId) && !userCall.getToUid().equals(userId)){
|
||||||
|
throw new ServiceException("无权限操作房间");
|
||||||
|
}
|
||||||
|
String roomIdNew = webSocketManager.checkOnlineRoom(userCall.getFromUid(), userCall.getToUid());
|
||||||
|
if (StringUtils.isNotEmpty(roomIdNew)) {
|
||||||
throw new ServiceException("'服务繁忙'");
|
throw new ServiceException("'服务繁忙'");
|
||||||
}
|
}
|
||||||
|
// 判断房间号是否还存在 TODO
|
||||||
|
List<CaiUser> userList = userService.listByIds(Arrays.asList(userCall.getFromUid(), userCall.getToUid()));
|
||||||
|
Map<Long, CaiUser> userMap = userList.stream().collect(Collectors.toMap(CaiUser::getId, Function.identity()));
|
||||||
|
CaiUser fromUser = userMap.get(userCall.getFromUid());
|
||||||
|
CaiUser toUser = userMap.get(userCall.getToUid());
|
||||||
|
CaiAnchor anchor = anchorService.getByUserId(toUser.getId());
|
||||||
|
String weSocketUrl = String.format(properties.getWebSocketUrl(),"token",roomId);
|
||||||
|
GetRoomResp getRoomResp = new GetRoomResp();
|
||||||
|
getRoomResp.setRoomId(userCall.getId()+"");
|
||||||
|
getRoomResp.setFromUid(userCall.getFromUid());
|
||||||
|
getRoomResp.setFromNickname(fromUser.getNickname());
|
||||||
|
getRoomResp.setFromAvatar(fromUser.getAvatar());
|
||||||
|
getRoomResp.setToUid(userCall.getToUid());
|
||||||
|
getRoomResp.setToNickname(toUser.getNickname());
|
||||||
|
getRoomResp.setToAvatar(toUser.getAvatar());
|
||||||
|
getRoomResp.setSocketUrl(weSocketUrl);
|
||||||
|
getRoomResp.setSkillName(anchor.getSkillName());
|
||||||
|
getRoomResp.setSkillIcon(anchor.getSkillIcon());
|
||||||
|
getRoomResp.setPrice(anchor.getPrice());
|
||||||
|
getRoomResp.setScore(anchor.getGiveScore());
|
||||||
|
getRoomResp.setServiceCount(anchor.getServiceCount());
|
||||||
|
getRoomResp.setServiceTime(anchor.getServiceTime());
|
||||||
|
return getRoomResp;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.ruoyi.cai.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties(prefix = "cai")
|
||||||
|
public class CaiProperties {
|
||||||
|
|
||||||
|
private String webSocketUrl = "ws://localhost:8080?token=%s&room_id=%s";
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.ruoyi.cai.constant;
|
||||||
|
|
||||||
|
public class RedisConstant {
|
||||||
|
public static final String REDIS_P = "cai-";
|
||||||
|
public static final String SYSTEM_CONFIG = REDIS_P + "system-config";
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package com.ruoyi.cai.controller;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import com.ruoyi.cai.domain.CaiUserInvite;
|
||||||
|
import com.ruoyi.cai.service.CaiUserInviteService;
|
||||||
|
import com.ruoyi.common.annotation.Log;
|
||||||
|
import com.ruoyi.common.annotation.RepeatSubmit;
|
||||||
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
|
import com.ruoyi.common.core.domain.PageQuery;
|
||||||
|
import com.ruoyi.common.core.domain.R;
|
||||||
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
|
import com.ruoyi.common.core.validate.AddGroup;
|
||||||
|
import com.ruoyi.common.core.validate.EditGroup;
|
||||||
|
import com.ruoyi.common.enums.BusinessType;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户邀请
|
||||||
|
*
|
||||||
|
* @author 77
|
||||||
|
* @date 2023-12-28
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/cai/userInvite")
|
||||||
|
public class CaiUserInviteController extends BaseController {
|
||||||
|
|
||||||
|
private final CaiUserInviteService caiUserInviteService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询用户邀请列表
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("cai:userInvite:list")
|
||||||
|
@GetMapping("/list")
|
||||||
|
public TableDataInfo<CaiUserInvite> list(CaiUserInvite bo, PageQuery pageQuery) {
|
||||||
|
Page<CaiUserInvite> page = caiUserInviteService.page(pageQuery.build(), Wrappers.lambdaQuery(bo));
|
||||||
|
return TableDataInfo.build(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户邀请详细信息
|
||||||
|
*
|
||||||
|
* @param id 主键
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("cai:userInvite:query")
|
||||||
|
@GetMapping("/{id}")
|
||||||
|
public R<CaiUserInvite> getInfo(@NotNull(message = "主键不能为空")
|
||||||
|
@PathVariable Long id) {
|
||||||
|
return R.ok(caiUserInviteService.getById(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增用户邀请
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("cai:userInvite:add")
|
||||||
|
@Log(title = "用户邀请", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping()
|
||||||
|
public R<Void> add(@Validated(AddGroup.class) @RequestBody CaiUserInvite bo) {
|
||||||
|
return toAjax(caiUserInviteService.save(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改用户邀请
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("cai:userInvite:edit")
|
||||||
|
@Log(title = "用户邀请", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping()
|
||||||
|
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CaiUserInvite bo) {
|
||||||
|
return toAjax(caiUserInviteService.updateById(bo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除用户邀请
|
||||||
|
*
|
||||||
|
* @param ids 主键串
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("cai:userInvite:remove")
|
||||||
|
@Log(title = "用户邀请", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{ids}")
|
||||||
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@PathVariable Long[] ids) {
|
||||||
|
return toAjax(caiUserInviteService.removeBatchByIds(Arrays.asList(ids), true));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,6 +33,8 @@ public class CaiAnchor implements Serializable{
|
|||||||
* 技能ID
|
* 技能ID
|
||||||
*/
|
*/
|
||||||
private Integer skillId;
|
private Integer skillId;
|
||||||
|
private String skillName;
|
||||||
|
private String skillIcon;
|
||||||
/**
|
/**
|
||||||
* 价格,默认50彩币
|
* 价格,默认50彩币
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package com.ruoyi.cai.domain;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户邀请对象 cai_user_invite
|
||||||
|
*
|
||||||
|
* @author 77
|
||||||
|
* @date 2023-12-28
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@TableName("cai_user_invite")
|
||||||
|
public class CaiUserInvite implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID=1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
@TableId(value = "id")
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 用户(被邀请人)
|
||||||
|
*/
|
||||||
|
private Long userId;
|
||||||
|
/**
|
||||||
|
* 邀请人
|
||||||
|
*/
|
||||||
|
private Long inviteId;
|
||||||
|
/**
|
||||||
|
* 奖励好友收入的比率
|
||||||
|
*/
|
||||||
|
private BigDecimal rewardIncomeRate;
|
||||||
|
/**
|
||||||
|
* 奖励好友充值的比率
|
||||||
|
*/
|
||||||
|
private BigDecimal rewardRechargeRate;
|
||||||
|
/**
|
||||||
|
* 邀请奖励汇总
|
||||||
|
*/
|
||||||
|
private BigDecimal rewardMoneyTotal;
|
||||||
|
/**
|
||||||
|
* 是否有效 0=无效 1=有效
|
||||||
|
*/
|
||||||
|
private Integer isValid;
|
||||||
|
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.ruoyi.cai.dto.app.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class GuardNum implements Serializable {
|
||||||
|
private Long myGuardNum;
|
||||||
|
private Long upGuardNum;
|
||||||
|
|
||||||
|
private Long diffNum;
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.ruoyi.cai.dto.app.vo.chat;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Schema(description = "拨打视频返回模型")
|
||||||
|
public class CallResp {
|
||||||
|
@Schema(description = "房间号")
|
||||||
|
private String roomId;
|
||||||
|
@Schema(description = "拨打者-用户ID")
|
||||||
|
private Long fromUid;
|
||||||
|
@Schema(description = "拨打者-昵称")
|
||||||
|
private String fromNickname;
|
||||||
|
@Schema(description = "拨打者-头像")
|
||||||
|
private String fromAvatar;
|
||||||
|
@Schema(description = "接收者-用户ID")
|
||||||
|
private Long toUid;
|
||||||
|
@Schema(description = "接收者-昵称")
|
||||||
|
private String toNickname;
|
||||||
|
@Schema(description = "接收者-头像")
|
||||||
|
private String toAvatar;
|
||||||
|
@Schema(description = "wsUrl")
|
||||||
|
private String socketUrl;
|
||||||
|
@Schema(description = "技能名称")
|
||||||
|
private String skillName;
|
||||||
|
@Schema(description = "技能头像")
|
||||||
|
private String skillIcon;
|
||||||
|
@Schema(description = "价格")
|
||||||
|
private Long price;
|
||||||
|
@Schema(description = "评分")
|
||||||
|
private BigDecimal score;
|
||||||
|
|
||||||
|
@Schema(description = "服务次数")
|
||||||
|
private Long serviceCount;
|
||||||
|
@Schema(description = "服务时间")
|
||||||
|
private Long serviceTime;
|
||||||
|
@Schema(description = "距离上一个守护数量")
|
||||||
|
private Long guardDiffNum;
|
||||||
|
@Schema(description = "守护价格")
|
||||||
|
private Long guardPrice;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.ruoyi.cai.dto.app.vo.chat;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class GetRoomResp {
|
||||||
|
@Schema(description = "房间号")
|
||||||
|
private String roomId;
|
||||||
|
@Schema(description = "拨打者-用户ID")
|
||||||
|
private Long fromUid;
|
||||||
|
@Schema(description = "拨打者-昵称")
|
||||||
|
private String fromNickname;
|
||||||
|
@Schema(description = "拨打者-头像")
|
||||||
|
private String fromAvatar;
|
||||||
|
@Schema(description = "接收者-用户ID")
|
||||||
|
private Long toUid;
|
||||||
|
@Schema(description = "接收者-昵称")
|
||||||
|
private String toNickname;
|
||||||
|
@Schema(description = "接收者-头像")
|
||||||
|
private String toAvatar;
|
||||||
|
@Schema(description = "wsUrl")
|
||||||
|
private String socketUrl;
|
||||||
|
@Schema(description = "技能名称")
|
||||||
|
private String skillName;
|
||||||
|
@Schema(description = "技能头像")
|
||||||
|
private String skillIcon;
|
||||||
|
@Schema(description = "价格")
|
||||||
|
private Long price;
|
||||||
|
@Schema(description = "评分")
|
||||||
|
private BigDecimal score;
|
||||||
|
|
||||||
|
@Schema(description = "服务次数")
|
||||||
|
private Long serviceCount;
|
||||||
|
@Schema(description = "服务时间")
|
||||||
|
private Long serviceTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.ruoyi.cai.enums;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统动态配置枚举
|
||||||
|
* <p>created on 2022/8/18 17:15</p>
|
||||||
|
*
|
||||||
|
* @author ZL
|
||||||
|
*/
|
||||||
|
public enum SystemConfigEnum {
|
||||||
|
GUARD_PRICE("1314", "守护价格"),
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final String defaultValue;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final String desc;
|
||||||
|
|
||||||
|
SystemConfigEnum(String defaultValue, String desc) {
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
this.desc = desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return this.name();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package com.ruoyi.cai.manager;
|
||||||
|
|
||||||
|
import com.ruoyi.cai.constant.RedisConstant;
|
||||||
|
import com.ruoyi.cai.enums.SystemConfigEnum;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.redis.core.HashOperations;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主要用于动态配置管理
|
||||||
|
* <p>created on 2022/8/18 17:21</p>
|
||||||
|
* @author ZL
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class SystemConfigManager {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private StringRedisTemplate redisTemplate;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取配置信息返回boolean
|
||||||
|
* @param systemConfig
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean getSystemConfigOfBool(SystemConfigEnum systemConfig){
|
||||||
|
String value = getSystemConfig(systemConfig);
|
||||||
|
return "1".equals(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取配置信息返回Integer
|
||||||
|
* @param systemConfig
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Integer getSystemConfigOfInt(SystemConfigEnum systemConfig){
|
||||||
|
String value = getSystemConfig(systemConfig);
|
||||||
|
return Integer.valueOf(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取配置信息返回Integer
|
||||||
|
* @param systemConfig
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Long getSystemConfigOfLong(SystemConfigEnum systemConfig){
|
||||||
|
String value = getSystemConfig(systemConfig);
|
||||||
|
return Long.valueOf(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取配置信息
|
||||||
|
* @param systemConfig
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getSystemConfig(SystemConfigEnum systemConfig){
|
||||||
|
String value = (String) redisTemplate.opsForHash().get(RedisConstant.SYSTEM_CONFIG, systemConfig.name());
|
||||||
|
if(StringUtils.isBlank(value)){
|
||||||
|
return systemConfig.getDefaultValue();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<String> getSystemConfigOfList(SystemConfigEnum systemConfig){
|
||||||
|
String value = getSystemConfig(systemConfig);
|
||||||
|
if(StringUtils.isBlank(value)){
|
||||||
|
value = systemConfig.getDefaultValue();
|
||||||
|
}
|
||||||
|
return Stream.of(value.split(",")).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有配置
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Map<String,String> getAllSystemConfig(){
|
||||||
|
HashOperations<String, String, String> stringObjectObjectHashOperations = redisTemplate.opsForHash();
|
||||||
|
return stringObjectObjectHashOperations.entries(RedisConstant.SYSTEM_CONFIG);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setSystemConfig(SystemConfigEnum systemConfig,String value){
|
||||||
|
redisTemplate.opsForHash().put(RedisConstant.SYSTEM_CONFIG, systemConfig.name(),value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package com.ruoyi.cai.mapper;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.ruoyi.cai.domain.CaiUserInvite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户邀请Mapper接口
|
||||||
|
*
|
||||||
|
* @author 77
|
||||||
|
* @date 2023-12-28
|
||||||
|
*/
|
||||||
|
public interface CaiUserInviteMapper extends BaseMapper<CaiUserInvite> {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.ruoyi.cai.service;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.ruoyi.cai.domain.CaiGuardTotal;
|
import com.ruoyi.cai.domain.CaiGuardTotal;
|
||||||
|
import com.ruoyi.cai.dto.app.dto.GuardNum;
|
||||||
import com.ruoyi.cai.dto.app.query.GiveGuardReq;
|
import com.ruoyi.cai.dto.app.query.GiveGuardReq;
|
||||||
import com.ruoyi.cai.dto.app.vo.GuardTotalVo;
|
import com.ruoyi.cai.dto.app.vo.GuardTotalVo;
|
||||||
|
|
||||||
@@ -18,4 +19,6 @@ public interface CaiGuardTotalService extends IService<CaiGuardTotal> {
|
|||||||
List<GuardTotalVo> selectGuardTotalLimit(Long fromUserId,Integer limit);
|
List<GuardTotalVo> selectGuardTotalLimit(Long fromUserId,Integer limit);
|
||||||
|
|
||||||
boolean giveGuard(GiveGuardReq query);
|
boolean giveGuard(GiveGuardReq query);
|
||||||
|
|
||||||
|
GuardNum getGuardNum(Long fromUserId, Long toUserId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,4 +11,5 @@ import com.ruoyi.cai.domain.CaiUnionUser;
|
|||||||
*/
|
*/
|
||||||
public interface CaiUnionUserService extends IService<CaiUnionUser> {
|
public interface CaiUnionUserService extends IService<CaiUnionUser> {
|
||||||
|
|
||||||
|
CaiUnionUser getByUserId(Long userId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.ruoyi.cai.service;
|
package com.ruoyi.cai.service;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.ruoyi.cai.domain.CaiAnchor;
|
||||||
|
import com.ruoyi.cai.domain.CaiUser;
|
||||||
import com.ruoyi.cai.domain.CaiUserCall;
|
import com.ruoyi.cai.domain.CaiUserCall;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -11,4 +13,5 @@ import com.ruoyi.cai.domain.CaiUserCall;
|
|||||||
*/
|
*/
|
||||||
public interface CaiUserCallService extends IService<CaiUserCall> {
|
public interface CaiUserCallService extends IService<CaiUserCall> {
|
||||||
|
|
||||||
|
CaiUserCall createCall(CaiUser fromUser, CaiUser toUser, CaiAnchor anchor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.ruoyi.cai.service;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import com.ruoyi.cai.domain.CaiUserInvite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户邀请Service接口
|
||||||
|
*
|
||||||
|
* @author 77
|
||||||
|
* @date 2023-12-28
|
||||||
|
*/
|
||||||
|
public interface CaiUserInviteService extends IService<CaiUserInvite> {
|
||||||
|
|
||||||
|
CaiUserInvite getByUserId(Long id);
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.ruoyi.cai.domain.CaiGuardTotal;
|
import com.ruoyi.cai.domain.CaiGuardTotal;
|
||||||
import com.ruoyi.cai.domain.CaiUser;
|
import com.ruoyi.cai.domain.CaiUser;
|
||||||
|
import com.ruoyi.cai.dto.app.dto.GuardNum;
|
||||||
import com.ruoyi.cai.dto.app.query.GiveGuardReq;
|
import com.ruoyi.cai.dto.app.query.GiveGuardReq;
|
||||||
import com.ruoyi.cai.dto.app.vo.GuardTotalVo;
|
import com.ruoyi.cai.dto.app.vo.GuardTotalVo;
|
||||||
import com.ruoyi.cai.mapper.CaiGuardTotalMapper;
|
import com.ruoyi.cai.mapper.CaiGuardTotalMapper;
|
||||||
@@ -67,4 +68,25 @@ public class CaiGuardTotalServiceImpl extends ServiceImpl<CaiGuardTotalMapper,Ca
|
|||||||
baseMapper.incs(fromUserId,query.getToUserId(),query.getGuardNum(),guardValue);
|
baseMapper.incs(fromUserId,query.getToUserId(),query.getGuardNum(),guardValue);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuardNum getGuardNum(Long fromUserId, Long toUserId){
|
||||||
|
GuardNum num = new GuardNum();
|
||||||
|
CaiGuardTotal one = this.getOne(Wrappers.lambdaQuery(CaiGuardTotal.class)
|
||||||
|
.select(CaiGuardTotal::getGuardNum)
|
||||||
|
.eq(CaiGuardTotal::getFromUserId, fromUserId)
|
||||||
|
.eq(CaiGuardTotal::getToUserId, toUserId)
|
||||||
|
.last("limit 1"));
|
||||||
|
Long myGuardNum = one == null ? 0 : one.getGuardNum();
|
||||||
|
CaiGuardTotal up = this.getOne(Wrappers.lambdaQuery(CaiGuardTotal.class)
|
||||||
|
.eq(CaiGuardTotal::getToUserId, toUserId)
|
||||||
|
.ge(CaiGuardTotal::getGuardNum, myGuardNum)
|
||||||
|
.orderByAsc(CaiGuardTotal::getGuardNum)
|
||||||
|
.last("limit 1"));
|
||||||
|
Long upGuardNum = up == null ? 0L : up.getGuardNum();
|
||||||
|
num.setMyGuardNum(myGuardNum);
|
||||||
|
num.setUpGuardNum(upGuardNum);
|
||||||
|
num.setDiffNum((upGuardNum - myGuardNum) < 0 ? 0 : (upGuardNum - myGuardNum));
|
||||||
|
return num;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.ruoyi.cai.service.impl;
|
package com.ruoyi.cai.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.ruoyi.cai.domain.CaiUnionUser;
|
import com.ruoyi.cai.domain.CaiUnionUser;
|
||||||
import com.ruoyi.cai.mapper.CaiUnionUserMapper;
|
import com.ruoyi.cai.mapper.CaiUnionUserMapper;
|
||||||
@@ -15,4 +16,10 @@ import org.springframework.stereotype.Service;
|
|||||||
@Service
|
@Service
|
||||||
public class CaiUnionUserServiceImpl extends ServiceImpl<CaiUnionUserMapper,CaiUnionUser> implements CaiUnionUserService {
|
public class CaiUnionUserServiceImpl extends ServiceImpl<CaiUnionUserMapper,CaiUnionUser> implements CaiUnionUserService {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CaiUnionUser getByUserId(Long userId){
|
||||||
|
return this.getOne(Wrappers.lambdaQuery(CaiUnionUser.class)
|
||||||
|
.eq(CaiUnionUser::getUserId, userId)
|
||||||
|
.last("limit 1"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
package com.ruoyi.cai.service.impl;
|
package com.ruoyi.cai.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.ruoyi.cai.domain.CaiUserCall;
|
import com.ruoyi.cai.domain.*;
|
||||||
import com.ruoyi.cai.mapper.CaiUserCallMapper;
|
import com.ruoyi.cai.mapper.CaiUserCallMapper;
|
||||||
|
import com.ruoyi.cai.service.CaiAccountService;
|
||||||
|
import com.ruoyi.cai.service.CaiUnionUserService;
|
||||||
import com.ruoyi.cai.service.CaiUserCallService;
|
import com.ruoyi.cai.service.CaiUserCallService;
|
||||||
|
import com.ruoyi.cai.service.CaiUserInviteService;
|
||||||
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -17,4 +22,48 @@ import org.springframework.stereotype.Service;
|
|||||||
@Service
|
@Service
|
||||||
public class CaiUserCallServiceImpl extends ServiceImpl<CaiUserCallMapper,CaiUserCall> implements CaiUserCallService {
|
public class CaiUserCallServiceImpl extends ServiceImpl<CaiUserCallMapper,CaiUserCall> implements CaiUserCallService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CaiAccountService accountService;
|
||||||
|
@Autowired
|
||||||
|
private CaiUserInviteService inviteService;
|
||||||
|
@Autowired
|
||||||
|
private CaiUnionUserService unionUserService;
|
||||||
|
@Override
|
||||||
|
public CaiUserCall createCall(CaiUser fromUser, CaiUser toUser, CaiAnchor anchor) {
|
||||||
|
Long fromUid = fromUser.getId();
|
||||||
|
// 特殊用户不允许拨打电话
|
||||||
|
if(fromUid.equals(toUser.getId())){
|
||||||
|
throw new ServiceException("不能给自己拨打哦!");
|
||||||
|
}
|
||||||
|
if(anchor == null){
|
||||||
|
throw new ServiceException("主播技能不存在");
|
||||||
|
}
|
||||||
|
if(anchor.getOpenVideoStatus() == 0){
|
||||||
|
throw new ServiceException("对方未开启视频接听!");
|
||||||
|
}
|
||||||
|
CaiAccount account = accountService.getByUserId(fromUid);
|
||||||
|
if(account.getIncomeCoin() + account.getCoin() < anchor.getPrice() * 2){
|
||||||
|
throw new ServiceException("你的紫贝不足!");
|
||||||
|
}
|
||||||
|
CaiUserCall caiUserCall = new CaiUserCall();
|
||||||
|
caiUserCall.setFromUid(fromUid);
|
||||||
|
caiUserCall.setToUid(toUser.getId());
|
||||||
|
caiUserCall.setCallPrice(anchor.getPrice());
|
||||||
|
caiUserCall.setReceiverVideoDivide(anchor.getVideoRate());
|
||||||
|
CaiUnionUser unionUser = unionUserService.getByUserId(toUser.getId());
|
||||||
|
if(unionUser != null && unionUser.getType() == 1){
|
||||||
|
caiUserCall.setReceiverUnionUserId(unionUser.getUserId());
|
||||||
|
caiUserCall.setReceiverUnionVideoDivide(unionUser.getVideoDivide());
|
||||||
|
}
|
||||||
|
CaiUserInvite invite = inviteService.getByUserId(toUser.getId());
|
||||||
|
if(invite != null){
|
||||||
|
caiUserCall.setReceiverInviteUserId(invite.getInviteId());
|
||||||
|
caiUserCall.setReceiverIncomeDivide(invite.getRewardIncomeRate());
|
||||||
|
}
|
||||||
|
boolean save = this.save(caiUserCall);
|
||||||
|
if(!save){
|
||||||
|
throw new ServiceException("添加通话失败!");
|
||||||
|
}
|
||||||
|
return caiUserCall;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.ruoyi.cai.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.ruoyi.cai.domain.CaiUserInvite;
|
||||||
|
import com.ruoyi.cai.mapper.CaiUserInviteMapper;
|
||||||
|
import com.ruoyi.cai.service.CaiUserInviteService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户邀请Service业务层处理
|
||||||
|
*
|
||||||
|
* @author 77
|
||||||
|
* @date 2023-12-28
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class CaiUserInviteServiceImpl extends ServiceImpl<CaiUserInviteMapper,CaiUserInvite> implements CaiUserInviteService {
|
||||||
|
@Override
|
||||||
|
public CaiUserInvite getByUserId(Long id) {
|
||||||
|
return this.getOne(Wrappers.lambdaQuery(CaiUserInvite.class).eq(CaiUserInvite::getUserId,id).last("limit 1"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,4 +7,8 @@ public class WebSocketManager {
|
|||||||
public String checkOnlineRoom(Long formUserId,Long toUserId){
|
public String checkOnlineRoom(Long formUserId,Long toUserId){
|
||||||
return "name";
|
return "name";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String createRoom(Long id) {
|
||||||
|
return "123";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?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.ruoyi.cai.mapper.CaiUserInviteMapper">
|
||||||
|
|
||||||
|
<resultMap type="com.ruoyi.cai.domain.CaiUserInvite" id="CaiUserInviteResult">
|
||||||
|
<result property="id" column="id"/>
|
||||||
|
<result property="userId" column="user_id"/>
|
||||||
|
<result property="inviteId" column="invite_id"/>
|
||||||
|
<result property="rewardIncomeRate" column="reward_income_rate"/>
|
||||||
|
<result property="rewardRechargeRate" column="reward_recharge_rate"/>
|
||||||
|
<result property="rewardMoneyTotal" column="reward_money_total"/>
|
||||||
|
<result property="createTime" column="create_time"/>
|
||||||
|
<result property="isValid" column="is_valid"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
|
||||||
|
</mapper>
|
||||||
Reference in New Issue
Block a user