feat:模具组-维护-点检/保养添加检验结果审批流程

main
黄伟杰 1 day ago
parent 4f16b2a847
commit 6503b17814

@ -2591,7 +2591,8 @@ export default {
replaceNetRemark: 'Remark',
placeholderReplaceNetRemark: 'Please input remark',
moldInfo: 'Mold Info',
maintainInfo: 'Maintain Info'
maintainInfo: 'Maintain Info',
inspectionResult: 'Inspection Result'
},
MoldBrandDetail: {

@ -2074,7 +2074,8 @@ export default {
replaceNetRemark: '备注',
placeholderReplaceNetRemark: '请输入备注',
moldInfo: '模具信息',
maintainInfo: '维护信息'
maintainInfo: '维护信息',
inspectionResult: '检验结果'
},
MoldBrandDetail: {

@ -75,20 +75,123 @@
<!-- 点检/保养表单 -->
<template v-if="isInspectOrMaintain">
<el-form-item :label="t('EquipmentManagement.TaskManagement.name')" prop="name">
<el-input v-model="taskFormData.name" :placeholder="t('EquipmentManagement.TaskManagement.placeholderName')" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.TaskManagement.projectForm')" prop="projectForm">
<div class="flex items-center gap-2 w-full">
<el-input
v-model="projectFormDisplayText"
readonly
:placeholder="t('EquipmentManagement.TaskManagement.placeholderProjectForm')"
class="flex-1"
<div class="mold-maintain-inspect-layout">
<div class="mold-maintain-inspect-layout__form">
<el-form-item :label="t('EquipmentManagement.TaskManagement.name')" prop="name">
<el-input v-model="taskFormData.name" :placeholder="t('EquipmentManagement.TaskManagement.placeholderName')" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.TaskManagement.projectForm')" prop="projectForm">
<div class="flex items-center gap-2 w-full">
<el-input
v-model="projectFormDisplayText"
readonly
:placeholder="t('EquipmentManagement.TaskManagement.placeholderProjectForm')"
class="flex-1"
/>
<el-button @click="openProjectFormDialog">{{ t('common.select') }}</el-button>
</div>
</el-form-item>
</div>
<el-divider content-position="left">{{ t('MoldManagement.MoldBrandPage.inspectionResult') }}</el-divider>
<div class="mold-maintain-ticket-results">
<div class="mold-maintain-ticket-results__header">
<el-button
type="primary"
link
:disabled="!ticketResultList.length"
@click="ticketResultEditable = !ticketResultEditable"
>
<Icon :icon="ticketResultEditable ? 'ep:lock' : 'ep:edit-pen'" class="mr-4px" />
{{ ticketResultEditable ? '停止编辑' : '编辑' }}
</el-button>
</div>
<el-table
:data="ticketResultPageData"
:stripe="true"
:show-overflow-tooltip="true"
size="small"
max-height="420"
row-key="id"
>
<el-table-column type="index" label="序号" align="center" width="58" />
<el-table-column label="检验项名称" align="center" prop="inspectionItemName" min-width="140" />
<el-table-column label="检验方式" align="center" prop="inspectionMethod" min-width="120">
<template #default="scope">
<dict-tag type="Inspection_method" :value="scope.row.inspectionMethod" />
</template>
</el-table-column>
<el-table-column label="判定基准" align="center" prop="judgmentCriteria" min-width="140" />
<el-table-column label="检验结果" align="center" prop="inspectionResult" width="100">
<template #default="scope">
<el-tag v-if="String(scope.row.inspectionResult) === '0'" type="info"></el-tag>
<el-tag v-else-if="String(scope.row.inspectionResult) === '1'" type="success">通过</el-tag>
<el-tag v-else-if="String(scope.row.inspectionResult) === '2'" type="danger">不通过</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="图片" align="center" prop="images" width="110">
<template #default="scope">
<UploadImg
v-if="ticketResultEditable"
v-model="scope.row.images"
:drag="false"
:show-btn-text="false"
width="56px"
height="56px"
/>
<el-image
v-else-if="scope.row.images"
:src="parseFirstImage(scope.row.images)"
:preview-src-list="parseImages(scope.row.images)"
preview-teleported
fit="cover"
style="width: 56px; height: 56px"
/>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column :label="t('EquipmentManagement.DvSubject.valueType')" align="center" prop="valueType" width="100">
<template #default="scope">
<dict-tag type="value_types" :value="scope.row.valueType" />
</template>
</el-table-column>
<el-table-column label="输入值" align="center" min-width="150">
<template #default="scope">
<el-input
v-if="String(scope.row.valueType) === '0' || String(scope.row.valueType) === '2'"
v-model="scope.row.textInput"
:disabled="!ticketResultEditable"
clearable
placeholder="请输入"
/>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="120" />
<el-table-column label="操作" align="center" width="150" fixed="right">
<template #default="scope">
<el-radio-group v-if="ticketResultEditable" v-model="scope.row.inspectionResult">
<el-radio :label="'1'">通过</el-radio>
<el-radio :label="'2'">不通过</el-radio>
</el-radio-group>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
<Pagination
v-if="ticketResultList.length"
:total="ticketResultList.length"
v-model:page="ticketResultPageNo"
:limit="ticketResultPageSize"
@pagination="handleTicketResultPageChange"
/>
<el-empty
v-if="!ticketResultList.length"
:description="selectedProjectFormId ? '暂无检验项' : '请选择项目表单'"
:image-size="80"
/>
<el-button @click="openProjectFormDialog">{{ t('common.select') }}</el-button>
</div>
</el-form-item>
</div>
</template>
<!-- 维修表单 -->
@ -505,6 +608,17 @@ const selectedProjectFormId = ref<string>('') // 已确认选中的 id
const selectedProjectFormName = ref<string>('') //
const subjectListMap = ref<Record<string, any[]>>({})
const subjectLoadingMap = ref<Record<string, boolean>>({})
const ticketResultList = ref<any[]>([])
const ticketResultEditable = ref(false)
const ticketResultPageNo = ref(1)
const ticketResultPageSize = 5
const ticketResultPageData = computed(() => {
const start = (ticketResultPageNo.value - 1) * ticketResultPageSize
return ticketResultList.value.slice(start, start + ticketResultPageSize)
})
const handleTicketResultPageChange = () => {
// computed
}
const projectFormPageParams = reactive({
pageNo: 1,
@ -541,11 +655,18 @@ const handleProjectFormRadioChange = (row: any) => {
tempSelectedProjectForm.value = row
}
const confirmProjectFormSelection = () => {
const confirmProjectFormSelection = async () => {
if (!tempSelectedProjectForm.value) return
selectedProjectFormId.value = String(tempSelectedProjectForm.value.id)
selectedProjectFormName.value = tempSelectedProjectForm.value.planName ?? String(tempSelectedProjectForm.value.id)
taskFormData.projectForm = selectedProjectFormId.value
if (Array.isArray(tempSelectedProjectForm.value.subjectList)) {
subjectListMap.value[selectedProjectFormId.value] = tempSelectedProjectForm.value.subjectList
} else {
await ensureSubjectListLoaded(selectedProjectFormId.value)
}
setTicketResultList(subjectListMap.value[selectedProjectFormId.value] ?? [])
ticketResultEditable.value = false
projectFormDialogVisible.value = false
}
@ -563,6 +684,36 @@ const ensureSubjectListLoaded = async (planId: number | string) => {
}
}
const setTicketResultList = (subjectList: any[]) => {
ticketResultList.value = (subjectList ?? []).map((item: any, index: number) => ({
id: item.id,
subjectId: item.id,
inspectionItemName: item.subjectName ?? item.inspectionItemName ?? '',
inspectionMethod: item.inspectionMethod ?? '',
judgmentCriteria: item.judgmentCriteria ?? item.subjectStandard ?? '',
valueType: item.valueType ?? '',
textInput: item.textInput ?? '',
inspectionResult: item.inspectionResult ?? '0',
images: item.images ?? '',
remark: item.remark ?? '',
sort: index + 1
}))
ticketResultPageNo.value = 1
}
const parseImages = (value: any): string[] => {
if (!value) return []
if (Array.isArray(value)) return value.map(String).filter(Boolean)
return String(value)
.split(',')
.map((v) => v.trim())
.filter(Boolean)
}
const parseFirstImage = (value: any): string => {
return parseImages(value)[0] || ''
}
const handleProjectFormExpandChange = async (row: any, expandedRows: any[]) => {
const isExpanded = expandedRows.some((r) => String(r.id) === String(row.id))
if (!isExpanded) return
@ -649,7 +800,8 @@ const submitForm = async () => {
name: taskFormData.name,
taskType: String(taskFormData.taskType),
moldList: props.mold?.id ? String(props.mold.id) : undefined,
projectForm: taskFormData.projectForm
projectForm: taskFormData.projectForm,
ticketResultsList: ticketResultList.value.map((item: any) => ({ ...item }))
})
message.success(t('common.createSuccess'))
//
@ -657,6 +809,8 @@ const submitForm = async () => {
taskFormData.projectForm = ''
selectedProjectFormId.value = ''
selectedProjectFormName.value = ''
ticketResultList.value = []
ticketResultEditable.value = false
} else if (isRepair.value) {
//
const payload: any = {
@ -847,6 +1001,46 @@ defineExpose({ open })
white-space: nowrap;
}
.mold-maintain-inspect-layout {
display: flex;
flex-direction: column;
gap: 20px;
align-items: stretch;
}
.mold-maintain-inspect-layout__form {
min-width: 0;
}
.mold-maintain-ticket-results {
min-width: 0;
padding: 14px;
border: 1px solid var(--el-border-color-lighter);
border-radius: 8px;
background: #fafafa;
}
.mold-maintain-ticket-results__header {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 12px;
margin-bottom: 12px;
}
.mold-maintain-ticket-results__title {
font-size: 14px;
font-weight: 600;
color: var(--el-text-color-primary);
}
.mold-maintain-ticket-results :deep(.el-upload) {
margin: 0 auto;
}
@media (max-width: 1400px) {
}
.mold-maintain-page__form-actions {
display: flex;
justify-content: flex-end;

Loading…
Cancel
Save