diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardManager.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardManager.java index 3e1e7fd2..4c117baa 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardManager.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardManager.java @@ -174,27 +174,31 @@ public class CardManager { } MessageTemplateButtonV3 button = templateModel.findPresetButton(request.getPresetButtonType()).orElse(null); BizAssertions.assertNotNull(button, "找不到对应的预设按钮, request={}", JSON.toJSONString(request)); - ArrayList updates = new ArrayList<>(cards.size()); - for (Card card : cards) { - CardButtonStates buttonStates = CardButtonStates.create(card.getButtonStates()); - //noinspection DataFlowIssue - buttonStates.setActionPerformed(button.getCode()); - Card update = new Card(); - update.setId(card.getId()); - update.setButtonStates(buttonStates.getStates()); - update.setBizState(CardBizState.COMPLETED); - update.setCardState(CardState.COMPLETED); - updates.add(update); - } - CardLogger cardLogger = cardLoggers.createLogger(CardRequestContext.create(request), cards); + CardLogger updateCardLogger = cardLoggers.createLogger(CardRequestContext.create(request)); execTransactional(() -> { + ArrayList updates = new ArrayList<>(cards.size()); + for (Card card : cardDao.getCardsForUpdate(cards)) { + if (card.getCardState() == CardState.COMPLETED) + continue; + updateCardLogger.addCard(card); + CardButtonStates buttonStates = CardButtonStates.create(card.getButtonStates()); + //noinspection DataFlowIssue + buttonStates.setActionPerformed(button.getCode()); + Card update = new Card(); + update.setId(card.getId()); + update.setButtonStates(buttonStates.getStates()); + update.setBizState(CardBizState.fromPresetButton(request.getPresetButtonType())); + update.setCardState(CardState.COMPLETED); + updates.add(update); + } + BizAssertions.assertNotEmpty(updates, "卡片已是终态, 无法'{}'", request.getPresetButtonType().getDesc()); cardDao.updateBatchById(updates); rebuildCardContent(templateModel, cards); - cardLogger.reloadAndLogCards("presetButtonPressed:enqueue"); + updateCardLogger.reloadAndLogCards("presetButtonPressed:enqueue"); }); - if (updateMessages("presetButtonPressed", cardLogger, cards)) { + if (updateMessages("presetButtonPressed", updateCardLogger, cards)) { cardBroadcaster.firePresetButtonPressed(cards, request); - cardLogger.reloadAndLogCards("presetButtonPressed:mq:success"); + updateCardLogger.reloadAndLogCards("presetButtonPressed:mq:success"); } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardParser.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardParser.java index 438e9a75..c8db6dce 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardParser.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardParser.java @@ -57,7 +57,7 @@ class CardParser { bizBody.setUpdateTime(System.currentTimeMillis()); CardStateInfo stateInfo = card.getStateInfo(); bizBody.setStateImage(CardStateImageConfigs - .create(template.getStateImageConfigs()) + .create(template.determineStateImageConfigs()) .determineStateImage(stateInfo.getBizState())); if (StringUtils.isNotBlank(card.getSubtitle())) { GeneralMessagePushVO.Subtitle subtitle = new GeneralMessagePushVO.Subtitle(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLogger.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLogger.java index fb20fedf..50167ae1 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLogger.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLogger.java @@ -1,5 +1,10 @@ package cn.axzo.msg.center.message.service.card.log; +import cn.axzo.msg.center.domain.entity.Card; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.Collection; + /** * @author yanglin */ @@ -9,6 +14,13 @@ public interface CardLogger { reloadAndLogCards(operationContext, null); } + default void addCards(Collection cards) { + if (CollectionUtils.isNotEmpty(cards)) + cards.forEach(this::addCard); + } + void reloadAndLogCards(String operationContext, Exception e); + void addCard(Card card); + } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLoggers.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLoggers.java index 34cf5557..d8621998 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLoggers.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/log/CardLoggers.java @@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -24,35 +25,51 @@ public class CardLoggers { private final CardLogDao cardLogDao; private final CardProps cardProps; - public CardLogger createLogger(CardRequestContext requestContext, List cards) { - return (operationContext, exception) -> { - if (!cardProps.isEnableCardLog()) return; - ArrayList logs = new ArrayList<>(cards.size()); - for (Card card : cardDao.reloadCards(cards)) { - CardLog log = new CardLog(); - logs.add(log); - log.setSenderPersonId(card.getSenderPersonId()); - log.setSenderOuId(card.getSenderOuId()); - log.setSenderWorkspaceId(card.getSenderWorkspaceId()); - log.setReceiverPersonId(card.getReceiverPersonId()); - log.setReceiverOuId(card.getReceiverOuId()); - log.setReceiverWorkspaceId(card.getReceiverWorkspaceId()); - log.setReceiverAppType(card.getReceiverAppType()); - log.setBizState(card.getBizState()); - log.setCardState(card.getCardState()); - log.setIdentityCode(card.getIdentityCode()); - log.setTemplateCode(card.getTemplateCode()); - log.setBizMessageId(card.getBizMessageId()); - log.setBizCode(card.getBizCode()); - log.setSubBizCode(card.getSubBizCode()); - log.setContext(operationContext); - log.setBatchNo(requestContext.getBatchNo()); - log.setCardContent(card.getCardContent()); - log.setError(exception == null ? "" : Throwables.getStackTraceAsString(exception)); - log.addLogContent("request", requestContext.getRequest()); - log.addLogContent("isCardDelete", card.getIsDelete()); + public CardLogger createLogger(CardRequestContext requestContext) { + return createLogger(requestContext, Collections.emptyList()); + } + + public CardLogger createLogger(CardRequestContext requestContext, List initCards) { + return new CardLogger() { + + private final List cards = new ArrayList<>(initCards); + + @Override + public void reloadAndLogCards(String operationContext, Exception exception) { + if (!cardProps.isEnableCardLog()) return; + ArrayList logs = new ArrayList<>(); + for (Card card : cardDao.reloadCards(cards)) { + CardLog log = new CardLog(); + logs.add(log); + log.setSenderPersonId(card.getSenderPersonId()); + log.setSenderOuId(card.getSenderOuId()); + log.setSenderWorkspaceId(card.getSenderWorkspaceId()); + log.setReceiverPersonId(card.getReceiverPersonId()); + log.setReceiverOuId(card.getReceiverOuId()); + log.setReceiverWorkspaceId(card.getReceiverWorkspaceId()); + log.setReceiverAppType(card.getReceiverAppType()); + log.setBizState(card.getBizState()); + log.setCardState(card.getCardState()); + log.setIdentityCode(card.getIdentityCode()); + log.setTemplateCode(card.getTemplateCode()); + log.setBizMessageId(card.getBizMessageId()); + log.setBizCode(card.getBizCode()); + log.setSubBizCode(card.getSubBizCode()); + log.setContext(operationContext); + log.setBatchNo(requestContext.getBatchNo()); + log.setCardContent(card.getCardContent()); + log.setError(exception == null ? "" : Throwables.getStackTraceAsString(exception)); + log.addLogContent("request", requestContext.getRequest()); + log.addLogContent("isCardDelete", card.getIsDelete()); + } + cardLogDao.saveBatch(logs); } - cardLogDao.saveBatch(logs); + + @Override + public void addCard(Card card) { + cards.add(card); + } + }; } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardBizState.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardBizState.java index 3526d417..053ecc0a 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardBizState.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardBizState.java @@ -34,6 +34,18 @@ public enum CardBizState implements CodeDefinition { private final boolean imageConfigurable; private final String defaultImageUrl; + public static CardBizState fromPresetButton(PresetButtonType presetButtonType) { + switch (presetButtonType) { + case AGREE: + return AGREED; + case REJECT: + return REJECTED; + case REVOKE: + return REVOKED; + default: + throw new IllegalArgumentException("不支持的预设按钮类型: " + presetButtonType); + } + } private static Map codeMap = Arrays.stream(values()).collect(Collectors.toMap(CardBizState::name, Function.identity())); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedTemplateV3.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedTemplateV3.java index 81078cdd..46587eba 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedTemplateV3.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedTemplateV3.java @@ -137,6 +137,10 @@ public class ParsedTemplateV3 { */ private List channels; + public List determineStateImageConfigs() { + return stateImageConfigs == null ? Collections.emptyList() : stateImageConfigs; + } + public List parseImAppTypes() { if (CollectionUtils.isEmpty(appVersionConfigs)) return Collections.emptyList(); diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/CardDao.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/CardDao.java index ded2ebf5..c174eb3a 100644 --- a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/CardDao.java +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/CardDao.java @@ -78,19 +78,31 @@ public class CardDao extends ServiceImpl { updateBatchById(updates); } + public List getCardsForUpdate(List cards) { + if (CollectionUtils.isEmpty(cards)) + return Collections.emptyList(); + return lambdaQuery() + .in(Card::getId, collectCardIdsSorted(cards)) + .last("FOR UPDATE") + .list(); + } + public List reloadCards(List cards) { if (CollectionUtils.isEmpty(cards)) return Collections.emptyList(); - return DeleteAwareInterceptor.execute(()-> listByIds(collectCardIds(cards))); + return DeleteAwareInterceptor.execute(()-> listByIds(collectCardIdsSorted(cards))); } public void deleteCards(List cards) { if (CollectionUtils.isEmpty(cards)) return; - removeByIds(collectCardIds(cards)); + removeByIds(collectCardIdsSorted(cards)); } - private static List collectCardIds(List cards) { - return cards.stream().map(BaseEntityExt::getId).collect(toList()); + private static List collectCardIdsSorted(List cards) { + return cards.stream() + .map(BaseEntityExt::getId) + .sorted() + .collect(toList()); } } \ No newline at end of file