|
|
|
@ -149,34 +149,28 @@
|
|
|
|
</el-col> -->
|
|
|
|
</el-col> -->
|
|
|
|
<el-col :span="24">
|
|
|
|
<el-col :span="24">
|
|
|
|
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.criticalComponent')" prop="componentIds">
|
|
|
|
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.criticalComponent')" prop="componentIds">
|
|
|
|
<el-cascader
|
|
|
|
<el-input
|
|
|
|
v-model="criticalComponentCascaderValue"
|
|
|
|
:model-value="criticalComponentDisplay"
|
|
|
|
:options="criticalComponentPagedOptions"
|
|
|
|
readonly
|
|
|
|
:props="cascaderProps"
|
|
|
|
|
|
|
|
filterable
|
|
|
|
|
|
|
|
clearable
|
|
|
|
clearable
|
|
|
|
collapse-tags
|
|
|
|
class="device-ledger-selection-input"
|
|
|
|
:show-all-levels="false"
|
|
|
|
|
|
|
|
:placeholder="t('EquipmentManagement.EquipmentLedger.placeholderComponentIds')"
|
|
|
|
:placeholder="t('EquipmentManagement.EquipmentLedger.placeholderComponentIds')"
|
|
|
|
class="!w-full"
|
|
|
|
@clear="clearCriticalComponent"
|
|
|
|
@change="handleCriticalComponentChange"
|
|
|
|
@click="openCriticalComponentDialog"
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
|
|
</el-col>
|
|
|
|
|
|
|
|
|
|
|
|
<el-col :span="24">
|
|
|
|
<el-col :span="24">
|
|
|
|
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.sparePart')" prop="beijianIds">
|
|
|
|
<el-form-item :label="t('EquipmentManagement.EquipmentLedger.sparePart')" prop="beijianIds">
|
|
|
|
<el-cascader
|
|
|
|
<el-input
|
|
|
|
v-model="beijianCascaderValue"
|
|
|
|
:model-value="beijianDisplay"
|
|
|
|
:options="beijianPagedOptions"
|
|
|
|
readonly
|
|
|
|
:props="cascaderProps"
|
|
|
|
|
|
|
|
filterable
|
|
|
|
|
|
|
|
clearable
|
|
|
|
clearable
|
|
|
|
collapse-tags
|
|
|
|
class="device-ledger-selection-input"
|
|
|
|
:show-all-levels="false"
|
|
|
|
|
|
|
|
:placeholder="t('EquipmentManagement.EquipmentLedger.placeholderBeijianIds')"
|
|
|
|
:placeholder="t('EquipmentManagement.EquipmentLedger.placeholderBeijianIds')"
|
|
|
|
class="!w-full"
|
|
|
|
@clear="clearBeijian"
|
|
|
|
@change="handleBeijianChange"
|
|
|
|
@click="openBeijianDialog"
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form-item>
|
|
|
|
</el-col>
|
|
|
|
</el-col>
|
|
|
|
@ -199,6 +193,48 @@
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</Dialog>
|
|
|
|
</Dialog>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<el-dialog
|
|
|
|
|
|
|
|
v-model="criticalComponentDialogVisible"
|
|
|
|
|
|
|
|
title="选择关键件"
|
|
|
|
|
|
|
|
width="860px"
|
|
|
|
|
|
|
|
class="device-ledger-transfer-dialog"
|
|
|
|
|
|
|
|
append-to-body
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<div class="device-ledger-transfer">
|
|
|
|
|
|
|
|
<el-transfer
|
|
|
|
|
|
|
|
v-model="criticalComponentDraft"
|
|
|
|
|
|
|
|
:data="criticalComponentTransferData"
|
|
|
|
|
|
|
|
filterable
|
|
|
|
|
|
|
|
:filter-placeholder="t('EquipmentManagement.EquipmentLedger.placeholderComponentIds')"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<template #footer>
|
|
|
|
|
|
|
|
<el-button @click="criticalComponentDialogVisible = false">{{ t('common.cancel') }}</el-button>
|
|
|
|
|
|
|
|
<el-button type="primary" @click="confirmCriticalComponentDialog">{{ t('common.ok') }}</el-button>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<el-dialog
|
|
|
|
|
|
|
|
v-model="beijianDialogVisible"
|
|
|
|
|
|
|
|
title="选择备件"
|
|
|
|
|
|
|
|
width="860px"
|
|
|
|
|
|
|
|
class="device-ledger-transfer-dialog"
|
|
|
|
|
|
|
|
append-to-body
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<div class="device-ledger-transfer">
|
|
|
|
|
|
|
|
<el-transfer
|
|
|
|
|
|
|
|
v-model="beijianDraft"
|
|
|
|
|
|
|
|
:data="beijianTransferData"
|
|
|
|
|
|
|
|
filterable
|
|
|
|
|
|
|
|
:filter-placeholder="t('EquipmentManagement.EquipmentLedger.placeholderBeijianIds')"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<template #footer>
|
|
|
|
|
|
|
|
<el-button @click="beijianDialogVisible = false">{{ t('common.cancel') }}</el-button>
|
|
|
|
|
|
|
|
<el-button type="primary" @click="confirmBeijianDialog">{{ t('common.ok') }}</el-button>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
|
|
<script setup lang="ts">
|
|
|
|
import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger'
|
|
|
|
import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger'
|
|
|
|
@ -287,31 +323,61 @@ const deviceTypeTree = ref<DeviceTypeTreeVO[]>([])
|
|
|
|
const users = ref<UserVO[]>([])
|
|
|
|
const users = ref<UserVO[]>([])
|
|
|
|
const criticalComponentOptions = ref<{ label: string; value: number }[]>([])
|
|
|
|
const criticalComponentOptions = ref<{ label: string; value: number }[]>([])
|
|
|
|
const beijianOptions = ref<{ label: string; value: number }[]>([])
|
|
|
|
const beijianOptions = ref<{ label: string; value: number }[]>([])
|
|
|
|
const PAGE_SIZE = 10
|
|
|
|
const criticalComponentTransferData = computed(() =>
|
|
|
|
|
|
|
|
criticalComponentOptions.value.map((item) => ({ key: item.value, label: item.label }))
|
|
|
|
const buildPagedOptions = (options: { label: string; value: number }[]) => {
|
|
|
|
)
|
|
|
|
const result: { label: string; value: string; children: { label: string; value: number }[] }[] = []
|
|
|
|
const beijianTransferData = computed(() =>
|
|
|
|
for (let i = 0; i < options.length; i += PAGE_SIZE) {
|
|
|
|
beijianOptions.value.map((item) => ({ key: item.value, label: item.label }))
|
|
|
|
const pageIndex = result.length + 1
|
|
|
|
)
|
|
|
|
result.push({
|
|
|
|
|
|
|
|
label: String(pageIndex),
|
|
|
|
const criticalComponentDialogVisible = ref(false)
|
|
|
|
value: `page-${pageIndex}`,
|
|
|
|
const beijianDialogVisible = ref(false)
|
|
|
|
children: options.slice(i, i + PAGE_SIZE).map((item) => ({
|
|
|
|
const criticalComponentDraft = ref<number[]>([])
|
|
|
|
label: item.label,
|
|
|
|
const beijianDraft = ref<number[]>([])
|
|
|
|
value: item.value
|
|
|
|
|
|
|
|
}))
|
|
|
|
const formatSelectedSummary = (ids: number[], options: { label: string; value: number }[]) => {
|
|
|
|
})
|
|
|
|
const optionMap = new Map<number, string>(options.map((item) => [item.value, item.label]))
|
|
|
|
}
|
|
|
|
const labels = ids.map((id) => optionMap.get(id)).filter((v): v is string => Boolean(v))
|
|
|
|
return result
|
|
|
|
if (!labels.length) return ''
|
|
|
|
|
|
|
|
if (labels.length <= 3) return labels.join('、')
|
|
|
|
|
|
|
|
return `${labels.slice(0, 3).join('、')}…等${labels.length}条`
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const cascaderProps = { multiple: true, emitPath: false, checkStrictly: false }
|
|
|
|
const criticalComponentDisplay = computed(() =>
|
|
|
|
|
|
|
|
formatSelectedSummary(formData.value.componentIds ?? [], criticalComponentOptions.value)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
const beijianDisplay = computed(() =>
|
|
|
|
|
|
|
|
formatSelectedSummary(formData.value.beijianIds ?? [], beijianOptions.value)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const clearCriticalComponent = () => {
|
|
|
|
|
|
|
|
formData.value.componentIds = []
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const clearBeijian = () => {
|
|
|
|
|
|
|
|
formData.value.beijianIds = []
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const criticalComponentCascaderValue = ref<(number | string)[]>([])
|
|
|
|
const openCriticalComponentDialog = () => {
|
|
|
|
const beijianCascaderValue = ref<(number | string)[]>([])
|
|
|
|
criticalComponentDraft.value = [...(formData.value.componentIds ?? [])]
|
|
|
|
|
|
|
|
criticalComponentDialogVisible.value = true
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const openBeijianDialog = () => {
|
|
|
|
|
|
|
|
beijianDraft.value = [...(formData.value.beijianIds ?? [])]
|
|
|
|
|
|
|
|
beijianDialogVisible.value = true
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const criticalComponentPagedOptions = computed(() => buildPagedOptions(criticalComponentOptions.value))
|
|
|
|
const confirmCriticalComponentDialog = () => {
|
|
|
|
const beijianPagedOptions = computed(() => buildPagedOptions(beijianOptions.value))
|
|
|
|
const validMap = new Set(criticalComponentOptions.value.map((item) => item.value))
|
|
|
|
|
|
|
|
const selected = Array.from(new Set(criticalComponentDraft.value.map((v) => Number(v)).filter((v) => validMap.has(v))))
|
|
|
|
|
|
|
|
formData.value.componentIds = selected
|
|
|
|
|
|
|
|
criticalComponentDialogVisible.value = false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const confirmBeijianDialog = () => {
|
|
|
|
|
|
|
|
const validMap = new Set(beijianOptions.value.map((item) => item.value))
|
|
|
|
|
|
|
|
const selected = Array.from(new Set(beijianDraft.value.map((v) => Number(v)).filter((v) => validMap.has(v))))
|
|
|
|
|
|
|
|
formData.value.beijianIds = selected
|
|
|
|
|
|
|
|
beijianDialogVisible.value = false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const ensureOptionsLoaded = async () => {
|
|
|
|
const ensureOptionsLoaded = async () => {
|
|
|
|
const [deviceTypeRes, userRes, criticalRes, beijianRes] = await Promise.all([
|
|
|
|
const [deviceTypeRes, userRes, criticalRes, beijianRes] = await Promise.all([
|
|
|
|
@ -336,48 +402,6 @@ const ensureOptionsLoaded = async () => {
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
watch(
|
|
|
|
|
|
|
|
() => formData.value.componentIds,
|
|
|
|
|
|
|
|
(ids) => {
|
|
|
|
|
|
|
|
criticalComponentCascaderValue.value = Array.isArray(ids) ? [...ids] : []
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{ immediate: true }
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
watch(
|
|
|
|
|
|
|
|
() => formData.value.beijianIds,
|
|
|
|
|
|
|
|
(ids) => {
|
|
|
|
|
|
|
|
beijianCascaderValue.value = Array.isArray(ids) ? [...ids] : []
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{ immediate: true }
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const handleCriticalComponentChange = (values: (number | string)[]) => {
|
|
|
|
|
|
|
|
const validIds = new Set<number>()
|
|
|
|
|
|
|
|
const validMap = new Set(criticalComponentOptions.value.map((item) => item.value))
|
|
|
|
|
|
|
|
for (const v of values) {
|
|
|
|
|
|
|
|
const num = Number(v)
|
|
|
|
|
|
|
|
if (!Number.isNaN(num) && validMap.has(num)) {
|
|
|
|
|
|
|
|
validIds.add(num)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
formData.value.componentIds = Array.from(validIds)
|
|
|
|
|
|
|
|
criticalComponentCascaderValue.value = Array.from(validIds)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const handleBeijianChange = (values: (number | string)[]) => {
|
|
|
|
|
|
|
|
const validIds = new Set<number>()
|
|
|
|
|
|
|
|
const validMap = new Set(beijianOptions.value.map((item) => item.value))
|
|
|
|
|
|
|
|
for (const v of values) {
|
|
|
|
|
|
|
|
const num = Number(v)
|
|
|
|
|
|
|
|
if (!Number.isNaN(num) && validMap.has(num)) {
|
|
|
|
|
|
|
|
validIds.add(num)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
formData.value.beijianIds = Array.from(validIds)
|
|
|
|
|
|
|
|
beijianCascaderValue.value = Array.from(validIds)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** 打开弹窗 */
|
|
|
|
/** 打开弹窗 */
|
|
|
|
const open = async (type: string, id?: number, defaultDeviceTypeId?: number) => {
|
|
|
|
const open = async (type: string, id?: number, defaultDeviceTypeId?: number) => {
|
|
|
|
dialogVisible.value = true
|
|
|
|
dialogVisible.value = true
|
|
|
|
@ -468,4 +492,47 @@ const resetForm = () => {
|
|
|
|
:deep(.ellipsis-text){
|
|
|
|
:deep(.ellipsis-text){
|
|
|
|
max-width: 300px;
|
|
|
|
max-width: 300px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer {
|
|
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
overflow-x: auto;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer :deep(.el-transfer) {
|
|
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
min-width: 760px;
|
|
|
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer :deep(.el-transfer-panel) {
|
|
|
|
|
|
|
|
flex: 1 0 340px;
|
|
|
|
|
|
|
|
width: 340px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer-dialog :deep(.el-dialog__body) {
|
|
|
|
|
|
|
|
padding-top: 8px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer-dialog .device-ledger-transfer :deep(.el-transfer-panel) {
|
|
|
|
|
|
|
|
height: 560px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer-dialog .device-ledger-transfer :deep(.el-transfer-panel__body) {
|
|
|
|
|
|
|
|
height: 520px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer-dialog .device-ledger-transfer :deep(.el-transfer-panel__list) {
|
|
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-transfer :deep(.el-transfer__buttons) {
|
|
|
|
|
|
|
|
flex: 0 0 72px;
|
|
|
|
|
|
|
|
padding: 0 12px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.device-ledger-selection-input :deep(.el-input__inner) {
|
|
|
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</style>
|
|
|
|
|