Merge branch 'feature/REQ-3345'

This commit is contained in:
yanglin 2025-02-28 13:53:35 +08:00
commit 80d1606fa4
14 changed files with 146 additions and 45 deletions

View File

@ -7,6 +7,7 @@ import cn.axzo.msg.center.api.mq.PresetButtonPressedMessage;
import cn.axzo.msg.center.api.request.AddMnsChannelRequest; import cn.axzo.msg.center.api.request.AddMnsChannelRequest;
import cn.axzo.msg.center.api.request.MnsSendCodeV2Req; import cn.axzo.msg.center.api.request.MnsSendCodeV2Req;
import cn.axzo.msg.center.api.request.SendMessageRequestDto; import cn.axzo.msg.center.api.request.SendMessageRequestDto;
import cn.axzo.msg.center.api.request.UpdateMnsChannelTemplateContentRequest;
import cn.axzo.msg.center.api.request.UpdateMnsTemplateContentRequest; import cn.axzo.msg.center.api.request.UpdateMnsTemplateContentRequest;
import cn.axzo.msg.center.api.request.v3.MessageSendReqV3; import cn.axzo.msg.center.api.request.v3.MessageSendReqV3;
import cn.axzo.msg.center.api.request.v3.SearchMessageReqV3; import cn.axzo.msg.center.api.request.v3.SearchMessageReqV3;
@ -15,7 +16,9 @@ import cn.axzo.msg.center.api.request.v3.SearchTodoLogReq;
import cn.axzo.msg.center.api.request.v3.SetImSendPriorityRequest; import cn.axzo.msg.center.api.request.v3.SetImSendPriorityRequest;
import cn.axzo.msg.center.api.request.v3.UpdateMnsChannelTemplateRequest; import cn.axzo.msg.center.api.request.v3.UpdateMnsChannelTemplateRequest;
import cn.axzo.msg.center.api.request.v4.MessageSendRequestV4; import cn.axzo.msg.center.api.request.v4.MessageSendRequestV4;
import cn.axzo.msg.center.dal.MNSChannelMessageTemplateDao;
import cn.axzo.msg.center.dal.MNSMessageTemplateDao; import cn.axzo.msg.center.dal.MNSMessageTemplateDao;
import cn.axzo.msg.center.domain.entity.MNSChannelMessageTemplate;
import cn.axzo.msg.center.domain.entity.MNSMessageTemplate; import cn.axzo.msg.center.domain.entity.MNSMessageTemplate;
import cn.axzo.msg.center.im.service.IMService; import cn.axzo.msg.center.im.service.IMService;
import cn.axzo.msg.center.inside.notices.service.impl.TingyunService; import cn.axzo.msg.center.inside.notices.service.impl.TingyunService;
@ -81,6 +84,7 @@ public class PrivateMessageController {
private final MNSNoticesApi mnsNoticesApi; private final MNSNoticesApi mnsNoticesApi;
private final MessageChannelRouter messageChannelRouter; private final MessageChannelRouter messageChannelRouter;
private final MNSMessageTemplateDao mnsMessageTemplateDao; private final MNSMessageTemplateDao mnsMessageTemplateDao;
private final MNSChannelMessageTemplateDao mnsChannelMessageTemplateDao;
private final TingyunService tingyunService; private final TingyunService tingyunService;
private final MqProducer mqProducer; private final MqProducer mqProducer;
private final CardManager cardManager; private final CardManager cardManager;
@ -219,6 +223,15 @@ public class PrivateMessageController {
.update(); .update();
} }
@PostMapping("/updateMnsTemplateChannelContent")
@EnableResponseAdvice(enable = false)
public Object updateMnsTemplateChannelContent(@RequestBody @Valid UpdateMnsChannelTemplateContentRequest request) {
return mnsChannelMessageTemplateDao.lambdaUpdate()
.eq(MNSChannelMessageTemplate::getTemplateNo, request.getTemplateCode())
.set(MNSChannelMessageTemplate::getTemplateContent, request.getTemplateContent())
.update();
}
@PostMapping("/listMnsApps") @PostMapping("/listMnsApps")
@EnableResponseAdvice(enable = false) @EnableResponseAdvice(enable = false)
public Object listMnsApps() { public Object listMnsApps() {

View File

@ -81,7 +81,9 @@ public class CardManager {
public CardSendResponse send(CardSendRequest request) { public CardSendResponse send(CardSendRequest request) {
// 校验参数 // 校验参数
BizAssertions.assertNotNull(request.getSender(), "发送人不能为空"); BizAssertions.assertNotNull(request.getSender(), "发送人不能为空");
BizAssertions.assertNotEmpty(request.getReceivers(), "接收人不能为空"); BizAssertions.assertFalse(
request.getReceivers().isEmpty()
&& request.getImReceiveAccounts().isEmpty(), "接收人不能为空");
RequestInfo requestInfo = new RequestInfo(); RequestInfo requestInfo = new RequestInfo();
requestInfo.setTemplateCode(request.getTemplateCode()); requestInfo.setTemplateCode(request.getTemplateCode());
requestInfo.setBizCode(request.getBizCode()); requestInfo.setBizCode(request.getBizCode());

View File

@ -98,8 +98,7 @@ public class CardSupport {
GeneralMessagePushVO cardContent = cardParser.parseCardContent( GeneralMessagePushVO cardContent = cardParser.parseCardContent(
sendModel.getCardTemplate(), sendModel.getRequest()); sendModel.getCardTemplate(), sendModel.getRequest());
sendModel.setCardContent(cardContent); sendModel.setCardContent(cardContent);
for (PeerPerson person : sendModel.getRequest().getReceivers()) { Supplier<Card> cardFactory = () -> {
for (AppTypeEnum appType : sendModel.getCardTemplate().ensureAppTypesPresent()) {
Card card = new Card(); Card card = new Card();
sendModel.addCard(card); sendModel.addCard(card);
card.setBatchNo(sendModel.getRequestContext().getBatchNo()); card.setBatchNo(sendModel.getRequestContext().getBatchNo());
@ -119,18 +118,32 @@ public class CardSupport {
card.setRouterParam(sendModel.getRequest().getRouterParam()); card.setRouterParam(sendModel.getRequest().getRouterParam());
card.setSenderAppType(AppTypeEnum.SYSTEM); card.setSenderAppType(AppTypeEnum.SYSTEM);
card.setIsSenderRobot(YesOrNo.YES); card.setIsSenderRobot(YesOrNo.YES);
card.setReceiverAppType(appType);
card.setSenderPersonId(sendModel.getRequest().getSender().getPersonIdOrDefault()); card.setSenderPersonId(sendModel.getRequest().getSender().getPersonIdOrDefault());
card.setSenderOuId(sendModel.getRequest().getSender().getOuIdOrDefault()); card.setSenderOuId(sendModel.getRequest().getSender().getOuIdOrDefault());
card.setSenderWorkspaceId(sendModel.getRequest().getSender().getWorkspaceIdOrDefault()); card.setSenderWorkspaceId(sendModel.getRequest().getSender().getWorkspaceIdOrDefault());
card.setReceiverPersonId(person.getPersonIdOrDefault());
card.setReceiverOuId(person.getOuIdOrDefault());
card.setReceiverWorkspaceId(person.getWorkspaceIdOrDefault());
card.setSubtitle(sendModel.getRequest().getSubtitle()); card.setSubtitle(sendModel.getRequest().getSubtitle());
card.setButtonStates(Collections.emptyList()); card.setButtonStates(Collections.emptyList());
card.setUpdatable(sendModel.getCardTemplate().isUpdatable() ? YesOrNo.YES : YesOrNo.NO); card.setUpdatable(sendModel.getCardTemplate().isUpdatable() ? YesOrNo.YES : YesOrNo.NO);
return card;
};
for (PeerPerson person : sendModel.getRequest().receiversOrEmpty()) {
for (AppTypeEnum appType : sendModel.getCardTemplate().ensureAppTypesPresent()) {
Card card = cardFactory.get();
card.setReceiverAppType(appType);
card.setReceiverPersonId(person.getPersonIdOrDefault());
card.setReceiverOuId(person.getOuIdOrDefault());
card.setReceiverWorkspaceId(person.getWorkspaceIdOrDefault());
card.setImReceiveAccount("");
} }
} }
for (String imAccount : sendModel.getRequest().imReceiveAccountsOrEmpty()) {
Card card = cardFactory.get();
card.setReceiverAppType(AppTypeEnum.NONE);
card.setReceiverPersonId(-1L);
card.setReceiverOuId(-1L);
card.setReceiverWorkspaceId(-1L);
card.setImReceiveAccount(imAccount);
}
} }
SendTemplateMessageParam buildImSendRequest(CardSendModel sendModel, SendTemplateMessageParam buildImSendRequest(CardSendModel sendModel,
@ -168,6 +181,7 @@ public class CardSupport {
.append(subBizCode) .append(subBizCode)
.build()); .build());
imRequest.setReceivePersons(group.buildReceiverAccounts()); imRequest.setReceivePersons(group.buildReceiverAccounts());
imRequest.setImReceiveAccounts(group.collectImReceiveAccounts());
imRequest.setExt(extBuilder.get()); imRequest.setExt(extBuilder.get());
imRequest.setUpdatable(sendModel.getCardTemplate().isUpdatable()); imRequest.setUpdatable(sendModel.getCardTemplate().isUpdatable());
if (pushData.determinePushable(log, template.getCode())) { if (pushData.determinePushable(log, template.getCode())) {

View File

@ -10,12 +10,15 @@ import cn.axzo.msg.center.nimpush.device.PushDeviceSnapshots;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set;
import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
/** /**
* @author yanglin * @author yanglin
@ -31,15 +34,18 @@ public class CardGroup {
cards.add(card); cards.add(card);
} }
public List<PersonAccountAttribute> buildReceiverAccounts() { public Set<PersonAccountAttribute> buildReceiverAccounts() {
return getCards().stream().map(card -> { return getCards().stream()
.filter(card -> card.getReceiverAppType() != AppTypeEnum.NONE)
.map(card -> {
PersonAccountAttribute account = new PersonAccountAttribute(); PersonAccountAttribute account = new PersonAccountAttribute();
account.setPersonId(card.getReceiverPersonId() + ""); account.setPersonId(card.getReceiverPersonId() + "");
account.setOuId(card.getReceiverOuId()); account.setOuId(card.getReceiverOuId());
account.setWorkspaceId(card.getReceiverWorkspaceId()); account.setWorkspaceId(card.getReceiverWorkspaceId());
account.setAppType(groupKey.getAppType()); account.setAppType(groupKey.getAppType());
return account; return account;
}).collect(toList()); })
.collect(toSet());
} }
public List<ExcludePushPayload> buildNimPushExcludes(PushDeviceSnapshots deviceSnapshots) { public List<ExcludePushPayload> buildNimPushExcludes(PushDeviceSnapshots deviceSnapshots) {
@ -58,6 +64,13 @@ public class CardGroup {
.collect(toList()); .collect(toList());
} }
public Set<String> collectImReceiveAccounts() {
return getCards().stream()
.map(Card::getImReceiveAccount)
.filter(StringUtils::isNotBlank)
.collect(toSet());
}
@Override @Override
public String toString() { public String toString() {
return JSON.toJSONString(this); return JSON.toJSONString(this);

View File

@ -60,6 +60,7 @@ public class CardLoggers {
log.setReceiverOuId(card.getReceiverOuId()); log.setReceiverOuId(card.getReceiverOuId());
log.setReceiverWorkspaceId(card.getReceiverWorkspaceId()); log.setReceiverWorkspaceId(card.getReceiverWorkspaceId());
log.setReceiverAppType(card.getReceiverAppType()); log.setReceiverAppType(card.getReceiverAppType());
log.setImReceiveAccount(card.getImReceiveAccount());
log.setBizState(card.getBizState()); log.setBizState(card.getBizState());
log.setCardState(card.getCardState()); log.setCardState(card.getCardState());
log.setIdentityCode(card.getIdentityCode()); log.setIdentityCode(card.getIdentityCode());

View File

@ -151,7 +151,7 @@ public class TodoRangeQueryService {
*/ */
private AnalysisPage<PendingRecordAdapter> pageQueryBusiness( private AnalysisPage<PendingRecordAdapter> pageQueryBusiness(
PendingMessagePageRequest request, List<String> templateCodes) { PendingMessagePageRequest request, List<String> templateCodes) {
Date startingAt = DateFormatUtil.toDate(LocalDateTime.now().minusDays(90)); Date startingAt = DateFormatUtil.toDate(LocalDateTime.now().minusDays(270));
LambdaQueryWrapper<TodoBusiness> query = businessQuery(request.getTitle(), true) LambdaQueryWrapper<TodoBusiness> query = businessQuery(request.getTitle(), true)
.in(CollectionUtils.isNotEmpty(request.getTemplateCodes()), TodoBusiness::getTemplateCode, request.getTemplateCodes()) .in(CollectionUtils.isNotEmpty(request.getTemplateCodes()), TodoBusiness::getTemplateCode, request.getTemplateCodes())
.eq(TodoBusiness::getPromoterPersonId, request.getPersonId()) .eq(TodoBusiness::getPromoterPersonId, request.getPersonId())
@ -224,8 +224,12 @@ public class TodoRangeQueryService {
PendingMessagePageRequest request, Supplier<AnalysisPage<PendingRecordAdapter>> pageQuery) { PendingMessagePageRequest request, Supplier<AnalysisPage<PendingRecordAdapter>> pageQuery) {
AnalysisInfo analysis = request.getA(); AnalysisInfo analysis = request.getA();
Object analyzeItem = analysisHelper.getAnalyzeBusiness(analysis); Object analyzeItem = analysisHelper.getAnalyzeBusiness(analysis);
if (analyzeItem == null) if (analyzeItem == null) {
analyzeItem = analysisHelper.getAnalyzeTodo(request, analysis); Todo todo = analysisHelper.getAnalyzeTodo(request, analysis);
analyzeItem = todo;
if (todo != null && analysis.isTodoBusiness())
analyzeItem = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null);
}
if (analyzeItem != null || analysis.isCollectSql()) if (analyzeItem != null || analysis.isCollectSql())
CollectSQLInterceptor.enableCollectSQL(new CollectSqlConfig(true)); CollectSQLInterceptor.enableCollectSQL(new CollectSqlConfig(true));
try { try {

View File

@ -157,4 +157,9 @@ public class ProxyStatement extends StatementWrapper {
public Statement unwrap() { public Statement unwrap() {
return rawStatement; return rawStatement;
} }
@Override
public String toString() {
return rawStatement.toString();
}
} }

View File

@ -0,0 +1,21 @@
package cn.axzo.msg.center.api.request;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author yanglin
*/
@Setter
@Getter
public class UpdateMnsChannelTemplateContentRequest {
@NotBlank(message = "渠道模板编号不能为空")
private String templateCode;
@NotBlank(message = "模板内容不能为空")
private String templateContent;
}

View File

@ -12,7 +12,7 @@ import javax.validation.constraints.NotBlank;
@Getter @Getter
public class UpdateMnsTemplateContentRequest { public class UpdateMnsTemplateContentRequest {
@NotBlank(message = "模板编号不能为空") @NotBlank(message = "内部模板编号不能为空")
private String innerTemplateCode; private String innerTemplateCode;
@NotBlank(message = "模板内容不能为空") @NotBlank(message = "模板内容不能为空")

View File

@ -13,5 +13,6 @@ public class AnalysisInfo {
private Long businessId; private Long businessId;
private String bizCode; private String bizCode;
private boolean collectSql; private boolean collectSql;
private boolean todoBusiness;
} }

View File

@ -13,7 +13,6 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
@ -70,9 +69,13 @@ public class CardSendRequest implements CardContent {
/** /**
* 接收人 * 接收人
*/ */
@NotEmpty(message = "接收人不能为空")
private Set<PeerPerson> receivers = new HashSet<>(); private Set<PeerPerson> receivers = new HashSet<>();
/**
* 消息接收IM账号或群id
*/
private Set<String> imReceiveAccounts;
/** /**
* 业务参数 * 业务参数
*/ */
@ -93,6 +96,14 @@ public class CardSendRequest implements CardContent {
*/ */
private boolean returnCards = false; private boolean returnCards = false;
public Set<PeerPerson> receiversOrEmpty() {
return receivers == null ? Collections.emptySet() : receivers;
}
public Set<String> imReceiveAccountsOrEmpty() {
return imReceiveAccounts == null ? Collections.emptySet() : imReceiveAccounts;
}
@Override @JsonIgnore @JSONField(serialize = false, defaultValue = "false") @Override @JsonIgnore @JSONField(serialize = false, defaultValue = "false")
public CardStateInfo getStateInfo() { public CardStateInfo getStateInfo() {
return CardStateInfo.create(CardState.CREATED, CardBizState.PENDING); return CardStateInfo.create(CardState.CREATED, CardBizState.PENDING);

View File

@ -57,8 +57,12 @@ public class CardDao extends ServiceImpl<CardMapper, Card> {
List<UpdatableMessageSendResult> updatableResults = imResponse.getUpdatableMessageSendResults(); List<UpdatableMessageSendResult> updatableResults = imResponse.getUpdatableMessageSendResults();
if (updatableResults == null) if (updatableResults == null)
updatableResults = Collections.emptyList(); updatableResults = Collections.emptyList();
Map<PersonAccountAttribute, String> account2BizMessageId = updatableResults.stream() Map<PersonAccountAttribute, String> person2BizMessageId = updatableResults.stream()
.collect(toMap(UpdatableMessageSendResult::getAccount, UpdatableMessageSendResult::getBizMessageId)); .filter(result -> result.getPerson() != null)
.collect(toMap(UpdatableMessageSendResult::getPerson, UpdatableMessageSendResult::getBizMessageId));
Map<String, String> imAccount2BizMessageId = updatableResults.stream()
.filter(result -> result.getImAccount() != null)
.collect(toMap(UpdatableMessageSendResult::getImAccount, UpdatableMessageSendResult::getBizMessageId));
for (Card card : cards) { for (Card card : cards) {
PersonAccountAttribute key = new PersonAccountAttribute(); PersonAccountAttribute key = new PersonAccountAttribute();
key.setPersonId(card.getReceiverPersonId() + ""); key.setPersonId(card.getReceiverPersonId() + "");
@ -70,7 +74,9 @@ public class CardDao extends ServiceImpl<CardMapper, Card> {
update.setId(card.getId()); update.setId(card.getId());
update.setImTaskId(imResponse.getId()); update.setImTaskId(imResponse.getId());
update.setCardState(CardState.SEND_SUCCESS); update.setCardState(CardState.SEND_SUCCESS);
String bizMessageId = account2BizMessageId.get(key); String bizMessageId = person2BizMessageId.get(key);
if (bizMessageId == null)
bizMessageId = imAccount2BizMessageId.get(card.getImReceiveAccount());
if (bizMessageId != null) if (bizMessageId != null)
update.setBizMessageId(bizMessageId); update.setBizMessageId(bizMessageId);
updates.add(update); updates.add(update);

View File

@ -152,6 +152,11 @@ public class Card extends BaseEntityExt<Card> implements CardContent {
*/ */
private Long receiverWorkspaceId; private Long receiverWorkspaceId;
/**
* 接收账号
*/
private String imReceiveAccount;
/** /**
* 按钮状态 * 按钮状态
*/ */

View File

@ -61,6 +61,11 @@ public class CardLog extends BaseEntityExt<CardLog> {
*/ */
private AppTypeEnum receiverAppType; private AppTypeEnum receiverAppType;
/**
* 接收账号
*/
private String imReceiveAccount;
/** /**
* 异常 * 异常
*/ */