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 7fdcbc59..282c8f27 100644 --- a/oms_web/oms_vue/src/views/approve/order/index.vue +++ b/oms_web/oms_vue/src/views/approve/order/index.vue @@ -55,9 +55,6 @@ - - - + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + 销售应收单表 + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 计划收票总金额: {{ totalPlannedAmount.toFixed(2) }} + 计划收票比例: {{ totalReceivableAmountWithTax ? this.$calc.mul(this.$calc.div(totalPlannedAmount,totalReceivableAmountWithTax,4),100) : 0 }}% +
+
+ + + + + + + + + +
+ + + + + diff --git a/oms_web/oms_vue/src/views/finance/invoice/components/DetailDrawer.vue b/oms_web/oms_vue/src/views/finance/invoice/components/DetailDrawer.vue new file mode 100644 index 00000000..687ea62e --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/invoice/components/DetailDrawer.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/finance/invoice/components/InvoiceDialog.vue b/oms_web/oms_vue/src/views/finance/invoice/components/InvoiceDialog.vue new file mode 100644 index 00000000..a7c2c6a0 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/invoice/components/InvoiceDialog.vue @@ -0,0 +1,569 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/finance/invoice/index.vue b/oms_web/oms_vue/src/views/finance/invoice/index.vue new file mode 100644 index 00000000..718f6396 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/invoice/index.vue @@ -0,0 +1,331 @@ + + + diff --git a/oms_web/oms_vue/src/views/finance/receivable/components/EditForm.vue b/oms_web/oms_vue/src/views/finance/receivable/components/EditForm.vue index 597ac654..a7febc8a 100644 --- a/oms_web/oms_vue/src/views/finance/receivable/components/EditForm.vue +++ b/oms_web/oms_vue/src/views/finance/receivable/components/EditForm.vue @@ -92,16 +92,52 @@ - + + + + 销售开票单 + + + + + + + + + + + + + + + + + + @@ -115,6 +151,7 @@ + @@ -127,11 +164,13 @@ import ReceiptPlan from './ReceiptPlan.vue'; import InvoicePlan from './InvoicePlan.vue'; import { getReceivable } from "@/api/finance/receivable"; +import GlobalFilePreview from "@/components/GlobalFilePreview/index.vue"; export default { name: "EditForm", - dicts: ['product_type','collection_status','receivable_detail_type'], + dicts: ['product_type','receipt_bill_status','receivable_detail_type', 'invoice_bill_status'], components: { + GlobalFilePreview, ReceiptPlan, InvoicePlan }, @@ -167,6 +206,12 @@ export default { } }, methods: { + handlePreview(attachment) { + this.$refs.filePreview.handlePreview(attachment); + }, + downloadFile(attachment) { + this.$refs.filePreview.downloadFile(attachment); + }, getDetails() { getReceivable(this.data.id).then(res => { this.formData = res.data; @@ -175,17 +220,6 @@ export default { refreshInvoicePlan(){ this.$refs.invoicePlan.fetchInvoicePlans(this.formData.id); }, - 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); - } - }, getSummaries(param) { const { columns, data } = param; const sums = []; @@ -215,6 +249,35 @@ export default { }); return sums; }, + getInvoiceSummaries(param) { + const { columns, data } = param; + const sums = []; + let invoiceAmountSum = 0; + if (data && data.length > 0) { + invoiceAmountSum = data.reduce((acc, item) => { + const value = Number(item.invoiceAmount); + return acc + (isNaN(value) ? 0 : value); + }, 0); + } + + columns.forEach((column, index) => { + if (index === 0) { + sums[index] = '合计'; + } else if (column.property === 'invoiceAmount') { + sums[index] = invoiceAmountSum.toFixed(2); + } else if (column.property === 'invoiceRate') { + if (this.formData.totalPriceWithTax && this.formData.totalPriceWithTax > 0) { + const ratio = this.$calc.div(invoiceAmountSum , this.formData.totalPriceWithTax,4); + sums[index] = (ratio * 100).toFixed(2) + '%'; + } else { + sums[index] = '0.00%'; + } + } else { + sums[index] = ''; + } + }); + return sums; + }, handleClose() { this.internalVisible = false; // Close dialog locally }, diff --git a/oms_web/oms_vue/src/views/finance/receivable/components/MergeInvoiceDialog.vue b/oms_web/oms_vue/src/views/finance/receivable/components/MergeInvoiceDialog.vue index d5395072..09b2f91d 100644 --- a/oms_web/oms_vue/src/views/finance/receivable/components/MergeInvoiceDialog.vue +++ b/oms_web/oms_vue/src/views/finance/receivable/components/MergeInvoiceDialog.vue @@ -16,8 +16,8 @@
- - + + @@ -127,7 +127,7 @@ export default { chooseReceivable: {}, form: { invoiceBillType: 'FROM_RECEIVABLE', // Default to a type - customerName: '', + partnerName: '', invoiceTime: null, }, receivableBillsWithPlans: [], // Each order will now have its own invoicePlans array @@ -176,12 +176,12 @@ export default { initDialogData() { // Initialize form fields if (this.receivableBills.length > 0) { - const firstCustomerName = this.receivableBills[0].customerName; - const allSameCustomer = this.receivableBills.every(order => order.customerName === firstCustomerName); - this.form.customerName = allSameCustomer ? firstCustomerName : '多个客户'; + const partnerName = this.receivableBills[0].partnerName; + const allSameCustomer = this.receivableBills.every(order => order.partnerName === partnerName); + this.form.partnerName = allSameCustomer ? partnerName : '多个客户'; this.form.invoiceTime = null; // Reset time } else { - this.form.customerName = ''; + this.form.partnerName = ''; this.form.invoiceTime = null; } this.form.invoiceBillType = 'FROM_RECEIVABLE'; // Default @@ -274,6 +274,7 @@ export default { receivableBills: this.receivableBillsWithPlans.map(order => ({ id: order.id, receivableBillCode: order.receivableBillCode, + taxRate: order.taxRate, invoicePlans: order.invoicePlans.map(plan => ({ planInvoiceDate: plan.planInvoiceDate, planAmount: plan.planAmount, @@ -295,7 +296,7 @@ export default { resetForm() { this.form = { invoiceBillType: 'FROM_RECEIVABLE', - customerName: '', + partnerName: '', invoiceTime: null, }; this.receivableBillsWithPlans = []; diff --git a/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue b/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue index 8e790d98..048eb5d0 100644 --- a/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue +++ b/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue @@ -90,8 +90,8 @@ - - {{ selectedVendor.payMethod==='1'?'出库付款':'入库付款' }} + + {{ selectedVendor.payType===1?'出库付款':'入库付款' }} @@ -419,7 +419,7 @@ export default { this.selectedVendor = this.vendorOptions.find(item => item.vendorId === vendorId) || {}; this.form.warehouseId = this.selectedVendor.warehouseId this.currentVendorCode=this.selectedVendor.vendorCode; - this.form.payMethod=this.selectedVendor.payMethod; + this.form.payMethod=this.selectedVendor.payType; } else { this.selectedVendor = {}; this.form.warehouseId = null; diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsInvoiceBillController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsInvoiceBillController.java new file mode 100644 index 00000000..0afdf6c1 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsInvoiceBillController.java @@ -0,0 +1,203 @@ +package com.ruoyi.sip.controller; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.common.config.flow.ProcessConfig; +import com.ruoyi.sip.domain.OmsFinAttachment; +import com.ruoyi.sip.flowable.service.TodoService; +import com.ruoyi.sip.service.IOmsFinAttachmentService; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.sip.domain.OmsInvoiceBill; +import com.ruoyi.sip.service.IOmsInvoiceBillService; +import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 销售开票单Controller + * + * @author ruoyi + * @date 2025-12-22 + */ +@RestController +@RequestMapping("/finance/invoice") +public class OmsInvoiceBillController extends BaseController +{ + @Autowired + private IOmsInvoiceBillService omsInvoiceBillService; + + @Autowired + private IOmsFinAttachmentService omsFinAttachmentService; + + @Autowired + private TodoService todoService; + + @Autowired + private ProcessConfig processConfig; + + /** + * 查询销售开票单列表 + */ + @RequiresPermissions("sip:invoiceBill:list") + @GetMapping("/list") + public TableDataInfo list(OmsInvoiceBill omsInvoiceBill) + { + startPage(); + List list = omsInvoiceBillService.selectOmsInvoiceBillList(omsInvoiceBill); + clearPage(); +// todoService.fillApproveNode(list, +// Arrays.asList(processConfig.getDefinition().getFiananceInvoice(), processConfig.getDefinition().getFinanceInvoiceRefound()) +// , OmsInvoiceBill::getInvoiceBillCode, (a, b) -> a.setApproveNode(b.get(a.getInvoiceBillCode()))); + return getDataTable(list); + } + + @PostMapping("/approve/list") + public TableDataInfo listApprove(@RequestBody OmsInvoiceBill omsInvoiceBill) { + startPage(); + List list = omsInvoiceBillService.listApprove(omsInvoiceBill); + clearPage(); +// todoService.fillApproveNode(list, +// Arrays.asList(omsInvoiceBill.getProcessKey()) +// , OmsInvoiceBill::getInvoiceBillCode, (a, b) -> a.setApproveNode(b.get(a.getInvoiceBillCode()))); + return getDataTable(list); + } + + @PostMapping("/approved/list") + public TableDataInfo listApproved(@RequestBody OmsInvoiceBill omsInvoiceBill) { + startPage(); + List list = omsInvoiceBillService.listApproved(omsInvoiceBill); + clearPage(); +// todoService.fillApproveNode(list, +// Arrays.asList(processConfig.getDefinition().getFiananceInvoice(), processConfig.getDefinition().getFinanceInvoiceRefound()) +// , OmsInvoiceBill::getInvoiceBillCode, (a, b) -> a.setApproveNode(b.get(a.getInvoiceBillCode()))); + return getDataTable(list); + } + + /** + * 导出销售开票单列表 + */ + @RequiresPermissions("sip:invoiceBill:export") + @Log(title = "销售开票单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, OmsInvoiceBill omsInvoiceBill) + { + List list = omsInvoiceBillService.selectOmsInvoiceBillList(omsInvoiceBill); + ExcelUtil util = new ExcelUtil(OmsInvoiceBill.class); + util.exportExcel(response, list, "销售开票单数据"); + } + + /** + * 获取销售开票单详细信息 + */ + @RequiresPermissions("sip:invoiceBill:query") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(omsInvoiceBillService.selectOmsInvoiceBillById(id)); + } + + /** + * 新增销售开票单 + */ + @RequiresPermissions("sip:invoiceBill:add") + @Log(title = "销售开票单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody OmsInvoiceBill omsInvoiceBill) + { + return toAjax(omsInvoiceBillService.insertOmsInvoiceBill(omsInvoiceBill)); + } + + /** + * 修改销售开票单 + */ + @RequiresPermissions("sip:invoiceBill:edit") + @Log(title = "销售开票单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody OmsInvoiceBill omsInvoiceBill) + { + return toAjax(omsInvoiceBillService.updateOmsInvoiceBill(omsInvoiceBill)); + } + + /** + * 删除销售开票单 + */ + @RequiresPermissions("sip:invoiceBill:remove") + @Log(title = "销售开票单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(omsInvoiceBillService.deleteOmsInvoiceBillByIds(ids)); + } + + /** + * 查看开票回执单页面 + */ + @GetMapping("/attachment/{id}") + @ResponseBody + public AjaxResult viewReceipt(@PathVariable("id") Long id, @RequestParam("type") String type) + { + return AjaxResult.success(omsFinAttachmentService.list(Collections.singletonList(id), type)); + } + + /** + * 上传开票回执单 + */ + @Log(title = "上传开票回执单", businessType = BusinessType.UPDATE) + @PostMapping("/uploadReceipt") + @ResponseBody + public AjaxResult uploadReceipt(OmsInvoiceBill invoiceBill, @RequestParam("file") MultipartFile file) + { + try { + return omsInvoiceBillService.uploadReceipt(invoiceBill, file); + } catch (Exception e) { + logger.error("上传开票回执单失败", e); + return AjaxResult.error("操作失败:" + e.getMessage()); + } + } + + /** + * 申请红冲 + */ + @GetMapping("/applyRefund/{id}") + @ResponseBody + public AjaxResult applyRefund(@PathVariable("id") Long id) { + try { + return omsInvoiceBillService.applyRefund(id); + } catch (Exception e) { + logger.error("申请红冲失败", e); + return AjaxResult.error("操作失败:" + e.getMessage()); + } + } + + /** + * 退回开票单 + */ + @RequiresPermissions("finance:invoice:return") + @Log(title = "退回开票单", businessType = BusinessType.UPDATE) + @DeleteMapping("/return/{id}") + @ResponseBody + public AjaxResult returnInvoice(@PathVariable("id") Long id) + { + try { + // 验证开票单ID + if (id == null) { + return AjaxResult.error("开票ID不能为空"); + } + + // 调用服务层方法处理退回逻辑 + return omsInvoiceBillService.returnInvoice(id); + } catch (Exception e) { + logger.error("退回开票单失败", e); + return AjaxResult.error("操作失败:" + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsInvoiceReceiptBillController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsInvoiceReceiptBillController.java deleted file mode 100644 index 5ec9238f..00000000 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsInvoiceReceiptBillController.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.ruoyi.sip.controller; - -import java.util.List; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import com.ruoyi.common.annotation.Log; -import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.sip.domain.OmsInvoiceReceiptBill; -import com.ruoyi.sip.service.IOmsInvoiceReceiptBillService; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.common.core.page.TableDataInfo; - -/** - * 采购收票单Controller - * - * @author ruoyi - * @date 2025-10-22 - */ -@Controller -@RequestMapping("/finance/invoice") -public class OmsInvoiceReceiptBillController extends BaseController -{ - private String prefix = "finance/invoice"; - - @Autowired - private IOmsInvoiceReceiptBillService omsInvoiceReceiptBillService; - - @RequiresPermissions("finance:invoice:view") - @GetMapping() - public String invoice() - { - return prefix + "/invoice"; - } - - /** - * 查询采购收票单列表 - */ - @RequiresPermissions("finance:invoice:list") - @PostMapping("/list") - @ResponseBody - public TableDataInfo list(OmsInvoiceReceiptBill omsInvoiceReceiptBill) - { - startPage(); - List list = omsInvoiceReceiptBillService.selectOmsInvoiceReceiptBillList(omsInvoiceReceiptBill); - return getDataTable(list); - } - - /** - * 导出采购收票单列表 - */ - @RequiresPermissions("finance:invoice:export") - @Log(title = "采购收票单", businessType = BusinessType.EXPORT) - @PostMapping("/export") - @ResponseBody - public AjaxResult export(OmsInvoiceReceiptBill omsInvoiceReceiptBill) - { - List list = omsInvoiceReceiptBillService.selectOmsInvoiceReceiptBillList(omsInvoiceReceiptBill); - ExcelUtil util = new ExcelUtil(OmsInvoiceReceiptBill.class); - return util.exportExcel(list, "采购收票单数据"); - } - - /** - * 新增采购收票单 - */ - @RequiresPermissions("finance:invoice:add") - @GetMapping("/add") - public String add() - { - return prefix + "/add"; - } - - /** - * 新增保存采购收票单 - */ - @RequiresPermissions("finance:invoice:add") - @Log(title = "采购收票单", businessType = BusinessType.INSERT) - @PostMapping("/add") - @ResponseBody - public AjaxResult addSave(OmsInvoiceReceiptBill omsInvoiceReceiptBill) - { - return toAjax(omsInvoiceReceiptBillService.insertOmsInvoiceReceiptBill(omsInvoiceReceiptBill)); - } - - /** - * 修改采购收票单 - */ - @RequiresPermissions("finance:invoice:edit") - @GetMapping("/edit/{id}") - public String edit(@PathVariable("id") Long id, ModelMap mmap) - { - OmsInvoiceReceiptBill omsInvoiceReceiptBill = omsInvoiceReceiptBillService.selectOmsInvoiceReceiptBillById(id); - mmap.put("omsInvoiceReceiptBill", omsInvoiceReceiptBill); - return prefix + "/edit"; - } - - /** - * 修改保存采购收票单 - */ - @RequiresPermissions("finance:invoice:edit") - @Log(title = "采购收票单", businessType = BusinessType.UPDATE) - @PostMapping("/edit") - @ResponseBody - public AjaxResult editSave(OmsInvoiceReceiptBill omsInvoiceReceiptBill) - { - return toAjax(omsInvoiceReceiptBillService.updateOmsInvoiceReceiptBill(omsInvoiceReceiptBill)); - } - - /** - * 删除采购收票单 - */ - @RequiresPermissions("finance:invoice:remove") - @Log(title = "采购收票单", businessType = BusinessType.DELETE) - @PostMapping( "/remove") - @ResponseBody - public AjaxResult remove(String ids) - { - return toAjax(omsInvoiceReceiptBillService.deleteOmsInvoiceReceiptBillByIds(ids)); - } -} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableBillController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableBillController.java index 6a9bd7e2..fa7c6c18 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableBillController.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableBillController.java @@ -16,7 +16,6 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.sip.service.IOmsPaymentBillService; -import com.ruoyi.sip.service.IOmsInvoiceReceiptBillService; import com.ruoyi.sip.domain.dto.MergedPaymentDataDto; import com.ruoyi.sip.domain.dto.MergedReceiptDataDto; @@ -39,8 +38,7 @@ public class OmsPayableBillController extends BaseController @Autowired private IOmsPaymentBillService omsPaymentBillService; - @Autowired - private IOmsInvoiceReceiptBillService omsInvoiceReceiptBillService; + @RequiresPermissions("finance:payable:view") @GetMapping() diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableBillController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableBillController.java index de7f1b6a..046d891c 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableBillController.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableBillController.java @@ -2,10 +2,7 @@ package com.ruoyi.sip.controller; import java.util.List; -import com.ruoyi.sip.domain.dto.MergedInvoiceDataDto; -import com.ruoyi.sip.domain.dto.MergedPaymentDataDto; -import com.ruoyi.sip.domain.dto.MergedReceiptDataDto; -import com.ruoyi.sip.domain.dto.MergedReceviableReceiptDataDto; +import com.ruoyi.sip.domain.dto.*; import com.ruoyi.sip.service.IOmsReceivableReceiptDetailService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; @@ -121,14 +118,14 @@ public class OmsReceivableBillController extends BaseController /** * 合并并发起收票单 */ -// @RequiresPermissions("inventory:inner:add") // Using permission from button in vue file -// @Log(title = "合并并发起收票单", businessType = BusinessType.INSERT) -// @PostMapping("/mergeAndInitiateReceipt") -// @ResponseBody -// public AjaxResult mergeAndInitiateReceipt(@RequestBody MergedReceiptDataDto dto) -// { -// return toAjax(omsPayableBillService.mergeAndInitiateReceipt(dto)); -// } + @RequiresPermissions("inventory:inner:add") // Using permission from button in vue file + @Log(title = "合并并发起收票单", businessType = BusinessType.INSERT) + @PostMapping("/mergeAndInitiateInvoice") + @ResponseBody + public AjaxResult mergeAndInitiateInvoice(@RequestBody MergedReceviableInvoiceDataDto dto) + { + return toAjax(omsReceivableBillService.mergeAndInitiateInvoice(dto)); + } } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsFinAttachment.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsFinAttachment.java index cf2e7480..7891f28b 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsFinAttachment.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsFinAttachment.java @@ -59,7 +59,7 @@ public class OmsFinAttachment extends BaseEntity PAYMENT("payment", "付款单"), INVOICE("ticket", "收票单"), RECEIPT("receipt", "应收-收款单"), -// INVOICE("ticket", "收票单"), + RECEIVE_INVOICE("invoice", "应收-收票单"), diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsInvoiceBill.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsInvoiceBill.java new file mode 100644 index 00000000..b2495c05 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsInvoiceBill.java @@ -0,0 +1,176 @@ +package com.ruoyi.sip.domain; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO; +import lombok.AccessLevel; +import lombok.Data; +import lombok.Getter; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 销售开票单对象 oms_invoice_bill + * + * @author ruoyi + * @date 2025-12-22 + */ +@Data +public class OmsInvoiceBill extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 开票单编号 */ + @Excel(name = "开票单编号") + private String invoiceBillCode; + private List invoiceBillCodeList; + + /** 票据类型 */ + @Excel(name = "票据类型") + private String invoiceType; + + /** 开票单类型 (FROM_RECEIVABLE, PRE_INVOICE) */ + @Excel(name = "开票单类型 (FROM_RECEIVABLE, PRE_INVOICE)") + private String invoiceBillType; + + + /** 预计开票时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "预计开票时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date invoiceTime; + + /** 客户编码 */ + @Excel(name = "客户编码") + private String partnerCode; + private String partnerName; + + /** 含税总价 */ + @Excel(name = "含税总价") + private BigDecimal totalPriceWithTax; + private BigDecimal invoicePriceWithTax; + + /** 未税总价 */ + @Excel(name = "未税总价") + private BigDecimal totalPriceWithoutTax; + private BigDecimal invoicePriceWithoutTax; + + /** 税率 */ + @Excel(name = "税率") + private BigDecimal taxRate; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 实际开票时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "实际开票时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date actualInvoiceTime; + + /** 开票状态 */ + @Excel(name = "开票状态") + private String invoiceStatus; + + /** 审批状态 */ + @Excel(name = "审批状态") + private String approveStatus; + + /** 审批节点 */ + @Excel(name = "审批节点") + private String approveNode; + + /** 审批时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "审批时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date approveTime; + + /** 退款状态 */ + private String refundStatus; + + /** 应收单编号(关联查询字段) */ + @Excel(name = "应收单编号") + private String receivableBillCode; + + /** 关联的原始开票单ID */ + private Long originalBillId; + private List detailList; + private Long approveUser; + private Date applyTime; + private Date todoApproveTime; + private String processKey; + private String todoId; + private String taskId; + + public BigDecimal getTaxAmount() { + if (null != totalPriceWithTax && null != totalPriceWithoutTax){ + return totalPriceWithTax.subtract(totalPriceWithoutTax); + } + return BigDecimal.ZERO; + } + public BigDecimal getInvoiceAmount() { + if (null != invoicePriceWithTax && null != invoicePriceWithoutTax){ + return invoicePriceWithTax.subtract(invoicePriceWithoutTax); + } + return BigDecimal.ZERO; + } + + @Getter + public enum InvoiceBillTypeEnum { + + /** 应收单生成 */ + FROM_RECEIVABLE("FROM_RECEIVABLE", "应收单生成"), + /** 预开票单 */ +// PRE_INVOICE("PRE_INVOICE", "预开票单"), + /** 红冲单 */ + RED_RUSH("RED_RUSH", "红冲单"), + + ; + private final String code; + private final String desc; + InvoiceBillTypeEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + } + @Getter + public enum InvoiceStatusEnum { + + /** 已红冲 */ + RED_RUSH("-1", "已红冲"), + /** 未开票 */ + WAIT_INVOICE("1", "未开票"), + /** 已开票 */ + INVOICE("2", "已开票"), + + ; + private final String code; + private final String desc; + InvoiceStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + } + @Getter + public enum RefundStatusEnum { + + /** 已申请红冲 */ + REFUNDED("RED_RUSH_APPLIED", "已申请红冲"), + /** 未红冲 */ + WAIT_REFUNDED("WAIT_RED_RUSH", "未红冲") + + ; + private final String code; + private final String desc; + RefundStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsInvoiceReceiptBill.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsInvoiceReceiptBill.java deleted file mode 100644 index de30c8e4..00000000 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsInvoiceReceiptBill.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.ruoyi.sip.domain; - -import java.math.BigDecimal; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; -import com.ruoyi.common.annotation.Excel; -import com.ruoyi.common.core.domain.BaseEntity; - -/** - * 采购收票单对象 oms_invoice_receipt_bill - * - * @author ruoyi - * @date 2025-10-22 - */ -public class OmsInvoiceReceiptBill extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** 主键ID */ - private Long id; - - /** 收票单编号 */ - @Excel(name = "收票单编号") - private String invoiceReceiptBillCode; - - /** 制造商名称 */ - @Excel(name = "制造商名称") - private String vendorCode; - - /** 合同编号 */ - @Excel(name = "合同编号") - private String orderCode; - - /** 含税总价 */ - @Excel(name = "含税总价") - private BigDecimal totalPriceWithTax; - - /** 未税总价 */ - @Excel(name = "未税总价") - private BigDecimal totalPriceWithoutTax; - - /** 税额 */ - @Excel(name = "税额") - private BigDecimal taxAmount; - - /** 删除标志(0代表存在 2代表删除) */ - private String delFlag; - - public void setId(Long id) - { - this.id = id; - } - - public Long getId() - { - return id; - } - - public void setInvoiceReceiptBillCode(String invoiceReceiptBillCode) - { - this.invoiceReceiptBillCode = invoiceReceiptBillCode; - } - - public String getInvoiceReceiptBillCode() - { - return invoiceReceiptBillCode; - } - - public void setVendorCode(String vendorCode) - { - this.vendorCode = vendorCode; - } - - public String getVendorCode() - { - return vendorCode; - } - - public void setOrderCode(String orderCode) - { - this.orderCode = orderCode; - } - - public String getOrderCode() - { - return orderCode; - } - - public void setTotalPriceWithTax(BigDecimal totalPriceWithTax) - { - this.totalPriceWithTax = totalPriceWithTax; - } - - public BigDecimal getTotalPriceWithTax() - { - return totalPriceWithTax; - } - - public void setTotalPriceWithoutTax(BigDecimal totalPriceWithoutTax) - { - this.totalPriceWithoutTax = totalPriceWithoutTax; - } - - public BigDecimal getTotalPriceWithoutTax() - { - return totalPriceWithoutTax; - } - - public void setTaxAmount(BigDecimal taxAmount) - { - this.taxAmount = taxAmount; - } - - public BigDecimal getTaxAmount() - { - return taxAmount; - } - - public void setDelFlag(String delFlag) - { - this.delFlag = delFlag; - } - - public String getDelFlag() - { - return delFlag; - } - - @Override - public String toString() { - return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("invoiceReceiptBillCode", getInvoiceReceiptBillCode()) - .append("vendorCode", getVendorCode()) - .append("orderCode", getOrderCode()) - .append("totalPriceWithTax", getTotalPriceWithTax()) - .append("totalPriceWithoutTax", getTotalPriceWithoutTax()) - .append("taxAmount", getTaxAmount()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .append("remark", getRemark()) - .append("delFlag", getDelFlag()) - .toString(); - } -} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableBill.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableBill.java index 2f925dee..54e71b1f 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableBill.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableBill.java @@ -78,7 +78,9 @@ public class OmsReceivableBill extends BaseEntity @Excel(name = "未收款金额") private BigDecimal unreceivedAmount; private BigDecimal planAmount; + private BigDecimal planInvoiceAmount; private Date planReceiptDate; + private Date planInvoiceDate; /** 已开票金额 */ @Excel(name = "已开票金额") @@ -90,6 +92,7 @@ public class OmsReceivableBill extends BaseEntity private String projectName; private String projectCode; private List detailList; + private List invoiceDetailList; diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableInvoiceDetail.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableInvoiceDetail.java index f6e5be82..f8951fcd 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableInvoiceDetail.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableInvoiceDetail.java @@ -9,6 +9,7 @@ import lombok.Getter; import java.math.BigDecimal; import java.util.Date; +import java.util.List; /** * 应收单开票明细对象 oms_receivable_invoice_detail @@ -32,6 +33,7 @@ public class OmsReceivableInvoiceDetail extends BaseEntity /** 应收单ID */ @Excel(name = "应收单ID") private Long receivableBillId; + private List receivableBillIdList; /** 实际开票时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -41,6 +43,8 @@ public class OmsReceivableInvoiceDetail extends BaseEntity /** 开票金额 */ @Excel(name = "开票金额") private BigDecimal invoiceAmount; + private BigDecimal invoiceAmountWithoutTax; + private BigDecimal invoiceAmountTax; /** 开票比例 */ @Excel(name = "开票比例") @@ -59,6 +63,9 @@ public class OmsReceivableInvoiceDetail extends BaseEntity private String receivableDetailType; private String invoiceStatus; + private Long invoiceBillId; + private Date actualInvoiceTime; + private OmsFinAttachment attachment; @Getter public enum ReceivableDetailTypeEnum { diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedReceviableInvoiceDataDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedReceviableInvoiceDataDto.java new file mode 100644 index 00000000..e42fb1a4 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedReceviableInvoiceDataDto.java @@ -0,0 +1,15 @@ +package com.ruoyi.sip.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Data +public class MergedReceviableInvoiceDataDto { + private String invoiceBillType; + private Date invoiceTime; + private List receivableBills; + private BigDecimal totalMergeInvoiceAmount; +} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/ReceivableOrderInvoiceDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/ReceivableOrderInvoiceDto.java new file mode 100644 index 00000000..e48b7f57 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/ReceivableOrderInvoiceDto.java @@ -0,0 +1,16 @@ +package com.ruoyi.sip.domain.dto; + +import com.ruoyi.sip.domain.OmsReceivableInvoicePlan; +import com.ruoyi.sip.domain.OmsReceivableReceiptPlan; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class ReceivableOrderInvoiceDto { + private Long id; + private String receivableBillCode; + private BigDecimal taxRate; + private List invoicePlans; +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsInvoiceBillMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsInvoiceBillMapper.java new file mode 100644 index 00000000..4aea43d7 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsInvoiceBillMapper.java @@ -0,0 +1,91 @@ +package com.ruoyi.sip.mapper; + +import com.ruoyi.sip.domain.OmsInvoiceBill; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 销售开票单Mapper接口 + * + * @author ruoyi + * @date 2025-12-22 + */ +public interface OmsInvoiceBillMapper +{ + /** + * 查询销售开票单 + * + * @param id 销售开票单主键 + * @return 销售开票单 + */ + public OmsInvoiceBill selectOmsInvoiceBillById(Long id); + + /** + * 查询销售开票单列表 + * + * @param omsInvoiceBill 销售开票单 + * @return 销售开票单集合 + */ + public List selectOmsInvoiceBillList(OmsInvoiceBill omsInvoiceBill); + + /** + * 新增销售开票单 + * + * @param omsInvoiceBill 销售开票单 + * @return 结果 + */ + public int insertOmsInvoiceBill(OmsInvoiceBill omsInvoiceBill); + + /** + * 修改销售开票单 + * + * @param omsInvoiceBill 销售开票单 + * @return 结果 + */ + public int updateOmsInvoiceBill(OmsInvoiceBill omsInvoiceBill); + + /** + * 删除销售开票单 + * + * @param id 销售开票单主键 + * @return 结果 + */ + public int deleteOmsInvoiceBillById(Long id); + + /** + * 批量删除销售开票单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOmsInvoiceBillByIds(Long[] ids); + + /** + * 根据开票单编号查询 + * + * @param invoiceBillCode 开票单编号 + * @return 销售开票单 + */ + public OmsInvoiceBill selectOmsInvoiceBillByCode(String invoiceBillCode); + + /** + * 根据前缀查询最大编码 + * + * @param codePrefix 编码前缀 + * @return 最大编码 + */ + public int selectMaxCodeByPrefix(String codePrefix); + + /** + * 根据开票单编号更新状态 + * + * @param omsInvoiceBill 开票单信息 + * @return 结果 + */ + public int updateOmsInvoiceBillByCode(OmsInvoiceBill omsInvoiceBill); + + List listApprove(@Param("entity") OmsInvoiceBill omsInvoiceBill, @Param("tableName") String tableName); + + void clearRelationReceivable(String invoiceBillCode); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsInvoiceReceiptBillMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsInvoiceReceiptBillMapper.java deleted file mode 100644 index ba0f2e23..00000000 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsInvoiceReceiptBillMapper.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.ruoyi.sip.mapper; - -import java.util.List; -import com.ruoyi.sip.domain.OmsInvoiceReceiptBill; - -/** - * 采购收票单Mapper接口 - * - * @author ruoyi - * @date 2025-10-22 - */ -public interface OmsInvoiceReceiptBillMapper -{ - /** - * 查询采购收票单 - * - * @param id 采购收票单主键 - * @return 采购收票单 - */ - public OmsInvoiceReceiptBill selectOmsInvoiceReceiptBillById(Long id); - - /** - * 查询采购收票单列表 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 采购收票单集合 - */ - public List selectOmsInvoiceReceiptBillList(OmsInvoiceReceiptBill omsInvoiceReceiptBill); - - /** - * 新增采购收票单 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 结果 - */ - public int insertOmsInvoiceReceiptBill(OmsInvoiceReceiptBill omsInvoiceReceiptBill); - - /** - * 修改采购收票单 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 结果 - */ - public int updateOmsInvoiceReceiptBill(OmsInvoiceReceiptBill omsInvoiceReceiptBill); - - /** - * 删除采购收票单 - * - * @param id 采购收票单主键 - * @return 结果 - */ - public int deleteOmsInvoiceReceiptBillById(Long id); - - /** - * 批量删除采购收票单 - * - * @param ids 需要删除的数据主键集合 - * @return 结果 - */ - public int deleteOmsInvoiceReceiptBillByIds(String[] ids); -} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoiceDetailMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoiceDetailMapper.java index 28e920a9..05b78d49 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoiceDetailMapper.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoiceDetailMapper.java @@ -2,7 +2,6 @@ package com.ruoyi.sip.mapper; import java.util.List; -import com.ruoyi.sip.domain.OmsPayableTicketDetail; import com.ruoyi.sip.domain.OmsReceivableInvoiceDetail; /** @@ -61,7 +60,7 @@ public interface OmsReceivableInvoiceDetailMapper */ public int deleteOmsReceivableInvoiceDetailByIds(String ids); - List listByReceivableBillIdList(List collect); + List list(OmsReceivableInvoiceDetail detail); /** * 根据开票计划ID列表查询开票明细 diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsInvoiceBillService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsInvoiceBillService.java new file mode 100644 index 00000000..e8d97125 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsInvoiceBillService.java @@ -0,0 +1,113 @@ +package com.ruoyi.sip.service; + +import java.util.List; +import com.ruoyi.sip.domain.OmsInvoiceBill; +import org.springframework.web.multipart.MultipartFile; + +import com.ruoyi.common.core.domain.AjaxResult; + +/** + * 销售开票单Service接口 + * + * @author ruoyi + * @date 2025-12-22 + */ +public interface IOmsInvoiceBillService +{ + /** + * 查询销售开票单 + * + * @param id 销售开票单主键 + * @return 销售开票单 + */ + public OmsInvoiceBill selectOmsInvoiceBillById(Long id); + + /** + * 查询销售开票单列表 + * + * @param omsInvoiceBill 销售开票单 + * @return 销售开票单集合 + */ + public List selectOmsInvoiceBillList(OmsInvoiceBill omsInvoiceBill); + + /** + * 新增销售开票单 + * + * @param omsInvoiceBill 销售开票单 + * @return 结果 + */ + public int insertOmsInvoiceBill(OmsInvoiceBill omsInvoiceBill); + + /** + * 修改销售开票单 + * + * @param omsInvoiceBill 销售开票单 + * @return 结果 + */ + public int updateOmsInvoiceBill(OmsInvoiceBill omsInvoiceBill); + + /** + * 批量删除销售开票单 + * + * @param ids 需要删除的主键集合 + * @return 结果 + */ + public int deleteOmsInvoiceBillByIds(Long[] ids); + + /** + * 删除销售开票单信息 + * + * @param id 销售开票单主键 + * @return 结果 + */ + public int deleteOmsInvoiceBillById(Long id); + + /** + * 上传开票回执 + * + * @param bill 开票单信息 + * @param file 回执文件 + * @return 结果 + */ + public AjaxResult uploadReceipt(OmsInvoiceBill bill, MultipartFile file) throws Exception; + + /** + * 查询待审批列表 + * + * @param omsInvoiceBill 开票单 + * @return 开票单列表 + */ + public List listApprove(OmsInvoiceBill omsInvoiceBill); + + /** + * 查询已审批列表 + * + * @param omsInvoiceBill 开票单 + * @return 开票单列表 + */ + public List listApproved(OmsInvoiceBill omsInvoiceBill); + + /** + * 根据开票单编号查询 + * + * @param invoiceBillCode 开票单编号 + * @return 开票单 + */ + public OmsInvoiceBill selectOmsInvoiceBillByCode(String invoiceBillCode); + + /** + * 申请红冲 + * + * @param id 开票单ID + * @return 结果 + */ + public AjaxResult applyRefund(Long id); + + /** + * 退回开票单 + * + * @param id 开票单ID + * @return 结果 + */ + public AjaxResult returnInvoice(Long id); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsInvoiceReceiptBillService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsInvoiceReceiptBillService.java deleted file mode 100644 index 2cf884ee..00000000 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsInvoiceReceiptBillService.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.ruoyi.sip.service; - -import java.util.List; -import com.ruoyi.sip.domain.OmsInvoiceReceiptBill; - -/** - * 采购收票单Service接口 - * - * @author ruoyi - * @date 2025-10-22 - */ -public interface IOmsInvoiceReceiptBillService -{ - /** - * 查询采购收票单 - * - * @param id 采购收票单主键 - * @return 采购收票单 - */ - public OmsInvoiceReceiptBill selectOmsInvoiceReceiptBillById(Long id); - - /** - * 查询采购收票单列表 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 采购收票单集合 - */ - public List selectOmsInvoiceReceiptBillList(OmsInvoiceReceiptBill omsInvoiceReceiptBill); - - /** - * 新增采购收票单 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 结果 - */ - public int insertOmsInvoiceReceiptBill(OmsInvoiceReceiptBill omsInvoiceReceiptBill); - - /** - * 修改采购收票单 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 结果 - */ - public int updateOmsInvoiceReceiptBill(OmsInvoiceReceiptBill omsInvoiceReceiptBill); - - /** - * 批量删除采购收票单 - * - * @param ids 需要删除的采购收票单主键集合 - * @return 结果 - */ - public int deleteOmsInvoiceReceiptBillByIds(String ids); - - /** - * 删除采购收票单信息 - * - * @param id 采购收票单主键 - * @return 结果 - */ - public int deleteOmsInvoiceReceiptBillById(Long id); -} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableBillService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableBillService.java index 6f5b0406..adc74632 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableBillService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableBillService.java @@ -1,10 +1,11 @@ package com.ruoyi.sip.service; -import java.util.List; import com.ruoyi.sip.domain.OmsReceivableBill; -import com.ruoyi.sip.domain.dto.MergedInvoiceDataDto; +import com.ruoyi.sip.domain.dto.MergedReceviableInvoiceDataDto; import com.ruoyi.sip.domain.dto.MergedReceviableReceiptDataDto; +import java.util.List; + /** * 销售应收单Service接口 * @@ -73,4 +74,6 @@ public interface IOmsReceivableBillService public int updateReceiptAmount(List idList); public int updateInvoiceAmount(List idList); + + int mergeAndInitiateInvoice(MergedReceviableInvoiceDataDto dto); } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoiceDetailService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoiceDetailService.java index 08ef473f..e0c088ed 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoiceDetailService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoiceDetailService.java @@ -62,6 +62,7 @@ public interface IOmsReceivableInvoiceDetailService public int deleteOmsReceivableInvoiceDetailById(Long id); List listByReceivableBillIdList(List collect); + List listByReceivableBillId(Long receivableBillId); /** * 根据开票计划ID列表查询开票明细 @@ -70,4 +71,6 @@ public interface IOmsReceivableInvoiceDetailService * @return 开票明细集合 */ List selectByInvoicePlanIds(List invoicePlanIds); + + List listByInvoiceBillCode(String invoiceBillCode); } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoicePlanService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoicePlanService.java index 6203a0ae..e933b2eb 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoicePlanService.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoicePlanService.java @@ -65,4 +65,6 @@ public interface IOmsReceivableInvoicePlanService void updateInvoicePlans(Long receivableBillId, List invoicePlanList); + + OmsReceivableInvoicePlan firstUnPayPlan(Long id); } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInvoiceBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInvoiceBillServiceImpl.java new file mode 100644 index 00000000..677a8073 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInvoiceBillServiceImpl.java @@ -0,0 +1,372 @@ +package com.ruoyi.sip.service.impl; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.enums.ApproveStatusEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; + +import com.ruoyi.sip.domain.OmsReceiptBill; +import com.ruoyi.sip.domain.OmsReceivableInvoiceDetail; +import com.ruoyi.sip.domain.dto.PaymentBillPayableDetailDTO; +import com.ruoyi.sip.flowable.domain.Todo; +import com.ruoyi.sip.service.IOmsFinAttachmentService; +import com.ruoyi.sip.service.IOmsReceivableBillService; +import com.ruoyi.sip.service.IOmsReceivableInvoiceDetailService; +import org.flowable.engine.runtime.ProcessInstance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import com.ruoyi.sip.mapper.OmsInvoiceBillMapper; +import com.ruoyi.sip.domain.OmsInvoiceBill; +import com.ruoyi.sip.service.IOmsInvoiceBillService; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.exception.ServiceException; + +import com.ruoyi.sip.flowable.service.TodoCommonTemplate; +import com.ruoyi.sip.flowable.service.TodoService; + + +/** + * 销售开票单Service业务层处理 + * + * @author ruoyi + * @date 2025-12-22 + */ +@Service +public class OmsInvoiceBillServiceImpl implements IOmsInvoiceBillService, TodoCommonTemplate +{ + @Autowired + private OmsInvoiceBillMapper omsInvoiceBillMapper; + + @Autowired + private TodoService todoService; + + @Autowired + private IOmsFinAttachmentService omsFinAttachmentService; + + @Autowired + private IOmsReceivableBillService omsReceivableBillService; + @Autowired + private IOmsReceivableInvoiceDetailService detailService; + + /** + * 查询销售开票单 + * + * @param id 销售开票单主键 + * @return 销售开票单 + */ + @Override + public OmsInvoiceBill selectOmsInvoiceBillById(Long id) + { + OmsInvoiceBill omsInvoiceBill = omsInvoiceBillMapper.selectOmsInvoiceBillById(id); + // 如果需要关联查询其他数据,可以在这里添加 + return omsInvoiceBill; + } + + /** + * 查询销售开票单列表 + * + * @param omsInvoiceBill 销售开票单 + * @return 销售开票单 + */ + @Override + public List selectOmsInvoiceBillList(OmsInvoiceBill omsInvoiceBill) + { + return omsInvoiceBillMapper.selectOmsInvoiceBillList(omsInvoiceBill); + } + + /** + * 新增销售开票单 + * + * @param omsInvoiceBill 销售开票单 + * @return 结果 + */ + @Override + public int insertOmsInvoiceBill(OmsInvoiceBill omsInvoiceBill) + { + if (StringUtils.isEmpty(omsInvoiceBill.getApproveStatus())){ + omsInvoiceBill.setApproveStatus(ApproveStatusEnum.WAIT_COMMIT.getCode()); + } + if (StringUtils.isEmpty(omsInvoiceBill.getInvoiceStatus())){ + omsInvoiceBill.setInvoiceStatus(OmsInvoiceBill.InvoiceStatusEnum.WAIT_INVOICE.getCode()); + } + omsInvoiceBill.setInvoiceBillCode(generateInvoiceBillCode()); + omsInvoiceBill.setCreateTime(DateUtils.getNowDate()); + return omsInvoiceBillMapper.insertOmsInvoiceBill(omsInvoiceBill); + } + + /** + * 修改销售开票单 + * + * @param omsInvoiceBill 销售开票单 + * @return 结果 + */ + @Override + public int updateOmsInvoiceBill(OmsInvoiceBill omsInvoiceBill) + { + omsInvoiceBill.setUpdateTime(DateUtils.getNowDate()); + return omsInvoiceBillMapper.updateOmsInvoiceBill(omsInvoiceBill); + } + + /** + * 批量删除销售开票单 + * + * @param ids 需要删除的主键集合 + * @return 结果 + */ + @Override + public int deleteOmsInvoiceBillByIds(Long[] ids) + { + return omsInvoiceBillMapper.deleteOmsInvoiceBillByIds(ids); + } + + /** + * 删除销售开票单信息 + * + * @param id 销售开票单主键 + * @return 结果 + */ + @Override + public int deleteOmsInvoiceBillById(Long id) + { + return omsInvoiceBillMapper.deleteOmsInvoiceBillById(id); + } + + /** + * 生成开票单编号 + * + * @return 开票单编号 + */ + private String generateInvoiceBillCode() { + String prefix = "KP"; + // 查询当天已有的最大序列号 + String codePrefix = prefix + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN); + int maxSequence = omsInvoiceBillMapper.selectMaxCodeByPrefix(codePrefix); + // 生成新的序列号 + int newSequence = maxSequence + 1; + // 序列号补零到4位 + String sequenceStr = String.format("%04d", newSequence); + return codePrefix + sequenceStr; + } + + /** + * 上传开票回执 + * + * @param bill 开票单信息 + * @param file 回执文件 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult uploadReceipt(OmsInvoiceBill bill, MultipartFile file) throws Exception { + OmsInvoiceBill omsInvoiceBill = selectOmsInvoiceBillById(bill.getId()); + if (omsInvoiceBill == null) { + throw new ServiceException("开票单不存在"); + } + + // 检查开票金额是否与应收单一致 + if (omsInvoiceBill.getTotalPriceWithTax().compareTo(bill.getInvoicePriceWithTax()) != 0){ + return AjaxResult.error("开票金额与应收单金额不一致"); + } + + // 这里可以添加上传附件的逻辑 + // omsFinAttachmentService.uploadAttachment(file, omsInvoiceBill.getId(), "INVOICE_RECEIPT"); + + omsInvoiceBill.setActualInvoiceTime(DateUtils.getNowDate()); + omsInvoiceBill.setApproveStatus(ApproveStatusEnum.WAIT_APPROVE.getCode()); + omsInvoiceBill.setInvoicePriceWithTax(bill.getInvoicePriceWithTax()); + omsInvoiceBill.setInvoicePriceWithoutTax(bill.getInvoicePriceWithoutTax()); + omsInvoiceBill.setInvoiceType(bill.getInvoiceType()); + updateOmsInvoiceBill(omsInvoiceBill); + +// // 根据开票单类型启动不同流程 +// if (OmsInvoiceBill.InvoiceBillTypeEnum.FROM_RECEIVABLE.getCode().equals(omsInvoiceBill.getInvoiceBillType())) { +// todoService.startProcessDeleteBefore(omsInvoiceBill.getInvoiceBillCode(), omsInvoiceBill.getInvoiceBillCode(), +// "financeInvoice", omsInvoiceBill.getCreateBy()); +// } else { +// todoService.startProcessDeleteBefore(omsInvoiceBill.getInvoiceBillCode(), omsInvoiceBill.getInvoiceBillCode(), +// "financeInvoiceRefound", omsInvoiceBill.getCreateBy()); +// } + + return AjaxResult.success("上传成功"); + } + + /** + * 查询待审批列表 + * + * @param omsInvoiceBill 开票单 + * @return 开票单列表 + */ + @Override + public List listApprove(OmsInvoiceBill omsInvoiceBill) { + omsInvoiceBill.setApproveUser(ShiroUtils.getUserId()); + return omsInvoiceBillMapper.listApprove(omsInvoiceBill, "bu_todo"); + } + + /** + * 查询已审批列表 + * + * @param omsInvoiceBill 开票单 + * @return 开票单列表 + */ + @Override + public List listApproved(OmsInvoiceBill omsInvoiceBill) { + omsInvoiceBill.setApproveUser(ShiroUtils.getUserId()); + return omsInvoiceBillMapper.listApprove(omsInvoiceBill, "bu_todo_completed"); + } + + /** + * 根据开票单编号查询 + * + * @param invoiceBillCode 开票单编号 + * @return 开票单 + */ + @Override + public OmsInvoiceBill selectOmsInvoiceBillByCode(String invoiceBillCode) { + return omsInvoiceBillMapper.selectOmsInvoiceBillByCode(invoiceBillCode); + } + + /** + * 申请红冲 + * + * @param id 开票单ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult applyRefund(Long id) { + OmsInvoiceBill originalBill = selectOmsInvoiceBillById(id); + if (originalBill == null) { + return AjaxResult.error("开票单不存在"); + } + + // 检查是否已红冲 + if (!OmsInvoiceBill.InvoiceStatusEnum.INVOICE.getCode().equals(originalBill.getInvoiceStatus())) { + return AjaxResult.error("只有已开票状态的单据才能申请红冲"); + } + + // 检查是否已经申请过红冲 + if (OmsInvoiceBill.RefundStatusEnum.REFUNDED.getCode().equals(originalBill.getRefundStatus())) { + return AjaxResult.error("该单据已申请红冲,不能重复申请"); + } + + // 创建红冲单 + OmsInvoiceBill refundBill = new OmsInvoiceBill(); + refundBill.setInvoiceBillCode(generateInvoiceBillCode()); + refundBill.setInvoiceType(originalBill.getInvoiceType()); + refundBill.setPartnerCode(originalBill.getPartnerCode()); + refundBill.setTotalPriceWithTax(originalBill.getTotalPriceWithTax().negate()); // 负数金额 + refundBill.setTotalPriceWithoutTax(originalBill.getTotalPriceWithoutTax().negate()); + refundBill.setTaxRate(originalBill.getTaxRate()); + refundBill.setApproveStatus(ApproveStatusEnum.WAIT_COMMIT.getCode()); + refundBill.setInvoiceBillType(OmsInvoiceBill.InvoiceBillTypeEnum.RED_RUSH.getCode()); + refundBill.setInvoiceStatus(OmsInvoiceBill.InvoiceStatusEnum.INVOICE.getCode()); + refundBill.setRefundStatus(OmsInvoiceBill.RefundStatusEnum.REFUNDED.getCode()); + refundBill.setOriginalBillId(originalBill.getId()); // 关联原始单据 + refundBill.setCreateTime(DateUtils.getNowDate()); + + insertOmsInvoiceBill(refundBill); + + // 更新原单据的红冲状态 + originalBill.setRefundStatus(OmsInvoiceBill.RefundStatusEnum.REFUNDED.getCode()); + updateOmsInvoiceBill(originalBill); + + return AjaxResult.success("红冲申请已提交"); + } + + /** + * 退回开票单 + * + * @param id 开票单ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public AjaxResult returnInvoice(Long id) { + + OmsInvoiceBill invoiceBill = selectOmsInvoiceBillById(id); + if (invoiceBill == null){ + return AjaxResult.error("开票单不存在"); + } + // 2. 检查开票单类型,只有FROM_RECEIVABLE类型的开票单才能退回 + if (!OmsInvoiceBill.InvoiceBillTypeEnum.FROM_RECEIVABLE.getCode().equals(invoiceBill.getInvoiceBillType())) { + return AjaxResult.error("只有由应收单合并生成的开票单才能执行退回操作"); + } + List omsReceivableInvoiceDetails = detailService.listByInvoiceBillCode(invoiceBill.getInvoiceBillCode()); + omsInvoiceBillMapper.clearRelationReceivable(invoiceBill.getInvoiceBillCode()); + + int result = omsInvoiceBillMapper.deleteOmsInvoiceBillById(id); + + if (result <= 0) { + throw new RuntimeException("删除开票单失败"); + } + if (CollUtil.isNotEmpty(omsReceivableInvoiceDetails)){ + omsReceivableBillService.updateInvoiceAmount(omsReceivableInvoiceDetails.stream() + .map(OmsReceivableInvoiceDetail::getReceivableBillId).distinct().collect(Collectors.toList())); + } + return AjaxResult.success("退回开票单成功"); + } + + @Override + public Object todoDetail(String businessKey, String processKey, String todoId) { + return null; + } + + @Override + public Object completedTodoDetail(String businessKey, String processKey, String todoId) { + return null; + } + + @Override + public void fillBusinessInfo(List todoCompletedList) { + + } + + @Override + public boolean todoApproveCallback(Todo todo) { + return TodoCommonTemplate.super.todoApproveCallback(todo); + } + + @Override + public boolean multiInstanceApproveCallback(String activityName, ProcessInstance processInstance) { + return TodoCommonTemplate.super.multiInstanceApproveCallback(activityName, processInstance); + } +// @Override +// public String getBusinessKey() { +// return "invoiceBillCode"; +// } +// +// @Override +// public void reject(String businessKey) { +// OmsInvoiceBill omsInvoiceBill = new OmsInvoiceBill(); +// omsInvoiceBill.setInvoiceBillCode(businessKey); +// omsInvoiceBill.setApproveStatus(ApproveStatusEnum.APPROVE_REJECT.getCode()); +// omsInvoiceBillMapper.updateOmsInvoiceBillByCode(omsInvoiceBill); +// } +// +// @Override +// public void approve(String businessKey) { +// OmsInvoiceBill omsInvoiceBill = new OmsInvoiceBill(); +// omsInvoiceBill.setInvoiceBillCode(businessKey); +// omsInvoiceBill.setApproveStatus(ApproveStatusEnum.APPROVE_COMPLETE.getCode()); +// omsInvoiceBill.setInvoiceStatus(OmsInvoiceBill.InvoiceStatusEnum.INVOICE.getCode()); +// omsInvoiceBill.setApproveTime(DateUtils.getNowDate()); +// omsInvoiceBillMapper.updateOmsInvoiceBillByCode(omsInvoiceBill); +// +// OmsInvoiceBill existBill = selectOmsInvoiceBillByCode(businessKey); +// // 如果需要更新关联的应收单状态,可以在这里添加逻辑 +// // omsReceivableBillService.updateInvoiceAmount(existBill.getReceivableBillCode(), existBill.getTotalPriceWithTax()); +// } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInvoiceReceiptBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInvoiceReceiptBillServiceImpl.java deleted file mode 100644 index 2dbb8cf0..00000000 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsInvoiceReceiptBillServiceImpl.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.ruoyi.sip.service.impl; - -import java.util.List; -import com.ruoyi.common.utils.DateUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ruoyi.sip.mapper.OmsInvoiceReceiptBillMapper; -import com.ruoyi.sip.domain.OmsInvoiceReceiptBill; -import com.ruoyi.sip.service.IOmsInvoiceReceiptBillService; -import com.ruoyi.common.core.text.Convert; - -/** - * 采购收票单Service业务层处理 - * - * @author ruoyi - * @date 2025-10-22 - */ -@Service -public class OmsInvoiceReceiptBillServiceImpl implements IOmsInvoiceReceiptBillService -{ - @Autowired - private OmsInvoiceReceiptBillMapper omsInvoiceReceiptBillMapper; - - /** - * 查询采购收票单 - * - * @param id 采购收票单主键 - * @return 采购收票单 - */ - @Override - public OmsInvoiceReceiptBill selectOmsInvoiceReceiptBillById(Long id) - { - return omsInvoiceReceiptBillMapper.selectOmsInvoiceReceiptBillById(id); - } - - /** - * 查询采购收票单列表 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 采购收票单 - */ - @Override - public List selectOmsInvoiceReceiptBillList(OmsInvoiceReceiptBill omsInvoiceReceiptBill) - { - return omsInvoiceReceiptBillMapper.selectOmsInvoiceReceiptBillList(omsInvoiceReceiptBill); - } - - /** - * 新增采购收票单 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 结果 - */ - @Override - public int insertOmsInvoiceReceiptBill(OmsInvoiceReceiptBill omsInvoiceReceiptBill) - { - omsInvoiceReceiptBill.setCreateTime(DateUtils.getNowDate()); - return omsInvoiceReceiptBillMapper.insertOmsInvoiceReceiptBill(omsInvoiceReceiptBill); - } - - /** - * 修改采购收票单 - * - * @param omsInvoiceReceiptBill 采购收票单 - * @return 结果 - */ - @Override - public int updateOmsInvoiceReceiptBill(OmsInvoiceReceiptBill omsInvoiceReceiptBill) - { - omsInvoiceReceiptBill.setUpdateTime(DateUtils.getNowDate()); - return omsInvoiceReceiptBillMapper.updateOmsInvoiceReceiptBill(omsInvoiceReceiptBill); - } - - /** - * 批量删除采购收票单 - * - * @param ids 需要删除的采购收票单主键 - * @return 结果 - */ - @Override - public int deleteOmsInvoiceReceiptBillByIds(String ids) - { - return omsInvoiceReceiptBillMapper.deleteOmsInvoiceReceiptBillByIds(Convert.toStrArray(ids)); - } - - /** - * 删除采购收票单信息 - * - * @param id 采购收票单主键 - * @return 结果 - */ - @Override - public int deleteOmsInvoiceReceiptBillById(Long id) - { - return omsInvoiceReceiptBillMapper.deleteOmsInvoiceReceiptBillById(id); - } -} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableBillServiceImpl.java index 4dc2fdea..4fe6351e 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableBillServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableBillServiceImpl.java @@ -16,8 +16,7 @@ import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.sip.domain.*; -import com.ruoyi.sip.domain.dto.MergedReceviableReceiptDataDto; -import com.ruoyi.sip.domain.dto.ReceivableOrderReceiptDto; +import com.ruoyi.sip.domain.dto.*; import com.ruoyi.sip.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -40,6 +39,9 @@ public class OmsReceivableBillServiceImpl implements IOmsReceivableBillService @Autowired private IOmsReceiptBillService receiptBillService; + + @Autowired + private IOmsInvoiceBillService invoiceBillService; @Autowired private IOmsReceivableReceiptDetailService detailService; @@ -83,7 +85,7 @@ public class OmsReceivableBillServiceImpl implements IOmsReceivableBillService Map decimalMap = receiptBills.stream().filter(item -> item.getRemainingAmount() != null) .collect(Collectors.toMap(OmsReceiptBill::getPartnerCode, OmsReceiptBill::getRemainingAmount, BigDecimal::add)); for (OmsReceivableBill payableBill : receivableBills) { - payableBill.setReceivedAmount(decimalMap.getOrDefault(payableBill.getPartnerCode(), BigDecimal.ZERO)); + payableBill.setRemainingAmount(decimalMap.getOrDefault(payableBill.getPartnerCode(), BigDecimal.ZERO)); } } return receivableBills; @@ -139,6 +141,8 @@ public class OmsReceivableBillServiceImpl implements IOmsReceivableBillService OmsReceivableBill omsReceivableBill = omsReceivableBillMapper.selectOmsReceivableBillById(id); List detailList = detailService.listByReceivableBillId(id); omsReceivableBill.setDetailList(detailList); + List omsReceivableInvoiceDetails = invoiceDetailService.listByReceivableBillId(id); + omsReceivableBill.setInvoiceDetailList(omsReceivableInvoiceDetails); return omsReceivableBill; } @@ -259,39 +263,146 @@ public class OmsReceivableBillServiceImpl implements IOmsReceivableBillService } List invoiceDetails = invoiceDetailService.listByReceivableBillIdList(idList); - java.util.Map> planMap = invoiceDetails.stream() - .collect(java.util.stream.Collectors.groupingBy( - OmsReceivableInvoiceDetail::getReceivableBillId, - java.util.stream.Collectors.groupingBy( - item -> item.getReceivableDetailType() == null ? OmsReceivableInvoiceDetail.ReceivableDetailTypeEnum.NORMAL_INVOICE.getCode() : item.getReceivableDetailType(), - java.util.stream.Collectors.reducing( - BigDecimal.ZERO, - detail -> (detail.getInvoiceAmount() != null) ? detail.getInvoiceAmount() : BigDecimal.ZERO, - BigDecimal::add - )))); - + Map> planMap = invoiceDetails.stream().collect(Collectors.groupingBy( + OmsReceivableInvoiceDetail::getReceivableBillId, + Collectors.toMap( + OmsReceivableInvoiceDetail::getInvoicePlanId, + Function.identity(), + (d1, d2) -> d1.getCreateTime().after(d2.getCreateTime()) ? d1 : d2 + ) + )); for (OmsReceivableBill bill : bills) { - java.util.Map amountMap = planMap.get(bill.getId()); - if (CollUtil.isNotEmpty(amountMap)) { - // 已开票金额 = 正常开票金额 - 红冲金额 - BigDecimal invoicedAmount = amountMap.getOrDefault(OmsReceivableInvoiceDetail.ReceivableDetailTypeEnum.NORMAL_INVOICE.getCode(), BigDecimal.ZERO) - .subtract(amountMap.getOrDefault(OmsReceivableInvoiceDetail.ReceivableDetailTypeEnum.REFUND.getCode(), BigDecimal.ZERO)); - bill.setInvoicedAmount(invoicedAmount); - // 未开票金额 = 总金额 - 已开票金额 - bill.setUninvoicedAmount(bill.getTotalPriceWithTax().subtract(invoicedAmount)); + Map paymentDetailMap = + planMap.getOrDefault(bill.getId(), Collections.emptyMap()); + if (CollUtil.isNotEmpty(paymentDetailMap)) { + Map amountMap = + paymentDetailMap.values().stream() + .filter(d -> d.getInvoiceAmount() != null) + .collect(Collectors.toMap( + OmsReceivableInvoiceDetail::getInvoiceStatus, + OmsReceivableInvoiceDetail::getInvoiceAmount, + BigDecimal::add + )); + // 4. 金额计算(集中处理,逻辑更清晰) + BigDecimal paidAmount = amountMap + .getOrDefault(OmsInvoiceBill.InvoiceStatusEnum.INVOICE.getCode(), BigDecimal.ZERO) + .add(amountMap.getOrDefault( + OmsInvoiceBill.InvoiceStatusEnum.RED_RUSH.getCode(), BigDecimal.ZERO)); + + BigDecimal waitPayAmount = + amountMap.getOrDefault( + OmsInvoiceBill.InvoiceStatusEnum.WAIT_INVOICE.getCode(), BigDecimal.ZERO); + bill.setInvoicedAmount(paidAmount); + bill.setUninvoicedAmount(bill.getTotalPriceWithTax().subtract(paidAmount) + .subtract(waitPayAmount)); } - // 获取最新未开票计划 - OmsReceivableInvoicePlan lastInvoicePlan = invoicePlanService.selectOmsReceivableInvoicePlanList(new OmsReceivableInvoicePlan() {{ - setReceivableBillId(bill.getId()); - }}).stream() - .filter(p -> p.getDetailId() == null) // 查找未执行的开票计划 - .min(java.util.Comparator.comparing(OmsReceivableInvoicePlan::getPlanInvoiceDate)) - .orElse(null); - bill.setLastInvoicePlanId(lastInvoicePlan == null ? -1L : lastInvoicePlan.getId()); + OmsReceivableInvoicePlan lastReceiptPlan = invoicePlanService.firstUnPayPlan(bill.getId()); + bill.setLastReceiptPlanId(lastReceiptPlan == null ? -1 : lastReceiptPlan.getId()); } + return omsReceivableBillMapper.updateBatchReceivableBillInvoiceInfo(bills); } + @Override + public int mergeAndInitiateInvoice(MergedReceviableInvoiceDataDto dto) { + // 1. Calculate Tax Totals + BigDecimal totalWithoutTax = BigDecimal.ZERO; + if (CollUtil.isEmpty(dto.getReceivableBills())) { + return 0; + } + + + // Fetch bills once + for (ReceivableOrderInvoiceDto order : dto.getReceivableBills()) { + BigDecimal taxRate = order.getTaxRate(); + if (taxRate == null || taxRate.compareTo(BigDecimal.ZERO) < 0) { + // 如果税率为空或小于0,则默认为0 + taxRate = new BigDecimal(defaultTax); + } + order.setTaxRate(taxRate); + for (OmsReceivableInvoicePlan plan : order.getInvoicePlans()) { + // 计算每个 plan 的未税金额 = planAmount / (1 + 税率),保留两位小数 + + // 计算未税金额 = planAmount / (1 + 税率) + BigDecimal divisor = BigDecimal.ONE.add(taxRate); + BigDecimal planWithoutTax = plan.getPlanAmount().divide(divisor, 2, java.math.RoundingMode.HALF_UP); + totalWithoutTax = totalWithoutTax.add(planWithoutTax); + } + } + + // 2. 创建收票单 + OmsInvoiceBill invoiceBill = new OmsInvoiceBill(); + OmsReceivableBill firstReceivableBill = selectOmsReceivableBillById(dto.getReceivableBills().get(0).getId()); + invoiceBill.setInvoiceBillType(dto.getInvoiceBillType()); + invoiceBill.setInvoiceTime(dto.getInvoiceTime()); + invoiceBill.setPartnerCode(firstReceivableBill.getPartnerCode()); + invoiceBill.setPartnerName(firstReceivableBill.getPartnerName()); + invoiceBill.setTotalPriceWithTax(dto.getTotalMergeInvoiceAmount()); + + // Set Calculated Tax Info + invoiceBill.setTotalPriceWithoutTax(totalWithoutTax); + + + invoiceBill.setInvoiceBillType(OmsInvoiceBill.InvoiceBillTypeEnum.FROM_RECEIVABLE.getCode()); + invoiceBill.setInvoiceStatus(OmsInvoiceBill.InvoiceStatusEnum.WAIT_INVOICE.getCode()); + invoiceBillService.insertOmsInvoiceBill(invoiceBill); + + // 3. 创建收票明细 - 防止重复收票 + // 收集所有收票计划ID + List allInvoicePlanIds = dto.getReceivableBills().stream() + .flatMap(order -> order.getInvoicePlans().stream()) + .map(OmsReceivableInvoicePlan::getId) + .collect(Collectors.toList()); + + // 查询现有的收票明细记录 + Map existingDetailsMap = new java.util.HashMap<>(); + if (!allInvoicePlanIds.isEmpty()) { + List omsReceivableInvoiceDetails = invoiceDetailService.selectByInvoicePlanIds(allInvoicePlanIds); + + // 使用stream将查询结果转化为Map,以planId为key,detail为value,取createtime最新的数据 + existingDetailsMap = omsReceivableInvoiceDetails.stream() + .collect(Collectors.toMap( + OmsReceivableInvoiceDetail::getInvoicePlanId, + detail -> detail, + // 如果有重复数据,取createtime最新的数据 + (existing, replacement) -> existing.getCreateTime().compareTo(replacement.getCreateTime()) >= 0 ? existing : replacement + )); + } + + // 遍历所有计划并检查是否有已收票的记录 + for (ReceivableOrderInvoiceDto invoiceDto : dto.getReceivableBills()) { + for (OmsReceivableInvoicePlan invoicePlan : invoiceDto.getInvoicePlans()) { + // 检查是否存在已收票的记录 + OmsReceivableInvoiceDetail existingDetail = existingDetailsMap.get(invoicePlan.getId()); + if (existingDetail != null) { + // 检查是否是已收票状态,如果是则抛出异常 + if (!OmsPayableTicketDetail.PayableDetailTypeEnum.RED_RUSH.getCode().equals(existingDetail.getReceivableDetailType())) { + throw new ServiceException("计划ID为 " + invoicePlan.getId() + " 的收票已处理,请刷新页面后重试"); + } + } + + OmsReceivableInvoiceDetail detail = new OmsReceivableInvoiceDetail(); + detail.setReceivableBillId(invoiceDto.getId()); + detail.setInvoicePlanId(invoicePlan.getId()); + detail.setInvoiceBillCode(invoiceBill.getInvoiceBillCode()); + detail.setInvoiceAmount(invoicePlan.getPlanAmount()); + detail.setInvoiceRate(invoicePlan.getPlanRate()); + detail.setInvoiceAmountWithoutTax(detail.getInvoiceAmount().divide(BigDecimal.ONE.add(invoiceDto.getTaxRate()), 2, java.math.RoundingMode.HALF_UP)); + detail.setInvoiceAmountTax(detail.getInvoiceAmount().subtract(detail.getInvoiceAmountWithoutTax())); + detail.setInvoiceTime(invoicePlan.getPlanInvoiceDate()); + detail.setRemark(invoicePlan.getRemark()); + detail.setCreateBy(ShiroUtils.getUserId().toString()); + detail.setReceivableDetailType(OmsReceivableInvoiceDetail.ReceivableDetailTypeEnum.NORMAL_INVOICE.getCode()); + invoiceDetailService.insertOmsReceivableInvoiceDetail(detail); + } + } + + // 批量更新应付单的收票相关信息 + return SpringUtils.getAopProxy(this).updateInvoiceAmount(dto.getReceivableBills().stream() + .map(ReceivableOrderInvoiceDto::getId).collect(Collectors.toList())); + + } + @Override public int updateReceiptAmount(List idList) { if (CollUtil.isEmpty(idList)) { diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoiceDetailServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoiceDetailServiceImpl.java index d66df1e9..a28e1e26 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoiceDetailServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoiceDetailServiceImpl.java @@ -2,8 +2,13 @@ package com.ruoyi.sip.service.impl; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; -import com.ruoyi.sip.domain.OmsPayableTicketDetail; +import cn.hutool.core.collection.CollUtil; +import com.ruoyi.sip.domain.OmsFinAttachment; +import com.ruoyi.sip.service.IOmsFinAttachmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.sip.mapper.OmsReceivableInvoiceDetailMapper; @@ -22,6 +27,8 @@ public class OmsReceivableInvoiceDetailServiceImpl implements IOmsReceivableInvo @Autowired private OmsReceivableInvoiceDetailMapper omsReceivableInvoiceDetailMapper; + @Autowired + private IOmsFinAttachmentService finAttachmentService; /** * 查询应收单开票明细 * @@ -96,7 +103,33 @@ public class OmsReceivableInvoiceDetailServiceImpl implements IOmsReceivableInvo @Override public List listByReceivableBillIdList(List collect) { - return omsReceivableInvoiceDetailMapper.listByReceivableBillIdList(collect); + + if (CollUtil.isEmpty(collect)){ + return Collections.emptyList(); + } + OmsReceivableInvoiceDetail omsReceivableInvoiceDetail = new OmsReceivableInvoiceDetail(); + omsReceivableInvoiceDetail.setReceivableBillIdList(collect); + return omsReceivableInvoiceDetailMapper.list(omsReceivableInvoiceDetail); + } + + @Override + public List listByReceivableBillId(Long receivableBillId) { + OmsReceivableInvoiceDetail omsReceivableInvoiceDetail = new OmsReceivableInvoiceDetail(); + omsReceivableInvoiceDetail.setReceivableBillId(receivableBillId); + List list = omsReceivableInvoiceDetailMapper.list(omsReceivableInvoiceDetail); + if (CollUtil.isNotEmpty(list)){ + OmsFinAttachment omsFinAttachment = new OmsFinAttachment(); + omsFinAttachment.setRelatedBillIdList(list.stream().map(OmsReceivableInvoiceDetail::getInvoiceBillId).distinct().collect(Collectors.toList())); + omsFinAttachment.setRelatedBillType(OmsFinAttachment.RelatedBillTypeEnum.RECEIVE_INVOICE.getCode()); + omsFinAttachment.setDelFlag("0"); + List attachmentList = finAttachmentService.selectOmsFinAttachmentList(omsFinAttachment); + Map collect = attachmentList.stream().collect(Collectors.toMap(OmsFinAttachment::getRelatedBillId, Function.identity())); + for (OmsReceivableInvoiceDetail detail : list) { + detail.setAttachment(collect.get(detail.getInvoiceBillId())); + } + } + + return list; } @Override @@ -106,4 +139,11 @@ public class OmsReceivableInvoiceDetailServiceImpl implements IOmsReceivableInvo } return omsReceivableInvoiceDetailMapper.selectByInvoicePlanIds(invoicePlanIds); } + + @Override + public List listByInvoiceBillCode(String invoiceBillCode) { + OmsReceivableInvoiceDetail omsReceivableInvoiceDetail = new OmsReceivableInvoiceDetail(); + omsReceivableInvoiceDetail.setInvoiceBillCode(invoiceBillCode); + return omsReceivableInvoiceDetailMapper.list(omsReceivableInvoiceDetail); + } } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoicePlanServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoicePlanServiceImpl.java index c0a3583a..5cb51387 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoicePlanServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoicePlanServiceImpl.java @@ -110,19 +110,19 @@ public class OmsReceivableInvoicePlanServiceImpl implements IOmsReceivableInvoic OmsReceivableInvoicePlan omsReceivableInvoicePlan = new OmsReceivableInvoicePlan(); omsReceivableInvoicePlan.setReceivableBillId(receivableBillId); List omsReceivableInvoicePlans = omsReceivableInvoicePlanMapper.selectOmsReceivableInvoicePlanList(omsReceivableInvoicePlan); -// if (CollUtil.isNotEmpty(omsReceivableInvoicePlans)) { -// List omsPayablePaymentDetails = detailService.listByReceivableBillIdList(omsReceivableInvoicePlans.stream().map(OmsReceivableInvoicePlan::getReceivableBillId).collect(Collectors.toList())); -// Map detailMap = omsPayablePaymentDetails.stream().collect(Collectors.toMap(OmsReceivableInvoiceDetail::getInvoicePlanId, Function.identity(), -// (v1, v2) -> v1.getCreateTime().after(v2.getCreateTime()) ? v1 : v2)); -// for (OmsReceivableInvoicePlan plan : omsReceivableInvoicePlans) { -// //找到最新的一条数据 如果不是退款 那么不允许再次勾选 -// OmsReceivableInvoiceDetail detail = detailMap.get(plan.getId()); -// if (detail != null && !OmsReceivableInvoiceDetail.PayableDetailTypeEnum.RED_RUSH.getCode().equalsIgnoreCase(detail.getInvoiceDetailType())) { -// -// plan.setDetailId(detail.getId()); -// } -// } -// } + if (CollUtil.isNotEmpty(omsReceivableInvoicePlans)) { + List omsPayablePaymentDetails = detailService.listByReceivableBillIdList(omsReceivableInvoicePlans.stream().map(OmsReceivableInvoicePlan::getReceivableBillId).collect(Collectors.toList())); + Map detailMap = omsPayablePaymentDetails.stream().collect(Collectors.toMap(OmsReceivableInvoiceDetail::getInvoicePlanId, Function.identity(), + (v1, v2) -> v1.getCreateTime().after(v2.getCreateTime()) ? v1 : v2)); + for (OmsReceivableInvoicePlan plan : omsReceivableInvoicePlans) { + //找到最新的一条数据 如果不是退款 那么不允许再次勾选 + OmsReceivableInvoiceDetail detail = detailMap.get(plan.getId()); + if (detail != null && !OmsReceivableInvoiceDetail.ReceivableDetailTypeEnum.REFUND.getCode().equalsIgnoreCase(detail.getReceivableDetailType())) { + + plan.setDetailId(detail.getId()); + } + } + } return omsReceivableInvoicePlans; } @@ -164,4 +164,9 @@ public class OmsReceivableInvoicePlanServiceImpl implements IOmsReceivableInvoic billMapper.updateOmsReceivableBill(receivableBill); } + @Override + public OmsReceivableInvoicePlan firstUnPayPlan(Long id) { + return omsReceivableInvoicePlanMapper.firstUnPayPlan(id); + } + } \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptPlanServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptPlanServiceImpl.java index c9f062cb..72a3fc93 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptPlanServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptPlanServiceImpl.java @@ -207,7 +207,7 @@ public class OmsReceivableReceiptPlanServiceImpl implements IOmsReceivableReceip if (!hasExecutedInvoice) { List newPlans = convertReceiptToInvoice(receiptPlans, receivableBillId); - updateInvoicePlan(receivableBillId, newPlans); + invoicePlanService.updateInvoicePlans(receivableBillId, newPlans); } else { List executedInvoices = invoicePlans.stream() .filter(p -> p.getDetailId() != null).collect(Collectors.toList()); @@ -245,7 +245,7 @@ public class OmsReceivableReceiptPlanServiceImpl implements IOmsReceivableReceip List finalPlans = new ArrayList<>(executedInvoices); finalPlans.addAll(newPlans); - updateInvoicePlan(receivableBillId, finalPlans); + invoicePlanService.updateInvoicePlans(receivableBillId, finalPlans); } } @@ -254,35 +254,7 @@ public class OmsReceivableReceiptPlanServiceImpl implements IOmsReceivableReceip return omsReceivableReceiptPlanMapper.firstUnPayPlan(id); } - /** - * 更新开票计划 - * - * @param receivableBillId 应收单ID - * @param invoicePlanList 开票计划列表 - */ - private void updateInvoicePlan(Long receivableBillId, List invoicePlanList) { - // 删除原有的开票计划 - OmsReceivableInvoicePlan invoicePlanCriteria = new OmsReceivableInvoicePlan(); - invoicePlanCriteria.setReceivableBillId(receivableBillId); - List existingPlans = invoicePlanService.selectOmsReceivableInvoicePlanList(invoicePlanCriteria); - // Collect IDs of existing plans to delete them - if (!existingPlans.isEmpty()) { - String ids = existingPlans.stream() - .map(plan -> plan.getId().toString()) - .reduce((a, b) -> a + "," + b) - .orElse(""); - if (!ids.isEmpty()) { - invoicePlanService.deleteOmsReceivableInvoicePlanByIds(ids); - } - } - - // 批量插入新的开票计划 - for (OmsReceivableInvoicePlan plan : invoicePlanList) { - plan.setReceivableBillId(receivableBillId); - invoicePlanService.insertOmsReceivableInvoicePlan(plan); - } - } private List convertReceiptToInvoice(List receiptPlans, Long receivableBillId) { List list = new ArrayList<>(); diff --git a/ruoyi-sip/src/main/resources/mapper/finance/OmsInvoiceReceiptBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/finance/OmsInvoiceReceiptBillMapper.xml deleted file mode 100644 index 7f877297..00000000 --- a/ruoyi-sip/src/main/resources/mapper/finance/OmsInvoiceReceiptBillMapper.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - select id, invoice_receipt_bill_code, vendor_code, order_code, total_price_with_tax, total_price_without_tax, tax_amount, create_by, create_time, update_by, update_time, remark, del_flag from oms_invoice_receipt_bill - - - - - - - - insert into oms_invoice_receipt_bill - - invoice_receipt_bill_code, - vendor_code, - order_code, - total_price_with_tax, - total_price_without_tax, - tax_amount, - create_by, - create_time, - update_by, - update_time, - remark, - del_flag, - - - #{invoiceReceiptBillCode}, - #{vendorCode}, - #{orderCode}, - #{totalPriceWithTax}, - #{totalPriceWithoutTax}, - #{taxAmount}, - #{createBy}, - #{createTime}, - #{updateBy}, - #{updateTime}, - #{remark}, - #{delFlag}, - - - - - update oms_invoice_receipt_bill - - invoice_receipt_bill_code = #{invoiceReceiptBillCode}, - vendor_code = #{vendorCode}, - order_code = #{orderCode}, - total_price_with_tax = #{totalPriceWithTax}, - total_price_without_tax = #{totalPriceWithoutTax}, - tax_amount = #{taxAmount}, - create_by = #{createBy}, - create_time = #{createTime}, - update_by = #{updateBy}, - update_time = #{updateTime}, - remark = #{remark}, - del_flag = #{delFlag}, - - where id = #{id} - - - - delete from oms_invoice_receipt_bill where id = #{id} - - - - delete from oms_invoice_receipt_bill where id in - - #{id} - - - - \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsInvoiceBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsInvoiceBillMapper.xml new file mode 100644 index 00000000..ebf345dd --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsInvoiceBillMapper.xml @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, invoice_bill_code, invoice_type, invoice_bill_type, + invoice_time, partner_code, total_price_with_tax, total_price_without_tax, + tax_rate, create_by, create_time, update_by, update_time, + remark, del_flag, actual_invoice_time, invoice_status, + approve_status, approve_time, refund_status + , original_bill_id + from oms_invoice_bill + + + + + + + + insert into oms_invoice_bill + + + invoice_bill_code, + + + invoice_type, + + + invoice_bill_type, + + + + invoice_time, + + + partner_code, + + + partner_name, + + + total_price_with_tax, + + + total_price_without_tax, + + + tax_rate, + + + create_by, + + + create_time, + + + update_by, + + + update_time, + + + remark, + + + del_flag, + + + actual_invoice_time, + + + invoice_status, + + + approve_status, + + + approve_node, + + + approve_time, + + + refund_status, + + + original_bill_id, + + + + + #{invoiceBillCode}, + + + #{invoiceType}, + + + #{invoiceBillType}, + + + #{invoiceTime}, + + + #{partnerCode}, + + + #{partnerName}, + + + #{totalPriceWithTax}, + + + #{totalPriceWithoutTax}, + + + #{taxRate}, + + + #{createBy}, + + + #{createTime}, + + + #{updateBy}, + + + #{updateTime}, + + + #{remark}, + + + #{delFlag}, + + + #{actualInvoiceTime}, + + + #{invoiceStatus}, + + + #{approveStatus}, + + + #{approveNode}, + + + #{approveTime}, + + + #{refundStatus}, + + + + #{originalBillId}, + + + + + + update oms_invoice_bill + + + invoice_bill_code = #{invoiceBillCode}, + + + invoice_type = #{invoiceType}, + + + invoice_bill_type = #{invoiceBillType}, + + + + invoice_time = #{invoiceTime}, + + + partner_code = #{partnerCode}, + + + total_price_with_tax = #{totalPriceWithTax}, + + + total_price_without_tax = #{totalPriceWithoutTax}, + + + tax_rate = #{taxRate}, + + + create_by = #{createBy}, + + + create_time = #{createTime}, + + + update_by = #{updateBy}, + + + update_time = #{updateTime}, + + + remark = #{remark}, + + + del_flag = #{delFlag}, + + + actual_invoice_time = #{actualInvoiceTime}, + + + invoice_status = #{invoiceStatus}, + + + approve_status = #{approveStatus}, + + + approve_node = #{approveNode}, + + + approve_time = #{approveTime}, + + + refund_status = #{refundStatus}, + + + + original_bill_id = #{originalBillId}, + + + where id = #{id} + + + + update oms_invoice_bill + + + invoice_status = #{invoiceStatus}, + + + approve_status = #{approveStatus}, + + + approve_node = #{approveNode}, + + + approve_time = #{approveTime}, + + + actual_invoice_time = #{actualInvoiceTime}, + + + refund_status = #{refundStatus}, + + + where invoice_bill_code = #{invoiceBillCode} + + + + delete from oms_invoice_bill where id = #{id} + + + + delete from oms_invoice_bill where id in + + #{id} + + + + delete from oms_receivable_invoice_detail where invoice_bill_code=#{code} + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsPayableTicketWriteOffMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsPayableTicketWriteOffMapper.xml new file mode 100644 index 00000000..86fbd0cf --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsPayableTicketWriteOffMapper.xml @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + select t1.id, t1.write_off_code, t1.write_off_type, t1.ticket_bill_code, t1.vendor_code, + t1.write_off_amount, t1.write_off_amount_without_tax, t1.write_off_tax_amount, + t1.write_off_time, t1.remark, t1.create_by, t1.create_time, t1.update_by, t1.update_time, + t3.user_name as create_by_name,t2.vendor_name + from oms_payable_ticket_write_off t1 + left join oms_vendor_info t2 on t1.vendor_code = t2.vendor_code + left join sys_user t3 on t1.create_by = t3.user_id + + + + + + + + insert into oms_payable_ticket_write_off + + + write_off_code, + + + write_off_type, + + + ticket_bill_code, + + + vendor_code, + + + write_off_amount, + + + write_off_amount_without_tax, + + + write_off_tax_amount, + + + write_off_time, + + + remark, + + + create_by, + + + create_time, + + + update_by, + + + update_time, + + + + + #{writeOffCode}, + + + #{writeOffType}, + + + #{ticketBillCode}, + + + #{vendorCode}, + + + #{writeOffAmount}, + + + #{writeOffAmountWithoutTax}, + + + #{writeOffTaxAmount}, + + + #{writeOffTime}, + + + #{remark}, + + + #{createBy}, + + + #{createTime}, + + + #{updateBy}, + + + #{updateTime}, + + + + + + update oms_payable_ticket_write_off + + + write_off_code = #{writeOffCode}, + + + write_off_type = #{writeOffType}, + + + ticket_bill_code = #{ticketBillCode}, + + + vendor_code = #{vendorCode}, + + + write_off_amount = #{writeOffAmount}, + + + write_off_amount_without_tax = #{writeOffAmountWithoutTax}, + + + write_off_tax_amount = #{writeOffTaxAmount}, + + + write_off_time = #{writeOffTime}, + + + remark = #{remark}, + + + create_by = #{createBy}, + + + create_time = #{createTime}, + + + update_by = #{updateBy}, + + + update_time = #{updateTime}, + + + where id = #{id} + + + + delete from oms_payable_ticket_write_off where id = #{id} + + + + delete from oms_payable_ticket_write_off where id in + + #{id} + + + + + + + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableBillMapper.xml index 36861cec..96e0d165 100644 --- a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableBillMapper.xml +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableBillMapper.xml @@ -35,11 +35,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" t1.total_price_with_tax, t1.total_price_without_tax, t1.tax_rate, t1.tax_amount, t1.received_amount, t1.unreceived_amount, t1.invoiced_amount, t1.uninvoiced_amount, t1.create_by, t1.create_time, t1.update_by, t1.update_time, t1.remark, t1.del_flag ,t3.project_name, t3.project_code - ,t4.plan_amount,t4.plan_receipt_date + ,t4.plan_amount,t4.plan_receipt_date, + t5.plan_amount as plan_invoice_amount, t5.plan_invoice_date from oms_receivable_bill t1 left join project_order_info t2 on t1.order_code=t2.order_code left join project_info t3 on t2.project_id=t3.id left join oms_receivable_receipt_plan t4 on t1.last_receipt_plan_id=t4.id + left join oms_receivable_invoice_plan t5 on t1.last_invoice_plan_id=t5.id - + SELECT + t1.*,t2.invoice_bill_code,t2.actual_invoice_time,t2.invoice_status,t2.id as invoice_bill_id + FROM + oms_receivable_invoice_detail t1 + LEFT JOIN oms_invoice_bill t2 ON t1.invoice_bill_code = t2.invoice_bill_code - - and receivable_bill_id in - + + and t1.receivable_bill_id in + #{item} + + and t1.receivable_bill_id =#{receivableBillId} + + + and t1.invoice_bill_code =#{invoiceBillCode} +