diff --git a/src/api/iot/device/index.ts b/src/api/iot/device/index.ts
index 98d0565f..fe1610e7 100644
--- a/src/api/iot/device/index.ts
+++ b/src/api/iot/device/index.ts
@@ -97,6 +97,10 @@ export const DeviceApi = {
return await request.post({ url: `/iot/device/create`, data })
},
+ // 批量获取设备属性列表
+ getDeviceAttributeBatchList: async (params: { deviceIds: string }) => {
+ return await request.get({ url: `/iot/device/device-attribute/batchList`, params })
+ },
// 修改物联设备
updateDevice: async (data: DeviceVO) => {
return await request.put({ url: `/iot/device/update`, data })
diff --git a/src/api/iot/deviceWarningRecord/index.ts b/src/api/iot/deviceWarningRecord/index.ts
index 60aeff3b..b15cd8a3 100644
--- a/src/api/iot/deviceWarningRecord/index.ts
+++ b/src/api/iot/deviceWarningRecord/index.ts
@@ -22,7 +22,7 @@ export interface DeviceWarningRecordVO {
// 实时报警记录 API
export const DeviceWarningRecordApi = {
// 获得实时报警记录列表
- getList: async () => {
- return await request.get({ url: `/iot/device-warinning-record/getList` })
+ getList: async (params?: any) => {
+ return await request.get({ url: `/iot/device-warinning-record/getList`, params })
}
}
diff --git a/src/api/mes/plan/index.ts b/src/api/mes/plan/index.ts
index d1fadfd5..5c166df7 100644
--- a/src/api/mes/plan/index.ts
+++ b/src/api/mes/plan/index.ts
@@ -96,18 +96,22 @@ export const PlanApi = {
getPlanByTicketType: async (status: number) => {
return await request.get({ url: `/mes/plan/getByTicketType?status=` + status })
},
- // 产线任务看板
- getProductPlans: async () => {
- return await request.get({ url: `/mes/plan/getProductPlans` })
+ // 产线任务看板
+ getProductPlans: async (params?: any) => {
+ return await request.get({ url: `/mes/plan/getProductPlans`, params })
},
// 周生产趋势
- getWeekTrend: async () => {
- return await request.get({ url: `/mes/plan/getWeekTrend` })
- },
- getPlanCapacity: async (type: number) => {
- return await request.get({ url: `/mes/plan/getPlanCapacity?type=` + type })
- },
- getLastDaysRate: async () => {
- return await request.get({ url: `/mes/plan/getLastDaysRate` })
+ getWeekTrend: async (params?: any) => {
+ return await request.get({ url: `/mes/plan/getWeekTrend`, params })
+ },
+ getPlanCapacity: async (type: number, orgId?: any) => {
+ let url = `/mes/plan/getPlanCapacity?type=` + type
+ if (orgId) {
+ url += `&orgId=` + orgId
+ }
+ return await request.get({ url })
+ },
+ getLastDaysRate: async (params?: any) => {
+ return await request.get({ url: `/mes/plan/getLastDaysRate`, params })
}
}
diff --git a/src/views/report/dashboardList/index.vue b/src/views/report/dashboardList/index.vue
index c23a02ce..623b90fa 100644
--- a/src/views/report/dashboardList/index.vue
+++ b/src/views/report/dashboardList/index.vue
@@ -76,7 +76,12 @@
alt="封面图"
/>
-
+
+ 启用
+
+
+ 禁用
+
@@ -123,29 +128,53 @@
v-model="createDialogVisible"
:title="dialogMode === 'create' ? '新增数据大屏' : '编辑数据大屏'"
width="600px"
+ draggable
>
-
-
+
+
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
取 消
@@ -169,20 +208,27 @@
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import request from '@/config/axios'
import defaultImage from '@/assets/imgs/logo.png'
+import { OrganizationApi } from '@/api/mes/organization'
+import { handleTree } from '@/utils/tree'
+import { DeviceApi } from '@/api/iot/device'
defineOptions({ name: 'DashboardList' })
-const { push } = useRouter()
+const router = useRouter()
const message = useMessage()
interface DashboardItem {
id: number
name: string
remark: string
- state: string
+ state: number
indexImage?: string
route?: string
content?: string
+ type?: string
+ orgId?: number | string
+ orgName?: string
+ deviceIds?: string
}
const loading = ref(false)
@@ -207,12 +253,32 @@ const editingId = ref(null)
const createForm = reactive({
name: '',
remark: '',
- state: '',
+ state: 1,
+ type: '',
+ orgId: undefined as number | string | undefined,
+ orgName: '',
+ deviceIds: '',
indexImage: '',
route: '',
content: ''
})
+const createFormRules = reactive({
+ name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
+ type: [{ required: true, message: '大屏类型不能为空', trigger: 'change' }],
+ orgId: [{ required: true, message: '产线不能为空', trigger: 'change' }]
+})
+
+const organizationTree = ref([])
+const lineTreeProps = {
+ label: 'name',
+ children: 'children',
+ value: 'id'
+}
+
+const deviceList = ref([])
+const selectedDeviceIds = ref([])
+
const getList = async () => {
loading.value = true
try {
@@ -238,21 +304,33 @@ const resetQuery = () => {
}
const handlePreview = (item: DashboardItem) => {
- if (!item.route) {
+ const typeRoute = getRouteByType(item.type)
+ const route = typeRoute || item.route || ''
+ if (!route) {
message.error('未配置预览路由')
return
}
- const path = item.route.startsWith('/') ? item.route : `/${item.route}`
- push(path)
+ const path = route.startsWith('/') ? route : `/${route}`
+ const queryParams = new URLSearchParams()
+ if (item.orgId) queryParams.append('orgId', String(item.orgId))
+ if (item.type === '1' && item.deviceIds) queryParams.append('deviceIds', item.deviceIds)
+ const queryString = queryParams.toString()
+ const url = router.resolve(path + (queryString ? `?${queryString}` : '')).href
+ window.open(url, '_blank')
}
const resetCreateForm = () => {
createForm.name = ''
createForm.remark = ''
- createForm.state = ''
+ createForm.state = 1
+ createForm.type = ''
+ createForm.orgId = undefined
+ createForm.orgName = ''
+ createForm.deviceIds = ''
createForm.indexImage = ''
createForm.route = ''
createForm.content = ''
+ selectedDeviceIds.value = []
}
const openCreateDialog = () => {
@@ -267,18 +345,55 @@ const openEditDialog = (item: DashboardItem) => {
editingId.value = item.id
createForm.name = item.name || ''
createForm.remark = item.remark || ''
- createForm.state = item.state || ''
+ createForm.state = item.state
+ createForm.type = item.type || ''
+ createForm.orgId = item.orgId || undefined
+ createForm.orgName = item.orgName || ''
+ createForm.deviceIds = item.deviceIds || ''
createForm.indexImage = item.indexImage || ''
createForm.route = item.route || ''
createForm.content = item.content || ''
+ selectedDeviceIds.value = createForm.deviceIds
+ ? createForm.deviceIds.split(',').filter((v) => v)
+ : []
createDialogVisible.value = true
}
+const getRouteByType = (type?: string) => {
+ if (type === '1') return 'iot/report/dashboardPage/Dashboard1'
+ if (type === '2') return 'iot/report/dashboardPage/Dashboard8'
+ return ''
+}
+
const submitDialog = async () => {
- if (!createForm.name) {
- message.error('名称不能为空')
+ try {
+ await createFormRef.value?.validate()
+ } catch {
return
}
+ if (createForm.type === '1') {
+ if (!selectedDeviceIds.value.length) {
+ message.error('设备不能为空')
+ return
+ }
+ if (selectedDeviceIds.value.length !== 8) {
+ message.error('设备必须选择8个')
+ return
+ }
+ createForm.deviceIds = selectedDeviceIds.value.join(',')
+ } else {
+ createForm.deviceIds = ''
+ }
+ if (createForm.orgId) {
+ const org = findOrgNode(organizationTree.value || [], createForm.orgId)
+ createForm.orgName = org?.name || ''
+ } else {
+ createForm.orgName = ''
+ }
+ const route = getRouteByType(createForm.type)
+ if (route) {
+ createForm.route = route
+ }
if (dialogMode.value === 'edit' && !editingId.value) {
message.error('缺少数据编号,无法编辑')
return
@@ -320,8 +435,38 @@ const handleDelete = async (item: DashboardItem) => {
} catch {}
}
+const loadOrganizationTree = async () => {
+ const data = await OrganizationApi.getOrganizationList()
+ organizationTree.value = handleTree(data, 'id', 'parentId')
+}
+
+const findOrgNode = (nodes: any[], id: any): any | undefined => {
+ for (const node of nodes) {
+ if (String(node.id) === String(id)) return node
+ const children = Array.isArray(node.children) ? node.children : []
+ const found = findOrgNode(children, id)
+ if (found) return found
+ }
+ return undefined
+}
+
+const handleOrgChange = () => {
+ if (!createForm.orgId) {
+ createForm.orgName = ''
+ return
+ }
+ const org = findOrgNode(organizationTree.value || [], createForm.orgId)
+ createForm.orgName = org?.name || ''
+}
+
+const loadDeviceList = async () => {
+ deviceList.value = await DeviceApi.getDeviceList()
+}
+
onMounted(() => {
getList()
+ loadOrganizationTree()
+ loadDeviceList()
})
diff --git a/src/views/report/dashboardPage/dashboard1/components/DeviceOverview.vue b/src/views/report/dashboardPage/dashboard1/components/DeviceOverview.vue
index f2fd3737..6c7bbb8e 100644
--- a/src/views/report/dashboardPage/dashboard1/components/DeviceOverview.vue
+++ b/src/views/report/dashboardPage/dashboard1/components/DeviceOverview.vue
@@ -19,6 +19,7 @@