diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java index 3d446147..1e9dd1de 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java @@ -1,10 +1,18 @@ package com.ruoyi.cai.chat; +import com.ruoyi.cai.config.CaiProperties; import com.ruoyi.cai.domain.CaiAnchor; 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.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.CaiGuardTotalService; +import com.ruoyi.cai.service.CaiUserCallService; import com.ruoyi.cai.service.CaiUserService; import com.ruoyi.cai.ws.manager.WebSocketManager; 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.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 public class ChatManager { @Autowired @@ -21,27 +35,94 @@ public class ChatManager { private CaiAnchorService anchorService; @Autowired 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(); - CaiUser formUser = userService.getById(userId); + CaiUser fromUser = userService.getById(userId); CaiUser toUser = userService.getById(callReq.getToUid()); if(toUser.getIsAnchor() != 1){ throw new ServiceException("对方未通过女神认证,不能接听视频"); } - if(formUser.getGender() == 1 && toUser.getGender() == 1){ + if(fromUser.getGender() == 1 && toUser.getGender() == 1){ throw new ServiceException("主播和主播之间,不可以拨打视频哦~"); } CaiAnchor anchor = anchorService.getByUserId(toUser.getId()); if(anchor == null){ throw new ServiceException("主播技能不存在"); } - String roomId = webSocketManager.checkOnlineRoom(formUser.getId(), toUser.getId()); - if (StringUtils.isNotEmpty(roomId)) { + String roomId = webSocketManager.checkOnlineRoom(fromUser.getId(), toUser.getId()); + 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("'服务繁忙'"); } - - + // 判断房间号是否还存在 TODO + List userList = userService.listByIds(Arrays.asList(userCall.getFromUid(), userCall.getToUid())); + Map 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; } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/config/CaiProperties.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/config/CaiProperties.java new file mode 100644 index 00000000..e0a62d20 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/config/CaiProperties.java @@ -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"; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisConstant.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisConstant.java new file mode 100644 index 00000000..2fbd6a01 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/constant/RedisConstant.java @@ -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"; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/CaiUserInviteController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/CaiUserInviteController.java new file mode 100644 index 00000000..6fa1ff10 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/CaiUserInviteController.java @@ -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 list(CaiUserInvite bo, PageQuery pageQuery) { + Page page = caiUserInviteService.page(pageQuery.build(), Wrappers.lambdaQuery(bo)); + return TableDataInfo.build(page); + } + + /** + * 获取用户邀请详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("cai:userInvite:query") + @GetMapping("/{id}") + public R 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 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 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 remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(caiUserInviteService.removeBatchByIds(Arrays.asList(ids), true)); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java index c05cf467..23832103 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiAnchor.java @@ -33,6 +33,8 @@ public class CaiAnchor implements Serializable{ * 技能ID */ private Integer skillId; + private String skillName; + private String skillIcon; /** * 价格,默认50彩币 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserInvite.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserInvite.java new file mode 100644 index 00000000..38b5da1a --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserInvite.java @@ -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; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/GuardNum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/GuardNum.java new file mode 100644 index 00000000..b50a4deb --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/dto/GuardNum.java @@ -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; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/chat/CallResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/chat/CallResp.java new file mode 100644 index 00000000..2b099f75 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/chat/CallResp.java @@ -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; + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/chat/GetRoomResp.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/chat/GetRoomResp.java new file mode 100644 index 00000000..68da580e --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/chat/GetRoomResp.java @@ -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; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java new file mode 100644 index 00000000..2cfbac00 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/SystemConfigEnum.java @@ -0,0 +1,31 @@ +package com.ruoyi.cai.enums; + +import lombok.Getter; + +/** + * 系统动态配置枚举 + *

created on 2022/8/18 17:15

+ * + * @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(); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java new file mode 100644 index 00000000..6baa9fb5 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/SystemConfigManager.java @@ -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; + +/** + * 主要用于动态配置管理 + *

created on 2022/8/18 17:21

+ * @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 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 getAllSystemConfig(){ + HashOperations 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); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/CaiUserInviteMapper.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/CaiUserInviteMapper.java new file mode 100644 index 00000000..74223bc1 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mapper/CaiUserInviteMapper.java @@ -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 { + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiGuardTotalService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiGuardTotalService.java index 7ab87ad7..f15457d3 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiGuardTotalService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiGuardTotalService.java @@ -2,6 +2,7 @@ package com.ruoyi.cai.service; import com.baomidou.mybatisplus.extension.service.IService; 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.vo.GuardTotalVo; @@ -18,4 +19,6 @@ public interface CaiGuardTotalService extends IService { List selectGuardTotalLimit(Long fromUserId,Integer limit); boolean giveGuard(GiveGuardReq query); + + GuardNum getGuardNum(Long fromUserId, Long toUserId); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUnionUserService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUnionUserService.java index 98ba6cd1..c2ea147a 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUnionUserService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUnionUserService.java @@ -11,4 +11,5 @@ import com.ruoyi.cai.domain.CaiUnionUser; */ public interface CaiUnionUserService extends IService { + CaiUnionUser getByUserId(Long userId); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserCallService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserCallService.java index 9e0224eb..d146a5db 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserCallService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserCallService.java @@ -1,6 +1,8 @@ package com.ruoyi.cai.service; 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; /** @@ -11,4 +13,5 @@ import com.ruoyi.cai.domain.CaiUserCall; */ public interface CaiUserCallService extends IService { + CaiUserCall createCall(CaiUser fromUser, CaiUser toUser, CaiAnchor anchor); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserInviteService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserInviteService.java new file mode 100644 index 00000000..15f1e732 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserInviteService.java @@ -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 getByUserId(Long id); +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java index c9cf716c..9697eb12 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiGuardTotalServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cai.domain.CaiGuardTotal; 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.vo.GuardTotalVo; import com.ruoyi.cai.mapper.CaiGuardTotalMapper; @@ -67,4 +68,25 @@ public class CaiGuardTotalServiceImpl extends ServiceImpl implements CaiUnionUserService { + @Override + public CaiUnionUser getByUserId(Long userId){ + return this.getOne(Wrappers.lambdaQuery(CaiUnionUser.class) + .eq(CaiUnionUser::getUserId, userId) + .last("limit 1")); + } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserCallServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserCallServiceImpl.java index fbba0729..84900a60 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserCallServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserCallServiceImpl.java @@ -1,10 +1,15 @@ package com.ruoyi.cai.service.impl; 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.service.CaiAccountService; +import com.ruoyi.cai.service.CaiUnionUserService; import com.ruoyi.cai.service.CaiUserCallService; +import com.ruoyi.cai.service.CaiUserInviteService; +import com.ruoyi.common.exception.ServiceException; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -17,4 +22,48 @@ import org.springframework.stereotype.Service; @Service public class CaiUserCallServiceImpl extends ServiceImpl 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; + } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserInviteServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserInviteServiceImpl.java new file mode 100644 index 00000000..0b00bcb4 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserInviteServiceImpl.java @@ -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 implements CaiUserInviteService { + @Override + public CaiUserInvite getByUserId(Long id) { + return this.getOne(Wrappers.lambdaQuery(CaiUserInvite.class).eq(CaiUserInvite::getUserId,id).last("limit 1")); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/manager/WebSocketManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/manager/WebSocketManager.java index ae332704..0ce8b93e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/manager/WebSocketManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/manager/WebSocketManager.java @@ -7,4 +7,8 @@ public class WebSocketManager { public String checkOnlineRoom(Long formUserId,Long toUserId){ return "name"; } + + public String createRoom(Long id) { + return "123"; + } } diff --git a/ruoyi-cai/src/main/resources/mapper/cai/CaiUserInviteMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/CaiUserInviteMapper.xml new file mode 100644 index 00000000..ef2ab69f --- /dev/null +++ b/ruoyi-cai/src/main/resources/mapper/cai/CaiUserInviteMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + +