|
|
|
@ -303,6 +303,44 @@
|
|
|
|
@pagination="fetchInstallRecords" />
|
|
|
|
@pagination="fetchInstallRecords" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</el-tab-pane>
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabDrawings')" name="drawings">
|
|
|
|
|
|
|
|
<el-table :data="drawingRows" :stripe="true" :show-overflow-tooltip="true">
|
|
|
|
|
|
|
|
<el-table-column :label="t('MoldManagement.MoldBrandDetail.drawings')" prop="url" min-width="180">
|
|
|
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
|
|
|
<el-image
|
|
|
|
|
|
|
|
:src="scope.row.url"
|
|
|
|
|
|
|
|
:preview-src-list="drawingRows.map((item) => item.url)"
|
|
|
|
|
|
|
|
preview-teleported
|
|
|
|
|
|
|
|
fit="cover"
|
|
|
|
|
|
|
|
class="mold-brand-asset-image"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
</el-table>
|
|
|
|
|
|
|
|
<el-empty v-if="!drawingRows.length" :description="t('MoldManagement.MoldBrandDetail.noRecords')" />
|
|
|
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabOperationManual')" name="operationManual">
|
|
|
|
|
|
|
|
<el-table :data="operationManualRows" :stripe="true" :show-overflow-tooltip="true">
|
|
|
|
|
|
|
|
<el-table-column :label="t('MoldManagement.MoldBrandDetail.operationManual')" prop="url" min-width="220">
|
|
|
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
|
|
|
<el-link :href="scope.row.url" target="_blank" type="primary" :underline="false">
|
|
|
|
|
|
|
|
{{ scope.row.name }}
|
|
|
|
|
|
|
|
</el-link>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
</el-table>
|
|
|
|
|
|
|
|
<el-empty v-if="!operationManualRows.length" :description="t('MoldManagement.MoldBrandDetail.noRecords')" />
|
|
|
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
<el-tab-pane :label="t('MoldManagement.MoldBrandDetail.tabOperationVideo')" name="operationVideo">
|
|
|
|
|
|
|
|
<el-table :data="operationVideoRows" :stripe="true" :show-overflow-tooltip="true">
|
|
|
|
|
|
|
|
<el-table-column :label="t('MoldManagement.MoldBrandDetail.operationVideo')" prop="url" min-width="260">
|
|
|
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
|
|
|
<video :src="scope.row.url" controls class="mold-brand-asset-video"></video>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
</el-table-column>
|
|
|
|
|
|
|
|
</el-table>
|
|
|
|
|
|
|
|
<el-empty v-if="!operationVideoRows.length" :description="t('MoldManagement.MoldBrandDetail.noRecords')" />
|
|
|
|
|
|
|
|
</el-tab-pane>
|
|
|
|
</el-tabs>
|
|
|
|
</el-tabs>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
@ -362,6 +400,9 @@ const maintainLoading = ref(false)
|
|
|
|
const installLoading = ref(false)
|
|
|
|
const installLoading = ref(false)
|
|
|
|
|
|
|
|
|
|
|
|
const imageList = computed(() => parseImages(detailData.value?.images))
|
|
|
|
const imageList = computed(() => parseImages(detailData.value?.images))
|
|
|
|
|
|
|
|
const drawingRows = computed(() => parseAssetRows(detailData.value?.drawings))
|
|
|
|
|
|
|
|
const operationManualRows = computed(() => parseAssetRows(detailData.value?.operationManual))
|
|
|
|
|
|
|
|
const operationVideoRows = computed(() => parseAssetRows(detailData.value?.operationVideo))
|
|
|
|
const lifeRate = computed<number | null>(() => {
|
|
|
|
const lifeRate = computed<number | null>(() => {
|
|
|
|
const raw = detailData.value?.lifeRate ?? detailData.value?.lifeStatus ?? detailData.value?.useRate
|
|
|
|
const raw = detailData.value?.lifeRate ?? detailData.value?.lifeStatus ?? detailData.value?.useRate
|
|
|
|
if (raw === undefined || raw === null || raw === '') return null
|
|
|
|
if (raw === undefined || raw === null || raw === '') return null
|
|
|
|
@ -398,6 +439,42 @@ const parseImages = (value: any): string[] => {
|
|
|
|
.filter(Boolean)
|
|
|
|
.filter(Boolean)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const parseAssetUrls = (value: any): string[] => {
|
|
|
|
|
|
|
|
if (!value) return []
|
|
|
|
|
|
|
|
if (Array.isArray(value)) return value.flatMap((item) => parseAssetUrls(item))
|
|
|
|
|
|
|
|
if (typeof value === 'object' && value.fileUrl) return [String(value.fileUrl).trim()].filter(Boolean)
|
|
|
|
|
|
|
|
const text = String(value).trim()
|
|
|
|
|
|
|
|
if (!text) return []
|
|
|
|
|
|
|
|
if (text.startsWith('{') || text.startsWith('[')) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
return parseAssetUrls(JSON.parse(text))
|
|
|
|
|
|
|
|
} catch {}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return text
|
|
|
|
|
|
|
|
.replace(/[`'"]/g, '')
|
|
|
|
|
|
|
|
.split(',')
|
|
|
|
|
|
|
|
.map((item) => item.trim())
|
|
|
|
|
|
|
|
.filter(Boolean)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getAssetName = (url: string) => {
|
|
|
|
|
|
|
|
const cleanUrl = String(url || '').split('?')[0]
|
|
|
|
|
|
|
|
const idx = cleanUrl.lastIndexOf('/')
|
|
|
|
|
|
|
|
const name = idx !== -1 ? cleanUrl.substring(idx + 1) : cleanUrl
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
return decodeURIComponent(name)
|
|
|
|
|
|
|
|
} catch {
|
|
|
|
|
|
|
|
return name
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const parseAssetRows = (value: any) => {
|
|
|
|
|
|
|
|
return parseAssetUrls(value).map((url) => ({
|
|
|
|
|
|
|
|
url,
|
|
|
|
|
|
|
|
name: getAssetName(url)
|
|
|
|
|
|
|
|
}))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const getResultLabel = (value: any) => {
|
|
|
|
const getResultLabel = (value: any) => {
|
|
|
|
const v = value === '' || value === null || value === undefined ? undefined : String(value)
|
|
|
|
const v = value === '' || value === null || value === undefined ? undefined : String(value)
|
|
|
|
if (!v) return '-'
|
|
|
|
if (!v) return '-'
|
|
|
|
@ -974,6 +1051,21 @@ onMounted(() => {
|
|
|
|
background: var(--el-fill-color-light);
|
|
|
|
background: var(--el-fill-color-light);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.mold-brand-asset-image {
|
|
|
|
|
|
|
|
width: 96px;
|
|
|
|
|
|
|
|
height: 96px;
|
|
|
|
|
|
|
|
border: 1px solid var(--el-border-color-lighter);
|
|
|
|
|
|
|
|
border-radius: 6px;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.mold-brand-asset-video {
|
|
|
|
|
|
|
|
width: 280px;
|
|
|
|
|
|
|
|
max-width: 100%;
|
|
|
|
|
|
|
|
height: 160px;
|
|
|
|
|
|
|
|
border-radius: 6px;
|
|
|
|
|
|
|
|
background: #000;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@media (max-width: 1024px) {
|
|
|
|
@media (max-width: 1024px) {
|
|
|
|
.mold-brand-detail__hero {
|
|
|
|
.mold-brand-detail__hero {
|
|
|
|
grid-template-columns: 1fr;
|
|
|
|
grid-template-columns: 1fr;
|
|
|
|
|