君歌
1.对于新增订单需流转协同办公进行审批,审批完成流转生产管控-生产订单
2.客户分类修改为:核心、重要、普通、一般。
3.可对报价多次修改,修改后流转至协同办公-协同审批-报价审批,并对每次报价进行记录。
4.不合格管理字段按照单据进行修改。
5.谁登记的客户只能看见自己的,负责人(维护人)可以转移,操作加一个‘客户交接’按钮选择要交接给的负责人
已添加2个文件
已修改12个文件
695 ■■■■■ 文件已修改
src/api/basicData/customer.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/qualityManagement/qualityUnqualifiedOrder.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PIMTable/PIMTable.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/customerFile/index.vue 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/customerFileOpenSea/index.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionPlan/productionPlan/index.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/components/formDia.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue 296 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/basicData/customer.js
@@ -26,6 +26,15 @@
    })
}
// äº¤æŽ¥å®¢æˆ·
export function handoverCustomer(data) {
    return request({
        url: '/basic/customer/handover',
        method: 'post',
        data
    })
}
// æµå…¥å…¬æµ·
export function backCustomer(id) {
    return request({
src/api/qualityManagement/qualityUnqualifiedOrder.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
import request from "@/utils/request";
// åˆ†é¡µæŸ¥è¯¢ä¸åˆæ ¼å“å¤„理单
export function listPage(query) {
  return request({
    url: "/qualityUnqualifiedOrder/listPage",
    method: "get",
    params: query,
  });
}
// æŸ¥çœ‹è¯¦æƒ…
export function getDetail(id) {
  return request({
    url: `/qualityUnqualifiedOrder/${id}`,
    method: "get",
  });
}
// æ–°å¢žå¤„理单
export function save(data) {
  return request({
    url: "/qualityUnqualifiedOrder/save",
    method: "post",
    data,
  });
}
// ä¿®æ”¹å¤„理单
export function update(data) {
  return request({
    url: "/qualityUnqualifiedOrder/update",
    method: "put",
    data,
  });
}
// åˆ é™¤å¤„理单
export function remove(ids) {
  return request({
    url: "/qualityUnqualifiedOrder/delete",
    method: "delete",
    data: ids,
  });
}
src/components/PIMTable/PIMTable.vue
@@ -28,6 +28,7 @@
    <el-table-column align="center"
                     label="序号"
                     type="index"
                                         fixed="left"
                     width="60" />
    <el-table-column v-for="(item, index) in column"
                     :key="index"
src/views/basicData/customerFile/index.vue
@@ -15,10 +15,14 @@
                   style="width: 240px"
                   clearable
                   @change="handleQuery">
          <el-option label="零售客户"
                     value="零售客户" />
          <el-option label="进销商客户"
                     value="进销商客户" />
          <el-option label="核心"
                     value="核心" />
          <el-option label="重要"
                     value="重要" />
          <el-option label="普通"
                     value="普通" />
          <el-option label="一般"
                     value="一般" />
        </el-select>
        <el-button type="primary"
                   @click="handleQuery"
@@ -31,6 +35,7 @@
                   plain
                   @click="back">流入公海</el-button>
        <el-button @click="handleOut">导出</el-button>
                <el-button type="primary" @click="handleOutFollowUpList">导出跟进记录</el-button>
        <el-button type="info"
                   plain
                   icon="Upload"
@@ -128,10 +133,14 @@
              <el-select v-model="form.customerType"
                         placeholder="请选择"
                         clearable>
                <el-option label="零售客户"
                           value="零售客户" />
                <el-option label="进销商客户"
                           value="进销商客户" />
                <el-option label="核心"
                           value="核心" />
                <el-option label="重要"
                           value="重要" />
                <el-option label="普通"
                           value="普通" />
                <el-option label="一般"
                           value="一般" />
              </el-select>
            </el-form-item>
          </el-col>
@@ -609,6 +618,39 @@
        </div>
      </template>
    </el-dialog>
    <!-- äº¤æŽ¥å¯¹è¯æ¡† -->
    <el-dialog v-model="handoverDialogVisible"
               title="客户交接"
               width="400px"
               @close="closeHandoverDialog">
      <el-form :model="handoverForm"
               :rules="handoverRules"
               ref="handoverFormRef"
               label-width="100px">
        <el-form-item label="当前维护人">
          <span>{{ handoverForm.oldMaintainer }}</span>
        </el-form-item>
        <el-form-item label="新维护人"
                      prop="maintainer">
          <el-select v-model="handoverForm.maintainerId"
                     placeholder="请选择新维护人"
                     style="width: 100%"
                     filterable
                     @change="handleHandoverUserChange">
            <el-option v-for="item in userList"
                       :key="item.userId || item.nickName"
                       :label="item.nickName"
                       :value="item.userId" />
          </el-select>
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitHandoverForm">确认</el-button>
          <el-button @click="closeHandoverDialog">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
@@ -622,7 +664,7 @@
    addReturnVisit,
    getReturnVisit,
  } from "@/api/basicData/customerFile.js";
  import {listCustomer, getCustomer, addCustomer, updateCustomer, delCustomer, backCustomer} from "@/api/basicData/customer.js";
  import {listCustomer, getCustomer, addCustomer, updateCustomer, delCustomer, backCustomer, handoverCustomer} from "@/api/basicData/customer.js";
  import { ElMessageBox } from "element-plus";
  import { userListNoPage } from "@/api/system/user.js";
  import useUserStore from "@/store/modules/user";
@@ -712,11 +754,23 @@
    {
      label: "客户分类",
      prop: "customerType",
            fixed: "left",
      dataType: "tag",
      width: 120,
      formatType: value => {
        switch (value) {
          case "核心": return "danger";
          case "重要": return "warning";
          case "普通": return "primary";
          case "一般": return "info";
          default: return "info";
        }
      },
    },
    {
      label: "客户名称",
      prop: "customerName",
            fixed: "left",
      width: 220,
    },
    {
@@ -795,13 +849,20 @@
      label: "操作",
      align: "center",
      fixed: "right",
      width: 290,
      width: 340,
      operation: [
        {
          name: "编辑",
          type: "text",
          clickFun: row => {
            openForm("edit", row);
          },
        },
        {
          name: "交接",
          type: "text",
          clickFun: row => {
            openHandoverDialog(row);
          },
        },
                {
@@ -842,6 +903,19 @@
  // ç”¨æˆ·ä¿¡æ¯è¡¨å•弹框数据
  const operationType = ref("");
  const dialogFormVisible = ref(false);
  // äº¤æŽ¥å¯¹è¯æ¡†
  const handoverDialogVisible = ref(false);
  const handoverFormRef = ref();
  const handoverForm = reactive({
    id: undefined,
    oldMaintainer: "",
    maintainer: "",
    maintainerId: undefined,
  });
  const handoverRules = {
    maintainer: [{ required: true, message: "请选择新维护人", trigger: "change" }],
  };
  const formYYs = ref({
    // å…¶ä»–字段...
    contactList: [
@@ -1078,6 +1152,44 @@
    proxy.resetForm("formRef");
    dialogFormVisible.value = false;
  };
  // äº¤æŽ¥
  const handleHandoverUserChange = userId => {
    const user = userList.value.find(item => (item.userId || item.nickName) === userId);
    handoverForm.maintainer = user ? user.nickName : "";
  };
  const openHandoverDialog = row => {
    handoverForm.id = row.id;
    handoverForm.oldMaintainer = row.maintainer;
    handoverForm.maintainer = "";
    handoverForm.maintainerId = undefined;
    userListNoPage().then(res => {
      userList.value = res.data;
      handoverDialogVisible.value = true;
    });
  };
  const closeHandoverDialog = () => {
    proxy.resetForm("handoverFormRef");
    handoverForm.id = undefined;
    handoverForm.oldMaintainer = "";
    handoverForm.maintainer = "";
    handoverForm.maintainerId = undefined;
    handoverDialogVisible.value = false;
  };
  const submitHandoverForm = () => {
    proxy.$refs.handoverFormRef.validate(valid => {
      if (valid) {
        handoverCustomer({
          id: handoverForm.id,
          maintainer: handoverForm.maintainer,
          maintainerId: handoverForm.maintainerId,
        }).then(() => {
          proxy.$modal.msgSuccess("交接成功");
          closeHandoverDialog();
          getList();
        });
      }
    });
  };
  // å¯¼å‡º
  const handleOut = () => {
    ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
@@ -1092,6 +1204,20 @@
        proxy.$modal.msg("已取消");
      });
  };
    // å¯¼å‡ºè·Ÿè¿›è®°å½•
    const handleOutFollowUpList = () => {
        ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
            confirmButtonText: "确认",
            cancelButtonText: "取消",
            type: "warning",
        })
            .then(() => {
                proxy.download("basic/customer-follow/export", {}, "客户跟进记录.xlsx");
            })
            .catch(() => {
                proxy.$modal.msg("已取消");
            });
    };
  // åˆ é™¤
  const handleDelete = () => {
    let ids = [];
src/views/basicData/customerFileOpenSea/index.vue
@@ -15,10 +15,14 @@
                   style="width: 240px"
                   clearable
                   @change="handleQuery">
          <el-option label="零售客户"
                     value="零售客户" />
          <el-option label="进销商客户"
                     value="进销商客户" />
          <el-option label="核心"
                     value="核心" />
          <el-option label="重要"
                     value="重要" />
          <el-option label="普通"
                     value="普通" />
          <el-option label="一般"
                     value="一般" />
        </el-select>
        <el-button type="primary"
                   @click="handleQuery"
@@ -125,10 +129,14 @@
              <el-select v-model="form.customerType"
                         placeholder="请选择"
                         clearable>
                <el-option label="零售客户"
                           value="零售客户" />
                <el-option label="进销商客户"
                           value="进销商客户" />
                <el-option label="核心"
                           value="核心" />
                <el-option label="重要"
                           value="重要" />
                <el-option label="普通"
                           value="普通" />
                <el-option label="一般"
                           value="一般" />
              </el-select>
            </el-form-item>
          </el-col>
@@ -808,7 +816,17 @@
    {
      label: "客户分类",
      prop: "customerType",
      dataType: "tag",
      width: 120,
      formatType: value => {
        switch (value) {
          case "核心": return "danger";
          case "重要": return "warning";
          case "普通": return "primary";
          case "一般": return "info";
          default: return "info";
        }
      },
    },
    {
      label: "客户名称",
src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
@@ -19,6 +19,7 @@
  { value: "quotation", label: "报价审批", cellBg: "#f4ecfc", cellColor: "#9b59b6" },
  { value: "shipment", label: "发货审批", cellBg: "#e8faf6", cellColor: "#1abc9c" },
  { value: "enterprise_news", label: "企业新闻", cellBg: "#ecf5ff", cellColor: "#409eff" },
  { value: "sales", label: "销售审批", cellBg: "#e8faf0", cellColor: "#1a9c5d" },
];
/** åˆ—表查询:审批状态(与后端 status æžšä¸¾ä¸€è‡´ï¼‰ */
src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -145,6 +145,45 @@
          </div>
        </div>
      </template>
      <!-- é”€å”®å®¡æ‰¹è¯¦æƒ… -->
      <template v-else-if="row.businessType === 19">
        <div v-if="detailData" class="sales-detail">
          <el-divider content-position="left">销售详情</el-divider>
          <el-descriptions :column="2" border>
            <el-descriptions-item label="销售合同号">{{ detailData.salesContractNo || "--" }}</el-descriptions-item>
            <el-descriptions-item label="客户名称">{{ detailData.customerName || "--" }}</el-descriptions-item>
            <el-descriptions-item label="业务员">{{ detailData.salesman || "--" }}</el-descriptions-item>
            <el-descriptions-item label="项目名称">{{ detailData.projectName || "--" }}</el-descriptions-item>
            <el-descriptions-item label="签订日期">{{ detailData.executionDate || "--" }}</el-descriptions-item>
            <el-descriptions-item label="付款方式">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
            <el-descriptions-item label="录入人">{{ detailData.entryPersonName || detailData.entryPerson || "--" }}</el-descriptions-item>
            <el-descriptions-item label="录入日期">{{ detailData.entryDate || "--" }}</el-descriptions-item>
            <el-descriptions-item label="合同金额" :span="2">
              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
                Â¥{{ salesTotalAmount }}
              </span>
            </el-descriptions-item>
          </el-descriptions>
          <div v-if="detailData.productData && detailData.productData.length" style="margin-top: 20px;">
            <h4>产品明细</h4>
            <el-table :data="detailData.productData"
                      border
                      style="width: 100%">
              <el-table-column prop="productCategory" label="产品名称" />
              <el-table-column prop="specificationModel" label="规格型号" />
              <el-table-column prop="unit" label="单位" />
              <el-table-column prop="quantity" label="数量" />
              <el-table-column prop="taxInclusiveUnitPrice" label="含税单价">
                <template #default="scope">Â¥{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template>
              </el-table-column>
              <el-table-column prop="taxInclusiveTotalPrice" label="含税总价">
                <template #default="scope">Â¥{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template>
              </el-table-column>
            </el-table>
          </div>
        </div>
      </template>
    </div>
    <div v-if="attachmentList.length"
         class="detail-block">
@@ -199,9 +238,9 @@
  const formResolved = computed(() => resolveInstanceFormFields(props.row));
  // æ˜¯å¦ä¸ºç‰¹æ®Šå®¡æ‰¹ç±»åž‹ï¼ˆé‡‡è´­ã€å‘货、报价)
  // æ˜¯å¦ä¸ºç‰¹æ®Šå®¡æ‰¹ç±»åž‹ï¼ˆé‡‡è´­ã€å‘货、报价、销售)
  const isSpecialApprovalType = computed(() => {
    return [5, 7, 6].includes(props.row.businessType);
    return [5, 7, 6, 19].includes(props.row.businessType);
  });
  // è¯¦æƒ…数据(直接使用传入的 detail-data å‚数)
@@ -209,6 +248,14 @@
    return props.detailData || {};
  });
  // é”€å”®å®¡æ‰¹ï¼šåˆåŒé‡‘额 = äº§å“æ˜Žç»†å«ç¨Žæ€»ä»·ä¹‹å’Œ
  const salesTotalAmount = computed(() => {
    const products = detailData.value?.productData;
    if (!Array.isArray(products) || !products.length) return "0.00";
    const total = products.reduce((sum, p) => sum + Number(p.taxInclusiveTotalPrice ?? 0), 0);
    return total.toFixed(2);
  });
  const attachmentList = computed(() => {
    const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
    return Array.isArray(list) ? list : [];
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -13,6 +13,7 @@
import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js";
import { getDeliveryDetailByShippingNo } from "@/api/salesManagement/deliveryLedger.js";
import { ledgerListPage, getSalesLedgerWithProducts } from "@/api/salesManagement/salesLedger.js";
import useUserStore from "@/store/modules/user";
import { Search } from "@element-plus/icons-vue";
import { ElMessage, ElMessageBox } from "element-plus";
@@ -226,7 +227,7 @@
        fetchBusinessTypeOptions(),
        listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
      ]);
      submitBusinessTypeOptions.value = typeOptions.filter((x) => ![5, 6, 7].includes(x.value));
      submitBusinessTypeOptions.value = typeOptions.filter((x) => ![5, 6, 7, 19].includes(x.value));
      allSubmitTemplates.value = unwrapTemplateList(customRes)
        .filter((row) => mapEnabledFromApi(row.enabled))
        .map(mapSubmitTemplateCard);
@@ -324,6 +325,22 @@
      }
    }
    
    // é”€å”®å®¡æ‰¹ï¼šç”¨ quotationNo(销售合同号)去查销售台账详情
    else if (row.businessType === 19) {
      const salesContractNo = row?.quotationNo;
      if (salesContractNo) {
        const listRes = await ledgerListPage({ salesContractNo });
        const records = listRes?.records || listRes?.data || [];
        const ledger = Array.isArray(records) ? records[0] : null;
        if (ledger?.id) {
          const detail = await getSalesLedgerWithProducts({ id: ledger.id, type: 1 });
          detailData.value = detail || ledger;
        } else {
          detailData.value = ledger || {};
        }
      }
    }
    // å…¶ä»–审批类型
    else {
      detailData.value = {};
@@ -369,6 +386,22 @@
      }
    }
    // é”€å”®å®¡æ‰¹ï¼šç”¨ quotationNo(销售合同号)去查销售台账详情
    else if (row.businessType === 19) {
      const salesContractNo = row?.quotationNo;
      if (salesContractNo) {
        const listRes = await ledgerListPage({ salesContractNo });
        const records = listRes?.records || listRes?.data || [];
        const ledger = Array.isArray(records) ? records[0] : null;
        if (ledger?.id) {
          const detail = await getSalesLedgerWithProducts({ id: ledger.id, type: 1 });
          detailData.value = detail || ledger;
        } else {
          detailData.value = ledger || {};
        }
      }
    }
    // å…¶ä»–审批类型
    else {
      detailData.value = {};
src/views/productionPlan/productionPlan/index.vue
@@ -377,6 +377,30 @@
      },
    },
    {
      label: "审批状态",
      prop: "approvalStatus",
      width: "100px",
      dataType: "tag",
      formatType: params => {
        const typeMap = {
          0: "info",
          1: "warning",
          2: "success",
          3: "danger",
        };
        return typeMap[params] || "info";
      },
      formatData: cell => {
        const statusMap = {
          0: "待审批",
          1: "审批中",
          2: "已通过",
          3: "已驳回",
        };
        return statusMap[cell] || "-";
      },
    },
    {
      label: "已下发数量",
      prop: "quantityIssued",
      width: "120px",
src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -112,6 +112,13 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="附件:">
              <FileUpload v-model:file-list="form.storageBlobDTOs" :file-list="form.storageBlobVOs" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
@@ -132,6 +139,7 @@
  qualityUnqualifiedUpdate
} from "@/api/qualityManagement/nonconformingManagement.js";
import {userListNoPage} from "@/api/system/user.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
import useUserStore from "@/store/modules/user";
const { proxy } = getCurrentInstance()
const userStore = useUserStore()
@@ -158,6 +166,8 @@
    dealName: '',
    dealTime: '',
    productModelId: undefined,
    storageBlobDTOs: [],
    storageBlobVOs: [],
  },
  rules: {
    checkTime: [{ required: false, message: "请输入", trigger: "blur" },],
src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
@@ -109,6 +109,13 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="附件:">
              <FileUpload v-model:file-list="form.storageBlobDTOs" :file-list="form.storageBlobVOs" />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
@@ -128,6 +135,7 @@
  qualityUnqualifiedDeal
} from "@/api/qualityManagement/nonconformingManagement.js";
import {userListNoPage} from "@/api/system/user.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
@@ -151,7 +159,9 @@
    dealResult: '',
    dealName: '',
    dealTime: '',
    method: undefined
    method: undefined,
    storageBlobDTOs: [],
    storageBlobVOs: [],
  },
  rules: {
    checkTime: [{ required: false, message: "请输入", trigger: "blur" },],
src/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,296 @@
<template>
  <div>
    <el-dialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增不合格品处理单' : '编辑不合格品处理单'"
      width="70%"
      @close="closeDia"
    >
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <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-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>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="检验员" prop="inspectorName">
              <el-input v-model="form.inspectorName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </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>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="责任人" prop="responsiblePerson">
              <el-input v-model="form.responsiblePerson" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </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>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <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>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="原因分析及建议" prop="reasonAnalysis">
              <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-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <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>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <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>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="备注" prop="remark">
              <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-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 { save, update, getDetail } from "@/api/qualityManagement/qualityUnqualifiedOrder.js";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
const { proxy } = getCurrentInstance();
const emit = defineEmits(["close"]);
const dialogFormVisible = ref(false);
const operationType = ref("");
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: [],
  },
  rules: {
    projectName: [{ required: false, message: "请输入", trigger: "blur" }],
  },
});
const { form, rules } = toRefs(data);
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: [],
    };
  } else {
    form.value = {};
    if (row?.id) {
      getDetail(row.id).then((res) => {
        form.value = res.data || res || {};
      });
    }
  }
};
const submitForm = () => {
  proxy.$refs.formRef.validate((valid) => {
    if (valid) {
      const { status, ...payload } = form.value || {};
      if (operationType.value === "add") {
        save(payload).then(() => {
          proxy.$modal.msgSuccess("提交成功");
          closeDia();
        });
      } else {
        update(payload).then(() => {
          proxy.$modal.msgSuccess("修改成功");
          closeDia();
        });
      }
    }
  });
};
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
  emit("close");
};
defineExpose({ openDialog });
</script>
<style scoped></style>
src/views/qualityManagement/nonconformingManagement/index.vue
@@ -36,7 +36,8 @@
      </el-form>
    </div>
    <div class="mb20" style="text-align: right;">
        <el-button type="primary" @click="openForm('add')">新增</el-button>
<!--        <el-button type="primary" @click="openForm('add')">新增</el-button>-->
        <el-button type="primary" @click="openOrderForm">处理单</el-button>
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
@@ -55,6 +56,7 @@
    </div>
    <FormDia ref="formDia" @close="handleQuery"></FormDia>
    <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
    <OrderFormDia ref="orderFormDia" @close="handleQuery"></OrderFormDia>
  </div>
</template>
@@ -65,6 +67,7 @@
import {ElMessageBox} from "element-plus";
import {qualityUnqualifiedDel, qualityUnqualifiedListPage} from "@/api/qualityManagement/nonconformingManagement.js";
import InspectionFormDia from "@/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue";
import OrderFormDia from "@/views/qualityManagement/nonconformingManagement/components/orderFormDia.vue";
import dayjs from "dayjs";
const data = reactive({
@@ -200,6 +203,7 @@
});
const formDia = ref()
const inspectionFormDia = ref()
const orderFormDia = ref()
const { proxy } = getCurrentInstance()
const changeDaterange = (value) => {
@@ -260,6 +264,13 @@
  })
};
// æ‰“开处理单弹框
const openOrderForm = () => {
  nextTick(() => {
    orderFormDia.value?.openDialog("add", null);
  });
};
// åˆ é™¤
const handleDelete = () => {
  let ids = [];
src/views/salesManagement/salesLedger/index.vue
@@ -241,6 +241,14 @@
          width="120"
          show-overflow-tooltip
        />
        <el-table-column label="审批状态" prop="approvalStatus" width="100" align="center">
          <template #default="scope">
            <el-tag v-if="scope.row.approvalStatus === 0" type="info">待审批</el-tag>
            <el-tag v-else-if="scope.row.approvalStatus === 1" type="warning">审批中</el-tag>
            <el-tag v-else-if="scope.row.approvalStatus === 2" type="success">已通过</el-tag>
            <el-tag v-else-if="scope.row.approvalStatus === 3" type="danger">已驳回</el-tag>
          </template>
        </el-table-column>
        <el-table-column
          label="交付日期"
          prop="deliveryDate"
@@ -582,6 +590,16 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="审批状态:">
              <el-tag v-if="form.approvalStatus === 0" type="info">待审批</el-tag>
              <el-tag v-else-if="form.approvalStatus === 1" type="warning">审批中</el-tag>
              <el-tag v-else-if="form.approvalStatus === 2" type="success">已通过</el-tag>
              <el-tag v-else-if="form.approvalStatus === 3" type="danger">已驳回</el-tag>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </FormDialog>
    <!-- ä»ŽæŠ¥ä»·å•导入(仅审批通过) -->