feat: bug-528 app端添加管理功能

调整视频通话逻辑
This commit is contained in:
曹鹏飞 2025-08-07 18:46:38 +08:00
parent 3502560143
commit c6328d251d
10 changed files with 72 additions and 92 deletions

View File

@ -49,10 +49,10 @@ public class TestController extends ControllerBase{
} }
} }
@GetMapping("test") // @GetMapping("test")
public ApiResult<Boolean> test(@RequestParam Integer userId){ // public ApiResult<Boolean> test(@RequestParam Integer userId){
return ApiResult.success(ticketCallService.isInCall(userId)); // return ApiResult.success(ticketCallService.isInCall(userId));
} // }
/** /**
* 翻译为日语 * 翻译为日语

View File

@ -1256,7 +1256,6 @@ public class TicketController extends ControllerBase {
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getUserId(), AdminUserUtil.getUserId()) && !Objects.equals(AdminUserUtil.getUserId(), handlerUserId)) VUtils.trueThrowBusinessError(!Objects.equals(ticket.getUserId(), AdminUserUtil.getUserId()) && !Objects.equals(AdminUserUtil.getUserId(), handlerUserId))
.throwMessage("无权限呼叫"); .throwMessage("无权限呼叫");
} }
VUtils.trueThrowBusinessError(ticketCallService.isInCall(ticket.getUserId())).throwMessage("对方正在通话中");
boolean userIdCreate = StrUtil.equals(ticket.getUserPlatform(), Constant.FROM_ADMIN) && Objects.equals(ticket.getUserId(), AdminUserUtil.getUserId()); boolean userIdCreate = StrUtil.equals(ticket.getUserPlatform(), Constant.FROM_ADMIN) && Objects.equals(ticket.getUserId(), AdminUserUtil.getUserId());
Integer sendUserId = 0, receiveUserId = 0; Integer sendUserId = 0, receiveUserId = 0;
String sendUserFrom, receiveUserFrom; String sendUserFrom, receiveUserFrom;
@ -1271,6 +1270,7 @@ public class TicketController extends ControllerBase {
sendUserFrom = Constant.FROM_ADMIN; sendUserFrom = Constant.FROM_ADMIN;
receiveUserFrom = Constant.FROM_APP; receiveUserFrom = Constant.FROM_APP;
} }
VUtils.trueThrowBusinessError(ticketCallJoinService.isInCall(ticket.getId(), receiveUserFrom, receiveUserId)).throwMessage("对方正在通话中");
ticketCallService.add(ticketId, sendUserId, sendUserFrom, receiveUserId, receiveUserFrom); ticketCallService.add(ticketId, sendUserId, sendUserFrom, receiveUserId, receiveUserFrom);
AdminUser adminUser = adminUserService.getById(sendUserId); AdminUser adminUser = adminUserService.getById(sendUserId);
uniPushService.send(new UniPushMessage() uniPushService.send(new UniPushMessage()
@ -1347,7 +1347,7 @@ public class TicketController extends ControllerBase {
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState())) VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState()))
.throwMessage("当前工单状态不允许请求通话"); .throwMessage("当前工单状态不允许请求通话");
VUtils.trueThrowBusinessError(ticketCallService.isInCall(AdminUserUtil.getUserId())) VUtils.trueThrowBusinessError(ticketCallJoinService.isInCall(ticket.getId(), Constant.FROM_ADMIN, AdminUserUtil.getUserId()))
.throwMessage("您已加入别的通话中"); .throwMessage("您已加入别的通话中");
ticketCallJoinService.join(ticketId, AdminUserUtil.getUserId(),Constant.FROM_ADMIN); ticketCallJoinService.join(ticketId, AdminUserUtil.getUserId(),Constant.FROM_ADMIN);
ssePushService.sendTicketCallJoinedToAdmin(AdminUserUtil.getUserId(), ticketId); ssePushService.sendTicketCallJoinedToAdmin(AdminUserUtil.getUserId(), ticketId);
@ -1374,13 +1374,8 @@ public class TicketController extends ControllerBase {
*/ */
@PostMapping("call/hangUp") @PostMapping("call/hangUp")
public ApiResult<Void> hangUp(@Valid @RequestBody TicketCallHangUpRequest request) { public ApiResult<Void> hangUp(@Valid @RequestBody TicketCallHangUpRequest request) {
TicketCall ticketCall = ticketCallService.lambdaQuery() TicketCall ticketCall = ticketCallService.getLast(request.getTicketId());
.eq(TicketCall::getTicketId, request.getTicketId())
.ne(TicketCall::getState, 2)
.last("limit 1")
.one();
if (Objects.isNull(ticketCall)) return ApiResult.success(); if (Objects.isNull(ticketCall)) return ApiResult.success();
boolean flag=false;
if (request.getReject()) { if (request.getReject()) {
AdminUser adminUser = adminUserService.getById(AdminUserUtil.getUserId()); AdminUser adminUser = adminUserService.getById(AdminUserUtil.getUserId());
if (StrUtil.equals(request.getFrom(), "app")) { if (StrUtil.equals(request.getFrom(), "app")) {
@ -1401,7 +1396,6 @@ public class TicketController extends ControllerBase {
) )
); );
ssePushService.sendTicketCallHangUpToApp(request.getTicketId(), request.getFromUserId(), adminUser); ssePushService.sendTicketCallHangUpToApp(request.getTicketId(), request.getFromUserId(), adminUser);
flag=ticketCallJoinService.hangUp(request.getTicketId(), AdminUserUtil.getUserId(), Constant.FROM_ADMIN, true);
}else if (StrUtil.equals(request.getFrom(), "admin")) { }else if (StrUtil.equals(request.getFrom(), "admin")) {
if (Objects.equals(request.getFromUserId(), AdminUserUtil.getUserId())){ if (Objects.equals(request.getFromUserId(), AdminUserUtil.getUserId())){
Ticket ticket = ticketService.getById(request.getTicketId()); Ticket ticket = ticketService.getById(request.getTicketId());
@ -1423,7 +1417,6 @@ public class TicketController extends ControllerBase {
) )
); );
ssePushService.sendTicketCallCancelToAdmin(request.getTicketId(), handlerId, adminUser); ssePushService.sendTicketCallCancelToAdmin(request.getTicketId(), handlerId, adminUser);
flag=ticketCallService.hangUp(request.getTicketId(), AdminUserUtil.getUserId(), Constant.FROM_ADMIN, true);
}else { }else {
uniPushService.send(new UniPushMessage() uniPushService.send(new UniPushMessage()
.setSenderId("admin-uid-" + adminUser.getId()) .setSenderId("admin-uid-" + adminUser.getId())
@ -1442,17 +1435,10 @@ public class TicketController extends ControllerBase {
) )
); );
ssePushService.sendTicketCallHangUpToAdmin(request.getTicketId(), request.getFromUserId(), adminUser); ssePushService.sendTicketCallHangUpToAdmin(request.getTicketId(), request.getFromUserId(), adminUser);
flag=ticketCallJoinService.hangUp(ticketCall.getId(), AdminUserUtil.getUserId(), Constant.FROM_ADMIN, true);
} }
} }
}else {
if (StrUtil.equals(request.getFrom(), "app") || Objects.equals(request.getFromUserId(), AdminUserUtil.getUserId())) {
flag=ticketCallService.hangUp(request.getTicketId(), AdminUserUtil.getUserId(), Constant.FROM_ADMIN, false);
}else {
flag=ticketCallJoinService.hangUp(ticketCall.getId(), AdminUserUtil.getUserId(), Constant.FROM_ADMIN, false);
} }
} if (ticketCallJoinService.hangUp(ticketCall.getId(), AdminUserUtil.getUserId(), Constant.FROM_ADMIN, request.getReject())) {
if (flag){
ticketEventPublisher.publishTicketCallEndEvent(request.getTicketId()); ticketEventPublisher.publishTicketCallEndEvent(request.getTicketId());
} }
return ApiResult.success(); return ApiResult.success();

View File

@ -504,7 +504,7 @@ public class TicketController extends ControllerBase {
VUtils.trueThrowBusinessError(!Objects.equals(AppUserUtil.getUserId(), ticket.getUserId())) VUtils.trueThrowBusinessError(!Objects.equals(AppUserUtil.getUserId(), ticket.getUserId()))
.throwMessage("不是工单创建人无权限呼叫"); .throwMessage("不是工单创建人无权限呼叫");
Integer handlerUserId = Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).findFirst().get(); Integer handlerUserId = Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).findFirst().get();
VUtils.trueThrowBusinessError(ticketCallService.isInCall(handlerUserId)).throwMessage("对方正在通话中"); VUtils.trueThrowBusinessError(ticketCallJoinService.isInCall(ticket.getId(), Constant.FROM_ADMIN, handlerUserId)).throwMessage("对方正在通话中");
AppUser appUser = appUserService.getById(ticket.getUserId()); AppUser appUser = appUserService.getById(ticket.getUserId());
uniPushService.send(new UniPushMessage() uniPushService.send(new UniPushMessage()
.setSenderId(ticket.getUserPlatform()+"-uid-" + ticket.getUserId()) .setSenderId(ticket.getUserPlatform()+"-uid-" + ticket.getUserId())
@ -541,7 +541,7 @@ public class TicketController extends ControllerBase {
VUtils.trueThrowBusinessError(!StrUtil.equals(ticket.getUserPlatform(), AppUserUtil.getFrom()) VUtils.trueThrowBusinessError(!StrUtil.equals(ticket.getUserPlatform(), AppUserUtil.getFrom())
|| !Objects.equals(AppUserUtil.getUserId(), ticket.getUserId())) || !Objects.equals(AppUserUtil.getUserId(), ticket.getUserId()))
.throwMessage("不是创建人无法加入通话"); .throwMessage("不是创建人无法加入通话");
VUtils.trueThrowBusinessError(ticketCallService.isInCall(AppUserUtil.getUserId())) VUtils.trueThrowBusinessError(ticketCallJoinService.isInCall(ticket.getId(), Constant.FROM_APP, AppUserUtil.getUserId()))
.throwMessage("您已加入别的通话中"); .throwMessage("您已加入别的通话中");
ticketCallJoinService.join(ticketId, AppUserUtil.getUserId(), Constant.FROM_APP); ticketCallJoinService.join(ticketId, AppUserUtil.getUserId(), Constant.FROM_APP);
ssePushService.sendTicketCallJoinedToApp(AppUserUtil.getUserId(), ticketId); ssePushService.sendTicketCallJoinedToApp(AppUserUtil.getUserId(), ticketId);
@ -615,13 +615,7 @@ public class TicketController extends ControllerBase {
ssePushService.sendTicketCallHangUpToAdmin(request.getTicketId(), request.getFromUserId(), appUser); ssePushService.sendTicketCallHangUpToAdmin(request.getTicketId(), request.getFromUserId(), appUser);
} }
} }
boolean flag; if (ticketCallJoinService.hangUp(ticketCall.getId(), AppUserUtil.getUserId(), Constant.FROM_APP, request.getReject())) {
if (StrUtil.equals(request.getFrom(), Constant.FROM_APP)) {
flag = ticketCallService.hangUp(ticketCall.getId(), AppUserUtil.getUserId(), Constant.FROM_APP, request.getReject());
} else {
flag = ticketCallJoinService.hangUp(ticketCall.getId(), AppUserUtil.getUserId(), Constant.FROM_APP, request.getReject());
}
if (flag) {
ticketEventPublisher.publishTicketCallEndEvent(request.getTicketId()); ticketEventPublisher.publishTicketCallEndEvent(request.getTicketId());
} }
return ApiResult.success(); return ApiResult.success();

View File

@ -1,7 +1,6 @@
package com.nflg.mobilebroken.repository.entity; package com.nflg.mobilebroken.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter; import lombok.Getter;
@ -35,16 +34,16 @@ public class TicketCall implements Serializable {
*/ */
private Integer ticketId; private Integer ticketId;
/** // /**
* 呼叫来源app或者admin // * 呼叫来源app或者admin
*/ // */
@TableField("`from`") // @TableField("`from`")
private String from; // private String from;
//
/** // /**
* 呼叫人id // * 呼叫人id
*/ // */
private Integer callerUserId; // private Integer callerUserId;
/** /**
* 状态0-呼叫中1-通话中2-已结束 * 状态0-呼叫中1-通话中2-已结束

View File

@ -13,5 +13,5 @@ import com.nflg.mobilebroken.repository.entity.TicketCallJoin;
*/ */
public interface TicketCallJoinMapper extends BaseMapper<TicketCallJoin> { public interface TicketCallJoinMapper extends BaseMapper<TicketCallJoin> {
boolean isInCall(Integer userId); boolean isInCall(Integer ticketId, String from, Integer userId);
} }

View File

@ -16,7 +16,7 @@ import javax.validation.constraints.NotNull;
*/ */
public interface ITicketCallJoinService extends IService<TicketCallJoin> { public interface ITicketCallJoinService extends IService<TicketCallJoin> {
boolean isInCall(Integer userId); boolean isInCall(Integer ticketId, String from, Integer userId);
void join(@Valid @NotNull Integer ticketId, Integer userId, String from); void join(@Valid @NotNull Integer ticketId, Integer userId, String from);
@ -25,6 +25,4 @@ public interface ITicketCallJoinService extends IService<TicketCallJoin> {
boolean hangUp(Integer callId, Integer userId, String from, boolean reject); boolean hangUp(Integer callId, Integer userId, String from, boolean reject);
void add(Integer callId, Integer userId, String from); void add(Integer callId, Integer userId, String from);
void hangUpAll(Integer id);
} }

View File

@ -15,11 +15,11 @@ import javax.validation.constraints.NotNull;
*/ */
public interface ITicketCallService extends IService<TicketCall> { public interface ITicketCallService extends IService<TicketCall> {
boolean isInCall(Integer userId); // boolean isInCall(Integer userId);
void add(Integer ticketId, Integer callerUserId,String callerUserFrom, Integer calledUserId, String calledUserFrom); void add(Integer ticketId, Integer callerUserId,String callerUserFrom, Integer calledUserId, String calledUserFrom);
boolean hangUp(@NotNull Integer ticketId, Integer userId, String from, boolean reject); // boolean hangUp(@NotNull Integer ticketId, Integer userId, String from, boolean reject);
TicketCall getLast(@NotNull Integer ticketId); TicketCall getLast(@NotNull Integer ticketId);
} }

View File

@ -31,8 +31,8 @@ public class TicketCallJoinServiceImpl extends ServiceImpl<TicketCallJoinMapper,
private ITicketCallService ticketCallService; private ITicketCallService ticketCallService;
@Override @Override
public boolean isInCall(Integer userId) { public boolean isInCall(Integer ticketId, String from, Integer userId) {
return baseMapper.isInCall(userId); return baseMapper.isInCall(ticketId, from, userId);
} }
@Transactional @Transactional
@ -84,7 +84,14 @@ public class TicketCallJoinServiceImpl extends ServiceImpl<TicketCallJoinMapper,
.set(TicketCallJoin::getState, 2) .set(TicketCallJoin::getState, 2)
.set(reject, TicketCallJoin::getHangupTime, LocalDateTime.now()) .set(reject, TicketCallJoin::getHangupTime, LocalDateTime.now())
.eq(TicketCallJoin::getCallId, callId) .eq(TicketCallJoin::getCallId, callId)
.ne(TicketCallJoin::getFrom, from) .update();
} else {
lambdaUpdate()
.set(TicketCallJoin::getState, 2)
.set(reject, TicketCallJoin::getHangupTime, LocalDateTime.now())
.eq(TicketCallJoin::getCallId, callId)
.eq(TicketCallJoin::getUserId, userId)
.eq(TicketCallJoin::getFrom, from)
.update(); .update();
} }
if (!lambdaQuery() if (!lambdaQuery()
@ -119,12 +126,4 @@ public class TicketCallJoinServiceImpl extends ServiceImpl<TicketCallJoinMapper,
); );
} }
} }
@Override
public void hangUpAll(Integer id) {
lambdaUpdate()
.set(TicketCallJoin::getState, 2)
.eq(TicketCallJoin::getCallId, id)
.update();
}
} }

View File

@ -1,8 +1,6 @@
package com.nflg.mobilebroken.repository.service.impl; package com.nflg.mobilebroken.repository.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.repository.entity.TicketCall; import com.nflg.mobilebroken.repository.entity.TicketCall;
import com.nflg.mobilebroken.repository.entity.TicketCallJoin; import com.nflg.mobilebroken.repository.entity.TicketCallJoin;
import com.nflg.mobilebroken.repository.mapper.TicketCallMapper; import com.nflg.mobilebroken.repository.mapper.TicketCallMapper;
@ -13,7 +11,6 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Objects;
/** /**
* <p> * <p>
@ -29,26 +26,33 @@ public class TicketCallServiceImpl extends ServiceImpl<TicketCallMapper, TicketC
@Resource @Resource
private ITicketCallJoinService ticketCallJoinService; private ITicketCallJoinService ticketCallJoinService;
@Override // @Override
public boolean isInCall(Integer userId) { // public boolean isInCall(Integer userId) {
return lambdaQuery() // return lambdaQuery()
.eq(TicketCall::getState, 1) // .eq(TicketCall::getState, 1)
.eq(TicketCall::getCallerUserId, userId) // .eq(TicketCall::getCallerUserId, userId)
.exists() // .exists()
|| // ||
ticketCallJoinService.isInCall(userId); // ticketCallJoinService.isInCall(userId);
} // }
@Transactional @Transactional
@Override @Override
public void add(Integer ticketId, Integer callerUserId,String callerUserFrom, Integer calledUserId, String calledUserFrom) { public void add(Integer ticketId, Integer callerUserId,String callerUserFrom, Integer calledUserId, String calledUserFrom) {
TicketCall ticketCall = new TicketCall() TicketCall ticketCall = new TicketCall()
.setTicketId(ticketId) .setTicketId(ticketId)
.setCallerUserId(callerUserId) // .setCallerUserId(callerUserId)
.setState(0) .setState(0)
.setFrom(callerUserFrom) // .setFrom(callerUserFrom)
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
save(ticketCall); save(ticketCall);
ticketCallJoinService.save(new TicketCallJoin()
.setCallId(ticketCall.getId())
.setFrom(callerUserFrom)
.setUserId(callerUserId)
.setState(0)
.setCreateTime(LocalDateTime.now())
);
ticketCallJoinService.save(new TicketCallJoin() ticketCallJoinService.save(new TicketCallJoin()
.setCallId(ticketCall.getId()) .setCallId(ticketCall.getId())
.setFrom(calledUserFrom) .setFrom(calledUserFrom)
@ -58,24 +62,24 @@ public class TicketCallServiceImpl extends ServiceImpl<TicketCallMapper, TicketC
); );
} }
@Override // @Override
public boolean hangUp(Integer ticketId, Integer userId, String from, boolean reject) { // public boolean hangUp(Integer ticketId, Integer userId, String from, boolean reject) {
TicketCall ticketCall = getLast(ticketId); // TicketCall ticketCall = getLast(ticketId);
boolean flag = false; // boolean flag = false;
if (Objects.nonNull(ticketCall)){ // if (Objects.nonNull(ticketCall)){
if ((Objects.equals(ticketCall.getCallerUserId(), userId) && StrUtil.equals(ticketCall.getFrom(), Constant.FROM_APP)) // if ((Objects.equals(ticketCall.getCallerUserId(), userId) && StrUtil.equals(ticketCall.getFrom(), Constant.FROM_APP))
|| ticketCallJoinService.allIsHangUp(ticketCall.getId())){ // || ticketCallJoinService.allIsHangUp(ticketCall.getId())){
ticketCall.setState(2); // ticketCall.setState(2);
ticketCallJoinService.hangUpAll(ticketCall.getId()); // ticketCallJoinService.hangUpAll(ticketCall.getId());
if (reject) { // if (reject) {
ticketCall.setHangupTime(LocalDateTime.now()); // ticketCall.setHangupTime(LocalDateTime.now());
} // }
updateById(ticketCall); // updateById(ticketCall);
} // }
flag=ticketCallJoinService.hangUp(ticketCall.getId(), userId, from, reject); // flag=ticketCallJoinService.hangUp(ticketCall.getId(), userId, from, reject);
} // }
return flag; // return flag;
} // }
@Override @Override
public TicketCall getLast(Integer ticketId) { public TicketCall getLast(Integer ticketId) {

View File

@ -7,6 +7,6 @@
INNER JOIN ticket_call_join tcj ON tc.id = tcj.call_id INNER JOIN ticket_call_join tcj ON tc.id = tcj.call_id
WHERE tc.state = 1 WHERE tc.state = 1
AND tcj.state = 1 AND tcj.state = 1
AND tcj.user_id = #{userId} AND tcj.user_id = #{userId} and tcj.from = #{from} and tc.ticket_id = #{ticketId}
</select> </select>
</mapper> </mapper>