From 6d151429af7a89d7f568c7d62538dde700591dbe Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 18:15:37 +0800 Subject: [PATCH 001/111] flow back up --- .../CardChangeStateSyncTodoEventHandler.java | 78 ----- .../PendingMessageNewController.java | 10 +- .../message/service/card/CardManager.java | 13 +- .../message/service/card/CardParser.java | 6 + .../message/service/card/CardProps.java | 2 + .../message/service/card/CardSupport.java | 4 +- .../exception/CardIdempotentException.java | 14 + .../service/todo/TodoWithCardWrapper.java | 281 ------------------ .../todo/card/CardSyncTodoHandler.java | 33 ++ .../todo/card/TodoSyncCardBizHandler.java | 38 +++ .../todo/card/TodoSyncCardFlowHandler.java | 38 +++ .../todo/card/TodoSyncCardService.java | 215 ++++++++++++++ .../service/todo/manage/TodoLogger.java | 2 +- .../service/todo/manage/TodoManager.java | 74 ++--- .../todo/manage/TodoRequestContext.java | 6 + .../manage/broadcast/TodoBroadcaster.java | 13 +- .../manage/broadcast/TodoMqBroadcaster.java | 7 +- .../axzo/msg/center/mq/ConsumerIsolation.java | 27 ++ .../cn/axzo/msg/center/mq/RocketMQConfig.java | 46 +++ .../msg/center/api/mq/TodoUpdateMessage.java | 13 + .../cn/axzo/msg/center/service/ButtonV3.java | 9 + .../msg/center/service/dto/PeerPerson.java | 2 +- .../center/service/enums/BizCategoryEnum.java | 7 +- .../service/enums/BizFinalStateEnum.java | 18 +- .../enums/PendingMessageStateEnum.java | 2 - .../request/CardUpdateStateRequest.java | 10 +- .../axzo/msg/center/domain/entity/Todo.java | 8 +- 27 files changed, 511 insertions(+), 465 deletions(-) delete mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/event/card/CardChangeStateSyncTodoEventHandler.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java delete mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoWithCardWrapper.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardSyncTodoHandler.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardService.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/event/card/CardChangeStateSyncTodoEventHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/event/card/CardChangeStateSyncTodoEventHandler.java deleted file mode 100644 index 9400c8ad..00000000 --- a/inside-notices/src/main/java/cn/axzo/msg/center/event/card/CardChangeStateSyncTodoEventHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.axzo.msg.center.event.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.CardPresetButtonPressedMessage; -import cn.axzo.msg.center.message.service.todo.TodoWithCardWrapper; -import cn.axzo.msg.center.message.service.todo.manage.TodoManager; -import cn.axzo.msg.center.notices.common.constans.CommonConstants; -import cn.axzo.msg.center.service.enums.MqMessageType; -import com.alibaba.fastjson.JSON; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -/** - * @author xudawei@axzo.cn - * @date 2024/11/07 - * @desc 卡片预设MQ消费 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class CardChangeStateSyncTodoEventHandler implements EventHandler, InitializingBean { - - private final EventConsumer eventConsumer; - - private final TodoWithCardWrapper todoWithCardWrapper; - - private final TodoManager todoManager; - - - @Override - public void onEvent(Event event, EventConsumer.Context context) { - if (!MqMessageType.CARD_PRESET_BUTTON_PRESSED.getEventName().equalsIgnoreCase(event.getEventCode().getName())) { - return; - } - - log.info("CardChangeStateSyncTodoEventHandler-start - handle mq event, event={}", JSON.toJSONString(event)); - try { - long start = System.currentTimeMillis(); - handleMqMessage(event); - long end = System.currentTimeMillis(); - log.warn("CardChangeStateSyncTodoEventHandler-handle mq event, used={}ms, event={}", end - start, JSON.toJSONString(event)); - } catch (Exception e) { - log.warn("CardChangeStateSyncTodoEventHandler-error - handle mq event, event={}", JSON.toJSONString(event), e); - } - - } - /** - * 业务逻辑 - */ - private void handleMqMessage(Event event) { - //解析数据 - CardPresetButtonPressedMessage payload = event.normalizedData(CardPresetButtonPressedMessage.class); - if (Objects.isNull(payload)) { - return; - } - if (Objects.isNull(payload.getCardInfo())) { - return; - } - if (!CommonConstants.TODO_SYSN_CARD_APP_CODE.equalsIgnoreCase(payload.getCardInfo().getAppCode())) { - return; - } - Long operatorId = Objects.nonNull(payload.getOperatorId()) ? payload.getOperatorId() : 0L; - todoWithCardWrapper.fireTodoWhenPresetButtonPressedByCard(todoManager, payload.getPresetButtonType(), payload.getCardInfo(), operatorId); - - } - - @Override - public void afterPropertiesSet() { - Event.EventCode eventCode = new Event.EventCode(MqMessageType.CARD_PRESET_BUTTON_PRESSED.getEventModel(), MqMessageType.CARD_PRESET_BUTTON_PRESSED.getEventName()); - eventConsumer.registerHandler(eventCode, this); - } -} diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java index 31fb59bd..d3e30fd7 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/PendingMessageNewController.java @@ -295,15 +295,9 @@ public class PendingMessageNewController implements PendingMessageClient { } @Override + @Deprecated public CommonResponse setHide(SetHideRequest req) { - log.info("setHide, request={}", JSON.toJSONString(req)); - Boolean response = null; - try { - response = todoManager.setHide(req); - return CommonResponse.success(response); - } finally { - log.info("setHide. request={}, response={}", req, response); - } + return CommonResponse.success(true); } @Override 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 1a97dfaf..1dd5f126 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 @@ -29,7 +29,6 @@ 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; @@ -138,11 +137,9 @@ public class CardManager { public void updateState(CardUpdateStateRequest request) { request.validate(); TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent(request.getTemplateCode()); - boolean updated = false; // 不要放到for里面去了 CardRequestContext requestContext = CardRequestContext.create(request); for (List cards : cardsCursor(request)) { - updated = true; UpdateExecutor executor = new UpdateExecutor(requestContext, "updateState", templateModel, cards); executor.update(card -> { Card update = executor.createUpdate(card); @@ -151,10 +148,9 @@ public class CardManager { update.setBizState(request.getBizState()); }); } - BizAssertions.assertTrue(updated, "未找到任何需要更新的卡片, request={}", request); } - void setActionPerformed(SetActionPerformedRequest request) { + public void setActionPerformed(SetActionPerformedRequest request) { TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent(request.getTemplateCode()); MessageTemplateButtonV3 button = templateModel.findButton(request.getButtonCode()).orElse(null); BizAssertions.assertNotNull(button, "找不到对应的按钮. buttonCode={}", request.getButtonCode()); @@ -180,13 +176,6 @@ 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/card/CardParser.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardParser.java index 44bb74de..15d36769 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 @@ -163,6 +163,12 @@ class CardParser { return bizBody; } + private boolean isPerformActionAvailable(ParsedButtonV3 button) { + if (cardProps.getPerformActionSystemButtonCodes().contains(button.getCode())) + return true; + return button.isPerformActionAvailable(); + } + private static List getNativeAppLinks(UrlConfig urlConfig) { if (urlConfig == null) return Collections.emptyList(); NativeAppLinkUrlConfigVisitor visitor = new NativeAppLinkUrlConfigVisitor(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java index 2b29ee84..8b007f55 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java @@ -1,5 +1,6 @@ package cn.axzo.msg.center.message.service.card; +import com.google.common.collect.Sets; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -23,6 +24,7 @@ public class CardProps { private boolean enableCardIdempotent = true; private int updateCardBatchSize = 200; private Set idempotentFreeTemplateCodes = new HashSet<>(); + private Set performActionSystemButtonCodes = Sets.newHashSet(""); boolean isIdempotentFree(String templateCode) { return getIdempotentFreeTemplateCodes().contains(templateCode); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java index 0dd97357..4e69cbcb 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java @@ -1,6 +1,5 @@ package cn.axzo.msg.center.message.service.card; -import cn.axzo.basics.common.exception.ServiceException; import cn.axzo.framework.jackson.utility.JSON; import cn.axzo.im.center.api.vo.PersonAccountAttribute; import cn.axzo.im.center.api.vo.req.SendTemplateMessageParam; @@ -15,6 +14,7 @@ import cn.axzo.msg.center.message.domain.dto.TemplateModelV3; import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO; import cn.axzo.msg.center.message.service.card.domain.CardGroup; import cn.axzo.msg.center.message.service.card.domain.CardSendModel; +import cn.axzo.msg.center.message.service.card.exception.CardIdempotentException; import cn.axzo.msg.center.message.service.impl.v3.ModelV3Parser; import cn.axzo.msg.center.message.service.impl.v3.ModelV3Service; import cn.axzo.msg.center.message.service.impl.v3.UrlParser; @@ -82,7 +82,7 @@ public class CardSupport { cardIdempotentDao.save(idempotent); } catch (DuplicateKeyException e) { log.warn("重复创建卡片, request={}", request); - throw new ServiceException(String.format("重复创建卡片: %s", idempotent)); + throw new CardIdempotentException(String.format("重复创建卡片: %s", idempotent)); } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java new file mode 100644 index 00000000..226eae3c --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java @@ -0,0 +1,14 @@ +package cn.axzo.msg.center.message.service.card.exception; + +import cn.axzo.basics.common.exception.ServiceException; + +/** + * @author yanglin + */ +public class CardIdempotentException extends ServiceException { + + public CardIdempotentException(String msg) { + super(msg); + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoWithCardWrapper.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoWithCardWrapper.java deleted file mode 100644 index 3b9e574a..00000000 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoWithCardWrapper.java +++ /dev/null @@ -1,281 +0,0 @@ -package cn.axzo.msg.center.message.service.todo; - -import cn.axzo.msg.center.api.mq.CardInfo; -import cn.axzo.msg.center.dal.TodoDao; -import cn.axzo.msg.center.domain.entity.Todo; -import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam; -import cn.axzo.msg.center.message.service.card.CardManager; -import cn.axzo.msg.center.message.service.todo.manage.TodoLogger; -import cn.axzo.msg.center.message.service.todo.manage.TodoManager; -import cn.axzo.msg.center.message.service.todo.manage.TodoRequestContext; -import cn.axzo.msg.center.notices.common.constans.CommonConstants; -import cn.axzo.msg.center.service.dto.PeerPerson; -import cn.axzo.msg.center.service.dto.PersonDTO; -import cn.axzo.msg.center.service.enums.CardBizState; -import cn.axzo.msg.center.service.enums.PresetButtonType; -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.util.IdBuilder; -import com.alibaba.excel.util.StringUtils; -import com.alibaba.fastjson.JSON; -import com.google.common.base.Throwables; -import com.google.common.collect.Sets; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.stereotype.Component; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * @author xudawei@axzo.cn - * @date 2024/12/12 - * @desc 待办与卡片关联包装 - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class TodoWithCardWrapper { - - private final CardManager cardManager; - - private final TodoLogger todoLogger; - - private final TodoDao todoDao; - - /** - * 卡片预设按钮,同步待办 - * 注:卡片预设同步待办状态 - * @param presetButtonType 预设类型 - * @param cardInfo 卡片 - */ - public void fireTodoWhenPresetButtonPressedByCard(TodoManager todoManager, PresetButtonType presetButtonType, CardInfo cardInfo, Long operatorId) { - if (Objects.isNull(presetButtonType) || Objects.isNull(cardInfo)) { - return; - } - if (StringUtils.isBlank(cardInfo.getTemplateCode()) || StringUtils.isBlank(cardInfo.getBizCode())) { - return; - } - log.info("TodoWithCardWrapper#fireTodoWhenPresetButtonPressedByCard start,presetButtonType:{},cardInfo:{}", presetButtonType, JSON.toJSONString(cardInfo)); - TodoRequestContext ctx = TodoRequestContext.create("cardPresetTodo", cardInfo); - ctx.addLogContent("presetButtonType", presetButtonType); - ctx.addLogContent("operatorId", operatorId); - //1 查询待办(Todo对象),根据templateCode/bizCode/subBizCode/receiverPresonId/receiverOuId/receiverWorkspaceId 理论上只能查询一条[待办]记录 - List todoList = todoDao.findByCondition(cardInfo.getTemplateCode(), cardInfo.getBizCode(), cardInfo.getSubBizCode(), cardInfo.getReceiverPersonId(), cardInfo.getReceiverOuId(), cardInfo.getReceiverWorkspaceId()); - try { - if (CollectionUtils.isEmpty(todoList)) { - return; - } - //2 同步待办预设状态, - for (Todo todo : todoList) { - PresetButtonPressedRequest presetButtonPressedRequest = this.buildPresetButtonPressedRequest(todo.getIdentityCode(), presetButtonType, operatorId); - todoManager.firePresetButtonPressed( presetButtonPressedRequest, false); - - ctx.addLogContent("fireTodoWhenPresetButtonPressedByCard", "success"); - todoLogger.logTodosUpdated(ctx, Collections.singletonList(todo)); - } - } catch (Exception e) { - log.warn("TodoWithCardWrapper#fireTodoWhenPresetButtonPressedByCard exception,presetButtonType:{},cardInfo:{}", presetButtonType, JSON.toJSONString(cardInfo),e); - ctx.addLogContent("exception", Throwables.getStackTraceAsString(e)); - todoLogger.logTodosUpdated(ctx, todoList); - } - } - - /** - * 构建预设按钮对象 - */ - private PresetButtonPressedRequest buildPresetButtonPressedRequest(String identityCode, PresetButtonType presetButtonType, Long operatorId) { - return PresetButtonPressedRequest.builder() - .identityCode(identityCode) - .presetButtonType(presetButtonType) - .operatorId(operatorId) - .build(); - } - - /** - * 点击预设按钮-同步卡片 - * 注:待办预设同步卡片状态 - */ - public void fireCardWhenPresetButtonPressedByTodo(PresetButtonPressedRequest request, Todo todo, boolean isSyncCard) { - //是否同步卡片信息,true:同步;false:不同步 - if (!isSyncCard) { - return; - } - log.info("TodoWithCardWrapper#fireCardWhenPresetButtonPressedByTodo start,request:{},todo:{}", JSON.toJSONString(request), JSON.toJSONString(todo)); - TodoRequestContext ctx = TodoRequestContext.create("todoPresetCard", request); - try { - //1 构建对象 - CardUpdatePresetButtonRequest cardRequest = this.buildCardUpdatePresetButtonRequest(request, todo); - //2 同步卡片 - cardManager.firePresetButtonPressed(cardRequest); - - ctx.addLogContent("fireCardWhenPresetButtonPressedByTodo", "success"); - todoLogger.logTodosUpdated(ctx, Collections.singletonList(todo)); - } catch (Exception e) { - log.warn("TodoWithCardWrapper#fireCardWhenPresetButtonPressedByTodo exception,request:{},todo:{}", JSON.toJSONString(request), JSON.toJSONString(todo),e); - ctx.addLogContent("exception", Throwables.getStackTraceAsString(e)); - todoLogger.logTodosUpdated(ctx, Collections.singletonList(todo)); - } - } - - /** - * 构建对象 - */ - private CardUpdatePresetButtonRequest buildCardUpdatePresetButtonRequest(PresetButtonPressedRequest request, Todo todo) { - CardUpdatePresetButtonRequest cardRequest = new CardUpdatePresetButtonRequest(); - cardRequest.setAppCode(CommonConstants.TODO_SYSN_CARD_APP_CODE); - cardRequest.setTemplateCode(todo.getTemplateCode()); - cardRequest.setBizCode(todo.getBizCode()); - cardRequest.setSubBizCode(todo.getSubBizCode()); - cardRequest.setReceivers(Sets.newHashSet( - PeerPerson.newPeerPerson(todo.getExecutorPersonId() - , todo.getOuId() - , todo.getReceiverWorkspaceId()))); - - cardRequest.setPresetButtonType(request.getPresetButtonType()); - cardRequest.setOperatorId(request.getOperatorId()); - return cardRequest; - } - - /** - * 发送卡片信息 - */ - public void send(PendingMessagePushParam param,List todos) { - log.info("TodoWithCardWrapper#send start,param:{}", JSON.toJSONString(param)); - TodoRequestContext ctx = TodoRequestContext.create("todoSyncCardSend", param); - try { - //1 构建对象 - CardSendRequest cardSendRequest = this.buildCardSendRequest(param); - ctx.addLogContent(JSON.toJSONString(cardSendRequest)); - //2 发送 - cardManager.send(cardSendRequest); - - ctx.addLogContent("sendCard", "success"); - todoLogger.logTodosUpdated(ctx, todos); - } catch (Exception e) { - log.warn("TodoWithCardWrapper#send,param:{}", JSON.toJSONString(param), e); - ctx.addLogContent("exception", Throwables.getStackTraceAsString(e)); - todoLogger.logTodosUpdated(ctx, todos); - } - } - - /** - * 卡片更新状态-完成 - */ - public void cardCompleteStateByTodoList(List todoList) { - this.cardUpdateStateByTodoList(todoList,CardBizState.END, true); - } - - /** - * 卡片更新状态-回滚 - * 暂时不需要 - */ - public void cardRollbackStateByTodoList(List todoList) { - this.cardUpdateStateByTodoList(todoList, CardBizState.ABORTED, false); - } - - /** - * 卡片更新状态-撤销 - */ - public void cardRevokeStateByTodoList(List todoList) { - this.cardUpdateStateByTodoList(todoList, CardBizState.REVOKED, false); - } - - /** - * 卡片更新状态-执行中 - */ - public void cardProcessingStateByTodoList(List todoList) { - this.cardUpdateStateByTodoList(todoList, CardBizState.PENDING, false); - } - - /** - * 卡片更新完成状态 - */ - private void cardUpdateStateByTodoList(List todoList, CardBizState bizState, boolean setCardCompleted) { - log.info("TodoWithCardWrapper#cardUpdateStateByTodoList start,todoList:{},bizState:{},setCardCompleted:{}", JSON.toJSONString(todoList), bizState, setCardCompleted); - if (CollectionUtils.isEmpty(todoList)) { - return; - } - TodoRequestContext ctx = TodoRequestContext.create("todoSyncCardState", todoList); - ctx.addLogContent("bizState", bizState); - ctx.addLogContent("cardState", bizState); - ctx.addLogContent("setCardCompleted", setCardCompleted); - try { - for (Todo todo : todoList) { - //1 构建对象 - CardUpdateStateRequest updateStateRequest = this.buildCardUpdateStateRequest(todo, bizState, setCardCompleted); - //2 更新状态 - cardManager.updateState(updateStateRequest); - ctx.addLogContent("cardUpdateStateByTodoList", "success"); - todoLogger.logTodosUpdated(ctx, Collections.singletonList(todo)); - } - } catch (Exception e) { - log.warn("TodoWithCardWrapper#cardCompleteState,todoList:{}", JSON.toJSONString(todoList), e); - ctx.addLogContent("exception", Throwables.getStackTraceAsString(e)); - todoLogger.logTodosUpdated(ctx, todoList); - } - } - - /** - * 构建卡片状态更新对象 - */ - private CardUpdateStateRequest buildCardUpdateStateRequest(Todo todo, CardBizState bizState, boolean setCardCompleted) { - CardUpdateStateRequest updateStateRequest = new CardUpdateStateRequest(); - - updateStateRequest.setBizState(bizState); - updateStateRequest.setCardCompleted(setCardCompleted); - - updateStateRequest.setAppCode(CommonConstants.TODO_SYSN_CARD_APP_CODE); - updateStateRequest.setTemplateCode(todo.getTemplateCode()); - updateStateRequest.setBizCode(todo.getBizCode()); - updateStateRequest.setSubBizCode(todo.getSubBizCode()); - updateStateRequest.setReceivers(Sets.newHashSet(PeerPerson.newPeerPerson(todo.getExecutorPersonId(), todo.getOuId(), todo.getReceiverWorkspaceId())));//TODO - return updateStateRequest; - } - - /** - * 构建对象 - */ - private CardSendRequest buildCardSendRequest(PendingMessagePushParam param) { - CardSendRequest sendRequest = new CardSendRequest(); - sendRequest.setAppCode(CommonConstants.TODO_SYSN_CARD_APP_CODE); - sendRequest.setTemplateCode(param.getTemplateCode()); - sendRequest.setBizCode(param.getBizCode()); - sendRequest.setSubBizCode(param.getSubBizCode()); - if (Objects.nonNull(param.getPromoter()) && Objects.nonNull(param.getPromoter().getId())) { - sendRequest.setSender(PeerPerson.newPeerPerson(param.getPromoter().getId() - , Objects.nonNull(param.getPromoterOuId()) ? param.getPromoterOuId() : null - , Objects.nonNull(param.getPromoterWorkspaceId()) ? param.getPromoterWorkspaceId() : null)); - } - - sendRequest.setReceivers(this.buildReceivers(param.getExecutor(), param.getOuId(), param.getWorkspaceId())); - if (StringUtils.isNotBlank(param.getBizExtParams())) { - sendRequest.setBizParam(JSON.parseObject(param.getBizExtParams())); - } - if (StringUtils.isNotBlank(param.getRouterParams())) { - sendRequest.setRouterParam(JSON.parseObject(param.getRouterParams())); - } - - sendRequest.setIdempotentCode(IdBuilder.builder() - .append(param.getBizCode()) - .append(param.getSubBizCode()) - .build()); - - return sendRequest; - } - - private Set buildReceivers(List personDTOS, Long ouId, Long workspaceId) { - if (CollectionUtils.isEmpty(personDTOS)) { - return Sets.newHashSet(); - } - return personDTOS.stream().map(item -> PeerPerson.newPeerPerson(item.getId(), ouId, workspaceId)).collect(Collectors.toSet()); - } - - -} 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/CardSyncTodoHandler.java new file mode 100644 index 00000000..2562b263 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardSyncTodoHandler.java @@ -0,0 +1,33 @@ +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.CardPresetButtonPressedMessage; +import cn.axzo.msg.center.service.enums.MqMessageType; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Component +@RequiredArgsConstructor +public class CardSyncTodoHandler implements EventHandler, InitializingBean { + + private final EventConsumer eventConsumer; + private final TodoSyncCardService todoSyncCardService; + + @Override + public void onEvent(Event event, EventConsumer.Context context) { + CardPresetButtonPressedMessage message = event.normalizedData(CardPresetButtonPressedMessage.class); + todoSyncCardService.onCardPresetButtonPressed(message); + } + + @Override + public void afterPropertiesSet() { + eventConsumer.registerHandler(MqMessageType.CARD_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/TodoSyncCardBizHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java new file mode 100644 index 00000000..f5f4b05c --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java @@ -0,0 +1,38 @@ +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.TodoUpdateMessage; +import cn.axzo.msg.center.mq.ConsumerIsolation; +import cn.axzo.msg.center.service.enums.BizCategoryEnum; +import cn.axzo.msg.center.service.enums.MqMessageType; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Component +@RequiredArgsConstructor +class TodoSyncCardBizHandler implements EventHandler, InitializingBean { + + private final EventConsumer eventConsumer; + private final TodoSyncCardService todoSyncCardService; + + @Override + public void onEvent(Event event, EventConsumer.Context context) { + TodoUpdateMessage message = event.normalizedData(TodoUpdateMessage.class); + if (ConsumerIsolation.getIsolation() == ConsumerIsolation.TODO_SYNC_CARD_BIZ + && message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.OTHER) { + todoSyncCardService.onMessage(event, message); + } + } + + @Override + public void afterPropertiesSet() { + eventConsumer.registerHandler(MqMessageType.TODO_STATE_UPDATE.getEventCode(), this); + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java new file mode 100644 index 00000000..508dd0d7 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java @@ -0,0 +1,38 @@ +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.TodoUpdateMessage; +import cn.axzo.msg.center.mq.ConsumerIsolation; +import cn.axzo.msg.center.service.enums.BizCategoryEnum; +import cn.axzo.msg.center.service.enums.MqMessageType; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Component +@RequiredArgsConstructor +class TodoSyncCardFlowHandler implements EventHandler, InitializingBean { + + private final EventConsumer eventConsumer; + private final TodoSyncCardService todoSyncCardService; + + @Override + public void onEvent(Event event, EventConsumer.Context context) { + TodoUpdateMessage message = event.normalizedData(TodoUpdateMessage.class); + if (ConsumerIsolation.getIsolation() == ConsumerIsolation.TODO_SYNC_CARD_FLOW + && message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.FLOW) { + todoSyncCardService.onMessage(event, message); + } + } + + @Override + public void afterPropertiesSet() { + eventConsumer.registerHandler(MqMessageType.TODO_STATE_UPDATE.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 new file mode 100644 index 00000000..75bc89de --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardService.java @@ -0,0 +1,215 @@ +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.TodoUpdateMessage; +import cn.axzo.msg.center.dal.MessageTemplateV3Dao; +import cn.axzo.msg.center.dal.TodoBusinessDao; +import cn.axzo.msg.center.dal.TodoDao; +import cn.axzo.msg.center.domain.entity.MessageTemplateV3; +import cn.axzo.msg.center.domain.entity.Todo; +import cn.axzo.msg.center.domain.entity.TodoBusiness; +import cn.axzo.msg.center.message.service.card.CardManager; +import cn.axzo.msg.center.message.service.card.exception.CardIdempotentException; +import cn.axzo.msg.center.message.service.todo.manage.TodoLogger; +import cn.axzo.msg.center.message.service.todo.manage.TodoManager; +import cn.axzo.msg.center.message.service.todo.manage.TodoRequestContext; +import cn.axzo.msg.center.service.dto.PeerPerson; +import cn.axzo.msg.center.service.enums.BizCategoryEnum; +import cn.axzo.msg.center.service.enums.BizFinalStateEnum; +import cn.axzo.msg.center.service.enums.CardBizState; +import cn.axzo.msg.center.service.enums.MessageChannel; +import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; +import cn.axzo.msg.center.service.enums.StatusEnum; +import cn.axzo.msg.center.service.pending.request.CardSendRequest; +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.request.SetActionPerformedRequest; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Sets; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Slf4j +@Component +@RequiredArgsConstructor +class TodoSyncCardService { + + private static final String TODO_CATEGORY_BIZ_PARAM_KEY = "____todo_category____"; + private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "____todo_identity_code____"; + private static final String APP_CODE = "msg-center:todo"; + + private final TodoDao todoDao; + private final TodoBusinessDao todoBusinessDao; + private final CardManager cardManager; + private final TodoLogger todoLogger; + private final MessageTemplateV3Dao messageTemplateV3Dao; + private final TodoManager todoManager; + + void onMessage(Event event, TodoUpdateMessage message) { + log.info("TodoSyncStateToCardService.onMessage: {}", message); + try { + sync(event, message); + } catch (Exception e) { + log.warn("TodoSyncStateToCardService.onMessage: error, message={}", message, e); + throw new RuntimeException(e); + } + } + + private void sync(Event event, TodoUpdateMessage message) { + if (!message.isUpdateCard()) { + log.warn("TodoSyncStateToCardService.onMessage: not update card, message={}", message); + return; + } + Todo todo = todoDao.findTodoByCode(message.getUpdatedTodo().getIdentityCode()) + .orElse(null); + if (todo == null) { + log.warn("TodoSyncStateToCardService.onMessage: todo not found, message={}", message); + return; + } + MessageTemplateV3 template = messageTemplateV3Dao + .findByCode(todo.getTemplateCode()) + .orElse(null); + if (template == null) { + log.warn("TodoSyncStateToCardService.onMessage: template not found, message={}", message); + return; + } + if (template.getStatus() != StatusEnum.ENABLE) { + log.warn("TodoSyncStateToCardService.onMessage: template is disabled, message={}", message); + return; + } + if (!template.determineChannels().contains(MessageChannel.IM)) { + log.warn("TodoSyncStateToCardService.onMessage: template not support IM, message={}", message); + return; + } + TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); + if (business == null) { + log.warn("TodoSyncStateToCardService.sendCard: business not found, todo={}", todo); + return; + } + if (todo.getState() == PendingMessageStateEnum.HAS_BEEN_SENT + || todo.getState() == PendingMessageStateEnum.CREATED) { + sendCard(event, business, todo); + } else { + updateCardState(event, business, todo); + if (business.getBizCategory() == BizCategoryEnum.FLOW) + updateFlowButtonStates(event, business, todo); + } + } + + private void sendCard(Event event, TodoBusiness business, Todo todo) { + CardSendRequest request = new CardSendRequest(); + request.setAppCode(APP_CODE); + request.setTemplateCode(todo.getTemplateCode()); + request.setBizCode(todo.getBizCode()); + request.setIdempotentCode(todo.getIdentityCode()); + request.setSubBizCode(todo.getSubBizCode()); + request.setSender(PeerPerson.create(business.getPromoterPersonId(), business.getOuId(), business.getOrgId())); + request.setReceivers(Sets.newHashSet(PeerPerson.create( + todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); + JSONObject bizParam = todo.bizParam(); + bizParam.put(TODO_CATEGORY_BIZ_PARAM_KEY, business.getBizCategory().getCode()); + bizParam.put(TODO_IDENTITY_CODE_BIZ_PARAM_KEY, todo.getIdentityCode()); + request.setBizParam(bizParam); + request.setRouterParam(todo.routerParam()); + request.setReturnCards(false); + try { + log.info("TodoSyncStateToCardService.sendCard: todo={}", todo); + cardManager.send(request); + TodoRequestContext ctx = TodoRequestContext + .create("sendCard", event) + .addLogContent("sendCardRequest", request); + todoLogger.logTodoUpdated(ctx, todo); + log.info("TodoSyncStateToCardService.sendCard: success, todo={}", todo); + } catch (CardIdempotentException ignored) { + log.warn("TodoSyncStateToCardService.sendCard: idempotent, todo={}", todo); + } + } + + private void updateCardState(Event event, TodoBusiness business, Todo todo) { + CardUpdateStateRequest request = new CardUpdateStateRequest(); + request.setAppCode(APP_CODE); + request.setTemplateCode(todo.getTemplateCode()); + request.setBizCode(todo.getBizCode()); + request.setSubBizCode(todo.getSubBizCode()); + request.setReceivers(Sets.newHashSet(PeerPerson.create( + todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); + request.setBizState(getBizState(business, todo)); + request.setCardCompleted(todo.getState() == PendingMessageStateEnum.COMPLETED); + TodoRequestContext ctx = TodoRequestContext + .create("updateCardState", event) + .addLogContent("updateCardStateRequest", request) + .addLogContent("todo", todo); + if (request.isValid()) { + cardManager.updateState(request); + todoLogger.logTodoUpdated( + ctx.copy().addLogContent("updateCardStateResult", "success"), + todo); + } else { + log.info("TodoSyncStateToCardService.updateCardState: invalid request, todo={}", todo); + todoLogger.logTodoUpdated( + ctx.copy().addLogContent("updateCardStateResult", "invalid update card state request"), + todo); + } + } + + private void updateFlowButtonStates(Event event, TodoBusiness business, Todo todo) { + if (business.getBizFinalState() == null || !business.getBizFinalState().isEnableActionPerformed()) { + log.warn("TodoSyncStateToCardService.updateFlowButtonStates:" + + " bizFinalState is null or not action performable, business={}, todo={}", business, todo); + return; + } + SetActionPerformedRequest request = new SetActionPerformedRequest(); + request.setAppCode(APP_CODE); + request.setTemplateCode(todo.getTemplateCode()); + request.setBizCode(todo.getBizCode()); + request.setSubBizCode(todo.getSubBizCode()); + request.setReceivers(Sets.newHashSet(PeerPerson.create( + todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); + request.setButtonCode(business.getBizFinalState().getButtonCode()); + request.setCardBizState(getBizState(business, todo)); + cardManager.setActionPerformed(request); + TodoRequestContext ctx = TodoRequestContext + .create("updateCardFlowButtonStates", event) + .addLogContent("todo", todo); + todoLogger.logTodoUpdated(ctx, todo); + } + + private CardBizState getBizState(TodoBusiness business, Todo todo) { + if (business.getBizCategory() == BizCategoryEnum.OTHER) { + if (todo.getState() == PendingMessageStateEnum.COMPLETED) + return CardBizState.COMPLETED; + if (todo.getState() == PendingMessageStateEnum.PROCESSING) + return CardBizState.IN_PROGRESS; + if (todo.getState() == PendingMessageStateEnum.RETRACT) + return CardBizState.REVOKED; + return null; + } + if (business.getBizFinalState() == BizFinalStateEnum.COMPLETED) + return CardBizState.COMPLETED; + if (business.getBizFinalState() == BizFinalStateEnum.RETRACT) + return CardBizState.REVOKED; + if (business.getBizFinalState() == BizFinalStateEnum.PASSED) + return CardBizState.AGREED; + if (business.getBizFinalState() == BizFinalStateEnum.REJECTED) + return CardBizState.REJECTED; + if (business.getBizFinalState() == BizFinalStateEnum.ABORTED) + return CardBizState.ABORTED; + return null; + } + + void onCardPresetButtonPressed(CardPresetButtonPressedMessage message) { + log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: {}", message); + if(!APP_CODE.equals(message.getCardInfo().getAppCode())) { + log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: not msg-center:todo, message={}", message); + return; + } + PresetButtonPressedRequest request = new PresetButtonPressedRequest(); + todoManager.firePresetButtonPressed(request, false); + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java index c4b34227..bb26a7da 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java @@ -55,7 +55,7 @@ public class TodoLogger { logTodosUpdated(ctx, todos); } - void logTodoUpdated(TodoRequestContext ctx, Todo todo) { + public void logTodoUpdated(TodoRequestContext ctx, Todo todo) { logTodosUpdated(ctx, Collections.singletonList(todo)); } 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 c586a6f4..26db620d 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 @@ -18,7 +18,6 @@ import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig; import cn.axzo.msg.center.message.domain.dto.TemplateModelV3; import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam; import cn.axzo.msg.center.message.service.impl.v3.ModelV3Service; -import cn.axzo.msg.center.message.service.todo.TodoWithCardWrapper; import cn.axzo.msg.center.message.service.todo.manage.broadcast.TodoBroadcaster; import cn.axzo.msg.center.message.service.todo.manage.broadcast.TodoMqBroadcaster; import cn.axzo.msg.center.message.service.todo.manage.event.HandoverEvent; @@ -39,13 +38,11 @@ import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest; import cn.axzo.msg.center.service.pending.request.PresetButtonPressedRequest; import cn.axzo.msg.center.service.pending.request.RevokeByTemplateCodeRequest; import cn.axzo.msg.center.service.pending.request.RevokePendingMessageByIdRequest; -import cn.axzo.msg.center.service.pending.request.SetHideRequest; 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.JSONUtils; -import cn.axzo.msg.center.utils.DateFormatUtil; import cn.axzo.msg.center.utils.QueryFormatter; import cn.axzo.msg.center.utils.UUIDUtil; import com.alibaba.fastjson.JSONObject; @@ -59,7 +56,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.joda.time.DateTime; import org.springframework.beans.BeanUtils; import org.springframework.context.ApplicationContext; import org.springframework.dao.DuplicateKeyException; @@ -69,7 +65,6 @@ import org.springframework.transaction.support.TransactionTemplate; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -100,7 +95,6 @@ public class TodoManager { private final ApplicationContext applicationContext; private final TodoBroadcaster todoBroadcaster; private final TransactionTemplate transactionTemplate; - private final TodoWithCardWrapper todoWithCardWrapper; public List send(PendingMessagePushParam request) { TodoRequestContext ctx = TodoRequestContext.create("send", request.normalize()); @@ -170,7 +164,7 @@ public class TodoManager { if (StringUtils.isBlank(business.getSampleTodoCode()) && request.determineTodoType() == TodoType.EXECUTABLE) todoBusinessDao.updateSampleTodCode(business.getId(), sample.getIdentityCode()); - todoBroadcaster.fireTodoUpdates("send", todos); + todoBroadcaster.fireTodoUpdates("send", todos, true); // 记录日志 // @formatter:off ctx.addLogContent("templateTitle", templateModel.getTemplate().getTitle()) @@ -186,7 +180,6 @@ public class TodoManager { todoLogger.logBusinessUpdated(ctx, business); todoLogger.logTodosUpdated(ctx, todos); applicationContext.publishEvent(new NewTodoEvent(this, templateModel, todos)); - todoWithCardWrapper.send(request, todos); return todos.stream() .map(todo -> new PushPendingMessageDTO( @@ -250,8 +243,8 @@ public class TodoManager { destTodo.setExecutorName(request.determineToPersonName()); } todoDao.saveBatch(destTodos); - todoBroadcaster.fireTodoUpdates("handover", srcTodos); - todoBroadcaster.fireTodoUpdates("handover", destTodos); + todoBroadcaster.fireTodoUpdates("handover", srcTodos, true); + todoBroadcaster.fireTodoUpdates("handover", destTodos, true); // build handover mappings List mappings = new ArrayList<>(); for (int i = 0; i < srcTodos.size(); i++) { @@ -285,7 +278,6 @@ public class TodoManager { if (!advanceResult.isAdvanced()) return false; todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardCompleteStateByTodoList(advanceResult.getAdvancedTodos()); return true; } @@ -296,7 +288,9 @@ public class TodoManager { public boolean completeById(CompletePendingMessageByIdRequest request) { Set ids = request.determineIds(); BizAssertions.assertNotEmpty(ids, "待办id不能为空"); - TodoRequestContext ctx = TodoRequestContext.create("completeById", request); + TodoRequestContext ctx = TodoRequestContext + .create("completeById", request) + .delayBroadcast(true); StateAdvanceResult advanceResult = advanceState(ctx, execAdvanceBuilder() .in(Todo::getId, ids.toArray(new Object[0])) .set(Todo::getState, PendingMessageStateEnum.COMPLETED)); @@ -312,7 +306,7 @@ public class TodoManager { } if (advanceResult.isAdvanced()) { todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardCompleteStateByTodoList(advanceResult.getAdvancedTodos()); + todoBroadcaster.fireTodoUpdates("completeById", advanceResult.getBusinessId(), true); } return advanceResult.isAdvanced() || businessUpdated; @@ -341,11 +335,10 @@ public class TodoManager { todoLogger.logBusinessUpdated(ctx, advanceResult.getBusiness()); } if (advanceResult.isAdvanced()) { + todoBroadcaster.fireTodoUpdates("completeByBizCode", advanceResult.getBusinessId(), true); todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardCompleteStateByTodoList(advanceResult.getAdvancedTodos()); } - advanceResult.broadcast(); return advanceResult.isAdvanced() || businessUpdated; } @@ -384,8 +377,7 @@ public class TodoManager { TodoRequestContext ctx = TodoRequestContext.create("updateBusinessFinalBizState", request) .addLogContent("updated", updated); todoLogger.logBusinessUpdated(ctx, business); - List todos = todoDao.getByBusinessIds(Collections.singletonList(business.getId())); - todoBroadcaster.fireTodoUpdates("updateBusinessFinalBizState", todos); + todoBroadcaster.fireTodoUpdates("updateBusinessFinalBizState", business.getId(), true); } return updated; } @@ -404,7 +396,6 @@ public class TodoManager { if (!advanceResult.isAdvanced()) return false; todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardCompleteStateByTodoList(advanceResult.getAdvancedTodos()); return true; } @@ -423,8 +414,7 @@ public class TodoManager { return false; } todoLogger.logTodoRollback(ctx, advanceResult.getAdvancedTodos()); - todoBroadcaster.fireTodoUpdates("rollbackBySubBizCode", advanceResult.getAdvancedTodos()); -// todoWithCardWrapper.cardRollbackStateByTodoList(advanceResult.getAdvancedTodos()); + todoBroadcaster.fireTodoUpdates("rollbackBySubBizCode", advanceResult.getAdvancedTodos(), true); return true; } @@ -444,7 +434,6 @@ public class TodoManager { if (!advanceResult.isAdvanced()) return false; todoLogger.logTodoRevoked(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardRevokeStateByTodoList(advanceResult.getAdvancedTodos()); return true; } @@ -460,7 +449,6 @@ public class TodoManager { if (!advanceResult.isAdvanced()) return false; todoLogger.logTodoRevoked(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardRevokeStateByTodoList(advanceResult.getAdvancedTodos()); return true; } @@ -476,7 +464,6 @@ public class TodoManager { if (!advanceResult.isAdvanced()) return false; todoLogger.logTodoRevoked(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardRevokeStateByTodoList(advanceResult.getAdvancedTodos()); return true; } @@ -493,7 +480,6 @@ public class TodoManager { if (!advanceResult.isAdvanced()) return false; todoLogger.logTodoRevoked(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardRevokeStateByTodoList(advanceResult.getAdvancedTodos()); return true; } @@ -506,37 +492,11 @@ public class TodoManager { if (!advanceResult.isAdvanced()) return false; todoLogger.logTodoRevoked(ctx, advanceResult.getAdvancedTodos()); - todoWithCardWrapper.cardRevokeStateByTodoList(advanceResult.getAdvancedTodos()); return true; } // !! update - /** - * 将待办设置为隐藏, 隐藏有时间期限 - */ - @Transactional(rollbackFor = Exception.class) - public boolean setHide(SetHideRequest request) { - BizAssertions.assertTrue(StringUtils.isNotBlank(request.getSubBizCode()), "subBizCode不能为空"); - List todos = todoDao.getBySubBizCode(request.getSubBizCode()); - if (todos.isEmpty()) - return false; - int seconds = request.getHideSeconds() == null - ? cfg.getPendingSetHideSeconds() : request.getHideSeconds(); - Date expireTime = DateTime.now().plusSeconds(seconds).toDate(); - boolean updated = todoDao.setExecutableHide(request.getSubBizCode(), expireTime); - if (updated) { - List updatedTodos = todos.stream() - .filter(todo -> todo.getState() == PendingMessageStateEnum.HAS_BEEN_SENT) - .collect(toList()); - TodoRequestContext ctx = TodoRequestContext.create("setHide", request) - .addLogContent("expiredTime", expireTime.getTime()) - .addLogContent("readableExpiredTime", DateFormatUtil.toReadableString(expireTime)); - todoLogger.logTodosUpdated(ctx, updatedTodos); - } - return updated; - } - /** * 将待办设置为执行中 */ @@ -557,8 +517,7 @@ public class TodoManager { request.put("subBizCodes", subBizCodes); TodoRequestContext ctx = TodoRequestContext.create("batchSetProcessing", request); todoLogger.logSetTodoProcessing(ctx, todos); - todoBroadcaster.fireTodoUpdates("batchSetProcessing", todos); - todoWithCardWrapper.cardProcessingStateByTodoList(todos); + todoBroadcaster.fireTodoUpdates("batchSetProcessing", todos, true); } return updated; } @@ -595,7 +554,6 @@ public class TodoManager { .addLogContent("updatedRouterParam", routerParam) .addLogContent("updatedTemplateCode", request.getTemplateCode()); todoLogger.logBusinessUpdated(ctx, business); - //TODO todoWithCardWrapper.send } return updated; } @@ -606,12 +564,14 @@ public class TodoManager { * 点击预设按钮 */ @Transactional(rollbackFor = Exception.class) - public boolean firePresetButtonPressed(PresetButtonPressedRequest request, boolean isSyncCard) { + public boolean firePresetButtonPressed(PresetButtonPressedRequest request, boolean syncCardState) { Todo todo = todoDao.findTodoByCode(request.getIdentityCode()).orElse(null); if (todo == null) return false; TodoRequestContext ctx = TodoRequestContext.create("firePresetButtonPressed", request) .addLogContent("presetButtonType", request.getPresetButtonType()); + if (!syncCardState) + ctx.disableUpdateCard(); StateAdvanceResult advanceResult = advanceState(ctx, execAdvanceBuilder() .eq(Todo::getIdentityCode, request.getIdentityCode()) .set(Todo::getState, PendingMessageStateEnum.COMPLETED)); @@ -620,8 +580,7 @@ public class TodoManager { // 支持重复发mq消息 if (isAdvancedOrCompleted) { sendMqMessageOnPresetButtonPressed(ctx, request, todo); - todoBroadcaster.fireTodoUpdates("presetButtonPressed", todo); - todoWithCardWrapper.fireCardWhenPresetButtonPressedByTodo(request, todo,isSyncCard); + todoBroadcaster.fireTodoUpdates("presetButtonPressed", todo, syncCardState); // 如果不是重复发送, 就只记一条日志. 如果是重复发送, 就单独记录一条日志 if (!advanceResult.isAdvanced()) @@ -678,6 +637,7 @@ public class TodoManager { return false; ImmutableMap request = ImmutableMap.of("personId", personId, "identityCode", identityCode); TodoRequestContext ctx = TodoRequestContext.create("setCopiedToMeRead", request) + .disableUpdateCard() .addLogContent("state", PendingMessageStateEnum.READ) .addLogContent("isSetAllRead", StringUtils.isBlank(identityCode)); StateAdvanceResult advanceResult = advanceState(ctx, copiedAdvanceBuilder() @@ -731,7 +691,7 @@ public class TodoManager { broadcastHandler = () -> { if (!updatedTodoIds.isEmpty()) { List updatedTodos = todoDao.listByIds(updatedTodoIds); - todoBroadcaster.fireTodoUpdates(ctx.getName(), updatedTodos); + todoBroadcaster.fireTodoUpdates(ctx.getName(), updatedTodos, ctx.isUpdateCard()); } }; if (!ctx.isDelayBroadcast()) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java index e83539ea..f57a5edf 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java @@ -18,6 +18,7 @@ public class TodoRequestContext { private final String requestNo; private final Map logContents = new LinkedHashMap<>(); private boolean delayBroadcast = false; + private boolean updateCard = true; private TodoRequestContext(String name, String requestNo, Object request) { this.name = name; @@ -53,6 +54,11 @@ public class TodoRequestContext { return this; } + public TodoRequestContext disableUpdateCard() { + this.updateCard = false; + return this; + } + public TodoRequestContext addLogContent(String name, Object value) { if (name == null || value == null) return this; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java index a2d6729d..f98db829 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java @@ -26,11 +26,16 @@ public class TodoBroadcaster { private final TodoPullBroadcaster todoPullBroadcaster; private final TodoDao todoDao; - public void fireTodoUpdates(String operation, Todo todo) { - fireTodoUpdates(operation, Collections.singletonList(todo)); + public void fireTodoUpdates(String operation, Long businessId, boolean updateCard) { + List todos = todoDao.getByBusinessIds(Collections.singletonList(businessId)); + fireTodoUpdates(operation, todos, updateCard); } - public void fireTodoUpdates(String operation, List todos) { + public void fireTodoUpdates(String operation, Todo todo, boolean updateCard) { + fireTodoUpdates(operation, Collections.singletonList(todo), updateCard); + } + + public void fireTodoUpdates(String operation, List todos, boolean updateCard) { if (CollectionUtils.isEmpty(todos)) return; List todoIds = todos.stream() @@ -42,7 +47,7 @@ public class TodoBroadcaster { log.warn("发送待办通知时, 查询不到最新的待办信息. todoIds={}", JSON.toJSONString(todoIds)); return; } - todoMqBroadcaster.fireTodoUpdated(operation, todos); + todoMqBroadcaster.fireTodoUpdated(operation, todos, updateCard); todoPullBroadcaster.fireTodoChanged(todos); } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java index b2a58dce..ae521bfb 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java @@ -26,16 +26,17 @@ public class TodoMqBroadcaster { private final MqProducer mqProducer; private final TodoBusinessDao todoBusinessDao; - public void fireTodoUpdated(String operation, List todos) { + public void fireTodoUpdated(String operation, List todos, boolean updateCard) { TodoBusinesses businesses = todoBusinessDao.getBusinesses(todos); for (Todo todo : todos) - fireTodoUpdated(operation, businesses, todo); + fireTodoUpdated(operation, businesses, todo, updateCard); } - private void fireTodoUpdated(String operation, TodoBusinesses businesses, Todo todo) { + private void fireTodoUpdated(String operation, TodoBusinesses businesses, Todo todo, boolean updateCard) { TodoUpdateMessage message = new TodoUpdateMessage(); message.setOperation(operation); message.setUpdatedTodo(createTodoInfo(businesses, todo)); + message.setUpdateCard(updateCard); mqProducer.send(MqMessageRecord .builder(MqMessageType.TODO_STATE_UPDATE, message) .messageKey(todo.getId()) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java b/inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java new file mode 100644 index 00000000..67dc3d3d --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java @@ -0,0 +1,27 @@ +package cn.axzo.msg.center.mq; + +/** + * @author yanglin + */ +public enum ConsumerIsolation { + + TODO_SYNC_CARD_BIZ, + TODO_SYNC_CARD_FLOW, + + ; + + private static final ThreadLocal INSTANCE = new ThreadLocal<>(); + + public static void setIsolation(ConsumerIsolation isolation) { + INSTANCE.set(isolation); + } + + public static ConsumerIsolation getIsolation() { + return INSTANCE.get(); + } + + public static void clearIsolation() { + INSTANCE.remove(); + } + +} \ No newline at end of file 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 f7b87a3f..cef6fba2 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 @@ -162,4 +162,50 @@ public class RocketMQConfig { } } + @Slf4j + @Component + @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_sync_card_biz_${spring.profiles.active}", + consumeMode = ConsumeMode.ORDERLY, + nameServer = "${rocketmq.name-server}" + ) + public static class TodoSyncCardBizListener extends BaseListener implements RocketMQListener { + + @Autowired + private EventConsumer eventConsumer; + + @Override + public void onMessage(MessageExt message) { + ConsumerIsolation.setIsolation(ConsumerIsolation.TODO_SYNC_CARD_BIZ); + try { + super.onEvent(message, eventConsumer); + } finally { + ConsumerIsolation.clearIsolation(); + } + } + } + + @Slf4j + @Component + @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_sync_card_flow_${spring.profiles.active}", + consumeMode = ConsumeMode.ORDERLY, + nameServer = "${rocketmq.name-server}" + ) + public static class TodoSyncCardFlowListener extends BaseListener implements RocketMQListener { + + @Autowired + private EventConsumer eventConsumer; + + @Override + public void onMessage(MessageExt message) { + ConsumerIsolation.setIsolation(ConsumerIsolation.TODO_SYNC_CARD_FLOW); + try { + super.onEvent(message, eventConsumer); + } finally { + ConsumerIsolation.clearIsolation(); + } + } + } + } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/TodoUpdateMessage.java b/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/TodoUpdateMessage.java index 3cb4bce4..f7be9bdc 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/TodoUpdateMessage.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/TodoUpdateMessage.java @@ -1,5 +1,6 @@ package cn.axzo.msg.center.api.mq; +import com.alibaba.fastjson.JSON; import lombok.Data; import lombok.EqualsAndHashCode; @@ -9,6 +10,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) public class TodoUpdateMessage extends MqMessage { + /** * 什么操作导致这次变化 */ @@ -17,4 +19,15 @@ public class TodoUpdateMessage extends MqMessage { * 待办信息 */ private TodoInfo updatedTodo; + + /** + * 是否需要更新卡片 + */ + private boolean updateCard; + + @Override + public String toString() { + return JSON.toJSONString(this); + } + } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java index 6a801540..32242df2 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java @@ -1,6 +1,9 @@ package cn.axzo.msg.center.service; +import cn.axzo.msg.center.service.enums.BizFinalStateEnum; +import cn.axzo.msg.center.service.enums.CodeDefinition; import cn.axzo.msg.center.service.enums.PresetButtonType; +import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; /** @@ -22,6 +25,8 @@ public interface ButtonV3 { RouterCategoryEnum getCategory(); + RouterButtonSourceEnum getSource(); + default boolean determineIsPendingShow() { return getPendingShow() != null && getPendingShow(); } @@ -31,6 +36,10 @@ public interface ButtonV3 { } default boolean isPerformActionAvailable() { + if (getSource() == RouterButtonSourceEnum.SYSTEM) { + BizFinalStateEnum bizFinalState = CodeDefinition.findByCode(BizFinalStateEnum.class, getCode()).orElse(null); + return bizFinalState != null && bizFinalState.isEnableActionPerformed(); + } return determineIsPendingShow() || getCategory() == RouterCategoryEnum.PRESET_BUTTON; } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java index 8ac6f9d5..b8fd1d64 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java @@ -27,7 +27,7 @@ public class PeerPerson { return person; } - public static PeerPerson newPeerPerson(Long personId, Long ouId, Long workspaceId) { + public static PeerPerson create(Long personId, Long ouId, Long workspaceId) { PeerPerson person = new PeerPerson(); person.setPersonId(personId); person.setOuId(ouId); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizCategoryEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizCategoryEnum.java index e3085def..7deed910 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizCategoryEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizCategoryEnum.java @@ -13,10 +13,15 @@ import lombok.Getter; */ @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) -public enum BizCategoryEnum { +public enum BizCategoryEnum implements CodeDefinition { FLOW("流程"), OTHER("其它"), ; private final String desc; + + @Override + public String getCode() { + return name(); + } } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java index e3e9ab2b..89dd0b59 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java @@ -5,12 +5,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; /** - * @description - * 业务终态的状态枚举,包含审批流的相关状态 - * * @author cold_blade - * @date 2023/11/7 * @version 1.0 + * @description 业务终态的状态枚举,包含审批流的相关状态 + * @date 2023/11/7 */ @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -19,24 +17,26 @@ public enum BizFinalStateEnum implements CodeDefinition { /** * 已处理 */ - COMPLETED("https://static.axzo.cn/fe-static/uni-icon/public/seal-1%23_%241699341908382.png"), + COMPLETED("", false, "https://static.axzo.cn/fe-static/uni-icon/public/seal-1%23_%241699341908382.png"), /** * 已撤销 */ - RETRACT("https://static.axzo.cn/fe-static/uni-icon/native/%E5%8E%9F%E7%A8%BF%23_%241711338477975.png"), + RETRACT("BPMN_REVOCATION", true, "https://static.axzo.cn/fe-static/uni-icon/native/%E5%8E%9F%E7%A8%BF%23_%241711338477975.png"), /** * 已通过 */ - PASSED("https://static.axzo.cn/fe-static/uni-icon/public/seal-4%23_%241699341908374.png"), + PASSED("BPMN_APPROVE", true, "https://static.axzo.cn/fe-static/uni-icon/public/seal-4%23_%241699341908374.png"), /** * 已拒绝 */ - REJECTED("https://static.axzo.cn/fe-static/uni-icon/public/seal-2%23_%241699341908381.png"), + REJECTED("BPMN_REJECT", true, "https://static.axzo.cn/fe-static/uni-icon/public/seal-2%23_%241699341908381.png"), /** * 已终止 */ - ABORTED("https://axzo-public.oss-cn-chengdu.aliyuncs.com/%E5%8D%B0%E7%AB%A0-%E8%AF%A6%E6%83%85end.png"); + ABORTED("", false, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/%E5%8D%B0%E7%AB%A0-%E8%AF%A6%E6%83%85end.png"); + private final String buttonCode; + private final boolean enableActionPerformed; private final String icon; @Override diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/PendingMessageStateEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/PendingMessageStateEnum.java index 485bcdd1..6d196df5 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/PendingMessageStateEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/PendingMessageStateEnum.java @@ -19,11 +19,9 @@ import java.util.Objects; public enum PendingMessageStateEnum implements CodeDefinition { CREATED(0, "创建"), - UNSENT(1, "未发送"), HAS_BEEN_SENT(2, "代办"), COMPLETED(5, "已办"), RETRACT(6, "已撤回"), - DELETED(7, "已删除"), READ(8, "已读"), PROCESSING(9, "处理中") ; diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardUpdateStateRequest.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardUpdateStateRequest.java index 8b13e39f..629a793a 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardUpdateStateRequest.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardUpdateStateRequest.java @@ -24,16 +24,18 @@ public class CardUpdateStateRequest extends CardUpdateRequest { private Boolean cardCompleted; public void validate() { - if (!determineIsCardCompleted() && bizState == null) - throw new ServiceException("cardCompleted 和 bizState 不能同时为空"); + if (!isValid()) throw new ServiceException("cardCompleted 和 bizState 不能同时为空"); + } + + public boolean isValid() { + return determineIsCardCompleted() || bizState != null; } public boolean determineIsCardCompleted() { return cardCompleted != null && cardCompleted; } - @Override - public String toString() { + @Override public String toString() { return JSON.toJSONString(this); } 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 926085de..83a4c0e5 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 @@ -191,11 +191,15 @@ public class Todo extends BaseEntityExt implements MessageEntity { @Override public JSONObject bizParam() { - return bizExtParam == null ? new JSONObject() : bizExtParam; + if (bizExtParam == null) + bizExtParam = new JSONObject(); + return bizExtParam; } @Override public JSONObject routerParam() { - return routerParams == null ? new JSONObject() : routerParams; + if (routerParams == null) + routerParams = new JSONObject(); + return routerParams; } } \ No newline at end of file From 87f43e84f11e246b11770e056081cbbd90164deb Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 19:39:02 +0800 Subject: [PATCH 002/111] =?UTF-8?q?=E5=BE=85=E5=8A=9E=E5=8F=91=E9=80=81MQ?= =?UTF-8?q?=E6=B2=BB=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/manage/TodoManager.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) 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 26db620d..73527b8d 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 @@ -306,8 +306,11 @@ public class TodoManager { } if (advanceResult.isAdvanced()) { todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - todoBroadcaster.fireTodoUpdates("completeById", advanceResult.getBusinessId(), true); } + if (businessUpdated) + todoBroadcaster.fireTodoUpdates("completeById", advanceResult.getBusinessId(), true); + else + advanceResult.broadcast(); return advanceResult.isAdvanced() || businessUpdated; } @@ -334,10 +337,12 @@ public class TodoManager { "businessUpdated", businessUpdated); todoLogger.logBusinessUpdated(ctx, advanceResult.getBusiness()); } - if (advanceResult.isAdvanced()) { - todoBroadcaster.fireTodoUpdates("completeByBizCode", advanceResult.getBusinessId(), true); + if (advanceResult.isAdvanced()) todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - } + if (businessUpdated) + todoBroadcaster.fireTodoUpdates("completeByBizCode", advanceResult.getBusinessId(), true); + else + advanceResult.broadcast(); return advanceResult.isAdvanced() || businessUpdated; } @@ -554,6 +559,7 @@ public class TodoManager { .addLogContent("updatedRouterParam", routerParam) .addLogContent("updatedTemplateCode", request.getTemplateCode()); todoLogger.logBusinessUpdated(ctx, business); + todoBroadcaster.fireTodoUpdates("updateBusinessById", business.getId(), true); } return updated; } @@ -580,7 +586,6 @@ public class TodoManager { // 支持重复发mq消息 if (isAdvancedOrCompleted) { sendMqMessageOnPresetButtonPressed(ctx, request, todo); - todoBroadcaster.fireTodoUpdates("presetButtonPressed", todo, syncCardState); // 如果不是重复发送, 就只记一条日志. 如果是重复发送, 就单独记录一条日志 if (!advanceResult.isAdvanced()) From c2486830781edf2eebb04f6aee4daaff0eecdbf7 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 19:42:13 +0800 Subject: [PATCH 003/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardParser.java | 6 ------ .../cn/axzo/msg/center/message/service/card/CardProps.java | 2 -- 2 files changed, 8 deletions(-) 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 15d36769..44bb74de 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 @@ -163,12 +163,6 @@ class CardParser { return bizBody; } - private boolean isPerformActionAvailable(ParsedButtonV3 button) { - if (cardProps.getPerformActionSystemButtonCodes().contains(button.getCode())) - return true; - return button.isPerformActionAvailable(); - } - private static List getNativeAppLinks(UrlConfig urlConfig) { if (urlConfig == null) return Collections.emptyList(); NativeAppLinkUrlConfigVisitor visitor = new NativeAppLinkUrlConfigVisitor(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java index 8b007f55..2b29ee84 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java @@ -1,6 +1,5 @@ package cn.axzo.msg.center.message.service.card; -import com.google.common.collect.Sets; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -24,7 +23,6 @@ public class CardProps { private boolean enableCardIdempotent = true; private int updateCardBatchSize = 200; private Set idempotentFreeTemplateCodes = new HashSet<>(); - private Set performActionSystemButtonCodes = Sets.newHashSet(""); boolean isIdempotentFree(String templateCode) { return getIdempotentFreeTemplateCodes().contains(templateCode); From 7d9e13f762e2e7a02b4e169f48439822cd89d060 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 19:51:46 +0800 Subject: [PATCH 004/111] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/card/CardSyncTodoHandler.java | 2 +- .../todo/card/TodoSyncCardService.java | 22 ++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) 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/CardSyncTodoHandler.java index 2562b263..f4f3a464 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/CardSyncTodoHandler.java @@ -22,7 +22,7 @@ public class CardSyncTodoHandler implements EventHandler, InitializingBean { @Override public void onEvent(Event event, EventConsumer.Context context) { CardPresetButtonPressedMessage message = event.normalizedData(CardPresetButtonPressedMessage.class); - todoSyncCardService.onCardPresetButtonPressed(message); + todoSyncCardService.syncCardPresetButtonPressed(message); } @Override 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 75bc89de..15d3999e 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 @@ -29,6 +29,7 @@ import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; /** @@ -97,7 +98,7 @@ class TodoSyncCardService { } else { updateCardState(event, business, todo); if (business.getBizCategory() == BizCategoryEnum.FLOW) - updateFlowButtonStates(event, business, todo); + maybeSetFlowActionPerformed(event, business, todo); } } @@ -157,7 +158,7 @@ class TodoSyncCardService { } } - private void updateFlowButtonStates(Event event, TodoBusiness business, Todo todo) { + private void maybeSetFlowActionPerformed(Event event, TodoBusiness business, Todo todo) { if (business.getBizFinalState() == null || !business.getBizFinalState().isEnableActionPerformed()) { log.warn("TodoSyncStateToCardService.updateFlowButtonStates:" + " bizFinalState is null or not action performable, business={}, todo={}", business, todo); @@ -202,14 +203,29 @@ class TodoSyncCardService { return null; } - void onCardPresetButtonPressed(CardPresetButtonPressedMessage message) { + void syncCardPresetButtonPressed(CardPresetButtonPressedMessage message) { log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: {}", message); if(!APP_CODE.equals(message.getCardInfo().getAppCode())) { log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: not msg-center:todo, message={}", message); return; } + String identityCode = message.getCardInfo().getBizParam().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); + if (StringUtils.isBlank(identityCode)) { + log.warn("TodoSyncStateToCardService.onCardPresetButtonPressed: identityCode is blank, message={}", message); + return; + } + Todo todo = todoDao.findTodoByCode(identityCode).orElse(null); + if (todo == null) { + log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: todo not found, message={}", message); + return; + } PresetButtonPressedRequest request = new PresetButtonPressedRequest(); + request.setIdentityCode(identityCode); + request.setPresetButtonType(message.getPresetButtonType()); + request.setOperatorId(message.getOperatorId()); + request.setOperatorName(message.getOperatorName()); todoManager.firePresetButtonPressed(request, false); + todoLogger.logTodoUpdated(TodoRequestContext.create("syncCardState", message), todo); } } \ No newline at end of file From 55cb65bdc9248613d599b20d0ca9f621e4968c01 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 20:12:32 +0800 Subject: [PATCH 005/111] =?UTF-8?q?=E6=89=93=E5=BC=80=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E7=9A=84IM=E9=80=9A=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../param/MessageTemplateV3SaveOrUpdateParam.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java index 3698a715..f6dfeaa1 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/param/MessageTemplateV3SaveOrUpdateParam.java @@ -175,18 +175,6 @@ public class MessageTemplateV3SaveOrUpdateParam implements Serializable { * 校验 */ public void checkCreate() { - //1 流程待办,暂不能使用IM通道 - switch (this.getMsgCategory()) { - case GENERAL_MESSAGE: - break; - case IM_MESSAGE_CARD: - break; - case BIZ_PENDING_MESSAGE: - break; - case APPROVAL_PENDING_MESSAGE: - boolean contains = CollectionUtils.isNotEmpty(this.getChannels()) && this.getChannels().contains(MessageChannel.IM); - BizAssertions.assertFalse(contains, "审批待办,暂不能使用IM通道"); - } //2 同一个预设按钮类型,只能有一个 if (CollectionUtils.isNotEmpty(this.getButtons())) { Map> collect = this.getButtons().stream() From 0d6c79f088ed1e733803a16a895c4aff4afb84f2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 20:21:56 +0800 Subject: [PATCH 006/111] =?UTF-8?q?todo=20log=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inside/notices/config/PendingMessageBizConfig.java | 3 +++ .../msg/center/message/service/todo/manage/TodoLogger.java | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java index 050335c2..12cb8150 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java @@ -173,6 +173,9 @@ public class PendingMessageBizConfig { @Getter private int todoTitleSearchMaxSize = 5000; + @Getter + private boolean enableTodoLog = true; + public boolean determineOldMsgStatCacheOn() { return isOldMsgStatCacheOn(); } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java index bb26a7da..13f33d90 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java @@ -6,6 +6,7 @@ import cn.axzo.msg.center.dal.TodoLogDao; import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.domain.entity.TodoBusiness; import cn.axzo.msg.center.domain.entity.TodoLog; +import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.TodoLogType; @@ -27,8 +28,10 @@ public class TodoLogger { private final TodoLogDao todoLogDao; private final TodoBusinessDao todoBusinessDao; + private final PendingMessageBizConfig cfg; void logBusinessUpdated(TodoRequestContext ctx, TodoBusiness business) { + if (!cfg.isEnableTodoLog()) return; TodoLog log = createBusinessLog(ctx, business); log.setContext(ctx.getName()); log.addLogContents(ctx.getLogContents()); @@ -60,8 +63,8 @@ public class TodoLogger { } public void logTodosUpdated(TodoRequestContext ctx, List todos) { - if (CollectionUtils.isEmpty(todos)) - return; + if (!cfg.isEnableTodoLog()) return; + if (CollectionUtils.isEmpty(todos)) return; TodoBusinesses businesses = todoBusinessDao.getBusinesses(todos); ArrayList logs = new ArrayList<>(); for (Todo todo : todos) { From 3878a4192d66afc3a23fc2bb25492d371363590c Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 20:29:01 +0800 Subject: [PATCH 007/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/message/service/todo/card/TodoSyncCardService.java | 2 -- 1 file changed, 2 deletions(-) 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 15d3999e..65796ca3 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 @@ -40,7 +40,6 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor class TodoSyncCardService { - private static final String TODO_CATEGORY_BIZ_PARAM_KEY = "____todo_category____"; private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "____todo_identity_code____"; private static final String APP_CODE = "msg-center:todo"; @@ -113,7 +112,6 @@ class TodoSyncCardService { request.setReceivers(Sets.newHashSet(PeerPerson.create( todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); JSONObject bizParam = todo.bizParam(); - bizParam.put(TODO_CATEGORY_BIZ_PARAM_KEY, business.getBizCategory().getCode()); bizParam.put(TODO_IDENTITY_CODE_BIZ_PARAM_KEY, todo.getIdentityCode()); request.setBizParam(bizParam); request.setRouterParam(todo.routerParam()); From 6f10873d62c724c4ad5368e71b3f85d7612340b2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 20:30:42 +0800 Subject: [PATCH 008/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/message/service/todo/card/TodoSyncCardService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 65796ca3..8dd5c113 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 @@ -88,7 +88,7 @@ class TodoSyncCardService { } TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); if (business == null) { - log.warn("TodoSyncStateToCardService.sendCard: business not found, todo={}", todo); + log.warn("TodoSyncStateToCardService.sendCard: business not found, message={}", message); return; } if (todo.getState() == PendingMessageStateEnum.HAS_BEEN_SENT From f8c9629d52109496a9eb068dff507661c803b0e6 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 20:52:31 +0800 Subject: [PATCH 009/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cef6fba2..ade18ff0 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 @@ -150,7 +150,7 @@ public class RocketMQConfig { consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}" ) - public static class CardChangeStateSyncTodoListener extends BaseListener implements RocketMQListener { + public static class CardSyncTodoListener extends BaseListener implements RocketMQListener { @Autowired private EventConsumer eventConsumer; From 4d9eb0d1fb398a9b4cfdd5089e04993c36d96138 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 20:52:43 +0800 Subject: [PATCH 010/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ade18ff0..ffc1d45e 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 @@ -146,7 +146,7 @@ public class RocketMQConfig { @Slf4j @Component @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_card_change_state_sync_todo_${spring.application.name}_${spring.profiles.active}", + consumerGroup = "GID_topic_card_sync_todo_${spring.application.name}_${spring.profiles.active}", consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}" ) From cc4029aad4cad21e9cb67769595c435970e183ad Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 20:54:09 +0800 Subject: [PATCH 011/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ffc1d45e..90518631 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 @@ -146,7 +146,7 @@ public class RocketMQConfig { @Slf4j @Component @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_card_sync_todo_${spring.application.name}_${spring.profiles.active}", + consumerGroup = "GID_topic_card_sync_todo_${spring.profiles.active}", consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}" ) From 8235e14192b0ca9c40927c1366173563ad1ffdcb Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 31 Dec 2024 09:36:41 +0800 Subject: [PATCH 012/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/todo/card/TodoSyncCardBizHandler.java | 10 +++++++++- .../service/todo/card/TodoSyncCardFlowHandler.java | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java index f5f4b05c..6f5c64b9 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java @@ -8,12 +8,14 @@ import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.service.enums.BizCategoryEnum; 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 class TodoSyncCardBizHandler implements EventHandler, InitializingBean { @@ -23,7 +25,13 @@ class TodoSyncCardBizHandler implements EventHandler, InitializingBean { @Override public void onEvent(Event event, EventConsumer.Context context) { - TodoUpdateMessage message = event.normalizedData(TodoUpdateMessage.class); + TodoUpdateMessage message = null; + try { + message = event.normalizedData(TodoUpdateMessage.class); + } catch (Exception e) { + log.warn("parse message error. event={}", event, e); + return; + } if (ConsumerIsolation.getIsolation() == ConsumerIsolation.TODO_SYNC_CARD_BIZ && message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.OTHER) { todoSyncCardService.onMessage(event, message); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java index 508dd0d7..8113d98a 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java @@ -8,12 +8,14 @@ import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.service.enums.BizCategoryEnum; 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 class TodoSyncCardFlowHandler implements EventHandler, InitializingBean { @@ -23,7 +25,13 @@ class TodoSyncCardFlowHandler implements EventHandler, InitializingBean { @Override public void onEvent(Event event, EventConsumer.Context context) { - TodoUpdateMessage message = event.normalizedData(TodoUpdateMessage.class); + TodoUpdateMessage message = null; + try { + message = event.normalizedData(TodoUpdateMessage.class); + } catch (Exception e) { + log.warn("parse message error. event={}", event, e); + return; + } if (ConsumerIsolation.getIsolation() == ConsumerIsolation.TODO_SYNC_CARD_FLOW && message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.FLOW) { todoSyncCardService.onMessage(event, message); From e63425d7367fa9125ea4fff3ea72cd22e798f9d8 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 31 Dec 2024 09:36:53 +0800 Subject: [PATCH 013/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/card/TodoSyncCardBizHandler.java | 2 +- .../message/service/todo/card/TodoSyncCardFlowHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java index 6f5c64b9..756aeb58 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java @@ -25,7 +25,7 @@ class TodoSyncCardBizHandler implements EventHandler, InitializingBean { @Override public void onEvent(Event event, EventConsumer.Context context) { - TodoUpdateMessage message = null; + TodoUpdateMessage message; try { message = event.normalizedData(TodoUpdateMessage.class); } catch (Exception e) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java index 8113d98a..5a779536 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java @@ -25,7 +25,7 @@ class TodoSyncCardFlowHandler implements EventHandler, InitializingBean { @Override public void onEvent(Event event, EventConsumer.Context context) { - TodoUpdateMessage message = null; + TodoUpdateMessage message; try { message = event.normalizedData(TodoUpdateMessage.class); } catch (Exception e) { From 2dead472b0771735e6c56c9653b4288b33a524b5 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 31 Dec 2024 10:00:03 +0800 Subject: [PATCH 014/111] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/card/TodoSyncCardService.java | 5 ----- 1 file changed, 5 deletions(-) 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 8dd5c113..51ebd62e 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 @@ -20,7 +20,6 @@ import cn.axzo.msg.center.service.enums.BizFinalStateEnum; import cn.axzo.msg.center.service.enums.CardBizState; import cn.axzo.msg.center.service.enums.MessageChannel; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; -import cn.axzo.msg.center.service.enums.StatusEnum; import cn.axzo.msg.center.service.pending.request.CardSendRequest; import cn.axzo.msg.center.service.pending.request.CardUpdateStateRequest; import cn.axzo.msg.center.service.pending.request.PresetButtonPressedRequest; @@ -78,10 +77,6 @@ class TodoSyncCardService { log.warn("TodoSyncStateToCardService.onMessage: template not found, message={}", message); return; } - if (template.getStatus() != StatusEnum.ENABLE) { - log.warn("TodoSyncStateToCardService.onMessage: template is disabled, message={}", message); - return; - } if (!template.determineChannels().contains(MessageChannel.IM)) { log.warn("TodoSyncStateToCardService.onMessage: template not support IM, message={}", message); return; From e72a7e1e83edd49015fcc1f86581ea0f15c6bb20 Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 3 Jan 2025 17:31:23 +0800 Subject: [PATCH 015/111] =?UTF-8?q?=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/card/CardParser.java | 55 +++++-- .../interceptor/CardButtonInterceptor.java | 43 ++++++ .../CardButtonInterceptorFactory.java | 15 ++ .../service/todo/ModelV2PropsPopulator.java | 2 +- .../todo/card/CardSyncTodoHandler.java | 3 + .../todo/card/TodoSyncCardService.java | 146 +++++++++--------- .../flow/FlowTodoCardButtonInterceptor.java | 62 ++++++++ .../FlowTodoCardButtonInterceptorFactory.java | 42 +++++ .../todo/manage/TodoRequestContext.java | 9 +- .../manage/broadcast/TodoMqBroadcaster.java | 7 +- .../cn/axzo/msg/center/mq/RocketMQConfig.java | 1 - .../msg/center/utils/desision/Decision.java | 8 + .../center/utils/desision/DecisionValue.java | 36 +++++ .../cn/axzo/msg/center/api/mq/CardInfo.java | 5 + .../cn/axzo/msg/center/service/ButtonV3.java | 15 +- .../service/enums/BizFinalStateEnum.java | 27 +++- .../center/service/enums/CardBizState.java | 2 +- .../msg/center/service/enums/CardState.java | 7 +- .../pending/response/TodoButtonProvider.java | 18 --- .../response/v3/model/ParsedButtonV3.java | 13 +- .../msg/center/service/util/IdBuilder.java | 4 + .../entity/MessageTemplateButtonV3.java | 10 ++ 22 files changed, 399 insertions(+), 131 deletions(-) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptorFactory.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptor.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptorFactory.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/Decision.java create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java delete mode 100644 msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/TodoButtonProvider.java 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 44bb74de..ea065b94 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 @@ -7,6 +7,8 @@ import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO.CardExtensionIt import cn.axzo.msg.center.message.service.impl.v3.AppLink; import cn.axzo.msg.center.message.service.impl.v3.NativeAppLinkUrlConfigVisitor; import cn.axzo.msg.center.message.service.impl.v3.V3ExtPopulator; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; import cn.axzo.msg.center.service.domain.UrlConfig; import cn.axzo.msg.center.service.domain.UrlConfigWalker; import cn.axzo.msg.center.service.enums.ButtonStyleEnum; @@ -25,8 +27,8 @@ import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupV3; import cn.axzo.msg.center.service.pending.response.v3.model.ParsedKV; import cn.axzo.msg.center.service.pending.response.v3.model.ParsedTemplateV3; import cn.axzo.msg.center.service.pending.response.v3.model.PersonInfo; -import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -38,12 +40,23 @@ import java.util.List; * @author yanglin */ @Component -@RequiredArgsConstructor class CardParser { private final MessageSystemConfig messageSystemConfig; private final V3ExtPopulator v3ExtPopulator; private final CardProps cardProps; + private final CardButtonInterceptorFactory[] interceptorFactories; + + CardParser(MessageSystemConfig messageSystemConfig, + V3ExtPopulator v3ExtPopulator, + CardProps cardProps, + ObjectProvider interceptorFactoryProvider) { + this.messageSystemConfig = messageSystemConfig; + this.v3ExtPopulator = v3ExtPopulator; + this.cardProps = cardProps; + this.interceptorFactories = interceptorFactoryProvider + .getIfAvailable(() -> new CardButtonInterceptorFactory[0]); + } GeneralMessagePushVO parseCardContent(CardTemplate cardTemplate, CardContent card) { ParsedTemplateV3 template = cardTemplate.getTemplate(); @@ -76,6 +89,7 @@ class CardParser { bizBody.addDebugInfo("bizState", stateInfo.getBizState()); bizBody.addDebugInfo("cardState", stateInfo.getCardState()); bizBody.addDebugInfo("isUpdatable", cardTemplate.isUpdatable()); + CardButtonInterceptor buttonInterceptor = getButtonInterceptor(card); ParsedModelV3Walker.walkDown(cardTemplate.getParsedModel(), new ParsedModel3Visitor() { @Override public void visitTemplateCardUrlConfig(UrlConfig urlConfig) { @@ -113,16 +127,21 @@ class CardParser { */ @Override public void visitButton(ParsedButtonV3 button) { - List styles = button.parseStyle(); - if (!styles.contains(ButtonStyleEnum.OVER_CARD)) - return; - - boolean isActionPerformed = CardButtonStates - .create(card.getButtonStates()) - .isButtonActionPerformed(button); + Boolean isVisibleOnCard = buttonInterceptor + .isVisibleOnCard(button) + .orElse(() -> button.getStyles().contains(ButtonStyleEnum.OVER_CARD)); + if (!isVisibleOnCard) return; + boolean isPerformActionAvailable = buttonInterceptor + .isPerformActionAvailable(button) + .orElse(button.isPerformActionAvailable()); + Boolean isActionPerformed = buttonInterceptor + .isActionPerformed(button) + .orElse(CardButtonStates + .create(card.getButtonStates()) + .isButtonActionPerformed(button)); if (card.getStateInfo().getCardState() == CardState.COMPLETED - && button.isPerformActionAvailable() + && isPerformActionAvailable && !isActionPerformed) return; @@ -131,9 +150,12 @@ class CardParser { CardButton imButton = new CardButton(); bizBody.getCardButtons().add(imButton); - imButton.setTitle(isActionPerformed ? button.getActionPerformedName() : button.getName()); + String actionPerformed = buttonInterceptor + .getActionPerformedName(button) + .orElse(button.getActionPerformedName()); + imButton.setTitle(isActionPerformed ? actionPerformed : button.getName()); imButton.setAction(button.getCategory().name()); - imButton.setIsHighlight(styles.contains(ButtonStyleEnum.HIGH_LIGHT)); + imButton.setIsHighlight(button.getStyles().contains(ButtonStyleEnum.HIGH_LIGHT)); imButton.setExecutorShow(button.getExecutorShow()); imButton.setActionPerformed(isActionPerformed); if (button.getUrlConfig().hasUrl()) @@ -170,4 +192,13 @@ class CardParser { return visitor.getLinks(); } + private CardButtonInterceptor getButtonInterceptor(CardContent card) { + for (CardButtonInterceptorFactory factory : interceptorFactories) { + CardButtonInterceptor interceptor = factory.create(card); + if (interceptor != null) + return interceptor; + } + return CardButtonInterceptor.NOT_SURE; + } + } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java new file mode 100644 index 00000000..d5bcc6d8 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java @@ -0,0 +1,43 @@ +package cn.axzo.msg.center.message.service.card.interceptor; + +import cn.axzo.msg.center.service.ButtonV3; +import cn.axzo.msg.center.utils.desision.DecisionValue; + +/** + * @author yanglin + */ +public interface CardButtonInterceptor { + + DecisionValue isPerformActionAvailable(ButtonV3 button); + + DecisionValue isActionPerformed(ButtonV3 button); + + DecisionValue getActionPerformedName(ButtonV3 button); + + DecisionValue isVisibleOnCard(ButtonV3 button); + + CardButtonInterceptor NOT_SURE = new CardButtonInterceptor() { + + @Override + public DecisionValue isPerformActionAvailable(ButtonV3 button) { + return DecisionValue.notSure(); + } + + @Override + public DecisionValue isActionPerformed(ButtonV3 button) { + return DecisionValue.notSure(); + } + + @Override + public DecisionValue getActionPerformedName(ButtonV3 button) { + return DecisionValue.notSure(); + } + + @Override + public DecisionValue isVisibleOnCard(ButtonV3 button) { + return DecisionValue.notSure(); + } + + }; + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptorFactory.java new file mode 100644 index 00000000..17d41cbe --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptorFactory.java @@ -0,0 +1,15 @@ +package cn.axzo.msg.center.message.service.card.interceptor; + +import cn.axzo.msg.center.service.pending.request.CardContent; + +import javax.annotation.Nullable; + +/** + * @author yanglin + */ +public interface CardButtonInterceptorFactory { + + @Nullable + CardButtonInterceptor create(CardContent card); + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/ModelV2PropsPopulator.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/ModelV2PropsPopulator.java index 575b9746..56c4b532 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/ModelV2PropsPopulator.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/ModelV2PropsPopulator.java @@ -89,7 +89,7 @@ public class ModelV2PropsPopulator implements ParsedModel3Visitor { buttonV2.setDesc(buttonV3.getName()); buttonV2.setCategory(buttonV3.getCategory()); buttonV2.setPresetButtonType(buttonV3.getPresetButtonType()); - buttonV2.setStyle(buttonV3.parseStyle()); + buttonV2.setStyle(buttonV3.getStyles()); buttonV2.setExecutorShow(buttonV3.getExecutorShow()); buttonV2.setPendingShow(buttonV3.getPendingShow()); buttonV2.setKey(buttonV3.getCode()); 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/CardSyncTodoHandler.java index f4f3a464..b5f1cc62 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/CardSyncTodoHandler.java @@ -6,12 +6,14 @@ import cn.axzo.framework.rocketmq.EventHandler; import cn.axzo.msg.center.api.mq.CardPresetButtonPressedMessage; 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 CardSyncTodoHandler implements EventHandler, InitializingBean { @@ -22,6 +24,7 @@ public class CardSyncTodoHandler implements EventHandler, InitializingBean { @Override public void onEvent(Event event, EventConsumer.Context context) { CardPresetButtonPressedMessage message = event.normalizedData(CardPresetButtonPressedMessage.class); + log.info("received CardPresetButtonPressedMessage: {}", message); todoSyncCardService.syncCardPresetButtonPressed(message); } 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 51ebd62e..dcf5490b 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 @@ -18,12 +18,12 @@ import cn.axzo.msg.center.service.dto.PeerPerson; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.enums.BizFinalStateEnum; import cn.axzo.msg.center.service.enums.CardBizState; +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.CardUpdateStateRequest; import cn.axzo.msg.center.service.pending.request.PresetButtonPressedRequest; -import cn.axzo.msg.center.service.pending.request.SetActionPerformedRequest; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; @@ -31,16 +31,20 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import java.util.Optional; + /** * @author yanglin */ @Slf4j @Component @RequiredArgsConstructor -class TodoSyncCardService { +public class TodoSyncCardService { - private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "____todo_identity_code____"; private static final String APP_CODE = "msg-center:todo"; + private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "____todo_identity_code____"; + private static final String TODO_TYPE_BIZ_PARAM_KEY = "____todo_type____"; + private static final String TODO_CATEGORY_BIZ_PARAM_KEY = "____todo_category____"; private final TodoDao todoDao; private final TodoBusinessDao todoBusinessDao; @@ -50,7 +54,7 @@ class TodoSyncCardService { private final TodoManager todoManager; void onMessage(Event event, TodoUpdateMessage message) { - log.info("TodoSyncStateToCardService.onMessage: {}", message); + log.info("received TodoUpdateMessage: {}", message); try { sync(event, message); } catch (Exception e) { @@ -87,13 +91,10 @@ class TodoSyncCardService { return; } if (todo.getState() == PendingMessageStateEnum.HAS_BEEN_SENT - || todo.getState() == PendingMessageStateEnum.CREATED) { + || todo.getState() == PendingMessageStateEnum.CREATED) sendCard(event, business, todo); - } else { + else updateCardState(event, business, todo); - if (business.getBizCategory() == BizCategoryEnum.FLOW) - maybeSetFlowActionPerformed(event, business, todo); - } } private void sendCard(Event event, TodoBusiness business, Todo todo) { @@ -108,19 +109,24 @@ class TodoSyncCardService { todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); JSONObject bizParam = todo.bizParam(); bizParam.put(TODO_IDENTITY_CODE_BIZ_PARAM_KEY, todo.getIdentityCode()); + bizParam.put(TODO_TYPE_BIZ_PARAM_KEY, todo.getType().getCode()); + bizParam.put(TODO_CATEGORY_BIZ_PARAM_KEY, business.getBizCategory().getCode()); request.setBizParam(bizParam); request.setRouterParam(todo.routerParam()); request.setReturnCards(false); + TodoRequestContext ctx = TodoRequestContext + .create("sendCard", event) + .addLogContent("sendCardRequest", request); try { log.info("TodoSyncStateToCardService.sendCard: todo={}", todo); cardManager.send(request); - TodoRequestContext ctx = TodoRequestContext - .create("sendCard", event) - .addLogContent("sendCardRequest", request); todoLogger.logTodoUpdated(ctx, todo); log.info("TodoSyncStateToCardService.sendCard: success, todo={}", todo); } catch (CardIdempotentException ignored) { log.warn("TodoSyncStateToCardService.sendCard: idempotent, todo={}", todo); + } catch (Exception e) { + log.warn("TodoSyncStateToCardService.sendCard: error, todo={}", todo, e); + todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); } } @@ -132,77 +138,36 @@ class TodoSyncCardService { request.setSubBizCode(todo.getSubBizCode()); request.setReceivers(Sets.newHashSet(PeerPerson.create( todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); - request.setBizState(getBizState(business, todo)); + request.setBizState(business.getBizCategory() == BizCategoryEnum.FLOW + ? determineCardBizStateForFlowTodo(business) + : determineCardBizStateForBizTodo(todo)); request.setCardCompleted(todo.getState() == PendingMessageStateEnum.COMPLETED); TodoRequestContext ctx = TodoRequestContext .create("updateCardState", event) .addLogContent("updateCardStateRequest", request) .addLogContent("todo", todo); if (request.isValid()) { - cardManager.updateState(request); - todoLogger.logTodoUpdated( - ctx.copy().addLogContent("updateCardStateResult", "success"), - todo); + try { + cardManager.updateState(request); + todoLogger.logTodoUpdated(ctx.copy().addLogContent("updateCardStateResult", "success"), todo); + } catch (Exception e) { + log.warn("TodoSyncStateToCardService.updateCardState: error, todo={}", todo, e); + todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); + } } else { log.info("TodoSyncStateToCardService.updateCardState: invalid request, todo={}", todo); - todoLogger.logTodoUpdated( - ctx.copy().addLogContent("updateCardStateResult", "invalid update card state request"), - todo); + todoLogger.logTodoUpdated(ctx.copy().addLogContent("updateCardStateResult", "invalid update card state request"), todo); } } - private void maybeSetFlowActionPerformed(Event event, TodoBusiness business, Todo todo) { - if (business.getBizFinalState() == null || !business.getBizFinalState().isEnableActionPerformed()) { - log.warn("TodoSyncStateToCardService.updateFlowButtonStates:" + - " bizFinalState is null or not action performable, business={}, todo={}", business, todo); - return; - } - SetActionPerformedRequest request = new SetActionPerformedRequest(); - request.setAppCode(APP_CODE); - request.setTemplateCode(todo.getTemplateCode()); - request.setBizCode(todo.getBizCode()); - request.setSubBizCode(todo.getSubBizCode()); - request.setReceivers(Sets.newHashSet(PeerPerson.create( - todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); - request.setButtonCode(business.getBizFinalState().getButtonCode()); - request.setCardBizState(getBizState(business, todo)); - cardManager.setActionPerformed(request); - TodoRequestContext ctx = TodoRequestContext - .create("updateCardFlowButtonStates", event) - .addLogContent("todo", todo); - todoLogger.logTodoUpdated(ctx, todo); - } - - private CardBizState getBizState(TodoBusiness business, Todo todo) { - if (business.getBizCategory() == BizCategoryEnum.OTHER) { - if (todo.getState() == PendingMessageStateEnum.COMPLETED) - return CardBizState.COMPLETED; - if (todo.getState() == PendingMessageStateEnum.PROCESSING) - return CardBizState.IN_PROGRESS; - if (todo.getState() == PendingMessageStateEnum.RETRACT) - return CardBizState.REVOKED; - return null; - } - if (business.getBizFinalState() == BizFinalStateEnum.COMPLETED) - return CardBizState.COMPLETED; - if (business.getBizFinalState() == BizFinalStateEnum.RETRACT) - return CardBizState.REVOKED; - if (business.getBizFinalState() == BizFinalStateEnum.PASSED) - return CardBizState.AGREED; - if (business.getBizFinalState() == BizFinalStateEnum.REJECTED) - return CardBizState.REJECTED; - if (business.getBizFinalState() == BizFinalStateEnum.ABORTED) - return CardBizState.ABORTED; - return null; - } - void syncCardPresetButtonPressed(CardPresetButtonPressedMessage message) { log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: {}", message); - if(!APP_CODE.equals(message.getCardInfo().getAppCode())) { + if (!APP_CODE.equals(message.getCardInfo().getAppCode())) { log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: not msg-center:todo, message={}", message); return; } - String identityCode = message.getCardInfo().getBizParam().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); + String identityCode = message.getCardInfo() + .determineBizParam().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); if (StringUtils.isBlank(identityCode)) { log.warn("TodoSyncStateToCardService.onCardPresetButtonPressed: identityCode is blank, message={}", message); return; @@ -217,8 +182,51 @@ class TodoSyncCardService { request.setPresetButtonType(message.getPresetButtonType()); request.setOperatorId(message.getOperatorId()); request.setOperatorName(message.getOperatorName()); - todoManager.firePresetButtonPressed(request, false); - todoLogger.logTodoUpdated(TodoRequestContext.create("syncCardState", message), todo); + TodoRequestContext ctx = TodoRequestContext.create("syncCardState", message); + try { + todoManager.firePresetButtonPressed(request, false); + todoLogger.logTodoUpdated(ctx, todo); + } catch (Exception e) { + todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); + } + } + + private static CardBizState determineCardBizStateForBizTodo(Todo todo) { + if (todo.getState() == PendingMessageStateEnum.COMPLETED) + return CardBizState.COMPLETED; + if (todo.getState() == PendingMessageStateEnum.PROCESSING) + return CardBizState.PROCESSING; + if (todo.getState() == PendingMessageStateEnum.RETRACT) + return CardBizState.REVOKED; + return null; + } + + private static CardBizState determineCardBizStateForFlowTodo(TodoBusiness business) { + if (business.getBizFinalState() == BizFinalStateEnum.COMPLETED) + return CardBizState.COMPLETED; + if (business.getBizFinalState() == BizFinalStateEnum.RETRACT) + return CardBizState.REVOKED; + if (business.getBizFinalState() == BizFinalStateEnum.PASSED) + return CardBizState.AGREED; + if (business.getBizFinalState() == BizFinalStateEnum.REJECTED) + return CardBizState.REJECTED; + if (business.getBizFinalState() == BizFinalStateEnum.ABORTED) + return CardBizState.ABORTED; + return null; + } + + public static Optional findTodoBizCategory(JSONObject bizParam) { + if (bizParam == null) + return Optional.empty(); + String category = bizParam.getString(TODO_CATEGORY_BIZ_PARAM_KEY); + return CodeDefinition.findByCode(BizCategoryEnum.class, category); + } + + public static Optional findTodoIdentityCode(JSONObject bizParam) { + if (bizParam == null) + return Optional.empty(); + String identityCode = bizParam.getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); + return Optional.ofNullable(identityCode); } } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptor.java new file mode 100644 index 00000000..c38e9ca5 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptor.java @@ -0,0 +1,62 @@ +package cn.axzo.msg.center.message.service.todo.card.flow; + +import cn.axzo.msg.center.domain.entity.Todo; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; +import cn.axzo.msg.center.service.ButtonV3; +import cn.axzo.msg.center.service.enums.BizFinalStateEnum; +import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; +import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; +import cn.axzo.msg.center.utils.desision.DecisionValue; +import lombok.RequiredArgsConstructor; + +import java.util.Optional; + +/** + * @author yanglin + */ +@RequiredArgsConstructor +class FlowTodoCardButtonInterceptor implements CardButtonInterceptor { + + private final Todo todo; + + @Override + public DecisionValue isPerformActionAvailable(ButtonV3 button) { + BizFinalStateEnum state = findPerformActionAvailableState(button).orElse(null); + if (state == null) + return DecisionValue.notSure(); + return DecisionValue.decide(state.isEnableActionPerformed()); + } + + @Override + public DecisionValue isActionPerformed(ButtonV3 button) { + BizFinalStateEnum state = findPerformActionAvailableState(button).orElse(null); + if (state == null) + return DecisionValue.notSure(); + //todo + return null; + } + + @Override + public DecisionValue getActionPerformedName(ButtonV3 button) { + BizFinalStateEnum state = findPerformActionAvailableState(button).orElse(null); + if (state == null) + return DecisionValue.notSure(); + //todo + return DecisionValue.decide(state.getActionPerformedName()); + } + + @Override + public DecisionValue isVisibleOnCard(ButtonV3 button) { + if (button.getSource() == RouterButtonSourceEnum.SYSTEM + && todo.getState() == PendingMessageStateEnum.PROCESSING) + return DecisionValue.decide(false); + return null; + } + + private Optional findPerformActionAvailableState(ButtonV3 button) { + if (button.getSource() == RouterButtonSourceEnum.CUSTOM) + return Optional.empty(); + return BizFinalStateEnum.findByButtonCode(button.getCode()); + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptorFactory.java new file mode 100644 index 00000000..b34b20a7 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptorFactory.java @@ -0,0 +1,42 @@ +package cn.axzo.msg.center.message.service.todo.card.flow; + +import cn.axzo.msg.center.dal.TodoDao; +import cn.axzo.msg.center.domain.entity.Todo; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; +import cn.axzo.msg.center.message.service.todo.card.TodoSyncCardService; +import cn.axzo.msg.center.service.enums.BizCategoryEnum; +import cn.axzo.msg.center.service.pending.request.CardContent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Nullable; + +/** + * @author yanglin + */ +@Slf4j +@Component +@RequiredArgsConstructor +class FlowTodoCardButtonInterceptorFactory implements CardButtonInterceptorFactory { + + private final TodoDao todoDao; + + @Override @Nullable + public CardButtonInterceptor create(CardContent card) { + String identityCode = TodoSyncCardService.findTodoIdentityCode(card.getBizParam()).orElse(null); + if (identityCode == null) + return null; + BizCategoryEnum category = TodoSyncCardService.findTodoBizCategory(card.getBizParam()).orElse(null); + if (category != BizCategoryEnum.FLOW) + return null; + Todo todo = todoDao.findTodoByCode(identityCode).orElse(null); + if (todo == null) { + log.warn("todo not found. identityCode={}", identityCode); + return null; + } + return new FlowTodoCardButtonInterceptor(todo); + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java index f57a5edf..b1a80cf0 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java @@ -3,6 +3,7 @@ package cn.axzo.msg.center.message.service.todo.manage; import cn.axzo.msg.center.common.utils.BizAssertions; import cn.axzo.msg.center.utils.UUIDUtil; import com.alibaba.fastjson.JSON; +import com.google.common.base.Throwables; import lombok.Getter; import java.util.HashMap; @@ -62,8 +63,12 @@ public class TodoRequestContext { public TodoRequestContext addLogContent(String name, Object value) { if (name == null || value == null) return this; - if (!logContents.containsKey(name)) - logContents.put(name, value); + if (!logContents.containsKey(name)) { + if (value instanceof Throwable) + logContents.put(name, Throwables.getStackTraceAsString((Throwable) value)); + else + logContents.put(name, value); + } return this; } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java index ae521bfb..b265b86f 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java @@ -11,6 +11,7 @@ import cn.axzo.msg.center.message.service.todo.manage.TodoExt; import cn.axzo.msg.center.mq.MqMessageRecord; import cn.axzo.msg.center.mq.MqProducer; import cn.axzo.msg.center.service.enums.MqMessageType; +import cn.axzo.msg.center.service.util.IdBuilder; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -40,7 +41,11 @@ public class TodoMqBroadcaster { mqProducer.send(MqMessageRecord .builder(MqMessageType.TODO_STATE_UPDATE, message) .messageKey(todo.getId()) - .shardingKey(todo.getTemplateCode()) + .shardingKey(IdBuilder.builder() + .append(todo.getTemplateCode()) + .append(todo.getBizCode()) + .append(todo.getSubBizCode()) + .build()) .build()); } 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 90518631..f3118e27 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 @@ -157,7 +157,6 @@ public class RocketMQConfig { @Override public void onMessage(MessageExt message) { - log.info("CardChangeStateSyncTodoListener onMessage,message:{}", JSON.toJSONString(message)); super.onEvent(message, eventConsumer); } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/Decision.java b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/Decision.java new file mode 100644 index 00000000..fa20786a --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/Decision.java @@ -0,0 +1,8 @@ +package cn.axzo.msg.center.utils.desision; + +/** + * @author yanglin + */ +public enum Decision { + NOT_SURE, DECIDED +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java new file mode 100644 index 00000000..8fcab4a9 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java @@ -0,0 +1,36 @@ +package cn.axzo.msg.center.utils.desision; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; + +import java.util.function.Supplier; + +/** + * @author yanglin + */ +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public class DecisionValue { + + private static final DecisionValue NOT_SURE = new DecisionValue<>(Decision.NOT_SURE, null); + + private final Decision decision; + private final T value; + + @SuppressWarnings("unchecked") + public static DecisionValue notSure() { + return (DecisionValue)NOT_SURE; + } + + public static DecisionValue decide(T value) { + return new DecisionValue<>(Decision.DECIDED, value); + } + + public T orElse(Supplier supplier) { + return decision == Decision.DECIDED ? value : supplier.get(); + } + + public T orElse(T value) { + return decision == Decision.DECIDED ? this.value : value; + } + +} \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardInfo.java b/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardInfo.java index f7ecef1c..1558e478 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardInfo.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardInfo.java @@ -148,4 +148,9 @@ public class CardInfo { */ private String subtitle; + public JSONObject determineBizParam() { + if (bizParam == null) + bizParam = new JSONObject(); + return bizParam; + } } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java index 32242df2..97af3faa 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java @@ -1,11 +1,12 @@ package cn.axzo.msg.center.service; -import cn.axzo.msg.center.service.enums.BizFinalStateEnum; -import cn.axzo.msg.center.service.enums.CodeDefinition; +import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.PresetButtonType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; +import java.util.List; + /** * @author yanglin */ @@ -27,19 +28,13 @@ public interface ButtonV3 { RouterButtonSourceEnum getSource(); + List getStyles(); + default boolean determineIsPendingShow() { return getPendingShow() != null && getPendingShow(); } - default boolean determineIsExecutorShow() { - return getExecutorShow() != null && getExecutorShow(); - } - default boolean isPerformActionAvailable() { - if (getSource() == RouterButtonSourceEnum.SYSTEM) { - BizFinalStateEnum bizFinalState = CodeDefinition.findByCode(BizFinalStateEnum.class, getCode()).orElse(null); - return bizFinalState != null && bizFinalState.isEnableActionPerformed(); - } return determineIsPendingShow() || getCategory() == RouterCategoryEnum.PRESET_BUTTON; } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java index 89dd0b59..dee9a7f3 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java @@ -3,6 +3,9 @@ package cn.axzo.msg.center.service.enums; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; + +import java.util.Optional; /** * @author cold_blade @@ -17,30 +20,42 @@ public enum BizFinalStateEnum implements CodeDefinition { /** * 已处理 */ - COMPLETED("", false, "https://static.axzo.cn/fe-static/uni-icon/public/seal-1%23_%241699341908382.png"), + COMPLETED("", "", "https://static.axzo.cn/fe-static/uni-icon/public/seal-1%23_%241699341908382.png"), /** * 已撤销 */ - RETRACT("BPMN_REVOCATION", true, "https://static.axzo.cn/fe-static/uni-icon/native/%E5%8E%9F%E7%A8%BF%23_%241711338477975.png"), + RETRACT("BPMN_REVOCATION", "已撤销", "https://static.axzo.cn/fe-static/uni-icon/native/%E5%8E%9F%E7%A8%BF%23_%241711338477975.png"), /** * 已通过 */ - PASSED("BPMN_APPROVE", true, "https://static.axzo.cn/fe-static/uni-icon/public/seal-4%23_%241699341908374.png"), + PASSED("BPMN_APPROVE", "已同意", "https://static.axzo.cn/fe-static/uni-icon/public/seal-4%23_%241699341908374.png"), /** * 已拒绝 */ - REJECTED("BPMN_REJECT", true, "https://static.axzo.cn/fe-static/uni-icon/public/seal-2%23_%241699341908381.png"), + REJECTED("BPMN_REJECT", "已驳回", "https://static.axzo.cn/fe-static/uni-icon/public/seal-2%23_%241699341908381.png"), /** * 已终止 */ - ABORTED("", false, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/%E5%8D%B0%E7%AB%A0-%E8%AF%A6%E6%83%85end.png"); + ABORTED("", "", "https://axzo-public.oss-cn-chengdu.aliyuncs.com/%E5%8D%B0%E7%AB%A0-%E8%AF%A6%E6%83%85end.png"); private final String buttonCode; - private final boolean enableActionPerformed; + private final String actionPerformedName; private final String icon; @Override public String getCode() { return name(); } + + public static Optional findByButtonCode(String buttonCode) { + for (BizFinalStateEnum value : values()) { + if (value.buttonCode.equals(buttonCode)) + return Optional.of(value); + } + return Optional.empty(); + } + + public boolean isEnableActionPerformed() { + return StringUtils.isNotBlank(actionPerformedName); + } } \ No newline at end of file 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 4963681a..6aa90263 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 @@ -26,7 +26,7 @@ public enum CardBizState implements CodeDefinition { ABORTED("已中止", true, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/msg-center/todo_card_state/card_biz_state_aborted_20241220.png"), COMPLETED("已处理", true, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/msg-center/todo_card_state/card_biz_state_completed_20241220.png"), END("已完结", true, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/msg-center/todo_card_state/card_biz_state_end_20241220.png"), - IN_PROGRESS("进行中", false, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/msg-center/todo_card_state/card_biz_state_inprogress_20241220.png") + PROCESSING("进行中", false, "https://axzo-public.oss-cn-chengdu.aliyuncs.com/msg-center/todo_card_state/card_biz_state_inprogress_20241220.png") ; diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java index 425f86ea..34878ffe 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java @@ -11,15 +11,14 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public enum CardState implements CodeDefinition { - CREATED("待处理"), - SEND_SUCCESS("发送成功"), - COMPLETED("已完成"), + CREATED("未发送"), + SEND_SUCCESS("待处理"), + COMPLETED("待处理"), ; private final String name; - @Override public String getCode() { return name(); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/TodoButtonProvider.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/TodoButtonProvider.java deleted file mode 100644 index ec92244a..00000000 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/TodoButtonProvider.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.axzo.msg.center.service.pending.response; - -import cn.axzo.msg.center.api.custombutton.ProposedButtons; -import cn.axzo.msg.center.service.dto.ButtonRouterDTO; - -import java.util.List; - -/** - * @author yanglin - */ -@Deprecated -public interface TodoButtonProvider { - - List getButtonRouters(); - - ProposedButtons getProposedButtons(); - -} \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedButtonV3.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedButtonV3.java index f308b86f..b22df160 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedButtonV3.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/model/ParsedButtonV3.java @@ -103,13 +103,8 @@ public class ParsedButtonV3 implements MessageButton, ButtonV3 { return priority == null ? Integer.MAX_VALUE : priority; } - public List parseStyle() { - if (style == null) return Collections.emptyList(); - return JSON.parseArray(style.toJSONString(), ButtonStyleEnum.class); - } - public boolean hasStyle(ButtonStyleEnum style) { - return parseStyle().contains(style); + return getStyles().contains(style); } @Override @@ -126,4 +121,10 @@ public class ParsedButtonV3 implements MessageButton, ButtonV3 { public PresetButtonType getPresetBtnType() { return presetButtonType; } + + @Override + public List getStyles() { + if (style == null) return Collections.emptyList(); + return JSON.parseArray(style.toJSONString(), ButtonStyleEnum.class); + } } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/util/IdBuilder.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/util/IdBuilder.java index cacb9fd7..fc1a727d 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/util/IdBuilder.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/util/IdBuilder.java @@ -45,4 +45,8 @@ public class IdBuilder { return buf.stream().map(String::valueOf).collect(joining(":")); } + @Override + public String toString() { + return build(); + } } \ No newline at end of file diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java index c836328f..de98dc1f 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java @@ -3,6 +3,7 @@ package cn.axzo.msg.center.domain.entity; import cn.axzo.msg.center.domain.utils.IgnorePropsJsonTypeHandler; import cn.axzo.msg.center.service.ButtonV3; import cn.axzo.msg.center.service.domain.UrlConfig; +import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.PresetButtonType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; @@ -14,6 +15,9 @@ import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; import lombok.Getter; import lombok.Setter; +import java.util.Collections; +import java.util.List; + /** * @author yanglin */ @@ -102,6 +106,12 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator getStyles() { + if (style == null) return Collections.emptyList(); + return JSON.parseArray(style.toJSONString(), ButtonStyleEnum.class); + } + @Setter @Getter public static class RecordExt { From 288771e861ad49a72460b12388bef2b0620670ec Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 7 Jan 2025 14:50:59 +0800 Subject: [PATCH 016/111] update message --- .../todo/card/TodoSyncCardService.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) 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 dcf5490b..8250b4e6 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 @@ -58,36 +58,36 @@ public class TodoSyncCardService { try { sync(event, message); } catch (Exception e) { - log.warn("TodoSyncStateToCardService.onMessage: error, message={}", message, e); + log.warn("onMessage error, message={}", message, e); throw new RuntimeException(e); } } private void sync(Event event, TodoUpdateMessage message) { if (!message.isUpdateCard()) { - log.warn("TodoSyncStateToCardService.onMessage: not update card, message={}", message); + log.warn("not update card, message={}", message); return; } Todo todo = todoDao.findTodoByCode(message.getUpdatedTodo().getIdentityCode()) .orElse(null); if (todo == null) { - log.warn("TodoSyncStateToCardService.onMessage: todo not found, message={}", message); + log.warn("todo not found, message={}", message); return; } MessageTemplateV3 template = messageTemplateV3Dao .findByCode(todo.getTemplateCode()) .orElse(null); if (template == null) { - log.warn("TodoSyncStateToCardService.onMessage: template not found, message={}", message); + log.warn("template not found, message={}", message); return; } if (!template.determineChannels().contains(MessageChannel.IM)) { - log.warn("TodoSyncStateToCardService.onMessage: template not support IM, message={}", message); + log.warn("template not support IM, message={}", message); return; } TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); if (business == null) { - log.warn("TodoSyncStateToCardService.sendCard: business not found, message={}", message); + log.warn("business not found, message={}", message); return; } if (todo.getState() == PendingMessageStateEnum.HAS_BEEN_SENT @@ -118,14 +118,14 @@ public class TodoSyncCardService { .create("sendCard", event) .addLogContent("sendCardRequest", request); try { - log.info("TodoSyncStateToCardService.sendCard: todo={}", todo); + log.info("sendCard: todo={}", todo); cardManager.send(request); todoLogger.logTodoUpdated(ctx, todo); - log.info("TodoSyncStateToCardService.sendCard: success, todo={}", todo); + log.info("sendCard: success, todo={}", todo); } catch (CardIdempotentException ignored) { - log.warn("TodoSyncStateToCardService.sendCard: idempotent, todo={}", todo); + log.warn("sendCard: idempotent, todo={}", todo); } catch (Exception e) { - log.warn("TodoSyncStateToCardService.sendCard: error, todo={}", todo, e); + log.warn("sendCard: error, todo={}", todo, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); } } @@ -151,30 +151,30 @@ public class TodoSyncCardService { cardManager.updateState(request); todoLogger.logTodoUpdated(ctx.copy().addLogContent("updateCardStateResult", "success"), todo); } catch (Exception e) { - log.warn("TodoSyncStateToCardService.updateCardState: error, todo={}", todo, e); + log.warn("updateCardState: error, todo={}", todo, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); } } else { - log.info("TodoSyncStateToCardService.updateCardState: invalid request, todo={}", todo); + log.info("updateCardState: invalid request, todo={}", todo); todoLogger.logTodoUpdated(ctx.copy().addLogContent("updateCardStateResult", "invalid update card state request"), todo); } } void syncCardPresetButtonPressed(CardPresetButtonPressedMessage message) { - log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: {}", message); + log.info("onCardPresetButtonPressed: {}", message); if (!APP_CODE.equals(message.getCardInfo().getAppCode())) { - log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: not msg-center:todo, message={}", message); + log.info("onCardPresetButtonPressed: not msg-center:todo, message={}", message); return; } String identityCode = message.getCardInfo() .determineBizParam().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); if (StringUtils.isBlank(identityCode)) { - log.warn("TodoSyncStateToCardService.onCardPresetButtonPressed: identityCode is blank, message={}", message); + log.warn("onCardPresetButtonPressed: identityCode is blank, message={}", message); return; } Todo todo = todoDao.findTodoByCode(identityCode).orElse(null); if (todo == null) { - log.info("TodoSyncStateToCardService.onCardPresetButtonPressed: todo not found, message={}", message); + log.info("onCardPresetButtonPressed: todo not found, message={}", message); return; } PresetButtonPressedRequest request = new PresetButtonPressedRequest(); From fbb01192f24c115b20a0079bd3ffe966a9574d27 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 8 Jan 2025 17:49:13 +0800 Subject: [PATCH 017/111] REQ-3502: rename elements to precise names --- .../message/service/todo/card/TodoSyncCardService.java | 8 +++++--- ...ceptor.java => WorkflowTodoCardButtonInterceptor.java} | 2 +- ...java => WorkflowTodoCardButtonInterceptorFactory.java} | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/{FlowTodoCardButtonInterceptor.java => WorkflowTodoCardButtonInterceptor.java} (96%) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/{FlowTodoCardButtonInterceptorFactory.java => WorkflowTodoCardButtonInterceptorFactory.java} (90%) 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 8250b4e6..c5dd4f6e 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 @@ -138,9 +138,11 @@ public class TodoSyncCardService { request.setSubBizCode(todo.getSubBizCode()); request.setReceivers(Sets.newHashSet(PeerPerson.create( todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); - request.setBizState(business.getBizCategory() == BizCategoryEnum.FLOW - ? determineCardBizStateForFlowTodo(business) - : determineCardBizStateForBizTodo(todo)); + if (todo.getState() != PendingMessageStateEnum.PROCESSING) { + request.setBizState(business.getBizCategory() == BizCategoryEnum.FLOW + ? determineCardBizStateForFlowTodo(business) + : determineCardBizStateForBizTodo(todo)); + } request.setCardCompleted(todo.getState() == PendingMessageStateEnum.COMPLETED); TodoRequestContext ctx = TodoRequestContext .create("updateCardState", event) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptor.java similarity index 96% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptor.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptor.java index c38e9ca5..7a36c11a 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptor.java @@ -15,7 +15,7 @@ import java.util.Optional; * @author yanglin */ @RequiredArgsConstructor -class FlowTodoCardButtonInterceptor implements CardButtonInterceptor { +class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { private final Todo todo; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptorFactory.java similarity index 90% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptorFactory.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptorFactory.java index b34b20a7..7e339904 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/FlowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptorFactory.java @@ -19,7 +19,7 @@ import javax.annotation.Nullable; @Slf4j @Component @RequiredArgsConstructor -class FlowTodoCardButtonInterceptorFactory implements CardButtonInterceptorFactory { +class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorFactory { private final TodoDao todoDao; @@ -36,7 +36,7 @@ class FlowTodoCardButtonInterceptorFactory implements CardButtonInterceptorFacto log.warn("todo not found. identityCode={}", identityCode); return null; } - return new FlowTodoCardButtonInterceptor(todo); + return new WorkflowTodoCardButtonInterceptor(todo); } } \ No newline at end of file From f79af3c4c282f3af7cdb1bd090c34d8300784aa5 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 8 Jan 2025 17:49:22 +0800 Subject: [PATCH 018/111] REQ-3502: rename elements to precise names --- .../{flow => workflow}/WorkflowTodoCardButtonInterceptor.java | 2 +- .../WorkflowTodoCardButtonInterceptorFactory.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/{flow => workflow}/WorkflowTodoCardButtonInterceptor.java (97%) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/{flow => workflow}/WorkflowTodoCardButtonInterceptorFactory.java (95%) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java similarity index 97% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptor.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 7a36c11a..d1ad437a 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -1,4 +1,4 @@ -package cn.axzo.msg.center.message.service.todo.card.flow; +package cn.axzo.msg.center.message.service.todo.card.workflow; import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java similarity index 95% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptorFactory.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 7e339904..d6a2ffdf 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/flow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -1,4 +1,4 @@ -package cn.axzo.msg.center.message.service.todo.card.flow; +package cn.axzo.msg.center.message.service.todo.card.workflow; import cn.axzo.msg.center.dal.TodoDao; import cn.axzo.msg.center.domain.entity.Todo; From 8f0b1bf68520685fe84edafaf64a0f0ef081710b Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 8 Jan 2025 19:14:41 +0800 Subject: [PATCH 019/111] =?UTF-8?q?REQ-3502:=20=E4=BF=AE=E6=94=B9=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/inside/notices/config/DiagnosisProps.java | 2 +- .../service/todo/mybatis/rowcountwarn/ProxyStatement.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java index 9dac53c7..f3f96131 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java @@ -34,7 +34,7 @@ public class DiagnosisProps implements EnvironmentAware { @Setter @Getter public static class RowCount { - private int warningThreshold = 6000; + private int warningThreshold = 600; private boolean enable = true; private int periodMaxWarnTimes = 3; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/rowcountwarn/ProxyStatement.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/rowcountwarn/ProxyStatement.java index 30f5cd75..6f96ba29 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/rowcountwarn/ProxyStatement.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/rowcountwarn/ProxyStatement.java @@ -63,7 +63,7 @@ public class ProxyStatement extends StatementWrapper { private boolean canWarnPeriodically() { int maxWarnTimes = props.getRowCount().getPeriodMaxWarnTimes(); - return rowCount % 2000 == 0 && periodWarnTimes <= maxWarnTimes; + return rowCount % 100 == 0 && periodWarnTimes <= maxWarnTimes; } @Override From fc3f568be148d7b75c5ef934e44969c27898b79d Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 9 Jan 2025 17:44:08 +0800 Subject: [PATCH 020/111] =?UTF-8?q?REQ-3502:=20fix=E5=8F=8D=E5=B0=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/BeautifulPaginationInterceptor.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/BeautifulPaginationInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/BeautifulPaginationInterceptor.java index 3f7c9999..8f1f8677 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/BeautifulPaginationInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/mybatis/BeautifulPaginationInterceptor.java @@ -18,6 +18,7 @@ import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Signature; +import org.apache.ibatis.reflection.DefaultReflectorFactory; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.SystemMetaObject; import org.springframework.core.Ordered; @@ -36,12 +37,13 @@ import java.util.concurrent.atomic.AtomicBoolean; args = {Connection.class, Integer.class})}) public class BeautifulPaginationInterceptor implements Interceptor, Ordered { + private static final DefaultReflectorFactory REFLECTOR_FACTORY = new DefaultReflectorFactory(); private final PaginationInterceptor delegate = new CustomPaginationInterceptor(); @Override public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget()); - MetaObject metaObject = SystemMetaObject.forObject(statementHandler); + MetaObject metaObject = systemMetaForObject(statementHandler); MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); if (SqlCommandType.SELECT != mappedStatement.getSqlCommandType() || StatementType.CALLABLE == mappedStatement.getStatementType()) { @@ -70,7 +72,7 @@ public class BeautifulPaginationInterceptor implements Interceptor, Ordered { private static String tryBuildSql(Invocation invocation) { Connection connection = (Connection) (invocation.getArgs()[0]); StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget()); - MetaObject metaObject = SystemMetaObject.forObject(statementHandler); + MetaObject metaObject = systemMetaForObject(statementHandler); MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql"); try (PreparedStatement statement = connection.prepareStatement(boundSql.getSql())) { @@ -86,6 +88,13 @@ public class BeautifulPaginationInterceptor implements Interceptor, Ordered { } } + public static MetaObject systemMetaForObject(Object object) { + return MetaObject.forObject(object, + SystemMetaObject.DEFAULT_OBJECT_FACTORY, + SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, + REFLECTOR_FACTORY); + } + private static class CustomPaginationInterceptor extends PaginationInterceptor { public CustomPaginationInterceptor() { From 9780af0b20595eadda07fe4f682637fdeab8cde2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 13 Jan 2025 09:51:50 +0800 Subject: [PATCH 021/111] =?UTF-8?q?REQ-3502:=20=E8=B0=83=E6=95=B4=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/msg/center/service/enums/CardState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java index 34878ffe..c0112524 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/CardState.java @@ -12,8 +12,8 @@ import lombok.RequiredArgsConstructor; public enum CardState implements CodeDefinition { CREATED("未发送"), - SEND_SUCCESS("待处理"), - COMPLETED("待处理"), + SEND_SUCCESS("已发送"), + COMPLETED("已处理"), ; From 48ff10551db910bd5851d9a47cc1b1194f0675e7 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 13 Jan 2025 19:24:17 +0800 Subject: [PATCH 022/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E5=BE=85?= =?UTF-8?q?=E5=8A=9Ecode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/vo/GeneralMessagePushVO.java | 2 ++ .../message/service/card/CardExtInfo.java | 32 +++++++++++++++++++ .../message/service/card/CardParser.java | 8 +++-- .../todo/card/TodoSyncCardService.java | 24 ++++++++------ 4 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java index 52b87328..54959e37 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java @@ -111,6 +111,8 @@ public class GeneralMessagePushVO implements Serializable { private Map debugInfo; + private Map extInfo; + public void addDebugInfo(String name, Object value) { if (debugInfo == null) debugInfo = new HashMap<>(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java new file mode 100644 index 00000000..85656246 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java @@ -0,0 +1,32 @@ +package cn.axzo.msg.center.message.service.card; + +import com.alibaba.fastjson.JSONObject; + +import javax.validation.constraints.NotNull; + +/** + * @author yanglin + */ +public class CardExtInfo { + + private final JSONObject extInfo; + + public CardExtInfo(JSONObject bizParam) { + JSONObject extInfo = bizParam.getJSONObject("extInfo"); + if (extInfo == null) { + extInfo = new JSONObject(); + bizParam.put("extInfo", extInfo); + } + this.extInfo = extInfo; + } + + public void addExtInfo(String key, Object value) { + extInfo.put(key, value); + } + + @NotNull + public JSONObject getExtInfo() { + return extInfo; + } + +} \ No newline at end of file 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 ea065b94..dfb898ad 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 @@ -4,11 +4,11 @@ import cn.axzo.msg.center.inside.notices.config.MessageSystemConfig; import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO; import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO.CardButton; import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO.CardExtensionItem; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; import cn.axzo.msg.center.message.service.impl.v3.AppLink; import cn.axzo.msg.center.message.service.impl.v3.NativeAppLinkUrlConfigVisitor; import cn.axzo.msg.center.message.service.impl.v3.V3ExtPopulator; -import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; -import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; import cn.axzo.msg.center.service.domain.UrlConfig; import cn.axzo.msg.center.service.domain.UrlConfigWalker; import cn.axzo.msg.center.service.enums.ButtonStyleEnum; @@ -27,6 +27,7 @@ import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupV3; import cn.axzo.msg.center.service.pending.response.v3.model.ParsedKV; import cn.axzo.msg.center.service.pending.response.v3.model.ParsedTemplateV3; import cn.axzo.msg.center.service.pending.response.v3.model.PersonInfo; +import com.alibaba.fastjson.JSONObject; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Component; @@ -182,6 +183,9 @@ class CardParser { } }); + JSONObject extInfo = new CardExtInfo(card.getBizParam()).getExtInfo(); + if (!extInfo.isEmpty()) + bizBody.setExtInfo(extInfo); return bizBody; } 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 c5dd4f6e..bb0594ea 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 @@ -9,6 +9,7 @@ import cn.axzo.msg.center.dal.TodoDao; import cn.axzo.msg.center.domain.entity.MessageTemplateV3; import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.domain.entity.TodoBusiness; +import cn.axzo.msg.center.message.service.card.CardExtInfo; import cn.axzo.msg.center.message.service.card.CardManager; import cn.axzo.msg.center.message.service.card.exception.CardIdempotentException; import cn.axzo.msg.center.message.service.todo.manage.TodoLogger; @@ -42,9 +43,9 @@ import java.util.Optional; public class TodoSyncCardService { private static final String APP_CODE = "msg-center:todo"; - private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "____todo_identity_code____"; - private static final String TODO_TYPE_BIZ_PARAM_KEY = "____todo_type____"; - private static final String TODO_CATEGORY_BIZ_PARAM_KEY = "____todo_category____"; + private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "todoIdentityCode"; + private static final String TODO_TYPE_BIZ_PARAM_KEY = "todoType"; + private static final String TODO_CATEGORY_BIZ_PARAM_KEY = "todoCategory"; private final TodoDao todoDao; private final TodoBusinessDao todoBusinessDao; @@ -108,9 +109,10 @@ public class TodoSyncCardService { request.setReceivers(Sets.newHashSet(PeerPerson.create( todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); JSONObject bizParam = todo.bizParam(); - bizParam.put(TODO_IDENTITY_CODE_BIZ_PARAM_KEY, todo.getIdentityCode()); - bizParam.put(TODO_TYPE_BIZ_PARAM_KEY, todo.getType().getCode()); - bizParam.put(TODO_CATEGORY_BIZ_PARAM_KEY, business.getBizCategory().getCode()); + CardExtInfo cardExtInfo = new CardExtInfo(bizParam); + cardExtInfo.addExtInfo(TODO_IDENTITY_CODE_BIZ_PARAM_KEY, todo.getIdentityCode()); + cardExtInfo.addExtInfo(TODO_TYPE_BIZ_PARAM_KEY, todo.getType().getCode()); + cardExtInfo.addExtInfo(TODO_CATEGORY_BIZ_PARAM_KEY, business.getBizCategory().getCode()); request.setBizParam(bizParam); request.setRouterParam(todo.routerParam()); request.setReturnCards(false); @@ -168,8 +170,8 @@ public class TodoSyncCardService { log.info("onCardPresetButtonPressed: not msg-center:todo, message={}", message); return; } - String identityCode = message.getCardInfo() - .determineBizParam().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); + String identityCode = new CardExtInfo(message.getCardInfo().determineBizParam()) + .getExtInfo().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); if (StringUtils.isBlank(identityCode)) { log.warn("onCardPresetButtonPressed: identityCode is blank, message={}", message); return; @@ -220,14 +222,16 @@ public class TodoSyncCardService { public static Optional findTodoBizCategory(JSONObject bizParam) { if (bizParam == null) return Optional.empty(); - String category = bizParam.getString(TODO_CATEGORY_BIZ_PARAM_KEY); + String category = new CardExtInfo(bizParam) + .getExtInfo().getString(TODO_CATEGORY_BIZ_PARAM_KEY); return CodeDefinition.findByCode(BizCategoryEnum.class, category); } public static Optional findTodoIdentityCode(JSONObject bizParam) { if (bizParam == null) return Optional.empty(); - String identityCode = bizParam.getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); + String identityCode = new CardExtInfo(bizParam) + .getExtInfo().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); return Optional.ofNullable(identityCode); } From 46d0052ef28dcf4368ab227ab958f286e3c597cd Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 13 Jan 2025 19:27:59 +0800 Subject: [PATCH 023/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E5=BE=85?= =?UTF-8?q?=E5=8A=9Ecode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/card/exception/CardIdempotentException.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java index 226eae3c..3875c854 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/exception/CardIdempotentException.java @@ -7,6 +7,10 @@ import cn.axzo.basics.common.exception.ServiceException; */ public class CardIdempotentException extends ServiceException { + public CardIdempotentException(Integer code, String msg) { + super(code, msg); + } + public CardIdempotentException(String msg) { super(msg); } From 79010b65f7c9e7b0f264a7409d9b5ece21591e55 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 13 Jan 2025 19:33:38 +0800 Subject: [PATCH 024/111] =?UTF-8?q?REQ-3502:=20=E5=A4=84=E7=90=86=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E9=87=8D=E5=A4=8D=E5=8F=91=E9=80=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/service/dto/PeerPerson.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java index b8fd1d64..8ae90686 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/PeerPerson.java @@ -1,16 +1,15 @@ package cn.axzo.msg.center.service.dto; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import java.util.Objects; + /** * @author yanglin */ @Setter @Getter -// 不要删除这个注解 -@EqualsAndHashCode public class PeerPerson { public static PeerPerson nonPerson() { @@ -50,6 +49,18 @@ public class PeerPerson { */ private Long workspaceId = 0L; + @Override + public boolean equals(Object o) { + if (!(o instanceof PeerPerson)) return false; + PeerPerson person = (PeerPerson) o; + return Objects.equals(personId, person.personId) && Objects.equals(ouId, person.ouId); + } + + @Override + public int hashCode() { + return Objects.hash(personId, ouId); + } + public Long getPersonIdOrDefault() { return personId == null ? 0L : personId; } From 3ec0837f2e80e14c8acbf419ce9206eb1cedadd0 Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 10 Jan 2025 23:18:50 +0800 Subject: [PATCH 025/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inside-notices/pom.xml | 4 ++++ .../domain/vo/GeneralMessagePushVO.java | 6 ++++++ .../message/service/card/CardParser.java | 1 + .../WorkflowTodoCardButtonInterceptor.java | 2 ++ ...kflowTodoCardButtonInterceptorFactory.java | 20 ++++++++++++++++++- pom.xml | 6 ++++++ 6 files changed, 38 insertions(+), 1 deletion(-) diff --git a/inside-notices/pom.xml b/inside-notices/pom.xml index 14e26e33..bcd781b0 100644 --- a/inside-notices/pom.xml +++ b/inside-notices/pom.xml @@ -21,6 +21,10 @@ + + cn.axzo.workflow + workflow-engine-spring-boot-starter + cn.axzo.org org-api diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java index 54959e37..290f6ae0 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java @@ -7,6 +7,7 @@ import cn.axzo.msg.center.service.domain.UrlConfig; import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO; import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.PresetButtonType; +import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.pending.card.domain.CardElementConfig; @@ -238,6 +239,11 @@ public class GeneralMessagePushVO implements Serializable { */ private UrlConfig urlConfig; + /** + * 按钮来源 + */ + private RouterButtonSourceEnum source; + /** * 调用api的地址. action=ACTION时, 消费这个字段 */ 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 dfb898ad..241cec4d 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 @@ -154,6 +154,7 @@ class CardParser { String actionPerformed = buttonInterceptor .getActionPerformedName(button) .orElse(button.getActionPerformedName()); + imButton.setSource(button.getSource()); imButton.setTitle(isActionPerformed ? actionPerformed : button.getName()); imButton.setAction(button.getCategory().name()); imButton.setIsHighlight(button.getStyles().contains(ButtonStyleEnum.HIGH_LIGHT)); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index d1ad437a..af072ba9 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -7,6 +7,7 @@ import cn.axzo.msg.center.service.enums.BizFinalStateEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.utils.desision.DecisionValue; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import lombok.RequiredArgsConstructor; import java.util.Optional; @@ -17,6 +18,7 @@ import java.util.Optional; @RequiredArgsConstructor class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { + private final BpmnTaskButtonVo workflowButtons; private final Todo todo; @Override diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index d6a2ffdf..00b80c30 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -1,12 +1,17 @@ package cn.axzo.msg.center.message.service.todo.card.workflow; +import cn.axzo.msg.center.dal.TodoBusinessDao; import cn.axzo.msg.center.dal.TodoDao; import cn.axzo.msg.center.domain.entity.Todo; +import cn.axzo.msg.center.domain.entity.TodoBusiness; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; import cn.axzo.msg.center.message.service.todo.card.TodoSyncCardService; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.pending.request.CardContent; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; +import cn.axzo.workflow.starter.api.WorkflowCoreService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -21,7 +26,9 @@ import javax.annotation.Nullable; @RequiredArgsConstructor class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorFactory { + private final TodoBusinessDao todoBusinessDao; private final TodoDao todoDao; + private final WorkflowCoreService workflowCoreService; @Override @Nullable public CardButtonInterceptor create(CardContent card) { @@ -36,7 +43,18 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF log.warn("todo not found. identityCode={}", identityCode); return null; } - return new WorkflowTodoCardButtonInterceptor(todo); + TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); + if (business == null) { + log.warn("todo business not found. identityCode={}", identityCode); + return null; + } + BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); + workflowRequest.setProcessInstanceId(todo.getBizCode()); + workflowRequest.setTaskId(todo.getSubBizCode()); + workflowRequest.setInitiatorPersonId(business.getPromoterPersonId()); + workflowRequest.setExecutorPersonId(todo.getExecutorPersonId()); + BpmnTaskButtonVo workflowButtons = workflowCoreService.findProcessSingleTaskButtons(workflowRequest); + return new WorkflowTodoCardButtonInterceptor(workflowButtons, todo); } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 32786ce7..18d4f9a1 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ 11.8 26.0.0 1.0.0-SNAPSHOT + 1.5.1-SNAPSHOT @@ -106,6 +107,11 @@ msg-center-api-v2 ${msg-center-api-v2-version} + + cn.axzo.workflow + workflow-engine-spring-boot-starter + ${workflow.version} + From 78dd3f71a3c4baf83d71f65d4fb258ab767d55c0 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 11:03:16 +0800 Subject: [PATCH 026/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/card/CardParser.java | 3 +- .../interceptor/CardButtonInterceptor.java | 44 +++++----- .../todo/card/TodoSyncCardService.java | 10 ++- .../biz/BizCardButtonInterceptorFactory.java | 48 +++++++++++ .../WorkflowTodoCardButtonInterceptor.java | 85 ++++++++++++++----- ...kflowTodoCardButtonInterceptorFactory.java | 23 +++-- .../cn/axzo/msg/center/service/ButtonV3.java | 3 +- .../service/enums/BizFinalStateEnum.java | 4 +- .../entity/MessageTemplateButtonV3.java | 5 ++ 9 files changed, 163 insertions(+), 62 deletions(-) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java 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 241cec4d..b7172f28 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 @@ -158,7 +158,8 @@ class CardParser { imButton.setTitle(isActionPerformed ? actionPerformed : button.getName()); imButton.setAction(button.getCategory().name()); imButton.setIsHighlight(button.getStyles().contains(ButtonStyleEnum.HIGH_LIGHT)); - imButton.setExecutorShow(button.getExecutorShow()); + imButton.setSenderShow(buttonInterceptor.isSenderShow(button).orElse(false)); + imButton.setExecutorShow(buttonInterceptor.isExecutorShow(button).orElse(button.getExecutorShow())); imButton.setActionPerformed(isActionPerformed); if (button.getUrlConfig().hasUrl()) imButton.setUrlConfig(button.getUrlConfig()); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java index d5bcc6d8..7847ace9 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/interceptor/CardButtonInterceptor.java @@ -8,36 +8,30 @@ import cn.axzo.msg.center.utils.desision.DecisionValue; */ public interface CardButtonInterceptor { - DecisionValue isPerformActionAvailable(ButtonV3 button); + default DecisionValue isPerformActionAvailable(ButtonV3 button) { + return DecisionValue.notSure(); + } - DecisionValue isActionPerformed(ButtonV3 button); + default DecisionValue isActionPerformed(ButtonV3 button) { + return DecisionValue.notSure(); + } - DecisionValue getActionPerformedName(ButtonV3 button); + default DecisionValue getActionPerformedName(ButtonV3 button) { + return DecisionValue.notSure(); + } - DecisionValue isVisibleOnCard(ButtonV3 button); + default DecisionValue isVisibleOnCard(ButtonV3 button) { + return DecisionValue.notSure(); + } - CardButtonInterceptor NOT_SURE = new CardButtonInterceptor() { + default DecisionValue isSenderShow(ButtonV3 button) { + return DecisionValue.notSure(); + } - @Override - public DecisionValue isPerformActionAvailable(ButtonV3 button) { - return DecisionValue.notSure(); - } + default DecisionValue isExecutorShow(ButtonV3 button) { + return DecisionValue.notSure(); + } - @Override - public DecisionValue isActionPerformed(ButtonV3 button) { - return DecisionValue.notSure(); - } - - @Override - public DecisionValue getActionPerformedName(ButtonV3 button) { - return DecisionValue.notSure(); - } - - @Override - public DecisionValue isVisibleOnCard(ButtonV3 button) { - return DecisionValue.notSure(); - } - - }; + CardButtonInterceptor NOT_SURE = new CardButtonInterceptor() {}; } \ 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 bb0594ea..b880340b 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 @@ -22,6 +22,7 @@ import cn.axzo.msg.center.service.enums.CardBizState; 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.CardContent; import cn.axzo.msg.center.service.pending.request.CardSendRequest; import cn.axzo.msg.center.service.pending.request.CardUpdateStateRequest; import cn.axzo.msg.center.service.pending.request.PresetButtonPressedRequest; @@ -227,7 +228,14 @@ public class TodoSyncCardService { return CodeDefinition.findByCode(BizCategoryEnum.class, category); } - public static Optional findTodoIdentityCode(JSONObject bizParam) { + public Optional findTodo(CardContent card) { + String identityCode = TodoSyncCardService.findTodoIdentityCode(card.getBizParam()).orElse(null); + if (identityCode == null) + return Optional.empty(); + return todoDao.findTodoByCode(identityCode); + } + + private static Optional findTodoIdentityCode(JSONObject bizParam) { if (bizParam == null) return Optional.empty(); String identityCode = new CardExtInfo(bizParam) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java new file mode 100644 index 00000000..f5d83793 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java @@ -0,0 +1,48 @@ +package cn.axzo.msg.center.message.service.todo.card.biz; + +import cn.axzo.msg.center.domain.entity.Todo; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; +import cn.axzo.msg.center.message.service.todo.card.TodoSyncCardService; +import cn.axzo.msg.center.service.ButtonV3; +import cn.axzo.msg.center.service.enums.BizCategoryEnum; +import cn.axzo.msg.center.service.enums.TodoType; +import cn.axzo.msg.center.service.pending.request.CardContent; +import cn.axzo.msg.center.utils.desision.DecisionValue; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Component; + +/** + * @author yanglin + */ +@Slf4j +@Component +@RequiredArgsConstructor +class BizCardButtonInterceptorFactory implements CardButtonInterceptorFactory { + + private final TodoSyncCardService todoSyncCardService; + + @Override + @Nullable + public CardButtonInterceptor create(CardContent card) { + BizCategoryEnum category = TodoSyncCardService.findTodoBizCategory(card.getBizParam()).orElse(null); + if (category != BizCategoryEnum.OTHER) + return null; + Todo todo = todoSyncCardService.findTodo(card).orElse(null); + if (todo == null) { + log.warn("todo not found. identityCode={}", card.getBizParam()); + return null; + } + return new CardButtonInterceptor() { + @Override + public DecisionValue isVisibleOnCard(ButtonV3 button) { + if (todo.getType() == TodoType.COPIED_TO_ME) + return DecisionValue.decide(false); + return DecisionValue.notSure(); + } + }; + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index af072ba9..f1a631be 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -6,59 +6,106 @@ import cn.axzo.msg.center.service.ButtonV3; import cn.axzo.msg.center.service.enums.BizFinalStateEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; +import cn.axzo.msg.center.service.enums.TodoType; import cn.axzo.msg.center.utils.desision.DecisionValue; +import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; +import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import java.util.List; import java.util.Optional; +import java.util.function.Supplier; /** * @author yanglin */ +@Slf4j @RequiredArgsConstructor class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { - private final BpmnTaskButtonVo workflowButtons; private final Todo todo; + private final Supplier workflowButtonsProvider; + private BpmnTaskButtonVo workflowButtons; @Override public DecisionValue isPerformActionAvailable(ButtonV3 button) { - BizFinalStateEnum state = findPerformActionAvailableState(button).orElse(null); - if (state == null) - return DecisionValue.notSure(); - return DecisionValue.decide(state.isEnableActionPerformed()); + BizFinalStateEnum state = findButtonClickedState(button).orElse(null); + return DecisionValue.decide(state != null && state.isButtonPerformActionAvailable()); } @Override public DecisionValue isActionPerformed(ButtonV3 button) { - BizFinalStateEnum state = findPerformActionAvailableState(button).orElse(null); + BizFinalStateEnum state = findButtonClickedState(button).orElse(null); if (state == null) - return DecisionValue.notSure(); - //todo - return null; + return DecisionValue.decide(false); + return DecisionValue.decide(todo.getState() == PendingMessageStateEnum.COMPLETED); } @Override public DecisionValue getActionPerformedName(ButtonV3 button) { - BizFinalStateEnum state = findPerformActionAvailableState(button).orElse(null); - if (state == null) - return DecisionValue.notSure(); - //todo - return DecisionValue.decide(state.getActionPerformedName()); + BizFinalStateEnum state = findButtonClickedState(button).orElse(null); + return state == null + ? DecisionValue.notSure() + : DecisionValue.decide(state.getActionPerformedName()); } @Override public DecisionValue isVisibleOnCard(ButtonV3 button) { - if (button.getSource() == RouterButtonSourceEnum.SYSTEM - && todo.getState() == PendingMessageStateEnum.PROCESSING) + if (todo.getState() == PendingMessageStateEnum.PROCESSING + || todo.getType() == TodoType.COPIED_TO_ME) return DecisionValue.decide(false); - return null; + if (button.getSource() == RouterButtonSourceEnum.CUSTOM) + return DecisionValue.notSure(); + BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); + return DecisionValue.decide(workflowButton != null); } - private Optional findPerformActionAvailableState(ButtonV3 button) { + @Override + public DecisionValue isSenderShow(ButtonV3 button) { + if (todo.getState() == PendingMessageStateEnum.PROCESSING || + todo.getType() == TodoType.COPIED_TO_ME) + return DecisionValue.decide(false); + if (button.getSource() == RouterButtonSourceEnum.CUSTOM) + return DecisionValue.decide(false); + BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); + if (workflowButton == null) + return DecisionValue.decide(false); + List scopes = workflowButton.getVisibleScopes(); + return DecisionValue.decide(scopes != null && scopes.contains(ButtonVisibleScopeEnum.INITIATOR)); + } + + @Override + public DecisionValue isExecutorShow(ButtonV3 button) { + if (todo.getState() == PendingMessageStateEnum.PROCESSING + || todo.getType() == TodoType.COPIED_TO_ME) + return DecisionValue.decide(false); + if (button.getSource() == RouterButtonSourceEnum.CUSTOM) + return DecisionValue.notSure(); + BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); + if (workflowButton == null) + return DecisionValue.notSure(); + List scopes = workflowButton.getVisibleScopes(); + return DecisionValue.decide(scopes != null && scopes.contains(ButtonVisibleScopeEnum.EXECUTOR)); + } + + private Optional findButtonClickedState(ButtonV3 button) { if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return Optional.empty(); - return BizFinalStateEnum.findByButtonCode(button.getCode()); + return BizFinalStateEnum.findButtonClickedState(button.getCode()); + } + + private Optional findWorkflowButton(ButtonV3 button) { + fetchWorkflowButtons(); + return workflowButtons.getButtons().stream() + .filter(workflowButton -> workflowButton.getBtnKey().equals(button.getCode())) + .findFirst(); + } + + private void fetchWorkflowButtons() { + if (workflowButtons == null) + workflowButtons = workflowButtonsProvider.get(); } } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 00b80c30..0c9e6376 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -1,7 +1,7 @@ package cn.axzo.msg.center.message.service.todo.card.workflow; +import cn.axzo.msg.center.common.utils.BizAssertions; import cn.axzo.msg.center.dal.TodoBusinessDao; -import cn.axzo.msg.center.dal.TodoDao; import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.domain.entity.TodoBusiness; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; @@ -27,34 +27,31 @@ import javax.annotation.Nullable; class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorFactory { private final TodoBusinessDao todoBusinessDao; - private final TodoDao todoDao; + private final TodoSyncCardService todoSyncCardService; private final WorkflowCoreService workflowCoreService; @Override @Nullable public CardButtonInterceptor create(CardContent card) { - String identityCode = TodoSyncCardService.findTodoIdentityCode(card.getBizParam()).orElse(null); - if (identityCode == null) - return null; BizCategoryEnum category = TodoSyncCardService.findTodoBizCategory(card.getBizParam()).orElse(null); if (category != BizCategoryEnum.FLOW) return null; - Todo todo = todoDao.findTodoByCode(identityCode).orElse(null); + Todo todo = todoSyncCardService.findTodo(card).orElse(null); if (todo == null) { - log.warn("todo not found. identityCode={}", identityCode); + log.warn("todo not found. identityCode={}", card.getBizParam()); return null; } + return new WorkflowTodoCardButtonInterceptor(todo, () -> fetchWorkflowButtons(todo)); + } + + private BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); - if (business == null) { - log.warn("todo business not found. identityCode={}", identityCode); - return null; - } + BizAssertions.assertNotNull(business, "todo business not found. todoIdentityCode={}", todo.getIdentityCode()); BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); workflowRequest.setProcessInstanceId(todo.getBizCode()); workflowRequest.setTaskId(todo.getSubBizCode()); workflowRequest.setInitiatorPersonId(business.getPromoterPersonId()); workflowRequest.setExecutorPersonId(todo.getExecutorPersonId()); - BpmnTaskButtonVo workflowButtons = workflowCoreService.findProcessSingleTaskButtons(workflowRequest); - return new WorkflowTodoCardButtonInterceptor(workflowButtons, todo); + return workflowCoreService.findProcessSingleTaskButtons(workflowRequest); } } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java index 97af3faa..4593e67c 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/ButtonV3.java @@ -4,13 +4,14 @@ import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.PresetButtonType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; +import cn.axzo.msg.center.service.pending.response.MessageButton; import java.util.List; /** * @author yanglin */ -public interface ButtonV3 { +public interface ButtonV3 extends MessageButton { String getName(); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java index dee9a7f3..5b7ad802 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/enums/BizFinalStateEnum.java @@ -47,7 +47,7 @@ public enum BizFinalStateEnum implements CodeDefinition { return name(); } - public static Optional findByButtonCode(String buttonCode) { + public static Optional findButtonClickedState(String buttonCode) { for (BizFinalStateEnum value : values()) { if (value.buttonCode.equals(buttonCode)) return Optional.of(value); @@ -55,7 +55,7 @@ public enum BizFinalStateEnum implements CodeDefinition { return Optional.empty(); } - public boolean isEnableActionPerformed() { + public boolean isButtonPerformActionAvailable() { return StringUtils.isNotBlank(actionPerformedName); } } \ No newline at end of file diff --git a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java index de98dc1f..f5a892fb 100644 --- a/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java +++ b/msg-center-domain/src/main/java/cn/axzo/msg/center/domain/entity/MessageTemplateButtonV3.java @@ -112,6 +112,11 @@ public class MessageTemplateButtonV3 extends BaseEntityWithOperator Date: Tue, 14 Jan 2025 11:03:46 +0800 Subject: [PATCH 027/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/workflow/WorkflowTodoCardButtonInterceptor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index f1a631be..d27e90e3 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -31,13 +31,13 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { @Override public DecisionValue isPerformActionAvailable(ButtonV3 button) { - BizFinalStateEnum state = findButtonClickedState(button).orElse(null); + BizFinalStateEnum state = findButtonClickState(button).orElse(null); return DecisionValue.decide(state != null && state.isButtonPerformActionAvailable()); } @Override public DecisionValue isActionPerformed(ButtonV3 button) { - BizFinalStateEnum state = findButtonClickedState(button).orElse(null); + BizFinalStateEnum state = findButtonClickState(button).orElse(null); if (state == null) return DecisionValue.decide(false); return DecisionValue.decide(todo.getState() == PendingMessageStateEnum.COMPLETED); @@ -45,7 +45,7 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { @Override public DecisionValue getActionPerformedName(ButtonV3 button) { - BizFinalStateEnum state = findButtonClickedState(button).orElse(null); + BizFinalStateEnum state = findButtonClickState(button).orElse(null); return state == null ? DecisionValue.notSure() : DecisionValue.decide(state.getActionPerformedName()); @@ -90,7 +90,7 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { return DecisionValue.decide(scopes != null && scopes.contains(ButtonVisibleScopeEnum.EXECUTOR)); } - private Optional findButtonClickedState(ButtonV3 button) { + private Optional findButtonClickState(ButtonV3 button) { if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return Optional.empty(); return BizFinalStateEnum.findButtonClickedState(button.getCode()); From ab6845816c5b4396b3b907efd50be4b6bfbc43e8 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 11:30:11 +0800 Subject: [PATCH 028/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/BizCardButtonInterceptorFactory.java | 12 +---- .../card/biz/TodoCardButtonInterceptor.java | 26 ++++++++++ .../WorkflowTodoCardButtonInterceptor.java | 49 +++++++++++++------ .../center/utils/desision/DecisionValue.java | 10 ++-- 4 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java index f5d83793..bb1f9c27 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java @@ -4,11 +4,8 @@ import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; import cn.axzo.msg.center.message.service.todo.card.TodoSyncCardService; -import cn.axzo.msg.center.service.ButtonV3; import cn.axzo.msg.center.service.enums.BizCategoryEnum; -import cn.axzo.msg.center.service.enums.TodoType; import cn.axzo.msg.center.service.pending.request.CardContent; -import cn.axzo.msg.center.utils.desision.DecisionValue; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.Nullable; @@ -35,14 +32,7 @@ class BizCardButtonInterceptorFactory implements CardButtonInterceptorFactory { log.warn("todo not found. identityCode={}", card.getBizParam()); return null; } - return new CardButtonInterceptor() { - @Override - public DecisionValue isVisibleOnCard(ButtonV3 button) { - if (todo.getType() == TodoType.COPIED_TO_ME) - return DecisionValue.decide(false); - return DecisionValue.notSure(); - } - }; + return new TodoCardButtonInterceptor(todo); } } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java new file mode 100644 index 00000000..a6116b95 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java @@ -0,0 +1,26 @@ +package cn.axzo.msg.center.message.service.todo.card.biz; + +import cn.axzo.msg.center.domain.entity.Todo; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; +import cn.axzo.msg.center.service.ButtonV3; +import cn.axzo.msg.center.service.enums.TodoType; +import cn.axzo.msg.center.utils.desision.DecisionValue; +import lombok.RequiredArgsConstructor; + +/** + * @author yanglin + */ +@RequiredArgsConstructor +public class TodoCardButtonInterceptor implements CardButtonInterceptor { + + protected final Todo todo; + + @Override + public DecisionValue isVisibleOnCard(ButtonV3 button) { + // 抄送不显示任何按钮 + if (todo.getType() == TodoType.COPIED_TO_ME) + return DecisionValue.decide(false); + return DecisionValue.notSure(); + } + +} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index d27e90e3..03f6f6a7 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -1,34 +1,40 @@ package cn.axzo.msg.center.message.service.todo.card.workflow; import cn.axzo.msg.center.domain.entity.Todo; -import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; +import cn.axzo.msg.center.message.service.todo.card.biz.TodoCardButtonInterceptor; import cn.axzo.msg.center.service.ButtonV3; import cn.axzo.msg.center.service.enums.BizFinalStateEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; -import cn.axzo.msg.center.service.enums.TodoType; import cn.axzo.msg.center.utils.desision.DecisionValue; import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum; +import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.function.Supplier; +import static java.util.stream.Collectors.toSet; + /** * @author yanglin */ @Slf4j -@RequiredArgsConstructor -class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { +class WorkflowTodoCardButtonInterceptor extends TodoCardButtonInterceptor { - private final Todo todo; private final Supplier workflowButtonsProvider; private BpmnTaskButtonVo workflowButtons; + WorkflowTodoCardButtonInterceptor(Todo todo, Supplier workflowButtonsProvider) { + super(todo); + this.workflowButtonsProvider = workflowButtonsProvider; + } + @Override public DecisionValue isPerformActionAvailable(ButtonV3 button) { BizFinalStateEnum state = findButtonClickState(button).orElse(null); @@ -53,20 +59,26 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { @Override public DecisionValue isVisibleOnCard(ButtonV3 button) { - if (todo.getState() == PendingMessageStateEnum.PROCESSING - || todo.getType() == TodoType.COPIED_TO_ME) + DecisionValue decision = super.isVisibleOnCard(button); + if (decision.isDecided()) + return decision; + // 进行中隐藏所有按钮 + if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return DecisionValue.notSure(); + if (getWorkflowHideButtonKeys().contains(button.getCode())) + return DecisionValue.decide(false); BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); - return DecisionValue.decide(workflowButton != null); + // 如果找不到流程按钮, 说明不需要显示按钮 + if (workflowButton == null) + return DecisionValue.decide(false); + // 是否显示由待办模版控制 + return DecisionValue.notSure(); } @Override public DecisionValue isSenderShow(ButtonV3 button) { - if (todo.getState() == PendingMessageStateEnum.PROCESSING || - todo.getType() == TodoType.COPIED_TO_ME) - return DecisionValue.decide(false); if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return DecisionValue.decide(false); BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); @@ -78,9 +90,6 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { @Override public DecisionValue isExecutorShow(ButtonV3 button) { - if (todo.getState() == PendingMessageStateEnum.PROCESSING - || todo.getType() == TodoType.COPIED_TO_ME) - return DecisionValue.decide(false); if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return DecisionValue.notSure(); BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); @@ -103,6 +112,16 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { .findFirst(); } + private Set getWorkflowHideButtonKeys() { + fetchWorkflowButtons(); + List workflowHiddenButtons = workflowButtons.getCustomHiddenButtons(); + if (workflowHiddenButtons == null) + workflowHiddenButtons = Collections.emptyList(); + return workflowHiddenButtons.stream() + .map(BpmnButtonMetaInfo::getBtnKey) + .collect(toSet()); + } + private void fetchWorkflowButtons() { if (workflowButtons == null) workflowButtons = workflowButtonsProvider.get(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java index 8fcab4a9..29011a4e 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java @@ -18,7 +18,7 @@ public class DecisionValue { @SuppressWarnings("unchecked") public static DecisionValue notSure() { - return (DecisionValue)NOT_SURE; + return (DecisionValue) NOT_SURE; } public static DecisionValue decide(T value) { @@ -26,11 +26,15 @@ public class DecisionValue { } public T orElse(Supplier supplier) { - return decision == Decision.DECIDED ? value : supplier.get(); + return isDecided() ? value : supplier.get(); } public T orElse(T value) { - return decision == Decision.DECIDED ? this.value : value; + return isDecided() ? this.value : value; + } + + public boolean isDecided() { + return decision == Decision.DECIDED; } } \ No newline at end of file From ea0177677c9565f317082b3427ead41e40b78d2e Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 11:39:26 +0800 Subject: [PATCH 029/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/BizCardButtonInterceptorFactory.java | 38 ------------------- .../card/biz/TodoCardButtonInterceptor.java | 26 ------------- .../WorkflowTodoCardButtonInterceptor.java | 15 +++----- 3 files changed, 5 insertions(+), 74 deletions(-) delete mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java delete mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java deleted file mode 100644 index bb1f9c27..00000000 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/BizCardButtonInterceptorFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.axzo.msg.center.message.service.todo.card.biz; - -import cn.axzo.msg.center.domain.entity.Todo; -import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; -import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; -import cn.axzo.msg.center.message.service.todo.card.TodoSyncCardService; -import cn.axzo.msg.center.service.enums.BizCategoryEnum; -import cn.axzo.msg.center.service.pending.request.CardContent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.Nullable; -import org.springframework.stereotype.Component; - -/** - * @author yanglin - */ -@Slf4j -@Component -@RequiredArgsConstructor -class BizCardButtonInterceptorFactory implements CardButtonInterceptorFactory { - - private final TodoSyncCardService todoSyncCardService; - - @Override - @Nullable - public CardButtonInterceptor create(CardContent card) { - BizCategoryEnum category = TodoSyncCardService.findTodoBizCategory(card.getBizParam()).orElse(null); - if (category != BizCategoryEnum.OTHER) - return null; - Todo todo = todoSyncCardService.findTodo(card).orElse(null); - if (todo == null) { - log.warn("todo not found. identityCode={}", card.getBizParam()); - return null; - } - return new TodoCardButtonInterceptor(todo); - } - -} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java deleted file mode 100644 index a6116b95..00000000 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/biz/TodoCardButtonInterceptor.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.axzo.msg.center.message.service.todo.card.biz; - -import cn.axzo.msg.center.domain.entity.Todo; -import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; -import cn.axzo.msg.center.service.ButtonV3; -import cn.axzo.msg.center.service.enums.TodoType; -import cn.axzo.msg.center.utils.desision.DecisionValue; -import lombok.RequiredArgsConstructor; - -/** - * @author yanglin - */ -@RequiredArgsConstructor -public class TodoCardButtonInterceptor implements CardButtonInterceptor { - - protected final Todo todo; - - @Override - public DecisionValue isVisibleOnCard(ButtonV3 button) { - // 抄送不显示任何按钮 - if (todo.getType() == TodoType.COPIED_TO_ME) - return DecisionValue.decide(false); - return DecisionValue.notSure(); - } - -} \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 03f6f6a7..30e8cc77 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -1,7 +1,7 @@ package cn.axzo.msg.center.message.service.todo.card.workflow; import cn.axzo.msg.center.domain.entity.Todo; -import cn.axzo.msg.center.message.service.todo.card.biz.TodoCardButtonInterceptor; +import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; import cn.axzo.msg.center.service.ButtonV3; import cn.axzo.msg.center.service.enums.BizFinalStateEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; @@ -11,6 +11,7 @@ import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.Collections; @@ -25,16 +26,13 @@ import static java.util.stream.Collectors.toSet; * @author yanglin */ @Slf4j -class WorkflowTodoCardButtonInterceptor extends TodoCardButtonInterceptor { +@RequiredArgsConstructor +class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { + private final Todo todo; private final Supplier workflowButtonsProvider; private BpmnTaskButtonVo workflowButtons; - WorkflowTodoCardButtonInterceptor(Todo todo, Supplier workflowButtonsProvider) { - super(todo); - this.workflowButtonsProvider = workflowButtonsProvider; - } - @Override public DecisionValue isPerformActionAvailable(ButtonV3 button) { BizFinalStateEnum state = findButtonClickState(button).orElse(null); @@ -59,9 +57,6 @@ class WorkflowTodoCardButtonInterceptor extends TodoCardButtonInterceptor { @Override public DecisionValue isVisibleOnCard(ButtonV3 button) { - DecisionValue decision = super.isVisibleOnCard(button); - if (decision.isDecided()) - return decision; // 进行中隐藏所有按钮 if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); From 903a2401b271213f2a530e3afb33ff00e34d0ae9 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 11:43:51 +0800 Subject: [PATCH 030/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/workflow/WorkflowTodoCardButtonInterceptor.java | 5 ++--- .../workflow/WorkflowTodoCardButtonInterceptorFactory.java | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 30e8cc77..45392c41 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -18,7 +18,6 @@ import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.function.Supplier; import static java.util.stream.Collectors.toSet; @@ -29,8 +28,8 @@ import static java.util.stream.Collectors.toSet; @RequiredArgsConstructor class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { + private final WorkflowTodoCardButtonInterceptorFactory factory; private final Todo todo; - private final Supplier workflowButtonsProvider; private BpmnTaskButtonVo workflowButtons; @Override @@ -119,7 +118,7 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { private void fetchWorkflowButtons() { if (workflowButtons == null) - workflowButtons = workflowButtonsProvider.get(); + workflowButtons = factory.fetchWorkflowButtons(todo); } } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 0c9e6376..9712550a 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -40,10 +40,10 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF log.warn("todo not found. identityCode={}", card.getBizParam()); return null; } - return new WorkflowTodoCardButtonInterceptor(todo, () -> fetchWorkflowButtons(todo)); + return new WorkflowTodoCardButtonInterceptor(this, todo); } - private BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { + BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); BizAssertions.assertNotNull(business, "todo business not found. todoIdentityCode={}", todo.getIdentityCode()); BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); From 42e8be3fcf0ba4040e971bb436b45843f6238237 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 14:03:24 +0800 Subject: [PATCH 031/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/card/TodoSyncCardService.java | 10 +--------- .../WorkflowTodoCardButtonInterceptorFactory.java | 10 +++++++--- 2 files changed, 8 insertions(+), 12 deletions(-) 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 b880340b..bb0594ea 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 @@ -22,7 +22,6 @@ import cn.axzo.msg.center.service.enums.CardBizState; 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.CardContent; import cn.axzo.msg.center.service.pending.request.CardSendRequest; import cn.axzo.msg.center.service.pending.request.CardUpdateStateRequest; import cn.axzo.msg.center.service.pending.request.PresetButtonPressedRequest; @@ -228,14 +227,7 @@ public class TodoSyncCardService { return CodeDefinition.findByCode(BizCategoryEnum.class, category); } - public Optional findTodo(CardContent card) { - String identityCode = TodoSyncCardService.findTodoIdentityCode(card.getBizParam()).orElse(null); - if (identityCode == null) - return Optional.empty(); - return todoDao.findTodoByCode(identityCode); - } - - private static Optional findTodoIdentityCode(JSONObject bizParam) { + public static Optional findTodoIdentityCode(JSONObject bizParam) { if (bizParam == null) return Optional.empty(); String identityCode = new CardExtInfo(bizParam) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 9712550a..e655813c 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -2,6 +2,7 @@ package cn.axzo.msg.center.message.service.todo.card.workflow; import cn.axzo.msg.center.common.utils.BizAssertions; import cn.axzo.msg.center.dal.TodoBusinessDao; +import cn.axzo.msg.center.dal.TodoDao; import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.domain.entity.TodoBusiness; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; @@ -27,7 +28,7 @@ import javax.annotation.Nullable; class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorFactory { private final TodoBusinessDao todoBusinessDao; - private final TodoSyncCardService todoSyncCardService; + private final TodoDao todoDao; private final WorkflowCoreService workflowCoreService; @Override @Nullable @@ -35,7 +36,10 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF BizCategoryEnum category = TodoSyncCardService.findTodoBizCategory(card.getBizParam()).orElse(null); if (category != BizCategoryEnum.FLOW) return null; - Todo todo = todoSyncCardService.findTodo(card).orElse(null); + String identityCode = TodoSyncCardService.findTodoIdentityCode(card.getBizParam()).orElse(null); + if (identityCode == null) + return null; + Todo todo = todoDao.findTodoByCode(identityCode).orElse(null); if (todo == null) { log.warn("todo not found. identityCode={}", card.getBizParam()); return null; @@ -43,7 +47,7 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF return new WorkflowTodoCardButtonInterceptor(this, todo); } - BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { + BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); BizAssertions.assertNotNull(business, "todo business not found. todoIdentityCode={}", todo.getIdentityCode()); BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); From 9c1a9c1c0b10d4662f8cdc95235d269c13078677 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 14:18:03 +0800 Subject: [PATCH 032/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowTodoCardButtonInterceptor.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 45392c41..2fd1b698 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -11,10 +11,13 @@ import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope; +import com.alibaba.fastjson.JSON; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.Set; @@ -101,7 +104,10 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { private Optional findWorkflowButton(ButtonV3 button) { fetchWorkflowButtons(); - return workflowButtons.getButtons().stream() + List workflowButtons = this.workflowButtons.getButtons(); + if (workflowButtons == null) + workflowButtons = Collections.emptyList(); + return workflowButtons.stream() .filter(workflowButton -> workflowButton.getBtnKey().equals(button.getCode())) .findFirst(); } @@ -116,9 +122,31 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { .collect(toSet()); } - private void fetchWorkflowButtons() { - if (workflowButtons == null) - workflowButtons = factory.fetchWorkflowButtons(todo); + private Set getWorkflowButtons() { + List workflowHiddenButtons = workflowButtons.getButtons(); + if (workflowHiddenButtons == null) + workflowHiddenButtons = Collections.emptyList(); + return workflowHiddenButtons.stream() + .map(btn -> new WorkflowButtonInfo(btn.getBtnKey(), btn.getVisibleScopes())) + .collect(toSet()); } + private void fetchWorkflowButtons() { + if (workflowButtons == null) { + workflowButtons = factory.fetchWorkflowButtons(todo); + + HashMap workflowButtonInfo = new HashMap<>(); + workflowButtonInfo.put("workflowHideButtonKeys", getWorkflowHideButtonKeys()); + workflowButtonInfo.put("workflowButtons", getWorkflowButtons()); + log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowButtonInfo: {}", + todo.getIdentityCode(), JSON.toJSONString(workflowButtonInfo)); + } + } + + @Getter + @RequiredArgsConstructor + public static class WorkflowButtonInfo { + private final String btnKey; + private final List scopes; + } } \ No newline at end of file From bb1e67513cc446cbadbb0524a7cced7c57d80574 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 14:25:00 +0800 Subject: [PATCH 033/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/WorkflowTodoCardButtonInterceptor.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 2fd1b698..38d2adef 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -114,6 +114,10 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { private Set getWorkflowHideButtonKeys() { fetchWorkflowButtons(); + return getWorkflowHideButtonKeys(workflowButtons); + } + + private Set getWorkflowHideButtonKeys(BpmnTaskButtonVo workflowButtons) { List workflowHiddenButtons = workflowButtons.getCustomHiddenButtons(); if (workflowHiddenButtons == null) workflowHiddenButtons = Collections.emptyList(); @@ -123,6 +127,11 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { } private Set getWorkflowButtons() { + fetchWorkflowButtons(); + return getWorkflowButtons(workflowButtons); + } + + private Set getWorkflowButtons(BpmnTaskButtonVo workflowButtons) { List workflowHiddenButtons = workflowButtons.getButtons(); if (workflowHiddenButtons == null) workflowHiddenButtons = Collections.emptyList(); @@ -136,8 +145,8 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { workflowButtons = factory.fetchWorkflowButtons(todo); HashMap workflowButtonInfo = new HashMap<>(); - workflowButtonInfo.put("workflowHideButtonKeys", getWorkflowHideButtonKeys()); - workflowButtonInfo.put("workflowButtons", getWorkflowButtons()); + workflowButtonInfo.put("workflowHideButtonKeys", getWorkflowHideButtonKeys(workflowButtons)); + workflowButtonInfo.put("workflowButtons", getWorkflowButtons(workflowButtons)); log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowButtonInfo: {}", todo.getIdentityCode(), JSON.toJSONString(workflowButtonInfo)); } From f70b7b20d2a063f5b5e7ccff9de24b5480feabb9 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 14:31:04 +0800 Subject: [PATCH 034/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowTodoCardButtonInterceptor.java | 28 ++----------------- ...kflowTodoCardButtonInterceptorFactory.java | 12 +++++++- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 38d2adef..339513da 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -11,13 +11,11 @@ import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope; -import com.alibaba.fastjson.JSON; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Optional; import java.util.Set; @@ -31,9 +29,8 @@ import static java.util.stream.Collectors.toSet; @RequiredArgsConstructor class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { - private final WorkflowTodoCardButtonInterceptorFactory factory; private final Todo todo; - private BpmnTaskButtonVo workflowButtons; + private final BpmnTaskButtonVo workflowButtons; @Override public DecisionValue isPerformActionAvailable(ButtonV3 button) { @@ -103,7 +100,6 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { } private Optional findWorkflowButton(ButtonV3 button) { - fetchWorkflowButtons(); List workflowButtons = this.workflowButtons.getButtons(); if (workflowButtons == null) workflowButtons = Collections.emptyList(); @@ -113,11 +109,10 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { } private Set getWorkflowHideButtonKeys() { - fetchWorkflowButtons(); return getWorkflowHideButtonKeys(workflowButtons); } - private Set getWorkflowHideButtonKeys(BpmnTaskButtonVo workflowButtons) { + static Set getWorkflowHideButtonKeys(BpmnTaskButtonVo workflowButtons) { List workflowHiddenButtons = workflowButtons.getCustomHiddenButtons(); if (workflowHiddenButtons == null) workflowHiddenButtons = Collections.emptyList(); @@ -126,12 +121,7 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { .collect(toSet()); } - private Set getWorkflowButtons() { - fetchWorkflowButtons(); - return getWorkflowButtons(workflowButtons); - } - - private Set getWorkflowButtons(BpmnTaskButtonVo workflowButtons) { + static Set getWorkflowButtons(BpmnTaskButtonVo workflowButtons) { List workflowHiddenButtons = workflowButtons.getButtons(); if (workflowHiddenButtons == null) workflowHiddenButtons = Collections.emptyList(); @@ -140,18 +130,6 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { .collect(toSet()); } - private void fetchWorkflowButtons() { - if (workflowButtons == null) { - workflowButtons = factory.fetchWorkflowButtons(todo); - - HashMap workflowButtonInfo = new HashMap<>(); - workflowButtonInfo.put("workflowHideButtonKeys", getWorkflowHideButtonKeys(workflowButtons)); - workflowButtonInfo.put("workflowButtons", getWorkflowButtons(workflowButtons)); - log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowButtonInfo: {}", - todo.getIdentityCode(), JSON.toJSONString(workflowButtonInfo)); - } - } - @Getter @RequiredArgsConstructor public static class WorkflowButtonInfo { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index e655813c..e5a2270d 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -13,11 +13,13 @@ import cn.axzo.msg.center.service.pending.request.CardContent; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import cn.axzo.workflow.starter.api.WorkflowCoreService; +import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Nullable; +import java.util.HashMap; /** * @author yanglin @@ -44,7 +46,15 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF log.warn("todo not found. identityCode={}", card.getBizParam()); return null; } - return new WorkflowTodoCardButtonInterceptor(this, todo); + BpmnTaskButtonVo workflowButtons = fetchWorkflowButtons(todo); + HashMap workflowButtonInfo = new HashMap<>(); + workflowButtonInfo.put("workflowHideButtonKeys", WorkflowTodoCardButtonInterceptor + .getWorkflowHideButtonKeys(workflowButtons)); + workflowButtonInfo.put("workflowButtons", WorkflowTodoCardButtonInterceptor + .getWorkflowButtons(workflowButtons)); + log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowButtonInfo: {}", + todo.getIdentityCode(), JSON.toJSONString(workflowButtonInfo)); + return new WorkflowTodoCardButtonInterceptor(todo, workflowButtons); } BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { From 34c36456332c29b09a01926ad436cdeb11eb3949 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 14:38:12 +0800 Subject: [PATCH 035/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/workflow/WorkflowTodoCardButtonInterceptorFactory.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index e5a2270d..90d85431 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -47,6 +47,8 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF return null; } BpmnTaskButtonVo workflowButtons = fetchWorkflowButtons(todo); + BizAssertions.assertNotNull(workflowButtons, + "workflow buttons not found. todoIdentityCode={}", todo.getIdentityCode()); HashMap workflowButtonInfo = new HashMap<>(); workflowButtonInfo.put("workflowHideButtonKeys", WorkflowTodoCardButtonInterceptor .getWorkflowHideButtonKeys(workflowButtons)); From 8399113a5f8513702881dc7ce39e5a567492ee99 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 17:10:58 +0800 Subject: [PATCH 036/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/card/TodoSyncCardService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 bb0594ea..5ccd3660 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 @@ -105,7 +105,11 @@ public class TodoSyncCardService { request.setBizCode(todo.getBizCode()); request.setIdempotentCode(todo.getIdentityCode()); request.setSubBizCode(todo.getSubBizCode()); - request.setSender(PeerPerson.create(business.getPromoterPersonId(), business.getOuId(), business.getOrgId())); + Long promoterPersonId = business.getPromoterPersonId(); + if (promoterPersonId == null) promoterPersonId = 0L; + Long ouId = business.getOuId(); + if (ouId == null) ouId = 0L; + request.setSender(PeerPerson.create(promoterPersonId, ouId, business.getOrgId())); request.setReceivers(Sets.newHashSet(PeerPerson.create( todo.getExecutorPersonId(), todo.getOuId(), todo.getOrgId()))); JSONObject bizParam = todo.bizParam(); From 4d7cb395daeae6ec5c4f9f41bce90f474361ea7b Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 17:34:06 +0800 Subject: [PATCH 037/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowTodoCardButtonInterceptor.java | 28 +++++++++++++------ ...kflowTodoCardButtonInterceptorFactory.java | 10 +++---- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 339513da..694c61fd 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -7,6 +7,7 @@ import cn.axzo.msg.center.service.enums.BizFinalStateEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.utils.desision.DecisionValue; +import cn.axzo.workflow.common.enums.BpmnProcessTaskResultEnum; import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; @@ -30,7 +31,7 @@ import static java.util.stream.Collectors.toSet; class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { private final Todo todo; - private final BpmnTaskButtonVo workflowButtons; + private final BpmnTaskButtonVo taskInfo; @Override public DecisionValue isPerformActionAvailable(ButtonV3 button) { @@ -43,7 +44,18 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { BizFinalStateEnum state = findButtonClickState(button).orElse(null); if (state == null) return DecisionValue.decide(false); - return DecisionValue.decide(todo.getState() == PendingMessageStateEnum.COMPLETED); + if (todo.getState() != PendingMessageStateEnum.COMPLETED) + return DecisionValue.decide(false); + if (taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.APPROVED + && state == BizFinalStateEnum.PASSED) + return DecisionValue.decide(true); + if (taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.REJECTED + && state == BizFinalStateEnum.REJECTED) + return DecisionValue.decide(true); + if (taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.DELETED + && state == BizFinalStateEnum.RETRACT) + return DecisionValue.decide(true); + return DecisionValue.decide(false); } @Override @@ -100,7 +112,7 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { } private Optional findWorkflowButton(ButtonV3 button) { - List workflowButtons = this.workflowButtons.getButtons(); + List workflowButtons = this.taskInfo.getButtons(); if (workflowButtons == null) workflowButtons = Collections.emptyList(); return workflowButtons.stream() @@ -109,11 +121,11 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { } private Set getWorkflowHideButtonKeys() { - return getWorkflowHideButtonKeys(workflowButtons); + return getWorkflowHideButtonKeys(taskInfo); } - static Set getWorkflowHideButtonKeys(BpmnTaskButtonVo workflowButtons) { - List workflowHiddenButtons = workflowButtons.getCustomHiddenButtons(); + static Set getWorkflowHideButtonKeys(BpmnTaskButtonVo taskInfo) { + List workflowHiddenButtons = taskInfo.getCustomHiddenButtons(); if (workflowHiddenButtons == null) workflowHiddenButtons = Collections.emptyList(); return workflowHiddenButtons.stream() @@ -121,8 +133,8 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { .collect(toSet()); } - static Set getWorkflowButtons(BpmnTaskButtonVo workflowButtons) { - List workflowHiddenButtons = workflowButtons.getButtons(); + static Set getTaskInfo(BpmnTaskButtonVo taskInfo) { + List workflowHiddenButtons = taskInfo.getButtons(); if (workflowHiddenButtons == null) workflowHiddenButtons = Collections.emptyList(); return workflowHiddenButtons.stream() diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 90d85431..cb185497 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -46,17 +46,17 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF log.warn("todo not found. identityCode={}", card.getBizParam()); return null; } - BpmnTaskButtonVo workflowButtons = fetchWorkflowButtons(todo); - BizAssertions.assertNotNull(workflowButtons, + BpmnTaskButtonVo taskInfo = fetchWorkflowButtons(todo); + BizAssertions.assertNotNull(taskInfo, "workflow buttons not found. todoIdentityCode={}", todo.getIdentityCode()); HashMap workflowButtonInfo = new HashMap<>(); workflowButtonInfo.put("workflowHideButtonKeys", WorkflowTodoCardButtonInterceptor - .getWorkflowHideButtonKeys(workflowButtons)); + .getWorkflowHideButtonKeys(taskInfo)); workflowButtonInfo.put("workflowButtons", WorkflowTodoCardButtonInterceptor - .getWorkflowButtons(workflowButtons)); + .getTaskInfo(taskInfo)); log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowButtonInfo: {}", todo.getIdentityCode(), JSON.toJSONString(workflowButtonInfo)); - return new WorkflowTodoCardButtonInterceptor(todo, workflowButtons); + return new WorkflowTodoCardButtonInterceptor(todo, taskInfo); } BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { From 9cd7d26c4db7605b06e4d75ae64e7740524b6cd8 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 17:36:14 +0800 Subject: [PATCH 038/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/card/workflow/WorkflowTodoCardButtonInterceptor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 694c61fd..a9246894 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -71,10 +71,10 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { // 进行中隐藏所有按钮 if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); - if (button.getSource() == RouterButtonSourceEnum.CUSTOM) - return DecisionValue.notSure(); if (getWorkflowHideButtonKeys().contains(button.getCode())) return DecisionValue.decide(false); + if (button.getSource() == RouterButtonSourceEnum.CUSTOM) + return DecisionValue.notSure(); BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); // 如果找不到流程按钮, 说明不需要显示按钮 if (workflowButton == null) From 5ab9333818a5b3028f8ecaac66ef29030a68ba35 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 18:50:17 +0800 Subject: [PATCH 039/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowTodoCardButtonInterceptor.java | 29 ++++++++++++------- ...kflowTodoCardButtonInterceptorFactory.java | 6 ++++ .../center/utils/desision/DecisionValue.java | 3 +- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index a9246894..14292b00 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -41,19 +41,18 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { @Override public DecisionValue isActionPerformed(ButtonV3 button) { - BizFinalStateEnum state = findButtonClickState(button).orElse(null); - if (state == null) + BizFinalStateEnum executorState = findButtonClickState(button).orElse(null); + if (executorState == null) return DecisionValue.decide(false); - if (todo.getState() != PendingMessageStateEnum.COMPLETED) - return DecisionValue.decide(false); - if (taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.APPROVED - && state == BizFinalStateEnum.PASSED) + if (executorState == BizFinalStateEnum.PASSED + && taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.APPROVED) return DecisionValue.decide(true); - if (taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.REJECTED - && state == BizFinalStateEnum.REJECTED) + if (executorState == BizFinalStateEnum.REJECTED + && taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.REJECTED) return DecisionValue.decide(true); - if (taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.DELETED - && state == BizFinalStateEnum.RETRACT) + //todo + if (executorState == BizFinalStateEnum.RETRACT + && taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.DELETED) return DecisionValue.decide(true); return DecisionValue.decide(false); } @@ -71,6 +70,10 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { // 进行中隐藏所有按钮 if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); + DecisionValue actionPerformed = isActionPerformed(button); + // 显示失效按钮 + if (actionPerformed.isDecided() && actionPerformed.getValue()) + return DecisionValue.decide(true); if (getWorkflowHideButtonKeys().contains(button.getCode())) return DecisionValue.decide(false); if (button.getSource() == RouterButtonSourceEnum.CUSTOM) @@ -87,6 +90,12 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { public DecisionValue isSenderShow(ButtonV3 button) { if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return DecisionValue.decide(false); + DecisionValue actionPerformed = isActionPerformed(button); + boolean isRevokeButtonPerformed = actionPerformed.isDecided() + && actionPerformed.getValue() + && BizFinalStateEnum.RETRACT.getCode().equals(button.getCode()); + if (isRevokeButtonPerformed) + return DecisionValue.decide(true); BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); if (workflowButton == null) return DecisionValue.decide(false); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index cb185497..111ed21b 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -8,6 +8,8 @@ import cn.axzo.msg.center.domain.entity.TodoBusiness; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptorFactory; import cn.axzo.msg.center.message.service.todo.card.TodoSyncCardService; +import cn.axzo.msg.center.message.service.todo.manage.TodoLogger; +import cn.axzo.msg.center.message.service.todo.manage.TodoRequestContext; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.pending.request.CardContent; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO; @@ -32,6 +34,7 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF private final TodoBusinessDao todoBusinessDao; private final TodoDao todoDao; private final WorkflowCoreService workflowCoreService; + private final TodoLogger todoLogger; @Override @Nullable public CardButtonInterceptor create(CardContent card) { @@ -56,6 +59,9 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF .getTaskInfo(taskInfo)); log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowButtonInfo: {}", todo.getIdentityCode(), JSON.toJSONString(workflowButtonInfo)); + TodoRequestContext ctx = TodoRequestContext.create("syncWorkflowButtons", card) + .addLogContent("workflowButtonInfo", workflowButtonInfo); + todoLogger.logTodoUpdated(ctx, todo); return new WorkflowTodoCardButtonInterceptor(todo, taskInfo); } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java index 29011a4e..54ac8b24 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/utils/desision/DecisionValue.java @@ -1,6 +1,7 @@ package cn.axzo.msg.center.utils.desision; import lombok.AccessLevel; +import lombok.Getter; import lombok.RequiredArgsConstructor; import java.util.function.Supplier; @@ -14,7 +15,7 @@ public class DecisionValue { private static final DecisionValue NOT_SURE = new DecisionValue<>(Decision.NOT_SURE, null); private final Decision decision; - private final T value; + @Getter private final T value; @SuppressWarnings("unchecked") public static DecisionValue notSure() { From 24ef0f76631913a324bd80d3c070b1cbcc339b74 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 18:52:37 +0800 Subject: [PATCH 040/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/card/workflow/WorkflowTodoCardButtonInterceptor.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 14292b00..d9af32c3 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -70,10 +70,6 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { // 进行中隐藏所有按钮 if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); - DecisionValue actionPerformed = isActionPerformed(button); - // 显示失效按钮 - if (actionPerformed.isDecided() && actionPerformed.getValue()) - return DecisionValue.decide(true); if (getWorkflowHideButtonKeys().contains(button.getCode())) return DecisionValue.decide(false); if (button.getSource() == RouterButtonSourceEnum.CUSTOM) From 22b518ac64e3a9b45f0adccc81e7bedc5b86fef9 Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 14 Jan 2025 18:54:24 +0800 Subject: [PATCH 041/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/workflow/WorkflowTodoCardButtonInterceptor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index d9af32c3..e7ce8ce6 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -4,6 +4,7 @@ import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; import cn.axzo.msg.center.service.ButtonV3; import cn.axzo.msg.center.service.enums.BizFinalStateEnum; +import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.utils.desision.DecisionValue; @@ -70,6 +71,10 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { // 进行中隐藏所有按钮 if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); + DecisionValue actionPerformed = isActionPerformed(button); + // 显示失效按钮 + if (actionPerformed.isDecided() && actionPerformed.getValue()) + return DecisionValue.decide(button.getStyles().contains(ButtonStyleEnum.OVER_CARD)); if (getWorkflowHideButtonKeys().contains(button.getCode())) return DecisionValue.decide(false); if (button.getSource() == RouterButtonSourceEnum.CUSTOM) From fa38a6b514db0799201886b23c69e346ba2e465f Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 10:31:45 +0800 Subject: [PATCH 042/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inside/notices/config/DiagnosisProps.java | 2 +- .../WorkflowTodoCardButtonInterceptor.java | 75 ++++++++++--------- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java index f3f96131..9656d87e 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java @@ -34,7 +34,7 @@ public class DiagnosisProps implements EnvironmentAware { @Setter @Getter public static class RowCount { - private int warningThreshold = 600; + private int warningThreshold = 1500; private boolean enable = true; private int periodMaxWarnTimes = 3; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index e7ce8ce6..bc8e2693 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -4,7 +4,6 @@ import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.message.service.card.interceptor.CardButtonInterceptor; import cn.axzo.msg.center.service.ButtonV3; import cn.axzo.msg.center.service.enums.BizFinalStateEnum; -import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.PendingMessageStateEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.utils.desision.DecisionValue; @@ -13,6 +12,7 @@ import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope; +import com.google.common.collect.Sets; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -31,39 +31,51 @@ import static java.util.stream.Collectors.toSet; @RequiredArgsConstructor class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { + private final static Set SYSTEM_BUTTONS_SENDER_SHOW = Sets.newHashSet( + BizFinalStateEnum.RETRACT.getCode()); + private final static Set SYSTEM_BUTTONS_EXECUTOR_SHOW = Sets.newHashSet( + BizFinalStateEnum.PASSED.getCode(), + BizFinalStateEnum.REJECTED.getCode()); + private final Todo todo; private final BpmnTaskButtonVo taskInfo; @Override public DecisionValue isPerformActionAvailable(ButtonV3 button) { - BizFinalStateEnum state = findButtonClickState(button).orElse(null); - return DecisionValue.decide(state != null && state.isButtonPerformActionAvailable()); + BizFinalStateEnum btnBizState = findButtonClickState(button).orElse(null); + return DecisionValue.decide(btnBizState != null && btnBizState.isButtonPerformActionAvailable()); } @Override public DecisionValue isActionPerformed(ButtonV3 button) { - BizFinalStateEnum executorState = findButtonClickState(button).orElse(null); - if (executorState == null) - return DecisionValue.decide(false); - if (executorState == BizFinalStateEnum.PASSED - && taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.APPROVED) - return DecisionValue.decide(true); - if (executorState == BizFinalStateEnum.REJECTED - && taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.REJECTED) - return DecisionValue.decide(true); - //todo - if (executorState == BizFinalStateEnum.RETRACT - && taskInfo.getTaskResult() == BpmnProcessTaskResultEnum.DELETED) - return DecisionValue.decide(true); - return DecisionValue.decide(false); + return DecisionValue.decide(isExecutorActionPerformed(button) || isSenderActionPerformed(button)); + } + + private boolean isExecutorActionPerformed(ButtonV3 button) { + BizFinalStateEnum btnBizState = findButtonClickState(button).orElse(null); + if (btnBizState == null) + return false; + if (btnBizState == BizFinalStateEnum.PASSED + && taskInfo.getExecutorTaskResult() == BpmnProcessTaskResultEnum.APPROVED) + return true; + return btnBizState == BizFinalStateEnum.REJECTED + && taskInfo.getExecutorTaskResult() == BpmnProcessTaskResultEnum.REJECTED; + } + + private boolean isSenderActionPerformed(ButtonV3 button) { + BizFinalStateEnum btnBizState = findButtonClickState(button).orElse(null); + if (btnBizState == null) + return false; + return btnBizState == BizFinalStateEnum.RETRACT + && taskInfo.getInitiatorTaskResult() == BpmnProcessTaskResultEnum.CANCELED; } @Override public DecisionValue getActionPerformedName(ButtonV3 button) { - BizFinalStateEnum state = findButtonClickState(button).orElse(null); - return state == null + BizFinalStateEnum btnBizState = findButtonClickState(button).orElse(null); + return btnBizState == null ? DecisionValue.notSure() - : DecisionValue.decide(state.getActionPerformedName()); + : DecisionValue.decide(btnBizState.getActionPerformedName()); } @Override @@ -71,10 +83,9 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { // 进行中隐藏所有按钮 if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); - DecisionValue actionPerformed = isActionPerformed(button); // 显示失效按钮 - if (actionPerformed.isDecided() && actionPerformed.getValue()) - return DecisionValue.decide(button.getStyles().contains(ButtonStyleEnum.OVER_CARD)); + if (isExecutorActionPerformed(button) || isSenderActionPerformed(button)) + return DecisionValue.notSure(); if (getWorkflowHideButtonKeys().contains(button.getCode())) return DecisionValue.decide(false); if (button.getSource() == RouterButtonSourceEnum.CUSTOM) @@ -91,28 +102,22 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { public DecisionValue isSenderShow(ButtonV3 button) { if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return DecisionValue.decide(false); - DecisionValue actionPerformed = isActionPerformed(button); - boolean isRevokeButtonPerformed = actionPerformed.isDecided() - && actionPerformed.getValue() - && BizFinalStateEnum.RETRACT.getCode().equals(button.getCode()); - if (isRevokeButtonPerformed) - return DecisionValue.decide(true); - BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); - if (workflowButton == null) - return DecisionValue.decide(false); - List scopes = workflowButton.getVisibleScopes(); - return DecisionValue.decide(scopes != null && scopes.contains(ButtonVisibleScopeEnum.INITIATOR)); + return DecisionValue.decide(SYSTEM_BUTTONS_SENDER_SHOW.contains(button.getCode())); } @Override public DecisionValue isExecutorShow(ButtonV3 button) { if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return DecisionValue.notSure(); + if (SYSTEM_BUTTONS_EXECUTOR_SHOW.contains(button.getCode())) + return DecisionValue.decide(true); BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); if (workflowButton == null) return DecisionValue.notSure(); List scopes = workflowButton.getVisibleScopes(); - return DecisionValue.decide(scopes != null && scopes.contains(ButtonVisibleScopeEnum.EXECUTOR)); + return DecisionValue.decide(scopes != null + && scopes.contains(ButtonVisibleScopeEnum.EXECUTOR) + && !scopes.contains(ButtonVisibleScopeEnum.INITIATOR)); } private Optional findButtonClickState(ButtonV3 button) { From 4397d62cd961f81a4530e7568317d6f9c349154d Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 10:43:23 +0800 Subject: [PATCH 043/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/card/CardExtInfo.java | 2 +- .../cn/axzo/msg/center/message/service/card/CardParser.java | 2 +- .../message/service/todo/card/TodoSyncCardService.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java index 85656246..626bc077 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardExtInfo.java @@ -25,7 +25,7 @@ public class CardExtInfo { } @NotNull - public JSONObject getExtInfo() { + public JSONObject getJsonObject() { return extInfo; } 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 b7172f28..b63cc828 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 @@ -185,7 +185,7 @@ class CardParser { } }); - JSONObject extInfo = new CardExtInfo(card.getBizParam()).getExtInfo(); + JSONObject extInfo = new CardExtInfo(card.getBizParam()).getJsonObject(); if (!extInfo.isEmpty()) bizBody.setExtInfo(extInfo); return bizBody; 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 5ccd3660..fb62ddd7 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 @@ -175,7 +175,7 @@ public class TodoSyncCardService { return; } String identityCode = new CardExtInfo(message.getCardInfo().determineBizParam()) - .getExtInfo().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); + .getJsonObject().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); if (StringUtils.isBlank(identityCode)) { log.warn("onCardPresetButtonPressed: identityCode is blank, message={}", message); return; @@ -227,7 +227,7 @@ public class TodoSyncCardService { if (bizParam == null) return Optional.empty(); String category = new CardExtInfo(bizParam) - .getExtInfo().getString(TODO_CATEGORY_BIZ_PARAM_KEY); + .getJsonObject().getString(TODO_CATEGORY_BIZ_PARAM_KEY); return CodeDefinition.findByCode(BizCategoryEnum.class, category); } @@ -235,7 +235,7 @@ public class TodoSyncCardService { if (bizParam == null) return Optional.empty(); String identityCode = new CardExtInfo(bizParam) - .getExtInfo().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); + .getJsonObject().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); return Optional.ofNullable(identityCode); } From a4da4ee2d9fa79ee83a782fc1022259ce9b6360b Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 10:46:18 +0800 Subject: [PATCH 044/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowTodoCardButtonInterceptorFactory.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 111ed21b..2bb964e1 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -21,7 +21,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Nullable; -import java.util.HashMap; /** * @author yanglin @@ -50,17 +49,10 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF return null; } BpmnTaskButtonVo taskInfo = fetchWorkflowButtons(todo); - BizAssertions.assertNotNull(taskInfo, - "workflow buttons not found. todoIdentityCode={}", todo.getIdentityCode()); - HashMap workflowButtonInfo = new HashMap<>(); - workflowButtonInfo.put("workflowHideButtonKeys", WorkflowTodoCardButtonInterceptor - .getWorkflowHideButtonKeys(taskInfo)); - workflowButtonInfo.put("workflowButtons", WorkflowTodoCardButtonInterceptor - .getTaskInfo(taskInfo)); - log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowButtonInfo: {}", - todo.getIdentityCode(), JSON.toJSONString(workflowButtonInfo)); + log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowTaskInfo: {}", + todo.getIdentityCode(), JSON.toJSONString(taskInfo)); TodoRequestContext ctx = TodoRequestContext.create("syncWorkflowButtons", card) - .addLogContent("workflowButtonInfo", workflowButtonInfo); + .addLogContent("workflowTaskInfo", taskInfo); todoLogger.logTodoUpdated(ctx, todo); return new WorkflowTodoCardButtonInterceptor(todo, taskInfo); } From cf9534c15371a76b08f87fb735242d6a2688b49c Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 10:56:43 +0800 Subject: [PATCH 045/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/inside/notices/config/DiagnosisProps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java index 9656d87e..47ad7de6 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/DiagnosisProps.java @@ -36,7 +36,7 @@ public class DiagnosisProps implements EnvironmentAware { public static class RowCount { private int warningThreshold = 1500; private boolean enable = true; - private int periodMaxWarnTimes = 3; + private int periodMaxWarnTimes = 2; /** * For test purpose From 33d74b754d54fbe654f06a81832e7ed08da57d68 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 11:02:12 +0800 Subject: [PATCH 046/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowTodoCardButtonInterceptor.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index bc8e2693..44df5dd3 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -13,7 +13,6 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope; import com.google.common.collect.Sets; -import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -136,10 +135,6 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { } private Set getWorkflowHideButtonKeys() { - return getWorkflowHideButtonKeys(taskInfo); - } - - static Set getWorkflowHideButtonKeys(BpmnTaskButtonVo taskInfo) { List workflowHiddenButtons = taskInfo.getCustomHiddenButtons(); if (workflowHiddenButtons == null) workflowHiddenButtons = Collections.emptyList(); @@ -148,19 +143,4 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { .collect(toSet()); } - static Set getTaskInfo(BpmnTaskButtonVo taskInfo) { - List workflowHiddenButtons = taskInfo.getButtons(); - if (workflowHiddenButtons == null) - workflowHiddenButtons = Collections.emptyList(); - return workflowHiddenButtons.stream() - .map(btn -> new WorkflowButtonInfo(btn.getBtnKey(), btn.getVisibleScopes())) - .collect(toSet()); - } - - @Getter - @RequiredArgsConstructor - public static class WorkflowButtonInfo { - private final String btnKey; - private final List scopes; - } } \ No newline at end of file From b4c3a003362770432c2fa00e0f32fc27e8e5dc02 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 11:08:40 +0800 Subject: [PATCH 047/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/workflow/WorkflowTodoCardButtonInterceptor.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index 44df5dd3..c95f0b3c 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -90,11 +90,8 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { if (button.getSource() == RouterButtonSourceEnum.CUSTOM) return DecisionValue.notSure(); BpmnButtonMetaInfoWithVisibleScope workflowButton = findWorkflowButton(button).orElse(null); - // 如果找不到流程按钮, 说明不需要显示按钮 - if (workflowButton == null) - return DecisionValue.decide(false); - // 是否显示由待办模版控制 - return DecisionValue.notSure(); + // 如果找不到流程按钮, 说明不需要显示按钮,否则是否显示由待办模版控制 + return workflowButton == null ? DecisionValue.decide(false) : DecisionValue.notSure(); } @Override From b6b5267b8294487a633e258f5e50438ccf11fdd2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 11:10:03 +0800 Subject: [PATCH 048/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/workflow/WorkflowTodoCardButtonInterceptor.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index c95f0b3c..eb63db65 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -47,7 +47,11 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { @Override public DecisionValue isActionPerformed(ButtonV3 button) { - return DecisionValue.decide(isExecutorActionPerformed(button) || isSenderActionPerformed(button)); + return DecisionValue.decide(isSystemButtonActionPerformed(button)); + } + + private boolean isSystemButtonActionPerformed(ButtonV3 button) { + return isExecutorActionPerformed(button) || isSenderActionPerformed(button); } private boolean isExecutorActionPerformed(ButtonV3 button) { @@ -83,7 +87,7 @@ class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { if (todo.getState() == PendingMessageStateEnum.PROCESSING) return DecisionValue.decide(false); // 显示失效按钮 - if (isExecutorActionPerformed(button) || isSenderActionPerformed(button)) + if (isSystemButtonActionPerformed(button)) return DecisionValue.notSure(); if (getWorkflowHideButtonKeys().contains(button.getCode())) return DecisionValue.decide(false); From 8502fa85e9ce507111641c8b3490f429e1bfb5a1 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 11:23:43 +0800 Subject: [PATCH 049/111] =?UTF-8?q?REQ-3502:=20=E8=BF=87=E6=BB=A4=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/card/TodoSyncCardService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 fb62ddd7..840dd52e 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 @@ -25,6 +25,7 @@ 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.CardUpdateStateRequest; import cn.axzo.msg.center.service.pending.request.PresetButtonPressedRequest; +import cn.axzo.msg.center.service.pending.response.CardSendResponse; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; @@ -119,13 +120,14 @@ public class TodoSyncCardService { cardExtInfo.addExtInfo(TODO_CATEGORY_BIZ_PARAM_KEY, business.getBizCategory().getCode()); request.setBizParam(bizParam); request.setRouterParam(todo.routerParam()); - request.setReturnCards(false); + request.setReturnCards(true); TodoRequestContext ctx = TodoRequestContext .create("sendCard", event) .addLogContent("sendCardRequest", request); try { log.info("sendCard: todo={}", todo); - cardManager.send(request); + CardSendResponse response = cardManager.send(request); + ctx.addLogContent("sendCardResponse", response); todoLogger.logTodoUpdated(ctx, todo); log.info("sendCard: success, todo={}", todo); } catch (CardIdempotentException ignored) { From 680f7a13e591819b93a90d135af3ef67149c6dda Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 11:49:41 +0800 Subject: [PATCH 050/111] =?UTF-8?q?REQ-3502:=20=E8=AE=BE=E7=BD=AE=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/axzo/msg/center/mq/RocketMQConfig.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 f3118e27..bbbc248c 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 @@ -148,7 +148,8 @@ public class RocketMQConfig { @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", consumerGroup = "GID_topic_card_sync_todo_${spring.profiles.active}", consumeMode = ConsumeMode.ORDERLY, - nameServer = "${rocketmq.name-server}" + nameServer = "${rocketmq.name-server}", + maxReconsumeTimes = 3 ) public static class CardSyncTodoListener extends BaseListener implements RocketMQListener { @@ -166,7 +167,8 @@ public class RocketMQConfig { @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", consumerGroup = "GID_topic_todo_sync_card_biz_${spring.profiles.active}", consumeMode = ConsumeMode.ORDERLY, - nameServer = "${rocketmq.name-server}" + nameServer = "${rocketmq.name-server}", + maxReconsumeTimes = 3 ) public static class TodoSyncCardBizListener extends BaseListener implements RocketMQListener { @@ -189,7 +191,8 @@ public class RocketMQConfig { @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", consumerGroup = "GID_topic_todo_sync_card_flow_${spring.profiles.active}", consumeMode = ConsumeMode.ORDERLY, - nameServer = "${rocketmq.name-server}" + nameServer = "${rocketmq.name-server}", + maxReconsumeTimes = 3 ) public static class TodoSyncCardFlowListener extends BaseListener implements RocketMQListener { From 52fee727329832c1ca4dfa3c3fb4a1efa01357a2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 13:59:55 +0800 Subject: [PATCH 051/111] =?UTF-8?q?REQ-3502:=20=E8=AE=BE=E7=BD=AE=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/todo/manage/broadcast/TodoMqBroadcaster.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java index b265b86f..40b283ae 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoMqBroadcaster.java @@ -40,7 +40,7 @@ public class TodoMqBroadcaster { message.setUpdateCard(updateCard); mqProducer.send(MqMessageRecord .builder(MqMessageType.TODO_STATE_UPDATE, message) - .messageKey(todo.getId()) + .messageKey(todo.getIdentityCode()) .shardingKey(IdBuilder.builder() .append(todo.getTemplateCode()) .append(todo.getBizCode()) From 347dde83e2fef1d972e490ab83e0c9db1fe3fa9c Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 14:20:22 +0800 Subject: [PATCH 052/111] =?UTF-8?q?REQ-3502:=20=E8=AE=BE=E7=BD=AE=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msg/center/message/service/card/CardParser.java | 12 ++++++++++-- .../cn/axzo/msg/center/service/domain/UrlConfig.java | 7 +++++++ 2 files changed, 17 insertions(+), 2 deletions(-) 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 b63cc828..8e84158f 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 @@ -14,6 +14,7 @@ import cn.axzo.msg.center.service.domain.UrlConfigWalker; import cn.axzo.msg.center.service.enums.ButtonStyleEnum; import cn.axzo.msg.center.service.enums.CardState; import cn.axzo.msg.center.service.enums.KVContentType; +import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.pending.card.domain.CardButtonStates; @@ -161,8 +162,15 @@ class CardParser { imButton.setSenderShow(buttonInterceptor.isSenderShow(button).orElse(false)); imButton.setExecutorShow(buttonInterceptor.isExecutorShow(button).orElse(button.getExecutorShow())); imButton.setActionPerformed(isActionPerformed); - if (button.getUrlConfig().hasUrl()) - imButton.setUrlConfig(button.getUrlConfig()); + if (button.getUrlConfig().hasUrl()) { + UrlConfig copy = button.getUrlConfig().copy(); + if (button.getSource() == RouterButtonSourceEnum.SYSTEM) { + String url = copy.getPcCms().getUrl(); + copy.setSameUrlForAllPlatforms(url); + copy.setDefaultUrl(""); + } + imButton.setUrlConfig(copy); + } imButton.setButtonCode(button.getCode()); imButton.setPresetButtonType(button.getPresetButtonType()); imButton.setApiUrl(button.getApiUrl()); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java index 7dd29897..58dc5cb2 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java @@ -1,5 +1,6 @@ package cn.axzo.msg.center.service.domain; +import cn.axzo.framework.jackson.utility.JSON; import cn.axzo.msg.center.service.domain.url.AppUrl; import cn.axzo.msg.center.service.domain.url.WebUrl; import cn.axzo.msg.center.service.enums.WebPageOpenStrategy; @@ -17,6 +18,8 @@ import lombok.Setter; @Getter public class UrlConfig { + private String sameUrlForAllPlatforms; + /** * PC(OMS) */ @@ -129,4 +132,8 @@ public class UrlConfig { getOrCreateAppWorker().setIos(appUrl); } + public UrlConfig copy() { + return JSON.parseObject(JSON.toJSONString(this), UrlConfig.class); + } + } \ No newline at end of file From 034cbf6163c3038b5469d39e707e81b9f727466a Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 14:42:15 +0800 Subject: [PATCH 053/111] =?UTF-8?q?REQ-3502:=20=E8=AE=BE=E7=BD=AE=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notices/config/PendingMessageBizConfig.java | 6 ++++++ .../center/message/service/card/CardSupport.java | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java index 12cb8150..9d3cad3e 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/inside/notices/config/PendingMessageBizConfig.java @@ -176,6 +176,12 @@ public class PendingMessageBizConfig { @Getter private boolean enableTodoLog = true; + @Getter + private String workflowIMChannelAppMinVersionCmp = ""; + + @Getter + private String workflowIMChannelAppMinVersionCm = ""; + public boolean determineOldMsgStatCacheOn() { return isOldMsgStatCacheOn(); } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java index 4e69cbcb..627f2f3f 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardSupport.java @@ -10,6 +10,7 @@ import cn.axzo.msg.center.common.utils.BizAssertions; import cn.axzo.msg.center.dal.CardIdempotentDao; import cn.axzo.msg.center.domain.entity.Card; import cn.axzo.msg.center.domain.entity.CardIdempotent; +import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig; import cn.axzo.msg.center.message.domain.dto.TemplateModelV3; import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO; import cn.axzo.msg.center.message.service.card.domain.CardGroup; @@ -23,6 +24,7 @@ import cn.axzo.msg.center.nimpush.device.PushDeviceSnapshots; import cn.axzo.msg.center.push.PushData; import cn.axzo.msg.center.service.domain.card.AppVersionConfig; import cn.axzo.msg.center.service.dto.PeerPerson; +import cn.axzo.msg.center.service.enums.MessageCategoryEnum; import cn.axzo.msg.center.service.enums.MessageChannel; import cn.axzo.msg.center.service.pending.request.CardContent; import cn.axzo.msg.center.service.pending.request.CardSendRequest; @@ -60,6 +62,7 @@ public class CardSupport { private final NimPushService nimPushService; private final CardIdempotentDao cardIdempotentDao; private final CardProps cardProps; + private final PendingMessageBizConfig cfg; public static String getBizIdPrefix(String templateCode) { return IdBuilder.builder() @@ -178,15 +181,22 @@ public class CardSupport { private String determineMinAppVersion(ParsedModelV3 model, AppTypeEnum appType) { - Ref minVersion = Ref.create(""); + Ref ref = Ref.create(""); ParsedModelV3Walker.walkDown(model, new ParsedModel3Visitor() { @Override public void visitAppVersionConfig(AppVersionConfig cfg) { if (cfg.getAppType() == appType) - minVersion.set(cfg.getMinVersion()); + ref.set(cfg.getMinVersion()); } }); - return minVersion.get(); + String minVersion = ref.get(); + if (StringUtils.isBlank(minVersion) + && model.getTemplate().getMsgCategory() == MessageCategoryEnum.APPROVAL_PENDING_MESSAGE) { + return appType == AppTypeEnum.CMP + ? cfg.getWorkflowIMChannelAppMinVersionCmp() + : cfg.getWorkflowIMChannelAppMinVersionCm(); + } + return minVersion; } TemplateModelV3 ensureImChannelPresent(String templateCode) { From d568243ad14291f56eba16af43ca49abef2bb97f Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 14:45:21 +0800 Subject: [PATCH 054/111] =?UTF-8?q?REQ-3502:=20=E8=AE=BE=E7=BD=AE=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/todo/manage/TodoManager.java | 1 - 1 file changed, 1 deletion(-) 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 fe30259b..83e0fc7a 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 @@ -21,7 +21,6 @@ import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam; import cn.axzo.msg.center.message.service.impl.v3.ModelV3Service; import cn.axzo.msg.center.message.service.replay.RequestInfo; import cn.axzo.msg.center.message.service.replay.RequestReplayService; -import cn.axzo.msg.center.message.service.todo.TodoWithCardWrapper; import cn.axzo.msg.center.message.service.todo.manage.broadcast.TodoBroadcaster; import cn.axzo.msg.center.message.service.todo.manage.broadcast.TodoMqBroadcaster; import cn.axzo.msg.center.message.service.todo.manage.event.HandoverEvent; From 00324b43bbffb1547bbec8f5ea3c115b69006455 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 15:00:27 +0800 Subject: [PATCH 055/111] =?UTF-8?q?REQ-3502:=20=E8=AE=BE=E7=BD=AE=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msg/center/message/service/card/CardParser.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) 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 8e84158f..206ed487 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 @@ -16,7 +16,6 @@ import cn.axzo.msg.center.service.enums.CardState; import cn.axzo.msg.center.service.enums.KVContentType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; -import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import cn.axzo.msg.center.service.pending.card.domain.CardButtonStates; import cn.axzo.msg.center.service.pending.card.domain.CardElementConfig; import cn.axzo.msg.center.service.pending.request.CardContent; @@ -162,23 +161,21 @@ class CardParser { imButton.setSenderShow(buttonInterceptor.isSenderShow(button).orElse(false)); imButton.setExecutorShow(buttonInterceptor.isExecutorShow(button).orElse(button.getExecutorShow())); imButton.setActionPerformed(isActionPerformed); + boolean isSystemButton = button.getSource() == RouterButtonSourceEnum.SYSTEM; if (button.getUrlConfig().hasUrl()) { UrlConfig copy = button.getUrlConfig().copy(); - if (button.getSource() == RouterButtonSourceEnum.SYSTEM) { + if (isSystemButton) { String url = copy.getPcCms().getUrl(); copy.setSameUrlForAllPlatforms(url); copy.setDefaultUrl(""); } + copy.setFieldsNullIfUrlAbsent(); imButton.setUrlConfig(copy); } imButton.setButtonCode(button.getCode()); imButton.setPresetButtonType(button.getPresetButtonType()); - imButton.setApiUrl(button.getApiUrl()); - if (RouterCategoryEnum.ACTION.equals(button.getCategory())) { - AppLink appLink = new AppLink(TerminalTypeEnum.WEB_VIEW.name(), button.getApiUrl()); - imButton.setActionPaths(Collections.singletonList(appLink)); - } else if (button.getUrlConfig().hasUrl()) { + if (button.getUrlConfig().hasUrl() && !isSystemButton) { imButton.setActionPaths(getNativeAppLinks(button.getUrlConfig())); } } From b03b7750bb3f6d5967f2bce3ecffdcf697a2dcb5 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 15:21:54 +0800 Subject: [PATCH 056/111] =?UTF-8?q?REQ-3502:=20=E8=AE=BE=E7=BD=AE=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msg/center/message/service/card/CardParser.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) 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 206ed487..d9b22dab 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 @@ -162,16 +162,8 @@ class CardParser { imButton.setExecutorShow(buttonInterceptor.isExecutorShow(button).orElse(button.getExecutorShow())); imButton.setActionPerformed(isActionPerformed); boolean isSystemButton = button.getSource() == RouterButtonSourceEnum.SYSTEM; - if (button.getUrlConfig().hasUrl()) { - UrlConfig copy = button.getUrlConfig().copy(); - if (isSystemButton) { - String url = copy.getPcCms().getUrl(); - copy.setSameUrlForAllPlatforms(url); - copy.setDefaultUrl(""); - } - copy.setFieldsNullIfUrlAbsent(); - imButton.setUrlConfig(copy); - } + if (button.getUrlConfig().hasUrl()) + imButton.setUrlConfig(button.getUrlConfig()); imButton.setButtonCode(button.getCode()); imButton.setPresetButtonType(button.getPresetButtonType()); From f5f42f06d506df3f8f0c939a49be5cf29292514a Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 15:44:12 +0800 Subject: [PATCH 057/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...kflowTodoCardButtonInterceptorFactory.java | 178 +++++++++++++++++- .../response/v3/ParsedModelV3Walker.java | 5 +- .../todo/card/TodoSyncCardServiceTest.java | 29 +++ 3 files changed, 203 insertions(+), 9 deletions(-) create mode 100644 start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 2bb964e1..eaaa74a5 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -58,14 +58,176 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF } BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { - TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); - BizAssertions.assertNotNull(business, "todo business not found. todoIdentityCode={}", todo.getIdentityCode()); - BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); - workflowRequest.setProcessInstanceId(todo.getBizCode()); - workflowRequest.setTaskId(todo.getSubBizCode()); - workflowRequest.setInitiatorPersonId(business.getPromoterPersonId()); - workflowRequest.setExecutorPersonId(todo.getExecutorPersonId()); - return workflowCoreService.findProcessSingleTaskButtons(workflowRequest); + String json = "{\n" + + " \"buttons\": [\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 7,\n" + + " \"btnKey\": \"BPMN_ROLLBACK\",\n" + + " \"btnName\": \"回退\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"EXECUTOR\"\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 6,\n" + + " \"btnKey\": \"BPMN_COMMENT\",\n" + + " \"btnName\": \"评论\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"INITIATOR\",\n" + + " \"EXECUTOR\"\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 1,\n" + + " \"btnKey\": \"BPMN_APPROVE\",\n" + + " \"btnName\": \"同意\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"EXECUTOR\"\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 4,\n" + + " \"btnKey\": \"BPMN_TRANSFER\",\n" + + " \"btnName\": \"转交\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"EXECUTOR\"\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 2,\n" + + " \"btnKey\": \"BPMN_REJECT\",\n" + + " \"btnName\": \"驳回\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"EXECUTOR\"\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 8,\n" + + " \"btnKey\": \"BPMN_COPY\",\n" + + " \"btnName\": \"抄送\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"EXECUTOR\"\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 3,\n" + + " \"btnKey\": \"BPMN_REVOCATION\",\n" + + " \"btnName\": \"撤回\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"INITIATOR\"\n" + + " ]\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 5,\n" + + " \"btnKey\": \"BPMN_COUNTERSIGN\",\n" + + " \"btnName\": \"加签\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false,\n" + + " \"visibleScopes\": [\n" + + " \"EXECUTOR\"\n" + + " ]\n" + + " }\n" + + " ],\n" + + " \"allConfigButtons\": [\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 1,\n" + + " \"btnKey\": \"BPMN_APPROVE\",\n" + + " \"btnName\": \"同意\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 2,\n" + + " \"btnKey\": \"BPMN_REJECT\",\n" + + " \"btnName\": \"驳回\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 3,\n" + + " \"btnKey\": \"BPMN_REVOCATION\",\n" + + " \"btnName\": \"撤回\",\n" + + " \"checked\": false,\n" + + " \"disabled\": true\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 4,\n" + + " \"btnKey\": \"BPMN_TRANSFER\",\n" + + " \"btnName\": \"转交\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 5,\n" + + " \"btnKey\": \"BPMN_COUNTERSIGN\",\n" + + " \"btnName\": \"加签\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 6,\n" + + " \"btnKey\": \"BPMN_COMMENT\",\n" + + " \"btnName\": \"评论\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 7,\n" + + " \"btnKey\": \"BPMN_ROLLBACK\",\n" + + " \"btnName\": \"回退\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false\n" + + " },\n" + + " {\n" + + " \"type\": \"SYSTEM\",\n" + + " \"order\": 8,\n" + + " \"btnKey\": \"BPMN_COPY\",\n" + + " \"btnName\": \"抄送\",\n" + + " \"checked\": true,\n" + + " \"disabled\": false\n" + + " }\n" + + " ],\n" + + " \"executorTaskResult\": \"PROCESSING\",\n" + + " \"customHiddenButtons\": []\n" + + " }"; + return JSON.parseObject(json, BpmnTaskButtonVo.class); + //TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); + //BizAssertions.assertNotNull(business, "todo business not found. todoIdentityCode={}", todo.getIdentityCode()); + //BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); + //workflowRequest.setProcessInstanceId(todo.getBizCode()); + //workflowRequest.setTaskId(todo.getSubBizCode()); + //workflowRequest.setInitiatorPersonId(business.getPromoterPersonId()); + //workflowRequest.setExecutorPersonId(todo.getExecutorPersonId()); + //return workflowCoreService.findProcessSingleTaskButtons(workflowRequest); } } \ No newline at end of file diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/ParsedModelV3Walker.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/ParsedModelV3Walker.java index d5ed8f0d..33582ee4 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/ParsedModelV3Walker.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/response/v3/ParsedModelV3Walker.java @@ -15,6 +15,7 @@ import cn.axzo.msg.center.service.pending.response.v3.model.ParsedTemplateV3; import org.apache.commons.collections4.CollectionUtils; import java.util.ArrayList; +import java.util.Comparator; /** * @author yanglin @@ -40,7 +41,9 @@ public class ParsedModelV3Walker { } for (ParsedGroupV3 group : new ArrayList<>(model.determineGroups())) visitGroup(visitor, group); - for (ParsedButtonV3 button : new ArrayList<>(model.determineButtons())) + ArrayList buttons = new ArrayList<>(model.determineButtons()); + buttons.sort(Comparator.comparingInt(ParsedButtonV3::determinePriority)); + for (ParsedButtonV3 button : buttons) visitButton(visitor, button); if (template != null) visitor.exitTemplate(template); diff --git a/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java new file mode 100644 index 00000000..b47c0acb --- /dev/null +++ b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java @@ -0,0 +1,29 @@ +package cn.axzo.msg.center.message.service.todo.card; + +import cn.axzo.framework.rocketmq.Event; +import cn.axzo.msg.center.MsgCenterApplication; +import cn.axzo.msg.center.api.mq.TodoUpdateMessage; +import com.alibaba.fastjson.JSON; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; +/** + * @author yanglin + */ +@SpringBootTest(classes = MsgCenterApplication.class) +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class TodoSyncCardServiceTest { + + private final TodoSyncCardService todoSyncCardService; + + @Test + void exec() { + String json = "{\"messageId\": \"d6b3b687-6ab9-416e-9836-6245d9043125\", \"messageSendTime\": 1736926166387, \"messageSendTimeStr\": \"2025-01-15 15:29:26\", \"operation\": \"send\", \"updateCard\": true, \"updatedTodo\": {\"bizCategory\": \"FLOW\", \"bizCode\": \"202501151529100000000\", \"bizDesc\": \"审批节点\", \"bizExtParam\": {\"[_BIZ_NODE_ALTER_]node_065414499288\": {\"activityId\": \"node_065414499288\", \"processInstanceId\": \"202501151529100000000\", \"retries\": 2}, \"[_INTERNAL_INITIATOR_]\": {\"assignerName\": \"杨期成\", \"ouId\": \"10401\", \"tenantId\": \"4949\", \"personId\": \"9000400630\", \"assignee\": \"1229802\", \"assigneeType\": \"3\", \"avatar\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\"}, \"businessName\": \"工作流开发测试项目业务\", \"initiatorUserName\": \"杨期成\", \"[_INTERNAL_PROCESS_AGENT]\": true, \"activityId\": \"node_065414499288\", \"processStartTime\": \"2025-01-15 15:29:25\", \"assigneeName\": \"10400|9000400630\", \"processInstanceId\": \"202501151529100000000\", \"nrOfActiveInstances\": 1, \"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\": 2, \"activityName\": \"审批节点\", \"processResult\": \"审批中\", \"[_CREATE_INSTANCE_PARAMS]\": \"{\\\"processDefinitionKey\\\":\\\"wfTestProj\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"variables\\\":{\\\"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\\\":2,\\\"[_INTERNAL_INITIATOR_]\\\":\\\"{\\\\\\\"assignee\\\\\\\":\\\\\\\"1229802\\\\\\\",\\\\\\\"assigneeType\\\\\\\":\\\\\\\"3\\\\\\\",\\\\\\\"assignerName\\\\\\\":\\\\\\\"杨期成\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\\\\\",\\\\\\\"ouId\\\\\\\":\\\\\\\"10401\\\\\\\",\\\\\\\"personId\\\\\\\":\\\\\\\"9000400630\\\\\\\",\\\\\\\"tenantId\\\\\\\":\\\\\\\"4949\\\\\\\"}\\\",\\\"[_BIZ_ORG_RELATION_]\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"[_WORKFLOW_ENGINE_VERSION_]\\\":\\\"1.5.1\\\",\\\"[_PENDING_VARIABLES]\\\":{},\\\"[_INTERNAL_PROCESS_AGENT]\\\":true},\\\"pendingVariables\\\":{},\\\"cooperationOrg\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"businessKey\\\":\\\"40\\\",\\\"initiator\\\":{\\\"assignee\\\":\\\"1229802\\\",\\\"assigneeType\\\":\\\"3\\\",\\\"assignerName\\\":\\\"杨期成\\\",\\\"personId\\\":\\\"9000400630\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"ouId\\\":\\\"10401\\\",\\\"avatar\\\":\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\"},\\\"async\\\":false,\\\"startFormVariables\\\":{}}\", \"taskStartTime\": \"2025-01-15 15:29:25\", \"taskUserName\": \"杨期成\", \"[_WORKFLOW_ENGINE_VERSION_]\": \"1.5.1\", \"tenantId\": \"4949\", \"businessKey\": \"40\", \"operatorType\": \"\", \"taskId\": \"202501151529100000049\", \"[_PENDING_VARIABLES]\": {}, \"processInstanceName\": \"工作流业务测试项目流程\", \"nrOfCompletedInstances\": 0}, \"bizFinalState\": null, \"bizFlag\": \"\", \"content\": \"你好\", \"deadline\": null, \"executorId\": 0, \"executorName\": \"杨期成\", \"executorOuId\": 10400, \"executorPersonId\": 9000400630, \"executorType\": \"NOT_SUPPORT\", \"executorWorkspaceId\": 4946, \"executorWorkspaceName\": \"成都建工第七建筑工程有限公司\", \"identityCode\": \"fccb21474a4645edb907e9a9828c3d46\", \"orgType\": \"ENT\", \"promoterId\": 0, \"promoterName\": \"杨期成\", \"promoterOuId\": 10401, \"promoterPersonId\": 9000400630, \"promoterType\": \"NOT_SUPPORT\", \"promoterWorkspaceId\": 4949, \"promoterWorkspaceName\": \"核西南院设计有限公司\", \"requestNo\": \"1a9c93f122824f648763bd311c2f3118\", \"routerParams\": {\"processNodeCode\": \"node_065414499288\", \"processInstanceId\": \"202501151529100000000\", \"creator\": \"杨期成\", \"userAgreeSignature\": true, \"businessTypeName\": \"审批节点\", \"businessKey\": \"40\", \"tenantId\": \"4946\", \"startTime\": \"2025-01-15 15:29:25\", \"title\": \"工作流业务测试项目流程\", \"taskId\": \"202501151529100000049\", \"processNodeName\": \"审批节点\"}, \"srcTemplateCode\": \"a7c79c432efc4ecba71790677d35cc59\", \"state\": \"HAS_BEEN_SENT\", \"subBizCode\": \"202501151529100000049\", \"templateCode\": \"a7c79c432efc4ecba71790677d35cc59\", \"title\": \"你好\", \"todoBusinessId\": 146907, \"todoId\": 843354, \"type\": \"EXECUTABLE\"}}"; + TodoUpdateMessage message = JSON.parseObject(json, TodoUpdateMessage.class); + todoSyncCardService.onMessage(new Event(), message); + } + +} \ No newline at end of file From 1baeac0fcdd03c0fdd353a63ed6a1751f8f1e928 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 16:17:26 +0800 Subject: [PATCH 058/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...kflowTodoCardButtonInterceptorFactory.java | 178 +----------------- 1 file changed, 8 insertions(+), 170 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index eaaa74a5..2bb964e1 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -58,176 +58,14 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF } BpmnTaskButtonVo fetchWorkflowButtons(Todo todo) { - String json = "{\n" + - " \"buttons\": [\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 7,\n" + - " \"btnKey\": \"BPMN_ROLLBACK\",\n" + - " \"btnName\": \"回退\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"EXECUTOR\"\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 6,\n" + - " \"btnKey\": \"BPMN_COMMENT\",\n" + - " \"btnName\": \"评论\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"INITIATOR\",\n" + - " \"EXECUTOR\"\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 1,\n" + - " \"btnKey\": \"BPMN_APPROVE\",\n" + - " \"btnName\": \"同意\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"EXECUTOR\"\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 4,\n" + - " \"btnKey\": \"BPMN_TRANSFER\",\n" + - " \"btnName\": \"转交\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"EXECUTOR\"\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 2,\n" + - " \"btnKey\": \"BPMN_REJECT\",\n" + - " \"btnName\": \"驳回\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"EXECUTOR\"\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 8,\n" + - " \"btnKey\": \"BPMN_COPY\",\n" + - " \"btnName\": \"抄送\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"EXECUTOR\"\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 3,\n" + - " \"btnKey\": \"BPMN_REVOCATION\",\n" + - " \"btnName\": \"撤回\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"INITIATOR\"\n" + - " ]\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 5,\n" + - " \"btnKey\": \"BPMN_COUNTERSIGN\",\n" + - " \"btnName\": \"加签\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false,\n" + - " \"visibleScopes\": [\n" + - " \"EXECUTOR\"\n" + - " ]\n" + - " }\n" + - " ],\n" + - " \"allConfigButtons\": [\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 1,\n" + - " \"btnKey\": \"BPMN_APPROVE\",\n" + - " \"btnName\": \"同意\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 2,\n" + - " \"btnKey\": \"BPMN_REJECT\",\n" + - " \"btnName\": \"驳回\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 3,\n" + - " \"btnKey\": \"BPMN_REVOCATION\",\n" + - " \"btnName\": \"撤回\",\n" + - " \"checked\": false,\n" + - " \"disabled\": true\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 4,\n" + - " \"btnKey\": \"BPMN_TRANSFER\",\n" + - " \"btnName\": \"转交\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 5,\n" + - " \"btnKey\": \"BPMN_COUNTERSIGN\",\n" + - " \"btnName\": \"加签\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 6,\n" + - " \"btnKey\": \"BPMN_COMMENT\",\n" + - " \"btnName\": \"评论\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 7,\n" + - " \"btnKey\": \"BPMN_ROLLBACK\",\n" + - " \"btnName\": \"回退\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false\n" + - " },\n" + - " {\n" + - " \"type\": \"SYSTEM\",\n" + - " \"order\": 8,\n" + - " \"btnKey\": \"BPMN_COPY\",\n" + - " \"btnName\": \"抄送\",\n" + - " \"checked\": true,\n" + - " \"disabled\": false\n" + - " }\n" + - " ],\n" + - " \"executorTaskResult\": \"PROCESSING\",\n" + - " \"customHiddenButtons\": []\n" + - " }"; - return JSON.parseObject(json, BpmnTaskButtonVo.class); - //TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); - //BizAssertions.assertNotNull(business, "todo business not found. todoIdentityCode={}", todo.getIdentityCode()); - //BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); - //workflowRequest.setProcessInstanceId(todo.getBizCode()); - //workflowRequest.setTaskId(todo.getSubBizCode()); - //workflowRequest.setInitiatorPersonId(business.getPromoterPersonId()); - //workflowRequest.setExecutorPersonId(todo.getExecutorPersonId()); - //return workflowCoreService.findProcessSingleTaskButtons(workflowRequest); + TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); + BizAssertions.assertNotNull(business, "todo business not found. todoIdentityCode={}", todo.getIdentityCode()); + BpmnTaskButtonSearchDTO workflowRequest = new BpmnTaskButtonSearchDTO(); + workflowRequest.setProcessInstanceId(todo.getBizCode()); + workflowRequest.setTaskId(todo.getSubBizCode()); + workflowRequest.setInitiatorPersonId(business.getPromoterPersonId()); + workflowRequest.setExecutorPersonId(todo.getExecutorPersonId()); + return workflowCoreService.findProcessSingleTaskButtons(workflowRequest); } } \ No newline at end of file From 9e23485957e0029b1555bf55d24a9bae731b22d1 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 16:25:52 +0800 Subject: [PATCH 059/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/todo/manage/TodoLogger.java | 1 + 1 file changed, 1 insertion(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java index 13f33d90..fc5e16f0 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java @@ -104,6 +104,7 @@ public class TodoLogger { log.setSubBizCode(todo.getSubBizCode()); log.setRequestNo(ctx.getRequestNo()); log.setContext(ctx.getName()); + log.addLogContent("todoState", todo.getState()); String category = businesses.findBusiness(todo) .map(TodoBusiness::getBizCategory) .map(Enum::name) From b4a59c2c676ac62ad4fda9f20c23275007ea1ce4 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 16:42:08 +0800 Subject: [PATCH 060/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/todo/manage/TodoLogger.java | 1 + 1 file changed, 1 insertion(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java index fc5e16f0..478ad8fe 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java @@ -105,6 +105,7 @@ public class TodoLogger { log.setRequestNo(ctx.getRequestNo()); log.setContext(ctx.getName()); log.addLogContent("todoState", todo.getState()); + log.addLogContent("todoUpdateTime", todo.getUpdateAt().getTime()); String category = businesses.findBusiness(todo) .map(TodoBusiness::getBizCategory) .map(Enum::name) From cb618ced636da0a0c4d0cc75090a1f348f5a9e13 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 16:52:39 +0800 Subject: [PATCH 061/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/message/service/todo/card/TodoSyncCardService.java | 4 ++++ 1 file changed, 4 insertions(+) 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 840dd52e..856a375d 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 @@ -47,6 +47,8 @@ public class TodoSyncCardService { private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "todoIdentityCode"; private static final String TODO_TYPE_BIZ_PARAM_KEY = "todoType"; private static final String TODO_CATEGORY_BIZ_PARAM_KEY = "todoCategory"; + private static final String TODO_EXECUTOR_WORKSPACE_ID_BIZ_PARAM_KEY = "todoExecutorWorkspaceId"; + private static final String TODO_PROMOTER_WORKSPACE_ID_BIZ_PARAM_KEY = "todoPromoterWorkspaceId"; private final TodoDao todoDao; private final TodoBusinessDao todoBusinessDao; @@ -118,6 +120,8 @@ public class TodoSyncCardService { cardExtInfo.addExtInfo(TODO_IDENTITY_CODE_BIZ_PARAM_KEY, todo.getIdentityCode()); cardExtInfo.addExtInfo(TODO_TYPE_BIZ_PARAM_KEY, todo.getType().getCode()); cardExtInfo.addExtInfo(TODO_CATEGORY_BIZ_PARAM_KEY, business.getBizCategory().getCode()); + cardExtInfo.addExtInfo(TODO_EXECUTOR_WORKSPACE_ID_BIZ_PARAM_KEY, todo.getReceiverWorkspaceId()); + cardExtInfo.addExtInfo(TODO_PROMOTER_WORKSPACE_ID_BIZ_PARAM_KEY, business.getOrgId()); request.setBizParam(bizParam); request.setRouterParam(todo.routerParam()); request.setReturnCards(true); From 0f3e1c440f23f4d19dd633d2265035679bfe90cb Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 17:01:37 +0800 Subject: [PATCH 062/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/todo/manage/TodoLogger.java | 10 ++++++++- .../java/cn/axzo/msg/center/dal/TodoDao.java | 22 ------------------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java index 478ad8fe..6fa11f62 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoLogger.java @@ -2,6 +2,7 @@ package cn.axzo.msg.center.message.service.todo.manage; import cn.axzo.msg.center.dal.TodoBusinessDao; import cn.axzo.msg.center.dal.TodoBusinesses; +import cn.axzo.msg.center.dal.TodoDao; import cn.axzo.msg.center.dal.TodoLogDao; import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.domain.entity.TodoBusiness; @@ -19,6 +20,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static java.util.stream.Collectors.toList; + /** * @author yanglin */ @@ -28,6 +31,7 @@ public class TodoLogger { private final TodoLogDao todoLogDao; private final TodoBusinessDao todoBusinessDao; + private final TodoDao todoDao; private final PendingMessageBizConfig cfg; void logBusinessUpdated(TodoRequestContext ctx, TodoBusiness business) { @@ -67,7 +71,11 @@ public class TodoLogger { if (CollectionUtils.isEmpty(todos)) return; TodoBusinesses businesses = todoBusinessDao.getBusinesses(todos); ArrayList logs = new ArrayList<>(); - for (Todo todo : todos) { + List todoCodes = todos.stream() + .map(Todo::getIdentityCode) + .distinct().collect(toList()); + // reload to get the up-to-date update time + for (Todo todo : todoDao.getByCodes(todoCodes)) { logs.add(createTodoLog(ctx, businesses, todo) .addLogContents(ctx.getLogContents())); } diff --git a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/TodoDao.java b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/TodoDao.java index 4e39eeba..0a44c4af 100644 --- a/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/TodoDao.java +++ b/msg-center-dal/src/main/java/cn/axzo/msg/center/dal/TodoDao.java @@ -17,9 +17,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Nullable; import java.util.Collections; -import java.util.Date; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -157,24 +155,4 @@ public class TodoDao extends ServiceImpl { .set(Todo::getState, PendingMessageStateEnum.PROCESSING) .update(); } - - public boolean setExecutableHide(String subBizCode, Date expireTime) { - return lambdaUpdate() - .eq(Todo::getType, TodoType.EXECUTABLE) - .eq(Todo::getSubBizCode, subBizCode) - .eq(Todo::getState, PendingMessageStateEnum.HAS_BEEN_SENT) - .set(Todo::getHideUntil, expireTime) - .update(); - } - - public List findByCondition(String templateCode, String bizCode, String subBizCode, Long executorPersonId, Long ouId, Long workspaceId) { - return lambdaQuery() - .eq(StringUtils.isNotBlank(templateCode), Todo::getTemplateCode, templateCode) - .eq(StringUtils.isNotBlank(bizCode), Todo::getBizCode, bizCode) - .eq(StringUtils.isNotBlank(subBizCode), Todo::getSubBizCode, subBizCode) - .eq(Objects.nonNull(executorPersonId), Todo::getExecutorPersonId, executorPersonId) - .eq(Objects.nonNull(ouId), Todo::getOuId, ouId) - .eq(Objects.nonNull(workspaceId), Todo::getReceiverWorkspaceId, workspaceId) - .list(); - } } \ No newline at end of file From ed62a964e4bb43101d44480394cc448e9c72b1b3 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 17:16:16 +0800 Subject: [PATCH 063/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/todo/manage/broadcast/TodoBroadcaster.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java index f98db829..fcd2adec 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/broadcast/TodoBroadcaster.java @@ -47,8 +47,8 @@ public class TodoBroadcaster { log.warn("发送待办通知时, 查询不到最新的待办信息. todoIds={}", JSON.toJSONString(todoIds)); return; } - todoMqBroadcaster.fireTodoUpdated(operation, todos, updateCard); - todoPullBroadcaster.fireTodoChanged(todos); + todoMqBroadcaster.fireTodoUpdated(operation, upToDateTodos, updateCard); + todoPullBroadcaster.fireTodoChanged(upToDateTodos); } } \ No newline at end of file From 8cf1b036bb085f1ecc624623816a693fb61c9375 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 17:20:47 +0800 Subject: [PATCH 064/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/card/TodoSyncCardService.java | 9 +++++++++ .../WorkflowTodoCardButtonInterceptorFactory.java | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletion(-) 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 856a375d..558e9a82 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 @@ -43,6 +43,8 @@ import java.util.Optional; @RequiredArgsConstructor public class TodoSyncCardService { + private static final ThreadLocal TODO_MESSAGE = new ThreadLocal<>(); + private static final String APP_CODE = "msg-center:todo"; private static final String TODO_IDENTITY_CODE_BIZ_PARAM_KEY = "todoIdentityCode"; private static final String TODO_TYPE_BIZ_PARAM_KEY = "todoType"; @@ -60,13 +62,20 @@ public class TodoSyncCardService { void onMessage(Event event, TodoUpdateMessage message) { log.info("received TodoUpdateMessage: {}", message); try { + TODO_MESSAGE.set(message); sync(event, message); } catch (Exception e) { log.warn("onMessage error, message={}", message, e); throw new RuntimeException(e); + } finally { + TODO_MESSAGE.remove(); } } + public static Optional getTodoUpdateMessage() { + return Optional.ofNullable(TODO_MESSAGE.get()); + } + private void sync(Event event, TodoUpdateMessage message) { if (!message.isUpdateCard()) { log.warn("not update card, message={}", message); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java index 2bb964e1..90aea463 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptorFactory.java @@ -1,5 +1,6 @@ package cn.axzo.msg.center.message.service.todo.card.workflow; +import cn.axzo.msg.center.api.mq.TodoUpdateMessage; import cn.axzo.msg.center.common.utils.BizAssertions; import cn.axzo.msg.center.dal.TodoBusinessDao; import cn.axzo.msg.center.dal.TodoDao; @@ -51,7 +52,11 @@ class WorkflowTodoCardButtonInterceptorFactory implements CardButtonInterceptorF BpmnTaskButtonVo taskInfo = fetchWorkflowButtons(todo); log.info("fetchWorkflowButtons, todoIdentityCode={}, workflowTaskInfo: {}", todo.getIdentityCode(), JSON.toJSONString(taskInfo)); - TodoRequestContext ctx = TodoRequestContext.create("syncWorkflowButtons", card) + String contextName = "syncWorkflowButtons"; + TodoUpdateMessage todoMessage = TodoSyncCardService.getTodoUpdateMessage().orElse(null); + if (todoMessage != null) + contextName += ":" + todoMessage.getOperation(); + TodoRequestContext ctx = TodoRequestContext.create(contextName, card) .addLogContent("workflowTaskInfo", taskInfo); todoLogger.logTodoUpdated(ctx, todo); return new WorkflowTodoCardButtonInterceptor(todo, taskInfo); From fc0c222d6f7cefff03cf6c4a94c35712d5ba1959 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 19:20:10 +0800 Subject: [PATCH 065/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/card/CardManager.java | 14 +++ .../service/card/event/CardUpdateEvent.java | 20 +++++ .../todo/card/TodoSyncCardService.java | 85 ++++++++++++++++++- 3 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.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 eec63ed1..e7bc0e90 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 @@ -17,6 +17,7 @@ import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO; import cn.axzo.msg.center.message.service.card.broadcast.CardBroadcaster; import cn.axzo.msg.center.message.service.card.domain.CardGroup; import cn.axzo.msg.center.message.service.card.domain.CardSendModel; +import cn.axzo.msg.center.message.service.card.event.CardUpdateEvent; import cn.axzo.msg.center.message.service.card.log.CardLogger; import cn.axzo.msg.center.message.service.card.log.CardLoggers; import cn.axzo.msg.center.message.service.replay.RequestInfo; @@ -43,7 +44,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; import java.util.ArrayList; @@ -72,6 +76,7 @@ public class CardManager { private final CardBroadcaster cardBroadcaster; private final CardProps cardProps; private final RequestReplayService requestReplayService; + private final ApplicationContext applicationContext; private final ExecutorService executor = new ThreadPoolExecutor( 5, 15, 5L, TimeUnit.MINUTES, @@ -290,6 +295,7 @@ public class CardManager { private class UpdateExecutor { final CardLogger updateCardLogger; + final CardRequestContext requestContext; final TemplateModelV3 templateModel; final String operation; final List cards; @@ -299,6 +305,7 @@ public class CardManager { UpdateExecutor(CardRequestContext requestContext, String operation, TemplateModelV3 templateModel, List cards) { this.updateCardLogger = cardLoggers.createLogger(requestContext); + this.requestContext = requestContext; this.templateModel = templateModel; this.operation = operation; this.cards = cards; @@ -318,6 +325,13 @@ public class CardManager { updateCardLogger.reloadAndLogCards(String.format("%s:enqueue", operation)); CardManager.this.updateMessages(updatedCards); updateCardLogger.reloadAndLogCards(String.format("%s:updateMessage:success", operation)); + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + for (Card card : cardDao.reloadCards(cards)) + applicationContext.publishEvent(new CardUpdateEvent(requestContext.getRequest(), card)); + } + }); return UpdateStateResult.UPDATED; }); } catch (Exception e) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.java new file mode 100644 index 00000000..e98e7a91 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.java @@ -0,0 +1,20 @@ +package cn.axzo.msg.center.message.service.card.event; + +import cn.axzo.msg.center.domain.entity.Card; +import lombok.Getter; +import org.springframework.context.ApplicationEvent; + +/** + * @author yanglin + */ +@Getter +public class CardUpdateEvent extends ApplicationEvent { + + private final Card reloadedCard; + + public CardUpdateEvent(Object source, Card reloadedCard) { + super(source); + this.reloadedCard = reloadedCard; + } + +} \ 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 558e9a82..05ec05b6 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 @@ -11,6 +11,7 @@ import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.domain.entity.TodoBusiness; import cn.axzo.msg.center.message.service.card.CardExtInfo; import cn.axzo.msg.center.message.service.card.CardManager; +import cn.axzo.msg.center.message.service.card.event.CardUpdateEvent; import cn.axzo.msg.center.message.service.card.exception.CardIdempotentException; import cn.axzo.msg.center.message.service.todo.manage.TodoLogger; import cn.axzo.msg.center.message.service.todo.manage.TodoManager; @@ -27,13 +28,21 @@ 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; import com.alibaba.fastjson.JSONObject; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.collect.Sets; +import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; /** * @author yanglin @@ -41,7 +50,7 @@ import java.util.Optional; @Slf4j @Component @RequiredArgsConstructor -public class TodoSyncCardService { +public class TodoSyncCardService implements ApplicationListener { private static final ThreadLocal TODO_MESSAGE = new ThreadLocal<>(); @@ -59,6 +68,19 @@ public class TodoSyncCardService { private final MessageTemplateV3Dao messageTemplateV3Dao; private final TodoManager todoManager; + private final long cacheSize = 1000; + private final long cacheExpireSeconds = 10; + private final Cache locks = CacheBuilder + .newBuilder() + .maximumSize(cacheSize) + .expireAfterAccess(cacheExpireSeconds, TimeUnit.SECONDS) + .build(); + private final Cache todoStates = CacheBuilder + .newBuilder() + .maximumSize(cacheSize) + .expireAfterAccess(cacheExpireSeconds, TimeUnit.SECONDS) + .build(); + void onMessage(Event event, TodoUpdateMessage message) { log.info("received TodoUpdateMessage: {}", message); try { @@ -107,7 +129,7 @@ public class TodoSyncCardService { || todo.getState() == PendingMessageStateEnum.CREATED) sendCard(event, business, todo); else - updateCardState(event, business, todo); + updateCardState(event, message, business, todo); } private void sendCard(Event event, TodoBusiness business, Todo todo) { @@ -151,8 +173,21 @@ public class TodoSyncCardService { } } - private void updateCardState(Event event, TodoBusiness business, Todo todo) { - CardUpdateStateRequest request = new CardUpdateStateRequest(); + private void updateCardState(Event event, TodoUpdateMessage message, TodoBusiness business, Todo todo) { + synchronized (getTodoLock(todo)) { + TodoCardState lastState = todoStates.getIfPresent(todo.getId()); + if (lastState != null && lastState.equals(TodoCardState.create(business, todo))) { + log.info("updateCardState: no change, todo={}", todo); + TodoRequestContext ctx = TodoRequestContext.create("updateCardState:ignore", message) + .addLogContent("todoState", lastState); + todoLogger.logTodoUpdated(ctx, todo); + return; + } + } + + TodoCardUpdateStateRequest request = new TodoCardUpdateStateRequest(); + request.setTodo(todo); + request.setTodoBusiness(business); request.setAppCode(APP_CODE); request.setTemplateCode(todo.getTemplateCode()); request.setBizCode(todo.getBizCode()); @@ -254,4 +289,46 @@ public class TodoSyncCardService { return Optional.ofNullable(identityCode); } + @Override + public void onApplicationEvent(CardUpdateEvent event) { + if (!(event.getSource() instanceof TodoCardUpdateStateRequest)) + return; + Todo todo = ((TodoCardUpdateStateRequest) event.getSource()).getTodo(); + TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); + if (business == null) return; + synchronized (getTodoLock(todo)) { + todoStates.put(todo.getId(), TodoCardState.create(business, todo)); + } + } + + private Object getTodoLock(Todo todo) { + String identityCode = todo.getIdentityCode(); + try { + return locks.get(identityCode, () -> identityCode); + } catch (ExecutionException e) { + log.warn("getTodoLock error, todoIdentityCode={}", identityCode, e); + throw new RuntimeException("Should never happen!"); + } + } + + @Setter + @Getter + private static class TodoCardUpdateStateRequest extends CardUpdateStateRequest { + private TodoBusiness todoBusiness; + private Todo todo; + } + + @EqualsAndHashCode + @RequiredArgsConstructor + private static class TodoCardState { + private final Boolean isTodoCompleted; + private final BizFinalStateEnum bizFinalState; + + static TodoCardState create(TodoBusiness business, Todo todo) { + return new TodoCardState( + todo.getState() == PendingMessageStateEnum.COMPLETED, + business.getBizFinalState()); + } + } + } \ No newline at end of file From afa28b0503ab5c2425b86cb98a3083c713843bea Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 20:01:31 +0800 Subject: [PATCH 066/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/card/CardParser.java | 9 +++++++-- .../cn/axzo/msg/center/service/domain/UrlConfig.java | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) 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 d9b22dab..448377b1 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 @@ -16,6 +16,7 @@ import cn.axzo.msg.center.service.enums.CardState; import cn.axzo.msg.center.service.enums.KVContentType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; +import cn.axzo.msg.center.service.enums.WebPageOpenStrategy; import cn.axzo.msg.center.service.pending.card.domain.CardButtonStates; import cn.axzo.msg.center.service.pending.card.domain.CardElementConfig; import cn.axzo.msg.center.service.pending.request.CardContent; @@ -162,8 +163,12 @@ class CardParser { imButton.setExecutorShow(buttonInterceptor.isExecutorShow(button).orElse(button.getExecutorShow())); imButton.setActionPerformed(isActionPerformed); boolean isSystemButton = button.getSource() == RouterButtonSourceEnum.SYSTEM; - if (button.getUrlConfig().hasUrl()) - imButton.setUrlConfig(button.getUrlConfig()); + if (button.getUrlConfig().hasUrl()) { + UrlConfig copy = button.getUrlConfig().copy(); + imButton.setUrlConfig(copy); + if (isSystemButton) + copy.setWebOpenStrategy(WebPageOpenStrategy.DRAWER); + } imButton.setButtonCode(button.getCode()); imButton.setPresetButtonType(button.getPresetButtonType()); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java index 58dc5cb2..6f7ab0aa 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/domain/UrlConfig.java @@ -132,6 +132,12 @@ public class UrlConfig { getOrCreateAppWorker().setIos(appUrl); } + public void setWebOpenStrategy(WebPageOpenStrategy openStrategy) { + if (pcCms != null) pcCms.setOpenStrategy(openStrategy); + if (pcOms != null) pcOms.setOpenStrategy(openStrategy); + if (pcGaGeneral != null) pcGaGeneral.setOpenStrategy(openStrategy); + } + public UrlConfig copy() { return JSON.parseObject(JSON.toJSONString(this), UrlConfig.class); } From 8a839edde9ed4c4dc10e8358648bb7f8fca0c4a7 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 20:03:32 +0800 Subject: [PATCH 067/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/controller/WorkflowButtonSyncClientController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java index 36e524c8..d9f826ee 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java @@ -8,6 +8,7 @@ import cn.axzo.msg.center.service.domain.UrlConfig; import cn.axzo.msg.center.service.enums.MessageCategoryEnum; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; +import cn.axzo.msg.center.service.enums.WebPageOpenStrategy; import cn.axzo.msg.center.service.pending.client.WorkflowButtonSyncClient; import cn.axzo.msg.center.service.pending.request.WorkflowSyncButtonsRequest; import cn.axzo.msg.center.service.pending.request.WorkflowSyncButtonsRequest.WorkflowButton; @@ -96,6 +97,7 @@ public class WorkflowButtonSyncClientController implements WorkflowButtonSyncCli if (button.getCategory() == RouterCategoryEnum.JUMP) { UrlConfig urlConfig = new UrlConfig(); urlConfig.setDefaultUrl(workflowButton.getUrl()); + urlConfig.setWebOpenStrategy(WebPageOpenStrategy.DRAWER); update.setUrlConfig(urlConfig); update.setApiUrl(""); } else { From c429911f427aca3147c2eaf56d6dcde4dd78bed9 Mon Sep 17 00:00:00 2001 From: yanglin Date: Wed, 15 Jan 2025 20:04:56 +0800 Subject: [PATCH 068/111] =?UTF-8?q?REQ-3502:=20=E6=8C=89=E9=92=AE=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/card/CardParser.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) 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 448377b1..d9b22dab 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 @@ -16,7 +16,6 @@ import cn.axzo.msg.center.service.enums.CardState; import cn.axzo.msg.center.service.enums.KVContentType; import cn.axzo.msg.center.service.enums.RouterButtonSourceEnum; import cn.axzo.msg.center.service.enums.RouterCategoryEnum; -import cn.axzo.msg.center.service.enums.WebPageOpenStrategy; import cn.axzo.msg.center.service.pending.card.domain.CardButtonStates; import cn.axzo.msg.center.service.pending.card.domain.CardElementConfig; import cn.axzo.msg.center.service.pending.request.CardContent; @@ -163,12 +162,8 @@ class CardParser { imButton.setExecutorShow(buttonInterceptor.isExecutorShow(button).orElse(button.getExecutorShow())); imButton.setActionPerformed(isActionPerformed); boolean isSystemButton = button.getSource() == RouterButtonSourceEnum.SYSTEM; - if (button.getUrlConfig().hasUrl()) { - UrlConfig copy = button.getUrlConfig().copy(); - imButton.setUrlConfig(copy); - if (isSystemButton) - copy.setWebOpenStrategy(WebPageOpenStrategy.DRAWER); - } + if (button.getUrlConfig().hasUrl()) + imButton.setUrlConfig(button.getUrlConfig()); imButton.setButtonCode(button.getCode()); imButton.setPresetButtonType(button.getPresetButtonType()); From b805ed8137c225c64c6615a062a0974ddd71f83c Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 09:36:56 +0800 Subject: [PATCH 069/111] =?UTF-8?q?REQ-3502:=20=E5=87=8F=E5=B0=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8D=A1=E7=89=87=E7=9A=84=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/todo/card/TodoSyncCardService.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 05ec05b6..f5bf96f9 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 @@ -174,7 +174,7 @@ public class TodoSyncCardService implements ApplicationListener } private void updateCardState(Event event, TodoUpdateMessage message, TodoBusiness business, Todo todo) { - synchronized (getTodoLock(todo)) { + synchronized (getLock(todo)) { TodoCardState lastState = todoStates.getIfPresent(todo.getId()); if (lastState != null && lastState.equals(TodoCardState.create(business, todo))) { log.info("updateCardState: no change, todo={}", todo); @@ -296,12 +296,14 @@ public class TodoSyncCardService implements ApplicationListener Todo todo = ((TodoCardUpdateStateRequest) event.getSource()).getTodo(); TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); if (business == null) return; - synchronized (getTodoLock(todo)) { - todoStates.put(todo.getId(), TodoCardState.create(business, todo)); + synchronized (getLock(todo)) { + TodoCardState state = TodoCardState.create(business, todo); + if (state.isTodoCompleted) + todoStates.put(todo.getId(), state); } } - private Object getTodoLock(Todo todo) { + private Object getLock(Todo todo) { String identityCode = todo.getIdentityCode(); try { return locks.get(identityCode, () -> identityCode); @@ -321,7 +323,7 @@ public class TodoSyncCardService implements ApplicationListener @EqualsAndHashCode @RequiredArgsConstructor private static class TodoCardState { - private final Boolean isTodoCompleted; + private final boolean isTodoCompleted; private final BizFinalStateEnum bizFinalState; static TodoCardState create(TodoBusiness business, Todo todo) { From 59f097249b59c7846485a86f8b67d1c9a4a5d4d4 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 10:30:07 +0800 Subject: [PATCH 070/111] =?UTF-8?q?REQ-3502:=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/card/TodoSyncCardService.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 f5bf96f9..4d1b1f8a 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 @@ -174,16 +174,16 @@ public class TodoSyncCardService implements ApplicationListener } private void updateCardState(Event event, TodoUpdateMessage message, TodoBusiness business, Todo todo) { - synchronized (getLock(todo)) { - TodoCardState lastState = todoStates.getIfPresent(todo.getId()); - if (lastState != null && lastState.equals(TodoCardState.create(business, todo))) { - log.info("updateCardState: no change, todo={}", todo); - TodoRequestContext ctx = TodoRequestContext.create("updateCardState:ignore", message) - .addLogContent("todoState", lastState); - todoLogger.logTodoUpdated(ctx, todo); - return; - } - } + //synchronized (getLock(todo)) { + // TodoCardState lastState = todoStates.getIfPresent(todo.getId()); + // if (lastState != null && lastState.equals(TodoCardState.create(business, todo))) { + // log.info("updateCardState: no change, todo={}", todo); + // TodoRequestContext ctx = TodoRequestContext.create("updateCardState:ignore", message) + // .addLogContent("todoState", lastState); + // todoLogger.logTodoUpdated(ctx, todo); + // return; + // } + //} TodoCardUpdateStateRequest request = new TodoCardUpdateStateRequest(); request.setTodo(todo); From f037117c3a528be166b095016f19582e136b6382 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 10:39:24 +0800 Subject: [PATCH 071/111] =?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 | 12 --- .../service/card/event/CardUpdateEvent.java | 20 ----- .../todo/card/TodoSyncCardService.java | 74 +------------------ 3 files changed, 3 insertions(+), 103 deletions(-) delete mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.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 e7bc0e90..ac2e3882 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 @@ -17,7 +17,6 @@ import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO; import cn.axzo.msg.center.message.service.card.broadcast.CardBroadcaster; import cn.axzo.msg.center.message.service.card.domain.CardGroup; import cn.axzo.msg.center.message.service.card.domain.CardSendModel; -import cn.axzo.msg.center.message.service.card.event.CardUpdateEvent; import cn.axzo.msg.center.message.service.card.log.CardLogger; import cn.axzo.msg.center.message.service.card.log.CardLoggers; import cn.axzo.msg.center.message.service.replay.RequestInfo; @@ -44,10 +43,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -import org.springframework.transaction.support.TransactionSynchronization; -import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; import java.util.ArrayList; @@ -76,7 +72,6 @@ public class CardManager { private final CardBroadcaster cardBroadcaster; private final CardProps cardProps; private final RequestReplayService requestReplayService; - private final ApplicationContext applicationContext; private final ExecutorService executor = new ThreadPoolExecutor( 5, 15, 5L, TimeUnit.MINUTES, @@ -325,13 +320,6 @@ public class CardManager { updateCardLogger.reloadAndLogCards(String.format("%s:enqueue", operation)); CardManager.this.updateMessages(updatedCards); updateCardLogger.reloadAndLogCards(String.format("%s:updateMessage:success", operation)); - TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { - @Override - public void afterCommit() { - for (Card card : cardDao.reloadCards(cards)) - applicationContext.publishEvent(new CardUpdateEvent(requestContext.getRequest(), card)); - } - }); return UpdateStateResult.UPDATED; }); } catch (Exception e) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.java deleted file mode 100644 index e98e7a91..00000000 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/event/CardUpdateEvent.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.axzo.msg.center.message.service.card.event; - -import cn.axzo.msg.center.domain.entity.Card; -import lombok.Getter; -import org.springframework.context.ApplicationEvent; - -/** - * @author yanglin - */ -@Getter -public class CardUpdateEvent extends ApplicationEvent { - - private final Card reloadedCard; - - public CardUpdateEvent(Object source, Card reloadedCard) { - super(source); - this.reloadedCard = reloadedCard; - } - -} \ 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 4d1b1f8a..1ef165a8 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 @@ -11,7 +11,6 @@ import cn.axzo.msg.center.domain.entity.Todo; import cn.axzo.msg.center.domain.entity.TodoBusiness; import cn.axzo.msg.center.message.service.card.CardExtInfo; import cn.axzo.msg.center.message.service.card.CardManager; -import cn.axzo.msg.center.message.service.card.event.CardUpdateEvent; import cn.axzo.msg.center.message.service.card.exception.CardIdempotentException; import cn.axzo.msg.center.message.service.todo.manage.TodoLogger; import cn.axzo.msg.center.message.service.todo.manage.TodoManager; @@ -28,21 +27,15 @@ 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; import com.alibaba.fastjson.JSONObject; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.google.common.collect.Sets; -import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; /** * @author yanglin @@ -50,7 +43,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @Component @RequiredArgsConstructor -public class TodoSyncCardService implements ApplicationListener { +public class TodoSyncCardService { private static final ThreadLocal TODO_MESSAGE = new ThreadLocal<>(); @@ -68,19 +61,6 @@ public class TodoSyncCardService implements ApplicationListener private final MessageTemplateV3Dao messageTemplateV3Dao; private final TodoManager todoManager; - private final long cacheSize = 1000; - private final long cacheExpireSeconds = 10; - private final Cache locks = CacheBuilder - .newBuilder() - .maximumSize(cacheSize) - .expireAfterAccess(cacheExpireSeconds, TimeUnit.SECONDS) - .build(); - private final Cache todoStates = CacheBuilder - .newBuilder() - .maximumSize(cacheSize) - .expireAfterAccess(cacheExpireSeconds, TimeUnit.SECONDS) - .build(); - void onMessage(Event event, TodoUpdateMessage message) { log.info("received TodoUpdateMessage: {}", message); try { @@ -129,7 +109,7 @@ public class TodoSyncCardService implements ApplicationListener || todo.getState() == PendingMessageStateEnum.CREATED) sendCard(event, business, todo); else - updateCardState(event, message, business, todo); + updateCardState(event, business, todo); } private void sendCard(Event event, TodoBusiness business, Todo todo) { @@ -173,18 +153,7 @@ public class TodoSyncCardService implements ApplicationListener } } - private void updateCardState(Event event, TodoUpdateMessage message, TodoBusiness business, Todo todo) { - //synchronized (getLock(todo)) { - // TodoCardState lastState = todoStates.getIfPresent(todo.getId()); - // if (lastState != null && lastState.equals(TodoCardState.create(business, todo))) { - // log.info("updateCardState: no change, todo={}", todo); - // TodoRequestContext ctx = TodoRequestContext.create("updateCardState:ignore", message) - // .addLogContent("todoState", lastState); - // todoLogger.logTodoUpdated(ctx, todo); - // return; - // } - //} - + private void updateCardState(Event event, TodoBusiness business, Todo todo) { TodoCardUpdateStateRequest request = new TodoCardUpdateStateRequest(); request.setTodo(todo); request.setTodoBusiness(business); @@ -289,30 +258,6 @@ public class TodoSyncCardService implements ApplicationListener return Optional.ofNullable(identityCode); } - @Override - public void onApplicationEvent(CardUpdateEvent event) { - if (!(event.getSource() instanceof TodoCardUpdateStateRequest)) - return; - Todo todo = ((TodoCardUpdateStateRequest) event.getSource()).getTodo(); - TodoBusiness business = todoBusinessDao.getBusinesses(todo).findBusiness(todo).orElse(null); - if (business == null) return; - synchronized (getLock(todo)) { - TodoCardState state = TodoCardState.create(business, todo); - if (state.isTodoCompleted) - todoStates.put(todo.getId(), state); - } - } - - private Object getLock(Todo todo) { - String identityCode = todo.getIdentityCode(); - try { - return locks.get(identityCode, () -> identityCode); - } catch (ExecutionException e) { - log.warn("getTodoLock error, todoIdentityCode={}", identityCode, e); - throw new RuntimeException("Should never happen!"); - } - } - @Setter @Getter private static class TodoCardUpdateStateRequest extends CardUpdateStateRequest { @@ -320,17 +265,4 @@ public class TodoSyncCardService implements ApplicationListener private Todo todo; } - @EqualsAndHashCode - @RequiredArgsConstructor - private static class TodoCardState { - private final boolean isTodoCompleted; - private final BizFinalStateEnum bizFinalState; - - static TodoCardState create(TodoBusiness business, Todo todo) { - return new TodoCardState( - todo.getState() == PendingMessageStateEnum.COMPLETED, - business.getBizFinalState()); - } - } - } \ No newline at end of file From ccd479a2ee697575ce3c5f43d1713e43c90bbc30 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 11:28:16 +0800 Subject: [PATCH 072/111] =?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) From fecf8b26fc974408995b7004f6401dd0276a1ad8 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 11:31:36 +0800 Subject: [PATCH 073/111] =?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 --- .../todo/card/TodoSyncCardService.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) 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 d8d88cef..b222eb8c 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 @@ -3,7 +3,6 @@ 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; @@ -89,7 +88,7 @@ public class TodoSyncCardService { Todo todo = todoDao.findTodoByCode(message.getUpdatedTodo().getIdentityCode()) .orElse(null); if (todo == null) { - log.warn("todo not found, message={}", message); + log.warn("[sync] todo not found, message={}", message); return; } MessageTemplateV3 template = messageTemplateV3Dao @@ -212,7 +211,7 @@ public class TodoSyncCardService { request.setPresetButtonType(message.getPresetButtonType()); request.setOperatorId(message.getOperatorId()); request.setOperatorName(message.getOperatorName()); - TodoRequestContext ctx = TodoRequestContext.create("syncCardState", message); + TodoRequestContext ctx = TodoRequestContext.create("syncCardPresetButtonPressed", message); try { todoManager.firePresetButtonPressed(request, false); todoLogger.logTodoUpdated(ctx, todo); @@ -224,16 +223,26 @@ public class TodoSyncCardService { void syncTodoPresetButtonPressed(PresetButtonPressedMessage message) { CardUpdatePresetButtonRequest request = new CardUpdatePresetButtonRequest(); request.setAppCode(APP_CODE); - TodoInfo todo = message.getTodoInfo(); + Todo todo = todoDao.findTodoByCode(message.getTodoInfo().getIdentityCode()).orElse(null); + if (todo == null) { + log.warn("[syncTodoPresetButtonPressed] todo not found, message={}", message); + return; + } request.setTemplateCode(todo.getTemplateCode()); request.setBizCode(todo.getTemplateCode()); request.setSubBizCode(todo.getSubBizCode()); request.setReceivers(Sets.newHashSet(PeerPerson.create( - todo.getExecutorPersonId(), todo.getExecutorOuId(), todo.getExecutorWorkspaceId()))); + todo.getExecutorPersonId(), todo.getOuId(), todo.getReceiverWorkspaceId()))); request.setPresetButtonType(message.getPresetButtonType()); request.setOperatorId(0L); request.setOperatorName(""); - cardManager.firePresetButtonPressed(request); + TodoRequestContext ctx = TodoRequestContext.create("syncCardPresetButtonPressed", message); + try { + cardManager.firePresetButtonPressed(request); + todoLogger.logTodoUpdated(ctx, todo); + } catch (Exception e) { + todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); + } } private static CardBizState determineCardBizStateForBizTodo(Todo todo) { From 8b04f358a22888158dc48f2d60c13d1ba1e0636a Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 11:45:49 +0800 Subject: [PATCH 074/111] =?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 --- .../center/message/service/todo/card/TodoSyncCardService.java | 2 +- .../msg/center/message/service/todo/manage/TodoManager.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 b222eb8c..22a8cdc6 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 @@ -110,7 +110,7 @@ public class TodoSyncCardService { if (todo.getState() == PendingMessageStateEnum.HAS_BEEN_SENT || todo.getState() == PendingMessageStateEnum.CREATED) sendCard(event, business, todo); - else + else if (!TodoManager.OP_FIRE_PRESET_BUTTON_PRESSED.equals(message.getOperation())) updateCardState(event, business, todo); } 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 606fae03..a90c3f2e 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 @@ -87,6 +87,8 @@ import static java.util.stream.Collectors.toSet; @RequiredArgsConstructor public class TodoManager { + public static final String OP_FIRE_PRESET_BUTTON_PRESSED = "firePresetButtonPressed"; + private final TodoBusinessDao todoBusinessDao; private final TodoDao todoDao; private final TodoRecordBuilder todoRecordBuilder; @@ -589,7 +591,7 @@ public class TodoManager { Todo todo = todoDao.findTodoByCode(request.getIdentityCode()).orElse(null); if (todo == null) return false; - TodoRequestContext ctx = TodoRequestContext.create("firePresetButtonPressed", request) + TodoRequestContext ctx = TodoRequestContext.create(OP_FIRE_PRESET_BUTTON_PRESSED, request) .addLogContent("presetButtonType", request.getPresetButtonType()); if (!syncCardState) ctx.disableUpdateCard(); From e060dd63b3045d757d57326c07db1d19d8802a28 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 11:48:19 +0800 Subject: [PATCH 075/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardManager.java | 2 ++ 1 file changed, 2 insertions(+) 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 815838ea..5f7588c1 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 @@ -213,6 +213,8 @@ public class CardManager { if (result == UpdateStateResult.UPDATED) { cardBroadcaster.firePresetButtonPressed(executor.updatedCards, request); executor.updateCardLogger.reloadAndLogCards("presetButtonPressed:mq:success"); + } else { + executor.updateCardLogger.reloadAndLogCards("presetButtonPressed:cardNoUpdate"); } return result; } From a2bd3dcc5346970ca85f1f289e1d09d12d4d07a9 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 12:31:02 +0800 Subject: [PATCH 076/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/message/service/todo/card/TodoSyncCardService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 22a8cdc6..2bbad21e 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 @@ -236,7 +236,7 @@ public class TodoSyncCardService { request.setPresetButtonType(message.getPresetButtonType()); request.setOperatorId(0L); request.setOperatorName(""); - TodoRequestContext ctx = TodoRequestContext.create("syncCardPresetButtonPressed", message); + TodoRequestContext ctx = TodoRequestContext.create("syncTodoPresetButtonPressed", message); try { cardManager.firePresetButtonPressed(request); todoLogger.logTodoUpdated(ctx, todo); From f537f17702793f240581eb2108fd12aa70eec176 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 12:37:48 +0800 Subject: [PATCH 077/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/todo/card/TodoSyncCardService.java | 4 ++-- .../message/service/todo/card/TodoSyncCardServiceTest.java | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) 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 2bbad21e..4487eeb5 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 @@ -221,13 +221,13 @@ public class TodoSyncCardService { } void syncTodoPresetButtonPressed(PresetButtonPressedMessage message) { - CardUpdatePresetButtonRequest request = new CardUpdatePresetButtonRequest(); - request.setAppCode(APP_CODE); Todo todo = todoDao.findTodoByCode(message.getTodoInfo().getIdentityCode()).orElse(null); if (todo == null) { log.warn("[syncTodoPresetButtonPressed] todo not found, message={}", message); return; } + CardUpdatePresetButtonRequest request = new CardUpdatePresetButtonRequest(); + request.setAppCode(APP_CODE); request.setTemplateCode(todo.getTemplateCode()); request.setBizCode(todo.getTemplateCode()); request.setSubBizCode(todo.getSubBizCode()); diff --git a/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java index b47c0acb..730f43f7 100644 --- a/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java +++ b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java @@ -2,6 +2,7 @@ package cn.axzo.msg.center.message.service.todo.card; import cn.axzo.framework.rocketmq.Event; import cn.axzo.msg.center.MsgCenterApplication; +import cn.axzo.msg.center.api.mq.PresetButtonPressedMessage; import cn.axzo.msg.center.api.mq.TodoUpdateMessage; import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; @@ -21,9 +22,9 @@ class TodoSyncCardServiceTest { @Test void exec() { - String json = "{\"messageId\": \"d6b3b687-6ab9-416e-9836-6245d9043125\", \"messageSendTime\": 1736926166387, \"messageSendTimeStr\": \"2025-01-15 15:29:26\", \"operation\": \"send\", \"updateCard\": true, \"updatedTodo\": {\"bizCategory\": \"FLOW\", \"bizCode\": \"202501151529100000000\", \"bizDesc\": \"审批节点\", \"bizExtParam\": {\"[_BIZ_NODE_ALTER_]node_065414499288\": {\"activityId\": \"node_065414499288\", \"processInstanceId\": \"202501151529100000000\", \"retries\": 2}, \"[_INTERNAL_INITIATOR_]\": {\"assignerName\": \"杨期成\", \"ouId\": \"10401\", \"tenantId\": \"4949\", \"personId\": \"9000400630\", \"assignee\": \"1229802\", \"assigneeType\": \"3\", \"avatar\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\"}, \"businessName\": \"工作流开发测试项目业务\", \"initiatorUserName\": \"杨期成\", \"[_INTERNAL_PROCESS_AGENT]\": true, \"activityId\": \"node_065414499288\", \"processStartTime\": \"2025-01-15 15:29:25\", \"assigneeName\": \"10400|9000400630\", \"processInstanceId\": \"202501151529100000000\", \"nrOfActiveInstances\": 1, \"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\": 2, \"activityName\": \"审批节点\", \"processResult\": \"审批中\", \"[_CREATE_INSTANCE_PARAMS]\": \"{\\\"processDefinitionKey\\\":\\\"wfTestProj\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"variables\\\":{\\\"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\\\":2,\\\"[_INTERNAL_INITIATOR_]\\\":\\\"{\\\\\\\"assignee\\\\\\\":\\\\\\\"1229802\\\\\\\",\\\\\\\"assigneeType\\\\\\\":\\\\\\\"3\\\\\\\",\\\\\\\"assignerName\\\\\\\":\\\\\\\"杨期成\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\\\\\",\\\\\\\"ouId\\\\\\\":\\\\\\\"10401\\\\\\\",\\\\\\\"personId\\\\\\\":\\\\\\\"9000400630\\\\\\\",\\\\\\\"tenantId\\\\\\\":\\\\\\\"4949\\\\\\\"}\\\",\\\"[_BIZ_ORG_RELATION_]\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"[_WORKFLOW_ENGINE_VERSION_]\\\":\\\"1.5.1\\\",\\\"[_PENDING_VARIABLES]\\\":{},\\\"[_INTERNAL_PROCESS_AGENT]\\\":true},\\\"pendingVariables\\\":{},\\\"cooperationOrg\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"businessKey\\\":\\\"40\\\",\\\"initiator\\\":{\\\"assignee\\\":\\\"1229802\\\",\\\"assigneeType\\\":\\\"3\\\",\\\"assignerName\\\":\\\"杨期成\\\",\\\"personId\\\":\\\"9000400630\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"ouId\\\":\\\"10401\\\",\\\"avatar\\\":\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\"},\\\"async\\\":false,\\\"startFormVariables\\\":{}}\", \"taskStartTime\": \"2025-01-15 15:29:25\", \"taskUserName\": \"杨期成\", \"[_WORKFLOW_ENGINE_VERSION_]\": \"1.5.1\", \"tenantId\": \"4949\", \"businessKey\": \"40\", \"operatorType\": \"\", \"taskId\": \"202501151529100000049\", \"[_PENDING_VARIABLES]\": {}, \"processInstanceName\": \"工作流业务测试项目流程\", \"nrOfCompletedInstances\": 0}, \"bizFinalState\": null, \"bizFlag\": \"\", \"content\": \"你好\", \"deadline\": null, \"executorId\": 0, \"executorName\": \"杨期成\", \"executorOuId\": 10400, \"executorPersonId\": 9000400630, \"executorType\": \"NOT_SUPPORT\", \"executorWorkspaceId\": 4946, \"executorWorkspaceName\": \"成都建工第七建筑工程有限公司\", \"identityCode\": \"fccb21474a4645edb907e9a9828c3d46\", \"orgType\": \"ENT\", \"promoterId\": 0, \"promoterName\": \"杨期成\", \"promoterOuId\": 10401, \"promoterPersonId\": 9000400630, \"promoterType\": \"NOT_SUPPORT\", \"promoterWorkspaceId\": 4949, \"promoterWorkspaceName\": \"核西南院设计有限公司\", \"requestNo\": \"1a9c93f122824f648763bd311c2f3118\", \"routerParams\": {\"processNodeCode\": \"node_065414499288\", \"processInstanceId\": \"202501151529100000000\", \"creator\": \"杨期成\", \"userAgreeSignature\": true, \"businessTypeName\": \"审批节点\", \"businessKey\": \"40\", \"tenantId\": \"4946\", \"startTime\": \"2025-01-15 15:29:25\", \"title\": \"工作流业务测试项目流程\", \"taskId\": \"202501151529100000049\", \"processNodeName\": \"审批节点\"}, \"srcTemplateCode\": \"a7c79c432efc4ecba71790677d35cc59\", \"state\": \"HAS_BEEN_SENT\", \"subBizCode\": \"202501151529100000049\", \"templateCode\": \"a7c79c432efc4ecba71790677d35cc59\", \"title\": \"你好\", \"todoBusinessId\": 146907, \"todoId\": 843354, \"type\": \"EXECUTABLE\"}}"; - TodoUpdateMessage message = JSON.parseObject(json, TodoUpdateMessage.class); - todoSyncCardService.onMessage(new Event(), message); + String json = "{\"btnPressedRequestNo\": \"437fb871912e4f2f8d7c5d7969164061\", \"messageId\": \"ec98f521-e6a0-4330-a650-245bad478853\", \"messageSendTime\": 1737001768749, \"messageSendTimeStr\": \"2025-01-16 12:29:28\", \"presetButtonType\": \"AGREE\", \"todoInfo\": {\"bizCategory\": \"OTHER\", \"bizCode\": \"test-17\", \"bizDesc\": \"\", \"bizExtParam\": {\"assistLogName\": \"测试\"}, \"bizFinalState\": null, \"bizFlag\": \"\", \"content\": \"系统提示,无需关注\", \"deadline\": null, \"executorId\": 0, \"executorName\": \"test\", \"executorOuId\": 10616, \"executorPersonId\": 9000399522, \"executorType\": \"NOT_SUPPORT\", \"executorWorkspaceId\": 0, \"executorWorkspaceName\": \"\", \"identityCode\": \"68d6f7d480b44891a65d07e482d848e9\", \"orgType\": \"UNKNOWN\", \"promoterId\": 0, \"promoterName\": \"杨林\", \"promoterOuId\": 0, \"promoterPersonId\": 6678911, \"promoterType\": \"NOT_SUPPORT\", \"promoterWorkspaceId\": 0, \"promoterWorkspaceName\": \"\", \"requestNo\": \"c0fef3f2dc7d4264b33d3aafa1906636\", \"routerParams\": {}, \"srcTemplateCode\": \"7aceab1f31ec4570a98cdaf7f8940c61\", \"state\": \"HAS_BEEN_SENT\", \"subBizCode\": \"aaaa\", \"templateCode\": \"7aceab1f31ec4570a98cdaf7f8940c61\", \"title\": \"系统提示\", \"todoBusinessId\": 147049, \"todoId\": 843602, \"type\": \"EXECUTABLE\"}}"; + PresetButtonPressedMessage message = JSON.parseObject(json, PresetButtonPressedMessage.class); + todoSyncCardService.syncTodoPresetButtonPressed(message); } } \ No newline at end of file From b5ff85d6d337394d2274cd76e1228130eb45ace2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 12:41:55 +0800 Subject: [PATCH 078/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/card/TodoSyncCardService.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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 4487eeb5..efc78d46 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 @@ -192,18 +192,18 @@ public class TodoSyncCardService { void syncCardPresetButtonPressed(CardPresetButtonPressedMessage message) { log.info("onCardPresetButtonPressed: {}", message); if (!APP_CODE.equals(message.getCardInfo().getAppCode())) { - log.info("onCardPresetButtonPressed: not msg-center:todo, message={}", message); + log.info("[syncCardPresetButtonPressed] onCardPresetButtonPressed: not msg-center:todo, message={}", message); return; } String identityCode = new CardExtInfo(message.getCardInfo().determineBizParam()) .getJsonObject().getString(TODO_IDENTITY_CODE_BIZ_PARAM_KEY); if (StringUtils.isBlank(identityCode)) { - log.warn("onCardPresetButtonPressed: identityCode is blank, message={}", message); + log.warn("[syncCardPresetButtonPressed] onCardPresetButtonPressed: identityCode is blank, message={}", message); return; } Todo todo = todoDao.findTodoByCode(identityCode).orElse(null); if (todo == null) { - log.info("onCardPresetButtonPressed: todo not found, message={}", message); + log.info("[syncCardPresetButtonPressed] onCardPresetButtonPressed: todo not found, message={}", message); return; } PresetButtonPressedRequest request = new PresetButtonPressedRequest(); @@ -226,10 +226,21 @@ public class TodoSyncCardService { log.warn("[syncTodoPresetButtonPressed] todo not found, message={}", message); return; } + MessageTemplateV3 template = messageTemplateV3Dao + .findByCode(todo.getTemplateCode()) + .orElse(null); + if (template == null) { + log.warn("[syncTodoPresetButtonPressed] template not found, message={}", message); + return; + } + if (!template.determineChannels().contains(MessageChannel.IM)) { + log.warn("[syncTodoPresetButtonPressed] template not support IM, message={}", message); + return; + } CardUpdatePresetButtonRequest request = new CardUpdatePresetButtonRequest(); request.setAppCode(APP_CODE); request.setTemplateCode(todo.getTemplateCode()); - request.setBizCode(todo.getTemplateCode()); + request.setBizCode(todo.getBizCode()); request.setSubBizCode(todo.getSubBizCode()); request.setReceivers(Sets.newHashSet(PeerPerson.create( todo.getExecutorPersonId(), todo.getOuId(), todo.getReceiverWorkspaceId()))); From 33dc7dfa93955f166352b673d41a3229477e1d7a Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 12:45:44 +0800 Subject: [PATCH 079/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/message/service/todo/card/TodoSyncCardService.java | 2 ++ 1 file changed, 2 insertions(+) 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 efc78d46..df3a3561 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 @@ -216,6 +216,7 @@ public class TodoSyncCardService { todoManager.firePresetButtonPressed(request, false); todoLogger.logTodoUpdated(ctx, todo); } catch (Exception e) { + log.warn("[syncCardPresetButtonPressed] onCardPresetButtonPressed: error, message={}", message, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); } } @@ -252,6 +253,7 @@ public class TodoSyncCardService { cardManager.firePresetButtonPressed(request); todoLogger.logTodoUpdated(ctx, todo); } catch (Exception e) { + log.warn("[syncTodoPresetButtonPressed] error, message={}", message, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); } } From fcc98a2ea7a33599cd93e7e595ca12559fa8edcf Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 13:28:09 +0800 Subject: [PATCH 080/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/service/card/broadcast/CardBroadcaster.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java index 7dfc7c30..b5b81a04 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java @@ -9,6 +9,7 @@ import cn.axzo.msg.center.mq.MqMessageRecord; import cn.axzo.msg.center.mq.MqProducer; import cn.axzo.msg.center.service.enums.MqMessageType; import cn.axzo.msg.center.service.pending.request.CardPresetButtonRequest; +import cn.axzo.msg.center.service.util.IdBuilder; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -33,9 +34,13 @@ public class CardBroadcaster { message.setCardInfo(BeanMapper.copyBean(card, CardInfo.class)); mqProducer.send(MqMessageRecord .builder(MqMessageType.CARD_PRESET_BUTTON_PRESSED, message) - .messageKey(card.getId()) + .messageKey(card.getIdentityCode()) .operatorId(request.getOperatorId()) - .shardingKey(card.getTemplateCode()) + .shardingKey(IdBuilder.builder() + .append(card.getTemplateCode()) + .append(card.getBizCode()) + .append(card.getSubBizCode()) + .build()) .build()); } } From 2b8a677fb16348e31b4d20278fc55cb8be25db20 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 13:31:08 +0800 Subject: [PATCH 081/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardManager.java | 3 --- 1 file changed, 3 deletions(-) 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 5f7588c1..a27a4ec6 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 @@ -260,9 +260,6 @@ public class CardManager { BizAssertions.assertTrue(cardTemplate.isUpdatable(), "模板不支持更新, templateCode={}", card.getTemplateCode()); GeneralMessagePushVO cardContent = cardParser.parseCardContent(cardTemplate, card); - // 保留原来的title和content, 避免模版变了但缺少bizParam导致数据不完整 - cardContent.setCardTitle(card.getTitle()); - cardContent.setCardContent(card.getContent()); cardContent.addDebugInfo("bizCode", card.getBizCode()); cardContent.addDebugInfo("subBizCode", card.getSubBizCode()); update.setCardContent(cardContent); From c14b9df0ab9bd5aa1c2966b1a4c0273689490fec Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 14:20:40 +0800 Subject: [PATCH 082/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../card/workflow/WorkflowTodoCardButtonInterceptor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java index eb63db65..6e2894ac 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/workflow/WorkflowTodoCardButtonInterceptor.java @@ -31,10 +31,10 @@ import static java.util.stream.Collectors.toSet; class WorkflowTodoCardButtonInterceptor implements CardButtonInterceptor { private final static Set SYSTEM_BUTTONS_SENDER_SHOW = Sets.newHashSet( - BizFinalStateEnum.RETRACT.getCode()); + BizFinalStateEnum.RETRACT.getButtonCode()); private final static Set SYSTEM_BUTTONS_EXECUTOR_SHOW = Sets.newHashSet( - BizFinalStateEnum.PASSED.getCode(), - BizFinalStateEnum.REJECTED.getCode()); + BizFinalStateEnum.PASSED.getButtonCode(), + BizFinalStateEnum.REJECTED.getButtonCode()); private final Todo todo; private final BpmnTaskButtonVo taskInfo; From 53ff325af813a6eadb31c5105895c8bb99608737 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 14:42:49 +0800 Subject: [PATCH 083/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 18d4f9a1..1478aa15 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ 11.8 26.0.0 1.0.0-SNAPSHOT - 1.5.1-SNAPSHOT + 1.5.2-SNAPSHOT From 38ba80f859da751ee88a9c672070d7fdbf9cadb2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 15:59:43 +0800 Subject: [PATCH 084/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../message/controller/WorkflowButtonSyncClientController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java index d9f826ee..455a4a90 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/WorkflowButtonSyncClientController.java @@ -104,6 +104,7 @@ public class WorkflowButtonSyncClientController implements WorkflowButtonSyncCli String apiUrl = workflowButton.getUrl(); if (apiUrl == null) apiUrl = ""; update.setApiUrl(apiUrl); + update.setUrlConfig(new UrlConfig()); } messageTemplateButtonV3Dao.updateById(update); } From 4262c825d09cb99c1db56c607473aa4d98ec5c28 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 16:13:47 +0800 Subject: [PATCH 085/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/vo/GeneralMessagePushVO.java | 6 ++++ .../message/service/card/CardParser.java | 2 ++ .../service/pending/request/CardContent.java | 4 +++ .../message/service/card/CardManagerTest.java | 29 +++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java index 290f6ae0..fbc0fb88 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/domain/vo/GeneralMessagePushVO.java @@ -90,6 +90,12 @@ public class GeneralMessagePushVO implements Serializable { * 业务编码 */ private String bizCode; + + /** + * 子业务编码 + */ + private String subBizCode; + /** * 消息发送时间戳 */ 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 d9b22dab..5fb38600 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 @@ -69,6 +69,8 @@ class CardParser { super.addDebugInfo(name, value); } }; + bizBody.setBizCode(card.getBizCode()); + bizBody.setSubBizCode(card.getSubBizCode()); bizBody.setCardStyleCode(template.getCardStyleCode()); bizBody.setTemplateCode(template.getCode()); bizBody.setCardBannerUrl(template.getIcon()); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardContent.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardContent.java index 1f2c2aaf..2cde4294 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardContent.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/request/CardContent.java @@ -11,6 +11,10 @@ import java.util.List; */ public interface CardContent { + String getBizCode(); + + String getSubBizCode(); + String getTemplateCode(); CardStateInfo getStateInfo(); diff --git a/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java b/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java new file mode 100644 index 00000000..f7c457c9 --- /dev/null +++ b/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java @@ -0,0 +1,29 @@ +package cn.axzo.msg.center.message.service.card; + +import cn.axzo.msg.center.MsgCenterApplication; +import cn.axzo.msg.center.dal.CardDao; +import cn.axzo.msg.center.message.domain.dto.TemplateModelV3; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * @author yanglin + */ +@SpringBootTest(classes = MsgCenterApplication.class) +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class CardManagerTest { + + private final CardManager cardManager; + private final CardSupport cardSupport; + private final CardDao cardDao; + + @Test + void rebuildCardContent() { + TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent("a7c79c432efc4ecba71790677d35cc59"); + } + +} \ No newline at end of file From 486892cbf82ea23f5f25717ef6857f001c6b1ffa Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 16:28:50 +0800 Subject: [PATCH 086/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/card/CardManager.java | 2 +- .../service/impl/v3/NativeAppLinkUrlConfigVisitor.java | 7 ++++++- .../msg/center/message/service/card/CardManagerTest.java | 7 ++++++- 3 files changed, 13 insertions(+), 3 deletions(-) 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 a27a4ec6..d5562a19 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 @@ -250,7 +250,7 @@ public class CardManager { })); } - private void rebuildCardContent(TemplateModelV3 templateModel, List cards) { + void rebuildCardContent(TemplateModelV3 templateModel, List cards) { ArrayList updates = new ArrayList<>(); for (Card card : cardDao.reloadCards(cards)) { Card update = new Card(); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/v3/NativeAppLinkUrlConfigVisitor.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/v3/NativeAppLinkUrlConfigVisitor.java index 7e2fa681..a81b6f73 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/v3/NativeAppLinkUrlConfigVisitor.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/v3/NativeAppLinkUrlConfigVisitor.java @@ -6,7 +6,9 @@ import cn.axzo.msg.center.service.enums.TerminalTypeEnum; import lombok.Getter; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * @author yanglin @@ -15,6 +17,7 @@ import java.util.List; public class NativeAppLinkUrlConfigVisitor implements UrlConfigVisitor { private final List links = new ArrayList<>(); + private final Set terminals = new HashSet<>(); @Override public void visitAppManagerAndroid(AppUrl android) { @@ -41,7 +44,9 @@ public class NativeAppLinkUrlConfigVisitor implements UrlConfigVisitor { } private void addLink(AppLink link) { - if (!links.contains(link)) + if (!terminals.contains(link.getPlatform())) { links.add(link); + terminals.add(link.getPlatform()); + } } } \ No newline at end of file diff --git a/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java b/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java index f7c457c9..2e138c1f 100644 --- a/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java +++ b/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java @@ -1,14 +1,16 @@ package cn.axzo.msg.center.message.service.card; import cn.axzo.msg.center.MsgCenterApplication; +import cn.axzo.msg.center.common.utils.BizAssertions; import cn.axzo.msg.center.dal.CardDao; +import cn.axzo.msg.center.domain.entity.Card; import cn.axzo.msg.center.message.domain.dto.TemplateModelV3; import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import static org.junit.jupiter.api.Assertions.*; +import java.util.Collections; /** * @author yanglin @@ -24,6 +26,9 @@ class CardManagerTest { @Test void rebuildCardContent() { TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent("a7c79c432efc4ecba71790677d35cc59"); + Card card = cardDao.findCardByBizMessageId("e4b81f64cd854e3e92a6cad8f1546760").orElse(null); + BizAssertions.assertNotNull(card, "card not found"); + cardManager.rebuildCardContent(templateModel, Collections.singletonList(card)); } } \ No newline at end of file From 08b92c7da8c8f9fa5ce038ae089fa15cf88f5171 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 16:55:45 +0800 Subject: [PATCH 087/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardParser.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 5fb38600..9e7b9f45 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 @@ -151,7 +151,10 @@ class CardParser { if (bizBody.getCardButtons() == null) bizBody.setCardButtons(new ArrayList<>()); CardButton imButton = new CardButton(); - bizBody.getCardButtons().add(imButton); + + // IM最多显示3个, 可能会存在仅发起人可见的按钮1个, 3 + 1 = 4 + if (bizBody.getCardButtons().size() < 4) + bizBody.getCardButtons().add(imButton); String actionPerformed = buttonInterceptor .getActionPerformedName(button) From 76c8eb2bc32a8952ebf7f1abd5ecb5962cf4daf2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 16:57:24 +0800 Subject: [PATCH 088/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardParser.java | 3 +-- .../cn/axzo/msg/center/message/service/card/CardProps.java | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) 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 9e7b9f45..91e6ae0e 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 @@ -152,8 +152,7 @@ class CardParser { bizBody.setCardButtons(new ArrayList<>()); CardButton imButton = new CardButton(); - // IM最多显示3个, 可能会存在仅发起人可见的按钮1个, 3 + 1 = 4 - if (bizBody.getCardButtons().size() < 4) + if (bizBody.getCardButtons().size() < cardProps.getMaxSendingCardButtonsCount()) bizBody.getCardButtons().add(imButton); String actionPerformed = buttonInterceptor diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java index 2b29ee84..d6b56809 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/CardProps.java @@ -22,6 +22,8 @@ public class CardProps { private boolean deleteCardsWhenSendFail = true; private boolean enableCardIdempotent = true; private int updateCardBatchSize = 200; + // IM最多显示3个, 可能会存在仅发起人可见的按钮1个, 3 + 1 = 4, 避免消息超长 + private int maxSendingCardButtonsCount = 4; private Set idempotentFreeTemplateCodes = new HashSet<>(); boolean isIdempotentFree(String templateCode) { From 634d62ef800c34a015bdf21e4e2552814aae69cb Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 17:09:59 +0800 Subject: [PATCH 089/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardParser.java | 4 ++++ 1 file changed, 4 insertions(+) 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 91e6ae0e..473e36c8 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 @@ -130,6 +130,10 @@ class CardParser { */ @Override public void visitButton(ParsedButtonV3 button) { + if (bizBody.getCardButtons() != null + && bizBody.getCardButtons().size() >= cardProps.getMaxSendingCardButtonsCount()) + return; + Boolean isVisibleOnCard = buttonInterceptor .isVisibleOnCard(button) .orElse(() -> button.getStyles().contains(ButtonStyleEnum.OVER_CARD)); From 89a632ba30a1e9d18b87d32fb6c6b3fbd93799c1 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 17:10:37 +0800 Subject: [PATCH 090/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardParser.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 473e36c8..e7fd68fb 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 @@ -155,9 +155,7 @@ class CardParser { if (bizBody.getCardButtons() == null) bizBody.setCardButtons(new ArrayList<>()); CardButton imButton = new CardButton(); - - if (bizBody.getCardButtons().size() < cardProps.getMaxSendingCardButtonsCount()) - bizBody.getCardButtons().add(imButton); + bizBody.getCardButtons().add(imButton); String actionPerformed = buttonInterceptor .getActionPerformedName(button) From 4ef3dd335dfa0b254837bef661c3a3a534ad545b Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 17:47:41 +0800 Subject: [PATCH 091/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/msg/center/message/service/todo/manage/TodoManager.java | 1 - 1 file changed, 1 deletion(-) 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 a90c3f2e..f59563e5 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 @@ -600,7 +600,6 @@ public class TodoManager { .set(Todo::getState, PendingMessageStateEnum.COMPLETED)); if (advanceResult.isAdvanced()) { sendMqMessageOnPresetButtonPressed(ctx, request, todo); - todoLogger.logTodoUpdated(ctx, todo); todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); } return advanceResult.isAdvanced(); From 53e47d3ee48db8ca2c50d076ad7a2541dc00c460 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 17:48:08 +0800 Subject: [PATCH 092/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msg/center/message/service/todo/manage/TodoManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 f59563e5..21abbae2 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 @@ -592,7 +592,8 @@ public class TodoManager { if (todo == null) return false; TodoRequestContext ctx = TodoRequestContext.create(OP_FIRE_PRESET_BUTTON_PRESSED, request) - .addLogContent("presetButtonType", request.getPresetButtonType()); + .addLogContent("presetButtonType", request.getPresetButtonType()) + .addLogContent("syncCardState", syncCardState); if (!syncCardState) ctx.disableUpdateCard(); StateAdvanceResult advanceResult = advanceState(ctx, execAdvanceBuilder() From 19a41ff6a732a657155b55b699eeffa1cd8fb323 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 17:52:58 +0800 Subject: [PATCH 093/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msg/center/message/service/card/CardManager.java | 10 +++++++--- .../message/service/todo/card/TodoSyncCardService.java | 8 ++++---- 2 files changed, 11 insertions(+), 7 deletions(-) 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 d5562a19..8f7fa840 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 @@ -191,11 +191,15 @@ public class CardManager { "卡片已是终状态, 无法'{}'", request.getPresetButtonType().getDesc()); } - public void firePresetButtonPressed(CardUpdatePresetButtonRequest request) { + public boolean firePresetButtonPressed(CardUpdatePresetButtonRequest request) { TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent(request.getTemplateCode()); CardRequestContext requestContext = CardRequestContext.create(request); - for (List cards : cardsCursor(request)) - firePresetButtonPressedImpl(request, requestContext, templateModel, cards); + boolean updated = false; + for (List cards : cardsCursor(request)) { + UpdateStateResult result = firePresetButtonPressedImpl(request, requestContext, templateModel, cards); + updated = updated || result == UpdateStateResult.UPDATED; + } + return updated; } private UpdateStateResult firePresetButtonPressedImpl( 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 df3a3561..61984e44 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 @@ -213,8 +213,8 @@ public class TodoSyncCardService { request.setOperatorName(message.getOperatorName()); TodoRequestContext ctx = TodoRequestContext.create("syncCardPresetButtonPressed", message); try { - todoManager.firePresetButtonPressed(request, false); - todoLogger.logTodoUpdated(ctx, todo); + if (todoManager.firePresetButtonPressed(request, false)) + todoLogger.logTodoUpdated(ctx, todo); } catch (Exception e) { log.warn("[syncCardPresetButtonPressed] onCardPresetButtonPressed: error, message={}", message, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); @@ -250,8 +250,8 @@ public class TodoSyncCardService { request.setOperatorName(""); TodoRequestContext ctx = TodoRequestContext.create("syncTodoPresetButtonPressed", message); try { - cardManager.firePresetButtonPressed(request); - todoLogger.logTodoUpdated(ctx, todo); + if (cardManager.firePresetButtonPressed(request)) + todoLogger.logTodoUpdated(ctx, todo); } catch (Exception e) { log.warn("[syncTodoPresetButtonPressed] error, message={}", message, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); From a6c1dcd5671239157a79b8457bd8c6d9da3fc3f4 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 17:56:48 +0800 Subject: [PATCH 094/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/message/service/todo/card/TodoSyncCardService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 61984e44..156a5633 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 @@ -211,7 +211,7 @@ public class TodoSyncCardService { request.setPresetButtonType(message.getPresetButtonType()); request.setOperatorId(message.getOperatorId()); request.setOperatorName(message.getOperatorName()); - TodoRequestContext ctx = TodoRequestContext.create("syncCardPresetButtonPressed", message); + TodoRequestContext ctx = TodoRequestContext.create("syncCardPresetButtonPressed:finished", message); try { if (todoManager.firePresetButtonPressed(request, false)) todoLogger.logTodoUpdated(ctx, todo); @@ -248,7 +248,7 @@ public class TodoSyncCardService { request.setPresetButtonType(message.getPresetButtonType()); request.setOperatorId(0L); request.setOperatorName(""); - TodoRequestContext ctx = TodoRequestContext.create("syncTodoPresetButtonPressed", message); + TodoRequestContext ctx = TodoRequestContext.create("syncTodoPresetButtonPressed:finished", message); try { if (cardManager.firePresetButtonPressed(request)) todoLogger.logTodoUpdated(ctx, todo); From 82891919cb65095d4a83dff58fa0802a969bcb80 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 18:00:47 +0800 Subject: [PATCH 095/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8f7fa840..6c53d700 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 @@ -135,7 +135,7 @@ public class CardManager { if (cardProps.isDeleteCardsWhenSendFail()) { cardSupport.deleteCardIdempotent(request); cardDao.deleteCards(sendModel.getCards()); - sendLogger.reloadAndLogCards("send:fail:deleteCards"); + sendLogger.reloadAndLogCards("send:fail:deleteCards", e); } }); throw MiscUtils.wrapException(e); From d6f4bd957f9e64c9b4b887bd7049a12c07d2fc57 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 18:08:16 +0800 Subject: [PATCH 096/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0bizCode?= =?UTF-8?q?=E5=92=8CsubBizCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/msg/center/message/service/card/CardManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6c53d700..6125310f 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 @@ -197,7 +197,7 @@ public class CardManager { boolean updated = false; for (List cards : cardsCursor(request)) { UpdateStateResult result = firePresetButtonPressedImpl(request, requestContext, templateModel, cards); - updated = updated || result == UpdateStateResult.UPDATED; + updated = result == UpdateStateResult.UPDATED || updated; } return updated; } From 94a7261fde836b16f7252a438efb6ab9436de67b Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 18:42:43 +0800 Subject: [PATCH 097/111] REQ-3502: fix bugs --- .../message/service/todo/card/TodoSyncCardService.java | 2 +- .../msg/center/message/service/card/CardManagerTest.java | 4 ++-- .../service/todo/card/TodoSyncCardServiceTest.java | 9 +++------ 3 files changed, 6 insertions(+), 9 deletions(-) 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 156a5633..34b9a461 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 @@ -108,7 +108,7 @@ public class TodoSyncCardService { return; } if (todo.getState() == PendingMessageStateEnum.HAS_BEEN_SENT - || todo.getState() == PendingMessageStateEnum.CREATED) + || (todo.getState() == PendingMessageStateEnum.CREATED && business.getBizFinalState() == null)) sendCard(event, business, todo); else if (!TodoManager.OP_FIRE_PRESET_BUTTON_PRESSED.equals(message.getOperation())) updateCardState(event, business, todo); diff --git a/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java b/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java index 2e138c1f..601f9dbb 100644 --- a/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java +++ b/start/src/test/java/cn/axzo/msg/center/message/service/card/CardManagerTest.java @@ -25,8 +25,8 @@ class CardManagerTest { @Test void rebuildCardContent() { - TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent("a7c79c432efc4ecba71790677d35cc59"); - Card card = cardDao.findCardByBizMessageId("e4b81f64cd854e3e92a6cad8f1546760").orElse(null); + TemplateModelV3 templateModel = cardSupport.ensureImChannelPresent("8733f93de8db49699a78eda5a342763c"); + Card card = cardDao.findCardByBizMessageId("c0d696b2178f442f9488cfc74c518042").orElse(null); BizAssertions.assertNotNull(card, "card not found"); cardManager.rebuildCardContent(templateModel, Collections.singletonList(card)); } diff --git a/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java index 730f43f7..96f5f152 100644 --- a/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java +++ b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java @@ -2,15 +2,12 @@ package cn.axzo.msg.center.message.service.todo.card; import cn.axzo.framework.rocketmq.Event; import cn.axzo.msg.center.MsgCenterApplication; -import cn.axzo.msg.center.api.mq.PresetButtonPressedMessage; import cn.axzo.msg.center.api.mq.TodoUpdateMessage; import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; - -import static org.junit.jupiter.api.Assertions.*; /** * @author yanglin */ @@ -22,9 +19,9 @@ class TodoSyncCardServiceTest { @Test void exec() { - String json = "{\"btnPressedRequestNo\": \"437fb871912e4f2f8d7c5d7969164061\", \"messageId\": \"ec98f521-e6a0-4330-a650-245bad478853\", \"messageSendTime\": 1737001768749, \"messageSendTimeStr\": \"2025-01-16 12:29:28\", \"presetButtonType\": \"AGREE\", \"todoInfo\": {\"bizCategory\": \"OTHER\", \"bizCode\": \"test-17\", \"bizDesc\": \"\", \"bizExtParam\": {\"assistLogName\": \"测试\"}, \"bizFinalState\": null, \"bizFlag\": \"\", \"content\": \"系统提示,无需关注\", \"deadline\": null, \"executorId\": 0, \"executorName\": \"test\", \"executorOuId\": 10616, \"executorPersonId\": 9000399522, \"executorType\": \"NOT_SUPPORT\", \"executorWorkspaceId\": 0, \"executorWorkspaceName\": \"\", \"identityCode\": \"68d6f7d480b44891a65d07e482d848e9\", \"orgType\": \"UNKNOWN\", \"promoterId\": 0, \"promoterName\": \"杨林\", \"promoterOuId\": 0, \"promoterPersonId\": 6678911, \"promoterType\": \"NOT_SUPPORT\", \"promoterWorkspaceId\": 0, \"promoterWorkspaceName\": \"\", \"requestNo\": \"c0fef3f2dc7d4264b33d3aafa1906636\", \"routerParams\": {}, \"srcTemplateCode\": \"7aceab1f31ec4570a98cdaf7f8940c61\", \"state\": \"HAS_BEEN_SENT\", \"subBizCode\": \"aaaa\", \"templateCode\": \"7aceab1f31ec4570a98cdaf7f8940c61\", \"title\": \"系统提示\", \"todoBusinessId\": 147049, \"todoId\": 843602, \"type\": \"EXECUTABLE\"}}"; - PresetButtonPressedMessage message = JSON.parseObject(json, PresetButtonPressedMessage.class); - todoSyncCardService.syncTodoPresetButtonPressed(message); + String json = "{\"messageId\": \"8a771827-f17f-4527-87b9-8a7d182404d6\", \"messageSendTime\": 1737022307826, \"messageSendTimeStr\": \"2025-01-16 18:11:47\", \"operation\": \"updateBusinessFinalBizState\", \"updateCard\": true, \"updatedTodo\": {\"bizCategory\": \"FLOW\", \"bizCode\": \"202501161807200000000\", \"bizDesc\": \"抄送节点\", \"bizExtParam\": {\"processInstanceId\": \"202501161807200000000\", \"[_INTERNAL_INITIATOR_]\": {\"assignerName\": \"杨期成\", \"ouId\": \"10401\", \"tenantId\": \"4949\", \"personId\": \"9000400630\", \"avatar\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\", \"assignee\": \"1229802\", \"assigneeType\": \"3\"}, \"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\": 2, \"activityName\": \"抄送节点\", \"businessName\": \"工作流开发测试项目业务\", \"processResult\": \"审批中\", \"initiatorUserName\": \"杨期成\", \"[_CREATE_INSTANCE_PARAMS]\": \"{\\\"processDefinitionKey\\\":\\\"wfTestProj\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"variables\\\":{\\\"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\\\":2,\\\"[_INTERNAL_INITIATOR_]\\\":\\\"{\\\\\\\"assignee\\\\\\\":\\\\\\\"1229802\\\\\\\",\\\\\\\"assigneeType\\\\\\\":\\\\\\\"3\\\\\\\",\\\\\\\"assignerName\\\\\\\":\\\\\\\"杨期成\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\\\\\",\\\\\\\"ouId\\\\\\\":\\\\\\\"10401\\\\\\\",\\\\\\\"personId\\\\\\\":\\\\\\\"9000400630\\\\\\\",\\\\\\\"tenantId\\\\\\\":\\\\\\\"4949\\\\\\\"}\\\",\\\"[_BIZ_ORG_RELATION_]\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"[_WORKFLOW_ENGINE_VERSION_]\\\":\\\"1.5.2\\\",\\\"[_PENDING_VARIABLES]\\\":{},\\\"[_INTERNAL_PROCESS_AGENT]\\\":true},\\\"pendingVariables\\\":{},\\\"cooperationOrg\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"businessKey\\\":\\\"40\\\",\\\"initiator\\\":{\\\"assignee\\\":\\\"1229802\\\",\\\"assigneeType\\\":\\\"3\\\",\\\"assignerName\\\":\\\"杨期成\\\",\\\"personId\\\":\\\"9000400630\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"ouId\\\":\\\"10401\\\",\\\"avatar\\\":\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\"},\\\"async\\\":false,\\\"startFormVariables\\\":{}}\", \"taskStartTime\": \"2025-01-16 18:07:23\", \"[_INTERNAL_PROCESS_AGENT]\": true, \"activityId\": \"node_157456498639\", \"[_WORKFLOW_ENGINE_VERSION_]\": \"1.5.2\", \"processStartTime\": \"2025-01-16 18:07:23\", \"tenantId\": \"4949\", \"businessKey\": \"40\", \"operatorType\": \"\", \"taskId\": \"202501161807200000033\", \"[_PENDING_VARIABLES]\": {}, \"processInstanceName\": \"工作流业务测试项目流程\"}, \"bizFinalState\": \"REJECTED\", \"bizFlag\": \"\", \"content\": \"杨期成发起的工作流开发测试项目业务流程抄送给您,请及时查看。\", \"deadline\": null, \"executorId\": 0, \"executorName\": \"张永强\", \"executorOuId\": 9550, \"executorPersonId\": 40695, \"executorType\": \"NOT_SUPPORT\", \"executorWorkspaceId\": 3561, \"executorWorkspaceName\": \"上海棋院(上海市棋牌运动管理中心)\", \"identityCode\": \"7a0eb00f68884824b356240eb7fb8d38\", \"orgType\": \"ENT\", \"promoterId\": 0, \"promoterName\": \"杨期成\", \"promoterOuId\": 10401, \"promoterPersonId\": 9000400630, \"promoterType\": \"NOT_SUPPORT\", \"promoterWorkspaceId\": 4949, \"promoterWorkspaceName\": \"核西南院设计有限公司\", \"requestNo\": \"54f148e904374dad95f2abf2329afa0f\", \"routerParams\": {\"processNodeCode\": \"node_157456498639\", \"processInstanceId\": \"202501161807200000000\", \"creator\": \"杨期成\", \"title\": \"工作流业务测试项目流程\", \"userAgreeSignature\": true, \"businessTypeName\": \"抄送节点\", \"tenantId\": \"3561\", \"businessKey\": \"40\", \"startTime\": \"2025-01-16 18:07:23\", \"initiatorTenantId\": \"4949\", \"taskId\": \"202501161807200000033\", \"processNodeName\": \"抄送节点\"}, \"srcTemplateCode\": \"8733f93de8db49699a78eda5a342763c\", \"state\": \"CREATED\", \"subBizCode\": \"202501161807200000033\", \"templateCode\": \"8733f93de8db49699a78eda5a342763c\", \"title\": \"抄送消息\", \"todoBusinessId\": 249849, \"todoId\": 1016974, \"type\": \"COPIED_TO_ME\"}}"; + TodoUpdateMessage message = JSON.parseObject(json, TodoUpdateMessage.class); + todoSyncCardService.onMessage(new Event(), message); } } \ No newline at end of file From ca0032ac9fb594be12cace91bd598985fee5f326 Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 18:57:59 +0800 Subject: [PATCH 098/111] REQ-3502: fix bugs --- .../msg/center/event/outer/PushYouMengMessageHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/event/outer/PushYouMengMessageHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/event/outer/PushYouMengMessageHandler.java index 34cd20dc..17c6f101 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/event/outer/PushYouMengMessageHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/event/outer/PushYouMengMessageHandler.java @@ -135,6 +135,12 @@ public class PushYouMengMessageHandler implements EventHandler, InitializingBean return; } + MessageHistoryUpdatedPayload.MsgBody msgBody = messageBody.resolveMsgBody(); + if (msgBody == null) { + log.warn("push-handler, 模板code:{}, msgBody为空 [不是普通消息], event: {}", card.getTemplateCode(), event); + return; + } + youMengMessageService.sendPushMessage(MsgBody4Guest.builder() .ty(0) .f("0") From 3b5e74990302c88d679752bb2e345e25504f2d9b Mon Sep 17 00:00:00 2001 From: yanglin Date: Thu, 16 Jan 2025 19:06:59 +0800 Subject: [PATCH 099/111] REQ-3502: fix bugs --- .../axzo/msg/center/message/service/card/CardManager.java | 2 +- .../message/service/card/broadcast/CardBroadcaster.java | 6 +++++- .../message/service/todo/card/TodoSyncCardService.java | 3 ++- .../msg/center/api/mq/CardPresetButtonPressedMessage.java | 1 + 4 files changed, 9 insertions(+), 3 deletions(-) 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 6125310f..2a4da9fc 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 @@ -215,7 +215,7 @@ public class CardManager { UpdateStateResult result = executor.update(new SetActionPerformedBuilder( executor, button, CardBizState.fromPresetButton(request.getPresetButtonType()))); if (result == UpdateStateResult.UPDATED) { - cardBroadcaster.firePresetButtonPressed(executor.updatedCards, request); + cardBroadcaster.firePresetButtonPressed(executor.updatedCards, request, requestContext); executor.updateCardLogger.reloadAndLogCards("presetButtonPressed:mq:success"); } else { executor.updateCardLogger.reloadAndLogCards("presetButtonPressed:cardNoUpdate"); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java index b5b81a04..7c725bab 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/card/broadcast/CardBroadcaster.java @@ -5,6 +5,7 @@ import cn.axzo.msg.center.api.mq.CardInfo; import cn.axzo.msg.center.api.mq.CardPresetButtonPressedMessage; import cn.axzo.msg.center.dal.CardDao; import cn.axzo.msg.center.domain.entity.Card; +import cn.axzo.msg.center.message.service.card.CardRequestContext; import cn.axzo.msg.center.mq.MqMessageRecord; import cn.axzo.msg.center.mq.MqProducer; import cn.axzo.msg.center.service.enums.MqMessageType; @@ -25,13 +26,16 @@ public class CardBroadcaster { private final CardDao cardDao; private final MqProducer mqProducer; - public void firePresetButtonPressed(List cards, CardPresetButtonRequest request) { + public void firePresetButtonPressed(List cards, + CardPresetButtonRequest request, + CardRequestContext requestContext) { for (Card card : cardDao.reloadCards(cards)) { CardPresetButtonPressedMessage message = new CardPresetButtonPressedMessage(); message.setPresetButtonType(request.getPresetButtonType()); message.setOperatorId(request.getOperatorId()); message.setOperatorName(request.getOperatorName()); message.setCardInfo(BeanMapper.copyBean(card, CardInfo.class)); + message.setBatchNo(requestContext.getBatchNo()); mqProducer.send(MqMessageRecord .builder(MqMessageType.CARD_PRESET_BUTTON_PRESSED, message) .messageKey(card.getIdentityCode()) 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 34b9a461..2568342b 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 @@ -211,7 +211,8 @@ public class TodoSyncCardService { request.setPresetButtonType(message.getPresetButtonType()); request.setOperatorId(message.getOperatorId()); request.setOperatorName(message.getOperatorName()); - TodoRequestContext ctx = TodoRequestContext.create("syncCardPresetButtonPressed:finished", message); + TodoRequestContext ctx = TodoRequestContext.create( + "syncCardPresetButtonPressed:finished", message.getBatchNo(), message); try { if (todoManager.firePresetButtonPressed(request, false)) todoLogger.logTodoUpdated(ctx, todo); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardPresetButtonPressedMessage.java b/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardPresetButtonPressedMessage.java index 79fabe22..402a002b 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardPresetButtonPressedMessage.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/api/mq/CardPresetButtonPressedMessage.java @@ -30,4 +30,5 @@ public class CardPresetButtonPressedMessage extends MqMessage implements Seriali */ private CardInfo cardInfo; + private String batchNo; } \ No newline at end of file From 7428c69723d62670e7e6e0bb5d220e6010d4f49d Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 09:50:32 +0800 Subject: [PATCH 100/111] REQ-3502: fix bugs --- .../service/todo/card/TodoSyncCardService.java | 17 +++++++++++++---- .../service/todo/manage/TodoManager.java | 5 ++--- .../service/todo/manage/TodoRequestContext.java | 8 +++++++- .../todo/card/TodoSyncCardServiceTest.java | 11 +++++------ 4 files changed, 27 insertions(+), 14 deletions(-) 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 2568342b..bd661d7a 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 @@ -36,6 +36,7 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.transaction.support.TransactionTemplate; import java.util.Optional; @@ -62,6 +63,7 @@ public class TodoSyncCardService { private final TodoLogger todoLogger; private final MessageTemplateV3Dao messageTemplateV3Dao; private final TodoManager todoManager; + private final TransactionTemplate transactionTemplate; void onMessage(Event event, TodoUpdateMessage message) { log.info("received TodoUpdateMessage: {}", message); @@ -214,8 +216,10 @@ public class TodoSyncCardService { TodoRequestContext ctx = TodoRequestContext.create( "syncCardPresetButtonPressed:finished", message.getBatchNo(), message); try { - if (todoManager.firePresetButtonPressed(request, false)) - todoLogger.logTodoUpdated(ctx, todo); + execTransactional(() -> { + if (todoManager.firePresetButtonPressed(request, false)) + todoLogger.logTodoUpdated(ctx, todo); + }); } catch (Exception e) { log.warn("[syncCardPresetButtonPressed] onCardPresetButtonPressed: error, message={}", message, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); @@ -251,8 +255,10 @@ public class TodoSyncCardService { request.setOperatorName(""); TodoRequestContext ctx = TodoRequestContext.create("syncTodoPresetButtonPressed:finished", message); try { - if (cardManager.firePresetButtonPressed(request)) - todoLogger.logTodoUpdated(ctx, todo); + execTransactional(() -> { + if (cardManager.firePresetButtonPressed(request)) + todoLogger.logTodoUpdated(ctx, todo); + }); } catch (Exception e) { log.warn("[syncTodoPresetButtonPressed] error, message={}", message, e); todoLogger.logTodoUpdated(ctx.copy().addLogContent("exception", e), todo); @@ -306,4 +312,7 @@ public class TodoSyncCardService { private Todo todo; } + private void execTransactional(Runnable runnable) { + transactionTemplate.executeWithoutResult(unused -> runnable.run()); + } } \ No newline at end of file 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 21abbae2..98433de7 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 @@ -321,9 +321,8 @@ public class TodoManager { "businessUpdated", businessUpdated); todoLogger.logBusinessUpdated(ctx, advanceResult.getBusiness()); } - if (advanceResult.isAdvanced()) { + if (advanceResult.isAdvanced()) todoLogger.logTodoCompleted(ctx, advanceResult.getAdvancedTodos()); - } if (businessUpdated) todoBroadcaster.fireTodoUpdates("completeById", advanceResult.getBusinessId(), true); else @@ -688,7 +687,7 @@ public class TodoManager { "currentStateSample", noStateBusinessTodos.sampleTodo()); // @formatter:on if (cfg.isLogAdvanceTodoStateFail()) - todoLogger.logTodosUpdated(ctx, noStateBusinessTodos.todos); + todoLogger.logTodosUpdated(ctx.copy(String.format("%s:fail", ctx.getName())), noStateBusinessTodos.todos); // throw an error? dunno log.warn("尝试推进待办状态, 但是 {}. ctx={}, query={}, currentStateSample={}", failReason, ctx, QueryFormatter.format(builder.getQuery()), noStateBusinessTodos.sampleTodo()); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java index b1a80cf0..1e324bfa 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/manage/TodoRequestContext.java @@ -5,6 +5,7 @@ import cn.axzo.msg.center.utils.UUIDUtil; import com.alibaba.fastjson.JSON; import com.google.common.base.Throwables; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.LinkedHashMap; @@ -37,7 +38,8 @@ public class TodoRequestContext { } public static TodoRequestContext create(String name, String requestNo, Object request) { - return new TodoRequestContext(name, requestNo, request); + String finalRequestNo = StringUtils.isBlank(requestNo) ? UUIDUtil.uuidString() : requestNo; + return new TodoRequestContext(name, finalRequestNo, request); } public TodoRequestContext addLogContent(String name, Object... fields) { @@ -73,6 +75,10 @@ public class TodoRequestContext { } public TodoRequestContext copy() { + return copy(this.name); + } + + public TodoRequestContext copy(String name) { TodoRequestContext copy = new TodoRequestContext(name, requestNo); copy.logContents.putAll(logContents); return copy; diff --git a/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java index 96f5f152..5c4db1a4 100644 --- a/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java +++ b/start/src/test/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardServiceTest.java @@ -1,8 +1,7 @@ package cn.axzo.msg.center.message.service.todo.card; -import cn.axzo.framework.rocketmq.Event; import cn.axzo.msg.center.MsgCenterApplication; -import cn.axzo.msg.center.api.mq.TodoUpdateMessage; +import cn.axzo.msg.center.api.mq.CardPresetButtonPressedMessage; import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; @@ -18,10 +17,10 @@ class TodoSyncCardServiceTest { private final TodoSyncCardService todoSyncCardService; @Test - void exec() { - String json = "{\"messageId\": \"8a771827-f17f-4527-87b9-8a7d182404d6\", \"messageSendTime\": 1737022307826, \"messageSendTimeStr\": \"2025-01-16 18:11:47\", \"operation\": \"updateBusinessFinalBizState\", \"updateCard\": true, \"updatedTodo\": {\"bizCategory\": \"FLOW\", \"bizCode\": \"202501161807200000000\", \"bizDesc\": \"抄送节点\", \"bizExtParam\": {\"processInstanceId\": \"202501161807200000000\", \"[_INTERNAL_INITIATOR_]\": {\"assignerName\": \"杨期成\", \"ouId\": \"10401\", \"tenantId\": \"4949\", \"personId\": \"9000400630\", \"avatar\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\", \"assignee\": \"1229802\", \"assigneeType\": \"3\"}, \"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\": 2, \"activityName\": \"抄送节点\", \"businessName\": \"工作流开发测试项目业务\", \"processResult\": \"审批中\", \"initiatorUserName\": \"杨期成\", \"[_CREATE_INSTANCE_PARAMS]\": \"{\\\"processDefinitionKey\\\":\\\"wfTestProj\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"variables\\\":{\\\"[_INTERNAL_PROCESS_WORKSPACE_TYPE]\\\":2,\\\"[_INTERNAL_INITIATOR_]\\\":\\\"{\\\\\\\"assignee\\\\\\\":\\\\\\\"1229802\\\\\\\",\\\\\\\"assigneeType\\\\\\\":\\\\\\\"3\\\\\\\",\\\\\\\"assignerName\\\\\\\":\\\\\\\"杨期成\\\\\\\",\\\\\\\"avatar\\\\\\\":\\\\\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\\\\\",\\\\\\\"ouId\\\\\\\":\\\\\\\"10401\\\\\\\",\\\\\\\"personId\\\\\\\":\\\\\\\"9000400630\\\\\\\",\\\\\\\"tenantId\\\\\\\":\\\\\\\"4949\\\\\\\"}\\\",\\\"[_BIZ_ORG_RELATION_]\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"[_WORKFLOW_ENGINE_VERSION_]\\\":\\\"1.5.2\\\",\\\"[_PENDING_VARIABLES]\\\":{},\\\"[_INTERNAL_PROCESS_AGENT]\\\":true},\\\"pendingVariables\\\":{},\\\"cooperationOrg\\\":{\\\"orgScopes\\\":[{\\\"workspaceType\\\":2,\\\"workspaceId\\\":4949,\\\"ouId\\\":10401,\\\"nodeId\\\":21335}]},\\\"businessKey\\\":\\\"40\\\",\\\"initiator\\\":{\\\"assignee\\\":\\\"1229802\\\",\\\"assigneeType\\\":\\\"3\\\",\\\"assignerName\\\":\\\"杨期成\\\",\\\"personId\\\":\\\"9000400630\\\",\\\"tenantId\\\":\\\"4949\\\",\\\"ouId\\\":\\\"10401\\\",\\\"avatar\\\":\\\"https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cac12b80cac342b5b9fcef5f470b189e.jpg\\\"},\\\"async\\\":false,\\\"startFormVariables\\\":{}}\", \"taskStartTime\": \"2025-01-16 18:07:23\", \"[_INTERNAL_PROCESS_AGENT]\": true, \"activityId\": \"node_157456498639\", \"[_WORKFLOW_ENGINE_VERSION_]\": \"1.5.2\", \"processStartTime\": \"2025-01-16 18:07:23\", \"tenantId\": \"4949\", \"businessKey\": \"40\", \"operatorType\": \"\", \"taskId\": \"202501161807200000033\", \"[_PENDING_VARIABLES]\": {}, \"processInstanceName\": \"工作流业务测试项目流程\"}, \"bizFinalState\": \"REJECTED\", \"bizFlag\": \"\", \"content\": \"杨期成发起的工作流开发测试项目业务流程抄送给您,请及时查看。\", \"deadline\": null, \"executorId\": 0, \"executorName\": \"张永强\", \"executorOuId\": 9550, \"executorPersonId\": 40695, \"executorType\": \"NOT_SUPPORT\", \"executorWorkspaceId\": 3561, \"executorWorkspaceName\": \"上海棋院(上海市棋牌运动管理中心)\", \"identityCode\": \"7a0eb00f68884824b356240eb7fb8d38\", \"orgType\": \"ENT\", \"promoterId\": 0, \"promoterName\": \"杨期成\", \"promoterOuId\": 10401, \"promoterPersonId\": 9000400630, \"promoterType\": \"NOT_SUPPORT\", \"promoterWorkspaceId\": 4949, \"promoterWorkspaceName\": \"核西南院设计有限公司\", \"requestNo\": \"54f148e904374dad95f2abf2329afa0f\", \"routerParams\": {\"processNodeCode\": \"node_157456498639\", \"processInstanceId\": \"202501161807200000000\", \"creator\": \"杨期成\", \"title\": \"工作流业务测试项目流程\", \"userAgreeSignature\": true, \"businessTypeName\": \"抄送节点\", \"tenantId\": \"3561\", \"businessKey\": \"40\", \"startTime\": \"2025-01-16 18:07:23\", \"initiatorTenantId\": \"4949\", \"taskId\": \"202501161807200000033\", \"processNodeName\": \"抄送节点\"}, \"srcTemplateCode\": \"8733f93de8db49699a78eda5a342763c\", \"state\": \"CREATED\", \"subBizCode\": \"202501161807200000033\", \"templateCode\": \"8733f93de8db49699a78eda5a342763c\", \"title\": \"抄送消息\", \"todoBusinessId\": 249849, \"todoId\": 1016974, \"type\": \"COPIED_TO_ME\"}}"; - TodoUpdateMessage message = JSON.parseObject(json, TodoUpdateMessage.class); - todoSyncCardService.onMessage(new Event(), message); + void syncCardPresetButtonPressed() { + String json = "{\"cardInfo\": {\"appCode\": \"msg-center:todo\", \"batchNo\": \"fd301a68203a430cbc6e6928c0164fe5\", \"bizCode\": \"test-14\", \"bizMessageId\": \"2e1119e4a96345049870558d53939700\", \"bizParam\": {\"assistLogName\": \"测试\", \"extInfo\": {\"todoType\": \"EXECUTABLE\", \"todoCategory\": \"OTHER\", \"todoPromoterWorkspaceId\": 0, \"todoIdentityCode\": \"80978834809443febcf579b0eecf560b\", \"todoExecutorWorkspaceId\": 0}}, \"buttonStates\": [{\"buttonCode\": \"f6a77000fc50487ab9be215201bf233a\", \"isActionPerformed\": true}], \"cardContent\": {\"bizCode\": \"test-14\", \"cardStyleCode\": \"common_style_001\", \"updateTime\": 1737025348622, \"cardContent\": \"系统提示,无需关注\", \"debugInfo\": {\"isUpdatable\": true, \"bizCode\": \"test-14\", \"bizState\": \"AGREED\", \"subBizCode\": \"aaaa\", \"cardState\": \"COMPLETED\"}, \"templateCode\": \"7aceab1f31ec4570a98cdaf7f8940c61\", \"sendTimestamp\": 1737025348622, \"cardTitle\": \"系统提示\", \"extInfo\": {\"todoType\": \"EXECUTABLE\", \"todoCategory\": \"OTHER\", \"todoPromoterWorkspaceId\": 0, \"todoIdentityCode\": \"80978834809443febcf579b0eecf560b\", \"todoExecutorWorkspaceId\": 0}, \"cardBannerUrl\": \"\", \"subBizCode\": \"aaaa\", \"stateImage\": \"https://axzo-public.oss-cn-chengdu.aliyuncs.com/msg-center/todo_card_state/card_biz_state_agreed_20241220.png\", \"cardButtons\": [{\"presetButtonType\": \"AGREE\", \"actionPerformed\": true, \"senderShow\": false, \"buttonCode\": \"f6a77000fc50487ab9be215201bf233a\", \"isHighlight\": true, \"action\": \"PRESET_BUTTON\", \"source\": \"CUSTOM\", \"title\": \"已同意\", \"executorShow\": true}]}, \"content\": \"系统提示,无需关注\", \"id\": 167756, \"identityCode\": \"726de22e936c4f3bb640693e5f2c0968\", \"imTaskId\": 756527, \"isSenderRobot\": \"YES\", \"receiverAppType\": \"CMP\", \"receiverOuId\": 10616, \"receiverPersonId\": 9000399522, \"receiverWorkspaceId\": 0, \"routerParam\": {}, \"senderAppType\": \"SYSTEM\", \"senderOuId\": 0, \"senderPersonId\": 6678911, \"senderWorkspaceId\": 0, \"state\": null, \"subBizCode\": \"aaaa\", \"subtitle\": \"\", \"templateCode\": \"7aceab1f31ec4570a98cdaf7f8940c61\", \"title\": \"系统提示\"}, \"messageId\": \"490ddb1e-5879-4088-bbda-7ca8f15bd4f2\", \"messageSendTime\": 1737025348697, \"messageSendTimeStr\": \"2025-01-16 19:02:28\", \"operatorId\": 9000399522, \"operatorName\": \"罗福\", \"presetButtonType\": \"AGREE\"}"; + CardPresetButtonPressedMessage message = JSON.parseObject(json, CardPresetButtonPressedMessage.class); + todoSyncCardService.syncCardPresetButtonPressed(message); } } \ No newline at end of file From 0565c17a2463c1b06a2d4269e508d08aa92262b2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 10:48:42 +0800 Subject: [PATCH 101/111] REQ-3502: fix bugs --- .../card/CardPresetButtonSyncTodoHandler.java | 3 +++ .../card/TodoPresetButtonSyncCardHandler.java | 3 +++ .../cn/axzo/msg/center/mq/ConsumerIsolation.java | 2 ++ .../cn/axzo/msg/center/mq/RocketMQConfig.java | 16 +++++++++++++--- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java index 4677ddc1..9c018efb 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java @@ -4,6 +4,7 @@ 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.CardPresetButtonPressedMessage; +import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,6 +24,8 @@ public class CardPresetButtonSyncTodoHandler implements EventHandler, Initializi @Override public void onEvent(Event event, EventConsumer.Context context) { + if (ConsumerIsolation.getIsolation() != ConsumerIsolation.CARD_PRESET_BUTTON_CLICKED_SYNC_TODO) + return; CardPresetButtonPressedMessage message = event.normalizedData(CardPresetButtonPressedMessage.class); log.info("received CardPresetButtonPressedMessage: {}", message); todoSyncCardService.syncCardPresetButtonPressed(message); 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 index b022b706..335da4a2 100644 --- 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 @@ -4,6 +4,7 @@ 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.mq.ConsumerIsolation; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -23,6 +24,8 @@ public class TodoPresetButtonSyncCardHandler implements EventHandler, Initializi @Override public void onEvent(Event event, EventConsumer.Context context) { + if (ConsumerIsolation.getIsolation() != ConsumerIsolation.TODO_PRESET_BUTTON_CLICKED_SYNC_CARD) + return; PresetButtonPressedMessage message = event.normalizedData(PresetButtonPressedMessage.class); log.info("received PresetButtonPressedMessage: {}", message); todoSyncCardService.syncTodoPresetButtonPressed(message); diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java b/inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java index 67dc3d3d..8574bac9 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/mq/ConsumerIsolation.java @@ -7,6 +7,8 @@ public enum ConsumerIsolation { TODO_SYNC_CARD_BIZ, TODO_SYNC_CARD_FLOW, + TODO_PRESET_BUTTON_CLICKED_SYNC_CARD, + CARD_PRESET_BUTTON_CLICKED_SYNC_TODO ; 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 156ee561..c1f70e84 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 @@ -125,7 +125,7 @@ public class RocketMQConfig { eventConsumer.onEvent(value, EventConsumer.Context.builder() .msgId(message.getMsgId()) .ext(ImmutableMap.of("topic", topic)) - .headers(Maps.transformValues(headers, header -> Optional.ofNullable(header).map(String::getBytes).orElse(new byte[] {}))) + .headers(Maps.transformValues(headers, header -> Optional.ofNullable(header).map(String::getBytes).orElse(new byte[]{}))) .lagSupplier(() -> partitionLag) .maxAllowElapsedMillis(cfg.getMsgCenterMqSelfConsumeMaxExecMs()) .build()); @@ -154,7 +154,12 @@ public class RocketMQConfig { @Override public void onMessage(MessageExt message) { - super.onEvent(message, eventConsumer); + ConsumerIsolation.setIsolation(ConsumerIsolation.CARD_PRESET_BUTTON_CLICKED_SYNC_TODO); + try { + super.onEvent(message, eventConsumer); + } finally { + ConsumerIsolation.clearIsolation(); + } } } @@ -173,7 +178,12 @@ public class RocketMQConfig { @Override public void onMessage(MessageExt message) { - super.onEvent(message, eventConsumer); + ConsumerIsolation.setIsolation(ConsumerIsolation.TODO_PRESET_BUTTON_CLICKED_SYNC_CARD); + try { + super.onEvent(message, eventConsumer); + } finally { + ConsumerIsolation.clearIsolation(); + } } } From 1b00f1d5b9acef56902850e2469e9a1c9f1c9ff8 Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 11:04:54 +0800 Subject: [PATCH 102/111] REQ-3502: fix bugs --- .../card/CardPresetButtonSyncTodoHandler.java | 23 +++----- .../card/TodoPresetButtonSyncCardHandler.java | 23 +++----- .../todo/card/TodoSyncCardBizHandler.java | 24 +++----- .../todo/card/TodoSyncCardFlowHandler.java | 24 +++----- .../msg/center/mq/IsolationMQListener.java | 56 +++++++++++++++++++ 5 files changed, 92 insertions(+), 58 deletions(-) create mode 100644 inside-notices/src/main/java/cn/axzo/msg/center/mq/IsolationMQListener.java diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java index 9c018efb..87021205 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java @@ -2,13 +2,11 @@ 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.CardPresetButtonPressedMessage; import cn.axzo.msg.center.mq.ConsumerIsolation; +import cn.axzo.msg.center.mq.IsolationMQListener; 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; /** @@ -16,24 +14,21 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RequiredArgsConstructor -public class CardPresetButtonSyncTodoHandler implements EventHandler, InitializingBean { +public class CardPresetButtonSyncTodoHandler extends IsolationMQListener { - private final EventConsumer eventConsumer; private final TodoSyncCardService todoSyncCardService; + CardPresetButtonSyncTodoHandler(TodoSyncCardService todoSyncCardService) { + super(ConsumerIsolation.CARD_PRESET_BUTTON_CLICKED_SYNC_TODO, + MqMessageType.CARD_PRESET_BUTTON_PRESSED); + this.todoSyncCardService = todoSyncCardService; + } + @Override - public void onEvent(Event event, EventConsumer.Context context) { - if (ConsumerIsolation.getIsolation() != ConsumerIsolation.CARD_PRESET_BUTTON_CLICKED_SYNC_TODO) - return; + public void onEventImpl(Event event, EventConsumer.Context context) { CardPresetButtonPressedMessage message = event.normalizedData(CardPresetButtonPressedMessage.class); log.info("received CardPresetButtonPressedMessage: {}", message); todoSyncCardService.syncCardPresetButtonPressed(message); } - @Override - public void afterPropertiesSet() { - eventConsumer.registerHandler(MqMessageType.CARD_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/TodoPresetButtonSyncCardHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardHandler.java index 335da4a2..c681f116 100644 --- 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 @@ -2,13 +2,11 @@ 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.mq.ConsumerIsolation; +import cn.axzo.msg.center.mq.IsolationMQListener; 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; /** @@ -16,24 +14,21 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RequiredArgsConstructor -public class TodoPresetButtonSyncCardHandler implements EventHandler, InitializingBean { +public class TodoPresetButtonSyncCardHandler extends IsolationMQListener { - private final EventConsumer eventConsumer; private final TodoSyncCardService todoSyncCardService; + TodoPresetButtonSyncCardHandler(TodoSyncCardService todoSyncCardService) { + super(ConsumerIsolation.TODO_PRESET_BUTTON_CLICKED_SYNC_CARD, + MqMessageType.TODO_PRESET_BUTTON_PRESSED); + this.todoSyncCardService = todoSyncCardService; + } + @Override - public void onEvent(Event event, EventConsumer.Context context) { - if (ConsumerIsolation.getIsolation() != ConsumerIsolation.TODO_PRESET_BUTTON_CLICKED_SYNC_CARD) - return; + public void onEventImpl(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/TodoSyncCardBizHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java index 756aeb58..e3b09bcc 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java @@ -2,14 +2,12 @@ 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.TodoUpdateMessage; import cn.axzo.msg.center.mq.ConsumerIsolation; +import cn.axzo.msg.center.mq.IsolationMQListener; import cn.axzo.msg.center.service.enums.BizCategoryEnum; 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; /** @@ -17,14 +15,17 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RequiredArgsConstructor -class TodoSyncCardBizHandler implements EventHandler, InitializingBean { +class TodoSyncCardBizHandler extends IsolationMQListener { - private final EventConsumer eventConsumer; private final TodoSyncCardService todoSyncCardService; + TodoSyncCardBizHandler(TodoSyncCardService todoSyncCardService) { + super(ConsumerIsolation.TODO_SYNC_CARD_BIZ, MqMessageType.TODO_STATE_UPDATE); + this.todoSyncCardService = todoSyncCardService; + } + @Override - public void onEvent(Event event, EventConsumer.Context context) { + public void onEventImpl(Event event, EventConsumer.Context context) { TodoUpdateMessage message; try { message = event.normalizedData(TodoUpdateMessage.class); @@ -32,15 +33,8 @@ class TodoSyncCardBizHandler implements EventHandler, InitializingBean { log.warn("parse message error. event={}", event, e); return; } - if (ConsumerIsolation.getIsolation() == ConsumerIsolation.TODO_SYNC_CARD_BIZ - && message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.OTHER) { + if (message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.OTHER) todoSyncCardService.onMessage(event, message); - } - } - - @Override - public void afterPropertiesSet() { - eventConsumer.registerHandler(MqMessageType.TODO_STATE_UPDATE.getEventCode(), this); } } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java index 5a779536..900eb7a7 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java @@ -2,14 +2,12 @@ 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.TodoUpdateMessage; import cn.axzo.msg.center.mq.ConsumerIsolation; +import cn.axzo.msg.center.mq.IsolationMQListener; import cn.axzo.msg.center.service.enums.BizCategoryEnum; 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; /** @@ -17,14 +15,17 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RequiredArgsConstructor -class TodoSyncCardFlowHandler implements EventHandler, InitializingBean { +class TodoSyncCardFlowHandler extends IsolationMQListener { - private final EventConsumer eventConsumer; private final TodoSyncCardService todoSyncCardService; + TodoSyncCardFlowHandler(TodoSyncCardService todoSyncCardService) { + super(ConsumerIsolation.TODO_SYNC_CARD_FLOW, MqMessageType.TODO_STATE_UPDATE); + this.todoSyncCardService = todoSyncCardService; + } + @Override - public void onEvent(Event event, EventConsumer.Context context) { + public void onEventImpl(Event event, EventConsumer.Context context) { TodoUpdateMessage message; try { message = event.normalizedData(TodoUpdateMessage.class); @@ -32,15 +33,8 @@ class TodoSyncCardFlowHandler implements EventHandler, InitializingBean { log.warn("parse message error. event={}", event, e); return; } - if (ConsumerIsolation.getIsolation() == ConsumerIsolation.TODO_SYNC_CARD_FLOW - && message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.FLOW) { + if (message.getUpdatedTodo().getBizCategory() == BizCategoryEnum.FLOW) todoSyncCardService.onMessage(event, message); - } - } - - @Override - public void afterPropertiesSet() { - eventConsumer.registerHandler(MqMessageType.TODO_STATE_UPDATE.getEventCode(), this); } } \ No newline at end of file diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/mq/IsolationMQListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/mq/IsolationMQListener.java new file mode 100644 index 00000000..bfcc56d3 --- /dev/null +++ b/inside-notices/src/main/java/cn/axzo/msg/center/mq/IsolationMQListener.java @@ -0,0 +1,56 @@ +package cn.axzo.msg.center.mq; + +import cn.axzo.framework.rocketmq.BaseListener; +import cn.axzo.framework.rocketmq.Event; +import cn.axzo.framework.rocketmq.EventConsumer; +import cn.axzo.framework.rocketmq.EventHandler; +import cn.axzo.msg.center.service.enums.MqMessageType; +import lombok.RequiredArgsConstructor; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author yanglin + */ +public abstract class IsolationMQListener extends BaseListener + implements RocketMQListener, EventHandler, InitializingBean { + + @Autowired + private EventConsumer eventConsumer; + private final ConsumerIsolation isolation; + private final Event.EventCode eventCode; + + protected IsolationMQListener(ConsumerIsolation isolation, MqMessageType mqMessageType) { + this(isolation, mqMessageType.getEventCode()); + } + + protected IsolationMQListener(ConsumerIsolation isolation, Event.EventCode eventCode) { + this.isolation = isolation; + this.eventCode = eventCode; + } + + @Override + public void onMessage(MessageExt message) { + ConsumerIsolation.setIsolation(isolation); + try { + super.onEvent(message, eventConsumer); + } finally { + ConsumerIsolation.clearIsolation(); + } + } + + @Override + public final void onEvent(Event event, EventConsumer.Context context) { + if (ConsumerIsolation.getIsolation() == isolation) + onEventImpl(event, context); + } + + @Override + public void afterPropertiesSet() { + eventConsumer.registerHandler(eventCode, this); + } + + public abstract void onEventImpl(Event event, EventConsumer.Context context); +} \ No newline at end of file From fb67e897bb4bc147be04b41e8a1523c38042a2de Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 11:09:01 +0800 Subject: [PATCH 103/111] REQ-3502: fix bugs --- .../msg/center/message/service/todo/TodoRangeQueryService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java index e1f26b7c..f0cf59d6 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java @@ -155,6 +155,7 @@ public class TodoRangeQueryService { .eq(TodoBusiness::getIsDelete, TableIsDeleteEnum.NORMAL.value) .gt(TodoBusiness::getCreateAt, startingAt) .in(TodoBusiness::getTemplateCode, templateCodes) + .eq(request.getWorkspaceId() != null, TodoBusiness::getOrgId, request.getWorkspaceId()) .eq(request.getBizFinalState() != null, TodoBusiness::getBizFinalState, request.getBizFinalState()); PageQuerySort.TODO_BUSINESS.appendSortExpr(request, query); return queryAndAnalysis(request, () -> { From b91f74397b070a799898b5439252a21ce066a4ce Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 11:10:14 +0800 Subject: [PATCH 104/111] Revert "REQ-3502: fix bugs" This reverts commit fb67e897bb4bc147be04b41e8a1523c38042a2de. --- .../msg/center/message/service/todo/TodoRangeQueryService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java index f0cf59d6..e1f26b7c 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/TodoRangeQueryService.java @@ -155,7 +155,6 @@ public class TodoRangeQueryService { .eq(TodoBusiness::getIsDelete, TableIsDeleteEnum.NORMAL.value) .gt(TodoBusiness::getCreateAt, startingAt) .in(TodoBusiness::getTemplateCode, templateCodes) - .eq(request.getWorkspaceId() != null, TodoBusiness::getOrgId, request.getWorkspaceId()) .eq(request.getBizFinalState() != null, TodoBusiness::getBizFinalState, request.getBizFinalState()); PageQuerySort.TODO_BUSINESS.appendSortExpr(request, query); return queryAndAnalysis(request, () -> { From 7a50a808c648c5563a6d0eb086094324c3024521 Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 11:13:07 +0800 Subject: [PATCH 105/111] =?UTF-8?q?REQ-3502:=20=E6=B6=88=E6=81=AF=E8=80=85?= =?UTF-8?q?=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... => CardPresetButtonSyncTodoListener.java} | 12 ++- ... => TodoPresetButtonSyncCardListener.java} | 12 ++- ...dler.java => TodoSyncCardBizListener.java} | 12 ++- ...ler.java => TodoSyncCardFlowListener.java} | 12 ++- .../cn/axzo/msg/center/mq/RocketMQConfig.java | 96 ------------------- 5 files changed, 40 insertions(+), 104 deletions(-) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/{CardPresetButtonSyncTodoHandler.java => CardPresetButtonSyncTodoListener.java} (65%) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/{TodoPresetButtonSyncCardHandler.java => TodoPresetButtonSyncCardListener.java} (64%) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/{TodoSyncCardBizHandler.java => TodoSyncCardBizListener.java} (69%) rename inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/{TodoSyncCardFlowHandler.java => TodoSyncCardFlowListener.java} (69%) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java similarity index 65% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java index 87021205..df4565ed 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java @@ -7,6 +7,8 @@ import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.mq.IsolationMQListener; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.ConsumeMode; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.springframework.stereotype.Component; /** @@ -14,11 +16,17 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -public class CardPresetButtonSyncTodoHandler extends IsolationMQListener { +@RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_card_preset_button_sync_todo_${spring.profiles.active}", + consumeMode = ConsumeMode.ORDERLY, + nameServer = "${rocketmq.name-server}", + maxReconsumeTimes = 3 +) +public class CardPresetButtonSyncTodoListener extends IsolationMQListener { private final TodoSyncCardService todoSyncCardService; - CardPresetButtonSyncTodoHandler(TodoSyncCardService todoSyncCardService) { + CardPresetButtonSyncTodoListener(TodoSyncCardService todoSyncCardService) { super(ConsumerIsolation.CARD_PRESET_BUTTON_CLICKED_SYNC_TODO, MqMessageType.CARD_PRESET_BUTTON_PRESSED); this.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/TodoPresetButtonSyncCardListener.java similarity index 64% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardHandler.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java index c681f116..f57f09bc 100644 --- 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/TodoPresetButtonSyncCardListener.java @@ -7,6 +7,8 @@ import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.mq.IsolationMQListener; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.ConsumeMode; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.springframework.stereotype.Component; /** @@ -14,11 +16,17 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -public class TodoPresetButtonSyncCardHandler extends IsolationMQListener { +@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 class TodoPresetButtonSyncCardListener extends IsolationMQListener { private final TodoSyncCardService todoSyncCardService; - TodoPresetButtonSyncCardHandler(TodoSyncCardService todoSyncCardService) { + TodoPresetButtonSyncCardListener(TodoSyncCardService todoSyncCardService) { super(ConsumerIsolation.TODO_PRESET_BUTTON_CLICKED_SYNC_CARD, MqMessageType.TODO_PRESET_BUTTON_PRESSED); this.todoSyncCardService = todoSyncCardService; diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java similarity index 69% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java index e3b09bcc..6cce3b2b 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java @@ -8,6 +8,8 @@ import cn.axzo.msg.center.mq.IsolationMQListener; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.ConsumeMode; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.springframework.stereotype.Component; /** @@ -15,11 +17,17 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -class TodoSyncCardBizHandler extends IsolationMQListener { +@RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_sync_card_biz_${spring.profiles.active}", + consumeMode = ConsumeMode.ORDERLY, + nameServer = "${rocketmq.name-server}", + maxReconsumeTimes = 3 +) +class TodoSyncCardBizListener extends IsolationMQListener { private final TodoSyncCardService todoSyncCardService; - TodoSyncCardBizHandler(TodoSyncCardService todoSyncCardService) { + TodoSyncCardBizListener(TodoSyncCardService todoSyncCardService) { super(ConsumerIsolation.TODO_SYNC_CARD_BIZ, MqMessageType.TODO_STATE_UPDATE); this.todoSyncCardService = todoSyncCardService; } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java similarity index 69% rename from inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java rename to inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java index 900eb7a7..bd4b8374 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowHandler.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java @@ -8,6 +8,8 @@ import cn.axzo.msg.center.mq.IsolationMQListener; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.ConsumeMode; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.springframework.stereotype.Component; /** @@ -15,11 +17,17 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -class TodoSyncCardFlowHandler extends IsolationMQListener { +@RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_sync_card_flow_${spring.profiles.active}", + consumeMode = ConsumeMode.ORDERLY, + nameServer = "${rocketmq.name-server}", + maxReconsumeTimes = 3 +) +class TodoSyncCardFlowListener extends IsolationMQListener { private final TodoSyncCardService todoSyncCardService; - TodoSyncCardFlowHandler(TodoSyncCardService todoSyncCardService) { + TodoSyncCardFlowListener(TodoSyncCardService todoSyncCardService) { super(ConsumerIsolation.TODO_SYNC_CARD_FLOW, MqMessageType.TODO_STATE_UPDATE); this.todoSyncCardService = todoSyncCardService; } 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 c1f70e84..8c0fdc1a 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 @@ -139,100 +139,4 @@ public class RocketMQConfig { }); } - @Slf4j - @Component - @RocketMQMessageListener(topic = "topic_msg_center_${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 CardPresetButtonSyncTodoListener extends BaseListener implements RocketMQListener { - - @Autowired - private EventConsumer eventConsumer; - - @Override - public void onMessage(MessageExt message) { - ConsumerIsolation.setIsolation(ConsumerIsolation.CARD_PRESET_BUTTON_CLICKED_SYNC_TODO); - try { - super.onEvent(message, eventConsumer); - } finally { - ConsumerIsolation.clearIsolation(); - } - } - } - - @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; - - @Override - public void onMessage(MessageExt message) { - ConsumerIsolation.setIsolation(ConsumerIsolation.TODO_PRESET_BUTTON_CLICKED_SYNC_CARD); - try { - super.onEvent(message, eventConsumer); - } finally { - ConsumerIsolation.clearIsolation(); - } - } - } - - @Slf4j - @Component - @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_todo_sync_card_biz_${spring.profiles.active}", - consumeMode = ConsumeMode.ORDERLY, - nameServer = "${rocketmq.name-server}", - maxReconsumeTimes = 3 - ) - public static class TodoSyncCardBizListener extends BaseListener implements RocketMQListener { - - @Autowired - private EventConsumer eventConsumer; - - @Override - public void onMessage(MessageExt message) { - ConsumerIsolation.setIsolation(ConsumerIsolation.TODO_SYNC_CARD_BIZ); - try { - super.onEvent(message, eventConsumer); - } finally { - ConsumerIsolation.clearIsolation(); - } - } - } - - @Slf4j - @Component - @RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_todo_sync_card_flow_${spring.profiles.active}", - consumeMode = ConsumeMode.ORDERLY, - nameServer = "${rocketmq.name-server}", - maxReconsumeTimes = 3 - ) - public static class TodoSyncCardFlowListener extends BaseListener implements RocketMQListener { - - @Autowired - private EventConsumer eventConsumer; - - @Override - public void onMessage(MessageExt message) { - ConsumerIsolation.setIsolation(ConsumerIsolation.TODO_SYNC_CARD_FLOW); - try { - super.onEvent(message, eventConsumer); - } finally { - ConsumerIsolation.clearIsolation(); - } - } - } - } \ No newline at end of file From 11e21abee27c5aae7ad6eeb5cd0dbb0ca358f78f Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 11:15:53 +0800 Subject: [PATCH 106/111] =?UTF-8?q?REQ-3502:=20=E6=B6=88=E6=81=AF=E8=80=85?= =?UTF-8?q?=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todo/card/CardPresetButtonSyncTodoListener.java | 7 ++++--- .../todo/card/TodoPresetButtonSyncCardListener.java | 7 ++++--- .../message/service/todo/card/TodoSyncCardBizListener.java | 7 ++++--- .../service/todo/card/TodoSyncCardFlowListener.java | 7 ++++--- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java index df4565ed..4fc4d822 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java @@ -16,11 +16,12 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_card_preset_button_sync_todo_${spring.profiles.active}", +@RocketMQMessageListener( + maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - maxReconsumeTimes = 3 + topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_card_preset_button_sync_todo_${spring.profiles.active}" ) public class CardPresetButtonSyncTodoListener extends IsolationMQListener { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java index f57f09bc..eed0a0ec 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java @@ -16,11 +16,12 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_todo_preset_button_sync_card_${spring.profiles.active}", +@RocketMQMessageListener( + maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - maxReconsumeTimes = 3 + topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_preset_button_sync_card_${spring.profiles.active}" ) public class TodoPresetButtonSyncCardListener extends IsolationMQListener { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java index 6cce3b2b..b15c6c18 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java @@ -17,11 +17,12 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_todo_sync_card_biz_${spring.profiles.active}", +@RocketMQMessageListener( + maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - maxReconsumeTimes = 3 + topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_sync_card_biz_${spring.profiles.active}" ) class TodoSyncCardBizListener extends IsolationMQListener { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java index bd4b8374..b9da1cce 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java @@ -17,11 +17,12 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -@RocketMQMessageListener(topic = "topic_msg_center_${spring.profiles.active}", - consumerGroup = "GID_topic_todo_sync_card_flow_${spring.profiles.active}", +@RocketMQMessageListener( + maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - maxReconsumeTimes = 3 + topic = "topic_msg_center_${spring.profiles.active}", + consumerGroup = "GID_topic_todo_sync_card_flow_${spring.profiles.active}" ) class TodoSyncCardFlowListener extends IsolationMQListener { From dee81decd6f817c856abbe3e96ca791d352e518d Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 11:38:32 +0800 Subject: [PATCH 107/111] =?UTF-8?q?REQ-3502:=20=E6=B6=88=E6=81=AF=E8=80=85?= =?UTF-8?q?=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/todo/card/CardPresetButtonSyncTodoListener.java | 3 ++- .../service/todo/card/TodoPresetButtonSyncCardListener.java | 3 ++- .../message/service/todo/card/TodoSyncCardBizListener.java | 3 ++- .../message/service/todo/card/TodoSyncCardFlowListener.java | 3 ++- .../src/main/java/cn/axzo/msg/center/mq/RocketMQConfig.java | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java index 4fc4d822..0bdb69f4 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java @@ -5,6 +5,7 @@ import cn.axzo.framework.rocketmq.EventConsumer; import cn.axzo.msg.center.api.mq.CardPresetButtonPressedMessage; import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.mq.IsolationMQListener; +import cn.axzo.msg.center.mq.RocketMQConfig; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.ConsumeMode; @@ -20,7 +21,7 @@ import org.springframework.stereotype.Component; maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - topic = "topic_msg_center_${spring.profiles.active}", + topic = RocketMQConfig.MSG_CENTER_TOPIC, consumerGroup = "GID_topic_card_preset_button_sync_todo_${spring.profiles.active}" ) public class CardPresetButtonSyncTodoListener extends IsolationMQListener { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java index eed0a0ec..330a4fcf 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java @@ -5,6 +5,7 @@ import cn.axzo.framework.rocketmq.EventConsumer; import cn.axzo.msg.center.api.mq.PresetButtonPressedMessage; import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.mq.IsolationMQListener; +import cn.axzo.msg.center.mq.RocketMQConfig; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.ConsumeMode; @@ -20,7 +21,7 @@ import org.springframework.stereotype.Component; maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - topic = "topic_msg_center_${spring.profiles.active}", + topic = RocketMQConfig.MSG_CENTER_TOPIC, consumerGroup = "GID_topic_todo_preset_button_sync_card_${spring.profiles.active}" ) public class TodoPresetButtonSyncCardListener extends IsolationMQListener { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java index b15c6c18..a0123cd8 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java @@ -5,6 +5,7 @@ import cn.axzo.framework.rocketmq.EventConsumer; import cn.axzo.msg.center.api.mq.TodoUpdateMessage; import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.mq.IsolationMQListener; +import cn.axzo.msg.center.mq.RocketMQConfig; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; @@ -21,7 +22,7 @@ import org.springframework.stereotype.Component; maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - topic = "topic_msg_center_${spring.profiles.active}", + topic = RocketMQConfig.MSG_CENTER_TOPIC, consumerGroup = "GID_topic_todo_sync_card_biz_${spring.profiles.active}" ) class TodoSyncCardBizListener extends IsolationMQListener { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java index b9da1cce..efcf006a 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java @@ -5,6 +5,7 @@ import cn.axzo.framework.rocketmq.EventConsumer; import cn.axzo.msg.center.api.mq.TodoUpdateMessage; import cn.axzo.msg.center.mq.ConsumerIsolation; import cn.axzo.msg.center.mq.IsolationMQListener; +import cn.axzo.msg.center.mq.RocketMQConfig; import cn.axzo.msg.center.service.enums.BizCategoryEnum; import cn.axzo.msg.center.service.enums.MqMessageType; import lombok.extern.slf4j.Slf4j; @@ -21,7 +22,7 @@ import org.springframework.stereotype.Component; maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", - topic = "topic_msg_center_${spring.profiles.active}", + topic = RocketMQConfig.MSG_CENTER_TOPIC, consumerGroup = "GID_topic_todo_sync_card_flow_${spring.profiles.active}" ) class TodoSyncCardFlowListener extends IsolationMQListener { 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 8c0fdc1a..94df03a4 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 @@ -40,8 +40,9 @@ import java.util.function.Consumer; public class RocketMQConfig { public static final String APP_NAME = "MSG-CENTER"; + public static final String MSG_CENTER_TOPIC = "topic_msg_center_${spring.profiles.active}"; - @Value("topic_msg_center_${spring.profiles.active}") + @Value(MSG_CENTER_TOPIC) private String topic; @Bean From 943536531773d9547a443aaded7e62860301cbb2 Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 15:17:16 +0800 Subject: [PATCH 108/111] =?UTF-8?q?REQ-3502:=20=E6=B6=88=E6=81=AF=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/todo/card/CardPresetButtonSyncTodoListener.java | 1 + .../service/todo/card/TodoPresetButtonSyncCardListener.java | 1 + .../message/service/todo/card/TodoSyncCardBizListener.java | 1 + .../message/service/todo/card/TodoSyncCardFlowListener.java | 1 + 4 files changed, 4 insertions(+) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java index 0bdb69f4..fbf7bbe2 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/CardPresetButtonSyncTodoListener.java @@ -18,6 +18,7 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RocketMQMessageListener( + consumeThreadMax = 2, maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java index 330a4fcf..f3339443 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoPresetButtonSyncCardListener.java @@ -18,6 +18,7 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RocketMQMessageListener( + consumeThreadMax = 2, maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java index a0123cd8..608afac1 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardBizListener.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RocketMQMessageListener( + consumeThreadMax = 2, maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java index efcf006a..39c903c7 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/todo/card/TodoSyncCardFlowListener.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Component; @Slf4j @Component @RocketMQMessageListener( + consumeThreadMax = 2, maxReconsumeTimes = 3, consumeMode = ConsumeMode.ORDERLY, nameServer = "${rocketmq.name-server}", From 0a5cbf0a3b743bf3fa5bcc9273d5537a71d7b7b7 Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 20 Jan 2025 09:42:05 +0800 Subject: [PATCH 109/111] =?UTF-8?q?REQ-3502:=20=E5=91=8A=E8=AD=A6=E6=97=B6?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=89=8B=E6=9C=BA=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/msg/center/notices/service/impl/MnsLimiter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MnsLimiter.java b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MnsLimiter.java index a231b04c..4cfbc8bf 100644 --- a/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MnsLimiter.java +++ b/msg-notices/msg-notices-service/src/main/java/cn/axzo/msg/center/notices/service/impl/MnsLimiter.java @@ -60,6 +60,7 @@ public class MnsLimiter { error = String.format("验证码短信: 每 %s 分钟发送给同一个手机号的重复内容不能超过 %s 条。 请勿重试发送!!", props.getVerifyCodeLimitWindowMinutes(), limitCount); } + error += " [" + request.getPhoneNo() + "]"; if (alreadySendCount + 1 > limitCount) { log.warn("mns rate limited, {}, request={}", error, request); throw new ServiceException(ReturnCodeEnum.FAIL.getCode(), error); From c69821dcfba796e00bfbe19be264a10c725124dc Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 18 Feb 2025 16:00:36 +0800 Subject: [PATCH 110/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E8=BE=85?= =?UTF-8?q?=E5=8A=A9=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/msg/center/common/utils/BizAssertions.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java b/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java index 3a4dc9b2..fa41244e 100644 --- a/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java +++ b/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java @@ -21,6 +21,10 @@ import java.util.Objects; @Slf4j public class BizAssertions { + public static void fail(String message, Object... args) { + throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage()); + } + /** * 断言为NULL */ From 676b146978b64ba4c5caf356c65793e7acdc045c Mon Sep 17 00:00:00 2001 From: yanglin Date: Tue, 18 Feb 2025 16:02:58 +0800 Subject: [PATCH 111/111] =?UTF-8?q?REQ-3502:=20=E6=B7=BB=E5=8A=A0=E8=BE=85?= =?UTF-8?q?=E5=8A=A9=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/msg/center/common/utils/BizAssertions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java b/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java index fa41244e..42dbb8c0 100644 --- a/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java +++ b/msg-center-common/src/main/java/cn/axzo/msg/center/common/utils/BizAssertions.java @@ -21,8 +21,8 @@ import java.util.Objects; @Slf4j public class BizAssertions { - public static void fail(String message, Object... args) { - throw new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage()); + public static ServiceException fail(String message, Object... args) { + return new ServiceException(MessageFormatter.arrayFormat(message, args).getMessage()); } /**