Merge branch 'prod/20260407' into test

This commit is contained in:
曹鹏飞 2026-04-13 11:02:58 +08:00
commit d39d05be51
20 changed files with 306 additions and 225 deletions

View File

@ -829,20 +829,30 @@ public class TicketController extends ControllerBase {
MessageVO vo = new MessageVO();
List<ChatMessageVO> messageVOS = ticketChatService.getMessages(Long.valueOf(ticketId), userId);
String languageCode = MultilingualUtil.getLanguage();
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode)) {
messageVOS.forEach(m -> {
if (m.getSenderId() == 0 && !StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
m.setSenderName(aliYunTranslate.translateWord(m.getSenderName(), aliyunCode));
m.setContent(m.getContentPre() + aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (m.isWithdrawn()) {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (Objects.nonNull(m.getQuote()) && m.getQuote().isWithdrawn()) {
m.getQuote().setContent(aliYunTranslate.translateWord(m.getQuote().getContent(), aliyunCode));
}
});
if (!StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode)) {
messageVOS.forEach(m -> {
if (StrUtil.equals(m.getFrom(), "call")) {
if (StrUtil.equals(m.getContent(), "发起了视频通话")) {
if (StrUtil.equals(m.getSenderFrom(), Constant.FROM_ADMIN) && Objects.equals(m.getSenderId(), userId)) {
m.setContent(aliYunTranslate.translateWord("" + m.getContent(), aliyunCode));
} else {
m.setContent(m.getSenderName() + aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
} else {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
} else {
if (m.isWithdrawn()) {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (Objects.nonNull(m.getQuote()) && m.getQuote().isWithdrawn()) {
m.getQuote().setContent(aliYunTranslate.translateWord(m.getQuote().getContent(), aliyunCode));
}
}
});
}
}
vo.setMessages(messageVOS);
vo.setNotReadCount(Integer.valueOf(Optional.ofNullable((String) stringRedisTemplate.opsForHash().get("chatMessage:notreaded:" + ticketId + ":admin:" + userId, "count")).orElse("0")));
@ -1430,33 +1440,34 @@ public class TicketController extends ControllerBase {
// ticketCallService.add(ticketId, sendUserId, sendUserFrom, receiveUserId, receiveUserFrom);
AdminUser adminUser = adminUserService.getById(sendUserId);
uniPushService.send(new UniPushMessage()
.setSenderId("admin-uid-" + sendUserId)
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(ticketId))
.setTicketType(0)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
.setSenderId("admin-uid-" + sendUserId)
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(ticketId))
.setTicketType(0)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
)
)
)
);
if (StrUtil.equals(Constant.FROM_APP, ticket.getUserPlatform())) {
ssePushService.sendTicketCallToApp(adminUser, ticket.getUserId(), Long.valueOf(ticketId));
} else {
ssePushService.sendTicketCallToAdmin(adminUser, receiveUserId, Long.valueOf(ticketId));
}
ticketEventPublisher.publishTicketCallBeginEvent(ticketId, adminUser.getUserName());
ticketEventPublisher.publishTicketCallBeginEvent(ticketId, adminUser);
stringRedisTemplate.opsForSet().add(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId, receiveUserFrom + "-uid-" + receiveUserId);
stringRedisTemplate.expire(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId, 1, TimeUnit.MINUTES);
return ApiResult.success();
@ -1470,11 +1481,6 @@ public class TicketController extends ControllerBase {
@PostMapping("addCallUser")
public ApiResult<Void> addCallUser(@Valid @RequestBody CallUserAddRequest request) {
AdminUser adminUser = adminUserService.getById(AdminUserUtil.getUserId());
// TicketCall ticketCall = ticketCallService.lambdaQuery()
// .eq(TicketCall::getTicketId, request.getTicketId())
// .eq(TicketCall::getState, 1)
// .one();
// VUtils.trueThrowBusinessError(Objects.isNull(ticketCall)).throwMessage("未在通话中");
List<String> userNames = new ArrayList<>();
request.getUserIds().forEach(userId -> {
AdminUser adminUser1 = adminUserService.getById(userId);
@ -1483,26 +1489,27 @@ public class TicketController extends ControllerBase {
userNames.add(adminUser1.getUserName());
} else {
uniPushService.send(new UniPushMessage()
.setSenderId("admin-uid-" + adminUser.getId())
.setReceiverId("admin-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(request.getTicketId()))
.setTicketType(0)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId("admin-uid-" + userId)
.setSenderId("admin-uid-" + adminUser.getId())
.setReceiverId("admin-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(request.getTicketId()))
.setTicketType(0)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId("admin-uid-" + userId)
)
)
)
);
ssePushService.sendTicketCallToAdmin(adminUser, userId, request.getTicketId());
// ticketCallJoinService.add(ticketCall.getId(), userId, Constant.FROM_ADMIN);
@ -1537,6 +1544,7 @@ public class TicketController extends ControllerBase {
.setSenderId("admin-uid-" + AdminUserUtil.getUserId())//不重要
.setReceiverId("admin-uid-" + AdminUserUtil.getUserId())
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
.setContent("加入通话")
.setPayload(new UniPushMessageCallPayload()
@ -1568,6 +1576,7 @@ public class TicketController extends ControllerBase {
.setSenderId(uid)//不重要
.setReceiverId(uid)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
.setContent("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
@ -1589,6 +1598,7 @@ public class TicketController extends ControllerBase {
.setSenderId(Constant.FROM_ADMIN + "-uid-" + AdminUserUtil.getUserId())//不重要
.setReceiverId(request.getFrom() + "-uid-" + request.getFromUserId())
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
.setContent("视频通话拒接")
.setPayload(new UniPushMessageCallPayload()
@ -1596,6 +1606,7 @@ public class TicketController extends ControllerBase {
.setTicketId(String.valueOf(request.getTicketId()))
.setTicketType(ticket.getType())
.setUserId(AdminUserUtil.getUserId())
.setUserName(AdminUserUtil.getUserName())
.setCategory("ticketCallReject")
.setFrom("admin")
)

View File

@ -1,9 +1,11 @@
package com.nflg.mobilebroken.admin.event;
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.ChatMessageDTO;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.service.TicketChatService;
import com.nflg.mobilebroken.starter.service.impl.AliYunTranslate;
import org.springframework.beans.BeansException;
@ -16,16 +18,16 @@ import java.time.Instant;
public class TicketCallBeginEvent extends ApplicationEvent implements ApplicationContextAware {
private final Integer ticketId;
private final String userName;
private final AdminUser adminUser;
private final String language;
private SsePushService ssePushService;
private TicketChatService ticketChatService;
public TicketCallBeginEvent(Object source, Integer ticketId, String userName, String language) {
public TicketCallBeginEvent(Object source, Integer ticketId, AdminUser adminUser, String language) {
super(source);
this.ticketId = ticketId;
this.userName = userName;
this.adminUser = adminUser;
this.language = language;
}
@ -40,9 +42,10 @@ public class TicketCallBeginEvent extends ApplicationEvent implements Applicatio
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr())
.setFrom("call")
.setTicketState(TicketState.Processing.getState())
.setSenderId(0)
.setSenderName("通话助手")
.setContentPre(userName)
.setSenderFrom(Constant.FROM_ADMIN)
.setSenderId(adminUser.getId())
.setSenderName(adminUser.getUserName())
.setContentPre(adminUser.getUserName())
.setContent("发起了视频通话")
.setCreateTime(Instant.now());
ticketChatService.addMessage(Long.valueOf(ticketId), message);

View File

@ -1,12 +1,14 @@
package com.nflg.mobilebroken.admin.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
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.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.TicketChatService;
import com.nflg.mobilebroken.starter.service.UniPushService;
import org.springframework.beans.BeansException;
@ -28,6 +30,7 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
private ShengWangService shengWangService;
private StringRedisTemplate stringRedisTemplate;
private UniPushService uniPushService;
private IAppUserService appUserService;
public TicketCallEndEvent(Object source, TicketDTO ticket) {
super(source);
@ -41,6 +44,7 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
this.shengWangService = applicationContext.getBean(ShengWangService.class);
this.stringRedisTemplate = applicationContext.getBean(StringRedisTemplate.class);
this.uniPushService = applicationContext.getBean(UniPushService.class);
this.appUserService = applicationContext.getBean(IAppUserService.class);
}
public void send() throws IOException, InterruptedException {
@ -64,19 +68,20 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
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(String.valueOf(ticket.getId()))
.setTicketType(ticket.getType())
.setUserId(userId)
.setCategory("ticketCallEnd")
.setFrom("admin")
.setSenderId(from + "-uid-0")//不重要
.setReceiverId(from + "-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(String.valueOf(ticket.getId()))
.setTicketType(ticket.getType())
.setUserId(userId)
.setCategory("ticketCallEnd")
.setFrom("admin")
)
)
)
);
);
}
}
}

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.admin.publisher;
import com.nflg.mobilebroken.admin.event.*;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
@ -44,9 +45,9 @@ public class TicketEventPublisher {
eventPublisher.publishEvent(event);
}
public void publishTicketCallBeginEvent(Integer ticketId, String userName) {
public void publishTicketCallBeginEvent(Integer ticketId, AdminUser adminUser) {
String language = MultilingualUtil.getLanguage();
TicketCallBeginEvent event = new TicketCallBeginEvent(this, ticketId, userName, language);
TicketCallBeginEvent event = new TicketCallBeginEvent(this, ticketId, adminUser, language);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}

View File

@ -411,20 +411,30 @@ public class TicketController extends ControllerBase {
MessageVO vo = new MessageVO();
List<ChatMessageVO> messageVOS = ticketChatService.getMessages(ticketId, userId);
String languageCode = MultilingualUtil.getLanguage();
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode)) {
messageVOS.forEach(m -> {
if (m.getSenderId() == 0 && !StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
m.setSenderName(aliYunTranslate.translateWord(m.getSenderName(), aliyunCode));
m.setContent(m.getContentPre() + aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (m.isWithdrawn()) {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (Objects.nonNull(m.getQuote()) && m.getQuote().isWithdrawn()) {
m.getQuote().setContent(aliYunTranslate.translateWord(m.getQuote().getContent(), aliyunCode));
}
});
if (!StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode)) {
messageVOS.forEach(m -> {
if (StrUtil.equals(m.getFrom(), "call")) {
if (StrUtil.equals(m.getContent(), "发起了视频通话")) {
if (StrUtil.equals(m.getSenderFrom(), Constant.FROM_APP) && Objects.equals(m.getSenderId(), userId)) {
m.setContent(aliYunTranslate.translateWord("" + m.getContent(), aliyunCode));
} else {
m.setContent(m.getSenderName() + aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
} else {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
} else {
if (m.isWithdrawn()) {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (Objects.nonNull(m.getQuote()) && m.getQuote().isWithdrawn()) {
m.getQuote().setContent(aliYunTranslate.translateWord(m.getQuote().getContent(), aliyunCode));
}
}
});
}
}
vo.setMessages(messageVOS);
vo.setNotReadCount(Integer.valueOf(Optional.ofNullable((String) stringRedisTemplate.opsForHash().get("chatMessage:notreaded:" + ticketId + ":app:" + userId, "count")).orElse("0")));
@ -631,30 +641,31 @@ public class TicketController extends ControllerBase {
// VUtils.trueThrowBusinessError(ticketCallJoinService.isInCall(ticket.getId(), Constant.FROM_ADMIN, handlerUserId)).throwMessage("对方正在通话中");
AppUser appUser = appUserService.getById(ticket.getUserId());
uniPushService.send(new UniPushMessage()
.setSenderId(ticket.getUserPlatform() + "-uid-" + ticket.getUserId())
.setReceiverId("admin-uid-" + handlerUserId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话")
.setContentPre(appUser.getName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
.setContentPre(appUser.getName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(ticketId))
.setTicketType(ticket.getType())
.setUserId(appUser.getId())
.setUserName(appUser.getName())
.setUserAvatar(appUser.getAvatar())
.setCategory("ticketCall")
.setFrom("app")
.setReceiverId("admin-uid-" + handlerUserId)
.setSenderId(ticket.getUserPlatform() + "-uid-" + ticket.getUserId())
.setReceiverId("admin-uid-" + handlerUserId)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
// .setContentPre(appUser.getName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
// .setContentPre(appUser.getName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(ticketId))
.setTicketType(ticket.getType())
.setUserId(appUser.getId())
.setUserName(appUser.getName())
.setUserAvatar(appUser.getAvatar())
.setCategory("ticketCall")
.setFrom("app")
.setReceiverId("admin-uid-" + handlerUserId)
)
)
)
);
ssePushService.sendTicketCallToAdmin(appUser, handlerUserId, ticketId);
// ticketCallService.add(ticketId, AppUserUtil.getUserId(),Constant.FROM_APP, handlerUserId, Constant.FROM_ADMIN);
ticketEventPublisher.publishTicketCallBeginEvent(ticketId, appUser.getName());
ticketEventPublisher.publishTicketCallBeginEvent(ticketId, appUser);
stringRedisTemplate.opsForSet().add(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId, Constant.FROM_ADMIN + "-uid-" + handlerUserId);
stringRedisTemplate.expire(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId, 1, TimeUnit.MINUTES);
return ApiResult.success();
@ -679,6 +690,7 @@ public class TicketController extends ControllerBase {
.setSenderId(AppUserUtil.getFrom() + "-uid-" + AppUserUtil.getUserId())//不重要
.setReceiverId(AppUserUtil.getFrom() + "-uid-" + AppUserUtil.getUserId())
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
.setContent("加入通话")
.setPayload(new UniPushMessageCallPayload()
@ -686,6 +698,7 @@ public class TicketController extends ControllerBase {
.setTicketId(String.valueOf(ticketId))
.setTicketType(ticket.getType())
.setUserId(AppUserUtil.getUserId())
.setUserName(AppUserUtil.getUserName())
.setCategory("ticketCallJoined")
.setFrom("app")
)
@ -710,6 +723,7 @@ public class TicketController extends ControllerBase {
.setSenderId(uid)//不重要
.setReceiverId(uid)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
.setContent("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
@ -730,6 +744,7 @@ public class TicketController extends ControllerBase {
.setSenderId(AppUserUtil.getFrom() + "-uid-" + AppUserUtil.getUserId())//不重要
.setReceiverId(request.getFrom() + "-uid-" + request.getFromUserId())
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
.setContent("视频通话拒接")
.setPayload(new UniPushMessageCallPayload()
@ -737,6 +752,7 @@ public class TicketController extends ControllerBase {
.setTicketId(String.valueOf(request.getTicketId()))
.setTicketType(ticket.getType())
.setUserId(AppUserUtil.getUserId())
.setUserName(AppUserUtil.getUserName())
.setCategory("ticketCallReject")
.setFrom("app")
)

View File

@ -1,9 +1,11 @@
package com.nflg.mobilebroken.cfs.event;
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.ChatMessageDTO;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.service.TicketChatService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
@ -15,16 +17,16 @@ import java.time.Instant;
public class TicketCallBeginEvent extends ApplicationEvent implements ApplicationContextAware {
private final Long ticketId;
private final String userName;
private final AppUser appUser;
private final String language;
private SsePushService ssePushService;
private TicketChatService ticketChatService;
public TicketCallBeginEvent(Object source, Long ticketId, String userName, String language) {
public TicketCallBeginEvent(Object source, Long ticketId, AppUser appUser, String language) {
super(source);
this.ticketId = ticketId;
this.userName = userName;
this.appUser = appUser;
this.language = language;
}
@ -34,19 +36,20 @@ public class TicketCallBeginEvent extends ApplicationEvent implements Applicatio
this.ticketChatService = applicationContext.getBean(TicketChatService.class);
}
public void send(){
public void send() {
ChatMessageDTO message = new ChatMessageDTO()
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr())
.setFrom("call")
.setTicketState(TicketState.Processing.getState())
.setSenderId(0)
.setSenderName("通话助手")
.setContentPre(userName)
.setSenderFrom(Constant.FROM_APP)
.setSenderId(appUser.getId())
.setSenderName(appUser.getName())
.setContentPre(appUser.getName())
.setContent("发起了视频通话")
.setCreateTime(Instant.now());
ticketChatService.addMessage(ticketId, message);
//推送消息
ssePushService.sendTicketMessageToAdmin(ticketId,message);
ssePushService.sendTicketMessageToApp(ticketId,message);
ssePushService.sendTicketMessageToAdmin(ticketId, message);
ssePushService.sendTicketMessageToApp(ticketId, message);
}
}

View File

@ -1,11 +1,13 @@
package com.nflg.mobilebroken.cfs.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
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.IAppUserService;
import com.nflg.mobilebroken.repository.service.TicketChatService;
import com.nflg.mobilebroken.starter.service.UniPushService;
import org.springframework.beans.BeansException;
@ -27,6 +29,7 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
private ShengWangService shengWangService;
private StringRedisTemplate stringRedisTemplate;
private UniPushService uniPushService;
private IAppUserService appUserService;
public TicketCallEndEvent(Object source, TicketDTO ticket) {
super(source);
@ -40,6 +43,7 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
this.shengWangService = applicationContext.getBean(ShengWangService.class);
this.stringRedisTemplate = applicationContext.getBean(StringRedisTemplate.class);
this.uniPushService = applicationContext.getBean(UniPushService.class);
this.appUserService = applicationContext.getBean(IAppUserService.class);
}
public void send() throws IOException, InterruptedException {
@ -67,6 +71,7 @@ public class TicketCallEndEvent extends ApplicationEvent implements ApplicationC
.setSenderId(from + "-uid-0")//不重要
.setReceiverId(from + "-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话结束")
.setPayload(new UniPushMessageCallPayload()
.setTicketId(String.valueOf(ticket.getId()))

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.cfs.publisher;
import com.nflg.mobilebroken.cfs.event.*;
import com.nflg.mobilebroken.common.pojo.dto.TicketDTO;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.entity.Ticket;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
@ -55,9 +56,9 @@ public class TicketEventPublisher {
eventPublisher.publishEvent(event);
}
public void publishTicketCallBeginEvent(Long ticketId, String userName) {
public void publishTicketCallBeginEvent(Long ticketId, AppUser appUser) {
String language = MultilingualUtil.getLanguage();
TicketCallBeginEvent event = new TicketCallBeginEvent(this, ticketId, userName, language);
TicketCallBeginEvent event = new TicketCallBeginEvent(this, ticketId, appUser, language);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}

View File

@ -13,6 +13,8 @@ public class Constant {
public static final String DEFAULT_LANGUAGE_CODE = "cn";
public static final String HEADER_LANGUAGE = "language";
public static final String DICTIONARY_TYPE_SERVICE_EVALUATION = "ServiceEvaluation";
public static final String DICTIONARY_TYPE_EXPERIENCE_EVALUATION = "ExperienceEvaluation";

View File

@ -21,6 +21,9 @@ public class ChatMessageDTO {
//来源
private String from;
// 发送者来源app或者admin
private String senderFrom;
// 发送者id
private Integer senderId;

View File

@ -9,14 +9,17 @@ import java.util.Objects;
@Accessors(chain = true)
public class UniPushMessageBody {
//来源
private String from;
private String title;
// 消息内容前缀
private String contentPre;
public String getContentPre() {
return Objects.isNull(contentPre) ? "" : contentPre + " ";
}
// // 消息内容前缀
// private String contentPre;
//
// public String getContentPre() {
// return Objects.isNull(contentPre) ? "" : contentPre + " ";
// }
private String content;

View File

@ -31,12 +31,12 @@ public class UniPushMessageCallPayload {
private String title;
// 消息内容前缀
private String contentPre;
public String getContentPre() {
return Objects.isNull(contentPre) ? "" : contentPre;
}
// // 消息内容前缀
// private String contentPre;
//
// public String getContentPre() {
// return Objects.isNull(contentPre) ? "" : contentPre;
// }
private String content;

View File

@ -15,6 +15,9 @@ public class ChatMessageVO {
//来源
private String from;
// 发送者来源app或者admin
private String senderFrom;
// 发送者id
private Integer senderId;

View File

@ -830,20 +830,30 @@ public class TicketController extends ControllerBase {
MessageVO vo = new MessageVO();
List<ChatMessageVO> messageVOS = ticketChatService.getMessages(ticketId, userId);
String languageCode = MultilingualUtil.getLanguage();
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode)) {
messageVOS.forEach(m -> {
if (m.getSenderId() == 0 && !StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
m.setSenderName(aliYunTranslate.translateWord(m.getSenderName(), aliyunCode));
m.setContent(m.getContentPre() + aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (m.isWithdrawn()) {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (Objects.nonNull(m.getQuote()) && m.getQuote().isWithdrawn()) {
m.getQuote().setContent(aliYunTranslate.translateWord(m.getQuote().getContent(), aliyunCode));
}
});
if (!StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode)) {
messageVOS.forEach(m -> {
if (StrUtil.equals(m.getFrom(), "call")) {
if (StrUtil.equals(m.getContent(), "发起了视频通话")) {
if (StrUtil.equals(m.getSenderFrom(), Constant.FROM_ADMIN) && Objects.equals(m.getSenderId(), userId)) {
m.setContent(aliYunTranslate.translateWord("" + m.getContent(), aliyunCode));
} else {
m.setContent(m.getSenderName() + aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
} else {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
} else {
if (m.isWithdrawn()) {
m.setContent(aliYunTranslate.translateWord(m.getContent(), aliyunCode));
}
if (Objects.nonNull(m.getQuote()) && m.getQuote().isWithdrawn()) {
m.getQuote().setContent(aliYunTranslate.translateWord(m.getQuote().getContent(), aliyunCode));
}
}
});
}
}
vo.setMessages(messageVOS);
vo.setNotReadCount(Integer.valueOf(Optional.ofNullable((String) stringRedisTemplate.opsForHash().get("chatMessage:notreaded:" + ticketId + ":admin:" + userId, "count")).orElse("0")));
@ -958,7 +968,7 @@ public class TicketController extends ControllerBase {
@GetMapping("getSolutionReviewDepartment")
@ApiMark(moduleName = "工单管理", apiName = "获取工单解决方案评审部门")
public ApiResult<List<SolutionReviewDepartmentVO>> getSolutionReviewDepartment(@Valid @RequestParam @NotNull Long ticketId) {
return ApiResult.success(ticketSolutionAuditService.getByTicket(ticketId,MultilingualUtil.getLanguage()));
return ApiResult.success(ticketSolutionAuditService.getByTicket(ticketId, MultilingualUtil.getLanguage()));
}
/**
@ -1221,7 +1231,7 @@ public class TicketController extends ControllerBase {
}
}
//解决方案审核
List<SolutionReviewDepartmentVO> reviewDepartments = ticketSolutionAuditService.getByTicket(ticketId,MultilingualUtil.getLanguage())
List<SolutionReviewDepartmentVO> reviewDepartments = ticketSolutionAuditService.getByTicket(ticketId, MultilingualUtil.getLanguage())
.stream()
.filter(vo -> StrUtil.isNotBlank(vo.getUserName()))
.collect(Collectors.toList());
@ -1400,33 +1410,34 @@ public class TicketController extends ControllerBase {
// ticketCallService.add(ticketId, sendUserId, sendUserFrom, receiveUserId, receiveUserFrom);
AdminUser adminUser = adminUserService.getById(sendUserId);
uniPushService.send(new UniPushMessage()
.setSenderId("admin-uid-" + sendUserId)
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(ticketId))
.setTicketType(1)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
.setSenderId("admin-uid-" + sendUserId)
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(ticketId))
.setTicketType(1)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId(receiveUserFrom + "-uid-" + receiveUserId)
)
)
)
);
if (StrUtil.equals(Constant.FROM_APP, ticket.getUserPlatform())) {
ssePushService.sendTicketCallToApp(adminUser, ticket.getUserId(), ticketId);
} else {
ssePushService.sendTicketCallToAdmin(adminUser, receiveUserId, ticketId);
}
ticketEventPublisher.publishTicketCallBeginEvent(ticketId, adminUser.getUserName());
ticketEventPublisher.publishTicketCallBeginEvent(ticketId, adminUser);
stringRedisTemplate.opsForSet().add(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId, receiveUserFrom + "-uid-" + receiveUserId);
stringRedisTemplate.expire(Constant.REDIS_KEY_TICKET_CALL_WAIT + ticketId, 1, TimeUnit.MINUTES);
return ApiResult.success();
@ -1453,26 +1464,27 @@ public class TicketController extends ControllerBase {
userNames.add(adminUser1.getUserName());
} else {
uniPushService.send(new UniPushMessage()
.setSenderId("admin-uid-" + adminUser.getId())
.setReceiverId("admin-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
.setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(request.getTicketId()))
.setTicketType(1)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId("admin-uid-" + userId)
.setSenderId("admin-uid-" + adminUser.getId())
.setReceiverId("admin-uid-" + userId)
.setSendData(new UniPushMessageBody()
.setFrom("call")
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setPayload(new UniPushMessageCallPayload()
.setTitle("视频通话")
// .setContentPre(adminUser.getUserName())
.setContent("请求与您视频通话")
.setTicketId(String.valueOf(request.getTicketId()))
.setTicketType(1)
.setUserId(adminUser.getId())
.setUserName(adminUser.getUserName())
.setUserAvatar(adminUser.getAvatar())
.setCategory("ticketCall")
.setFrom("admin")
.setReceiverId("admin-uid-" + userId)
)
)
)
);
ssePushService.sendTicketCallToAdmin(adminUser, userId, request.getTicketId());
// ticketCallJoinService.add(ticketCall.getId(), userId, Constant.FROM_ADMIN);

View File

@ -1,9 +1,11 @@
package com.nflg.mobilebroken.gongfu.event;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.gongfu.service.SsePushService;
import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.dto.ChatMessageDTO;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.service.TicketChatService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
@ -15,16 +17,16 @@ import java.time.Instant;
public class TicketCallBeginEvent extends ApplicationEvent implements ApplicationContextAware {
private final Long ticketId;
private final String userName;
private final AdminUser adminUser;
private final String language;
private SsePushService ssePushService;
private TicketChatService ticketChatService;
public TicketCallBeginEvent(Object source, Long ticketId, String userName, String language) {
public TicketCallBeginEvent(Object source, Long ticketId, AdminUser adminUser, String language) {
super(source);
this.ticketId = ticketId;
this.userName = userName;
this.adminUser = adminUser;
this.language = language;
}
@ -39,9 +41,10 @@ public class TicketCallBeginEvent extends ApplicationEvent implements Applicatio
.setId(cn.hutool.core.util.IdUtil.getSnowflakeNextIdStr())
.setFrom("call")
.setTicketState(TicketState.Processing.getState())
.setSenderId(0)
.setSenderName("通话助手")
.setContentPre(userName)
.setSenderFrom(Constant.FROM_ADMIN)
.setSenderId(adminUser.getId())
.setSenderName(adminUser.getUserName())
.setContentPre(adminUser.getUserName())
.setContent("发起了视频通话")
.setCreateTime(Instant.now());
ticketChatService.addMessage(ticketId, message);

View File

@ -2,6 +2,7 @@ package com.nflg.mobilebroken.gongfu.publisher;
import com.nflg.mobilebroken.gongfu.event.*;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.GongfuTicket;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
@ -43,9 +44,9 @@ public class TicketEventPublisher {
eventPublisher.publishEvent(event);
}
public void publishTicketCallBeginEvent(Long ticketId, String userName) {
public void publishTicketCallBeginEvent(Long ticketId, AdminUser adminUser) {
String language = MultilingualUtil.getLanguage();
TicketCallBeginEvent event = new TicketCallBeginEvent(this, ticketId, userName, language);
TicketCallBeginEvent event = new TicketCallBeginEvent(this, ticketId, adminUser, language);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}

View File

@ -63,6 +63,7 @@ public class TicketChatService {
.setId(m.getId())
.setFrom(m.getFrom())
.setTicketState(m.getTicketState())
.setSenderFrom(m.getSenderFrom())
.setSenderId(m.getSenderId())
.setSenderName(m.getSenderName())
.setSenderAvatar(m.getSenderAvatar())
@ -79,6 +80,7 @@ public class TicketChatService {
.setId(m.getQuote().getId())
.setFrom(m.getQuote().getFrom())
.setTicketState(m.getQuote().getTicketState())
.setSenderFrom(m.getQuote().getSenderFrom())
.setSenderId(m.getQuote().getSenderId())
.setSenderName(m.getQuote().getSenderName())
.setSenderAvatar(m.getQuote().getSenderAvatar())

View File

@ -61,6 +61,7 @@
, u.title_id
, p.position_name AS 'title'
, u.type
,u.language_code
FROM app_user u
LEFT JOIN t_base_customer c ON u.company_id = c.id
LEFT JOIN t_base_area a1 ON u.area_id = a1.id

View File

@ -1,6 +1,9 @@
package com.nflg.mobilebroken.starter.interceptor;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.util.MultilingualUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
@ -14,12 +17,14 @@ public class LanguageInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 从请求头中获取 language 参数
String language = request.getHeader("language");
if(StrUtil.isNotBlank(language)){
String language = request.getHeader(Constant.HEADER_LANGUAGE);
if (StrUtil.isNotBlank(language)) {
MultilingualUtil.setLanguage(language);
StpUtil.getTokenSession().set(Constant.HEADER_LANGUAGE, language);
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求完成后清理 ThreadLocal防止内存泄漏

View File

@ -35,7 +35,7 @@ public class UniPushService {
@Async("httpExecutor")
public CompletableFuture<Void> send(UniPushMessage message) {
translate(message);
// translate(message, languageCode);
log.info("发送uniapp消息{}", JSONUtil.toJsonStr(message));
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity(url, message, String.class);
@ -43,31 +43,32 @@ public class UniPushService {
return CompletableFuture.completedFuture(null);
}
private void translate(UniPushMessage message) {
String languageCode = MultilingualUtil.getLanguage();
String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
if (StrUtil.isNotBlank(aliyunCode) && !StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
UniPushMessageBody body = message.getSendData();
body.setTitle(aliYunTranslate.translateWord(body.getTitle(), aliyunCode));
body.setContent(body.getContentPre() + aliYunTranslate.translateWord(body.getContent(), aliyunCode));
if (body.getPayload() instanceof UniPushMessageCallPayload) {
UniPushMessageCallPayload payload = (UniPushMessageCallPayload) body.getPayload();
payload.setTitle(aliYunTranslate.translateWord(payload.getTitle(), aliyunCode));
payload.setContent(payload.getContentPre() + aliYunTranslate.translateWord(payload.getContent(), aliyunCode));
}
}
}
// private void translate(UniPushMessage message, String languageCode) {
// if (!StrUtil.equals(languageCode, Constant.DEFAULT_LANGUAGE_CODE)) {
// String aliyunCode = Constant.LANGUAGE_ALIYUN_MAP.get(languageCode);
// if (StrUtil.isNotBlank(aliyunCode)) {
// UniPushMessageBody body = message.getSendData();
// body.setTitle(aliYunTranslate.translateWord(body.getTitle(), aliyunCode));
// body.setContent(body.getContentPre() + aliYunTranslate.translateWord(body.getContent(), aliyunCode));
// if (body.getPayload() instanceof UniPushMessageCallPayload) {
// UniPushMessageCallPayload payload = (UniPushMessageCallPayload) body.getPayload();
// payload.setTitle(aliYunTranslate.translateWord(payload.getTitle(), aliyunCode));
// payload.setContent(payload.getContentPre() + aliYunTranslate.translateWord(payload.getContent(), aliyunCode));
// }
// }
// }
// }
public void sendTicketMessage(String from, String to, ChatMessageDTO data) {
send(new UniPushMessage()
.setSenderId(from)
.setReceiverId(to)
.setSendData(new UniPushMessageBody()
.setTitle("工单聊天消息")
.setContent(CollectionUtil.isNotEmpty(data.getAttachments()) ? "文件" : (CollectionUtil.isNotEmpty(data.getImages()) ? "图片" : data.getContent()))
)
);
}
// public void sendTicketMessage(String from, String to, ChatMessageDTO data) {
// send(new UniPushMessage()
// .setSenderId(from)
// .setReceiverId(to)
// .setSendData(new UniPushMessageBody()
// .setTitle("工单聊天消息")
// .setContent(CollectionUtil.isNotEmpty(data.getAttachments()) ? "文件" : (CollectionUtil.isNotEmpty(data.getImages()) ? "图片" : data.getContent()))
// )
// );
// }
public void sendTodoMessageFromAdmin(String ticketId, Integer type, String platform, Integer userId, String content) {
send(new UniPushMessage()