-
-
- 第三方系统设备ID
-
-
- 通过调用SDK或HTTP请求的方式接入第三方系统设备数据时,第三方系统与平台当前设备对应的设备ID。
- 如双方ID值一致,则无需填写
-
-
-
-
-
-
- 映射
-
-
- {{ inklingDeviceId }}
-
-
-
-
+
+
+
+ {{ instanceStore.current?.id }}
+
+
+
+ 通过调用SDK或HTTP请求的方式接入第三方系统设备数据时,第三方系统与平台当前设备对应的设备ID。
+ 如双方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 @@
>
-
+
-
+
-
-
+
@@ -38,6 +38,7 @@ import { reactive } from 'vue';
import type { PropType } from 'vue';
import Item from './item.vue'
import {Form} from "jetlinks-ui-components";
+import {cloneDeep} from "lodash";
type ValueType = number | Array
| undefined;
@@ -56,13 +57,14 @@ const emit = defineEmits();
const formItemContext = Form.useInjectFormItemContext();
+
const formData = reactive<{
value: ValueType;
rangeValue: ValueType;
}>({
value: props.value?.range === false ? props.value?.value : undefined,
rangeValue: props.value?.range === true
- ? props.value?.value || [undefined, undefined]
+ ? cloneDeep(props.value?.value) || [undefined, undefined]
: [undefined, undefined],
});
@@ -76,6 +78,13 @@ const showText = computed(() => {
}
})
+const validator = (_: any, value: any) => {
+ if (props.value.range && formData.rangeValue![0] >= formData.rangeValue![1]) {
+ return Promise.reject('需大于左侧数值')
+ }
+ return Promise.resolve()
+}
+
const confirm = () => {
return new Promise((resolve, reject) => {
formRef.value.validate().then(() => {
diff --git a/src/views/device/components/Metadata/Base/components/Properties/Metrics/item.vue b/src/views/device/components/Metadata/Base/components/Properties/Metrics/item.vue
index 031f9d8f..8b658f28 100644
--- a/src/views/device/components/Metadata/Base/components/Properties/Metrics/item.vue
+++ b/src/views/device/components/Metadata/Base/components/Properties/Metrics/item.vue
@@ -10,6 +10,8 @@
v-else-if="['int', 'long', 'float', 'double'].includes(type)"
v-model:value="myValue"
:precision="0"
+ :max="2147483647"
+ :min="-2147483647"
style="width: 100%"
placeholder="请输入"
@change="change"
@@ -31,6 +33,7 @@
/>