From ccd479a2ee697575ce3c5f43d1713e43c90bbc30 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 11:28:16 +0800 Subject: [PATCH] =?UTF-8?q?REQ-3502:=20=E5=8E=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/card/CardManager.java | 8 +++++ ...a => CardPresetButtonSyncTodoHandler.java} | 2 +- .../card/TodoPresetButtonSyncCardHandler.java | 36 +++++++++++++++++++ .../todo/card/TodoSyncCardService.java | 18 ++++++++++ .../service/todo/manage/TodoManager.java | 25 ++++++------- .../cn/axzo/msg/center/mq/RocketMQConfig.java | 27 ++++++++++---- .../axzo/msg/center/domain/entity/Todo.java | 7 ---- 7 files changed, 95 insertions(+), 28 deletions(-) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/{CardSyncTodoHandler.java => CardPresetButtonSyncTodoHandler.java} (92%) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardHandler.java 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 ac2e3882..815838ea 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 @@ -32,6 +32,7 @@ import cn.axzo.msg.center.service.pending.card.domain.CardButtonStates; import cn.axzo.msg.center.service.pending.request.CardPresetButtonPressedRequest; import cn.axzo.msg.center.service.pending.request.CardPresetButtonRequest; import cn.axzo.msg.center.service.pending.request.CardSendRequest; +import cn.axzo.msg.center.service.pending.request.CardUpdatePresetButtonRequest; import cn.axzo.msg.center.service.pending.request.CardUpdateRequest; import cn.axzo.msg.center.service.pending.request.CardUpdateStateRequest; import cn.axzo.msg.center.service.pending.request.ResendMessageRequest; @@ -190,6 +191,13 @@ public class CardManager { "卡片已是终状态, 无法'{}'", request.getPresetButtonType().getDesc()); } + public void firePresetButtonPressed(CardUpdatePresetButtonRequest request) { + TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent(request.getTemplateCode()); + CardRequestContext requestContext = CardRequestContext.create(request); + for (List cards : cardsCursor(request)) + firePresetButtonPressedImpl(request, requestContext, templateModel, cards); + } + private UpdateStateResult firePresetButtonPressedImpl( CardPresetButtonRequest request, CardRequestContext requestContext, TemplateModelV3 templateModel, List cards) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardSyncTodoHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java similarity index 92% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardSyncTodoHandler.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java index b5f1cc62..4677ddc1 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardSyncTodoHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor -public class CardSyncTodoHandler implements EventHandler, InitializingBean { +public class CardPresetButtonSyncTodoHandler implements EventHandler, InitializingBean { private final EventConsumer eventConsumer; private final TodoSyncCardService todoSyncCardService; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardHandler.java new file mode 100644 index 00000000..b022b706 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardHandler.java @@ -0,0 +1,36 @@ +package cn.axzo.msg.center.message.service.todo.card; + +import cn.axzo.framework.rocketmq.Event; +import cn.axzo.framework.rocketmq.EventConsumer; +import cn.axzo.framework.rocketmq.EventHandler; +import cn.axzo.msg.center.api.mq.PresetButtonPressedMessage; +import cn.axzo.msg.center.service.enums.MqMessageType; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class TodoPresetButtonSyncCardHandler implements EventHandler, InitializingBean { + + private final EventConsumer eventConsumer; + private final TodoSyncCardService todoSyncCardService; + + @Override + public void onEvent(Event event, EventConsumer.Context context) { + PresetButtonPressedMessage message = event.normalizedData(PresetButtonPressedMessage.class); + log.info("received PresetButtonPressedMessage: {}", message); + todoSyncCardService.syncTodoPresetButtonPressed(message); + } + + @Override + public void afterPropertiesSet() { + eventConsumer.registerHandler(MqMessageType.TODO_PRESET_BUTTON_PRESSED.getEventCode(), this); + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardService.java index 1ef165a8..d8d88cef 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardService.java @@ -2,6 +2,8 @@ package cn.axzo.msg.center.message.service.todo.card; import cn.axzo.framework.rocketmq.Event; import cn.axzo.msg.center.api.mq.CardPresetButtonPressedMessage; +import cn.axzo.msg.center.api.mq.PresetButtonPressedMessage; +import cn.axzo.msg.center.api.mq.TodoInfo; import cn.axzo.msg.center.api.mq.TodoUpdateMessage; import cn.axzo.msg.center.dal.MessageTemplateV3Dao; import cn.axzo.msg.center.dal.TodoBusinessDao; @@ -23,6 +25,7 @@ import cn.axzo.msg.center.service.enums.CodeDefinition; import cn.axzo.msg.center.service.enums.MessageChannel; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.pending.request.CardSendRequest; +import cn.axzo.msg.center.service.pending.request.CardUpdatePresetButtonRequest; import cn.axzo.msg.center.service.pending.request.CardUpdateStateRequest; import cn.axzo.msg.center.service.pending.request.PresetButtonPressedRequest; import cn.axzo.msg.center.service.pending.response.CardSendResponse; @@ -218,6 +221,21 @@ public class TodoSyncCardService { } } + void syncTodoPresetButtonPressed(PresetButtonPressedMessage message) { + CardUpdatePresetButtonRequest request = new CardUpdatePresetButtonRequest(); + request.setAppCode(APP_CODE); + TodoInfo todo = message.getTodoInfo(); + request.setTemplateCode(todo.getTemplateCode()); + request.setBizCode(todo.getTemplateCode()); + request.setSubBizCode(todo.getSubBizCode()); + request.setReceivers(Sets.newHashSet(PeerPerson.create( + todo.getExecutorPersonId(), todo.getExecutorOuId(), todo.getExecutorWorkspaceId()))); + request.setPresetButtonType(message.getPresetButtonType()); + request.setOperatorId(0L); + request.setOperatorName(""); + cardManager.firePresetButtonPressed(request); + } + private static CardBizState determineCardBizStateForBizTodo(Todo todo) { if (todo.getState() == PendingMessageStateEnum.COMPLETED) return CardBizState.COMPLETED; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoManager.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoManager.java index 83e0fc7a..606fae03 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoManager.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoManager.java @@ -45,6 +45,7 @@ import cn.axzo.msg.center.service.pending.request.TodoHandoverRequest; import cn.axzo.msg.center.service.pending.request.UpdateBusinessFinalBizStateRequest; import cn.axzo.msg.center.service.pending.request.UpdatePendingMessageByIdRequest; import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO; +import cn.axzo.msg.center.service.util.IdBuilder; import cn.axzo.msg.center.service.util.JSONUtils; import cn.axzo.msg.center.utils.QueryFormatter; import cn.axzo.msg.center.utils.UUIDUtil; @@ -595,20 +596,12 @@ public class TodoManager { StateAdvanceResult advanceResult = advanceState(ctx, execAdvanceBuilder() .eq(Todo::getIdentityCode, request.getIdentityCode()) .set(Todo::getState, PendingMessageStateEnum.COMPLETED)); - // isExecCompleted 可以排除是抄送待办的情况 - boolean isAdvancedOrCompleted = advanceResult.isAdvanced() || todo.isExecCompleted(); - // 支持重复发mq消息 - if (isAdvancedOrCompleted) { + if (advanceResult.isAdvanced()) { sendMqMessageOnPresetButtonPressed(ctx, request, todo); - - // 如果不是重复发送, 就只记一条日志. 如果是重复发送, 就单独记录一条日志 - if (!advanceResult.isAdvanced()) - todoLogger.logTodoUpdated(ctx, todo); - } - // 如果不是重复发送, 就只记一条日志. 所以这个记录日志不能提前 - if (advanceResult.isAdvanced()) + todoLogger.logTodoUpdated(ctx, todo); todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - return isAdvancedOrCompleted; + } + return advanceResult.isAdvanced(); } /** @@ -626,9 +619,13 @@ public class TodoManager { try { mqProducer.send(MqMessageRecord .builder(MqMessageType.TODO_PRESET_BUTTON_PRESSED, message) - .messageKey(todo.getId()) + .messageKey(todo.getIdentityCode()) .operatorId(request.getOperatorId()) - .shardingKey(todo.getTemplateCode()) + .shardingKey(IdBuilder.builder() + .append(todo.getTemplateCode()) + .append(todo.getBizCode()) + .append(todo.getSubBizCode()) + .build()) .build()); ctx.addLogContent("sendMqMessage", ImmutableMap.of("isSuccess", "true")); } catch (Exception e) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java b/inside-notices/src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java index bbbc248c..156ee561 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java @@ -11,7 +11,6 @@ import cn.axzo.framework.rocketmq.RocketMQEventProducer.RocketMQMessageMeta; import cn.axzo.framework.rocketmq.utils.TraceUtils; import cn.axzo.msg.center.api.mq.MqMessage; import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig; -import com.alibaba.fastjson.JSON; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import lombok.RequiredArgsConstructor; @@ -140,18 +139,34 @@ public class RocketMQConfig { }); } - /** - * 卡片变更,同步状态至待办TODO - */ @Slf4j @Component @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_card_sync_todo_${spring.profiles.active}", + consumerGroup = "GID_topic_card_preset_button_sync_todo_${spring.profiles.active}", consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", maxReconsumeTimes = 3 ) - public static class CardSyncTodoListener extends BaseListener implements RocketMQListener { + public static class CardPresetButtonSyncTodoListener extends BaseListener implements RocketMQListener { + + @Autowired + private EventConsumer eventConsumer; + + @Override + public void onMessage(MessageExt message) { + super.onEvent(message, eventConsumer); + } + } + + @Slf4j + @Component + @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_preset_button_sync_card_${spring.profiles.active}", + consumeMode = ConsumeMode.ORDERLY, + nameServer = "${rocketmq.name-server}", + maxReconsumeTimes = 3 + ) + public static class TodoPresetButtonSyncCardListener extends BaseListener implements RocketMQListener { @Autowired private EventConsumer eventConsumer; diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/Todo.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/Todo.java index 83a4c0e5..29c0bc74 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/Todo.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/Todo.java @@ -182,13 +182,6 @@ public class Todo extends BaseEntityExt implements MessageEntity { return orgId; } - /** - * 执行待办是否已经完成(处理) - */ - public boolean isExecCompleted() { - return type == TodoType.EXECUTABLE && state == PendingMessageStateEnum.COMPLETED; - } - @Override public JSONObject bizParam() { if (bizExtParam == null)