src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue
@@ -2,166 +2,220 @@
  <div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增不合格品处理单' : '编辑不合格品处理单'"
      width="70%"
      :title="operationType === 'add' ? '新增不合格品处理单' : operationType === 'view' ? '不合格品处理单详情' : operationType === 'dispose' ? '处置不合格品处理单' : '编辑不合格品处理单'"
      width="75%"
      @close="closeDia"
    >
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
      <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="projectName">
              <el-input v-model="form.projectName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="项目编号" prop="projectNo">
              <el-input v-model="form.projectNo" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="设备名称" prop="equipmentName">
              <el-input v-model="form.equipmentName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="设备图号" prop="equipmentDrawingNo">
              <el-input v-model="form.equipmentDrawingNo" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="物料/部件名称" prop="materialName">
              <el-input v-model="form.materialName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="物料图号" prop="materialDrawingNo">
              <el-input v-model="form.materialDrawingNo" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="型号规格" prop="specificationModel">
              <el-input v-model="form.specificationModel" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="材质" prop="materialQuality">
              <el-input v-model="form.materialQuality" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="总数量" prop="quantity">
              <el-input-number v-model="form.quantity" :min="0" style="width: 100%" :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="不合格数量" prop="unqualifiedQuantity">
              <el-input-number v-model="form.unqualifiedQuantity" :min="0" style="width: 100%" :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="不合格工序" prop="unqualifiedProcess">
              <el-select v-model="form.unqualifiedProcess" placeholder="请选择" clearable :disabled="operationType === 'view'" style="width: 100%">
                <el-option label="来料" :value="1" />
                <el-option label="制程" :value="2" />
                <el-option label="成品" :value="3" />
            <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="供应商名称" prop="supplierName">
              <el-input v-model="form.supplierName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            <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-row :gutter="30">
        <el-divider>基本信息</el-divider>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="检验员" prop="inspectorName">
              <el-input v-model="form.inspectorName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            <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="检验日期" prop="inspectDate">
              <el-date-picker v-model="form.inspectDate" type="date" value-format="YYYY-MM-DD" format="YYYY-MM-DD" placeholder="请选择" clearable style="width: 100%" :disabled="operationType === 'view'" />
            <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="30">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="责任人" prop="responsiblePerson">
              <el-input v-model="form.responsiblePerson" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            <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="责任部门" prop="responsibleDept">
              <el-input v-model="form.responsibleDept" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            <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="30">
        <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="问题描述" prop="problemDescription">
              <el-input type="textarea" v-model="form.problemDescription" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="3" />
            <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-row :gutter="30">
        <el-divider>处置决策</el-divider>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="原因分析及建议" prop="reasonAnalysis">
            <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="30">
          <el-col :span="12">
            <el-form-item label="纠正措施" prop="correctionAction">
              <el-input type="textarea" v-model="form.correctionAction" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="3" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="处置方式" prop="disposalMethod">
              <el-select v-model="form.disposalMethod" placeholder="请选择" clearable :disabled="operationType === 'view'" style="width: 100%">
                <el-option label="让步接收" :value="1" />
                <el-option label="厂内维修" :value="2" />
                <el-option label="返厂维修" :value="3" />
                <el-option label="换货" :value="4" />
                <el-option label="退货" :value="5" />
                <el-option label="报废" :value="6" />
              </el-select>
        <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="30">
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="维修评估" prop="repairEvaluation">
              <el-input type="textarea" v-model="form.repairEvaluation" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="3" />
            <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-row :gutter="30">
        <el-divider>审批意见</el-divider>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="预防措施" prop="preventiveAction">
              <el-input type="textarea" v-model="form.preventiveAction" placeholder="请输入" clearable :disabled="operationType === 'view'" :rows="3" />
            <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="30">
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="备注" prop="remark">
            <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-row :gutter="30">
        <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'" />
@@ -181,7 +235,13 @@
<script setup>
import { ref, reactive, toRefs, getCurrentInstance } from "vue";
import { save, update, getDetail } from "@/api/qualityManagement/qualityUnqualifiedOrder.js";
import {
  saveQualityUnqualifiedOrder,
  updateQualityUnqualifiedOrder,
  getQualityUnqualifiedOrderDetail,
  qualityUnqualifiedListPage,
  dealQualityUnqualifiedOrder,
} from "@/api/qualityManagement/nonconformingManagement.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
const { proxy } = getCurrentInstance();
@@ -189,77 +249,82 @@
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: {
    projectName: "",
    projectNo: "",
    equipmentName: "",
    equipmentDrawingNo: "",
    materialName: "",
    materialDrawingNo: "",
    specificationModel: "",
    materialQuality: "",
    quantity: undefined,
    unqualifiedQuantity: undefined,
    unqualifiedProcess: undefined,
    supplierName: "",
    inspectorName: "",
    inspectDate: "",
    responsiblePerson: "",
    responsibleDept: "",
    problemDescription: "",
    reasonAnalysis: "",
    correctionAction: "",
    disposalMethod: undefined,
    repairEvaluation: "",
    preventiveAction: "",
    remark: "",
    storageBlobDTOs: [],
    storageBlobVOs: [],
  },
  form: { ...emptyForm },
  rules: {
    projectName: [{ required: false, message: "请输入", trigger: "blur" }],
    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") {
    form.value = {
      projectName: "",
      projectNo: "",
      equipmentName: "",
      equipmentDrawingNo: "",
      materialName: "",
      materialDrawingNo: "",
      specificationModel: "",
      materialQuality: "",
      quantity: undefined,
      unqualifiedQuantity: undefined,
      unqualifiedProcess: undefined,
      supplierName: "",
      inspectorName: "",
      inspectDate: "",
      responsiblePerson: "",
      responsibleDept: "",
      problemDescription: "",
      reasonAnalysis: "",
      correctionAction: "",
      disposalMethod: undefined,
      repairEvaluation: "",
      preventiveAction: "",
      remark: "",
      storageBlobDTOs: [],
      storageBlobVOs: [],
    };
    loadUnqualifiedList();
    Object.assign(data.form, { ...emptyForm });
  } else {
    form.value = {};
    Object.assign(data.form, { ...emptyForm });
    if (row?.id) {
      getDetail(row.id).then((res) => {
        form.value = res.data || res || {};
      getQualityUnqualifiedOrderDetail(row.id).then((res) => {
        const detail = res.data || res || {};
        Object.assign(data.form, { ...emptyForm }, detail);
      });
    }
  }
@@ -268,14 +333,31 @@
const submitForm = () => {
  proxy.$refs.formRef.validate((valid) => {
    if (valid) {
      const { status, ...payload } = form.value || {};
      const { status, storageBlobVOs, ...payload } = form.value || {};
      if (operationType.value === "add") {
        save(payload).then(() => {
        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 {
        update(payload).then(() => {
        updateQualityUnqualifiedOrder(payload).then(() => {
          proxy.$modal.msgSuccess("修改成功");
          closeDia();
        });