Files
CN_Tool/tools/mms-mapping
caizhouyu 98b3f0dbe8 feat(mms-mapping): 添加ICD转XML映射功能
- 新增DefaultCfgToXml.txt模板文件,定义报告列表、逻辑节点分类、相别、倍数器、单位等配置项
- 添加IcdToXmlGenerateCommand类,封装ICD文件转换命令参数,包括文件名、字节流、版本号等属性
- 创建IcdToXmlGenerateRequest类,定义ICD转XML生成请求参数,包含版本号、作者、保存选项等字段
- 实现IcdToXmlGenerateResult类,封装转换结果,包含状态、消息、IED名称、LD实例等信息
- 开发IcdToXmlMappingService组件,提供索引映射配置和统计数据分析功能
- 添加IcdToXmlRequestConverter组件,实现请求参数到命令对象的转换逻辑
- 创建IcdToXmlResponse类,定义ICD转XML响应结构,包含状态、消息、映射文档等属性
- 实现IcdToXmlResponseConverter组件,将结果对象转换为响应对象
- 添加IcdToXmlTaskAppService服务,协调各个组件完成ICD到XML的完整转换流程
- 集成ICD解析、模板加载、索引分析、验证、映射生成等核心功能模块
2026-04-29 15:16:44 +08:00
..
2026-04-23 11:06:04 +08:00
2026-04-17 16:31:38 +08:00
2026-04-23 11:06:04 +08:00

mms-mapping

mms-mapping 模块负责解析 ICD 文件并生成 MMS 映射数据。当前统一调试入口为 getIcdMmsJson,该接口同时覆盖“先解析 ICD 获取索引候选”和“确认索引后生成正式 MMS JSON”两类场景。

1. 接口信息

  • 路径:POST /api/mms-mapping/get-icd-mms-json
  • Content-Typemultipart/form-data
  • 控制器:MappingController#getIcdMmsJson
  • 说明:上传 ICD 文件后,后端先解析 ICD再根据 request.indexSelection 决定返回候选结果还是正式映射结果

说明:

  • request.indexSelection 为空时,接口返回 NEED_INDEX_SELECTION,用于指导前端或调试人员完成标签与 lnInst 绑定。
  • request.indexSelection 有效时,接口返回 SUCCESS,直接给出 mappingJson,必要时同时落盘。
  • 该接口每次都会重新解析上传的 ICD 文件,因此二次调试时仍需要重新上传同一个 ICD 文件。

2. 调试流程

2.1 第一次调试

用途:只上传 ICD先拿到 icdDocumentindexCandidates

预期结果:

  • status = NEED_INDEX_SELECTION
  • 返回 icdDocument
  • 返回 indexCandidates

2.2 第二次调试

用途:根据第一次返回的 indexCandidates 组装 request.indexSelection,再次调用同一个接口生成正式 MMS JSON。

预期结果:

  • status = SUCCESS
  • 返回 mappingJson
  • saveToDisk=true 时返回 savedPath

3. 请求参数

3.1 form-data 参数

参数名 类型 必填 说明
icdFile File ICD 文件
request JSON Part 生成参数,必须按 application/json 发送

3.2 request JSON 结构

{
  "version": "20260421",
  "author": "debug-user",
  "saveToDisk": false,
  "prettyJson": true,
  "outputDir": "D:/temp/mms-output",
  "indexSelection": [
    {
      "groupKey": "harm",
      "groupDesc": "谐波数据",
      "bindings": [
        {
          "reportName": "brcbStHarm",
          "dataSetName": "dsStHarm",
          "label": "A相",
          "lnInst": "1"
        }
      ]
    }
  ]
}

3.3 request 字段说明

字段 类型 必填 说明
version String 映射版本号;为空时由后端按当前日期补齐
author String 作者;为空时使用模块默认作者
saveToDisk boolean 是否将生成结果写入磁盘
prettyJson boolean 是否生成格式化 JSON
outputDir String 输出目录;仅 saveToDisk=true 时生效
indexSelection Array 标签与 lnInst 的最终绑定关系;为空时只返回候选结果

3.4 indexSelection 字段说明

字段 类型 必填 说明
groupKey String 分组唯一键,必须使用第一次响应里返回的原值
groupDesc String 分组描述,便于调试查看
bindings Array 当前分组下最终确认的绑定列表

3.5 bindings 字段说明

字段 类型 必填 说明
reportName String 报告名称
dataSetName String 数据集名称
label String 模板标签
lnInst String 实际绑定的逻辑节点实例值

4. 调试示例

4.1 第一次调用,只获取候选结果

curl.exe -X POST "http://localhost:8080/api/mms-mapping/get-icd-mms-json" `
  -H "Accept: application/json" `
  -F 'icdFile=@D:/data/demo.icd' `
  -F 'request={"version":"20260421","author":"debug-user","prettyJson":true,"saveToDisk":false};type=application/json'

4.2 第二次调用,带索引绑定直接生成 MMS JSON

curl.exe -X POST "http://localhost:8080/api/mms-mapping/get-icd-mms-json" `
  -H "Accept: application/json" `
  -F 'icdFile=@D:/data/demo.icd' `
  -F 'request={"version":"20260421","author":"debug-user","prettyJson":true,"saveToDisk":false,"indexSelection":[{"groupKey":"harm","groupDesc":"谐波数据","bindings":[{"reportName":"brcbStHarm","dataSetName":"dsStHarm","label":"A相","lnInst":"1"},{"reportName":"brcbStHarm","dataSetName":"dsStHarm","label":"B相","lnInst":"2"},{"reportName":"brcbStHarm","dataSetName":"dsStHarm","label":"C相","lnInst":"3"}]}]};type=application/json'

5. 响应说明

接口统一返回 MappingTaskResponse。由于响应对象使用了 @JsonInclude(JsonInclude.Include.NON_EMPTY),空字段和空集合默认不会出现在最终 JSON 中。

5.1 NEED_INDEX_SELECTION

适用场景:未传 indexSelection,或绑定关系不完整、不合法。

{
  "status": "NEED_INDEX_SELECTION",
  "message": "索引配置缺失,请根据候选信息完成标签与数字索引的绑定后重新提交",
  "icdDocument": {
    "fileName": "demo.icd",
    "iedName": "IED1",
    "ldInst": "LD0",
    "ldPrefix": "LD",
    "logicalNodes": [
      {
        "lnInst": "1"
      }
    ]
  },
  "indexCandidates": [
    {
      "groupKey": "harm",
      "groupDesc": "谐波数据",
      "reportCount": 1,
      "templateLabels": [
        "A相",
        "B相",
        "C相"
      ],
      "reports": [
        {
          "reportName": "brcbStHarm",
          "dataSetName": "dsStHarm",
          "reportDesc": "谐波报告",
          "availableLnInstValues": [
            "1",
            "2",
            "3"
          ]
        }
      ]
    }
  ]
}

说明:

  • icdDocument 实际返回内容会比示例更大,这里只保留关键字段用于说明结构。
  • 如果绑定值非法,还会额外返回 problems,提示缺失或不匹配的绑定项。

5.2 SUCCESS

适用场景:indexSelection 校验通过,映射成功生成。

{
  "status": "SUCCESS",
  "message": "映射生成成功",
  "mappingJson": "{\n  \"ied\": \"IED1\",\n  \"ld\": \"LD\",\n  \"instList\": []\n}"
}

说明:

  • mappingJson 是字符串字段,字段值本身也是一段 JSON 文本。
  • saveToDisk=true 时,响应中还会返回 savedPath

5.3 FAILED

适用场景ICD 解析失败、模板校验失败、文件读取失败或其他运行异常。

{
  "status": "FAILED",
  "message": "映射生成失败ICD 文件不能为空",
  "problems": [
    "ICD 文件不能为空"
  ]
}

6. Postman 调试注意事项

  • Body 选择 form-data
  • icdFile 类型选择 File
  • request 类型保持文本,但该 Part 的 Content-Type 需要设置为 application/json
  • 第一次调试建议不要传 indexSelection,先观察 indexCandidatesavailableLnInstValues
  • 第二次调试时必须继续上传 ICD 文件,并按第一次返回的 groupKeyreportNamedataSetNameavailableLnInstValues 组装绑定关系。

7. 当前限制

  • 当前仅补充调试文档,未改动 mms-mapping 业务代码。
  • 当前未执行 mvn 编译、打包或接口联调验证。
  • 示例响应中的 icdDocumentmappingJson 为结构化示意,实际字段数量以运行结果为准。