@@ -86,6 +88,7 @@ import Markdown from 'vue3-markdown-it';
const props = defineProps({
id: String,
+ propertiesOptions: Array
});
interface Emits {
@@ -121,16 +124,14 @@ const lastClick = (node: OperatorItem) => {
emit('addOperatorValue', `$lastState("${node.id}")`);
};
const addClick = (node: OperatorItem) => {
- console.log(node)
emit('addOperatorValue', node.code);
};
const productStore = useProductStore();
const getData = async (id?: string) => {
- const metadata = productStore.current.metadata || '{}';
- const _properties =
- JSON.parse(metadata).properties || ([] as PropertyMetadata[]);
+ // const metadata = productStore.current.metadata || '{}';
+ const _properties = props.propertiesOptions as PropertyMetadata[]
const properties = {
id: 'property',
name: '属性',
diff --git a/src/components/FRuleEditor/index.vue b/src/components/FRuleEditor/index.vue
index c45a2204..9ca56d93 100644
--- a/src/components/FRuleEditor/index.vue
+++ b/src/components/FRuleEditor/index.vue
@@ -24,7 +24,7 @@
diff --git a/src/router/index.ts b/src/router/index.ts
index 09f14d0e..0f4ff104 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,5 +1,5 @@
import { createRouter, createWebHashHistory } from 'vue-router'
-import menus, { AccountCenterBindPath, InitHomePath, InitLicense, LoginPath, OauthPath } from './menu'
+import menus, { AccountCenterBindPath, InitHomePath, InitLicense, LoginPath, OauthPath, VideoSharePath } from './menu'
import { cleanToken, getToken } from '@/utils/comm'
import { useUserInfo } from '@/store/userInfo'
import { useSystem } from '@/store/system'
@@ -15,7 +15,7 @@ const router = createRouter({
})
const filterPath = [ InitHomePath ]
-const noTokenPath = [ AccountCenterBindPath, OauthPath, InitLicense ]
+const noTokenPath = [ AccountCenterBindPath, OauthPath, InitLicense, VideoSharePath ]
router.beforeEach((to, from, next) => {
// TODO 切换路由取消请求
diff --git a/src/router/menu.ts b/src/router/menu.ts
index 7f7c7614..34605154 100644
--- a/src/router/menu.ts
+++ b/src/router/menu.ts
@@ -5,6 +5,7 @@ export const InitLicense = '/init-license'
export const NotificationSubscriptionCode = 'message-subscribe'
export const NotificationRecordCode = 'account/NotificationRecord'
export const OauthPath = '/oauth'
+export const VideoSharePath = '/media/device/Share'
export const AccountMenu = {
path: '/account',
@@ -86,5 +87,9 @@ export default [
},
component: () => import('@/views/oauth/WeChat.vue')
},
+ {
+ path: VideoSharePath,
+ component: () => import('@/views/media/Device/Channel/Share/index.vue')
+ },
AccountMenu
]
\ No newline at end of file
diff --git a/src/style.less b/src/style.less
index 8b3171c1..b119250d 100644
--- a/src/style.less
+++ b/src/style.less
@@ -212,3 +212,7 @@ body {
margin: 16px 0;
}
}
+
+.ant-notification {
+ z-index: 1100;
+}
diff --git a/src/utils/consts.ts b/src/utils/consts.ts
index 0ea4e3de..9acfd9a3 100644
--- a/src/utils/consts.ts
+++ b/src/utils/consts.ts
@@ -53,6 +53,7 @@ export const USER_CENTER_MENU_BUTTON_CODE = 'user-center-passwd-update'
/**协议列表 */
export const protocolList = [
- { label: 'OPC-UA', value: 'OPC_UA', alias: 'opc-ua' },
- { label: 'Modbus/TCP', value: 'MODBUS_TCP', alias: 'modbus-tcp' },
+ { label: 'OPC_UA', value: 'OPC_UA', alias: 'opc-ua' },
+ { label: 'MODBUS_TCP', value: 'MODBUS_TCP', alias: 'Modbus/TCP' },
+ { label: 'COLLECTOR_GATEWAY', value: 'COLLECTOR_GATEWAY', alias: 'GATEWAY' },
]
diff --git a/src/utils/menu.ts b/src/utils/menu.ts
index 273d5755..53e4ebe4 100644
--- a/src/utils/menu.ts
+++ b/src/utils/menu.ts
@@ -368,10 +368,10 @@ const findComponents = (code: string, level: number, isApp: boolean, components:
const myComponents = components[code]
if (level === 1) { // BasicLayoutPage
return myComponents ? () => myComponents() : BasicLayoutPage
+ } else if (isApp){ // iframe
+ return Iframe
} else if (level === 2) { // BlankLayoutPage or components
return myComponents ? () => myComponents() : BlankLayoutPage
- } else if (isApp){ // iframe
- return () => Iframe
} else if(myComponents) { // components
return () => myComponents()
}
@@ -417,6 +417,21 @@ const findDetailRouteItem = (item: any, components: any) => {
return []
}
+const findSaveRouteItem = (item: any, components: any) => {
+ const { code, url } = item
+ const Component = components[`${item.code}/Save`]
+ if (Component) {
+ return [{
+ url: `${url}/detail/:id`,
+ code: `${code}/Save`,
+ component: Component,
+ name: '详情信息',
+ isShow: false
+ }]
+ }
+ return []
+}
+
export const handleMenus = (menuData: any[], components: any, level: number = 1) => {
if (menuData && menuData.length) {
return menuData.map(item => {
@@ -434,7 +449,6 @@ export const handleMenus = (menuData: any[], components: any, level: number = 1)
const extraRoute = hasExtraChildren(item, extraRouteObj)
const detail_components = findDetailRouteItem(item, components)
-
if (extraRoute && !isApp) { // 包含额外的子路由
route.children = route.children ? [...route.children, ...extraRoute] : extraRoute
}
diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts
index b5bbf228..920825f9 100644
--- a/src/utils/websocket.ts
+++ b/src/utils/websocket.ts
@@ -43,9 +43,7 @@ export const initWebSocket = () => {
const data = JSON.parse(msg.data)
if (data.type === 'error') {
- notification.error({ key: 'wserr', message: data.message, style: {
- zIndex: 1040
- } })
+ notification.error({ key: 'error', message: data.message })
}
if (subs[data.requestId]) {
diff --git a/src/views/DataCollect/Channel/Save/GateWayDeviceModal.vue b/src/views/DataCollect/Channel/Save/GateWayDeviceModal.vue
new file mode 100644
index 00000000..68b956c9
--- /dev/null
+++ b/src/views/DataCollect/Channel/Save/GateWayDeviceModal.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ slotProps.name }}
+
+
+
+
+
+ 设备类型
+
+ {{ slotProps.deviceType?.text }}
+
+
+
+ 产品名称
+
+ {{ slotProps.productName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/DataCollect/Channel/Save/GateWayFormItem.vue b/src/views/DataCollect/Channel/Save/GateWayFormItem.vue
new file mode 100644
index 00000000..5427a373
--- /dev/null
+++ b/src/views/DataCollect/Channel/Save/GateWayFormItem.vue
@@ -0,0 +1,71 @@
+
+
+ 选择网关设备
+
+
+
+
+ {{ name }}
+
+
+
+ 重新选择
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/DataCollect/Channel/Save/index.vue b/src/views/DataCollect/Channel/Save/index.vue
index c416f5f3..2b63c814 100644
--- a/src/views/DataCollect/Channel/Save/index.vue
+++ b/src/views/DataCollect/Channel/Save/index.vue
@@ -92,6 +92,17 @@
:filter-option="filterOption"
/>
+
+
+
(cloneDeep(FormState));
const handleOk = async () => {
- const params = await formRef.value?.validate();
+ const params: any = await formRef.value?.validate();
+ if (params?.provider === 'COLLECTOR_GATEWAY') {
+ params.configuration.deviceName = formData.value.configuration.deviceName
+ }
+
+ params.circuitBreaker = {
+ type: 'Ignore'
+ }
+
loading.value = true;
const response = !id
? await save(params).catch(() => {})
@@ -284,9 +304,9 @@ const getProvidersList = async () => {
if (resp.status === 200) {
const arr = resp.result
.filter(
- (item: any) => item.id === 'modbus-tcp' || item.id === 'opc-ua',
+ (item: any) => ['GATEWAY', 'Modbus/TCP', 'opc-ua'].includes(item.name),
)
- .map((it: any) => it.id);
+ .map((it: any) => it.name);
const providers: any = protocolList.filter((item: any) =>
arr.includes(item.alias),
);
@@ -302,7 +322,9 @@ getCertificateList();
watch(
() => props.data,
(value) => {
- if (value.id) formData.value = value as FormDataType;
+ if (value.id) {
+ formData.value = value as FormDataType;
+ }
},
{ immediate: true, deep: true },
);
diff --git a/src/views/DataCollect/Channel/data.ts b/src/views/DataCollect/Channel/data.ts
index c95583fa..68a8fe0c 100644
--- a/src/views/DataCollect/Channel/data.ts
+++ b/src/views/DataCollect/Channel/data.ts
@@ -15,6 +15,8 @@ export const FormState: FormDataType = {
authType: 'anonymous',
username: '',
password: '',
+ deviceId: undefined,
+ deviceName: undefined,
},
description: '',
};
diff --git a/src/views/DataCollect/Channel/index.vue b/src/views/DataCollect/Channel/index.vue
index 583606f9..3e27726b 100644
--- a/src/views/DataCollect/Channel/index.vue
+++ b/src/views/DataCollect/Channel/index.vue
@@ -143,11 +143,12 @@
\ No newline at end of file
diff --git a/src/views/account/Center/components/BindThirdAccount/index.vue b/src/views/account/Center/components/BindThirdAccount/index.vue
index 1e440fa5..8e07e584 100644
--- a/src/views/account/Center/components/BindThirdAccount/index.vue
+++ b/src/views/account/Center/components/BindThirdAccount/index.vue
@@ -1,5 +1,6 @@
-
+
+
+
\ No newline at end of file
diff --git a/src/views/device/Instance/Detail/components/EditTable/PatchMapping.vue b/src/views/device/Instance/Detail/components/EditTable/PatchMapping.vue
index d488608d..8d198b56 100644
--- a/src/views/device/Instance/Detail/components/EditTable/PatchMapping.vue
+++ b/src/views/device/Instance/Detail/components/EditTable/PatchMapping.vue
@@ -19,6 +19,8 @@
:tree-data="dataSource"
:checkedKeys="checkedKeys"
@check="onCheck"
+ :showLine="{ showLeafIcon: false }"
+ :show-icon="true"
/>
@@ -104,12 +106,12 @@ const handleData = (data: any[], type: string) => {
const handleSearch = async () => {
loading.value = true;
const resp = await treeMapping({
- terms: [
- {
- column: 'provider',
- value: _props.type,
- },
- ],
+ // terms: [
+ // {
+ // column: 'provider',
+ // value: _props.type,
+ // },
+ // ],
});
loading.value = false;
if (resp.status === 200) {
diff --git a/src/views/device/Instance/Detail/components/EditTable/index.vue b/src/views/device/Instance/Detail/components/EditTable/index.vue
index b4de8f5d..54f4f9f9 100644
--- a/src/views/device/Instance/Detail/components/EditTable/index.vue
+++ b/src/views/device/Instance/Detail/components/EditTable/index.vue
@@ -1,5 +1,5 @@
-
+
@@ -28,14 +28,9 @@
placeholder="请选择"
allowClear
:filter-option="filterOption"
+ :options="channelList"
+ @select="(_, option) => { record.provider = option.provider }"
>
- {{ item.label }}
@@ -188,16 +183,16 @@ const visible = ref(false);
const getChannel = async () => {
const resp: any = await queryChannelNoPaging({
paging: false,
- terms: [
- {
- terms: [
- {
- column: 'provider',
- value: props.provider,
- },
- ],
- },
- ],
+ // terms: [
+ // {
+ // terms: [
+ // {
+ // column: 'provider',
+ // value: props.provider,
+ // },
+ // ],
+ // },
+ // ],
});
if (resp.status === 200) {
channelList.value = resp.result?.map((item: any) => ({
@@ -211,12 +206,12 @@ const getChannel = async () => {
const handleSearch = async () => {
loading.value = true;
getChannel();
- const _metadata = metadata.properties.map((item: any) => ({
+ const _metadata = metadata.properties?.map?.((item: any) => ({
metadataId: item.id,
metadataName: `${item.name}(${item.id})`,
metadataType: 'property',
name: item.name,
- }));
+ })) || [];
if (_metadata && _metadata.length) {
const resp: any = await queryMapping(
'device',
@@ -269,6 +264,7 @@ const onSave = () => {
(i: any) => i.channelId,
);
if (arr && arr.length !== 0) {
+ console.log(arr)
const resp = await saveMapping(
instanceStore.current.id,
props.provider,
diff --git a/src/views/device/Instance/Detail/index.vue b/src/views/device/Instance/Detail/index.vue
index 6946132d..090d1d72 100644
--- a/src/views/device/Instance/Detail/index.vue
+++ b/src/views/device/Instance/Detail/index.vue
@@ -122,6 +122,7 @@ import Modbus from './Modbus/index.vue';
import OPCUA from './OPCUA/index.vue';
import EdgeMap from './EdgeMap/index.vue';
import Parsing from './Parsing/index.vue';
+import GateWay from './GateWay/index.vue'
import Log from './Log/index.vue';
import { _deploy, _disconnect } from '@/api/device/instance';
import { getImage, onlyMessage } from '@/utils/comm';
@@ -181,7 +182,8 @@ const tabs = {
EdgeMap,
Parsing,
Log,
- MetadataMap
+ MetadataMap,
+ GateWay
};
const getStatus = (id: string) => {
@@ -225,7 +227,7 @@ const getDetail = () => {
) {
list.value.push({
key: 'Modbus',
- tab: 'Modbus TCP',
+ tab: '数采映射',
});
}
if (
@@ -234,9 +236,18 @@ const getDetail = () => {
) {
list.value.push({
key: 'OPCUA',
- tab: 'OPC UA',
+ tab: '数采映射',
});
}
+ if (
+ instanceStore.current?.protocol === 'collector-gateway' &&
+ !keys.includes('GateWay')
+ ) {
+ list.value.push({
+ key: 'GateWay',
+ tab: '数采映射',
+ });
+ }
if (
instanceStore.current?.deviceType?.value === 'gateway' &&
!keys.includes('ChildDevice')
diff --git a/src/views/device/Product/Detail/BasicInfo/indev.vue b/src/views/device/Product/Detail/BasicInfo/indev.vue
index 0c6ceeff..09829307 100644
--- a/src/views/device/Product/Detail/BasicInfo/indev.vue
+++ b/src/views/device/Product/Detail/BasicInfo/indev.vue
@@ -26,18 +26,22 @@
{{
productStore.current.deviceType?.text
}}
-
{{
- productStore.current.accessName
- ? productStore.current.accessName
- : '配置接入方式'
- }}
+ type="link"
+ style="width:100%;padding:0"
+ @click="changeTables"
+ hasPermission="device/Product:update"
+ >
+
+ {{
+ productStore.current.accessName
+ ? productStore.current.accessName
+ : '配置接入方式'
+ }}
+
+
{{
dayjs(productStore.current.createTime).format('YYYY-MM-DD HH:mm:ss')
diff --git a/src/views/device/Product/Detail/index.vue b/src/views/device/Product/Detail/index.vue
index ecb52622..bab355e9 100644
--- a/src/views/device/Product/Detail/index.vue
+++ b/src/views/device/Product/Detail/index.vue
@@ -8,43 +8,68 @@
-
+
{{
productStore.current.name
}}
{{ productStore.current.name }}
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ 暂无权限,请联系管理员
+
+
+
@@ -87,6 +112,7 @@
: undefined
"
hasPermission="device/Product:update"
+ placement="topRight"
>应用配置
@@ -124,7 +150,9 @@ import { getImage, handleParamsToString, onlyMessage } from '@/utils/comm';
import { useMenuStore } from '@/store/menu';
import { useRouterParams } from '@/utils/hooks/useParams';
import {EventEmitter} from "@/utils/utils";
+import { usePermissionStore } from '@/store/permission';
+const permissionStore = usePermissionStore()
const menuStory = useMenuStore();
const route = useRoute();
const checked = ref
(true);
@@ -169,7 +197,7 @@ const tabs = {
watch(
() => route.params.id,
(newId) => {
- if (newId) {
+ if (newId && route.name === 'device/Product/Detail') {
productStore.reSet();
productStore.tabActiveKey = 'Info';
productStore.refresh(newId as string);
diff --git a/src/views/device/Product/DialogTips/index.vue b/src/views/device/Product/DialogTips/index.vue
index bc6a28b8..736144a1 100644
--- a/src/views/device/Product/DialogTips/index.vue
+++ b/src/views/device/Product/DialogTips/index.vue
@@ -101,6 +101,10 @@ defineExpose({
}
.product-id {
margin: 10px 15px 10px 0px;
+ max-width: 520px;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
}
.product-btn {
margin: 10px 0px 10px 0;
diff --git a/src/views/device/Product/index.vue b/src/views/device/Product/index.vue
index bee672b2..8fa72707 100644
--- a/src/views/device/Product/index.vue
+++ b/src/views/device/Product/index.vue
@@ -306,6 +306,7 @@ const getActions = (
icon: 'icon-xiazai',
onClick: () => {
+ console.log(data);
const extra = omit(data, [
'transportProtocol',
'protocolName',
@@ -314,7 +315,7 @@ const getActions = (
'accessProvider',
'messageProtocol',
]);
- downloadObject(extra, '产品');
+ downloadObject(extra, data.name+'产品');
},
},
{
@@ -388,28 +389,37 @@ const beforeUpload = (file: any) => {
reader.readAsText(file);
reader.onload = async (result) => {
const text = result.target?.result;
- console.log('text: ', text);
+ // console.log('text: ', text);
+ // console.log(file);
if (!file.type.includes('json')) {
onlyMessage('请上传json格式文件', 'error');
return false;
}
+ if(!text){
+ onlyMessage('文件内容不能为空','error')
+ return false;
+ }
try {
- const data = JSON.parse(text || '{}');
+ const data = JSON.parse(text);
// 设置导入的产品状态为未发布
data.state = 0;
+
if (Array.isArray(data)) {
- onlyMessage('请上传json格式文件', 'error');
+ onlyMessage('请上传正确格式文件', 'error');
return false;
}
delete data.state;
+ if(!data?.name){
+ data.name = "产品" + Date.now();
+ }
const res = await updateDevice(data);
if (res.status === 200) {
onlyMessage('操作成功');
tableRef.value?.reload();
}
return true;
- } catch {
- // onlyMessage('请上传json格式文件', 'error');
+ } catch(e) {
+ onlyMessage('请上传正确格式文件', 'error');
}
return true;
};
diff --git a/src/views/device/components/Metadata/Base/Base.vue b/src/views/device/components/Metadata/Base/Base.vue
index a9e04a99..c80b36dc 100644
--- a/src/views/device/components/Metadata/Base/Base.vue
+++ b/src/views/device/components/Metadata/Base/Base.vue
@@ -24,8 +24,10 @@
title: hasOperate('add', type)
? '当前的存储方式不支持新增'
: '新增',
+ getPopupContainer: getPopupContainer,
}"
@click="handleAddClick()"
+ placement="topRight"
>
新增
@@ -42,8 +44,10 @@
? '当前的存储方式不支持新增'
: !editStatus ? '暂无改动数据': '保存',
placement: hasOperate('add', type) ? 'topRight' : 'top',
+ getPopupContainer: getPopupContainer,
}"
@click="handleSaveClick()"
+ placement="topRight"
>
保存
@@ -90,13 +94,14 @@
@@ -110,6 +115,7 @@
@click="copyItem(data.record, data.index)"
:tooltip="{
title: operateLimits('add', type) ? '当前的存储方式不支持复制' : '复制',
+ getPopupContainer: getPopupContainer,
}"
>
@@ -123,6 +129,7 @@
@click="handleAddClick(null, data.index)"
:tooltip="{
title: operateLimits('add', type) ? '当前的存储方式不支持新增' : '新增',
+ getPopupContainer: getPopupContainer,
}"
>
@@ -135,6 +142,7 @@
@click="showDetail(data.record)"
:tooltip="{
title: '详情',
+ getPopupContainer: getPopupContainer,
}"
>
@@ -151,9 +159,11 @@
onConfirm: async () => {
await removeItem(data.index);
},
+ getPopupContainer: getPopupContainer
}"
:tooltip="{
placement: 'topRight',
+ getPopupContainer: getPopupContainer,
title: target === 'device' && productNoEdit.id?.includes?.(data.record._sortIndex) ? '继承自产品物模型的数据不支持删除' :'删除',
}"
:disabled="target === 'device' && productNoEdit.id?.includes?.(data.record._sortIndex)"
@@ -166,21 +176,25 @@
@@ -209,10 +223,11 @@ import {omit} from "lodash-es";
import { PropertiesModal, FunctionModal, EventModal, TagsModal } from './DetailModal'
import { Modal } from 'jetlinks-ui-components'
import {EventEmitter} from "@/utils/utils";
-import {watch} from "vue";
+import {computed, watch} from "vue";
import {cloneDeep} from "lodash";
import {useSystem} from "store/system";
import {storeToRefs} from "pinia";
+import { FULL_CODE } from 'jetlinks-ui-components/es/DataTable'
const props = defineProps({
target: {
@@ -255,13 +270,23 @@ const detailData = reactive({
visible:false
})
+
+
const showSave = ref(metadata.value.length !== 0)
-const showLastDelete = ref(false)
const dataSourceCache = ref(metadata.value)
+const fullRef = inject(FULL_CODE);
+
+const getPopupContainer = (node: any) => {
+ const fullDom = tableRef.value?.fullRef?.()
+ return fullDom || node
+}
+
+const showLastDelete = computed(() => {
+ return dataSourceCache.value.length === 1
+})
provide('_dataSource', dataSourceCache)
-
const showDetail = (data: any) => {
detailData.data = data
detailData.visible = true
@@ -344,15 +369,15 @@ const handleAddClick = async (_data?: any, index?: number) => {
const newObject = _data || getDataByType()
const _addData = await tableRef.value.addItem(newObject, index)
- if (_addData.length === 1) {
- showLastDelete.value = true
- }
+ // if (_addData.length === 1) {
+ // showLastDelete.value = true
+ // }
showSave.value = true
};
const copyItem = (record: any, index: number) => {
const copyData = cloneDeep(omit(record, ['_uuid', '_sortIndex']))
- copyData.id = `copy_${copyData.id}`.slice(0,64)
+ copyData.id = `copy_${copyData.id}`
handleAddClick(copyData, index)
}
@@ -361,9 +386,9 @@ const removeItem = (index: number) => {
// data.splice(index, 1);
// dataSource.value = data
const _data = tableRef.value.removeItem(index)
- if (_data.length === 1) {
- showLastDelete.value = true
- }
+ // if (_data.length === 1) {
+ // showLastDelete.value = true
+ // }
if (_data.length === 0) {
showSave.value = false
@@ -372,6 +397,7 @@ const removeItem = (index: number) => {
}
const editStatusChange = (status: boolean) => {
+ console.log('editStatusChange',status)
editStatus.value = status
}
@@ -431,6 +457,7 @@ const handleSaveClick = async (next?: Function) => {
if(result.success) {
dataSource.value = resp
tableRef.value.cleanEditStatus()
+ editStatus.value = false
onlyMessage('操作成功!')
next?.()
}
@@ -476,7 +503,11 @@ watch(() => metadata.value, () => {
dataSource.value = metadata.value
}, { immediate: true })
-onBeforeRouteUpdate((to, from, next) => {
+onBeforeRouteUpdate((to, from, next) => { // 设备管理内路由跳转
+ parentTabsChange(next as Function)
+})
+
+onBeforeRouteLeave((to, from, next) => { // 设备管理外路由跳转
parentTabsChange(next as Function)
})
diff --git a/src/views/device/components/Metadata/Base/DetailModal/EventModal.vue b/src/views/device/components/Metadata/Base/DetailModal/EventModal.vue
index e8af26ba..7a68f6a6 100644
--- a/src/views/device/components/Metadata/Base/DetailModal/EventModal.vue
+++ b/src/views/device/components/Metadata/Base/DetailModal/EventModal.vue
@@ -4,6 +4,7 @@
:maskClosable="false"
title="事件详情"
width="650px"
+ :getContainer="getPopupContainer"
@cancel="cancel"
@ok="ok"
>
@@ -36,6 +37,10 @@ const props = defineProps({
data: {
type: Object,
default: () => ({})
+ },
+ getPopupContainer: {
+ type: Function,
+ default: undefined
}
})
diff --git a/src/views/device/components/Metadata/Base/DetailModal/FunctionModal.vue b/src/views/device/components/Metadata/Base/DetailModal/FunctionModal.vue
index 87cdb660..2e037fea 100644
--- a/src/views/device/components/Metadata/Base/DetailModal/FunctionModal.vue
+++ b/src/views/device/components/Metadata/Base/DetailModal/FunctionModal.vue
@@ -4,6 +4,7 @@
title="功能详情"
width="650px"
:maskClosable="false"
+ :getContainer="getPopupContainer"
@cancel="cancel"
@ok="ok"
>
@@ -40,6 +41,10 @@ const props = defineProps({
data: {
type: Object,
default: () => ({})
+ },
+ getPopupContainer: {
+ type: Function,
+ default: undefined
}
})
diff --git a/src/views/device/components/Metadata/Base/DetailModal/PropertiesModal.vue b/src/views/device/components/Metadata/Base/DetailModal/PropertiesModal.vue
index e091e44d..885e9cb0 100644
--- a/src/views/device/components/Metadata/Base/DetailModal/PropertiesModal.vue
+++ b/src/views/device/components/Metadata/Base/DetailModal/PropertiesModal.vue
@@ -3,6 +3,7 @@
visible
:maskClosable="false"
title="属性详情"
+ :getContainer="getPopupContainer"
@cancel="cancel"
@ok="ok"
>
@@ -67,6 +68,10 @@ const props = defineProps({
data: {
type: Object,
default: () => ({})
+ },
+ getPopupContainer: {
+ type: Function,
+ default: undefined
}
})
diff --git a/src/views/device/components/Metadata/Base/DetailModal/TagsModal.vue b/src/views/device/components/Metadata/Base/DetailModal/TagsModal.vue
index 06003153..1d5001be 100644
--- a/src/views/device/components/Metadata/Base/DetailModal/TagsModal.vue
+++ b/src/views/device/components/Metadata/Base/DetailModal/TagsModal.vue
@@ -3,6 +3,7 @@
visible
:maskClosable="false"
title="标签详情"
+ :getContainer="getPopupContainer"
@cancel="cancel"
@ok="ok"
>
@@ -47,6 +48,10 @@ const props = defineProps({
data: {
type: Object,
default: () => ({})
+ },
+ getPopupContainer: {
+ type: Function,
+ default: undefined
}
})
diff --git a/src/views/device/components/Metadata/Base/Edit/BaseForm.vue b/src/views/device/components/Metadata/Base/Edit/BaseForm.vue
index 6b48e943..c1776126 100644
--- a/src/views/device/components/Metadata/Base/Edit/BaseForm.vue
+++ b/src/views/device/components/Metadata/Base/Edit/BaseForm.vue
@@ -4,7 +4,7 @@
{ max: 64, message: '最多可输入64个字符' },
{
pattern: /^[a-zA-Z0-9_\-]+$/,
- message: 'ID只能由数字、字母、下划线、中划线组成',
+ message: '标识只能由数字、字母、下划线、中划线组成',
},
]">
diff --git a/src/views/device/components/Metadata/Base/columns.tsx b/src/views/device/components/Metadata/Base/columns.tsx
index 007a0372..3a519e68 100644
--- a/src/views/device/components/Metadata/Base/columns.tsx
+++ b/src/views/device/components/Metadata/Base/columns.tsx
@@ -38,6 +38,9 @@ const type = {
};
export const validatorConfig = (value: any, isObject: boolean = false) => {
+
+ console.log(value)
+
if (!value) {
return Promise.resolve()
}
@@ -53,7 +56,7 @@ export const validatorConfig = (value: any, isObject: boolean = false) => {
return Promise.reject('请添加参数')
}
- if (value.type === 'file' && !value.fileType) {
+ if (value.type === 'file' && (!value.fileType || !Object.keys(value.fileType).length)) {
return Promise.reject('请选择文件类型')
}
@@ -168,7 +171,7 @@ export const useColumns = (type?: MetadataType, target?: 'device' | 'product', n
{ max: 64, message: '最多可输入64个字符' },
{
pattern: /^[a-zA-Z0-9_\-]+$/,
- message: 'ID只能由数字、字母、下划线、中划线组成',
+ message: '标识只能由数字、字母、下划线、中划线组成',
},
]
},
@@ -419,32 +422,28 @@ export const useColumns = (type?: MetadataType, target?: 'device' | 'product', n
}
},
doubleClick(record){
- if (target !== 'device') {
+ if (record.expands.source === 'rule') {
return true
- } else {
- if (record.expands.source === 'rule') {
- return true
- }
- return !isExtendsProdcut(record._sortIndex, productNoEdit?.value, 'expands')
}
+ return !isExtendsProdcut(record._sortIndex, productNoEdit?.value, 'expands')
},
form: {
required: true,
- rules: target !== 'device' ? [
+ rules: [
{
callback: async (rule: any, value: any, dataSource: any[]) => {
const field = rule.field.split('.')
const fieldIndex = Number(field[1])
const values = dataSource.find((item, index) => index === fieldIndex)
- const virtualRule = values.elements?.virtualRule
+ const virtualRule = values.expands?.virtualRule
const source = value.source
const ids = (noEdit?.value?.id || []) as any[]
-
+ console.log(source, value)
if (source) {
- if (source !== 'rule' && !value.type?.length) {
+ if (source === 'device' && !value.type?.length) {
return Promise.reject('请选择读写类型');
- } else if(!ids.includes(values.id) && virtualRule){
+ } else if( source === 'rule' && !virtualRule){
return Promise.reject('请配置规则');
}
@@ -454,7 +453,7 @@ export const useColumns = (type?: MetadataType, target?: 'device' | 'product', n
return Promise.reject('请选择属性来源');
}
},
- ]: []
+ ]
},
control(newValue, oldValue) {
if (newValue && !oldValue) {
@@ -542,12 +541,12 @@ export const useColumns = (type?: MetadataType, target?: 'device' | 'product', n
},
form: {
required: true,
- rules: [{
+ rules: [
+ {
callback(rule:any,value: any, dataSource: any[]) {
const field = rule.field.split('.')
const fieldIndex = Number(field[1])
const values = dataSource.find((item, index) => index === fieldIndex)
-
if (!values?.expands?.type?.length) {
return Promise.reject('请选择读写类型')
}
diff --git a/src/views/device/components/Metadata/Base/components/ConfigModal.vue b/src/views/device/components/Metadata/Base/components/ConfigModal.vue
index d76c8858..e9b8a29b 100644
--- a/src/views/device/components/Metadata/Base/components/ConfigModal.vue
+++ b/src/views/device/components/Metadata/Base/components/ConfigModal.vue
@@ -150,6 +150,7 @@ const columns = [
dataIndex: 'id',
type: 'text',
width: 100,
+ placement: 'Left',
form: {
required: true,
rules: [
@@ -170,7 +171,7 @@ const columns = [
{ max: 64, message: '最多可输入64个字符' },
{
pattern: /^[a-zA-Z0-9_\-]+$/,
- message: 'ID只能由数字、字母、下划线、中划线组成',
+ message: '标识只能由数字、字母、下划线、中划线组成',
},
]
}
diff --git a/src/views/device/components/Metadata/Base/components/Constraint.vue b/src/views/device/components/Metadata/Base/components/Constraint.vue
index e73f125b..adda8f29 100644
--- a/src/views/device/components/Metadata/Base/components/Constraint.vue
+++ b/src/views/device/components/Metadata/Base/components/Constraint.vue
@@ -1,13 +1,15 @@
-
-
+
diff --git a/src/views/device/components/Metadata/Base/components/DataType.vue b/src/views/device/components/Metadata/Base/components/DataType.vue
index 05475080..f58e3ee2 100644
--- a/src/views/device/components/Metadata/Base/components/DataType.vue
+++ b/src/views/device/components/Metadata/Base/components/DataType.vue
@@ -86,6 +86,7 @@ const columns = [{
dataIndex: 'id',
type: 'text',
width: 100,
+ placement: 'Left',
form: {
required: true,
rules: [{
@@ -105,7 +106,7 @@ const columns = [{
{ max: 64, message: '最多可输入64个字符' },
{
pattern: /^[a-zA-Z0-9_\-]+$/,
- message: 'ID只能由数字、字母、下划线、中划线组成',
+ message: '标识只能由数字、字母、下划线、中划线组成',
},
]
}
@@ -191,6 +192,7 @@ watch(
() => {
type.value = props.value?.valueType?.type;
_valueType.value = props.value?.valueType
+ console.log(props.value)
// elements.value = props.value?.valueType.elements;
// if (['float', 'double', 'int', 'long'].includes(type.value)) {
// const res = getUnit().then((res) => {
diff --git a/src/views/device/components/Metadata/Base/components/Events/ConfigParams.vue b/src/views/device/components/Metadata/Base/components/Events/ConfigParams.vue
index 3969d598..01f92aba 100644
--- a/src/views/device/components/Metadata/Base/components/Events/ConfigParams.vue
+++ b/src/views/device/components/Metadata/Base/components/Events/ConfigParams.vue
@@ -27,6 +27,7 @@ const columns = [
title: '参数标识',
dataIndex: 'id',
type: 'text',
+ placement: 'Left',
form: {
required: true,
rules: [{
@@ -46,7 +47,7 @@ const columns = [
{ max: 64, message: '最多可输入64个字符' },
{
pattern: /^[a-zA-Z0-9_\-]+$/,
- message: 'ID只能由数字、字母、下划线、中划线组成',
+ message: '标识只能由数字、字母、下划线、中划线组成',
},
]
}
diff --git a/src/views/device/components/Metadata/Base/components/Function/InputParams.vue b/src/views/device/components/Metadata/Base/components/Function/InputParams.vue
index 4f19b52f..5412d93a 100644
--- a/src/views/device/components/Metadata/Base/components/Function/InputParams.vue
+++ b/src/views/device/components/Metadata/Base/components/Function/InputParams.vue
@@ -4,7 +4,7 @@
{{ TypeStringMap[data.record.valueType?.type] }}
- {{ data.record.expands?.required ? "是": '否' }}
+ {{ data.record.expands?.required ? "必填": '不必填' }}
@@ -64,6 +64,7 @@ const columns = ref([
title: '参数标识',
dataIndex: 'id',
type: 'text',
+ placement: 'Left',
form: {
required: true,
rules: [
@@ -84,7 +85,7 @@ const columns = ref([
{ max: 64, message: '最多可输入64个字符' },
{
pattern: /^[a-zA-Z0-9_\-]+$/,
- message: 'ID只能由数字、字母、下划线、中划线组成',
+ message: '标识只能由数字、字母、下划线、中划线组成',
},
]
}
diff --git a/src/views/device/components/Metadata/Base/components/Function/OutputParams.vue b/src/views/device/components/Metadata/Base/components/Function/OutputParams.vue
index dd5793ff..6042fb23 100644
--- a/src/views/device/components/Metadata/Base/components/Function/OutputParams.vue
+++ b/src/views/device/components/Metadata/Base/components/Function/OutputParams.vue
@@ -1,7 +1,7 @@