DataWeave reduce函数内实现VEH01计数器按HL4分组自增重置
DataWeave EDI 811报文HL分组VEH01序号实现方案
核心实现逻辑
不需要定义全局计数器或者递归函数,直接利用DataWeave map算子自带的局部索引特性即可满足需求:每个HL4节点遍历自身下属HL5记录时,map返回的索引值会从0独立计数,索引+1就是要求的从1开始的递增序号,切换到下一个HL4节点时,map算子会重新初始化索引,自动完成计数器重置。
代码示例
原有固定赋值的错误写法参考
// 原有逻辑:VEH01固定赋值1,无法实现分组计数 payload.HL_Loop map ((hl4Node) -> do { // HL4节点原有字段映射保持不变 HL4_ID: hl4Node.id, HL5_List: hl4Node.HL5_Records map ((hl5Node) -> do { VEH_Segment: { VEH01: 1, // 原有固定赋值逻辑 // 其余VEH段字段原有映射保持不变 VEH02: hl5Node.vin, VEH03: hl5Node.model } }) })
修正后可实现分组自增的写法
%dw 2.0 output application/json --- payload.HL_Loop map ((hl4Node) -> do { // HL4节点所有原有字段映射完全保留,无需修改 HL4_ID: hl4Node.id, HL4_Name: hl4Node.name, // 遍历当前HL4下属HL5记录时,接收map的第二个索引参数 HL5_List: hl4Node.HL5_Records map ((hl5Node, hl5Index) -> do { // HL5节点其余原有字段映射完全保留 HL5_Seq: hl5Node.seq, VEH_Segment: { // 核心修改:局部索引从0开始,+1后即为同组内1、2、3...的连续序号 VEH01: hl5Index + 1, // 其余VEH段字段原有映射逻辑完全不变 VEH02: hl5Node.vin, VEH03: hl5Node.model, VEH04: hl5Node.productionDate } }) })
非嵌套HL结构适配方案
如果输入JSON中HL4、HL5、VEH段为平级存储、靠父级ID关联归属关系,先筛选出当前HL4归属的所有VEH段再做索引计数即可,示例代码如下:
%dw 2.0 output application/json --- payload.HL_Loop filter ((item) -> item.level == "HL4") map ((hl4Node) -> do { // 筛选所有归属当前HL4的VEH段 currentGroupVeh = payload.VEH_Segments filter ((veh) -> veh.parentHLId == hl4Node.id) --- HL4_ID: hl4Node.id, // 对筛选出的同组VEH段做索引计数 VEH_List: currentGroupVeh map ((vehItem, vehIdx) -> vehItem update { case .VEH01 -> vehIdx + 1 }) })
注意:所有原有字段映射、字段标识、业务处理逻辑均不需要调整,仅替换VEH01的赋值逻辑即可,该方案无额外性能损耗,计数逻辑完全符合EDI 811报文规范要求。
内容的提问来源于stack exchange,提问作者SSe
相关产品推荐
相关产品推荐

