<template>
|
<div>
|
<el-dialog
|
v-model="dialogFormVisible"
|
:title="operationType === 'add' ? '新增不合格品处理单' : operationType === 'view' ? '不合格品处理单详情' : operationType === 'dispose' ? '处置不合格品处理单' : '编辑不合格品处理单'"
|
width="75%"
|
@close="closeDia"
|
>
|
<el-form :model="form" label-width="130px" :rules="rules" ref="formRef">
|
<!-- 关联不合格品(仅新增时) -->
|
<el-row :gutter="20" v-if="operationType === 'add'">
|
<el-col :span="12">
|
<el-form-item label="关联不合格品" prop="unqualifiedId">
|
<el-select v-model="form.unqualifiedId" placeholder="选择不合格品记录" filterable clearable
|
@change="handleUnqualifiedSelect" style="width: 100%">
|
<el-option v-for="item in unqualifiedList" :key="item.id"
|
:label="item.productName + ' ' + item.model + ' (' + item.quantity + ')'"
|
:value="item.id" />
|
</el-select>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="不合格工序">
|
<el-radio-group v-model="form.unqualifiedProcess" :disabled="operationType === 'view' || operationType === 'dispose'">
|
<el-radio :value="1">来料</el-radio>
|
<el-radio :value="2">制程</el-radio>
|
<el-radio :value="3">成品</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-divider>基本信息</el-divider>
|
<el-row :gutter="20">
|
<el-col :span="12">
|
<el-form-item label="项目名称">
|
<el-input v-model="form.projectName" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="项目编号">
|
<el-input v-model="form.projectNo" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="12">
|
<el-form-item label="设备名称">
|
<el-input v-model="form.equipmentName" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="设备图号">
|
<el-input v-model="form.equipmentDrawingNo" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="12">
|
<el-form-item label="物料/部件名称">
|
<el-input v-model="form.materialName" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="物料图号">
|
<el-input v-model="form.materialDrawingNo" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="8">
|
<el-form-item label="型号规格">
|
<el-input v-model="form.specificationModel" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="材质">
|
<el-input v-model="form.materialQuality" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="供应商">
|
<el-input v-model="form.supplierName" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-divider>不合格信息</el-divider>
|
<el-row :gutter="20">
|
<el-col :span="8">
|
<el-form-item label="总数量">
|
<el-input-number v-model="form.quantity" :min="0" :precision="2" style="width: 100%" :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="不合格数量">
|
<el-input-number v-model="form.unqualifiedQuantity" :min="0" :precision="2" style="width: 100%" :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="检验日期">
|
<el-date-picker v-model="form.inspectDate" type="date" value-format="YYYY-MM-DD" placeholder="请选择" clearable style="width: 100%" :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="8">
|
<el-form-item label="检验员">
|
<el-input v-model="form.inspectorName" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="责任人">
|
<el-input v-model="form.responsiblePerson" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
<el-col :span="8">
|
<el-form-item label="责任部门">
|
<el-input v-model="form.responsibleDept" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="问题描述">
|
<el-input type="textarea" v-model="form.problemDescription" placeholder="请输入" clearable :disabled="operationType === 'view' || operationType === 'dispose'" :rows="3" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-divider>处置决策</el-divider>
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="处置方式" prop="disposalMethod">
|
<el-radio-group v-model="form.disposalMethod" :disabled="operationType === 'view'">
|
<el-radio :value="1">让步接收</el-radio>
|
<el-radio :value="2">厂内维修</el-radio>
|
<el-radio :value="3">返厂维修</el-radio>
|
<el-radio :value="4">换货</el-radio>
|
<el-radio :value="5">退货</el-radio>
|
<el-radio :value="6">报废</el-radio>
|
</el-radio-group>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20" v-if="form.disposalMethod === 2 || form.disposalMethod === 3">
|
<el-col :span="24">
|
<el-form-item label="厂内/返厂维修评估">
|
<el-input type="textarea" v-model="form.repairEvaluation" placeholder="评估维修可行性、所需工时、物料等" clearable :disabled="operationType === 'view'" :rows="3" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="原因分析及建议">
|
<el-input type="textarea" v-model="form.reasonAnalysis" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="3" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="纠正措施">
|
<el-input type="textarea" v-model="form.correctionAction" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="2" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="预防措施">
|
<el-input type="textarea" v-model="form.preventiveAction" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="2" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-divider>审批意见</el-divider>
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="责任部门主管意见">
|
<el-input type="textarea" v-model="form.deptOpinion" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="2" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="公司处理决定">
|
<el-input type="textarea" v-model="form.companyDecision" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="2" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="总经理意见">
|
<el-input type="textarea" v-model="form.generalManagerOpinion" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="2" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="备注">
|
<el-input type="textarea" v-model="form.remark" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="2" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-divider>附件</el-divider>
|
<el-row :gutter="20">
|
<el-col :span="24">
|
<el-form-item label="附件">
|
<FileUpload v-model:file-list="form.storageBlobDTOs" :file-list="form.storageBlobVOs" :disabled="operationType === 'view'" />
|
</el-form-item>
|
</el-col>
|
</el-row>
|
</el-form>
|
<template #footer>
|
<div class="dialog-footer">
|
<el-button type="primary" @click="submitForm" v-if="operationType !== 'view'">确认</el-button>
|
<el-button @click="closeDia">关闭</el-button>
|
</div>
|
</template>
|
</el-dialog>
|
</div>
|
</template>
|
|
<script setup>
|
import { ref, reactive, toRefs, getCurrentInstance } from "vue";
|
import {
|
saveQualityUnqualifiedOrder,
|
updateQualityUnqualifiedOrder,
|
getQualityUnqualifiedOrderDetail,
|
qualityUnqualifiedListPage,
|
dealQualityUnqualifiedOrder,
|
} from "@/api/qualityManagement/nonconformingManagement.js";
|
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
|
|
const { proxy } = getCurrentInstance();
|
const emit = defineEmits(["close"]);
|
|
const dialogFormVisible = ref(false);
|
const operationType = ref("");
|
const unqualifiedList = ref([]);
|
|
const emptyForm = {
|
unqualifiedId: undefined,
|
projectName: "",
|
projectNo: "",
|
equipmentId: undefined,
|
equipmentName: "",
|
equipmentDrawingNo: "",
|
materialName: "",
|
productModelId: undefined,
|
materialDrawingNo: "",
|
specificationModel: "",
|
materialQuality: "",
|
quantity: undefined,
|
unqualifiedQuantity: undefined,
|
unqualifiedProcess: undefined,
|
supplierName: "",
|
inspectorName: "",
|
inspectDate: "",
|
responsiblePerson: "",
|
responsibleDept: "",
|
problemDescription: "",
|
reasonAnalysis: "",
|
correctionAction: "",
|
disposalMethod: undefined,
|
repairEvaluation: "",
|
preventiveAction: "",
|
deptOpinion: "",
|
companyDecision: "",
|
generalManagerOpinion: "",
|
remark: "",
|
storageBlobDTOs: [],
|
storageBlobVOs: [],
|
};
|
|
const data = reactive({
|
form: { ...emptyForm },
|
rules: {
|
unqualifiedId: [{ required: true, message: "请选择关联不合格品", trigger: "change" }],
|
disposalMethod: [{ required: true, message: "请选择处置方式", trigger: "change" }],
|
},
|
});
|
const { form, rules } = toRefs(data);
|
|
const loadUnqualifiedList = () => {
|
qualityUnqualifiedListPage({ inspectState: 0, page: 1, size: 999 }).then(res => {
|
unqualifiedList.value = res.data?.records || [];
|
});
|
};
|
|
const handleUnqualifiedSelect = (id) => {
|
const record = unqualifiedList.value.find(item => item.id === id);
|
if (!record) return;
|
form.value.materialName = record.productName || "";
|
form.value.specificationModel = record.model || "";
|
form.value.quantity = record.quantity;
|
form.value.inspectorName = record.checkName || "";
|
form.value.inspectDate = record.checkTime || "";
|
form.value.problemDescription = record.defectivePhenomena || "";
|
form.value.unqualifiedProcess = record.inspectType != null ? record.inspectType + 1 : undefined;
|
form.value.unqualifiedQuantity = record.quantity;
|
};
|
|
const openDialog = async (type, row) => {
|
operationType.value = type;
|
dialogFormVisible.value = true;
|
if (type === "add") {
|
loadUnqualifiedList();
|
Object.assign(data.form, { ...emptyForm });
|
} else {
|
Object.assign(data.form, { ...emptyForm });
|
if (row?.id) {
|
getQualityUnqualifiedOrderDetail(row.id).then((res) => {
|
const detail = res.data || res || {};
|
Object.assign(data.form, { ...emptyForm }, detail);
|
});
|
}
|
}
|
};
|
|
const submitForm = () => {
|
proxy.$refs.formRef.validate((valid) => {
|
if (valid) {
|
const { status, storageBlobVOs, ...payload } = form.value || {};
|
if (operationType.value === "add") {
|
saveQualityUnqualifiedOrder(payload).then(() => {
|
proxy.$modal.msgSuccess("提交成功");
|
closeDia();
|
});
|
} else if (operationType.value === "dispose") {
|
const dealFields = {
|
id: payload.id,
|
disposalMethod: payload.disposalMethod,
|
repairEvaluation: payload.repairEvaluation,
|
reasonAnalysis: payload.reasonAnalysis,
|
correctionAction: payload.correctionAction,
|
preventiveAction: payload.preventiveAction,
|
remark: payload.remark,
|
deptOpinion: payload.deptOpinion,
|
companyDecision: payload.companyDecision,
|
generalManagerOpinion: payload.generalManagerOpinion,
|
};
|
dealQualityUnqualifiedOrder(dealFields).then(() => {
|
proxy.$modal.msgSuccess("处置成功");
|
closeDia();
|
});
|
} else {
|
updateQualityUnqualifiedOrder(payload).then(() => {
|
proxy.$modal.msgSuccess("修改成功");
|
closeDia();
|
});
|
}
|
}
|
});
|
};
|
|
const closeDia = () => {
|
proxy.resetForm("formRef");
|
dialogFormVisible.value = false;
|
emit("close");
|
};
|
|
defineExpose({ openDialog });
|
</script>
|
|
<style scoped></style>
|