Camunda中Groovy脚本从数组变量获取最大ProtocolNum对应文档ID问题
解决Camunda Groovy脚本提取最大ProtocolNum对应ID的问题
核心问题排查
- 变量类型未转换:Camunda的JSON Object变量默认是
JsonValue类型,直接遍历会触发类型不匹配,需先转成Groovy可识别的Map/List。 - 键名匹配错误:你提到的键是
protocol num,若代码里误用驼峰式ProtocolNum,会导致取不到值,进而引发后续类型异常。 - 数值类型不兼容:如果
protocol num是字符串格式的数字,直接比较会按字符串规则排序(比如"10"<"9"),必须先转成数值类型。
正确Groovy脚本示例
假设输入变量名为externalTaskOutput(JSON结构示例:{ "documents": [{"id": "doc1", "protocol num": "123"}, {"id": "doc2", "protocol num": "456"}] }):
// 1. 将Camunda JSON变量转为Groovy可操作的Map def outputMap = externalTaskOutput.getValue() // 2. 取出documents数组,空数组兜底 def documents = outputMap.documents ?: [] // 3. 过滤有效文档,转换protocol num为数值类型 def validDocs = documents.findAll { doc -> doc.containsKey("protocol num") && doc.id != null }.collect { doc -> // 若为浮点数则改用toDouble() [id: doc.id, protocolNum: doc["protocol num"].toInteger()] } // 4. 找出protocolNum最大的文档,提取id def maxDoc = validDocs.max { it.protocolNum } def targetId = maxDoc ? maxDoc.id : null // 5. 将结果存入Camunda变量 execution.setVariable("maxProtocolDocId", targetId)
关键注意事项
- 必须调用
getValue()将JsonValue转为Groovy Map,避免类型不匹配。 - 键名严格一致:JSON里是
protocol num,脚本里必须用doc["protocol num"]访问,不能用点语法。 - 异常防护:加入空数组兜底和
findAll过滤,防止字段缺失或数组为空导致空指针。
内容的提问来源于stack exchange,提问作者Holloway
相关产品推荐
相关产品推荐

