diff --git a/src/views/rule-engine/Scene/Save/Device/AddModal.vue b/src/views/rule-engine/Scene/Save/Device/AddModal.vue
index 349266c3..2521b9a8 100644
--- a/src/views/rule-engine/Scene/Save/Device/AddModal.vue
+++ b/src/views/rule-engine/Scene/Save/Device/AddModal.vue
@@ -19,7 +19,12 @@
@@ -53,11 +59,11 @@ import { detail as deviceDetail } from '@/api/device/instance'
import Product from './Product.vue'
import DeviceSelect from './DeviceSelect.vue'
import Type from './Type.vue'
+import { continuousValue, timeUnitEnum } from '@/views/rule-engine/Scene/Save/components/Timer/util'
type Emit = {
(e: 'cancel'): void
- (e: 'update:value', data: TriggerDevice): void
- (e: 'update:options', data: any): void
+ (e: 'save', data: TriggerDevice, options: Record): void
}
interface AddModelType extends Omit {
@@ -65,8 +71,9 @@ interface AddModelType extends Omit {
deviceKeys: Array<{ label: string, value: string }>
orgId: Array<{ label: string, value: string }>
productDetail: any
- selectorValues: Array<{ label: string, value: string }>
- metadata: metadataType
+ selectorValues: Array>
+ metadata: metadataType,
+ operator: TriggerDeviceOptions
}
const emit = defineEmits()
@@ -82,7 +89,7 @@ const props = defineProps({
})
},
options: {
- type: Object as PropType,
+ type: Object as PropType>,
default: () => ({})
}
})
@@ -95,13 +102,106 @@ const addModel = reactive({
deviceKeys: [],
orgId: [],
productDetail: {},
- metadata: {}
+ metadata: {},
+ operator: {
+ operator: 'online'
+ }
})
+const optionsCache = ref(props.options)
+
Object.assign(addModel, props.value)
const handleOptions = (data: TriggerDeviceOptions) => {
+ const typeIconMap = {
+ writeProperty: 'icon-bianji1',
+ invokeFunction: 'icon-widgets',
+ reportEvent: 'icon-shijian',
+ readProperty: 'icon-Group',
+ };
+ const _options: any = {
+ name: '', // 名称
+ extraName: '', // 拓展参数
+ onlyName: false,
+ type: '', // 触发类型
+ typeIcon: typeIconMap[data.operator],
+ productName: '',
+ selectorIcon: '',
+ time: undefined,
+ when: undefined,
+ extraTime: undefined,
+ action: optionsCache.value?.action,
+ };
+
+ if (addModel.selector === 'fixed') {
+ let isLimit = false;
+ let indexOf = 0;
+ const nameStr = addModel.selectorValues!.reduce((_prev, next, index) => {
+ if (_prev.length <= 30) {
+ indexOf = index;
+ return index === 0 ? next.name : _prev + '、' + next.name;
+ } else {
+ isLimit = true;
+ }
+ return _prev;
+ }, '');
+ // _options.name = TriggerDeviceModel.selectorValues?.map((item) => item.name).join('、');
+ _options.name = nameStr;
+ if (isLimit && addModel.selectorValues!.length > indexOf) {
+ _options.extraName = `等${addModel.selectorValues!.length}台设备`;
+ }
+ _options.selectorIcon = 'icon-shebei1';
+ } else if (addModel.selector === 'org') {
+ _options.name = addModel.selectorValues?.[0].name + '的';
+ _options.productName = addModel.productDetail.name; // 产品名称
+ _options.selectorIcon = 'icon-zuzhi';
+ } else {
+ _options.name = '所有的' + addModel.productDetail.name;
+ }
+
+ if (data.timer) {
+ const _timer = data.timer;
+ if (_timer.trigger === 'cron') {
+ _options.time = _timer.cron;
+ } else {
+ // console.log('continuousValue', continuousValue(_timer.when! || [], _timer!.trigger))
+ let whenStr = '每天';
+ if (_timer.when!.length) {
+ whenStr = _timer!.trigger === 'week' ? '每周' : '每月';
+ const whenStrArr = continuousValue(_timer.when! || [], _timer!.trigger);
+ const whenStrArr3 = whenStrArr.splice(0, 3);
+ whenStr += whenStrArr3.join('、');
+ whenStr += `等${_timer.when!.length}天`;
+ }
+ _options.when = whenStr;
+ if (_timer.once) {
+ _options.time = _timer.once.time + ' 执行1次';
+ } else if (_timer.period) {
+ _options.time = _timer.period.from + '-' + _timer.period.to;
+ _options.extraTime = `每${_timer.period.every}${timeUnitEnum[_timer.period.unit]}执行1次`;
+ }
+ }
+
+ if (data.operator === 'online') {
+ _options.type = '上线';
+ _options.action = '';
+ _options.typeIcon = 'icon-a-Group4713';
+ }
+
+ if (data.operator === 'offline') {
+ _options.type = '离线';
+ _options.action = '';
+ _options.typeIcon = 'icon-a-Group4892';
+ }
+
+ if (data.operator === 'reportProperty') {
+ _options.type = '属性上报';
+ _options.action = '';
+ _options.typeIcon = 'icon-file-upload-outline';
+ }
+ return _options;
+ }
}
const prev = () => {
@@ -120,6 +220,16 @@ const handleMetadata = (metadata?: string) => {
}
}
+const productChange = () => {
+ addModel.deviceKeys = []
+ addModel.orgId = []
+ addModel.selector = 'fixed'
+ addModel.operator = {
+ operator: 'online'
+ }
+ addModel.selectorValues = []
+}
+
const save = async (step?: number) => {
let _step = step !== undefined ? step : addModel.stepNumber
if (_step === 0) {
@@ -139,9 +249,16 @@ const save = async (step?: number) => {
addModel.stepNumber = 2
} else {
const typeData = await typeRef.value.vail()
- console.log(typeData)
if (typeData) {
- const _options = handleOptions(typeData);
+ optionsCache.value.action = typeData.action
+ const _options = handleOptions(typeData.data);
+ const data = {
+ operator: typeData.data,
+ selector: addModel.selector,
+ selectorValues: addModel.selectorValues,
+ productId: addModel.productId
+ }
+ emit('save', data, _options)
}
}
}
diff --git a/src/views/rule-engine/Scene/Save/Device/Product.vue b/src/views/rule-engine/Scene/Save/Device/Product.vue
index 7da92fdb..d8674a09 100644
--- a/src/views/rule-engine/Scene/Save/Device/Product.vue
+++ b/src/views/rule-engine/Scene/Save/Device/Product.vue
@@ -66,6 +66,7 @@ import { getImage } from '@/utils/comm'
type Emit = {
(e: 'update:rowKey', data: string): void
(e: 'update:detail', data: string): void
+ (e: 'change', data: string): void
}
const actionRef = ref()
@@ -246,6 +247,7 @@ const productQuery = (p: any) => {
const handleClick = (detail: any) => {
emit('update:rowKey', detail.id)
emit('update:detail', detail)
+ emit('change', detail)
}
diff --git a/src/views/rule-engine/Scene/Save/Device/Type.vue b/src/views/rule-engine/Scene/Save/Device/Type.vue
index 2f3a7096..fef6b620 100644
--- a/src/views/rule-engine/Scene/Save/Device/Type.vue
+++ b/src/views/rule-engine/Scene/Save/Device/Type.vue
@@ -57,7 +57,7 @@
import { filterSelectNode } from '@/utils/comm'
import { TopCard, Timer } from '@/views/rule-engine/Scene/Save/components'
import { getImage } from '@/utils/comm'
-import { metadataType } from '@/views/rule-engine/Scene/typings'
+import type { metadataType, TriggerDeviceOptions } from '@/views/rule-engine/Scene/typings'
import type { PropType } from 'vue'
import { TypeEnum } from '@/views/rule-engine/Scene/Save/Device/util'
import ReadProperties from './ReadProperties.vue'
@@ -70,6 +70,10 @@ const props = defineProps({
metadata: {
type: Object as PropType,
default: () => ({})
+ },
+ operator: {
+ type: Object as PropType,
+ default: () => ({})
}
})
@@ -83,6 +87,8 @@ const formModel = reactive({
functionParameters: []
})
+Object.assign(formModel, props.operator)
+
const optionCache = reactive({
action: ''
})
@@ -222,7 +228,7 @@ defineExpose({
filterKey.push('writeProperties')
}
- resolve(omit(cloneModel, filterKey))
+ resolve({ data: omit(cloneModel, filterKey), action: optionCache.action })
})
}
})
diff --git a/src/views/rule-engine/Scene/Save/Device/index.vue b/src/views/rule-engine/Scene/Save/Device/index.vue
index 96413d17..7f233e0b 100644
--- a/src/views/rule-engine/Scene/Save/Device/index.vue
+++ b/src/views/rule-engine/Scene/Save/Device/index.vue
@@ -14,7 +14,7 @@
-
+
@@ -24,9 +24,10 @@ import { useSceneStore } from '@/store/scene'
import AddModel from './AddModal.vue'
import AddButton from '../components/AddButton.vue'
import Title from '../components/Title.vue'
+import type { TriggerDevice } from '@/views/rule-engine/Scene/typings'
const sceneStore = useSceneStore()
-const { data } = storeToRefs(sceneStore)
+const { data } = storeToRefs(sceneStore)
const visible = ref(false)
@@ -39,6 +40,11 @@ const rules = [{
},
}]
+const save = (device: TriggerDevice, options: Record) => {
+ data.value.trigger!.device = device
+ data.value.options!.trigger = options
+}
+