| | |
| | | > |
| | | <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="自动填充" |
| | |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | |
| | | |
| | | </el-row> |
| | | <el-form-item label="产品信息:"> </el-form-item> |
| | | <el-table |
| | |
| | | /> |
| | | <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" |
| | |
| | | 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" |
| | |
| | | const formRef = ref(); |
| | | const { proxy } = getCurrentInstance(); |
| | | const { form } = useFormData({ |
| | | purchaseLedgerNo: undefined, // 采购合同号 |
| | | salesContractNo: undefined, // 销售合同号 |
| | | purchaseLedgerNo: undefined, // 采购单号 |
| | | salesContractNo: undefined, // 销售单号 |
| | | supplierName: undefined, // 供应商名称 |
| | | projectName: undefined, // 项目名称 |
| | | invoiceNumber: undefined, // 发票号 |
| | |
| | | const isSameSupplier = selectedRows.every(row => |
| | | row.supplierName === firstRow.supplierName |
| | | ); |
| | | |
| | | |
| | | if (!isSameSupplier) { |
| | | proxy.$modal.msgError("请选择相同供应商名称的合同"); |
| | | return; |
| | | } |
| | | |
| | | // 允许不同的采购合同号批量处理,无需检查重复 |
| | | |
| | | |
| | | // 允许不同的采购单号批量处理,无需检查重复 |
| | | |
| | | // 清空表单数据 |
| | | Object.keys(form).forEach(key => { |
| | | if (key !== 'productData') { |
| | |
| | | } |
| | | }); |
| | | form.productData = []; |
| | | |
| | | |
| | | // 加载所有选中合同的产品数据 |
| | | const promises = selectedRows.map(row => |
| | | getInfo({ id: row.id }) |
| | | ); |
| | | |
| | | |
| | | Promise.all(promises).then(results => { |
| | | // 合并所有合同的产品数据,并为每个产品添加对应的合同信息 |
| | | const allProductData = []; |
| | |
| | | allProductData.push({ |
| | | ...item, |
| | | purchaseLedgerId: contractId, // 添加合同ID用于筛选 |
| | | purchaseLedgerNo: contract.purchaseContractNumber, // 添加采购合同号 |
| | | purchaseLedgerNo: contract.purchaseContractNumber, // 添加采购单号 |
| | | supplierName: contract.supplierName, // 添加供应商名称 |
| | | projectName: contract.projectName // 添加项目名称 |
| | | // 保留产品本身的id,不覆盖 |
| | |
| | | }); |
| | | } |
| | | }); |
| | | |
| | | // 设置表单数据(使用第一个合同的基本信息,采购合同号留空) |
| | | form.purchaseLedgerNo = ""; // 采购合同号留空,因为会在产品表格中分别显示 |
| | | |
| | | // 设置表单数据(使用第一个合同的基本信息,采购单号留空) |
| | | form.purchaseLedgerNo = ""; // 采购单号留空,因为会在产品表格中分别显示 |
| | | form.invoiceNumber = ""; |
| | | form.entryDate = dayjs().format("YYYY-MM-DD"); |
| | | form.enterDate = dayjs().format("YYYY-MM-DD"); |
| | |
| | | // 保留录入人信息 |
| | | form.issUerId = userStore.id; |
| | | form.issUer = userStore.nickName; |
| | | |
| | | |
| | | // 设置产品数据,并初始化开票数量和金额 |
| | | allProductData.forEach(item => { |
| | | // 保存"原始未来票数/金额"(用于校验与计算) |
| | |
| | | ); |
| | | } |
| | | }); |
| | | |
| | | |
| | | 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; |
| | | }); |
| | |
| | | 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; |
| | |
| | | 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 || ""; |
| | |
| | | item.tempFutureTicketsAmount = Number( |
| | | item.futureTicketsAmount !== undefined ? item.futureTicketsAmount : (item.taxInclusiveTotalPrice || 0) |
| | | ); |
| | | |
| | | |
| | | // 确保每个产品都有合同号,用于显示在"所属合同"列 |
| | | if (!item.purchaseLedgerNo) { |
| | | item.purchaseLedgerNo = contractNumber; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | form.productData = data.productData || []; |
| | | |
| | | |
| | | // 编辑模式下,根据产品数据中的本次开票金额自动计算发票金额 |
| | | calculateinvoiceAmount(); |
| | | } |
| | |
| | | // 判断产品是否可以继续来票操作:如果未来票数和未来票金额都为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; |
| | | }; |
| | |
| | | if (!modalOptions.value || typeof modalOptions.value !== 'object') { |
| | | modalOptions.value = {}; |
| | | } |
| | | |
| | | |
| | | // 根据操作类型和选中数据设置标题 |
| | | if (Array.isArray(selectedRows) && selectedRows.length > 1) { |
| | | // 批量操作 |
| | |
| | | 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); |
| | | }; |
| | | |
| | |
| | | const contractProductData = form.productData.filter(item => |
| | | item.purchaseLedgerId === contract.id |
| | | ); |
| | | |
| | | |
| | | // 为每个采购合同创建独立的对象 |
| | | return { |
| | | // 基础表单数据 |
| | |
| | | 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) => { |
| | |
| | | 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; |