|
|
|
|
@ -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;
|
|
|
|
|
|