style:模具详情-原弹窗现改成新开页面展示

main
黄伟杰 2 months ago
parent 4647ed6b9a
commit f4f448c48e

@ -579,6 +579,25 @@ const remainingRouter: AppRouteRecordRaw[] = [
}
]
},
{
path: '/erp',
component: Layout,
name: 'ErpCenter',
meta: { hidden: true },
children: [
{
path: 'mold/detail/:id',
name: 'ErpMoldDetail',
meta: {
title: '模具详情',
noCache: true,
hidden: true,
activeMenu: '/erp/mold'
},
component: () => import('@/views/erp/mold/detail/index.vue')
}
]
},
{
path: '/:pathMatch(.*)*',

@ -58,218 +58,6 @@ link type="primary" @click="openForm('update', scope.row.id)"
<!-- 表单弹窗添加/修改 -->
<MoldForm ref="formRef" @success="getList" />
<el-dialog v-model="detailVisible" title="模具详情" width="80%" :destroy-on-close="true" draggable>
<div v-loading="detailLoading" class="mold-detail-body">
<el-descriptions :column="3" class="mold-detail-desc">
<el-descriptions-item label="模具编码">{{ detailData?.code ?? '' }}</el-descriptions-item>
<el-descriptions-item label="模具名称">{{ detailData?.name ?? '' }}</el-descriptions-item>
<el-descriptions-item label="模具状态">
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="detailData?.status" />
</el-descriptions-item>
<el-descriptions-item label="模具型号">{{ detailData?.brandName ?? '' }}</el-descriptions-item>
<el-descriptions-item label="模具规格">{{ detailData?.moldType ?? '' }}</el-descriptions-item>
<el-descriptions-item label="工序">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="detailData?.orgType" />
</el-descriptions-item>
<el-descriptions-item label="模穴数">{{ detailData?.moldSize ?? '' }}</el-descriptions-item>
<el-descriptions-item label="使用次数/次">{{ detailData?.useTime ?? '' }}</el-descriptions-item>
<el-descriptions-item label="使用设备">{{ detailData?.machineName ?? detailData?.machineId ?? ''
}}</el-descriptions-item>
<el-descriptions-item label="入库日期">{{ formatDetailDate(detailData?.inTime) }}</el-descriptions-item>
<el-descriptions-item label="是否启用">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="detailData?.isEnable" />
</el-descriptions-item>
<el-descriptions-item label="备注">{{ detailData?.remark ?? '' }}</el-descriptions-item>
</el-descriptions>
<div class="mold-detail-tabs">
<el-tabs v-model="detailActiveTab" class="mt-12px">
<el-tab-pane label="点检履历" name="check">
<el-empty v-if="!inspectionStepGroups.length" />
<el-steps
v-else
direction="vertical"
:active="inspectionStepGroups.length"
class="device-ledger-history-steps"
>
<el-step v-for="group in inspectionStepGroups" :key="group.key">
<template #title>
<div class="device-ledger-history-title">
<span class="device-ledger-history-time">[{{ group.time }}]</span>
<span class="device-ledger-history-operator">操作人: {{ group.operator }}</span>
</div>
</template>
<template #description>
<div class="device-ledger-history-items">
<div
v-for="item in group.items"
:key="item.key"
class="device-ledger-history-item"
>
<div class="device-ledger-history-item-head">
<el-tag :type="getResultTagType(item.result)">{{ getResultLabel(item.result) }}</el-tag>
<span class="device-ledger-history-item-text">{{ item.name }}</span>
</div>
<div class="device-ledger-history-item-body">
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">点检方式</span>
<span class="device-ledger-history-item-value">
<dict-tag type="Inspection_method" :value="item.method" />
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">判定标准</span>
<span class="device-ledger-history-item-value">{{ item.criteria ?? '-' }}</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">点检时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.inspectionTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">创建时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.createTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">备注</span>
<span class="device-ledger-history-item-value">{{ item.remark ?? '-' }}</span>
</div>
<div
v-if="item.images?.length"
class="device-ledger-history-item-images"
>
<el-image
v-for="img in item.images"
:key="img"
:src="img"
:preview-src-list="item.images"
preview-teleported
fit="cover"
class="device-ledger-history-item-image"
>
<template #error>
<div class="device-ledger-history-image-error">图片加载失败</div>
</template>
</el-image>
</div>
</div>
</div>
</div>
</template>
</el-step>
</el-steps>
</el-tab-pane>
<el-tab-pane label="保养履历" name="maintain">
<el-empty v-if="!maintainStepGroups.length" />
<el-steps
v-else
direction="vertical"
class="device-ledger-history-steps"
:active="maintainStepGroups.length"
>
<el-step v-for="group in maintainStepGroups" :key="group.key">
<template #title>
<div class="device-ledger-history-title">
<span class="device-ledger-history-time">[{{ group.time }}]</span>
<span class="device-ledger-history-operator">操作人: {{ group.operator }}</span>
</div>
</template>
<template #description>
<div class="device-ledger-history-items">
<div
v-for="item in group.items"
:key="item.key"
class="device-ledger-history-item"
>
<div class="device-ledger-history-item-head">
<el-tag :type="getResultTagType(item.result)">{{ getResultLabel(item.result) }}</el-tag>
<span class="device-ledger-history-item-text">{{ item.name }}</span>
</div>
<div class="device-ledger-history-item-body">
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">保养方式</span>
<span class="device-ledger-history-item-value">
<dict-tag type="Inspection_method" :value="item.method" />
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">判定标准</span>
<span class="device-ledger-history-item-value">{{ item.criteria ?? '-' }}</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">保养时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.inspectionTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">创建时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.createTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">备注</span>
<span class="device-ledger-history-item-value">{{ item.remark ?? '-' }}</span>
</div>
<div
v-if="item.images?.length"
class="device-ledger-history-item-images"
>
<el-image
v-for="img in item.images"
:key="img"
:src="img"
:preview-src-list="item.images"
preview-teleported
fit="cover"
class="device-ledger-history-item-image"
>
<template #error>
<div class="device-ledger-history-image-error">图片加载失败</div>
</template>
</el-image>
</div>
</div>
</div>
</div>
</template>
</el-step>
</el-steps>
</el-tab-pane>
<el-tab-pane label="维修履历" name="repair">
<el-empty v-if="!repairHistoryView.length" />
<el-table
v-else :data="repairHistoryView" :stripe="true" :show-overflow-tooltip="true"
class="mold-history-table">
<el-table-column label="维修单ID" prop="repairId" width="120" />
<el-table-column label="项目编码" prop="subjectCode" width="120" />
<el-table-column label="项目名称" prop="subjectName" min-width="160" />
<el-table-column label="项目内容" prop="subjectContent" min-width="200" />
<el-table-column label="判定标准" prop="subjectStandard" min-width="200" />
<el-table-column label="故障描述" prop="malfunction" min-width="200" />
<el-table-column label="维修描述" prop="repairDes" min-width="200" />
<el-table-column label="备注" prop="remark" min-width="200" />
<el-table-column label="创建时间" prop="createTime" width="180">
<template #default="scope">
{{ formatHistoryTime(scope.row.createTime) }}
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="detailVisible = false"> </el-button>
</div>
</template>
</el-dialog>
<!-- 表单弹窗添加/修改 -->
<MoldRecordForm ref="recordFormRef" @success="getList" />
</template>
@ -354,291 +142,10 @@ const recordFormRef = ref()
const openRecordForm = (type: string, id?: number, brandId?: number) => {
recordFormRef.value.open(type, id, brandId)
}
const { push } = useRouter()
const detailVisible = ref(false)
const detailLoading = ref(false)
const detailData = ref<(MoldVO & Record<string, any>) | null>(null)
const detailActiveTab = ref('check')
const formatDetailDate = (value: any) => {
if (!value) return ''
return formatDate(new Date(value), 'YYYY-MM-DD')
}
const formatHistoryTime = (value: any) => {
const raw = value ?? '-'
if (Array.isArray(raw) && raw.length >= 3) {
const [y, m, d, hh, mm, ss] = raw
const pad = (n: any) => String(n).padStart(2, '0')
if (hh !== undefined) return `${y}-${pad(m)}-${pad(d)} ${pad(hh)}:${pad(mm)}:${pad(ss)}`
return `${y}-${pad(m)}-${pad(d)}`
}
return String(raw)
}
const getResultLabel = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '0') return '待检测'
if (v === '1') return 'OK'
if (v === '2') return 'NG'
return '-'
}
const getResultTagType = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '1') return 'success'
if (v === '2') return 'danger'
if (v === '0') return 'info'
return 'info'
}
const inspectionHistory = computed(() => {
const data: any = detailData.value
return data?.inspectionList ?? []
})
const maintainHistory = computed(() => {
const data: any = detailData.value
const list = data?.maintainList ?? []
return Array.isArray(list) ? list : []
})
type HistoryStepItem = {
key: string
name: string
result: any
method?: any
criteria?: any
images?: string[]
remark?: any
inspectionTime?: any
createTime?: any
}
type HistoryStepGroup = { key: string; time: string; operator: string; items: HistoryStepItem[] }
const parseImages = (value: any): string[] => {
if (!value) return []
if (Array.isArray(value)) return value.map(String).filter(Boolean)
const cleaned = String(value).replace(/[`'\"]/g, '').trim()
return cleaned
.split(',')
.map((v) => v.trim())
.filter(Boolean)
}
const buildStepGroups = (
rows: any[],
options: { timeField: string; nameFieldCandidates: string[]; resultFieldCandidates: string[] }
) => {
const groups = new Map<string, HistoryStepGroup>()
for (const row of rows ?? []) {
const time = formatHistoryTime(row?.[options.timeField] ?? row?.createTime)
const operator = String(row?.creatorName ?? row?.creator ?? '-')
const groupKey = `${row?.managementId ?? ''}__${time}__${operator}`
const name =
options.nameFieldCandidates
.map((k) => row?.[k])
.find((v) => v !== undefined && v !== null && String(v).trim() !== '') ?? '-'
const result =
options.resultFieldCandidates.map((k) => row?.[k]).find((v) => v !== undefined && v !== null) ?? undefined
const item: HistoryStepItem = {
key: String(row?.id ?? `${groupKey}__${String(name)}`),
name: String(name),
result,
method: row?.inspectionMethod,
criteria: row?.judgmentCriteria,
images: parseImages(row?.images),
remark: row?.remark,
inspectionTime: row?.inspectionTime,
createTime: row?.createTime
}
if (!groups.has(groupKey)) {
groups.set(groupKey, { key: groupKey, time, operator, items: [item] })
} else {
groups.get(groupKey)!.items.push(item)
}
}
return Array.from(groups.values()).sort((a, b) => String(b.time).localeCompare(String(a.time)))
}
const inspectionStepGroups = computed<HistoryStepGroup[]>(() => {
return buildStepGroups(inspectionHistory.value, {
timeField: 'inspectionTime',
nameFieldCandidates: ['inspectionItemName', 'name'],
resultFieldCandidates: ['inspectionResult']
})
})
const maintainStepGroups = computed<HistoryStepGroup[]>(() => {
return buildStepGroups(maintainHistory.value, {
timeField: 'inspectionTime',
nameFieldCandidates: ['maintainItemName', 'inspectionItemName', 'name'],
resultFieldCandidates: ['maintainResult', 'inspectionResult']
})
})
type RepairHistoryRow = {
repairId?: any
subjectCode?: any
subjectName?: any
subjectContent?: any
subjectStandard?: any
malfunction?: any
repairDes?: any
remark?: any
createTime?: any
}
const repairHistoryView = computed<RepairHistoryRow[]>(() => {
const data: any = detailData.value
const raw = data?.repairList
if (!raw) return []
if (Array.isArray(raw)) {
return raw as RepairHistoryRow[]
}
if (typeof raw === 'object') {
const result: RepairHistoryRow[] = []
Object.values(raw as Record<string, any>).forEach((rows: any) => {
if (Array.isArray(rows)) {
result.push(...(rows as RepairHistoryRow[]))
}
})
return result
}
return []
})
const openDetail = async (id: number) => {
detailVisible.value = true
detailActiveTab.value = 'check'
detailLoading.value = true
try {
detailData.value = await MoldBrandApi.getMold(id)
} finally {
detailLoading.value = false
}
const openDetail = (id: number) => {
push({ name: 'ErpMoldDetail', params: { id } })
}
</script>
<style scoped>
.mold-detail-desc {
margin-bottom: 16px;
}
.mold-history-table {
margin-top: 8px;
}
.mold-detail-body {
max-height: 70vh;
}
.mold-detail-tabs {
max-height: 50vh;
overflow-y: auto;
padding-right: 4px;
}
.device-ledger-history-steps {
padding: 8px 8px 0;
}
.device-ledger-history-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 13px;
}
.device-ledger-history-time {
font-weight: 600;
}
.device-ledger-history-operator {
color: var(--el-text-color-secondary);
}
.device-ledger-history-items {
display: flex;
flex-direction: column;
gap: 6px;
margin-top: 8px;
}
.device-ledger-history-item {
display: flex;
flex-direction: column;
gap: 8px;
padding: 10px;
border: 1px solid var(--el-border-color-lighter);
border-radius: 8px;
background: var(--el-fill-color-blank);
}
.device-ledger-history-item-head {
display: flex;
align-items: center;
gap: 10px;
}
.device-ledger-history-item-body {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
}
.device-ledger-history-item-row {
display: flex;
gap: 10px;
}
.device-ledger-history-item-label {
width: 70px;
flex: 0 0 70px;
color: var(--el-text-color-secondary);
}
.device-ledger-history-item-value {
flex: 1;
color: var(--el-text-color-regular);
word-break: break-word;
}
.device-ledger-history-item-images {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.device-ledger-history-item-image {
width: 76px;
height: 76px;
border-radius: 6px;
overflow: hidden;
}
.device-ledger-history-image-error {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
color: var(--el-text-color-secondary);
background: var(--el-fill-color);
}
.device-ledger-history-item-text {
color: var(--el-text-color-regular);
}
</style>

@ -0,0 +1,486 @@
<template>
<ContentWrap>
<div v-loading="detailLoading" class="mold-detail-body">
<el-descriptions :column="3" class="mold-detail-desc">
<el-descriptions-item label="模具编码">{{ detailData?.code ?? '' }}</el-descriptions-item>
<el-descriptions-item label="模具名称">{{ detailData?.name ?? '' }}</el-descriptions-item>
<el-descriptions-item label="模具状态">
<dict-tag :type="DICT_TYPE.ERP_MOLD_STATUS" :value="detailData?.status" />
</el-descriptions-item>
<el-descriptions-item label="模具型号">{{ detailData?.brandName ?? '' }}</el-descriptions-item>
<el-descriptions-item label="模具规格">{{ detailData?.moldType ?? '' }}</el-descriptions-item>
<el-descriptions-item label="工序">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="detailData?.orgType" />
</el-descriptions-item>
<el-descriptions-item label="模穴数">{{ detailData?.moldSize ?? '' }}</el-descriptions-item>
<el-descriptions-item label="使用次数/次">{{ detailData?.useTime ?? '' }}</el-descriptions-item>
<el-descriptions-item label="使用设备">{{ detailData?.machineName ?? detailData?.machineId ?? ''
}}</el-descriptions-item>
<el-descriptions-item label="入库日期">{{ formatDetailDate(detailData?.inTime) }}</el-descriptions-item>
<el-descriptions-item label="是否启用">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="detailData?.isEnable" />
</el-descriptions-item>
<el-descriptions-item label="备注">{{ detailData?.remark ?? '' }}</el-descriptions-item>
</el-descriptions>
<div class="mold-detail-tabs">
<el-tabs v-model="detailActiveTab" class="mt-12px">
<el-tab-pane label="点检履历" name="check">
<el-empty v-if="!inspectionStepGroups.length" />
<el-steps v-else direction="vertical" :active="inspectionStepGroups.length"
class="device-ledger-history-steps">
<el-step v-for="group in inspectionStepGroups" :key="group.key">
<template #title>
<div class="device-ledger-history-title">
<span class="device-ledger-history-time">[{{ group.time }}]</span>
<span class="device-ledger-history-operator">操作人: {{ group.operator }}</span>
</div>
</template>
<template #description>
<div class="device-ledger-history-items">
<div v-for="item in group.items" :key="item.key" class="device-ledger-history-item">
<div class="device-ledger-history-item-head">
<el-tag :type="getResultTagType(item.result)">{{ getResultLabel(item.result) }}</el-tag>
<span class="device-ledger-history-item-text">{{ item.name }}</span>
</div>
<div class="device-ledger-history-item-body">
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">点检方式</span>
<span class="device-ledger-history-item-value">
<dict-tag type="Inspection_method" :value="item.method" />
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">判定标准</span>
<span class="device-ledger-history-item-value">{{ item.criteria ?? '-' }}</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">点检时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.inspectionTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">创建时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.createTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">备注</span>
<span class="device-ledger-history-item-value">{{ item.remark ?? '-' }}</span>
</div>
<div v-if="item.images?.length" class="device-ledger-history-item-images">
<el-image v-for="img in item.images" :key="img" :src="img" :preview-src-list="item.images"
preview-teleported fit="cover" class="device-ledger-history-item-image">
<template #error>
<div class="device-ledger-history-image-error">图片加载失败</div>
</template>
</el-image>
</div>
</div>
</div>
</div>
</template>
</el-step>
</el-steps>
</el-tab-pane>
<el-tab-pane label="保养履历" name="maintain">
<el-empty v-if="!maintainStepGroups.length" />
<el-steps v-else direction="vertical" class="device-ledger-history-steps"
:active="maintainStepGroups.length">
<el-step v-for="group in maintainStepGroups" :key="group.key">
<template #title>
<div class="device-ledger-history-title">
<span class="device-ledger-history-time">[{{ group.time }}]</span>
<span class="device-ledger-history-operator">操作人: {{ group.operator }}</span>
</div>
</template>
<template #description>
<div class="device-ledger-history-items">
<div v-for="item in group.items" :key="item.key" class="device-ledger-history-item">
<div class="device-ledger-history-item-head">
<el-tag :type="getResultTagType(item.result)">{{ getResultLabel(item.result) }}</el-tag>
<span class="device-ledger-history-item-text">{{ item.name }}</span>
</div>
<div class="device-ledger-history-item-body">
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">保养方式</span>
<span class="device-ledger-history-item-value">
<dict-tag type="Inspection_method" :value="item.method" />
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">判定标准</span>
<span class="device-ledger-history-item-value">{{ item.criteria ?? '-' }}</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">保养时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.inspectionTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">创建时间</span>
<span class="device-ledger-history-item-value">
{{ formatHistoryTime(item.createTime) }}
</span>
</div>
<div class="device-ledger-history-item-row">
<span class="device-ledger-history-item-label">备注</span>
<span class="device-ledger-history-item-value">{{ item.remark ?? '-' }}</span>
</div>
<div v-if="item.images?.length" class="device-ledger-history-item-images">
<el-image v-for="img in item.images" :key="img" :src="img" :preview-src-list="item.images"
preview-teleported fit="cover" class="device-ledger-history-item-image">
<template #error>
<div class="device-ledger-history-image-error">图片加载失败</div>
</template>
</el-image>
</div>
</div>
</div>
</div>
</template>
</el-step>
</el-steps>
</el-tab-pane>
<el-tab-pane label="维修履历" name="repair">
<el-empty v-if="!repairHistoryView.length" />
<el-table v-else :data="repairHistoryView" :stripe="true" :show-overflow-tooltip="true"
class="mold-history-table">
<el-table-column label="维修单ID" prop="repairId" width="120" />
<el-table-column label="项目编码" prop="subjectCode" width="120" />
<el-table-column label="项目名称" prop="subjectName" min-width="160" />
<el-table-column label="项目内容" prop="subjectContent" min-width="200" />
<el-table-column label="判定标准" prop="subjectStandard" min-width="200" />
<el-table-column label="故障描述" prop="malfunction" min-width="200" />
<el-table-column label="维修描述" prop="repairDes" min-width="200" />
<el-table-column label="备注" prop="remark" min-width="200" />
<el-table-column label="创建时间" prop="createTime" width="180">
<template #default="scope">
{{ formatHistoryTime(scope.row.createTime) }}
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
</div>
</ContentWrap>
</template>
<script setup lang="ts">
import { DICT_TYPE } from '@/utils/dict'
import { formatDate } from '@/utils/formatTime'
import { MoldBrandApi, type MoldVO } from '@/api/erp/mold'
import { useTagsViewStore } from '@/store/modules/tagsView'
defineOptions({ name: 'ErpMoldDetail' })
const message = useMessage()
const route = useRoute()
const { delView } = useTagsViewStore()
const { currentRoute } = useRouter()
const detailLoading = ref(false)
const detailData = ref<(MoldVO & Record<string, any>) | null>(null)
const detailActiveTab = ref('check')
const formatDetailDate = (value: any) => {
if (!value) return ''
return formatDate(new Date(value), 'YYYY-MM-DD')
}
const formatHistoryTime = (value: any) => {
const raw = value ?? '-'
if (Array.isArray(raw) && raw.length >= 3) {
const [y, m, d, hh, mm, ss] = raw
const pad = (n: any) => String(n).padStart(2, '0')
if (hh !== undefined) return `${y}-${pad(m)}-${pad(d)} ${pad(hh)}:${pad(mm)}:${pad(ss)}`
return `${y}-${pad(m)}-${pad(d)}`
}
return String(raw)
}
const getResultLabel = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '0') return '待检测'
if (v === '1') return 'OK'
if (v === '2') return 'NG'
return '-'
}
const getResultTagType = (value: any) => {
const v = value === '' || value === null || value === undefined ? undefined : String(value)
if (v === '1') return 'success'
if (v === '2') return 'danger'
if (v === '0') return 'info'
return 'info'
}
const inspectionHistory = computed(() => {
const data: any = detailData.value
return data?.inspectionList ?? []
})
const maintainHistory = computed(() => {
const data: any = detailData.value
const list = data?.maintainList ?? []
return Array.isArray(list) ? list : []
})
type HistoryStepItem = {
key: string
name: string
result: any
method?: any
criteria?: any
images?: string[]
remark?: any
inspectionTime?: any
createTime?: any
}
type HistoryStepGroup = { key: string; time: string; operator: string; items: HistoryStepItem[] }
const parseImages = (value: any): string[] => {
if (!value) return []
if (Array.isArray(value)) return value.map(String).filter(Boolean)
const cleaned = String(value).replace(/[`'\"]/g, '').trim()
return cleaned
.split(',')
.map((v) => v.trim())
.filter(Boolean)
}
const buildStepGroups = (
rows: any[],
options: { timeField: string; nameFieldCandidates: string[]; resultFieldCandidates: string[] }
) => {
const groups = new Map<string, HistoryStepGroup>()
for (const row of rows ?? []) {
const time = formatHistoryTime(row?.[options.timeField] ?? row?.createTime)
const operator = String(row?.creatorName ?? row?.creator ?? '-')
const groupKey = `${row?.managementId ?? ''}__${time}__${operator}`
const name =
options.nameFieldCandidates
.map((k) => row?.[k])
.find((v) => v !== undefined && v !== null && String(v).trim() !== '') ?? '-'
const result =
options.resultFieldCandidates.map((k) => row?.[k]).find((v) => v !== undefined && v !== null) ?? undefined
const item: HistoryStepItem = {
key: String(row?.id ?? `${groupKey}__${String(name)}`),
name: String(name),
result,
method: row?.inspectionMethod,
criteria: row?.judgmentCriteria,
images: parseImages(row?.images),
remark: row?.remark,
inspectionTime: row?.inspectionTime,
createTime: row?.createTime
}
if (!groups.has(groupKey)) {
groups.set(groupKey, { key: groupKey, time, operator, items: [item] })
} else {
groups.get(groupKey)!.items.push(item)
}
}
return Array.from(groups.values()).sort((a, b) => String(b.time).localeCompare(String(a.time)))
}
const inspectionStepGroups = computed<HistoryStepGroup[]>(() => {
return buildStepGroups(inspectionHistory.value, {
timeField: 'inspectionTime',
nameFieldCandidates: ['inspectionItemName', 'name'],
resultFieldCandidates: ['inspectionResult']
})
})
const maintainStepGroups = computed<HistoryStepGroup[]>(() => {
return buildStepGroups(maintainHistory.value, {
timeField: 'inspectionTime',
nameFieldCandidates: ['maintainItemName', 'inspectionItemName', 'name'],
resultFieldCandidates: ['maintainResult', 'inspectionResult']
})
})
type RepairHistoryRow = {
repairId?: any
subjectCode?: any
subjectName?: any
subjectContent?: any
subjectStandard?: any
malfunction?: any
repairDes?: any
remark?: any
createTime?: any
}
const repairHistoryView = computed<RepairHistoryRow[]>(() => {
const data: any = detailData.value
const raw = data?.repairList
if (!raw) return []
if (Array.isArray(raw)) {
return raw as RepairHistoryRow[]
}
if (typeof raw === 'object') {
const result: RepairHistoryRow[] = []
Object.values(raw as Record<string, any>).forEach((rows: any) => {
if (Array.isArray(rows)) {
result.push(...(rows as RepairHistoryRow[]))
}
})
return result
}
return []
})
const close = () => {
delView(unref(currentRoute))
}
const getDetail = async () => {
const id = Number(route.params.id)
if (!id) {
message.error('参数错误,模具不能为空')
close()
return
}
detailActiveTab.value = 'check'
detailLoading.value = true
try {
detailData.value = await MoldBrandApi.getMold(id)
} finally {
detailLoading.value = false
}
}
onMounted(async () => {
await getDetail()
})
</script>
<style scoped>
.mold-detail-desc {
margin-bottom: 16px;
}
.mold-history-table {
margin-top: 8px;
}
.mold-detail-body {
max-height: 85vh;
}
.mold-detail-tabs {
padding-right: 4px;
}
:deep(.el-tabs__content) {
max-height: 65vh;
overflow-y: auto;
}
.device-ledger-history-steps {
padding: 8px 8px 0;
}
.device-ledger-history-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 13px;
}
.device-ledger-history-time {
font-weight: 600;
}
.device-ledger-history-operator {
color: var(--el-text-color-secondary);
}
.device-ledger-history-items {
display: flex;
flex-direction: column;
gap: 6px;
margin-top: 8px;
}
.device-ledger-history-item {
display: flex;
padding: 10px;
background: var(--el-fill-color-blank);
border: 1px solid var(--el-border-color-lighter);
border-radius: 8px;
flex-direction: column;
gap: 8px;
}
.device-ledger-history-item-head {
display: flex;
align-items: center;
gap: 10px;
}
.device-ledger-history-item-body {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
}
.device-ledger-history-item-row {
display: flex;
gap: 10px;
}
.device-ledger-history-item-label {
width: 70px;
flex: 0 0 70px;
color: var(--el-text-color-secondary);
}
.device-ledger-history-item-value {
flex: 1;
color: var(--el-text-color-regular);
word-break: break-word;
}
.device-ledger-history-item-images {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.device-ledger-history-item-image {
width: 76px;
height: 76px;
overflow: hidden;
border-radius: 6px;
}
.device-ledger-history-image-error {
display: flex;
width: 100%;
height: 100%;
font-size: 12px;
color: var(--el-text-color-secondary);
background: var(--el-fill-color);
align-items: center;
justify-content: center;
}
.device-ledger-history-item-text {
color: var(--el-text-color-regular);
}
</style>
Loading…
Cancel
Save