Commit e889730e4c6a92ec5e3b41f6357cf5bfdd96eabb

Authored by xp.Huang
2 parents 2b86ed7d c3cb603f

Merge branch 'sqy_dev' into 'main'

refactor:重写场景联动

See merge request huang/yun-teng-iot-front!158
... ... @@ -10,8 +10,9 @@ VITE_PUBLIC_PATH = /
10 10 # 本地
11 11 # VITE_PROXY = [["/api","http://192.168.10.113:8080/api"]]
12 12
13   -# 线上
  13 +# 线上演示环境
14 14 # VITE_PROXY = [["/api","http://101.133.234.90:8080/api"]]
  15 +# 线上测试环境
15 16 VITE_PROXY = [["/api","http://47.99.141.212:8080/api"]]
16 17
17 18 # 实时数据的ws地址
... ...
... ... @@ -44,23 +44,12 @@ export const screenLinkPageGetApi = (params?: ScreenLinkPageQueryParam) => {
44 44 };
45 45
46 46 /**
47   - * 新增场景联动
  47 + * 新增或更新场景联动
48 48 * @param params pageSize page name
49 49 */
50   -export const screenLinkPageAddApi = (params: ScreenAddModel) => {
  50 +export const screenLinkPageAddApi = (params: ScreenAddModel, isUpdate: boolean) => {
51 51 return defHttp.post<ScreenAddModel>({
52   - url: ScreenManagerApi.SCREEN_ADD_URL,
53   - params,
54   - });
55   -};
56   -
57   -/**
58   - * 更新场景联动
59   - * @param params pageSize page name
60   - */
61   -export const screenLinkPageUpdateApi = (params: ScreenUpdateModel) => {
62   - return defHttp.post<ScreenUpdateModel>({
63   - url: ScreenManagerApi.SCREEN_UPDATE_URL,
  52 + url: isUpdate ? ScreenManagerApi.SCREEN_UPDATE_URL : ScreenManagerApi.SCREEN_ADD_URL,
64 53 params,
65 54 });
66 55 };
... ... @@ -73,7 +62,7 @@ export const screenLinkPageDeleteApi = (ids: string[]) => {
73 62 return defHttp.delete({
74 63 url: ScreenManagerApi.SCREEN_DELETE_URL,
75 64 data: {
76   - ids: ids,
  65 + ids,
77 66 },
78 67 });
79 68 };
... ...
... ... @@ -45,7 +45,7 @@
45 45 const lockStore = useLockStore();
46 46
47 47 const getRealName = computed(() => userStore.getUserInfo?.realName);
48   - console.log(getRealName);
  48 +
49 49 const [register, { closeModal }] = useModalInner();
50 50
51 51 const [registerForm, { validateFields, resetFields }] = useForm({
... ...
... ... @@ -136,7 +136,7 @@
136 136 async onConnected() {
137 137 if (isAdmin(props.role)) return;
138 138 const res = await getEntitiesId();
139   - entityId = res.data[0].entityId;
  139 + entityId = res.data[0]?.entityId;
140 140 const sendValue = JSON.stringify({
141 141 entityDataCmds: [
142 142 {
... ...
  1 +<template>
  2 + <div>
  3 + <BasicDrawer
  4 + v-bind="$attrs"
  5 + @register="registerDrawer"
  6 + showFooter
  7 + @ok="handleSubmit"
  8 + width="100vw"
  9 + @close="handleClose"
  10 + :title="title"
  11 + >
  12 + <div>
  13 + <!-- 基础表单 -->
  14 + <BasicForm @register="registerForm" />
  15 + <!-- 基础表单 -->
  16 + <!-- 触发器-begin -->
  17 + <div>
  18 + <template v-for="(item, index) in triggerData" :key="item">
  19 + <Trigger
  20 + class="mt-4"
  21 + :triggerIndex="index"
  22 + :ref="skipUnwrap.triggerItemRefs"
  23 + @deleteTrigger="deleteTrigger"
  24 + />
  25 + </template>
  26 + <!-- 按钮 -->
  27 + <a-button type="primary" class="mt-4" @click="addTrigger"> 添加触发器</a-button>
  28 + <!-- 按钮 -->
  29 + </div>
  30 + <!-- 触发器-end -->
  31 +
  32 + <!-- 执行条件-begin -->
  33 + <div>
  34 + <template v-for="(item, index) in conditionData" :key="item">
  35 + <Condition
  36 + class="mt-4"
  37 + :conditionIndex="index"
  38 + :ref="skipUnwrap.conditionItemRefs"
  39 + @deleteCondition="deleteCondition"
  40 + />
  41 + </template>
  42 + <!-- 按钮 -->
  43 + <a-button type="primary" class="mt-4" @click="addCondition"> 添加执行条件</a-button>
  44 + <!-- 按钮 -->
  45 + </div>
  46 + <!-- 执行条件-end -->
  47 +
  48 + <!-- 执行动作-begin -->
  49 + <div>
  50 + <template v-for="(item, index) in actionData" :key="item">
  51 + <Action
  52 + class="mt-4"
  53 + :actionIndex="index"
  54 + :actionData="actionData"
  55 + :ref="skipUnwrap.actionItemRefs"
  56 + @deleteAction="deleteAction"
  57 + />
  58 + </template>
  59 +
  60 + <!-- 按钮 -->
  61 + <a-button type="primary" class="mt-4" @click="addAction"> 添加执行动作</a-button>
  62 + <!-- 按钮 -->
  63 + </div>
  64 + <!-- 执行动作-end -->
  65 + </div>
  66 + </BasicDrawer>
  67 + </div>
  68 +</template>
  69 +<script lang="ts">
  70 + import { defineComponent, ref, watch, unref, computed, nextTick } from 'vue';
  71 + import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
  72 + import { formSchema, organizationId } from './config';
  73 + import { BasicForm, useForm } from '/@/components/Form';
  74 + import { formatTriggerData, formatConditionData } from './cpns/format-data';
  75 + import { useMessage } from '/@/hooks/web/useMessage';
  76 + import {
  77 + screenLinkPageAddApi,
  78 + screenLinkPageByDeptIdGetDevice,
  79 + } from '/@/api/ruleengine/ruleengineApi';
  80 + import Trigger from './cpns/Trigger.vue';
  81 + import Condition from './cpns/Condition.vue';
  82 + import Action from './cpns/Action.vue';
  83 + export default defineComponent({
  84 + name: 'SceneLinkAgeDrawer',
  85 + components: {
  86 + BasicDrawer,
  87 + BasicForm,
  88 + Trigger,
  89 + Condition,
  90 + Action,
  91 + },
  92 + emits: ['register', 'success'],
  93 + setup(_, { emit }) {
  94 + const { createMessage } = useMessage();
  95 + const triggerData = ref([]);
  96 + const conditionData = ref([]);
  97 + const actionData = ref([]);
  98 + const skipUnwrap = {
  99 + triggerItemRefs: ref([]),
  100 + conditionItemRefs: ref([]),
  101 + actionItemRefs: ref([]),
  102 + };
  103 + const title = computed(() => `${isUpdate.value ? '编辑' : '新增'}场景联动`);
  104 + let getTriggerFormValue = ref([]);
  105 + let getConditionFormValue = ref([]);
  106 + let getActionFormValue = ref([]);
  107 + const editEntryIdData = ref([]);
  108 + const isUpdate = ref(false);
  109 + const id = ref(undefined);
  110 + const tenantId = ref(undefined);
  111 + const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({
  112 + labelWidth: 120,
  113 + schemas: formSchema,
  114 + showActionButtonGroup: false,
  115 + });
  116 + const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
  117 + setDrawerProps({ confirmLoading: false });
  118 + isUpdate.value = data.isUpdate;
  119 + if (!unref(isUpdate)) {
  120 + resetFields();
  121 + //初始化执行动作
  122 + actionData.value = [Date.now()];
  123 + } else {
  124 + // 取值
  125 + const {
  126 + id: recordId,
  127 + tenantId: recordTenantId,
  128 + organizationId,
  129 + triggers,
  130 + doConditions,
  131 + doActions,
  132 + } = data.record;
  133 + // 赋值
  134 + await setFieldsValue(data.record);
  135 + id.value = recordId;
  136 + tenantId.value = recordTenantId;
  137 + // 获取当前组织下的设备列表
  138 + const options = await screenLinkPageByDeptIdGetDevice({
  139 + organizationId,
  140 + });
  141 + // 生成回显时对应得组件数量
  142 + triggerData.value = [...new Array(triggers.length).keys()];
  143 + conditionData.value = [...new Array(doConditions.length).keys()];
  144 + actionData.value = [...new Array(doActions.length).keys()];
  145 + // 回显设备列表
  146 + editEntryIdData.value = options.items.map((v) => {
  147 + return {
  148 + value: v.tbDeviceId,
  149 + label: v.name,
  150 + };
  151 + });
  152 + nextTick(() => {
  153 + setEditFields(skipUnwrap.triggerItemRefs, editEntryIdData);
  154 + setEditFields(skipUnwrap.conditionItemRefs, editEntryIdData);
  155 + setEditFields(skipUnwrap.actionItemRefs, editEntryIdData);
  156 + });
  157 +
  158 + // 回显触发器数据---此处是个闭包!
  159 + triggers.forEach((trigger, index) => {
  160 + nextTick(() => {
  161 + unref(skipUnwrap.triggerItemRefs)[index].setFieldsFormValueFun({
  162 + triggerType: trigger.triggerType,
  163 + entityId: trigger.entityId,
  164 + type1: trigger.triggerCondition?.condition[0]?.key?.type,
  165 + type2: trigger.triggerCondition?.condition[0]?.key?.key,
  166 + operation: trigger.triggerCondition?.condition[0]?.predicate?.operation,
  167 + value: trigger.triggerCondition?.condition[0]?.predicate?.value?.defaultValue,
  168 + });
  169 + });
  170 + });
  171 +
  172 + doConditions.forEach((item, index) => {
  173 + nextTick(() => {
  174 + unref(skipUnwrap.conditionItemRefs)[index].setFieldsFormValueFun({
  175 + triggerType: item?.triggerType,
  176 + entityId: item?.entityId,
  177 + type: item.triggerCondition?.condition[0].key.key,
  178 + operation: item?.triggerCondition?.condition[0]?.predicate?.operation,
  179 + value: item?.triggerCondition?.condition[0]?.predicate?.value?.defaultValue,
  180 + });
  181 + });
  182 + });
  183 +
  184 + doActions.forEach((item, index) => {
  185 + nextTick(() => {
  186 + unref(skipUnwrap.actionItemRefs)[index].setFieldsFormValueFun({
  187 + outTarget: item.outTarget,
  188 + deviceId: item.deviceId,
  189 + });
  190 + unref(skipUnwrap.actionItemRefs)[index].setJsonValue(item.doContext.params);
  191 + });
  192 + });
  193 + }
  194 + });
  195 +
  196 + // 设置设备的options
  197 + const setEditFields = (linkAge, deviceList) => {
  198 + unref(linkAge).map((item) => {
  199 + item.updateFieldDeviceId(deviceList);
  200 + });
  201 + };
  202 + // 监听组织变化更新设备列表
  203 + const deviceList = ref([]);
  204 + watch(organizationId, async (newValue: string) => {
  205 + if (!newValue) return;
  206 + const { items } = await screenLinkPageByDeptIdGetDevice({ organizationId: newValue });
  207 + deviceList.value = items.map((item) => ({ label: item.name, value: item.tbDeviceId }));
  208 + setFields(skipUnwrap.triggerItemRefs, true);
  209 + setFields(skipUnwrap.conditionItemRefs, true);
  210 + setFields(skipUnwrap.actionItemRefs, true);
  211 + });
  212 +
  213 + // 根据上面组织变化动态改变触发器,执行条件,执行动作的设备值
  214 + function setFields(linkAge, isOrganizationChange = false) {
  215 + unref(linkAge).map((item) => {
  216 + isOrganizationChange && item.resetFieldsValueFunc();
  217 + item.updateFieldDeviceId(deviceList);
  218 + });
  219 + }
  220 +
  221 + // 添加触发器
  222 + const addTrigger = () => {
  223 + unref(triggerData).push(Date.now());
  224 + nextTick(() => {
  225 + setFields(skipUnwrap.triggerItemRefs);
  226 + });
  227 + };
  228 + // 添加执行条件
  229 + const addCondition = () => {
  230 + unref(conditionData).push(Date.now());
  231 + nextTick(() => {
  232 + setFields(skipUnwrap.conditionItemRefs);
  233 + });
  234 + };
  235 + // 添加执行动作
  236 + const addAction = () => {
  237 + unref(actionData).push(Date.now());
  238 + nextTick(() => {
  239 + setFields(skipUnwrap.actionItemRefs);
  240 + });
  241 + };
  242 +
  243 + /**
  244 + * 获取触发器、执行条件、执行动作表单值--多个
  245 + */
  246 + const getFormValueFunc = () => {
  247 + getTriggerFormValue.value = unref(skipUnwrap.triggerItemRefs)?.map((item) => {
  248 + return formatTriggerData(item.getFieldsValueFunc());
  249 + });
  250 + getConditionFormValue.value = unref(skipUnwrap.conditionItemRefs).map((item) => {
  251 + return formatConditionData(item.getFieldsValueFunc());
  252 + });
  253 + getActionFormValue.value = unref(skipUnwrap.actionItemRefs).map((item) => {
  254 + return item.getFieldsValueFunc();
  255 + });
  256 + };
  257 + const handleSubmit = async () => {
  258 + let basicFormValue = await validate();
  259 + if (!basicFormValue) return;
  260 + for (const item of unref(skipUnwrap.actionItemRefs)) {
  261 + const valid = await item.validateForm();
  262 + if (!valid) return;
  263 + }
  264 + try {
  265 + setDrawerProps({ confirmLoading: true });
  266 + getFormValueFunc();
  267 + const postAddOrEditData = {
  268 + ...basicFormValue,
  269 + triggers: unref(getTriggerFormValue),
  270 + doConditions: unref(getConditionFormValue),
  271 + doActions: unref(getActionFormValue),
  272 + ...{
  273 + id: unref(id),
  274 + tenantId: unref(tenantId),
  275 + },
  276 + };
  277 + await screenLinkPageAddApi(postAddOrEditData, unref(isUpdate));
  278 + createMessage.success(`${unref(isUpdate) ? '编辑' : '新增'}成功`);
  279 + closeDrawer();
  280 + handleClose();
  281 + emit('success');
  282 + } finally {
  283 + setDrawerProps({ confirmLoading: false });
  284 + }
  285 + };
  286 +
  287 + // 删除
  288 + const deleteTrigger = (triggerIndex: number) => {
  289 + unref(triggerData).splice(triggerIndex, 1);
  290 + };
  291 + const deleteCondition = (conditionIndex: number) => {
  292 + unref(conditionData).splice(conditionIndex, 1);
  293 + };
  294 + const deleteAction = (actionIndex: number) => {
  295 + unref(actionData).splice(actionIndex, 1);
  296 + };
  297 + const handleClose = () => {
  298 + id.value = undefined;
  299 + tenantId.value = undefined;
  300 + organizationId.value = undefined;
  301 + getTriggerFormValue.value = [];
  302 + getConditionFormValue.value = [];
  303 + getActionFormValue.value = [];
  304 + triggerData.value = [];
  305 + conditionData.value = [];
  306 + actionData.value = [];
  307 + unref(skipUnwrap.triggerItemRefs).map((item) => {
  308 + item.resetFieldsValueFunc();
  309 + });
  310 + unref(skipUnwrap.conditionItemRefs).map((item) => {
  311 + item.resetFieldsValueFunc();
  312 + });
  313 + unref(skipUnwrap.actionItemRefs).map((item) => {
  314 + item.resetFieldsValueFunc();
  315 + });
  316 + };
  317 +
  318 + return {
  319 + title,
  320 + isUpdate,
  321 + registerDrawer,
  322 + registerForm,
  323 + // 添加 or 删除 触发器,条件,动作
  324 + triggerData,
  325 + conditionData,
  326 + actionData,
  327 + addCondition,
  328 + addTrigger,
  329 + addAction,
  330 + deleteTrigger,
  331 + deleteCondition,
  332 + deleteAction,
  333 + // Refs引用
  334 + skipUnwrap,
  335 + handleSubmit,
  336 + handleClose,
  337 + };
  338 + },
  339 + });
  340 +</script>
... ...
  1 +import { ref, h } from 'vue';
1 2 import { BasicColumn, FormSchema } from '/@/components/Table';
2   -import { ref } from 'vue';
3 3 import {
4 4 screenLinkOrganizationGetApi,
5 5 screenLinkPagePutApi,
6 6 } from '/@/api/ruleengine/ruleengineApi';
7   -import { h } from 'vue';
8 7 import { Switch } from 'ant-design-vue';
9 8 import { useMessage } from '/@/hooks/web/useMessage';
10 9 import { copyTransFun } from '/@/utils/fnUtils';
... ... @@ -36,25 +35,10 @@ export enum AttrAndWenDuEnum {
36 35 IS_CONDITION_SHIDU = 'NUMERIC1',
37 36 IS_TYPE2 = 'type2',
38 37 }
39   -export const isType2 = (type: string) => {
40   - return type === AttrAndWenDuEnum.IS_TYPE2;
41   -};
42   -
43   -export const isConditionShiDu = (type: string) => {
44   - return type === AttrAndWenDuEnum.IS_CONDITION_SHIDU;
45   -};
46   -export const isConditionWenDu = (type: string) => {
47   - return type === AttrAndWenDuEnum.IS_CONDITION_WENDU;
48   -};
49   -
50   -export const isShiDu = (type: string) => {
51   - return type === AttrAndWenDuEnum.IS_SHIDU;
52   -};
53 38
54   -export const isWenDu = (type: string) => {
55   - return type === AttrAndWenDuEnum.IS_WENDU_ACT;
  39 +export const isUpAndDown = (type: string) => {
  40 + return type === AttributeActionEnum.IS_UP_DOWN_ACT;
56 41 };
57   -
58 42 export const isTimeAll = (type: string) => {
59 43 return type === TriggerEnum.IS_TIME_ACT;
60 44 };
... ... @@ -63,10 +47,6 @@ export const isMsg = (type: string) => {
63 47 return type === TriggerEnum.IS_MSG_NOTIFY;
64 48 };
65 49
66   -export const isUpAndDown = (type: string) => {
67   - return type === AttributeActionEnum.IS_UP_DOWN_ACT;
68   -};
69   -
70 50 export const isDevice = (type: string) => {
71 51 return type === TriggerEnum.IS_DEVICE_ACT;
72 52 };
... ... @@ -82,14 +62,27 @@ export const isScene = (type: string) => {
82 62 export const isHand = (type: string) => {
83 63 return type === TriggerEnum.IS_HAND_ACT;
84 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 +};
85 83
86 84 export const columns: BasicColumn[] = [
87 85 {
88   - title: '创建时间',
89   - dataIndex: 'createTime',
90   - width: 180,
91   - },
92   - {
93 86 title: '场景联动名称',
94 87 dataIndex: 'name',
95 88 width: 200,
... ... @@ -97,7 +90,7 @@ export const columns: BasicColumn[] = [
97 90 {
98 91 title: '触发方式',
99 92 dataIndex: 'triggerType',
100   - format: (text: string, record: Recordable) => {
  93 + format: (_: string, record: Recordable) => {
101 94 return record.triggers[0]?.triggerType == 'DEVICE_TRIGGER'
102 95 ? '设备触发'
103 96 : record.triggers[0]?.triggerType == 'SCHEDULE_TRIGGER'
... ... @@ -131,12 +124,9 @@ export const columns: BasicColumn[] = [
131 124 if (record.status == 1) {
132 125 createMessage.success(`已启用`);
133 126 } else {
134   - createMessage.error('已禁用');
  127 + createMessage.success('已禁用');
135 128 }
136 129 })
137   - .catch(() => {
138   - createMessage.error('已禁用');
139   - })
140 130 .finally(() => {
141 131 record.pendingStatus = false;
142 132 });
... ... @@ -149,10 +139,13 @@ export const columns: BasicColumn[] = [
149 139 dataIndex: 'description',
150 140 width: 200,
151 141 },
  142 + {
  143 + title: '创建时间',
  144 + dataIndex: 'createTime',
  145 + width: 180,
  146 + },
152 147 ];
153   -
154   -export const changeOriginId = ref(null);
155   -
  148 +export const organizationId = ref('');
156 149 export const formSchema: FormSchema[] = [
157 150 {
158 151 field: 'name',
... ... @@ -160,6 +153,7 @@ export const formSchema: FormSchema[] = [
160 153 colProps: { span: 24 },
161 154 required: true,
162 155 component: 'Input',
  156 +
163 157 componentProps: {
164 158 maxLength: 36,
165 159 placeholder: '请输入场景联动名称',
... ... @@ -171,28 +165,15 @@ export const formSchema: FormSchema[] = [
171 165 label: '所属组织',
172 166 colProps: { span: 24 },
173 167 component: 'ApiTreeSelect',
174   - componentProps: ({ formModel, formActionType }) => {
175   - return {
176   - api: async () => {
177   - const data = await screenLinkOrganizationGetApi();
178   - copyTransFun(data as any as any[]);
179   - return data;
180   - },
181   - onChange: async (v) => {
182   - if (v == undefined) {
183   - formModel.entityId = undefined;
184   - const { updateSchema } = formActionType;
185   - updateSchema({
186   - field: 'entityId',
187   - componentProps: {
188   - options: undefined,
189   - },
190   - });
191   - } else {
192   - changeOriginId.value = v;
193   - }
194   - },
195   - };
  168 + componentProps: {
  169 + api: async () => {
  170 + const data = await screenLinkOrganizationGetApi();
  171 + copyTransFun(data as any as any[]);
  172 + return data;
  173 + },
  174 + onChange(value) {
  175 + organizationId.value = value;
  176 + },
196 177 },
197 178 },
198 179 {
... ... @@ -237,7 +218,7 @@ export const searchFormSchema: FormSchema[] = [
237 218 label: '状态',
238 219 component: 'Select',
239 220 componentProps: {
240   - placeholder: '请选择',
  221 + placeholder: '请选择状态',
241 222 options: [
242 223 { label: '已启用', value: '1' },
243 224 { label: '未启用', value: '0' },
... ... @@ -256,9 +237,9 @@ export const useTriggerDrawerSchema: FormSchema[] = [
256 237 placeholder: '设备触发',
257 238 options: [
258 239 { label: '设备触发', value: 'DEVICE_TRIGGER' },
259   - { label: '定时触发', value: 'SCHEDULE_TRIGGER' },
260   - { label: '场景触发', value: 'SCENE_TRIGGER' },
261   - { label: '手动触发', value: 'HAND_ACT' },
  240 + // { label: '定时触发', value: 'SCHEDULE_TRIGGER' },
  241 + // { label: '场景触发', value: 'SCENE_TRIGGER' },
  242 + // { label: '手动触发', value: 'HAND_ACT' },
262 243 ],
263 244 },
264 245 colProps: { span: 12 },
... ... @@ -270,39 +251,21 @@ export const useTriggerDrawerSchema: FormSchema[] = [
270 251 componentProps: {
271 252 placeholder: '请选择设备',
272 253 },
273   - ifShow: ({ values }) =>
274   - !isTime(Reflect.get(values, 'triggerType')) &&
275   - !isScene(Reflect.get(values, 'triggerType')) &&
276   - !isHand(Reflect.get(values, 'triggerType')),
277   - colProps: {
278   - span: 12,
279   - },
280   - },
281   - {
282   - field: 'entityId1',
283   - component: 'Input',
284   - label: '',
285   - componentProps: {
286   - maxLength: 255,
287   - placeholder: '请输入Cron表达式',
288   - },
  254 + ifShow: ({ values }) => isDevice(values.triggerType),
289 255 colProps: {
290 256 span: 12,
291 257 },
292   - ifShow: ({ values }) => isTimeAll(Reflect.get(values, 'triggerType')),
293 258 },
294 259 {
295 260 field: 'type1',
296 261 label: '',
297 262 component: 'Select',
298 263 componentProps: {
299   - placeholder: '属性触发',
  264 + placeholder: '属性触发方式',
300 265 options: [{ label: '属性触发', value: 'TIME_SERIES' }],
301 266 },
302   - ifShow: ({ values }) =>
303   - !isTime(Reflect.get(values, 'triggerType')) &&
304   - !isScene(Reflect.get(values, 'triggerType')) &&
305   - !isHand(Reflect.get(values, 'triggerType')),
  267 + ifShow: ({ values }) => isDevice(values.triggerType),
  268 + dynamicDisabled: ({ values }) => !values.entityId,
306 269 colProps: { span: 12 },
307 270 },
308 271 {
... ... @@ -311,15 +274,9 @@ export const useTriggerDrawerSchema: FormSchema[] = [
311 274 component: 'Select',
312 275 componentProps: {
313 276 placeholder: '请选择属性',
314   - onChange(v) {
315   - console.log(v);
316   - },
317 277 },
318   - ifShow: ({ values }) =>
319   - !isTime(Reflect.get(values, 'triggerType')) &&
320   - !isScene(Reflect.get(values, 'triggerType')) &&
321   - !isHand(Reflect.get(values, 'triggerType')) &&
322   - isUpAndDown(Reflect.get(values, 'type1')),
  278 + ifShow: ({ values }) => isDevice(values.triggerType),
  279 + dynamicDisabled: ({ values }) => !values.type1,
323 280 colProps: { span: 12 },
324 281 },
325 282 {
... ... @@ -327,7 +284,7 @@ export const useTriggerDrawerSchema: FormSchema[] = [
327 284 label: '',
328 285 component: 'Select',
329 286 componentProps: {
330   - placeholder: '',
  287 + placeholder: '请选择比较模式',
331 288 options: [
332 289 { label: '=', value: 'EQUAL' },
333 290 { label: '<', value: 'LESS' },
... ... @@ -336,48 +293,39 @@ export const useTriggerDrawerSchema: FormSchema[] = [
336 293 { label: '>=', value: 'GREATER_OR_EQUAL' },
337 294 ],
338 295 },
339   - ifShow: ({ values }) => isType2(Reflect.get(values, 'type2')),
340   - show: ({ values }) =>
341   - !isTime(Reflect.get(values, 'triggerType')) &&
342   - !isScene(Reflect.get(values, 'triggerType')) &&
343   - !isHand(Reflect.get(values, 'triggerType')),
  296 + show: ({ values }) => isDevice(values.triggerType),
  297 + dynamicDisabled: ({ values }) => !values.type2,
344 298 colProps: { span: 12 },
345 299 },
346 300 {
347 301 field: 'value',
348   - component: 'Input',
349 302 label: '',
350   - defaultValue: 0,
  303 + component: 'Input',
351 304 componentProps: {
352 305 maxLength: 16,
353 306 placeholder: '请输入比较值',
354 307 },
355   - ifShow: ({ values }) => isType2(Reflect.get(values, 'type2')),
356   - show: ({ values }) =>
357   - !isTime(Reflect.get(values, 'triggerType')) &&
358   - !isScene(Reflect.get(values, 'triggerType')) &&
359   - !isHand(Reflect.get(values, 'triggerType')),
  308 + show: ({ values }) => isDevice(values.triggerType),
  309 + dynamicDisabled: ({ values }) => !values.operation,
360 310 colProps: {
361 311 span: 12,
362 312 },
363 313 },
364   - // {
365   - // field: 'sceneLinkageId',
366   - // label: '',
367   - // component: 'Select',
368   - // colProps: {
369   - // span: 12,
370   - // },
371   - // componentProps: {
372   - // placeholder: '请选择场景',
373   - // options: [
374   - // { label: '场景触发器1', value: '' },
375   - // { label: '场景触发器2', value: '' },
376   - // ],
377   - // },
378   - // ifShow: ({ values }) => isScene(Reflect.get(values, 'triggerType')),
379   - // },
  314 + {
  315 + field: 'entityId1',
  316 + label: '',
  317 + component: 'Input',
  318 + componentProps: {
  319 + maxLength: 255,
  320 + placeholder: '请输入Cron表达式',
  321 + },
  322 + colProps: {
  323 + span: 12,
  324 + },
  325 + ifShow: ({ values }) => values.triggerType === TriggerEnum.IS_TIME_ACT,
  326 + },
380 327 ];
  328 +// !!!----------------------------------------------------^_^------------------------------------------------------------!!!
381 329
382 330 export const useConditionDrawerSchema: FormSchema[] = [
383 331 {
... ... @@ -385,10 +333,10 @@ export const useConditionDrawerSchema: FormSchema[] = [
385 333 label: '',
386 334 component: 'Select',
387 335 componentProps: {
388   - placeholder: '设备状态',
  336 + placeholder: '设备触发',
389 337 options: [
390 338 { label: '设备触发', value: 'DEVICE_TRIGGER' },
391   - { label: '时间范围', value: 'SCHEDULE_TRIGGER' },
  339 + // { label: '时间范围', value: 'SCHEDULE_TRIGGER' },
392 340 ],
393 341 },
394 342 colProps: { span: 12 },
... ... @@ -402,48 +350,20 @@ export const useConditionDrawerSchema: FormSchema[] = [
402 350 placeholder: '请选择设备',
403 351 };
404 352 },
405   - ifShow: ({ values }) => !isTimeAll(Reflect.get(values, 'triggerType')),
406   - colProps: {
407   - span: 12,
408   - },
409   - },
410   - {
411   - field: 'createTime',
412   - component: 'DatePicker',
413   - label: '',
414   - componentProps: {
415   - placeholder: '请选择起始时间',
416   - },
417   - colProps: {
418   - span: 12,
419   - },
420   - ifShow: ({ values }) => isTimeAll(Reflect.get(values, 'triggerType')),
421   - },
422   - {
423   - field: 'updateTime',
424   - component: 'DatePicker',
425   - label: '',
426   - componentProps: {
427   - placeholder: '请选择结束时间',
428   - },
  353 + ifShow: ({ values }) => isDevice(values.triggerType),
429 354 colProps: {
430 355 span: 12,
431 356 },
432   - ifShow: ({ values }) => isTimeAll(Reflect.get(values, 'triggerType')),
433 357 },
434 358 {
435 359 field: 'type',
436 360 label: '',
437 361 component: 'Select',
438   - componentProps() {
439   - return {
440   - placeholder: '请选择属性',
441   - onChange(v) {
442   - console.log(v);
443   - },
444   - };
  362 + componentProps: {
  363 + placeholder: '请选择属性',
445 364 },
446   - ifShow: ({ values }) => !isTimeAll(Reflect.get(values, 'triggerType')),
  365 + ifShow: ({ values }) => isDevice(values.triggerType),
  366 + dynamicDisabled: ({ values }) => !values.entityId,
447 367 colProps: { span: 12 },
448 368 },
449 369 {
... ... @@ -451,7 +371,7 @@ export const useConditionDrawerSchema: FormSchema[] = [
451 371 label: '',
452 372 component: 'Select',
453 373 componentProps: {
454   - placeholder: '',
  374 + placeholder: '请选择比较模式',
455 375 options: [
456 376 { label: '=', value: 'EQUAL' },
457 377 { label: '<', value: 'LESS' },
... ... @@ -460,24 +380,53 @@ export const useConditionDrawerSchema: FormSchema[] = [
460 380 { label: '>=', value: 'GREATER_OR_EQUAL' },
461 381 ],
462 382 },
463   - ifShow: false,
  383 + show: ({ values }) => isDevice(values.triggerType),
  384 + dynamicDisabled: ({ values }) => !values.type,
464 385 colProps: { span: 12 },
465 386 },
466 387 {
467 388 field: 'value',
468   - component: 'Input',
469 389 label: '',
  390 + component: 'Input',
470 391 componentProps: {
471 392 maxLength: 16,
472 393 placeholder: '请输入比较值',
473 394 },
474   - ifShow: false,
  395 + show: ({ values }) => isDevice(values.triggerType),
  396 + dynamicDisabled: ({ values }) => !values.operation,
475 397 colProps: {
476 398 span: 12,
477 399 },
478 400 },
  401 + // {
  402 + // field: 'createTime',
  403 + // component: 'DatePicker',
  404 + // label: 'createTime',
  405 + // componentProps: {
  406 + // placeholder: '请选择起始时间',
  407 + // },
  408 + // colProps: {
  409 + // span: 12,
  410 + // },
  411 + // ifShow: ({ values }) => isTimeAll(values.triggerType),
  412 + // },
  413 + // {
  414 + // field: 'updateTime',
  415 + // component: 'DatePicker',
  416 + // label: 'updateTime',
  417 + // componentProps: {
  418 + // placeholder: '请选择结束时间',
  419 + // },
  420 + // colProps: {
  421 + // span: 12,
  422 + // },
  423 + // ifShow: ({ values }) => isTimeAll(values.triggerType),
  424 + // },
479 425 ];
480   -
  426 +enum ActionEnum {
  427 + DEVICE_OUT = 'DEVICE_OUT',
  428 +}
  429 +const isDeviceOut = (type: string) => type === ActionEnum.DEVICE_OUT;
481 430 export const useActionDrawerSchema: FormSchema[] = [
482 431 {
483 432 field: 'outTarget',
... ... @@ -488,8 +437,8 @@ export const useActionDrawerSchema: FormSchema[] = [
488 437 placeholder: '设备输出',
489 438 options: [
490 439 { label: '设备输出', value: 'DEVICE_OUT' },
491   - { label: '消息通知', value: 'MSG_NOTIFY' },
492   - { label: '场景联动', value: 'SCENE_TRIGGER' },
  440 + // { label: '消息通知', value: 'MSG_NOTIFY' },
  441 + // { label: '场景联动', value: 'SCENE_TRIGGER' },
493 442 ],
494 443 },
495 444 colProps: { span: 12 },
... ... @@ -497,12 +446,12 @@ export const useActionDrawerSchema: FormSchema[] = [
497 446 {
498 447 field: 'deviceId',
499 448 label: '',
  449 + required: true,
500 450 component: 'Select',
501 451 componentProps: {
502 452 placeholder: '请选择设备',
503 453 },
504   - ifShow: ({ values }) =>
505   - !isScene(Reflect.get(values, 'outTarget')) && !isMsg(Reflect.get(values, 'outTarget')),
  454 + ifShow: ({ values }) => isDeviceOut(values.outTarget),
506 455 colProps: {
507 456 span: 12,
508 457 },
... ... @@ -511,86 +460,67 @@ export const useActionDrawerSchema: FormSchema[] = [
511 460 field: 'doContext',
512 461 component: 'InputTextArea',
513 462 label: '',
514   - // defaultValue:
515   - // '{"method": "setDOValue","params": {"devID": "492S211218028819","data": {"DO1": 1}}}',
516 463 componentProps: {
517 464 maxLength: 255,
518   - placeholder: '请输入下发指定',
519 465 },
520   - ifShow: ({ values }) =>
521   - !isScene(Reflect.get(values, 'outTarget')) && !isMsg(Reflect.get(values, 'outTarget')),
  466 + slot: 'doContext',
  467 + show: ({ values }) => isDeviceOut(values.outTarget),
522 468 colProps: {
523 469 span: 12,
524 470 },
525 471 },
526 472 // {
527   - // field: 'no',
528   - // component: 'InputTextArea',
  473 + // field: 'wu2',
  474 + // component: 'Input',
529 475 // label: '',
530   - // defaultValue:
531   - // '(可复制)下发指定格式(JSON格式:{"method": "setDOValue","params": {"devID": "492S211218028819","data": {"DO1": 1}})',
532 476 // componentProps: {
533   - // maxLength: 255,
534   - // disabled: true,
  477 + // placeholder: '暂不实现',
535 478 // },
536   - // ifShow: ({ values }) =>
537   - // !isScene(Reflect.get(values, 'outTarget')) && !isMsg(Reflect.get(values, 'outTarget')),
538 479 // colProps: {
539 480 // span: 12,
540 481 // },
  482 + // ifShow: ({ values }) => isMsg(Reflect.get(values, 'outTarget')),
  483 + // },
  484 + // {
  485 + // field: 'wu3',
  486 + // label: '',
  487 + // component: 'Input',
  488 + // componentProps: {
  489 + // placeholder: '无',
  490 + // style: {
  491 + // visibility: 'hidden',
  492 + // },
  493 + // },
  494 + // colProps: { span: 12 },
  495 + // ifShow: ({ values }) => isMsg(Reflect.get(values, 'outTarget')),
  496 + // },
  497 + // {
  498 + // field: 'entityId',
  499 + // label: '',
  500 + // component: 'Select',
  501 + // colProps: {
  502 + // span: 12,
  503 + // },
  504 + // componentProps: {
  505 + // placeholder: '请选择场景',
  506 + // options: [
  507 + // { label: '场景触发器1', value: '1' },
  508 + // { label: '场景触发器2', value: '2' },
  509 + // ],
  510 + // },
  511 + // ifShow: ({ values }) => isScene(Reflect.get(values, 'outTarget')),
  512 + // },
  513 + // {
  514 + // field: 'wu4',
  515 + // label: '',
  516 + // component: 'Input',
  517 + // componentProps: {
  518 + // placeholder: '无',
  519 + // style: {
  520 + // visibility: 'hidden',
  521 + // },
  522 + // },
  523 + // colProps: { span: 12 },
  524 + // ifShow: ({ values }) => isScene(Reflect.get(values, 'outTarget')),
541 525 // },
542   - {
543   - field: 'wu2',
544   - component: 'Input',
545   - label: '',
546   - componentProps: {
547   - placeholder: '暂不实现',
548   - },
549   - colProps: {
550   - span: 12,
551   - },
552   - ifShow: ({ values }) => isMsg(Reflect.get(values, 'outTarget')),
553   - },
554   - {
555   - field: 'wu3',
556   - label: '',
557   - component: 'Input',
558   - componentProps: {
559   - placeholder: '无',
560   - style: {
561   - visibility: 'hidden',
562   - },
563   - },
564   - colProps: { span: 12 },
565   - ifShow: ({ values }) => isMsg(Reflect.get(values, 'outTarget')),
566   - },
567   - {
568   - field: 'entityId',
569   - label: '',
570   - component: 'Select',
571   - colProps: {
572   - span: 12,
573   - },
574   - componentProps: {
575   - placeholder: '请选择场景',
576   - options: [
577   - { label: '场景触发器1', value: '1' },
578   - { label: '场景触发器2', value: '2' },
579   - ],
580   - },
581   - ifShow: ({ values }) => isScene(Reflect.get(values, 'outTarget')),
582   - },
583   - {
584   - field: 'wu4',
585   - label: '',
586   - component: 'Input',
587   - componentProps: {
588   - placeholder: '无',
589   - style: {
590   - visibility: 'hidden',
591   - },
592   - },
593   - colProps: { span: 12 },
594   - ifShow: ({ values }) => isScene(Reflect.get(values, 'outTarget')),
595   - },
596 526 ];
... ...
1 1 <template>
2   - <CollapseContainer class="prefixRedDot" style="background-color: #eeeeee">
3   - <div style="position: relative">
4   - <BasicForm
5   - :labelWidth="100"
6   - :showResetButton="false"
7   - :showSubmitButton="false"
8   - :emptySpan="10"
9   - @register="registerAction"
10   - />
11   - </div>
  2 + <CollapseContainer style="background-color: #eeeeee" :title="`执行动作 ${actionIndex + 1}`">
  3 + <template #action>
  4 + <Tooltip title="移除" v-if="actionData.length > 1">
  5 + <Icon
  6 + icon="fluent:delete-off-20-regular"
  7 + size="20"
  8 + class="mr-2 cursor-pointer"
  9 + @click="handleDelete(actionIndex)"
  10 + />
  11 + </Tooltip>
  12 + </template>
  13 + <BasicForm @register="registerAction">
  14 + <template #doContext>
  15 + <div class="flex">
  16 + <div ref="jsoneditorRef" style="height: 100%; width: 100%"></div>
  17 + <Tooltip
  18 + title='{"method":"setDOValue","params":{"devID":"492S211218028819","data":{"DO1":1}}}'
  19 + class="ml-2"
  20 + >
  21 + <QuestionCircleOutlined style="font-size: 1rem"
  22 + /></Tooltip>
  23 + </div>
  24 + </template>
  25 + </BasicForm>
12 26 </CollapseContainer>
13 27 </template>
14 28 <script lang="ts">
15   - import { defineComponent, reactive, ref } from 'vue';
  29 + import { defineComponent, ref, onMounted, nextTick, unref } from 'vue';
16 30 import { CollapseContainer } from '/@/components/Container/index';
17 31 import { BasicForm, useForm } from '/@/components/Form/index';
18   - import { Input } from 'ant-design-vue';
  32 + import { Tooltip } from 'ant-design-vue';
  33 + import { Icon } from '/@/components/Icon';
19 34 import { useActionDrawerSchema } from '../config';
  35 + import jsoneditor from 'jsoneditor';
  36 + import 'jsoneditor/dist/jsoneditor.min.css';
  37 + import { Tooltip } from 'ant-design-vue';
  38 + import { QuestionCircleOutlined } from '@ant-design/icons-vue';
20 39
21 40 export default defineComponent({
22   - components: { CollapseContainer, BasicForm, [Input.name]: Input },
23   - props: ['bindActionFather', 'bindActionEntryIdFather'],
24   - setup(props) {
25   - let fieldValue = reactive({});
26   - const option = ref<[]>([]);
27   - const [registerAction, { setFieldsValue, getFieldsValue, resetFields, updateSchema }] =
28   - useForm({
29   - labelWidth: 100,
30   - schemas: useActionDrawerSchema,
31   - actionColOptions: { span: 24 },
32   - });
33   - const getFieldsValueFunc = () => {
34   - fieldValue = getFieldsValue();
35   - return fieldValue;
36   - };
37   - const resetFieldsValueFunc = () => {
38   - resetFields();
39   - };
40   - const updateFieldDeviceId = (v) => {
41   - if (v.length == 0 || v.length > 0) {
42   - option.value = v;
43   - updateSchema({
44   - field: 'deviceId',
45   - componentProps: {
46   - options: option.value,
47   - },
48   - });
49   - } else if (v.length == undefined) {
50   - setTimeout(() => {
51   - updateSchema({
52   - field: 'deviceId',
53   - componentProps: {
54   - options: v.item,
55   - },
56   - });
57   - }, 10);
58   - }
59   - };
60   -
61   - //回显数据
62   - const setFieldsFormValueFun = () => {
63   - if (props.bindActionFather !== 1) {
64   - setTimeout(() => {
65   - setFieldsValue(props.bindActionFather);
66   - }, 10);
67   - }
68   - };
69   - setFieldsFormValueFun();
70   - const editSelectDevice = () => {
71   - if (props.bindActionEntryIdFather !== 1) {
72   - setTimeout(() => {
73   - updateSchema({
74   - field: 'deviceId',
75   - componentProps: {
76   - options: props.bindActionEntryIdFather,
77   - },
78   - });
79   - }, 10);
80   - }
  41 + components: { CollapseContainer, BasicForm, Tooltip, Icon, Tooltip, QuestionCircleOutlined },
  42 + props: {
  43 + actionIndex: {
  44 + type: Number,
  45 + required: true,
  46 + },
  47 + actionData: {
  48 + type: Array,
  49 + default: () => [],
  50 + },
  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);
81 67 };
82   - editSelectDevice();
83   - //新增清空设备选择
84   - const clearSelectDevice = () => {
  68 + const resetFieldsValueFunc = () => resetFields();
  69 + const updateFieldDeviceId = (deviceList) => {
85 70 updateSchema({
86 71 field: 'deviceId',
87 72 componentProps: {
88   - options: [],
  73 + options: deviceList,
89 74 },
90 75 });
91 76 };
  77 + const validateForm = () => {
  78 + return validate();
  79 + };
  80 + const handleDelete = (actionIndex) => {
  81 + emit('deleteAction', actionIndex);
  82 + };
  83 +
  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 + });
  103 +
  104 + const getJsonValue = () => unref(jsonInstance).get();
  105 + const setJsonValue = (Json) => {
  106 + nextTick(() => {
  107 + unref(jsonInstance).set(Json);
  108 + });
  109 + };
92 110 return {
93 111 updateFieldDeviceId,
94   - clearSelectDevice,
95   - editSelectDevice,
96 112 resetFieldsValueFunc,
97 113 getFieldsValueFunc,
  114 + validateForm,
98 115 registerAction,
  116 + handleDelete,
  117 + setFieldsFormValueFun,
  118 + jsoneditorRef,
  119 + jsonInstance,
  120 + getJsonValue,
  121 + setJsonValue,
99 122 };
100 123 },
101 124 });
102 125 </script>
103 126
104   -<style lang="less">
105   - .prefixRedDot:before {
106   - content: '* ';
107   - color: red;
108   - vertical-align: middle;
109   - display: inline-block;
110   - position: relative;
111   - top: 1vh;
112   - left: 5px;
  127 +<style>
  128 + .jsoneditor {
  129 + border: none;
113 130 }
114 131 </style>
... ...
1 1 <template>
2   - <CollapseContainer style="background-color: #eeeeee">
3   - <div style="position: relative">
4   - <BasicForm
5   - :labelWidth="100"
6   - :emptySpan="10"
7   - :showResetButton="false"
8   - :showSubmitButton="false"
9   - @register="registerCondition"
10   - />
11   - </div>
  2 + <CollapseContainer style="background-color: #eeeeee" :title="`执行条件 ${conditionIndex + 1}`">
  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>
  12 + </template>
  13 + <BasicForm @register="registerCondition" />
12 14 </CollapseContainer>
13 15 </template>
14 16 <script lang="ts">
15   - import { defineComponent, reactive, ref } from 'vue';
  17 + import { defineComponent } from 'vue';
16 18 import { CollapseContainer } from '/@/components/Container/index';
17 19 import { BasicForm, useForm } from '/@/components/Form/index';
18   - import { Input } from 'ant-design-vue';
  20 + import { Tooltip } from 'ant-design-vue';
19 21 import { useConditionDrawerSchema } from '../config';
20 22 import { screenLinkPageByDeviceIdGetAttribut } from '/@/api/ruleengine/ruleengineApi';
  23 + import { Icon } from '/@/components/Icon';
21 24
22 25 export default defineComponent({
23   - components: { CollapseContainer, BasicForm, [Input.name]: Input },
24   - props: ['bindConditionFather', 'bindConditionEntryIdFather'],
25   - setup(props) {
26   - let fieldValue = reactive({});
27   - const option = ref<[]>([]);
28   - const [registerCondition, { setFieldsValue, getFieldsValue, updateSchema, resetFields }] =
  26 + components: { CollapseContainer, BasicForm, Tooltip, Icon },
  27 + props: {
  28 + conditionIndex: {
  29 + type: Number,
  30 + required: true,
  31 + },
  32 + },
  33 + emits: ['deleteCondition'],
  34 + setup(props, { emit }) {
  35 + const [registerCondition, { getFieldsValue, updateSchema, resetFields, setFieldsValue }] =
29 36 useForm({
30   - labelWidth: 100,
31 37 schemas: useConditionDrawerSchema,
32   - actionColOptions: { span: 24 },
  38 + showActionButtonGroup: false,
33 39 });
34   - const getFieldsValueFunc = () => {
35   - fieldValue = getFieldsValue();
36   - return fieldValue;
37   - };
38   - const resetFieldsValueFunc = () => {
39   - resetFields();
40   - };
41   - const updateFieldDeviceId = (v) => {
42   - if (v.length == 0 || v.length > 0) {
43   - option.value = v;
44   - updateSchema({
45   - field: 'entityId',
46   - componentProps: {
47   - options: option.value,
48   - onChange(e) {
49   - if (e) {
50   - setTimeout(() => {
51   - updateFieldAttributeFunc(e);
52   - }, 10);
53   - }
54   - },
  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 + }
55 51 },
56   - });
57   - } else if (v.length == undefined) {
58   - setTimeout(() => {
59   - updateSchema({
60   - field: 'entityId',
61   - componentProps: {
62   - options: v.item,
63   - onChange(e) {
64   - if (e) {
65   - setTimeout(() => {
66   - updateFieldAttributeFunc(e);
67   - }, 10);
68   - }
69   - },
70   - },
71   - });
72   - }, 10);
73   - }
  52 + },
  53 + });
74 54 };
75 55 const updateFieldAttributeFunc = async (e) => {
76 56 const data1 = await screenLinkPageByDeviceIdGetAttribut('DEVICE', e);
... ... @@ -80,76 +60,42 @@
80 60 value: m,
81 61 };
82 62 });
83   - setTimeout(() => {
84   - updateSchema({
85   - field: 'type',
86   - componentProps() {
87   - return {
88   - placeholder: '请选择属性',
89   - options: data,
90   - onChange(e) {
91   - if (e) {
92   - updateSchema([
93   - {
94   - field: 'operation',
95   - ifShow: true,
96   - },
97   - {
98   - field: 'value',
99   - ifShow: true,
100   - },
101   - ]);
102   - } else {
103   - updateSchema([
104   - {
105   - field: 'operation',
106   - ifShow: false,
107   - },
108   - {
109   - field: 'value',
110   - ifShow: false,
111   - },
112   - ]);
113   - }
114   - },
115   - };
116   - },
117   - });
118   - }, 10);
119   - };
120   - const clearSelectAttribute = () => {
121 63 updateSchema({
122 64 field: 'type',
123 65 componentProps: {
124   - options: [],
  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 + },
125 93 },
126 94 });
127 95 };
128   - //回显数据
129   - const setFieldsFormValueFun = () => {
130   - if (props.bindConditionFather !== 1) {
131   - setTimeout(() => {
132   - setFieldsValue(props.bindConditionFather);
133   - setFieldsValue({
134   - type:
135   - props.bindConditionFather?.triggerCondition?.condition[0]?.valueType == 'NUMERIC'
136   - ? 'NUMERIC1'
137   - : 'NUMERIC2',
138   - operation1:
139   - props.bindConditionFather?.triggerCondition?.condition[0]?.predicate?.operation,
140   - operation2:
141   - props.bindConditionFather?.triggerCondition?.condition[0]?.predicate?.operation,
142   - value1:
143   - props.bindConditionFather?.triggerCondition?.condition[0]?.predicate?.value
144   - ?.defaultValue,
145   - value2:
146   - props.bindConditionFather?.triggerCondition?.condition[0]?.predicate?.value
147   - ?.defaultValue,
148   - });
149   - }, 100);
150   - }
  96 + const setFieldsFormValueFun = (fieldsValue) => {
  97 + setFieldsValue(fieldsValue);
151 98 };
152   - setFieldsFormValueFun();
153 99 const editSelectDevice = () => {
154 100 if (props.bindConditionEntryIdFather !== 1) {
155 101 setTimeout(() => {
... ... @@ -162,25 +108,19 @@
162 108 }, 100);
163 109 }
164 110 };
165   - editSelectDevice();
166   - //新增清空设备选择
167   - const clearSelectDevice = () => {
168   - updateSchema({
169   - field: 'entityId',
170   - componentProps: {
171   - options: [],
172   - },
173   - });
174   - };
175 111
  112 + const handleDelete = (conditionIndex) => {
  113 + emit('deleteCondition', conditionIndex);
  114 + };
176 115 return {
177 116 updateFieldDeviceId,
178   - clearSelectDevice,
179 117 editSelectDevice,
180 118 getFieldsValueFunc,
181 119 registerCondition,
182 120 resetFieldsValueFunc,
183   - clearSelectAttribute,
  121 + handleDelete,
  122 +
  123 + setFieldsFormValueFun,
184 124 };
185 125 },
186 126 });
... ...
1   -export const formatTriggerData = (m) => {
  1 +export const formatTriggerData = (triggerData) => {
  2 + const { triggerType, entityId, type1, type2, operation, value } = triggerData;
2 3 return {
3   - triggerType: m?.triggerType,
4   - entityId: m?.entityId || m?.entityId1 || m?.entityId2,
  4 + triggerType,
  5 + entityId,
5 6 triggerCondition: {
6 7 condition: [
7 8 {
8 9 key: {
9   - key: m.type2 == null ? 'CO2' : m.type2,
10   - type: m.type1 == null ? 'TIME_SERIES' : m.type1,
  10 + type: type1,
  11 + key: type2,
11 12 },
12 13 valueType: 'NUMERIC',
13 14 predicate: {
14 15 type: 'NUMERIC',
  16 + operation: operation,
15 17 value: {
16   - defaultValue: Number(m.value),
  18 + defaultValue: Number(value),
17 19 },
18   - operation: m.operation == null ? 'EQUAL' : m.operation,
19 20 },
20 21 },
21 22 ],
... ... @@ -26,25 +27,25 @@ export const formatTriggerData = (m) => {
26 27 };
27 28 };
28 29
29   -export const formatConditionData = (m) => {
  30 +export const formatConditionData = (conditionData) => {
  31 + const { triggerType, entityId, type, operation, value } = conditionData;
30 32 return {
31   - triggerType: m?.triggerType,
32   - entityId: m?.entityId,
  33 + triggerType,
  34 + entityId,
33 35 triggerCondition: {
34 36 condition: [
35 37 {
36 38 key: {
37   - key: m.type == null ? 'CO2' : m.type,
  39 + key: type,
38 40 type: 'TIME_SERIES',
39 41 },
40 42 valueType: 'NUMERIC',
41   - // value: {},
42 43 predicate: {
43 44 type: 'NUMERIC',
44 45 value: {
45   - defaultValue: Number(m.value) == null ? 0 : Number(m.value),
  46 + defaultValue: Number(value),
46 47 },
47   - operation: m.operation,
  48 + operation: operation,
48 49 },
49 50 },
50 51 ],
... ...
1 1 <template>
2 2 <div>
3   - <CollapseContainer style="background-color: #eeeeee">
4   - <div>
5   - <BasicForm
6   - :labelWidth="100"
7   - :showResetButton="false"
8   - :showSubmitButton="false"
9   - :emptySpan="10"
10   - @register="registerForm"
11   - />
12   - </div>
  3 + <CollapseContainer style="background-color: #eee" :title="`触发器 ${triggerIndex + 1}`">
  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>
  13 + </template>
  14 + <BasicForm @register="registerForm" />
13 15 </CollapseContainer>
14 16 </div>
15 17 </template>
16 18 <script lang="ts">
17   - import { defineComponent, reactive, ref } from 'vue';
  19 + import { defineComponent } from 'vue';
18 20 import { CollapseContainer } from '/@/components/Container/index';
19 21 import { BasicForm, useForm } from '/@/components/Form/index';
20   - import { Input } from 'ant-design-vue';
  22 + import { Icon } from '/@/components/Icon';
  23 + import { Tooltip } from 'ant-design-vue';
21 24 import { useTriggerDrawerSchema } from '../config';
22 25 import { screenLinkPageByDeviceIdGetAttribut } from '/@/api/ruleengine/ruleengineApi';
23   -
24 26 export default defineComponent({
25   - components: { CollapseContainer, BasicForm, [Input.name]: Input },
26   - props: ['bindTriggerFather', 'bindTriggerEntryIdFather'],
27   - setup(props) {
28   - let fieldValue = reactive({});
29   - const option = ref<[]>([]);
30   - const data = ref<[]>([]);
31   - const [registerForm, { setFieldsValue, resetFields, getFieldsValue, updateSchema }] = useForm(
  27 + components: { CollapseContainer, BasicForm, Icon, Tooltip },
  28 + props: {
  29 + triggerIndex: {
  30 + type: Number,
  31 + required: true,
  32 + },
  33 + },
  34 + emits: ['deleteTrigger'],
  35 + setup(props, { emit }) {
  36 + const [registerForm, { resetFields, getFieldsValue, updateSchema, setFieldsValue }] = useForm(
32 37 {
33   - labelWidth: 100,
34 38 schemas: useTriggerDrawerSchema,
35   - actionColOptions: { span: 24 },
  39 + showActionButtonGroup: false,
36 40 }
37 41 );
38   - const getFieldsValueFunc = () => {
39   - fieldValue = getFieldsValue();
40   - return fieldValue;
41   - };
42   - const updateFieldDeviceId = (v) => {
43   - if (v.length == 0 || v.length > 0) {
44   - option.value = v;
45   - updateSchema({
46   - field: 'entityId',
47   - componentProps: {
48   - options: option.value,
49   - onChange(e) {
50   - if (e) {
51   - setTimeout(() => {
52   - updateFieldAttributeFunc(e);
53   - }, 10);
54   - }
55   - },
  42 + const getFieldsValueFunc = () => getFieldsValue();
  43 +
  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 + }
56 53 },
57   - });
58   - } else if (v.length == undefined) {
59   - setTimeout(() => {
60   - updateSchema({
61   - field: 'entityId',
62   - componentProps: {
63   - options: v.item,
64   - onChange(e) {
65   - if (e) {
66   - setTimeout(() => {
67   - updateFieldAttributeFunc(e);
68   - }, 10);
69   - }
70   - },
71   - },
72   - });
73   - }, 10);
74   - }
  54 + },
  55 + });
75 56 };
76 57 const updateFieldAttributeFunc = async (e) => {
77 58 const data1 = await screenLinkPageByDeviceIdGetAttribut('DEVICE', e);
78   - data.value = data1.map((m) => {
  59 + const options = data1.map((m) => {
79 60 return {
80 61 label: m,
81 62 value: m,
... ... @@ -85,9 +66,9 @@
85 66 field: 'type2',
86 67 componentProps: {
87 68 placeholder: '请选择属性',
88   - options: data.value,
89   - onChange(e) {
90   - if (e) {
  69 + options,
  70 + onChange(value) {
  71 + if (value) {
91 72 updateSchema([
92 73 {
93 74 field: 'operation',
... ... @@ -98,109 +79,62 @@
98 79 ifShow: true,
99 80 },
100 81 ]);
101   - } else {
102   - updateSchema([
103   - {
104   - field: 'operation',
105   - ifShow: false,
106   - },
107   - {
108   - field: 'value',
109   - ifShow: false,
110   - },
111   - ]);
  82 + setFieldsValue({
  83 + operation: '',
  84 + value: '',
  85 + });
  86 + return;
112 87 }
113   - },
114   - },
115   - });
116   - };
117   - const updateOperatorAndValue = () => {
118   - updateSchema([
119   - {
120   - field: 'operation',
121   - ifShow: false,
122   - },
123   - {
124   - field: 'value',
125   - ifShow: false,
126   - },
127   - ]);
128   - };
129   - const resetFieldsValueFunc = () => {
130   - resetFields();
131   - };
132   - //回显数据
133   - const setFieldsFormValueFun = () => {
134   - if (props.bindTriggerFather != 1) {
135   - setTimeout(() => {
136   - setFieldsValue(props.bindTriggerFather);
137   - setFieldsValue({
138   - entityId1: props.bindTriggerFather.entityId,
139   - entityId2: props.bindTriggerFather.entityId,
140   - type1: props.bindTriggerFather?.triggerCondition?.condition[0]?.key?.type,
141   - type2: props.bindTriggerFather?.triggerCondition?.condition[0]?.key?.key,
142   - operation:
143   - props.bindTriggerFather?.triggerCondition?.condition[0]?.predicate?.operation,
144   - value:
145   - props.bindTriggerFather?.triggerCondition?.condition[0]?.predicate?.value
146   - ?.defaultValue,
147   - });
148   - if (props.bindTriggerFather?.triggerCondition?.condition[0]?.key?.key) {
149 88 updateSchema([
150 89 {
151 90 field: 'operation',
152   - ifShow: true,
  91 + ifShow: false,
153 92 },
154 93 {
155 94 field: 'value',
156   - ifShow: true,
  95 + ifShow: false,
157 96 },
158 97 ]);
159   - }
160   - }, 1);
161   - }
162   - };
163   - setFieldsFormValueFun();
164   - //新增清空设备选择
165   - const clearSelectDevice = () => {
166   - updateSchema({
167   - field: 'entityId',
168   - componentProps: {
169   - options: [],
  98 + setFieldsValue({
  99 + operation: '',
  100 + value: '',
  101 + });
  102 + },
170 103 },
171 104 });
172 105 };
173   - const clearSelectAttribute = () => {
174   - updateSchema({
175   - field: 'type2',
176   - componentProps: {
177   - options: [],
178   - },
179   - });
  106 +
  107 + const resetFieldsValueFunc = () => resetFields();
  108 + // 回显数据函数
  109 + const setFieldsFormValueFun = (fieldsValue) => {
  110 + setFieldsValue(fieldsValue);
180 111 };
  112 +
181 113 const editSelectDevice = () => {
182 114 if (props.bindTriggerEntryIdFather != 1) {
183   - setTimeout(() => {
184   - updateSchema({
185   - field: 'entityId',
186   - componentProps: {
187   - options: props.bindTriggerEntryIdFather,
188   - },
189   - });
190   - }, 100);
  115 + updateSchema({
  116 + field: 'entityId',
  117 + componentProps: {
  118 + options: props.bindTriggerEntryIdFather,
  119 + },
  120 + });
191 121 }
192 122 };
193   - editSelectDevice();
  123 + // editSelectDevice();
  124 +
  125 + const handleDelete = (triggerIndex) => {
  126 + emit('deleteTrigger', triggerIndex);
  127 + };
194 128 return {
195   - updateOperatorAndValue,
196   - clearSelectAttribute,
197 129 updateFieldAttributeFunc,
198 130 updateFieldDeviceId,
199 131 resetFieldsValueFunc,
200   - clearSelectDevice,
201 132 editSelectDevice,
202 133 getFieldsValueFunc,
203 134 registerForm,
  135 + handleDelete,
  136 +
  137 + setFieldsFormValueFun,
204 138 };
205 139 },
206 140 });
... ...
1   -export interface IAddTrigger {
2   - triggerType: string;
3   - entityId: string;
4   - touchWay: string;
5   - attributeChoose: string;
6   - compare: string;
7   - value: string;
8   -}
9   -
10   -export interface IAddCondition {
11   - triggerType: string;
12   - entityId: string;
13   - createTime: string;
14   - updateTime: string;
15   - compare: string;
16   - value: string;
17   -}
18   -
19   -export interface IAddAction {
20   - outTarget: string;
21   - deviceId: string;
22   - command: string;
23   - sceneLinkageId: string;
24   -}
1 1 <template>
2 2 <div>
3   - <BasicTable
4   - @register="registerTable"
5   - @selection-change="useSelectionChange"
6   - :rowSelection="{ type: 'checkbox' }"
7   - >
  3 + <BasicTable @register="registerTable">
8 4 <template #toolbar>
9 5 <a-button v-if="isTenant || isCustomer || isPlatform" type="primary" @click="handleAdd">
10 6 新增场景联动
... ... @@ -52,21 +48,18 @@
52 48 import { defineComponent, ref, computed } from 'vue';
53 49 import { BasicTable, useTable, TableAction } from '/@/components/Table';
54 50 import { useDrawer } from '/@/components/Drawer';
55   - import SceneLinkAgeDrawer from './useDrawer.vue';
56   - import { columns, searchFormSchema } from './config';
57   - import { useMessage } from '/@/hooks/web/useMessage';
58 51 import { screenLinkPageGetApi, screenLinkPageDeleteApi } from '/@/api/ruleengine/ruleengineApi';
59 52 import { useBatchDelete } from '/@/hooks/web/useBatchDelete';
60 53 import { RoleEnum } from '/@/enums/roleEnum';
61   - import { usePermission } from '/@/hooks/web/usePermission';
62 54 import { useUserStore } from '/@/store/modules/user';
  55 + import { columns, searchFormSchema } from './config';
  56 + import SceneLinkAgeDrawer from './SceneLinkAgeDrawer.vue';
63 57
64 58 export default defineComponent({
65   - name: 'Index',
  59 + name: 'LinkEdge',
66 60 components: { BasicTable, SceneLinkAgeDrawer, TableAction },
67   - emits: ['default', 'registerTable', 'registerDrawer', 'register'],
  61 +
68 62 setup() {
69   - const { hasPermission } = usePermission();
70 63 const userStore = useUserStore();
71 64 const isTenant = computed(() => userStore.getRoleList.includes(RoleEnum.TENANT_ADMIN));
72 65 const isCustomer = computed(() => userStore.getRoleList.includes(RoleEnum.CUSTOMER_USER));
... ... @@ -77,10 +70,9 @@
77 70 screenLinkPageDeleteApi,
78 71 handleSuccess
79 72 );
80   - let selectedRowKeys: Array<string> = [];
  73 +
81 74 const [registerDrawer, { openDrawer }] = useDrawer();
82   - const { createMessage } = useMessage();
83   - const [registerTable, { reload, getSelectRowKeys }] = useTable({
  75 + const [registerTable, { reload }] = useTable({
84 76 title: '场景联动列表',
85 77 api: screenLinkPageGetApi,
86 78 columns,
... ... @@ -108,32 +100,12 @@
108 100 });
109 101 }
110 102
111   - const useSelectionChange = () => {
112   - selectedRowKeys = getSelectRowKeys();
113   - };
114   -
115   - async function handleToolbarDel() {
116   - await screenLinkPageDeleteApi(selectedRowKeys);
117   - createMessage.success('删除成功');
118   - reload();
119   - }
120   -
121 103 function handleEdit(record: Recordable) {
122 104 openDrawer(true, {
123 105 record,
124 106 isUpdate: true,
125 107 });
126 108 }
127   - async function handleDelete(record: Recordable) {
128   - try {
129   - let ids = [record.id];
130   - await screenLinkPageDeleteApi(ids);
131   - createMessage.success('删除成功');
132   - reload();
133   - } catch (e) {
134   - return e;
135   - }
136   - }
137 109 function handleSuccess() {
138 110 reload();
139 111 }
... ... @@ -142,16 +114,11 @@
142 114 isSysadmin,
143 115 isCustomer,
144 116 isTenant,
145   - RoleEnum,
146   - hasPermission,
147 117 sceneLinkAgeDrawerRef,
148   - useSelectionChange,
149 118 registerTable,
150 119 registerDrawer,
151 120 handleAdd,
152   - handleToolbarDel,
153 121 handleEdit,
154   - handleDelete,
155 122 handleSuccess,
156 123 hasBatchDelete,
157 124 handleDeleteOrBatchDelete,
... ... @@ -160,4 +127,25 @@
160 127 });
161 128 </script>
162 129
163   -<style lang="less" scoped></style>
  130 +<!-- <script setup lang="ts">
  131 + import { ref, onMounted } from 'vue';
  132 + const refList = ref([]);
  133 + const list = ref(['张三', '李四', '王五', '赵牛']);
  134 + onMounted(() => {
  135 + console.log(refList.value);
  136 + });
  137 + let flag = 0;
  138 + const add = () => {
  139 + refList.value = [];
  140 + list.value.push(`哈哈${flag++}`);
  141 + console.log(refList.value);
  142 + };
  143 +</script>
  144 +<template>
  145 + <div>
  146 + <template v-for="item in list" :key="item">
  147 + <div :ref="(el) => refList.push(el)">{{ item }}</div>
  148 + </template>
  149 + <a-button @click="add" type="primary" class="ml-4 mt-4">添加元素</a-button>
  150 + </div>
  151 +</template> -->
... ...
1   -<template>
2   - <div>
3   - <BasicDrawer
4   - v-bind="$attrs"
5   - @register="registerDrawer"
6   - showFooter
7   - width="50vw"
8   - @ok="handleSubmit(drawerStatus)"
9   - @close="handleClose"
10   - >
11   - <div>
12   - <!-- 基础表单 -->
13   - <BasicForm @register="registerForm" />
14   - <!-- 基础表单 -->
15   - <!-- 触发器 -->
16   - <div style="border-radius: 4px">
17   - <template
18   - v-for="(item, index) in !drawerStatus ? triggerData : editTriggerData"
19   - :key="index"
20   - >
21   - <span style="display: none">{{ item + index }}</span>
22   - <span style="position: relative; top: 3.2vh; left: 0.6vw">触发器 {{ index + 1 }}</span>
23   - <useTriggerCpn
24   - ref="triggerBindRef"
25   - :bindTriggerFather="!drawerStatus ? 1 : item"
26   - :bindTriggerEntryIdFather="!drawerStatus ? 1 : getTriggerFatherEntryIdData"
27   - />
28   - </template>
29   - <!-- 按钮 -->
30   - <div
31   - style="
32   - display: flex;
33   - width: 11vw;
34   - height: 4vh;
35   - flex-direction: row;
36   - justify-content: space-between;
37   - "
38   - >
39   - <div style="display: flex; width: 4vw; height: 4vh">
40   - <Button
41   - type="primary"
42   - style="border-radius: 2px"
43   - class="mt-5"
44   - @click="triggerClickAdd(drawerStatus)"
45   - >触发器</Button
46   - >
47   - </div>
48   - <div style="display: flex; width: 4vw; height: 4vh">
49   - <Button
50   - v-if="triggerData.length !== 0 || editTriggerData.length !== 0"
51   - type="default"
52   - style="border-radius: 2px; background-color: rgba(237, 111, 111, 1)"
53   - class="mt-5"
54   - @click="triggerClickRemove(drawerStatus)"
55   - >
56   - <span style="color: white">删除</span></Button
57   - >
58   - </div>
59   - </div>
60   - <!-- 按钮 -->
61   - </div>
62   - <!-- 触发器 -->
63   - <div style="height: 5vh"></div>
64   - <!-- 执行条件 -->
65   - <div style="border-radius: 4px">
66   - <template
67   - v-for="(item, index) in !drawerStatus ? conditionData : editConditionData"
68   - :key="index"
69   - >
70   - <span style="display: none">{{ item + index }}</span>
71   - <span style="position: relative; top: 3.2vh; left: 0.6vw"
72   - >执行条件 {{ index + 1 }}</span
73   - >
74   - <useConditionCpn
75   - ref="conditionBindRef"
76   - :bindConditionFather="!drawerStatus ? 1 : item"
77   - :bindConditionEntryIdFather="!drawerStatus ? 1 : getConditionFatherEntryIdData"
78   - />
79   - </template>
80   - <!-- 按钮 -->
81   - <div
82   - style="
83   - display: flex;
84   - width: 11vw;
85   - height: 4vh;
86   - flex-direction: row;
87   - justify-content: space-between;
88   - "
89   - >
90   - <div style="display: flex; width: 4vw; height: 4vh">
91   - <Button
92   - type="primary"
93   - style="border-radius: 2px"
94   - class="mt-5"
95   - @click="conditionClickAdd(drawerStatus)"
96   - >执行条件</Button
97   - >
98   - </div>
99   - <div style="display: flex; width: 4vw; height: 4vh">
100   - <Button
101   - v-if="conditionData.length !== 0 || editConditionData.length !== 0"
102   - type="default"
103   - style="border-radius: 2px; background-color: rgba(237, 111, 111, 1)"
104   - class="mt-5"
105   - @click="conditionClickRemove(drawerStatus)"
106   - >
107   - <span style="color: white">删除</span></Button
108   - >
109   - </div>
110   - </div>
111   - <!-- 按钮 -->
112   - </div>
113   - <!-- 执行条件 -->
114   - <div style="height: 5vh"></div>
115   - <!-- 执行动作 -->
116   - <div style="border-radius: 4px">
117   - <template
118   - v-for="(item, index) in !drawerStatus ? actionData : editActionData"
119   - :key="index"
120   - >
121   - <span style="display: none">{{ item + index }}</span>
122   - <span style="position: relative; top: 3.6vh; left: 1vw">执行动作 {{ index + 1 }}</span>
123   - <useActionCpn
124   - ref="actionBindRef"
125   - :bindActionFather="!drawerStatus ? 1 : item"
126   - :bindActionEntryIdFather="!drawerStatus ? 1 : getActionFatherEntryIdData"
127   - />
128   - </template>
129   - <!-- 按钮 -->
130   - <div
131   - style="
132   - display: flex;
133   - width: 11vw;
134   - height: 4vh;
135   - flex-direction: row;
136   - justify-content: space-between;
137   - "
138   - >
139   - <div style="display: flex; width: 4vw; height: 4vh">
140   - <Button
141   - type="primary"
142   - style="border-radius: 2px"
143   - class="mt-5"
144   - @click="actionClickAdd(drawerStatus)"
145   - >执行动作</Button
146   - >
147   - </div>
148   - <div style="display: flex; width: 4vw; height: 4vh">
149   - <Button
150   - v-if="actionData.length !== 0 || editActionData.length !== 0"
151   - type="default"
152   - style="border-radius: 2px; background-color: rgba(237, 111, 111, 1)"
153   - class="mt-5"
154   - @click="actionClickRemove(drawerStatus)"
155   - >
156   - <span style="color: white">删除</span></Button
157   - >
158   - </div>
159   - </div>
160   - <!-- 按钮 -->
161   - </div>
162   - <!-- 执行动作 -->
163   - </div>
164   - </BasicDrawer>
165   - </div>
166   -</template>
167   -<script lang="ts">
168   - import { defineComponent, reactive, ref, getCurrentInstance, watch } from 'vue';
169   - import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
170   - import { formSchema, changeOriginId } from './config';
171   - import { BasicForm, useForm } from '/@/components/Form';
172   - import useTriggerCpn from './cpns/trigger.vue';
173   - import useConditionCpn from './cpns/condition.vue';
174   - import useActionCpn from './cpns/action.vue';
175   - import { Button } from '/@/components/Button';
176   - import { formatTriggerData, formatConditionData } from './cpns/format-data/index';
177   - import { useMessage } from '/@/hooks/web/useMessage';
178   - import {
179   - screenLinkPageAddApi,
180   - screenLinkPageByDeptIdGetDevice,
181   - screenLinkPageUpdateApi,
182   - } from '/@/api/ruleengine/ruleengineApi';
183   -
184   - export default defineComponent({
185   - name: 'ConfigDrawer',
186   - components: {
187   - BasicDrawer,
188   - BasicForm,
189   - useTriggerCpn,
190   - useConditionCpn,
191   - useActionCpn,
192   - Button,
193   - },
194   - emits: ['register', 'success'],
195   - setup(_, { emit }) {
196   - const { proxy } = getCurrentInstance() as any;
197   - const { createMessage } = useMessage();
198   - const triggerData = reactive([]);
199   - const conditionData = reactive([]);
200   - const actionData = reactive([1]);
201   - const triggerBindRef = ref(null);
202   - const conditionBindRef = ref(null);
203   - const actionBindRef = ref(null);
204   - let getTriggerFormValue: any = reactive({});
205   - let getConditionFormValue: any = reactive({});
206   - let getActionFormValue: any = reactive({});
207   - const drawerStatus = ref(true);
208   - let postAddOrEditData: any = reactive({});
209   - let concatTrigger: any = reactive([]);
210   - let concatCondition: any = reactive([]);
211   - let concatAction: any = reactive([]);
212   - let optionsItemDeviceId: any = ref([]);
213   - let editTriggerData: any = ref([]);
214   - let editConditionData: any = ref([]);
215   - let editActionData: any = ref([]);
216   - let getTriggerFatherEntryIdData: any = reactive([]);
217   - let getConditionFatherEntryIdData: any = reactive([]);
218   - let getActionFatherEntryIdData: any = reactive([]);
219   - const editEntryIdData: any = ref([]);
220   - const getId = ref('');
221   - const getTenantId = ref('');
222   - const [registerForm, { resetFields, validate, setFieldsValue }] = useForm({
223   - labelWidth: 120,
224   - schemas: formSchema,
225   - showActionButtonGroup: false,
226   - });
227   - const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
228   - setDrawerProps({ confirmLoading: false });
229   - drawerStatus.value = data.isUpdate;
230   - if (!drawerStatus.value) {
231   - triggerData.length = 0;
232   - conditionData.length = 0;
233   - actionData.length = 0;
234   - resetFields();
235   - defaultAddAction();
236   - try {
237   - proxy.$refs.triggerBindRef?.resetFieldsValueFunc();
238   - proxy.$refs.triggerBindRef?.clearSelectDevice();
239   - proxy.$refs.triggerBindRef?.clearSelectAttribute();
240   - proxy.$refs.conditionBindRef?.resetFieldsValueFunc();
241   - proxy.$refs.conditionBindRef?.clearSelectDevice();
242   - proxy.$refs.conditionBindRef?.clearSelectAttribute();
243   - proxy.$refs.actionBindRef?.clearSelectDevice();
244   - proxy.$refs.actionBindRef.resetFieldsValueFunc();
245   - } catch {}
246   - } else {
247   - emit('success');
248   - editTriggerData.value.length = 0;
249   - editConditionData.value.length = 0;
250   - editActionData.value.length = 0;
251   - editEntryIdData.value.length = 0;
252   - await setFieldsValue({
253   - ...data.record,
254   - });
255   - getId.value = data.record.id;
256   - getTenantId.value = data.record.tenantId;
257   - editTriggerData.value = data.record.triggers;
258   - editConditionData.value = data.record.doConditions;
259   - editActionData.value = data.record.doActions;
260   - const options = await screenLinkPageByDeptIdGetDevice({
261   - organizationId: data.record.organizationId,
262   - });
263   - data.record.triggers.forEach((f1) => {
264   - options.items?.forEach((f2) => {
265   - if (f2.tbDeviceId == f1.entityId) {
266   - getTriggerFatherEntryIdData.push({
267   - value: f2.tbDeviceId,
268   - label: f2.name,
269   - } as never);
270   - }
271   - });
272   - });
273   - data.record.doConditions.forEach((f1) => {
274   - options.items?.forEach((f2) => {
275   - if (f2.tbDeviceId == f1.entityId) {
276   - getConditionFatherEntryIdData.push({
277   - value: f2.tbDeviceId,
278   - label: f2.name,
279   - } as never);
280   - }
281   - });
282   - });
283   - data.record.doActions.forEach((f1) => {
284   - options.items?.forEach((f2) => {
285   - if (f2.tbDeviceId == f1.deviceId) {
286   - getActionFatherEntryIdData.push({
287   - value: f2.tbDeviceId,
288   - label: f2.name,
289   - } as never);
290   - }
291   - });
292   - });
293   - editEntryIdData.value = options.items.map((v) => {
294   - return {
295   - value: v.tbDeviceId,
296   - label: v.name,
297   - };
298   - });
299   - setTimeout(() => {
300   - proxy.$refs.triggerBindRef?.updateFieldDeviceId(editEntryIdData.value);
301   - proxy.$refs.conditionBindRef?.updateFieldDeviceId(editEntryIdData.value);
302   - proxy.$refs.actionBindRef?.updateFieldDeviceId(editEntryIdData.value);
303   - }, 10);
304   - }
305   - });
306   - watch(changeOriginId, async (newV: string) => {
307   - const result = await screenLinkPageByDeptIdGetDevice({ organizationId: newV });
308   - optionsItemDeviceId.value = result.items.map((v) => {
309   - return {
310   - value: v.tbDeviceId,
311   - label: v.name,
312   - };
313   - });
314   - setTimeout(() => {
315   - proxy.$refs.triggerBindRef?.updateFieldDeviceId(optionsItemDeviceId.value);
316   - proxy.$refs.conditionBindRef?.updateFieldDeviceId(optionsItemDeviceId.value);
317   - proxy.$refs.actionBindRef?.updateFieldDeviceId(optionsItemDeviceId.value);
318   - }, 10);
319   - });
320   -
321   - /**
322   - * 获取触发器表单值
323   - */
324   - const getTriggerFormValueFunc = () => {
325   - try {
326   - getTriggerFormValue = proxy.$refs.triggerBindRef.getFieldsValueFunc();
327   - } catch {}
328   - };
329   - const triggerClickAdd = (e) => {
330   - if (!e) {
331   - getTriggerFormValueFunc();
332   - triggerData.push(getTriggerFormValue as never);
333   - setTimeout(() => {
334   - proxy.$refs.triggerBindRef?.updateFieldDeviceId(optionsItemDeviceId.value);
335   - }, 10);
336   - } else {
337   - //TODO
338   - editTriggerData.value.push(getTriggerFormValue);
339   - }
340   - };
341   - const triggerClickRemove = (e) => {
342   - if (!e) {
343   - triggerData.pop();
344   - } else {
345   - editTriggerData.value.pop();
346   - }
347   - };
348   -
349   - /**
350   - * 获取执行条件表单值
351   - */
352   - const getConditionFormValueFunc = () => {
353   - try {
354   - getConditionFormValue = proxy.$refs.conditionBindRef.getFieldsValueFunc();
355   - } catch {}
356   - };
357   - const conditionClickAdd = (e) => {
358   - if (!e) {
359   - getConditionFormValueFunc();
360   - conditionData.push(getConditionFormValue as never);
361   - setTimeout(() => {
362   - proxy.$refs.conditionBindRef?.updateFieldDeviceId(optionsItemDeviceId.value);
363   - }, 10);
364   - } else {
365   - //TODO
366   - }
367   - };
368   - const conditionClickRemove = (e) => {
369   - if (!e) {
370   - conditionData.pop();
371   - } else {
372   - editConditionData.value.pop();
373   - }
374   - };
375   -
376   - /**
377   - * 获取执行动作表单值
378   - */
379   - const getActionFormValueFunc = () => {
380   - try {
381   - getActionFormValue = proxy.$refs.actionBindRef.getFieldsValueFunc();
382   - } catch {}
383   - };
384   - //默认新增执行动作
385   - const defaultAddAction = () => {
386   - if (actionData.length == 0) {
387   - actionClickAdd(false);
388   - }
389   - };
390   - const actionClickAdd = (e) => {
391   - if (!e) {
392   - getActionFormValueFunc();
393   - actionData.push(getActionFormValue as never);
394   - setTimeout(() => {
395   - proxy.$refs.actionBindRef?.updateFieldDeviceId(optionsItemDeviceId.value);
396   - }, 10);
397   - } else {
398   - //TODO
399   - }
400   - };
401   - const actionClickRemove = (e) => {
402   - if (!e) {
403   - actionData.pop();
404   - } else {
405   - editActionData.value.pop();
406   - }
407   - };
408   - const submitOrEditFunc = (e) => {
409   - if (!e) {
410   - getTriggerFormValueFunc();
411   - concatTrigger = triggerData.concat(getTriggerFormValue);
412   - //去除第一个空对象
413   - concatTrigger.shift();
414   - concatTrigger = concatTrigger.map((m) => formatTriggerData(m));
415   - getConditionFormValueFunc();
416   - concatCondition = conditionData.concat(getConditionFormValue);
417   - //去除第一个空对象
418   - concatCondition.shift();
419   - concatCondition = concatCondition.map((m) => formatConditionData(m));
420   - getActionFormValueFunc();
421   - concatAction = actionData.concat(getActionFormValue);
422   - // 去除第一个空对象;
423   - concatAction.shift();
424   - } else {
425   - //TODO
426   - }
427   - };
428   -
429   - const handleSubmit = async (e) => {
430   - let basicFormValue = await validate();
431   - if (!basicFormValue) return;
432   - if (!e) {
433   - submitOrEditFunc(e);
434   - let isKongNum = 0;
435   - concatAction.forEach((f) => {
436   - isKongNum = Object.keys(f).length;
437   - });
438   - if (concatAction.length == 1 && isKongNum == 0)
439   - return createMessage.error('请填写执行动作');
440   - postAddOrEditData = {
441   - ...basicFormValue,
442   - ...{
443   - triggers: concatTrigger,
444   - },
445   - ...{
446   - doConditions: concatCondition,
447   - },
448   - ...{
449   - doActions: concatAction,
450   - },
451   - };
452   - await screenLinkPageAddApi(postAddOrEditData);
453   - createMessage.success('新增成功');
454   - closeDrawer();
455   - emit('success');
456   - } else {
457   - submitOrEditFunc(e);
458   - postAddOrEditData = {
459   - ...basicFormValue,
460   - ...{ id: getId.value },
461   - ...{ tenantId: getTenantId.value },
462   - };
463   - await screenLinkPageUpdateApi(postAddOrEditData);
464   - createMessage.success('编辑成功');
465   - closeDrawer();
466   - emit('success');
467   - }
468   - };
469   - const handleClose = () => {
470   - closeDrawer();
471   - };
472   -
473   - return {
474   - registerDrawer,
475   - registerForm,
476   - triggerData,
477   - triggerClickAdd,
478   - triggerClickRemove,
479   - conditionClickAdd,
480   - conditionClickRemove,
481   - actionClickAdd,
482   - actionClickRemove,
483   - triggerBindRef,
484   - conditionBindRef,
485   - actionBindRef,
486   - handleSubmit,
487   - handleClose,
488   - drawerStatus,
489   - conditionData,
490   - actionData,
491   - editTriggerData,
492   - editConditionData,
493   - editActionData,
494   - getTriggerFatherEntryIdData,
495   - getConditionFatherEntryIdData,
496   - getActionFatherEntryIdData,
497   - };
498   - },
499   - });
500   -</script>
501   -
502   -<style lang="less" scoped></style>