REQ-3201: 引入业务状态

This commit is contained in:
yanglin 2024-12-12 18:09:28 +08:00
parent b27928f8e2
commit 9cac9161b7
11 changed files with 76 additions and 55 deletions

View File

@ -83,7 +83,7 @@ public class CardManager {
MessageTaskResp imResponse = BizAssertions.assertResponse(
messageApi.sendTemplateMessageAsync(imRequest));
execTransactional(() -> {
cardDao.setSendSuccess(sendModel.getCards(), imResponse);
cardDao.setSendSuccess(group.getCards(), imResponse);
groupCardLogger.reloadAndLogCards("send:success");
});
} catch (Exception e) {

View File

@ -45,27 +45,31 @@ class CardParser {
GeneralMessagePushVO parseCardContent(CardTemplate cardTemplate, CardContent card) {
ParsedTemplateV3 template = cardTemplate.getTemplate();
GeneralMessagePushVO im = new GeneralMessagePushVO();
GeneralMessagePushVO content = new GeneralMessagePushVO();
// 这个字段好像没有业务含义
im.setIdentityCode("");
im.setCardStyleCode(template.getCardStyleCode());
im.setBizCode("");
im.setTemplateCode(template.getCode());
im.setCardBannerUrl(template.getIcon());
im.setCardTitle(template.getTitle());
im.setCardContent(template.getContent());
im.setSendTimestamp(new Date().getTime());
content.setIdentityCode("");
content.setCardStyleCode(template.getCardStyleCode());
content.setBizCode("");
content.setTemplateCode(template.getCode());
content.setCardBannerUrl(template.getIcon());
content.setCardTitle(template.getTitle());
content.setCardContent(template.getContent());
content.setSendTimestamp(new Date().getTime());
// 取当前时间即可, 数据库存的更新时间肯定晚于等于这个时间, 因此不会存在更新丢失
im.setUpdateTime(System.currentTimeMillis());
content.setUpdateTime(System.currentTimeMillis());
CardStateInfo stateInfo = card.getStateInfo();
if (cardTemplate.isUpdatable())
im.setCardState(stateInfo.getCardState());
im.setStateImage(cardTemplate.determineStateImage(stateInfo.getBizStateCode()));
if (cardTemplate.isUpdatable()) {
content.setCardState(stateInfo.getCardState());
content.setBizState(stateInfo.getBizStateCode());
}
content.setStateImage(CardStateImageConfigs
.create(template.getStateImageConfigs())
.determineStateImage(stateInfo.getBizStateCode()));
if (StringUtils.isNotBlank(card.getSubtitle())) {
GeneralMessagePushVO.Subtitle subtitle = new GeneralMessagePushVO.Subtitle();
subtitle.setIconUrl(messageSystemConfig.getOrgIcon());
subtitle.setTitle(card.getSubtitle());
im.setSubtitles(Collections.singletonList(subtitle));
content.setSubtitles(Collections.singletonList(subtitle));
}
ParsedModelV3Walker.walkDown(cardTemplate.getParsedModel(), new ParsedModel3Visitor() {
@Override
@ -77,7 +81,7 @@ class CardParser {
cardDetailButton.setIsHighlight(false);
cardDetailButton.setActionPaths(getNativeAppLinks(urlConfig));
cardDetailButton.setUrlConfig(urlConfig);
im.setCardDetailButton(cardDetailButton);
content.setCardDetailButton(cardDetailButton);
}
@Override
@ -93,9 +97,9 @@ class CardParser {
item = new CardExtensionItem(kv.getKey(), person.getPlainPersonInfo());
}
}
if (im.getCardExtension() == null)
im.setCardExtension(new ArrayList<>());
im.getCardExtension().add(item);
if (content.getCardExtension() == null)
content.setCardExtension(new ArrayList<>());
content.getCardExtension().add(item);
}
@Override
@ -106,10 +110,10 @@ class CardParser {
if (stateInfo.getCardState() == CardState.COMPLETED
&& button.determinePendingShow())
return;
if (im.getCardButtons() == null)
im.setCardButtons(new ArrayList<>());
if (content.getCardButtons() == null)
content.setCardButtons(new ArrayList<>());
CardButton imButton = new CardButton();
im.getCardButtons().add(imButton);
content.getCardButtons().add(imButton);
boolean isActionPerformed = card.isButtonActionPerformed(button.getCode());
imButton.setTitle(isActionPerformed ? button.getActionPerformedName() : button.getName());
@ -118,7 +122,8 @@ class CardParser {
imButton.setIsOverCard(styles.contains(ButtonStyleEnum.OVER_CARD));
imButton.setExecutorShow(button.getExecutorShow());
imButton.setActionPerformed(isActionPerformed);
imButton.setUrlConfig(button.getUrlConfig());
if (button.getUrlConfig().hasUrl())
imButton.setUrlConfig(button.getUrlConfig());
imButton.setButtonCode(button.getCode());
imButton.setPresetButtonType(button.getPresetButtonType());
imButton.setApiUrl(button.getApiUrl());
@ -140,13 +145,13 @@ class CardParser {
public void visitCardExtField(CardElementConfig cfg) {
if (StringUtils.isBlank(cfg.getValue()))
return;
if (im.getCardElements() == null)
im.setCardElements(new ArrayList<>());
im.getCardElements().add(cfg);
if (content.getCardElements() == null)
content.setCardElements(new ArrayList<>());
content.getCardElements().add(cfg);
}
});
return im;
return content;
}
private List<AppLink> getNativeAppLinks(UrlConfig urlConfig) {

View File

@ -0,0 +1,30 @@
package cn.axzo.msg.center.message.service.card;
import cn.axzo.msg.center.service.domain.card.StateImageConfig;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import java.util.List;
/**
* @author yanglin
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class CardStateImageConfigs {
private final List<StateImageConfig> configs;
public static CardStateImageConfigs create(List<StateImageConfig> images) {
return new CardStateImageConfigs(images);
}
public String determineStateImage(String bizStateCode) {
if (configs == null) return "";
return configs.stream()
.filter(StateImageConfig::isEnabled)
.filter(cfg -> cfg.getStateCode().equals(bizStateCode))
.findFirst()
.map(StateImageConfig::determineImageUrl)
.orElse(null);
}
}

View File

@ -77,7 +77,6 @@ public class CardSupport {
card.setTemplateCode(sendModel.getRequest().getTemplateCode());
CardStateInfo stateInfo = sendModel.getRequest().getStateInfo();
card.setBizState(stateInfo.getBizStateCode());
card.setBizStateImage(stateInfo.getBizStateImage());
card.setCardState(stateInfo.getCardState());
card.setTitle(sendModel.getTemplate().getTitle());
card.setContent(sendModel.getTemplate().getContent());

View File

@ -2,7 +2,6 @@ package cn.axzo.msg.center.message.service.card;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.msg.center.common.utils.BizAssertions;
import cn.axzo.msg.center.service.domain.card.StateImageConfig;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedModelV3;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedTemplateV3;
@ -36,16 +35,6 @@ public class CardTemplate {
return getTemplate().getMsgCategory() != MessageCategoryEnum.GENERAL_MESSAGE;
}
public String determineStateImage(String bizStateCode) {
List<StateImageConfig> images = getTemplate().getStateImageConfigs();
if (images == null) return null;
return images.stream()
.filter(config -> config.getStateCode().equals(bizStateCode))
.findFirst()
.map(StateImageConfig::determineImageUrl)
.orElse(null);
}
public ParsedTemplateV3 getTemplate() {
return parsedModel.getTemplate();
}

View File

@ -1,6 +1,7 @@
package cn.axzo.msg.center.message.service.card.domain;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import com.alibaba.fastjson.JSON;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@ -15,4 +16,9 @@ public class CardGroupKey {
private final Long ouId;
private final Long workspaceId;
private final AppTypeEnum appType;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -104,7 +104,7 @@ public class ModelV3Parser {
@Override
public void visitTemplate(ParsedTemplateV3 template) {
template.setTitle(resolveBizParam(template.getTitle()));
template.setTitle(resolveBizParam(template.getTitle()));
template.setContent(resolveBizParam(template.getContent()));
}
@ -182,11 +182,16 @@ public class ModelV3Parser {
@Override
public void visitCardExtField(CardElementConfig cfg) {
cfg.setValue(resolveBizParam(cfg.getValue()));
resolveCardElement(cfg);
}
@Override
public void visitCardStyleElement(CardElementConfig cfg) {
resolveCardElement(cfg);
}
private void resolveCardElement(CardElementConfig cfg) {
cfg.setName(resolveBizParam(cfg.getName()));
cfg.setValue(resolveBizParam(cfg.getValue()));
}

View File

@ -16,11 +16,6 @@ public class CardStateInfo {
*/
private String bizStateCode;
/**
* 业务状态图片地址
*/
private String bizStateImage;
/**
* 卡片状态
*/

View File

@ -19,7 +19,6 @@ public class CardUpdateStateRequest extends CardUpdateRequest {
@NotNull(message = "状态不能为空")
private CardStateInfo stateInfo;
@Override
public String toString() {
return JSON.toJSONString(this);

View File

@ -34,7 +34,6 @@ public class CardDao extends ServiceImpl<CardMapper, Card> {
lambdaUpdate()
.in(Card::getId, cardIds)
.set(stateInfo.getBizStateCode() != null, Card::getBizState, stateInfo.getBizStateCode())
.set(stateInfo.getBizStateImage() != null, Card::getBizStateImage, stateInfo.getBizStateImage())
.set(stateInfo.getCardState() != null, Card::getCardState, stateInfo.getCardState())
.update();
}

View File

@ -79,11 +79,6 @@ public class Card extends BaseEntityExt<Card> implements CardContent {
*/
private CardState cardState;
/**
* 业务状态图片
*/
private String bizStateImage;
/**
* 标题
*/
@ -97,7 +92,7 @@ public class Card extends BaseEntityExt<Card> implements CardContent {
/**
* IM卡片信息 (解析后)
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
@TableField(typeHandler = IgnorePropsJsonTypeHandler.class)
private Object cardContent;
/**
@ -183,7 +178,6 @@ public class Card extends BaseEntityExt<Card> implements CardContent {
public CardStateInfo getStateInfo() {
CardStateInfo cardStateInfo = new CardStateInfo();
cardStateInfo.setBizStateCode(bizState);
cardStateInfo.setBizStateImage(bizStateImage);
cardStateInfo.setCardState(cardState);
return cardStateInfo;
}