Sfoglia il codice sorgente

fix: 全局修复productId 为productKey。

yanglzh 1 anno fa
parent
commit
64bd1854e6

+ 5 - 5
src/api/alarm/index.ts

@@ -2,11 +2,11 @@ import { get, post, del, put } from '/@/utils/request';
 
 export default {
   common: {
-    levelall: (id: number) => get('/alarm/level/all', { id }),
-    trigger_type: (productKey: number) => get('/alarm/rule/trigger_type', { productKey }),
-    trigger_param: (productKey: number) => get('/alarm/rule/trigger_param', { productKey }),
+    levelall: (id?: number) => get('/alarm/level/all', { id }),
+    trigger_type: (productKey: string) => get('/alarm/rule/trigger_type', { productKey }),
+    trigger_param: (productKey: string) => get('/alarm/rule/trigger_param', { productKey }),
     trigger_params: (params: object) => get('/alarm/rule/trigger_param', params),
-    operator: (productKey: number) => get('/alarm/rule/operator', { productKey }),
+    operator: (productKey?: string) => get('/alarm/rule/operator', { productKey }),
     getList: (params: object) => get('/alarm/rule/list', params),
     add: (data: object) => post('/alarm/rule/add', data),
     delete: (id: number) => del('/alarm/rule/del', { id }),
@@ -15,7 +15,7 @@ export default {
     deploy: (data: object) => post('/alarm/rule/deploy', data),
     undeploy: (data: object) => post('/alarm/rule/undeploy', data),
     level_edit: (data: object) => put('/alarm/level/edit', data),
-    level_all: (productKey: number) => get('/alarm/level/all', { productKey }),
+    level_all: (productKey: string) => get('/alarm/level/all', { productKey }),
     },
     log: {
       getList: (params: object) => get('/alarm/log/list', params),

+ 1 - 1
src/api/ota/index.ts

@@ -12,7 +12,7 @@ export default {
   module: {
     getSubList: () => get('/product/list'),
     getList: (data: any) => get('/operate/ota_module/list', data),
-    del: (ids: number) => del('/operate/ota_module/delete', {ids}),
+    del: (ids: number[]) => del('/operate/ota_module/delete', {ids}),
     add: (data: any) => post('/operate/ota_module/add', data),
     edit: (data: any) => put('/operate/ota_module/edit', data),
     detail: (id: number) => get('/operate/ota_module/get', {id}),

+ 23 - 26
src/views/iot/alarm/setting/component/edit.vue

@@ -41,11 +41,11 @@
 					<el-select v-model="ruleForm.eventKey" filterable placeholder="请选择事件" @change="eventTypeChange">
 						<el-option v-for="item in eventList" :key="item.key" :label="item.name" :value="item.key"></el-option>
 					</el-select>
-				
+
 				</el-form-item>
 
 
-				<div v-if="ruleForm.triggerType>2" >
+				<div v-if="ruleForm.triggerType > 2">
 					<el-divider content-position="left">触发条件</el-divider>
 					<div class="box-content">
 						<div v-for="(item, index) in requestParams" :key="index">
@@ -197,10 +197,11 @@ interface RuleFormState {
 	eventKey: string;
 	productKey: string;
 	deviceKey: string;
-	triggerCondition: any;
+	triggerCondition: any[];
 	action: any;
 }
 interface DicState {
+	id: number;
 	isShowDialog: boolean;
 	ruleForm: RuleFormState;
 	rules: any;
@@ -211,7 +212,6 @@ interface DicState {
 	operData: any;
 	levelData: any;
 	requestParams: any;
-	triggerCondition: any;
 	action: any;
 	tempData: any;
 	sendGatewayData: any;
@@ -314,9 +314,9 @@ export default defineComponent({
 
 
 				alarm.common.detail(row.id).then((res: any) => {
-					
+
 					state.requestParams = res.data.condition.triggerCondition;
-					let product_key=res.data.productKey;
+					let product_key = res.data.productKey;
 					res.data.performAction.action.forEach(function (value: { sendGateway: any; noticeConfig: number; }, index: string | number) {
 						notice.config.getList({ sendGateway: value.sendGateway }).then((res: any) => {
 							state.sendGatewayData[index] = res.Data;
@@ -334,21 +334,21 @@ export default defineComponent({
 							return { phone: p };
 						});
 					});
-					iotapi.product.event({key:res.data.productKey}).then((ress: any) => {
+					iotapi.product.event({ key: res.data.productKey }).then((ress: any) => {
 						state.eventList = ress || []
-						state.ruleForm.eventKey=row.eventKey
+						state.ruleForm.eventKey = row.eventKey
 					})
 					state.ruleForm = res.data;
 
-					if(product_key){
+					if (product_key) {
 						alarm.common.trigger_type(product_key).then((res: any) => {
 							state.typeData = res.list || [];
 						});
-						
+
 					}
 				});
 
-			
+
 			}
 			state.isShowDialog = true;
 		};
@@ -358,10 +358,10 @@ export default defineComponent({
 			iotapi.product.getLists({ status: 1 }).then((res: any) => {
 				state.productData = res.product || [];
 			});
-			alarm.common.levelall('').then((res: any) => {
+			alarm.common.levelall().then((res: any) => {
 				state.levelData = res.list || [];
 			});
-			alarm.common.operator('').then((res: any) => {
+			alarm.common.operator().then((res: any) => {
 				state.operData = res.list || [];
 			});
 		};
@@ -399,6 +399,7 @@ export default defineComponent({
 				triggerType: 1,
 				level: '',
 				productKey: '',
+				eventKey: '',
 				deviceKey: '',
 				action: [
 					{
@@ -537,22 +538,16 @@ export default defineComponent({
 			});
 		};
 
-		const setType = (notResetDeviceKey: boolean) => {
+		const setType = (notResetDeviceKey?: boolean) => {
 			!notResetDeviceKey && (state.ruleForm.deviceKey = '')
-			let product_id = 0;
-			state.productData.forEach((item: { key: string; id: number; }) => {
-				if (item.key == state.ruleForm.productKey) {
-					product_id = item.id;
-				}
-			});
 
-			api.common.getdevList({ productId: product_id }).then((res: any) => {
+			api.common.getdevList({ productKey: state.ruleForm.deviceKey }).then((res: any) => {
 				state.sourceData = res.device;
 			});
 			alarm.common.trigger_type(state.ruleForm.productKey).then((res: any) => {
-						state.typeData = res.list || [];
-					});
-		
+				state.typeData = res.list || [];
+			});
+
 			gettriData();
 
 		};
@@ -583,7 +578,8 @@ export default defineComponent({
 			const triggerType = state.ruleForm.triggerType
 			const form = {
 				productKey: state.ruleForm.productKey,
-				triggerType
+				triggerType,
+				eventKey: ''
 			}
 
 			// 如果是事件上报,需要传eventKey参数
@@ -682,5 +678,6 @@ export default defineComponent({
 
 .jv-node {
 	margin-left: 25px;
-}</style>
+}
+</style>
  

+ 11 - 11
src/views/iot/device/instance/component/edit.vue

@@ -9,7 +9,7 @@
           <el-input v-model="ruleForm.name" placeholder="请输入设备名称" />
         </el-form-item>
         <el-form-item label="所属产品" prop="productKey">
-          <el-select v-model="ruleForm.productKey" @change="productIdChange" :disabled="ruleForm.id" placeholder="请选择所属产品" class="w100">
+          <el-select v-model="ruleForm.productKey" @change="productKeyChange" :disabled="ruleForm.id" placeholder="请选择所属产品" class="w100">
             <el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.key" />
           </el-select>
         </el-form-item>
@@ -66,11 +66,11 @@
           <el-input v-model="intro" type="textarea" placeholder="请输入设备说明"></el-input>
         </el-form-item>
         <el-form-item label="设备图片">
-					<upload-vue :imgs="phone" @set-imgs="setImgsPhone" :limit="deviceImgLimit"></upload-vue>
-				</el-form-item>
+          <upload-vue :imgs="phone" @set-imgs="setImgsPhone" :limit="deviceImgLimit"></upload-vue>
+        </el-form-item>
         <el-form-item label="证书图片">
-					<upload-vue :imgs="certificate" @set-imgs="setImgsCertificate" :limit="deviceImgLimit"></upload-vue>
-				</el-form-item>
+          <upload-vue :imgs="certificate" @set-imgs="setImgsCertificate" :limit="deviceImgLimit"></upload-vue>
+        </el-form-item>
       </el-form>
       <template #footer>
         <span class="dialog-footer">
@@ -216,7 +216,7 @@ export default defineComponent({
         state.phone = row.extensionInfo ? JSON.parse(row.extensionInfo).phone : [];
         state.certificate = row.extensionInfo ? JSON.parse(row.extensionInfo).certificate : [];
         state.intro = row.extensionInfo ? JSON.parse(row.extensionInfo).intro : "";
-        productIdChange(row.productKey as string)
+        productKeyChange(row.productKey as string)
       }
       state.isShowDialog = true;
     };
@@ -226,11 +226,11 @@ export default defineComponent({
       }
     };
     // 上传设备图
-    const setImgsPhone = (res:any) => {
+    const setImgsPhone = (res: any) => {
       state.phone = res;
     }
     // 上传设备资格证书
-    const setImgsCertificate = (res:any) => {
+    const setImgsCertificate = (res: any) => {
       state.certificate = res;
     }
     // 关闭弹窗
@@ -293,7 +293,7 @@ export default defineComponent({
     }
 
     // 所属产品变化的时候,更新产品详情
-    const productIdChange = (productKey: string) => {
+    const productKeyChange = (productKey: string) => {
       api.product.detail(productKey).then((res: any) => {
         const { authType, authUser, authPasswd, accessToken, certificateId } = res.data
         state.product = res.data
@@ -306,7 +306,7 @@ export default defineComponent({
     }
 
     //回调地图选点
-    const updateMap=(data:any)=>{
+    const updateMap = (data: any) => {
       state.ruleForm.lng = data.lng;
       state.ruleForm.lat = data.lat;
       state.ruleForm.address = data.address;
@@ -314,7 +314,7 @@ export default defineComponent({
 
     return {
       certList,
-      productIdChange,
+      productKeyChange,
       tagRef,
       selectMap,
       mapRef,

+ 1 - 1
src/views/iot/device/instance/component/excel.vue

@@ -3,7 +3,7 @@
     <el-dialog :title="(open_type === 'upload' ? '导入' : '导出') + '设备'" v-model="isShowDialog" width="769px">
       <el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
 
-        <el-form-item label="所属产品" prop="productId">
+        <el-form-item label="所属产品" prop="productKey">
           <el-select v-model="ruleForm.productKey" placeholder="请选择所属产品" class="w100">
             <el-option v-for="item in productData" :key="item.key" :label="item.name" :value="item.key" />
           </el-select>

+ 0 - 876
src/views/iot/device/template/detail.vue

@@ -1,876 +0,0 @@
-<template>
-	<div class="system-dic-container">
-		<div class="content">
-			<div class="cont_box">
-				<div class="title">设备:{{ detail.name }}</div>
-				<div class="pro-status"><span :class="developer_status == 2 ? 'on' : 'off'"></span>{{ developer_status == 2 ? '在线' : '离线' }}</div>
-
-				<!-- <div class="pro-option" @click="CkOption">{{ developer_status == 2 ? '下线' : '上线' }}</div> -->
-			</div>
-		</div>
-
-		<div class="content-box">
-			<el-tabs v-model="activeName" @tab-click="handleClick">
-				<el-tab-pane label="运行状态" name="3">
-					<div style="display: flex; padding: 10px; flex-wrap: wrap">
-						<div class="ant-card">
-							<div class="ant-card-body">
-								<div class="cardflex">
-									<div>设备状态</div>
-									<div @click="getrunData()" style="cursor: pointer">
-										<el-icon style="font-size: 18px">
-											<ele-Refresh />
-										</el-icon>
-									</div>
-								</div>
-
-								<div class="statusname" v-if="areaData.status == 0">未启用</div>
-								<div class="statusname" v-if="areaData.status == 1">离线</div>
-								<div class="statusname" v-if="areaData.status == 2">在线</div>
-								<div class="cardflex comtest">
-									<div>数据时间</div>
-									<div>{{ areaData.lastOnlineTime || '未启用' }}</div>
-								</div>
-							</div>
-						</div>
-
-						<div class="ant-card" v-for="(item, index) in areaData.properties" :key="index">
-							<div class="ant-card-body">
-								<div class="cardflex">
-									<div>{{ item.name }}</div>
-									<div style="cursor: pointer">
-										<el-icon style="font-size: 18px" @click="getrunData()">
-											<ele-Refresh />
-										</el-icon>
-										<el-icon style="font-size: 18px; margin-left: 10px" @click="onOpenListDetail(item)">
-											<ele-Expand />
-										</el-icon>
-									</div>
-								</div>
-
-								<div class="statusname">{{ item.value }}{{ item.unit }}</div>
-								<div>
-									<devantd :json="item.list" :antdid="item.key" v-if="item.type == 'int' || item.type == 'float'" />
-								</div>
-							</div>
-						</div>
-					</div>
-				</el-tab-pane>
-				<el-tab-pane label="设备信息" name="1">
-					<div class="pro-box">
-						<div class="protitle">设备信息</div>
-						<div>
-							<el-button type="primary" v-auth="'edit'" @click="onOpenEditDic(detail)">编辑</el-button>
-						</div>
-					</div>
-					<div class="ant-descriptions-view">
-						<table>
-							<tbody>
-								<tr class="ant-descriptions-row">
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">设备标识</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ detail.key }}</td>
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">设备名称</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ detail.name }}</td>
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">所属产品</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ detail.productName }}</td>
-								</tr>
-								<tr class="ant-descriptions-row">
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">消息协议</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ prodetail.messageProtocol }}</td>
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">链接协议</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ prodetail.transportProtocol }}</td>
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">设备类型</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ prodetail.deviceType }}</td>
-								</tr>
-								<tr class="ant-descriptions-row">
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">固件版本</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ prodetail.version }}</td>
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">注册时间</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ detail.updatedAt }}</td>
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">最后上线时间</th>
-									<td class="ant-descriptions-item-content" colspan="1">{{ detail.lastOnlineTime || '' }}</td>
-								</tr>
-								<tr class="ant-descriptions-row">
-									<th class="ant-descriptions-item-label ant-descriptions-item-colon">说明</th>
-									<td class="ant-descriptions-item-content" colspan="5">{{ detail.desc }}</td>
-								</tr>
-							</tbody>
-						</table>
-					</div>
-				</el-tab-pane>
-				<el-tab-pane label="物模型" name="2">
-					<div class="wu-box">
-						<el-tabs type="border-card" v-model="activetab" @tab-click="wuhandleClick">
-							<el-tab-pane label="属性定义" name="attr">
-								<div class="wu-title">
-									<div class="title">属性定义</div>
-									<div>
-										<el-button type="primary" @click="onOpenEditAttr()">添加</el-button>
-									</div>
-								</div>
-
-								<el-table style="width: 100%" :data="tableData.data" v-if="activetab == 'attr'">
-									<el-table-column label="属性标识" align="center" prop="key" />
-									<el-table-column label="属性名称" prop="name" show-overflow-tooltip />
-									<el-table-column prop="valueType" label="数据类型" width="100" align="center">
-										<template #default="scope">
-											<span>{{ scope.row.valueType.type }}</span>
-										</template>
-									</el-table-column>
-									<el-table-column prop="decimals" label="精度" width="60" align="center">
-										<template #default="scope">
-											<span>{{ scope.row.valueType.decimals }}</span>
-										</template>
-									</el-table-column>
-									<el-table-column prop="unit" label="单位" width="60" align="center">
-										<template #default="scope">
-											<span>{{ scope.row.valueType.unit }}</span>
-										</template>
-									</el-table-column>
-									<el-table-column prop="accessMode" label="是否只读" width="120" align="center">
-										<template #default="scope">
-											<el-tag type="info" size="small" v-if="scope.row.accessMode">只读</el-tag>
-											<el-tag type="success" size="small" v-else>读写</el-tag>
-										</template>
-									</el-table-column>
-									<el-table-column label="说明" prop="desc" show-overflow-tooltip />
-									<el-table-column label="操作" width="300" align="center" fixed="right">
-										<template #default="scope">
-											<el-button size="small" text type="warning" @click="onEditAttr(scope.row)">修改</el-button>
-											<el-button size="small" text type="danger" @click="onRowDel(scope.row.key, 'attr')">删除</el-button>
-										</template>
-									</el-table-column>
-								</el-table>
-							</el-tab-pane>
-							<el-tab-pane label="功能定义" name="fun">
-								<div class="wu-title">
-									<div class="title">功能定义</div>
-									<div>
-										<el-button type="primary" @click="onOpenEditFun()">添加</el-button>
-									</div>
-								</div>
-
-								<el-table style="width: 100%" :data="tableData.data" v-if="activetab == 'fun'">
-									<el-table-column label="功能标识" align="center" prop="key" />
-									<el-table-column label="名称" prop="name" show-overflow-tooltip />
-
-									<el-table-column label="描述" prop="desc" show-overflow-tooltip />
-									<el-table-column label="操作" width="300" align="center" fixed="right">
-										<template #default="scope">
-											<el-button size="small" text type="warning" @click="onEditFun(scope.row)">修改</el-button>
-											<el-button size="small" text type="danger" @click="onRowDel(scope.row.key, 'fun')">删除</el-button>
-										</template>
-									</el-table-column>
-								</el-table>
-							</el-tab-pane>
-							<el-tab-pane label="事件定义" name="event">
-								<div class="wu-title">
-									<div class="title">事件定义</div>
-									<div>
-										<el-button type="primary" @click="onOpenEditEvent()">添加</el-button>
-									</div>
-								</div>
-
-								<el-table style="width: 100%" :data="tableData.data" v-if="activetab == 'event'">
-									<el-table-column label="事件标识" align="center" prop="key" />
-									<el-table-column label="名称" prop="name" show-overflow-tooltip />
-									<el-table-column prop="level" label="事件级别" width="120" align="center">
-										<template #default="scope">
-											<el-tag type="primary" size="small" v-if="scope.row.level == 0">普通</el-tag>
-											<el-tag type="warning" size="small" v-if="scope.row.level == 1">警告</el-tag>
-											<el-tag type="danger" size="small" v-if="scope.row.level == 2">紧急</el-tag>
-										</template>
-									</el-table-column>
-									<el-table-column label="描述" prop="desc" show-overflow-tooltip />
-
-									<el-table-column label="操作" width="300" align="center" fixed="right">
-										<template #default="scope">
-											<el-button size="small" text type="warning" @click="onEditEvent(scope.row)">修改</el-button>
-											<el-button size="small" text type="danger" @click="onRowDel(scope.row.key, 'event')">删除</el-button>
-										</template>
-									</el-table-column>
-								</el-table>
-							</el-tab-pane>
-							<el-tab-pane label="标签定义" name="tab">
-								<div class="wu-title">
-									<div class="title">标签定义</div>
-									<div>
-										<el-button type="primary" @click="onOpenEditTab()">添加</el-button>
-									</div>
-								</div>
-
-								<el-table style="width: 100%" :data="tableData.data" v-if="activetab == 'tab'">
-									<el-table-column label="属性标识" align="center" prop="key" />
-									<el-table-column label="属性名称" prop="name" show-overflow-tooltip />
-									<el-table-column prop="valueType" label="数据类型" width="120" align="center">
-										<template #default="scope">
-											<span>{{ scope.row.valueType.type }}</span>
-										</template>
-									</el-table-column>
-									<el-table-column prop="accessMode" label="是否只读" width="120" align="center">
-										<template #default="scope">
-											<el-tag type="info" size="small" v-if="scope.row.accessMode">只读</el-tag>
-											<el-tag type="success" size="small" v-else>读写</el-tag>
-										</template>
-									</el-table-column>
-									<el-table-column label="描述" prop="desc" show-overflow-tooltip />
-									<el-table-column label="操作" width="300" align="center" fixed="right">
-										<template #default="scope">
-											<el-button size="small" text type="warning" @click="onEditTag(scope.row)">修改</el-button>
-											<el-button size="small" text type="danger" @click="onRowDel(scope.row.key, 'tab')">删除</el-button>
-										</template>
-									</el-table-column>
-								</el-table>
-							</el-tab-pane>
-						</el-tabs>
-						<pagination v-show="tableData.total > 0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="getList()" />
-					</div>
-				</el-tab-pane>
-
-				<el-tab-pane label="日志管理" name="4">
-					<div class="system-user-search mb15">
-						<el-form :model="logtableData.param" ref="queryRef" inline label-width="68px">
-							<el-form-item label="日志类型" prop="types">
-								<el-select v-model="logtableData.param.types" placeholder="日志类型" clearable>
-									<el-option v-for="item in logTypeData" :key="item" :label="item" :value="item" />
-								</el-select>
-							</el-form-item>
-
-							<el-form-item label="创建时间" prop="dateRange">
-								<el-date-picker v-model="logtableData.param.dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
-							</el-form-item>
-							<el-form-item>
-								<el-button type="primary" class="ml10" @click="getlog">
-									<el-icon>
-										<ele-Search />
-									</el-icon>
-									查询
-								</el-button>
-								<el-button @click="resetQuery(queryRef)">
-									<el-icon>
-										<ele-Refresh />
-									</el-icon>
-									重置
-								</el-button>
-							</el-form-item>
-						</el-form>
-					</div>
-					<el-table style="width: 100%" :data="logtableData.data">
-						<el-table-column label="类型" align="center" prop="type" />
-						<el-table-column label="时间" prop="ts" show-overflow-tooltip />
-
-						<el-table-column label="内容" prop="content" show-overflow-tooltip />
-						<el-table-column label="操作" width="300" align="center" fixed="right">
-							<template #default="scope">
-								<el-button size="small" text type="warning" @click="onLogDetail(scope.row)">查看</el-button>
-							</template>
-						</el-table-column>
-					</el-table>
-
-					<pagination v-show="logtableData.total > 0" :total="logtableData.total" v-model:page="logtableData.param.pageNum" v-model:limit="logtableData.param.pageSize" @pagination="getlog" />
-				</el-tab-pane>
-			</el-tabs>
-		</div>
-		<EditDic ref="editDicRef" @typeList="typeList" />
-		<EditAttr ref="editAttrRef" @typeList="getproperty" />
-		<EditFun ref="editFunRef" @typeList="getfunction" />
-		<EditEvent ref="editEventRef" @typeList="getevent" />
-		<EditTab ref="editTabRef" @typeList="gettab" />
-		<ListDic ref="listDicRef" />
-
-		<el-dialog v-model="dialogVisible" title="返回Json数据" width="30%">
-			<JsonViewer :value="jsonData" boxed sort theme="jv-dark" @click="onKeyclick" />
-
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button @click="dialogVisible = false">关闭</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-<script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
-import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
-
-import 'vue3-json-viewer/dist/index.css';
-
-import EditDic from '../product/component/editPro.vue';
-import EditAttr from '../product/component/editAttr.vue';
-import EditFun from '../product/component/editFun.vue';
-import EditEvent from '../product/component/editEvent.vue';
-import EditTab from '../product/component/editTab.vue';
-import devantd from '/@/components/devantd/index.vue';
-import ListDic from './component/list.vue';
-
-import { useRoute } from 'vue-router';
-
-import api from '/@/api/device';
-
-interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: [];
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			name: string;
-			deviceType: string;
-			status: string;
-			dateRange: string[];
-		};
-	};
-	logtableData: {
-		data: [];
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			name: string;
-			deviceType: string;
-			status: string;
-			dateRange: string[];
-		};
-	};
-}
-export default defineComponent({
-	name: 'deviceEditPro',
-	components: { EditDic, EditAttr, EditFun, EditEvent, EditTab, devantd, ListDic },
-
-	setup(prop, context) {
-		const route = useRoute();
-		const editDicRef = ref();
-		const editAttrRef = ref();
-		const editFunRef = ref();
-		const listDicRef = ref();
-		const editEventRef = ref();
-		const editTabRef = ref();
-		const state = reactive<TableDataState>({
-			areaData: [],
-			isShowDialog: false,
-			dialogVisible: false,
-			logTypeData: [],
-			jsonData: '',
-			activeName: '3', // 分类数据
-			activetab: 'attr', // 分类数据
-			detail: [],
-			prodetail: [],
-			product_id: 0,
-			developer_status: 0,
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					productId: 0,
-					pageSize: 10,
-					status: '',
-					dateRange: [],
-				},
-			},
-			logtableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					productId: 0,
-					pageSize: 10,
-					status: '',
-					dateRange: [],
-				},
-			},
-		});
-
-		onMounted(() => {
-			const ids = route.params && route.params.id;
-			api.instance.detail(ids).then((res: any) => {
-				state.detail = res.data;
-				state.developer_status = res.data.status;
-				state.tableData.param.productId = res.data.product.id;
-				state.product_id = res.data.product.id;
-				getrunData();
-				api.product.detail(res.data.product.id).then((res: any) => {
-					state.prodetail = res.data;
-				});
-
-				//第一次加载
-				api.model.property(state.tableData.param).then((res: any) => {
-					state.tableData.data = res.Data;
-					state.tableData.total = res.Total;
-				});
-			});
-		});
-
-		const onLogDetail = (row: TableDataRow) => {
-			state.jsonData = JSON.parse(row.content);
-			state.dialogVisible = true;
-		};
-
-		//编辑属性
-		const onEditAttr = (row: TableDataRow) => {
-			editAttrRef.value.openDialog(row, state.product_id);
-		};
-
-		//编辑功能
-		const onEditFun = (row: TableDataRow) => {
-			editFunRef.value.openDialog(row, state.product_id);
-		};
-
-		//编辑事件
-		const onEditEvent = (row: TableDataRow) => {
-			editEventRef.value.openDialog(row, state.product_id);
-		};
-
-		//编辑标签
-		const onEditTag = (row: TableDataRow) => {
-			editTabRef.value.openDialog(row, state.product_id);
-		};
-
-		//打开添加属性弹窗
-		const onOpenEditAttr = () => {
-			editAttrRef.value.openDialog({ product_id: state.product_id, id: 0, accessMode: 0 });
-		};
-
-		//打开添加功能弹窗
-		const onOpenEditFun = () => {
-			editFunRef.value.openDialog({ product_id: state.product_id, id: 0 });
-		};
-		//打开添加事件弹窗
-		const onOpenEditEvent = () => {
-			editEventRef.value.openDialog({ product_id: state.product_id, id: 0, level: 0 });
-		};
-
-		//打开添加事件弹窗
-		const onOpenEditTab = () => {
-			editTabRef.value.openDialog({ product_id: state.product_id, id: 0, accessMode: 0 });
-		};
-
-		//查看日志列表
-		const onOpenListDetail = (row: TableDataRow) => {
-			listDicRef.value.openDialog(row, state.detail.id);
-		};
-
-		// 打开修改产品弹窗
-		const onOpenEditDic = (row: TableDataRow) => {
-			editDicRef.value.openDialog(row);
-		};
-
-		// 删除产品
-		const onRowDel = (key, type) => {
-			let msg = `此操作将永久删除该数据,是否继续?`;
-
-			if (key.length === 0) {
-				ElMessage.error('请选择要删除的数据。');
-				return;
-			}
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					if (type == 'attr') {
-						api.model.propertydel(state.product_id, key).then(() => {
-							ElMessage.success('删除成功');
-							getproperty();
-						});
-					}
-					if (type == 'fun') {
-						api.model.functiondel(state.product_id, key).then(() => {
-							ElMessage.success('删除成功');
-							getfunction();
-						});
-					}
-					if (type == 'event') {
-						api.model.eventdel(state.product_id, key).then(() => {
-							ElMessage.success('删除成功');
-							getevent();
-						});
-					}
-					if (type == 'tab') {
-						api.model.tagdel(state.product_id, key).then(() => {
-							ElMessage.success('删除成功');
-							tagdel();
-						});
-					}
-				})
-				.catch(() => { });
-		};
-
-		//根据不同类型获取列表
-		const getList = () => {
-			switch (state.activetab) {
-				case 'attr':
-					getproperty();
-					break;
-				case 'fun':
-					getfunction();
-					break;
-				case 'event':
-					getevent();
-					break;
-				case 'tab':
-					gettab();
-					break;
-			}
-		};
-
-		const getproperty = () => {
-			api.model.property(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.Data;
-				state.tableData.total = res.Total;
-			});
-		};
-
-		const getfunction = () => {
-			api.model.function(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.Data;
-				state.tableData.total = res.Total;
-			});
-		};
-		const getevent = () => {
-			api.model.event(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.Data;
-				state.tableData.total = res.Total;
-			});
-		};
-
-		const gettab = () => {
-			api.model.tag(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.Data;
-				state.tableData.total = res.Total;
-			});
-		};
-
-		const wuhandleClick = (tab: TabsPaneContext) => {
-			state.activetab = tab.props.name;
-			switch (tab.props.name) {
-				case 'attr':
-					getproperty();
-					break;
-				case 'fun':
-					getfunction();
-					break;
-				case 'event':
-					getevent();
-					break;
-				case 'tab':
-					gettab();
-					break;
-			}
-		};
-
-		const handleClick = (tab: TabsPaneContext, event: Event) => {
-			if (tab.props.name == 4) {
-				//获取日志
-				getlog();
-				getlogtype();
-			} else if (tab.props.name == 2) {
-				getList();
-			} else if (tab.props.name == 3) {
-				getrunData();
-			}
-		};
-
-		const getrunData = () => {
-			api.instance.getrun_status({ deviceKey: state.detail.key }).then((res: any) => {
-				state.areaData = res;
-				let properties = state.areaData.properties || [];
-
-				var temp = new Array();
-
-				properties.forEach(function (item, index) {
-					let datalist = item.list || [];
-					temp[index] = [];
-					var temps = new Array();
-					datalist.forEach(function (a, b) {
-						if (b < 15) {
-							temps.push(a);
-						}
-					});
-					temp[index]['name'] = item.name;
-					temp[index]['key'] = item.key;
-					temp[index]['type'] = item.type;
-					temp[index]['unit'] = item.unit;
-					temp[index]['value'] = item.value;
-					temp[index]['list'] = temps;
-				});
-
-				state.areaData.properties = temp;
-			});
-		};
-
-		const getlogtype = () => {
-			api.instance.getlogcate({}).then((res: any) => {
-				state.logTypeData = res.list;
-			});
-		};
-
-		const getlog = () => {
-			state.logtableData.param.deviceKey = state.detail.key;
-			api.instance.getLogList(state.logtableData.param).then((res: any) => {
-				state.logtableData.data = res.list;
-				state.logtableData.total = res.Total;
-			});
-		};
-
-		const CkOption = () => {
-			if (state.developer_status == 2) {
-				api.instance.devoffline({ deviceKey: state.detail.key }).then((res: any) => {
-					ElMessage.success('操作成功');
-					state.developer_status = 1;
-				});
-			} else {
-				api.instance.devonline({ deviceKey: state.detail.key }).then((res: any) => {
-					ElMessage.success('操作成功');
-					state.developer_status = 2;
-				});
-			}
-		};
-		const tinyAreas = () => {
-			var data = state.data;
-
-			const tinyArea = new TinyArea('container', {
-				height: 60,
-				autoFit: false,
-				data,
-				smooth: true,
-				areaStyle: {
-					fill: '#d6e3fd',
-				},
-			});
-			tinyArea.render();
-		};
-		return {
-			tinyAreas,
-			editDicRef,
-			editAttrRef,
-			listDicRef,
-			editFunRef,
-			editEventRef,
-			editTabRef,
-			onOpenListDetail,
-			getrunData,
-			getlog,
-			getlogtype,
-			onLogDetail,
-			CkOption,
-			onRowDel,
-			onEditFun,
-			onEditEvent,
-			onEditTag,
-			onEditAttr,
-			getList,
-			getproperty,
-			getfunction,
-			getevent,
-			gettab,
-			wuhandleClick,
-			onOpenEditTab,
-			onOpenEditEvent,
-			onOpenEditAttr,
-			onOpenEditFun,
-			onOpenEditDic,
-			handleClick,
-			...toRefs(state),
-		};
-	},
-});
-</script>
-<style scoped>
-.content {
-	background: #fff;
-	width: 100%;
-	padding: 20px;
-}
-
-.content-box {
-	background: #fff;
-	width: 100%;
-	padding: 20px;
-	margin-top: 20px;
-}
-
-.cont_box {
-	display: flex;
-}
-
-.cont_box .title {
-	font-size: 24px;
-}
-
-.cont_box .pro-status {
-	line-height: 40px;
-	margin-left: 30px;
-}
-
-.cont_box .pro-status .on {
-	background: #52c41a;
-}
-
-.cont_box .pro-status .off {
-	background: #c41a1a;
-}
-
-.cont_box .pro-status span {
-	position: relative;
-	top: -1px;
-	display: inline-block;
-	width: 6px;
-	height: 6px;
-	vertical-align: middle;
-	border-radius: 50%;
-	margin-right: 5px;
-}
-
-.cont_box .pro-option {
-	line-height: 40px;
-	margin-left: 10px;
-	color: #1890ff;
-	cursor: pointer;
-}
-
-.content-box .pro-box {
-	display: flex;
-	padding: 10px;
-	justify-content: space-between;
-}
-
-.content-box .pro-box .protitle {
-	font-size: 18px;
-	font-weight: bold;
-	line-height: 35px;
-}
-
-.content-box .pro-box .buttonedit {
-	border: 0px;
-	color: #1890ff;
-}
-
-table {
-	border-collapse: collapse;
-	text-indent: initial;
-	border-spacing: 2px;
-}
-
-tbody {
-	box-sizing: border-box;
-	display: table-row-group;
-	vertical-align: middle;
-	border-color: inherit;
-}
-
-tr {
-	display: table-row;
-	vertical-align: inherit;
-	border-color: inherit;
-}
-
-.ant-descriptions-view {
-	width: 100%;
-	overflow: hidden;
-	border-radius: 4px;
-}
-
-.ant-descriptions-view {
-	border: 1px solid #e8e8e8;
-}
-
-.ant-descriptions-view table {
-	width: 100%;
-	table-layout: fixed;
-}
-
-.ant-descriptions-view>table {
-	table-layout: auto;
-}
-
-.ant-descriptions-row {
-	border-bottom: 1px solid #e8e8e8;
-}
-
-.ant-descriptions-item-label {
-	color: rgba(0, 0, 0, 0.85);
-	font-weight: 400;
-	font-size: 14px;
-	line-height: 1.5;
-}
-
-.ant-descriptions-item-label {
-	padding: 16px 24px;
-	border-right: 1px solid #e8e8e8;
-}
-
-.ant-descriptions-item-label {
-	background-color: #fafafa;
-}
-
-.ant-descriptions-item-content {
-	padding: 16px 24px;
-	border-right: 1px solid #e8e8e8;
-	display: table-cell;
-	color: rgba(0, 0, 0, 0.65);
-	font-size: 14px;
-	line-height: 1.5;
-}
-
-.wu-box {
-	border: #e8e8e8 solid 1px;
-	padding: 20px;
-	width: 100%;
-}
-
-.wu-box .wu-title {
-	display: flex;
-	flex-direction: row;
-	justify-content: space-between;
-	padding: 20px;
-	border-bottom: #e8e8e8 1px solid;
-}
-
-.wu-box .wu-title .title {
-	font-size: 18px;
-}
-
-.ant-card {
-	box-sizing: border-box;
-	margin: 10px;
-	width: 23.2%;
-	font-size: 14px;
-	font-variant: tabular-nums;
-	border: 1px solid var(--next-border-color-light);
-
-	line-height: 1.5;
-	list-style: none;
-	font-feature-settings: 'tnum';
-	position: relative;
-	border-radius: 2px;
-	transition: all 0.3s;
-}
-
-.ant-card-body {
-	padding: 24px;
-	zoom: 1;
-}
-
-.cardflex {
-	display: flex;
-	justify-content: space-between;
-}
-
-.statusname {
-	font-size: 30px;
-	margin-top: 10px;
-	margin-bottom: 15px;
-}
-
-.comtest {
-	margin-top: 20px;
-	height: 30px;
-	line-height: 30px;
-}</style>

+ 8 - 10
src/views/iot/ice104/device/component/edit.vue

@@ -36,20 +36,19 @@
 	</el-dialog>
 </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 { ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
 import apiDevice from '/@/api/device';
 
-const { params, tableData, getList, loading } = useSearch(api.template.getAll, 'data', { title: '', status: 1 });
+const { tableData, getList } = useSearch(api.template.getAll, 'data', { title: '', status: 1 });
 getList();
 
 const dialogVisible = ref(false);
 const btnLoading = ref(false);
-const productList = ref([]);
-const deviceList = ref([]);
+const productList = ref<any[]>([]);
+const deviceList = ref<any[]>([]);
 const emit = defineEmits(['updateList']);
 const formRef = ref();
 const ruleForm = ref({
@@ -95,14 +94,13 @@ const submitData = async () => {
 	})
 }
 
-const handleProductChange = (data: any) => {
+const handleProductChange = (productKey: string) => {
 	ruleForm.value.deviceKey = "";
-	let findItem: any = productList.value.find((v: any) => v.key === data);
-	getDeviceList(findItem.id)
+	getDeviceList(productKey)
 }
 
-const getDeviceList = (id: number) => {
-	apiDevice.device.allList({ productId: id }).then((res: any) => {
+const getDeviceList = (productKey: string) => {
+	apiDevice.device.allList({ productKey }).then((res: any) => {
 		deviceList.value = res.device
 	})
 }

+ 8 - 13
src/views/iot/ice104/device/component/editDeviceForm.vue

@@ -18,7 +18,7 @@
 			</el-select>
 		</el-form-item>
 		<el-form-item label="产品key">
-			<el-select @change="(val) => handleProductChange(val, true)" v-model="ruleForm.productKey" placeholder="请选择产品key" class="width100">
+			<el-select @change="(val: string) => handleProductChange(val, true)" v-model="ruleForm.productKey" placeholder="请选择产品key" class="width100">
 				<el-option :label="item.name" :value="item.key" v-for="(item, index) in productList" :key="index" />
 			</el-select>
 		</el-form-item>
@@ -43,8 +43,8 @@ const { params, tableData, getList, loading } = useSearch(api.template.getAll, '
 getList();
 
 const btnLoading = ref(false);
-const productList = ref([]);
-const deviceList = ref([]);
+const productList = ref<any[]>([]);
+const deviceList = ref<any[]>([]);
 const emit = defineEmits(['updateList']);
 const formRef = ref();
 const ruleForm = ref({
@@ -80,22 +80,17 @@ const submitData = async () => {
 	})
 }
 
-const handleProductChange = (data: any, isClear: boolean) => {
-	if (isClear) {
-		ruleForm.value.deviceKey = "";
-	}
-	let findItem: any = productList.value.find((v: any) => v.key === data);
-	if (!findItem) return;
-	getDeviceList(findItem.id)
+const handleProductChange = (productKey: string, isClear: boolean) => {
+	if (isClear) ruleForm.value.deviceKey = ""
+	getDeviceList(productKey)
 }
 
-const getDeviceList = (id: number) => {
-	apiDevice.device.allList({ productId: id }).then((res: any) => {
+const getDeviceList = (productKey: string) => {
+	apiDevice.device.allList({ productKey }).then((res: any) => {
 		deviceList.value = res.device
 	})
 }
 
-
 const open = async (row: any) => {
 	if (row && row.number.toString()) {
 		ruleForm.value = row;

+ 47 - 67
src/views/iot/ota-update/data/index.vue

@@ -1,58 +1,54 @@
 <template>
 	<el-card shadow="nover">
 		<el-tabs v-model="activeTab">
-				<el-tab-pane label="版本分布" name="tab1">
-					<div class="flex">
-						<el-form-item label="所属产品" prop="productId">
-							<el-select v-model="productId" filterable placeholder="请选择产品">
-								<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id.toString()" value-key="id">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="所属模块" prop="productId" class="ml10">
-							<el-select v-model="productId" filterable placeholder="请选择所属模块">
-								<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id.toString()" value-key="id">
-								</el-option>
-							</el-select>
-						</el-form-item>
-					</div>
-					<div >
-						<el-row>
+			<el-tab-pane label="版本分布" name="tab1">
+				<div class="flex">
+					<el-form-item label="所属产品" prop="productKey">
+						<el-select v-model="productKey" filterable placeholder="请选择产品">
+							<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.key" value-key="id">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="所属模块" prop="productKey" class="ml10">
+						<el-select v-model="productKey" filterable placeholder="请选择所属模块">
+							<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.key" value-key="id">
+							</el-option>
+						</el-select>
+					</el-form-item>
+				</div>
+				<div>
+					<el-row>
 						<el-col :span="12">
 							<div class="data-box">
 								<div class="title">版本分布</div>
 								<div style="height: 100%" ref="pieRef"></div>
-
 							</div>
 						</el-col>
 						<el-col :span="12">
 							<div class="data-box">
 								<div class="title">版本占比</div>
-
 							</div>
-
 						</el-col>
 					</el-row>
-
-					</div>
-				</el-tab-pane>
-				<el-tab-pane label="成功率分布" name="tab2">
-					<div class="flex">
-						<el-form-item label="所属产品" prop="productId">
-							<el-select v-model="productId" filterable placeholder="请选择产品">
-								<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id.toString()" value-key="id">
-								</el-option>
-							</el-select>
-						</el-form-item>
-						<el-form-item label="所属模块" prop="productId" class="ml10">
-							<el-select v-model="productId" filterable placeholder="请选择所属模块">
-								<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id.toString()" value-key="id">
-								</el-option>
-							</el-select>
-						</el-form-item>
-					</div>
-					<div >
-						<el-row>
+				</div>
+			</el-tab-pane>
+			<el-tab-pane label="成功率分布" name="tab2">
+				<div class="flex">
+					<el-form-item label="所属产品" prop="productKey">
+						<el-select v-model="productKey" filterable placeholder="请选择产品">
+							<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.key" value-key="id">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="所属模块" prop="productKey" class="ml10">
+						<el-select v-model="productKey" filterable placeholder="请选择所属模块">
+							<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.key" value-key="id">
+							</el-option>
+						</el-select>
+					</el-form-item>
+				</div>
+				<div>
+					<el-row>
 						<el-col :span="12">
 							<div class="data-box">
 								<div class="title">升级成功率目标版本1.0</div>
@@ -61,9 +57,7 @@
 						<el-col :span="12">
 							<div class="data-box">
 								<div class="title">源版本总分布(包含成功/失败)</div>
-
 							</div>
-
 						</el-col>
 					</el-row>
 					<el-row>
@@ -75,9 +69,7 @@
 						<el-col :span="12">
 							<div class="data-box">
 								<div class="title">失败源版本分布</div>
-
 							</div>
-
 						</el-col>
 					</el-row>
 					<el-row>
@@ -86,40 +78,28 @@
 								<div class="title">失败原因分布</div>
 							</div>
 						</el-col>
-						
 					</el-row>
-					</div>
-				</el-tab-pane>
-			
-			</el-tabs>
-
-	
-
+				</div>
+			</el-tab-pane>
+		</el-tabs>
 	</el-card>
 </template>
   
 <script lang="ts" setup>
-import * as echarts from 'echarts';
-
-import api from '/@/api/ota';
-import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
 import { ref } from 'vue';
-import { useRouter } from 'vue-router';
-
-const router = useRouter();
-const activeTab=ref('tab1');
-const homePieRef = ref();
-
-
 
+const activeTab = ref('tab1')
+const productKey = ref('')
+const productData = ref<any[]>([])
 </script>
 <style scoped lang="scss">
-.data-box{
-    padding: 10px;
-    border: 1px solid #eee;
+.data-box {
+	padding: 10px;
+	border: 1px solid #eee;
 	margin: 10px;
 	min-height: 300px;
-	.title{
+
+	.title {
 		margin-left: 10px;
 	}
 

+ 8 - 8
src/views/iot/ota-update/module/component/edit.vue

@@ -2,9 +2,9 @@
 	<div class="ota-edit-module-container">
 		<el-dialog :title="(ruleForm.id!==0?'修改':'添加')+'模块'" v-model="isShowDialog" width="769px">
 			<el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="90px">
-				<el-form-item label="所属产品" prop="productId">
-					<el-select v-model="ruleForm.productId" filterable placeholder="请选择产品">
-						<el-option v-for="item in productData" :key="item.name" :label="item.name" :value="item.id.toString()" />
+				<el-form-item label="所属产品" prop="productKey">
+					<el-select v-model="ruleForm.productKey" filterable placeholder="请选择产品">
+						<el-option v-for="item in productData" :key="item.key" :label="item.name" :value="item.key" />
 					</el-select>
 				</el-form-item>
 				<el-form-item label="模块名称" prop="name">
@@ -35,13 +35,13 @@ interface RuleFormState {
   id: number;
   name: string;
   nameAs: string;
-  productId: '';
+  productKey: '';
   describe: string;
 }
 interface ModuleState {
   isShowDialog: boolean;
   ruleForm: RuleFormState;
-  productData: [],
+  productData: any[],
   rules: {};
 }
 
@@ -55,12 +55,12 @@ export default defineComponent({
         id: 0,
         name: '',
         nameAs: '',
-        productId: '',
+        productKey: '',
 		    describe: '',
       },
 	    productData: [],
       rules: {
-        productId: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
+        productKey: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
         name: [{ required: true, message: '模块名称不能为空', trigger: 'blur' }],
         nameAs: [{ required: true, message: '模块别名不能为空', trigger: 'blur' }],
       },
@@ -89,7 +89,7 @@ export default defineComponent({
         id: 0,
         name: '',
         nameAs: '',
-        productId: '',
+        productKey: '',
         describe: '',
       };
     };

+ 7 - 6
src/views/iot/ota-update/module/index.vue

@@ -5,9 +5,9 @@
         <el-form-item label="模块名称" prop="name">
           <el-input v-model="tableData.param.name" placeholder="请输入模块名称" clearable style="width: 200px;" />
         </el-form-item>
-        <el-form-item label="所属产品" prop="productId">
-          <el-select v-model="tableData.param.productId" clearable filterable placeholder="请选择产品">
-            <el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id.toString()" value-key="id"> </el-option>
+        <el-form-item label="所属产品" prop="productKey">
+          <el-select v-model="tableData.param.productKey" clearable filterable placeholder="请选择产品">
+            <el-option v-for="item in productData" :key="item.key" :label="item.name" :value="item.key" value-key="id"> </el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -74,6 +74,7 @@ interface TableDataRow {
 }
 interface TableDataState {
   ids: number[];
+  productData: any[];
   tableData: {
     data: Array<TableDataRow>;
     total: number;
@@ -82,7 +83,7 @@ interface TableDataState {
       pageNum: number;
       pageSize: number;
       keyWord: string;
-      productId: string;
+      productKey: string;
       dateRange: string[];
     };
   };
@@ -108,7 +109,7 @@ export default defineComponent({
           pageNum: 1,
           pageSize: 10,
           keyWord: '',
-          productId: '',
+          productKey: '',
         },
       },
       productData: [],
@@ -121,7 +122,7 @@ export default defineComponent({
     const initTableData = () => {
       moduleList();
     };
-    const getList = (pageNum: number) => {
+    const getList = (pageNum?: number) => {
       typeof pageNum === 'number' && (state.tableData.param.pageNum = pageNum)
       state.tableData.loading = true;
       api.module

+ 8 - 8
src/views/iot/ota-update/update/component/check.vue

@@ -92,7 +92,7 @@ interface RuleFormState {
   push: string;
   pushDisabled: boolean,
   types: string;
-  productId: string;
+  productKey: string;
 }
 interface UpdateState {
   isShowDialog: boolean;
@@ -128,7 +128,7 @@ export default defineComponent({
         push: '2',
         pushDisabled: true,
         types: "1",
-        productId: '',
+        productKey: '',
       },
       productData: [],
       rules: {
@@ -175,7 +175,7 @@ export default defineComponent({
       }
     };
     const getProductList = () => {
-      api.batch.getDeviceList({ productId: state.ruleForm.productId}).then((res: any) => {
+      api.batch.getDeviceList({ productKey: state.ruleForm.productKey}).then((res: any) => {
         state.productData = res.device
       })
     }
@@ -186,7 +186,7 @@ export default defineComponent({
       state.deviceNameShow = false;
       if (row) {
         state.ruleForm.devOtaFirmwareId = row.id;
-        state.ruleForm.productId = row.productId;
+        state.ruleForm.productKey = row.productKey;
       }
       state.isShowDialog = true;
 
@@ -206,7 +206,7 @@ export default defineComponent({
         push: '2',
         pushDisabled: true,
         types: "1",
-        productId: '',
+        productKey: '',
       };
     };
     // 关闭弹窗
@@ -251,7 +251,7 @@ export default defineComponent({
     };
     // 打开设备列表
     const onOpenDevice = () => {
-      deviceRef.value.openDialog(state.ruleForm.devices, state.ruleForm.productId);
+      deviceRef.value.openDialog(state.ruleForm.devices, state.ruleForm.productKey);
     };
     return {
       deviceRef,
@@ -296,7 +296,7 @@ export default defineComponent({
 // 	stratege: '1',
 // 	waitVersion: '',
 // 	devOtaFirmwareId: '',
-// 	productId:'',
+// 	productKey:'',
 // }
 
 // const formData = reactive({
@@ -306,7 +306,7 @@ export default defineComponent({
 // const ruleForm = {
 // 	method: [ruleRequired('请选择批次类型')],
 // 	name: [ruleRequired('批次名称不能为空')],
-// 	productId: [ruleRequired('请选择所属产品')],
+// 	productKey: [ruleRequired('请选择所属产品')],
 // 	devices: [ruleRequired('请选择批次模块')],
 // 	stratege: [ruleRequired('批次版本号不能为空')],
 // 	waitVersion: [ruleRequired('升级后版本号不能为空')],

+ 13 - 14
src/views/iot/ota-update/update/component/deviceBind.vue

@@ -56,11 +56,11 @@ interface TableDataState {
       pageNum: number
       pageSize: number
       name: string
-      productId: number
+      productKey: string
     }
   },
   ruleForm: {
-    productId: string | number
+    productKey: string
   },
   rules: {}
 }
@@ -85,19 +85,19 @@ export default defineComponent({
           pageNum: 1,
           pageSize: 10,
           name: '',
-          productId: 0,
+          productKey: '',
         },
       },
       ruleForm: {
-        productId: ''
+        productKey: ''
       },
       rules: {
-        productId: [{ required: true, message: '所属产品不能为空', trigger: 'blur' }],
+        productKey: [{ required: true, message: '所属产品不能为空', trigger: 'blur' }],
       }
     })
 
     const getDeviceList = () => {
-      // if (!state.ruleForm.productId) {
+      // if (!state.ruleForm.productKey) {
       //   state.tableData.data = [];
       //   state.tableData.total = 0;
       //   return;
@@ -114,16 +114,15 @@ export default defineComponent({
 
     const getProductList = () => {
       api.product.getSubList().then((res: any) => {
-        let productDataList = res.product
-        state.productData = productDataList;
-        state.ruleForm.productId = state.productData[0].id
+        state.productData = res.product;
+        state.ruleForm.productKey = res.product[0].key
         getDeviceList()
       });
     };
 
-    const openDialog = (checkIdData: any, productId: any) => {
+    const openDialog = (checkIdData: any, productKey: any) => {
       state.checkIdList = checkIdData;
-      state.tableData.param.productId = productId;
+      state.tableData.param.productKey = productKey;
       getDeviceList()
     };
 
@@ -150,15 +149,15 @@ export default defineComponent({
       })
     };
 
-    const handleChange = (productId: number) => {
-      state.ruleForm.productId = productId;
+    const handleChange = (productKey: string) => {
+      state.ruleForm.productKey = productKey;
       getDeviceList()
     }
 
     const changeSelect = () => {
       nextTick(() => {
         state.tableData.data.forEach((item) => {
-          if (state.checkIdList.includes(item.id)) {
+          if (state.checkIdList.includes(item.key)) {
             proxy.$refs.multipleTable.toggleRowSelection(item, true);
           }
         })

+ 13 - 17
src/views/iot/ota-update/update/component/edit.vue

@@ -13,11 +13,7 @@
           <el-input v-model.trim="ruleForm.name" placeholder="请输入升级包名称" />
         </el-form-item>
 
-        <el-form-item label="所属产品" prop="productId">
-          <!--          <el-select v-model="ruleForm.productId" placeholder="请选择产品" @change="selectChange">-->
-          <!--            <el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id.toString()" />-->
-          <!--          </el-select>-->
-
+        <el-form-item label="所属产品" prop="productKey">
           <!-- 回显已选产品 -->
           <template v-if="productNameShow">
             <el-tag style="margin-right: 10px;">{{ productName }}</el-tag>
@@ -107,7 +103,7 @@ interface RuleFormState {
   id: number;
   types: string;
   name: string;
-  productId: '';
+  productKey: string;
   module: string;
   version: string;
   waitVersion: string;
@@ -161,7 +157,7 @@ export default defineComponent({
         id: 0,
         types: '1',
         name: '',
-        productId: '',
+        productKey: '',
         module: '',
         version: '',
         waitVersion: '',
@@ -179,7 +175,7 @@ export default defineComponent({
       rules: {
         types: [{ required: true, message: '升级包类型不能为空', trigger: 'change' }],
         name: [{ required: true, message: '升级包名称不能为空', trigger: 'change' }],
-        productId: [{ required: true, message: '所属产品不能为空', trigger: 'change' }],
+        productKey: [{ required: true, message: '所属产品不能为空', trigger: 'change' }],
         module: [{ required: true, message: '升级包模块不能为空', trigger: 'change' }],
         version: [
           { required: true, message: '升级包版本号不能为空', trigger: 'change' },
@@ -203,10 +199,10 @@ export default defineComponent({
           const data: RuleFormState = res;
           state.ruleForm = data;
         });
-        selectChange(row.productId);
+        selectChange(row.productKey);
         state.ruleForm = row;
         // 获取产品名称
-        apiProduct.product.detail(state.ruleForm.productId).then((res: any) => {
+        apiProduct.product.detail(state.ruleForm.productKey).then((res: any) => {
           if (res.data) {
             state.productNameShow = true;
             state.productName = res.data.name;
@@ -238,7 +234,7 @@ export default defineComponent({
         id: 0,
         types: '1',
         name: '',
-        productId: '',
+        productKey: '',
         module: '',
         version: '',
         waitVersion: '',
@@ -263,15 +259,15 @@ export default defineComponent({
         ElMessage.error(res.message);
       }
     };
-    const selectChange = (val: Number) => {
+    const selectChange = (val: string) => {
       getModuleList(val);
     };
-    const getModuleList = (productID: Number) => {
+    const getModuleList = (productKey: string) => {
       state.ruleForm.module = '';
-      if (!productID) {
-        productID = Number(state.ruleForm.productId)
+      if (!productKey) {
+        productKey = state.ruleForm.productKey
       }
-      api.module.getList({ productID: productID }).then((res: any) => {
+      api.module.getList({ productKey }).then((res: any) => {
         state.moduleData = res.Data;
       });
     };
@@ -322,7 +318,7 @@ export default defineComponent({
     }
     // 获取产品回显数据
     const getProductTableData = (deviceIdList: any, deviceNameList: any) => {
-      state.ruleForm.productId = deviceIdList[0];
+      state.ruleForm.productKey = deviceIdList[0];
       selectChange(deviceIdList[0]);
       state.productName = deviceNameList[0];
       state.productNameShow = true;

+ 2 - 5
src/views/iot/ota-update/update/component/productBind.vue

@@ -41,7 +41,6 @@ interface TableDataState {
   isShowDialog: boolean,
   productData: object[],
   deviceKeyList: string[];
-  deviceIdList: string[];
   deviceNameList: string[];
   checkIdList: string[];
   tableData: {
@@ -63,7 +62,6 @@ export default defineComponent({
     const productTable = ref();
     const state = reactive<TableDataState>({
       deviceKeyList: [],
-      deviceIdList: [],
       deviceNameList: [],
       isShowDialog: false,
       productData: [],
@@ -99,7 +97,6 @@ export default defineComponent({
     // 多选框选中数据
     const handleSelectionChange = (selection: any[]) => {
       state.deviceKeyList = selection.map((item) => item.key);
-      state.deviceIdList = selection.map((item) => item.id);
       state.deviceNameList = selection.map((item) => item.name);
 
       if (selection.length > 1) {
@@ -119,7 +116,7 @@ export default defineComponent({
         cancelButtonText: '取消',
         type: 'warning',
       }).then(() => {
-        emit('bindSuccess', state.deviceIdList, state.deviceNameList)
+        emit('bindSuccess', state.deviceKeyList, state.deviceNameList)
         state.isShowDialog = false;
       })
     };
@@ -132,7 +129,7 @@ export default defineComponent({
       nextTick(() => {
         state.tableData.data.forEach((item) => {
           if (state.checkIdList) {
-            if (state.checkIdList.includes(item.id)) {
+            if (state.checkIdList.includes(item.key)) {
               proxy.$refs.multipleTable.toggleRowSelection(item, true);
             }
           }

+ 0 - 1
src/views/iot/ota-update/update/detail.vue

@@ -50,7 +50,6 @@ export default defineComponent({
         are: '',
         moduleName: '',
         checkres: 0,
-        productId: 0,
       },
     });
     const getDetail = () => {