You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:30:52