Merge branch 'feature/bug-632' into test

This commit is contained in:
曹鹏飞 2025-08-28 14:45:16 +08:00
commit a469439862
6 changed files with 120 additions and 92 deletions

View File

@ -1496,30 +1496,7 @@ public class TicketController extends ControllerBase {
} else {
stringRedisTemplate.opsForSet().remove(Constant.REDIS_KEY_TICKET_CALL_WAIT + request.getTicketId(), Constant.FROM_ADMIN + "-" + AdminUserUtil.getUserId());
}
if (Objects.equals(0L, stringRedisTemplate.opsForSet().size(Constant.REDIS_KEY_TICKET_CALL_WAIT + request.getTicketId()))) {
ShengWangChannelUserListDTO channelUserListDTO = shengWangService.getChannelUsers("ticket" + request.getTicketId());
if (!channelUserListDTO.isChannelEexist() || channelUserListDTO.getUsers().size() <= 1) {
ssePushService.sendTicketCallEnd(request.getTicketId());
Integer userId = CollectionUtil.get(channelUserListDTO.getUsers(), 0);
if (Objects.nonNull(userId)) {
String from = userId.toString().startsWith("1") ? "app" : "admin";
userId = Integer.valueOf(userId.toString().substring(1));
uniPushService.send(new UniPushMessage()
.setSenderId(from + "-uid-0")//不重要
.setReceiverId(from + "-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(request.getTicketId())
.setUserId(userId)
.setCategory("ticketCallEnd")
.setFrom("admin")
)
)
);
}
}
}
ticketEventPublisher.publishTicketCallEndEvent(request.getTicketId());
return ApiResult.success();
}

View File

@ -1,12 +1,22 @@
package com.nflg.mobilebroken.admin.event;
import cn.hutool.core.collection.CollectionUtil;
import com.nflg.mobilebroken.admin.service.ShengWangService;
import com.nflg.mobilebroken.admin.service.SsePushService;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.dto.*;
import com.nflg.mobilebroken.repository.service.TicketChatService;
import com.nflg.mobilebroken.starter.service.UniPushService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.io.IOException;
import java.time.Instant;
import java.util.Objects;
public class TicketCallEndEvent extends ApplicationEvent implements ApplicationContextAware {
@ -15,6 +25,8 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
private SsePushService ssePushService;
private TicketChatService ticketChatService;
private ShengWangService shengWangService;
private StringRedisTemplate stringRedisTemplate;
private UniPushService uniPushService;
public TicketCallEndEvent(Object source, Integer ticketId) {
super(source);
@ -26,23 +38,46 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
this.ssePushService = applicationContext.getBean(SsePushService.class);
this.ticketChatService = applicationContext.getBean(TicketChatService.class);
this.shengWangService = applicationContext.getBean(ShengWangService.class);
this.stringRedisTemplate = applicationContext.getBean(StringRedisTemplate.class);
this.uniPushService = applicationContext.getBean(UniPushService.class);
}
// public void send() throws IOException, InterruptedException {
// TimeUnit.SECONDS.sleep(2);
// if (CollectionUtil.isEmpty(shengWangService.getChannelUsers("ticket-" + ticketId))) {
// ChatMessageDTO message = new ChatMessageDTO()
// .setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr())
// .setFrom("call")
// .setTicketState(TicketState.Processing.getState())
// .setSenderId(0)
// .setSenderName("通话助手")
// .setContent("视频通话已结束")
// .setCreateTime(Instant.now());
// ticketChatService.addMessage(ticketId, message);
// //推送消息
// ssePushService.sendTicketMessageToAdmin(ticketId, message);
// ssePushService.sendTicketMessageToApp(ticketId, message);
// }
// }
public void send() throws IOException, InterruptedException {
if (Objects.equals(0L, stringRedisTemplate.opsForSet().size(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId))) {
ShengWangChannelUserListDTO channelUserListDTO = shengWangService.getChannelUsers("ticket" + ticketId);
if (!channelUserListDTO.isChannelEexist() || channelUserListDTO.getUsers().size() <= 1) {
ChatMessageDTO message = new ChatMessageDTO()
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr())
.setFrom("call")
.setTicketState(TicketState.Processing.getState())
.setSenderId(0)
.setSenderName("通话助手")
.setContent("视频通话已结束")
.setCreateTime(Instant.now());
ticketChatService.addMessage(ticketId, message);
//推送消息
ssePushService.sendTicketMessageToAdmin(ticketId, message);
ssePushService.sendTicketMessageToApp(ticketId, message);
ssePushService.sendTicketCallEnd(ticketId);
Integer userId = CollectionUtil.get(channelUserListDTO.getUsers(), 0);
if (Objects.nonNull(userId)) {
String from = userId.toString().startsWith("1") ? "app" : "admin";
userId = Integer.valueOf(userId.toString().substring(1));
uniPushService.send(new UniPushMessage()
.setSenderId(from + "-uid-0")//不重要
.setReceiverId(from + "-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(ticketId)
.setUserId(userId)
.setCategory("ticketCallEnd")
.setFrom("admin")
)
)
);
}
}
}
}
}

View File

@ -5,6 +5,8 @@ import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class TicketEventListener {
@ -38,9 +40,9 @@ public class TicketEventListener {
event.send();
}
// @Async
// @EventListener
// public void handleTicketCallEndEvent(TicketCallEndEvent event) throws IOException, InterruptedException {
// event.send();
// }
@Async
@EventListener
public void handleTicketCallEndEvent(TicketCallEndEvent event) throws IOException, InterruptedException {
event.send();
}
}

View File

@ -664,30 +664,7 @@ public class TicketController extends ControllerBase {
} else {
stringRedisTemplate.opsForSet().remove(Constant.REDIS_KEY_TICKET_CALL_WAIT + request.getTicketId(), Constant.FROM_APP + "-" + AppUserUtil.getUserId());
}
if (Objects.equals(0L, stringRedisTemplate.opsForSet().size(Constant.REDIS_KEY_TICKET_CALL_WAIT + request.getTicketId()))) {
ShengWangChannelUserListDTO channelUserListDTO = shengWangService.getChannelUsers("ticket" + request.getTicketId());
if (!channelUserListDTO.isChannelEexist() || channelUserListDTO.getUsers().size() <= 1) {
ssePushService.sendTicketCallEnd(request.getTicketId());
Integer userId = CollectionUtil.get(channelUserListDTO.getUsers(), 0);
if (Objects.nonNull(userId)) {
String from = userId.toString().startsWith("1") ? "app" : "admin";
userId = Integer.valueOf(userId.toString().substring(1));
uniPushService.send(new UniPushMessage()
.setSenderId(from + "-uid-0")//不重要
.setReceiverId(from + "-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(request.getTicketId())
.setUserId(userId)
.setCategory("ticketCallEnd")
.setFrom("app")
)
)
);
}
}
}
ticketEventPublisher.publishTicketCallEndEvent(request.getTicketId());
return ApiResult.success();
}

View File

@ -1,12 +1,22 @@
package com.nflg.mobilebroken.cfs.event;
import cn.hutool.core.collection.CollectionUtil;
import com.nflg.mobilebroken.cfs.service.ShengWangService;
import com.nflg.mobilebroken.cfs.service.SsePushService;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.dto.*;
import com.nflg.mobilebroken.repository.service.TicketChatService;
import com.nflg.mobilebroken.starter.service.UniPushService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.io.IOException;
import java.time.Instant;
import java.util.Objects;
public class TicketCallEndEvent extends ApplicationEvent implements ApplicationContextAware {
@ -15,6 +25,8 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
private SsePushService ssePushService;
private TicketChatService ticketChatService;
private ShengWangService shengWangService;
private StringRedisTemplate stringRedisTemplate;
private UniPushService uniPushService;
public TicketCallEndEvent(Object source,Integer ticketId) {
super(source);
@ -26,23 +38,46 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
this.ssePushService = applicationContext.getBean(SsePushService.class);
this.ticketChatService = applicationContext.getBean(TicketChatService.class);
this.shengWangService = applicationContext.getBean(ShengWangService.class);
this.stringRedisTemplate = applicationContext.getBean(StringRedisTemplate.class);
this.uniPushService = applicationContext.getBean(UniPushService.class);
}
// public void send() throws IOException, InterruptedException {
// TimeUnit.SECONDS.sleep(2);
// if (CollectionUtil.isEmpty(shengWangService.getChannelUsers("ticket-" + ticketId))) {
// ChatMessageDTO message = new ChatMessageDTO()
// .setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr())
// .setFrom("call")
// .setTicketState(TicketState.Processing.getState())
// .setSenderId(0)
// .setSenderName("通话助手")
// .setContent("视频通话已结束")
// .setCreateTime(Instant.now());
// ticketChatService.addMessage(ticketId, message);
// //推送消息
// ssePushService.sendTicketMessageToAdmin(ticketId, message);
// ssePushService.sendTicketMessageToApp(ticketId, message);
// }
// }
public void send() throws IOException, InterruptedException {
if (Objects.equals(0L, stringRedisTemplate.opsForSet().size(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId))) {
ShengWangChannelUserListDTO channelUserListDTO = shengWangService.getChannelUsers("ticket" + ticketId);
if (!channelUserListDTO.isChannelEexist() || channelUserListDTO.getUsers().size() <= 1) {
ChatMessageDTO message = new ChatMessageDTO()
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr())
.setFrom("call")
.setTicketState(TicketState.Processing.getState())
.setSenderId(0)
.setSenderName("通话助手")
.setContent("视频通话已结束")
.setCreateTime(Instant.now());
ticketChatService.addMessage(ticketId, message);
//推送消息
ssePushService.sendTicketMessageToAdmin(ticketId, message);
ssePushService.sendTicketMessageToApp(ticketId, message);
ssePushService.sendTicketCallEnd(ticketId);
Integer userId = CollectionUtil.get(channelUserListDTO.getUsers(), 0);
if (Objects.nonNull(userId)) {
String from = userId.toString().startsWith("1") ? "app" : "admin";
userId = Integer.valueOf(userId.toString().substring(1));
uniPushService.send(new UniPushMessage()
.setSenderId(from + "-uid-0")//不重要
.setReceiverId(from + "-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(ticketId)
.setUserId(userId)
.setCategory("ticketCallEnd")
.setFrom("app")
)
)
);
}
}
}
}
}

View File

@ -5,6 +5,8 @@ import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class TicketEventListener {
@ -44,9 +46,9 @@ public class TicketEventListener {
event.send();
}
// @Async
// @EventListener
// public void handleTicketCallEndEvent(TicketCallEndEvent event) throws IOException, InterruptedException {
// event.send();
// }
@Async
@EventListener
public void handleTicketCallEndEvent(TicketCallEndEvent event) throws IOException, InterruptedException {
event.send();
}
}