From 7428c69723d62670e7e6e0bb5d220e6010d4f49d Mon Sep 17 00:00:00 2001 From: yanglin Date: Fri, 17 Jan 2025 09:50:32 +0800 Subject: [PATCH] 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