diff --git a/src/api/data-collect/collector.ts b/src/api/data-collect/collector.ts index 6c1ed981..8f91b4f8 100644 --- a/src/api/data-collect/collector.ts +++ b/src/api/data-collect/collector.ts @@ -4,7 +4,10 @@ export const queryCollector = (data: any) => server.post(`/data-collect/collector/_query/no-paging?paging=false`, data); export const queryChannelNoPaging = () => - server.post(`/data-collect/channel/_query/no-paging`, { paging: false }); + server.post(`/data-collect/channel/_query/no-paging`, { + paging: false, + sorts: [{ name: 'createTime', order: 'desc' }], + }); export const save = (data: any) => server.post(`/data-collect/collector`, data); diff --git a/src/components/Ellipsis/index.vue b/src/components/Ellipsis/index.vue deleted file mode 100644 index 56f62a82..00000000 --- a/src/components/Ellipsis/index.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/components/Metadata/VirtualRuleParam/index.vue b/src/components/Metadata/VirtualRuleParam/index.vue index 5452a0e5..751a1033 100644 --- a/src/components/Metadata/VirtualRuleParam/index.vue +++ b/src/components/Metadata/VirtualRuleParam/index.vue @@ -1,4 +1,7 @@ + + + @@ -60,10 +63,12 @@ interface Emits { const emit = defineEmits() onMounted(() => { - emit('update:value', { - ...props.value, - type: 'script' - }) + if (!props.value.type) { + emit('update:value', { + ...props.value, + type: 'script' + }) + } }) const aggTypeOptions = ref() diff --git a/src/components/index.ts b/src/components/index.ts index 9af226d5..71e6d881 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -9,8 +9,8 @@ import NormalUpload from './NormalUpload/index.vue' import FileFormat from './FileFormat/index.vue' import JProUpload from './Upload/index.vue' import { BasicLayoutPage, BlankLayoutPage } from './Layout' -import { PageContainer, AIcon } from 'jetlinks-ui-components' -import Ellipsis from './Ellipsis/index.vue' +import { PageContainer, AIcon, Ellipsis } from 'jetlinks-ui-components' +// import Ellipsis from './Ellipsis/index.vue' import JEmpty from './Empty/index.vue' import AMapComponent from './AMapComponent/index.vue' import PathSimplifier from './AMapComponent/PathSimplifier.vue' diff --git a/src/store/system.ts b/src/store/system.ts index 5b6cf512..d5065be0 100644 --- a/src/store/system.ts +++ b/src/store/system.ts @@ -3,6 +3,8 @@ import { systemVersion } from '@/api/comm' import { useMenuStore } from './menu' import { getDetails_api } from '@/api/system/basis'; import type { ConfigInfoType } from '@/views/system/Basis/typing'; +import { LocalStore } from '@/utils/comm' +import { SystemConst } from '@/utils/consts' type SystemStateType = { isCommunity: boolean; @@ -22,6 +24,7 @@ export const useSystem = defineStore('system', { const resp = await systemVersion() if (resp.success && resp.result) { const isCommunity = resp.result.edition === 'community' + LocalStore.set(SystemConst.VERSION_CODE, resp.result.edition) this.isCommunity = isCommunity // 获取菜单 const menu = useMenuStore() diff --git a/src/utils/setting.ts b/src/utils/setting.ts new file mode 100644 index 00000000..7c275321 --- /dev/null +++ b/src/utils/setting.ts @@ -0,0 +1,15 @@ +import { isNoCommunity } from '@/utils/utils'; + +// 过滤网关类型 +export const accessConfigTypeFilter = (data: any[], filterKey: string = 'id'): any[] => { + if (!data) return [] + const filterKeys = !isNoCommunity ? + [ + 'mqtt-server-gateway', + 'http-server-gateway', + 'mqtt-client-gateway', + 'tcp-server-gateway', + 'plugin_gateway' + ] : ['plugin_gateway'] + return data.filter(item => !filterKeys.includes(item[filterKey])).map( item => ({ ...item, label: item.name, value: item.id})) +} \ No newline at end of file diff --git a/src/utils/validate.ts b/src/utils/validate.ts index 8ac2aef3..85542cb4 100644 --- a/src/utils/validate.ts +++ b/src/utils/validate.ts @@ -16,4 +16,12 @@ export const phoneRegEx = (value: string) => { export const passwordRegEx = (value: string) => { const password = new RegExp(/^\S*(?=\S{8,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])\S*$/) return password.test(value) -} \ No newline at end of file +} +/** + * 判断是否为正确的IP地址 + */ +export const testIP = (value: string) => { + const ip = + /^([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/; + return ip.test(value); +}; \ No newline at end of file diff --git a/src/views/DataCollect/Collector/Point/Save/SaveModBus.vue b/src/views/DataCollect/Collector/Point/Save/SaveModBus.vue index 07a0ce3c..f6289260 100644 --- a/src/views/DataCollect/Collector/Point/Save/SaveModBus.vue +++ b/src/views/DataCollect/Collector/Point/Save/SaveModBus.vue @@ -301,7 +301,13 @@ const formData = ref({ }); const handleOk = async () => { - const data = await formRef.value?.validate(); + console.log(2, formRef.value, formRef.value?.validate()); + + const data = await formRef.value?.validate().catch((err) => { + console.log(23, err); + }); + console.log(3, data); + delete data?.nspwc; const { codec } = data?.configuration; diff --git a/src/views/DataCollect/Collector/Point/index.vue b/src/views/DataCollect/Collector/Point/index.vue index bab0527e..6d1b34ed 100644 --- a/src/views/DataCollect/Collector/Point/index.vue +++ b/src/views/DataCollect/Collector/Point/index.vue @@ -20,7 +20,7 @@ - - - 故障处理 - - - - - + + {{ getTypeTooltip(formData.circuitBreaker.type) }} + - \ No newline at end of file diff --git a/src/views/device/Instance/Detail/Running/Property/Indicators.vue b/src/views/device/Instance/Detail/Running/Property/Indicators.vue index 95b6f9e7..3709ff01 100644 --- a/src/views/device/Instance/Detail/Running/Property/Indicators.vue +++ b/src/views/device/Instance/Detail/Running/Property/Indicators.vue @@ -33,8 +33,10 @@ }指标值`, }" :name="['metrics', index, 'value', 0]" - :label="item?.name || '指标值'" > + + {{ item?.name || '指标值' }} + ({ metrics: [], }); @@ -132,8 +135,8 @@ watch( ) { const list = resp?.result.map((item: any) => { const val = Array.isArray(item?.value) - ? [item?.value] - : item?.value?.split(','); + ? item?.value + : (isNumber(item?.value) ? [item.value] : item?.value?.split(',')) return { ...item, value: val, @@ -172,7 +175,7 @@ watch( const handleSave = () => { formRef.value .validate() - .then(async () => { + .then(async (_data: any) => { loading.value = true; const list = (toRaw(modelRef)?.metrics || []).map((item: any) => { return { diff --git a/src/views/device/Instance/index.vue b/src/views/device/Instance/index.vue index 840c3235..081bc2a8 100644 --- a/src/views/device/Instance/index.vue +++ b/src/views/device/Instance/index.vue @@ -309,6 +309,7 @@ import BadgeStatus from '@/components/BadgeStatus/index.vue'; import BatchDropdown from '@/components/BatchDropdown/index.vue'; import { BatchActionsType } from '@/components/BatchDropdown/types'; import {useRouterParams} from "@/utils/hooks/useParams"; +import { accessConfigTypeFilter } from '@/utils/setting' const instanceRef = ref>({}); const params = ref>({}); @@ -417,12 +418,17 @@ const columns = [ options: () => new Promise((resolve) => { getProviders().then((resp: any) => { - resolve( - resp.result.map((item: any) => ({ - label: item.name, - value: `accessProvider is ${item.id}`, - })), - ); + const data = resp.result || [] + resolve(accessConfigTypeFilter(data).map(item => ({ + ...item, + value: `accessProvider is ${item.id}` + }))) + // resolve( + // resp.result.map((item: any) => ({ + // label: item.name, + // value: `accessProvider is ${item.id}`, + // })), + // ); }); }), }, diff --git a/src/views/device/Product/Detail/DeviceAccess/index.vue b/src/views/device/Product/Detail/DeviceAccess/index.vue index 42e02ed5..0a2444f9 100644 --- a/src/views/device/Product/Detail/DeviceAccess/index.vue +++ b/src/views/device/Product/Detail/DeviceAccess/index.vue @@ -419,6 +419,7 @@ import { marked } from 'marked'; import type { TableColumnType } from 'ant-design-vue'; import { useMenuStore } from '@/store/menu'; import _ from 'lodash'; +import { accessConfigTypeFilter } from '@/utils/setting' const tableRef = ref(); const formRef = ref(); @@ -433,7 +434,6 @@ marked.setOptions({ }); const simpleImage = ref(Empty.PRESENTED_IMAGE_SIMPLE); const visible = ref(false); -const listData = ref([]); const access = ref({}); const config = ref({}); const metadata = ref({ properties: [] }); @@ -500,35 +500,10 @@ const query = reactive({ search: { type: 'select', options: async () => { - return new Promise((res) => { + return new Promise((resolve) => { getProviders().then((resp: any) => { - listData.value = []; - if (isNoCommunity) { - (resp?.result || []).map((item: any) => { - if (item.id != 'plugin_gateway') { - listData.value.push({ - label: item.name, - value: item.id, - }); - } - }); - } else { - listData.value = (resp?.result || []) - .filter((i: any) => - [ - 'mqtt-server-gateway', - 'http-server-gateway', - 'mqtt-client-gateway', - 'tcp-server-gateway', - ].includes(i.id), - ) - .map((item: any) => ({ - label: item.name, - value: item.id, - })); - // } - } - res(listData.value); + const data = resp.result || [] + resolve(accessConfigTypeFilter(data)) }); }); }, @@ -960,7 +935,8 @@ const getData = async (accessId?: string) => { ); getProviders().then((resp) => { if (resp.status === 200) { - dataSource.value = resp.result; + const data = resp.result || [] + dataSource.value = accessConfigTypeFilter(data as any[]); } }); } diff --git a/src/views/device/Product/index.vue b/src/views/device/Product/index.vue index c7789a97..1477968a 100644 --- a/src/views/device/Product/index.vue +++ b/src/views/device/Product/index.vue @@ -182,6 +182,7 @@ import Save from './Save/index.vue'; import { useMenuStore } from 'store/menu'; import { useRoute } from 'vue-router'; import {useRouterParams} from "@/utils/hooks/useParams"; +import { accessConfigTypeFilter } from '@/utils/setting' /** * 表格数据 */ @@ -442,37 +443,11 @@ const query = reactive({ dataIndex: 'accessProvider', search: { type: 'select', - options: async () => { - return new Promise((res) => { + options: () => { + return new Promise((resolve) => { getProviders().then((resp: any) => { - listData.value = []; - // const list = () => { - if (isNoCommunity) { - (resp?.result || []).map((item: any) => { - if (item.id != 'plugin_gateway') { - listData.value.push({ - label: item.name, - value: item.id, - }); - } - }); - } else { - listData.value = (resp?.result || []) - .filter((i: any) => - [ - 'mqtt-server-gateway', - 'http-server-gateway', - 'mqtt-client-gateway', - 'tcp-server-gateway', - ].includes(i.id), - ) - .map((item: any) => ({ - label: item.name, - value: item.id, - })); - // } - } - res(listData.value); + const data = resp.result || [] + resolve(accessConfigTypeFilter(data)) }); }); }, diff --git a/src/views/device/components/Metadata/Base/Edit/ExpandsForm.vue b/src/views/device/components/Metadata/Base/Edit/ExpandsForm.vue index cde594c2..2a716984 100644 --- a/src/views/device/components/Metadata/Base/Edit/ExpandsForm.vue +++ b/src/views/device/components/Metadata/Base/Edit/ExpandsForm.vue @@ -5,7 +5,7 @@ - ) => { const queryProviders = async () => { const resp: any = await getProviders(); if (resp.status === 200) { - dataSource.value = getTypeList(resp.result); + const data = resp.result || [] + dataSource.value = getTypeList(accessConfigTypeFilter(data as any[])); // dataSource.value = getTypeList(resp.result)[0].list.filter( // (item) => item.name !== '插件设备接入', // ); @@ -151,7 +153,8 @@ const getProvidersData = async () => { if (id !== ':id') { getProviders().then((response: any) => { if (response.status === 200) { - const list = getTypeList(response.result); + const data = response.result || [] + const list = getTypeList(accessConfigTypeFilter(data as any[])); dataSource.value = list.filter( (item: any) => item.channel === 'network' || diff --git a/src/views/link/AccessConfig/index.vue b/src/views/link/AccessConfig/index.vue index b8295e6d..255ccf75 100644 --- a/src/views/link/AccessConfig/index.vue +++ b/src/views/link/AccessConfig/index.vue @@ -188,6 +188,7 @@ import { } from '@/api/link/accessConfig'; import { onlyMessage } from '@/utils/comm'; import { useMenuStore } from 'store/menu'; +import { accessConfigTypeFilter } from '@/utils/setting' const menuStory = useMenuStore(); const tableRef = ref>({}); @@ -318,12 +319,7 @@ const getActions = (data: Partial>): ActionsType[] => { const getProvidersList = async () => { const res: any = await getProviders(); providersList.value = res.result; - providersOptions.value = (res?.result || []) - ?.map((item: any) => ({ - label: item.name, - value: item.id, - })) - .filter((item: any) => item.value !== 'plugin_gateway'); // todo 暂时不做插件接入 + providersOptions.value = accessConfigTypeFilter(res.result || []) }; getProvidersList(); diff --git a/src/views/rule-engine/Scene/Save/Device/Product.vue b/src/views/rule-engine/Scene/Save/Device/Product.vue index b8b42a27..a422076f 100644 --- a/src/views/rule-engine/Scene/Save/Device/Product.vue +++ b/src/views/rule-engine/Scene/Save/Device/Product.vue @@ -62,6 +62,7 @@ import { queryTree } from '@/api/device/category' import { getTreeData_api } from '@/api/system/department' import { isNoCommunity } from '@/utils/utils' import { getImage } from '@/utils/comm' +import { accessConfigTypeFilter } from '@/utils/setting' type Emit = { (e: 'update:rowKey', data: string): void @@ -115,23 +116,7 @@ const columns = [ search: { type: 'select', options: () => getProviders().then((resp: any) => { - if (isNoCommunity) { - return (resp?.result || []).map((item: any) => ({ - label: item.name, - value: item.id - })) - } else { - return (resp?.result || []).filter((item: any) => [ - 'mqtt-server-gateway', - 'http-server-gateway', - 'mqtt-client-gateway', - 'tcp-server-gateway', - ].includes(item.id)) - .map((item: any) => ({ - label: item.name, - value: item.id, - })) - } + return accessConfigTypeFilter(resp.result || []) }) } }, diff --git a/src/views/rule-engine/Scene/Save/action/Device/Product.vue b/src/views/rule-engine/Scene/Save/action/Device/Product.vue index a59386ad..5b50e3e6 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/Product.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/Product.vue @@ -74,6 +74,7 @@ import { queryTree } from '@/api/device/category'; import { getTreeData_api } from '@/api/system/department'; import { isNoCommunity } from '@/utils/utils'; import { getImage } from '@/utils/comm'; +import { accessConfigTypeFilter } from '@/utils/setting' type Emit = { (e: 'update:rowKey', data: string): void; @@ -127,26 +128,8 @@ const columns = [ type: 'select', options: () => getProviders().then((resp: any) => { - if (isNoCommunity) { - return (resp?.result || []).map((item: any) => ({ - label: item.name, - value: item.id, - })); - } else { - return (resp?.result || []) - .filter((item: any) => - [ - 'mqtt-server-gateway', - 'http-server-gateway', - 'mqtt-client-gateway', - 'tcp-server-gateway', - ].includes(item.id), - ) - .map((item: any) => ({ - label: item.name, - value: item.id, - })); - } + const data = resp.result || [] + return accessConfigTypeFilter(data) }), }, }, diff --git a/src/views/rule-engine/Scene/Save/action/Device/actions/FunctionItem.vue b/src/views/rule-engine/Scene/Save/action/Device/actions/FunctionItem.vue index 4ac0e416..d07b6a39 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/actions/FunctionItem.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/actions/FunctionItem.vue @@ -9,7 +9,7 @@ @select="onChange" > - + diff --git a/src/views/rule-engine/Scene/Save/action/Device/actions/WriteProperty.vue b/src/views/rule-engine/Scene/Save/action/Device/actions/WriteProperty.vue index d6533ba7..066e9287 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/actions/WriteProperty.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/actions/WriteProperty.vue @@ -41,7 +41,7 @@ @select="onValueChange" > - + @@ -112,7 +112,6 @@ const filterParamsData = (type?: string, data?: any[]): any[] => { item.children = _children; return _children.length ? true : false; } else if (item.type === type) { - // optionMap.current.set(item.id, item); return true; } return false; @@ -132,12 +131,12 @@ const handleOptions = computed(() => { if (_type === 'boolean') { return [ { - label: _item.trueText, - value: _item.trueValue, + label: _item.trueText || true, + value: _item.trueValue || true, }, { - label: _item.falseText, - value: _item.falseValue, + label: _item.falseText || false, + value: _item.falseValue || false, }, ]; } diff --git a/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue b/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue index e6004fd6..5266196e 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/actions/index.vue @@ -22,18 +22,19 @@ showSearch placeholder="请选择功能" v-model:value="modelRef.message.functionId" - @select="functionSelect" + @change="functionSelect" > {{ item?.name }} @@ -54,6 +55,7 @@ showSearch placeholder="请选择属性" v-model:value="modelRef.message.properties[0]" + @change="propertySelect" > {{ item?.name }} @@ -130,8 +133,14 @@ const props = defineProps({ type: Number, default: 0, }, + productDetail: { + type: Object, + default: () => {}, + }, }); +const emit = defineEmits(['change']); + const formRef = ref(); const modelRef = reactive({ @@ -146,8 +155,19 @@ const modelRef = reactive({ const writeFormRef = ref(); -const functionSelect = () => { +const functionSelect = (val: any, options?: any) => { modelRef.message.inputs = []; + emit('change', { + propertiesName: options?.label, + propertiesValue: modelRef.propertiesValue, + }); +}; + +const propertySelect = (val: any, options?: any) => { + emit('change', { + propertiesName: options?.label, + propertiesValue: modelRef.propertiesValue, + }); }; const functionRules = [ @@ -156,11 +176,11 @@ const functionRules = [ if (!value?.length && functions.value.length) { return Promise.reject('请输入功能值'); } else { - const hasValue = value.find( + const hasValue = value?.find( (item: { name: string; value: any }) => !item.value, ); if (hasValue) { - const functionItem = functions.value.find( + const functionItem = functions.value?.find( (item: any) => item.id === hasValue.name, ); return Promise.reject( @@ -239,11 +259,11 @@ const onMessageTypeChange = (val: string) => { }; watch( - () => props.values, + () => props.productDetail, (newVal) => { - if (newVal?.productDetail?.id) { - if (newVal?.selector === 'fixed') { - const id = newVal?.selectorValues?.[0]?.value; + if (newVal?.id) { + if (props.values?.selector === 'fixed') { + const id = props.values?.selectorValues?.[0]?.value; if (id) { detail(id).then((resp) => { if (resp.status === 200) { @@ -254,9 +274,7 @@ watch( }); } } else { - metadata.value = JSON.parse( - newVal?.productDetail?.metadata || '{}', - ); + metadata.value = JSON.parse(newVal?.metadata || '{}'); } } }, @@ -282,6 +300,13 @@ watch( const onWriteChange = (val: string) => { modelRef.propertiesValue = val; + emit('change', { + propertiesName: + deviceMessageType.value === 'INVOKE_FUNCTION' + ? _function.value?.name + : _property.value?.name, + propertiesValue: modelRef.propertiesValue, + }); }; const onFormSave = () => { @@ -295,19 +320,19 @@ const onFormSave = () => { reject(false); } } - // 处理三种情况的值的格式 - const obj = { + resolve({ message: { ...modelRef.message, ..._data.message, - propertiesName: - deviceMessageType.value === 'INVOKE_FUNCTION' - ? _function.value?.name - : _property.value?.name, - propertiesValue: modelRef.propertiesValue, }, - }; - resolve(obj); + }); + emit('change', { + propertiesName: + deviceMessageType.value === 'INVOKE_FUNCTION' + ? _function.value?.name + : _property.value?.name, + propertiesValue: modelRef.propertiesValue, + }); }) .catch((err: any) => { reject(err); diff --git a/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue b/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue index 418e943c..a4d72697 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/device/Device.vue @@ -66,7 +66,7 @@ diff --git a/src/views/rule-engine/Scene/Save/action/Device/device/index.vue b/src/views/rule-engine/Scene/Save/action/Device/device/index.vue index 6963427d..13bf7a9e 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/device/index.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/device/index.vue @@ -13,18 +13,12 @@ @change="onSelectorChange" /> - - {}, + }, }); // save保存deviceDetail @@ -122,9 +120,7 @@ const modelRef = reactive({ selectorValues: undefined, deviceId: '', source: '', - relationName: '', upperKey: '', - message: undefined, }); const list = ref([]); @@ -166,10 +162,11 @@ const filterTree = (nodes: any[]) => { if ( it.children.find( (item: any) => - item.id.indexOf('deviceId' || 'device_id' || 'device_Id') > - -1, + item?.id?.indexOf( + 'deviceId' || 'device_id' || 'device_Id', + ) > -1, ) && - !it.children.find((item: any) => item.id.indexOf('boolean') > -1) + !it.children.find((item: any) => item?.id.indexOf('boolean') > -1) ) { return true; } @@ -197,7 +194,7 @@ const sourceChangeEvent = async () => { const productId = data.value?.branches?.[props.branchesName].then?.[props.thenName] ?.actions?.[props.name > 0 ? props.name - 1 : 0]?.device?.productId; - if (productId === props.values?.productDetail?.id) { + if (productId === props?.productDetail?.id) { const _data = await getParams(_params, unref(data)); builtInList.value = handleParamsData(filterTree(_data), 'id'); } else { @@ -205,7 +202,7 @@ const sourceChangeEvent = async () => { } }; -const filterType = async () => { +const filterType = async (newVal: any) => { const _list = TypeList.filter((item) => item.value === 'fixed'); if (unref(data)?.trigger?.type === 'device') { //关系 @@ -221,10 +218,9 @@ const filterType = async () => { _list.push(...array); } //标签 - const tag = JSON.parse( - props.values.productDetail?.metadata || '{}', - )?.tags; + const tag = JSON.parse(newVal?.metadata || '{}')?.tags; if (tag && tag.length !== 0) { + tagList.value = tag || []; const array = TypeList.filter((item) => item.value === 'tag'); _list.push(...array); } @@ -251,23 +247,23 @@ const filterType = async () => { } }; -const onSelectorChange = () => { +const onSelectorChange = (val: string) => { modelRef.selectorValues = undefined; + modelRef.selector = val; }; const onDeviceChange = (_detail: any) => { if (_detail) { if (_detail.id) { - modelRef.deviceId = _detail.id; + modelRef.deviceId = _detail?.id; modelRef.selectorValues = [ { value: _detail.id, name: _detail.name }, ] as any; - modelRef.message = {} as any; } else { modelRef.deviceId = ''; modelRef.selectorValues = [] as any; } - emits('save', unref(modelRef), _detail); + emits('save', unref(modelRef), { name: _detail.name }); } }; @@ -276,8 +272,7 @@ const onRelationChange = (val: any, options: any) => { modelRef.source = 'upper'; modelRef.selectorValues = val; modelRef.upperKey = 'scene.deviceId'; - modelRef.relationName = options.label; - emits('save', unref(modelRef), {}); + emits('save', unref(modelRef), { relationName: options.label }); }; const onTagChange = (val: any[], arr: any[]) => { @@ -285,27 +280,61 @@ const onTagChange = (val: any[], arr: any[]) => { modelRef.deviceId = 'deviceId'; modelRef.source = 'fixed'; } - emits('save', unref(modelRef), {}, arr ? { tagList: arr } : {}); + const tagName = arr.map((i, _index) => { + return `${_index !== 0 && _index !== (arr || []).length && i.type}${ + i.name + }为${i.value}`; + }); + emits( + 'save', + unref(modelRef), + {}, + arr ? { tagName: tagName.join('') } : {}, + ); }; const onVariableChange = (val: any, node: any) => { modelRef.deviceId = val; modelRef.selectorValues = [{ value: val, name: node.description }] as any; - emits('save', unref(modelRef), node); + emits('save', unref(modelRef), { name: node.description }); }; -watchEffect(() => { - Object.assign(modelRef, props.values); -}); +watch( + () => props.values, + (newVal) => { + Object.assign(modelRef, newVal); + }, + { + immediate: true, + deep: true, + }, +); watch( - () => props.values.productDetail, + () => props.productDetail, async (newVal) => { await sourceChangeEvent(); if (newVal) { - const metadata = JSON.parse(newVal?.metadata || '{}'); - tagList.value = metadata?.tags || []; - filterType(); + filterType(newVal); + } + }, + { + immediate: true, + deep: true, + }, +); + +watch( + () => [props.values, builtInList.value], + ([newVal1, newVal2]) => { + if (newVal2 && newVal2.length) { + const param = newVal1?.selectorValues?.[0]?.value; + const isVariable = (newVal2 || [])?.find((item: any) => { + return item.children.find((i: any) => i.id === param); + }); + if (isVariable) { + modelRef.selector = 'variable'; + } } }, { @@ -319,14 +348,14 @@ const onFormSave = () => { formRef.value .validate() .then(async (_data: any) => { - if(modelRef.selector === 'fixed'){ - if(!modelRef?.selectorValues?.[0]?.value){ - onlyMessage('请选择设备', 'error') + if (modelRef.selector === 'fixed') { + if (!modelRef?.selectorValues?.[0]?.value) { + onlyMessage('请选择设备', 'error'); reject(false); } else { resolve({ ..._data, - selectorValues: modelRef.selectorValues + selectorValues: modelRef.selectorValues, }); } } else { diff --git a/src/views/rule-engine/Scene/Save/action/Device/index.vue b/src/views/rule-engine/Scene/Save/action/Device/index.vue index de9c3580..488a1c00 100644 --- a/src/views/rule-engine/Scene/Save/action/Device/index.vue +++ b/src/views/rule-engine/Scene/Save/action/Device/index.vue @@ -23,7 +23,7 @@ @@ -61,7 +64,7 @@ diff --git a/src/views/system/Menu/Setting/index.vue b/src/views/system/Menu/Setting/index.vue index 9634b5b5..bf7bcea4 100644 --- a/src/views/system/Menu/Setting/index.vue +++ b/src/views/system/Menu/Setting/index.vue @@ -3,84 +3,84 @@ - 基于系统源代码中的菜单数据,配置系统菜单。 + 单击可切换菜单未选中/选中状态;操作父级菜单时,对应子菜单状态将默认与其同步,可以单独操作调整;支持拖拽菜单调整展示顺序。 + - - 系统菜单 - - 根据系统代码自动读取的菜单数据 + + - - - - - - - - - - - - {{ row.name }} + + + + + + {{ row.name }} + - - - - - 保存 + + + + + (visible = true)" + style="margin-left: 10%" + >保存 + + 保存后当前系统菜单数据将被覆盖,确认操作? +
+ {{ getTypeTooltip(formData.circuitBreaker.type) }} +