|
|
<template>
|
|
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
|
|
<el-form
|
|
|
ref="formRef"
|
|
|
:model="formData"
|
|
|
:rules="formRules"
|
|
|
label-width="120px"
|
|
|
v-loading="formLoading"
|
|
|
>
|
|
|
<el-form-item prop="code">
|
|
|
<template #label>
|
|
|
<span>
|
|
|
{{ t('FactoryModeling.FactoryStructure.dialogCodeLabel') }}
|
|
|
<el-tooltip :content="t('FactoryModeling.FactoryStructure.dialogCodeTooltip')" placement="top">
|
|
|
<Icon icon="ep:question-filled" />
|
|
|
</el-tooltip>
|
|
|
</span>
|
|
|
</template>
|
|
|
<el-row :gutter="10" style="width: 100%;">
|
|
|
<el-col :xs="24" :sm="18" :md="16" :lg="14" :xl="12">
|
|
|
<el-input
|
|
|
:disabled="formData.isCode == true || formType === 'update'"
|
|
|
v-model="formData.code"
|
|
|
:placeholder="t('FactoryModeling.FactoryStructure.dialogCodePlaceholder')"
|
|
|
/>
|
|
|
</el-col>
|
|
|
<el-col :xs="24" :sm="6" :md="4" :lg="3" :xl="2">
|
|
|
<div>
|
|
|
<el-switch
|
|
|
v-model="formData.isCode"
|
|
|
:disabled="formType === 'update'"
|
|
|
/>
|
|
|
</div>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogParentLabel')" prop="parentId">
|
|
|
<el-tree-select
|
|
|
v-model="formData.parentId"
|
|
|
:data="organizationTree"
|
|
|
:props="defaultProps"
|
|
|
check-strictly
|
|
|
default-expand-all
|
|
|
:placeholder="t('FactoryModeling.FactoryStructure.dialogParentPlaceholder')"
|
|
|
/>
|
|
|
</el-form-item>
|
|
|
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogNameLabel')" prop="name">
|
|
|
<el-input v-model="formData.name" :placeholder="t('FactoryModeling.FactoryStructure.dialogNamePlaceholder')" />
|
|
|
</el-form-item>
|
|
|
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogOrgClassLabel')" prop="orgClass">
|
|
|
<el-radio-group v-model="formData.orgClass">
|
|
|
<el-radio
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_CLASS)"
|
|
|
:key="dict.value"
|
|
|
:label="dict.value"
|
|
|
>
|
|
|
{{ dict.label }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
<el-form-item prop="sort">
|
|
|
<template #label>
|
|
|
<span>
|
|
|
{{ t('FactoryModeling.FactoryStructure.dialogSortLabel') }}
|
|
|
<el-tooltip :content="t('FactoryModeling.FactoryStructure.dialogSortTooltip')" placement="top">
|
|
|
<Icon icon="ep:question-filled" />
|
|
|
</el-tooltip>
|
|
|
</span>
|
|
|
</template>
|
|
|
<el-input v-model="formData.sort" :placeholder="t('FactoryModeling.FactoryStructure.dialogSortPlaceholder')" />
|
|
|
</el-form-item>
|
|
|
<el-form-item v-if="formData.orgClass == 'workplace' || formData.orgClass == 'process'" prop="orgType">
|
|
|
<template #label>
|
|
|
<span>
|
|
|
{{ t('FactoryModeling.FactoryStructure.dialogOrgTypeLabel') }}
|
|
|
<el-tooltip :content="t('FactoryModeling.FactoryStructure.dialogOrgTypeTooltip')" placement="top">
|
|
|
<Icon icon="ep:question-filled" />
|
|
|
</el-tooltip>
|
|
|
</span>
|
|
|
</template>
|
|
|
<el-select v-model="formData.orgType" :placeholder="t('FactoryModeling.FactoryStructure.dialogOrgTypePlaceholder')">
|
|
|
<el-option
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
|
|
|
:key="dict.value"
|
|
|
:label="dict.label"
|
|
|
:value="dict.value"
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogMachineLabel')" v-if="formData.orgClass == 'workplace'" prop="machineId">
|
|
|
<!-- <el-select v-model="formData.machineId" :placeholder="t('FactoryModeling.FactoryStructure.dialogMachinePlaceholder')" clearable>
|
|
|
<el-option
|
|
|
v-for="item in deviceList"
|
|
|
:key="item.id"
|
|
|
:label="item.deviceName"
|
|
|
:value="item.id"
|
|
|
/>
|
|
|
</el-select>-->
|
|
|
<el-input :model-value="displayItemDevice" readonly clearable class="device-ledger-selection-input"
|
|
|
:placeholder="t('FactoryModeling.FactoryStructure.dialogMachinePlaceholder')"
|
|
|
@click="openCriticalComponentDialog" />
|
|
|
</el-form-item>
|
|
|
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.dvName')" prop="dvId" v-if="formData.orgClass == 'workplace'">
|
|
|
<!-- <el-select v-model="formData.dvId" filterable :placeholder="t('EquipmentManagement.EquipmentLedger.dvId')" clearable>
|
|
|
<el-option
|
|
|
v-for="item in dvList"
|
|
|
:key="item.id"
|
|
|
:label="item.deviceName"
|
|
|
:value="item.id"
|
|
|
:disabled="item.selected === true"
|
|
|
/>
|
|
|
</el-select>-->
|
|
|
<el-input :model-value="dvIdItemDevice" readonly clearable class="device-ledger-selection-input"
|
|
|
:placeholder="t('EquipmentManagement.EquipmentLedger.dvId')"
|
|
|
@click="openCaijiComponentDialog" />
|
|
|
</el-form-item>
|
|
|
<!-- <el-form-item label="组织状态" prop="status">
|
|
|
<el-radio-group v-model="formData.status">
|
|
|
<el-radio
|
|
|
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_STATUS)"
|
|
|
:key="dict.value"
|
|
|
:label="dict.value"
|
|
|
>
|
|
|
{{ dict.label }}
|
|
|
</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item> -->
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('FactoryModeling.FactoryStructure.dialogSubmitButton') }}</el-button>
|
|
|
<el-button @click="dialogVisible = false">{{ t('FactoryModeling.FactoryStructure.dialogCancelButton') }}</el-button>
|
|
|
</template>
|
|
|
</Dialog>
|
|
|
<TableSelectDialog
|
|
|
ref="deviceSelectDialogRef"
|
|
|
title="选择设备"
|
|
|
:columns="deviceColumns"
|
|
|
:fetch-api="fetchDeviceLedgerPage"
|
|
|
row-key="id"
|
|
|
@confirm="handleDeviceSelectConfirm"
|
|
|
:query-params="mergedQueryParams"
|
|
|
:selection-type="'single'"
|
|
|
>
|
|
|
<!-- 使用 header 插槽插入查询表单 -->
|
|
|
<template #header>
|
|
|
<el-form ref="searchFormRef" :model="searchParams" :inline="true" >
|
|
|
<el-form-item label="设备编号" prop="deviceCode">
|
|
|
<el-input v-model="searchParams.deviceCode" placeholder="请输入编号" clearable />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="设备名称" prop="deviceName">
|
|
|
<el-input v-model="searchParams.deviceName" placeholder="请输入名称" clearable />
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="handleSearch">{{ t('FactoryModeling.ProductInformation.searchButtonText') }}</el-button>
|
|
|
<el-button @click="resetSearch">{{ t('FactoryModeling.ProductInformation.resetButtonText') }}</el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
</template>
|
|
|
</TableSelectDialog>
|
|
|
|
|
|
<TableSelectDialog
|
|
|
ref="caiJiSelectDialogRef"
|
|
|
title="选择采集设备"
|
|
|
:columns="caiJiColumns"
|
|
|
:fetch-api="fetchCaiJILedgerPage"
|
|
|
row-key="id"
|
|
|
@confirm="handleCaiJISelectConfirm"
|
|
|
:query-params="mergedQueryParams"
|
|
|
:selection-type="'single'"
|
|
|
>
|
|
|
<!-- 使用 header 插槽插入查询表单 -->
|
|
|
<template #header>
|
|
|
<el-form ref="searchFormRef" :model="searchParams" :inline="true" >
|
|
|
<el-form-item label="设备编号" prop="deviceCode">
|
|
|
<el-input v-model="searchParams.deviceCode" placeholder="请输入编号" clearable />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="设备名称" prop="deviceName">
|
|
|
<el-input v-model="searchParams.deviceName" placeholder="请输入名称" clearable />
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="handleCJSearch">{{ t('FactoryModeling.ProductInformation.searchButtonText') }}</el-button>
|
|
|
<el-button @click="resetCJSearch">{{ t('FactoryModeling.ProductInformation.resetButtonText') }}</el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
</template>
|
|
|
</TableSelectDialog>
|
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
|
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
|
|
|
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
|
|
|
import { defaultProps, handleTree } from '@/utils/tree'
|
|
|
import {MachineComponentApi} from "@/api/mes/machine";
|
|
|
import {DeviceLedgerApi, DeviceLedgerVO} from "@/api/mes/deviceledger";
|
|
|
import { DeviceApi,DeviceVO } from '@/api/iot/device'
|
|
|
import TableSelectDialog from '@/components/TableSelectDialog/TableSelectDialog.vue'
|
|
|
/** 产线工位 表单 */
|
|
|
defineOptions({ name: 'OrganizationForm' })
|
|
|
const loading = ref(true)
|
|
|
const { t } = useI18n() // 国际化
|
|
|
const message = useMessage() // 消息弹窗
|
|
|
const deviceSelectDialogRef = ref(false)
|
|
|
const caiJiSelectDialogRef = ref(false)
|
|
|
const dvList = ref<DeviceVO[]>([]) // 列表
|
|
|
const deviceList = ref<DeviceLedgerVO[]>([]) // 列表
|
|
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
|
|
const dialogTitle = ref('') // 弹窗的标题
|
|
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|
|
const formData = ref({
|
|
|
id: undefined,
|
|
|
code: undefined,
|
|
|
name: undefined,
|
|
|
parentId: undefined,
|
|
|
sort: undefined,
|
|
|
workerUserId: undefined,
|
|
|
machineId: undefined,
|
|
|
machineName: undefined,
|
|
|
phone: undefined,
|
|
|
email: undefined,
|
|
|
isEnable: undefined,
|
|
|
status: undefined,
|
|
|
orgClass: undefined,
|
|
|
orgType: undefined,
|
|
|
isCode: undefined,
|
|
|
dvId: undefined,
|
|
|
dvName: undefined
|
|
|
})
|
|
|
const formRules = reactive({
|
|
|
name: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorNameRequired'), trigger: 'blur' }],
|
|
|
parentId: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorParentRequired'), trigger: 'blur' }],
|
|
|
orgClass: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorOrgClassRequired'), trigger: 'blur' }]
|
|
|
})
|
|
|
const itemList = ref<DeviceLedgerVO[]>([])
|
|
|
const CJList = ref<DeviceVO[]>([]) // 列表
|
|
|
const mergedQueryParams = computed(() => ({ ...searchParams }))
|
|
|
const formRef = ref() // 表单 Ref
|
|
|
const organizationTree = ref() // 树形结构
|
|
|
const deviceColumns = [
|
|
|
{ label: '设备编号', prop: 'deviceCode', minWidth: 140 },
|
|
|
{ label: '设备名称', prop: 'deviceName', minWidth: 160 },
|
|
|
{ label: '设备型号', prop: 'deviceModel', minWidth: 140 },
|
|
|
{ label: '所属车间', prop: 'workshop', minWidth: 140 }
|
|
|
]
|
|
|
const caiJiColumns = [
|
|
|
{ label: '设备编号', prop: 'deviceCode', minWidth: 140 },
|
|
|
{ label: '设备名称', prop: 'deviceName', minWidth: 160 },
|
|
|
]
|
|
|
|
|
|
// 1. 自定义表单的查询参数
|
|
|
const searchParams = reactive({
|
|
|
deviceCode: undefined,
|
|
|
deviceName: undefined,
|
|
|
})
|
|
|
|
|
|
const handleSearch = () => {
|
|
|
// 触发弹窗内部重新加载数据
|
|
|
deviceSelectDialogRef.value?.reload?.()
|
|
|
}
|
|
|
const searchFormRef = ref()
|
|
|
const resetSearch = () => {
|
|
|
searchFormRef.value?.resetFields()
|
|
|
handleSearch()
|
|
|
}
|
|
|
|
|
|
const handleCJSearch = () => {
|
|
|
// 触发弹窗内部重新加载数据
|
|
|
caiJiSelectDialogRef.value?.reload?.()
|
|
|
}
|
|
|
const searchCJFormRef = ref()
|
|
|
const resetCJSearch = () => {
|
|
|
searchFormRef.value?.resetFields()
|
|
|
handleCJSearch()
|
|
|
}
|
|
|
/** 打开弹窗 */
|
|
|
const open = async (type: string, id?: number) => {
|
|
|
dialogVisible.value = true
|
|
|
dialogTitle.value = t('action.' + type)
|
|
|
formType.value = type
|
|
|
resetForm()
|
|
|
initSelectedItems()
|
|
|
// 修改时,设置数据
|
|
|
if (id) {
|
|
|
formLoading.value = true
|
|
|
try {
|
|
|
formData.value = await OrganizationApi.getOrganization(id)
|
|
|
} finally {
|
|
|
formLoading.value = false
|
|
|
}
|
|
|
}else{
|
|
|
ids.value=[]
|
|
|
CJIds.value=[]
|
|
|
}
|
|
|
await getOrganizationTree()
|
|
|
if (type == 'create' || typeof formData.value.machineId != 'number') {
|
|
|
deviceList.value = await DeviceLedgerApi.getDeviceLedgerListByNoUsed()
|
|
|
} else {
|
|
|
deviceList.value = await DeviceLedgerApi.getDeviceLedgerList2ByNoUsed(formData.value.machineId)
|
|
|
const exists = deviceList.value.some((item) => item.id === formData.value.machineId)
|
|
|
if (!exists && formData.value.machineName) {
|
|
|
deviceList.value.unshift({ id: formData.value.machineId, deviceName: formData.value.machineName } as DeviceLedgerVO)
|
|
|
}
|
|
|
}
|
|
|
//await getMachineComponentTree()
|
|
|
dvList.value = await DeviceApi.getAvailableList()
|
|
|
if (type !== 'create' && typeof formData.value.dvId === 'number') {
|
|
|
const exists = dvList.value.some((item) => item.id === formData.value.dvId)
|
|
|
if (!exists && formData.value.dvName) {
|
|
|
dvList.value.unshift({ id: formData.value.dvId, deviceName: formData.value.dvName, selected: true } as DeviceVO)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
|
|
|
|
|
/** 提交表单 */
|
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
|
const submitForm = async () => {
|
|
|
// 校验表单
|
|
|
await formRef.value.validate()
|
|
|
// 提交请求
|
|
|
formLoading.value = true
|
|
|
try {
|
|
|
const data = formData.value as unknown as OrganizationVO
|
|
|
if (formType.value === 'create') {
|
|
|
await OrganizationApi.createOrganization(data)
|
|
|
message.success(t('common.createSuccess'))
|
|
|
} else {
|
|
|
await OrganizationApi.updateOrganization(data)
|
|
|
message.success(t('common.updateSuccess'))
|
|
|
}
|
|
|
dialogVisible.value = false
|
|
|
// 发送操作成功的事件
|
|
|
emit('success')
|
|
|
} finally {
|
|
|
formLoading.value = false
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/** 重置表单 */
|
|
|
const resetForm = () => {
|
|
|
formData.value = {
|
|
|
id: undefined,
|
|
|
code: undefined,
|
|
|
name: undefined,
|
|
|
parentId: undefined,
|
|
|
sort: 0,
|
|
|
workerUserId: undefined,
|
|
|
machineId: undefined,
|
|
|
machineName: undefined,
|
|
|
phone: undefined,
|
|
|
email: undefined,
|
|
|
isEnable: undefined,
|
|
|
status: undefined,
|
|
|
orgClass: undefined,
|
|
|
orgType: undefined,
|
|
|
isCode: true,
|
|
|
dvId: undefined,
|
|
|
dvName: undefined
|
|
|
}
|
|
|
formRef.value?.resetFields()
|
|
|
}
|
|
|
|
|
|
/** 获得产线工位树 */
|
|
|
const getOrganizationTree = async () => {
|
|
|
organizationTree.value = []
|
|
|
const data = await OrganizationApi.getOrganizationList()
|
|
|
const root: Tree = { id: 0, name: t('FactoryModeling.FactoryStructure.orgTreeRootName'), children: [] }
|
|
|
root.children = handleTree(data, 'id', 'parentId')
|
|
|
organizationTree.value.push(root)
|
|
|
}
|
|
|
|
|
|
const machineComponentTree = ref() // 树形结构
|
|
|
/** 获得机台树 */
|
|
|
const getMachineComponentTree = async () => {
|
|
|
machineComponentTree.value = []
|
|
|
const data = await MachineComponentApi.getPipelineAndMachineList()
|
|
|
const root: Tree = { id: 0, name: 'ALL', children: [] }
|
|
|
root.children = handleTree(data, 'id', 'parentId')
|
|
|
machineComponentTree.value.push(root)
|
|
|
}
|
|
|
const ids = ref([])
|
|
|
const CJIds = ref([])
|
|
|
const displayItemDevice = computed( () => {
|
|
|
if (!ids.value.length)return ''
|
|
|
if (!itemList.value.length) {
|
|
|
return formData.value.machineId ? String(formData.value.machineId) : ''
|
|
|
}
|
|
|
const map = new Map(itemList.value.map((item) => [item.id, item.deviceName]))
|
|
|
const names = ids.value
|
|
|
.map((id) => map.get(id))
|
|
|
.filter((name) => name)
|
|
|
return names.join(',')
|
|
|
})
|
|
|
|
|
|
const dvIdItemDevice = computed( () => {
|
|
|
if (!CJIds.value.length)return ''
|
|
|
if (!CJList.value.length) {
|
|
|
return formData.value.dvId ? String(formData.value.dvId) : ''
|
|
|
}
|
|
|
const map = new Map(CJList.value.map((item) => [item.id, item.deviceName]))
|
|
|
const names = CJIds.value
|
|
|
.map((id) => map.get(id))
|
|
|
.filter((name) => name)
|
|
|
return names.join(',')
|
|
|
})
|
|
|
|
|
|
const fetchDeviceLedgerPage = (params: Record<string, any>) => {
|
|
|
return DeviceLedgerApi.getDeviceLedgerPage({
|
|
|
...params,
|
|
|
})
|
|
|
}
|
|
|
|
|
|
const fetchCaiJILedgerPage = (params: Record<string, any>) => {
|
|
|
return DeviceApi.getAvailableListPage({
|
|
|
...params,
|
|
|
})
|
|
|
}
|
|
|
const selectedDeviceRows = ref<any[]>([])
|
|
|
const selectedCaiJiRows = ref<any[]>([])
|
|
|
const handleDeviceSelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
|
|
|
formData.value.devices = payload.rows
|
|
|
.map((item) => {
|
|
|
const id = Number(item.id)
|
|
|
if (!Number.isFinite(id)) return undefined
|
|
|
return {
|
|
|
id,
|
|
|
name: item.deviceName || item.name || item.code || `设备ID:${id}`
|
|
|
}
|
|
|
})
|
|
|
.filter((item): item is { id: number; name: string } => Boolean(item))
|
|
|
selectedDeviceRows.value = payload.rows
|
|
|
formData.value.dvId = payload.ids.join(',')
|
|
|
ids.value = payload.ids.map((id) => Number(id))
|
|
|
}
|
|
|
const openCriticalComponentDialog = async () => {
|
|
|
searchParams.deviceCode=''
|
|
|
searchParams.deviceName=''
|
|
|
const rows = selectedDeviceRows.value.map((item) => ({ ...item, id: Number(item.id) }))
|
|
|
deviceSelectDialogRef.value?.open(rows)
|
|
|
let initIds= formData.value.machineId!=undefined?formData.value.machineId.toString().split(","):[]
|
|
|
ids.value=initIds.map((id) => Number(id))
|
|
|
}
|
|
|
const handleCaiJISelectConfirm = (payload: { ids: (number | string)[]; rows: any[] }) => {
|
|
|
formData.value.devices = payload.rows
|
|
|
.map((item) => {
|
|
|
const id = Number(item.id)
|
|
|
if (!Number.isFinite(id)) return undefined
|
|
|
return {
|
|
|
id,
|
|
|
name: item.deviceName || item.name || item.code || `设备ID:${id}`
|
|
|
}
|
|
|
})
|
|
|
.filter((item): item is { id: number; name: string } => Boolean(item))
|
|
|
selectedCaiJiRows.value = payload.rows
|
|
|
formData.value.dvId = payload.ids.join(',')
|
|
|
CJIds.value = payload.ids.map((id) => Number(id))
|
|
|
}
|
|
|
const openCaijiComponentDialog = async () => {
|
|
|
searchParams.deviceCode=''
|
|
|
searchParams.deviceName=''
|
|
|
const rows = selectedCaiJiRows.value.map((item) => ({ ...item, id: Number(item.id) }))
|
|
|
caiJiSelectDialogRef.value?.open(rows)
|
|
|
let initIds= formData.value.dvId!=undefined?formData.value.dvId.toString().split(","):[]
|
|
|
CJIds.value=initIds.map((id) => Number(id))
|
|
|
}
|
|
|
|
|
|
|
|
|
const initSelectedItems = async () => {
|
|
|
if (!itemList.value.length) {
|
|
|
loading.value = true
|
|
|
try {
|
|
|
itemList.value = await DeviceLedgerApi.getDeviceLedgerList()
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
}
|
|
|
}
|
|
|
if (!CJList.value.length) {
|
|
|
loading.value = true
|
|
|
try {
|
|
|
CJList.value = await DeviceApi.getAvailableList()
|
|
|
} finally {
|
|
|
loading.value = false
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
/** 初始化 **/
|
|
|
onMounted(async () => {
|
|
|
//console.log("ssss")
|
|
|
//deviceList.value = await DeviceLedgerApi.getDeviceLedgerListByNoUsed()
|
|
|
})
|
|
|
</script>
|