Sfoglia il codice sorgente

完成场景开发,进入代码优化

yukai 2 anni fa
parent
commit
034adfc810

+ 0 - 2
src/views/iot/scene/manage/component/actionItem.vue

@@ -78,7 +78,6 @@ const getOneDetail = () => {
 				}
 
        	originalSceneList.value = res;
-        console.log(res);
         const combinedArray = res.map(scene => {
           const parsedBodyJson = JSON.parse(scene.bodyjson);
           if (Array.isArray(parsedBodyJson)) {
@@ -95,7 +94,6 @@ const getOneDetail = () => {
             };
           }
         });
-      console.log(combinedArray,3333);
 
         actionList.value=combinedArray;
 			})

+ 1 - 1
src/views/iot/scene/manage/component/sceneItem.vue

@@ -53,7 +53,7 @@
         <div class="icon"></div> 触发条件 <div class="ml10"> <el-switch v-model="item.triggerSwitch"   @change="EditPen(index)"/>
         </div>
       </div>
-      <Condition :condition="item.condition" :operate_index="index" :columnList="columnList" v-if="item.triggerSwitch" @EditPen="EditPen">
+      <Condition :condition="item.condition" :operate_index="index" :columnList="columnList" v-if="item.triggerSwitch && columnList.length>0" @EditPen="EditPen">
       </Condition>
     </div>
     <div>

+ 80 - 19
src/views/iot/scene/manage/detail.vue

@@ -14,11 +14,23 @@
 			</div>
 		</div>
 	</el-card>
-	<el-card style="  margin-top: 15px;">
+	<el-card style="  margin-top: 15px;" v-if="detail.sceneType==='device'">
 		<div class="font20">场景定义</div>
 		<SceneItem v-if="showstatus && sourceData.length>0" :sceneList="sceneList" :sourceData="sourceData" :sceneType="detail.sceneType" @addScenesDetail="addScenesDetail"
 			@delScenesDetail="delScenesDetail" @editScenesDetail="editScenesDetail"></SceneItem>
 	</el-card>
+	<el-card style="  margin-top: 15px;" v-if="detail.sceneType==='timer'">
+		<el-form-item label="定时触发">
+          <div style="display:flex">
+            <el-input v-model="timerData.timer" placeholder="请输入cron表达式" />
+            <el-dialog v-model="dialogVisible" title="选择Cron规则" width="60%">
+              <vue3cron @handlelisten="handlelisten"  @close="cronclose"></vue3cron>
+            </el-dialog>
+            <el-button type="success" @click="showCron()" style="margin-left: 5px;">设置</el-button>
+
+          </div>
+        </el-form-item>
+	</el-card>
 	<el-card style="  margin-top: 15px;">
 		<div class="font20">场景动作</div>
 		<ActionItem v-if="detail.id" :scene_id="detail.id"  :sourceData="sourceData"></ActionItem>
@@ -35,6 +47,9 @@ import SceneItem from './component/sceneItem.vue';
 import EditForm from './edit.vue';
 import api from '/@/api/scene';
 import product from '/@/api/device';
+import vue3cron from '/@/components/vue3cron/vue3cron.vue';
+import { stat } from 'fs';
+
 
 const editFormRef = ref();
 //原始
@@ -55,14 +70,21 @@ const originalSceneList = ref([{
 	id: 0
 }]);
 export default defineComponent({
-	components: { EditPen, EditForm, DocumentAdd, SceneItem, ActionItem },
+	components: { EditPen, EditForm, DocumentAdd, SceneItem, ActionItem,vue3cron},
 	setup(props, context) {
 		const route = useRoute();
 		const router = useRouter();
 		const state = reactive({
+			timer:'',
+			timer_id:0,
+			dialogVisible:false,
 			developer_status: 2,
 			showstatus: false,
 			sourceData: [],
+			timerData: {
+					triggerType:'timer',
+					timer:'',
+				},
 			detail: {
 				id: '',
 				name: '',
@@ -93,13 +115,25 @@ export default defineComponent({
 			}],
 
 		});
+
+		const handlelisten = (e: any) => {
+			state.timerData.timer=e.cron
+			api.manage.editDetail({ id: state.timer_id, bodyjson: state.timerData })
+		};
+		const showCron = () => {
+			state.dialogVisible = true;
+		};
+		const cronclose = () => {
+			state.dialogVisible = false;
+		}
 		const activeName = ref('first')
 		const getDetail = () => {
 			const id = route.params && route.params.id;
 			api.manage.getDetail({ "id": id }).then((res: any) => {
 				state.detail = res
+				getOneDetail();
+
 			})
-			getOneDetail();
 		};
 		const getProductList = () => {
 			product.product.getSubList().then((res: any) => {
@@ -108,24 +142,48 @@ export default defineComponent({
 		};
 
 		const getOneDetail = () => {
+
 			const id = route.params && route.params.id;
+			if(state.detail.sceneType==='device'){
+				api.manage.getOneDetail({ "sceneId": id, 'group': 'definition' }).then((res: any) => {
+					if (!res) {
+						addScenesDetail('definition');
+						// getOneDetail();
+					}
+					originalSceneList.value = res;
+					const scenes = res.map((scene: any) => {
+						const parsedBodyJson = JSON.parse(scene.bodyjson);
+						return {
+							...parsedBodyJson
+						};
+					});
+					getProductList();
+					state.sceneList = scenes;
+					state.showstatus = true;
+				})
+			}
+			//定时触发
+			if(state.detail.sceneType=='timer'){
+				api.manage.getOneDetail({ "sceneId": id, 'group': 'timer' }).then((res: any) => {
+					if (!res) {
+						let data = {
+							sceneId: id,
+							group: 'timer',
+							bodyjson:state.timerData,
+						}
+						api.manage.addDetail(data).then((res: any) => {
+							getOneDetail();
+						});
+					}
+					state.timer_id=res[0].id
+					state.timerData=JSON.parse(res[0].bodyjson);
+
+				})
+			}
+
+
+
 
-			api.manage.getOneDetail({ "sceneId": id, 'group': 'definition' }).then((res: any) => {
-				if (!res) {
-					addScenesDetail('definition');
-					// getOneDetail();
-				}
-				originalSceneList.value = res;
-				const scenes = res.map((scene: any) => {
-					const parsedBodyJson = JSON.parse(scene.bodyjson);
-					return {
-						...parsedBodyJson
-					};
-				});
-				getProductList();
-				state.sceneList = scenes;
-				state.showstatus = true;
-			})
 		};
 		//新增一条场景定义
 		const addScenesDetail = (type: String) => {
@@ -164,6 +222,9 @@ export default defineComponent({
 			getDetail();
 		});
 		return {
+			cronclose,
+			showCron,
+			handlelisten,
 			addOrEdit,
 			delScenesDetail,
 			addScenesDetail,

+ 14 - 12
src/views/iot/scene/manage/index.vue

@@ -2,12 +2,22 @@
 	<el-card shadow="hover">
 		<div class="search">
 			<el-form :inline="true" ref="queryRef">
-				<el-form-item label="场景名称:" prop="name">
-					<el-input v-model="params.keyWord" placeholder="请输入产品名称" clearable size="default" style="width: 240px"
+				<el-form-item label="场景名称:" prop="keyWord">
+					<el-input v-model="params.keyWord" placeholder="请输入场景名称" clearable size="default" style="width: 240px"
 						@keyup.enter.native="getList" />
 				</el-form-item>
+		
+				<el-form-item label="触发方式" prop="sceneType" style="width: 200px;">
+					<el-select v-model="params.sceneType" placeholder="触发方式" clearable size="default" style="width: 240px">
+						<el-option label="设备触发" value="device" />
+						<el-option label="手动触发" value="manual" />
+						<el-option label="定时触发" value="timer" />
+					</el-select>
+				</el-form-item>
+
 				<el-form-item label="运行状态" prop="status" style="width: 200px;">
 					<el-select v-model="params.status" placeholder="运行状态" clearable size="default" style="width: 240px">
+						<el-option label="全部" :value="-1" />
 						<el-option label="启用" :value="1" />
 						<el-option label="禁用" :value="0" />
 					</el-select>
@@ -103,14 +113,9 @@ function getTokenUrl(url: string) {
 	return getOrigin(tokenUrl + url)
 }
 
-const view = (row: any) => {
-	const url = getTokenUrl('#/show/' + row.id);
-	window.open(url);
-};
 
 const addOrEdit = async (row?: any) => {
-	// const url = getTokenUrl('#/editor/new');
-	// window.open(url);
+
 	if (row) {
 		editFormRef.value.open(row);
 		return;
@@ -119,10 +124,7 @@ const addOrEdit = async (row?: any) => {
 	}
 };
 
-const edit = (row: any) => {
-	const url = getTokenUrl('#/editor/' + row.id);
-	window.open(url);
-};
+
 const onActionStatus = (item: any) => {
 	if (item.status == 0) {
 		api.manage.status({ id: item.id,status:1 }).then((res: any) => {