Ver Fonte

fea: ice设备、ice模版对接完成

vera_min há 1 ano atrás
pai
commit
afd7b0f51b

+ 3 - 2
src/api/ice104/index.ts

@@ -16,13 +16,14 @@ export default {
     getList: (params: object) => get('/device/list', params),
     addItem: (data: object) => post('/device/add', data),
     editItem: (data: object) => put('/device/edit', data),
-    deleteItem: (ids: number) => del('/device/delete', { ids }),
+    deleteItem: (data: object) => del('/device/delete', data),
   },
   template: {
+    getAll: (params: object) => get('/template/all', params),
     getList: (params: object) => get('/template/list', params),
     addItem: (data: object) => post('/template/add', data),
     editItem: (data: object) => put('/template/edit', data),
-    deleteItem: (ids: number) => del('/template/delete', { ids }),
+    deleteItem:  (data: object) => del('/template/delete', data),
   },
   deviceTask: {
     getList: (params: object) => get('/device/job/list', params),

+ 1 - 1
src/utils/request_ice104.ts

@@ -5,7 +5,7 @@ import getOrigin from '/@/utils/origin'
 // 配置新建一个 axios 实例
 const service = axios.create({
 	// baseURL: getOrigin(import.meta.env.VITE_ICE104_API),
-	baseURL: 'http://6smbwc.natappfree.cc',
+	baseURL: 'http://qt9nk7.natappfree.cc',
 	timeout: 50000,
 	headers: { 'Content-Type': 'application/json' },
 });

+ 0 - 268
src/views/iot/ice104/device/component/detail.vue

@@ -1,268 +0,0 @@
-<template>
-	<el-dialog title="设备通道详情" v-model="dialogVisible" width="900px" :before-close="clsoeDialog" :close-on-click-modal="false">
-		<el-tabs v-model="activeName">
-			<el-tab-pane label="通道信息" name="1">
-				<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
-					<el-form-item label="通道名称" prop="title">
-						<el-input v-model="temp.title" placeholder="请输入通道名称" />
-					</el-form-item>
-					<el-form-item label="注册码" prop="number">
-						<el-input v-model="temp.number" placeholder="请输入注册码" />
-					</el-form-item>
-					<el-form-item label="设备地址" prop="slaveId">
-						<el-input v-model.number="temp.slaveId" placeholder="请输入设备地址" />
-					</el-form-item>
-					<!-- <el-form-item label="调度周期(秒)" prop="interval">
-            <el-input v-model="temp.interval" placeholder="请输入调度周期" />
-          </el-form-item> -->
-					<el-form-item label="" prop="">
-						<div align="right">
-							<el-button @click="clsoeDialog"> 取 消 </el-button>
-							<el-button type="primary" @click="updateData()"> 保 存 </el-button>
-						</div>
-					</el-form-item>
-				</el-form>
-			</el-tab-pane>
-			<el-tab-pane label="任务" name="2">
-				<div class="filter-container">
-					<el-button class="filter-item" type="primary" icon="el-icon-circle-plus-outline" @click="handleCreate"> 添加任务 </el-button>
-				</div>
-
-				<el-table :key="tableKey" v-loading="listLoading" :data="taskList" border fit highlight-current-row style="width: 100%">
-					<el-table-column label="标题" prop="Job.title" align="center"></el-table-column>
-					<el-table-column label="调度周期" prop="Job.interval" align="center"></el-table-column>
-					<el-table-column label="转发格式" prop="encoding" align="center">
-						<template #default="{ row }">
-							{{ getCodingLabel(row) }}
-						</template>
-					</el-table-column>
-					<el-table-column label="mqtt主题" prop="Job.publishTopic" align="center"></el-table-column>
-					<el-table-column label="模板" prop="Template.title" align="center"></el-table-column>
-					<el-table-column label="操作" align="center" width="200">
-						<template #default="{ row, $index }">
-							<el-button type="primary" size="mini" @click="handleUpdate(row)"> 详情 </el-button>
-							<el-button v-if="row.status != 'deleted'" size="mini" type="danger" @click="handleDelete(row, $index)"> 删除 </el-button>
-						</template>
-					</el-table-column>
-				</el-table>
-
-				<pagination v-if="total > 0" :total="total" v-model:page="listQuery.page" v-model:limit="listQuery.size" @pagination="getList()" />
-				<TaskDialog ref="taskDialog" :formatOptions="formatOptions" @finish="getList" />
-			</el-tab-pane>
-			<el-tab-pane label="通道码流" name="3">
-				<div>
-					<el-button :type="evsrc ? 'info' : 'primary'" @click="openEv()">开始</el-button>
-					<el-button :type="evsrc ? 'primary' : 'info'" :disabled="!evsrc" @click="closeEv()">停止</el-button>
-					<el-button type="defualt" @click="clearLog()">清空</el-button>
-					<el-button type="info" style="margin-left: 150px" @click="downloadLog()">下载报文</el-button>
-					<ul id="logContainer" ref="logContainer"></ul>
-				</div>
-			</el-tab-pane>
-		</el-tabs>
-	</el-dialog>
-</template>
-
-<script lang="ts">
-import { ElMessage } from 'element-plus';
-import api from '/@/api/device/modbus';
-import getOrigin from '/@/utils/origin';
-import TaskDialog from './taskDialog.vue';
-
-export default {
-	components: { TaskDialog },
-	data() {
-		return {
-			temp: {
-				title: '',
-				number: '',
-				templateNumber: '',
-				slaveId: '',
-				interval: '',
-			},
-			rules: {
-				title: [{ required: true, message: '请输入通道名称', trigger: 'blur' }],
-				number: [{ required: true, message: '请输入注册码', trigger: 'blur' }],
-				slaveId: [{ required: true, message: '请输入设备地址', trigger: 'blur' }],
-				templateNumber: [{ required: true, message: '请输入设备模板', trigger: 'change' }],
-			},
-			dialogVisible: false,
-			activeName: '1',
-			taskList: [],
-			listLoading: false,
-			total: 0,
-			tableKey: 0,
-			listQuery: {
-				page: 1,
-				size: 10,
-			},
-			evsrc: null as any,
-			count: 0,
-			templateOptions: [],
-			formatOptions: [],
-		};
-	},
-	watch: {
-		activeName: 'handleTabClick',
-	},
-
-	methods: {
-		open(row: any) {
-			this.temp = { ...row };
-			this.getDict();
-			this.dialogVisible = true;
-		},
-		downloadLog() {
-			window.open(getOrigin(import.meta.env.VITE_MODBUS_API) + '/debug/export_message?number=' + this.temp.number);
-		},
-		clsoeDialog() {
-			this.dialogVisible = false;
-			this.activeName = '1';
-			(this.$refs['dataForm'] as any).resetFields();
-			this.closeEv();
-		},
-		updateData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					const tempData = Object.assign({}, this.temp);
-					api.channel.editDevice(tempData).then(() => {
-						this.$emit('getList');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-		// tab 切换
-		handleTabClick() {
-			this.closeEv(false);
-			if (this.activeName === '2') {
-				// 任务
-				this.getList();
-			} else if (this.activeName === '3') {
-				// 码流
-				// this.initEv()
-			}
-		},
-		handleFilter() {
-			this.listQuery.page = 1;
-			this.getList();
-		},
-		// 获取字典数据
-		getDict() {
-			api.getDict({ code: 'forwardFormat' }).then((data: any) => {
-				this.formatOptions = data.list || [];
-			});
-		},
-		// 获取任务list
-		getList() {
-			this.listLoading = true;
-			api.task
-				.getList(this.listQuery)
-				.then((res: any) => {
-					this.taskList = res.list || [];
-					this.total = res.Total;
-				})
-				.finally(() => {
-					this.listLoading = false;
-				});
-		},
-		handleDelete(row: any) {
-			this.$confirm('是否确认删除任务名称为"' + row.Job.title + '"的数据项?', '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(function () {
-					return api.task.deleteDeviceJob({ number: row.Job.number });
-				})
-				.then(() => {
-					this.handleFilter();
-					ElMessage.success('删除成功!');
-				})
-				.catch(function () { });
-		},
-		handleCreate() {
-			(this.$refs.taskDialog as any).openDialog({
-				dialogStatus: 'create',
-				deviceNumber: this.temp.number,
-			});
-		},
-		handleUpdate(row: any) {
-			(this.$refs.taskDialog as any).openDialog({
-				dialogStatus: 'update',
-				row,
-				deviceNumber: this.temp.number,
-			});
-		},
-		// 码流
-		initEv() {
-			if (this.evsrc) return;
-			// this.evsrc = new EventSource(`http://one.server.mydig.net/debug?number=${this.temp.number}`);
-			this.evsrc = new EventSource(`${getOrigin(import.meta.env.VITE_MODBUS_API)}/debug?number=${this.temp.number}`);
-			let that = this;
-			this.evsrc.onmessage = function (ev: any) {
-				try {
-					let obj = JSON.parse(ev.data);
-					if (obj.deviceId === that.temp.number) {
-						let color = obj.type === 'request' ? '#F56C6C' : '#409EFF';
-						let content = `${obj.type === 'request' ? '请求:' : '应答:'} ${obj.msg}`;
-						this.$refs.logContainer.insertAdjacentHTML('afterbegin', `<li style="color: ${color}">${content}</li>`);
-					}
-				} catch (_e) {
-					// @ts-ignore
-					// console.log('error', e);
-				}
-			};
-			// this.evsrc.onerror = function (_ev: any) {
-				// @ts-ignore
-				// console.log('readyState = ' + ev.currentTarget.readyState);
-			// };
-		},
-		openEv() {
-			(this.$refs.logContainer as any).insertAdjacentHTML('beforeEnd', `<li style="color: #000;">开始...</li>`);
-			this.initEv();
-		},
-		closeEv(log = true) {
-			this.evsrc && this.evsrc.close();
-			this.evsrc = null;
-			this.count = 0;
-			// this.clearLog()
-			if (log) {
-				(this.$refs.logContainer as any).insertAdjacentHTML('beforeEnd', `<li style="color: #000;">停止...</li>`);
-			}
-		},
-		// 清空码流
-		clearLog() {
-			(this.$refs.logContainer as any).innerHTML = '';
-		},
-		getCodingLabel(row: any) {
-			const item = this.formatOptions.find((item: any) => item.value === row.Job.encoding) as any;
-			return item.title;
-		},
-	},
-};
-</script>
-
-<style lang="scss" scoped>
-.filter-container {
-	margin-bottom: 10px;
-}
-
-.filter-item {
-	margin-right: 10px;
-}
-
-#logContainer {
-	height: 400px;
-	overflow: auto;
-	border: 1px solid #ddd;
-	padding: 10px;
-	padding-left: 20px;
-	border-radius: 8px;
-	margin-top: 10px;
-	word-wrap: break-word;
-	word-break: normal;
-	background-color: #f2f2f2;
-	line-height: 22px;
-}
-</style>

+ 123 - 68
src/views/iot/ice104/device/component/edit.vue

@@ -1,80 +1,135 @@
 <template>
-	<el-dialog title="添加设备通道" v-model="dialogVisible" width="600px" :before-close="clsoeDialog" :close-on-click-modal="false">
-		<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
-			<el-form-item label="通道名称" prop="title">
-				<el-input v-model="temp.title" placeholder="请输入通道名称" />
+	<el-dialog
+		:title="isEdit ? '修改设备' : '添加设备'"
+		v-model="dialogVisible"
+		width="600px"
+		:before-close="clsoeDialog"
+		: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="number">
+				<el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入设备编码" />
 			</el-form-item>
-			<el-form-item label="注册码" prop="number">
-				<el-input v-model="temp.number" placeholder="请输入注册码" />
+			<el-form-item label="名称">
+				<el-input v-model="ruleForm.title" placeholder="请输入名称" />
 			</el-form-item>
-			<el-form-item label="设备地址" prop="slaveId">
-				<el-input v-model.number="temp.slaveId" placeholder="请输入设备地址" />
+			<el-form-item label="设备通用地址">
+				<el-input type="number" v-model.number="ruleForm.commonAddr" placeholder="请输入设备通用地址" />
+			</el-form-item>
+			<el-form-item label="mac地址">
+				<el-input v-model="ruleForm.subCode" placeholder="请输入mac地址" />
+			</el-form-item>
+			<el-form-item label="模版编号">
+				<el-select v-model="ruleForm.templateNumber" placeholder="请选择模版编号" class="width100">
+					<el-option :label="item.title" :value="item.number" v-for="(item, index) in tableData" :key="index"></el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item label="产品key">
+				<el-input v-model="ruleForm.productKey" placeholder="请输入产品key" />
+			</el-form-item>
+			<el-form-item label="设备key">
+				<el-input v-model="ruleForm.deviceKey" placeholder="请输入设备key" />
 			</el-form-item>
 		</el-form>
-		<div slot="footer" class="dialog-footer">
+		<template #footer>
 			<el-button @click="clsoeDialog()"> 取 消 </el-button>
-			<el-button type="primary" @click="createData()"> 保 存 </el-button>
-		</div>
+			<el-button :loading="btnLoading" type="primary" @click="submitData"> 保 存 </el-button>
+		</template>
 	</el-dialog>
 </template>
-<script lang="ts">
-import api from '/@/api/device/modbus';
+<script lang="ts" setup>
+import { computed, reactive, ref } from 'vue';
+import api from '/@/api/ice104/index';
+import { useI18n } from 'vue-i18n';
 import { ElMessage } from 'element-plus';
-export default {
-	data() {
-		return {
-			temp: {
-				title: '',
-				number: '',
-				templateNumber: '',
-				slaveId: '',
-				interval: '',
-			},
-			rules: {
-				title: [{ required: true, message: '请输入通道名称', trigger: 'blur' }],
-				number: [{ required: true, message: '请输入注册码', trigger: 'blur' }],
-				slaveId: [{ required: true, message: '请输入设备地址', trigger: 'blur' }],
-			},
-			dialogVisible: false,
-			listLoading: false,
-			templateOptions: [],
-		};
-	},
+import { useSearch } from '/@/hooks/useCommonIce104';
+
+const { params, tableData, getList, loading } = useSearch(api.template.getAll, 'data', { title: '' });
+getList();
+
+const dialogVisible = ref(false);
+const btnLoading = ref(false);
+const emit = defineEmits(['updateList']);
+const formRef = ref();
+const ruleForm = ref({
+	number: '',
+	title: '',
+	commonAddr: '',
+	subCode: '',
+	templateNumber: '',
+	productKey: '',
+	deviceKey: '',
+})
+const isEdit = ref(false);
+
+const formRules = computed(() => ({
+	number: [{ required: true, trigger: 'change', message: '请输入设备编码' }],
+}));
+
+const submitData = async () => {
+	formRef.value.validate((valid: boolean) => {
+		console.log(valid)
+		if (!valid) return
+		btnLoading.value = true
+		if (isEdit.value) {
+			// 修改
+			api.device.editItem({
+				...ruleForm.value,
+			})
+			.then(() => {
+				ElMessage({ type: 'success', message: '修改成功' })
+				emit('updateList')
+				closeDialog()
+			})
+			.finally(() => (btnLoading.value = false))
+		} else {
+			// 新增
+			api.device.addItem(ruleForm.value)
+			.then(() => {
+				ElMessage({ type: 'success', message: '添加成功' })
+				emit('updateList')
+				closeDialog()
+			})
+			.finally(() => (btnLoading.value = false))
+		}
+	})
+}
+
+/**
+ * 关闭弹窗
+ */
+const closeDialog = () => {
+  dialogVisible.value = false;
+  ruleForm.value = {
+	id: '',
+	number: '',
+	title: '',
+	commonAddr: '',
+	subCode: '',
+	templateNumber: '',
+	productKey: '',
+	deviceKey: ''
+  }
+}
+
+
+const open = async (row: any) => {
+	dialogVisible.value = true
+	console.log(row)
+	if (row && row.number.toString()) {
+		console.log(row)
+		ruleForm.value = row;
+		isEdit.value = true;
+	}else {
+		isEdit.value = false;
+	}
+}
 
-	methods: {
-		open() {
-			// this.getList();
-			this.dialogVisible = true;
-		},
-		clsoeDialog() {
-			(this.$refs.dataForm as any).resetFields();
-			this.dialogVisible = false;
-		},
-		// 获取模板数据
-		getList() {
-			this.listLoading = true;
-			api.channel
-				.getList({ page: 1, size: 50 })
-				.then((data: any) => {
-					this.templateOptions = data.list || [];
-				})
-				.finally(() => {
-					this.listLoading = false;
-				});
-		},
-		createData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					api.channel.addDevice(this.temp).then(() => {
-						this.$emit('getList');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-	},
-};
+defineExpose({ open })
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.width100 {
+	width: 100%;
+}
+</style>

+ 0 - 139
src/views/iot/ice104/device/component/taskDialog.vue

@@ -1,139 +0,0 @@
-<template>
-	<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" width="600px" :before-close="clsoeDialog" append-to-body :close-on-click-modal="false">
-		<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 400px; margin: 0 auto">
-			<el-form-item label="标题" prop="title">
-				<el-input v-model="temp.title" placeholder="请输入标题" />
-			</el-form-item>
-			<el-form-item label="调度周期" prop="interval">
-				<el-input v-model="temp.interval" placeholder="请输入调度周期" />
-			</el-form-item>
-			<el-form-item label="转发格式" prop="encoding">
-				<el-select v-model="temp.encoding" placeholder="请选择转发格式" style="width: 100%">
-					<el-option v-for="item in formatOptions" :key="item.value" :label="item.title" :value="item.value"> </el-option>
-				</el-select>
-				<!-- <el-input v-model="temp.encoding" placeholder="请输入转发格式"/> -->
-			</el-form-item>
-			<el-form-item label="mqtt主题" prop="publishTopic">
-				<el-input v-model="temp.publishTopic" placeholder="请输入mqtt主题" />
-			</el-form-item>
-			<el-form-item label="设备模板" prop="templateNumber">
-				<el-select v-model="temp.templateNumber" filterable placeholder="请选择设备模板" style="width: 100%">
-					<el-option v-for="item in templateOptions" :key="item.number" :label="item.title" :value="item.number"> </el-option>
-				</el-select>
-			</el-form-item>
-		</el-form>
-		<div slot="footer" class="dialog-footer">
-			<el-button @click="clsoeDialog"> 取 消 </el-button>
-			<el-button type="primary" @click="dialogStatus === 'create' ? createData() : updateData()"> 保 存 </el-button>
-		</div>
-	</el-dialog>
-</template>
-
-<script lang="ts">
-import api from '/@/api/device/modbus';
-import { ElMessage } from 'element-plus';
-
-export default {
-	components: {},
-	props: {
-		formatOptions: {
-			default: () => [],
-		},
-	},
-	data() {
-		return {
-			temp: {
-				title: '',
-				interval: '20s',
-				encoding: 'json',
-				publishTopic: '',
-				deviceNumber: '',
-				number: '',
-				templateNumber: '',
-			},
-			rules: {
-				title: [{ required: true, message: '请输入模板名称', trigger: 'change' }],
-				publishTopic: [{ required: true, message: '请输入mqtt主题', trigger: 'change' }],
-				mode: [{ required: true, message: '请选择模式', trigger: 'change' }],
-				templateNumber: [{ required: true, message: '请选择模式', trigger: 'change' }],
-			},
-			dialogVisible: false,
-			listLoading: false,
-			dialogStatus: '',
-			textMap: {
-				update: '任务详情',
-				create: '添加任务',
-			},
-			templateOptions: '',
-		};
-	},
-
-	methods: {
-		openDialog({ dialogStatus, row, deviceNumber }) {
-			this.dialogStatus = dialogStatus;
-			this.temp.deviceNumber = deviceNumber;
-			if (row) {
-				// this.temp = { ...row }
-				this.temp.number = row.Job.number;
-				this.temp.title = row.Job.title;
-				this.temp.interval = row.Job.interval;
-				this.temp.encoding = row.Job.encoding;
-				this.temp.publishTopic = row.Job.publishTopic;
-				this.temp.templateNumber = row?.Template?.number;
-			}
-			// this.getDict()
-			this.getTemplateList();
-			this.dialogVisible = true;
-		},
-		clsoeDialog() {
-			this.dialogVisible = false;
-			this.temp = {
-				title: '',
-				interval: '20s',
-				encoding: 'json',
-				publishTopic: '',
-				deviceNumber: '',
-				number: '',
-				templateNumber: '',
-			};
-			(this.$refs['dataForm'] as any).resetFields();
-		},
-		// 获取模板数据
-		getTemplateList() {
-			this.listLoading = true;
-			api.template
-				.getList({ page: 1, size: 50 })
-				.then((res: any) => {
-					this.templateOptions = res.list || [];
-				})
-				.finally(() => {
-					this.listLoading = false;
-				});
-		},
-		createData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					api.task.addDeviceJob(this.temp).then(() => {
-						this.$emit('finish');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-		updateData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					api.task.editDeviceJob(this.temp).then(() => {
-						this.$emit('finish');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-	},
-};
-</script>
-
-<style lang="scss" scoped></style>

+ 19 - 23
src/views/iot/ice104/device/index.vue

@@ -11,14 +11,11 @@
 		<el-card shadow="hover" class="page-full-part">
 			<div class="search">
 				<el-form :model="params" :inline="true" ref="queryRef">
-					<el-form-item label="通道名称" prop="title">
-						<el-input v-model="params.title" placeholder="请输入通道名称" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
-					</el-form-item>
-					<el-form-item label="注册码" prop="number">
-						<el-input v-model="params.number" placeholder="请输入注册码" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
+					<el-form-item label="设备名称" prop="title">
+						<el-input v-model="params.title" placeholder="请输入设备名称" clearablestyle="width: 240px" @keyup.enter.native="getList()" />
 					</el-form-item>
 					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="getList(1)">
+						<el-button size="default" type="primary" class="ml10" @click="getList()">
 							<el-icon>
 								<ele-Search />
 							</el-icon>
@@ -30,7 +27,7 @@
 							</el-icon>
 							重置
 						</el-button>
-						<el-button type="primary" @click="addOrEdit()" v-auth="'add'">
+						<el-button type="primary" @click="addOrEdit()">
 							<el-icon>
 								<ele-FolderAdd />
 							</el-icon>
@@ -41,32 +38,31 @@
 			</div>
 			<el-table :data="tableData" style="width: 100%" v-loading="loading">
 				<el-table-column type="index" label="序号" width="80" align="center" />
-				<el-table-column prop="Title" label="设备名称"  align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="SubCode" label="mac地址" min-width="120" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="CommonAddr" label="通用设备地址" min-width="120" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="TemplateNumber" label="模版编号" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="ProductKey" label="产品key" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="DeviceKey" label="设备key" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="CreatedAt" label="创建时间" min-width="160" align="center"></el-table-column>
-				<el-table-column prop="UpdateAt" label="更新时间" min-width="160" align="center"></el-table-column>
+				<el-table-column prop="title" label="设备名称"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="number" label="设备编码" min-width="120" align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="subCode" label="mac地址" min-width="120" align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="commonAddr" label="通用设备地址" min-width="120" align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="templateNumber" label="模版编号" align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="productKey" label="产品key" align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="deviceKey" label="设备key" align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="createdAt" label="创建时间" min-width="160" align="center"></el-table-column>
+				<el-table-column prop="updatedAt" label="更新时间" min-width="160" align="center"></el-table-column>
 				<el-table-column fixed="right" label="操作" width="100" align="center">
 					<template #default="scope">
-						<el-button size="small" text type="primary" @click="viewDetail(scope.row)">编辑</el-button>
+						<el-button size="small" text type="primary" @click="addOrEdit(scope.row)">编辑</el-button>
 						<el-button size="small" text type="info" @click="onDel(scope.row)">删除</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
 			<pagination v-if="params.total" :total="params.total" v-model:page="params.page" v-model:limit="params.size" @pagination="getList()" />
 		</el-card>
-		<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
-		<detailForm ref="detailFormRef" @getList="getList()"></detailForm>
+		<EditForm ref="editFormRef" @updateList="getList()"></EditForm>
 	</div>
 </template>
 
 <script lang="ts" setup>
 import { ref } from 'vue';
 import EditForm from './component/edit.vue';
-import detailForm from './component/detail.vue';
 import api from '/@/api/ice104/index';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
@@ -75,7 +71,7 @@ const editFormRef = ref();
 const detailFormRef = ref();
 const queryRef = ref();
 
-const { params, tableData, getList, loading } = useSearch(api.device.getList, 'data', { keyWord: '', number: '' });
+const { params, tableData, getList, loading } = useSearch(api.device.getList, 'data', { title: '' });
 
 getList();
 
@@ -89,7 +85,7 @@ const viewDetail = async (row: any) => {
 // 重置表单
 const resetQuery = () => {
 	queryRef.value.resetFields();
-	getList(1);
+	getList();
 };
 
 const onDel = (row: any) => {
@@ -98,9 +94,9 @@ const onDel = (row: any) => {
 		cancelButtonText: '取消',
 		type: 'warning',
 	}).then(async () => {
-		await api.channel.deleteDevice({ number: row.number });
+		await api.device.deleteItem({number: row.number});
 		ElMessage.success('删除成功');
-		getList(1);
+		getList();
 	});
 };
 </script>

+ 20 - 15
src/views/iot/ice104/deviceTask/index.vue

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2023-10-23 17:05:57
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2023-10-25 08:53:40
+ * @LastEditTime: 2023-10-25 10:11:06
  * @FilePath: /sagoo-admin-ui/src/views/iot/ice104/index.vue
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 -->
@@ -11,11 +11,8 @@
 		<el-card shadow="hover" class="page-full-part">
 			<div class="search">
 				<el-form :model="params" :inline="true" ref="queryRef">
-					<el-form-item label="通道名称" prop="title">
-						<el-input v-model="params.title" placeholder="请输入通道名称" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
-					</el-form-item>
-					<el-form-item label="注册码" prop="number">
-						<el-input v-model="params.number" placeholder="请输入注册码" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
+					<el-form-item label="设备执行名称" prop="title">
+						<el-input v-model="params.title" placeholder="请输入设备执行名称" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
 					</el-form-item>
 					<el-form-item>
 						<el-button size="default" type="primary" class="ml10" @click="getList(1)">
@@ -34,20 +31,29 @@
 							<el-icon>
 								<ele-FolderAdd />
 							</el-icon>
-							新增通道
+							新增
 						</el-button>
 					</el-form-item>
 				</el-form>
 			</div>
 			<el-table :data="tableData" style="width: 100%" v-loading="loading">
 				<el-table-column type="index" label="序号" width="80" align="center" />
-				<el-table-column prop="title" label="通道名称" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="number" label="注册码" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="slaveId" label="设备地址" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="100" align="center">
+				<el-table-column prop="title" label="名称"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="number" label="编码"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="deviceNumber" label="设备编号"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="interval" label="执行间隔"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="jobType" label="job类型" align="center" show-overflow-tooltip>
+					<!-- 100-》总召唤,101-》电度召唤,103-》时钟同步 -->
+					<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>
+					</template>
+				</el-table-column>
+				<el-table-column fixed="right" label="操作" width="100" align="center">
 					<template #default="scope">
-						<el-button size="small" text type="primary" v-auth="'detail'" @click="viewDetail(scope.row)">详情</el-button>
-						<el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
+						<el-button size="small" text type="primary" @click="viewDetail(scope.row)">编辑</el-button>
+						<el-button size="small" text type="info" @click="onDel(scope.row)">删除</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -64,14 +70,13 @@ import EditForm from './component/edit.vue';
 import detailForm from './component/detail.vue';
 import api from '/@/api/ice104/index';
 import { ElMessageBox, ElMessage } from 'element-plus';
-// import { useSearch } from '/@/hooks/useCommon';
 import { useSearch } from '/@/hooks/useCommonIce104';
 
 const editFormRef = ref();
 const detailFormRef = ref();
 const queryRef = ref();
 
-const { params, tableData, getList, loading } = useSearch(api.device.getList, 'list', { keyWord: '', number: '' });
+const { params, tableData, getList, loading } = useSearch(api.deviceTask.getList, 'data', { title: '' });
 
 getList();
 

+ 14 - 15
src/views/iot/ice104/deviceTemplate/index.vue

@@ -2,7 +2,7 @@
  * @Author: vera_min vera_min@163.com
  * @Date: 2023-10-23 17:05:57
  * @LastEditors: vera_min vera_min@163.com
- * @LastEditTime: 2023-10-25 08:53:48
+ * @LastEditTime: 2023-10-25 10:11:06
  * @FilePath: /sagoo-admin-ui/src/views/iot/ice104/index.vue
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 -->
@@ -11,11 +11,8 @@
 		<el-card shadow="hover" class="page-full-part">
 			<div class="search">
 				<el-form :model="params" :inline="true" ref="queryRef">
-					<el-form-item label="通道名称" prop="title">
-						<el-input v-model="params.title" placeholder="请输入通道名称" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
-					</el-form-item>
-					<el-form-item label="注册码" prop="number">
-						<el-input v-model="params.number" placeholder="请输入注册码" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
+					<el-form-item label="设备模版名称" prop="title">
+						<el-input v-model="params.title" placeholder="请输入设备模版名称" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
 					</el-form-item>
 					<el-form-item>
 						<el-button size="default" type="primary" class="ml10" @click="getList(1)">
@@ -34,20 +31,23 @@
 							<el-icon>
 								<ele-FolderAdd />
 							</el-icon>
-							新增通道
+							新增
 						</el-button>
 					</el-form-item>
 				</el-form>
 			</div>
 			<el-table :data="tableData" style="width: 100%" v-loading="loading">
 				<el-table-column type="index" label="序号" width="80" align="center" />
-				<el-table-column prop="title" label="通道名称" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="number" label="注册码" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="slaveId" label="设备地址" align="center" show-overflow-tooltip></el-table-column>
-				<el-table-column label="操作" width="100" align="center">
+				<el-table-column prop="title" label="名称"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="dtId" label="点位id"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="templateNumber" label="模版编号"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="dataAttribName" label="数据项编码"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="dataAddress" label="数据项点位"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="dataCoef" label="倍率"  align="center" show-overflow-tooltip></el-table-column>
+				<el-table-column fixed="right" label="操作" width="100" align="center">
 					<template #default="scope">
-						<el-button size="small" text type="primary" v-auth="'detail'" @click="viewDetail(scope.row)">详情</el-button>
-						<el-button size="small" text type="info" v-auth="'del'" @click="onDel(scope.row)">删除</el-button>
+						<el-button size="small" text type="primary" @click="viewDetail(scope.row)">编辑</el-button>
+						<el-button size="small" text type="info" @click="onDel(scope.row)">删除</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
@@ -64,14 +64,13 @@ import EditForm from './component/edit.vue';
 import detailForm from './component/detail.vue';
 import api from '/@/api/ice104/index';
 import { ElMessageBox, ElMessage } from 'element-plus';
-// import { useSearch } from '/@/hooks/useCommon';
 import { useSearch } from '/@/hooks/useCommonIce104';
 
 const editFormRef = ref();
 const detailFormRef = ref();
 const queryRef = ref();
 
-const { params, tableData, getList, loading } = useSearch(api.device.getList, 'list', { keyWord: '', number: '' });
+const { params, tableData, getList, loading } = useSearch(api.deviceTemplate.getList, 'data', { title: '' });
 
 getList();
 

+ 0 - 268
src/views/iot/ice104/template/component/detail.vue

@@ -1,268 +0,0 @@
-<template>
-	<el-dialog title="设备通道详情" v-model="dialogVisible" width="900px" :before-close="clsoeDialog" :close-on-click-modal="false">
-		<el-tabs v-model="activeName">
-			<el-tab-pane label="通道信息" name="1">
-				<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
-					<el-form-item label="通道名称" prop="title">
-						<el-input v-model="temp.title" placeholder="请输入通道名称" />
-					</el-form-item>
-					<el-form-item label="注册码" prop="number">
-						<el-input v-model="temp.number" placeholder="请输入注册码" />
-					</el-form-item>
-					<el-form-item label="设备地址" prop="slaveId">
-						<el-input v-model.number="temp.slaveId" placeholder="请输入设备地址" />
-					</el-form-item>
-					<!-- <el-form-item label="调度周期(秒)" prop="interval">
-            <el-input v-model="temp.interval" placeholder="请输入调度周期" />
-          </el-form-item> -->
-					<el-form-item label="" prop="">
-						<div align="right">
-							<el-button @click="clsoeDialog"> 取 消 </el-button>
-							<el-button type="primary" @click="updateData()"> 保 存 </el-button>
-						</div>
-					</el-form-item>
-				</el-form>
-			</el-tab-pane>
-			<el-tab-pane label="任务" name="2">
-				<div class="filter-container">
-					<el-button class="filter-item" type="primary" icon="el-icon-circle-plus-outline" @click="handleCreate"> 添加任务 </el-button>
-				</div>
-
-				<el-table :key="tableKey" v-loading="listLoading" :data="taskList" border fit highlight-current-row style="width: 100%">
-					<el-table-column label="标题" prop="Job.title" align="center"></el-table-column>
-					<el-table-column label="调度周期" prop="Job.interval" align="center"></el-table-column>
-					<el-table-column label="转发格式" prop="encoding" align="center">
-						<template #default="{ row }">
-							{{ getCodingLabel(row) }}
-						</template>
-					</el-table-column>
-					<el-table-column label="mqtt主题" prop="Job.publishTopic" align="center"></el-table-column>
-					<el-table-column label="模板" prop="Template.title" align="center"></el-table-column>
-					<el-table-column label="操作" align="center" width="200">
-						<template #default="{ row, $index }">
-							<el-button type="primary" size="mini" @click="handleUpdate(row)"> 详情 </el-button>
-							<el-button v-if="row.status != 'deleted'" size="mini" type="danger" @click="handleDelete(row, $index)"> 删除 </el-button>
-						</template>
-					</el-table-column>
-				</el-table>
-
-				<pagination v-if="total > 0" :total="total" v-model:page="listQuery.page" v-model:limit="listQuery.size" @pagination="getList()" />
-				<TaskDialog ref="taskDialog" :formatOptions="formatOptions" @finish="getList" />
-			</el-tab-pane>
-			<el-tab-pane label="通道码流" name="3">
-				<div>
-					<el-button :type="evsrc ? 'info' : 'primary'" @click="openEv()">开始</el-button>
-					<el-button :type="evsrc ? 'primary' : 'info'" :disabled="!evsrc" @click="closeEv()">停止</el-button>
-					<el-button type="defualt" @click="clearLog()">清空</el-button>
-					<el-button type="info" style="margin-left: 150px" @click="downloadLog()">下载报文</el-button>
-					<ul id="logContainer" ref="logContainer"></ul>
-				</div>
-			</el-tab-pane>
-		</el-tabs>
-	</el-dialog>
-</template>
-
-<script lang="ts">
-import { ElMessage } from 'element-plus';
-import api from '/@/api/device/modbus';
-import getOrigin from '/@/utils/origin';
-import TaskDialog from './taskDialog.vue';
-
-export default {
-	components: { TaskDialog },
-	data() {
-		return {
-			temp: {
-				title: '',
-				number: '',
-				templateNumber: '',
-				slaveId: '',
-				interval: '',
-			},
-			rules: {
-				title: [{ required: true, message: '请输入通道名称', trigger: 'blur' }],
-				number: [{ required: true, message: '请输入注册码', trigger: 'blur' }],
-				slaveId: [{ required: true, message: '请输入设备地址', trigger: 'blur' }],
-				templateNumber: [{ required: true, message: '请输入设备模板', trigger: 'change' }],
-			},
-			dialogVisible: false,
-			activeName: '1',
-			taskList: [],
-			listLoading: false,
-			total: 0,
-			tableKey: 0,
-			listQuery: {
-				page: 1,
-				size: 10,
-			},
-			evsrc: null as any,
-			count: 0,
-			templateOptions: [],
-			formatOptions: [],
-		};
-	},
-	watch: {
-		activeName: 'handleTabClick',
-	},
-
-	methods: {
-		open(row: any) {
-			this.temp = { ...row };
-			this.getDict();
-			this.dialogVisible = true;
-		},
-		downloadLog() {
-			window.open(getOrigin(import.meta.env.VITE_MODBUS_API) + '/debug/export_message?number=' + this.temp.number);
-		},
-		clsoeDialog() {
-			this.dialogVisible = false;
-			this.activeName = '1';
-			(this.$refs['dataForm'] as any).resetFields();
-			this.closeEv();
-		},
-		updateData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					const tempData = Object.assign({}, this.temp);
-					api.channel.editDevice(tempData).then(() => {
-						this.$emit('getList');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-		// tab 切换
-		handleTabClick() {
-			this.closeEv(false);
-			if (this.activeName === '2') {
-				// 任务
-				this.getList();
-			} else if (this.activeName === '3') {
-				// 码流
-				// this.initEv()
-			}
-		},
-		handleFilter() {
-			this.listQuery.page = 1;
-			this.getList();
-		},
-		// 获取字典数据
-		getDict() {
-			api.getDict({ code: 'forwardFormat' }).then((data: any) => {
-				this.formatOptions = data.list || [];
-			});
-		},
-		// 获取任务list
-		getList() {
-			this.listLoading = true;
-			api.task
-				.getList(this.listQuery)
-				.then((res: any) => {
-					this.taskList = res.list || [];
-					this.total = res.Total;
-				})
-				.finally(() => {
-					this.listLoading = false;
-				});
-		},
-		handleDelete(row: any) {
-			this.$confirm('是否确认删除任务名称为"' + row.Job.title + '"的数据项?', '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(function () {
-					return api.task.deleteDeviceJob({ number: row.Job.number });
-				})
-				.then(() => {
-					this.handleFilter();
-					ElMessage.success('删除成功!');
-				})
-				.catch(function () { });
-		},
-		handleCreate() {
-			(this.$refs.taskDialog as any).openDialog({
-				dialogStatus: 'create',
-				deviceNumber: this.temp.number,
-			});
-		},
-		handleUpdate(row: any) {
-			(this.$refs.taskDialog as any).openDialog({
-				dialogStatus: 'update',
-				row,
-				deviceNumber: this.temp.number,
-			});
-		},
-		// 码流
-		initEv() {
-			if (this.evsrc) return;
-			// this.evsrc = new EventSource(`http://one.server.mydig.net/debug?number=${this.temp.number}`);
-			this.evsrc = new EventSource(`${getOrigin(import.meta.env.VITE_MODBUS_API)}/debug?number=${this.temp.number}`);
-			let that = this;
-			this.evsrc.onmessage = function (ev: any) {
-				try {
-					let obj = JSON.parse(ev.data);
-					if (obj.deviceId === that.temp.number) {
-						let color = obj.type === 'request' ? '#F56C6C' : '#409EFF';
-						let content = `${obj.type === 'request' ? '请求:' : '应答:'} ${obj.msg}`;
-						this.$refs.logContainer.insertAdjacentHTML('afterbegin', `<li style="color: ${color}">${content}</li>`);
-					}
-				} catch (_e) {
-					// @ts-ignore
-					// console.log('error', e);
-				}
-			};
-			// this.evsrc.onerror = function (_ev: any) {
-				// @ts-ignore
-				// console.log('readyState = ' + ev.currentTarget.readyState);
-			// };
-		},
-		openEv() {
-			(this.$refs.logContainer as any).insertAdjacentHTML('beforeEnd', `<li style="color: #000;">开始...</li>`);
-			this.initEv();
-		},
-		closeEv(log = true) {
-			this.evsrc && this.evsrc.close();
-			this.evsrc = null;
-			this.count = 0;
-			// this.clearLog()
-			if (log) {
-				(this.$refs.logContainer as any).insertAdjacentHTML('beforeEnd', `<li style="color: #000;">停止...</li>`);
-			}
-		},
-		// 清空码流
-		clearLog() {
-			(this.$refs.logContainer as any).innerHTML = '';
-		},
-		getCodingLabel(row: any) {
-			const item = this.formatOptions.find((item: any) => item.value === row.Job.encoding) as any;
-			return item.title;
-		},
-	},
-};
-</script>
-
-<style lang="scss" scoped>
-.filter-container {
-	margin-bottom: 10px;
-}
-
-.filter-item {
-	margin-right: 10px;
-}
-
-#logContainer {
-	height: 400px;
-	overflow: auto;
-	border: 1px solid #ddd;
-	padding: 10px;
-	padding-left: 20px;
-	border-radius: 8px;
-	margin-top: 10px;
-	word-wrap: break-word;
-	word-break: normal;
-	background-color: #f2f2f2;
-	line-height: 22px;
-}
-</style>

+ 112 - 68
src/views/iot/ice104/template/component/edit.vue

@@ -1,80 +1,124 @@
 <template>
-	<el-dialog title="添加设备通道" v-model="dialogVisible" width="600px" :before-close="clsoeDialog" :close-on-click-modal="false">
-		<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 90%; margin: 0 auto">
-			<el-form-item label="通道名称" prop="title">
-				<el-input v-model="temp.title" placeholder="请输入通道名称" />
+	<el-dialog
+		:title="isEdit ? '修改模版' : '添加模版'"
+		v-model="dialogVisible"
+		width="600px"
+		:before-close="clsoeDialog"
+		:close-on-click-modal="false"
+	>
+		<el-form ref="formRef" :rules="formRules" :model="ruleForm" label-position="left" label-width="80px" style="width: 90%; margin: 0 auto">
+			<el-form-item label="模版编码" prop="number">
+				<el-input :disabled="isEdit" v-model="ruleForm.number" placeholder="请输入模版编码" />
 			</el-form-item>
-			<el-form-item label="注册码" prop="number">
-				<el-input v-model="temp.number" placeholder="请输入注册码" />
+			<el-form-item label="名称">
+				<el-input v-model="ruleForm.title" placeholder="请输入名称" />
 			</el-form-item>
-			<el-form-item label="设备地址" prop="slaveId">
-				<el-input v-model.number="temp.slaveId" placeholder="请输入设备地址" />
+			<el-form-item label="状态">
+				<el-switch
+					v-model="ruleForm.status"
+					inline-prompt
+					active-text="开"
+					inactive-text="关"
+					:active-value="1"
+					:inactive-value="0"
+					width="80"
+				/>
+			</el-form-item>
+			
+			<el-form-item label="备注">
+				<el-input type="textarea" v-model="ruleForm.remarks" placeholder="请输入备注信息" />
 			</el-form-item>
 		</el-form>
-		<div slot="footer" class="dialog-footer">
+		<template #footer>
 			<el-button @click="clsoeDialog()"> 取 消 </el-button>
-			<el-button type="primary" @click="createData()"> 保 存 </el-button>
-		</div>
+			<el-button :loading="btnLoading" type="primary" @click="submitData"> 保 存 </el-button>
+		</template>
 	</el-dialog>
 </template>
-<script lang="ts">
-import api from '/@/api/device/modbus';
+<script lang="ts" setup>
+import { computed, reactive, ref } from 'vue';
+import api from '/@/api/ice104/index';
+import { useI18n } from 'vue-i18n';
 import { ElMessage } from 'element-plus';
-export default {
-	data() {
-		return {
-			temp: {
-				title: '',
-				number: '',
-				templateNumber: '',
-				slaveId: '',
-				interval: '',
-			},
-			rules: {
-				title: [{ required: true, message: '请输入通道名称', trigger: 'blur' }],
-				number: [{ required: true, message: '请输入注册码', trigger: 'blur' }],
-				slaveId: [{ required: true, message: '请输入设备地址', trigger: 'blur' }],
-			},
-			dialogVisible: false,
-			listLoading: false,
-			templateOptions: [],
-		};
-	},
 
-	methods: {
-		open() {
-			// this.getList();
-			this.dialogVisible = true;
-		},
-		clsoeDialog() {
-			(this.$refs.dataForm as any).resetFields();
-			this.dialogVisible = false;
-		},
-		// 获取模板数据
-		getList() {
-			this.listLoading = true;
-			api.channel
-				.getList({ page: 1, size: 50 })
-				.then((data: any) => {
-					this.templateOptions = data.list || [];
-				})
-				.finally(() => {
-					this.listLoading = false;
-				});
-		},
-		createData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					api.channel.addDevice(this.temp).then(() => {
-						this.$emit('getList');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-	},
-};
+const dialogVisible = ref(false);
+const btnLoading = ref(false);
+const emit = defineEmits(['updateList']);
+const formRef = ref();
+const ruleForm = ref({
+	number: '',
+	title: '',
+	status: 1,
+	remarks: "",
+	mode: 0
+})
+const isEdit = ref(false);
+
+const formRules = computed(() => ({
+	number: [{ required: true, trigger: 'change', message: '请输入模版编码' }],
+}));
+
+const submitData = async () => {
+	formRef.value.validate((valid: boolean) => {
+		console.log(valid)
+		if (!valid) return
+		btnLoading.value = true
+		if (isEdit.value) {
+			// 修改
+			api.template.editItem({
+				...ruleForm.value,
+			})
+			.then(() => {
+				ElMessage({ type: 'success', message: '修改成功' })
+				emit('updateList')
+				closeDialog()
+			})
+			.finally(() => (btnLoading.value = false))
+		} else {
+			// 新增
+			api.template.addItem(ruleForm.value)
+			.then(() => {
+				ElMessage({ type: 'success', message: '添加成功' })
+				emit('updateList')
+				closeDialog()
+			})
+			.finally(() => (btnLoading.value = false))
+		}
+	})
+}
+
+/**
+ * 关闭弹窗
+ */
+const closeDialog = () => {
+  dialogVisible.value = false;
+  ruleForm.value = {
+	number: '',
+	title: '',
+	status: 1,
+	remarks: "",
+	mode: 0
+  }
+}
+
+
+const open = async (row: any) => {
+	dialogVisible.value = true
+	console.log(row)
+	if (row && row.number.toString()) {
+		console.log(row)
+		ruleForm.value = row;
+		isEdit.value = true;
+	}else {
+		isEdit.value = false;
+	}
+}
+
+defineExpose({ open })
 </script>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+.width100 {
+	width: 100%;
+}
+</style>

+ 0 - 139
src/views/iot/ice104/template/component/taskDialog.vue

@@ -1,139 +0,0 @@
-<template>
-	<el-dialog :title="textMap[dialogStatus]" v-model="dialogVisible" width="600px" :before-close="clsoeDialog" append-to-body :close-on-click-modal="false">
-		<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="120px" style="width: 400px; margin: 0 auto">
-			<el-form-item label="标题" prop="title">
-				<el-input v-model="temp.title" placeholder="请输入标题" />
-			</el-form-item>
-			<el-form-item label="调度周期" prop="interval">
-				<el-input v-model="temp.interval" placeholder="请输入调度周期" />
-			</el-form-item>
-			<el-form-item label="转发格式" prop="encoding">
-				<el-select v-model="temp.encoding" placeholder="请选择转发格式" style="width: 100%">
-					<el-option v-for="item in formatOptions" :key="item.value" :label="item.title" :value="item.value"> </el-option>
-				</el-select>
-				<!-- <el-input v-model="temp.encoding" placeholder="请输入转发格式"/> -->
-			</el-form-item>
-			<el-form-item label="mqtt主题" prop="publishTopic">
-				<el-input v-model="temp.publishTopic" placeholder="请输入mqtt主题" />
-			</el-form-item>
-			<el-form-item label="设备模板" prop="templateNumber">
-				<el-select v-model="temp.templateNumber" filterable placeholder="请选择设备模板" style="width: 100%">
-					<el-option v-for="item in templateOptions" :key="item.number" :label="item.title" :value="item.number"> </el-option>
-				</el-select>
-			</el-form-item>
-		</el-form>
-		<div slot="footer" class="dialog-footer">
-			<el-button @click="clsoeDialog"> 取 消 </el-button>
-			<el-button type="primary" @click="dialogStatus === 'create' ? createData() : updateData()"> 保 存 </el-button>
-		</div>
-	</el-dialog>
-</template>
-
-<script lang="ts">
-import api from '/@/api/device/modbus';
-import { ElMessage } from 'element-plus';
-
-export default {
-	components: {},
-	props: {
-		formatOptions: {
-			default: () => [],
-		},
-	},
-	data() {
-		return {
-			temp: {
-				title: '',
-				interval: '20s',
-				encoding: 'json',
-				publishTopic: '',
-				deviceNumber: '',
-				number: '',
-				templateNumber: '',
-			},
-			rules: {
-				title: [{ required: true, message: '请输入模板名称', trigger: 'change' }],
-				publishTopic: [{ required: true, message: '请输入mqtt主题', trigger: 'change' }],
-				mode: [{ required: true, message: '请选择模式', trigger: 'change' }],
-				templateNumber: [{ required: true, message: '请选择模式', trigger: 'change' }],
-			},
-			dialogVisible: false,
-			listLoading: false,
-			dialogStatus: '',
-			textMap: {
-				update: '任务详情',
-				create: '添加任务',
-			},
-			templateOptions: '',
-		};
-	},
-
-	methods: {
-		openDialog({ dialogStatus, row, deviceNumber }) {
-			this.dialogStatus = dialogStatus;
-			this.temp.deviceNumber = deviceNumber;
-			if (row) {
-				// this.temp = { ...row }
-				this.temp.number = row.Job.number;
-				this.temp.title = row.Job.title;
-				this.temp.interval = row.Job.interval;
-				this.temp.encoding = row.Job.encoding;
-				this.temp.publishTopic = row.Job.publishTopic;
-				this.temp.templateNumber = row?.Template?.number;
-			}
-			// this.getDict()
-			this.getTemplateList();
-			this.dialogVisible = true;
-		},
-		clsoeDialog() {
-			this.dialogVisible = false;
-			this.temp = {
-				title: '',
-				interval: '20s',
-				encoding: 'json',
-				publishTopic: '',
-				deviceNumber: '',
-				number: '',
-				templateNumber: '',
-			};
-			(this.$refs['dataForm'] as any).resetFields();
-		},
-		// 获取模板数据
-		getTemplateList() {
-			this.listLoading = true;
-			api.template
-				.getList({ page: 1, size: 50 })
-				.then((res: any) => {
-					this.templateOptions = res.list || [];
-				})
-				.finally(() => {
-					this.listLoading = false;
-				});
-		},
-		createData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					api.task.addDeviceJob(this.temp).then(() => {
-						this.$emit('finish');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-		updateData() {
-			(this.$refs['dataForm'] as any).validate((valid: boolean) => {
-				if (valid) {
-					api.task.editDeviceJob(this.temp).then(() => {
-						this.$emit('finish');
-						this.clsoeDialog();
-						ElMessage.success('操作成功!');
-					});
-				}
-			});
-		},
-	},
-};
-</script>
-
-<style lang="scss" scoped></style>

+ 6 - 12
src/views/iot/ice104/template/index.vue

@@ -27,7 +27,7 @@
 							</el-icon>
 							重置
 						</el-button>
-						<el-button type="primary" @click="addOrEdit()" v-auth="'add'">
+						<el-button type="primary" @click="addOrEdit()">
 							<el-icon>
 								<ele-FolderAdd />
 							</el-icon>
@@ -46,26 +46,23 @@
 						<el-tag type="info" size="small" v-if="scope.row.status == 0">停用</el-tag>
 					</template>
 				</el-table-column>
-				<!-- <el-table-column prop="mode" label="模式" align="center" show-overflow-tooltip></el-table-column> -->
 				<el-table-column prop="remarks" label="备注" align="center" show-overflow-tooltip></el-table-column>
 				<el-table-column fixed="right" label="操作" width="100" align="center">
 					<template #default="scope">
-						<el-button size="small" text type="primary" @click="viewDetail(scope.row)">编辑</el-button>
+						<el-button size="small" text type="primary" @click="addOrEdit(scope.row)">编辑</el-button>
 						<el-button size="small" text type="info" @click="onDel(scope.row)">删除</el-button>
 					</template>
 				</el-table-column>
 			</el-table>
 			<pagination v-if="params.total" :total="params.total" v-model:page="params.page" v-model:limit="params.size" @pagination="getList()" />
 		</el-card>
-		<EditForm ref="editFormRef" @getList="getList(1)"></EditForm>
-		<detailForm ref="detailFormRef" @getList="getList()"></detailForm>
+		<EditForm ref="editFormRef" @updateList="getList()"></EditForm>
 	</div>
 </template>
 
 <script lang="ts" setup>
 import { ref } from 'vue';
 import EditForm from './component/edit.vue';
-import detailForm from './component/detail.vue';
 import api from '/@/api/ice104/index';
 import { ElMessageBox, ElMessage } from 'element-plus';
 import { useSearch } from '/@/hooks/useCommonIce104';
@@ -81,14 +78,11 @@ getList();
 const addOrEdit = async (row?: any) => {
 	editFormRef.value.open(row);
 };
-const viewDetail = async (row: any) => {
-	detailFormRef.value.open(row);
-};
 
 // 重置表单
 const resetQuery = () => {
 	queryRef.value.resetFields();
-	getList(1);
+	getList();
 };
 
 const onDel = (row: any) => {
@@ -97,9 +91,9 @@ const onDel = (row: any) => {
 		cancelButtonText: '取消',
 		type: 'warning',
 	}).then(async () => {
-		await api.channel.deleteDevice({ number: row.number });
+		await api.template.deleteItem({ number: row.number });
 		ElMessage.success('删除成功');
-		getList(1);
+		getList();
 	});
 };
 </script>