src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -1,5 +1,5 @@
<template>
  <el-dialog :title="modalOptions.title" v-model="visible" width="70%">
   <el-dialog :title="modalOptions.title" v-model="visible" width="70%" draggable>
    <el-form
      ref="formRef"
      :model="form"
@@ -14,6 +14,16 @@
          </el-form-item>
        </el-col>
        <el-col :span="12">
               <el-form-item label="销售合同号:" prop="salesContractNo">
                  <el-input
                     v-model="form.salesContractNo"
                     placeholder="自动填充"
                     clearable
                     disabled
                  />
               </el-form-item>
            </el-col>
            <el-col :span="12">
          <el-form-item label="供应商名称:" prop="supplierName">
            <el-input
              v-model="form.supplierName"
@@ -23,6 +33,16 @@
            />
          </el-form-item>
        </el-col>
<!--            <el-col :span="12">-->
<!--               <el-form-item label="项目名称:" prop="projectName">-->
<!--                  <el-input-->
<!--                     v-model="form.projectName"-->
<!--                     placeholder="自动填充"-->
<!--                     clearable-->
<!--                     disabled-->
<!--                  />-->
<!--               </el-form-item>-->
<!--            </el-col>-->
        <el-col :span="12">
          <el-form-item label="发票号:" prop="invoiceNumber">
            <el-input
@@ -148,6 +168,26 @@
            />
          </template>
        </el-table-column>
            <el-table-column
               label="未来票数"
               prop="futureTickets"
               :formatter="formattedNumber"
            />
            <el-table-column
               label="本次来票金额(元)"
               prop="ticketsAmount"
               :formatter="formattedNumber"
            />
            <el-table-column
               label="未来票数"
               prop="futureTickets"
               :formatter="formattedNumber"
            />
            <el-table-column
               label="未来票金额(元)"
               prop="futureTicketsAmount"
               :formatter="formattedNumber"
            />
      </el-table>
    </el-form>
    <template #footer>
@@ -187,6 +227,7 @@
  purchaseLedgerNo: undefined, // 采购合同号
  salesContractNo: undefined, // 销售合同号
  supplierName: undefined, // 供应商名称
   projectName: undefined, // 项目名称
  invoiceNumber: undefined, // 发票号
  invoiceAmount: undefined, // 发票金额(元)
  issUerId: userStore.id, // 录入人
@@ -359,6 +400,7 @@
              id: contractId, // 明确设置合同ID
              purchaseLedgerNo: contract.purchaseContractNumber, // 添加采购合同号
              supplierName: contract.supplierName, // 添加供应商名称
                     projectName: contract.projectName // 添加项目名称
            });
          });
        }
@@ -366,17 +408,37 @@
      
      // 设置表单数据(使用第一个合同的基本信息,采购合同号留空)
      form.purchaseLedgerNo = ""; // 采购合同号留空,因为会在产品表格中分别显示
      form.invoiceAmount = 0;
      form.invoiceNumber = "";
      form.entryDate = dayjs().format("YYYY-MM-DD");
      form.enterDate = dayjs().format("YYYY-MM-DD");
      form.salesContractNo = results[0].data.salesContractNo;
         form.projectName = results[0].data.projectName;
      form.supplierName = results[0].data.supplierName;
      // 保留录入人信息
      form.issUerId = userStore.id;
      form.issUer = userStore.nickName;
      
         // 设置产品数据,并初始化开票数量和金额
         allProductData.forEach(item => {
            // 本次开票数默认为总数量
            item.ticketsNum = Number(item.quantity || 0);
            // 本次开票金额默认为含税总价
            item.ticketsAmount = Number(item.taxInclusiveTotalPrice || 0);
            // 保存原始未来票数和金额(用于计算)
            item.tempFutureTickets = Number(item.quantity || 0);
            item.tempFutureTicketsAmount = Number(item.taxInclusiveTotalPrice || 0);
            // 未来票数和金额初始为0(因为全部开票)
            item.futureTickets = 0;
            item.futureTicketsAmount = 0;
         });
      form.productData = allProductData;
         // 计算发票金额:所有产品的含税总价之和
         const totalAmount = allProductData.reduce((sum, item) => {
            return sum + (Number(item.taxInclusiveTotalPrice) || 0);
         }, 0);
         form.invoiceAmount = totalAmount.toFixed(2);
      
      // 存储选中的合同数据
      selectedContracts.value = selectedRows;
@@ -464,7 +526,7 @@
  if (Array.isArray(selectedRows) && selectedRows.length > 1) {
    modalOptions.title = `批量新增 (${selectedRows.length}条)`;
  } else {
    modalOptions.title = type == "add" ? "新增" : "编辑";
      modalOptions.title = type === "add" ? "新增" : "编辑";
  }
  
  // 如果是单个操作,获取id
@@ -494,8 +556,10 @@
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      // 统一将所有合同的数据放在一个数组里,单个和批量都使用数组格式
      const submitData = selectedContracts.value.map(contract => {
         // 如果是批量操作,将所有合同的数据放在一个数组里,只调用一次接口
         if (selectedContracts.value.length > 1) {
            // 创建包含所有合同数据的数组
            const batchData = selectedContracts.value.map(contract => {
        // 筛选出属于当前合同的产品数据
        const contractProductData = form.productData.filter(item => 
          item.id === contract.id
@@ -517,28 +581,69 @@
          purchaseContractNumber: contract.purchaseContractNumber, // 使用实际的采购合同号
          salesContractNo: contract.salesContractNo, // 使用实际的销售合同号
          supplierName: contract.supplierName, // 使用实际的供应商名称
                  projectName: contract.projectName, // 使用实际的项目名称
          
          // 产品数据
          productData: proxy.HaveJson(contractProductData),
          
          // 批量标识
          isBatch: selectedContracts.value.length > 1,
                  isBatch: true,
          type: 4
        };
      });
      
      // 统一调用接口,传递数组格式的数据
            // 只调用一次接口,传递包含所有合同数据的数组
      modalLoading.value = true;
      addOrUpdateRegistration(submitData).then((res) => {
            addOrUpdateRegistration(batchData).then((res) => {
        modalLoading.value = false;
        if (res.code === 200) {
          proxy.$modal.msgSuccess(selectedContracts.value.length > 1 ? "批量登记成功" : "登记成功");
                  proxy.$modal.msgSuccess("批量登记成功");
          closeAndRefresh();
        }
      }).catch(() => {
        modalLoading.value = false;
        proxy.$modal.msgError(selectedContracts.value.length > 1 ? "批量登记失败" : "登记失败");
               proxy.$modal.msgError("批量登记失败");
      });
         } else {
               // 单个合同提交逻辑 - 以数组格式传递
               const singleContract = selectedContracts.value[0];
               const singleFormArray = [{
                  // 基础表单数据
                  invoiceNumber: form.invoiceNumber,
                  invoiceAmount: form.invoiceAmount,
                  entryDate: form.entryDate,
                  enterDate: form.enterDate,
                  issUerId: form.issUerId, // 录入人id
                  issUer: form.issUer, // 录入人
                  tempFileIds: form.tempFileIds,
                  // 合同实际信息
                  purchaseLedgerId: singleContract.id, // 使用id作为字段名,值为purchaseLedgerId
                  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;
                  if (res.code === 200) {
                     proxy.$modal.msgSuccess("登记成功");
                     closeAndRefresh();
                  }
               }).catch(() => {
                  modalLoading.value = false;
                  proxy.$modal.msgError("登记失败");
               });
            }
    }
  });
};