From 3e45254fc16d356ba83a28dd992ff34f88e9bba9 Mon Sep 17 00:00:00 2001 From: chenhao Date: Mon, 15 Dec 2025 09:27:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(finance):=20=E4=BC=98=E5=8C=96=E5=BA=94?= =?UTF-8?q?=E4=BB=98=E5=8D=95=E4=BB=98=E6=AC=BE=E4=B8=8E=E6=94=B6=E7=A5=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改计算工具函数,确保数值运算精度 - 更新应付单页面字段映射,统一命名规范 - 增加税率输入框并同步到库存信息 - 调整应付单合并支付与收票计划的处理方式 - 完善应付单实体类结构及数据库映射关系 - 优化采购订单关联应付单的生成逻辑 - 引入厂家开票时间字段以完善票据管理流程 --- oms_web/oms_vue/src/utils/calc.js | 6 +- .../finance/payable/components/EditForm.vue | 12 +- .../payable/components/MergePaymentDialog.vue | 61 ++-- .../payable/components/MergeReceiptDialog.vue | 79 +++-- .../src/views/finance/payable/index.vue | 7 +- .../src/views/finance/payment/index.vue | 1 - .../src/views/inventory/inner/index.vue | 5 +- .../outer/components/GenerateDeliveryForm.vue | 11 +- .../controller/OmsPayableBillController.java | 25 +- .../ruoyi/sip/domain/InventoryDelivery.java | 1 + .../com/ruoyi/sip/domain/OmsPayableBill.java | 38 ++- .../java/com/ruoyi/sip/domain/VendorInfo.java | 8 +- .../sip/domain/dto/MergedReceiptDataDto.java | 1 + .../ruoyi/sip/domain/dto/PayableOrderDto.java | 2 + .../domain/dto/PayableOrderReceiptDto.java | 2 + .../sip/mapper/OmsPayableBillMapper.java | 12 +- .../mapper/OmsPayablePaymentDetailMapper.java | 2 + .../mapper/OmsPayablePaymentPlanMapper.java | 4 + .../mapper/OmsPayableTicketDetailMapper.java | 2 + .../mapper/OmsPayableTicketPlanMapper.java | 2 + .../sip/service/IOmsPayableBillService.java | 7 +- .../IOmsPayablePaymentDetailService.java | 2 + .../IOmsPayableTicketDetailService.java | 2 + .../impl/InventoryDeliveryServiceImpl.java | 31 +- .../impl/OmsInventoryInnerServiceImpl.java | 27 +- .../impl/OmsPayableBillServiceImpl.java | 306 +++++++++++++----- .../OmsPayablePaymentDetailServiceImpl.java | 5 + .../OmsPayablePaymentPlanServiceImpl.java | 14 +- .../OmsPayableTicketDetailServiceImpl.java | 5 + .../impl/OmsPayableTicketPlanServiceImpl.java | 14 +- .../mapper/finance/OmsPayableBillMapper.xml | 135 ++++++-- .../finance/OmsPayablePaymentDetailMapper.xml | 14 + .../mapper/inventory/InventoryInfoMapper.xml | 6 +- .../oms/OmsPayablePaymentPlanMapper.xml | 34 ++ .../sip/OmsPayableTicketDetailMapper.xml | 12 + .../mapper/sip/OmsPayableTicketPlanMapper.xml | 9 + 36 files changed, 669 insertions(+), 235 deletions(-) diff --git a/oms_web/oms_vue/src/utils/calc.js b/oms_web/oms_vue/src/utils/calc.js index 37c814de..966785f6 100644 --- a/oms_web/oms_vue/src/utils/calc.js +++ b/oms_web/oms_vue/src/utils/calc.js @@ -19,17 +19,17 @@ export function toFixed(value, dp = DEFAULT_DP) { // 加法 export function add(a, b, dp = DEFAULT_DP) { - return D(a).plus(b).toDecimalPlaces(dp).toNumber() + return D(a).plus(D(b)).toDecimalPlaces(dp).toNumber() } // 减法 export function sub(a, b, dp = DEFAULT_DP) { - return D(a).minus(b).toDecimalPlaces(dp).toNumber() + return D(a).minus(D(b)).toDecimalPlaces(dp).toNumber() } // 乘法 export function mul(a, b, dp = DEFAULT_DP) { - return D(a).times(b).toDecimalPlaces(dp).toNumber() + return D(a).times(D(b)).toDecimalPlaces(dp).toNumber() } // 除法 diff --git a/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue b/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue index 12236830..35d7019c 100644 --- a/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue +++ b/oms_web/oms_vue/src/views/finance/payable/components/EditForm.vue @@ -50,24 +50,24 @@ -
未付款金额: {{ formData.unpaidAmount }}
+
未付款金额: {{ formData.unpaidPaymentAmount }}
-
已付款金额: {{ formData.paidAmount }}
+
已付款金额: {{ formData.paidPaymentAmount }}
-
付款中金额: {{ formData.payingAmount }}
+
付款中金额: {{ this.$calc.sub(this.$calc.sub(formData.totalPriceWithTax,formData.paidPaymentAmount),formData.unpaidPaymentAmount) }}
-
未收票金额: {{ formData.unInvoicedAmount }}
+
未收票金额: {{ formData.unreceivedTicketAmount }}
-
已收票金额: {{ formData.invoicedAmount }}
+
已收票金额: {{ formData.receivedTicketAmount }}
-
收票中金额: {{ formData.invoicingAmount }}
+
收票中金额: {{ this.$calc.sub(this.$calc.sub(formData.totalPriceWithTax,formData.receivedTicketAmount),formData.unreceivedTicketAmount)}}
diff --git a/oms_web/oms_vue/src/views/finance/payable/components/MergePaymentDialog.vue b/oms_web/oms_vue/src/views/finance/payable/components/MergePaymentDialog.vue index 5e1be206..1c6791f9 100644 --- a/oms_web/oms_vue/src/views/finance/payable/components/MergePaymentDialog.vue +++ b/oms_web/oms_vue/src/views/finance/payable/components/MergePaymentDialog.vue @@ -36,11 +36,8 @@ 采购应付单表 - - - + + @@ -192,24 +189,35 @@ export default { this.form.paymentBillType = 'FROM_PAYABLE'; // Default // Initialize payableOrdersWithPlans - this.payableOrdersWithPlans = this.payableOrders.map(order => ({ - ...order, - paymentPlans: order.paymentPlans || [], // Retain existing plans if any, otherwise empty - totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations - unpaidAmount: order.unpaidAmount || 0, - paidAmount: order.paidAmount || 0, // Ensure numeric for calculations - })); + this.payableOrdersWithPlans = this.payableOrders.map(order => { + const paymentPlans = order.paymentPlans ? [...order.paymentPlans] : []; + if (paymentPlans.length === 0 && order.lastPaymentPlanId) { + paymentPlans.push({ + id: order.lastPaymentPlanId, + planAmount: order.planAmount, + planPaymentDate: order.planPaymentDate, + planRate: this.$calc.mul(this.$calc.div(order.planAmount, order.totalPriceWithTax, 4), 100) + }); + } + return { + ...order, + paymentPlans: paymentPlans, // Retain existing plans if any, otherwise empty + totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations + unpaidAmount: order.unpaidAmount || 0, + paidAmount: order.paidAmount || 0, // Ensure numeric for calculations + } + }); }, handleClose() { this.dialogVisible = false; this.resetForm(); }, handleChooseConfirm() { - if (!this.$refs.planSelector || !this.$refs.planSelector.selectedPlan) { - this.$modal.msgError('无法获取计划选择器组件或其选择的计划'); + if (!this.$refs.planSelector) { + this.$modal.msgError('无法获取计划选择器组件'); return; } - const selectedPlans = this.$refs.planSelector.selectedPlan; + const selectedPlans = this.$refs.planSelector.selectedPlan || []; const orderIndex = this.payableOrdersWithPlans.findIndex(o => o.id === this.choosePayable.id); if (orderIndex === -1) { @@ -219,27 +227,11 @@ export default { const currentOrder = this.payableOrdersWithPlans[orderIndex]; - // Ensure the paymentPlans array exists - if (!currentOrder.paymentPlans) { - this.$set(currentOrder, 'paymentPlans', []); - } - - // Add new plans, checking for duplicates by plan ID - let addedCount = 0; - selectedPlans.forEach(newPlan => { - const existingPlan = currentOrder.paymentPlans.find(p => p.id === newPlan.id); - if (!existingPlan) { - currentOrder.paymentPlans.push(newPlan); - addedCount++; - } - }); + // Update the payment plans for the specific order + this.$set(currentOrder, 'paymentPlans', [...selectedPlans]); this.isPaymentPlanSelectorOpen = false; - if (addedCount > 0) { - this.$modal.msgSuccess(`成功补充 ${addedCount} 条付款计划`); - } else { - this.$modal.msgWarning('没有新的付款计划被添加'); - } + this.$modal.msgSuccess(`已更新付款计划选择,共 ${selectedPlans.length} 条`); }, handleConfirm() { // Validate main form fields @@ -283,6 +275,7 @@ export default { // Collect all payable orders with their updated payment plans payableOrders: this.payableOrdersWithPlans.map(order => ({ id: order.id, + taxRate: order.taxRate, payableBillCode: order.payableBillCode, paymentPlans: order.paymentPlans.map(plan => ({ planPaymentDate: plan.planPaymentDate, diff --git a/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue b/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue index 70b48067..3261b345 100644 --- a/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue +++ b/oms_web/oms_vue/src/views/finance/payable/components/MergeReceiptDialog.vue @@ -30,17 +30,24 @@ > + + + + + 采购应付单表 - - - + + @@ -134,6 +141,7 @@ export default { ticketBillType: 'FROM_PAYABLE', // Default to a type, or make it dynamic vendorName: '', ticketTime: null, + vendorTicketTime: null, }, payableOrdersWithPlans: [], // Each order will now have its own ticketPlans array isTicketPlanSelectorOpen: false, @@ -185,31 +193,44 @@ export default { const allSameVendor = this.payableOrders.every(order => order.vendorName === firstVendorName); this.form.vendorName = allSameVendor ? firstVendorName : '多个制造商'; this.form.ticketTime = null; // Reset time + this.form.vendorTicketTime = null; } else { this.form.vendorName = ''; this.form.ticketTime = null; + this.form.vendorTicketTime = null; } this.form.ticketBillType = 'FROM_PAYABLE'; // Default // Initialize payableOrdersWithPlans - this.payableOrdersWithPlans = this.payableOrders.map(order => ({ - ...order, - ticketPlans: order.ticketPlans || [], // Retain existing plans if any, otherwise empty - totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations - unInvoicedAmount: order.unInvoicedAmount || 0, - invoicedAmount: order.invoicedAmount || 0, // Ensure numeric for calculations - })); + this.payableOrdersWithPlans = this.payableOrders.map(order => { + const ticketPlans = order.ticketPlans ? [...order.ticketPlans] : []; + if (ticketPlans.length === 0 && order.lastTicketPlanId) { + ticketPlans.push({ + id: order.lastTicketPlanId, + planAmount: order.planTicketAmount, + planTicketDate: order.planTicketDate, + planRate: this.$calc.mul(this.$calc.div(order.planTicketAmount, order.totalPriceWithTax, 4), 100) + }); + } + return { + ...order, + ticketPlans: ticketPlans, // Retain existing plans if any, otherwise empty + totalPriceWithTax: order.totalPriceWithTax || 0, // Ensure numeric for calculations + unInvoicedAmount: order.unInvoicedAmount || 0, + invoicedAmount: order.invoicedAmount || 0, // Ensure numeric for calculations + } + }); }, handleClose() { this.dialogVisible = false; this.resetForm(); }, handleChooseConfirm() { - if (!this.$refs.planSelector || !this.$refs.planSelector.selectedPlan) { - this.$modal.msgError('无法获取计划选择器组件或其选择的计划'); + if (!this.$refs.planSelector) { + this.$modal.msgError('无法获取计划选择器组件'); return; } - const selectedPlans = this.$refs.planSelector.selectedPlan; + const selectedPlans = this.$refs.planSelector.selectedPlan || []; const orderIndex = this.payableOrdersWithPlans.findIndex(o => o.id === this.choosePayable.id); if (orderIndex === -1) { @@ -219,27 +240,11 @@ export default { const currentOrder = this.payableOrdersWithPlans[orderIndex]; - // Ensure the ticketPlans array exists - if (!currentOrder.ticketPlans) { - this.$set(currentOrder, 'ticketPlans', []); - } - - // Add new plans, checking for duplicates by plan ID - let addedCount = 0; - selectedPlans.forEach(newPlan => { - const existingPlan = currentOrder.ticketPlans.find(p => p.id === newPlan.id); - if (!existingPlan) { - currentOrder.ticketPlans.push(newPlan); - addedCount++; - } - }); + // Update the ticket plans for the specific order + this.$set(currentOrder, 'ticketPlans', [...selectedPlans]); this.isTicketPlanSelectorOpen = false; - if (addedCount > 0) { - this.$modal.msgSuccess(`成功补充 ${addedCount} 条收票计划`); - } else { - this.$modal.msgWarning('没有新的收票计划被添加'); - } + this.$modal.msgSuccess(`已更新收票计划选择,共 ${selectedPlans.length} 条`); }, handleConfirm() { // Validate main form fields @@ -251,6 +256,10 @@ export default { this.$modal.msgError('请选择预计收票时间'); return; } + if (!this.form.vendorTicketTime) { + this.$modal.msgError('请选择厂家开票时间'); + return; + } // Validate each payable order's ticket plans for (const order of this.payableOrdersWithPlans) { @@ -280,6 +289,7 @@ export default { const mergedReceiptData = { ticketBillType: this.form.ticketBillType, ticketTime: this.form.ticketTime, + vendorTicketTime: this.form.vendorTicketTime, // Collect all payable orders with their updated ticket plans payableOrders: this.payableOrdersWithPlans.map(order => ({ id: order.id, @@ -307,6 +317,7 @@ export default { ticketBillType: 'FROM_PAYABLE', vendorName: '', ticketTime: null, + vendorTicketTime: null, }; this.payableOrdersWithPlans = []; diff --git a/oms_web/oms_vue/src/views/finance/payable/index.vue b/oms_web/oms_vue/src/views/finance/payable/index.vue index 0b1c85ed..fa45f006 100644 --- a/oms_web/oms_vue/src/views/finance/payable/index.vue +++ b/oms_web/oms_vue/src/views/finance/payable/index.vue @@ -128,8 +128,8 @@ - - + + @@ -167,7 +167,8 @@ - + +