REQ-3345: 向群里发卡片消息

This commit is contained in:
yanglin 2025-01-22 11:27:46 +08:00
parent 14e1d3add2
commit fc62645227
7 changed files with 89 additions and 36 deletions

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,39 +98,52 @@ 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 = () -> {
Card card = new Card();
sendModel.addCard(card);
card.setBatchNo(sendModel.getRequestContext().getBatchNo());
card.setAppCode(sendModel.getRequest().getAppCode());
card.setImTaskId(0L);
card.setBizMessageId("");
card.setIdentityCode(UUIDUtil.uuidString());
card.setBizCode(sendModel.getRequest().determineBizCode());
card.setSubBizCode(sendModel.getRequest().determineSubBizCode());
card.setTemplateCode(sendModel.getRequest().getTemplateCode());
card.setBizState(sendModel.getRequest().getStateInfo().getBizState());
card.setCardState(sendModel.getRequest().getStateInfo().getCardState());
card.setTitle(sendModel.getTemplate().getTitle());
card.setContent(sendModel.getTemplate().getContent());
card.setCardContent(cardContent);
card.setBizParam(sendModel.getRequest().getBizParam());
card.setRouterParam(sendModel.getRequest().getRouterParam());
card.setSenderAppType(AppTypeEnum.SYSTEM);
card.setIsSenderRobot(YesOrNo.YES);
card.setSenderPersonId(sendModel.getRequest().getSender().getPersonIdOrDefault());
card.setSenderOuId(sendModel.getRequest().getSender().getOuIdOrDefault());
card.setSenderWorkspaceId(sendModel.getRequest().getSender().getWorkspaceIdOrDefault());
card.setSubtitle(sendModel.getRequest().getSubtitle());
card.setButtonStates(Collections.emptyList());
card.setUpdatable(sendModel.getCardTemplate().isUpdatable() ? YesOrNo.YES : YesOrNo.NO);
return card;
};
for (PeerPerson person : sendModel.getRequest().receiversOrEmpty()) {
for (AppTypeEnum appType : sendModel.getCardTemplate().ensureAppTypesPresent()) { for (AppTypeEnum appType : sendModel.getCardTemplate().ensureAppTypesPresent()) {
Card card = new Card(); Card card = cardFactory.get();
sendModel.addCard(card);
card.setBatchNo(sendModel.getRequestContext().getBatchNo());
card.setAppCode(sendModel.getRequest().getAppCode());
card.setImTaskId(0L);
card.setBizMessageId("");
card.setIdentityCode(UUIDUtil.uuidString());
card.setBizCode(sendModel.getRequest().determineBizCode());
card.setSubBizCode(sendModel.getRequest().determineSubBizCode());
card.setTemplateCode(sendModel.getRequest().getTemplateCode());
card.setBizState(sendModel.getRequest().getStateInfo().getBizState());
card.setCardState(sendModel.getRequest().getStateInfo().getCardState());
card.setTitle(sendModel.getTemplate().getTitle());
card.setContent(sendModel.getTemplate().getContent());
card.setCardContent(cardContent);
card.setBizParam(sendModel.getRequest().getBizParam());
card.setRouterParam(sendModel.getRequest().getRouterParam());
card.setSenderAppType(AppTypeEnum.SYSTEM);
card.setIsSenderRobot(YesOrNo.YES);
card.setReceiverAppType(appType); card.setReceiverAppType(appType);
card.setSenderPersonId(sendModel.getRequest().getSender().getPersonIdOrDefault());
card.setSenderOuId(sendModel.getRequest().getSender().getOuIdOrDefault());
card.setSenderWorkspaceId(sendModel.getRequest().getSender().getWorkspaceIdOrDefault());
card.setReceiverPersonId(person.getPersonIdOrDefault()); card.setReceiverPersonId(person.getPersonIdOrDefault());
card.setReceiverOuId(person.getOuIdOrDefault()); card.setReceiverOuId(person.getOuIdOrDefault());
card.setReceiverWorkspaceId(person.getWorkspaceIdOrDefault()); card.setReceiverWorkspaceId(person.getWorkspaceIdOrDefault());
card.setSubtitle(sendModel.getRequest().getSubtitle()); card.setImReceiveAccount("");
card.setButtonStates(Collections.emptyList());
card.setUpdatable(sendModel.getCardTemplate().isUpdatable() ? YesOrNo.YES : YesOrNo.NO);
} }
} }
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()
PersonAccountAttribute account = new PersonAccountAttribute(); .filter(card -> card.getReceiverAppType() != AppTypeEnum.NONE)
account.setPersonId(card.getReceiverPersonId() + ""); .map(card -> {
account.setOuId(card.getReceiverOuId()); PersonAccountAttribute account = new PersonAccountAttribute();
account.setWorkspaceId(card.getReceiverWorkspaceId()); account.setPersonId(card.getReceiverPersonId() + "");
account.setAppType(groupKey.getAppType()); account.setOuId(card.getReceiverOuId());
return account; account.setWorkspaceId(card.getReceiverWorkspaceId());
}).collect(toList()); account.setAppType(groupKey.getAppType());
return account;
})
.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

@ -73,6 +73,11 @@ public class CardSendRequest implements CardContent {
@NotEmpty(message = "接收人不能为空") @NotEmpty(message = "接收人不能为空")
private Set<PeerPerson> receivers = new HashSet<>(); private Set<PeerPerson> receivers = new HashSet<>();
/**
* 消息接收IM账号或群id
*/
private Set<String> imReceiveAccounts;
/** /**
* 业务参数 * 业务参数
*/ */
@ -93,6 +98,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

@ -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;
/** /**
* 异常 * 异常
*/ */