buhuazhen
2 天以前 306660c86f86cc92a725db3cc1c2f324cf6eaf96
src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -9,12 +9,12 @@
      >
         <el-row :gutter="30">
            <el-col :span="12">
               <el-form-item label="采购合同号:" prop="purchaseLedgerNo">
               <el-form-item label="采购单号:" prop="purchaseLedgerNo">
                  <el-input v-model="form.purchaseLedgerNo" disabled placeholder="多合同批量处理(具体合同号见产品列表)" />
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="销售合同号:" prop="salesContractNo">
               <el-form-item label="销售单号:" prop="salesContractNo">
                  <el-input
                     v-model="form.salesContractNo"
                     placeholder="自动填充"
@@ -96,7 +96,7 @@
                  />
               </el-form-item>
            </el-col>
         </el-row>
         <el-form-item label="产品信息:"> </el-form-item>
         <el-table
@@ -133,10 +133,10 @@
            />
            <el-table-column label="本次开票数" prop="ticketsNum" width="180">
               <template #default="scope">
                  <el-input-number
                     :step="0.1"
                     :min="0"
                     :max="scope.row.tempFutureTickets || 0"
                  <el-input-number
                     :step="0.1"
                     :min="0"
                     :max="scope.row.tempFutureTickets || 0"
                     style="width: 100%"
                     :precision="2"
                     v-model="scope.row.ticketsNum"
@@ -151,9 +151,9 @@
               width="180"
            >
               <template #default="scope">
                  <el-input-number
                     :step="0.01"
                     :min="0"
                  <el-input-number
                     :step="0.01"
                     :min="0"
                     style="width: 100%"
                     :precision="2"
                     v-model="scope.row.ticketsAmount"
@@ -215,8 +215,8 @@
const formRef = ref();
const { proxy } = getCurrentInstance();
const { form } = useFormData({
   purchaseLedgerNo: undefined, // 采购合同号
   salesContractNo: undefined, // 销售合同号
   purchaseLedgerNo: undefined, // 采购单号
   salesContractNo: undefined, // 销售单号
   supplierName: undefined, // 供应商名称
   projectName: undefined, // 项目名称
   invoiceNumber: undefined, // 发票号
@@ -356,14 +356,14 @@
      const isSameSupplier = selectedRows.every(row =>
         row.supplierName === firstRow.supplierName
      );
      if (!isSameSupplier) {
         proxy.$modal.msgError("请选择相同供应商名称的合同");
         return;
      }
      // 允许不同的采购合同号批量处理,无需检查重复
      // 允许不同的采购单号批量处理,无需检查重复
      // 清空表单数据
      Object.keys(form).forEach(key => {
         if (key !== 'productData') {
@@ -371,12 +371,12 @@
         }
      });
      form.productData = [];
      // 加载所有选中合同的产品数据
      const promises = selectedRows.map(row =>
         getInfo({ id: row.id })
      );
      Promise.all(promises).then(results => {
         // 合并所有合同的产品数据,并为每个产品添加对应的合同信息
         const allProductData = [];
@@ -388,7 +388,7 @@
                  allProductData.push({
                     ...item,
                     purchaseLedgerId: contractId, // 添加合同ID用于筛选
                     purchaseLedgerNo: contract.purchaseContractNumber, // 添加采购合同号
                     purchaseLedgerNo: contract.purchaseContractNumber, // 添加采购单号
                     supplierName: contract.supplierName, // 添加供应商名称
                     projectName: contract.projectName // 添加项目名称
                     // 保留产品本身的id,不覆盖
@@ -396,9 +396,9 @@
               });
            }
         });
         // 设置表单数据(使用第一个合同的基本信息,采购合同号留空)
         form.purchaseLedgerNo = ""; // 采购合同号留空,因为会在产品表格中分别显示
         // 设置表单数据(使用第一个合同的基本信息,采购单号留空)
         form.purchaseLedgerNo = ""; // 采购单号留空,因为会在产品表格中分别显示
         form.invoiceNumber = "";
         form.entryDate = dayjs().format("YYYY-MM-DD");
         form.enterDate = dayjs().format("YYYY-MM-DD");
@@ -408,7 +408,7 @@
         // 保留录入人信息
         form.issUerId = userStore.id;
         form.issUer = userStore.nickName;
         // 设置产品数据,并初始化开票数量和金额
         allProductData.forEach(item => {
            // 保存"原始未来票数/金额"(用于校验与计算)
@@ -438,15 +438,15 @@
               );
            }
         });
         form.productData = allProductData;
         // 计算发票金额:所有产品的本次开票金额之和(新增默认 0)
         const totalAmount = allProductData.reduce((sum, item) => {
            return sum + (Number(item.ticketsAmount) || 0);
         }, 0);
         form.invoiceAmount = Number(totalAmount.toFixed(2));
         // 存储选中的合同数据
         selectedContracts.value = selectedRows;
      });
@@ -455,7 +455,7 @@
      const response = await getPurchaseById({ id, type: 2 });
      // 兼容不同的返回格式:可能是 { code, data } 或直接返回数据
      const data = response.data || response;
      // 兼容不同的字段名:purchaseContractNumber 或 purchaseLedgerNo
      form.purchaseLedgerNo = data.purchaseContractNumber || data.purchaseLedgerNo || "";
      form.invoiceAmount = data.invoiceAmount;
@@ -465,7 +465,7 @@
      form.supplierName = data.supplierName;
      form.entryDate = data.entryDate;
      form.enterDate = data.enterDate || dayjs().format("YYYY-MM-DD");
      // 编辑时也需要初始化产品数据的 tempFutureTickets 和 tempFutureTicketsAmount
      // 同时为每个产品添加合同号等信息
      const contractNumber = data.purchaseContractNumber || data.purchaseLedgerNo || "";
@@ -479,16 +479,16 @@
            item.tempFutureTicketsAmount = Number(
               item.futureTicketsAmount !== undefined ? item.futureTicketsAmount : (item.taxInclusiveTotalPrice || 0)
            );
            // 确保每个产品都有合同号,用于显示在"所属合同"列
            if (!item.purchaseLedgerNo) {
               item.purchaseLedgerNo = contractNumber;
            }
         });
      }
      form.productData = data.productData || [];
      // 编辑模式下,根据产品数据中的本次开票金额自动计算发票金额
      calculateinvoiceAmount();
   }
@@ -565,15 +565,15 @@
// 判断产品是否可以继续来票操作:如果未来票数和未来票金额都为0或小于等于0,则禁用
const isProductDisabled = (row) => {
   // 优先使用 tempFutureTickets(原始未来票数),如果没有则使用 futureTickets
   const futureTickets = Number(row.tempFutureTickets !== undefined
      ? row.tempFutureTickets
   const futureTickets = Number(row.tempFutureTickets !== undefined
      ? row.tempFutureTickets
      : (row.futureTickets !== undefined ? row.futureTickets : 0));
   // 优先使用 tempFutureTicketsAmount(原始未来票金额),如果没有则使用 futureTicketsAmount
   const futureAmount = Number(row.tempFutureTicketsAmount !== undefined
      ? row.tempFutureTicketsAmount
   const futureAmount = Number(row.tempFutureTicketsAmount !== undefined
      ? row.tempFutureTicketsAmount
      : (row.futureTicketsAmount !== undefined ? row.futureTicketsAmount : 0));
   // 只有当未来票数和未来票金额都为0或小于等于0时,才禁用
   return futureTickets <= 0 && futureAmount <= 0;
};
@@ -583,7 +583,7 @@
   if (!modalOptions.value || typeof modalOptions.value !== 'object') {
      modalOptions.value = {};
   }
   // 根据操作类型和选中数据设置标题
   if (Array.isArray(selectedRows) && selectedRows.length > 1) {
      // 批量操作
@@ -598,15 +598,15 @@
         modalOptions.value.title = "来票登记"; // 默认标题
      }
   }
   visible.value = true;
   // 如果是单个操作,获取id
   if (!Array.isArray(selectedRows) || selectedRows.length === 1) {
      const idValue = Array.isArray(selectedRows) ? selectedRows[0].id : selectedRows;
      id.value = idValue;
   }
   await getTableData(type, selectedRows);
};
@@ -627,7 +627,7 @@
               const contractProductData = form.productData.filter(item =>
                  item.purchaseLedgerId === contract.id
               );
               // 为每个采购合同创建独立的对象
               return {
               // 基础表单数据
@@ -637,23 +637,23 @@
               enterDate: form.enterDate,
               issUerId: form.issUerId, // 录入人id
               issUer: form.issUer, // 录入人
               // 合同实际信息
               purchaseLedgerId: contract.id, // 使用id作为字段名,值为purchaseLedgerId
                  purchaseContractNumber: contract.purchaseContractNumber, // 使用实际的采购合同号
                  salesContractNo: contract.salesContractNo, // 使用实际的销售合同号
                  purchaseContractNumber: contract.purchaseContractNumber, // 使用实际的采购单号
                  salesContractNo: contract.salesContractNo, // 使用实际的销售单号
                  supplierName: contract.supplierName, // 使用实际的供应商名称
                  projectName: contract.projectName, // 使用实际的项目名称
                  // 产品数据
                  productData: proxy.HaveJson(contractProductData),
                  // 批量标识
                  isBatch: true,
                  type: 4
               };
            });
            // 只调用一次接口,传递包含所有合同数据的数组
            modalLoading.value = true;
            addOrUpdateRegistration(batchData).then((res) => {
@@ -677,22 +677,22 @@
               enterDate: form.enterDate,
               issUerId: form.issUerId, // 录入人id
               issUer: form.issUer, // 录入人
               // 合同实际信息
               purchaseLedgerId: singleContract.id, // 使用id作为字段名,值为purchaseLedgerId
                  purchaseContractNumber: singleContract.purchaseContractNumber, // 使用实际的采购合同号
                  salesContractNo: singleContract.salesContractNo, // 使用实际的销售合同号
                  purchaseContractNumber: singleContract.purchaseContractNumber, // 使用实际的采购单号
                  salesContractNo: singleContract.salesContractNo, // 使用实际的销售单号
                  supplierName: singleContract.supplierName, // 使用实际的供应商名称
                  projectName: singleContract.projectName, // 使用实际的项目名称
                  // 产品数据
                  productData: proxy.HaveJson(form.productData),
                  // 批量标识
                  isBatch: false,
                  type: 4
               }];
               modalLoading.value = true;
               addOrUpdateRegistration(singleFormArray).then((res) => {
                  modalLoading.value = false;