From 6d151429af7a89d7f568c7d62538dde700591dbe Mon Sep 17 00:00:00 2001 From: yanglin Date: Mon, 30 Dec 2024 18:15:37 +0800 Subject: [PATCH] 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