{"record":{"id":"87b08e7deda10953","repo":"YunaiV/yudao-cloud","slug":"error-87b08e","errorCode":null,"errorMessage":"不支持的延迟类型：{}","messagePattern":"不支持的延迟类型：(.+?)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":500,"severity":"error","filePath":"yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java","lineNumber":744,"sourceCode":"        public List<FlowElement> convertList(BpmSimpleModelNodeVO node) {\n            List<FlowElement> flowElements = new ArrayList<>(2);\n            // 1. 构建接收任务，通过接收任务可卡住节点\n            ReceiveTask receiveTask = new ReceiveTask();\n            receiveTask.setId(node.getId());\n            receiveTask.setName(node.getName());\n            flowElements.add(receiveTask);\n\n            // 2. 添加接收任务的 Timer Boundary Event\n            if (node.getDelaySetting() != null) {\n                BoundaryEvent boundaryEvent = null;\n                if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())) {\n                    boundaryEvent = buildTimeoutBoundaryEvent(receiveTask, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(),\n                            null, null, node.getDelaySetting().getDelayTime());\n                } else if (node.getDelaySetting().getDelayType().equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType())) {\n                    boundaryEvent = buildTimeoutBoundaryEvent(receiveTask, BpmBoundaryEventTypeEnum.DELAY_TIMER_TIMEOUT.getType(),\n                            node.getDelaySetting().getDelayTime(), null, null);\n                } else {\n                    throw new UnsupportedOperationException(\"不支持的延迟类型：\" + node.getDelaySetting());\n                }\n                flowElements.add(boundaryEvent);\n            }\n            return flowElements;\n        }\n\n        @Override\n        public BpmSimpleModelNodeTypeEnum getType() {\n            return BpmSimpleModelNodeTypeEnum.DELAY_TIMER_NODE;\n        }\n    }\n\n    public static class TriggerNodeConvert implements NodeConvert {\n\n        @Override\n        public List<? extends FlowElement> convertList(BpmSimpleModelNodeVO node) {\n            Assert.notNull(node.getTriggerSetting(), \"触发器节点设置不能为空\");\n            List<FlowElement> flowElements = new ArrayList<>(2);","sourceCodeStart":726,"sourceCodeEnd":762,"githubUrl":"https://github.com/YunaiV/yudao-cloud/blob/477be9dd49ab7223a972a6abdff0684d6423dec3/yudao-module-bpm/yudao-module-bpm-server/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/util/SimpleModelUtils.java#L726-L762","documentation":"While converting a BPM simple-model DELAY_TIMER_NODE to Flowable BPMN, SimpleModelUtils throws UnsupportedOperationException when delaySetting.delayType is neither FIXED_DATE_TIME (delay until an absolute time) nor FIXED_TIME_TIME_DURATION — here FIXED_TIME_DURATION (delay by a duration). The two supported types map to a Timer Boundary Event with a timeDate vs timeDuration expression; any other value has no BPMN representation in this converter.","triggerScenarios":"A delay timer node in the simple designer whose delayType is null or an out-of-range integer (e.g. 3+); process JSON imported from a version whose BpmDelayTimerTypeEnum defines more types than the deployed server supports; delaySetting present but delayType left unset by the frontend.","commonSituations":"Frontend designer newer than backend server (extra delay types); manually crafted simple-model JSON; partial save leaving delayType null while delaySetting object exists.","solutions":["Set delayType to 1 (FIXED_DATE_TIME) or 2 (FIXED_TIME_DURATION) on the delay node in the designer","Upgrade the BPM server module to the version whose enum covers the delay type the designer emits","Ensure the frontend always sends a delayType whenever a delaySetting object is attached"],"exampleFix":"// before (process JSON node)\n{\"type\":\"DELAY_TIMER_NODE\",\"delaySetting\":{\"delayType\":null,\"delayTime\":\"PT10M\"}}\n\n// after\n{\"type\":\"DELAY_TIMER_NODE\",\"delaySetting\":{\"delayType\":2,\"delayTime\":\"PT10M\"}} // 2 = FIXED_TIME_DURATION","handlingStrategy":"validation","validationCode":"Integer t = node.getDelaySetting() != null ? node.getDelaySetting().getDelayType() : null;\nif (t == null || !(t.equals(BpmDelayTimerTypeEnum.FIXED_DATE_TIME.getType())\n        || t.equals(BpmDelayTimerTypeEnum.FIXED_TIME_DURATION.getType()))) {\n    throw new IllegalArgumentException(\"delayType 必须为 1(固定时间点) 或 2(固定时长)\");\n}","typeGuard":"boolean isValidDelayType(Integer delayType) {\n    return delayType != null && Arrays.stream(BpmDelayTimerTypeEnum.values())\n        .anyMatch(e -> e.getType().equals(delayType));\n}","tryCatchPattern":null,"preventionTips":["Make delayType a required field in the designer when a delay node is added","Validate simple-model JSON server-side before BPMN conversion","Version-check designer and server enums after upgrades"],"tags":["bpm","flowable","delay-timer","simple-model","validation"],"backgroundTag":null,"analyzedSha":"477be9dd49ab7223a972a6abdff0684d6423dec3","analyzedAt":"2026-08-14T13:35:31.121Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}