diff --git a/ruoyi-admin/src/test/java/com/ruoyi/test/business/RoomTest.java b/ruoyi-admin/src/test/java/com/ruoyi/test/business/RoomTest.java new file mode 100644 index 00000000..841f0c96 --- /dev/null +++ b/ruoyi-admin/src/test/java/com/ruoyi/test/business/RoomTest.java @@ -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); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/RoomCheckDelayMqConsumer.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/RoomCheckDelayMqConsumer.java index afeea865..072804e3 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/RoomCheckDelayMqConsumer.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/mq/consumer/RoomCheckDelayMqConsumer.java @@ -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); } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java index 7ab1b89d..e00dd5e8 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/AccountServiceImpl.java @@ -321,15 +321,15 @@ public class AccountServiceImpl extends ServiceImpl 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()); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/RoomData.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/RoomData.java index 06792f5c..d0c74265 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/RoomData.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/RoomData.java @@ -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; // 结算时间 diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/cache/RoomDataCache.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/cache/RoomDataCache.java index da3c5a9c..67750d1f 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/cache/RoomDataCache.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/cache/RoomDataCache.java @@ -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 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])"; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/job/RoomCheckJobService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/job/RoomCheckJobService.java index eb56ff05..1adb9ee2 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/job/RoomCheckJobService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/job/RoomCheckJobService.java @@ -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(); 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 77912c82..467f9b92 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 @@ -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); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/service/SettleService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/service/SettleService.java index 56dde925..3802a6c5 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/service/SettleService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/service/SettleService.java @@ -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()); // 释放房间会更新用户和主播的状态 } diff --git a/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml b/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml index b6355a3d..0339a533 100644 --- a/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml +++ b/ruoyi-cai/src/main/resources/mapper/cai/AnchorMapper.xml @@ -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 + + + and t2.mobile = #{bo.mobile} + + + and t2.usercode = #{bo.usercode} + + order by t1.create_time desc