zhangwencui
2 天以前 f3363b799cafad9fa664bbd54c3429797c8b23c5
src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -96,22 +96,6 @@
                  />
               </el-form-item>
            </el-col>
            <el-col :span="12">
               <el-form-item label="上传附件">
                  <FileUpload
                     :showTip="false"
                     accept="*"
                     :autoUpload="true"
                     :action="action"
                     :headers="{
                Authorization: 'Bearer ' + getToken(),
              }"
                     :limit="10"
                     @success="uploadSuccess"
                     @remove="removeFile"
                  />
               </el-form-item>
            </el-col>
         
         </el-row>
         <el-form-item label="产品信息:"> </el-form-item>
@@ -149,7 +133,7 @@
            />
            <el-table-column label="本次开票数" prop="ticketsNum" width="180">
               <template #default="scope">
                  <el-input-number :step="0.1" :min="0" style="width: 100%"
                  <el-input-number :step="0.1" :min="0" :max="scope.row.tempFutureTickets || 0" style="width: 100%"
                                           :precision="2"
                                           v-model="scope.row.ticketsNum"
                                           @change="invoiceNumBlur(scope.row)"
@@ -205,14 +189,12 @@
import { defineEmits } from 'vue';
import { useModal } from "@/hooks/useModal";
import useFormData from "@/hooks/useFormData";
import FileUpload from "@/components/Upload/FileUpload.vue";
import {
   getPurchaseNoById,
   getInfo,
   addOrUpdateRegistration,
} from "@/api/procurementManagement/invoiceEntry.js";
import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js";
import { getToken } from "@/utils/auth";
import useUserStore from "@/store/modules/user";
import dayjs from "dayjs";
@@ -221,7 +203,6 @@
});
const userStore = useUserStore();
const action = import.meta.env.VITE_APP_BASE_API + "/file/upload";
const formRef = ref();
const { proxy } = getCurrentInstance();
const { form } = useFormData({
@@ -237,7 +218,6 @@
   salesContractNoId: undefined, // 开票日期
   enterDate: dayjs().format("YYYY-MM-DD"),
   productData: [], // 表格
   tempFileIds: [], // 文件
});
const selectedContracts = ref([]); // 存储选中的合同数据
@@ -398,10 +378,11 @@
               result.data.productData.forEach(item => {
                  allProductData.push({
                     ...item,
                     id: contractId, // 明确设置合同ID
                     purchaseLedgerId: contractId, // 添加合同ID用于筛选
                     purchaseLedgerNo: contract.purchaseContractNumber, // 添加采购合同号
                     supplierName: contract.supplierName, // 添加供应商名称
                     projectName: contract.projectName // 添加项目名称
                     // 保留产品本身的id,不覆盖
                  });
               });
            }
@@ -421,23 +402,29 @@
         
         // 设置产品数据,并初始化开票数量和金额
         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;
            // 保存“原始未来票数/金额”(用于校验与计算)
            // 优先使用后端返回的 futureTickets/futureTicketsAmount;没有则回退到 quantity/taxInclusiveTotalPrice
            item.tempFutureTickets = Number(
               item.futureTickets !== undefined ? item.futureTickets : (item.quantity || 0)
            );
            item.tempFutureTicketsAmount = Number(
               item.futureTicketsAmount !== undefined ? item.futureTicketsAmount : (item.taxInclusiveTotalPrice || 0)
            );
            // 新增时:本次开票默认不填(0),避免一打开就把“未来票数”扣成 0
            item.ticketsNum = 0;
            item.ticketsAmount = 0;
            // 页面展示的“未来票数/未来票金额”默认展示原始未来值
            item.futureTickets = item.tempFutureTickets;
            item.futureTicketsAmount = item.tempFutureTicketsAmount;
         });
         
         form.productData = allProductData;
         
         // 计算发票金额:所有产品的含税总价之和
         // 计算发票金额:所有产品的本次开票金额之和(新增默认 0)
         const totalAmount = allProductData.reduce((sum, item) => {
            return sum + (Number(item.taxInclusiveTotalPrice) || 0);
            return sum + (Number(item.ticketsAmount) || 0);
         }, 0);
         form.invoiceAmount = totalAmount.toFixed(2);
         
@@ -476,9 +463,8 @@
      row.ticketsNum = 0;
   }
   if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
      proxy.$modal.msgWarning("本次开票数不得大于未开票数");
      row.ticketsNum = 0;
      return;
      proxy.$modal.msgWarning("本次开票数不能大于未来票数");
      row.ticketsNum = Number(row.tempFutureTickets || 0);
   }
   // 计算本次来票金额
   row.ticketsAmount = (row.ticketsNum * row.taxInclusiveUnitPrice).toFixed(2)
@@ -497,12 +483,19 @@
   // 计算是否超过来票总金额
   if (row.ticketsAmount > row.tempFutureTicketsAmount) {
      proxy.$modal.msgWarning("本次来票金额不得大于未来票金额");
      row.ticketsAmount = 0;
      row.ticketsAmount = Number(row.tempFutureTicketsAmount || 0);
   }
   // 计算本次来票数
   row.ticketsNum = Number(
      (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2)
   );
   // 检查本次开票数是否大于未来票数
   if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
      proxy.$modal.msgWarning("本次开票数不能大于未来票数");
      row.ticketsNum = Number(row.tempFutureTickets || 0);
      // 重新计算本次来票金额
      row.ticketsAmount = (row.ticketsNum * row.taxInclusiveUnitPrice).toFixed(2);
   }
   // 计算未来票数
   row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
   // 计算未来票金额
@@ -539,15 +532,6 @@
   await getTableData(type, selectedRows);
};
const uploadSuccess = (response) => {
   form.tempFileIds.push(response.data.tempId);
   console.log(form);
};
const removeFile = (file) => {
   const { tempId } = file.response.data;
   form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
};
const closeAndRefresh = () => {
   closeModal();
@@ -563,22 +547,21 @@
            const batchData = selectedContracts.value.map(contract => {
               // 筛选出属于当前合同的产品数据
               const contractProductData = form.productData.filter(item =>
                  item.id === contract.id
                  item.purchaseLedgerId === contract.id
               );
               
               // 为每个采购合同创建独立的对象
               return {
                  // 基础表单数据
                  invoiceNumber: form.invoiceNumber,
                  invoiceAmount: form.invoiceAmount,
                  entryDate: form.entryDate,
                  enterDate: form.enterDate,
                  issUerId: form.issUerId, // 录入人id
                  issUer: form.issUer, // 录入人
                  tempFileIds: form.tempFileIds,
                  // 合同实际信息
                  purchaseLedgerId: contract.id, // 使用id作为字段名,值为purchaseLedgerId
               // 基础表单数据
               invoiceNumber: form.invoiceNumber,
               invoiceAmount: form.invoiceAmount,
               entryDate: form.entryDate,
               enterDate: form.enterDate,
               issUerId: form.issUerId, // 录入人id
               issUer: form.issUer, // 录入人
               // 合同实际信息
               purchaseLedgerId: contract.id, // 使用id作为字段名,值为purchaseLedgerId
                  purchaseContractNumber: contract.purchaseContractNumber, // 使用实际的采购合同号
                  salesContractNo: contract.salesContractNo, // 使用实际的销售合同号
                  supplierName: contract.supplierName, // 使用实际的供应商名称
@@ -609,17 +592,16 @@
               // 单个合同提交逻辑 - 以数组格式传递
               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
               // 基础表单数据
               invoiceNumber: form.invoiceNumber,
               invoiceAmount: form.invoiceAmount,
               entryDate: form.entryDate,
               enterDate: form.enterDate,
               issUerId: form.issUerId, // 录入人id
               issUer: form.issUer, // 录入人
               // 合同实际信息
               purchaseLedgerId: singleContract.id, // 使用id作为字段名,值为purchaseLedgerId
                  purchaseContractNumber: singleContract.purchaseContractNumber, // 使用实际的采购合同号
                  salesContractNo: singleContract.salesContractNo, // 使用实际的销售合同号
                  supplierName: singleContract.supplierName, // 使用实际的供应商名称