Commit d072a5b273e2f32619ece903acb10ff8cef79d44

Authored by ww
1 parent 17d679b2

perf: 优化场景联动枚举类型选择

  1 +import { toRaw, unref } from 'vue';
1 2 import { OperationType } from './type';
  3 +import { DeviceModelOfMatterAttrs } from '/@/api/device/model/deviceModel';
2 4 import { FormSchema } from '/@/components/Form';
3 5 import {
4 6 BooleanOperationEnum,
... ... @@ -11,6 +13,7 @@ import {
11 13 StringOperationNameEnum,
12 14 TriggerValueTypeEnum,
13 15 } from '/@/enums/linkedgeEnum';
  16 +import { DataTypeEnum } from '/@/enums/objectModelEnum';
14 17
15 18 export enum FormFieldsEnum {
16 19 CONDITION_OPERATION = 'operation',
... ... @@ -26,6 +29,7 @@ export enum FormFieldsNameEnum {
26 29
27 30 interface GetFormSchemasParamsType {
28 31 triggerType: TriggerValueTypeEnum;
  32 + objectModel?: DeviceModelOfMatterAttrs;
29 33 }
30 34
31 35 export interface ConditionFormRecordType {
... ... @@ -58,7 +62,10 @@ const getOperation = (type: TriggerValueTypeEnum) => {
58 62 return Object.keys(value).map((value) => ({ label: label[value], value }));
59 63 };
60 64
61   -const getOperationValueFormSchemas = (triggerType: TriggerValueTypeEnum): FormSchema[] => {
  65 +const getOperationValueFormSchemas = ({
  66 + triggerType,
  67 + objectModel,
  68 +}: GetFormSchemasParamsType): FormSchema[] => {
62 69 const getNumberSchemas = (): FormSchema[] => {
63 70 return [
64 71 {
... ... @@ -139,17 +146,43 @@ const getOperationValueFormSchemas = (triggerType: TriggerValueTypeEnum): FormSc
139 146 ];
140 147 };
141 148
  149 + const getEnumsSchemas = (): FormSchema[] => {
  150 + return [
  151 + {
  152 + field: FormFieldsEnum.CONDITION_VALUE,
  153 + label: FormFieldsNameEnum.CONDITION_VALUE,
  154 + component: 'Select',
  155 + required: true,
  156 + componentProps: () => {
  157 + return {
  158 + options: toRaw(unref(objectModel?.detail?.dataType?.specsList))?.map((item) => ({
  159 + label: item.name,
  160 + value: item.value,
  161 + })),
  162 + placeholder: `请输入${FormFieldsNameEnum.CONDITION_VALUE}`,
  163 + };
  164 + },
  165 + },
  166 + ];
  167 + };
  168 +
142 169 const schemasMap = {
143 170 [TriggerValueTypeEnum.BOOLEAN]: getBoolSchemas,
144 171 [TriggerValueTypeEnum.DATE_TIME]: getDateSchemas,
145   - [TriggerValueTypeEnum.NUMERIC]: getNumberSchemas,
  172 + [TriggerValueTypeEnum.NUMERIC]:
  173 + objectModel?.detail?.dataType?.type === DataTypeEnum.ENUM
  174 + ? getEnumsSchemas
  175 + : getNumberSchemas,
146 176 [TriggerValueTypeEnum.STRING]: getStringSchemas,
147 177 };
148 178
149 179 return schemasMap[triggerType]?.() || [];
150 180 };
151 181
152   -export const getFormSchemas = ({ triggerType }: GetFormSchemasParamsType): FormSchema[] => {
  182 +export const getFormSchemas = ({
  183 + triggerType,
  184 + objectModel,
  185 +}: GetFormSchemasParamsType): FormSchema[] => {
153 186 return [
154 187 {
155 188 field: FormFieldsEnum.CONDITION_OPERATION,
... ... @@ -163,6 +196,6 @@ export const getFormSchemas = ({ triggerType }: GetFormSchemasParamsType): FormS
163 196 };
164 197 },
165 198 },
166   - ...getOperationValueFormSchemas(triggerType),
  199 + ...getOperationValueFormSchemas({ triggerType, objectModel }),
167 200 ];
168 201 };
... ...
1   -<script setup lang="ts">
  1 +x<script setup lang="ts">
2 2 import { ComponentPublicInstance, computed, ref, unref, watch } from 'vue';
3 3 import { Card, Tag, Button, Tooltip } from 'ant-design-vue';
4 4 import { Icon } from '/@/components/Icon';
... ... @@ -24,8 +24,8 @@
24 24 });
25 25
26 26 const getSchemas = computed(() => {
27   - const { triggerType } = props;
28   - return getFormSchemas({ triggerType });
  27 + const { triggerType, objectModel } = props;
  28 + return getFormSchemas({ triggerType, objectModel });
29 29 });
30 30
31 31 const conditionListElRef = ref<ConditionListItemType[]>([getNewConditionFilterItem()]);
... ... @@ -40,8 +40,8 @@
40 40
41 41 const handleConditionFormValueChange = () => {
42 42 const condition = getConditionFormValues();
43   - const { triggerType } = props;
44   - const message = useConditionFilterMessage({ triggerType, condition });
  43 + const { triggerType, objectModel } = props;
  44 + const message = useConditionFilterMessage({ triggerType, condition, objectModel });
45 45 conditionMessageList.value = message;
46 46 };
47 47
... ... @@ -84,6 +84,13 @@
84 84 await validate?.();
85 85 };
86 86
  87 + watch(
  88 + () => props.objectModel,
  89 + () => {
  90 + handleConditionFormValueChange();
  91 + }
  92 + );
  93 +
87 94 defineExpose({ getFieldsValue, setFieldsValue, validate });
88 95 </script>
89 96
... ...
1 1 import { FormFieldsEnum, getOperationMap } from './config';
  2 +import { DeviceModelOfMatterAttrs } from '/@/api/device/model/deviceModel';
2 3 import {
3 4 BooleanOperationValueEnum,
4 5 BooleanOperationValueNameEnum,
5 6 TriggerValueTypeEnum,
6 7 } from '/@/enums/linkedgeEnum';
  8 +import { DataTypeEnum } from '/@/enums/objectModelEnum';
  9 +import { isNullOrUnDef } from '/@/utils/is';
7 10
8 11 export type ConditionMessageItemType = Record<
9 12 Exclude<FormFieldsEnum, FormFieldsEnum.CONDITION_VALUE_IGNORE_CASE>,
... ... @@ -13,24 +16,39 @@ export type ConditionMessageItemType = Record<
13 16 interface UseConditionFilterMessageParamsType {
14 17 triggerType: TriggerValueTypeEnum;
15 18 condition: ConditionMessageItemType[];
  19 + objectModel?: DeviceModelOfMatterAttrs;
16 20 }
17 21
18 22 export function useConditionFilterMessage({
19 23 triggerType,
20 24 condition,
  25 + objectModel,
21 26 }: UseConditionFilterMessageParamsType) {
22 27 const { label } = getOperationMap(triggerType);
23 28 const list: ConditionMessageItemType[] = [];
  29 +
  30 + const isEnumsType = objectModel?.detail.dataType?.type === DataTypeEnum.ENUM;
  31 +
  32 + const enumsMap: Recordable = {};
  33 + if (isEnumsType) {
  34 + const maps = objectModel.detail.dataType?.specsList?.reduce(
  35 + (prev, next) => ({ ...prev, [next.value!]: next.name }),
  36 + {}
  37 + );
  38 + maps && Object.assign(enumsMap, maps);
  39 + }
  40 +
24 41 for (const item of condition) {
25 42 let { defaultValue, operation } = item;
26   - if (!defaultValue || !operation) continue;
  43 + if (isNullOrUnDef(defaultValue) || isNullOrUnDef(operation)) continue;
27 44 operation = label[operation];
28 45 if (triggerType === TriggerValueTypeEnum.BOOLEAN)
29 46 defaultValue =
30 47 defaultValue === BooleanOperationValueEnum.TRUE
31 48 ? BooleanOperationValueNameEnum.TRUE
32 49 : BooleanOperationValueNameEnum.FALSE;
33   - list.push({ operation, defaultValue });
  50 +
  51 + list.push({ operation, defaultValue: isEnumsType ? enumsMap[defaultValue] : defaultValue });
34 52 }
35 53 return list;
36 54 }
... ...
... ... @@ -77,6 +77,7 @@ function getTriggerValueTypeByThingsModelType(type: DataTypeEnum) {
77 77 [DataTypeEnum.NUMBER_INT]: TriggerValueTypeEnum.NUMERIC,
78 78 [DataTypeEnum.STRING]: TriggerValueTypeEnum.STRING,
79 79 [DataTypeEnum.STRUCT]: TriggerValueTypeEnum.STRING,
  80 + [DataTypeEnum.ENUM]: TriggerValueTypeEnum.NUMERIC,
80 81 };
81 82
82 83 return map[type];
... ... @@ -419,6 +420,7 @@ export const getFormSchemas = (
419 420 colProps: { span: 24, xxl: 24, xl: 24, lg: 24, md: 24, sm: 24, xs: 24 },
420 421 ifShow: ({ model }) =>
421 422 model[FormFieldEnum.CONDITION_TYPE] === DeviceTriggerTypeEum.TIME_SERIES &&
  423 + // model[FormFieldEnum.CONDITION_KEY_DETAIL] &&
422 424 model[FormFieldEnum.CONDITION_KEY] &&
423 425 model[FormFieldEnum.CONDITION_VALUE_TYPE],
424 426 colSlot: 'conditionFilter',
... ...