Commit bb196132c56438571dd5659866e1178e8c18e1f5
Merge branch 'sqy_dev' into 'main'
'feat:更新场景联动' See merge request huang/yun-teng-iot-front!171
Showing
14 changed files
with
1610 additions
and
879 deletions
| @@ -2,7 +2,6 @@ import { defHttp } from '/@/utils/http/axios'; | @@ -2,7 +2,6 @@ import { defHttp } from '/@/utils/http/axios'; | ||
| 2 | import { | 2 | import { |
| 3 | // ScreenParamModel, | 3 | // ScreenParamModel, |
| 4 | ScreenAddModel, | 4 | ScreenAddModel, |
| 5 | - ScreenUpdateModel, | ||
| 6 | ScreenLinkPageQueryParam, | 5 | ScreenLinkPageQueryParam, |
| 7 | ScreenByDeptIdParams, | 6 | ScreenByDeptIdParams, |
| 8 | IChangeStatus, | 7 | IChangeStatus, |
| @@ -19,7 +18,8 @@ enum ScreenManagerApi { | @@ -19,7 +18,8 @@ enum ScreenManagerApi { | ||
| 19 | SCREEN_ORGANIZATION_URL = '/organization/me/list', | 18 | SCREEN_ORGANIZATION_URL = '/organization/me/list', |
| 20 | SCREEN_CHANGE_STATUS = '/convert/update/scene', | 19 | SCREEN_CHANGE_STATUS = '/convert/update/scene', |
| 21 | SCREEN_GET_BY_DEPTID = '/sceneLinkage/device/', | 20 | SCREEN_GET_BY_DEPTID = '/sceneLinkage/device/', |
| 22 | - SCREEN_BYDEVICEID_GET_ATTRBUTELIST = '/plugins/telemetry/', | 21 | + GET_ATTRBUTELIST = '/deviceProfile/devices/keys/timeseries', |
| 22 | + ALARM_PROFILE = '/alarm/profile/', | ||
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | /** | 25 | /** |
| @@ -78,7 +78,7 @@ export const screenLinkPagePutApi = (params: IChangeStatus) => | @@ -78,7 +78,7 @@ export const screenLinkPagePutApi = (params: IChangeStatus) => | ||
| 78 | }); | 78 | }); |
| 79 | 79 | ||
| 80 | /** | 80 | /** |
| 81 | - * 根据部门id获取设备列表 | 81 | + * 根据组织获取设备列表 |
| 82 | */ | 82 | */ |
| 83 | export const screenLinkPageByDeptIdGetDevice = (params: ScreenByDeptIdParams) => { | 83 | export const screenLinkPageByDeptIdGetDevice = (params: ScreenByDeptIdParams) => { |
| 84 | return defHttp.get({ | 84 | return defHttp.get({ |
| @@ -88,20 +88,21 @@ export const screenLinkPageByDeptIdGetDevice = (params: ScreenByDeptIdParams) => | @@ -88,20 +88,21 @@ export const screenLinkPageByDeptIdGetDevice = (params: ScreenByDeptIdParams) => | ||
| 88 | }; | 88 | }; |
| 89 | 89 | ||
| 90 | /** | 90 | /** |
| 91 | - * 根据设备id获取属性列表 | 91 | + * 获取住址下的告警配置 |
| 92 | */ | 92 | */ |
| 93 | -export const screenLinkPageByDeviceIdGetAttribut = (entityType, entityId) => { | 93 | +export const getOrganizationAlarmConfig = (params: { organizationId }) => { |
| 94 | + return defHttp.get({ | ||
| 95 | + url: ScreenManagerApi.ALARM_PROFILE + params.organizationId, | ||
| 96 | + }); | ||
| 97 | +}; | ||
| 98 | + | ||
| 99 | +/** | ||
| 100 | + * 获取设备属性列表 | ||
| 101 | + */ | ||
| 102 | +export const getAttribute = () => { | ||
| 94 | return defHttp.get( | 103 | return defHttp.get( |
| 95 | { | 104 | { |
| 96 | - url: | ||
| 97 | - ScreenManagerApi.SCREEN_BYDEVICEID_GET_ATTRBUTELIST + | ||
| 98 | - `${entityType}` + | ||
| 99 | - '/' + | ||
| 100 | - `${entityId}` + | ||
| 101 | - '/' + | ||
| 102 | - 'keys' + | ||
| 103 | - '/' + | ||
| 104 | - 'timeseries', | 105 | + url: ScreenManagerApi.GET_ATTRBUTELIST, |
| 105 | }, | 106 | }, |
| 106 | { | 107 | { |
| 107 | joinPrefix: false, | 108 | joinPrefix: false, |
| @@ -58,6 +58,7 @@ | @@ -58,6 +58,7 @@ | ||
| 58 | */ | 58 | */ |
| 59 | lazyTime: { type: Number, default: 0 }, | 59 | lazyTime: { type: Number, default: 0 }, |
| 60 | }); | 60 | }); |
| 61 | + const emit = defineEmits(['expand']); | ||
| 61 | 62 | ||
| 62 | const show = ref(true); | 63 | const show = ref(true); |
| 63 | 64 | ||
| @@ -72,7 +73,12 @@ | @@ -72,7 +73,12 @@ | ||
| 72 | // 200 milliseconds here is because the expansion has animation, | 73 | // 200 milliseconds here is because the expansion has animation, |
| 73 | useTimeoutFn(triggerWindowResize, 200); | 74 | useTimeoutFn(triggerWindowResize, 200); |
| 74 | } | 75 | } |
| 76 | + emit('expand', show.value); | ||
| 75 | } | 77 | } |
| 78 | + defineExpose({ | ||
| 79 | + handleExpand, | ||
| 80 | + show, | ||
| 81 | + }); | ||
| 76 | </script> | 82 | </script> |
| 77 | <style lang="less"> | 83 | <style lang="less"> |
| 78 | @prefix-cls: ~'@{namespace}-collapse-container'; | 84 | @prefix-cls: ~'@{namespace}-collapse-container'; |
src/enums/operationEnum.ts
0 → 100644
| 1 | +/** | ||
| 2 | + * 运算符枚举值 | ||
| 3 | + */ | ||
| 4 | + | ||
| 5 | +// 数字运算符或者时间运算符 | ||
| 6 | +export enum Number_Operation { | ||
| 7 | + EQUAL = 'EQUAL', | ||
| 8 | + NOT_EQUAL = 'NOT_EQUAL', | ||
| 9 | + LESS = 'LESS', | ||
| 10 | + LESS_OR_EQUAL = 'LESS_OR_EQUAL', | ||
| 11 | + GREATER = 'GREATER', | ||
| 12 | + GREATER_OR_EQUAL = 'GREATER_OR_EQUAL', | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +export enum String_Operation { | ||
| 16 | + EQUAL = 'EQUAL', | ||
| 17 | + NOT_EQUAL = 'NOT_EQUAL', | ||
| 18 | + BEGAN_IN = 'BEGAN_IN', | ||
| 19 | + END_IN = 'END_IN', | ||
| 20 | + INCLUDE = 'INCLUDE', | ||
| 21 | + NOT_INCLUDE = 'NOT_INCLUDE', | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +export enum Boolean_Operation { | ||
| 25 | + EQUAL = 'EQUAL', | ||
| 26 | + NOT_EQUAL = 'NOT_EQUAL', | ||
| 27 | +} |
| @@ -31,6 +31,7 @@ interface UserState { | @@ -31,6 +31,7 @@ interface UserState { | ||
| 31 | lastUpdateTime: number; | 31 | lastUpdateTime: number; |
| 32 | jwtToken?: string; | 32 | jwtToken?: string; |
| 33 | refreshToken?: string; | 33 | refreshToken?: string; |
| 34 | + outTarget?: string; | ||
| 34 | } | 35 | } |
| 35 | 36 | ||
| 36 | const storage = createLocalStorage(); | 37 | const storage = createLocalStorage(); |
| @@ -40,6 +41,7 @@ export const useUserStore = defineStore({ | @@ -40,6 +41,7 @@ export const useUserStore = defineStore({ | ||
| 40 | //平台信息 | 41 | //平台信息 |
| 41 | platInfo: storage.get('platformInfo') || null, | 42 | platInfo: storage.get('platformInfo') || null, |
| 42 | enterPriseInfo: storage.get('enterPriseInfo') || null, | 43 | enterPriseInfo: storage.get('enterPriseInfo') || null, |
| 44 | + outTarget: 'DEVICE_OUT', | ||
| 43 | // user info | 45 | // user info |
| 44 | userInfo: null, | 46 | userInfo: null, |
| 45 | userUpdateInfo: null, | 47 | userUpdateInfo: null, |
| @@ -62,6 +64,9 @@ export const useUserStore = defineStore({ | @@ -62,6 +64,9 @@ export const useUserStore = defineStore({ | ||
| 62 | getUserInfo(): UserInfo { | 64 | getUserInfo(): UserInfo { |
| 63 | return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {}; | 65 | return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {}; |
| 64 | }, | 66 | }, |
| 67 | + getOutTarget(): any { | ||
| 68 | + return this.outTarget; | ||
| 69 | + }, | ||
| 65 | getUserUpdateInfo(): UserUpdateInfo { | 70 | getUserUpdateInfo(): UserUpdateInfo { |
| 66 | return this.userUpdateInfo || {}; | 71 | return this.userUpdateInfo || {}; |
| 67 | }, | 72 | }, |
| @@ -88,6 +93,9 @@ export const useUserStore = defineStore({ | @@ -88,6 +93,9 @@ export const useUserStore = defineStore({ | ||
| 88 | setEnterPriseInfo(enterPriseInfo: any) { | 93 | setEnterPriseInfo(enterPriseInfo: any) { |
| 89 | this.enterPriseInfo = enterPriseInfo; | 94 | this.enterPriseInfo = enterPriseInfo; |
| 90 | }, | 95 | }, |
| 96 | + setOutTarget(outTarget) { | ||
| 97 | + this.outTarget = outTarget; | ||
| 98 | + }, | ||
| 91 | storeToken(jwtToken: string, refreshToken: string) { | 99 | storeToken(jwtToken: string, refreshToken: string) { |
| 92 | this.jwtToken = jwtToken; | 100 | this.jwtToken = jwtToken; |
| 93 | this.refreshToken = refreshToken; | 101 | this.refreshToken = refreshToken; |
| @@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
| 4 | v-bind="$attrs" | 4 | v-bind="$attrs" |
| 5 | @register="registerDrawer" | 5 | @register="registerDrawer" |
| 6 | @ok="handleSubmit" | 6 | @ok="handleSubmit" |
| 7 | - width="50vw" | 7 | + width="100%" |
| 8 | showFooter | 8 | showFooter |
| 9 | @close="handleClose" | 9 | @close="handleClose" |
| 10 | :title="title" | 10 | :title="title" |
| @@ -14,6 +14,7 @@ | @@ -14,6 +14,7 @@ | ||
| 14 | <BasicForm @register="registerForm" /> | 14 | <BasicForm @register="registerForm" /> |
| 15 | <!-- 基础表单 --> | 15 | <!-- 基础表单 --> |
| 16 | <!-- 触发器-begin --> | 16 | <!-- 触发器-begin --> |
| 17 | + <Divider orientation="left">触发器</Divider> | ||
| 17 | <div> | 18 | <div> |
| 18 | <template v-for="(item, index) in triggerData" :key="item"> | 19 | <template v-for="(item, index) in triggerData" :key="item"> |
| 19 | <Trigger | 20 | <Trigger |
| @@ -25,13 +26,15 @@ | @@ -25,13 +26,15 @@ | ||
| 25 | </template> | 26 | </template> |
| 26 | <!-- 按钮 --> | 27 | <!-- 按钮 --> |
| 27 | <a-button type="primary" class="mt-4" @click="addTrigger" v-if="isView"> | 28 | <a-button type="primary" class="mt-4" @click="addTrigger" v-if="isView"> |
| 28 | - 添加触发器</a-button | 29 | + <PlusOutlined /> |
| 30 | + 新增触发器</a-button | ||
| 29 | > | 31 | > |
| 30 | <!-- 按钮 --> | 32 | <!-- 按钮 --> |
| 31 | </div> | 33 | </div> |
| 32 | <!-- 触发器-end --> | 34 | <!-- 触发器-end --> |
| 33 | 35 | ||
| 34 | <!-- 执行条件-begin --> | 36 | <!-- 执行条件-begin --> |
| 37 | + <Divider orientation="left">执行条件</Divider> | ||
| 35 | <div> | 38 | <div> |
| 36 | <template v-for="(item, index) in conditionData" :key="item"> | 39 | <template v-for="(item, index) in conditionData" :key="item"> |
| 37 | <Condition | 40 | <Condition |
| @@ -43,13 +46,15 @@ | @@ -43,13 +46,15 @@ | ||
| 43 | </template> | 46 | </template> |
| 44 | <!-- 按钮 --> | 47 | <!-- 按钮 --> |
| 45 | <a-button type="primary" class="mt-4" @click="addCondition" v-if="isView"> | 48 | <a-button type="primary" class="mt-4" @click="addCondition" v-if="isView"> |
| 46 | - 添加执行条件</a-button | 49 | + <PlusOutlined /> |
| 50 | + 新增执行条件</a-button | ||
| 47 | > | 51 | > |
| 48 | <!-- 按钮 --> | 52 | <!-- 按钮 --> |
| 49 | </div> | 53 | </div> |
| 50 | <!-- 执行条件-end --> | 54 | <!-- 执行条件-end --> |
| 51 | 55 | ||
| 52 | <!-- 执行动作-begin --> | 56 | <!-- 执行动作-begin --> |
| 57 | + <Divider orientation="left">执行动作</Divider> | ||
| 53 | <div> | 58 | <div> |
| 54 | <template v-for="(item, index) in actionData" :key="item"> | 59 | <template v-for="(item, index) in actionData" :key="item"> |
| 55 | <Action | 60 | <Action |
| @@ -60,10 +65,10 @@ | @@ -60,10 +65,10 @@ | ||
| 60 | @deleteAction="deleteAction" | 65 | @deleteAction="deleteAction" |
| 61 | /> | 66 | /> |
| 62 | </template> | 67 | </template> |
| 63 | - | ||
| 64 | <!-- 按钮 --> | 68 | <!-- 按钮 --> |
| 65 | <a-button type="primary" class="mt-4" @click="addAction" v-if="isView"> | 69 | <a-button type="primary" class="mt-4" @click="addAction" v-if="isView"> |
| 66 | - 添加执行动作</a-button | 70 | + <PlusOutlined /> |
| 71 | + 新增执行动作</a-button | ||
| 67 | > | 72 | > |
| 68 | <!-- 按钮 --> | 73 | <!-- 按钮 --> |
| 69 | </div> | 74 | </div> |
| @@ -72,287 +77,274 @@ | @@ -72,287 +77,274 @@ | ||
| 72 | </BasicDrawer> | 77 | </BasicDrawer> |
| 73 | </div> | 78 | </div> |
| 74 | </template> | 79 | </template> |
| 75 | -<script lang="ts"> | ||
| 76 | - import { defineComponent, ref, watch, unref, computed, nextTick } from 'vue'; | 80 | +<script lang="ts" setup> |
| 81 | + import { ref, watch, unref, computed, nextTick } from 'vue'; | ||
| 77 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | 82 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
| 78 | import { formSchema, organizationId } from './config'; | 83 | import { formSchema, organizationId } from './config'; |
| 79 | import { BasicForm, useForm } from '/@/components/Form'; | 84 | import { BasicForm, useForm } from '/@/components/Form'; |
| 80 | - import { formatTriggerData, formatConditionData } from './cpns/format-data'; | 85 | + import { genTriggerData, genConditionData, genActionData } from './cpns/format-data'; |
| 86 | + import { Divider } from 'ant-design-vue'; | ||
| 87 | + import { PlusOutlined } from '@ant-design/icons-vue'; | ||
| 81 | import { useMessage } from '/@/hooks/web/useMessage'; | 88 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 82 | import { | 89 | import { |
| 83 | screenLinkPageAddApi, | 90 | screenLinkPageAddApi, |
| 84 | screenLinkPageByDeptIdGetDevice, | 91 | screenLinkPageByDeptIdGetDevice, |
| 92 | + getOrganizationAlarmConfig, | ||
| 85 | } from '/@/api/ruleengine/ruleengineApi'; | 93 | } from '/@/api/ruleengine/ruleengineApi'; |
| 86 | import Trigger from './cpns/Trigger.vue'; | 94 | import Trigger from './cpns/Trigger.vue'; |
| 87 | import Condition from './cpns/Condition.vue'; | 95 | import Condition from './cpns/Condition.vue'; |
| 88 | import Action from './cpns/Action.vue'; | 96 | import Action from './cpns/Action.vue'; |
| 89 | - export default defineComponent({ | ||
| 90 | - name: 'SceneLinkAgeDrawer', | ||
| 91 | - components: { | ||
| 92 | - BasicDrawer, | ||
| 93 | - BasicForm, | ||
| 94 | - Trigger, | ||
| 95 | - Condition, | ||
| 96 | - Action, | ||
| 97 | - }, | ||
| 98 | - emits: ['register', 'success'], | ||
| 99 | - setup(_, { emit }) { | ||
| 100 | - const { createMessage } = useMessage(); | ||
| 101 | - const triggerData = ref([]); | ||
| 102 | - const conditionData = ref([]); | ||
| 103 | - const actionData = ref([]); | ||
| 104 | - const skipUnwrap = { | ||
| 105 | - triggerItemRefs: ref([]), | ||
| 106 | - conditionItemRefs: ref([]), | ||
| 107 | - actionItemRefs: ref([]), | ||
| 108 | - }; | ||
| 109 | - const title = computed( | ||
| 110 | - () => `${isUpdate.value === 3 ? '查看' : isUpdate.value ? '编辑' : '新增'}场景联动` | ||
| 111 | - ); | ||
| 112 | - let getTriggerFormValue = ref([]); | ||
| 113 | - let getConditionFormValue = ref([]); | ||
| 114 | - let getActionFormValue = ref([]); | ||
| 115 | - const editEntryIdData = ref([]); | ||
| 116 | - const isUpdate = ref(false); | ||
| 117 | - const id = ref(undefined); | ||
| 118 | - const tenantId = ref(undefined); | ||
| 119 | - const isView = ref(true); | ||
| 120 | - const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({ | ||
| 121 | - labelWidth: 120, | ||
| 122 | - schemas: formSchema, | ||
| 123 | - showActionButtonGroup: false, | ||
| 124 | - }); | ||
| 125 | - const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | ||
| 126 | - setDrawerProps({ confirmLoading: false, loading: true }); | ||
| 127 | - isUpdate.value = data.isUpdate; | 97 | + import { useUserStore } from '/@/store/modules/user'; |
| 128 | 98 | ||
| 129 | - if (!unref(isUpdate)) { | ||
| 130 | - resetFields(); | ||
| 131 | - //初始化执行动作 | ||
| 132 | - actionData.value = [Date.now()]; | ||
| 133 | - } else { | ||
| 134 | - // 取值 | ||
| 135 | - const { | ||
| 136 | - id: recordId, | ||
| 137 | - tenantId: recordTenantId, | ||
| 138 | - organizationId, | ||
| 139 | - triggers, | ||
| 140 | - doConditions, | ||
| 141 | - doActions, | ||
| 142 | - } = data.record; | ||
| 143 | - // 赋值 | ||
| 144 | - await setFieldsValue(data.record); | ||
| 145 | - id.value = recordId; | ||
| 146 | - tenantId.value = recordTenantId; | ||
| 147 | - // 获取当前组织下的设备列表 | ||
| 148 | - const options = await screenLinkPageByDeptIdGetDevice({ | ||
| 149 | - organizationId, | ||
| 150 | - }); | ||
| 151 | - // 生成回显时对应得组件数量 | ||
| 152 | - triggerData.value = [...new Array(triggers.length).keys()]; | ||
| 153 | - conditionData.value = [...new Array(doConditions.length).keys()]; | ||
| 154 | - actionData.value = [...new Array(doActions.length).keys()]; | ||
| 155 | - // 回显设备列表 | ||
| 156 | - editEntryIdData.value = options.items.map((v) => { | ||
| 157 | - return { | ||
| 158 | - value: v.tbDeviceId, | ||
| 159 | - label: v.name, | ||
| 160 | - }; | ||
| 161 | - }); | ||
| 162 | - nextTick(() => { | ||
| 163 | - setEditFields(skipUnwrap.triggerItemRefs, editEntryIdData); | ||
| 164 | - setEditFields(skipUnwrap.conditionItemRefs, editEntryIdData); | ||
| 165 | - setEditFields(skipUnwrap.actionItemRefs, editEntryIdData); | ||
| 166 | - }); | 99 | + const emit = defineEmits(['register', 'success']); |
| 167 | 100 | ||
| 168 | - // 回显触发器数据---此处是个闭包! | ||
| 169 | - triggers.forEach((trigger, index) => { | ||
| 170 | - nextTick(() => { | ||
| 171 | - unref(skipUnwrap.triggerItemRefs)[index].setFieldsFormValueFun({ | ||
| 172 | - triggerType: trigger.triggerType, | ||
| 173 | - entityId: trigger.entityId, | ||
| 174 | - type1: trigger.triggerCondition?.condition[0]?.key?.type, | ||
| 175 | - type2: trigger.triggerCondition?.condition[0]?.key?.key, | ||
| 176 | - operation: trigger.triggerCondition?.condition[0]?.predicate?.operation, | ||
| 177 | - value: trigger.triggerCondition?.condition[0]?.predicate?.value?.defaultValue, | ||
| 178 | - }); | ||
| 179 | - }); | ||
| 180 | - }); | ||
| 181 | - | ||
| 182 | - doConditions.forEach((item, index) => { | ||
| 183 | - nextTick(() => { | ||
| 184 | - unref(skipUnwrap.conditionItemRefs)[index].setFieldsFormValueFun({ | ||
| 185 | - triggerType: item?.triggerType, | ||
| 186 | - entityId: item?.entityId, | ||
| 187 | - type: item.triggerCondition?.condition[0].key.key, | ||
| 188 | - operation: item?.triggerCondition?.condition[0]?.predicate?.operation, | ||
| 189 | - value: item?.triggerCondition?.condition[0]?.predicate?.value?.defaultValue, | ||
| 190 | - }); | ||
| 191 | - }); | ||
| 192 | - }); | 101 | + const { createMessage } = useMessage(); |
| 102 | + const triggerData = ref([]); | ||
| 103 | + const conditionData = ref([]); | ||
| 104 | + const actionData = ref([]); | ||
| 105 | + const skipUnwrap = { | ||
| 106 | + triggerItemRefs: ref([]), | ||
| 107 | + conditionItemRefs: ref([]), | ||
| 108 | + actionItemRefs: ref([]), | ||
| 109 | + }; | ||
| 110 | + const title = computed( | ||
| 111 | + () => `${isUpdate.value === 3 ? '查看' : isUpdate.value ? '编辑' : '新增'}场景联动` | ||
| 112 | + ); | ||
| 113 | + let getTriggerFormValue = ref([]); | ||
| 114 | + let getConditionFormValue = ref([]); | ||
| 115 | + let getActionFormValue = ref([]); | ||
| 116 | + const editEntryIdData = ref([]); | ||
| 117 | + const isUpdate = ref(false); | ||
| 118 | + const id = ref(undefined); | ||
| 119 | + const tenantId = ref(undefined); | ||
| 120 | + const isView = ref(true); | ||
| 121 | + const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({ | ||
| 122 | + labelWidth: 120, | ||
| 123 | + schemas: formSchema, | ||
| 124 | + showActionButtonGroup: false, | ||
| 125 | + }); | ||
| 126 | + const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | ||
| 127 | + setDrawerProps({ confirmLoading: false, loading: true }); | ||
| 128 | + isUpdate.value = data.isUpdate; | ||
| 129 | + if (!unref(isUpdate)) { | ||
| 130 | + resetFields(); | ||
| 131 | + //初始化执行动作 | ||
| 132 | + actionData.value = [Date.now()]; | ||
| 133 | + } else { | ||
| 134 | + // 取值 | ||
| 135 | + const { | ||
| 136 | + id: recordId, | ||
| 137 | + tenantId: recordTenantId, | ||
| 138 | + organizationId, | ||
| 139 | + triggers, | ||
| 140 | + doConditions, | ||
| 141 | + doActions, | ||
| 142 | + } = data.record; | ||
| 143 | + // 赋值 | ||
| 144 | + await setFieldsValue(data.record); | ||
| 145 | + id.value = recordId; | ||
| 146 | + tenantId.value = recordTenantId; | ||
| 147 | + // 获取当前组织下的设备列表 | ||
| 148 | + const options = await screenLinkPageByDeptIdGetDevice({ | ||
| 149 | + organizationId, | ||
| 150 | + }); | ||
| 151 | + // 生成回显时对应得组件数量 | ||
| 152 | + triggerData.value = [...new Array(triggers.length).keys()]; | ||
| 153 | + conditionData.value = [...new Array(doConditions.length).keys()]; | ||
| 154 | + actionData.value = [...new Array(doActions.length).keys()]; | ||
| 155 | + // 回显设备列表 | ||
| 156 | + editEntryIdData.value = options.items.map((v) => { | ||
| 157 | + return { | ||
| 158 | + value: v.tbDeviceId, | ||
| 159 | + label: v.name, | ||
| 160 | + }; | ||
| 161 | + }); | ||
| 162 | + nextTick(() => { | ||
| 163 | + setEditFields(skipUnwrap.triggerItemRefs, editEntryIdData); | ||
| 164 | + setEditFields(skipUnwrap.conditionItemRefs, editEntryIdData); | ||
| 165 | + setEditFields(skipUnwrap.actionItemRefs, editEntryIdData); | ||
| 166 | + }); | ||
| 193 | 167 | ||
| 194 | - doActions.forEach((item, index) => { | ||
| 195 | - nextTick(() => { | ||
| 196 | - unref(skipUnwrap.actionItemRefs)[index].setFieldsFormValueFun({ | ||
| 197 | - outTarget: item.outTarget, | ||
| 198 | - deviceId: item.deviceId, | ||
| 199 | - }); | ||
| 200 | - unref(skipUnwrap.actionItemRefs)[index].setJsonValue(item.doContext.params); | ||
| 201 | - }); | 168 | + // 回显触发器数据---此处是个闭包! |
| 169 | + triggers.forEach((trigger, index) => { | ||
| 170 | + nextTick(() => { | ||
| 171 | + unref(skipUnwrap.triggerItemRefs)[index].setFieldsFormValueFun({ | ||
| 172 | + triggerType: trigger.triggerType, | ||
| 173 | + entityId: trigger.entityId, | ||
| 174 | + type1: trigger.triggerCondition?.condition[0]?.key?.type, | ||
| 175 | + type2: trigger.triggerCondition?.condition[0]?.key?.key, | ||
| 176 | + operation: trigger.triggerCondition?.condition[0]?.predicate?.operation, | ||
| 177 | + value: trigger.triggerCondition?.condition[0]?.predicate?.value?.defaultValue, | ||
| 202 | }); | 178 | }); |
| 203 | - } | ||
| 204 | - if (unref(isUpdate) === 3) isView.value = false; | ||
| 205 | - setDrawerProps({ | ||
| 206 | - showFooter: isView.value, | ||
| 207 | - loading: false, | ||
| 208 | }); | 179 | }); |
| 209 | }); | 180 | }); |
| 210 | 181 | ||
| 211 | - // 设置设备的options | ||
| 212 | - const setEditFields = (linkAge, deviceList) => { | ||
| 213 | - unref(linkAge).map((item) => { | ||
| 214 | - item.updateFieldDeviceId(deviceList); | 182 | + doConditions.forEach((item, index) => { |
| 183 | + nextTick(() => { | ||
| 184 | + unref(skipUnwrap.conditionItemRefs)[index].setFieldsFormValueFun({ | ||
| 185 | + triggerType: item?.triggerType, | ||
| 186 | + entityId: item?.entityId, | ||
| 187 | + type: item.triggerCondition?.condition[0].key.key, | ||
| 188 | + operation: item?.triggerCondition?.condition[0]?.predicate?.operation, | ||
| 189 | + value: item?.triggerCondition?.condition[0]?.predicate?.value?.defaultValue, | ||
| 190 | + }); | ||
| 215 | }); | 191 | }); |
| 216 | - }; | ||
| 217 | - // 监听组织变化更新设备列表 | ||
| 218 | - const deviceList = ref([]); | ||
| 219 | - watch(organizationId, async (newValue: string) => { | ||
| 220 | - if (!newValue) return; | ||
| 221 | - const { items } = await screenLinkPageByDeptIdGetDevice({ organizationId: newValue }); | ||
| 222 | - deviceList.value = items.map((item) => ({ label: item.name, value: item.tbDeviceId })); | ||
| 223 | - setFields(skipUnwrap.triggerItemRefs, true); | ||
| 224 | - setFields(skipUnwrap.conditionItemRefs, true); | ||
| 225 | - setFields(skipUnwrap.actionItemRefs, true); | ||
| 226 | }); | 192 | }); |
| 227 | 193 | ||
| 228 | - // 根据上面组织变化动态改变触发器,执行条件,执行动作的设备值 | ||
| 229 | - function setFields(linkAge, isOrganizationChange = false) { | ||
| 230 | - unref(linkAge).map((item) => { | ||
| 231 | - isOrganizationChange && item.resetFieldsValueFunc(); | ||
| 232 | - item.updateFieldDeviceId(deviceList); | ||
| 233 | - }); | ||
| 234 | - } | ||
| 235 | - | ||
| 236 | - // 添加触发器 | ||
| 237 | - const addTrigger = () => { | ||
| 238 | - unref(triggerData).push(Date.now()); | ||
| 239 | - nextTick(() => { | ||
| 240 | - setFields(skipUnwrap.triggerItemRefs); | ||
| 241 | - }); | ||
| 242 | - }; | ||
| 243 | - // 添加执行条件 | ||
| 244 | - const addCondition = () => { | ||
| 245 | - unref(conditionData).push(Date.now()); | 194 | + doActions.forEach((item, index) => { |
| 246 | nextTick(() => { | 195 | nextTick(() => { |
| 247 | - setFields(skipUnwrap.conditionItemRefs); | ||
| 248 | - }); | ||
| 249 | - }; | ||
| 250 | - // 添加执行动作 | ||
| 251 | - const addAction = () => { | ||
| 252 | - unref(actionData).push(Date.now()); | ||
| 253 | - nextTick(() => { | ||
| 254 | - setFields(skipUnwrap.actionItemRefs); | 196 | + unref(skipUnwrap.actionItemRefs)[index].setFieldsFormValueFun({ |
| 197 | + outTarget: item.outTarget, | ||
| 198 | + deviceId: item.deviceId, | ||
| 199 | + }); | ||
| 200 | + unref(skipUnwrap.actionItemRefs)[index].setJsonValue(item.doContext.params); | ||
| 255 | }); | 201 | }); |
| 256 | - }; | 202 | + }); |
| 203 | + } | ||
| 204 | + if (unref(isUpdate) === 3) isView.value = false; | ||
| 205 | + setDrawerProps({ | ||
| 206 | + showFooter: isView.value, | ||
| 207 | + loading: false, | ||
| 208 | + }); | ||
| 209 | + }); | ||
| 257 | 210 | ||
| 258 | - /** | ||
| 259 | - * 获取触发器、执行条件、执行动作表单值--多个 | ||
| 260 | - */ | ||
| 261 | - const getFormValueFunc = () => { | ||
| 262 | - getTriggerFormValue.value = unref(skipUnwrap.triggerItemRefs)?.map((item) => { | ||
| 263 | - return formatTriggerData(item.getFieldsValueFunc()); | ||
| 264 | - }); | ||
| 265 | - getConditionFormValue.value = unref(skipUnwrap.conditionItemRefs).map((item) => { | ||
| 266 | - return formatConditionData(item.getFieldsValueFunc()); | ||
| 267 | - }); | ||
| 268 | - getActionFormValue.value = unref(skipUnwrap.actionItemRefs).map((item) => { | ||
| 269 | - return item.getFieldsValueFunc(); | ||
| 270 | - }); | ||
| 271 | - }; | ||
| 272 | - const handleSubmit = async () => { | ||
| 273 | - let basicFormValue = await validate(); | ||
| 274 | - if (!basicFormValue) return; | ||
| 275 | - for (const item of unref(skipUnwrap.actionItemRefs)) { | ||
| 276 | - const valid = await item.validateForm(); | ||
| 277 | - if (!valid) return; | ||
| 278 | - } | ||
| 279 | - try { | ||
| 280 | - setDrawerProps({ confirmLoading: true }); | ||
| 281 | - getFormValueFunc(); | ||
| 282 | - const postAddOrEditData = { | ||
| 283 | - ...basicFormValue, | ||
| 284 | - triggers: unref(getTriggerFormValue), | ||
| 285 | - doConditions: unref(getConditionFormValue), | ||
| 286 | - doActions: unref(getActionFormValue), | ||
| 287 | - ...{ | ||
| 288 | - id: unref(id), | ||
| 289 | - tenantId: unref(tenantId), | ||
| 290 | - }, | ||
| 291 | - }; | ||
| 292 | - await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate)); | ||
| 293 | - createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`); | ||
| 294 | - closeDrawer(); | ||
| 295 | - handleClose(); | ||
| 296 | - emit('success'); | ||
| 297 | - } finally { | ||
| 298 | - setDrawerProps({ confirmLoading: false }); | ||
| 299 | - } | ||
| 300 | - }; | 211 | + // 设置设备的options |
| 212 | + const setEditFields = (linkAge, deviceList) => { | ||
| 213 | + unref(linkAge).map((item) => { | ||
| 214 | + item.updateFieldDeviceId(deviceList); | ||
| 215 | + }); | ||
| 216 | + }; | ||
| 217 | + // 监听组织变化更新设备列表 | ||
| 218 | + const deviceList = ref([]); | ||
| 219 | + const alarmConfigList = ref([]); | ||
| 220 | + watch(organizationId, async (newValue: string) => { | ||
| 221 | + if (!newValue) return; | ||
| 222 | + const { items } = await screenLinkPageByDeptIdGetDevice({ organizationId: newValue }); | ||
| 223 | + deviceList.value = items.map((item) => ({ label: item.name, value: item.tbDeviceId })); | ||
| 224 | + setFields(skipUnwrap.triggerItemRefs, true); | ||
| 225 | + setFields(skipUnwrap.conditionItemRefs, true); | ||
| 226 | + setFields(skipUnwrap.actionItemRefs, true); | ||
| 301 | 227 | ||
| 302 | - // 删除 | ||
| 303 | - const deleteTrigger = (triggerIndex: number) => { | ||
| 304 | - unref(triggerData).splice(triggerIndex, 1); | ||
| 305 | - }; | ||
| 306 | - const deleteCondition = (conditionIndex: number) => { | ||
| 307 | - unref(conditionData).splice(conditionIndex, 1); | ||
| 308 | - }; | ||
| 309 | - const deleteAction = (actionIndex: number) => { | ||
| 310 | - unref(actionData).splice(actionIndex, 1); | ||
| 311 | - }; | ||
| 312 | - const handleClose = () => { | ||
| 313 | - id.value = undefined; | ||
| 314 | - tenantId.value = undefined; | ||
| 315 | - organizationId.value = undefined; | ||
| 316 | - isView.value = true; | ||
| 317 | - getTriggerFormValue.value = []; | ||
| 318 | - getConditionFormValue.value = []; | ||
| 319 | - getActionFormValue.value = []; | ||
| 320 | - triggerData.value = []; | ||
| 321 | - conditionData.value = []; | ||
| 322 | - actionData.value = []; | ||
| 323 | - unref(skipUnwrap.triggerItemRefs).map((item) => { | ||
| 324 | - item.resetFieldsValueFunc(); | ||
| 325 | - }); | ||
| 326 | - unref(skipUnwrap.conditionItemRefs).map((item) => { | ||
| 327 | - item.resetFieldsValueFunc(); | ||
| 328 | - }); | ||
| 329 | - unref(skipUnwrap.actionItemRefs).map((item) => { | ||
| 330 | - item.resetFieldsValueFunc(); | ||
| 331 | - }); | ||
| 332 | - }; | 228 | + const data = await getOrganizationAlarmConfig({ organizationId: newValue }); |
| 229 | + alarmConfigList.value = data.map((item) => ({ label: item.name, value: item.id })); | ||
| 230 | + setAlarmConfig(skipUnwrap.actionItemRefs, true); | ||
| 231 | + }); | ||
| 333 | 232 | ||
| 334 | - return { | ||
| 335 | - title, | ||
| 336 | - isUpdate, | ||
| 337 | - registerDrawer, | ||
| 338 | - registerForm, | ||
| 339 | - // 添加 or 删除 触发器,条件,动作 | ||
| 340 | - triggerData, | ||
| 341 | - conditionData, | ||
| 342 | - actionData, | ||
| 343 | - addCondition, | ||
| 344 | - addTrigger, | ||
| 345 | - addAction, | ||
| 346 | - deleteTrigger, | ||
| 347 | - deleteCondition, | ||
| 348 | - deleteAction, | ||
| 349 | - // Refs引用 | ||
| 350 | - skipUnwrap, | ||
| 351 | - handleSubmit, | ||
| 352 | - handleClose, | 233 | + // 根据上面组织变化动态改变触发器,执行条件,执行动作的设备值 |
| 234 | + function setFields(linkAge, isOrganizationChange = false) { | ||
| 235 | + unref(linkAge).map((item) => { | ||
| 236 | + isOrganizationChange && item.resetFieldsValueFunc(); | ||
| 237 | + item.updateFieldDeviceId(deviceList); | ||
| 238 | + }); | ||
| 239 | + } | ||
| 353 | 240 | ||
| 354 | - isView, | 241 | + function setAlarmConfig(linkAge, isOrganizationChange = false) { |
| 242 | + unref(linkAge).map((item) => { | ||
| 243 | + isOrganizationChange && item.resetFieldsValueFunc(); | ||
| 244 | + item.updateFieldAlarmConfig(alarmConfigList); | ||
| 245 | + }); | ||
| 246 | + } | ||
| 247 | + // 添加触发器 | ||
| 248 | + const addTrigger = () => { | ||
| 249 | + unref(triggerData).push(Date.now()); | ||
| 250 | + nextTick(() => { | ||
| 251 | + setFields(skipUnwrap.triggerItemRefs); | ||
| 252 | + }); | ||
| 253 | + }; | ||
| 254 | + // 添加执行条件 | ||
| 255 | + const addCondition = () => { | ||
| 256 | + unref(conditionData).push(Date.now()); | ||
| 257 | + nextTick(() => { | ||
| 258 | + setFields(skipUnwrap.conditionItemRefs); | ||
| 259 | + }); | ||
| 260 | + }; | ||
| 261 | + // 添加执行动作 | ||
| 262 | + const addAction = () => { | ||
| 263 | + unref(actionData).push(Date.now()); | ||
| 264 | + nextTick(() => { | ||
| 265 | + setFields(skipUnwrap.actionItemRefs); | ||
| 266 | + }); | ||
| 267 | + }; | ||
| 268 | + | ||
| 269 | + /** | ||
| 270 | + * 获取触发器、执行条件、执行动作表单值--多个 | ||
| 271 | + */ | ||
| 272 | + const getFormValueFunc = () => { | ||
| 273 | + getTriggerFormValue.value = unref(skipUnwrap.triggerItemRefs)?.map((item) => { | ||
| 274 | + return genTriggerData(item.getFieldsValueFunc()); | ||
| 275 | + }); | ||
| 276 | + getConditionFormValue.value = unref(skipUnwrap.conditionItemRefs).map((item) => { | ||
| 277 | + return genConditionData(item.getFieldsValueFunc()); | ||
| 278 | + }); | ||
| 279 | + getActionFormValue.value = unref(skipUnwrap.actionItemRefs).map((item) => { | ||
| 280 | + console.log(item.jsonInstance.get()); | ||
| 281 | + return genActionData(item.getFieldsValueFunc()); | ||
| 282 | + }); | ||
| 283 | + console.log(getActionFormValue.value); | ||
| 284 | + }; | ||
| 285 | + const handleSubmit = async () => { | ||
| 286 | + let basicFormValue = await validate(); | ||
| 287 | + if (!basicFormValue) return; | ||
| 288 | + for (const item of unref(skipUnwrap.actionItemRefs)) { | ||
| 289 | + const valid = await item.validateForm(); | ||
| 290 | + if (!valid) return; | ||
| 291 | + } | ||
| 292 | + try { | ||
| 293 | + setDrawerProps({ confirmLoading: true }); | ||
| 294 | + getFormValueFunc(); | ||
| 295 | + const postAddOrEditData = { | ||
| 296 | + ...basicFormValue, | ||
| 297 | + triggers: !unref(getTriggerFormValue).length ? null : unref(getTriggerFormValue), | ||
| 298 | + doConditions: !unref(getConditionFormValue).length ? null : unref(getConditionFormValue), | ||
| 299 | + doActions: unref(getActionFormValue).flat(), | ||
| 300 | + id: unref(id), | ||
| 301 | + tenantId: unref(tenantId), | ||
| 355 | }; | 302 | }; |
| 356 | - }, | ||
| 357 | - }); | 303 | + console.log(postAddOrEditData); |
| 304 | + await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate)); | ||
| 305 | + createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`); | ||
| 306 | + closeDrawer(); | ||
| 307 | + handleClose(); | ||
| 308 | + emit('success'); | ||
| 309 | + } finally { | ||
| 310 | + setDrawerProps({ confirmLoading: false }); | ||
| 311 | + } | ||
| 312 | + }; | ||
| 313 | + const userStore = useUserStore(); | ||
| 314 | + // 删除 | ||
| 315 | + const deleteTrigger = (triggerIndex: number) => { | ||
| 316 | + unref(triggerData).splice(triggerIndex, 1); | ||
| 317 | + }; | ||
| 318 | + const deleteCondition = (conditionIndex: number) => { | ||
| 319 | + unref(conditionData).splice(conditionIndex, 1); | ||
| 320 | + }; | ||
| 321 | + const deleteAction = ({ actionIndex, outTarget }) => { | ||
| 322 | + // console.log(actionIndex, outTarget.value); | ||
| 323 | + unref(actionData).splice(actionIndex, 1); | ||
| 324 | + if (unref(outTarget) === 'MSG_NOTIFY') { | ||
| 325 | + userStore.setOutTarget('DEVICE_OUT'); | ||
| 326 | + } | ||
| 327 | + }; | ||
| 328 | + const handleClose = () => { | ||
| 329 | + id.value = undefined; | ||
| 330 | + tenantId.value = undefined; | ||
| 331 | + organizationId.value = undefined; | ||
| 332 | + isView.value = true; | ||
| 333 | + getTriggerFormValue.value = []; | ||
| 334 | + getConditionFormValue.value = []; | ||
| 335 | + getActionFormValue.value = []; | ||
| 336 | + triggerData.value = []; | ||
| 337 | + conditionData.value = []; | ||
| 338 | + actionData.value = []; | ||
| 339 | + unref(skipUnwrap.triggerItemRefs).map((item) => { | ||
| 340 | + item.resetFieldsValueFunc(); | ||
| 341 | + }); | ||
| 342 | + unref(skipUnwrap.conditionItemRefs).map((item) => { | ||
| 343 | + item.resetFieldsValueFunc(); | ||
| 344 | + }); | ||
| 345 | + unref(skipUnwrap.actionItemRefs).map((item) => { | ||
| 346 | + item.resetFieldsValueFunc(); | ||
| 347 | + }); | ||
| 348 | + userStore.setOutTarget('DEVICE_OUT'); | ||
| 349 | + }; | ||
| 358 | </script> | 350 | </script> |
| @@ -21,32 +21,6 @@ export enum TriggerEnum { | @@ -21,32 +21,6 @@ export enum TriggerEnum { | ||
| 21 | IS_DEVICE_STATUS = 'DEVICE_STATUS', | 21 | IS_DEVICE_STATUS = 'DEVICE_STATUS', |
| 22 | IS_TIME_ALL = 'SCHEDULE_TRIGGER', | 22 | IS_TIME_ALL = 'SCHEDULE_TRIGGER', |
| 23 | } | 23 | } |
| 24 | - | ||
| 25 | -export enum AttributeActionEnum { | ||
| 26 | - IS_ATTRIBUTE_ACT = 'ATTRIBUTE', | ||
| 27 | - IS_UP_DOWN_ACT = 'TIME_SERIES', | ||
| 28 | -} | ||
| 29 | - | ||
| 30 | -export enum AttrAndWenDuEnum { | ||
| 31 | - IS_ALL_ATTR = 'ALL_ATTR', | ||
| 32 | - IS_WENDU_ACT = 'NUMERIC', | ||
| 33 | - IS_SHIDU = 'NUMERIC', | ||
| 34 | - IS_CONDITION_WENDU = 'NUMERIC2', | ||
| 35 | - IS_CONDITION_SHIDU = 'NUMERIC1', | ||
| 36 | - IS_TYPE2 = 'type2', | ||
| 37 | -} | ||
| 38 | - | ||
| 39 | -export const isUpAndDown = (type: string) => { | ||
| 40 | - return type === AttributeActionEnum.IS_UP_DOWN_ACT; | ||
| 41 | -}; | ||
| 42 | -export const isTimeAll = (type: string) => { | ||
| 43 | - return type === TriggerEnum.IS_TIME_ACT; | ||
| 44 | -}; | ||
| 45 | - | ||
| 46 | -export const isMsg = (type: string) => { | ||
| 47 | - return type === TriggerEnum.IS_MSG_NOTIFY; | ||
| 48 | -}; | ||
| 49 | - | ||
| 50 | export const isDevice = (type: string) => { | 24 | export const isDevice = (type: string) => { |
| 51 | return type === TriggerEnum.IS_DEVICE_ACT; | 25 | return type === TriggerEnum.IS_DEVICE_ACT; |
| 52 | }; | 26 | }; |
| @@ -55,32 +29,6 @@ export const isTime = (type: string) => { | @@ -55,32 +29,6 @@ export const isTime = (type: string) => { | ||
| 55 | return type === TriggerEnum.IS_TIME_ACT; | 29 | return type === TriggerEnum.IS_TIME_ACT; |
| 56 | }; | 30 | }; |
| 57 | 31 | ||
| 58 | -export const isScene = (type: string) => { | ||
| 59 | - return type === TriggerEnum.IS_SCENE_ACT; | ||
| 60 | -}; | ||
| 61 | - | ||
| 62 | -export const isHand = (type: string) => { | ||
| 63 | - return type === TriggerEnum.IS_HAND_ACT; | ||
| 64 | -}; | ||
| 65 | -export const isType2 = (type: string) => { | ||
| 66 | - return type === AttrAndWenDuEnum.IS_TYPE2; | ||
| 67 | -}; | ||
| 68 | - | ||
| 69 | -export const isConditionShiDu = (type: string) => { | ||
| 70 | - return type === AttrAndWenDuEnum.IS_CONDITION_SHIDU; | ||
| 71 | -}; | ||
| 72 | -export const isConditionWenDu = (type: string) => { | ||
| 73 | - return type === AttrAndWenDuEnum.IS_CONDITION_WENDU; | ||
| 74 | -}; | ||
| 75 | - | ||
| 76 | -export const isShiDu = (type: string) => { | ||
| 77 | - return type === AttrAndWenDuEnum.IS_SHIDU; | ||
| 78 | -}; | ||
| 79 | - | ||
| 80 | -export const isWenDu = (type: string) => { | ||
| 81 | - return type === AttrAndWenDuEnum.IS_WENDU_ACT; | ||
| 82 | -}; | ||
| 83 | - | ||
| 84 | export const columns: BasicColumn[] = [ | 32 | export const columns: BasicColumn[] = [ |
| 85 | { | 33 | { |
| 86 | title: '场景联动名称', | 34 | title: '场景联动名称', |
| @@ -232,107 +180,87 @@ export const searchFormSchema: FormSchema[] = [ | @@ -232,107 +180,87 @@ export const searchFormSchema: FormSchema[] = [ | ||
| 232 | colProps: { span: 6 }, | 180 | colProps: { span: 6 }, |
| 233 | }, | 181 | }, |
| 234 | ]; | 182 | ]; |
| 183 | +// 持续时间 | ||
| 184 | +const isTimeDuration = (type) => { | ||
| 185 | + return type === 'timeDuration'; | ||
| 186 | +}; | ||
| 187 | +const isReplace = (type) => { | ||
| 188 | + return type === 'replace'; | ||
| 189 | +}; | ||
| 190 | +// 部分 | ||
| 191 | +const isPart = (type: string) => { | ||
| 192 | + return type === 'PART'; | ||
| 193 | +}; | ||
| 235 | 194 | ||
| 236 | -export const useTriggerDrawerSchema: FormSchema[] = [ | 195 | +export const trigger_condition_schema: FormSchema[] = [ |
| 237 | { | 196 | { |
| 238 | - field: 'triggerType', | 197 | + field: 'triggered', |
| 239 | label: '', | 198 | label: '', |
| 240 | component: 'Select', | 199 | component: 'Select', |
| 241 | componentProps: { | 200 | componentProps: { |
| 242 | - placeholder: '设备触发', | 201 | + placeholder: '请选择触发类型', |
| 243 | options: [ | 202 | options: [ |
| 244 | - { label: '设备触发', value: 'DEVICE_TRIGGER' }, | ||
| 245 | - // { label: '定时触发', value: 'SCHEDULE_TRIGGER' }, | ||
| 246 | - // { label: '场景触发', value: 'SCENE_TRIGGER' }, | ||
| 247 | - // { label: '手动触发', value: 'HAND_ACT' }, | 203 | + { label: '简单', value: 'SIMPLE' }, |
| 204 | + { label: '持续时长', value: 'timeDuration' }, | ||
| 205 | + { label: '重复次数', value: 'replace' }, | ||
| 248 | ], | 206 | ], |
| 249 | }, | 207 | }, |
| 250 | - colProps: { span: 8 }, | 208 | + colProps: { span: 6 }, |
| 251 | }, | 209 | }, |
| 252 | { | 210 | { |
| 253 | - field: 'entityId', | 211 | + field: 'device', |
| 254 | label: '', | 212 | label: '', |
| 255 | component: 'Select', | 213 | component: 'Select', |
| 256 | componentProps: { | 214 | componentProps: { |
| 257 | placeholder: '请选择设备', | 215 | placeholder: '请选择设备', |
| 216 | + options: [ | ||
| 217 | + { label: '全部', value: 'ALL' }, | ||
| 218 | + { label: '部分', value: 'PART' }, | ||
| 219 | + ], | ||
| 258 | }, | 220 | }, |
| 259 | - ifShow: ({ values }) => isDevice(values.triggerType), | ||
| 260 | - colProps: { | ||
| 261 | - span: 8, | ||
| 262 | - }, | 221 | + colProps: { span: 6 }, |
| 263 | }, | 222 | }, |
| 264 | { | 223 | { |
| 265 | - field: 'type1', | 224 | + field: 'entityId', |
| 266 | label: '', | 225 | label: '', |
| 267 | component: 'Select', | 226 | component: 'Select', |
| 268 | componentProps: { | 227 | componentProps: { |
| 269 | - placeholder: '属性触发方式', | ||
| 270 | - options: [{ label: '属性触发', value: 'TIME_SERIES' }], | ||
| 271 | - }, | ||
| 272 | - ifShow: ({ values }) => isDevice(values.triggerType), | ||
| 273 | - dynamicDisabled: ({ values }) => !values.entityId, | ||
| 274 | - colProps: { span: 8 }, | ||
| 275 | - }, | ||
| 276 | - { | ||
| 277 | - field: 'type2', | ||
| 278 | - label: '', | ||
| 279 | - component: 'AutoComplete', | ||
| 280 | - componentProps: { | ||
| 281 | - placeholder: '请选择属性', | 228 | + placeholder: '请选择设备', |
| 229 | + mode: 'multiple', | ||
| 282 | }, | 230 | }, |
| 283 | - ifShow: ({ values }) => isDevice(values.triggerType), | ||
| 284 | - dynamicDisabled: ({ values }) => !values.type1, | ||
| 285 | - colProps: { span: 8 }, | 231 | + ifShow: ({ values }) => isPart(values.device), |
| 232 | + colProps: { span: 6 }, | ||
| 286 | }, | 233 | }, |
| 287 | { | 234 | { |
| 288 | - field: 'operation', | 235 | + field: 'time', |
| 289 | label: '', | 236 | label: '', |
| 290 | - component: 'Select', | 237 | + component: 'Input', |
| 291 | componentProps: { | 238 | componentProps: { |
| 292 | - placeholder: '请选择比较模式', | ||
| 293 | - options: [ | ||
| 294 | - { label: '=', value: 'EQUAL' }, | ||
| 295 | - { label: '<', value: 'LESS' }, | ||
| 296 | - { label: '>', value: 'GREATER' }, | ||
| 297 | - { label: '<=', value: 'LESS_OR_EQUAL' }, | ||
| 298 | - { label: '>=', value: 'GREATER_OR_EQUAL' }, | ||
| 299 | - ], | 239 | + placeholder: '请输入持续时间', |
| 300 | }, | 240 | }, |
| 301 | - show: ({ values }) => isDevice(values.triggerType), | ||
| 302 | - dynamicDisabled: ({ values }) => !values.type2, | ||
| 303 | - colProps: { span: 8 }, | 241 | + ifShow: ({ values }) => isTimeDuration(values.triggered), |
| 242 | + colProps: { span: 6 }, | ||
| 304 | }, | 243 | }, |
| 305 | { | 244 | { |
| 306 | - field: 'value', | 245 | + field: 'timeUnit', |
| 307 | label: '', | 246 | label: '', |
| 308 | component: 'Input', | 247 | component: 'Input', |
| 309 | componentProps: { | 248 | componentProps: { |
| 310 | - maxLength: 16, | ||
| 311 | - placeholder: '请输入比较值', | ||
| 312 | - }, | ||
| 313 | - show: ({ values }) => isDevice(values.triggerType), | ||
| 314 | - dynamicDisabled: ({ values }) => !values.operation, | ||
| 315 | - colProps: { | ||
| 316 | - span: 8, | 249 | + placeholder: '请输入持续时间单位', |
| 317 | }, | 250 | }, |
| 251 | + ifShow: ({ values }) => isTimeDuration(values.triggered), | ||
| 252 | + colProps: { span: 6 }, | ||
| 318 | }, | 253 | }, |
| 319 | { | 254 | { |
| 320 | - field: 'entityId1', | 255 | + field: 'replaceValue', |
| 321 | label: '', | 256 | label: '', |
| 322 | component: 'Input', | 257 | component: 'Input', |
| 323 | componentProps: { | 258 | componentProps: { |
| 324 | - maxLength: 255, | ||
| 325 | - placeholder: '请输入Cron表达式', | 259 | + placeholder: '事件计数值', |
| 326 | }, | 260 | }, |
| 327 | - colProps: { | ||
| 328 | - span: 12, | ||
| 329 | - }, | ||
| 330 | - ifShow: ({ values }) => values.triggerType === TriggerEnum.IS_TIME_ACT, | 261 | + ifShow: ({ values }) => isReplace(values.triggered), |
| 262 | + colProps: { span: 6 }, | ||
| 331 | }, | 263 | }, |
| 332 | -]; | ||
| 333 | -// !!!----------------------------------------------------^_^------------------------------------------------------------!!! | ||
| 334 | - | ||
| 335 | -export const useConditionDrawerSchema: FormSchema[] = [ | ||
| 336 | { | 264 | { |
| 337 | field: 'triggerType', | 265 | field: 'triggerType', |
| 338 | label: '', | 266 | label: '', |
| @@ -341,191 +269,367 @@ export const useConditionDrawerSchema: FormSchema[] = [ | @@ -341,191 +269,367 @@ export const useConditionDrawerSchema: FormSchema[] = [ | ||
| 341 | placeholder: '设备触发', | 269 | placeholder: '设备触发', |
| 342 | options: [ | 270 | options: [ |
| 343 | { label: '设备触发', value: 'DEVICE_TRIGGER' }, | 271 | { label: '设备触发', value: 'DEVICE_TRIGGER' }, |
| 344 | - // { label: '时间范围', value: 'SCHEDULE_TRIGGER' }, | 272 | + // { label: '定时触发', value: 'SCHEDULE_TRIGGER' }, |
| 273 | + // { label: '场景触发', value: 'SCENE_TRIGGER' }, | ||
| 274 | + // { label: '手动触发', value: 'HAND_ACT' }, | ||
| 345 | ], | 275 | ], |
| 346 | }, | 276 | }, |
| 347 | - colProps: { span: 8 }, | 277 | + colProps: { span: 6 }, |
| 348 | }, | 278 | }, |
| 279 | + | ||
| 349 | { | 280 | { |
| 350 | - field: 'entityId', | 281 | + field: 'type1', |
| 351 | label: '', | 282 | label: '', |
| 352 | component: 'Select', | 283 | component: 'Select', |
| 353 | - componentProps() { | ||
| 354 | - return { | ||
| 355 | - placeholder: '请选择设备', | ||
| 356 | - }; | 284 | + componentProps: { |
| 285 | + placeholder: '属性触发方式', | ||
| 286 | + options: [{ label: '属性触发', value: 'TIME_SERIES' }], | ||
| 357 | }, | 287 | }, |
| 358 | ifShow: ({ values }) => isDevice(values.triggerType), | 288 | ifShow: ({ values }) => isDevice(values.triggerType), |
| 359 | - colProps: { | ||
| 360 | - span: 8, | ||
| 361 | - }, | 289 | + colProps: { span: 6 }, |
| 362 | }, | 290 | }, |
| 363 | { | 291 | { |
| 364 | - field: 'type', | 292 | + field: 'type2', |
| 365 | label: '', | 293 | label: '', |
| 366 | component: 'AutoComplete', | 294 | component: 'AutoComplete', |
| 367 | componentProps: { | 295 | componentProps: { |
| 368 | placeholder: '请选择属性', | 296 | placeholder: '请选择属性', |
| 369 | }, | 297 | }, |
| 370 | ifShow: ({ values }) => isDevice(values.triggerType), | 298 | ifShow: ({ values }) => isDevice(values.triggerType), |
| 371 | - dynamicDisabled: ({ values }) => !values.entityId, | ||
| 372 | - colProps: { span: 8 }, | 299 | + colProps: { span: 6 }, |
| 373 | }, | 300 | }, |
| 374 | { | 301 | { |
| 375 | - field: 'operation', | 302 | + field: 'operationType', |
| 376 | label: '', | 303 | label: '', |
| 377 | component: 'Select', | 304 | component: 'Select', |
| 378 | - componentProps: { | ||
| 379 | - placeholder: '请选择比较模式', | ||
| 380 | - options: [ | ||
| 381 | - { label: '=', value: 'EQUAL' }, | ||
| 382 | - { label: '<', value: 'LESS' }, | ||
| 383 | - { label: '>', value: 'GREATER' }, | ||
| 384 | - { label: '<=', value: 'LESS_OR_EQUAL' }, | ||
| 385 | - { label: '>=', value: 'GREATER_OR_EQUAL' }, | ||
| 386 | - ], | ||
| 387 | - }, | ||
| 388 | - show: ({ values }) => isDevice(values.triggerType), | ||
| 389 | - dynamicDisabled: ({ values }) => !values.type, | ||
| 390 | - colProps: { span: 8 }, | 305 | + slot: 'operationType', |
| 306 | + colProps: { span: 6 }, | ||
| 391 | }, | 307 | }, |
| 392 | { | 308 | { |
| 393 | - field: 'value', | 309 | + field: 'detail', |
| 394 | label: '', | 310 | label: '', |
| 395 | - component: 'Input', | 311 | + component: 'InputTextArea', |
| 396 | componentProps: { | 312 | componentProps: { |
| 397 | - maxLength: 16, | ||
| 398 | - placeholder: '请输入比较值', | 313 | + placeholder: '请输入详情', |
| 399 | }, | 314 | }, |
| 400 | - show: ({ values }) => isDevice(values.triggerType), | ||
| 401 | - dynamicDisabled: ({ values }) => !values.operation, | ||
| 402 | colProps: { | 315 | colProps: { |
| 403 | - span: 8, | 316 | + span: 13, |
| 404 | }, | 317 | }, |
| 405 | }, | 318 | }, |
| 406 | - // { | ||
| 407 | - // field: 'createTime', | ||
| 408 | - // component: 'DatePicker', | ||
| 409 | - // label: 'createTime', | ||
| 410 | - // componentProps: { | ||
| 411 | - // placeholder: '请选择起始时间', | ||
| 412 | - // }, | ||
| 413 | - // colProps: { | ||
| 414 | - // span: 12, | ||
| 415 | - // }, | ||
| 416 | - // ifShow: ({ values }) => isTimeAll(values.triggerType), | ||
| 417 | - // }, | ||
| 418 | - // { | ||
| 419 | - // field: 'updateTime', | ||
| 420 | - // component: 'DatePicker', | ||
| 421 | - // label: 'updateTime', | ||
| 422 | - // componentProps: { | ||
| 423 | - // placeholder: '请选择结束时间', | ||
| 424 | - // }, | ||
| 425 | - // colProps: { | ||
| 426 | - // span: 12, | ||
| 427 | - // }, | ||
| 428 | - // ifShow: ({ values }) => isTimeAll(values.triggerType), | ||
| 429 | - // }, | ||
| 430 | ]; | 319 | ]; |
| 320 | +// !!!----------------------------------------------------^_^------------------------------------------------------------!!! | ||
| 431 | enum ActionEnum { | 321 | enum ActionEnum { |
| 432 | DEVICE_OUT = 'DEVICE_OUT', | 322 | DEVICE_OUT = 'DEVICE_OUT', |
| 323 | + ALARM_OUT = 'MSG_NOTIFY', | ||
| 433 | } | 324 | } |
| 434 | const isDeviceOut = (type: string) => type === ActionEnum.DEVICE_OUT; | 325 | const isDeviceOut = (type: string) => type === ActionEnum.DEVICE_OUT; |
| 435 | -export const useActionDrawerSchema: FormSchema[] = [ | 326 | +const isAlarmOut = (type: string) => type === ActionEnum.ALARM_OUT; |
| 327 | + | ||
| 328 | +export const actionSchema: FormSchema[] = [ | ||
| 436 | { | 329 | { |
| 437 | field: 'outTarget', | 330 | field: 'outTarget', |
| 438 | label: '', | 331 | label: '', |
| 439 | component: 'Select', | 332 | component: 'Select', |
| 440 | required: true, | 333 | required: true, |
| 441 | componentProps: { | 334 | componentProps: { |
| 442 | - placeholder: '设备输出', | 335 | + placeholder: '请选择执行动作', |
| 336 | + }, | ||
| 337 | + slot: 'outTarget', | ||
| 338 | + colProps: { span: 6 }, | ||
| 339 | + }, | ||
| 340 | + { | ||
| 341 | + field: 'device', | ||
| 342 | + label: '', | ||
| 343 | + component: 'Select', | ||
| 344 | + componentProps: { | ||
| 345 | + placeholder: '请选择设备', | ||
| 443 | options: [ | 346 | options: [ |
| 444 | - { label: '设备输出', value: 'DEVICE_OUT' }, | ||
| 445 | - // { label: '消息通知', value: 'MSG_NOTIFY' }, | ||
| 446 | - // { label: '场景联动', value: 'SCENE_TRIGGER' }, | 347 | + { label: '全部', value: 'ALL' }, |
| 348 | + { label: '部分', value: 'PART' }, | ||
| 447 | ], | 349 | ], |
| 448 | }, | 350 | }, |
| 449 | - colProps: { span: 12 }, | 351 | + ifShow: ({ values }) => isDeviceOut(values.outTarget), |
| 352 | + colProps: { span: 6 }, | ||
| 450 | }, | 353 | }, |
| 451 | { | 354 | { |
| 452 | field: 'deviceId', | 355 | field: 'deviceId', |
| 453 | label: '', | 356 | label: '', |
| 454 | - required: true, | ||
| 455 | component: 'Select', | 357 | component: 'Select', |
| 456 | componentProps: { | 358 | componentProps: { |
| 457 | placeholder: '请选择设备', | 359 | placeholder: '请选择设备', |
| 360 | + mode: 'multiple', | ||
| 458 | }, | 361 | }, |
| 459 | - ifShow: ({ values }) => isDeviceOut(values.outTarget), | ||
| 460 | - colProps: { | ||
| 461 | - span: 12, | ||
| 462 | - }, | 362 | + ifShow: ({ values }) => isPart(values.device), |
| 363 | + colProps: { span: 6 }, | ||
| 463 | }, | 364 | }, |
| 464 | { | 365 | { |
| 465 | - field: 'doContext', | ||
| 466 | - component: 'InputTextArea', | 366 | + field: 'alarm_config', |
| 467 | label: '', | 367 | label: '', |
| 368 | + component: 'Select', | ||
| 468 | componentProps: { | 369 | componentProps: { |
| 469 | - maxLength: 255, | 370 | + placeholder: '请选择告警配置', |
| 470 | }, | 371 | }, |
| 372 | + ifShow: ({ values }) => values.outTarget === 'MSG_NOTIFY', | ||
| 373 | + colProps: { span: 6 }, | ||
| 374 | + }, | ||
| 375 | + { | ||
| 376 | + field: 'doContext', | ||
| 377 | + component: 'Input', | ||
| 378 | + label: '', | ||
| 471 | slot: 'doContext', | 379 | slot: 'doContext', |
| 472 | show: ({ values }) => isDeviceOut(values.outTarget), | 380 | show: ({ values }) => isDeviceOut(values.outTarget), |
| 473 | colProps: { | 381 | colProps: { |
| 474 | span: 24, | 382 | span: 24, |
| 475 | }, | 383 | }, |
| 476 | }, | 384 | }, |
| 477 | - // { | ||
| 478 | - // field: 'wu2', | ||
| 479 | - // component: 'Input', | ||
| 480 | - // label: '', | ||
| 481 | - // componentProps: { | ||
| 482 | - // placeholder: '暂不实现', | ||
| 483 | - // }, | ||
| 484 | - // colProps: { | ||
| 485 | - // span: 12, | ||
| 486 | - // }, | ||
| 487 | - // ifShow: ({ values }) => isMsg(Reflect.get(values, 'outTarget')), | ||
| 488 | - // }, | ||
| 489 | - // { | ||
| 490 | - // field: 'wu3', | ||
| 491 | - // label: '', | ||
| 492 | - // component: 'Input', | ||
| 493 | - // componentProps: { | ||
| 494 | - // placeholder: '无', | ||
| 495 | - // style: { | ||
| 496 | - // visibility: 'hidden', | ||
| 497 | - // }, | ||
| 498 | - // }, | ||
| 499 | - // colProps: { span: 12 }, | ||
| 500 | - // ifShow: ({ values }) => isMsg(Reflect.get(values, 'outTarget')), | ||
| 501 | - // }, | ||
| 502 | - // { | ||
| 503 | - // field: 'entityId', | ||
| 504 | - // label: '', | ||
| 505 | - // component: 'Select', | ||
| 506 | - // colProps: { | ||
| 507 | - // span: 12, | ||
| 508 | - // }, | ||
| 509 | - // componentProps: { | ||
| 510 | - // placeholder: '请选择场景', | ||
| 511 | - // options: [ | ||
| 512 | - // { label: '场景触发器1', value: '1' }, | ||
| 513 | - // { label: '场景触发器2', value: '2' }, | ||
| 514 | - // ], | ||
| 515 | - // }, | ||
| 516 | - // ifShow: ({ values }) => isScene(Reflect.get(values, 'outTarget')), | ||
| 517 | - // }, | ||
| 518 | - // { | ||
| 519 | - // field: 'wu4', | ||
| 520 | - // label: '', | ||
| 521 | - // component: 'Input', | ||
| 522 | - // componentProps: { | ||
| 523 | - // placeholder: '无', | ||
| 524 | - // style: { | ||
| 525 | - // visibility: 'hidden', | ||
| 526 | - // }, | ||
| 527 | - // }, | ||
| 528 | - // colProps: { span: 12 }, | ||
| 529 | - // ifShow: ({ values }) => isScene(Reflect.get(values, 'outTarget')), | ||
| 530 | - // }, | 385 | + { |
| 386 | + field: 'alarm_level', | ||
| 387 | + component: 'Select', | ||
| 388 | + label: '', | ||
| 389 | + show: ({ values }) => isAlarmOut(values.outTarget), | ||
| 390 | + componentProps: { | ||
| 391 | + placeholder: '请选择告警等级', | ||
| 392 | + options: [ | ||
| 393 | + { | ||
| 394 | + label: '紧急', | ||
| 395 | + value: ' CRITICAL', | ||
| 396 | + }, | ||
| 397 | + { | ||
| 398 | + label: '重要', | ||
| 399 | + value: 'MAJOR', | ||
| 400 | + }, | ||
| 401 | + { | ||
| 402 | + label: '次要', | ||
| 403 | + value: 'MINOR', | ||
| 404 | + }, | ||
| 405 | + { | ||
| 406 | + label: '警告', | ||
| 407 | + value: 'WARNING', | ||
| 408 | + }, | ||
| 409 | + { | ||
| 410 | + label: '不确定', | ||
| 411 | + value: 'INDETERMINATE', | ||
| 412 | + }, | ||
| 413 | + ], | ||
| 414 | + }, | ||
| 415 | + colProps: { | ||
| 416 | + span: 6, | ||
| 417 | + }, | ||
| 418 | + }, | ||
| 419 | + { | ||
| 420 | + field: 'clear_alarm', | ||
| 421 | + component: 'Checkbox', | ||
| 422 | + label: '', | ||
| 423 | + show: ({ values }) => isAlarmOut(values.outTarget), | ||
| 424 | + colProps: { | ||
| 425 | + span: 8, | ||
| 426 | + }, | ||
| 427 | + slot: 'clearAlarm', | ||
| 428 | + }, | ||
| 531 | ]; | 429 | ]; |
| 430 | +import { Number_Operation, String_Operation, Boolean_Operation } from '/@/enums/operationEnum'; | ||
| 431 | +export function isType(operationType) { | ||
| 432 | + switch (operationType) { | ||
| 433 | + case 'NUMERIC': | ||
| 434 | + return [ | ||
| 435 | + { | ||
| 436 | + field: 'operation', | ||
| 437 | + label: '执行操作', | ||
| 438 | + component: 'Select', | ||
| 439 | + require: true, | ||
| 440 | + componentProps: { | ||
| 441 | + options: [ | ||
| 442 | + { label: '等于', value: Number_Operation.EQUAL }, | ||
| 443 | + { label: '不等于', value: Number_Operation.NOT_EQUAL }, | ||
| 444 | + { label: '小于', value: Number_Operation.LESS }, | ||
| 445 | + { label: '小于等于', value: Number_Operation.LESS_OR_EQUAL }, | ||
| 446 | + { label: '大于', value: Number_Operation.GREATER }, | ||
| 447 | + { label: '大于等于', value: Number_Operation.GREATER_OR_EQUAL }, | ||
| 448 | + ], | ||
| 449 | + }, | ||
| 450 | + colProps: { | ||
| 451 | + span: 8, | ||
| 452 | + }, | ||
| 453 | + }, | ||
| 454 | + { | ||
| 455 | + field: 'value', | ||
| 456 | + label: '操作值', | ||
| 457 | + require: true, | ||
| 458 | + component: 'InputNumber', | ||
| 459 | + colProps: { | ||
| 460 | + span: 8, | ||
| 461 | + }, | ||
| 462 | + }, | ||
| 463 | + ]; | ||
| 464 | + case 'STRING': | ||
| 465 | + return [ | ||
| 466 | + { | ||
| 467 | + field: 'ignoreCase', | ||
| 468 | + label: '忽略大小写', | ||
| 469 | + component: 'Checkbox', | ||
| 470 | + labelWidth: 150, | ||
| 471 | + colProps: { | ||
| 472 | + span: 7, | ||
| 473 | + }, | ||
| 474 | + }, | ||
| 475 | + { | ||
| 476 | + field: 'operation', | ||
| 477 | + label: '执行操作', | ||
| 478 | + component: 'Select', | ||
| 479 | + require: true, | ||
| 480 | + componentProps: { | ||
| 481 | + options: [ | ||
| 482 | + { label: '等于', value: String_Operation.EQUAL }, | ||
| 483 | + { label: '不等于', value: String_Operation.NOT_EQUAL }, | ||
| 484 | + { label: '开始于', value: String_Operation.BEGAN_IN }, | ||
| 485 | + { label: '结束于', value: String_Operation.END_IN }, | ||
| 486 | + { label: '包含', value: String_Operation.INCLUDE }, | ||
| 487 | + { label: '不包含', value: String_Operation.NOT_INCLUDE }, | ||
| 488 | + ], | ||
| 489 | + }, | ||
| 490 | + colProps: { | ||
| 491 | + span: 7, | ||
| 492 | + }, | ||
| 493 | + }, | ||
| 494 | + { | ||
| 495 | + field: 'value', | ||
| 496 | + label: '操作值', | ||
| 497 | + require: true, | ||
| 498 | + component: 'Input', | ||
| 499 | + colProps: { | ||
| 500 | + span: 7, | ||
| 501 | + }, | ||
| 502 | + }, | ||
| 503 | + ]; | ||
| 504 | + case 'BOOLEAN': | ||
| 505 | + return [ | ||
| 506 | + { | ||
| 507 | + field: 'operation', | ||
| 508 | + label: '执行操作', | ||
| 509 | + component: 'Select', | ||
| 510 | + require: true, | ||
| 511 | + componentProps: { | ||
| 512 | + options: [ | ||
| 513 | + { label: '等于', value: Boolean_Operation.EQUAL }, | ||
| 514 | + { label: '不等于', value: Boolean_Operation.NOT_EQUAL }, | ||
| 515 | + ], | ||
| 516 | + }, | ||
| 517 | + colProps: { | ||
| 518 | + span: 8, | ||
| 519 | + }, | ||
| 520 | + }, | ||
| 521 | + { | ||
| 522 | + field: 'value', | ||
| 523 | + label: '操作值', | ||
| 524 | + component: 'Select', | ||
| 525 | + require: true, | ||
| 526 | + componentProps: { | ||
| 527 | + options: [ | ||
| 528 | + { | ||
| 529 | + label: '真', | ||
| 530 | + value: 'true', | ||
| 531 | + }, | ||
| 532 | + { | ||
| 533 | + label: '假', | ||
| 534 | + value: 'false', | ||
| 535 | + }, | ||
| 536 | + ], | ||
| 537 | + }, | ||
| 538 | + colProps: { | ||
| 539 | + span: 8, | ||
| 540 | + }, | ||
| 541 | + }, | ||
| 542 | + ]; | ||
| 543 | + case 'TIME': | ||
| 544 | + return [ | ||
| 545 | + { | ||
| 546 | + field: 'operation', | ||
| 547 | + label: '执行操作', | ||
| 548 | + require: true, | ||
| 549 | + component: 'Select', | ||
| 550 | + componentProps: { | ||
| 551 | + options: [ | ||
| 552 | + { label: '等于', value: Number_Operation.EQUAL }, | ||
| 553 | + { label: '不等于', value: Number_Operation.NOT_EQUAL }, | ||
| 554 | + { label: '小于', value: Number_Operation.LESS }, | ||
| 555 | + { label: '小于等于', value: Number_Operation.LESS_OR_EQUAL }, | ||
| 556 | + { label: '大于', value: Number_Operation.GREATER }, | ||
| 557 | + { label: '大于等于', value: Number_Operation.GREATER_OR_EQUAL }, | ||
| 558 | + ], | ||
| 559 | + }, | ||
| 560 | + colProps: { | ||
| 561 | + span: 8, | ||
| 562 | + }, | ||
| 563 | + }, | ||
| 564 | + { | ||
| 565 | + field: 'value', | ||
| 566 | + label: '操作值', | ||
| 567 | + require: true, | ||
| 568 | + component: 'DatePicker', | ||
| 569 | + componentProps: { | ||
| 570 | + showTime: true, | ||
| 571 | + }, | ||
| 572 | + colProps: { | ||
| 573 | + span: 8, | ||
| 574 | + }, | ||
| 575 | + }, | ||
| 576 | + ]; | ||
| 577 | + } | ||
| 578 | +} | ||
| 579 | +export function conditionPreView(data, operationType) { | ||
| 580 | + if (operationType === 'NUMERIC' || operationType === 'TIME') { | ||
| 581 | + const { EQUAL, NOT_EQUAL, LESS, LESS_OR_EQUAL, GREATER, GREATER_OR_EQUAL } = Number_Operation; | ||
| 582 | + return data.map((item) => { | ||
| 583 | + return { | ||
| 584 | + operation: | ||
| 585 | + item?.operation === EQUAL | ||
| 586 | + ? '等于' | ||
| 587 | + : item?.operation === NOT_EQUAL | ||
| 588 | + ? '不等于' | ||
| 589 | + : item?.operation === LESS | ||
| 590 | + ? '小于' | ||
| 591 | + : item?.operation === LESS_OR_EQUAL | ||
| 592 | + ? '小于等于' | ||
| 593 | + : item?.operation === GREATER | ||
| 594 | + ? '大于' | ||
| 595 | + : item?.operation === GREATER_OR_EQUAL | ||
| 596 | + ? '大于等于' | ||
| 597 | + : '', | ||
| 598 | + value: item.value, | ||
| 599 | + attribute: item.attribute, | ||
| 600 | + }; | ||
| 601 | + }); | ||
| 602 | + } else if (operationType === 'STRING') { | ||
| 603 | + const { EQUAL, NOT_EQUAL, BEGAN_IN, END_IN, INCLUDE, NOT_INCLUDE } = String_Operation; | ||
| 604 | + return data.map((item) => { | ||
| 605 | + return { | ||
| 606 | + operation: | ||
| 607 | + item?.operation === EQUAL | ||
| 608 | + ? '等于' | ||
| 609 | + : item?.operation === NOT_EQUAL | ||
| 610 | + ? '不等于' | ||
| 611 | + : item?.operation === BEGAN_IN | ||
| 612 | + ? '开始于' | ||
| 613 | + : item?.operation === END_IN | ||
| 614 | + ? '结束于' | ||
| 615 | + : item?.operation === INCLUDE | ||
| 616 | + ? '包含' | ||
| 617 | + : item?.operation === NOT_INCLUDE | ||
| 618 | + ? '不包含' | ||
| 619 | + : '', | ||
| 620 | + value: item.value, | ||
| 621 | + attribute: item.attribute, | ||
| 622 | + }; | ||
| 623 | + }); | ||
| 624 | + } else if (operationType === 'BOOLEAN') { | ||
| 625 | + const { EQUAL, NOT_EQUAL } = Boolean_Operation; | ||
| 626 | + return data.map((item) => { | ||
| 627 | + return { | ||
| 628 | + operation: | ||
| 629 | + item?.operation === EQUAL ? '等于' : item?.operation === NOT_EQUAL ? '不等于' : '', | ||
| 630 | + value: item.value, | ||
| 631 | + attribute: item.attribute, | ||
| 632 | + }; | ||
| 633 | + }); | ||
| 634 | + } | ||
| 635 | +} |
src/views/rule/linkedge/cpns/ClearAlarm.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <CollapseContainer style="background-color: #f2f2f2" title="清除告警" :canExpan="false"> | ||
| 4 | + <template #action> | ||
| 5 | + <div> | ||
| 6 | + <span class="mr-2">启用规则</span> | ||
| 7 | + <RadioGroup v-model:value="schedule" :options="scheduleOptions" /> | ||
| 8 | + </div> | ||
| 9 | + </template> | ||
| 10 | + <BasicForm @register="registerForm"> | ||
| 11 | + <template #operationType="{ model, field }"> | ||
| 12 | + <Select | ||
| 13 | + :options="options" | ||
| 14 | + v-model:value="model[field]" | ||
| 15 | + @change="operationType = model[field]" | ||
| 16 | + placeholder="请选择比较类型" | ||
| 17 | + allowClear | ||
| 18 | + /> | ||
| 19 | + </template> | ||
| 20 | + </BasicForm> | ||
| 21 | + <Card size="small" :bordered="false" style="border: 2px dashed #797979" v-if="operationType"> | ||
| 22 | + <ConditionScreening | ||
| 23 | + :childGetFieldsValue="childGetFieldsValue" | ||
| 24 | + ref="conditionScreeningRef" | ||
| 25 | + /> | ||
| 26 | + </Card> | ||
| 27 | + </CollapseContainer> | ||
| 28 | + </div> | ||
| 29 | +</template> | ||
| 30 | +<script lang="ts" setup> | ||
| 31 | + import { ref, provide } from 'vue'; | ||
| 32 | + import { CollapseContainer } from '/@/components/Container/index'; | ||
| 33 | + import { BasicForm, useForm } from '/@/components/Form/index'; | ||
| 34 | + import { RadioGroup, Card, Select } from 'ant-design-vue'; | ||
| 35 | + import { trigger_condition_schema } from '../config'; | ||
| 36 | + import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | ||
| 37 | + import ConditionScreening from './ConditionScreening.vue'; | ||
| 38 | + | ||
| 39 | + const [registerForm, { resetFields, getFieldsValue, updateSchema, setFieldsValue }] = useForm({ | ||
| 40 | + schemas: trigger_condition_schema, | ||
| 41 | + showActionButtonGroup: false, | ||
| 42 | + }); | ||
| 43 | + | ||
| 44 | + const updateFieldDeviceId = (deviceList: any[]) => { | ||
| 45 | + updateSchema({ | ||
| 46 | + field: 'entityId', | ||
| 47 | + componentProps: { | ||
| 48 | + options: deviceList, | ||
| 49 | + onChange(e) { | ||
| 50 | + if (e) { | ||
| 51 | + updateFieldAttributeFunc(); | ||
| 52 | + } | ||
| 53 | + }, | ||
| 54 | + }, | ||
| 55 | + }); | ||
| 56 | + }; | ||
| 57 | + const conditionScreeningRef = ref(); | ||
| 58 | + const resetFieldsValueFunc = () => resetFields(); | ||
| 59 | + // 回显数据函数 | ||
| 60 | + const setFieldsFormValueFun = (fieldsValue) => { | ||
| 61 | + setFieldsValue(fieldsValue); | ||
| 62 | + }; | ||
| 63 | + const updateFieldAttributeFunc = async () => { | ||
| 64 | + const data = await getAttribute(); | ||
| 65 | + const options = data.map((m) => { | ||
| 66 | + return { | ||
| 67 | + label: m, | ||
| 68 | + value: m, | ||
| 69 | + }; | ||
| 70 | + }); | ||
| 71 | + updateSchema({ | ||
| 72 | + field: 'type2', | ||
| 73 | + componentProps: { | ||
| 74 | + placeholder: '请选择属性', | ||
| 75 | + options, | ||
| 76 | + }, | ||
| 77 | + }); | ||
| 78 | + }; | ||
| 79 | + const schedule = ref('ANY_TIME'); | ||
| 80 | + const scheduleOptions = [ | ||
| 81 | + { label: '始终启用', value: 'ANY_TIME' }, | ||
| 82 | + { label: '定时启用', value: 'SPECIFIC_TIME' }, | ||
| 83 | + { label: '自定义启用', value: 'SPECIFIC_TIME' }, | ||
| 84 | + ]; | ||
| 85 | + const operationType = ref<string>(''); | ||
| 86 | + const options = [ | ||
| 87 | + { | ||
| 88 | + label: '数字', | ||
| 89 | + value: 'NUMERIC', | ||
| 90 | + }, | ||
| 91 | + { | ||
| 92 | + label: '布尔值', | ||
| 93 | + value: 'BOOLEAN', | ||
| 94 | + }, | ||
| 95 | + { | ||
| 96 | + label: '字符串', | ||
| 97 | + value: 'STRING', | ||
| 98 | + }, | ||
| 99 | + { | ||
| 100 | + label: '时间', | ||
| 101 | + value: 'TIME', | ||
| 102 | + }, | ||
| 103 | + ]; | ||
| 104 | + const childGetFieldsValue = () => getFieldsValue(); | ||
| 105 | + provide('operationType', operationType); | ||
| 106 | + | ||
| 107 | + defineExpose({ | ||
| 108 | + getFieldsValue, | ||
| 109 | + updateFieldDeviceId, | ||
| 110 | + resetFieldsValueFunc, | ||
| 111 | + setFieldsFormValueFun, | ||
| 112 | + childGetFieldsValue, | ||
| 113 | + conditionScreeningRef, | ||
| 114 | + schedule, | ||
| 115 | + }); | ||
| 116 | +</script> |
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <CollapseContainer ref="collapseContainerRef" @expand="handleExpand"> | ||
| 4 | + <template #title> | ||
| 5 | + <div>条件筛选</div> | ||
| 6 | + <RichText | ||
| 7 | + :firstAttribute="firstAttribute" | ||
| 8 | + :otherAttribute="otherAttribute" | ||
| 9 | + @resetFilter="resetFilter" | ||
| 10 | + /></template> | ||
| 11 | + | ||
| 12 | + <template v-for="(item, index) in conditionScreeningList" :key="item"> | ||
| 13 | + <ConditionScreeningForm | ||
| 14 | + :conditionScreeningList="conditionScreeningList" | ||
| 15 | + :ref="refItem.conditionScreeningRefs" | ||
| 16 | + :index="index" | ||
| 17 | + @deleteConditionForm="deleteConditionForm" | ||
| 18 | + /> | ||
| 19 | + </template> | ||
| 20 | + </CollapseContainer> | ||
| 21 | + | ||
| 22 | + <div class="flex justify-between"> | ||
| 23 | + <a-button type="primary" class="mt-4 ml-2" @click="addConditionForm">新增条件筛选</a-button> | ||
| 24 | + <a-button type="primary" class="mt-4 mr-2" @click="preView" v-if="isPreview">保存</a-button> | ||
| 25 | + </div> | ||
| 26 | + </div> | ||
| 27 | +</template> | ||
| 28 | + | ||
| 29 | +<script lang="ts" setup> | ||
| 30 | + import { unref, ref } from 'vue'; | ||
| 31 | + import ConditionScreeningForm from './ConditionScreeningForm.vue'; | ||
| 32 | + import { conditionPreView } from '../config.ts'; | ||
| 33 | + import { CollapseContainer } from '/@/components/Container/index'; | ||
| 34 | + import RichText from './RichText.vue'; | ||
| 35 | + const props = defineProps({ | ||
| 36 | + childGetFieldsValue: { | ||
| 37 | + type: Function, | ||
| 38 | + required: true, | ||
| 39 | + }, | ||
| 40 | + }); | ||
| 41 | + const refItem = { | ||
| 42 | + conditionScreeningRefs: ref([]), | ||
| 43 | + }; | ||
| 44 | + | ||
| 45 | + const isPreview = ref(true); | ||
| 46 | + const collapseContainerRef = ref(); | ||
| 47 | + const conditionScreeningList = ref([Date.now()]); | ||
| 48 | + const addConditionForm = () => { | ||
| 49 | + if (!unref(isPreview)) { | ||
| 50 | + collapseContainerRef.value.handleExpand(); | ||
| 51 | + } | ||
| 52 | + unref(conditionScreeningList).push(Date.now()); | ||
| 53 | + }; | ||
| 54 | + const handleExpand = (show) => { | ||
| 55 | + isPreview.value = show; | ||
| 56 | + }; | ||
| 57 | + | ||
| 58 | + const firstAttribute = ref({}); | ||
| 59 | + const otherAttribute = ref([]); | ||
| 60 | + // 预览条件筛选结果 | ||
| 61 | + const preView = async () => { | ||
| 62 | + const attributes = []; | ||
| 63 | + const fieldsValue = props.childGetFieldsValue(); | ||
| 64 | + for (let i = 0; i < unref(refItem.conditionScreeningRefs).length; i++) { | ||
| 65 | + // const valid = await unref(refItem.conditionScreeningRefs)[i].validate(); | ||
| 66 | + console.log(unref(refItem.conditionScreeningRefs)[i]); | ||
| 67 | + // if (!valid) return; | ||
| 68 | + if (i === 0) { | ||
| 69 | + const attr = conditionPreView( | ||
| 70 | + [ | ||
| 71 | + { | ||
| 72 | + ...unref(refItem.conditionScreeningRefs)[i].getFieldsValue(), | ||
| 73 | + attribute: fieldsValue.type2, | ||
| 74 | + }, | ||
| 75 | + ], | ||
| 76 | + fieldsValue.operationType | ||
| 77 | + ); | ||
| 78 | + firstAttribute.value = attr[0]; | ||
| 79 | + continue; | ||
| 80 | + } | ||
| 81 | + attributes.push({ | ||
| 82 | + ...unref(refItem.conditionScreeningRefs)[i].getFieldsValue(), | ||
| 83 | + attribute: fieldsValue.type2, | ||
| 84 | + }); | ||
| 85 | + } | ||
| 86 | + otherAttribute.value = conditionPreView(attributes, fieldsValue.operationType); | ||
| 87 | + collapseContainerRef.value.handleExpand(); | ||
| 88 | + }; | ||
| 89 | + | ||
| 90 | + const resetFilter = () => { | ||
| 91 | + firstAttribute.value = {}; | ||
| 92 | + otherAttribute.value = []; | ||
| 93 | + }; | ||
| 94 | + const deleteConditionForm = (index) => { | ||
| 95 | + unref(conditionScreeningList).splice(index, 1); | ||
| 96 | + }; | ||
| 97 | + defineExpose({ | ||
| 98 | + refItem, | ||
| 99 | + }); | ||
| 100 | +</script> |
| 1 | +<template> | ||
| 2 | + <div class="flex" style="align-items: center"> | ||
| 3 | + <BasicForm @register="registerFormCondition" class="basicStyle" /> | ||
| 4 | + <Tooltip title="移除" class="ml-4"> | ||
| 5 | + <Icon | ||
| 6 | + icon="fluent:delete-off-20-regular" | ||
| 7 | + size="20" | ||
| 8 | + class="mr-2 cursor-pointer" | ||
| 9 | + @click="deleteConditionForm(index)" | ||
| 10 | + /> | ||
| 11 | + </Tooltip> | ||
| 12 | + </div> | ||
| 13 | +</template> | ||
| 14 | + | ||
| 15 | +<script lang="ts" setup> | ||
| 16 | + import { watch, ref, onMounted, inject } from 'vue'; | ||
| 17 | + import { BasicForm, useForm } from '/@/components/Form/index'; | ||
| 18 | + import { Icon } from '/@/components/Icon'; | ||
| 19 | + import { Tooltip } from 'ant-design-vue'; | ||
| 20 | + import { isType } from '../config.ts'; | ||
| 21 | + defineProps({ | ||
| 22 | + index: { | ||
| 23 | + type: Number, | ||
| 24 | + required: true, | ||
| 25 | + }, | ||
| 26 | + conditionScreeningList: { | ||
| 27 | + type: Array, | ||
| 28 | + default: () => [], | ||
| 29 | + }, | ||
| 30 | + }); | ||
| 31 | + const emit = defineEmits(['deleteConditionForm']); | ||
| 32 | + const operationType = inject('operationType'); | ||
| 33 | + let schemas = ref([]); | ||
| 34 | + onMounted(() => { | ||
| 35 | + schemas.value = isType(operationType.value); | ||
| 36 | + }); | ||
| 37 | + watch(operationType, (newValue) => { | ||
| 38 | + schemas.value = isType(newValue); | ||
| 39 | + resetFields(); | ||
| 40 | + }); | ||
| 41 | + const [ | ||
| 42 | + registerFormCondition, | ||
| 43 | + { | ||
| 44 | + resetFields, | ||
| 45 | + appendSchemaByField, | ||
| 46 | + removeSchemaByFiled, | ||
| 47 | + getFieldsValue, | ||
| 48 | + setFieldsValue, | ||
| 49 | + validate, | ||
| 50 | + }, | ||
| 51 | + ] = useForm({ | ||
| 52 | + showActionButtonGroup: false, | ||
| 53 | + labelWidth: 100, | ||
| 54 | + compact: true, | ||
| 55 | + schemas, | ||
| 56 | + }); | ||
| 57 | + const deleteConditionForm = (index: number) => { | ||
| 58 | + emit('deleteConditionForm', index); | ||
| 59 | + }; | ||
| 60 | + defineExpose({ | ||
| 61 | + appendSchemaByField, | ||
| 62 | + removeSchemaByFiled, | ||
| 63 | + getFieldsValue, | ||
| 64 | + setFieldsValue, | ||
| 65 | + validate, | ||
| 66 | + }); | ||
| 67 | +</script> | ||
| 68 | + | ||
| 69 | +<style lang="less"> | ||
| 70 | + .basicStyle { | ||
| 71 | + margin-top: 0.5rem; | ||
| 72 | + width: 80%; | ||
| 73 | + border: 2px dashed #797979; | ||
| 74 | + padding: 1rem 0 0.5rem; | ||
| 75 | + border-radius: 0.25rem; | ||
| 76 | + } | ||
| 77 | + .ant-input-number { | ||
| 78 | + width: 200px; | ||
| 79 | + } | ||
| 80 | +</style> |
src/views/rule/linkedge/cpns/RichText.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="flex ml-4" v-if="firstAttribute?.value && firstAttribute?.attribute"> | ||
| 3 | + <div class="text" style="color: #305680">{{ firstAttribute?.attribute }}</div> | ||
| 4 | + {{ firstAttribute?.operation }} | ||
| 5 | + <div class="text" style="color: #ff8c68">{{ firstAttribute?.value }}</div> | ||
| 6 | + {{ firstAttribute?.compoundConditions ?? '' }} | ||
| 7 | + </div> | ||
| 8 | + <div | ||
| 9 | + v-if="otherAttribute.length > 0 && otherAttribute[0].value && otherAttribute[0].operation" | ||
| 10 | + class="flex" | ||
| 11 | + > | ||
| 12 | + <template v-for="item in otherAttribute" :key="item.value"> | ||
| 13 | + <div class="flex" v-if="item?.value && item?.attribute"> | ||
| 14 | + <div class="text mr-2" style="color: #305680">{{ item.attribute }}</div> | ||
| 15 | + {{ item.operation }} | ||
| 16 | + <div class="text ml-2" style="color: #ff8c68">{{ item.value }}</div> | ||
| 17 | + {{ item.compoundConditions ?? '' }} | ||
| 18 | + </div> | ||
| 19 | + </template> | ||
| 20 | + </div> | ||
| 21 | +</template> | ||
| 22 | + | ||
| 23 | +<script lang="ts" setup> | ||
| 24 | + import { watch, inject } from 'vue'; | ||
| 25 | + defineProps({ | ||
| 26 | + firstAttribute: { | ||
| 27 | + type: Object, | ||
| 28 | + default: () => {}, | ||
| 29 | + }, | ||
| 30 | + otherAttribute: { | ||
| 31 | + type: Array, | ||
| 32 | + default: () => [], | ||
| 33 | + }, | ||
| 34 | + }); | ||
| 35 | + const emit = defineEmits(['resetFilter']); | ||
| 36 | + const operationType = inject('operationType'); | ||
| 37 | + watch(operationType, () => { | ||
| 38 | + emit('resetFilter'); | ||
| 39 | + }); | ||
| 40 | +</script> | ||
| 41 | + | ||
| 42 | +<style scoped> | ||
| 43 | + .text { | ||
| 44 | + border: 1px solid #d2d2d2; | ||
| 45 | + border-radius: 5px; | ||
| 46 | + padding: 0 5px; | ||
| 47 | + margin: 0 5px; | ||
| 48 | + } | ||
| 49 | + .parentheses { | ||
| 50 | + font-size: 16px; | ||
| 51 | + } | ||
| 52 | +</style> |
| 1 | <template> | 1 | <template> |
| 2 | - <CollapseContainer style="background-color: #f8f9fa" :title="`执行动作 ${actionIndex + 1}`"> | 2 | + <CollapseContainer style="background-color: #f2f2f2" :title="`执行动作 ${actionIndex + 1}`"> |
| 3 | <template #action> | 3 | <template #action> |
| 4 | <Tooltip title="移除" v-if="actionData.length > 1"> | 4 | <Tooltip title="移除" v-if="actionData.length > 1"> |
| 5 | <Icon | 5 | <Icon |
| @@ -11,6 +11,15 @@ | @@ -11,6 +11,15 @@ | ||
| 11 | </Tooltip> | 11 | </Tooltip> |
| 12 | </template> | 12 | </template> |
| 13 | <BasicForm @register="registerAction"> | 13 | <BasicForm @register="registerAction"> |
| 14 | + <template #outTarget="{ model, field }"> | ||
| 15 | + <Select | ||
| 16 | + :options="options" | ||
| 17 | + v-model:value="model[field]" | ||
| 18 | + @change="changeOutTarget" | ||
| 19 | + placeholder="请选择执行动作" | ||
| 20 | + allowClear | ||
| 21 | + :disabled="hasDisabled" | ||
| 22 | + /></template> | ||
| 14 | <template #doContext> | 23 | <template #doContext> |
| 15 | <div class="flex"> | 24 | <div class="flex"> |
| 16 | <div ref="jsoneditorRef" style="height: 100%; width: 100%"></div> | 25 | <div ref="jsoneditorRef" style="height: 100%; width: 100%"></div> |
| @@ -18,109 +27,159 @@ | @@ -18,109 +27,159 @@ | ||
| 18 | title='{"method":"setDOValue","params":{"devID":"492S211218028819","data":{"DO1":1}}}' | 27 | title='{"method":"setDOValue","params":{"devID":"492S211218028819","data":{"DO1":1}}}' |
| 19 | class="ml-2" | 28 | class="ml-2" |
| 20 | > | 29 | > |
| 21 | - <QuestionCircleOutlined style="font-size: 1rem" | ||
| 22 | - /></Tooltip> | 30 | + <QuestionCircleOutlined style="font-size: 1rem" /> |
| 31 | + </Tooltip> | ||
| 23 | </div> | 32 | </div> |
| 24 | </template> | 33 | </template> |
| 34 | + <template #clearAlarm> | ||
| 35 | + <Checkbox v-model:checked="checked"> 清除告警 </Checkbox> | ||
| 36 | + </template> | ||
| 25 | </BasicForm> | 37 | </BasicForm> |
| 38 | + <Card | ||
| 39 | + v-if="checked" | ||
| 40 | + :bordered="false" | ||
| 41 | + style="border: 2px dashed #797979" | ||
| 42 | + :bodyStyle="{ padding: 0 }" | ||
| 43 | + > | ||
| 44 | + <ClearAlarm ref="clearAlarmRef" /> | ||
| 45 | + </Card> | ||
| 26 | </CollapseContainer> | 46 | </CollapseContainer> |
| 27 | </template> | 47 | </template> |
| 28 | -<script lang="ts"> | ||
| 29 | - import { defineComponent, ref, onMounted, nextTick, unref } from 'vue'; | 48 | +<script lang="ts" setup> |
| 49 | + import { ref, onMounted, nextTick, unref, computed, provide } from 'vue'; | ||
| 30 | import { CollapseContainer } from '/@/components/Container/index'; | 50 | import { CollapseContainer } from '/@/components/Container/index'; |
| 31 | import { BasicForm, useForm } from '/@/components/Form/index'; | 51 | import { BasicForm, useForm } from '/@/components/Form/index'; |
| 32 | - import { Tooltip } from 'ant-design-vue'; | 52 | + import { Tooltip, Select, Checkbox, Card } from 'ant-design-vue'; |
| 33 | import { Icon } from '/@/components/Icon'; | 53 | import { Icon } from '/@/components/Icon'; |
| 34 | - import { useActionDrawerSchema } from '../config'; | 54 | + import { actionSchema } from '../config'; |
| 35 | import jsoneditor from 'jsoneditor'; | 55 | import jsoneditor from 'jsoneditor'; |
| 36 | import 'jsoneditor/dist/jsoneditor.min.css'; | 56 | import 'jsoneditor/dist/jsoneditor.min.css'; |
| 37 | - import { Tooltip } from 'ant-design-vue'; | ||
| 38 | import { QuestionCircleOutlined } from '@ant-design/icons-vue'; | 57 | import { QuestionCircleOutlined } from '@ant-design/icons-vue'; |
| 58 | + import { useUserStore } from '/@/store/modules/user'; | ||
| 59 | + import ClearAlarm from './ClearAlarm.vue'; | ||
| 60 | + defineProps({ | ||
| 61 | + actionIndex: { | ||
| 62 | + type: Number, | ||
| 63 | + required: true, | ||
| 64 | + }, | ||
| 65 | + actionData: { | ||
| 66 | + type: Array, | ||
| 67 | + default: () => [], | ||
| 68 | + }, | ||
| 69 | + }); | ||
| 70 | + const emit = defineEmits(['deleteAction']); | ||
| 71 | + const userStore = useUserStore(); | ||
| 72 | + const options = computed(() => { | ||
| 73 | + return [ | ||
| 74 | + { label: '设备输出', value: 'DEVICE_OUT' }, | ||
| 75 | + { label: '告警输出', value: 'MSG_NOTIFY', disabled: userStore.getOutTarget === 'MSG_NOTIFY' }, | ||
| 76 | + ]; | ||
| 77 | + }); | ||
| 78 | + const hasDisabled = ref(false); | ||
| 79 | + const outTarget = ref(''); | ||
| 80 | + const changeOutTarget = (value: string) => { | ||
| 81 | + outTarget.value = value; | ||
| 82 | + if (value === 'MSG_NOTIFY') { | ||
| 83 | + hasDisabled.value = true; | ||
| 84 | + userStore.setOutTarget(value); | ||
| 85 | + } | ||
| 86 | + }; | ||
| 87 | + const [registerAction, { getFieldsValue, resetFields, updateSchema, setFieldsValue, validate }] = | ||
| 88 | + useForm({ | ||
| 89 | + schemas: actionSchema, | ||
| 90 | + showActionButtonGroup: false, | ||
| 91 | + }); | ||
| 39 | 92 | ||
| 40 | - export default defineComponent({ | ||
| 41 | - components: { CollapseContainer, BasicForm, Tooltip, Icon, Tooltip, QuestionCircleOutlined }, | ||
| 42 | - props: { | ||
| 43 | - actionIndex: { | ||
| 44 | - type: Number, | ||
| 45 | - required: true, | 93 | + // 获取整个执行动作表单值 |
| 94 | + const getFieldsValueFunc = () => { | ||
| 95 | + const predicate = | ||
| 96 | + clearAlarmRef?.value?.conditionScreeningRef?.refItem?.conditionScreeningRefs?.value?.map( | ||
| 97 | + (item) => item.getFieldsValue() | ||
| 98 | + ); | ||
| 99 | + console.log({ | ||
| 100 | + ...getFieldsValue(), | ||
| 101 | + ...clearAlarmRef?.value?.getFieldsValue(), | ||
| 102 | + predicate, | ||
| 103 | + doContext: unref(jsonInstance.value).get(), | ||
| 104 | + schedule: clearAlarmRef?.value?.schedule, | ||
| 105 | + }); | ||
| 106 | + return { | ||
| 107 | + ...getFieldsValue(), | ||
| 108 | + ...clearAlarmRef?.value?.getFieldsValue(), | ||
| 109 | + predicate, | ||
| 110 | + doContext: unref(jsonInstance.value).get(), | ||
| 111 | + schedule: clearAlarmRef?.value?.schedule, | ||
| 112 | + }; | ||
| 113 | + }; | ||
| 114 | + const setFieldsFormValueFun = (fieldsValue) => { | ||
| 115 | + setFieldsValue(fieldsValue); | ||
| 116 | + }; | ||
| 117 | + const resetFieldsValueFunc = () => resetFields(); | ||
| 118 | + const updateFieldDeviceId = (deviceList) => { | ||
| 119 | + updateSchema({ | ||
| 120 | + field: 'deviceId', | ||
| 121 | + componentProps: { | ||
| 122 | + options: deviceList, | ||
| 46 | }, | 123 | }, |
| 47 | - actionData: { | ||
| 48 | - type: Array, | ||
| 49 | - default: () => [], | 124 | + }); |
| 125 | + }; | ||
| 126 | + const updateFieldAlarmConfig = (alarmConfigList) => { | ||
| 127 | + updateSchema({ | ||
| 128 | + field: 'alarm_config', | ||
| 129 | + componentProps: { | ||
| 130 | + options: alarmConfigList, | ||
| 50 | }, | 131 | }, |
| 51 | - }, | ||
| 52 | - emits: ['deleteAction'], | ||
| 53 | - setup(props, { emit }) { | ||
| 54 | - const [ | ||
| 55 | - registerAction, | ||
| 56 | - { getFieldsValue, resetFields, updateSchema, setFieldsValue, validate }, | ||
| 57 | - ] = useForm({ | ||
| 58 | - schemas: useActionDrawerSchema, | ||
| 59 | - showActionButtonGroup: false, | ||
| 60 | - }); | ||
| 61 | - const getFieldsValueFunc = () => ({ | ||
| 62 | - ...getFieldsValue(), | ||
| 63 | - doContext: unref(jsonInstance.value).get(), | ||
| 64 | - }); | ||
| 65 | - const setFieldsFormValueFun = (fieldsValue) => { | ||
| 66 | - setFieldsValue(fieldsValue); | ||
| 67 | - }; | ||
| 68 | - const resetFieldsValueFunc = () => resetFields(); | ||
| 69 | - const updateFieldDeviceId = (deviceList) => { | ||
| 70 | - updateSchema({ | ||
| 71 | - field: 'deviceId', | ||
| 72 | - componentProps: { | ||
| 73 | - options: deviceList, | ||
| 74 | - }, | ||
| 75 | - }); | ||
| 76 | - }; | ||
| 77 | - const validateForm = () => { | ||
| 78 | - return validate(); | ||
| 79 | - }; | ||
| 80 | - const handleDelete = (actionIndex) => { | ||
| 81 | - emit('deleteAction', actionIndex); | ||
| 82 | - }; | 132 | + }); |
| 133 | + hasDisabled.value = false; | ||
| 134 | + userStore.setOutTarget('DEVICE_OUT'); | ||
| 135 | + }; | ||
| 83 | 136 | ||
| 84 | - // json 以及初始化JSON | ||
| 85 | - const jsoneditorRef = ref(); | ||
| 86 | - const jsonValue = ref({}); | ||
| 87 | - const jsonInstance = ref(); | ||
| 88 | - onMounted(() => { | ||
| 89 | - nextTick(() => { | ||
| 90 | - let options = { | ||
| 91 | - mode: 'code', | ||
| 92 | - mainMenuBar: false, | ||
| 93 | - statusBar: false, | ||
| 94 | - onError(err) { | ||
| 95 | - alert('EF1 ->' + err.toString()); | ||
| 96 | - }, | ||
| 97 | - }; | ||
| 98 | - let editor = new jsoneditor(jsoneditorRef.value, options); | ||
| 99 | - editor.set(jsonValue.value); | ||
| 100 | - jsonInstance.value = editor; | ||
| 101 | - }); | ||
| 102 | - }); | 137 | + const checked = ref(false); |
| 138 | + const validateForm = () => { | ||
| 139 | + return validate(); | ||
| 140 | + }; | ||
| 103 | 141 | ||
| 104 | - const getJsonValue = () => unref(jsonInstance).get(); | ||
| 105 | - const setJsonValue = (Json) => { | ||
| 106 | - nextTick(() => { | ||
| 107 | - unref(jsonInstance).set(Json); | ||
| 108 | - }); | ||
| 109 | - }; | ||
| 110 | - return { | ||
| 111 | - updateFieldDeviceId, | ||
| 112 | - resetFieldsValueFunc, | ||
| 113 | - getFieldsValueFunc, | ||
| 114 | - validateForm, | ||
| 115 | - registerAction, | ||
| 116 | - handleDelete, | ||
| 117 | - setFieldsFormValueFun, | ||
| 118 | - jsoneditorRef, | ||
| 119 | - jsonInstance, | ||
| 120 | - getJsonValue, | ||
| 121 | - setJsonValue, | 142 | + const handleDelete = (actionIndex) => { |
| 143 | + emit('deleteAction', { actionIndex, outTarget }); | ||
| 144 | + }; | ||
| 145 | + | ||
| 146 | + // json 以及初始化JSON | ||
| 147 | + const jsoneditorRef = ref(); | ||
| 148 | + const jsonValue = ref({}); | ||
| 149 | + const jsonInstance = ref(); | ||
| 150 | + onMounted(() => { | ||
| 151 | + nextTick(() => { | ||
| 152 | + let options = { | ||
| 153 | + mode: 'code', | ||
| 154 | + mainMenuBar: false, | ||
| 155 | + statusBar: false, | ||
| 122 | }; | 156 | }; |
| 123 | - }, | 157 | + let editor = new jsoneditor(jsoneditorRef.value, options); |
| 158 | + editor.set(jsonValue.value); | ||
| 159 | + jsonInstance.value = editor; | ||
| 160 | + }); | ||
| 161 | + }); | ||
| 162 | + | ||
| 163 | + const getJsonValue = () => unref(jsonInstance).get(); | ||
| 164 | + const setJsonValue = (Json) => { | ||
| 165 | + nextTick(() => { | ||
| 166 | + unref(jsonInstance).set(Json); | ||
| 167 | + }); | ||
| 168 | + }; | ||
| 169 | + | ||
| 170 | + const operationType = ref<string>(''); | ||
| 171 | + const clearAlarmRef = ref(); | ||
| 172 | + provide('operationType', operationType); | ||
| 173 | + defineExpose({ | ||
| 174 | + getFieldsValueFunc, | ||
| 175 | + setFieldsFormValueFun, | ||
| 176 | + resetFieldsValueFunc, | ||
| 177 | + updateFieldDeviceId, | ||
| 178 | + updateFieldAlarmConfig, | ||
| 179 | + validateForm, | ||
| 180 | + getJsonValue, | ||
| 181 | + setJsonValue, | ||
| 182 | + jsonInstance, | ||
| 124 | }); | 183 | }); |
| 125 | </script> | 184 | </script> |
| 126 | 185 |
| 1 | <template> | 1 | <template> |
| 2 | - <CollapseContainer style="background-color: #f8f9fa" :title="`执行条件 ${conditionIndex + 1}`"> | 2 | + <CollapseContainer style="background-color: #f2f2f2" :title="`执行条件 ${conditionIndex + 1}`"> |
| 3 | <template #action> | 3 | <template #action> |
| 4 | - <Tooltip title="移除"> | ||
| 5 | - <Icon | ||
| 6 | - icon="fluent:delete-off-20-regular" | ||
| 7 | - size="20" | ||
| 8 | - class="mr-2 cursor-pointer" | ||
| 9 | - @click="handleDelete(conditionIndex)" | ||
| 10 | - /> | ||
| 11 | - </Tooltip> | 4 | + <div class="flex"> |
| 5 | + <div> | ||
| 6 | + <span class="mr-2">启用规则</span> | ||
| 7 | + <RadioGroup v-model:value="schedule" :options="scheduleOptions" /> | ||
| 8 | + </div> | ||
| 9 | + <Tooltip title="移除" class="ml-4"> | ||
| 10 | + <Icon | ||
| 11 | + icon="fluent:delete-off-20-regular" | ||
| 12 | + size="20" | ||
| 13 | + class="mr-2 cursor-pointer" | ||
| 14 | + @click="handleDelete(conditionIndex)" | ||
| 15 | + /> | ||
| 16 | + </Tooltip> | ||
| 17 | + </div> | ||
| 12 | </template> | 18 | </template> |
| 13 | - <BasicForm @register="registerCondition" /> | 19 | + <BasicForm @register="registerCondition"> |
| 20 | + <template #operationType="{ model, field }"> | ||
| 21 | + <Select | ||
| 22 | + :options="options" | ||
| 23 | + v-model:value="model[field]" | ||
| 24 | + @change="operationType = model[field]" | ||
| 25 | + placeholder="请选择比较类型" | ||
| 26 | + allowClear | ||
| 27 | + /> | ||
| 28 | + </template> | ||
| 29 | + </BasicForm> | ||
| 30 | + <Card size="small" :bordered="false" style="border: 2px dashed #797979" v-if="operationType"> | ||
| 31 | + <ConditionScreening :childGetFieldsValue="childGetFieldsValue" ref="conditionScreeningRef" /> | ||
| 32 | + </Card> | ||
| 14 | </CollapseContainer> | 33 | </CollapseContainer> |
| 15 | </template> | 34 | </template> |
| 16 | -<script lang="ts"> | ||
| 17 | - import { defineComponent } from 'vue'; | 35 | +<script lang="ts" setup> |
| 36 | + import { ref, provide } from 'vue'; | ||
| 18 | import { CollapseContainer } from '/@/components/Container/index'; | 37 | import { CollapseContainer } from '/@/components/Container/index'; |
| 19 | import { BasicForm, useForm } from '/@/components/Form/index'; | 38 | import { BasicForm, useForm } from '/@/components/Form/index'; |
| 20 | - import { Tooltip } from 'ant-design-vue'; | ||
| 21 | - import { useConditionDrawerSchema } from '../config'; | ||
| 22 | - import { screenLinkPageByDeviceIdGetAttribut } from '/@/api/ruleengine/ruleengineApi'; | 39 | + import { Tooltip, RadioGroup, Card, Select } from 'ant-design-vue'; |
| 40 | + | ||
| 41 | + import { trigger_condition_schema } from '../config'; | ||
| 42 | + import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | ||
| 23 | import { Icon } from '/@/components/Icon'; | 43 | import { Icon } from '/@/components/Icon'; |
| 44 | + import ConditionScreening from './ConditionScreening.vue'; | ||
| 24 | 45 | ||
| 25 | - export default defineComponent({ | ||
| 26 | - components: { CollapseContainer, BasicForm, Tooltip, Icon }, | ||
| 27 | - props: { | ||
| 28 | - conditionIndex: { | ||
| 29 | - type: Number, | ||
| 30 | - required: true, | ||
| 31 | - }, | 46 | + defineProps({ |
| 47 | + conditionIndex: { | ||
| 48 | + type: Number, | ||
| 49 | + required: true, | ||
| 32 | }, | 50 | }, |
| 33 | - emits: ['deleteCondition'], | ||
| 34 | - setup(props, { emit }) { | ||
| 35 | - const [registerCondition, { getFieldsValue, updateSchema, resetFields, setFieldsValue }] = | ||
| 36 | - useForm({ | ||
| 37 | - schemas: useConditionDrawerSchema, | ||
| 38 | - showActionButtonGroup: false, | ||
| 39 | - }); | ||
| 40 | - const getFieldsValueFunc = () => getFieldsValue(); | ||
| 41 | - const resetFieldsValueFunc = () => resetFields(); | ||
| 42 | - const updateFieldDeviceId = (deviceList: any[]) => { | ||
| 43 | - updateSchema({ | ||
| 44 | - field: 'entityId', | ||
| 45 | - componentProps: { | ||
| 46 | - options: deviceList, | ||
| 47 | - onChange(e) { | ||
| 48 | - if (e) { | ||
| 49 | - updateFieldAttributeFunc(e); | ||
| 50 | - } | ||
| 51 | - }, | ||
| 52 | - }, | ||
| 53 | - }); | ||
| 54 | - }; | ||
| 55 | - const updateFieldAttributeFunc = async (e) => { | ||
| 56 | - const data1 = await screenLinkPageByDeviceIdGetAttribut('DEVICE', e); | ||
| 57 | - const data = data1.map((m) => { | ||
| 58 | - return { | ||
| 59 | - label: m, | ||
| 60 | - value: m, | ||
| 61 | - }; | ||
| 62 | - }); | ||
| 63 | - updateSchema({ | ||
| 64 | - field: 'type', | ||
| 65 | - componentProps: { | ||
| 66 | - placeholder: '请选择属性', | ||
| 67 | - options: data, | ||
| 68 | - onChange(e) { | ||
| 69 | - if (e) { | ||
| 70 | - updateSchema([ | ||
| 71 | - { | ||
| 72 | - field: 'operation', | ||
| 73 | - ifShow: true, | ||
| 74 | - }, | ||
| 75 | - { | ||
| 76 | - field: 'value', | ||
| 77 | - ifShow: true, | ||
| 78 | - }, | ||
| 79 | - ]); | ||
| 80 | - } else { | ||
| 81 | - updateSchema([ | ||
| 82 | - { | ||
| 83 | - field: 'operation', | ||
| 84 | - ifShow: false, | ||
| 85 | - }, | ||
| 86 | - { | ||
| 87 | - field: 'value', | ||
| 88 | - ifShow: false, | ||
| 89 | - }, | ||
| 90 | - ]); | ||
| 91 | - } | ||
| 92 | - }, | ||
| 93 | - }, | ||
| 94 | - }); | ||
| 95 | - }; | ||
| 96 | - const setFieldsFormValueFun = (fieldsValue) => { | ||
| 97 | - setFieldsValue(fieldsValue); | ||
| 98 | - }; | ||
| 99 | - const editSelectDevice = () => { | ||
| 100 | - if (props.bindConditionEntryIdFather !== 1) { | ||
| 101 | - setTimeout(() => { | ||
| 102 | - updateSchema({ | ||
| 103 | - field: 'entityId', | ||
| 104 | - componentProps: { | ||
| 105 | - options: props.bindConditionEntryIdFather, | ||
| 106 | - }, | ||
| 107 | - }); | ||
| 108 | - }, 100); | ||
| 109 | - } | ||
| 110 | - }; | 51 | + }); |
| 52 | + const emit = defineEmits(['deleteCondition']); | ||
| 111 | 53 | ||
| 112 | - const handleDelete = (conditionIndex) => { | ||
| 113 | - emit('deleteCondition', conditionIndex); | ||
| 114 | - }; | ||
| 115 | - return { | ||
| 116 | - updateFieldDeviceId, | ||
| 117 | - editSelectDevice, | ||
| 118 | - getFieldsValueFunc, | ||
| 119 | - registerCondition, | ||
| 120 | - resetFieldsValueFunc, | ||
| 121 | - handleDelete, | 54 | + const [registerCondition, { getFieldsValue, updateSchema, resetFields, setFieldsValue }] = |
| 55 | + useForm({ | ||
| 56 | + schemas: trigger_condition_schema, | ||
| 57 | + showActionButtonGroup: false, | ||
| 58 | + }); | ||
| 59 | + const conditionScreeningRef = ref(); | ||
| 60 | + const getFieldsValueFunc = () => { | ||
| 61 | + const predicate = conditionScreeningRef?.value?.refItem?.conditionScreeningRefs?.value?.map( | ||
| 62 | + (item) => { | ||
| 63 | + return item.getFieldsValue(); | ||
| 64 | + } | ||
| 65 | + ); | ||
| 66 | + return { ...getFieldsValue(), predicate, schedule: schedule.value }; | ||
| 67 | + }; | ||
| 68 | + const resetFieldsValueFunc = () => resetFields(); | ||
| 69 | + const updateFieldDeviceId = (deviceList: any[]) => { | ||
| 70 | + updateSchema({ | ||
| 71 | + field: 'entityId', | ||
| 72 | + componentProps: { | ||
| 73 | + options: deviceList, | ||
| 74 | + onChange(e) { | ||
| 75 | + if (e) { | ||
| 76 | + updateFieldAttributeFunc(); | ||
| 77 | + } | ||
| 78 | + }, | ||
| 79 | + }, | ||
| 80 | + }); | ||
| 81 | + }; | ||
| 82 | + const setFieldsFormValueFun = (fieldsValue) => { | ||
| 83 | + setFieldsValue(fieldsValue); | ||
| 84 | + }; | ||
| 85 | + const updateFieldAttributeFunc = async () => { | ||
| 86 | + const data1 = await getAttribute(); | ||
| 87 | + const data = data1.map((m) => ({ label: m, value: m })); | ||
| 88 | + updateSchema({ | ||
| 89 | + field: 'type', | ||
| 90 | + componentProps: { | ||
| 91 | + placeholder: '请选择属性', | ||
| 92 | + options: data, | ||
| 93 | + }, | ||
| 94 | + }); | ||
| 95 | + }; | ||
| 96 | + const handleDelete = (conditionIndex) => { | ||
| 97 | + emit('deleteCondition', conditionIndex); | ||
| 98 | + }; | ||
| 122 | 99 | ||
| 123 | - setFieldsFormValueFun, | ||
| 124 | - }; | 100 | + const schedule = ref('ANY_TIME'); |
| 101 | + const scheduleOptions = [ | ||
| 102 | + { label: '始终启用', value: 'ANY_TIME' }, | ||
| 103 | + { label: '定时启用', value: 'SPECIFIC_TIME' }, | ||
| 104 | + { label: '自定义启用', value: 'CUSTOM' }, | ||
| 105 | + ]; | ||
| 106 | + const operationType = ref<string>(''); | ||
| 107 | + const options = [ | ||
| 108 | + { | ||
| 109 | + label: '数字', | ||
| 110 | + value: 'NUMERIC', | ||
| 111 | + }, | ||
| 112 | + { | ||
| 113 | + label: '布尔值', | ||
| 114 | + value: 'BOOLEAN', | ||
| 115 | + }, | ||
| 116 | + { | ||
| 117 | + label: '字符串', | ||
| 118 | + value: 'STRING', | ||
| 125 | }, | 119 | }, |
| 120 | + { | ||
| 121 | + label: '时间', | ||
| 122 | + value: 'TIME', | ||
| 123 | + }, | ||
| 124 | + ]; | ||
| 125 | + provide('operationType', operationType); | ||
| 126 | + | ||
| 127 | + // 子组件获取父组件的值 | ||
| 128 | + const childGetFieldsValue = () => getFieldsValue(); | ||
| 129 | + | ||
| 130 | + defineExpose({ | ||
| 131 | + getFieldsValueFunc, | ||
| 132 | + updateFieldDeviceId, | ||
| 133 | + resetFieldsValueFunc, | ||
| 134 | + setFieldsFormValueFun, | ||
| 135 | + childGetFieldsValue, | ||
| 126 | }); | 136 | }); |
| 127 | </script> | 137 | </script> |
| 1 | -export const formatTriggerData = (triggerData) => { | ||
| 2 | - const { triggerType, entityId, type1, type2, operation, value } = triggerData; | ||
| 3 | - return { | 1 | +export const genTriggerData = (triggerData) => { |
| 2 | + const { | ||
| 4 | triggerType, | 3 | triggerType, |
| 5 | entityId, | 4 | entityId, |
| 5 | + type1, | ||
| 6 | + type2, | ||
| 7 | + device, | ||
| 8 | + detail, | ||
| 9 | + predicate, | ||
| 10 | + operationType, | ||
| 11 | + triggered, | ||
| 12 | + schedule, | ||
| 13 | + } = triggerData; | ||
| 14 | + const mapPredicate = predicate.map((item) => { | ||
| 15 | + return { | ||
| 16 | + key: { | ||
| 17 | + type: type1, | ||
| 18 | + key: type2, | ||
| 19 | + }, | ||
| 20 | + valueType: operationType, | ||
| 21 | + value: null, | ||
| 22 | + predicate: { | ||
| 23 | + type: operationType, | ||
| 24 | + operation: item.operation, | ||
| 25 | + value: { | ||
| 26 | + defaultValue: item.value, | ||
| 27 | + userValue: null, | ||
| 28 | + dynamicValue: null, | ||
| 29 | + }, | ||
| 30 | + }, | ||
| 31 | + }; | ||
| 32 | + }); | ||
| 33 | + return { | ||
| 34 | + triggerType, | ||
| 35 | + entityType: device, | ||
| 36 | + entityId: entityId?.length ? entityId : null, | ||
| 6 | triggerCondition: { | 37 | triggerCondition: { |
| 7 | - condition: [ | ||
| 8 | - { | ||
| 9 | - key: { | ||
| 10 | - type: type1, | ||
| 11 | - key: type2, | ||
| 12 | - }, | ||
| 13 | - valueType: 'NUMERIC', | ||
| 14 | - predicate: { | ||
| 15 | - type: 'NUMERIC', | ||
| 16 | - operation: operation, | ||
| 17 | - value: { | ||
| 18 | - defaultValue: Number(value), | ||
| 19 | - }, | ||
| 20 | - }, | 38 | + alarmDetails: detail, |
| 39 | + condition: { | ||
| 40 | + condition: mapPredicate, | ||
| 41 | + spec: { | ||
| 42 | + type: triggered, | ||
| 43 | + // unit: 'SECONDS', | ||
| 44 | + // predicate: { | ||
| 45 | + // defaultValue: 30, | ||
| 46 | + // userValue: null, | ||
| 47 | + // dynamicValue: null, | ||
| 48 | + // }, | ||
| 21 | }, | 49 | }, |
| 22 | - ], | ||
| 23 | - spec: { | ||
| 24 | - type: 'SIMPLE', | 50 | + }, |
| 51 | + schedule: { | ||
| 52 | + type: schedule, | ||
| 53 | + // timezone: 'Asia/Shanghai', | ||
| 54 | + // daysOfWeek: [2, 3], | ||
| 55 | + // startsOn: 8700000, | ||
| 56 | + // endsOn: 30300000, | ||
| 25 | }, | 57 | }, |
| 26 | }, | 58 | }, |
| 27 | }; | 59 | }; |
| 28 | }; | 60 | }; |
| 29 | 61 | ||
| 30 | -export const formatConditionData = (conditionData) => { | ||
| 31 | - const { triggerType, entityId, type, operation, value } = conditionData; | ||
| 32 | - return { | 62 | +export const genConditionData = (actionData) => { |
| 63 | + const { | ||
| 33 | triggerType, | 64 | triggerType, |
| 34 | entityId, | 65 | entityId, |
| 66 | + type1, | ||
| 67 | + type2, | ||
| 68 | + device, | ||
| 69 | + detail, | ||
| 70 | + predicate, | ||
| 71 | + operationType, | ||
| 72 | + triggered, | ||
| 73 | + schedule, | ||
| 74 | + } = actionData; | ||
| 75 | + const mapPredicate = predicate.map((item) => { | ||
| 76 | + return { | ||
| 77 | + key: { | ||
| 78 | + type: type1, | ||
| 79 | + key: type2, | ||
| 80 | + }, | ||
| 81 | + valueType: operationType, | ||
| 82 | + value: null, | ||
| 83 | + predicate: { | ||
| 84 | + type: operationType, | ||
| 85 | + operation: item.operation, | ||
| 86 | + value: { | ||
| 87 | + defaultValue: item.value, | ||
| 88 | + userValue: null, | ||
| 89 | + dynamicValue: null, | ||
| 90 | + }, | ||
| 91 | + }, | ||
| 92 | + }; | ||
| 93 | + }); | ||
| 94 | + return { | ||
| 95 | + triggerType, | ||
| 96 | + entityType: device, | ||
| 97 | + entityId: entityId?.length ? entityId : null, | ||
| 35 | triggerCondition: { | 98 | triggerCondition: { |
| 36 | - condition: [ | ||
| 37 | - { | ||
| 38 | - key: { | ||
| 39 | - key: type, | ||
| 40 | - type: 'TIME_SERIES', | ||
| 41 | - }, | ||
| 42 | - valueType: 'NUMERIC', | ||
| 43 | - predicate: { | ||
| 44 | - type: 'NUMERIC', | ||
| 45 | - value: { | ||
| 46 | - defaultValue: Number(value), | ||
| 47 | - }, | ||
| 48 | - operation: operation, | ||
| 49 | - }, | 99 | + alarmDetails: detail, |
| 100 | + condition: { | ||
| 101 | + condition: mapPredicate, | ||
| 102 | + spec: { | ||
| 103 | + type: triggered, | ||
| 104 | + // unit: 'SECONDS', | ||
| 105 | + // predicate: { | ||
| 106 | + // defaultValue: 30, | ||
| 107 | + // userValue: null, | ||
| 108 | + // dynamicValue: null, | ||
| 109 | + // }, | ||
| 50 | }, | 110 | }, |
| 51 | - ], | ||
| 52 | - spec: { | ||
| 53 | - type: 'SIMPLE', | 111 | + }, |
| 112 | + schedule: { | ||
| 113 | + type: schedule, | ||
| 114 | + // timezone: 'Asia/Shanghai', | ||
| 115 | + // daysOfWeek: [2, 3], | ||
| 116 | + // startsOn: 8700000, | ||
| 117 | + // endsOn: 30300000, | ||
| 54 | }, | 118 | }, |
| 55 | }, | 119 | }, |
| 56 | }; | 120 | }; |
| 57 | }; | 121 | }; |
| 122 | + | ||
| 123 | +export const genActionData = (conditionData) => { | ||
| 124 | + const { | ||
| 125 | + alarm_config, | ||
| 126 | + alarm_level, | ||
| 127 | + detail, | ||
| 128 | + device, | ||
| 129 | + doContext, | ||
| 130 | + operationType, | ||
| 131 | + outTarget, | ||
| 132 | + predicate, | ||
| 133 | + triggerType, | ||
| 134 | + triggered, | ||
| 135 | + type1, | ||
| 136 | + type2, | ||
| 137 | + schedule, | ||
| 138 | + entityId, | ||
| 139 | + deviceId, | ||
| 140 | + } = conditionData; | ||
| 141 | + | ||
| 142 | + const mapPredicate = predicate?.map((item) => { | ||
| 143 | + return { | ||
| 144 | + key: { | ||
| 145 | + type: type1, | ||
| 146 | + key: type2, | ||
| 147 | + }, | ||
| 148 | + valueType: operationType, | ||
| 149 | + value: null, | ||
| 150 | + predicate: { | ||
| 151 | + type: operationType, | ||
| 152 | + operation: item.operation, | ||
| 153 | + value: { | ||
| 154 | + defaultValue: item.value, | ||
| 155 | + userValue: null, | ||
| 156 | + dynamicValue: null, | ||
| 157 | + }, | ||
| 158 | + }, | ||
| 159 | + }; | ||
| 160 | + }); | ||
| 161 | + console.log(doContext); | ||
| 162 | + return [ | ||
| 163 | + { | ||
| 164 | + alarmProfileId: alarm_config, | ||
| 165 | + outTarget, | ||
| 166 | + entityType: device, | ||
| 167 | + entityId: entityId?.length ? entityId : null, | ||
| 168 | + deviceId, | ||
| 169 | + doContext: mapPredicate?.length | ||
| 170 | + ? { | ||
| 171 | + alarmLevel: alarm_level, | ||
| 172 | + clearRule: { | ||
| 173 | + triggerType, | ||
| 174 | + triggerCondition: { | ||
| 175 | + alarmDetails: detail, | ||
| 176 | + condition: { | ||
| 177 | + condition: mapPredicate, | ||
| 178 | + spec: { | ||
| 179 | + type: triggered, | ||
| 180 | + // unit: 'SECONDS', | ||
| 181 | + // predicate: { | ||
| 182 | + // defaultValue: 30, | ||
| 183 | + // userValue: null, | ||
| 184 | + // dynamicValue: null, | ||
| 185 | + // }, | ||
| 186 | + }, | ||
| 187 | + }, | ||
| 188 | + schedule: { | ||
| 189 | + type: schedule, | ||
| 190 | + // timezone: 'Asia/Shanghai', | ||
| 191 | + // daysOfWeek: [2, 3], | ||
| 192 | + // startsOn: 8700000, | ||
| 193 | + // endsOn: 30300000, | ||
| 194 | + }, | ||
| 195 | + }, | ||
| 196 | + }, | ||
| 197 | + } | ||
| 198 | + : doContext, | ||
| 199 | + }, | ||
| 200 | + ]; | ||
| 201 | +}; |
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | - <CollapseContainer style="background-color: #f8f9fa" :title="`触发器 ${triggerIndex + 1}`"> | 3 | + <CollapseContainer style="background-color: #f2f2f2" :title="`触发器 ${triggerIndex + 1}`"> |
| 4 | <template #action> | 4 | <template #action> |
| 5 | - <Tooltip title="移除"> | ||
| 6 | - <Icon | ||
| 7 | - icon="fluent:delete-off-20-regular" | ||
| 8 | - size="20" | ||
| 9 | - class="mr-2 cursor-pointer" | ||
| 10 | - @click="handleDelete(triggerIndex)" | ||
| 11 | - /> | ||
| 12 | - </Tooltip> | 5 | + <div class="flex"> |
| 6 | + <div> | ||
| 7 | + <span class="mr-2">启用规则</span> | ||
| 8 | + <RadioGroup v-model:value="schedule" :options="scheduleOptions" /> | ||
| 9 | + </div> | ||
| 10 | + <Tooltip title="移除" class="ml-4"> | ||
| 11 | + <Icon | ||
| 12 | + icon="fluent:delete-off-20-regular" | ||
| 13 | + size="20" | ||
| 14 | + class="mr-2 cursor-pointer" | ||
| 15 | + @click="handleDelete(triggerIndex)" | ||
| 16 | + /> | ||
| 17 | + </Tooltip> | ||
| 18 | + </div> | ||
| 13 | </template> | 19 | </template> |
| 14 | - <BasicForm @register="registerForm" /> | 20 | + <BasicForm @register="registerForm"> |
| 21 | + <template #operationType="{ model, field }"> | ||
| 22 | + <Select | ||
| 23 | + :options="options" | ||
| 24 | + v-model:value="model[field]" | ||
| 25 | + @change="operationType = model[field]" | ||
| 26 | + placeholder="请选择比较类型" | ||
| 27 | + allowClear | ||
| 28 | + /> | ||
| 29 | + </template> | ||
| 30 | + </BasicForm> | ||
| 31 | + <Card size="small" :bordered="false" style="border: 2px dashed #797979" v-if="operationType"> | ||
| 32 | + <ConditionScreening | ||
| 33 | + :childGetFieldsValue="childGetFieldsValue" | ||
| 34 | + ref="conditionScreeningRef" | ||
| 35 | + /> | ||
| 36 | + </Card> | ||
| 15 | </CollapseContainer> | 37 | </CollapseContainer> |
| 16 | </div> | 38 | </div> |
| 17 | </template> | 39 | </template> |
| 18 | -<script lang="ts"> | ||
| 19 | - import { defineComponent } from 'vue'; | 40 | +<script lang="ts" setup> |
| 41 | + import { ref, provide } from 'vue'; | ||
| 20 | import { CollapseContainer } from '/@/components/Container/index'; | 42 | import { CollapseContainer } from '/@/components/Container/index'; |
| 21 | import { BasicForm, useForm } from '/@/components/Form/index'; | 43 | import { BasicForm, useForm } from '/@/components/Form/index'; |
| 22 | import { Icon } from '/@/components/Icon'; | 44 | import { Icon } from '/@/components/Icon'; |
| 23 | - import { Tooltip } from 'ant-design-vue'; | ||
| 24 | - import { useTriggerDrawerSchema } from '../config'; | ||
| 25 | - import { screenLinkPageByDeviceIdGetAttribut } from '/@/api/ruleengine/ruleengineApi'; | ||
| 26 | - export default defineComponent({ | ||
| 27 | - components: { CollapseContainer, BasicForm, Icon, Tooltip }, | ||
| 28 | - props: { | ||
| 29 | - triggerIndex: { | ||
| 30 | - type: Number, | ||
| 31 | - required: true, | ||
| 32 | - }, | 45 | + import { Tooltip, RadioGroup, Card, Select } from 'ant-design-vue'; |
| 46 | + import { trigger_condition_schema } from '../config'; | ||
| 47 | + import { getAttribute } from '/@/api/ruleengine/ruleengineApi'; | ||
| 48 | + import ConditionScreening from './ConditionScreening.vue'; | ||
| 49 | + defineProps({ | ||
| 50 | + triggerIndex: { | ||
| 51 | + type: Number, | ||
| 52 | + required: true, | ||
| 33 | }, | 53 | }, |
| 34 | - emits: ['deleteTrigger'], | ||
| 35 | - setup(props, { emit }) { | ||
| 36 | - const [registerForm, { resetFields, getFieldsValue, updateSchema, setFieldsValue }] = useForm( | ||
| 37 | - { | ||
| 38 | - schemas: useTriggerDrawerSchema, | ||
| 39 | - showActionButtonGroup: false, | ||
| 40 | - } | ||
| 41 | - ); | ||
| 42 | - const getFieldsValueFunc = () => getFieldsValue(); | 54 | + }); |
| 55 | + const emit = defineEmits(['deleteTrigger']); | ||
| 56 | + const conditionScreeningRef = ref(); | ||
| 57 | + const [registerForm, { resetFields, getFieldsValue, updateSchema, setFieldsValue }] = useForm({ | ||
| 58 | + schemas: trigger_condition_schema, | ||
| 59 | + showActionButtonGroup: false, | ||
| 60 | + }); | ||
| 43 | 61 | ||
| 44 | - const updateFieldDeviceId = (deviceList: any[]) => { | ||
| 45 | - updateSchema({ | ||
| 46 | - field: 'entityId', | ||
| 47 | - componentProps: { | ||
| 48 | - options: deviceList, | ||
| 49 | - onChange(e) { | ||
| 50 | - if (e) { | ||
| 51 | - updateFieldAttributeFunc(e); | ||
| 52 | - } | ||
| 53 | - }, | ||
| 54 | - }, | ||
| 55 | - }); | 62 | + const getFieldsValueFunc = () => { |
| 63 | + const predicate = conditionScreeningRef?.value?.refItem?.conditionScreeningRefs?.value?.map( | ||
| 64 | + (item) => { | ||
| 65 | + return item.getFieldsValue(); | ||
| 66 | + } | ||
| 67 | + ); | ||
| 68 | + return { ...getFieldsValue(), predicate, schedule: schedule.value }; | ||
| 69 | + }; | ||
| 70 | + const updateFieldDeviceId = (deviceList: any[]) => { | ||
| 71 | + updateSchema({ | ||
| 72 | + field: 'entityId', | ||
| 73 | + componentProps: { | ||
| 74 | + options: deviceList, | ||
| 75 | + onChange(e) { | ||
| 76 | + if (e) { | ||
| 77 | + updateFieldAttributeFunc(); | ||
| 78 | + } | ||
| 79 | + }, | ||
| 80 | + }, | ||
| 81 | + }); | ||
| 82 | + }; | ||
| 83 | + const resetFieldsValueFunc = () => resetFields(); | ||
| 84 | + // 回显数据函数 | ||
| 85 | + const setFieldsFormValueFun = (fieldsValue) => { | ||
| 86 | + setFieldsValue(fieldsValue); | ||
| 87 | + }; | ||
| 88 | + const updateFieldAttributeFunc = async () => { | ||
| 89 | + const data1 = await getAttribute(); | ||
| 90 | + const options = data1.map((m) => { | ||
| 91 | + return { | ||
| 92 | + label: m, | ||
| 93 | + value: m, | ||
| 56 | }; | 94 | }; |
| 57 | - const updateFieldAttributeFunc = async (e) => { | ||
| 58 | - const data1 = await screenLinkPageByDeviceIdGetAttribut('DEVICE', e); | ||
| 59 | - const options = data1.map((m) => { | ||
| 60 | - return { | ||
| 61 | - label: m, | ||
| 62 | - value: m, | ||
| 63 | - }; | ||
| 64 | - }); | ||
| 65 | - updateSchema({ | ||
| 66 | - field: 'type2', | ||
| 67 | - componentProps: { | ||
| 68 | - placeholder: '请选择属性', | ||
| 69 | - options, | ||
| 70 | - onChange(value) { | ||
| 71 | - if (value) { | ||
| 72 | - updateSchema([ | ||
| 73 | - { | ||
| 74 | - field: 'operation', | ||
| 75 | - ifShow: true, | ||
| 76 | - }, | ||
| 77 | - { | ||
| 78 | - field: 'value', | ||
| 79 | - ifShow: true, | ||
| 80 | - }, | ||
| 81 | - ]); | ||
| 82 | - setFieldsValue({ | ||
| 83 | - operation: '', | ||
| 84 | - value: '', | ||
| 85 | - }); | ||
| 86 | - return; | ||
| 87 | - } | ||
| 88 | - updateSchema([ | ||
| 89 | - { | ||
| 90 | - field: 'operation', | ||
| 91 | - ifShow: false, | ||
| 92 | - }, | ||
| 93 | - { | ||
| 94 | - field: 'value', | ||
| 95 | - ifShow: false, | ||
| 96 | - }, | ||
| 97 | - ]); | ||
| 98 | - setFieldsValue({ | ||
| 99 | - operation: '', | ||
| 100 | - value: '', | ||
| 101 | - }); | 95 | + }); |
| 96 | + updateSchema({ | ||
| 97 | + field: 'type2', | ||
| 98 | + componentProps: { | ||
| 99 | + placeholder: '请选择属性', | ||
| 100 | + options, | ||
| 101 | + onChange(value) { | ||
| 102 | + if (value) { | ||
| 103 | + updateSchema([ | ||
| 104 | + { | ||
| 105 | + field: 'operation', | ||
| 106 | + ifShow: true, | ||
| 107 | + }, | ||
| 108 | + { | ||
| 109 | + field: 'value', | ||
| 110 | + ifShow: true, | ||
| 111 | + }, | ||
| 112 | + ]); | ||
| 113 | + setFieldsValue({ | ||
| 114 | + operation: '', | ||
| 115 | + value: '', | ||
| 116 | + }); | ||
| 117 | + return; | ||
| 118 | + } | ||
| 119 | + updateSchema([ | ||
| 120 | + { | ||
| 121 | + field: 'operation', | ||
| 122 | + ifShow: false, | ||
| 102 | }, | 123 | }, |
| 103 | - }, | ||
| 104 | - }); | ||
| 105 | - }; | ||
| 106 | - | ||
| 107 | - const resetFieldsValueFunc = () => resetFields(); | ||
| 108 | - // 回显数据函数 | ||
| 109 | - const setFieldsFormValueFun = (fieldsValue) => { | ||
| 110 | - setFieldsValue(fieldsValue); | ||
| 111 | - }; | ||
| 112 | - | ||
| 113 | - const editSelectDevice = () => { | ||
| 114 | - if (props.bindTriggerEntryIdFather != 1) { | ||
| 115 | - updateSchema({ | ||
| 116 | - field: 'entityId', | ||
| 117 | - componentProps: { | ||
| 118 | - options: props.bindTriggerEntryIdFather, | 124 | + { |
| 125 | + field: 'value', | ||
| 126 | + ifShow: false, | ||
| 119 | }, | 127 | }, |
| 128 | + ]); | ||
| 129 | + setFieldsValue({ | ||
| 130 | + operation: '', | ||
| 131 | + value: '', | ||
| 120 | }); | 132 | }); |
| 121 | - } | ||
| 122 | - }; | ||
| 123 | - // editSelectDevice(); | 133 | + }, |
| 134 | + }, | ||
| 135 | + }); | ||
| 136 | + }; | ||
| 124 | 137 | ||
| 125 | - const handleDelete = (triggerIndex) => { | ||
| 126 | - emit('deleteTrigger', triggerIndex); | ||
| 127 | - }; | ||
| 128 | - return { | ||
| 129 | - updateFieldAttributeFunc, | ||
| 130 | - updateFieldDeviceId, | ||
| 131 | - resetFieldsValueFunc, | ||
| 132 | - editSelectDevice, | ||
| 133 | - getFieldsValueFunc, | ||
| 134 | - registerForm, | ||
| 135 | - handleDelete, | 138 | + const handleDelete = (triggerIndex) => { |
| 139 | + emit('deleteTrigger', triggerIndex); | ||
| 140 | + }; | ||
| 136 | 141 | ||
| 137 | - setFieldsFormValueFun, | ||
| 138 | - }; | 142 | + const schedule = ref('ANY_TIME'); |
| 143 | + const scheduleOptions = [ | ||
| 144 | + { label: '始终启用', value: 'ANY_TIME' }, | ||
| 145 | + { label: '定时启用', value: 'SPECIFIC_TIME' }, | ||
| 146 | + { label: '自定义启用', value: 'CUSTOM' }, | ||
| 147 | + ]; | ||
| 148 | + const operationType = ref<string>(''); | ||
| 149 | + const options = [ | ||
| 150 | + { | ||
| 151 | + label: '数字', | ||
| 152 | + value: 'NUMERIC', | ||
| 153 | + }, | ||
| 154 | + { | ||
| 155 | + label: '布尔值', | ||
| 156 | + value: 'BOOLEAN', | ||
| 139 | }, | 157 | }, |
| 158 | + { | ||
| 159 | + label: '字符串', | ||
| 160 | + value: 'STRING', | ||
| 161 | + }, | ||
| 162 | + { | ||
| 163 | + label: '时间', | ||
| 164 | + value: 'TIME', | ||
| 165 | + }, | ||
| 166 | + ]; | ||
| 167 | + // 子组件获取父组件的值 | ||
| 168 | + const childGetFieldsValue = () => getFieldsValue(); | ||
| 169 | + | ||
| 170 | + provide('operationType', operationType); | ||
| 171 | + | ||
| 172 | + defineExpose({ | ||
| 173 | + getFieldsValueFunc, | ||
| 174 | + updateFieldDeviceId, | ||
| 175 | + resetFieldsValueFunc, | ||
| 176 | + setFieldsFormValueFun, | ||
| 177 | + childGetFieldsValue, | ||
| 140 | }); | 178 | }); |
| 141 | </script> | 179 | </script> |
| 142 | - | ||
| 143 | -<style> | ||
| 144 | - .ant-slider-handle { | ||
| 145 | - display: none !important; | ||
| 146 | - } | ||
| 147 | -</style> |