From 1111d285c5ac62cb63d342ef9bbb27a9776a4c7b Mon Sep 17 00:00:00 2001 From: chenhao Date: Fri, 19 Dec 2025 16:40:17 +0800 Subject: [PATCH] =?UTF-8?q?feat(finance):=20=E6=96=B0=E5=A2=9E=E6=94=B6?= =?UTF-8?q?=E6=AC=BE=E7=94=B3=E8=AF=B7=E4=BB=98=E6=AC=BE=E4=B8=8E=E9=80=80?= =?UTF-8?q?=E6=AC=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增申请付款对话框组件,支持文件上传与预览 - 新增申请退款对话框组件,用于处理退款请求 - 修改收款详情抽屉,增加附件预览与下载功能 - 优化付款单编辑表单,统一文件预览组件 - 在收款管理页面添加申请付款与退款操作按钮 - 后端新增收款申请、退款及附件上传接口 - 数据库映射文件更新,增加原始账单ID字段 - 实现收款单据服务层逻辑,包括退款状态管理 - 增加全局文件预览组件引用与相关方法 - 更新权限控制与业务流程处理逻辑 --- oms_web/oms_vue/src/api/finance/receive.js | 21 ++ .../finance/payable/components/EditForm.vue | 50 +-- .../receive/components/ApplyPaymentDialog.vue | 298 ++++++++++++++++++ .../receive/components/ApplyRefundDialog.vue | 152 +++++++++ .../receive/components/DetailDrawer.vue | 26 +- .../receive/components/ReceiveDialog.vue | 40 +-- .../src/views/finance/receive/index.vue | 49 ++- .../controller/OmsReceiptBillController.java | 60 ++++ .../com/ruoyi/sip/domain/OmsReceiptBill.java | 21 ++ .../OmsReceivableReceiptDetailMapper.java | 2 + .../sip/service/IOmsReceiptBillService.java | 9 + .../IOmsReceivableReceiptDetailService.java | 2 + .../impl/OmsReceiptBillServiceImpl.java | 160 +++++++++- ...OmsReceivableReceiptDetailServiceImpl.java | 27 ++ .../OmsReceiptBill/OmsReceiptBillMapper.xml | 1 + .../sip/OmsReceivableReceiptDetailMapper.xml | 13 + 16 files changed, 844 insertions(+), 87 deletions(-) create mode 100644 oms_web/oms_vue/src/views/finance/receive/components/ApplyPaymentDialog.vue create mode 100644 oms_web/oms_vue/src/views/finance/receive/components/ApplyRefundDialog.vue diff --git a/oms_web/oms_vue/src/api/finance/receive.js b/oms_web/oms_vue/src/api/finance/receive.js index d87a193e..6b1e2029 100644 --- a/oms_web/oms_vue/src/api/finance/receive.js +++ b/oms_web/oms_vue/src/api/finance/receive.js @@ -73,3 +73,24 @@ export function addReceipt(data) { needLoading: true }) } +export function applyReceipt(data) { + return request({ + url: '/finance/receipt/applyReceipt', + method: 'post', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + data: data, + needLoading: true + }) +} + +// 申请退款 +export function submitRefund(data) { + return request({ + url: '/finance/receipt/applyRefund', + method: 'post', + data: data, + needLoading: true + }) +} 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 71572b85..176b6811 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 @@ -164,13 +164,7 @@ - - - - - - - + @@ -185,7 +179,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'; +import GlobalFilePreview from '@/components/GlobalFilePreview'; export default { name: "EditForm", @@ -193,7 +187,8 @@ export default { components: { ReceiptPlan, PaymentPlan, - ReceivingTicketPlan + ReceivingTicketPlan, + GlobalFilePreview }, props: { visible: { @@ -210,10 +205,6 @@ export default { internalVisible: this.visible, // Local copy of the visible prop activeTab: 'details', formData: {}, - pdfPreviewVisible: false, - currentPdfUrl: '', - imagePreviewVisible: false, - currentImageUrl: '' }; }, watch: { @@ -239,40 +230,11 @@ 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; - } + this.$refs.filePreview.handlePreview(attachment); }, downloadFile(attachment){ - if (attachment){ - const link = document.createElement('a'); - link.href = process.env.VUE_APP_BASE_API + "/common/download/resource?resource=" +attachment.filePath; - link.download = attachment.fileName || 'receipt'; - link.style.display = 'none'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } + this.$refs.filePreview.downloadFile(attachment); }, getSummaries(param) { const { columns, data } = param; diff --git a/oms_web/oms_vue/src/views/finance/receive/components/ApplyPaymentDialog.vue b/oms_web/oms_vue/src/views/finance/receive/components/ApplyPaymentDialog.vue new file mode 100644 index 00000000..a117418e --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receive/components/ApplyPaymentDialog.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/finance/receive/components/ApplyRefundDialog.vue b/oms_web/oms_vue/src/views/finance/receive/components/ApplyRefundDialog.vue new file mode 100644 index 00000000..612dcf74 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receive/components/ApplyRefundDialog.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/finance/receive/components/DetailDrawer.vue b/oms_web/oms_vue/src/views/finance/receive/components/DetailDrawer.vue index 69e2a5e7..73080e32 100644 --- a/oms_web/oms_vue/src/views/finance/receive/components/DetailDrawer.vue +++ b/oms_web/oms_vue/src/views/finance/receive/components/DetailDrawer.vue @@ -43,7 +43,12 @@
收款图/回执单: - + + 预览 + 下载 + + -
@@ -56,7 +61,7 @@
上传人姓名: - + {{ detail.attachment && detail.attachment.createByName || '-' }}
@@ -108,13 +113,20 @@ + + diff --git a/oms_web/oms_vue/src/views/finance/receive/components/ReceiveDialog.vue b/oms_web/oms_vue/src/views/finance/receive/components/ReceiveDialog.vue index 0547f328..083c7401 100644 --- a/oms_web/oms_vue/src/views/finance/receive/components/ReceiveDialog.vue +++ b/oms_web/oms_vue/src/views/finance/receive/components/ReceiveDialog.vue @@ -19,8 +19,8 @@
- 票据类型 - + 付款方式 +
{{ titleText }} @@ -53,7 +53,7 @@
收款总额 - {{ receiptData.totalAmount }} + {{ receiptData.totalPriceWithTax }}
备注 @@ -93,15 +93,8 @@ - - - - + +
@@ -119,8 +112,11 @@
支持上传PNG、JPG、PDF文件格式
- - {{ receiptData.totalAmount }} + + {{ receiptData.totalPriceWithTax }} + + + null, + default: () => {}, }, - dicts: { - type: Object, - default: () => ({}) - } }, - dicts:['finance_invoice_type'], + dicts:['payment_method'], data() { return { loading: false, @@ -190,9 +182,6 @@ export default { file: null }, rules: { - ticketType: [ - { required: true, message: "请选择票据类型", trigger: "change" } - ], }, previewUrl: '', isPreviewPdf: false, @@ -237,7 +226,7 @@ export default { fetchAttachments() { if (!this.receiptData.id) return; this.loading = true; - getReceiveAttachments(this.receiptData.id, { type: 'ticket' }) + getReceiveAttachments(this.receiptData.id, { type: 'receipt' }) .then(response => { const data = response.data || []; data.sort((a, b) => new Date(b.createTime) - new Date(a.createTime)); @@ -342,9 +331,8 @@ export default { const formData = new FormData(); formData.append("file", this.uploadForm.file); - formData.append("id", this.receiptData.id); + formData.append("relatedBillId", this.receiptData.id); formData.append("remark", this.uploadForm.remark); - formData.append("ticketType", this.uploadForm.ticketType); uploadReceiveAttachment(formData) .then(response => { diff --git a/oms_web/oms_vue/src/views/finance/receive/index.vue b/oms_web/oms_vue/src/views/finance/receive/index.vue index 6085ea7b..002262f4 100644 --- a/oms_web/oms_vue/src/views/finance/receive/index.vue +++ b/oms_web/oms_vue/src/views/finance/receive/index.vue @@ -165,6 +165,18 @@ icon="el-icon-document" @click="handleReceipt(scope.row)" >附件 + 申请付款 + 申请退款 退回 - 申请红冲 @@ -197,6 +202,10 @@ + + + +
@@ -207,15 +216,19 @@ import { addDateRange } from "@/utils/ruoyi"; import DetailDrawer from "./components/DetailDrawer.vue"; import AddForm from "./components/AddForm.vue"; import ReceiveDialog from "./components/ReceiveDialog.vue"; +import ApplyPaymentDialog from "./components/ApplyPaymentDialog.vue"; +import ApplyRefundDialog from "./components/ApplyRefundDialog.vue"; export default { name: "Receive", components: { DetailDrawer, AddForm, - ReceiveDialog + ReceiveDialog, + ApplyPaymentDialog, + ApplyRefundDialog }, - dicts:['receipt_bill_type','approve_status','receipt_bill_status'], + dicts:['receipt_bill_type','approve_status','receipt_bill_status', 'payment_method'], data() { return { // 遮罩层 @@ -251,7 +264,11 @@ export default { addOpen: false, // 收款附件弹窗 receiptOpen: false, - currentRow: {} + currentRow: {}, + // 申请付款弹窗 + applyPaymentOpen: false, + // 申请退款弹窗 + applyRefundOpen: false, }; }, created() { @@ -319,6 +336,16 @@ export default { this.detailOpen = true; }); }, + /** 申请付款按钮操作 */ + handleApplyPayment(row) { + this.currentRow = row; + this.applyPaymentOpen = true; + }, + /** 申请退款按钮操作 */ + handleApplyRefund(row) { + this.currentRow = row; + this.applyRefundOpen = true; + }, /** 收款附件按钮操作 */ handleReceipt(row) { this.currentRow = row; @@ -334,7 +361,7 @@ export default { }).catch(() => {}); }, handleReturn(row) { - this.$modal.confirm('是否确认退回收款单编号为"' + row.receiptBillCode + '"的数据项?').then(function() { + this.$modal.confirm('是否将该笔销售-应收单的:销售-收款单与销售-发票单同时退回至销售-应收单表').then(function() { return returnReceive(row.id); }).then(() => { this.getList(); diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceiptBillController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceiptBillController.java index 2822ac22..2b16455a 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceiptBillController.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceiptBillController.java @@ -5,13 +5,19 @@ import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.sip.domain.OmsFinAttachment; +import com.ruoyi.sip.domain.OmsPaymentBill; import com.ruoyi.sip.domain.OmsReceiptBill; +import com.ruoyi.sip.service.IOmsFinAttachmentService; import com.ruoyi.sip.service.IOmsReceiptBillService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.util.Collections; import java.util.List; /** @@ -26,6 +32,8 @@ public class OmsReceiptBillController extends BaseController { @Autowired private IOmsReceiptBillService omsReceiptBillService; + @Autowired + private IOmsFinAttachmentService omsFinAttachmentService; @GetMapping("/list") @@ -91,4 +99,56 @@ public class OmsReceiptBillController extends BaseController { return AjaxResult.error("操作失败:" + e.getMessage()); } } + @GetMapping("/attachment/{id}") + @ResponseBody + public AjaxResult viewReceipt(@PathVariable("id") Long id, @RequestParam("type") String type) + { + + return AjaxResult.success( omsFinAttachmentService.list(Collections.singletonList(id),type)); + } + /** + * 上传回执单 + */ + @RequiresPermissions("finance:receipt:uploadReceipt") + @Log(title = "上传回执单", businessType = BusinessType.UPDATE) + @PostMapping("/uploadReceipt") + @ResponseBody + public AjaxResult uploadReceipt(OmsFinAttachment attachment, @RequestParam("file") MultipartFile file) + { + try + { + attachment.setRelatedBillType(OmsFinAttachment.RelatedBillTypeEnum.RECEIPT.getCode()); + return omsReceiptBillService.uploadReceipt(attachment, file); + } + catch (Exception e) + { + logger.error("上传回执单失败", e); + return AjaxResult.error("操作失败:" + e.getMessage()); + } + } + @RequiresPermissions("finance:receipt:apply") + @Log(title = "申请收款", businessType = BusinessType.UPDATE) + @PostMapping("/applyReceipt") + @ResponseBody + public AjaxResult applyReceipt(OmsReceiptBill omsReceiptBill, @RequestParam("file") MultipartFile file) { + try { + omsReceiptBillService.applyReceipt(omsReceiptBill, file); + } catch (IOException e) { + return AjaxResult.error("操作失败:" + e.getMessage()); + } + return AjaxResult.success(); + } + /** + * 申请退款 + */ + @PostMapping("/applyRefund") + @ResponseBody + public AjaxResult applyRefund(@RequestBody OmsReceiptBill omsReceiptBill) { + try { + return omsReceiptBillService.applyRefund(omsReceiptBill); + } catch (Exception e) { + logger.error("申请退款失败", e); + return AjaxResult.error("操作失败:" + e.getMessage()); + } + } } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceiptBill.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceiptBill.java index ee8e540c..3f6b35c8 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceiptBill.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceiptBill.java @@ -160,6 +160,8 @@ public class OmsReceiptBill { * 是否已申请退款 0:未退款 1:已申请退款 */ private String refundStatus; + private Long originalBillId; + private OmsFinAttachment attachment; private List detailDTOList; @Getter public enum ReceiptBillTypeEnum { @@ -182,6 +184,25 @@ public class OmsReceiptBill { } } @Getter + public enum RefundStatusEnum { + + /** 应付单生成 */ + REFUNDED("REFUND_APPLIED", "已申请退款"), + WAIT_REFUNDED("WAIT_REFUNDED", "未退款") + + ; + + + + ; + private final String code; + private final String desc; + RefundStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + } + @Getter public enum ReceiptStatusEnum { /** 应付单生成 */ diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptDetailMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptDetailMapper.java index 136cda09..15a10f61 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptDetailMapper.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptDetailMapper.java @@ -65,4 +65,6 @@ public interface OmsReceivableReceiptDetailMapper List selectByPaymentPlanIds(List allReceiptPlanIds); List listReceivableByReceiptBillCode(List receiptBillCode); + + void insertBatch(List addList); } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceiptBillService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceiptBillService.java index d4a862ee..24966521 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceiptBillService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceiptBillService.java @@ -1,8 +1,11 @@ package com.ruoyi.sip.service; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.sip.domain.OmsFinAttachment; import com.ruoyi.sip.domain.OmsReceiptBill; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; /** @@ -46,6 +49,12 @@ public interface IOmsReceiptBillService { List listRemainingAmountByPartnerCodeList(List collect); AjaxResult returnPaymentBill(Long id); + + void applyReceipt(OmsReceiptBill omsReceiptBill, MultipartFile file) throws IOException; + + AjaxResult applyRefund(OmsReceiptBill omsReceiptBill); + + AjaxResult uploadReceipt(OmsFinAttachment attachment, MultipartFile file) throws IOException; } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptDetailService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptDetailService.java index b10adad0..be71aab9 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptDetailService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptDetailService.java @@ -71,4 +71,6 @@ public interface IOmsReceivableReceiptDetailService List listReceivableByReceiptBillCode(String receiptBillCode); List listByReceiptBillCode(String receiptBillCode); + + void applyRefund(String originalReceiptBillCode, String targetReceiptBillCode); } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceiptBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceiptBillServiceImpl.java index c69175a6..8d43c0a4 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceiptBillServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceiptBillServiceImpl.java @@ -3,25 +3,32 @@ package com.ruoyi.sip.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.enums.ApproveStatusEnum; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.ShiroUtils; -import com.ruoyi.sip.domain.OmsPayablePaymentDetail; -import com.ruoyi.sip.domain.OmsPaymentBill; -import com.ruoyi.sip.domain.OmsReceiptBill; -import com.ruoyi.sip.domain.OmsReceivableReceiptDetail; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.sip.domain.*; import com.ruoyi.sip.domain.dto.ReceiptDetailDTO; +import com.ruoyi.sip.dto.WriteOffRequestDto; import com.ruoyi.sip.mapper.OmsReceiptBillMapper; +import com.ruoyi.sip.service.IOmsFinAttachmentService; import com.ruoyi.sip.service.IOmsReceiptBillService; import com.ruoyi.sip.service.IOmsReceivableBillService; import com.ruoyi.sip.service.IOmsReceivableReceiptDetailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.IOException; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -39,6 +46,8 @@ public class OmsReceiptBillServiceImpl implements IOmsReceiptBillService { private IOmsReceivableReceiptDetailService omsReceivableReceiptDetailService; @Autowired private IOmsReceivableBillService receivableBillService; + @Autowired + private IOmsFinAttachmentService attachmentService; /** * 查询列表数据 @@ -55,8 +64,14 @@ public class OmsReceiptBillServiceImpl implements IOmsReceiptBillService { @Override public OmsReceiptBill queryById(Long id) { OmsReceiptBill receiptBill = omsReceiptBillMapper.queryById(id); + if (receiptBill == null){ + return null; + } List receiptDetailDTOS = omsReceivableReceiptDetailService.listReceivableByReceiptBillCode(receiptBill.getReceiptBillCode()); receiptBill.setDetailDTOList(receiptDetailDTOS); + List list = attachmentService.list(Collections.singletonList(receiptBill.getId()), OmsFinAttachment.RelatedBillTypeEnum.RECEIPT.getCode()); + Optional first = list.stream().filter(item -> !"2".equals(item.getDelFlag())).max((o1, o2) -> o2.getCreateTime().compareTo(o1.getCreateTime())); + receiptBill.setAttachment(first.orElse(null)); return receiptBill; } @@ -144,6 +159,143 @@ public class OmsReceiptBillServiceImpl implements IOmsReceiptBillService { } } + @Override + public void applyReceipt(OmsReceiptBill omsReceiptBill, MultipartFile file) throws IOException { + omsReceiptBill.setApproveStatus(ApproveStatusEnum.WAIT_APPROVE.getCode()); + + + omsReceiptBillMapper.update(omsReceiptBill); + + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + + SysUser loginUser = ShiroUtils.getSysUser(); + + OmsFinAttachment attachment = new OmsFinAttachment(); + attachment.setRelatedBillType(OmsFinAttachment.RelatedBillTypeEnum.RECEIPT.getCode()); + attachment.setRelatedBillId(omsReceiptBill.getId()); + attachment.setFileName(file.getOriginalFilename()); + attachment.setFilePath(fileName); + attachment.setFileSize(file.getSize()); + attachment.setFileType(file.getContentType()); + attachment.setCreateBy(loginUser.getUserId().toString()); + attachmentService.insertOmsFinAttachment(attachment); + } + + @Override + public AjaxResult applyRefund(OmsReceiptBill omsReceiptBill) { + // 1. 验证原始付款单 + OmsReceiptBill receiptBill = queryById(omsReceiptBill.getId()); + + if (receiptBill == null) { + return AjaxResult.error("原始收款单不存在"); + } + + if (OmsReceiptBill.ReceiptBillTypeEnum.REFUND.getCode().equals(receiptBill.getReceiptBillType())) { + if (!ApproveStatusEnum.WAIT_APPROVE.getCode().equals(receiptBill.getApproveStatus()) || + !ApproveStatusEnum.APPROVE_REJECT.getCode().equals(receiptBill.getApproveStatus())){ + return AjaxResult.error("当前订单已提交审批,请刷新后重试"); + } + receiptBill.setApproveStatus(ApproveStatusEnum.WAIT_APPROVE.getCode()); + //todo 开启流程 + update(receiptBill); + return AjaxResult.success("退款申请成功!"); + } + + + if (!OmsReceiptBill.ReceiptStatusEnum.PAYMENT.getCode().equals(receiptBill.getReceiptStatus())) { + return AjaxResult.error("只有已付款的订单才能申请退款"); + } + if (OmsReceiptBill.RefundStatusEnum.REFUNDED.getCode().equals(receiptBill.getRefundStatus())) { + return AjaxResult.error("该付款单已申请过退款,请勿重复操作"); + } + + // 2. 创建新的退款单 + OmsReceiptBill refundBill = new OmsReceiptBill(); + + // 复制属性并取反金额 + refundBill.setTotalPriceWithTax(receiptBill.getTotalPriceWithTax().negate()); + refundBill.setTotalPriceWithoutTax(receiptBill.getTotalPriceWithoutTax().negate()); + refundBill.setTaxAmount(receiptBill.getTaxAmount().negate()); + + refundBill.setPartnerCode(receiptBill.getPartnerCode()); + refundBill.setOrderCode(receiptBill.getOrderCode()); + refundBill.setReceiptAccountName(omsReceiptBill.getReceiptAccountName()); + refundBill.setReceiptBankNumber(omsReceiptBill.getReceiptBankNumber()); + refundBill.setReceiptBankOpenAddress(omsReceiptBill.getReceiptBankOpenAddress()); + refundBill.setBankNumber(omsReceiptBill.getBankNumber()); + refundBill.setReceiptBillCode(generateReceiptBillCode()); + // 设置新属性 + refundBill.setReceiptBillType(OmsReceiptBill.ReceiptBillTypeEnum.REFUND.getCode()); + refundBill.setReceiptStatus(OmsReceiptBill.ReceiptStatusEnum.WAIT_PAYMENT.getCode()); + refundBill.setApproveStatus(ApproveStatusEnum.WAIT_APPROVE.getCode()); + refundBill.setOriginalBillId(receiptBill.getId()); + refundBill.setReceiptTime(null); + refundBill.setReceiptMethod(omsReceiptBill.getReceiptMethod()); + refundBill.setRemark("退款-关联原付款单:" + omsReceiptBill.getReceiptBillCode()); + + insert(refundBill); + + // 3. 更新原始付款单状态 + receiptBill.setRefundStatus(OmsReceiptBill.RefundStatusEnum.REFUNDED.getCode()); + update(receiptBill); + //4 创建付款明细 + omsReceivableReceiptDetailService.applyRefund(receiptBill.getReceiptBillCode(), refundBill.getReceiptBillCode()); + //5. 开始退款审批流程 +// todoService.startProcessDeleteBefore(originalBill.getPaymentBillCode(), originalBill.getPaymentBillCode(), +// new HashMap() {{ +// put("applyUserName", ShiroUtils.getSysUser().getUserName()); +// put("applyUser", ShiroUtils.getUserId()); +// }} +// , processConfig.getDefinition().getFinanceRefund()); + return AjaxResult.success("退款申请已提交,新的退款单号为:" + refundBill.getReceiptBillCode()); + } + + @Override + public AjaxResult uploadReceipt(OmsFinAttachment attachment, MultipartFile file) throws IOException { + OmsReceiptBill receiptBill = queryById(attachment.getRelatedBillId()); + if (receiptBill == null) { + return AjaxResult.error("收款单不存在"); + } + + if (file.isEmpty()) + { + return AjaxResult.error("上传文件不能为空"); + } + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + + SysUser loginUser = ShiroUtils.getSysUser(); + + + attachment.setFileName(file.getOriginalFilename()); + attachment.setFilePath(fileName); + attachment.setFileSize(file.getSize()); + attachment.setFileType(file.getContentType()); + attachment.setCreateBy(loginUser.getUserId().toString()); + attachmentService.insertOmsFinAttachment(attachment); + receiptBill.setActualReceiptTime(DateUtils.getNowDate()); + receiptBill.setReceiptStatus(OmsReceiptBill.ReceiptStatusEnum.PAYMENT.getCode()); + update(receiptBill); + if (!receiptBill.getReceiptBillType().equals(OmsReceiptBill.ReceiptBillTypeEnum.PRE_RECEIPT.getCode())) { + //todo 自动核销 + // List omsPayablePaymentDetails = omsReceivableReceiptDetailService.listByReceiptCode(receiptBill.getReceiptBillCode()); + + +// WriteOffRequestDto writeOffRequestDto = new WriteOffRequestDto(); +// writeOffRequestDto.setReceiptBillId(receiptBill.getId()); +// writeOffRequestDto.setDetailList(omsPayablePaymentDetails); +// writeOffRequestDto.setVendorCode(paymentBill.getVendorCode()); +// writeOffRequestDto.setRemark(StrUtil.format("{}自动核销数据:{}", DateUtils.getTime(), paymentBill.getPaymentBillCode())); +// // 新增核销记录 +// writeOffService.autoWriteOff(writeOffRequestDto); + } + return AjaxResult.success(attachment); + } } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptDetailServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptDetailServiceImpl.java index 464a0847..89ff3b43 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptDetailServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptDetailServiceImpl.java @@ -1,13 +1,16 @@ package com.ruoyi.sip.service.impl; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.sip.domain.OmsFinAttachment; import com.ruoyi.sip.domain.OmsPayablePaymentDetail; import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO; @@ -156,4 +159,28 @@ public class OmsReceivableReceiptDetailServiceImpl implements IOmsReceivableRece omsReceivableReceiptDetail.setReceiptBillCode(receiptBillCode); return omsReceivableReceiptDetailMapper.list(omsReceivableReceiptDetail); } + + @Override + public void applyRefund(String originalReceiptBillCode, String targetReceiptBillCode) { + OmsReceivableReceiptDetail detail = new OmsReceivableReceiptDetail(); + detail.setReceiptBillCode(originalReceiptBillCode); + List list = omsReceivableReceiptDetailMapper.list(detail); + if (CollUtil.isNotEmpty(list)){ + List addList=new ArrayList<>(); + for (OmsReceivableReceiptDetail existDetail : list) { + OmsReceivableReceiptDetail temp = new OmsReceivableReceiptDetail(); + BeanUtil.copyProperties(existDetail,temp); + temp.setId(null); + temp.setReceivableDetailType(OmsReceivableReceiptDetail.ReceivableDetailTypeEnum.REFUND.getCode()); + temp.setReceiptBillCode(targetReceiptBillCode); + temp.setCreateBy(ShiroUtils.getUserId().toString()); + temp.setReceiptAmount(existDetail.getReceiptAmount().negate()); + temp.setReceiptRate(existDetail.getReceiptRate().negate()); + temp.setReceiptBillCode(targetReceiptBillCode); + temp.setRemark("退款"); + addList.add( temp); + } + omsReceivableReceiptDetailMapper.insertBatch(addList); + } + } } \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/OmsReceiptBill/OmsReceiptBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/OmsReceiptBill/OmsReceiptBillMapper.xml index 68871264..2ab0f182 100644 --- a/ruoyi-sip/src/main/resources/mapper/OmsReceiptBill/OmsReceiptBillMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/OmsReceiptBill/OmsReceiptBillMapper.xml @@ -32,6 +32,7 @@ + diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptDetailMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptDetailMapper.xml index 99ca470d..9b47763c 100644 --- a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptDetailMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptDetailMapper.xml @@ -131,6 +131,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{paymentAmountTax}, + + insert into oms_receivable_receipt_detail + (receipt_plan_id,receivable_bill_id,receipt_time,receipt_amount,receipt_rate,receipt_bill_code,receivable_detail_type + ,remark,create_time,create_by,update_time,update_by,payment_amount_without_tax,payment_amount_tax) + values + + + (#{item.receiptPlanId},#{item.receivableBillId},#{item.receiptTime},#{item.receiptAmount},#{item.receiptRate},#{item.receiptBillCode},#{item.receivableDetailType} + ,#{item.remark},#{item.createTime},#{item.createBy},#{item.updateTime},#{item.updateBy},#{item.paymentAmountWithoutTax},#{item.paymentAmountTax}) + + + + update oms_receivable_receipt_detail