feat(mmsmapping): 添加 XML 映射生成功能和波形标记功能

- 新增 getXmlFromJsonApi 接口用于从 JSON 生成 XML 映射
- 添加 XML 映射相关的数据结构定义和响应处理
- 实现 XML 映射生成功能,支持 JSON 到 XML 的转换
- 添加波形图表点击事件处理和标记功能
- 实现趋势图表的标记点显示和标签功能
- 更新界面以支持 XML 映射预览和导出
- 优化图表交互体验,添加标记工具模式
- 重构部分界面组件以支持新的映射功能
This commit is contained in:
2026-05-08 09:54:52 +08:00
parent fe3ab1f679
commit a1e1fb124a
16 changed files with 1821 additions and 210 deletions

View File

@@ -2,14 +2,14 @@
<section class="mapping-panel config-panel">
<div class="panel-header">
<div>
<h2 class="panel-title">请求配置</h2>
<p class="panel-description">这里展示并可继续编辑经人工确认后生成的 request.indexSelection</p>
<h2 class="panel-title">人工索引配置</h2>
<p class="panel-description">展示现有的人工索引配置并允许继续编辑</p>
</div>
<div class="panel-actions">
<el-button
v-if="showConfirmButton"
type="primary"
plain
:icon="EditPen"
:disabled="!canConfirm"
@click="emit('confirm-config')"
>
@@ -19,11 +19,11 @@
v-if="showGenerateButton"
type="primary"
:icon="Connection"
:loading="isSubmitting"
:loading="isGenerating"
:disabled="!canGenerate"
@click="emit('generate')"
>
生成映射
生成JSON映射
</el-button>
</div>
</div>
@@ -39,7 +39,7 @@
:disabled="isSubmitting"
:rows="18"
resize="none"
placeholder="人工确认完成后,这里会自动回填 request.indexSelection,仍可继续直接编辑。"
placeholder="人工索引配置完成后,这里会自动回填索引配置,仍可继续直接编辑。"
@update:model-value="value => emit('update:indexSelectionJson', String(value || ''))"
/>
</div>
@@ -50,7 +50,7 @@
</template>
<script setup lang="ts">
import { Connection } from '@element-plus/icons-vue'
import { Connection, EditPen } from '@element-plus/icons-vue'
defineOptions({
name: 'MappingConfigPanel'
@@ -59,6 +59,7 @@ defineOptions({
defineProps<{
indexSelectionJson: string
isSubmitting: boolean
isGenerating: boolean
canGenerate: boolean
jsonError: string
showGenerateButton: boolean
@@ -103,8 +104,10 @@ const emit = defineEmits<{
.panel-actions {
display: flex;
flex-wrap: wrap;
flex-wrap: nowrap;
align-items: center;
gap: 12px;
white-space: nowrap;
}
.panel-title {
@@ -132,9 +135,9 @@ const emit = defineEmits<{
}
.panel-section {
border: 1px solid #e5e7eb;
border-radius: 12px;
background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%);
border: none;
border-radius: 0;
background: transparent;
}
.result-card {
@@ -142,13 +145,17 @@ const emit = defineEmits<{
flex: 1;
flex-direction: column;
min-height: 0;
padding: 16px;
padding: 0;
overflow: hidden;
}
.index-selection-textarea {
flex: 1;
min-height: 0;
margin-top: 0;
}
.json-alert + .index-selection-textarea {
margin-top: 16px;
}