From e7ed169f94add4a3c6b5287fe6cc6fd19755a66d Mon Sep 17 00:00:00 2001 From: chenhao Date: Thu, 18 Dec 2025 17:21:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(finance):=20=E6=B7=BB=E5=8A=A0=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E5=BA=94=E4=BB=98=E6=94=B6=E7=A5=A8=E6=A0=B8=E9=94=80?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=8A=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 EditForm.vue 中为回执单和发票图添加预览功能,支持 PDF 和图片格式 - 增加 PDF 预览对话框和图片预览对话框组件 - 优化附件显示逻辑,当无附件时展示 '-' 占位符 - 禁止订单审批弹窗点击遮罩关闭,防止误操作 - 调整应付单列表项目名称列宽及操作列宽度,提升界面布局合理性 - 修改生成收票单按钮显示条件,确保仅在未收票金额大于 0 时可见 - 移除付款单中的删除按钮,替换为生成收票单按钮 - 放宽发起付款按钮的显示限制,不再限定付款单类型 - 新增 IOmsPayableTicketWriteOffService 接口及其实现类,支持收票核销业务 - 添加 OmsPayableTicketWriteOff 实体类及相关 Mapper、Controller 层代码 - 实现用户手动收票核销与系统自动收票核销逻辑 - 为 MergePaymentDialog 添加禁止点击遮罩关闭属性,增强用户体验 - 在 IOmsPayablePaymentDetailService 和 IOmsPayableTicketDetailService 中新增批量更新方法 - 补充 MyBatis XML 映射文件中的 updateBatch SQL 语句 - 完善收票核销单据编号生成规则,确保唯一性和可读性 - 增强核销删除功能,实现关联数据的反核销处理和金额恢复逻辑 --- .../oms_vue/src/views/approve/order/index.vue | 1 + .../finance/payable/components/EditForm.vue | 53 ++- .../payable/components/MergePaymentDialog.vue | 2 +- .../src/views/finance/payable/index.vue | 19 +- .../src/views/finance/payment/index.vue | 2 +- .../OmsPayableTicketWriteOffController.java | 124 +++++++ .../sip/domain/OmsPayableTicketWriteOff.java | 101 ++++++ .../sip/dto/WriteOffTicketRequestDto.java | 42 +++ .../mapper/OmsPayablePaymentDetailMapper.java | 2 + .../mapper/OmsPayableTicketDetailMapper.java | 3 + .../OmsPayableTicketWriteOffMapper.java | 77 ++++ .../IOmsPayablePaymentDetailService.java | 3 + .../IOmsPayableTicketDetailService.java | 2 + .../IOmsPayableTicketWriteOffService.java | 83 +++++ .../OmsPayablePaymentDetailServiceImpl.java | 5 + .../OmsPayableTicketDetailServiceImpl.java | 5 + .../OmsPayableTicketWriteOffServiceImpl.java | 332 ++++++++++++++++++ .../impl/OmsPayableWriteOffServiceImpl.java | 13 +- .../finance/OmsPayablePaymentDetailMapper.xml | 9 + .../mapper/finance/OmsPaymentBillMapper.xml | 2 +- .../sip/OmsPayableTicketDetailMapper.xml | 11 + 21 files changed, 871 insertions(+), 20 deletions(-) create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableTicketWriteOffController.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableTicketWriteOff.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffTicketRequestDto.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableTicketWriteOffMapper.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableTicketWriteOffService.java create mode 100644 ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableTicketWriteOffServiceImpl.java diff --git a/oms_web/oms_vue/src/views/approve/order/index.vue b/oms_web/oms_vue/src/views/approve/order/index.vue index 635c5f8d..7fdcbc59 100644 --- a/oms_web/oms_vue/src/views/approve/order/index.vue +++ b/oms_web/oms_vue/src/views/approve/order/index.vue @@ -106,6 +106,7 @@ @@ -143,8 +146,11 @@ @@ -157,6 +163,14 @@ + + + + + + + + @@ -171,6 +185,7 @@ import PaymentPlan from './PaymentPlan.vue'; import ReceivingTicketPlan from './ReceivingTicketPlan.vue'; import { getPayable } from "@/api/finance/payable"; import ReceiptPlan from "@/views/finance/receivable/components/ReceiptPlan.vue"; +import request from '@/utils/request'; export default { name: "EditForm", @@ -194,7 +209,11 @@ export default { return { internalVisible: this.visible, // Local copy of the visible prop activeTab: 'details', - formData: {} + formData: {}, + pdfPreviewVisible: false, + currentPdfUrl: '', + imagePreviewVisible: false, + currentImageUrl: '' }; }, watch: { @@ -220,6 +239,30 @@ export default { this.formData = res.data; }); }, + isPdf(filePath) { + return filePath && filePath.toLowerCase().endsWith('.pdf'); + }, + getImageUrl(resource) { + return process.env.VUE_APP_BASE_API + "/common/download/resource?resource=" + resource; + }, + handlePreview(attachment) { + if (!attachment) return; + if (this.isPdf(attachment.filePath)) { + request({ + url: '/common/download/resource', + method: 'get', + params: { resource: attachment.filePath }, + responseType: 'blob' + }).then(res => { + const blob = new Blob([res.data], { type: 'application/pdf' }); + this.currentPdfUrl = URL.createObjectURL(blob); + this.pdfPreviewVisible = true; + }); + } else { + this.currentImageUrl = this.getImageUrl(attachment.filePath); + this.imagePreviewVisible = true; + } + }, downloadFile(attachment){ if (attachment){ const link = document.createElement('a'); 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 1c6791f9..2d46cb73 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 @@ -1,5 +1,5 @@