This commit is contained in:
张良(004796)
2024-02-28 14:30:24 +08:00
parent 46878eb14f
commit c70ffbb7d6
9 changed files with 70 additions and 16 deletions

View File

@@ -0,0 +1,38 @@
package com.ruoyi.test.business;
import com.alibaba.fastjson.JSON;
import com.ruoyi.cai.ws.cache.RoomDataCache;
import com.ruoyi.cai.ws.job.JobResp;
import com.ruoyi.cai.ws.job.RoomCheckJobService;
import com.ruoyi.cai.ws.service.RoomService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@Slf4j
public class RoomTest {
@Autowired
private RoomCheckJobService roomCheckJobService;
@Test
public void test(){
Long roomId = 1761964822147088386L;
JobResp resp = roomCheckJobService.checkRoom(roomId);
log.error(JSON.toJSONString(resp));
}
@Autowired
private RoomService roomService;
@Autowired
private RoomDataCache roomDataCache;
@Test
public void testRedisLua(){
Long roomId = 1761964822147088386L;
// boolean b = roomService.hangUp(roomId);
boolean b = roomDataCache.setStatusAgree(roomId);
log.error("结果 b{}",b);
}
}

View File

@@ -26,10 +26,13 @@ public class RoomCheckDelayMqConsumer {
JobResp resp = roomCheckJobService.checkRoom(roomId);
if(resp.isNextCreateJob()){
// 1分钟后继续执行
log.info("1分钟后继续执行房间检测: roomId={}",roomIdStr);
amqpProducer.sendRoomCheckDelay(roomIdStr,60);
}
}catch (Exception e){
log.error("每分钟定时检测房间失败! roomId={}",roomIdStr);
}finally {
log.info("结束执行房间检测: roomId={}",roomIdStr);
}
}

View File

@@ -321,15 +321,15 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
RoomData roomData = room.getRoomData();
UserCall userCall = userCallService.getById(roomData.getRoomId());
UserData callUserData = room.getCallUserData();
Long callPrice = roomData.getCallPrice();
Long callPrice = Long.valueOf(roomData.getCallPrice()); // 通话单价
Long payCoin = Long.valueOf(roomData.getPayCoin()); // 已经支付的余额
Long payIncome = Long.valueOf(roomData.getPayIncome()); // 已经支付的收益
Long callTime = roomService.getCallTime(room);
// 本次支付金额
long totalAmount = callPrice * ((callTime / 60) + 1); // 本次需要支付的金额
if(callTime % 60 == 0){
totalAmount = callPrice * (callTime / 60);
}
Long payCoin = roomData.getPayCoin(); // 已经支付的余额
Long payIncome = roomData.getPayIncome(); // 已经支付的收益
// 补差价
long diff = totalAmount - (payCoin + payIncome);
Account callAccount = this.getByUserId(callUserData.getId());

View File

@@ -8,12 +8,12 @@ import java.math.BigDecimal;
@Data
public class RoomData {
private Long roomId;
private Long callPrice;
private Integer callPrice;
private String skillName;
private Integer status;
private BigDecimal videoDivide;
private Long payCoin = 0L;
private Long payIncome = 0L;
private Integer payCoin = 0;
private Integer payIncome = 0;
private Long hangupTime; // 结束时间
private Long settleTime; // 结算时间

View File

@@ -71,15 +71,15 @@ public class RoomDataCache {
}
private final static String HANG_UP = "local hangupTime = tonumber(redis.call('hGet', KEYS[1], '\"hangupTime\"'))\n" +
"if hangupTime and hangupTime > 0 then\n" +
private final static String HANG_UP = "local hangupTime = redis.call('hGet', KEYS[1], '\"hangupTime\"')\n" +
"if hangupTime then\n" +
" return 0\n" +
"end\n" +
"return redis.call('hMSet', KEYS[1], '\"status\"', 8, '\"hangupTime\"', ARGV[1])";
public boolean hangUp(Long roomId) {
RScript script = redissonClient.getScript();
Long currentTime = System.currentTimeMillis() / 1000;
Long currentTime = (System.currentTimeMillis() / 1000);
Boolean execute = script.eval(RScript.Mode.READ_WRITE, HANG_UP, RScript.ReturnType.BOOLEAN,
Collections.singletonList(getKey(roomId)), currentTime);
// DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(HANG_UP,Boolean.class);
@@ -111,8 +111,8 @@ public class RoomDataCache {
private final static String SET_STATUS_AGREE =
"local status = tonumber(redis.call('hget', KEYS[1], '\"status\"'))\n" +
"local beginTime = tonumber(redis.call('hget', KEYS[1], '\"beginTime\"'))\n" +
"if status ~= 3 or (beginTime and beginTime > 0) then\n" +
"local beginTime = redis.call('hget', KEYS[1], '\"beginTime\"')\n" +
"if status ~= 3 or beginTime) then\n" +
" return 0\n" +
"end\n" +
"return redis.call('hmset', KEYS[1], '\"status\"', 7, '\"beginTime\"', ARGV[1])";

View File

@@ -128,7 +128,9 @@ public class RoomCheckJobService {
nextCreateJob = settleResp.isNextRun();
}
roomService.closeAllFd(roomId);
yunxinWsService.sendToCallNotify(callUserData.getId(),receiverUserData.getId(), CallNoticeEnum.TIMEOUT,0L);
if(!nextCreateJob){
yunxinWsService.sendToCallNotify(callUserData.getId(),receiverUserData.getId(), CallNoticeEnum.TIMEOUT,0L);
}
return JobResp.builder().nextCreateJob(nextCreateJob).build();
}
return JobResp.builder().nextCreateJob(true).build();

View File

@@ -103,7 +103,7 @@ public class WebSocketManager {
// 初始化
RoomData roomData = new RoomData();
roomData.setRoomId(call.getId());
roomData.setCallPrice(call.getCallPrice());
roomData.setCallPrice(call.getCallPrice().intValue());
roomData.setStatus(call.getStatus());
roomData.setVideoDivide(call.getReceiverVideoDivide());
roomDataCache.init(roomData);

View File

@@ -59,8 +59,8 @@ public class SettleService {
SettleService settleService = SpringUtil.getBean(SettleService.class);
try {
Long userId = room.getCallUserData().getId();
Long price = room.getRoomData().getCallPrice();
settleService.withholdingFeeUser(userId,price,room);
Integer price = room.getRoomData().getCallPrice();
settleService.withholdingFeeUser(userId,Long.valueOf(price),room);
return true;
}catch (Exception e){
log.error("预扣费失败!准备挂断电话",e);
@@ -125,9 +125,12 @@ public class SettleService {
* @param room
*/
private SettleResp deal(Room room){
if(room.isCanCall() || room.isSettle()){ // 正在通话中,或者已经结算了 ,都无需在结算
if(room.isCanCall()){ // 正在通话中,无需在结算
return SettleResp.builder().nextRun(true).build();
}
if(room.isSettle()){ // 已经结算了,无需结算
return SettleResp.builder().nextRun(false).build();
}
if(!room.isReleaseRes()){ // 房间资源是否已经释放
roomService.releaseRes(room.getRoomId()); // 释放房间会更新用户和主播的状态
}

View File

@@ -25,6 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.*,t2.age,t2.avatar,t2.usercode,t2.nickname,t2.mobile,t2.gender,t2.age,t2.city
from cai_anchor t1
left join cai_user t2 on t1.user_id = t2.id
<where>
<if test="bo.mobile != null and bo.mobile != ''">
and t2.mobile = #{bo.mobile}
</if>
<if test="bo.usercode != null and bo.usercode != ''">
and t2.usercode = #{bo.usercode}
</if>
</where>
order by t1.create_time desc
</select>
<select id="pageApp" resultType="com.ruoyi.cai.dto.app.vo.AnchorListVo">