Groovy脚本修改:识别ScheduleLine数组并转换Quantity字段类型
问题解决:将ScheduleLineOrderQuantity转为数字类型并正确访问嵌套字段
问题分析
原脚本中访问_PurchaseOrderScheduleLineTP的逻辑错误,该数组是嵌套在_PurchaseOrderItem对象下的属性,不能直接全局遍历。必须先遍历每个采购订单条目,再遍历其下的计划行数组,才能完成字段类型转换。
修正后的Groovy脚本
import com.sap.gateway.ip.core.customdev.util.Message; import java.util.HashMap; import groovy.json.* def Message processData(Message message) { def body = message.getBody(java.lang.String); def object = new JsonSlurper().parseText(body) // 处理采购订单条目内的数字字段转换 object._PurchaseOrderItem.each{ purchaseOrderItem -> purchaseOrderItem.NetPriceQuantity = purchaseOrderItem.NetPriceQuantity.toDouble().intValue() purchaseOrderItem.NetAmount = purchaseOrderItem.NetAmount.toDouble() purchaseOrderItem.GrossAmount = purchaseOrderItem.GrossAmount.toDouble() purchaseOrderItem.OrderQuantity = purchaseOrderItem.OrderQuantity.toDouble() purchaseOrderItem.NetPriceAmount = purchaseOrderItem.NetPriceAmount.toDouble() // 处理当前条目下的计划行数组 purchaseOrderItem._PurchaseOrderScheduleLineTP.each{ scheduleLine -> // 将字符串类型的ScheduleLineOrderQuantity转为整数(需保留小数可直接用toDouble()) scheduleLine.ScheduleLineOrderQuantity = scheduleLine.ScheduleLineOrderQuantity.toDouble().intValue() } } message.setBody(JsonOutput.toJson(object)); return message; }
关键修正说明
- 正确访问嵌套数组:在
_PurchaseOrderItem的遍历循环内部,通过purchaseOrderItem._PurchaseOrderScheduleLineTP获取当前条目下的计划行数组,再逐个遍历处理。 - 字段类型转换:调用
toDouble().intValue()将字符串转为整数,若业务需要保留小数,直接使用toDouble()即可。 - 可读性优化:将原脚本中过长的变量名简化为
purchaseOrderItem、scheduleLine,避免重复的下划线前缀干扰阅读。
转换后Payload效果
_PurchaseOrderScheduleLineTP中的ScheduleLineOrderQuantity会从字符串"10"变为数字10,示例片段如下:
"_PurchaseOrderScheduleLineTP": [{ "ScheduleLineDeliveryDate": "2024-05-14", "SchedLineStscDeliveryDate": "2024-05-14", "ScheduleLineOrderQuantity": 10, "PurchaseOrderQuantityUnit": "EA", "Currency": "USD" }]
内容的提问来源于stack exchange,提问作者Sg141
相关产品推荐
相关产品推荐

