|
|
|
|
@ -1,18 +1,18 @@
|
|
|
|
|
<template>
|
|
|
|
|
<ContentWrap>
|
|
|
|
|
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
|
|
|
|
|
<el-form-item label="名称" prop="name">
|
|
|
|
|
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" min-label-width="80px">
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.searchNameLabel')" prop="name">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery"
|
|
|
|
|
v-model="queryParams.name" :placeholder="t('ReportDashboard.DashboardList.searchNamePlaceholder')" clearable @keyup.enter="handleQuery"
|
|
|
|
|
class="!w-240px" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="备注" prop="remark">
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.searchRemarkLabel')" prop="remark">
|
|
|
|
|
<el-input
|
|
|
|
|
v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter="handleQuery"
|
|
|
|
|
v-model="queryParams.remark" :placeholder="t('ReportDashboard.DashboardList.searchRemarkPlaceholder')" clearable @keyup.enter="handleQuery"
|
|
|
|
|
class="!w-240px" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="启用状态" prop="state">
|
|
|
|
|
<el-select v-model="queryParams.state" placeholder="请选择启用状态" clearable class="!w-240px">
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.searchStateLabel')" prop="state">
|
|
|
|
|
<el-select v-model="queryParams.state" :placeholder="t('ReportDashboard.DashboardList.searchStatePlaceholder')" clearable class="!w-240px">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value" :label="dict.label"
|
|
|
|
|
:value="dict.value" />
|
|
|
|
|
@ -20,13 +20,13 @@ v-for="dict in getStrDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value" :la
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item>
|
|
|
|
|
<el-button type="primary" @click="openCreateDialog">
|
|
|
|
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
|
|
|
|
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button @click="handleQuery">
|
|
|
|
|
<Icon icon="ep:search" class="mr-5px" /> 搜索
|
|
|
|
|
<Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}
|
|
|
|
|
</el-button>
|
|
|
|
|
<el-button @click="resetQuery">
|
|
|
|
|
<Icon icon="ep:refresh" class="mr-5px" /> 重置
|
|
|
|
|
<Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}
|
|
|
|
|
</el-button>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
@ -34,18 +34,18 @@ v-for="dict in getStrDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value" :la
|
|
|
|
|
|
|
|
|
|
<ContentWrap>
|
|
|
|
|
<div class="dashboard-card-list">
|
|
|
|
|
<el-empty v-if="!loading && list.length === 0" description="暂无数据" />
|
|
|
|
|
<el-empty v-if="!loading && list.length === 0" :description="t('common.noData')" />
|
|
|
|
|
<el-row v-else :gutter="16">
|
|
|
|
|
<el-col v-for="item in list" :key="item.id" :xl="6" :lg="8" :md="12" :sm="24" :xs="24" class="mb-16px">
|
|
|
|
|
<el-card shadow="hover" class="dashboard-card" :body-style="{ padding: '0' }">
|
|
|
|
|
<div class="dashboard-card-image-wrapper" @click="handlePreview(item)">
|
|
|
|
|
<img class="dashboard-card-image" :src="getDashboardImage(item)" alt="封面图" />
|
|
|
|
|
<img class="dashboard-card-image" :src="getDashboardImage(item)" :alt="t('ReportDashboard.DashboardList.coverAlt')" />
|
|
|
|
|
<div class="dashboard-card-state">
|
|
|
|
|
<el-tag v-if="item.state === 1" type="success" size="small">
|
|
|
|
|
启用
|
|
|
|
|
{{ t('ReportDashboard.DashboardList.stateEnabled') }}
|
|
|
|
|
</el-tag>
|
|
|
|
|
<el-tag v-else type="info" size="small">
|
|
|
|
|
禁用
|
|
|
|
|
{{ t('ReportDashboard.DashboardList.stateDisabled') }}
|
|
|
|
|
</el-tag>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
@ -55,7 +55,7 @@ v-for="dict in getStrDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value" :la
|
|
|
|
|
{{ item.name || '-' }}
|
|
|
|
|
</div>
|
|
|
|
|
<div class="dashboard-card-remark" :title="item.remark">
|
|
|
|
|
{{ item.remark || '暂无描述' }}
|
|
|
|
|
{{ item.remark || t('ReportDashboard.DashboardList.noRemark') }}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="dashboard-card-actions">
|
|
|
|
|
@ -65,8 +65,8 @@ v-for="dict in getStrDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value" :la
|
|
|
|
|
</el-button>
|
|
|
|
|
<template #dropdown>
|
|
|
|
|
<el-dropdown-menu class="dashboard-card-menu">
|
|
|
|
|
<el-dropdown-item class="dashboard-card-menu-primary" @click="openEditDialog(item)">编辑</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item divided class="dashboard-card-menu-danger" @click="handleDelete(item)">删除</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item class="dashboard-card-menu-primary" @click="openEditDialog(item)">{{ t('action.edit') }}</el-dropdown-item>
|
|
|
|
|
<el-dropdown-item divided class="dashboard-card-menu-danger" @click="handleDelete(item)">{{ t('action.delete') }}</el-dropdown-item>
|
|
|
|
|
</el-dropdown-menu>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dropdown>
|
|
|
|
|
@ -82,35 +82,35 @@ v-if="total > 0" :total="total" v-model:page="queryParams.pageNo" v-model:limit=
|
|
|
|
|
</ContentWrap>
|
|
|
|
|
|
|
|
|
|
<el-dialog
|
|
|
|
|
v-model="createDialogVisible" :title="dialogMode === 'create' ? '新增数据大屏' : '编辑数据大屏'" width="600px"
|
|
|
|
|
v-model="createDialogVisible" :title="dialogMode === 'create' ? t('ReportDashboard.DashboardList.dialogCreateTitle') : t('ReportDashboard.DashboardList.dialogEditTitle')" width="600px"
|
|
|
|
|
draggable @closed="handleCreateDialogClosed">
|
|
|
|
|
<el-form :model="createForm" ref="createFormRef" label-width="80px" :rules="createFormRules">
|
|
|
|
|
<el-form-item label="名称" prop="name">
|
|
|
|
|
<el-input v-model="createForm.name" placeholder="请输入名称" />
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.dialogNameLabel')" prop="name">
|
|
|
|
|
<el-input v-model="createForm.name" :placeholder="t('ReportDashboard.DashboardList.dialogNamePlaceholder')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="大屏类型" prop="type">
|
|
|
|
|
<el-select v-model="createForm.type" placeholder="请选择大屏类型" class="!w-240px">
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.dialogTypeLabel')" prop="type">
|
|
|
|
|
<el-select v-model="createForm.type" :placeholder="t('ReportDashboard.DashboardList.dialogTypePlaceholder')" class="!w-240px">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in getStrDictOptions('mes_goview_type')" :key="dict.value" :label="dict.label"
|
|
|
|
|
:value="dict.value" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="产线" prop="orgId">
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.dialogOrgLabel')" prop="orgId">
|
|
|
|
|
<el-tree-select
|
|
|
|
|
v-model="createForm.orgName" :data="organizationTree" :props="lineTreeProps" filterable clearable
|
|
|
|
|
class="!w-240px" placeholder="请选择产线" @change="handleOrgChange" />
|
|
|
|
|
class="!w-240px" :placeholder="t('ReportDashboard.DashboardList.dialogOrgPlaceholder')" @change="handleOrgChange" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="设备" v-if="createForm.type === '1'">
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.dialogDeviceLabel')" v-if="createForm.type === '1'">
|
|
|
|
|
<div class="dashboard-device-group-list">
|
|
|
|
|
<div v-for="(group, index) in deviceAttrSelections" :key="index" class="dashboard-device-group">
|
|
|
|
|
<el-select
|
|
|
|
|
v-model="group.deviceId" placeholder="请选择设备" clearable filterable class="!w-160px mr-8px"
|
|
|
|
|
v-model="group.deviceId" :placeholder="t('ReportDashboard.DashboardList.dialogDevicePlaceholder')" clearable filterable class="!w-160px mr-8px"
|
|
|
|
|
@change="(val) => handleDeviceChange(val, index)">
|
|
|
|
|
<el-option v-for="item in deviceList" :key="item.id" :label="item.deviceName" :value="item.id" />
|
|
|
|
|
</el-select>
|
|
|
|
|
<el-select
|
|
|
|
|
v-model="group.attributeIds" multiple collapse-tags collapse-tags-tooltip
|
|
|
|
|
:disabled="!group.deviceId" placeholder="请选择点位" clearable filterable class="!w-260px">
|
|
|
|
|
:disabled="!group.deviceId" :placeholder="t('ReportDashboard.DashboardList.dialogPointPlaceholder')" clearable filterable class="!w-260px">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="attr in (deviceAttributeOptionsMap[String(group.deviceId)] || [])" :key="attr.id"
|
|
|
|
|
:label="attr.attributeName" :value="attr.id" />
|
|
|
|
|
@ -124,24 +124,24 @@ v-if="deviceAttrSelections.length > 1" type="danger" text class="dashboard-devic
|
|
|
|
|
<el-button
|
|
|
|
|
type="primary" text @click="addDeviceAttrGroup" :disabled="deviceAttrSelections.length >= 8"
|
|
|
|
|
class="mt-8px">
|
|
|
|
|
<Icon icon="ep:plus" class="mr-5px" /> 添加设备
|
|
|
|
|
<Icon icon="ep:plus" class="mr-5px" /> {{ t('ReportDashboard.DashboardList.dialogAddDeviceButton') }}
|
|
|
|
|
</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="内容">
|
|
|
|
|
<el-input v-model="createForm.content" type="textarea" :rows="4" placeholder="请输入内容" />
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.dialogContentLabel')">
|
|
|
|
|
<el-input v-model="createForm.content" type="textarea" :rows="4" :placeholder="t('ReportDashboard.DashboardList.dialogContentPlaceholder')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="备注">
|
|
|
|
|
<el-input v-model="createForm.remark" placeholder="请输入备注" />
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.dialogRemarkLabel')">
|
|
|
|
|
<el-input v-model="createForm.remark" :placeholder="t('ReportDashboard.DashboardList.dialogRemarkPlaceholder')" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="启用状态">
|
|
|
|
|
<el-form-item :label="t('ReportDashboard.DashboardList.dialogStateLabel')">
|
|
|
|
|
<el-switch v-model="createForm.state" :active-value="1" :inactive-value="0" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<el-button @click="createDialogVisible = false">取 消</el-button>
|
|
|
|
|
<el-button @click="createDialogVisible = false">{{ t('common.cancel') }}</el-button>
|
|
|
|
|
<el-button type="primary" :loading="createLoading" @click="submitDialog">
|
|
|
|
|
确 定
|
|
|
|
|
{{ t('common.ok') }}
|
|
|
|
|
</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-dialog>
|
|
|
|
|
@ -161,6 +161,7 @@ defineOptions({ name: 'DashboardList' })
|
|
|
|
|
|
|
|
|
|
const router = useRouter()
|
|
|
|
|
const message = useMessage()
|
|
|
|
|
const { t } = useI18n()
|
|
|
|
|
|
|
|
|
|
interface DashboardItem {
|
|
|
|
|
id: number
|
|
|
|
|
@ -182,12 +183,8 @@ const list = ref<DashboardItem[]>([])
|
|
|
|
|
const total = ref(0)
|
|
|
|
|
|
|
|
|
|
const getDashboardImage = (item: DashboardItem) => {
|
|
|
|
|
if (item.name === '智能制造产线任务总览') {
|
|
|
|
|
return dashboardImage1
|
|
|
|
|
}
|
|
|
|
|
if (item.name === '产线运行看板') {
|
|
|
|
|
return dashboardImage2
|
|
|
|
|
}
|
|
|
|
|
if (item.type === '2') return dashboardImage1
|
|
|
|
|
if (item.type === '1') return dashboardImage2
|
|
|
|
|
return item.indexImage || defaultImage
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -220,9 +217,9 @@ const createForm = reactive({
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const createFormRules = reactive({
|
|
|
|
|
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
|
|
|
|
|
type: [{ required: true, message: '大屏类型不能为空', trigger: 'change' }],
|
|
|
|
|
orgId: [{ required: true, message: '产线不能为空', trigger: 'change' }]
|
|
|
|
|
name: [{ required: true, message: t('ReportDashboard.DashboardList.validatorNameRequired'), trigger: 'blur' }],
|
|
|
|
|
type: [{ required: true, message: t('ReportDashboard.DashboardList.validatorTypeRequired'), trigger: 'change' }],
|
|
|
|
|
orgId: [{ required: true, message: t('ReportDashboard.DashboardList.validatorOrgRequired'), trigger: 'change' }]
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const organizationTree = ref<any[]>([])
|
|
|
|
|
@ -266,7 +263,7 @@ const handlePreview = (item: DashboardItem) => {
|
|
|
|
|
const typeRoute = getRouteByType(item.type)
|
|
|
|
|
const route = typeRoute || item.route || ''
|
|
|
|
|
if (!route) {
|
|
|
|
|
message.error('未配置预览路由')
|
|
|
|
|
message.error(t('ReportDashboard.DashboardList.messageRouteMissing'))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
const path = route.startsWith('/') ? route : `/${route}`
|
|
|
|
|
@ -392,7 +389,7 @@ const submitDialog = async () => {
|
|
|
|
|
}))
|
|
|
|
|
.filter((g) => g.deviceId && g.attributesIds.length)
|
|
|
|
|
if (!groups.length) {
|
|
|
|
|
message.error('请至少配置一组设备和点位')
|
|
|
|
|
message.error(t('ReportDashboard.DashboardList.messageDevicePointRequired'))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
createForm.deviceIdsList = groups.map((g) => ({
|
|
|
|
|
@ -416,7 +413,7 @@ const submitDialog = async () => {
|
|
|
|
|
createForm.route = route
|
|
|
|
|
}
|
|
|
|
|
if (dialogMode.value === 'edit' && !editingId.value) {
|
|
|
|
|
message.error('缺少数据编号,无法编辑')
|
|
|
|
|
message.error(t('ReportDashboard.DashboardList.messageMissingId'))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
createLoading.value = true
|
|
|
|
|
@ -426,7 +423,7 @@ const submitDialog = async () => {
|
|
|
|
|
url: '/mes/goview/create',
|
|
|
|
|
data: createForm
|
|
|
|
|
})
|
|
|
|
|
message.success('新增成功')
|
|
|
|
|
message.success(t('common.createSuccess'))
|
|
|
|
|
} else {
|
|
|
|
|
await request.put({
|
|
|
|
|
url: '/mes/goview/update',
|
|
|
|
|
@ -435,7 +432,7 @@ const submitDialog = async () => {
|
|
|
|
|
...createForm
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
message.success('编辑成功')
|
|
|
|
|
message.success(t('common.updateSuccess'))
|
|
|
|
|
}
|
|
|
|
|
createDialogVisible.value = false
|
|
|
|
|
handleQuery()
|
|
|
|
|
@ -451,7 +448,7 @@ const handleDelete = async (item: DashboardItem) => {
|
|
|
|
|
await request.delete({
|
|
|
|
|
url: `/mes/goview/delete?id=${item.id}`
|
|
|
|
|
})
|
|
|
|
|
message.success('删除成功')
|
|
|
|
|
message.success(t('common.delSuccess'))
|
|
|
|
|
await getList()
|
|
|
|
|
} catch { }
|
|
|
|
|
}
|
|
|
|
|
|