From 9170030d25acea5f7c99ca39ce5b4536d6464810 Mon Sep 17 00:00:00 2001 From: XieYongHong <18010623010@163.com> Date: Tue, 18 Jul 2023 18:11:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20bug#16459=E3=80=8116434=E3=80=8116453?= =?UTF-8?q?=E3=80=8116452=E3=80=8110936?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: bug#16459、16434、16453、16452 * feat: 数据解析添加代码提示 * fix: bug#16451 * fix: 修改子设备绑定 * fix: 北向输出bug修复 * fix: 修改北向输出 * fix: 兼容物模型旧版数据 * fix: 修改订阅通知样式 * fix: 优化物模型规则窗口长度 * fix: 修改告警配置 * fix: providerName * fix: bug#10936 * feat: docker:2.1.0-SNAPSHOT --- build.sh | 4 +- package.json | 2 +- src/api/device/instance.ts | 3 + src/components/MCarousel/index.vue | 11 +- .../Northbound/AliCloud/Detail/index.vue | 4 +- src/views/Northbound/DuerOS/Detail/index.vue | 7 +- .../Subscribe/components/Detail.vue | 2 +- .../components/Subscribe/components/Item.vue | 9 +- .../Center/components/Subscribe/index.vue | 39 ++++--- .../ChildDevice/BindChildDevice/index.vue | 23 ++-- .../device/Instance/Detail/Info/index.vue | 48 ++++---- .../device/Instance/Detail/Parsing/index.vue | 30 ++++- .../Product/Detail/DataAnalysis/index.vue | 23 +++- .../device/components/Metadata/Base/Base.vue | 21 ++-- .../components/Metadata/Base/columns.tsx | 52 ++++++--- .../Properties/Metrics/BooleanSelect.vue | 39 +++++++ .../components/Properties/Metrics/Metrics.vue | 12 +- .../Properties/Metrics/ValueItem.vue | 17 ++- .../components/Properties/Metrics/item.vue | 5 + .../Base/components/VirtualRule/index.vue | 85 +++++++------- src/views/link/DashBoard/components/Cpu.vue | 3 +- src/views/link/DashBoard/components/Jvm.vue | 3 +- .../Alarm/Configuration/Save/Base/index.vue | 28 ++++- .../Configuration/Save/Scene/Save/index.vue | 1 + src/views/rule-engine/DashBoard/index.vue | 5 +- .../Save/action/Device/actions/index.vue | 4 +- .../Scene/Save/action/ListItem/CheckItem.vue | 14 +-- .../Scene/Save/action/ListItem/Item.vue | 2 +- .../NoticeRule/components/Item/index.vue | 106 ++++++++++-------- src/views/system/NoticeRule/index.vue | 46 ++++---- yarn.lock | 8 +- 31 files changed, 401 insertions(+), 255 deletions(-) create mode 100644 src/views/device/components/Metadata/Base/components/Properties/Metrics/BooleanSelect.vue diff --git a/build.sh b/build.sh index 6ead7b78..818598a0 100644 --- a/build.sh +++ b/build.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -docker build -t registry.cn-shenzhen.aliyuncs.com/jetlinks/jetlinks-ui-vue:2.1.0-TEST . -docker push registry.cn-shenzhen.aliyuncs.com/jetlinks/jetlinks-ui-vue:2.1.0-TEST +docker build -t registry.cn-shenzhen.aliyuncs.com/jetlinks/jetlinks-ui-vue:2.1.0-SNAPSHOT . +docker push registry.cn-shenzhen.aliyuncs.com/jetlinks/jetlinks-ui-vue:2.1.0-SNAPSHOT diff --git a/package.json b/package.json index f3b96f0c..a3fa55e5 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "event-source-polyfill": "^1.0.31", "global": "^4.4.0", "jetlinks-store": "^0.0.3", - "jetlinks-ui-components": "^1.0.24", + "jetlinks-ui-components": "^1.0.25", "js-cookie": "^3.0.1", "jsencrypt": "^3.3.2", "less": "^4.1.3", diff --git a/src/api/device/instance.ts b/src/api/device/instance.ts index 1b574c8e..11b27733 100644 --- a/src/api/device/instance.ts +++ b/src/api/device/instance.ts @@ -607,3 +607,6 @@ export const saveDeviceVirtualProperty = (productId: string, deviceId: string, d export const queryDeviceVirtualProperty = (productId: string, deviceId: string, propertyId: string) => server.get(`/virtual/property/device/${productId}/${deviceId}/${propertyId}`) export const queryByParent = (deviceId: string) => server.get(`/device/gateway/${deviceId}/parent`) + +export const queryCodeTips = (productId: string, deviceId: string) => server.get(`/device/transparent-codec/${productId}/${deviceId}.d.ts`) +export const queryProductCodeTips = (productId: string) => server.get(`/device/transparent-codec/${productId}.d.ts`) diff --git a/src/components/MCarousel/index.vue b/src/components/MCarousel/index.vue index a1e3a11a..5463d09b 100644 --- a/src/components/MCarousel/index.vue +++ b/src/components/MCarousel/index.vue @@ -8,9 +8,6 @@
-
- -
@@ -63,14 +60,13 @@ const onLeft = () => { .box { display: flex; align-items: center; - margin: 5px 0; + margin: 8px 0; .box-item { - margin: 0 6px; - max-width: 48px; + margin: 0 12px; + max-width: 60px; } .box-btn { - margin-right: 12px; .box-item-action { width: 12px; background-color: #F7F8FA; @@ -79,6 +75,7 @@ const onLeft = () => { font-size: 12px; color: #666666; cursor: pointer; + &:hover { background-color: #EFF2FE; color: @primary-color; diff --git a/src/views/Northbound/AliCloud/Detail/index.vue b/src/views/Northbound/AliCloud/Detail/index.vue index 4f2bddc0..00304fa1 100644 --- a/src/views/Northbound/AliCloud/Detail/index.vue +++ b/src/views/Northbound/AliCloud/Detail/index.vue @@ -617,7 +617,9 @@ const onPlatError = (val: any) => { const _validator = (_rule: any, value: string): Promise => new Promise((resolve, reject) => { const _item = productList.value.find((item) => item.id === value); - if (!_item) { + if(!modelRef.id || modelRef.id === ':id') { + return resolve(''); + } else if (!_item && value) { return reject('关联产品已被删除,请重新选择'); } return resolve(''); diff --git a/src/views/Northbound/DuerOS/Detail/index.vue b/src/views/Northbound/DuerOS/Detail/index.vue index 4434f521..e2102f3f 100644 --- a/src/views/Northbound/DuerOS/Detail/index.vue +++ b/src/views/Northbound/DuerOS/Detail/index.vue @@ -779,18 +779,19 @@ const onActiveProduct = () => { const _validator = (_rule: any, value: string): Promise => new Promise((resolve, reject) => { const _item = productList.value.find((item) => item.id === value); - if (!_item) { + if(!modelRef.id || modelRef.id === ':id') { + return resolve(''); + } else if (!_item && value) { productChange(value); return reject('关联产品已被删除,请重新选择'); } else { if (!_item?.state) { _error.value = `当前选择的${_item.name}产品为禁用状态`; - // return reject(`当前选择的${_item.name}产品为禁用状态`) } else { _error.value = ''; } + return resolve(''); } - return resolve(''); }); const saveBtn = async () => { diff --git a/src/views/account/Center/components/Subscribe/components/Detail.vue b/src/views/account/Center/components/Subscribe/components/Detail.vue index 30682f1e..aa2b3491 100644 --- a/src/views/account/Center/components/Subscribe/components/Detail.vue +++ b/src/views/account/Center/components/Subscribe/components/Detail.vue @@ -105,7 +105,7 @@ const handleSearch = async () => { ); }); if (_item) { - info.value = _item?.providerName + info.value = _item?.providerName || _item?.thirdPartyUserId } } }; diff --git a/src/views/account/Center/components/Subscribe/components/Item.vue b/src/views/account/Center/components/Subscribe/components/Item.vue index 4554afc1..ba9f77f1 100644 --- a/src/views/account/Center/components/Subscribe/components/Item.vue +++ b/src/views/account/Center/components/Subscribe/components/Item.vue @@ -147,15 +147,19 @@ const onSave = (dt: any) => { \ No newline at end of file diff --git a/src/views/account/Center/components/Subscribe/index.vue b/src/views/account/Center/components/Subscribe/index.vue index a5cb010e..2ad6de91 100644 --- a/src/views/account/Center/components/Subscribe/index.vue +++ b/src/views/account/Center/components/Subscribe/index.vue @@ -21,10 +21,9 @@ -
+
- {{ - instanceStore.current?.id - }} - - - 映射 -
-
- {{ inklingDeviceId }} -
- - - + +
+
+ {{ instanceStore.current?.id }}
+ + +
{{ instanceStore.current?.productName diff --git a/src/views/device/Instance/Detail/Parsing/index.vue b/src/views/device/Instance/Detail/Parsing/index.vue index 9c482213..2bdfa330 100644 --- a/src/views/device/Instance/Detail/Parsing/index.vue +++ b/src/views/device/Instance/Detail/Parsing/index.vue @@ -68,6 +68,7 @@ style="height: 100%" theme="vs" v-model:modelValue="editorValue" + :registrationTypescript="typescriptTip" />
@@ -151,11 +152,11 @@ import PermissionButton from '@/components/PermissionButton/index.vue'; import { useFullscreen } from '@vueuse/core'; import { useInstanceStore } from '@/store/instance'; import { - deviceCode, - getProtocal, - testCode, - saveDeviceCode, - delDeviceCode, + deviceCode, + getProtocal, + testCode, + saveDeviceCode, + delDeviceCode, queryCodeTips, queryProductCodeTips, } from '@/api/device/instance'; import { message } from 'jetlinks-ui-components'; import { isBoolean } from 'lodash'; @@ -179,6 +180,11 @@ const loading = ref(false); const isTest = ref(false); const editorValue = ref(''); +const typescriptTip = reactive({ + typescript: '' +}) + + const color = computed(() => ({ color: readOnly.value ? '#415ed1' : '#a6a6a6', })); @@ -228,12 +234,24 @@ const getTopic = async () => { topicList.value = item; } }; + +const queryCode = () => { + queryCodeTips(instanceStore.current.productId, + instanceStore.current.id,).then(res => { + if (res.success) { + typescriptTip.typescript = res.result + } + }) +} + //获取设备解析规则 const getDeviceCode = async () => { const res: any = await deviceCode( instanceStore.current.productId, instanceStore.current.id, ); + + if (res.status === 200) { const item = res.result?.configuration?.script ? res.result?.configuration?.script @@ -261,6 +279,7 @@ const test = async (dataTest: any) => { } }; + //保存设备解析规则 const save = async () => { const item = { @@ -328,6 +347,7 @@ watch(() => instanceStore.current?.id, () => { if (instanceStore.current?.id) { getDeviceCode(); getTopic(); + queryCode() } }, { immediate: true }) diff --git a/src/views/device/Product/Detail/DataAnalysis/index.vue b/src/views/device/Product/Detail/DataAnalysis/index.vue index aabbe7d3..527dbf3d 100644 --- a/src/views/device/Product/Detail/DataAnalysis/index.vue +++ b/src/views/device/Product/Detail/DataAnalysis/index.vue @@ -25,6 +25,7 @@ style="height: 100%" theme="vs" v-model:modelValue="editorValue" + :registrationTypescript="typescriptTip" />
@@ -112,10 +113,10 @@ import PermissionButton from '@/components/PermissionButton/index.vue'; import { useFullscreen } from '@vueuse/core'; import { useProductStore } from '@/store/product'; import { - productCode, - getProtocal, - testCode, - saveProductCode, + productCode, + getProtocal, + testCode, + saveProductCode, queryProductCodeTips, } from '@/api/device/instance'; import { isBoolean } from 'lodash'; import { onlyMessage } from '@/utils/comm'; @@ -135,6 +136,9 @@ const resultValue = ref({}); const loading = ref(false); const isTest = ref(false); const editorValue = ref(''); +const typescriptTip = reactive({ + typescript: '' +}) const resStyle = computed(() => isBoolean(resultValue.value.success) @@ -168,6 +172,16 @@ const getTopic = async () => { topicList.value = item; } }; + +const queryCodeTips = () => { + queryProductCodeTips(productStore.current.id).then(res => { + if (res.success) { + typescriptTip.typescript = res.result + } + }) +} + + //获取产品解析规则 const getProductCode = async () => { const res: any = await productCode(productStore.current.id); @@ -248,6 +262,7 @@ const debug = () => { onMounted(() => { getProductCode(); getTopic(); + queryCodeTips() }); diff --git a/src/views/device/components/Metadata/Base/Base.vue b/src/views/device/components/Metadata/Base/Base.vue index 761f9aab..3f1fa096 100644 --- a/src/views/device/components/Metadata/Base/Base.vue +++ b/src/views/device/components/Metadata/Base/Base.vue @@ -395,19 +395,22 @@ const handleSaveClick = async (next?: Function) => { const virtual: any[] = []; const arr = resp.map((item: any) => { if(item.expands?.virtualRule) { + const triggerProperties = item.expands.virtualRule.triggerProperties + const rule = omit(item.expands.virtualRule, ['triggerProperties']) virtual.push({ - ...item.expands.virtualRule, + triggerProperties, + rule, + type: rule.type, propertyId: item.id }) } - // return { - // ...item, - // expands: { - // ...item.expands, - // virtualRule: undefined - // } - // } - return item + return { + ...item, + expands: { + ...omit(item.expands, ['virtualRule']) + } + } + // return item }) // 保存规则 if(virtual.length) { diff --git a/src/views/device/components/Metadata/Base/columns.tsx b/src/views/device/components/Metadata/Base/columns.tsx index 28897157..da29f209 100644 --- a/src/views/device/components/Metadata/Base/columns.tsx +++ b/src/views/device/components/Metadata/Base/columns.tsx @@ -433,26 +433,46 @@ export const useColumns = (type?: MetadataType, target?: 'device' | 'product', n required: true, rules: target !== 'device' ? [ { - validator: async (_: Record, value: any) => { + callback: async (rule: any, value: any, dataSource: any[]) => { console.log('value', value) - if (value.source) { - if(value.source !== 'rule') { - if(value.type?.length) { - return Promise.resolve(); - } else { - return Promise.reject('请选择读写类型'); - } - } else { - if(value.virtualRule?.rule?.script) { - return Promise.resolve(); - }else { - return Promise.reject('请配置规则'); - } + const field = rule.field.split('.') + const fieldIndex = Number(field[1]) + + const values = dataSource.find((item, index) => index === fieldIndex) + const virtualRule = values.elements?.virtualRule + const source = value.source + const ids = (noEdit?.value?.id || []) as any[] + + if (source) { + if (source !== 'rule' && !value.type?.length) { + return Promise.reject('请选择读写类型'); + } else if(!ids.includes(values.id) && virtualRule){ + return Promise.reject('请配置规则'); } - } else { - return Promise.reject('请选择属性来源'); + + return Promise.resolve() } + + return Promise.reject('请选择属性来源'); } + // if (value.source) { + // if(value.source !== 'rule') { + // if(value.type?.length) { + // return Promise.resolve(); + // } else { + // return Promise.reject('请选择读写类型'); + // } + // } else { + // if(value.virtualRule?.script) { + // return Promise.resolve(); + // }else { + // return Promise.reject('请配置规则'); + // } + // } + // } else { + // return Promise.reject('请选择属性来源'); + // } + // } }, ]: [] }, diff --git a/src/views/device/components/Metadata/Base/components/Properties/Metrics/BooleanSelect.vue b/src/views/device/components/Metadata/Base/components/Properties/Metrics/BooleanSelect.vue new file mode 100644 index 00000000..863ccc15 --- /dev/null +++ b/src/views/device/components/Metadata/Base/components/Properties/Metrics/BooleanSelect.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/src/views/device/components/Metadata/Base/components/Properties/Metrics/Metrics.vue b/src/views/device/components/Metadata/Base/components/Properties/Metrics/Metrics.vue index 24c05ebe..91f00cba 100644 --- a/src/views/device/components/Metadata/Base/components/Properties/Metrics/Metrics.vue +++ b/src/views/device/components/Metadata/Base/components/Properties/Metrics/Metrics.vue @@ -33,6 +33,7 @@ import { defineExpose, provide } from 'vue' import MetricValueItem from './ValueItem.vue' import {validatorConfig} from "@/views/device/components/Metadata/Base/columns"; +import BooleanSelect from "@/views/device/components/Metadata/Base/components/Properties/Metrics/BooleanSelect.vue"; const props = defineProps({ value: { @@ -107,7 +108,6 @@ const columns: any = [ rules: [ { validator(_: any, value: any) { - console.log('指标配置', value) if (!value) { return Promise.reject('请配置指标') } @@ -132,17 +132,11 @@ const newColumns = computed(() => { title: '指标值', dataIndex: 'range', width: 120, - type: 'booleanSelect', + type: 'components', components: { - props: { - trueText: '范围值', - trueValue: true, - falseText: '固定值', - falseValue: false, - } + name: BooleanSelect } }) - console.log(data); return data } return columns diff --git a/src/views/device/components/Metadata/Base/components/Properties/Metrics/ValueItem.vue b/src/views/device/components/Metadata/Base/components/Properties/Metrics/ValueItem.vue index 70ec3391..564a1924 100644 --- a/src/views/device/components/Metadata/Base/components/Properties/Metrics/ValueItem.vue +++ b/src/views/device/components/Metadata/Base/components/Properties/Metrics/ValueItem.vue @@ -10,18 +10,18 @@ >