Преглед на файлове

fix: 修复产品 -标签管理的删除,修复子设备详情弹窗,修复导出设备的参数更改

yanglzh преди 1 година
родител
ревизия
1307703bc5

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

@@ -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 : "";
-        productKeyChange(row.productKey as string)
+        productIdChange(row.productKey as string)
       }
       state.isShowDialog = true;
     };

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

@@ -4,15 +4,13 @@
       <el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="110px">
 
         <el-form-item label="所属产品" prop="productId">
-          <el-select v-model="ruleForm.productId" placeholder="请选择所属产品" class="w100">
-            <el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id" />
+          <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>
         </el-form-item>
 
         <el-form-item label="导入文件" prop="path" v-if="open_type === 'upload'">
-          <el-upload accept="xls,xlsx,csv" :show-file-list="true" 
-  :data="{ productId:ruleForm.productId }"  :limit="1" :headers="headers" :action="uploadUrl"
-            :on-success="updateImg" :before-upload="beforeAvatarUpload">
+          <el-upload accept="xls,xlsx,csv" :show-file-list="true" :data="{ productKey: ruleForm.productKey }" :limit="1" :headers="headers" :action="uploadUrl" :on-success="updateImg" :before-upload="beforeAvatarUpload">
             <el-button>
               <el-icon> <ele-Upload /> </el-icon>
               上传文件
@@ -21,10 +19,10 @@
           <div>{{ ruleForm.path }}</div>
         </el-form-item>
         <el-form-item label="样表下载" v-if="open_type === 'upload'">
-          <el-button  @click="down" type="primary" text="primary">
-              <el-icon> <ele-Download /> </el-icon>
-              下载文件
-            </el-button>
+          <el-button @click="down" type="primary" text="primary">
+            <el-icon> <ele-Download /> </el-icon>
+            下载文件
+          </el-button>
         </el-form-item>
       </el-form>
       <template #footer>
@@ -41,18 +39,18 @@
 <script lang="ts">
 import { reactive, toRefs, defineComponent, ref, unref, nextTick } from 'vue';
 import api from '/@/api/device';
-import { ElMessage,UploadProps } from "element-plus";
+import { ElMessage, UploadProps } from "element-plus";
 import downloadFile from '/@/utils/download';
 import getOrigin from '/@/utils/origin';
 
 
 interface RuleFormState {
-  productId: number | string;
+  productKey: number | string;
   path: string;
 }
 
 const form: RuleFormState = {
-  productId: '',
+  productKey: '',
   path: '',
 }
 
@@ -76,7 +74,7 @@ export default defineComponent({
     const formRef = ref<HTMLElement | null>(null);
     const tagRef = ref<HTMLElement | null>(null);
     const state = reactive<DicState>({
-      sproductId:0,
+      sproductId: 0,
       isShowDialog: false,
       open_type: '',
       productData: [], // 分类数据
@@ -84,13 +82,13 @@ export default defineComponent({
         ...form
       },
       rules: {
-        productId: [{ required: true, message: '所属产品不能为空', trigger: 'blur' }],
+        productKey: [{ required: true, message: '所属产品不能为空', trigger: 'blur' }],
       }
     });
 
 
     const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
-      if (!state.ruleForm.productId) {
+      if (!state.ruleForm.productKey) {
         ElMessage.error('请先选择所属产品!');
         return false;
       }
@@ -104,8 +102,8 @@ export default defineComponent({
     const updateImg = (res: any) => {
       if (res.code === 0) {
         ElMessage.success('导入成功');
-       closeDialog(); // 关闭弹窗
-       emit('typeList')
+        closeDialog(); // 关闭弹窗
+        emit('typeList')
 
       } else {
         ElMessage.error(res.message);
@@ -153,13 +151,10 @@ export default defineComponent({
               ElMessage.success('导入成功');
               closeDialog(); // 关闭弹窗
             });
-
-
           } else {
-            const selectedProduct = state.productData.find((item) => item.id === state.ruleForm.productId);
+            const selectedProduct = state.productData.find((item) => item.key === state.ruleForm.productKey);
             if (selectedProduct) {
-
-              api.device.export({ productId: state.ruleForm.productId }).then((res: any) => downloadFile(res, selectedProduct.name + "-" + getCurrentTime() + ".xlsx"))
+              api.device.export({ productKey: state.ruleForm.productKey }).then((res: any) => downloadFile(res, selectedProduct.name + "-" + getCurrentTime() + ".xlsx"))
               closeDialog(); // 关闭弹窗
             }
 
@@ -168,7 +163,7 @@ export default defineComponent({
         }
       });
     };
-    const down=()=>{
+    const down = () => {
       const fileURL = '/deviceImportExample.xlsx';
       // 创建下载链接
       const link = document.createElement('a');

+ 62 - 53
src/views/iot/device/instance/component/subDevice.vue

@@ -225,13 +225,7 @@
 									</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()"
-							/>
+							<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="5">
@@ -247,15 +241,7 @@
 								</el-form-item>
 
 								<el-form-item label="创建时间" prop="dateRange">
-									<el-date-picker
-										v-model="logtableData.param.dateRange"
-										size="default"
-										value-format="YYYY-MM-DD"
-										type="daterange"
-										range-separator="-"
-										start-placeholder="开始日期"
-										end-placeholder="结束日期"
-									></el-date-picker>
+									<el-date-picker v-model="logtableData.param.dateRange" size="default" 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">
@@ -285,13 +271,7 @@
 							</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"
-						/>
+						<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>
@@ -316,8 +296,8 @@
 	</div>
 </template>
 <script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue'
-import { ElMessageBox, ElMessage, FormInstance } from 'element-plus'
+import { toRefs, reactive, ref, defineComponent } from 'vue'
+import { ElMessageBox, ElMessage } from 'element-plus'
 import functionCom from './function.vue'
 
 import 'vue3-json-viewer/dist/index.css'
@@ -337,8 +317,8 @@ import api from '/@/api/device'
 interface TableDataState {
 	ids: number[]
 	deviceIds: number[]
-    detail: object[]
-    isShowSubDeviceDialog: boolean
+	detail: object[]
+	isShowSubDeviceDialog: boolean
 	deviceTableData: {
 		data: []
 		total: number
@@ -395,7 +375,7 @@ export default defineComponent({
 			areaData: [],
 			isShowDialog: false,
 			dialogVisible: false,
-            isShowSubDeviceDialog: false,
+			isShowSubDeviceDialog: false,
 			logTypeData: [],
 			jsonData: '',
 			activeName: '3', // 分类数据
@@ -456,25 +436,25 @@ export default defineComponent({
 		// 打开弹窗
 		const openDialog = (row: any | null) => {
 			if (row) {
-                const ids = row.id;
-                api.instance.detail(ids).then((res: any) => {
-                    state.detail = res.data;
-                    state.developer_status = res.data.status;
-                    state.tableData.param.productKey = res.data.product.key;
-                    state.productKey = res.data.product.key;
-                    getrunData();
-                    api.product.detail(res.data.product.key).then((productRes: any) => {
-                        state.prodetail = productRes.data;
-                    });
-                    //第一次加载
-                    api.model.property(state.tableData.param).then((modelRes: any) => {
-                        state.tableData.data = modelRes.Data;
-                        state.tableData.total = modelRes.Total;
-                    });
-                    getDeviceTableData()
-                });
+				const ids = row.key;
+				api.instance.detail(ids).then((res: any) => {
+					state.detail = res.data;
+					state.developer_status = res.data.status;
+					state.tableData.param.productKey = res.data.product.key;
+					state.productKey = res.data.product.key;
+					getrunData();
+					api.product.detail(res.data.product.key).then((productRes: any) => {
+						state.prodetail = productRes.data;
+					});
+					//第一次加载
+					api.model.property(state.tableData.param).then((modelRes: any) => {
+						state.tableData.data = modelRes.Data;
+						state.tableData.total = modelRes.Total;
+					});
+					getDeviceTableData()
+				});
 			}
-			  state.isShowSubDeviceDialog = true;
+			state.isShowSubDeviceDialog = true;
 		}
 
 		const onLogDetail = (row: TableDataRow) => {
@@ -570,7 +550,7 @@ export default defineComponent({
 						})
 					}
 				})
-				.catch(() => {})
+				.catch(() => { })
 		}
 
 		//根据不同类型获取列表
@@ -649,7 +629,7 @@ export default defineComponent({
 		}
 
 		const getrunData = () => {
-			api.instance.getrun_status({ id: state.detail.id }).then((res: any) => {
+			api.instance.getrun_status({ deviceKey: state.detail.key }).then((res: any) => {
 				state.areaData = res
 				let properties = state.areaData.properties || []
 
@@ -744,7 +724,7 @@ export default defineComponent({
 			getevent,
 			gettab,
 			wuhandleClick,
-            openDialog,
+			openDialog,
 			onOpenEditTab,
 			onOpenEditEvent,
 			onOpenEditAttr,
@@ -756,31 +736,38 @@ export default defineComponent({
 	},
 })
 </script>
-  <style scoped>
+<style scoped>
 .content {
 	width: 100%;
 	padding: 20px;
 }
+
 .content-box {
 	width: 100%;
 	padding: 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;
@@ -791,31 +778,37 @@ export default defineComponent({
 	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;
@@ -828,37 +821,46 @@ tr {
 	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 {
+
+.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;
@@ -867,11 +869,13 @@ tr {
 	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;
@@ -879,9 +883,11 @@ tr {
 	padding: 20px;
 	border-bottom: #e8e8e8 1px solid;
 }
+
 .wu-box .wu-title .title {
 	font-size: 18px;
 }
+
 .ant-card {
 	box-sizing: border-box;
 	margin: 10px;
@@ -897,24 +903,27 @@ tr {
 	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>
+}</style>
 
 

+ 13 - 13
src/views/iot/device/instance/component/subDeviceMutipleBind.vue

@@ -2,9 +2,9 @@
 	<div class="mutiple-bind-dialog-wrap">
 		<el-dialog title="批量绑定子设备" v-model="isShowDialog" width="90%">
 			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="small" label-width="110px">
-				<el-form-item label="所属产品" prop="productId">
-					<el-select @change="handleChange" v-model="ruleForm.productId" placeholder="请选择所属产品" style="width: 300px;">
-						<el-option v-for="item in productData" :key="item.id" :label="item.name" :value="item.id" />
+				<el-form-item label="所属产品" prop="productKey">
+					<el-select @change="handleChange" v-model="ruleForm.productKey" placeholder="请选择所属产品" style="width: 300px;">
+						<el-option v-for="item in productData" :key="item.key" :label="item.name" :value="item.key" />
 					</el-select>
 					<el-button style="margin-left: 20px;" :disabled="!deviceKeyList.length" v-auth="'mutipleBind'" type="primary" @click="confirmBind()">批量绑定</el-button>
 
@@ -54,13 +54,13 @@ interface TableDataState {
 		param: {
 			pageNum: number
 			pageSize: number
-			productId: number
+			productKey: number
 			status: string
 			dateRange: string[]
 		}
 	},
 	ruleForm: {
-		productId: string | number
+		productKey: string | number
 	},
 	rules: {}
 }
@@ -81,21 +81,21 @@ export default defineComponent({
 				param: {
 					pageNum: 1,
 					pageSize: 10,
-					productId: 0,
+					productKey: 0,
 					status: '',
 					dateRange: [],
 				},
 			},
 			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;
@@ -103,7 +103,7 @@ export default defineComponent({
 
 			state.tableData.loading = true;
 			api.device.getSubList({
-				"productId": state.ruleForm.productId,
+				"productKey": state.ruleForm.productKey,
 				"pageSize": state.tableData.param.pageSize,
 				"pageNum": state.tableData.param.pageNum
 			}).then((res: any) => {
@@ -117,7 +117,7 @@ export default defineComponent({
 			api.product.getSubList().then((res: any) => {
 				let productDataList = res.product
 				state.productData = productDataList;
-				state.ruleForm.productId = state.productData[0].id
+				state.ruleForm.productKey = state.productData[0].key
 				getDeviceList()
 				state.isShowDialog = true;
 			});
@@ -156,8 +156,8 @@ export default defineComponent({
 				})
 		};
 
-		const handleChange = (productId: number) => {
-			state.ruleForm.productId = productId;
+		const handleChange = (productKey: number) => {
+			state.ruleForm.productKey = productKey;
 			getDeviceList()
 		}
 

+ 6 - 6
src/views/iot/device/product/component/editTab.vue

@@ -197,7 +197,7 @@ import { ElMessage } from 'element-plus';
 
 interface RuleFormState {
 	id: number;
-	productId: number;
+	productKey: number;
 	accessMode: number;
 	name: string;
 	dictType: string;
@@ -223,7 +223,7 @@ export default defineComponent({
 			typeData: [], //
 			type: '',
 			types: '',
-			productId: 0,
+			productKey: 0,
 			valueType: {
 				type: '',
 				maxLength: '',
@@ -247,7 +247,7 @@ export default defineComponent({
 
 			ruleForm: {
 				id: 0,
-				productId: 0,
+				productKey: 0,
 				name: '',
 				key: '',
 				transportProtocol: '',
@@ -272,7 +272,7 @@ export default defineComponent({
 		});
 
 		// 打开弹窗
-		const openDialog = (row: RuleFormState | null, productId: number | null) => {
+		const openDialog = (row: RuleFormState | null, productKey: number | null) => {
 			resetForm();
 
 			api.product.getDataType({ status: -1 }).then((res: any) => {
@@ -293,7 +293,7 @@ export default defineComponent({
 			if (row.valueType) {
 				state.ruleForm = row;
 
-				state.productId = productId;
+				state.productKey = productKey;
 				state.valueType = row.valueType;
 				state.ruleForm.valueType.type = row.valueType.type;
 				state.ruleForm.type = row.valueType.type;
@@ -418,7 +418,7 @@ export default defineComponent({
 							}
 						}
 						state.ruleForm.valueType = state.valueType;
-						state.ruleForm.productId = state.productId;
+						state.ruleForm.productKey = state.productKey;
 
 						api.model.tagedit(state.ruleForm).then(() => {
 							ElMessage.success('标签定义类型修改成功');

+ 1 - 1
src/views/iot/device/product/detail.vue

@@ -362,7 +362,7 @@ export default defineComponent({
 					if (type == 'tab') {
 						api.model.tagdel(route.params.id, key).then(() => {
 							ElMessage.success('删除成功');
-							tagdel();
+							gettab();
 						});
 					}
 				})