Pārlūkot izejas kodu

增加数据中心-数据建模板块的多语言处理

yanglzh 1 mēnesi atpakaļ
vecāks
revīzija
b1744bad0e

+ 187 - 0
src/i18n/pages/dateCenter/en.ts

@@ -7,6 +7,36 @@ export default {
     ruleExpr: 'Rule Expression',
     reqParams: 'Request Params',
     sourceConfig: 'Source Config',
+    indicator: {
+      dialogTitleAdd: 'Add Calculation Indicator Model',
+      dialogTitleEdit: 'Edit Calculation Indicator Model',
+      labels: {
+        key: 'Indicator Key',
+        name: 'Indicator Name',
+        description: 'Description',
+        formula: 'Formula',
+        dataType: 'Data Type',
+        accuracy: 'Accuracy',
+        operators: 'Operators',
+        deviceAttr: 'Device Attribute',
+        currentFormula: 'Current Formula',
+        editFormula: 'Edit',
+      },
+      placeholders: {
+        inputKey: 'Enter indicator key',
+        inputName: 'Enter indicator name',
+        inputDescription: 'Enter description',
+        inputFormula: 'Enter formula',
+        selectDataType: 'Select data type',
+        inputAccuracy: 'Enter accuracy',
+      },
+      types: {
+        int: 'int (integer)',
+        long: 'long (long integer)',
+        float: 'float (single precision)',
+        double: 'double (double precision)',
+      },
+    },
   },
   labels: {
     sourceNameTitle: 'Source Name:',
@@ -150,4 +180,161 @@ export default {
       required: ' is required',
     },
   },
+  modeling: {
+    labels: {
+      modelKey: 'Model Key',
+      tableName: 'Table Name',
+      modelName: 'Model Name',
+      modelType: 'Model Type',
+      desc: 'Description',
+      fieldTitle: 'Field Title',
+      fieldName: 'Field Name',
+      dataSourceName: 'Data Source Name',
+      defaultValue: 'Default Value',
+      remark: 'Remark',
+      indicatorKey: 'Indicator Key',
+      indicatorName: 'Indicator Name',
+      formula: 'Formula',
+      dataType: 'Data Type',
+      second: 'Second',
+      minute: 'Minute',
+      hour: 'Hour',
+      day: 'Day',
+      custom: 'Custom',
+      method: 'Method',
+      isPk: 'Primary Key',
+      isSorting: 'Sortable',
+      sortOrder: 'Sort Order',
+      orderDesc: 'Descending',
+      orderAsc: 'Ascending',
+    },
+    methods: {
+      default: 'Default',
+      max: 'Max',
+      min: 'Min',
+      avg: 'Average',
+      sum: 'Sum',
+    },
+    types: {
+      int: 'int (integer)',
+      long: 'long (long integer)',
+      float: 'float (single precision)',
+      double: 'double (double precision)',
+      string: 'string',
+      boolean: 'boolean',
+      date: 'date',
+    },
+    fieldNode: {
+      dialogTitleAdd: 'Add Field Node',
+      dialogTitleEdit: 'Edit Field Node',
+    },
+    columns: {
+      id: 'ID',
+      name: 'Model Name',
+      type: 'Type',
+      typeName: 'Type',
+      desc: 'Description',
+      status: 'Status',
+      createdAt: 'Created At',
+      action: 'Actions',
+    },
+    placeholders: {
+      input: 'Please enter',
+      select: 'Please select',
+      inputFieldTitle: 'Please enter field title',
+      inputFieldName: 'Please enter field name',
+      inputIndicatorKey: 'Please enter indicator key',
+    },
+    actions: {
+      search: 'Search',
+      reset: 'Reset',
+      createModel: 'New Model',
+      delete: 'Delete',
+      edit: 'Edit',
+      copy: 'Copy',
+      fieldManage: 'Field Manage',
+      dataRecord: 'Data Records',
+      aggregateSetting: 'Aggregation Settings',
+      calcIndicators: 'Calculation Indicators',
+      addFieldNode: 'Add Field Node',
+      addCalcIndicator: 'New Calculation Indicator Model',
+      publish: 'Publish',
+      unpublish: 'Unpublish',
+      confirm: 'Confirm',
+      cancel: 'Cancel',
+      set: 'Set',
+    },
+    status: {
+      published: 'Published',
+      unpublished: 'Unpublished',
+    },
+    messages: {
+      tip: 'Tips',
+      selectToDelete: 'Please select the data to delete.',
+      confirmBatchDelete: 'Are you sure you want to delete the selected data?',
+      deleteModelConfirm: 'This will permanently delete the model: "{name}". Continue?',
+      deleteNodeConfirm: 'This will permanently delete the node: "{name}". Continue?',
+      deleteSuccess: 'Deleted successfully',
+      copyConfirm: 'Confirm to copy?',
+      copySuccess: 'Copied successfully',
+      operateSuccess: 'Operation succeeded',
+      confirmPublish: 'Confirm to {status}?',
+      fieldRequired: '{field} is required',
+      lettersOnly: 'Letters only',
+    },
+    aggregate: {
+      dialogTitle: 'Set Aggregation',
+      labels: {
+        groupNode: 'Group Node',
+        timeWindowNode: 'Time Window Node',
+        duration: 'Duration',
+        unit: 'Time Unit',
+      },
+      placeholders: {
+        selectGroupNode: 'Select group node',
+        selectTimeWindowNode: 'Select time window node',
+        inputDuration: 'Enter duration',
+        selectUnit: 'Select unit',
+      },
+      units: {
+        1: 'Second',
+        2: 'Minute',
+        3: 'Hour',
+        4: 'Day',
+      },
+    },
+    units: {
+      1: 'Second',
+      2: 'Minute',
+      3: 'Hour',
+      4: 'Day',
+    },
+    indicator: {
+      key: 'Indicator Key',
+      name: 'Indicator Name',
+      formula: 'Formula',
+    },
+    relation: {
+      dialogTitle: 'Set Main Source and Join Fields',
+      labels: {
+        source: 'Data Source',
+        sourceNode: 'Source Node',
+      },
+      placeholders: {
+        selectSource: 'Please select data source',
+        selectSourceNode: 'Please select source node',
+      },
+    },
+    edit: {
+      dialogTitleAdd: 'Add Model',
+      dialogTitleEdit: 'Edit Model',
+      labels: {
+        scheduleRequest: 'Scheduled Request',
+        busiTypes: 'Unit Types',
+      },
+      cron: {
+        selectTitle: 'Select Cron Rule',
+      },
+    },
+  },
 };

+ 187 - 0
src/i18n/pages/dateCenter/zh-cn.ts

@@ -7,6 +7,36 @@ export default {
     ruleExpr: '规则表达式',
     reqParams: '请求参数',
     sourceConfig: '数据源配置',
+    indicator: {
+      dialogTitleAdd: '新增计算指标模型',
+      dialogTitleEdit: '修改计算指标模型',
+      labels: {
+        key: '指标标识',
+        name: '指标名称',
+        formula: '计算公式',
+        dataType: '数据类型',
+        description: '指标说明',
+        accuracy: '精度',
+        operators: '运算符号',
+        deviceAttr: '设备属性',
+        currentFormula: '当前公式',
+        editFormula: '编辑',
+      },
+      placeholders: {
+        inputKey: '请输入指标标识',
+        inputName: '请输入指标名称',
+        inputDescription: '请输入指标说明',
+        inputFormula: '请输入计算公式',
+        selectDataType: '请选择数据类型',
+        inputAccuracy: '请输入精度',
+      },
+      types: {
+        int: 'int(整数型)',
+        long: 'long(长整数型)',
+        float: 'float(单精度)',
+        double: 'double(双精度)',
+      },
+    },
   },
   labels: {
     sourceNameTitle: '数据源名称:',
@@ -150,4 +180,161 @@ export default {
       required: '不能为空',
     },
   },
+  modeling: {
+    labels: {
+      modelKey: '模型标识',
+      tableName: '模型表名',
+      modelName: '模型名称',
+      modelType: '模型类型',
+      desc: '描述',
+      fieldTitle: '字段标题',
+      fieldName: '字段名称',
+      dataSourceName: '数据源名称',
+      defaultValue: '默认值',
+      remark: '备注说明',
+      indicatorKey: '指标标识',
+      indicatorName: '指标名称',
+      formula: '计算公式',
+      dataType: '数据类型',
+      second: '秒',
+      minute: '分',
+      hour: '时',
+      day: '天',
+      custom: '自定义',
+      method: '取值方法',
+      isPk: '是否为主键',
+      isSorting: '是否排序',
+      sortOrder: '排序方式',
+      orderDesc: '降序',
+      orderAsc: '升序',
+    },
+    methods: {
+      default: '默认',
+      max: '最大值',
+      min: '最小值',
+      avg: '平均值',
+      sum: '求和',
+    },
+    types: {
+      int: 'int(整数型)',
+      long: 'long(长整数型)',
+      float: 'float(单精度)',
+      double: 'double(双精度)',
+      string: 'string(字符串)',
+      boolean: 'boolean(布尔)',
+      date: 'date(日期时间)',
+    },
+    fieldNode: {
+      dialogTitleAdd: '新增字段节点',
+      dialogTitleEdit: '修改字段节点',
+    },
+    columns: {
+      id: 'ID',
+      name: '模型名称',
+      type: '类型',
+      typeName: '类型',
+      desc: '描述',
+      status: '状态',
+      createdAt: '创建时间',
+      action: '操作',
+    },
+    placeholders: {
+      input: '请输入',
+      select: '请选择',
+      inputFieldTitle: '请输入字段标题',
+      inputFieldName: '请输入字段名称',
+      inputIndicatorKey: '请输入指标标识',
+    },
+    actions: {
+      search: '查询',
+      reset: '重置',
+      createModel: '新增模型',
+      delete: '删除',
+      edit: '修改',
+      copy: '复制',
+      fieldManage: '字段管理',
+      dataRecord: '数据记录',
+      aggregateSetting: '聚合设置',
+      calcIndicators: '计算指标',
+      addFieldNode: '新增字段节点',
+      addCalcIndicator: '新增计算指标模型',
+      publish: '发布',
+      unpublish: '取消发布',
+      confirm: '确认',
+      cancel: '取消',
+      set: '设置',
+    },
+    status: {
+      published: '已发布',
+      unpublished: '未发布',
+    },
+    messages: {
+      tip: '提示',
+      selectToDelete: '请选择要删除的数据。',
+      confirmBatchDelete: '你确定要删除所选数据?',
+      deleteModelConfirm: '此操作将永久删除模型:“{name}”,是否继续?',
+      deleteNodeConfirm: '此操作将永久删除数据节点:“{name}”,是否继续?',
+      deleteSuccess: '删除成功',
+      copyConfirm: '确定要复制该数据吗?',
+      copySuccess: '复制成功',
+      operateSuccess: '操作成功',
+      confirmPublish: '是否{status}?',
+      fieldRequired: '{field}不能为空',
+      lettersOnly: '只能输入英文字母',
+    },
+    aggregate: {
+      dialogTitle: '设置聚合',
+      labels: {
+        groupNode: '分组节点',
+        timeWindowNode: '时间窗口节点',
+        duration: '时间值',
+        unit: '时间单位',
+      },
+      placeholders: {
+        selectGroupNode: '请选择分组节点',
+        selectTimeWindowNode: '请选择时间窗口节点',
+        inputDuration: '请输入时间值',
+        selectUnit: '请选择时间单位',
+      },
+      units: {
+        1: '秒',
+        2: '分',
+        3: '时',
+        4: '天',
+      },
+    },
+    units: {
+        1: '秒',
+        2: '分',
+        3: '时',
+        4: '天',
+      },
+    indicator: {
+      key: '指标标识',
+      name: '指标名称',
+      formula: '计算公式',
+    },
+    relation: {
+      dialogTitle: '设置主源、关联字段',
+      labels: {
+        source: '数据源',
+        sourceNode: '数据源节点',
+      },
+      placeholders: {
+        selectSource: '请选择数据源',
+        selectSourceNode: '请选择数据源节点',
+      },
+    },
+    edit: {
+      dialogTitleAdd: '添加模型',
+      dialogTitleEdit: '修改模型',
+      labels: {
+        scheduleRequest: '定时请求',
+        busiTypes: '单元类型',
+      },
+      cron: {
+        selectTitle: '选择 Cron 规则',
+      },
+    },
+  },
 };

+ 176 - 0
src/i18n/pages/dateCenter/zh-tw.ts

@@ -7,6 +7,36 @@ export default {
     ruleExpr: '規則表示式',
     reqParams: '請求參數',
     sourceConfig: '資料源配置',
+    indicator: {
+      dialogTitleAdd: '新增計算指標模型',
+      dialogTitleEdit: '修改計算指標模型',
+      labels: {
+        key: '指標標識',
+        name: '指標名稱',
+        formula: '計算公式',
+        dataType: '資料型別',
+        description: '指標說明',
+        accuracy: '精度',
+        operators: '運算符號',
+        deviceAttr: '設備屬性',
+        currentFormula: '當前公式',
+        editFormula: '編輯',
+      },
+      placeholders: {
+        inputKey: '請輸入指標標識',
+        inputName: '請輸入指標名稱',
+        inputDescription: '請輸入指標說明',
+        inputFormula: '請輸入計算公式',
+        selectDataType: '請選擇資料型別',
+        inputAccuracy: '請輸入精度',
+      },
+      types: {
+        int: 'int(整數型)',
+        long: 'long(長整數型)',
+        float: 'float(單精度)',
+        double: 'double(雙精度)',
+      },
+    },
   },
   labels: {
     sourceNameTitle: '資料源名稱:',
@@ -150,4 +180,150 @@ export default {
       required: '不能為空',
     },
   },
+  modeling: {
+    labels: {
+      modelKey: '模型標識',
+      tableName: '模型表名',
+      modelName: '模型名稱',
+      modelType: '模型類型',
+      desc: '描述',
+      fieldTitle: '欄位標題',
+      fieldName: '欄位名稱',
+      dataSourceName: '資料源名稱',
+      defaultValue: '預設值',
+      remark: '備註說明',
+      indicatorKey: '指標標識',
+      indicatorName: '指標名稱',
+      formula: '計算公式',
+      dataType: '資料型別',
+      second: '秒',
+      minute: '分',
+      hour: '時',
+      day: '天',
+      custom: '自定義',
+      method: '取值方法',
+      isPk: '是否為主鍵',
+      isSorting: '是否排序',
+      sortOrder: '排序方式',
+      orderDesc: '降序',
+      orderAsc: '升序',
+    },
+    methods: {
+      default: '預設',
+      max: '最大值',
+      min: '最小值',
+      avg: '平均值',
+      sum: '求和',
+    },
+    types: {
+      int: 'int(整數型)',
+      long: 'long(長整數型)',
+      float: 'float(單精度)',
+      double: 'double(雙精度)',
+      string: 'string(字串)',
+      boolean: 'boolean(布林)',
+      date: 'date(日期時間)',
+    },
+    fieldNode: {
+      dialogTitleAdd: '新增欄位節點',
+      dialogTitleEdit: '修改欄位節點',
+    },
+    columns: {
+      id: 'ID',
+      name: '模型名稱',
+      type: '類型',
+      typeName: '類型',
+      desc: '描述',
+      status: '狀態',
+      createdAt: '建立時間',
+      action: '操作',
+    },
+    placeholders: {
+      input: '請輸入',
+      select: '請選擇',
+      inputFieldTitle: '請輸入欄位標題',
+      inputFieldName: '請輸入欄位名稱',
+      inputIndicatorKey: '請輸入指標標識',
+    },
+    actions: {
+      search: '查詢',
+      reset: '重置',
+      createModel: '新增模型',
+      delete: '刪除',
+      edit: '修改',
+      copy: '複製',
+      fieldManage: '欄位管理',
+      dataRecord: '資料記錄',
+      aggregateSetting: '聚合設定',
+      calcIndicators: '計算指標',
+      addFieldNode: '新增欄位節點',
+      addCalcIndicator: '新增計算指標模型',
+      publish: '發布',
+      unpublish: '取消發布',
+      confirm: '確認',
+      cancel: '取消',
+      set: '設定',
+    },
+    status: {
+      published: '已發布',
+      unpublished: '未發布',
+    },
+    messages: {
+      tip: '提示',
+      selectToDelete: '請選擇要刪除的資料。',
+      confirmBatchDelete: '你確定要刪除所選資料?',
+      deleteModelConfirm: '此操作將永久刪除模型:「{name}」,是否繼續?',
+      deleteNodeConfirm: '此操作將永久刪除資料節點:「{name}」,是否繼續?',
+      deleteSuccess: '刪除成功',
+      copyConfirm: '確定要複製該資料嗎?',
+      copySuccess: '複製成功',
+      operateSuccess: '操作成功',
+      confirmPublish: '是否{status}?',
+      fieldRequired: '{field}不能為空',
+      lettersOnly: '只能輸入英文字母',
+    },
+    aggregate: {
+      dialogTitle: '設定聚合',
+      labels: {
+        groupNode: '分組節點',
+        timeWindowNode: '時間視窗節點',
+        duration: '時間值',
+        unit: '時間單位',
+      },
+      placeholders: {
+        selectGroupNode: '請選擇分組節點',
+        selectTimeWindowNode: '請選擇時間視窗節點',
+        inputDuration: '請輸入時間值',
+        selectUnit: '請選擇單位',
+      },
+      units: {
+        1: '秒',
+        2: '分',
+        3: '時',
+        4: '天',
+      },
+    },
+    relation: {
+      dialogTitle: '設定主源、關聯欄位',
+      labels: {
+        source: '資料源',
+        sourceNode: '資料源節點',
+      },
+      placeholders: {
+        selectSource: '請選擇資料源',
+        selectSourceNode: '請選擇資料源節點',
+      },
+    },
+    edit: {
+      dialogTitleAdd: '新增模型',
+      dialogTitleEdit: '修改模型',
+      labels: {
+        scheduleRequest: '定時請求',
+        busiTypes: '單元類型',
+      },
+      cron: {
+        selectTitle: '選擇 Cron 規則',
+      },
+    },
+  },
 };

+ 39 - 39
src/views/system/datahub/modeling/calculationIndicator.vue

@@ -3,9 +3,9 @@
   <div class="page page-full model-detail-wrap">
     <div class="content">
       <div class="cont_box">
-        <div class="title">模型标识:{{ detail.key }}</div>
-        <div class="title" style="margin-left: 20px">模型表名:{{ detail.name }}</div>
-        <div class="pro-status"><span :class="developer_status == 1 ? 'on' : 'off'"></span>{{ developer_status == 1 ? '已发布' : '未发布' }}</div>
+        <div class="title">{{ t('message.dateCenter.modeling.labels.modelKey') }}:{{ detail.key }}</div>
+        <div class="title" style="margin-left: 20px">{{ t('message.dateCenter.modeling.labels.tableName') }}:{{ detail.name }}</div>
+        <div class="pro-status"><span :class="developer_status == 1 ? 'on' : 'off'"></span>{{ developer_status == 1 ? t('message.dateCenter.modeling.status.published') : t('message.dateCenter.modeling.status.unpublished') }}</div>
         <!-- <div class="pro-option" v-auth="'startOrStop'" @click="CkOption">{{ developer_status == 1 ? '停用' : '发布' }}</div> -->
       </div>
     </div>
@@ -14,8 +14,8 @@
       <div class="wu-box">
         <div class="system-user-search mb15">
           <el-form :model="tableData.param" ref="queryRef" inline @submit.prevent @keyup.enter="typeList">
-            <el-form-item label="指标标识" prop="name">
-              <el-input v-model="tableData.param.keyWord" placeholder="请输入指标标识" clearable style="width: 220px" />
+            <el-form-item :label="t('message.dateCenter.modeling.labels.indicatorKey')" prop="name">
+              <el-input v-model="tableData.param.keyWord" :placeholder="t('message.dateCenter.modeling.placeholders.inputIndicatorKey')" clearable style="width: 220px" />
             </el-form-item>
 
             <el-form-item>
@@ -23,19 +23,19 @@
                 <el-icon>
                   <ele-Search />
                 </el-icon>
-                查询
+                {{ t('message.dateCenter.modeling.actions.search') }}
               </el-button>
               <el-button @click="resetQuery()">
                 <el-icon>
                   <ele-Refresh />
                 </el-icon>
-                重置
+                {{ t('message.dateCenter.modeling.actions.reset') }}
               </el-button>
               <el-button type="primary" class="ml10" @click="onOpenAdd">
                 <el-icon>
                   <ele-FolderAdd />
                 </el-icon>
-                新增计算指标模型
+                {{ t('message.dateCenter.modeling.actions.addCalcIndicator') }}
               </el-button>
               <el-button :disabled="!tableData.data.length" :loading="publishLoading" type="success" class="ml10" @click="onPublish()">
                 <el-icon>
@@ -47,17 +47,17 @@
           </el-form>
         </div>
         <el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading">
-          <el-table-column label="ID" align="center" prop="id" width="100" />
-          <el-table-column label="指标名称" prop="name" width="140" show-overflow-tooltip />
-          <el-table-column label="指标标识" prop="key" width="140" show-overflow-tooltip />
-          <el-table-column label="计算公式" prop="formula" show-overflow-tooltip />
-          <el-table-column label="数据类型" prop="types" width="85" show-overflow-tooltip />
-          <el-table-column label="指标说明" prop="description" show-overflow-tooltip />
-          <el-table-column prop="createdAt" label="创建时间" align="center" width="160" />
-          <el-table-column label="操作" width="100" align="center" fixed="right">
+          <el-table-column :label="t('message.dateCenter.modeling.columns.id')" align="center" prop="id" width="100" />
+          <el-table-column :label="t('message.dateCenter.modeling.labels.indicatorName')" prop="name" width="140" show-overflow-tooltip />
+          <el-table-column :label="t('message.dateCenter.modeling.labels.indicatorKey')" prop="key" width="140" show-overflow-tooltip />
+          <el-table-column :label="t('message.dateCenter.modeling.columns.formula')" prop="formula" show-overflow-tooltip />
+          <el-table-column :label="t('message.dateCenter.modeling.columns.dataType')" prop="types" width="85" show-overflow-tooltip />
+          <el-table-column :label="t('message.dateCenter.modeling.labels.indicatorDesc')" prop="description" show-overflow-tooltip />
+          <el-table-column prop="createdAt" :label="t('message.dateCenter.modeling.columns.createdAt')" align="center" width="160" />
+          <el-table-column :label="t('message.dateCenter.modeling.columns.action')" width="100" align="center" fixed="right">
             <template #default="scope">
-              <el-button size="small" text type="warning" @click="onOpenEdit(scope.row)">修改</el-button>
-              <el-button size="small" text type="danger" @click="onRowDel(scope.row)">删除</el-button>
+              <el-button size="small" text type="warning" @click="onOpenEdit(scope.row)">{{ t('message.dateCenter.modeling.actions.edit') }}</el-button>
+              <el-button size="small" text type="danger" @click="onRowDel(scope.row)">{{ t('message.dateCenter.modeling.actions.delete') }}</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -77,9 +77,11 @@
 import { onMounted, ref } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useRoute } from 'vue-router';
+import { useI18n } from 'vue-i18n';
 import AddOrEditIndictor from './component/addOrEditIndictor.vue';
 import api from '/@/api/datahub';
 
+const { t } = useI18n();
 const editDicRef = ref();
 const route = useRoute();
 const detail = ref<any>({});
@@ -118,26 +120,24 @@ const resetQuery = () => {
 };
 
 const onRowDel = (row: any) => {
-  let msg = '你确定要删除所选数据?';
-  let ids: number[] = [];
+  let msg = t('message.dateCenter.modeling.messages.confirmBatchDelete');
+  let id: number | null = null;
   if (row) {
-    msg = `此操作将永久删除数据节点:“${row.name}”,是否继续?`;
-    ids = row.id;
-  } else {
-    // ids = ids;
+    msg = t('message.dateCenter.modeling.messages.deleteNodeConfirm', { name: row.name });
+    id = row.id as number;
   }
-  if (ids.length === 0) {
-    ElMessage.error('请选择要删除的数据。');
+  if (id === null) {
+    ElMessage.error(t('message.dateCenter.modeling.messages.selectToDelete'));
     return;
   }
-  ElMessageBox.confirm(msg, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
+  ElMessageBox.confirm(msg, t('message.dateCenter.modeling.messages.tip'), {
+    confirmButtonText: t('message.dateCenter.modeling.actions.confirm'),
+    cancelButtonText: t('message.dateCenter.modeling.actions.cancel'),
     type: 'warning',
   })
     .then(() => {
-      api.calculationIndicator.delete(ids).then(() => {
-        ElMessage.success('删除成功');
+      api.calculationIndicator.delete(id as number).then(() => {
+        ElMessage.success(t('message.dateCenter.modeling.messages.deleteSuccess'));
         checkDeploy();
         typeList();
       });
@@ -146,14 +146,14 @@ const onRowDel = (row: any) => {
 };
 
 const onPublish = () => {
-  ElMessageBox.confirm(`是否${publishStatus.value}?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
+  ElMessageBox.confirm(t('message.dateCenter.modeling.messages.publishConfirm', { action: publishStatus.value }), t('message.dateCenter.modeling.messages.tip'), {
+    confirmButtonText: t('message.dateCenter.modeling.actions.confirm'),
+    cancelButtonText: t('message.dateCenter.modeling.actions.cancel'),
     type: 'warning',
   }).then(() => {
     publishLoading.value = true;
-    api.calculationIndicator.deploy({ dataTemplateKey: detail.value.key, status: publishStatus.value === '发布' ? 1 : 0 }).then(() => {
-      ElMessage.success('操作成功');
+    api.calculationIndicator.deploy({ dataTemplateKey: detail.value.key, status: publishStatus.value === t('message.dateCenter.modeling.actions.publish') ? 1 : 0 }).then(() => {
+      ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
       checkDeploy();
       typeList();
     }).finally(() => (publishLoading.value = false));
@@ -167,9 +167,9 @@ const checkDeploy = () => {
   }
   api.calculationIndicator.checkDeploy({ dataTemplateKey: detail.value.key }).then((res: any) => {
     if (res === true) {
-      publishStatus.value = '取消发布';
-    }else if (res === false) {
-      publishStatus.value = '发布';
+      publishStatus.value = t('message.dateCenter.modeling.actions.unpublish');
+    } else if (res === false) {
+      publishStatus.value = t('message.dateCenter.modeling.actions.publish');
     }
   })
 };

+ 69 - 68
src/views/system/datahub/modeling/component/addOrEditIndictor.vue

@@ -1,88 +1,89 @@
 <template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="(ruleForm.id ? '修改' : '新增') + '计算指标模型'" v-model="isShowDialog" width="700px">
-			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
-				<el-form-item label="指标标识" prop="key">
-          <el-input @input="validateKeyInput" style="width: 520px;"  v-model="ruleForm.key" placeholder="请输入指标标识" />
-				</el-form-item>
+  <div class="system-edit-dic-container">
+    <el-dialog :title="ruleForm.id ? t('message.dateCenter.tabs.indicator.dialogTitleEdit') : t('message.dateCenter.tabs.indicator.dialogTitleAdd')" v-model="isShowDialog" width="700px">
+      <el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="150px">
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.key')" prop="key">
+          <el-input @input="validateKeyInput" style="width: 520px;"  v-model="ruleForm.key" :placeholder="t('message.dateCenter.tabs.indicator.placeholders.inputKey')" />
+        </el-form-item>
 
-        <el-form-item label="指标名称" prop="name">
-					<el-input style="width: 520px;"  v-model="ruleForm.name" placeholder="请输入指标名称" />
-				</el-form-item>
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.name')" prop="name">
+          <el-input style="width: 520px;"  v-model="ruleForm.name" :placeholder="t('message.dateCenter.tabs.indicator.placeholders.inputName')" />
+        </el-form-item>
 
-        <el-form-item label="指标说明" prop="description">
-					<el-input style="width: 520px;"  v-model="ruleForm.description" type="textarea" placeholder="请输入内容"></el-input>
-				</el-form-item>
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.description')" prop="description">
+          <el-input style="width: 520px;"  v-model="ruleForm.description" type="textarea" :placeholder="t('message.dateCenter.tabs.indicator.placeholders.inputDescription')"></el-input>
+        </el-form-item>
 
-        <el-form-item label="计算公式" prop="formula">
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.formula')" prop="formula">
           <el-row class="flex" style="width: 100%;">
-            <el-input style="width: 430px;" disabled v-model="ruleForm.formula" placeholder="请输入计算公式"></el-input>
+            <el-input style="width: 430px;" disabled v-model="ruleForm.formula" :placeholder="t('message.dateCenter.tabs.indicator.placeholders.inputFormula')"></el-input>
             <el-button @click="showformulaFormDialog" type="primary" class="ml10">
               <el-icon>
                 <ele-Edit />
               </el-icon>
-              编辑
+              {{ t('message.dateCenter.tabs.indicator.labels.editFormula') }}
             </el-button>
           </el-row>
 
-				</el-form-item>
+        </el-form-item>
 
-				<el-form-item label="数据类型" prop="types">
-					<el-select style="width: 520px;" v-model="ruleForm.types" filterable placeholder="请选择数据类型">
-						<el-option v-for="item in tabData" :key="item.value" :label="item.label" :value="item.value" />
-					</el-select>
-				</el-form-item>
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.dataType')" prop="types">
+          <el-select style="width: 520px;" v-model="ruleForm.types" filterable :placeholder="t('message.dateCenter.tabs.indicator.placeholders.selectDataType')">
+            <el-option v-for="item in tabData" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
 
-        <el-form-item label="精度" prop="accuracy" v-if="ruleForm.types == 'float' || ruleForm.types == 'double'">
-          <el-input style="width: 520px;" v-model="ruleForm.accuracy" placeholder="请输入精度" />
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.accuracy')" prop="accuracy" v-if="ruleForm.types == 'float' || ruleForm.types == 'double'">
+          <el-input style="width: 520px;" v-model="ruleForm.accuracy" :placeholder="t('message.dateCenter.tabs.indicator.placeholders.inputAccuracy')" />
         </el-form-item>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">{{ ruleForm.id  ? '修 改' : '添 加' }}</el-button>
-				</span>
-			</template>
-		</el-dialog>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="onCancel">{{ t('message.dateCenter.modeling.actions.cancel') }}</el-button>
+          <el-button type="primary" @click="onSubmit">{{ ruleForm.id ? t('message.dateCenter.modeling.actions.edit') : t('message.dateCenter.modeling.actions.add') }}</el-button>
+        </span>
+      </template>
+    </el-dialog>
 
-    <el-dialog title="编辑计算公式" v-model="isShowFormulaDialog" width="600px">
-			<el-form :model="formulaForm" ref="formulaFormRef" :rules="formulaFormRules" label-width="110px">
-        <el-form-item label="运算符号">
+    <el-dialog :title="t('message.dateCenter.tabs.indicator.labels.editFormula') + t('message.dateCenter.tabs.indicator.labels.formula')" v-model="isShowFormulaDialog" width="600px">
+      <el-form :model="formulaForm" ref="formulaFormRef" :rules="formulaFormRules" label-width="150px">
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.operators')">
           <div class="symbol-list-wrap">
             <div @click="assembleItem(item)" class="symbol-item-wrap" v-for="(item, index) in symbolList" :key="index">{{ item }}</div>
           </div>
-				</el-form-item>
+        </el-form-item>
 
-        <el-form-item label="设备属性" prop="key">
-					<el-select @change="handleSelect" style="width: 520px;" v-model="formulaForm.key" filterable placeholder="请选择数据类型">
-						<el-option v-for="item in nodeData" :key="item.key" :label="item.name" :value="item.key" />
-					</el-select>
-				</el-form-item>
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.deviceAttr')" prop="key">
+          <el-select @change="handleSelect" style="width: 520px;" v-model="formulaForm.key" filterable :placeholder="t('message.dateCenter.modeling.placeholders.select')">
+            <el-option v-for="item in nodeData" :key="item.key" :label="item.name" :value="item.key" />
+          </el-select>
+        </el-form-item>
 
-        <el-form-item label="当前公式" prop="formula">
-          <el-input ref="formulaRef" @blur="handleBlur" style="width: 520px;" v-model="formulaForm.formula" placeholder="请输入公式" />
+        <el-form-item :label="t('message.dateCenter.tabs.indicator.labels.currentFormula')" prop="formula">
+          <el-input ref="formulaRef" @blur="handleBlur" style="width: 520px;" v-model="formulaForm.formula" :placeholder="t('message.dateCenter.tabs.indicator.placeholders.inputFormula')" />
         </el-form-item>
-			</el-form>
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button type="primary" @click="onSubmitFormulaForm">确定</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button type="primary" @click="onSubmitFormulaForm">{{ t('message.dateCenter.modeling.actions.confirm') }}</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
 </template>
-wa1
 <script lang="ts" setup>
 import { ref, unref } from 'vue';
 import { useRoute } from 'vue-router';
 import { ElMessage } from 'element-plus';
+import { useI18n } from 'vue-i18n';
 import api from '/@/api/datahub';
 
 const emit = defineEmits(['typeList']);
+const { t } = useI18n();
 
 const validateAccuracy = (rule: any, value: any, callback: any) => {
   if (['float', 'double'].indexOf(ruleForm.value.types) > -1  && !value) {
-    callback(new Error('请输入精度'))
+    callback(new Error(t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.accuracy') })))
   } else {
     callback()
   }
@@ -102,19 +103,19 @@ const isShowDialog = ref(false);
 const isShowFormulaDialog = ref(false);
 const tabData = ref([
   {
-    label: 'int(整数型)',
+    label: t('message.dateCenter.tabs.indicator.types.int'),
     value: 'int',
   },
   {
-    label: 'long(长整数型)',
+    label: t('message.dateCenter.tabs.indicator.types.long'),
     value: 'long',
   },
   {
-    label: 'float(单精度浮点型)',
+    label: t('message.dateCenter.tabs.indicator.types.float'),
     value: 'float',
   },
   {
-    label: 'double(双精度浮点型)',
+    label: t('message.dateCenter.tabs.indicator.types.double'),
     value: 'double',
   }
 ])
@@ -137,19 +138,19 @@ const ruleForm = ref({
 })
 const rules = ref({
   key: [
-    { required: true, message: '指标标识不能为空', trigger: 'blur' },
-    { pattern: /^[a-zA-Z]+$/, message: '指标标识只能输入英文字母', trigger: 'blur' }
+    { required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.key') }), trigger: 'blur' },
+    { pattern: /^[a-zA-Z]+$/, message: t('message.dateCenter.modeling.messages.lettersOnly'), trigger: 'blur' }
   ],
-  name: [{ required: true, message: '指标名称不能为空', trigger: 'blur' }],
-  description: [{ required: true, message: '指标说明不能为空', trigger: 'blur' }],
-  formula: [{ required: true, message: '计算公式不能为空', trigger: 'blur' }],
-  types: [{ required: true, message: '数据类型不能为空', trigger: 'blur' }],
+  name: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.name') }), trigger: 'blur' }],
+  description: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.description') }), trigger: 'blur' }],
+  formula: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.formula') }), trigger: 'blur' }],
+  types: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.dataType') }), trigger: 'blur' }],
   accuracy: [{ required: true, validator: validateAccuracy, trigger: 'change' }],
 });
 
 const formulaFormRules = ref({
-  key: [{ required: true, message: '设备属性不能为空', trigger: 'blur' }],
-  formula: [{ required: true, message: '计算公式不能为空', trigger: 'blur' }],
+  key: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.deviceAttr') }), trigger: 'blur' }],
+  formula: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.tabs.indicator.labels.formula') }), trigger: 'blur' }],
 });
 
 // 验证指标标识输入,只允许输入英文字母
@@ -241,16 +242,16 @@ const onSubmit = () => {
   formWrap.validate((valid: boolean) => {
     if (valid) {
       if (ruleForm.value.id !== 0) {
-        //修改
+        // 修改
         api.calculationIndicator.edit(ruleForm.value).then(() => {
-          ElMessage.success('计算指标模型修改成功');
+          ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
           closeDialog(); // 关闭弹窗
           emit('typeList');
         });
       } else {
-        //添加
+        // 添加
         api.calculationIndicator.add(ruleForm.value).then(() => {
-          ElMessage.success('计算指标模型添加成功');
+          ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
           closeDialog(); // 关闭弹窗
           emit('typeList');
         });

+ 57 - 41
src/views/system/datahub/modeling/component/edit.vue

@@ -1,45 +1,45 @@
 <template>
 	<div class="system-edit-dic-container">
-		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '模型'" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
-				<el-form-item label="模型标识" prop="key">
-					<el-input v-model.trim="ruleForm.key" placeholder="请输入模型名称" :disabled="ruleForm.id" />
+		<el-dialog :title="ruleForm.id !== 0 ? t('message.dateCenter.modeling.edit.dialogTitleEdit') : t('message.dateCenter.modeling.edit.dialogTitleAdd')" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="150px">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.modelKey')" prop="key">
+					<el-input v-model.trim="ruleForm.key" :placeholder="t('message.dateCenter.modeling.placeholders.input')" :disabled="ruleForm.id" />
 				</el-form-item>
-				<el-form-item label="模型名称" prop="name">
-					<el-input v-model.trim="ruleForm.name" placeholder="请输入模型名称" />
+				<el-form-item :label="t('message.dateCenter.modeling.labels.modelName')" prop="name">
+					<el-input v-model.trim="ruleForm.name" :placeholder="t('message.dateCenter.modeling.placeholders.input')" />
 				</el-form-item>
 
-				<el-form-item label="模型类型" prop="type">
-					<el-select v-model="ruleForm.type" placeholder="请选择模型类型" class="w100">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.modelType')" prop="type">
+					<el-select v-model="ruleForm.type" :placeholder="t('message.dateCenter.modeling.placeholders.select')" class="w100">
 						<el-option v-for="item in datahub_model_type" :key="item.value" :label="item.label" :value="item.value" />
 					</el-select>
 				</el-form-item>
-				<el-form-item label="定时请求" prop="cronExpression">
+				<el-form-item :label="t('message.dateCenter.modeling.edit.labels.scheduleRequest')" prop="cronExpression">
 					<div style="display:flex">
-						<el-input v-model="ruleForm.cronExpression" placeholder="请输入cron表达式" />
-						<el-button type="success" @click="showCron('ruleForm')" style="margin-left: 5px;">设置</el-button>
+						<el-input v-model="ruleForm.cronExpression" :placeholder="t('message.dateCenter.modeling.placeholders.input')" />
+						<el-button type="success" @click="showCron('ruleForm')" style="margin-left: 5px;">{{ t('message.dateCenter.modeling.actions.set') }}</el-button>
 					</div>
 				</el-form-item>
 
-				<el-form-item label="描述" prop="desc">
-					<el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入内容"></el-input>
+				<el-form-item :label="t('message.dateCenter.modeling.labels.desc')" prop="desc">
+					<el-input v-model="ruleForm.desc" type="textarea" :placeholder="t('message.dateCenter.modeling.placeholders.input')"></el-input>
 				</el-form-item>
 
-				<el-form-item label="单元类型" prop="busiTypes">
-					<el-select v-model="ruleForm.busiTypes" multiple placeholder="请选择单元类型" class="w100">
+				<el-form-item :label="t('message.dateCenter.modeling.edit.labels.busiTypes')" prop="busiTypes">
+					<el-select v-model="ruleForm.busiTypes" multiple :placeholder="t('message.dateCenter.modeling.placeholders.select')" class="w100">
 						<el-option v-for="item in zidianData" :key="item.key" :label="item.value" :value="item.key" />
 					</el-select>
 				</el-form-item>
 			</el-form>
 			<template #footer>
 				<span class="dialog-footer">
-					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
+					<el-button @click="onCancel">{{ t('message.dateCenter.modeling.actions.cancel') }}</el-button>
+					<el-button type="primary" @click="onSubmit">{{ t('message.dateCenter.modeling.actions.confirm') }}</el-button>
 				</span>
 			</template>
 		</el-dialog>
 
-		<el-dialog v-model="cronShow" title="选择Cron规则" width="60%">
+		<el-dialog v-model="cronShow" :title="t('message.dateCenter.modeling.edit.cron.selectTitle')" width="60%">
 			<vue3cron @handlelisten="handlelisten" :type="crontype" @close="cronclose"></vue3cron>
 		</el-dialog>
 	</div>
@@ -50,19 +50,31 @@ import { reactive, toRefs, defineComponent, ref, unref, getCurrentInstance } fro
 import api from '/@/api/datahub';
 import { ElMessage } from 'element-plus';
 import vue3cron from '/@/components/vue3cron/vue3cron.vue';
+import { useI18n } from 'vue-i18n';
 
+interface DataTemplateBusiItem {
+    busiTypes: string | number;
+}
 interface RuleFormState {
-	id?: number;
-	name: string;
-	interval: string;
-	key: string;
-	desc: string;
-	type: string;
+    id?: number;
+    name: string;
+    interval?: string;
+    key: string;
+    desc: string;
+    type: string;
+    busiTypes: string[];
+    cronExpression?: string;
+    dataTemplateBusi?: DataTemplateBusiItem[];
 }
 interface DicState {
-	isShowDialog: boolean;
-	ruleForm: RuleFormState;
-	rules: {};
+    isShowDialog: boolean;
+    zidianData: Array<{ key: string; value: string }>;
+    cityData: any[];
+    cronShow: boolean;
+    crontype: string;
+    unitData: Array<{ label: string; value: string }>;
+    ruleForm: RuleFormState;
+    rules: Record<string, any>;
 }
 
 export default defineComponent({
@@ -72,6 +84,7 @@ export default defineComponent({
 	setup(prop, { emit }) {
 		const formRef = ref<HTMLElement | null>(null);
 		const { proxy } = getCurrentInstance() as any;
+    const { t } = useI18n();
 
 		const { datahub_model_type } = proxy.useDict('datahub_model_type');
 		const state = reactive<DicState>({
@@ -82,19 +95,19 @@ export default defineComponent({
 			crontype: '',
 			unitData: [
 				{
-					label: '秒',
+					label: t('message.dateCenter.modeling.labels.second'),
 					value: 'second',
 				},
 				{
-					label: '分',
+					label: t('message.dateCenter.modeling.labels.minute'),
 					value: 'minute',
 				},
 				{
-					label: '时',
+					label: t('message.dateCenter.modeling.labels.hour'),
 					value: 'hour',
 				},
 				{
-					label: '天',
+					label: t('message.dateCenter.modeling.labels.day'),
 					value: 'day',
 				},
 			],
@@ -105,13 +118,14 @@ export default defineComponent({
 				busiTypes: [],
 				desc: '',
 				type: '',
+				cronExpression: '',
 			},
 			rules: {
-				key: [{ required: true, message: '模型标识不能为空', trigger: 'blur' }],
-				name: [{ required: true, message: '模型名称不能为空', trigger: 'blur' }],
-				type: [{ required: true, message: '模型类型不能为空', trigger: 'blur' }],
-				cronExpression: [{ required: true, message: '定时请求不能为空', trigger: 'blur' }],
-				interval: [{ required: true, message: '请输入更新时间', trigger: 'blur' }],
+				key: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.modelKey') }), trigger: 'blur' }],
+				name: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.modelName') }), trigger: 'blur' }],
+				type: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.modelType') }), trigger: 'blur' }],
+				cronExpression: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.edit.labels.scheduleRequest') }), trigger: 'blur' }],
+				interval: [{ required: true, message: t('message.dateCenter.modeling.placeholders.input'), trigger: 'blur' }],
 			},
 		});
 
@@ -130,7 +144,7 @@ export default defineComponent({
 
 				state.ruleForm = row;
 				if (row.dataTemplateBusi) {
-					state.ruleForm.busiTypes = row.dataTemplateBusi.map(val => {
+					state.ruleForm.busiTypes = row.dataTemplateBusi.map((val: DataTemplateBusiItem) => {
 						return val.busiTypes.toString();
 					})
 				}
@@ -145,6 +159,7 @@ export default defineComponent({
 				busiTypes: [],
 				desc: '',
 				type: '',
+				cronExpression: '',
 			};
 		};
 
@@ -170,14 +185,14 @@ export default defineComponent({
 						//修改
 
 						api.template.edit(state.ruleForm).then(() => {
-							ElMessage.success('修改成功');
+							ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
 							closeDialog(); // 关闭弹窗
 							emit('typeList');
 						});
 					} else {
 						//添加
 						api.template.add(state.ruleForm).then(() => {
-							ElMessage.success('添加成功');
+							ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
 							closeDialog(); // 关闭弹窗
 							emit('typeList');
 						});
@@ -185,10 +200,10 @@ export default defineComponent({
 				}
 			});
 		};
-		const handlelisten = (e) => {
+		const handlelisten = (e: { cron: string }) => {
 			state.ruleForm.cronExpression = e.cron
 		};
-		const showCron = (type) => {
+		const showCron = (type: string) => {
 			state.crontype = type
 			state.cronShow = true;
 
@@ -198,6 +213,7 @@ export default defineComponent({
 		}
 
 		return {
+			t,
 			handlelisten,
 			showCron,
 			cronclose,

+ 73 - 102
src/views/system/datahub/modeling/component/editNode.vue

@@ -1,17 +1,17 @@
 <template>
 	<div class="system-edit-dic-container">
-		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '字段节点'" v-model="isShowDialog" width="769px">
+		<el-dialog :title="(ruleForm.id !== 0 ? t('message.dateCenter.modeling.fieldNode.dialogTitleEdit') : t('message.dateCenter.modeling.fieldNode.dialogTitleAdd'))" v-model="isShowDialog" width="769px">
 			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
-				<el-form-item label="类型" prop="from">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.modelType')" prop="from">
 					<el-radio-group v-model="ruleForm.from">
-						<el-radio :label="1">自定义</el-radio>
-						<el-radio :label="2">数据源</el-radio>
+						<el-radio :label="1">{{ t('message.dateCenter.modeling.labels.custom') }}</el-radio>
+						<el-radio :label="2">{{ t('message.dateCenter.modeling.relation.labels.source') }}</el-radio>
 					</el-radio-group>
 				</el-form-item>
 
 				<div v-if="ruleForm.from == 2">
-					<el-form-item label="数据源" prop="sourceId">
-						<el-select v-model="ruleForm.sourceId" filterable placeholder="请选择数据源" @change="getNodeList">
+					<el-form-item :label="t('message.dateCenter.modeling.relation.labels.source')" prop="sourceId">
+						<el-select v-model="ruleForm.sourceId" filterable :placeholder="t('message.dateCenter.modeling.relation.placeholders.selectSource')" @change="getNodeList">
 							<el-option v-for="item in sourceData" :key="item.sourceId" :label="item.key" :value="item.sourceId">
 								<span style="float: left">{{ item.name }}</span>
 								<span style="float: right; font-size: 13px">{{ item.key }}</span>
@@ -19,8 +19,8 @@
 						</el-select>
 					</el-form-item>
 
-					<el-form-item label="数据源节点" prop="nodeId">
-						<el-select v-model="ruleForm.nodeId" filterable placeholder="请选择数据源" @change="setNode">
+					<el-form-item :label="t('message.dateCenter.modeling.relation.labels.sourceNode')" prop="nodeId">
+						<el-select v-model="ruleForm.nodeId" filterable :placeholder="t('message.dateCenter.modeling.relation.placeholders.selectSourceNode')" @change="setNode">
 							<el-option v-for="item in nodeData" :key="item.nodeId" :label="item.key" :value="item.nodeId">
 								<span style="float: left">{{ item.key }}</span>
 								<span style="float: right; font-size: 13px">{{ item.name }}</span>
@@ -29,71 +29,72 @@
 					</el-form-item>
 				</div>
 
-				<el-form-item label="字段节点标识" prop="key">
-					<el-input v-model="ruleForm.key" placeholder="请输入字段节点名称" />
+				<el-form-item :label="t('message.dateCenter.modeling.labels.fieldName')" prop="key">
+					<el-input v-model="ruleForm.key" :placeholder="t('message.dateCenter.modeling.placeholders.inputFieldName')" />
 				</el-form-item>
-				<el-form-item label="字段节点名称" prop="name">
-					<el-input v-model="ruleForm.name" placeholder="请输入字段节点名称" />
+				<el-form-item :label="t('message.dateCenter.modeling.labels.fieldTitle')" prop="name">
+					<el-input v-model="ruleForm.name" :placeholder="t('message.dateCenter.modeling.placeholders.inputFieldTitle')" />
 				</el-form-item>
 
-				<el-form-item label="数据类型" prop="dataType">
-					<el-select v-model="ruleForm.dataType" filterable placeholder="请选择数据类型">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.dataType')" prop="dataType">
+					<el-select v-model="ruleForm.dataType" filterable :placeholder="t('message.dateCenter.modeling.placeholders.select')">
 						<el-option v-for="item in tabData" :key="item.value" :label="item.label" :value="item.value" />
 					</el-select>
 				</el-form-item>
 
-				<el-form-item label="取值方式" prop="method" v-if="ruleForm.from == 2 && (ruleForm.dataType=='int' || ruleForm.dataType=='bigint' || ruleForm.dataType=='float' || ruleForm.dataType=='double')">
-					<el-select v-model="ruleForm.method"  placeholder="请选择数据类型">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.method')" prop="method" v-if="ruleForm.from == 2 && (ruleForm.dataType=='int' || ruleForm.dataType=='bigint' || ruleForm.dataType=='float' || ruleForm.dataType=='double')">
+					<el-select v-model="ruleForm.method"  :placeholder="t('message.dateCenter.modeling.placeholders.select')">
 						<el-option v-for="item in methodData" :key="item.value" :label="item.label" :value="item.value" />
 					</el-select>
 				</el-form-item>
 
 
-				<el-form-item label="默认值" prop="default" v-if="ruleForm.from == 1">
-					<el-input v-model="ruleForm.default" placeholder="请输入取值项" />
+				<el-form-item :label="t('message.dateCenter.modeling.labels.defaultValue')" prop="default" v-if="ruleForm.from == 1">
+					<el-input v-model="ruleForm.default" :placeholder="t('message.dateCenter.modeling.placeholders.input')" />
 				</el-form-item>
 
-				<el-form-item label="是否主键" prop="isPk">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.isPk')" prop="isPk">
 					<el-radio-group v-model="ruleForm.isPk">
-						<el-radio :label="0"></el-radio>
-						<el-radio :label="1"></el-radio>
+						<el-radio :label="0">{{ t('message.dateCenter.options.no') }}</el-radio>
+						<el-radio :label="1">{{ t('message.dateCenter.options.yes') }}</el-radio>
 					</el-radio-group>
 				</el-form-item>
 
-				<el-form-item label="是否排序" prop="isSorting">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.isSorting')" prop="isSorting">
 					<el-radio-group v-model="ruleForm.isSorting">
-						<el-radio :label="0"></el-radio>
-						<el-radio :label="1"></el-radio>
+						<el-radio :label="0">{{ t('message.dateCenter.options.no') }}</el-radio>
+						<el-radio :label="1">{{ t('message.dateCenter.options.yes') }}</el-radio>
 					</el-radio-group>
 				</el-form-item>
 
 
-				<el-form-item label="排序方式" prop="isDesc">
+				<el-form-item :label="t('message.dateCenter.modeling.labels.sortOrder')" prop="isDesc">
 					<el-radio-group v-model="ruleForm.isDesc">
-						<el-radio :label="0">倒序</el-radio>
-						<el-radio :label="1">正序</el-radio>
+						<el-radio :label="0">{{ t('message.dateCenter.modeling.labels.orderDesc') }}</el-radio>
+						<el-radio :label="1">{{ t('message.dateCenter.modeling.labels.orderAsc') }}</el-radio>
 					</el-radio-group>
 				</el-form-item>
 
-				<el-form-item label="备注说明" prop="desc">
-					<el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入内容"></el-input>
+
+				<el-form-item :label="t('message.dateCenter.modeling.labels.remark')" prop="desc">
+					<el-input v-model="ruleForm.desc" type="textarea" :placeholder="t('message.dateCenter.modeling.placeholders.input')"></el-input>
 				</el-form-item>
 			</el-form>
 			<template #footer>
 				<span class="dialog-footer">
-					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
+					<el-button @click="onCancel">{{ t('message.dateCenter.modeling.actions.cancel') }}</el-button>
+					<el-button type="primary" @click="onSubmit">{{ t('message.dateCenter.modeling.actions.confirm') }}</el-button>
 				</span>
 			</template>
 		</el-dialog>
 	</div>
 </template>
-wa1
 <script lang="ts">
 import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 import api from '/@/api/datahub';
 import { ElMessage } from 'element-plus';
-import { Delete, Minus, Right } from '@element-plus/icons-vue';
+import { useI18n } from 'vue-i18n';
+import type { FormInstance } from 'element-plus';
 
 interface RuleFormState {
 	id: number;
@@ -114,64 +115,37 @@ interface RuleFormState {
 interface DicState {
 	isShowDialog: boolean;
 	ruleForm: RuleFormState;
-	rules: {};
+	rules: Record<string, any>;
+	methodData: Array<{ label: string; value: string }>;
+	tabData: Array<{ label: string; value: string }>;
+	sourceData: Array<any>;
+	nodeData: Array<any>;
 }
 
 export default defineComponent({
 	name: 'Edit',
-	components: { Delete, Minus, Right },
+	components: { },
 
 	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
+		const formRef = ref<FormInstance | null>(null);
+		const { t } = useI18n();
 		const state = reactive<DicState>({
 			isShowDialog: false,
 			methodData: [
-				{
-					label: '默认',
-					value: '',
-				}, {
-					label: 'max',
-					value: 'max',
-				}, {
-					label: 'min',
-					value: 'min',
-				}, {
-					label: 'avg',
-					value: 'avg',
-				}, {
-					label: 'sum',
-					value: 'sum',
-				}
+				{ label: t('message.dateCenter.modeling.methods.default'), value: '' },
+				{ label: t('message.dateCenter.modeling.methods.max'), value: 'max' },
+				{ label: t('message.dateCenter.modeling.methods.min'), value: 'min' },
+				{ label: t('message.dateCenter.modeling.methods.avg'), value: 'avg' },
+				{ label: t('message.dateCenter.modeling.methods.sum'), value: 'sum' },
 			],
 			tabData: [
-				{
-					label: 'int',
-					value: 'int',
-				},
-				{
-					label: 'long',
-					value: 'long',
-				},
-				{
-					label: 'float',
-					value: 'float',
-				},
-				{
-					label: 'double',
-					value: 'double',
-				},
-				{
-					label: 'string',
-					value: 'string',
-				},
-				{
-					label: 'boolean',
-					value: 'boolean',
-				},
-				{
-					label: 'date',
-					value: 'date',
-				},
+				{ label: t('message.dateCenter.modeling.types.int'), value: 'int' },
+				{ label: t('message.dateCenter.modeling.types.long'), value: 'long' },
+				{ label: t('message.dateCenter.modeling.types.float'), value: 'float' },
+				{ label: t('message.dateCenter.modeling.types.double'), value: 'double' },
+				{ label: t('message.dateCenter.modeling.types.string'), value: 'string' },
+				{ label: t('message.dateCenter.modeling.types.boolean'), value: 'boolean' },
+				{ label: t('message.dateCenter.modeling.types.date'), value: 'date' },
 			],
 
 			sourceData: [],
@@ -191,31 +165,27 @@ export default defineComponent({
 				isPk: 0,
 				default: '',
 				desc: '',
+				status: 0,
 			},
 			rules: {
-				key: [{ required: true, message: '字段节点标识不能为空', trigger: 'blur' }],
-				name: [{ required: true, message: '字段节点名称不能为空', trigger: 'blur' }],
-				dataType: [{ required: true, message: '数据类型不能为空', trigger: 'blur' }],
-				value: [{ required: true, message: '字段节点取值项不能为空', trigger: 'blur' }],
-				isSorting: [{ required: true, message: '请选择是否参与排序', trigger: 'blur' }],
-				isDesc: [{ required: true, message: '请选择排序方式', trigger: 'blur' }],
+				key: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.fieldName') }), trigger: 'blur' }],
+				name: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.fieldTitle') }), trigger: 'blur' }],
+				dataType: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.dataType') }), trigger: 'blur' }],
+				value: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.defaultValue') }), trigger: 'blur' }],
+				isSorting: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.isSorting') }), trigger: 'blur' }],
+				isDesc: [{ required: true, message: t('message.dateCenter.modeling.messages.fieldRequired', { field: t('message.dateCenter.modeling.labels.sortOrder') }), trigger: 'blur' }],
 			},
 		});
 
 		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
+		const openDialog = (payload: Partial<RuleFormState> = {}) => {
 			resetForm();
-
-			if (row?.id) {
-				state.ruleForm = row;
+			// merge payload safely
+			state.ruleForm = { ...state.ruleForm, ...payload } as RuleFormState;
+			if (payload.sourceId) {
+				getNodeList(payload.sourceId);
 			}
-
-			if (row.sourceId) {
-				getNodeList(row.sourceId);
-			}
-			state.ruleForm = row;
 			state.isShowDialog = true;
-
 			getSouData();
 		};
 
@@ -229,7 +199,7 @@ export default defineComponent({
 				});
 		};
 
-		const getNodeList = (event) => {
+		const getNodeList = (event: number) => {
 			api.node
 				.getList({
 					pageNum: 1,
@@ -240,8 +210,8 @@ export default defineComponent({
 					state.nodeData = res.list;
 				});
 		};
-		const setNode = (event) => {
-			state.nodeData.forEach((item, index) => {
+		const setNode = (event: number) => {
+			state.nodeData.forEach((item: any) => {
 				if (item.nodeId == event) {
 					state.ruleForm.name = item.name;
 					state.ruleForm.key = item.key;
@@ -264,6 +234,7 @@ export default defineComponent({
 				isPk: 0,
 				default: '',
 				desc: '',
+				status: 0,
 			};
 		};
 		// 关闭弹窗
@@ -283,7 +254,7 @@ export default defineComponent({
 					if (state.ruleForm.id !== 0) {
 						//修改
 						api.tnode.edit(state.ruleForm).then(() => {
-							ElMessage.success('字段节点类型修改成功');
+							ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
 							closeDialog(); // 关闭弹窗
 							emit('typeList');
 						});
@@ -291,7 +262,7 @@ export default defineComponent({
 						//添加
 
 						api.tnode.add(state.ruleForm).then(() => {
-							ElMessage.success('字段节点类型添加成功');
+							ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
 							closeDialog(); // 关闭弹窗
 							emit('typeList');
 						});
@@ -309,9 +280,9 @@ export default defineComponent({
 			onCancel,
 			onSubmit,
 			formRef,
+			t,
 			...toRefs(state),
 		};
 	},
 });
 </script>
-

+ 30 - 25
src/views/system/datahub/modeling/component/juhe.vue

@@ -1,9 +1,9 @@
 <template>
 	<div class="system-edit-dic-container">
-		<el-dialog title="设置聚合" v-model="isShowDialog" width="769px">
-			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
-				<el-form-item label="分组节点" prop="GroupNodeKey">
-					<el-select v-model="ruleForm.GroupNodeKey" filterable placeholder="请选择分组节点" class="w100">
+		<el-dialog :title="$t('message.dateCenter.modeling.aggregate.dialogTitle')" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="150px">
+				<el-form-item :label="$t('message.dateCenter.modeling.aggregate.labels.groupNode')" prop="GroupNodeKey">
+					<el-select v-model="ruleForm.GroupNodeKey" filterable :placeholder="$t('message.dateCenter.modeling.aggregate.placeholders.selectGroupNode')" class="w100">
 						<el-option v-for="item in sourceData" :key="item.id" :label="item.name" :value="item.key">
 							<span style="float: left">{{ item.name }}</span>
 							<span style="float: right; font-size: 13px">{{ item.key }}</span>
@@ -11,8 +11,8 @@
 					</el-select>
 				</el-form-item>
 
-				<el-form-item label="时间窗口节点" prop="TimeNodeKey">
-					<el-select v-model="ruleForm.TimeNodeKey" filterable placeholder="请选择时间窗口节点" class="w100">
+				<el-form-item :label="$t('message.dateCenter.modeling.aggregate.labels.timeWindowNode')" prop="TimeNodeKey">
+					<el-select v-model="ruleForm.TimeNodeKey" filterable :placeholder="$t('message.dateCenter.modeling.aggregate.placeholders.selectTimeWindowNode')" class="w100">
 						<el-option v-for="item in sourceData" :key="item.id" :label="item.name" :value="item.key">
 							<span style="float: left">{{ item.name }}</span>
 							<span style="float: right; font-size: 13px">{{ item.key }}</span>
@@ -20,17 +20,17 @@
 					</el-select>
 				</el-form-item>
 
-				<el-form-item label="时间值" prop="Duration">
-					<el-input v-model="ruleForm.Duration" placeholder="请输入时间值" class="w-35" />
-					<el-select v-model="ruleForm.TimeUnit" placeholder="请选择单位">
-						<el-option v-for="item in unitData" :key="item.value" :label="item.label" :value="item.value" />
+				<el-form-item :label="$t('message.dateCenter.modeling.aggregate.labels.duration')" prop="Duration">
+					<el-input v-model="ruleForm.Duration" :placeholder="$t('message.dateCenter.modeling.aggregate.placeholders.inputDuration')" class="w-35" />
+					<el-select v-model="ruleForm.TimeUnit" :placeholder="$t('message.dateCenter.modeling.aggregate.placeholders.selectUnit')">
+						<el-option v-for="item in unitData" :key="item.value" :label="$t(`message.dateCenter.modeling.aggregate.units.${item.value}`)" :value="item.value" />
 					</el-select>
 				</el-form-item>
 			</el-form>
 			<template #footer>
 				<span class="dialog-footer">
-					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">设置</el-button>
+					<el-button @click="onCancel">{{ $t('message.dateCenter.modeling.actions.cancel') }}</el-button>
+					<el-button type="primary" @click="onSubmit">{{ $t('message.dateCenter.modeling.actions.confirm') }}</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -41,6 +41,7 @@
 import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 import api from '/@/api/datahub';
 import { ElMessage } from 'element-plus';
+import { useI18n } from 'vue-i18n';
 
 interface RuleFormState {
 	id?: number;
@@ -53,13 +54,15 @@ interface DicState {
 	isShowDialog: boolean;
 	ruleForm: RuleFormState;
 	rules: {};
-	unitData: [];
+	unitData: Array<{ label: string; value: number }>;
+	sourceData: any[];
 }
 
 export default defineComponent({
 	name: 'Edit',
 
 	setup(prop, { emit }) {
+		const { t } = useI18n();
 		const formRef = ref<HTMLElement | null>(null);
 
 		const state = reactive<DicState>({
@@ -91,27 +94,29 @@ export default defineComponent({
 				TimeUnit: '',
 			},
 			rules: {
-				GroupNodeKey: [{ required: true, message: '分组节点key不能为空', trigger: 'blur' }],
-				TimeNodeKey: [{ required: true, message: '时间窗口节点key不能为空', trigger: 'blur' }],
-				Duration: [{ required: true, message: '时间值不能为空', trigger: 'blur' }],
-				TimeUnit: [{ required: true, message: '时间单位不能为空', trigger: 'blur' }],
+				GroupNodeKey: [{ required: true, message: `${t('message.dateCenter.modeling.aggregate.labels.groupNode')}${t('message.dateCenter.tags.messages.required')}` , trigger: 'blur' }],
+				TimeNodeKey: [{ required: true, message: `${t('message.dateCenter.modeling.aggregate.labels.timeWindowNode')}${t('message.dateCenter.tags.messages.required')}` , trigger: 'blur' }],
+				Duration: [{ required: true, message: `${t('message.dateCenter.modeling.aggregate.labels.duration')}${t('message.dateCenter.tags.messages.required')}` , trigger: 'blur' }],
+				TimeUnit: [{ required: true, message: `${t('message.dateCenter.modeling.aggregate.labels.unit')}${t('message.dateCenter.tags.messages.required')}` , trigger: 'blur' }],
 			},
 		});
 
 		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
+		const openDialog = (row: any | null) => {
 			resetForm();
 
 			if (row) {
 				state.ruleForm.id = row.id;
-				api.template.aggregate_from(row.id).then((res: any) => {
+				api.template.aggregate_from(Number(row.id)).then((res: any) => {
 					api.node.getList({ sourceId: res.id }).then((res: any) => {
 						state.sourceData = res.list;
-						state.ruleForm.GroupNodeKey = row.groupNodeKey;
-						state.ruleForm.TimeNodeKey = row.timeNodeKey;
-						if(row.duration>0){
-							state.ruleForm.Duration = row.duration;
-							state.ruleForm.TimeUnit = row.timeUnit;
+						state.ruleForm.GroupNodeKey = row.groupNodeKey ?? row.GroupNodeKey ?? '';
+						state.ruleForm.TimeNodeKey = row.timeNodeKey ?? row.TimeNodeKey ?? '';
+						const dur = row.duration ?? row.Duration ?? 0;
+						const unit = row.timeUnit ?? row.TimeUnit ?? '';
+						if (dur > 0) {
+							state.ruleForm.Duration = dur;
+							state.ruleForm.TimeUnit = unit;
 						}
 					});
 				});
@@ -143,7 +148,7 @@ export default defineComponent({
 			formWrap.validate((valid: boolean) => {
 				if (valid) {
 					api.template.aggregate(state.ruleForm).then(() => {
-						ElMessage.success('设置成功');
+						ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
 						closeDialog(); // 关闭弹窗
 						emit('typeList');
 					});

+ 87 - 84
src/views/system/datahub/modeling/component/relation.vue

@@ -1,31 +1,31 @@
 <template>
 	<div class="system-edit-dic-container">
-		<el-dialog title="设置主源、关联字段" v-model="isShowDialog" width="769px">
+		<el-dialog :title="$t('message.dateCenter.modeling.relation.dialogTitle')" v-model="isShowDialog" width="769px">
 			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
 
-				<el-form-item label="数据源节点" prop="mainSourceId">
-						<el-select v-model="ruleForm.mainSourceId" filterable placeholder="请选择数据源" @change="setNode">
-							<el-option v-for="item in data" :key="item.sourceId" :label="item.key" :value="item.sourceId">
-								<span style="float: left">{{ item.key }}</span>
-								<span style="float: right; font-size: 13px">{{ item.name }}</span>
-							</el-option>
-						</el-select>
-					</el-form-item>
-
-					<el-form-item label="数据源节点" prop="sourceNodeKey">
-						<el-select v-model="ruleForm.sourceNodeKey" filterable placeholder="请选择数据源" >
-							<el-option v-for="item in nodeData" :key="item.nodeId" :label="item.key" :value="item.key">
-								<span style="float: left">{{ item.key }}</span>
-								<span style="float: right; font-size: 13px">{{ item.name }}</span>
-							</el-option>
-						</el-select>
-					</el-form-item>
+				<el-form-item :label="$t('message.dateCenter.modeling.relation.labels.source')" prop="mainSourceId">
+					<el-select v-model="ruleForm.mainSourceId" filterable :placeholder="$t('message.dateCenter.modeling.relation.placeholders.selectSource')" @change="setNode">
+						<el-option v-for="item in data" :key="item.sourceId" :label="item.key" :value="item.sourceId">
+							<span style="float: left">{{ item.key }}</span>
+							<span style="float: right; font-size: 13px">{{ item.name }}</span>
+						</el-option>
+					</el-select>
+				</el-form-item>
+
+				<el-form-item :label="$t('message.dateCenter.modeling.relation.labels.sourceNode')" prop="sourceNodeKey">
+					<el-select v-model="ruleForm.sourceNodeKey" filterable :placeholder="$t('message.dateCenter.modeling.relation.placeholders.selectSourceNode')" >
+						<el-option v-for="item in nodeData" :key="item.nodeId" :label="item.key" :value="item.key">
+							<span style="float: left">{{ item.key }}</span>
+							<span style="float: right; font-size: 13px">{{ item.name }}</span>
+						</el-option>
+					</el-select>
+				</el-form-item>
 
 			</el-form>
 			<template #footer>
 				<span class="dialog-footer">
-					<el-button @click="onCancel">取 消</el-button>
-					<el-button type="primary" @click="onSubmit">设置</el-button>
+					<el-button @click="onCancel">{{ $t('message.dateCenter.modeling.actions.cancel') }}</el-button>
+					<el-button type="primary" @click="onSubmit">{{ $t('message.dateCenter.modeling.actions.confirm') }}</el-button>
 				</span>
 			</template>
 		</el-dialog>
@@ -37,6 +37,7 @@
 import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 import api from '/@/api/datahub';
 import { ElMessage } from 'element-plus';
+import { useI18n } from 'vue-i18n';
 
 interface RuleFormState {
 	id?: number;
@@ -44,46 +45,48 @@ interface RuleFormState {
 	sourceNodeKey: string;
 }
 interface DicState {
-	isShowDialog: boolean;
-	ruleForm: RuleFormState;
-	rules: {};
-	data: {};
-	nodeData:{};
+    isShowDialog: boolean;
+    ruleForm: RuleFormState;
+    rules: {};
+    data: any[];
+    nodeData: any[];
 }
 
 export default defineComponent({
-	name: 'relation',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive<DicState>({
-			isShowDialog: false,
-			data:[],
-			nodeData:[],
-			ruleForm: {
-				id: 0,
-				mainSourceId: '',
-				sourceNodeKey: '',
-			},
-			rules: {
-				mainSourceId: [{ required: true, message: '请选择数据源', trigger: 'blur' }],
-				sourceNodeKey: [{ required: true, message: '请选择数据源节点', trigger: 'blur' }],
-				
-			},
-		});
-
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm();
-			api.template.source_list(row.id).then((res: any) => {
-				state.data = res.List;
-				
-			});
-
-			if (row) {
-				state.ruleForm = row;
-			}
-			state.isShowDialog = true;
-		};
+    name: 'relation',
+    setup(prop, { emit }) {
+        const { t } = useI18n();
+        const formRef = ref<HTMLElement | null>(null);
+        const state = reactive<DicState>({
+            isShowDialog: false,
+            data: [],
+            nodeData: [],
+            ruleForm: {
+                id: 0,
+                mainSourceId: '',
+                sourceNodeKey: '',
+            },
+            rules: {
+                mainSourceId: [{ required: true, message: t('message.dateCenter.modeling.relation.labels.source') + t('message.dateCenter.tags.messages.required'), trigger: 'blur' }],
+                sourceNodeKey: [{ required: true, message: t('message.dateCenter.modeling.relation.labels.sourceNode') + t('message.dateCenter.tags.messages.required'), trigger: 'blur' }],
+                
+            },
+        });
+
+        // 打开弹窗
+        const openDialog = (row: any | null) => {
+            resetForm();
+            if (row && row.id != null) {
+                api.template.source_list(Number(row.id)).then((res: any) => {
+                    state.data = res.List;
+                });
+            }
+
+            if (row) {
+                state.ruleForm = row;
+            }
+            state.isShowDialog = true;
+        };
 		const resetForm = () => {
 			state.ruleForm = {
 				id: 0,
@@ -104,39 +107,39 @@ export default defineComponent({
 			closeDialog();
 		};
 
-		const setNode = (event) => {
+		const setNode = (event: number | string) => {
 			// state.data.forEach((item, index) => {
 			// 	if (item.sourceId == event) {
 			// 		state.ruleForm.sourceNodeKey = item.key;
 			// 	}
 			// });
-			getNodeList(event);
-		};
-		// 新增
-		const onSubmit = () => {
-			const formWrap = unref(formRef) as any;
-			if (!formWrap) return;
-			formWrap.validate((valid: boolean) => {
-				if (valid) {
-					api.template.relation(state.ruleForm).then(() => {
-						ElMessage.success('设置成功');
-						closeDialog(); // 关闭弹窗
-						emit('typeList');
-					});
-				}
-			});
-		};
-		const getNodeList = (event) => {
-			api.node
-				.getList({
-					pageNum: 1,
-					pageSize: 50,
-					sourceId: event,
-				})
-				.then((res: any) => {
-					state.nodeData = res.list;
-				});
+			getNodeList(event as number);
 		};
+        // 新增
+        const onSubmit = () => {
+            const formWrap = unref(formRef) as any;
+            if (!formWrap) return;
+            formWrap.validate((valid: boolean) => {
+                if (valid) {
+                    api.template.relation(state.ruleForm).then(() => {
+                        ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
+                        closeDialog(); // 关闭弹窗
+                        emit('typeList');
+                    });
+                }
+            });
+        };
+        const getNodeList = (event: number) => {
+            api.node
+                .getList({
+                    pageNum: 1,
+                    pageSize: 50,
+                    sourceId: event,
+                })
+                .then((res: any) => {
+                    state.nodeData = res.list;
+                });
+        };
 	
 
 		return {

+ 50 - 51
src/views/system/datahub/modeling/detail.vue

@@ -2,10 +2,10 @@
   <div class="page page-full model-detail-wrap">
     <div class="content">
       <div class="cont_box">
-        <div class="title">模型标识:{{ detail.key }}</div>
-        <div class="title" style="margin-left: 20px">模型表名:{{ detail.name }}</div>
-        <div class="pro-status"><span :class="developer_status == 1 ? 'on' : 'off'"></span>{{ developer_status == 1 ? '已发布' : '未发布' }}</div>
-        <div class="pro-option" v-auth="'startOrStop'" @click="CkOption">{{ developer_status == 1 ? '停用' : '发布' }}</div>
+        <div class="title">{{ $t('message.dateCenter.modeling.labels.modelKey') }}:{{ detail.key }}</div>
+        <div class="title" style="margin-left: 20px">{{ $t('message.dateCenter.modeling.labels.tableName') }}:{{ detail.name }}</div>
+        <div class="pro-status"><span :class="developer_status == 1 ? 'on' : 'off'"></span>{{ developer_status == 1 ? $t('message.dateCenter.modeling.status.published') : $t('message.dateCenter.modeling.status.unpublished') }}</div>
+        <div class="pro-option" v-auth="'startOrStop'" @click="CkOption">{{ developer_status == 1 ? $t('message.dateCenter.modeling.actions.unpublish') : $t('message.dateCenter.modeling.actions.publish') }}</div>
       </div>
     </div>
 
@@ -13,11 +13,11 @@
       <div class="wu-box">
         <div class="system-user-search mb15">
           <el-form :model="tableData.param" ref="queryRef" inline @submit.prevent @keyup.enter="typeList">
-            <el-form-item label="字段标题" prop="name">
-              <el-input v-model="tableData.param.name" placeholder="请输入字段标题" clearable style="width: 220px" />
+            <el-form-item :label="$t('message.dateCenter.modeling.labels.fieldTitle')" prop="name">
+              <el-input v-model="tableData.param.name" :placeholder="$t('message.dateCenter.modeling.placeholders.inputFieldTitle')" clearable style="width: 220px" />
             </el-form-item>
-            <el-form-item label="字段名称" prop="key">
-              <el-input v-model="tableData.param.key" placeholder="请输入字段名称" clearable style="width: 220px" />
+            <el-form-item :label="$t('message.dateCenter.modeling.labels.fieldName')" prop="key">
+              <el-input v-model="tableData.param.key" :placeholder="$t('message.dateCenter.modeling.placeholders.inputFieldName')" clearable style="width: 220px" />
             </el-form-item>
 
             <el-form-item>
@@ -25,19 +25,19 @@
                 <el-icon>
                   <ele-Search />
                 </el-icon>
-                查询
+                {{ $t('message.dateCenter.modeling.actions.search') }}
               </el-button>
               <el-button @click="resetQuery()">
                 <el-icon>
                   <ele-Refresh />
                 </el-icon>
-                重置
+                {{ $t('message.dateCenter.modeling.actions.reset') }}
               </el-button>
               <el-button type="success" class="ml10" @click="onOpenAdd" v-auth="'add'" v-if="developer_status == 0">
                 <el-icon>
                   <ele-FolderAdd />
                 </el-icon>
-                新增字段节点
+                {{ $t('message.dateCenter.modeling.actions.addFieldNode') }}
               </el-button>
               <!-- <el-button type="danger" class="ml10" @click="onRowDel(null)">
               <el-icon>
@@ -50,24 +50,24 @@
         </div>
 
         <el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading">
-          <el-table-column label="ID" align="center" prop="id" width="100" v-col="'id'" />
-          <el-table-column label="字段名称" prop="key" width="120" show-overflow-tooltip v-col="'key'" />
-          <el-table-column label="字段标题" prop="name" width="120" show-overflow-tooltip v-col="'name'" />
-          <el-table-column label="类型" prop="dataType" width="85" show-overflow-tooltip v-col="'dataType'" />
+          <el-table-column :label="$t('message.dateCenter.modeling.columns.id')" align="center" prop="id" width="100" v-col="'id'" />
+          <el-table-column :label="$t('message.dateCenter.modeling.labels.fieldName')" prop="key" width="120" show-overflow-tooltip v-col="'key'" />
+          <el-table-column :label="$t('message.dateCenter.modeling.labels.fieldTitle')" prop="name" width="120" show-overflow-tooltip v-col="'name'" />
+          <el-table-column :label="$t('message.dateCenter.modeling.columns.type')" prop="dataType" width="85" show-overflow-tooltip v-col="'dataType'" />
 
-          <el-table-column label="数据源名称" align="center" v-col="'from'">
+          <el-table-column :label="$t('message.dateCenter.modeling.labels.dataSourceName')" align="center" v-col="'from'">
             <template #default="scope">
               <span v-if="scope.row.from == 2">{{ scope.row.source.name }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="默认值" prop="default" width="80" show-overflow-tooltip v-col="'default'" />
-          <el-table-column label="备注说明" prop="desc" width="100" show-overflow-tooltip v-col="'value'" />
-          <el-table-column prop="createdAt" label="创建时间" align="center" width="160" v-col="'createdAt'"></el-table-column>
+          <el-table-column :label="$t('message.dateCenter.modeling.labels.defaultValue')" prop="default" width="120" show-overflow-tooltip v-col="'default'" />
+          <el-table-column :label="$t('message.dateCenter.modeling.labels.remark')" prop="desc" width="100" show-overflow-tooltip v-col="'value'" />
+          <el-table-column prop="createdAt" :label="$t('message.dateCenter.modeling.columns.createdAt')" align="center" width="160" v-col="'createdAt'"></el-table-column>
 
-          <el-table-column label="操作" width="100" align="center" fixed="right">
+          <el-table-column :label="$t('message.dateCenter.modeling.columns.action')" width="100" align="center" fixed="right">
             <template #default="scope">
-              <el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="developer_status == 0" v-auth="'edit'">修改</el-button>
-              <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="developer_status == 0" v-auth="'del'">删除</el-button>
+              <el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="developer_status == 0" v-auth="'edit'">{{ $t('message.dateCenter.modeling.actions.edit') }}</el-button>
+              <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="developer_status == 0" v-auth="'del'">{{ $t('message.dateCenter.modeling.actions.delete') }}</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -86,9 +86,9 @@
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
-import { Edit } from '@element-plus/icons-vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useRoute } from 'vue-router';
+import { useI18n } from 'vue-i18n';
 import EditDic from './component/editNode.vue';
 import RelationDic from './component/relation.vue';
 import api from '/@/api/datahub';
@@ -96,13 +96,15 @@ import api from '/@/api/datahub';
 export default defineComponent({
   name: 'dataDetail',
   components: { EditDic, RelationDic },
-  setup(prop, context) {
+  setup() {
     const editDicRef = ref();
     const relationRef = ref();
     const route = useRoute();
+    const { t } = useI18n();
     const state = reactive<any>({
-      detail: [],
+      detail: {},
       developer_status: 0,
+      ids: [],
       tableData: {
         data: [],
         total: 0,
@@ -110,7 +112,7 @@ export default defineComponent({
         param: {
           pageNum: 1,
           pageSize: 20,
-          tid: route.params.id as string,
+          tid: Number(route.params.id),
           status: '',
           key: '',
           name: '',
@@ -142,30 +144,27 @@ export default defineComponent({
       typeList();
     };
 
-    const handleClick = (tab: TabsPaneContext, event: Event) => {
-    };
+    const handleClick = () => {};
 
-    const onRowDel = (row: TableDataRow) => {
-      let msg = '你确定要删除所选数据?';
-      let ids: number[] = [];
+    const onRowDel = (row: any) => {
+      let msg = t('message.dateCenter.modeling.messages.confirmBatchDelete');
+      let id: number | null = null;
       if (row) {
-        msg = `此操作将永久删除数据节点:“${row.name}”,是否继续?`;
-        ids = row.id;
-      } else {
-        ids = state.ids;
+        msg = t('message.dateCenter.modeling.messages.deleteNodeConfirm', { name: row.name });
+        id = row.id as number;
       }
-      if (ids.length === 0) {
-        ElMessage.error('请选择要删除的数据。');
+      if (id === null) {
+        ElMessage.error(t('message.dateCenter.modeling.messages.selectToDelete'));
         return;
       }
-      ElMessageBox.confirm(msg, '提示', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
+      ElMessageBox.confirm(msg, t('message.dateCenter.modeling.messages.tip'), {
+        confirmButtonText: t('message.dateCenter.modeling.actions.confirm'),
+        cancelButtonText: t('message.dateCenter.modeling.actions.cancel'),
         type: 'warning',
       })
         .then(() => {
-          api.tnode.delete(ids).then(() => {
-            ElMessage.success('删除成功');
+          api.tnode.delete(id as number).then(() => {
+            ElMessage.success(t('message.dateCenter.modeling.messages.deleteSuccess'));
             typeList();
           });
         })
@@ -173,31 +172,31 @@ export default defineComponent({
     };
 
     // 打开修改数据源弹窗
-    const onOpenEdit = (row: TableDataRow) => {
+    const onOpenEdit = (row: any) => {
       editDicRef.value.openDialog(row);
     };
 
     const onOpenAdd = () => {
-      editDicRef.value.openDialog({ tid: route.params.id, id: 0, from: 1, isSorting: 0, isDesc: 1 });
+      editDicRef.value.openDialog({ tid: Number(route.params.id), id: 0, from: 1, isSorting: 0, isDesc: 1 });
     };
 
     const CkOption = () => {
       //检测是否需要设置关联
-      api.template.relation_check(route.params.id).then((res: any) => {
+      api.template.relation_check(Number(route.params.id)).then((res: any) => {
         if (res.yes && state.developer_status == 0) {
           let ids = {
-            id: route.params.id,
+            id: Number(route.params.id),
           }
           relationRef.value.openDialog(ids);
         } else {
           if (state.developer_status == 1) {
-            api.tnode.undeploy({ id: route.params.id }).then((res: any) => {
-              ElMessage.success('操作成功');
+            api.tnode.undeploy({ id: Number(route.params.id) }).then(() => {
+              ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
               state.developer_status = 0;
             });
           } else {
-            api.tnode.deploy({ id: route.params.id }).then((res: any) => {
-              ElMessage.success('操作成功');
+            api.tnode.deploy({ id: Number(route.params.id) }).then(() => {
+              ElMessage.success(t('message.dateCenter.modeling.messages.operateSuccess'));
               state.developer_status = 1;
             });
           }
@@ -206,7 +205,6 @@ export default defineComponent({
     };
 
     return {
-      Edit,
       CkOption,
       relationRef,
       editDicRef,
@@ -216,6 +214,7 @@ export default defineComponent({
       onRowDel,
       onOpenEdit,
       handleClick,
+      t,
       ...toRefs(state),
     };
   },

+ 63 - 47
src/views/system/datahub/modeling/index.vue

@@ -2,14 +2,14 @@
 	<div class="page">
 		<el-card shadow="never">
 			<el-form :model="tableData.param" ref="queryRef" inline>
-				<!-- <el-form-item label="模型标识" prop="key">
+				<!-- <el-form-item :label="$t('message.dateCenter.modeling.labels.modelKey')" prop="key">
             <el-input v-model="tableData.param.key" placeholder="请输入模型标识" clearable style="width: 240px" @keyup.enter.native="typeList" />
           </el-form-item> -->
-				<el-form-item label="模型名称" prop="name">
-					<el-input v-model="tableData.param.name" placeholder="请输入" clearable style="width: 240px" @keyup.enter.native="typeList" />
+				<el-form-item :label="$t('message.dateCenter.modeling.labels.modelName')" prop="name">
+					<el-input v-model="tableData.param.name" :placeholder="$t('message.dateCenter.modeling.placeholders.input')" clearable style="width: 240px" @keyup.enter.native="typeList" />
 				</el-form-item>
-				<el-form-item label="模型类型" prop="type">
-					<el-select v-model="tableData.param.type" placeholder="请选择" class="w100">
+				<el-form-item :label="$t('message.dateCenter.modeling.labels.modelType')" prop="type">
+					<el-select v-model="tableData.param.type" :placeholder="$t('message.dateCenter.modeling.placeholders.select')" class="w100">
 						<el-option v-for="item in datahub_model_type" :key="item.value" :label="item.label" :value="item.value" />
 					</el-select>
 				</el-form-item>
@@ -18,55 +18,55 @@
 						<el-icon>
 							<ele-Search />
 						</el-icon>
-						查询
+						{{ $t('message.dateCenter.modeling.actions.search') }}
 					</el-button>
 					<el-button @click="resetQuery(queryRef)">
 						<el-icon>
 							<ele-Refresh />
 						</el-icon>
-						重置
+						{{ $t('message.dateCenter.modeling.actions.reset') }}
 					</el-button>
 					<el-button type="primary" class="ml10" @click="onOpenAdd" v-auth="'add'">
 						<el-icon>
 							<ele-FolderAdd />
 						</el-icon>
-						新增模型
+						{{ $t('message.dateCenter.modeling.actions.createModel') }}
 					</el-button>
 					<el-button type="info" class="ml10" @click="onRowDel()" v-auth="'del'">
 						<el-icon>
 							<ele-Delete />
 						</el-icon>
-						删除
+						{{ $t('message.dateCenter.modeling.actions.delete') }}
 					</el-button>
 				</el-form-item>
 			</el-form>
 			<el-table :data="tableData.data" style="width: 100%" @selection-change="handleSelectionChange" v-loading="tableData.loading">
 				<el-table-column type="selection" width="55" align="center" />
-				<el-table-column label="ID" align="center" prop="id" width="100" v-col="'id'" />
+				<el-table-column :label="$t('message.dateCenter.modeling.columns.id')" align="center" prop="id" width="100" v-col="'id'" />
 				<!-- <el-table-column label="模型标识" prop="key" show-overflow-tooltip v-col="'key'"/> -->
-				<el-table-column label="模型名称" prop="name" show-overflow-tooltip v-col="'name'" />
-				<el-table-column label="类型" prop="typeName" show-overflow-tooltip v-col="'typeName'" />
+				<el-table-column :label="$t('message.dateCenter.modeling.labels.modelName')" prop="name" show-overflow-tooltip v-col="'name'" />
+				<el-table-column :label="$t('message.dateCenter.modeling.columns.typeName')" prop="typeName" show-overflow-tooltip v-col="'typeName'" />
 
-				<el-table-column label="描述" prop="desc" show-overflow-tooltip v-col="'desc'" />
-				<el-table-column prop="status" label="状态" width="100" align="center" v-col="'status'">
+				<el-table-column :label="$t('message.dateCenter.modeling.columns.desc')" prop="desc" show-overflow-tooltip v-col="'desc'" />
+				<el-table-column prop="status" :label="$t('message.dateCenter.modeling.columns.status')" width="120" align="center" v-col="'status'">
 					<template #default="scope">
-						<el-tag type="success" size="small" v-if="scope.row.status == 1">已发布</el-tag>
-						<el-tag type="info" size="small" v-else>未发布</el-tag>
+						<el-tag type="success" size="small" v-if="scope.row.status == 1">{{ $t('message.dateCenter.modeling.status.published') }}</el-tag>
+						<el-tag type="info" size="small" v-else>{{ $t('message.dateCenter.modeling.status.unpublished') }}</el-tag>
 					</template>
 				</el-table-column>
-				<el-table-column prop="createdAt" label="创建时间" width="200" align="center" v-col="'createdAt'"></el-table-column>
+				<el-table-column prop="createdAt" :label="$t('message.dateCenter.modeling.columns.createdAt')" width="200" align="center" v-col="'createdAt'"></el-table-column>
 
-				<el-table-column label="操作" width="310" align="center" fixed="right">
+				<el-table-column :label="$t('message.dateCenter.modeling.columns.action')" width="350" align="center" fixed="right">
 					<template #default="scope">
-						<el-button size="small" text type="success" @click="onOpenCalculationIndicators(scope.row)">计算指标</el-button>
+						<!-- <el-button size="small" text type="success" @click="onOpenCalculationIndicators(scope.row)">{{ $t('message.dateCenter.modeling.actions.calcIndicators') }}</el-button> -->
 						<el-button size="small" text type="primary" @click="manageField(scope.row)" v-auth="'detail'">
-								<span>字段管理</span> 
+								<span>{{ $t('message.dateCenter.modeling.actions.fieldManage') }}</span> 
 						</el-button>
-						<el-button size="small" text type="success" @click="onOpenRecord(scope.row)" v-if="scope.row.status == 1" v-auth="'record'">数据记录</el-button>
-						<el-button size="small" text type="info" :disabled="scope.row.status" @click="onOpenJuhe(scope.row)" v-auth="'juhe'">聚合设置</el-button>
-						<el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="scope.row.status == 0" v-auth="'edit'">修改</el-button>
-						<el-button size="small" text type="info" @click="onRowDel(scope.row)" v-if="scope.row.status == 0" v-auth="'del'">删除</el-button>
-						<el-button size="small" text type="primary" @click="copy(scope.row)" v-auth="'copy'">复制</el-button>
+						<el-button size="small" text type="success" @click="onOpenRecord(scope.row)" v-if="scope.row.status == 1" v-auth="'record'">{{ $t('message.dateCenter.modeling.actions.dataRecord') }}</el-button>
+						<el-button size="small" text type="info" :disabled="scope.row.status" @click="onOpenJuhe(scope.row)" v-auth="'juhe'">{{ $t('message.dateCenter.modeling.actions.aggregateSetting') }}</el-button>
+						<el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="scope.row.status == 0" v-auth="'edit'">{{ $t('message.dateCenter.modeling.actions.edit') }}</el-button>
+						<el-button size="small" text type="info" @click="onRowDel(scope.row)" v-if="scope.row.status == 0" v-auth="'del'">{{ $t('message.dateCenter.modeling.actions.delete') }}</el-button>
+						<el-button size="small" text type="primary" @click="copy(scope.row)" v-auth="'copy'">{{ $t('message.dateCenter.modeling.actions.copy') }}</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -81,7 +81,8 @@
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent, getCurrentInstance } from 'vue';
 import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
-import { useRoute, useRouter } from 'vue-router';
+import { useRouter } from 'vue-router';
+import { useI18n } from 'vue-i18n';
 
 import EditDic from './component/edit.vue';
 import Detail from './component/detail.vue';
@@ -121,12 +122,13 @@ export default defineComponent({
 		const juheRef = ref();
 		const detailRef = ref();
 		const queryRef = ref();
-		const route = useRoute();
 		const router = useRouter();
+		const { t } = useI18n();
 		const { proxy } = getCurrentInstance() as any;
 
 		const { datahub_model_type } = proxy.useDict('datahub_model_type');
 		const state = reactive<TableDataState>({
+			ids: [],
 			tableData: {
 				data: [],
 				total: 0,
@@ -184,42 +186,55 @@ export default defineComponent({
 			juheRef.value.openDialog(row);
 		};
 		const onRowDel = (row?: TableDataRow) => {
-			let msg = '你确定要删除所选数据?';
-			let ids: number[] = [];
+			let msg = t('message.dateCenter.modeling.messages.confirmBatchDelete');
+			// 优先单条
 			if (row) {
-				msg = `此操作将永久删除模型:“${row.name}”,是否继续?`;
-				ids = [row.id];
-			} else {
-				ids = state.ids;
+				const id = row.id as number;
+				msg = t('message.dateCenter.modeling.messages.deleteModelConfirm', { name: row.name });
+				ElMessageBox.confirm(msg, t('message.dateCenter.modeling.messages.tip'), {
+					confirmButtonText: t('message.dateCenter.modeling.actions.confirm'),
+					cancelButtonText: t('message.dateCenter.modeling.actions.cancel'),
+					type: 'warning',
+				})
+					.then(() => {
+						api.template.delete(id).then(() => {
+							ElMessage.success(t('message.dateCenter.modeling.messages.deleteSuccess'));
+							typeList();
+						});
+					})
+					.catch(() => { });
+				return;
 			}
-			if (ids.length === 0) {
-				ElMessage.error('请选择要删除的数据。');
+
+			// 批量删除:后端仅接受 number,逐个调用
+			const ids = state.ids;
+			if (!ids || ids.length === 0) {
+				ElMessage.error(t('message.dateCenter.modeling.messages.selectToDelete'));
 				return;
 			}
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
+			ElMessageBox.confirm(msg, t('message.dateCenter.modeling.messages.tip'), {
+				confirmButtonText: t('message.dateCenter.modeling.actions.confirm'),
+				cancelButtonText: t('message.dateCenter.modeling.actions.cancel'),
 				type: 'warning',
 			})
-				.then(() => {
-					api.template.delete(ids).then(() => {
-						ElMessage.success('删除成功');
-						typeList();
-					});
+				.then(async () => {
+					await Promise.all(ids.map((id) => api.template.delete(id)));
+					ElMessage.success(t('message.dateCenter.modeling.messages.deleteSuccess'));
+					typeList();
 				})
 				.catch(() => { });
 		};
 
 		//复制数据
 		const copy = (row: TableDataRow) => {
-			ElMessageBox.confirm('确定要复制该数据吗?', '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
+			ElMessageBox.confirm(t('message.dateCenter.modeling.messages.copyConfirm'), t('message.dateCenter.modeling.messages.tip'), {
+				confirmButtonText: t('message.dateCenter.modeling.actions.confirm'),
+				cancelButtonText: t('message.dateCenter.modeling.actions.cancel'),
 				type: 'warning',
 			})
 				.then(() => {
 					api.template.copy({ id: row.id }).then(() => {
-						ElMessage.success('复制成功');
+						ElMessage.success(t('message.dateCenter.modeling.messages.copySuccess'));
 						typeList();
 					});
 				})
@@ -242,6 +257,7 @@ export default defineComponent({
 		};
 
 		return {
+			t,
 			addDicRef,
 			editDicRef,
 			detailRef,