From c3286b666182197af3d20f59b57dcd15cf34db96 Mon Sep 17 00:00:00 2001 From: XieYongHong <18010623010@163.com> Date: Mon, 25 Sep 2023 14:05:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20bug#=E8=A7=86=E9=A2=91=E5=9B=9E=E6=94=BE?= =?UTF-8?q?=E5=8A=A0=E8=BD=BDbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 物联网卡首页图片加载失败 * fix: 边缘端映射bug * fix: bug#18502 * fix: bug#视频回放加载bug --- src/api/device/instance.ts | 2 +- .../device/Instance/Detail/EdgeMap/index.vue | 84 ++++++++++--------- .../Detail/Info/components/Config/index.vue | 20 ++++- .../components/EditTable/PatchMapping.vue | 9 +- src/views/device/Product/index.vue | 6 -- .../device/components/Metadata/Base/Base.vue | 5 +- .../components/Metadata/Base/columns.tsx | 3 +- .../Metadata/Base/components/Source.vue | 2 +- src/views/edge/Device/index.vue | 2 +- src/views/home/components/BootCardSmall.vue | 2 +- .../AccessConfig/components/Network/index.vue | 1 + src/views/media/Device/Playback/index.vue | 6 +- src/views/media/Device/Save/index.vue | 20 +++-- .../system/DataSource/Management/index.vue | 74 ++++++++-------- .../components/Save/components/NotifyWay.vue | 7 ++ .../system/User/components/EditUserDialog.vue | 10 +++ 16 files changed, 152 insertions(+), 101 deletions(-) diff --git a/src/api/device/instance.ts b/src/api/device/instance.ts index f45325d3..a9480b40 100644 --- a/src/api/device/instance.ts +++ b/src/api/device/instance.ts @@ -273,7 +273,7 @@ export const saveDeviceMapping = (deviceId: string, data: any) => server.post(`/ /** *批量删除云端映射设备 */ -export const deleteDeviceMapping = (deviceId: string, data:any) => server.post(`/edge/operations/${deviceId}/device-mapping-delete/invoke`, data) +export const deleteDeviceMapping = (deviceId: string, data:any) => server.post(`/edge/operations/${deviceId}/device-mapping-delete-by-deviceid/invoke`, data) /** * 获取产品列表 diff --git a/src/views/device/Instance/Detail/EdgeMap/index.vue b/src/views/device/Instance/Detail/EdgeMap/index.vue index 5c22dc13..1ab47757 100644 --- a/src/views/device/Instance/Detail/EdgeMap/index.vue +++ b/src/views/device/Instance/Detail/EdgeMap/index.vue @@ -210,6 +210,7 @@ import PatchMapping from './PatchMapping.vue'; import { onlyMessage } from '@/utils/comm'; import { cloneDeep } from 'lodash-es'; import { usePermissionStore } from '@/store/permission'; +import { dataTool } from 'echarts'; const columns = [ { title: '名称', @@ -250,6 +251,7 @@ const columns = [ const permissionStore = usePermissionStore(); +const data:any = ref([]) const isPermission = permissionStore.hasPermission('device/Instance:update'); const current = ref(1); @@ -260,10 +262,11 @@ const metadata = JSON.parse(instanceStore.current?.metadata || '{}'); const loading = ref(false); const channelList = ref([]); -const _properties = computed(() => { - const _cur = current.value >= 1 ? current.value : 1; - return metadata.properties?.slice((_cur - 1) * 10, _cur * 10) || []; -}); +// const _properties = computed(() => { +// const _cur = current.value >= 1 ? current.value : 1; +// const _pageSize = pageSize.value +// return metadata.properties?.slice((_cur - 1) * _pageSize, _cur * _pageSize) || []; +// }); const modelRef = reactive<{ dataSource: any[]; @@ -287,14 +290,21 @@ const getChannel = async () => { } }; -const handleSearch = async (_array: any[]) => { +const handleSearch = async () => { loading.value = true; - const _metadata: any[] = _array.map((item: any) => ({ - metadataId: item.id, - metadataName: `${item.name}(${item.id})`, - metadataType: 'property', - name: item.name, - })); + const _metadataMap = new Map () + const _metadata: any[] = metadata.properties.map((item: any) => { + const value = { + metadataId: item.id, + metadataName: `${item.name}(${item.id})`, + metadataType: 'property', + name: item.name, + } + _metadataMap.set(item.id,value) + return value + }); + + if (_metadata && _metadata.length) { const resp: any = await getEdgeMap( instanceStore.current?.parentId || '', @@ -307,32 +317,25 @@ const handleSearch = async (_array: any[]) => { loading.value = false; }); if (resp.status === 200) { - const array = _metadata.map((item: any) => { - const metadataId = resp.result?.[0].find((x: any) => x.metadataId === item.metadataId); - Object.assign(item, metadataId); - return item - }) - resp.result?.[0].forEach((item:any)=>{ - const differ = array.every((i:any)=>{ - return item.metadataId !== i.metadataId - }) - if(!differ){ - array.push(item) - } - }) - // const array = resp.result?.[0].reduce((x: any, y: any) => { - // const metadataId = _metadata.find( - // (item: any) => item.metadataId === y.metadataId, - // ); - // if (metadataId) { - // Object.assign(metadataId, y); - // } else { - // x.push(y); + // const array = _metadata.map((item: any) => { + // const metadataId = resp.result?.[0].find((x: any) => x.metadataId === item.metadataId); + // Object.assign(item, metadataId); + // return item + // }) + // resp.result?.[0].forEach((item:any)=>{ + // const differ = array.every((i:any)=>{ + // return item.metadataId !== i.metadataId + // }) + // if(differ){ + // array.push(item) // } - // return x; - // }, _metadata); - console.log(array) - modelRef.dataSource = array; + // }) + + resp.result?.[0].forEach((item:any)=>{ + _metadataMap.has(item.metadataId) ? _metadataMap.set(item.metadataId,Object.assign(_metadataMap.get(item.metadataId),item)) : _metadataMap.set(item.metadataId,item) + }) + data.value = [..._metadataMap.values()] + onPageChange() } } loading.value = false; @@ -350,7 +353,7 @@ const unbind = async (id: string) => { ); if (resp.status === 200) { onlyMessage('操作成功!', 'success'); - handleSearch(_properties.value); + handleSearch(); } } }; @@ -371,11 +374,14 @@ const onChannelChange = (_index: number, type: 'collector' | 'channel') => { onMounted(() => { getChannel(); - handleSearch(_properties.value); + handleSearch(); }); const onPageChange = () => { - handleSearch(_properties.value); + const _cur = current.value >= 1 ? current.value : 1; + const _pageSize = pageSize.value + const array = data.value.slice((_cur - 1) * _pageSize, _cur * _pageSize) || []; + modelRef.dataSource = array; }; const onSave = () => { diff --git a/src/views/device/Instance/Detail/Info/components/Config/index.vue b/src/views/device/Instance/Detail/Info/components/Config/index.vue index 141f1087..7fd6e1d2 100644 --- a/src/views/device/Instance/Detail/Info/components/Config/index.vue +++ b/src/views/device/Instance/Detail/Info/components/Config/index.vue @@ -67,9 +67,27 @@ " >****** + + {{ + item.type.elements?.find((i)=> + i.value === instanceStore.current?.configuration?.[ + item.property + ] + )?.text || '' + }} + + {{ - instanceStore.current?.configuration?.[item.property] || + instanceStore.current?.configuration?.[item.property] || '' }} ([]); const dataSource = ref([]); const loading = ref(false); -const handleData = (data: any[], type: string) => { +const handleData = (data: any[], type: string,provider?:string) => { data.forEach((item) => { item.key = item.id; item.title = item.name; item.checkable = type === 'collectors'; + provider ? item.provider = provider : '' if ( item.collectors && Array.isArray(item.collectors) && item.collectors.length ) { - item.children = handleData(item.collectors, 'collectors'); + item.children = handleData(item.collectors, 'collectors',item.provider); } if (item.points && Array.isArray(item.points) && item.points.length) { item.children = handleData(item.points, 'points'); @@ -136,6 +137,7 @@ const _delete = (_key: string) => { }; const handleClick = async () => { + if (!rightList.value.length) { onlyMessage('请选择采集器', 'warning'); } else { @@ -148,10 +150,11 @@ const handleClick = async () => { metadataType: 'property', metadataId: (_props.metaData as any[]).find((i: any) => i.name === element.name) ?.metadataId, - provider: _props.type + provider: item.provider })); params.push(...array); }); + const filterParms = params.filter((item) => !!item.metadataId); if (filterParms && filterParms.length !== 0) { const res = await saveMapping(_props.deviceId, _props.type, filterParms); diff --git a/src/views/device/Product/index.vue b/src/views/device/Product/index.vue index 8fa72707..8e9a644d 100644 --- a/src/views/device/Product/index.vue +++ b/src/views/device/Product/index.vue @@ -399,11 +399,9 @@ const beforeUpload = (file: any) => { onlyMessage('文件内容不能为空','error') return false; } - try { const data = JSON.parse(text); // 设置导入的产品状态为未发布 data.state = 0; - if (Array.isArray(data)) { onlyMessage('请上传正确格式文件', 'error'); return false; @@ -418,10 +416,6 @@ const beforeUpload = (file: any) => { tableRef.value?.reload(); } return true; - } catch(e) { - onlyMessage('请上传正确格式文件', 'error'); - } - return true; }; return false; }; diff --git a/src/views/device/components/Metadata/Base/Base.vue b/src/views/device/components/Metadata/Base/Base.vue index f6d98594..00355f71 100644 --- a/src/views/device/components/Metadata/Base/Base.vue +++ b/src/views/device/components/Metadata/Base/Base.vue @@ -247,6 +247,7 @@ import type { ProductItem, } from '@/views/device/Product/typings'; import type { PropType } from 'vue'; +import { TOKEN_KEY } from '@/utils/variable' import {useRouter, onBeforeRouteUpdate} from 'vue-router' import { useMetadata, useOperateLimits } from './hooks'; import {TypeStringMap, useColumns} from './columns'; @@ -259,7 +260,7 @@ import { useProductStore } from '@/store/product'; import { asyncUpdateMetadata, updateMetadata } from '../metadata'; import { useMetadataStore } from '@/store/metadata'; import { DeviceInstance } from '@/views/device/Instance/typings'; -import { onlyMessage } from '@/utils/comm'; +import { onlyMessage , LocalStore} from '@/utils/comm'; import {omit} from "lodash-es"; import { PropertiesModal, FunctionModal, EventModal, TagsModal } from './DetailModal' import { Modal } from 'jetlinks-ui-components' @@ -510,7 +511,7 @@ const handleSaveClick = async (next?: Function) => { const tabsChange = inject('tabsChange') const parentTabsChange = (next?: Function) => { - if (editStatus.value && permissionStore.hasPermission(`${props.permission}:update`)) { + if (editStatus.value && permissionStore.hasPermission(`${props.permission}:update`) && LocalStore.get(TOKEN_KEY)) { const modal = Modal.confirm({ content: '页面改动数据未保存', okText: '保存', diff --git a/src/views/device/components/Metadata/Base/columns.tsx b/src/views/device/components/Metadata/Base/columns.tsx index 36412237..fd0227f3 100644 --- a/src/views/device/components/Metadata/Base/columns.tsx +++ b/src/views/device/components/Metadata/Base/columns.tsx @@ -85,8 +85,9 @@ export const handleTypeValue = (type:string, value: any = {}) => { obj.format = value break; case 'string': + obj.maxLength = JSON.stringify(value) === '{}' ? undefined : value case 'password': - obj.maxLength = value + obj.maxLength = JSON.stringify(value) === '{}' ? undefined : value break; default: obj = value diff --git a/src/views/device/components/Metadata/Base/components/Source.vue b/src/views/device/components/Metadata/Base/components/Source.vue index fc892971..020907ec 100644 --- a/src/views/device/components/Metadata/Base/components/Source.vue +++ b/src/views/device/components/Metadata/Base/components/Source.vue @@ -236,7 +236,7 @@ const confirm = async () => { // } // } const resetRules = async() =>{ - let res:any = await resetRule(instanceStore.current?.productId,instanceStore.current?.id,props.value?.id) + let res:any = await resetRule(instanceStore.current?.productId,instanceStore.current?.id,[props.value?.id]) if(res.status === 200){ onlyMessage('操作成功!') } diff --git a/src/views/edge/Device/index.vue b/src/views/edge/Device/index.vue index e6abbfaa..0acd4d41 100644 --- a/src/views/edge/Device/index.vue +++ b/src/views/edge/Device/index.vue @@ -101,7 +101,7 @@ :key="i" > - + diff --git a/src/views/link/AccessConfig/components/Network/index.vue b/src/views/link/AccessConfig/components/Network/index.vue index 13e934a1..b65c93cd 100644 --- a/src/views/link/AccessConfig/components/Network/index.vue +++ b/src/views/link/AccessConfig/components/Network/index.vue @@ -100,6 +100,7 @@ type="primary" @click="addProcotol" hasPermission="link/Protocol:add" + :disabled="id !== ':id'" > 新增 diff --git a/src/views/media/Device/Playback/index.vue b/src/views/media/Device/Playback/index.vue index cf6d0953..53ab3432 100644 --- a/src/views/media/Device/Playback/index.vue +++ b/src/views/media/Device/Playback/index.vue @@ -237,7 +237,9 @@ const queryLocalRecords = async (date: Dayjs) => { deviceId.value, channelId.value, params, - ); + ).finally(()=>{ + loading.value = false; + }) if (localResp.status === 200 && localResp.result.length) { const serviceResp = await playBackApi.recordsInServer( deviceId.value, @@ -247,10 +249,8 @@ const queryLocalRecords = async (date: Dayjs) => { includeFiles: false, }, ); - loading.value = false; let newList: recordsItemType[] = serviceResp.result; // console.log(newList) - if (serviceResp.status === 200 && serviceResp.result) { // 判断是否已下载云端视频 newList = localResp.result.map((item: recordsItemType) => { diff --git a/src/views/media/Device/Save/index.vue b/src/views/media/Device/Save/index.vue index 21d6a7f3..3ce0bd4e 100644 --- a/src/views/media/Device/Save/index.vue +++ b/src/views/media/Device/Save/index.vue @@ -426,20 +426,24 @@ const handleSubmit = () => { formRef.value ?.validate() .then(async () => { - const resq:any = await DeviceApi.validateId(id) - if(resq.status === 200 && resq?.result?.passed){ btnLoading.value = true; - const res = !route.query.id - ? await DeviceApi.save(params) - : await DeviceApi.update(params); + let res; + if(!route.query.id){ + const resp:any = await DeviceApi.validateId(id) + if(resp.status === 200 && resp?.result?.passed){ + res = await DeviceApi.save(params) + }else{ + notification.error({ key: 'error', message: '设备ID已重复'}) + } + }else{ + res = await DeviceApi.update(params); + } if (res?.success) { onlyMessage('保存成功'); history.back(); } - }else{ - notification.error({ key: 'error', message: '设备ID已重复'}) } - }) + ) .catch((err: any) => { console.log('err: ', err); }) diff --git a/src/views/system/DataSource/Management/index.vue b/src/views/system/DataSource/Management/index.vue index 999784d8..c3a1e21b 100644 --- a/src/views/system/DataSource/Management/index.vue +++ b/src/views/system/DataSource/Management/index.vue @@ -9,41 +9,43 @@ style="margin-bottom: 24px" /> - - + +
@@ -93,6 +95,7 @@ ]" > @@ -507,7 +510,10 @@ const checkName = (_: any, value: any) => box-sizing: border-box; width:300px; height:100%; - overflow-y: auto; + .tree{ + height: 680px; + overflow-y: auto; + } } .right { width: calc(100% - 280px); diff --git a/src/views/system/NoticeRule/components/Save/components/NotifyWay.vue b/src/views/system/NoticeRule/components/Save/components/NotifyWay.vue index 930f2e67..ff093d3b 100644 --- a/src/views/system/NoticeRule/components/Save/components/NotifyWay.vue +++ b/src/views/system/NoticeRule/components/Save/components/NotifyWay.vue @@ -73,6 +73,13 @@ onMounted(() => { emit('update:value', options.value?.[0]?.value); emit('update:name', options.value?.[0]?.label); emit('change', {label: options.value?.[0]?.label, value: options.value?.[0]?.value}); + }else{ + options.value.find((item:any)=>{ + if(item.value === props.value){ + emit('update:name',item.label) + return true + } + }) } } loading.value = false; diff --git a/src/views/system/User/components/EditUserDialog.vue b/src/views/system/User/components/EditUserDialog.vue index bad17f77..4a3bd3df 100644 --- a/src/views/system/User/components/EditUserDialog.vue +++ b/src/views/system/User/components/EditUserDialog.vue @@ -111,6 +111,7 @@ @@ -206,6 +207,15 @@ import { AxiosResponse } from 'axios'; import { passwordRegEx } from '@/utils/validate'; import { filterSelectNode, onlyMessage } from '@/utils/comm'; import { uniqBy } from 'lodash-es'; +import { useUserInfo } from '@/store/userInfo'; +import { storeToRefs } from 'pinia'; + +const userInfoStore = useUserInfo() +const { userInfos } = storeToRefs(userInfoStore) + +const admin = computed(() => { + return userInfos.value?.username === 'admin'; +}) const deptPermission = 'system/Department'; const rolePermission = 'system/Role';