Jelajahi Sumber

feat: ice-104-设备支持多语言

vera_min 1 bulan lalu
induk
melakukan
c194dbd78b

+ 8 - 0
src/i18n/index.ts

@@ -62,6 +62,11 @@ import pagesAlarmCenterZhcn from './pages/alarmCenter/zh-cn';
 import pagesAlarmCenterEn from './pages/alarmCenter/en';
 import pagesAlarmCenterZhtw from './pages/alarmCenter/zh-tw';
 
+// ice104
+import pagesIce104Zhcn from './pages/ice104/zh-cn';
+import pagesIce104En from './pages/ice104/en';
+import pagesIce104Zhtw from './pages/ice104/zh-tw';
+
 
 // 定义语言国际化内容
 /**
@@ -85,6 +90,7 @@ const messages = {
 			dataAnalysis: pagesDataAnalysisZhcn,
 			certificate: pagesCertificateZhcn,
 			alarmCenter: pagesAlarmCenterZhcn,
+			ice104: pagesIce104Zhcn,
 		}
 	},
 	[enLocale.name]: {
@@ -102,6 +108,7 @@ const messages = {
 			dataAnalysis: pagesDataAnalysisEn,
 			certificate: pagesCertificateEn,
 			alarmCenter: pagesAlarmCenterEn,
+			ice104: pagesIce104En,
 		},	
 	},
 	[zhtwLocale.name]: {
@@ -119,6 +126,7 @@ const messages = {
 			dataAnalysis: pagesDataAnalysisZhtw,
 			certificate: pagesCertificateZhtw,
 			alarmCenter: pagesAlarmCenterZhtw,
+			ice104: pagesIce104Zhtw,
 		},
 	},
 };

+ 97 - 0
src/i18n/pages/ice104/en.ts

@@ -0,0 +1,97 @@
+/*
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-09-01 10:41:04
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-09-01 12:51:22
+ * @FilePath: /sagoo-admin-ui-pro2/src/i18n/pages/ice104/en.ts
+ * @Description: ice104 English internationalization
+ */
+// ice104 English
+export default {
+  tabs: {
+    detail: "Device Details",
+    task: "Device Tasks"
+  },
+  labels: {
+    deviceTitle: "Device Name",
+    deviceNumber: "Device Code",
+    deviceCommonAddr: "Common Address",
+    deviceSubCode: "MAC Address",
+    deviceTemplateNumber: "Template Number",
+    deviceProductKey: "Product Key",
+    deviceDeviceKey: "Device Key",
+    jobTitle: "Task Name",
+    deviceJobTitle: "Device Task Name",
+    jobInterval: "Execution Interval",
+    jobType: "Task Type",
+  },
+  columns: {
+    index: "Index",
+    title: "Device Name",
+    commonAddr: "Device Common Address",
+    subCode: "MAC Address",
+    templateNumber: "Template Number",
+    productKey: "Product Key",
+    deviceKey: "Device Key",
+    number: "Device Code",
+    createdAt: "Created Time",
+    updatedAt: "Updated Time",
+    action: 'Actions',
+    jobTitle: "Task Name",
+    jobInterval: "Execution Interval",
+    jobType: "Task Type",
+  },
+  actions: {
+    search: 'Search',
+    reset: 'Reset',
+    add: 'Add Device',
+    detail: 'Details',
+    delete: 'Delete',
+    save: "Save",
+    edit: "Edit",
+    addJob: "Add Task",
+    cancel: "Cancel",
+  },
+  status: {},
+  options: {},
+  messages: {
+    tip: "Tip",
+    confirm: "Confirm",
+    cancel: "Cancel",
+    deleteSuccess: "Deleted successfully",
+    editSuccess: "Edited successfully",
+    addSuccess: "Added successfully",
+    deleteConfirm: "This operation will delete device named: '{title}', continue?",
+    deleteJobConfirm: "This operation will delete task: '{title}', continue?"
+  },
+  placeholders: {
+    deviceTitle: "Please enter device name",
+    deviceNumber: "Please enter device code",
+    deviceCommonAddr: "Please enter device common address",
+    deviceSubCode: "Please enter MAC address",
+    deviceTemplateNumber: "Please select template number",
+    deviceProductKey: "Please select product key",
+    deviceDeviceKey: "Please select device key",
+    jobTitle: "Please enter task name",
+    deviceJobTitle: "Please enter device task name",
+    jobInterval: "Please enter execution interval",
+    jobType: "Please select task type"
+  },
+  validate: {
+    deviceNumber: "Please enter device code",
+    deviceJobTitle: "Please enter device task name",
+    jobInterval: "Please enter execution interval",
+    jobType: "Please select task type"
+  },
+  tag: {
+    jobType100: "General Call",
+    jobType101: "Energy Call",
+    jobType103: "Clock Sync",
+  },
+  dialog: {
+    editJobTitle: "Edit Device Task",
+    addJobTitle: "Add Device Task",
+    editDeviceTitle: "Edit Device",
+    addDeviceTitle: "Add Device"
+  }
+};

+ 97 - 0
src/i18n/pages/ice104/zh-cn.ts

@@ -0,0 +1,97 @@
+/*
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-09-01 10:41:04
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-09-01 12:51:22
+ * @FilePath: /sagoo-admin-ui-pro2/src/i18n/pages/dataAnalysis/zh-cn.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+// ice104
+export default {
+  tabs: {
+    detail: "设备详情",
+    task: "设备任务"
+  },
+  labels: {
+    deviceTitle: "设备名称",
+    deviceNumber: "设备编码",
+    deviceCommonAddr: "设备通用地址",
+    deviceSubCode: "mac地址",
+    deviceTemplateNumber: "模版编号",
+    deviceProductKey: "产品key",
+    deviceDeviceKey: "设备key",
+    jobTitle: "任务名称",
+    deviceJobTitle: "设备任务名称",
+    jobInterval: "执行间隔",
+    jobType: "任务类型",
+  },
+  columns: {
+    index: "序号",
+    title: "设备名称",
+    commonAddr: "设备通用地址",
+    subCode: "mac地址",
+    templateNumber: "模版编号",
+    productKey: "产品key",
+    deviceKey: "设备key",
+    number: "设备编码",
+    createdAt: "创建时间",
+    updatedAt: "更新时间",
+    action: '操作',
+    jobTitle: "任务名称",
+    jobInterval: "执行间隔",
+    jobType: "任务类型",
+  },
+  actions: {
+    search: '查询',
+    reset: '重置',
+    add: '新增设备',
+    detail: '详情',
+    delete: '删除',
+    save: "保存",
+    edit: "修改",
+    addJob: "新增任务",
+    cancel: "取消",
+  },
+  status: {},
+  options: {},
+  messages: {
+    tip: "提示",
+    confirm: "确认",
+    cancel: "取消",
+    deleteSuccess: "删除成功",
+    editSuccess: "编辑成功",
+    addSuccess: "新增成功",
+    deleteConfirm: "此操作将设备名为:'{title}',是否继续?",
+    deleteJobConfirm: "此操作将删除任务:'{title}',是否继续?"
+  },
+  placeholders: {
+    deviceTitle: "请输入设备名称",
+    deviceNumber: "请输入设备编码",
+    deviceCommonAddr: "请输入设备通用地址",
+    deviceSubCode: "请输入mac地址",
+    deviceTemplateNumber: "请选择模版编号",
+    deviceProductKey: "请选择产品key",
+    deviceDeviceKey: "请选择设备key",
+    jobTitle: "请输入任务名称",
+    deviceJobTitle: "请输入设备任务名称",
+    jobInterval: "请输入执行间隔",
+    jobType: "请选择任务类型"
+  },
+  validate: {
+    deviceNumber: "请输入设备编码",
+    deviceJobTitle: "请输入设备任务名称",
+    jobInterval: "请输入执行间隔",
+    jobType: "请选择任务类型"
+  },
+  tag: {
+    jobType100: "总召唤",
+    jobType101: "电度召唤",
+    jobType103: "时钟同步",
+  },
+  dialog: {
+    editJobTitle: "编辑设备任务",
+    addJobTitle: "新增设备任务",
+    editDeviceTitle: "编辑设备",
+    addDeviceTitle: "新增设备"
+  }
+};

+ 97 - 0
src/i18n/pages/ice104/zh-tw.ts

@@ -0,0 +1,97 @@
+/*
+ * @Author: vera_min vera_min@163.com
+ * @Date: 2025-09-01 10:41:04
+ * @LastEditors: vera_min vera_min@163.com
+ * @LastEditTime: 2025-09-01 12:51:22
+ * @FilePath: /sagoo-admin-ui-pro2/src/i18n/pages/ice104/zh-tw.ts
+ * @Description: ice104 繁體中文國際化
+ */
+// ice104 繁體中文
+export default {
+  tabs: {
+    detail: "設備詳情",
+    task: "設備任務"
+  },
+  labels: {
+    deviceTitle: "設備名稱",
+    deviceNumber: "設備編碼",
+    deviceCommonAddr: "設備通用地址",
+    deviceSubCode: "mac地址",
+    deviceTemplateNumber: "模版編號",
+    deviceProductKey: "產品key",
+    deviceDeviceKey: "設備key",
+    jobTitle: "任務名稱",
+    deviceJobTitle: "設備任務名稱",
+    jobInterval: "執行間隔",
+    jobType: "任務類型",
+  },
+  columns: {
+    index: "序號",
+    title: "設備名稱",
+    commonAddr: "設備通用地址",
+    subCode: "mac地址",
+    templateNumber: "模版編號",
+    productKey: "產品key",
+    deviceKey: "設備key",
+    number: "設備編碼",
+    createdAt: "創建時間",
+    updatedAt: "更新時間",
+    action: '操作',
+    jobTitle: "任務名稱",
+    jobInterval: "執行間隔",
+    jobType: "任務類型",
+  },
+  actions: {
+    search: '查詢',
+    reset: '重置',
+    add: '新增設備',
+    detail: '詳情',
+    delete: '刪除',
+    save: "保存",
+    edit: "編輯",
+    addJob: "新增任務",
+    cancel: "取消",
+  },
+  status: {},
+  options: {},
+  messages: {
+    tip: "提示",
+    confirm: "確認",
+    cancel: "取消",
+    deleteSuccess: "刪除成功",
+    editSuccess: "編輯成功",
+    addSuccess: "新增成功",
+    deleteConfirm: "此操作將設備名為:'{title}',是否繼續?",
+    deleteJobConfirm: "此操作將刪除任務:'{title}',是否繼續?"
+  },
+  placeholders: {
+    deviceTitle: "請輸入設備名稱",
+    deviceNumber: "請輸入設備編碼",
+    deviceCommonAddr: "請輸入設備通用地址",
+    deviceSubCode: "請輸入mac地址",
+    deviceTemplateNumber: "請選擇模版編號",
+    deviceProductKey: "請選擇產品key",
+    deviceDeviceKey: "請選擇設備key",
+    jobTitle: "請輸入任務名稱",
+    deviceJobTitle: "請輸入設備任務名稱",
+    jobInterval: "請輸入執行間隔",
+    jobType: "請選擇任務類型"
+  },
+  validate: {
+    deviceNumber: "請輸入設備編碼",
+    deviceJobTitle: "請輸入設備任務名稱",
+    jobInterval: "請輸入執行間隔",
+    jobType: "請選擇任務類型"
+  },
+  tag: {
+    jobType100: "總召喚",
+    jobType101: "電度召喚",
+    jobType103: "時鐘同步",
+  },
+  dialog: {
+    editJobTitle: "編輯設備任務",
+    addJobTitle: "新增設備任務",
+    editDeviceTitle: "編輯設備",
+    addDeviceTitle: "新增設備"
+  }
+};

+ 42 - 27
src/views/iot/ice104/device/component/addOrEditDeviceTask.vue

@@ -1,40 +1,50 @@
 <!-- 添加或者修改设备 -->
 <template>
+	<!-- 编辑设备任务/新增设备任务 -->
 	<el-dialog
-		:title="isEdit ? '修改设备任务' : '添加设备任务'"
+		:title="isEdit ? $t('message.ice104.dialog.editJobTitle') : $t('message.ice104.dialog.addJobTitle')"
 		v-model="dialogVisible"
 		width="600px"
 		:before-close="closeDialog"
 		:close-on-click-modal="false"
 	>
-		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
-			<el-form-item label="设备任务名称" prop="title">
-				<el-input v-model="ruleForm.title" placeholder="请输入设备任务名称" />
+		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" :label-width="currentLang == 'en' ? 160 : 120" >
+			<!-- 设备任务名称 -->
+			<el-form-item :label="$t('message.ice104.labels.deviceJobTitle')" prop="title">
+				<!-- 请输入设备任务名称 -->
+				<el-input v-model="ruleForm.title" :placeholder="$t('message.ice104.placeholders.deviceJobTitle')" />
 			</el-form-item>
-            <el-form-item label="执行间隔" prop="interval">
-				<el-input type="number" :min="0" v-model.number="ruleForm.interval" placeholder="请输入执行间隔" />
+			<!-- 执行间隔 -->
+      <el-form-item :label="$t('message.ice104.labels.jobInterval')" prop="interval">
+				<!-- 请输入执行间隔 -->
+				<el-input v-model="ruleForm.interval" :placeholder="$t('message.ice104.placeholders.jobInterval')" />
 			</el-form-item>
-			<el-form-item label="任务类型" prop="jobType">
-				<el-select v-model="ruleForm.jobType" placeholder="请选择任务类型" class="width100">
+			<!-- 任务类型 -->
+			<el-form-item :label="$t('message.ice104.labels.jobType')" prop="jobType">
+				<!-- 请选择任务类型 -->
+				<el-select v-model="ruleForm.jobType" :placeholder="$t('message.ice104.placeholders.jobType')" class="width100">
 					<el-option v-for="dict in device_job_types" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
 				</el-select>
 			</el-form-item>
 		</el-form>
 		<template #footer>
-			<el-button v-auth="'cancelTask'" @click="closeDialog()"> 取 消 </el-button>
-			<el-button v-auth="'addTask'" :loading="btnLoading" type="primary" @click="submitData"> 保 存 </el-button>
+			<!-- 取 消 -->
+			<el-button v-auth="'cancelTask'" @click="closeDialog()">{{ $t('message.ice104.actions.cancel') }}</el-button>
+			<!-- 保 存 -->
+			<el-button v-auth="'addTask'" :loading="btnLoading" type="primary" @click="submitData">{{ $t('message.ice104.actions.save') }}</el-button>
 		</template>
 	</el-dialog>
 </template>
 <script lang="ts" setup>
 import { computed, reactive, ref, onMounted, getCurrentInstance } from 'vue';
 import api from '/@/api/ice104/index';
-import { useI18n } from 'vue-i18n';
 import { ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
 import apiDevice from '/@/api/device';
 import { useRoute } from 'vue-router';
-
+import { useI18n } from 'vue-i18n';
+const { t, locale } = useI18n()
+const currentLang = computed(() => locale.value);	
 const route = useRoute();
 
 const { proxy } = getCurrentInstance() as any;
@@ -48,18 +58,21 @@ const btnLoading = ref(false);
 const emit = defineEmits(['updateList']);
 const formRef = ref();
 const ruleForm = ref({
-    number: 0,
+	number: 0,
 	title: '',
-    deviceNumber: route.params && route.params.id,
-    interval: 0,
-    jobType: ''
+	deviceNumber: route.params && route.params.id,
+	interval: "",
+	jobType: ''
 })
 const isEdit = ref(false);
 
 const formRules = computed(() => ({
-	title: [{ required: true, trigger: 'blur', message: '请输入设备任务名称' }],
-	interval: [{ required: true, trigger: 'blur', message: '请输入执行间隔' }],
-	jobType: [{ required: true, trigger: 'blur', message: '请选择任务类型' }],
+	// 请输入设备任务名称
+	title: [{ required: true, trigger: 'blur', message: t('message.ice104.validate.deviceJobTitle') }],
+	// 请输入执行间隔(s)
+	interval: [{ required: true, trigger: 'blur', message: t('message.ice104.validate.jobInterval') }],
+	// 请选择任务类型
+	jobType: [{ required: true, trigger: 'blur', message: t('message.ice104.validate.jobType') }],
 }));
 const getRandom = (num:number) =>{
     return Math.floor((Math.random()+Math.floor(Math.random()*9+1))*Math.pow(10,num-1));
@@ -69,22 +82,24 @@ const submitData = async () => {
 		if (!valid) return
 		btnLoading.value = true
 		if (isEdit.value) {
-			// 修改
+			// 编辑
 			api.job.editItem({
 				...ruleForm.value,
 			})
-			.then(() => {
-				ElMessage({ type: 'success', message: '修改成功' })
+				.then(() => {
+				// 编辑成功
+				ElMessage({ type: 'success', message: t('message.ice104.messages.editSuccess') })
 				emit('updateList')
 				closeDialog()
 			})
 			.finally(() => (btnLoading.value = false))
 		} else {
 			// 新增
-            ruleForm.value.number = getRandom(10);
+			ruleForm.value.number = getRandom(10);
 			api.job.addItem(ruleForm.value)
-			.then(() => {
-				ElMessage({ type: 'success', message: '添加成功' })
+				.then(() => {
+				// 新增成功
+				ElMessage({ type: 'success', message: t('message.ice104.messages.addSuccess') })
 				emit('updateList')
 				closeDialog()
 			})
@@ -103,7 +118,7 @@ const closeDialog = () => {
 	number: 0,
 	title: '',
     deviceNumber: route.params && route.params.id,
-    interval: 0,
+    interval: "",
     jobType: ''
   }
 }
@@ -112,7 +127,7 @@ const closeDialog = () => {
 const open = async (row: any) => {
 	dialogVisible.value = true
 	if (row && row.number.toString()) {
-        row.jobType = row.jobType.toString();
+    row.jobType = row.jobType.toString();
 		ruleForm.value = row;
 		isEdit.value = true;
 	}else {

+ 49 - 27
src/views/iot/ice104/device/component/deviceTaskTable.vue

@@ -1,46 +1,62 @@
 <template>
   <div class="page">
     <el-form :model="params" inline ref="queryRef">
-      <el-form-item label="任务名称" prop="title">
-        <el-input v-model="params.title" placeholder="请输入任务名称" clearable style="width: 240px" @submit.prevent />
+      <!-- 任务名称 -->
+      <el-form-item :label="$t('message.ice104.labels.jobTitle')" prop="title">
+        <!-- 请输入任务名称 -->
+        <el-input v-model="params.title" :placeholder="$t('message.ice104.placeholders.jobTitle')" clearable style="width: 240px" @submit.prevent />
       </el-form-item>
       <el-form-item>
+        <!-- 查询 -->
         <el-button v-auth="'query'" type="primary" class="ml10" @click="getList(1)">
           <el-icon>
             <ele-Search />
           </el-icon>
-          查询
+          {{ $t('message.ice104.actions.search') }}
         </el-button>
+        <!-- 重置 -->
         <el-button v-auth="'reset'" @click="resetQuery()">
           <el-icon>
             <ele-Refresh />
           </el-icon>
-          重置
+          {{ $t('message.ice104.actions.reset') }}
         </el-button>
+        <!-- 新增任务 -->
         <el-button v-auth="'add'" type="primary" @click="addOrEdit()">
           <el-icon>
             <ele-FolderAdd />
           </el-icon>
-          新增任务
+          {{ $t('message.ice104.actions.addJob') }}
         </el-button>
       </el-form-item>
     </el-form>
     <el-table :data="tableData" style="width: 100%" v-loading="loading">
-      <el-table-column v-col="'index'" type="index" label="序号" width="80" align="center" />
-      <el-table-column v-col="'title'" prop="title" label="任务名称" align="center" show-overflow-tooltip></el-table-column>
-      <el-table-column v-col="'deviceNumber'" prop="deviceNumber" label="设备编码" min-width="120" align="center" show-overflow-tooltip></el-table-column>
-      <el-table-column v-col="'interval'" prop="interval" label="执行间隔(s)" min-width="120" align="center" show-overflow-tooltip></el-table-column>
-      <el-table-column v-col="'jobType'" prop="jobType" label="任务类型" min-width="120" align="center" show-overflow-tooltip>
+      <!-- 序号 -->
+      <el-table-column v-col="'index'" type="index" :label="$t('message.ice104.columns.index')" width="80" align="center" />
+      <!-- 任务名称 -->
+      <el-table-column v-col="'title'" prop="title" :label="$t('message.ice104.columns.jobTitle')" align="center" show-overflow-tooltip></el-table-column>
+      <!-- 设备编码 -->
+      <el-table-column v-col="'deviceNumber'" prop="deviceNumber" :label="$t('message.ice104.columns.number')" min-width="120" align="center" show-overflow-tooltip></el-table-column>
+      <!-- 执行间隔 -->
+      <el-table-column v-col="'interval'" prop="interval" :label="$t('message.ice104.columns.jobInterval')"  :min-width="currentLang == 'en' ? 150 : 120" align="center" show-overflow-tooltip></el-table-column>
+      <!-- 任务类型 -->
+      <el-table-column v-col="'jobType'" prop="jobType" :label="$t('message.ice104.columns.jobType')" min-width="120" align="center" show-overflow-tooltip>
         <template #default="scope">
-          <el-tag type="info" size="small" v-if="scope.row.jobType == 100">总召唤</el-tag>
-          <el-tag type="info" size="small" v-if="scope.row.jobType == 101">电度召唤</el-tag>
-          <el-tag type="info" size="small" v-if="scope.row.jobType == 103">时钟同步</el-tag>
+          <!-- 总召唤 -->
+          <el-tag type="info" size="small" v-if="scope.row.jobType == 100">{{ $t('message.ice104.tag.jobType100') }}</el-tag>
+          <!-- 电度召唤 -->
+          <el-tag type="info" size="small" v-if="scope.row.jobType == 101">{{ $t('message.ice104.tag.jobType101') }}</el-tag>
+          <!-- 时钟同步 -->
+          <el-tag type="info" size="small" v-if="scope.row.jobType == 103">{{ $t('message.ice104.tag.jobType103') }}</el-tag>
         </template>
       </el-table-column>
-      <el-table-column v-col="'handle'" fixed="right" label="操作" width="100" align="center">
+      <!-- 操作 -->
+      <el-table-column v-col="'handle'" fixed="right" :label="$t('message.ice104.columns.action')" width="100" align="center">
         <template #default="scope">
-          <el-button size="small" v-auth="'edit'" text type="primary" @click="addOrEdit(scope.row)">修改</el-button>
-          <el-button size="small" v-auth="'del'" text type="info" @click="onDel(scope.row)">删除</el-button>
+          <!-- 修改 -->
+          <el-button size="small" v-auth="'edit'" text type="primary" @click="addOrEdit(scope.row)">{{ $t('message.ice104.actions.edit') }}</el-button>
+          <!-- 删除 -->
+          <el-button size="small" v-auth="'del'" text type="info" @click="onDel(scope.row)">{{ $t('message.ice104.actions.delete') }}</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -49,20 +65,20 @@
   </div>
 </template>
 <script lang="ts" setup>
-import { computed, reactive, ref, onMounted } from 'vue';
+import { computed, ref, onMounted } from 'vue';
 import api from '/@/api/ice104/index';
-import { useI18n } from 'vue-i18n';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
-import apiDevice from '/@/api/device';
+// import apiDevice from '/@/api/device';
 import EditForm from './addOrEditDeviceTask.vue';
 import { useRoute } from 'vue-router';
-
+import { useI18n } from 'vue-i18n';
+const { t, locale } = useI18n();
+const currentLang = computed(() => locale.value);	
 const route = useRoute();
 
 const { params, tableData, getList, loading } = useSearch(api.job.getList, 'data', { title: '', deviceNumber: route.params.id });
 
-const emit = defineEmits(['updateList']);
 const editFormRef = ref();
 const queryRef = ref();
 
@@ -78,13 +94,19 @@ const addOrEdit = async (row?: any) => {
  * 单一删除
  */
 const onDel = (row: any) => {
-  ElMessageBox.confirm(`此操作将删除任务:“${row.title}”,是否继续?`, '提示', {
-    confirmButtonText: '确认',
-    cancelButtonText: '取消',
-    type: 'warning',
-  }).then(async () => {
+  // 此操作将删除任务:“${row.title}”,是否继续?
+  ElMessageBox.confirm(
+    t('message.ice104.messages.deleteJobConfirm', { title: row.title }),
+    t('message.ice104.messages.tip'),
+    {
+      confirmButtonText: t('message.ice104.messages.confirm'),
+      cancelButtonText: t('message.ice104.messages.cancel'),
+      type: 'warning',
+    }
+  ).then(async () => {
     await api.job.deleteItem({ number: row.number });
-    ElMessage.success('删除成功');
+			// 删除成功
+		ElMessage.success(t('message.ice104.messages.deleteSuccess'));
     getList();
   });
 };

+ 45 - 21
src/views/iot/ice104/device/component/edit.vue

@@ -1,37 +1,54 @@
 <template>
-	<el-dialog :title="isEdit ? '修改设备' : '添加设备'" v-model="dialogVisible" width="600px" :before-close="closeDialog" :close-on-click-modal="false">
-		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" label-width="120px">
-			<el-form-item label="设备编码" prop="number">
-				<el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入设备编码" />
+	<!-- 编辑设备/新增设备 -->
+	<el-dialog :title="isEdit ? $t('message.ice104.dialog.editDeviceTitle') : $t('message.ice104.dialog.addDeviceTitle')" v-model="dialogVisible" width="600px" :before-close="closeDialog" :close-on-click-modal="false">
+		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" :label-width="currentLang == 'en' ? 140 : 120">
+			<!-- 设备编码 -->
+			<el-form-item :label="$t('message.ice104.labels.deviceNumber')" prop="number">
+				<!-- 请输入设备编码 -->
+				<el-input :disabled="isEdit" v-model="ruleForm.number" :placeholder="$t('message.ice104.placeholders.deviceNumber')" />
 			</el-form-item>
-			<el-form-item label="名称">
-				<el-input v-model="ruleForm.title" placeholder="请输入名称" />
+			<!-- 设备名称 -->
+			<el-form-item :label="$t('message.ice104.labels.deviceTitle')">
+				<!-- 请输入设备名称 -->
+				<el-input v-model="ruleForm.title" :placeholder="$t('message.ice104.placeholders.deviceTitle')" />
 			</el-form-item>
-			<el-form-item label="设备通用地址">
-				<el-input type="number" v-model.number="ruleForm.commonAddr" placeholder="请输入设备通用地址" />
+			<!-- 设备通用地址 -->
+			<el-form-item :label="$t('message.ice104.labels.deviceCommonAddr')">
+				<!-- 请输入设备通用地址 -->
+				<el-input type="number" v-model.number="ruleForm.commonAddr" :placeholder="$t('message.ice104.placeholders.deviceCommonAddr')" />
 			</el-form-item>
-			<el-form-item label="mac地址">
-				<el-input v-model="ruleForm.subCode" placeholder="请输入mac地址" />
+			<!-- mac地址 -->
+			<el-form-item :label="$t('message.ice104.labels.deviceSubCode')">
+				<!-- 请输入mac地址 -->
+				<el-input v-model="ruleForm.subCode" :placeholder="$t('message.ice104.placeholders.deviceSubCode')" />
 			</el-form-item>
-			<el-form-item label="模版编号">
-				<el-select v-model="ruleForm.templateNumber" placeholder="请选择模版编号" class="width100">
+			<!-- 模版编号 -->
+			<el-form-item :label="$t('message.ice104.labels.deviceTemplateNumber')">
+				<!-- 请选择模版编号 -->
+				<el-select v-model="ruleForm.templateNumber" :placeholder="$t('message.ice104.placeholders.deviceTemplateNumber')" class="width100">
 					<el-option :label="item.title" :value="item.number" v-for="(item, index) in tableData" :key="index" />
 				</el-select>
 			</el-form-item>
-			<el-form-item label="产品key">
-				<el-select @change="handleProductChange" v-model="ruleForm.productKey" placeholder="请选择产品key" class="width100">
+			<!-- 产品key -->
+			<el-form-item :label="$t('message.ice104.labels.deviceProductKey')">
+				<!-- 请选择产品key -->
+				<el-select @change="handleProductChange" v-model="ruleForm.productKey" :placeholder="$t('message.ice104.placeholders.deviceProductKey')" class="width100">
 					<el-option :label="item.name" :value="item.key" v-for="(item, index) in productList" :key="index" />
 				</el-select>
 			</el-form-item>
-			<el-form-item label="设备key" v-if="ruleForm.productKey">
-				<el-select v-model="ruleForm.deviceKey" placeholder="请选择设备key" class="width100">
+			<!-- 设备key -->
+			<el-form-item :label="$t('message.ice104.labels.deviceDeviceKey')" v-if="ruleForm.productKey">
+				<!-- 请选择设备key -->
+				<el-select v-model="ruleForm.deviceKey" :placeholder="$t('message.ice104.placeholders.deviceDeviceKey')" class="width100">
 					<el-option :label="item.name" :value="item.key" v-for="(item, index) in deviceList" :key="index" />
 				</el-select>
 			</el-form-item>
 		</el-form>
 		<template #footer>
-			<el-button v-auth="'cancelSaveDevice'" @click="closeDialog()"> 取 消 </el-button>
-			<el-button v-auth="'saveDevice'" :loading="btnLoading" type="primary" @click="submitData"> 保 存 </el-button>
+			<!-- 取 消 -->
+			<el-button v-auth="'cancelSaveDevice'" @click="closeDialog()"> {{ $t('message.ice104.actions.cancel') }} </el-button>
+			<!-- 保 存 -->
+			<el-button v-auth="'saveDevice'" :loading="btnLoading" type="primary" @click="submitData"> {{ $t('message.ice104.actions.save') }} </el-button>
 		</template>
 	</el-dialog>
 </template>
@@ -41,10 +58,14 @@ import api from '/@/api/ice104/index';
 import { ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
 import apiDevice from '/@/api/device';
+import { useI18n } from 'vue-i18n'
+const { t, locale } = useI18n()
+
 
 const { tableData, getList } = useSearch(api.template.getAll, 'data', { title: '', status: 1 });
 getList();
 
+const currentLang = computed(() => locale.value);	
 const dialogVisible = ref(false);
 const btnLoading = ref(false);
 const productList = ref<any[]>([]);
@@ -63,7 +84,8 @@ const ruleForm = ref({
 const isEdit = ref(false);
 
 const formRules = computed(() => ({
-	number: [{ required: true, trigger: 'change', message: '请输入设备编码' }],
+	// 请输入设备编码
+	number: [{ required: true, trigger: 'change', message: t('message.ice104.validate.deviceNumber') }],
 }));
 
 const submitData = async () => {
@@ -76,7 +98,8 @@ const submitData = async () => {
 				...ruleForm.value,
 			})
 				.then(() => {
-					ElMessage({ type: 'success', message: '修改成功' })
+					// 编辑成功
+					ElMessage({ type: 'success', message: t('message.ice104.messages.editSuccess') })
 					emit('updateList')
 					closeDialog()
 				})
@@ -85,7 +108,8 @@ const submitData = async () => {
 			// 新增
 			api.device.addItem(ruleForm.value)
 				.then(() => {
-					ElMessage({ type: 'success', message: '添加成功' })
+					// 新增成功
+					ElMessage({ type: 'success', message: t('message.ice104.messages.addSuccess') })
 					emit('updateList')
 					closeDialog()
 				})

+ 39 - 18
src/views/iot/ice104/device/component/editDeviceForm.vue

@@ -1,34 +1,49 @@
 <template>
-	<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" label-width="110px" style="width: 70%;">
-		<el-form-item label="设备编码" prop="number">
-			<el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入设备编码" />
+	<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="right" :label-width="currentLang == 'en' ? 140 : 110" style="width: 70%;">
+		<!-- 设备编码 -->
+		<el-form-item :label="$t('message.ice104.labels.deviceNumber')" prop="number">
+			<!-- 请输入设备编码 -->
+			<el-input :disabled="isEdit" v-model="ruleForm.number" :placeholder="$t('message.ice104.placeholders.deviceNumber')" />
 		</el-form-item>
-		<el-form-item label="名称">
-			<el-input v-model="ruleForm.title" placeholder="请输入名称" />
+		<!-- 设备名称 -->
+		<el-form-item :label="$t('message.ice104.labels.deviceTitle')">
+			<!-- 请输入设备名称 -->
+			<el-input v-model="ruleForm.title" :placeholder="$t('message.ice104.placeholders.deviceTitle')" />
 		</el-form-item>
-		<el-form-item label="设备通用地址">
-			<el-input type="number" v-model.number="ruleForm.commonAddr" placeholder="请输入设备通用地址" />
+		<!-- 设备通用地址 -->
+		<el-form-item :label="$t('message.ice104.labels.deviceCommonAddr')">
+			<!-- 请输入设备通用地址 -->
+			<el-input type="number" v-model.number="ruleForm.commonAddr" :placeholder="$t('message.ice104.placeholders.deviceCommonAddr')" />
 		</el-form-item>
-		<el-form-item label="mac地址">
-			<el-input v-model="ruleForm.subCode" placeholder="请输入mac地址" />
+		<!-- mac地址 -->
+		<el-form-item :label="$t('message.ice104.labels.deviceSubCode')">
+			<!-- 请输入mac地址 -->
+			<el-input v-model="ruleForm.subCode" :placeholder="$t('message.ice104.placeholders.deviceSubCode')" />
 		</el-form-item>
-		<el-form-item label="模版编号">
-			<el-select v-model="ruleForm.templateNumber" placeholder="请选择模版编号" class="width100">
+		<!-- 模版编号 -->
+		<el-form-item :label="$t('message.ice104.labels.deviceTemplateNumber')">
+			<!-- 请选择模版编号 -->
+			<el-select v-model="ruleForm.templateNumber" :placeholder="$t('message.ice104.placeholders.deviceTemplateNumber')" class="width100">
 				<el-option :label="item.title" :value="item.number" v-for="(item, index) in tableData" :key="index" />
 			</el-select>
 		</el-form-item>
-		<el-form-item label="产品key">
-			<el-select @change="(val: string) => handleProductChange(val, true)" v-model="ruleForm.productKey" placeholder="请选择产品key" class="width100">
+		<!-- 产品key -->
+		<el-form-item :label="$t('message.ice104.labels.deviceProductKey')">
+			<!-- 请选择产品key -->
+			<el-select @change="(val: string) => handleProductChange(val, true)" v-model="ruleForm.productKey" :placeholder="$t('message.ice104.placeholders.deviceProductKey')" class="width100">
 				<el-option :label="item.name" :value="item.key" v-for="(item, index) in productList" :key="index" />
 			</el-select>
 		</el-form-item>
-		<el-form-item label="设备key" v-if="ruleForm.productKey">
-			<el-select v-model="ruleForm.deviceKey" placeholder="请选择设备key" class="width100">
+		<!-- 设备key -->
+		<el-form-item :label="$t('message.ice104.labels.deviceDeviceKey')" v-if="ruleForm.productKey">
+			<!-- 请选择设备key -->
+			<el-select v-model="ruleForm.deviceKey" :placeholder="$t('message.ice104.placeholders.deviceDeviceKey')" class="width100">
 				<el-option :label="item.name" :value="item.key" v-for="(item, index) in deviceList" :key="index" />
 			</el-select>
 		</el-form-item>
 		<el-form-item>
-			<el-button type="primary" v-auth="'save'" :loading="btnLoading" @click="submitData"> 保 存 </el-button>
+			<!-- 保 存 -->
+			<el-button type="primary" v-auth="'save'" :loading="btnLoading" @click="submitData">{{$t('message.ice104.actions.save')}}</el-button>
 		</el-form-item>
 	</el-form>
 </template>
@@ -38,6 +53,10 @@ import api from '/@/api/ice104/index';
 import { ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
 import apiDevice from '/@/api/device';
+import { useI18n } from 'vue-i18n'
+
+const { t, locale } = useI18n()
+const currentLang = computed(() => locale.value);	
 
 const { params, tableData, getList, loading } = useSearch(api.template.getAll, 'data', { title: '', status: 1 });
 getList();
@@ -59,7 +78,8 @@ const ruleForm = ref({
 const isEdit = ref(false);
 
 const formRules = computed(() => ({
-	number: [{ required: true, trigger: 'change', message: '请输入设备编码' }],
+	// 请输入设备编码
+	number: [{ required: true, trigger: 'change', message: t('message.ice104.validate.deviceNumber') }],
 }));
 
 const submitData = async () => {
@@ -72,7 +92,8 @@ const submitData = async () => {
 				...ruleForm.value,
 			})
 				.then(() => {
-					ElMessage({ type: 'success', message: '修改成功' })
+					// 编辑成功
+					ElMessage({ type: 'success', message: t('message.ice104.messages.editSuccess') })
 					emit('updateList')
 				})
 				.finally(() => (btnLoading.value = false))

+ 5 - 39
src/views/iot/ice104/device/detail.vue

@@ -1,10 +1,12 @@
 <template>
 	<div class="page border bg padding page-full Ipt-2">
 		<el-tabs v-model="activeName">
-			<el-tab-pane label="设备详情" name="detail">
+			<!-- 设备详情 -->
+			<el-tab-pane :label="$t('message.ice104.tabs.detail')" name="detail">
 				<EditDeviceForm ref="editFormRef" />
 			</el-tab-pane>
-			<el-tab-pane label="设备任务" name="task">
+			<!-- 设备任务 -->
+			<el-tab-pane :label="$t('message.ice104.tabs.task')" name="task">
 				<DeviceTaskTable />
 			</el-tab-pane>
 		</el-tabs>
@@ -17,54 +19,18 @@ import EditDeviceForm from './component/editDeviceForm.vue'
 import DeviceTaskTable from './component/deviceTaskTable.vue'
 
 import api from '/@/api/ice104/index'
-import { ElMessageBox, ElMessage } from 'element-plus'
-import { useSearch } from '/@/hooks/useCommonIce104'
 import { useRoute } from 'vue-router'
-import type { TabsPaneContext } from 'element-plus'
 
 const route = useRoute()
 const editFormRef = ref()
 const detailFormData = ref({})
-const queryRef = ref()
-
-const activeName = ref('detail')
-
-const { params, tableData, getList, loading } = useSearch(api.device.getList, 'data', { title: '' })
-
-getList()
-
-const handleClick = (tab: TabsPaneContext, event: Event) => {
-	console.log(activeName)
-	if (activeName.value == 'task') {
-		console.log('获取详情')
-		initDeviceInfo()
-	} else {
-		console.log('获取任务列表')
-		getList()
-	}
-}
-
-/**
- * 删除
- */
-const onDel = (row: any) => {
-	ElMessageBox.confirm(`此操作将删除:“${row.title}”,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(async () => {
-		await api.device.deleteItem({ number: row.number })
-		ElMessage.success('删除成功')
-		getList()
-	})
-}
 
+const activeName = ref('detail');
 /**
  * 获取设备详情
  */
 const initDeviceInfo = async () => {
 	const res = await api.device.detailItem(route.params && route.params.id)
-	console.log(res)
 	detailFormData.value = res.data
 	editFormRef.value.open(res.data)
 }

+ 52 - 26
src/views/iot/ice104/device/index.vue

@@ -1,46 +1,64 @@
 <template>
 	<div class="page">
 		<el-card shadow="never">
+			<!-- 设备名称 -->
 			<el-form :model="params" inline ref="queryRef" @submit.prevent>
-				<el-form-item label="设备名称" prop="title">
-					<el-input v-model="params.title" placeholder="请输入设备名称" clearable style="width: 240px" @keyup.enter.native="getList(1)" />
+				<el-form-item :label="$t('message.ice104.labels.deviceTitle')" prop="title">
+					<!-- 请输入设备名称 -->
+					<el-input v-model="params.title" :placeholder="$t('message.ice104.placeholders.deviceTitle')" clearable style="width: 240px" @keyup.enter.native="getList(1)" />
 				</el-form-item>
 				<el-form-item>
+					<!-- 查询 -->	
 					<el-button v-auth="'query'" type="primary" class="ml10" @click="getList(1)">
 						<el-icon>
 							<ele-Search />
 						</el-icon>
-						查询
+						{{ $t('message.ice104.actions.search') }}
 					</el-button>
+					<!-- 重置 -->
 					<el-button v-auth="'reset'" @click="resetQuery()">
 						<el-icon>
 							<ele-Refresh />
 						</el-icon>
-						重置
+						{{ $t('message.ice104.actions.reset') }}
 					</el-button>
+					<!-- 新增设备 -->
 					<el-button v-auth="'add'" type="primary" @click="addOrEdit()">
 						<el-icon>
 							<ele-FolderAdd />
 						</el-icon>
-						新增设备
+						{{ $t('message.ice104.actions.add') }}
 					</el-button>
 				</el-form-item>
 			</el-form>
 			<el-table :data="tableData" style="width: 100%" v-loading="loading">
-				<el-table-column v-col="'index'" type="index" label="序号" width="80" align="center" />
-				<el-table-column v-col="'title'" prop="title" label="设备名称" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column v-col="'commonAddr'" prop="commonAddr" label="设备通用地址" min-width="120" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column v-col="'subCode'" prop="subCode" label="mac地址" min-width="120" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column v-col="'templateNumber'" prop="templateNumber" label="模版编号" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column v-col="'productKey'" prop="productKey" label="产品key" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column v-col="'deviceKey'" prop="deviceKey" label="设备key" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column v-col="'number'" prop="number" label="设备编码" min-width="120" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column v-col="'createdAt'" prop="createdAt" label="创建时间" min-width="160" align="center"></el-table-column>
-				<el-table-column v-col="'updatedAt'" prop="updatedAt" label="更新时间" min-width="160" align="center"></el-table-column>
-				<el-table-column v-col="'handle'" fixed="right" label="操作" width="100" align="center">
+				<!-- 序号 -->
+				<el-table-column v-col="'index'" type="index" :label="$t('message.ice104.columns.index')" width="80" align="center" />
+				<!-- 设备名称 -->
+				<el-table-column v-col="'title'" prop="title" :label="$t('message.ice104.columns.title')" :width="currentLang == 'en' ? 120 : 100" align="center" show-overflow-tooltip></el-table-column>
+				<!-- 设备通用地址 -->
+				<el-table-column v-col="'commonAddr'" prop="commonAddr" :label="$t('message.ice104.columns.commonAddr')" :width="currentLang == 'en' ? 200 : 120" align="center" show-overflow-tooltip></el-table-column>
+				<!-- mac地址 -->
+				<el-table-column v-col="'subCode'" prop="subCode" :label="$t('message.ice104.columns.subCode')" min-width="120" align="center" show-overflow-tooltip></el-table-column>
+				<!-- 模版编号 -->
+				<el-table-column v-col="'templateNumber'" prop="templateNumber" :label="$t('message.ice104.columns.templateNumber')" align="center" show-overflow-tooltip></el-table-column>
+				<!-- 产品key -->
+				<el-table-column v-col="'productKey'" prop="productKey" :label="$t('message.ice104.columns.productKey')" :width="currentLang == 'en' ? 120 : 100" align="center" show-overflow-tooltip></el-table-column>
+				<!-- 设备key -->
+				<el-table-column v-col="'deviceKey'" prop="deviceKey" :label="$t('message.ice104.columns.deviceKey')" :width="currentLang == 'en' ? 120 : 100" align="center" show-overflow-tooltip></el-table-column>
+				<!-- 设备编码 -->
+				<el-table-column v-col="'number'" prop="number" :label="$t('message.ice104.columns.number')" min-width="120" align="center" show-overflow-tooltip></el-table-column>
+				<!-- 创建时间 -->
+				<el-table-column v-col="'createdAt'" prop="createdAt" :label="$t('message.ice104.columns.createdAt')" min-width="160" align="center"></el-table-column>
+				<!-- 更新时间 -->
+				<el-table-column v-col="'updatedAt'" prop="updatedAt" :label="$t('message.ice104.columns.updatedAt')" min-width="160" align="center"></el-table-column>
+				<!-- 操作 -->
+				<el-table-column v-col="'handle'" fixed="right" :label="$t('message.ice104.columns.action')" :width="currentLang == 'en' ? 120 : 100" align="center">
 					<template #default="scope">
-						<el-button size="small" v-auth="'del'" text type="primary" @click="toDetailPage(scope.row)">详情</el-button>
-						<el-button size="small" v-auth="'detail'" text type="info" @click="onDel(scope.row)">删除</el-button>
+						<!-- 详情 -->
+						<el-button size="small" v-auth="'del'" text type="primary" @click="toDetailPage(scope.row)">{{ $t('message.ice104.actions.detail') }}</el-button>
+						<!-- 删除 -->
+						<el-button size="small" v-auth="'detail'" text type="info" @click="onDel(scope.row)">{{ $t('message.ice104.actions.delete') }}</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -51,17 +69,19 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, onMounted } from 'vue';
+import { ref, computed } from 'vue';
 import EditForm from './component/edit.vue';
 import api from '/@/api/ice104/index';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
 import { useRouter } from 'vue-router';
+import { useI18n } from 'vue-i18n'
+const { t, locale } = useI18n()
 
 const router = useRouter();
 const editFormRef = ref();
 const queryRef = ref();
-
+const currentLang = computed(() => locale.value);	
 
 const { params, tableData, getList, loading } = useSearch(api.device.getList, 'data', { title: '' });
 
@@ -91,13 +111,19 @@ const resetQuery = () => {
  * 单一删除
  */
 const onDel = (row: any) => {
-	ElMessageBox.confirm(`此操作将设备名为:“${row.title}”,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(async () => {
+	// 此操作将设备名为:“${row.title}”,是否继续?
+	ElMessageBox.confirm(
+		t('message.ice104.messages.deleteConfirm', { title: row.title }),
+		t('message.ice104.messages.tip'),
+		{
+			cancelButtonText: t('message.ice104.messages.cancel'),
+			confirmButtonText: t('message.ice104.messages.confirm'),
+			type: 'warning',
+		}
+	).then(async () => {
 		await api.device.deleteItem({ number: row.number });
-		ElMessage.success('删除成功');
+			// 删除成功
+		ElMessage.success(t('message.ice104.messages.deleteSuccess'));
 		getList();
 	});
 };