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 new file mode 100644 index 00000000..597ac654 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receivable/components/EditForm.vue @@ -0,0 +1,245 @@ + + + + diff --git a/oms_web/oms_vue/src/views/finance/receivable/components/InvoicePlan.vue b/oms_web/oms_vue/src/views/finance/receivable/components/InvoicePlan.vue new file mode 100644 index 00000000..ac715df3 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receivable/components/InvoicePlan.vue @@ -0,0 +1,293 @@ + + + + + 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 new file mode 100644 index 00000000..d5395072 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receivable/components/MergeInvoiceDialog.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/finance/receivable/components/MergeReceiptDialog.vue b/oms_web/oms_vue/src/views/finance/receivable/components/MergeReceiptDialog.vue new file mode 100644 index 00000000..0a61b009 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receivable/components/MergeReceiptDialog.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/finance/receivable/components/ReceiptPlan.vue b/oms_web/oms_vue/src/views/finance/receivable/components/ReceiptPlan.vue new file mode 100644 index 00000000..90b4eff2 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receivable/components/ReceiptPlan.vue @@ -0,0 +1,312 @@ + + + + + diff --git a/oms_web/oms_vue/src/views/finance/receivable/index.vue b/oms_web/oms_vue/src/views/finance/receivable/index.vue new file mode 100644 index 00000000..671a2f97 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/receivable/index.vue @@ -0,0 +1,318 @@ + + + diff --git a/oms_web/oms_vue/src/views/finance/writeoff/index.vue b/oms_web/oms_vue/src/views/finance/writeoff/index.vue new file mode 100644 index 00000000..d2730718 --- /dev/null +++ b/oms_web/oms_vue/src/views/finance/writeoff/index.vue @@ -0,0 +1,395 @@ + + + + + diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableWriteOffController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableWriteOffController.java new file mode 100644 index 00000000..236b1aeb --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsPayableWriteOffController.java @@ -0,0 +1,120 @@ +package com.ruoyi.sip.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +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.OmsPayableWriteOff; +import com.ruoyi.sip.dto.WriteOffRequestDto; +import com.ruoyi.sip.dto.WriteOffQueryDto; +import com.ruoyi.sip.dto.WriteOffDetailResultDto; +import com.ruoyi.sip.service.IOmsPayableWriteOffService; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 采购应付核销单Controller + * + * @author zghz + * @date 2025-12-16 + */ +@RestController +@RequestMapping("/sip/writeOff") +public class OmsPayableWriteOffController extends BaseController +{ + @Autowired + private IOmsPayableWriteOffService omsPayableWriteOffService; + + /** + * 查询采购应付核销单列表 + */ + @RequiresPermissions("sip:writeOff:list") + @GetMapping("/list") + public TableDataInfo list(WriteOffQueryDto writeOffQueryDto) + { + startPage(); + List list = omsPayableWriteOffService.selectOmsPayableWriteOffList(writeOffQueryDto); + return getDataTable(list); + } + + /** + * 导出采购应付核销单列表 + */ + @RequiresPermissions("sip:writeOff:export") + @Log(title = "采购应付核销单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, WriteOffQueryDto writeOffQueryDto) + { + List list = omsPayableWriteOffService.selectOmsPayableWriteOffList(writeOffQueryDto); + ExcelUtil util = new ExcelUtil(OmsPayableWriteOff.class); + util.exportExcel(response, list, "采购应付核销单数据"); + } + + /** + * 获取采购应付核销单详细信息 + */ + @RequiresPermissions("sip:writeOff:query") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(omsPayableWriteOffService.selectOmsPayableWriteOffById(id)); + } + + /** + * 新增采购应付核销单 + */ + @RequiresPermissions("sip:writeOff:add") + @Log(title = "采购应付核销单", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody WriteOffRequestDto writeOffRequestDto) + { + Long writeOffId = omsPayableWriteOffService.insertOmsPayableWriteOff(writeOffRequestDto); + return AjaxResult.success(); + } + + /** + * 修改采购应付核销单 + */ + @RequiresPermissions("sip:writeOff:edit") + @Log(title = "采购应付核销单", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody OmsPayableWriteOff omsPayableWriteOff) + { + return toAjax(omsPayableWriteOffService.updateOmsPayableWriteOff(omsPayableWriteOff)); + } + + /** + * 删除采购应付核销单 + */ + @RequiresPermissions("sip:writeOff:remove") + @Log(title = "采购应付核销单", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(omsPayableWriteOffService.deleteOmsPayableWriteOffByIds(ids)); + } + + /** + * 根据核销单ID查询核销详情 + */ + @RequiresPermissions("sip:writeOff:query") + @GetMapping("/details/{writeOffId}") + public AjaxResult getWriteOffDetails(@PathVariable("writeOffId") Long writeOffId) + { + List details = omsPayableWriteOffService.selectWriteOffDetailsByWriteOffId(writeOffId); + return AjaxResult.success(details); + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..5db4f458 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceiptBillController.java @@ -0,0 +1,70 @@ +package com.ruoyi.sip.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.sip.domain.OmsReceiptBill; +import com.ruoyi.sip.service.IOmsReceiptBillService; +import org.springframework.web.bind.annotation.*; + +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @Author ch + * @Desc 销售收款单表(OmsReceiptBill)表控制层 + * @Date 2025-12-16 17:47:25 + */ + +@RestController +@RequestMapping("omsReceiptBill") +public class OmsReceiptBillController extends BaseController { + + @Autowired + private IOmsReceiptBillService omsReceiptBillService; + + + @GetMapping("/list") + public TableDataInfo list(OmsReceiptBill omsReceiptBill) { + startPage(); + List list = omsReceiptBillService.queryAll(omsReceiptBill); + return getDataTable(list); + } + + + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return AjaxResult.success(omsReceiptBillService.queryById(id)); + } + + + + @PostMapping("/insert") + public AjaxResult add(@RequestBody OmsReceiptBill omsReceiptBill) { + return toAjax(omsReceiptBillService.insert(omsReceiptBill)); + } + + + + @PutMapping("/update") + public AjaxResult edit(@RequestBody OmsReceiptBill omsReceiptBill) { + return toAjax(omsReceiptBillService.update(omsReceiptBill)); + } + + + + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable("id") Long id) { + return toAjax(omsReceiptBillService.deleteById(id)); + } + + /** + * 通过主键批量删除销售收款单表 + */ + + @DeleteMapping("/remove/batch/{ids}") + public AjaxResult batchRemove(@PathVariable("ids") Long[] ids) { + return AjaxResult.success(omsReceiptBillService.batchRemove(ids)); + } +} 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 new file mode 100644 index 00000000..de7f1b6a --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableBillController.java @@ -0,0 +1,134 @@ +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.service.IOmsReceivableReceiptDetailService; +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.*; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.sip.domain.OmsReceivableBill; +import com.ruoyi.sip.service.IOmsReceivableBillService; +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-12-16 + */ +@Controller +@RequestMapping("/finance/receivable") +public class OmsReceivableBillController extends BaseController +{ + private String prefix = "finance/receivable"; + + @Autowired + private IOmsReceivableBillService omsReceivableBillService; + + + @RequiresPermissions("finance:receivable:view") + @GetMapping() + public String receivable() + { + return prefix + "/receivable"; + } + + /** + * 查询销售应收单列表 + */ + @RequiresPermissions("finance:receivable:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(@RequestBody OmsReceivableBill omsReceivableBill) + { + startPage(); + List list = omsReceivableBillService.selectOmsReceivableBillList(omsReceivableBill); + return getDataTable(list); + } + + /** + * 导出销售应收单列表 + */ + @RequiresPermissions("finance:receivable:export") + @Log(title = "销售应收单", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(OmsReceivableBill omsReceivableBill) + { + List list = omsReceivableBillService.selectOmsReceivableBillList(omsReceivableBill); + ExcelUtil util = new ExcelUtil(OmsReceivableBill.class); + return util.exportExcel(list, "销售应收单数据"); + } + + + + @RequiresPermissions("finance:receivable:query") + @Log(title = "销售应收单", businessType = BusinessType.INSERT) + @GetMapping("/{id}") + @ResponseBody + public AjaxResult query(@PathVariable("id") Long id) + { + return AjaxResult.success(omsReceivableBillService.query(id)); + } + + + /** + * 修改保存销售应收单 + */ + @RequiresPermissions("finance:receivable:edit") + @Log(title = "销售应收单", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(OmsReceivableBill omsReceivableBill) + { + return toAjax(omsReceivableBillService.updateOmsReceivableBill(omsReceivableBill)); + } + + /** + * 删除销售应收单 + */ + @RequiresPermissions("finance:receivable:remove") + @Log(title = "销售应收单", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(omsReceivableBillService.deleteOmsReceivableBillByIds(ids)); + } + /** + * 合并并发起付款单 + */ + @RequiresPermissions("finance:payable:mergePayment") + @Log(title = "合并并发起付款单", businessType = BusinessType.INSERT) + @PostMapping("/mergeAndInitiateReceipt") + @ResponseBody + public AjaxResult mergeAndInitiateReceipt(@RequestBody MergedReceviableReceiptDataDto dto) + { + return toAjax(omsReceivableBillService.mergeAndInitiateReceipt(dto)); + } + + /** + * 合并并发起收票单 + */ +// @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)); +// } + + +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableInvoicePlanController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableInvoicePlanController.java new file mode 100644 index 00000000..8bc17aea --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivableInvoicePlanController.java @@ -0,0 +1,36 @@ +package com.ruoyi.sip.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.sip.domain.OmsReceivableInvoicePlan; +import com.ruoyi.sip.domain.OmsReceivableReceiptPlan; +import com.ruoyi.sip.service.IOmsReceivableInvoicePlanService; +import com.ruoyi.sip.service.IOmsReceivableReceiptPlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/finance/receivable/invoice/plan") +public class OmsReceivableInvoicePlanController extends BaseController { + + @Autowired + private IOmsReceivableInvoicePlanService invoicePlanService; + + + @GetMapping(value = "/{receivableBillId}") + public AjaxResult getInfo(@PathVariable("receivableBillId") Long receivableBillId) + { + return AjaxResult.success(invoicePlanService.listByReceivableBillId(receivableBillId)); + } + + @PostMapping("/{receivableBillId}") + public AjaxResult updateInvoicePlan(@PathVariable("receivableBillId") Long receivableBillId, @RequestBody List invoicePlanList) { + invoicePlanService.updateInvoicePlans(receivableBillId, invoicePlanList); + return AjaxResult.success(); + } + + + +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivablePlanController.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivablePlanController.java new file mode 100644 index 00000000..016303e6 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/controller/OmsReceivablePlanController.java @@ -0,0 +1,43 @@ +package com.ruoyi.sip.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; + +import com.ruoyi.sip.domain.OmsReceivableReceiptPlan; +import com.ruoyi.sip.domain.OmsReceivableInvoicePlan; + +import com.ruoyi.sip.service.IOmsReceivableReceiptPlanService; +import com.ruoyi.sip.service.IOmsReceivableInvoicePlanService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/finance/receivable/plan") +public class OmsReceivablePlanController extends BaseController { + + @Autowired + private IOmsReceivableReceiptPlanService receiptPlanService; + + @Autowired + private IOmsReceivableInvoicePlanService invoicePlanService; + + @GetMapping("/{receivableBillId}") + public AjaxResult getReceiptPlan(@PathVariable("receivableBillId") Long receivableBillId) { + return AjaxResult.success(receiptPlanService.selectOmsReceivableReceiptPlanListByReceivableBillId(receivableBillId)); + } + + @PostMapping("/{receivableBillId}") + public AjaxResult updateReceiptPlan(@PathVariable("receivableBillId") Long receivableBillId, @RequestBody List receiptPlanList) { + receiptPlanService.updateReceiptPlans(receivableBillId, receiptPlanList); + return AjaxResult.success(); + } + + + @PostMapping("/sync/{receivableBillId}") + public AjaxResult syncReceiptToInvoicePlan(@PathVariable("receivableBillId") Long receivableBillId) { + receiptPlanService.syncReceiptToInvoicePlan(receivableBillId); + return AjaxResult.success(); + } +} \ 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 284c1d98..cf2e7480 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 @@ -58,6 +58,8 @@ public class OmsFinAttachment extends BaseEntity /** 付款单 */ PAYMENT("payment", "付款单"), INVOICE("ticket", "收票单"), + RECEIPT("receipt", "应收-收款单"), +// INVOICE("ticket", "收票单"), diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOff.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOff.java new file mode 100644 index 00000000..7bec5e80 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOff.java @@ -0,0 +1,76 @@ +package com.ruoyi.sip.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 采购应付核销单对象 oms_payable_write_off + * + * @author zghz + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OmsPayableWriteOff extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 核销单编号 */ + @Excel(name = "核销单编号") + private String writeOffCode; + + /** 核销类型 AUTO:系统自动核销 USER:用户手动核销 */ + @Excel(name = "核销类型") + private String writeOffType; + + /** 付款单编号 */ + @Excel(name = "付款单编号") + private String paymentBillCode; + + /** 供应商编码 */ + @Excel(name = "供应商编码") + private String vendorCode; + + /** 本次核销总金额 */ + @Excel(name = "本次核销总金额") + private BigDecimal writeOffAmount = BigDecimal.ZERO; + + /** 本次核销未税总金额 */ + @Excel(name = "本次核销未税总金额") + private BigDecimal writeOffAmountWithoutTax = BigDecimal.ZERO; + + /** 本次核销税额 */ + @Excel(name = "本次核销税额") + private BigDecimal writeOffTaxAmount = BigDecimal.ZERO; + + /** 核销时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "核销时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date writeOffTime; + + /** 备注 */ + @Excel(name = "备注") + private String remark; + + /** 创建人 */ + private String createBy; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 更新人 */ + private String updateBy; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOffDetail.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOffDetail.java new file mode 100644 index 00000000..1a76c53d --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsPayableWriteOffDetail.java @@ -0,0 +1,75 @@ +package com.ruoyi.sip.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应付单付款计划核销明细对象 oms_payable_write_off_detail + * + * @author zghz + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OmsPayableWriteOffDetail extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + + /** 核销单ID */ + private Long writeOffId; + + /** 应付单ID */ + private Long payableBillId; + + /** 应付单编号 */ + @Excel(name = "应付单编号") + private String payableBillCode; + + /** 应付单付款计划ID */ + private Long paymentPlanId; + + /** 付款单ID */ + private Long paymentBillId; + + /** 付款单编号 */ + @Excel(name = "付款单编号") + private String paymentBillCode; + + /** 核销金额 */ + @Excel(name = "核销金额") + private BigDecimal writeOffAmount = BigDecimal.ZERO; + + /** 本次核销未税总金额 */ + @Excel(name = "本次核销未税总金额") + private BigDecimal writeOffAmountWithoutTax = BigDecimal.ZERO; + + /** 本次核销税额 */ + @Excel(name = "本次核销税额") + private BigDecimal writeOffTaxAmount = BigDecimal.ZERO; + + /** 备注 */ + @Excel(name = "备注") + private String remark; + + /** 创建人 */ + private String createBy; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 更新人 */ + private String updateBy; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} \ No newline at end of file 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 new file mode 100644 index 00000000..c664ca95 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceiptBill.java @@ -0,0 +1,197 @@ +package com.ruoyi.sip.domain; + +import java.math.BigDecimal; +import java.util.Date; + + +import lombok.Data; +import lombok.Getter; + + +/** + * 销售收款单表(OmsReceiptBill)实体类 + * + * @author ch + * @since 2025-12-16 17:47:26 + */ +@Data + +public class OmsReceiptBill { + /** + * 主键ID + */ + + private Long id; + /** + * 收款单编号 + */ + + private String receiptBillCode; + /** + * 收款单类型 (FROM_RECEIVABLE, PRE_RECEIPT) + */ + + private String receiptBillType; + /** + * 预计收款时间 + */ + private Date receiptTime; + /** + * 实际收款时间 + */ + + private Date actualReceiptTime; + /** + * 进货商编码 + */ + + private String partnerCode; + private String partnerName; + /** + * 合同编号 + */ + + private String orderCode; + /** + * 含税总价 + */ + + private BigDecimal totalPriceWithTax; + /** + * 未税总价 + */ + + private BigDecimal totalPriceWithoutTax; + /** + * 税额 + */ + + private BigDecimal taxAmount; + /** + * 创建者 + */ + + private String createBy; + /** + * 创建时间 + */ + + private Date createTime; + /** + * 更新者 + */ + + private String updateBy; + /** + * 更新时间 + */ + + private Date updateTime; + /** + * 备注 + */ + + private String remark; + /** + * 删除标志(0存在 2删除) + */ + + private String delFlag; + /** + * 项目编号 + */ + + private String projectCode; + /** + * 项目名称 + */ + + private String projectName; + /** + * 收款状态 + */ + + private String receiptStatus; + /** + * 审批状态 + */ + private String approveStatus; + /** + * 审批节点 + */ + + private String approveNode; + /** + * 审批时间 + */ + + private Date approveTime; + /** + * 收款方式 + */ + + private String receiptMethod; + /** + * 收款账户名称 + */ + private String receiptAccountName; + /** + * 收款银行卡号 + */ + + private String receiptBankNumber; + /** + * 开户行 + */ + private String receiptBankOpenAddress; + /** + * 银行行号 + */ + private String bankNumber; + /** + * 是否已申请退款 0:未退款 1:已申请退款 + */ + private String refundStatus; + @Getter + public enum ReceiptBillTypeEnum { + + /** 应付单生成 */ + FROM_RECEIVABLE("FROM_RECEIVABLE", "应付单生成"), + /** 预付单 */ + PRE_RECEIPT("PRE_RECEIPT", "预付单"), + /** 退款单 */ + REFUND("REFUND", "退款单"), + + + + ; + private final String code; + private final String desc; + ReceiptBillTypeEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + } + @Getter + public enum ReceiptStatusEnum { + + /** 应付单生成 */ + REFUNDED("-1", "已退款"), + WAIT_PAYMENT("1", "未付款"), + /** 预付单 */ + PAYMENT("2", "已付款"), + + + + ; + private final String code; + private final String desc; + ReceiptStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + } +} + + + 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 new file mode 100644 index 00000000..0f4236b7 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableBill.java @@ -0,0 +1,97 @@ +package com.ruoyi.sip.domain; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +/** + * 应收单对象 oms_receivable_bill + * + * @author ruoyi + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OmsReceivableBill extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + private Long id; + private List idList; + + /** 应收单编号 */ + @Excel(name = "应收单编号") + private String receivableBillCode; + + /** 最新收款计划ID */ + private Long lastReceiptPlanId; + + /** 最新开票计划ID */ + private Long lastInvoicePlanId; + + /** 客户编码 */ + @Excel(name = "客户编码") + private String partnerCode; + private String partnerName; + + /** 合同编号 */ + @Excel(name = "合同编号") + private String orderCode; + + /** 出库/入库单号 */ + @Excel(name = "出库/入库单号") + private String inventoryCode; + + /** 产品类型 */ + @Excel(name = "产品类型") + private String productType; + private String productCode; + + /** 含税总价 */ + @Excel(name = "含税总价") + private BigDecimal totalPriceWithTax; + + /** 未税总价 */ + @Excel(name = "未税总价") + private BigDecimal totalPriceWithoutTax; + + /** 税率 */ + @Excel(name = "税率") + private BigDecimal taxRate; + + /** 税额 */ + @Excel(name = "税额") + private BigDecimal taxAmount; + + /** 已收款金额 */ + @Excel(name = "已收款金额") + private BigDecimal receivedAmount; + + /** 未收款金额 */ + @Excel(name = "未收款金额") + private BigDecimal unreceivedAmount; + private BigDecimal planAmount; + private Date planReceiptDate; + + /** 已开票金额 */ + @Excel(name = "已开票金额") + private BigDecimal invoicedAmount; + + /** 未开票金额 */ + @Excel(name = "未开票金额") + private BigDecimal uninvoicedAmount; + private String projectName; + private String projectCode; + private List detailList; + + + + +} \ No newline at end of file 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 new file mode 100644 index 00000000..f6e5be82 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableInvoiceDetail.java @@ -0,0 +1,80 @@ +package com.ruoyi.sip.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 应收单开票明细对象 oms_receivable_invoice_detail + * + * @author ruoyi + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OmsReceivableInvoiceDetail extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 开票计划ID */ + @Excel(name = "开票计划ID") + private Long invoicePlanId; + + /** 应收单ID */ + @Excel(name = "应收单ID") + private Long receivableBillId; + + /** 实际开票时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "实际开票时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date invoiceTime; + + /** 开票金额 */ + @Excel(name = "开票金额") + private BigDecimal invoiceAmount; + + /** 开票比例 */ + @Excel(name = "开票比例") + private BigDecimal invoiceRate; + + /** 发票编号 */ + @Excel(name = "发票编号") + private String invoiceBillCode; + + /** 备注 */ + @Excel(name = "备注") + private String remark; + + /** 1:正常开票 3:红冲 */ + @Excel(name = "开票明细类型") + private String receivableDetailType; + + private String invoiceStatus; + + @Getter + public enum ReceivableDetailTypeEnum { + + /** 正常开票 */ + NORMAL_INVOICE("1", "正常开票"), + /** 红冲 */ + REFUND("3", "红冲"), + + ; + private final String code; + private final String desc; + + ReceivableDetailTypeEnum(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/OmsReceivableInvoicePlan.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableInvoicePlan.java new file mode 100644 index 00000000..396dc82b --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableInvoicePlan.java @@ -0,0 +1,49 @@ +package com.ruoyi.sip.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +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; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应收单开票计划对象 oms_receivable_invoice_plan + * + * @author ruoyi + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OmsReceivableInvoicePlan extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 应收单ID */ + @Excel(name = "应收单ID") + private Long receivableBillId; + + /** 计划开票时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "计划开票时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date planInvoiceDate; + + /** 计划开票金额 */ + @Excel(name = "计划开票金额") + private BigDecimal planAmount; + + /** 计划开票比例 */ + @Excel(name = "计划开票比例") + private BigDecimal planRate; + + /** 备注 */ + @Excel(name = "备注") + private String remark; + private Long detailId; +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableReceiptDetail.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableReceiptDetail.java new file mode 100644 index 00000000..c35ca8e4 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableReceiptDetail.java @@ -0,0 +1,86 @@ +package com.ruoyi.sip.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 应收单收款明细对象 oms_receivable_receipt_detail + * + * @author ruoyi + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OmsReceivableReceiptDetail extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + private List idList; + + /** 收款计划ID */ + @Excel(name = "收款计划ID") + private Long receiptPlanId; + + /** 应收单ID */ + @Excel(name = "应收单ID") + private Long receivableBillId; + + /** 实际收款时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "实际收款时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date receiptTime; + + /** 收款金额 */ + @Excel(name = "收款金额") + private BigDecimal receiptAmount; + + /** 收款比例 */ + @Excel(name = "收款比例") + private BigDecimal receiptRate; + + /** 收款单号 */ + @Excel(name = "收款单号") + private String receiptBillCode; + private Long receiptBillId; + + /** 备注 */ + @Excel(name = "备注") + private String remark; + + /** 1:正常收款 2:预收核销 3:退款 */ + @Excel(name = "收款明细类型") + private String receivableDetailType; + /** 回执单附件ID */ + private OmsFinAttachment finAttachment; + private Date actualReceiptTime; + private String receiptStatus; + + @Getter + public enum ReceivableDetailTypeEnum { + + /** 正常收款 */ + NORMAL_RECEIPT("1", "正常收款"), + /** 预收核销 */ + PRE_RECEIVE_WRITE_OFF("2", "预收核销"), + REFUND("3", "退款"), + + ; + private final String code; + private final String desc; + + ReceivableDetailTypeEnum(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/OmsReceivableReceiptPlan.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableReceiptPlan.java new file mode 100644 index 00000000..00bb775b --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/OmsReceivableReceiptPlan.java @@ -0,0 +1,49 @@ +package com.ruoyi.sip.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +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; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应收单收款计划对象 oms_receivable_receipt_plan + * + * @author ruoyi + * @date 2025-12-16 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OmsReceivableReceiptPlan extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键 */ + private Long id; + + /** 应收单ID */ + @Excel(name = "应收单ID") + private Long receivableBillId; + + /** 计划收款日期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "计划收款日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date planReceiptDate; + + /** 计划收款金额 */ + @Excel(name = "计划收款金额") + private BigDecimal planAmount; + + /** 计划收款比例 */ + @Excel(name = "计划收款比例") + private BigDecimal planRate; + + /** 备注 */ + @Excel(name = "备注") + private String remark; + private Long detailId; +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedInvoiceDataDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedInvoiceDataDto.java new file mode 100644 index 00000000..d0450d68 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedInvoiceDataDto.java @@ -0,0 +1,16 @@ +package com.ruoyi.sip.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +@Data +public class MergedInvoiceDataDto { + private String invoiceBillType; + private Date invoiceTime; + private Date customerInvoiceTime; + private List receivableOrders; + private BigDecimal totalMergeInvoiceAmount; +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedReceviableReceiptDataDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedReceviableReceiptDataDto.java new file mode 100644 index 00000000..3f4fac43 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/MergedReceviableReceiptDataDto.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 MergedReceviableReceiptDataDto { + private String receiptBillType; + private Date estimatedReceiptTime; + private List receivableBills; + private BigDecimal totalMergeReceiptAmount; +} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/ReceivableOrderReceiptDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/ReceivableOrderReceiptDto.java new file mode 100644 index 00000000..a44554a9 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/domain/dto/ReceivableOrderReceiptDto.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 ReceivableOrderReceiptDto { + private Long id; + private String receivableBillCode; + private BigDecimal taxRate; + private List receiptPlans; +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffDetailResultDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffDetailResultDto.java new file mode 100644 index 00000000..f02ebf99 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffDetailResultDto.java @@ -0,0 +1,159 @@ +package com.ruoyi.sip.dto; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 应付单付款计划核销详情查询结果DTO + * + * @author zghz + * @date 2025-12-16 + */ +public class WriteOffDetailResultDto +{ + /** 主键ID */ + private Long id; + + /** 核销单ID */ + private Long writeOffId; + + /** 核销单号 */ + private String writeOffCode; + + /** 应付单ID */ + private Long payableBillId; + + /** 应付单编号 */ + private String payableBillCode; + + /** 应付单付款计划ID */ + private Long paymentPlanId; + + /** 付款单ID */ + private Long paymentBillId; + + /** 付款单编号 */ + private String paymentBillCode; + + /** 核销金额 */ + private BigDecimal writeOffAmount; + + /** 本次核销未税总金额 */ + private BigDecimal writeOffAmountWithoutTax; + + /** 本次核销税额 */ + private BigDecimal writeOffTaxAmount; + + /** 备注 */ + private String remark; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + // Getters and Setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getWriteOffId() { + return writeOffId; + } + + public void setWriteOffId(Long writeOffId) { + this.writeOffId = writeOffId; + } + + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public Long getPayableBillId() { + return payableBillId; + } + + public void setPayableBillId(Long payableBillId) { + this.payableBillId = payableBillId; + } + + public String getPayableBillCode() { + return payableBillCode; + } + + public void setPayableBillCode(String payableBillCode) { + this.payableBillCode = payableBillCode; + } + + public Long getPaymentPlanId() { + return paymentPlanId; + } + + public void setPaymentPlanId(Long paymentPlanId) { + this.paymentPlanId = paymentPlanId; + } + + public Long getPaymentBillId() { + return paymentBillId; + } + + public void setPaymentBillId(Long paymentBillId) { + this.paymentBillId = paymentBillId; + } + + public String getPaymentBillCode() { + return paymentBillCode; + } + + public void setPaymentBillCode(String paymentBillCode) { + this.paymentBillCode = paymentBillCode; + } + + public BigDecimal getWriteOffAmount() { + return writeOffAmount; + } + + public void setWriteOffAmount(BigDecimal writeOffAmount) { + this.writeOffAmount = writeOffAmount; + } + + public BigDecimal getWriteOffAmountWithoutTax() { + return writeOffAmountWithoutTax; + } + + public void setWriteOffAmountWithoutTax(BigDecimal writeOffAmountWithoutTax) { + this.writeOffAmountWithoutTax = writeOffAmountWithoutTax; + } + + public BigDecimal getWriteOffTaxAmount() { + return writeOffTaxAmount; + } + + public void setWriteOffTaxAmount(BigDecimal writeOffTaxAmount) { + this.writeOffTaxAmount = writeOffTaxAmount; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffItemDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffItemDto.java new file mode 100644 index 00000000..91f0a8eb --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffItemDto.java @@ -0,0 +1,57 @@ +package com.ruoyi.sip.dto; + +import lombok.Data; + +import java.math.BigDecimal; +import javax.validation.constraints.NotNull; + +/** + * 应付单付款计划核销项DTO + * + * @author zghz + * @date 2025-12-16 + */ +@Data +public class WriteOffItemDto +{ + /** + * 应付单ID + */ + @NotNull(message = "应付单ID不能为空") + private Long payableBillId; + + /** + * 应付单付款计划ID + */ + @NotNull(message = "应付单付款计划ID不能为空") + private Long paymentPlanId; + + /** + * 付款单ID + */ + @NotNull(message = "付款单ID不能为空") + private Long paymentBillId; + + /** + * 核销金额 + */ + @NotNull(message = "核销金额不能为空") + private BigDecimal writeOffAmount; + + /** + * 本次核销未税总金额 + */ + private BigDecimal writeOffAmountWithoutTax; + + /** + * 本次核销税额 + */ + private BigDecimal writeOffTaxAmount; + + /** + * 备注 + */ + private String remark; + + +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffQueryDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffQueryDto.java new file mode 100644 index 00000000..cbbf2a39 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffQueryDto.java @@ -0,0 +1,38 @@ +package com.ruoyi.sip.dto; + +import com.ruoyi.common.core.domain.BaseEntity; +import java.util.Date; + +/** + * 采购应付核销单记录查询DTO + * + * @author zghz + * @date 2025-12-16 + */ +public class WriteOffQueryDto extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 核销单号 */ + private String writeOffCode; + + /** 供货商代码 */ + private String vendorCode; + + // Getters and Setters + public String getWriteOffCode() { + return writeOffCode; + } + + public void setWriteOffCode(String writeOffCode) { + this.writeOffCode = writeOffCode; + } + + public String getVendorCode() { + return vendorCode; + } + + public void setVendorCode(String vendorCode) { + this.vendorCode = vendorCode; + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffRequestDto.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffRequestDto.java new file mode 100644 index 00000000..791ad9c4 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/dto/WriteOffRequestDto.java @@ -0,0 +1,40 @@ +package com.ruoyi.sip.dto; + +import lombok.Data; + +import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 采购应付核销单请求DTO + * + * @author zghz + * @date 2025-12-16 + */ +@Data +public class WriteOffRequestDto +{ + /** + * 付款单ID + */ + @NotNull(message = "付款单ID不能为空") + private Long paymentBillId; + + /** + * 核销项列表 + */ + private List writeOffItems; + + /** + * 供应商代码 + */ + @NotBlank(message = "供应商代码不能为空") + private String vendorCode; + + /** + * 备注 + */ + private String remark; + +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffDetailMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffDetailMapper.java new file mode 100644 index 00000000..9337a50f --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffDetailMapper.java @@ -0,0 +1,85 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; +import com.ruoyi.sip.domain.OmsPayableWriteOffDetail; + +/** + * 应付单付款计划核销明细Mapper接口 + * + * @author zghz + * @date 2025-12-16 + */ +public interface OmsPayableWriteOffDetailMapper +{ + /** + * 查询应付单付款计划核销明细 + * + * @param id 应付单付款计划核销明细ID + * @return 应付单付款计划核销明细 + */ + public OmsPayableWriteOffDetail selectOmsPayableWriteOffDetailById(Long id); + + /** + * 查询应付单付款计划核销明细列表 + * + * @param omsPayableWriteOffDetail 应付单付款计划核销明细 + * @return 应付单付款计划核销明细集合 + */ + public List selectOmsPayableWriteOffDetailList(OmsPayableWriteOffDetail omsPayableWriteOffDetail); + + /** + * 新增应付单付款计划核销明细 + * + * @param omsPayableWriteOffDetail 应付单付款计划核销明细 + * @return 结果 + */ + public int insertOmsPayableWriteOffDetail(OmsPayableWriteOffDetail omsPayableWriteOffDetail); + + /** + * 修改应付单付款计划核销明细 + * + * @param omsPayableWriteOffDetail 应付单付款计划核销明细 + * @return 结果 + */ + public int updateOmsPayableWriteOffDetail(OmsPayableWriteOffDetail omsPayableWriteOffDetail); + + /** + * 删除应付单付款计划核销明细 + * + * @param id 应付单付款计划核销明细ID + * @return 结果 + */ + public int deleteOmsPayableWriteOffDetailById(Long id); + + /** + * 批量删除应付单付款计划核销明细 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteOmsPayableWriteOffDetailByIds(Long[] ids); + + /** + * 根据核销单ID删除应付单付款计划核销明细 + * + * @param writeOffId 核销单ID + * @return 结果 + */ + public int deleteOmsPayableWriteOffDetailByWriteOffId(Long writeOffId); + + /** + * 批量删除应付单付款计划核销明细 + * + * @param writeOffIds 核销单ID数组 + * @return 结果 + */ + public int deleteOmsPayableWriteOffDetailByWriteOffIds(Long[] writeOffIds); + + /** + * 根据核销单ID查询核销明细 + * + * @param writeOffId 核销单ID + * @return 核销明细集合 + */ + public List selectOmsPayableWriteOffDetailByWriteOffId(Long writeOffId); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffMapper.java new file mode 100644 index 00000000..bf944ac3 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsPayableWriteOffMapper.java @@ -0,0 +1,61 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; +import com.ruoyi.sip.domain.OmsPayableWriteOff; + +/** + * 采购应付核销单Mapper接口 + * + * @author zghz + * @date 2025-12-16 + */ +public interface OmsPayableWriteOffMapper +{ + /** + * 查询采购应付核销单 + * + * @param id 采购应付核销单ID + * @return 采购应付核销单 + */ + public OmsPayableWriteOff selectOmsPayableWriteOffById(Long id); + + /** + * 查询采购应付核销单列表 + * + * @param omsPayableWriteOff 采购应付核销单 + * @return 采购应付核销单集合 + */ + public List selectOmsPayableWriteOffList(OmsPayableWriteOff omsPayableWriteOff); + + /** + * 新增采购应付核销单 + * + * @param omsPayableWriteOff 采购应付核销单 + * @return 结果 + */ + public int insertOmsPayableWriteOff(OmsPayableWriteOff omsPayableWriteOff); + + /** + * 修改采购应付核销单 + * + * @param omsPayableWriteOff 采购应付核销单 + * @return 结果 + */ + public int updateOmsPayableWriteOff(OmsPayableWriteOff omsPayableWriteOff); + + /** + * 删除采购应付核销单 + * + * @param id 采购应付核销单ID + * @return 结果 + */ + public int deleteOmsPayableWriteOffById(Long id); + + /** + * 批量删除采购应付核销单 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteOmsPayableWriteOffByIds(Long[] ids); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceiptBillMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceiptBillMapper.java new file mode 100644 index 00000000..f70c4671 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceiptBillMapper.java @@ -0,0 +1,51 @@ +package com.ruoyi.sip.mapper; + +import com.ruoyi.sip.domain.OmsReceiptBill; + +import java.util.List; + +/** + * @Author ch + * @Desc 销售收款单表(OmsReceiptBill)表数据库访问层 + * @Date 2025-12-16 17:47:26 + */ +public interface OmsReceiptBillMapper { + + /** + * 通过实体作为筛选条件查询 + * + * @param omsReceiptBill 实例对象 + * @return 对象列表 + */ + List queryAll(OmsReceiptBill omsReceiptBill); + + /** + * 根据ID查详情 + */ + OmsReceiptBill queryById(Long id); + + + /** + * 新增数据 + */ + int insert(OmsReceiptBill omsReceiptBill); + + + /** + * 修改数据 + */ + int update(OmsReceiptBill omsReceiptBill); + + /** + * 通过主键删除数据 + */ + int deleteById(Long id); + + /** + * 通过id批量删除销售收款单表 + */ + int batchRemove(Long[] ids); + + int selectMaxCodeByPrefix(String codePrefix); + +} diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableBillMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableBillMapper.java new file mode 100644 index 00000000..ebd9a6d9 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableBillMapper.java @@ -0,0 +1,79 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; +import com.ruoyi.sip.domain.OmsReceivableBill; + +/** + * 销售应收单Mapper接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface OmsReceivableBillMapper +{ + /** + * 查询销售应收单 + * + * @param id 销售应收单主键 + * @return 销售应收单 + */ + public OmsReceivableBill selectOmsReceivableBillById(Long id); + + /** + * 查询销售应收单列表 + * + * @param omsReceivableBill 销售应收单 + * @return 销售应收单集合 + */ + public List selectOmsReceivableBillList(OmsReceivableBill omsReceivableBill); + + /** + * 新增销售应收单 + * + * @param omsReceivableBill 销售应收单 + * @return 结果 + */ + public int insertOmsReceivableBill(OmsReceivableBill omsReceivableBill); + + /** + * 修改销售应收单 + * + * @param omsReceivableBill 销售应收单 + * @return 结果 + */ + public int updateOmsReceivableBill(OmsReceivableBill omsReceivableBill); + + /** + * 删除销售应收单 + * + * @param id 销售应收单主键 + * @return 结果 + */ + public int deleteOmsReceivableBillById(Long id); + + /** + * 批量删除销售应收单 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOmsReceivableBillByIds(String ids); + + /** + * 根据前缀查询最大编号 + * + * @param codePrefix 编号前缀 + * @return 最大编号后缀 + */ + Integer selectMaxCodeByPrefix(String codePrefix); + + /** + * 批量更新应收单的开票相关信息 + * + * @param receivableBills 需要更新的应收单列表 + * @return 结果 + */ + int updateBatchReceivableBillInvoiceInfo(List receivableBills); + + int updateBatchReceivableBillReceiptInfo(List receivableBills); +} \ No newline at end of file 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 new file mode 100644 index 00000000..28e920a9 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoiceDetailMapper.java @@ -0,0 +1,73 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; + +import com.ruoyi.sip.domain.OmsPayableTicketDetail; +import com.ruoyi.sip.domain.OmsReceivableInvoiceDetail; + +/** + * 应收单开票明细Mapper接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface OmsReceivableInvoiceDetailMapper +{ + /** + * 查询应收单开票明细 + * + * @param id 应收单开票明细主键 + * @return 应收单开票明细 + */ + public OmsReceivableInvoiceDetail selectOmsReceivableInvoiceDetailById(Long id); + + /** + * 查询应收单开票明细列表 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 应收单开票明细集合 + */ + public List selectOmsReceivableInvoiceDetailList(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail); + + /** + * 新增应收单开票明细 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 结果 + */ + public int insertOmsReceivableInvoiceDetail(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail); + + /** + * 修改应收单开票明细 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 结果 + */ + public int updateOmsReceivableInvoiceDetail(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail); + + /** + * 删除应收单开票明细 + * + * @param id 应收单开票明细主键 + * @return 结果 + */ + public int deleteOmsReceivableInvoiceDetailById(Long id); + + /** + * 批量删除应收单开票明细 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOmsReceivableInvoiceDetailByIds(String ids); + + List listByReceivableBillIdList(List collect); + + /** + * 根据开票计划ID列表查询开票明细 + * + * @param invoicePlanIds 开票计划ID列表 + * @return 开票明细集合 + */ + List selectByInvoicePlanIds(List invoicePlanIds); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoicePlanMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoicePlanMapper.java new file mode 100644 index 00000000..75c2cd72 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableInvoicePlanMapper.java @@ -0,0 +1,64 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; +import com.ruoyi.sip.domain.OmsReceivableInvoicePlan; + +/** + * 应收单开票计划Mapper接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface OmsReceivableInvoicePlanMapper +{ + /** + * 查询应收单开票计划 + * + * @param id 应收单开票计划主键 + * @return 应收单开票计划 + */ + public OmsReceivableInvoicePlan selectOmsReceivableInvoicePlanById(Long id); + + /** + * 查询应收单开票计划列表 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 应收单开票计划集合 + */ + public List selectOmsReceivableInvoicePlanList(OmsReceivableInvoicePlan omsReceivableInvoicePlan); + + /** + * 新增应收单开票计划 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 结果 + */ + public int insertOmsReceivableInvoicePlan(OmsReceivableInvoicePlan omsReceivableInvoicePlan); + + /** + * 修改应收单开票计划 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 结果 + */ + public int updateOmsReceivableInvoicePlan(OmsReceivableInvoicePlan omsReceivableInvoicePlan); + + /** + * 删除应收单开票计划 + * + * @param id 应收单开票计划主键 + * @return 结果 + */ + public int deleteOmsReceivableInvoicePlanById(Long id); + + /** + * 批量删除应收单开票计划 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOmsReceivableInvoicePlanByIds(String ids); + + OmsReceivableInvoicePlan firstUnPayPlan(Long receivableBillId); + +} \ No newline at end of file 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 new file mode 100644 index 00000000..333123eb --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptDetailMapper.java @@ -0,0 +1,65 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; +import com.ruoyi.sip.domain.OmsReceivableReceiptDetail; + +/** + * 应收单收款明细Mapper接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface OmsReceivableReceiptDetailMapper +{ + /** + * 查询应收单收款明细 + * + * @param id 应收单收款明细主键 + * @return 应收单收款明细 + */ + public OmsReceivableReceiptDetail selectOmsReceivableReceiptDetailById(Long id); + + /** + * 查询应收单收款明细列表 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 应收单收款明细集合 + */ + public List selectOmsReceivableReceiptDetailList(OmsReceivableReceiptDetail omsReceivableReceiptDetail); + + /** + * 新增应收单收款明细 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 结果 + */ + public int insertOmsReceivableReceiptDetail(OmsReceivableReceiptDetail omsReceivableReceiptDetail); + + /** + * 修改应收单收款明细 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 结果 + */ + public int updateOmsReceivableReceiptDetail(OmsReceivableReceiptDetail omsReceivableReceiptDetail); + + /** + * 删除应收单收款明细 + * + * @param id 应收单收款明细主键 + * @return 结果 + */ + public int deleteOmsReceivableReceiptDetailById(Long id); + + /** + * 批量删除应收单收款明细 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOmsReceivableReceiptDetailByIds(String ids); + + List list(OmsReceivableReceiptDetail omsReceivableReceiptDetail); + + List selectByPaymentPlanIds(List allReceiptPlanIds); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptPlanMapper.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptPlanMapper.java new file mode 100644 index 00000000..9c7d8bc7 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/mapper/OmsReceivableReceiptPlanMapper.java @@ -0,0 +1,79 @@ +package com.ruoyi.sip.mapper; + +import java.util.List; +import com.ruoyi.sip.domain.OmsReceivableReceiptPlan; + +/** + * 应收单收款计划Mapper接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface OmsReceivableReceiptPlanMapper +{ + /** + * 查询应收单收款计划 + * + * @param id 应收单收款计划主键 + * @return 应收单收款计划 + */ + public OmsReceivableReceiptPlan selectOmsReceivableReceiptPlanById(Long id); + + /** + * 查询应收单收款计划列表 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 应收单收款计划集合 + */ + public List selectOmsReceivableReceiptPlanList(OmsReceivableReceiptPlan omsReceivableReceiptPlan); + + /** + * 查询根据应收单ID的收款计划列表 + * + * @param receivableBillId 应收单ID + * @return 应收单收款计划集合 + */ + public List selectOmsReceivableReceiptPlanListByReceivableBillId(Long receivableBillId); + + /** + * 新增应收单收款计划 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 结果 + */ + public int insertOmsReceivableReceiptPlan(OmsReceivableReceiptPlan omsReceivableReceiptPlan); + + /** + * 修改应收单收款计划 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 结果 + */ + public int updateOmsReceivableReceiptPlan(OmsReceivableReceiptPlan omsReceivableReceiptPlan); + + /** + * 删除应收单收款计划 + * + * @param id 应收单收款计划主键 + * @return 结果 + */ + public int deleteOmsReceivableReceiptPlanById(Long id); + + /** + * 批量删除应收单收款计划 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteOmsReceivableReceiptPlanByIds(String ids); + + /** + * 根据应收单ID删除收款计划 + * + * @param receivableBillId 应收单ID + * @return 结果 + */ + public int deleteByReceivableBillId(Long receivableBillId); + + OmsReceivableReceiptPlan firstUnPayPlan(Long id); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableWriteOffService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableWriteOffService.java new file mode 100644 index 00000000..760df520 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsPayableWriteOffService.java @@ -0,0 +1,72 @@ +package com.ruoyi.sip.service; + +import java.util.List; +import com.ruoyi.sip.domain.OmsPayableWriteOff; +import com.ruoyi.sip.dto.WriteOffRequestDto; +import com.ruoyi.sip.dto.WriteOffQueryDto; +import com.ruoyi.sip.dto.WriteOffDetailResultDto; + +/** + * 采购应付核销单Service接口 + * + * @author zghz + * @date 2025-12-16 + */ +public interface IOmsPayableWriteOffService +{ + /** + * 查询采购应付核销单 + * + * @param id 采购应付核销单ID + * @return 采购应付核销单 + */ + public OmsPayableWriteOff selectOmsPayableWriteOffById(Long id); + + /** + * 查询采购应付核销单列表 + * + * @param writeOffQueryDto 核销查询条件 + * @return 采购应付核销单集合 + */ + public List selectOmsPayableWriteOffList(WriteOffQueryDto writeOffQueryDto); + + /** + * 新增采购应付核销单 + * + * @param writeOffRequestDto 核销请求数据 + * @return 结果 + */ + public Long insertOmsPayableWriteOff(WriteOffRequestDto writeOffRequestDto); + + /** + * 修改采购应付核销单 + * + * @param omsPayableWriteOff 采购应付核销单 + * @return 结果 + */ + public int updateOmsPayableWriteOff(OmsPayableWriteOff omsPayableWriteOff); + + /** + * 批量删除采购应付核销单 + * + * @param ids 需要删除的ID + * @return 结果 + */ + public int deleteOmsPayableWriteOffByIds(Long[] ids); + + /** + * 删除采购应付核销单信息 + * + * @param id 采购应付核销单ID + * @return 结果 + */ + public int deleteOmsPayableWriteOffById(Long id); + + /** + * 根据核销单ID查询核销详情 + * + * @param writeOffId 核销单ID + * @return 核销详情列表 + */ + public List selectWriteOffDetailsByWriteOffId(Long writeOffId); +} \ 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 new file mode 100644 index 00000000..e8829960 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceiptBillService.java @@ -0,0 +1,48 @@ +package com.ruoyi.sip.service; + +import com.ruoyi.sip.domain.OmsReceiptBill; + +import java.util.List; + +/** + * @Author ch + * @Desc 销售收款单表(OmsReceiptBill)表服务接口 + * @Date 2025-12-16 17:47:26 + */ +public interface IOmsReceiptBillService { + + /** + * 通过实体作为筛选条件查询 + */ + List queryAll(OmsReceiptBill omsReceiptBill); + + + /** + * 根据ID查详情 + */ + OmsReceiptBill queryById(Long id); + + /** + * 新增数据 + */ + int insert(OmsReceiptBill omsReceiptBill); + + /** + * 修改数据 + */ + int update(OmsReceiptBill omsReceiptBill); + + /** + * 通过主键删除数据 + */ + int deleteById(Long id); + + /** + * 通过id批量删除销售收款单表 + */ + int batchRemove(Long[] ids); + +} + + + 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 new file mode 100644 index 00000000..6f5b0406 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableBillService.java @@ -0,0 +1,76 @@ +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.MergedReceviableReceiptDataDto; + +/** + * 销售应收单Service接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface IOmsReceivableBillService +{ + /** + * 查询销售应收单 + * + * @param id 销售应收单主键 + * @return 销售应收单 + */ + public OmsReceivableBill selectOmsReceivableBillById(Long id); + + /** + * 查询销售应收单列表 + * + * @param omsReceivableBill 销售应收单 + * @return 销售应收单集合 + */ + public List selectOmsReceivableBillList(OmsReceivableBill omsReceivableBill); + + /** + * 新增销售应收单 + * + * @param omsReceivableBill 销售应收单 + * @return 结果 + */ + public int insertOmsReceivableBill(OmsReceivableBill omsReceivableBill); + + /** + * 修改销售应收单 + * + * @param omsReceivableBill 销售应收单 + * @return 结果 + */ + public int updateOmsReceivableBill(OmsReceivableBill omsReceivableBill); + + /** + * 批量删除销售应收单 + * + * @param ids 需要删除的销售应收单主键集合 + * @return 结果 + */ + public int deleteOmsReceivableBillByIds(String ids); + + /** + * 删除销售应收单信息 + * + * @param id 销售应收单主键 + * @return 结果 + */ + public int deleteOmsReceivableBillById(Long id); + + /** + * 查询详细信息 + * + * @param id 销售应收单主键 + * @return 销售应收单 + */ + public OmsReceivableBill query(Long id); + + int mergeAndInitiateReceipt(MergedReceviableReceiptDataDto dto); + + public int updateReceiptAmount(List idList); + public int updateInvoiceAmount(List idList); +} \ 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 new file mode 100644 index 00000000..08ef473f --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoiceDetailService.java @@ -0,0 +1,73 @@ +package com.ruoyi.sip.service; + +import java.util.List; + +import com.ruoyi.sip.domain.OmsPayableTicketDetail; +import com.ruoyi.sip.domain.OmsReceivableInvoiceDetail; + +/** + * 应收单开票明细Service接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface IOmsReceivableInvoiceDetailService +{ + /** + * 查询应收单开票明细 + * + * @param id 应收单开票明细主键 + * @return 应收单开票明细 + */ + public OmsReceivableInvoiceDetail selectOmsReceivableInvoiceDetailById(Long id); + + /** + * 查询应收单开票明细列表 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 应收单开票明细集合 + */ + public List selectOmsReceivableInvoiceDetailList(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail); + + /** + * 新增应收单开票明细 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 结果 + */ + public int insertOmsReceivableInvoiceDetail(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail); + + /** + * 修改应收单开票明细 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 结果 + */ + public int updateOmsReceivableInvoiceDetail(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail); + + /** + * 批量删除应收单开票明细 + * + * @param ids 需要删除的应收单开票明细主键集合 + * @return 结果 + */ + public int deleteOmsReceivableInvoiceDetailByIds(String ids); + + /** + * 删除应收单开票明细信息 + * + * @param id 应收单开票明细主键 + * @return 结果 + */ + public int deleteOmsReceivableInvoiceDetailById(Long id); + + List listByReceivableBillIdList(List collect); + + /** + * 根据开票计划ID列表查询开票明细 + * + * @param invoicePlanIds 开票计划ID列表 + * @return 开票明细集合 + */ + List selectByInvoicePlanIds(List invoicePlanIds); +} \ 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 new file mode 100644 index 00000000..6203a0ae --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableInvoicePlanService.java @@ -0,0 +1,68 @@ +package com.ruoyi.sip.service; + +import java.util.List; +import com.ruoyi.sip.domain.OmsReceivableInvoicePlan; +import com.ruoyi.sip.domain.OmsReceivableReceiptPlan; + +/** + * 应收单开票计划Service接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface IOmsReceivableInvoicePlanService +{ + /** + * 查询应收单开票计划 + * + * @param id 应收单开票计划主键 + * @return 应收单开票计划 + */ + public OmsReceivableInvoicePlan selectOmsReceivableInvoicePlanById(Long id); + + /** + * 查询应收单开票计划列表 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 应收单开票计划集合 + */ + public List selectOmsReceivableInvoicePlanList(OmsReceivableInvoicePlan omsReceivableInvoicePlan); + + /** + * 新增应收单开票计划 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 结果 + */ + public int insertOmsReceivableInvoicePlan(OmsReceivableInvoicePlan omsReceivableInvoicePlan); + + /** + * 修改应收单开票计划 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 结果 + */ + public int updateOmsReceivableInvoicePlan(OmsReceivableInvoicePlan omsReceivableInvoicePlan); + + /** + * 批量删除应收单开票计划 + * + * @param ids 需要删除的应收单开票计划主键集合 + * @return 结果 + */ + public int deleteOmsReceivableInvoicePlanByIds(String ids); + + /** + * 删除应收单开票计划信息 + * + * @param id 应收单开票计划主键 + * @return 结果 + */ + public int deleteOmsReceivableInvoicePlanById(Long id); + + + List listByReceivableBillId(Long receivableBillId); + + + void updateInvoicePlans(Long receivableBillId, List invoicePlanList); +} \ No newline at end of file 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 new file mode 100644 index 00000000..522b085a --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptDetailService.java @@ -0,0 +1,69 @@ +package com.ruoyi.sip.service; + +import java.util.List; + +import com.ruoyi.sip.domain.OmsPayablePaymentDetail; +import com.ruoyi.sip.domain.OmsReceivableReceiptDetail; + +/** + * 应收单收款明细Service接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface IOmsReceivableReceiptDetailService +{ + /** + * 查询应收单收款明细 + * + * @param id 应收单收款明细主键 + * @return 应收单收款明细 + */ + public OmsReceivableReceiptDetail selectOmsReceivableReceiptDetailById(Long id); + + /** + * 查询应收单收款明细列表 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 应收单收款明细集合 + */ + public List selectOmsReceivableReceiptDetailList(OmsReceivableReceiptDetail omsReceivableReceiptDetail); + + /** + * 新增应收单收款明细 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 结果 + */ + public int insertOmsReceivableReceiptDetail(OmsReceivableReceiptDetail omsReceivableReceiptDetail); + + /** + * 修改应收单收款明细 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 结果 + */ + public int updateOmsReceivableReceiptDetail(OmsReceivableReceiptDetail omsReceivableReceiptDetail); + + /** + * 批量删除应收单收款明细 + * + * @param ids 需要删除的应收单收款明细主键集合 + * @return 结果 + */ + public int deleteOmsReceivableReceiptDetailByIds(String ids); + + /** + * 删除应收单收款明细信息 + * + * @param id 应收单收款明细主键 + * @return 结果 + */ + public int deleteOmsReceivableReceiptDetailById(Long id); + + List listByReceivableBillId(Long id); + + List selectReceiptPlanByIds(List allReceiptPlanIds); + + List listByReceivableBillIdList(List idList); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptPlanService.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptPlanService.java new file mode 100644 index 00000000..21106ca0 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/IOmsReceivableReceiptPlanService.java @@ -0,0 +1,90 @@ +package com.ruoyi.sip.service; + +import java.util.List; + +import com.ruoyi.sip.domain.OmsPayablePaymentPlan; +import com.ruoyi.sip.domain.OmsReceivableReceiptPlan; + +/** + * 应收单收款计划Service接口 + * + * @author ruoyi + * @date 2025-12-16 + */ +public interface IOmsReceivableReceiptPlanService +{ + /** + * 查询应收单收款计划 + * + * @param id 应收单收款计划主键 + * @return 应收单收款计划 + */ + public OmsReceivableReceiptPlan selectOmsReceivableReceiptPlanById(Long id); + + /** + * 查询应收单收款计划列表 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 应收单收款计划集合 + */ + public List selectOmsReceivableReceiptPlanList(OmsReceivableReceiptPlan omsReceivableReceiptPlan); + + /** + * 查询根据应收单ID的收款计划列表 + * + * @param receivableBillId 应收单ID + * @return 应收单收款计划集合 + */ + public List selectOmsReceivableReceiptPlanListByReceivableBillId(Long receivableBillId); + + /** + * 新增应收单收款计划 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 结果 + */ + public int insertOmsReceivableReceiptPlan(OmsReceivableReceiptPlan omsReceivableReceiptPlan); + + /** + * 修改应收单收款计划 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 结果 + */ + public int updateOmsReceivableReceiptPlan(OmsReceivableReceiptPlan omsReceivableReceiptPlan); + + /** + * 批量删除应收单收款计划 + * + * @param ids 需要删除的应收单收款计划主键集合 + * @return 结果 + */ + public int deleteOmsReceivableReceiptPlanByIds(String ids); + + /** + * 删除应收单收款计划信息 + * + * @param id 应收单收款计划主键 + * @return 结果 + */ + public int deleteOmsReceivableReceiptPlanById(Long id); + + /** + * 更新收款计划 + * + * @param receivableBillId 应收单ID + * @param receiptPlanList 收款计划列表 + * @return 结果 + */ + public void updateReceiptPlans(Long receivableBillId, List receiptPlanList); + + /** + * 同步收款计划至开票计划 + * + * @param receivableBillId 应收单ID + * @return 结果 + */ + public void syncReceiptToInvoicePlan(Long receivableBillId); + + OmsReceivableReceiptPlan firstUnPayPlan(Long id); +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/OmsPayableWriteOffServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/OmsPayableWriteOffServiceImpl.java new file mode 100644 index 00000000..ce05cdf5 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/OmsPayableWriteOffServiceImpl.java @@ -0,0 +1,239 @@ +package com.ruoyi.sip.service; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.sip.domain.OmsPayableWriteOff; +import com.ruoyi.sip.domain.OmsPayableWriteOffDetail; +import com.ruoyi.sip.domain.OmsPayableBill; +import com.ruoyi.sip.domain.OmsPaymentBill; +import com.ruoyi.sip.domain.OmsPayablePaymentPlan; +import com.ruoyi.sip.mapper.OmsPayableWriteOffMapper; +import com.ruoyi.sip.mapper.OmsPayableWriteOffDetailMapper; +import com.ruoyi.sip.mapper.OmsPayableBillMapper; +import com.ruoyi.sip.mapper.OmsPaymentBillMapper; +import com.ruoyi.sip.mapper.OmsPayablePaymentPlanMapper; +import com.ruoyi.sip.dto.WriteOffRequestDto; +import com.ruoyi.sip.dto.WriteOffItemDto; +import com.ruoyi.sip.dto.WriteOffQueryDto; +import com.ruoyi.sip.dto.WriteOffDetailResultDto; +import com.ruoyi.sip.utils.WriteOffCodeGenerator; + +/** + * 采购应付核销单Service业务层处理 + * + * @author zghz + * @date 2025-12-16 + */ +@Service +public class OmsPayableWriteOffServiceImpl implements IOmsPayableWriteOffService +{ + @Autowired + private OmsPayableWriteOffMapper omsPayableWriteOffMapper; + + @Autowired + private OmsPayableWriteOffDetailMapper omsPayableWriteOffDetailMapper; + + @Autowired + private OmsPayableBillMapper omsPayableBillMapper; + + @Autowired + private OmsPaymentBillMapper omsPaymentBillMapper; + + + /** + * 查询应付单付款计划核销 + * + * @param id 应付单付款计划核销ID + * @return 应付单付款计划核销 + */ + @Override + public OmsPayableWriteOff selectOmsPayableWriteOffById(Long id) + { + return omsPayableWriteOffMapper.selectOmsPayableWriteOffById(id); + } + + /** + * 查询采购应付核销单列表 + * + * @param writeOffQueryDto 核销查询条件 + * @return 采购应付核销单集合 + */ + @Override + public List selectOmsPayableWriteOffList(WriteOffQueryDto writeOffQueryDto) + { + OmsPayableWriteOff omsPayableWriteOff = new OmsPayableWriteOff(); + omsPayableWriteOff.setWriteOffCode(writeOffQueryDto.getWriteOffCode()); + omsPayableWriteOff.setVendorCode(writeOffQueryDto.getVendorCode()); + + return omsPayableWriteOffMapper.selectOmsPayableWriteOffList(omsPayableWriteOff); + } + + /** + * 新增采购应付核销单 + * + * @param writeOffRequestDto 核销请求数据 + * @return 结果 + */ + @Override + @Transactional + public Long insertOmsPayableWriteOff(WriteOffRequestDto writeOffRequestDto) + { + // 获取付款单信息 + OmsPaymentBill paymentBill = omsPaymentBillMapper.selectOmsPaymentBillById(writeOffRequestDto.getPaymentBillId()); + if (paymentBill == null) { + throw new RuntimeException("付款单不存在"); + } + + // 创建核销主记录 + OmsPayableWriteOff writeOff = new OmsPayableWriteOff(); + writeOff.setWriteOffCode(WriteOffCodeGenerator.generateWriteOffCode()); + // 默认为用户手动核销 + writeOff.setWriteOffType("USER"); + writeOff.setPaymentBillCode(paymentBill.getPaymentBillCode()); + writeOff.setVendorCode(writeOffRequestDto.getVendorCode()); + writeOff.setWriteOffTime(new Date()); + writeOff.setRemark(writeOffRequestDto.getRemark()); + + // 计算总金额和相关税额 + BigDecimal totalAmount = BigDecimal.ZERO; + BigDecimal totalAmountWithoutTax = BigDecimal.ZERO; + BigDecimal totalTaxAmount = BigDecimal.ZERO; + + for (WriteOffItemDto item : writeOffRequestDto.getWriteOffItems()) { + totalAmount = totalAmount.add(item.getWriteOffAmount()); + totalAmountWithoutTax = totalAmountWithoutTax.add(item.getWriteOffAmountWithoutTax()); + totalTaxAmount = totalTaxAmount.add(item.getWriteOffTaxAmount()); + } + + writeOff.setWriteOffAmount(totalAmount); + writeOff.setWriteOffAmountWithoutTax(totalAmountWithoutTax); + writeOff.setWriteOffTaxAmount(totalTaxAmount); + + // 设置创建时间 + writeOff.setCreateTime(new Date()); + writeOff.setUpdateTime(new Date()); + + // 保存核销主记录 + omsPayableWriteOffMapper.insertOmsPayableWriteOff(writeOff); + + // 保存核销明细 + for (WriteOffItemDto item : writeOffRequestDto.getWriteOffItems()) + { + OmsPayableWriteOffDetail detail = new OmsPayableWriteOffDetail(); + detail.setWriteOffId(writeOff.getId()); + detail.setPayableBillId(item.getPayableBillId()); + detail.setPaymentPlanId(item.getPaymentPlanId()); + detail.setPaymentBillId(item.getPaymentBillId()); + detail.setWriteOffAmount(item.getWriteOffAmount()); + detail.setWriteOffAmountWithoutTax(item.getWriteOffAmountWithoutTax()); + detail.setWriteOffTaxAmount(item.getWriteOffTaxAmount()); + detail.setRemark(item.getRemark()); + detail.setCreateTime(new Date()); + detail.setUpdateTime(new Date()); + + // 获取应付单编号 + OmsPayableBill payableBill = omsPayableBillMapper.selectOmsPayableBillById(item.getPayableBillId()); + if (payableBill != null) { + detail.setPayableBillCode(payableBill.getPayableBillCode()); + } + + // 设置付款单编号 + detail.setPaymentBillCode(paymentBill.getPaymentBillCode()); + + // 保存核销明细记录 + omsPayableWriteOffDetailMapper.insertOmsPayableWriteOffDetail(detail); + } + + return writeOff.getId(); + } + + /** + * 修改采购应付核销单 + * + * @param omsPayableWriteOff 采购应付核销单 + * @return 结果 + */ + @Override + public int updateOmsPayableWriteOff(OmsPayableWriteOff omsPayableWriteOff) + { + return omsPayableWriteOffMapper.updateOmsPayableWriteOff(omsPayableWriteOff); + } + + /** + * 批量删除采购应付核销单 + * + * @param ids 需要删除的ID + * @return 结果 + */ + @Override + @Transactional + public int deleteOmsPayableWriteOffByIds(Long[] ids) + { + // 先删除明细记录 + omsPayableWriteOffDetailMapper.deleteOmsPayableWriteOffDetailByWriteOffIds(ids); + // 再删除主记录 + return omsPayableWriteOffMapper.deleteOmsPayableWriteOffByIds(ids); + } + + /** + * 删除采购应付核销单信息 + * + * @param id 采购应付核销单ID + * @return 结果 + */ + @Override + @Transactional + public int deleteOmsPayableWriteOffById(Long id) + { + // 先删除明细记录 + omsPayableWriteOffDetailMapper.deleteOmsPayableWriteOffDetailByWriteOffId(id); + // 再删除主记录 + return omsPayableWriteOffMapper.deleteOmsPayableWriteOffById(id); + } + + /** + * 根据核销单ID查询核销详情 + * + * @param writeOffId 核销单ID + * @return 核销详情列表 + */ + @Override + public List selectWriteOffDetailsByWriteOffId(Long writeOffId) + { + List details = omsPayableWriteOffDetailMapper.selectOmsPayableWriteOffDetailByWriteOffId(writeOffId); + return details.stream().map(this::convertToWriteOffDetailResultDto).collect(Collectors.toList()); + } + + /** + * 将OmsPayableWriteOffDetail转换为WriteOffDetailResultDto + * + * @param detail 核销详情实体 + * @return 转换后的DTO + */ + private WriteOffDetailResultDto convertToWriteOffDetailResultDto(OmsPayableWriteOffDetail detail) { + WriteOffDetailResultDto dto = new WriteOffDetailResultDto(); + dto.setId(detail.getId()); + dto.setWriteOffId(detail.getWriteOffId()); + // 从核销主表获取核销单号 + OmsPayableWriteOff writeOff = omsPayableWriteOffMapper.selectOmsPayableWriteOffById(detail.getWriteOffId()); + if (writeOff != null) { + dto.setWriteOffCode(writeOff.getWriteOffCode()); + } + dto.setPayableBillId(detail.getPayableBillId()); + dto.setPayableBillCode(detail.getPayableBillCode()); + dto.setPaymentPlanId(detail.getPaymentPlanId()); + dto.setPaymentBillId(detail.getPaymentBillId()); + dto.setPaymentBillCode(detail.getPaymentBillCode()); + dto.setWriteOffAmount(detail.getWriteOffAmount()); + dto.setWriteOffAmountWithoutTax(detail.getWriteOffAmountWithoutTax()); + dto.setWriteOffTaxAmount(detail.getWriteOffTaxAmount()); + dto.setRemark(detail.getRemark()); + dto.setCreateTime(detail.getCreateTime()); + return dto; + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/InventoryDeliveryServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/InventoryDeliveryServiceImpl.java index 297a1888..fffd42cb 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/InventoryDeliveryServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/InventoryDeliveryServiceImpl.java @@ -60,6 +60,8 @@ public class InventoryDeliveryServiceImpl implements IInventoryDeliveryService { private IOmsInventoryDeliveryDetailService deliveryDetailService; @Autowired private IOmsPayableBillService payableBillService; + @Autowired + private IOmsReceivableBillService billService; @Value("${oms.inventory.innerTax:0.13}") private String defaultTax; @@ -268,6 +270,31 @@ public class InventoryDeliveryServiceImpl implements IInventoryDeliveryService { List saveList = inventoryInfos.stream().peek(item -> item.setPayableBillCode(payableBill.getPayableBillCode())).collect(Collectors.toList()); inventoryInfoService.saveBatch(saveList); } + //生成应收单 + OmsReceivableBill receivableBill = new OmsReceivableBill(); + receivableBill.setProductCode(inventoryOuter.getProductCode()); + receivableBill.setProductType(productInfo.getType()); + ProjectOrderInfo orderInfo = projectOrderInfoService.selectProjectOrderInfoByOrderCode(inventoryDelivery.getOrderCode()); + receivableBill.setPartnerCode(orderInfo.getPartnerCode()); + receivableBill.setPartnerName(orderInfo.getPartnerName()); + receivableBill.setOrderCode(orderInfo.getOrderCode()); + receivableBill.setInventoryCode(inventoryDelivery.getOuterCode()); + List collect = projectProductInfos.stream().filter(item -> item.getProductBomCode().equals(inventoryOuter.getProductCode())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(collect)) { + ProjectProductInfo projectProductInfo = collect.get(0); + BigDecimal price = projectProductInfo.getPrice(); + InventoryDelivery inventoryDelivery1 = selectInventoryDeliveryById(inventoryDelivery.getId()); + BigDecimal allPrice = price.multiply(new BigDecimal(inventoryDelivery1.getQuantity().toString())); + receivableBill.setTotalPriceWithTax(allPrice); + BigDecimal defaultTaxRate = projectProductInfo.getTaxRate()==null?new BigDecimal(defaultTax):projectProductInfo.getTaxRate().divide(new BigDecimal("100")); + BigDecimal allPriceWithOutTax = allPrice.divide(BigDecimal.ONE.add(defaultTaxRate), 2, RoundingMode.HALF_UP); + receivableBill.setTaxRate(defaultTaxRate); + receivableBill.setTotalPriceWithoutTax(allPriceWithOutTax); + receivableBill.setTaxAmount(allPrice.subtract(receivableBill.getTotalPriceWithoutTax())); + receivableBill.setUninvoicedAmount(allPrice); + receivableBill.setUnreceivedAmount(allPrice); + billService.insertOmsReceivableBill(receivableBill); + } } diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java index 78e6f03b..c6feb06a 100644 --- a/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsPayableBillServiceImpl.java @@ -279,7 +279,7 @@ public class OmsPayableBillServiceImpl implements IOmsPayableBillService { detail.setPaymentRate(paymentPlanDto.getPlanRate()); detail.setPaymentTime(paymentPlanDto.getPlanPaymentDate()); detail.setRemark(paymentPlanDto.getRemark()); - detail.setCreateBy(ShiroUtils.getLoginName()); + detail.setCreateBy(ShiroUtils.getUserId().toString()); detail.setPayableDetailType(OmsPayablePaymentDetail.PayableDetailTypeEnum.APPLY_PAYMENT.getCode()); omsPayablePaymentDetailService.insertOmsPayablePaymentDetail(detail); } 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 new file mode 100644 index 00000000..8ba6a29c --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceiptBillServiceImpl.java @@ -0,0 +1,93 @@ +package com.ruoyi.sip.service.impl; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.ruoyi.common.enums.ApproveStatusEnum; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.sip.domain.OmsPaymentBill; +import com.ruoyi.sip.domain.OmsReceiptBill; +import com.ruoyi.sip.mapper.OmsReceiptBillMapper; +import com.ruoyi.sip.service.IOmsReceiptBillService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author ch + * @Desc 销售收款单表(OmsReceiptBill)表服务实现类 + * @Date 2025-12-16 17:47:26 + */ + +@Service +public class OmsReceiptBillServiceImpl implements IOmsReceiptBillService { + + @Resource + private OmsReceiptBillMapper omsReceiptBillMapper; + + + /** + * 查询列表数据 + * + * @param omsReceiptBill 实例对象 + * @return 对象列表 + */ + @Override + public List queryAll(OmsReceiptBill omsReceiptBill) { + List dataList = omsReceiptBillMapper.queryAll(omsReceiptBill); + return dataList; + } + + @Override + public OmsReceiptBill queryById(Long id) { + return omsReceiptBillMapper.queryById(id); + } + + + @Override + public int insert(OmsReceiptBill omsReceiptBill) { + omsReceiptBill.setCreateTime(DateUtils.getNowDate()); + omsReceiptBill.setCreateBy(ShiroUtils.getUserId().toString()); + omsReceiptBill.setReceiptBillCode(generateReceiptBillCode()); + omsReceiptBill.setReceiptStatus(OmsReceiptBill.ReceiptStatusEnum.WAIT_PAYMENT.getCode()); + omsReceiptBill.setApproveStatus(ApproveStatusEnum.WAIT_COMMIT.getCode()); + return omsReceiptBillMapper.insert(omsReceiptBill); + } + + private String generateReceiptBillCode() { + String prefix = "SK"; + // 查询当天已有的最大序列号 + String codePrefix = prefix + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN); + int maxSequence = omsReceiptBillMapper.selectMaxCodeByPrefix(codePrefix); + // 生成新的序列号 + int newSequence = maxSequence + 1; + // 序列号补零到4位 + String sequenceStr = String.format("%04d", newSequence); + return codePrefix + sequenceStr; + } + + + @Override + public int update(OmsReceiptBill omsReceiptBill) { + return omsReceiptBillMapper.update(omsReceiptBill); + } + + + @Override + public int deleteById(Long id) { + return omsReceiptBillMapper.deleteById(id); + } + + /** + * 通过id批量删除销售收款单表 + */ + @Override + public int batchRemove(Long[] ids) { + return omsReceiptBillMapper.batchRemove(ids); + } + +} + + + 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 new file mode 100644 index 00000000..89086467 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableBillServiceImpl.java @@ -0,0 +1,381 @@ +package com.ruoyi.sip.service.impl; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Comparator; +import java.util.Map; +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.exception.ServiceException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.sip.domain.*; +import com.ruoyi.sip.domain.dto.MergedInvoiceDataDto; +import com.ruoyi.sip.domain.dto.MergedReceviableReceiptDataDto; +import com.ruoyi.sip.domain.dto.ReceivableOrderReceiptDto; +import com.ruoyi.sip.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.sip.mapper.OmsReceivableBillMapper; + +/** + * 销售应收单Service业务层处理 + * + * @author ruoyi + * @date 2025-12-16 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class OmsReceivableBillServiceImpl implements IOmsReceivableBillService +{ + @Autowired + private OmsReceivableBillMapper omsReceivableBillMapper; + + @Autowired + private IOmsReceiptBillService receiptBillService; + @Autowired + private IOmsReceivableReceiptDetailService detailService; + + @Autowired + private IOmsReceivableReceiptPlanService receiptPlanService; + + @Autowired + private IOmsReceivableReceiptDetailService receiptDetailService; + @Autowired + private IOmsReceivableInvoicePlanService invoicePlanService; + + @Autowired + private IOmsReceivableInvoiceDetailService invoiceDetailService; + @Value("${oms.inventory.innerTax:0.13}") + private String defaultTax; + /** + * 查询销售应收单 + * + * @param id 销售应收单主键 + * @return 销售应收单 + */ + @Override + public OmsReceivableBill selectOmsReceivableBillById(Long id) + { + return omsReceivableBillMapper.selectOmsReceivableBillById(id); + } + + /** + * 查询销售应收单列表 + * + * @param omsReceivableBill 销售应收单 + * @return 销售应收单 + */ + @Override + public List selectOmsReceivableBillList(OmsReceivableBill omsReceivableBill) + { + return omsReceivableBillMapper.selectOmsReceivableBillList(omsReceivableBill); + } + + + + + /** + * 修改销售应收单 + * + * @param omsReceivableBill 销售应收单 + * @return 结果 + */ + @Override + public int updateOmsReceivableBill(OmsReceivableBill omsReceivableBill) + { + return omsReceivableBillMapper.updateOmsReceivableBill(omsReceivableBill); + } + + /** + * 批量删除销售应收单 + * + * @param ids 需要删除的销售应收单主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableBillByIds(String ids) + { + return omsReceivableBillMapper.deleteOmsReceivableBillByIds(ids); + } + + /** + * 删除销售应收单信息 + * + * @param id 销售应收单主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableBillById(Long id) + { + return omsReceivableBillMapper.deleteOmsReceivableBillById(id); + } + + /** + * 查询详细信息 + * + * @param id 销售应收单主键 + * @return 销售应收单 + */ + @Override + public OmsReceivableBill query(Long id) { + OmsReceivableBill omsReceivableBill = omsReceivableBillMapper.selectOmsReceivableBillById(id); + List detailList = detailService.listByReceivableBillId(id); + omsReceivableBill.setDetailList(detailList); + return omsReceivableBill; + } + + @Override + @Transactional + public int mergeAndInitiateReceipt(MergedReceviableReceiptDataDto dto) { + // 1. Calculate Tax Totals + BigDecimal totalWithoutTax = BigDecimal.ZERO; + if (CollUtil.isEmpty(dto.getReceivableBills())) { + return 0; + } + + // Fetch bills once + for (ReceivableOrderReceiptDto order : dto.getReceivableBills()) { + for (OmsReceivableReceiptPlan plan : order.getReceiptPlans()) { + // 计算每个 plan 的未税金额 = planAmount / (1 + 税率),保留两位小数 + BigDecimal taxRate = order.getTaxRate(); + if (taxRate == null || taxRate.compareTo(BigDecimal.ZERO) < 0) { + // 如果税率为空或小于0,则默认为0.13 + taxRate = new BigDecimal(defaultTax); + } + // 计算未税金额 = 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. 创建收款单 + OmsReceiptBill receiptBill = new OmsReceiptBill(); + OmsReceivableBill firstReceivableBill = omsReceivableBillMapper.selectOmsReceivableBillById(dto.getReceivableBills().get(0).getId()); + receiptBill.setReceiptBillType(OmsReceiptBill.ReceiptBillTypeEnum.FROM_RECEIVABLE.getCode()); + receiptBill.setPartnerCode(firstReceivableBill.getPartnerCode()); + receiptBill.setPartnerName(firstReceivableBill.getPartnerName()); + receiptBill.setReceiptTime(dto.getEstimatedReceiptTime()); + receiptBill.setTotalPriceWithTax(dto.getTotalMergeReceiptAmount()); + receiptBill.setTotalPriceWithoutTax(totalWithoutTax); + receiptBill.setTaxAmount(dto.getTotalMergeReceiptAmount().subtract(totalWithoutTax)); + receiptBillService.insert(receiptBill); + + // 3. 创建收款单 - 防止重复 + // 收集所有收款计划ID + List allReceiptPlanIds = dto.getReceivableBills().stream() + .flatMap(order -> order.getReceiptPlans().stream()) + .map(OmsReceivableReceiptPlan::getId) + .collect(java.util.stream.Collectors.toList()); + + // 查询现有的收款明细记录 + java.util.Map existingDetailsMap = new java.util.HashMap<>(); + if (!allReceiptPlanIds.isEmpty()) { + List existingDetails = receiptDetailService.selectReceiptPlanByIds(allReceiptPlanIds); + + // 使用stream将查询结果转化为Map,以planId为key,detail为value,取createtime最新的数据 + existingDetailsMap = existingDetails.stream() + .collect(java.util.stream.Collectors.toMap( + OmsReceivableReceiptDetail::getReceiptPlanId, + detail -> detail, + // 如果有重复数据,取createtime最新的数据 + (existing, replacement) -> existing.getCreateTime().compareTo(replacement.getCreateTime()) >= 0 ? existing : replacement + )); + } + + // 遍历所有计划并检查是否有已开票的记录 + for (ReceivableOrderReceiptDto receivableOrderDto : dto.getReceivableBills()) { + for (OmsReceivableReceiptPlan plan : receivableOrderDto.getReceiptPlans()) { + // 检查是否存在已开票的记录 + OmsReceivableReceiptDetail existingDetail = existingDetailsMap.get(plan.getId()); + if (existingDetail != null) { + // 检查是否是已开票状态,如果是则抛出异常 + if (!OmsReceivableInvoiceDetail.ReceivableDetailTypeEnum.REFUND.getCode().equals(existingDetail.getReceivableDetailType())) { + throw new ServiceException("计划ID为 " + plan.getId() + " 的开票已处理,请刷新页面后重试"); + } + } + + OmsReceivableReceiptDetail detail = new OmsReceivableReceiptDetail(); + detail.setReceivableBillId(receivableOrderDto.getId()); + detail.setReceiptPlanId(plan.getId()); + // 生成发票编号 + detail.setReceiptBillCode(receiptBill.getReceiptBillCode()); + detail.setReceiptAmount(plan.getPlanAmount()); + detail.setReceiptRate(plan.getPlanRate()); + detail.setReceiptTime(plan.getPlanReceiptDate()); + detail.setRemark(plan.getRemark()); + detail.setCreateBy(ShiroUtils.getUserId().toString()); + detail.setReceivableDetailType(OmsReceivableReceiptDetail.ReceivableDetailTypeEnum.NORMAL_RECEIPT.getCode()); + detailService.insertOmsReceivableReceiptDetail(detail); + } + } + + + // 批量更新应收单的开票相关信息 + return SpringUtils.getAopProxy(this).updateReceiptAmount(dto.getReceivableBills().stream().map(ReceivableOrderReceiptDto::getId).collect(java.util.stream.Collectors.toList())); + } + + /** + * 批量更新应收单的开票相关信息 + * + * @param idList 需要更新的应收单ID列表 + * @return 结果 + */ + @Override + public int updateInvoiceAmount(List idList) { + if (CollUtil.isEmpty(idList)) { + return 0; + } + OmsReceivableBill billCriteria = new OmsReceivableBill(); + billCriteria.setIdList(idList); + List bills = omsReceivableBillMapper.selectOmsReceivableBillList(billCriteria); + if (CollUtil.isEmpty(bills)) { + return 0; + } + + 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 + )))); + + 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)); + } + // 获取最新未开票计划 + 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()); + } + return omsReceivableBillMapper.updateBatchReceivableBillInvoiceInfo(bills); + } + + @Override + public int updateReceiptAmount(List idList) { + if (CollUtil.isEmpty(idList)) { + return 0; + } + OmsReceivableBill receivableBill = new OmsReceivableBill(); + receivableBill.setIdList(idList); + List receivableBills = omsReceivableBillMapper.selectOmsReceivableBillList(receivableBill); + if (CollUtil.isEmpty(receivableBills)) { + return 0; + } + + List omsReceivableReceiptDetailList = detailService.listByReceivableBillIdList(idList); + Map> planMap = omsReceivableReceiptDetailList.stream().collect(Collectors.groupingBy(OmsReceivableReceiptDetail::getReceivableBillId, + Collectors.groupingBy( + item -> item.getReceiptStatus() == null ? OmsReceiptBill.ReceiptStatusEnum.WAIT_PAYMENT.getCode() : item.getReceiptStatus(), + Collectors.reducing( + BigDecimal.ZERO, + detail -> (detail.getReceiptAmount()!=null) ? detail.getReceiptAmount() : BigDecimal.ZERO, + BigDecimal::add + )))); + for (OmsReceivableBill bill : receivableBills) { + Map amountMap = planMap.get(bill.getId()); + if (CollUtil.isNotEmpty(amountMap)) { + //已付金额 = 已付款金额-退款金额 + bill.setReceivedAmount(amountMap.getOrDefault(OmsReceiptBill.ReceiptStatusEnum.PAYMENT.getCode(), BigDecimal.ZERO) + .subtract(amountMap.getOrDefault(OmsReceiptBill.ReceiptStatusEnum.REFUNDED.getCode(), BigDecimal.ZERO))); + //未付金额=总金额-已付金额-付款中金额 + bill.setUnreceivedAmount(bill.getTotalPriceWithTax().subtract(bill.getReceivedAmount()) + .subtract(amountMap.getOrDefault(OmsReceiptBill.ReceiptStatusEnum.WAIT_PAYMENT.getCode(), BigDecimal.ZERO))); + } + OmsReceivableReceiptPlan lastReceiptPlan = receiptPlanService.firstUnPayPlan(bill.getId()); + bill.setLastReceiptPlanId(lastReceiptPlan == null ? -1 : lastReceiptPlan.getId()); + } + return omsReceivableBillMapper.updateBatchReceivableBillReceiptInfo(receivableBills); + } + + /** + * 新增销售应收单 + * + * @param omsReceivableBill 销售应收单 + * @return 结果 + */ + @Override + @Transactional + public int insertOmsReceivableBill(OmsReceivableBill omsReceivableBill) { + // 设置初始金额 + omsReceivableBill.setUnreceivedAmount(omsReceivableBill.getTotalPriceWithTax()); + omsReceivableBill.setUninvoicedAmount(omsReceivableBill.getTotalPriceWithTax()); + omsReceivableBill.setReceivedAmount(BigDecimal.ZERO); + omsReceivableBill.setInvoicedAmount(BigDecimal.ZERO); + + // 生成应收单编号 + omsReceivableBill.setReceivableBillCode(generateReceivableBillCode()); + omsReceivableBill.setCreateTime(DateUtils.getNowDate()); + omsReceivableBill.setCreateBy(ShiroUtils.getUserId().toString()); + + int rows = omsReceivableBillMapper.insertOmsReceivableBill(omsReceivableBill); + + // 创建默认收款计划 + if (rows > 0) { + OmsReceivableReceiptPlan defaultReceiptPlan = new OmsReceivableReceiptPlan(); + defaultReceiptPlan.setReceivableBillId(omsReceivableBill.getId()); + defaultReceiptPlan.setPlanReceiptDate(DateUtils.getNowDate()); // 默认为当前日期 + defaultReceiptPlan.setPlanAmount(omsReceivableBill.getTotalPriceWithTax()); + defaultReceiptPlan.setPlanRate(new java.math.BigDecimal("100")); + defaultReceiptPlan.setRemark("默认收款计划"); + defaultReceiptPlan.setCreateBy(ShiroUtils.getUserId().toString()); + receiptPlanService.insertOmsReceivableReceiptPlan(defaultReceiptPlan); + omsReceivableBill.setLastReceiptPlanId(defaultReceiptPlan.getId()); + + // 创建默认开票计划 + OmsReceivableInvoicePlan defaultInvoicePlan = new OmsReceivableInvoicePlan(); + defaultInvoicePlan.setReceivableBillId(omsReceivableBill.getId()); + defaultInvoicePlan.setPlanInvoiceDate(DateUtils.getNowDate()); // 默认为当前日期 + defaultInvoicePlan.setPlanAmount(omsReceivableBill.getTotalPriceWithTax()); + defaultInvoicePlan.setPlanRate(new java.math.BigDecimal("100")); + defaultInvoicePlan.setRemark("默认开票计划"); + defaultInvoicePlan.setCreateBy(ShiroUtils.getUserId().toString()); + defaultInvoicePlan.setCreateTime(DateUtils.getNowDate()); + invoicePlanService.insertOmsReceivableInvoicePlan(defaultInvoicePlan); + omsReceivableBill.setLastInvoicePlanId(defaultInvoicePlan.getId()); + + updateOmsReceivableBill(omsReceivableBill); + } + + return rows; + } + + /** + * 生成应收单编号 SKY+YYMMdd+当日序列号 + * @return 应收单编号 + */ + private String generateReceivableBillCode() { + String prefix = "SKY"; + // 查询当天已有的最大序列号 + String codePrefix = prefix + DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN); + int maxSequence = omsReceivableBillMapper.selectMaxCodeByPrefix(codePrefix); + // 生成新的序列号 + int newSequence = maxSequence + 1; + // 序列号补零到4位 + String sequenceStr = String.format("%04d", newSequence); + return codePrefix + sequenceStr; + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..d66df1e9 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoiceDetailServiceImpl.java @@ -0,0 +1,109 @@ +package com.ruoyi.sip.service.impl; + +import java.util.Collections; +import java.util.List; + +import com.ruoyi.sip.domain.OmsPayableTicketDetail; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.sip.mapper.OmsReceivableInvoiceDetailMapper; +import com.ruoyi.sip.domain.OmsReceivableInvoiceDetail; +import com.ruoyi.sip.service.IOmsReceivableInvoiceDetailService; + +/** + * 应收单开票明细Service业务层处理 + * + * @author ruoyi + * @date 2025-12-16 + */ +@Service +public class OmsReceivableInvoiceDetailServiceImpl implements IOmsReceivableInvoiceDetailService +{ + @Autowired + private OmsReceivableInvoiceDetailMapper omsReceivableInvoiceDetailMapper; + + /** + * 查询应收单开票明细 + * + * @param id 应收单开票明细主键 + * @return 应收单开票明细 + */ + @Override + public OmsReceivableInvoiceDetail selectOmsReceivableInvoiceDetailById(Long id) + { + return omsReceivableInvoiceDetailMapper.selectOmsReceivableInvoiceDetailById(id); + } + + /** + * 查询应收单开票明细列表 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 应收单开票明细 + */ + @Override + public List selectOmsReceivableInvoiceDetailList(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail) + { + return omsReceivableInvoiceDetailMapper.selectOmsReceivableInvoiceDetailList(omsReceivableInvoiceDetail); + } + + /** + * 新增应收单开票明细 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 结果 + */ + @Override + public int insertOmsReceivableInvoiceDetail(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail) + { + return omsReceivableInvoiceDetailMapper.insertOmsReceivableInvoiceDetail(omsReceivableInvoiceDetail); + } + + /** + * 修改应收单开票明细 + * + * @param omsReceivableInvoiceDetail 应收单开票明细 + * @return 结果 + */ + @Override + public int updateOmsReceivableInvoiceDetail(OmsReceivableInvoiceDetail omsReceivableInvoiceDetail) + { + return omsReceivableInvoiceDetailMapper.updateOmsReceivableInvoiceDetail(omsReceivableInvoiceDetail); + } + + /** + * 批量删除应收单开票明细 + * + * @param ids 需要删除的应收单开票明细主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableInvoiceDetailByIds(String ids) + { + return omsReceivableInvoiceDetailMapper.deleteOmsReceivableInvoiceDetailByIds(ids); + } + + /** + * 删除应收单开票明细信息 + * + * @param id 应收单开票明细主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableInvoiceDetailById(Long id) + { + return omsReceivableInvoiceDetailMapper.deleteOmsReceivableInvoiceDetailById(id); + } + + @Override + public List listByReceivableBillIdList(List collect) { + return omsReceivableInvoiceDetailMapper.listByReceivableBillIdList(collect); + } + + @Override + public List selectByInvoicePlanIds(List invoicePlanIds) { + if (invoicePlanIds == null || invoicePlanIds.isEmpty()) { + return Collections.emptyList(); + } + return omsReceivableInvoiceDetailMapper.selectByInvoicePlanIds(invoicePlanIds); + } +} \ 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 new file mode 100644 index 00000000..c0a3583a --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableInvoicePlanServiceImpl.java @@ -0,0 +1,167 @@ +package com.ruoyi.sip.service.impl; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +import cn.hutool.core.collection.CollUtil; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.sip.domain.*; +import com.ruoyi.sip.mapper.OmsReceivableBillMapper; +import com.ruoyi.sip.service.IOmsReceivableInvoiceDetailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.sip.mapper.OmsReceivableInvoicePlanMapper; +import com.ruoyi.sip.service.IOmsReceivableInvoicePlanService; + +/** + * 应收单开票计划Service业务层处理 + * + * @author ruoyi + * @date 2025-12-16 + */ +@Service +public class OmsReceivableInvoicePlanServiceImpl implements IOmsReceivableInvoicePlanService +{ + @Autowired + private OmsReceivableInvoicePlanMapper omsReceivableInvoicePlanMapper; + + @Autowired + private IOmsReceivableInvoiceDetailService detailService; + @Autowired + private OmsReceivableBillMapper billMapper; + /** + * 查询应收单开票计划 + * + * @param id 应收单开票计划主键 + * @return 应收单开票计划 + */ + @Override + public OmsReceivableInvoicePlan selectOmsReceivableInvoicePlanById(Long id) + { + return omsReceivableInvoicePlanMapper.selectOmsReceivableInvoicePlanById(id); + } + + /** + * 查询应收单开票计划列表 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 应收单开票计划 + */ + @Override + public List selectOmsReceivableInvoicePlanList(OmsReceivableInvoicePlan omsReceivableInvoicePlan) + { + return omsReceivableInvoicePlanMapper.selectOmsReceivableInvoicePlanList(omsReceivableInvoicePlan); + } + + /** + * 新增应收单开票计划 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 结果 + */ + @Override + public int insertOmsReceivableInvoicePlan(OmsReceivableInvoicePlan omsReceivableInvoicePlan) + { + return omsReceivableInvoicePlanMapper.insertOmsReceivableInvoicePlan(omsReceivableInvoicePlan); + } + + /** + * 修改应收单开票计划 + * + * @param omsReceivableInvoicePlan 应收单开票计划 + * @return 结果 + */ + @Override + public int updateOmsReceivableInvoicePlan(OmsReceivableInvoicePlan omsReceivableInvoicePlan) + { + return omsReceivableInvoicePlanMapper.updateOmsReceivableInvoicePlan(omsReceivableInvoicePlan); + } + + /** + * 批量删除应收单开票计划 + * + * @param ids 需要删除的应收单开票计划主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableInvoicePlanByIds(String ids) + { + return omsReceivableInvoicePlanMapper.deleteOmsReceivableInvoicePlanByIds(ids); + } + + /** + * 删除应收单开票计划信息 + * + * @param id 应收单开票计划主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableInvoicePlanById(Long id) + { + return omsReceivableInvoicePlanMapper.deleteOmsReceivableInvoicePlanById(id); + } + + @Override + public List listByReceivableBillId(Long receivableBillId) { + 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()); +// } +// } +// } + return omsReceivableInvoicePlans; + } + + @Override + public void updateInvoicePlans(Long receivableBillId, List invoicePlanList) { + // 获取数据库中现有付款计划的ID + List omsReceivableInvoicePlans = listByReceivableBillId(receivableBillId); + Set existingPlanIdSet = omsReceivableInvoicePlans.stream().map(OmsReceivableInvoicePlan::getId).collect(Collectors.toSet()); + + // 用于存放前端传入的有效(非新增或已删除)的计划ID + Set incomingPlanIdSet = invoicePlanList.stream() + .filter(plan -> plan.getId() != null) + .map(OmsReceivableInvoicePlan::getId) + .collect(Collectors.toSet()); + + for (OmsReceivableInvoicePlan plan : invoicePlanList) { + plan.setReceivableBillId(receivableBillId); + if (plan.getId() == null) { + // 新增付款计划 + plan.setCreateBy(ShiroUtils.getLoginName()); + omsReceivableInvoicePlanMapper.insertOmsReceivableInvoicePlan(plan); + } else if (existingPlanIdSet.contains(plan.getId())) { + // 更新现有付款计划 + omsReceivableInvoicePlanMapper.updateOmsReceivableInvoicePlan(plan); + } + // 如果plan.getId()不为null但不在existingPlanIdSet中,说明是前端新添加但带有id的脏数据,或者是非法数据,这里不处理 + } + + // 删除数据库中存在但前端未提交的付款计划 + existingPlanIdSet.removeAll(incomingPlanIdSet); + for (Long idToDelete : existingPlanIdSet) { + omsReceivableInvoicePlanMapper.deleteOmsReceivableInvoicePlanById(idToDelete); + } + + OmsReceivableInvoicePlan payablePaymentPlan = omsReceivableInvoicePlanMapper.firstUnPayPlan(receivableBillId); // Changed from firstUnPayPlan to firstUnPayPlan + OmsReceivableBill receivableBill = new OmsReceivableBill(); + receivableBill.setId(receivableBillId); // Changed from payableBillId to receivableBillId + receivableBill.setLastInvoicePlanId(payablePaymentPlan == null ? -1 : payablePaymentPlan.getId()); + billMapper.updateOmsReceivableBill(receivableBill); + } + +} \ No newline at end of file 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 new file mode 100644 index 00000000..19c8c394 --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptDetailServiceImpl.java @@ -0,0 +1,138 @@ +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 cn.hutool.core.collection.CollUtil; +import com.ruoyi.sip.domain.OmsFinAttachment; +import com.ruoyi.sip.domain.OmsPayablePaymentDetail; +import com.ruoyi.sip.service.IOmsFinAttachmentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.sip.mapper.OmsReceivableReceiptDetailMapper; +import com.ruoyi.sip.domain.OmsReceivableReceiptDetail; +import com.ruoyi.sip.service.IOmsReceivableReceiptDetailService; + +/** + * 应收单收款明细Service业务层处理 + * + * @author ruoyi + * @date 2025-12-16 + */ +@Service +public class OmsReceivableReceiptDetailServiceImpl implements IOmsReceivableReceiptDetailService +{ + @Autowired + private OmsReceivableReceiptDetailMapper omsReceivableReceiptDetailMapper; + + @Autowired + private IOmsFinAttachmentService finAttachmentService; + /** + * 查询应收单收款明细 + * + * @param id 应收单收款明细主键 + * @return 应收单收款明细 + */ + @Override + public OmsReceivableReceiptDetail selectOmsReceivableReceiptDetailById(Long id) + { + return omsReceivableReceiptDetailMapper.selectOmsReceivableReceiptDetailById(id); + } + + /** + * 查询应收单收款明细列表 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 应收单收款明细 + */ + @Override + public List selectOmsReceivableReceiptDetailList(OmsReceivableReceiptDetail omsReceivableReceiptDetail) + { + return omsReceivableReceiptDetailMapper.selectOmsReceivableReceiptDetailList(omsReceivableReceiptDetail); + } + + /** + * 新增应收单收款明细 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 结果 + */ + @Override + public int insertOmsReceivableReceiptDetail(OmsReceivableReceiptDetail omsReceivableReceiptDetail) + { + return omsReceivableReceiptDetailMapper.insertOmsReceivableReceiptDetail(omsReceivableReceiptDetail); + } + + /** + * 修改应收单收款明细 + * + * @param omsReceivableReceiptDetail 应收单收款明细 + * @return 结果 + */ + @Override + public int updateOmsReceivableReceiptDetail(OmsReceivableReceiptDetail omsReceivableReceiptDetail) + { + return omsReceivableReceiptDetailMapper.updateOmsReceivableReceiptDetail(omsReceivableReceiptDetail); + } + + /** + * 批量删除应收单收款明细 + * + * @param ids 需要删除的应收单收款明细主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableReceiptDetailByIds(String ids) + { + return omsReceivableReceiptDetailMapper.deleteOmsReceivableReceiptDetailByIds(ids); + } + + /** + * 删除应收单收款明细信息 + * + * @param id 应收单收款明细主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableReceiptDetailById(Long id) + { + return omsReceivableReceiptDetailMapper.deleteOmsReceivableReceiptDetailById(id); + } + + @Override + public List listByReceivableBillId(Long id) { + OmsReceivableReceiptDetail omsReceivableReceiptDetail = new OmsReceivableReceiptDetail(); + omsReceivableReceiptDetail.setReceivableBillId(id); + List list = omsReceivableReceiptDetailMapper.list(omsReceivableReceiptDetail); + if (CollUtil.isNotEmpty(list)){ + OmsFinAttachment omsFinAttachment = new OmsFinAttachment(); + omsFinAttachment.setRelatedBillIdList(list.stream().map(OmsReceivableReceiptDetail::getReceiptBillId).distinct().collect(Collectors.toList())); + omsFinAttachment.setRelatedBillType(OmsFinAttachment.RelatedBillTypeEnum.RECEIPT.getCode()); + omsFinAttachment.setDelFlag("0"); + List attachmentList = finAttachmentService.selectOmsFinAttachmentList(omsFinAttachment); + Map collect = attachmentList.stream().collect(Collectors.toMap(OmsFinAttachment::getRelatedBillId, Function.identity())); + for (OmsReceivableReceiptDetail payablePaymentDetail : list) { + payablePaymentDetail.setFinAttachment(collect.get(payablePaymentDetail.getReceiptBillId())); + } + } + return list; + } + + @Override + public List selectReceiptPlanByIds(List allReceiptPlanIds) { + return omsReceivableReceiptDetailMapper.selectByPaymentPlanIds(allReceiptPlanIds); + } + + @Override + public List listByReceivableBillIdList(List idList) { + if (CollUtil.isNotEmpty(idList)){ + OmsReceivableReceiptDetail omsReceivableReceiptDetail = new OmsReceivableReceiptDetail(); + omsReceivableReceiptDetail.setIdList(idList); + return omsReceivableReceiptDetailMapper.selectOmsReceivableReceiptDetailList(omsReceivableReceiptDetail); + } + return Collections.emptyList(); + } +} \ 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 new file mode 100644 index 00000000..c9f062cb --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/service/impl/OmsReceivableReceiptPlanServiceImpl.java @@ -0,0 +1,309 @@ +package com.ruoyi.sip.service.impl; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.Iterator; +import java.util.ArrayList; +import java.util.Comparator; + +import cn.hutool.core.collection.CollUtil; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.sip.domain.*; +import com.ruoyi.sip.mapper.OmsReceivableBillMapper; +import com.ruoyi.sip.service.IOmsReceivableReceiptDetailService; +import com.ruoyi.sip.service.IOmsReceivableInvoicePlanService; +import com.ruoyi.common.exception.ServiceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.sip.mapper.OmsReceivableReceiptPlanMapper; +import com.ruoyi.sip.service.IOmsReceivableReceiptPlanService; + +/** + * 应收单收款计划Service业务层处理 + * + * @author ruoyi + * @date 2025-12-16 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class OmsReceivableReceiptPlanServiceImpl implements IOmsReceivableReceiptPlanService +{ + @Autowired + private OmsReceivableReceiptPlanMapper omsReceivableReceiptPlanMapper; + + @Autowired + private OmsReceivableBillMapper billMapper; + + @Autowired + private IOmsReceivableReceiptDetailService omsReceivableReceiptDetailService; + + @Autowired + private IOmsReceivableInvoicePlanService invoicePlanService; + + /** + * 查询应收单收款计划 + * + * @param id 应收单收款计划主键 + * @return 应收单收款计划 + */ + @Override + public OmsReceivableReceiptPlan selectOmsReceivableReceiptPlanById(Long id) + { + return omsReceivableReceiptPlanMapper.selectOmsReceivableReceiptPlanById(id); + } + + /** + * 查询应收单收款计划列表 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 应收单收款计划 + */ + @Override + public List selectOmsReceivableReceiptPlanList(OmsReceivableReceiptPlan omsReceivableReceiptPlan) + { + return omsReceivableReceiptPlanMapper.selectOmsReceivableReceiptPlanList(omsReceivableReceiptPlan); + } + + /** + * 查询根据应收单ID的收款计划列表 + * + * @param receivableBillId 应收单ID + * @return 应收单收款计划集合 + */ + @Override + public List selectOmsReceivableReceiptPlanListByReceivableBillId(Long receivableBillId) + { + List omsReceivableReceiptPlans = omsReceivableReceiptPlanMapper.selectOmsReceivableReceiptPlanListByReceivableBillId(receivableBillId); + if (CollUtil.isNotEmpty(omsReceivableReceiptPlans)) { + List omsReceivableReceiptDetails = omsReceivableReceiptDetailService.listByReceivableBillId(receivableBillId); + Map detailMap = omsReceivableReceiptDetails.stream().collect(Collectors.toMap(OmsReceivableReceiptDetail::getReceiptPlanId, Function.identity(), + (v1, v2) -> v1.getCreateTime().after(v2.getCreateTime()) ? v1 : v2)); + for (OmsReceivableReceiptPlan omsReceivableReceiptPlan : omsReceivableReceiptPlans) { + //找到最新的一条数据 如果不是退款 那么不允许再次勾选 + OmsReceivableReceiptDetail omsReceivableReceiptDetail = detailMap.get(omsReceivableReceiptPlan.getId()); + if (omsReceivableReceiptDetail != null && !OmsReceivableReceiptDetail.ReceivableDetailTypeEnum.REFUND.getCode().equalsIgnoreCase(omsReceivableReceiptDetail.getReceivableDetailType())) + omsReceivableReceiptPlan.setDetailId(omsReceivableReceiptDetail.getId()); + } + } + return omsReceivableReceiptPlans; + } + + /** + * 新增应收单收款计划 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 结果 + */ + @Override + public int insertOmsReceivableReceiptPlan(OmsReceivableReceiptPlan omsReceivableReceiptPlan) + { + return omsReceivableReceiptPlanMapper.insertOmsReceivableReceiptPlan(omsReceivableReceiptPlan); + } + + /** + * 修改应收单收款计划 + * + * @param omsReceivableReceiptPlan 应收单收款计划 + * @return 结果 + */ + @Override + public int updateOmsReceivableReceiptPlan(OmsReceivableReceiptPlan omsReceivableReceiptPlan) + { + return omsReceivableReceiptPlanMapper.updateOmsReceivableReceiptPlan(omsReceivableReceiptPlan); + } + + /** + * 批量删除应收单收款计划 + * + * @param ids 需要删除的应收单收款计划主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableReceiptPlanByIds(String ids) + { + return omsReceivableReceiptPlanMapper.deleteOmsReceivableReceiptPlanByIds(ids); + } + + /** + * 删除应收单收款计划信息 + * + * @param id 应收单收款计划主键 + * @return 结果 + */ + @Override + public int deleteOmsReceivableReceiptPlanById(Long id) + { + return omsReceivableReceiptPlanMapper.deleteOmsReceivableReceiptPlanById(id); + } + + /** + * 更新收款计划 + * + * @param receivableBillId 应收单ID + * @param receiptPlanList 收款计划列表 + * @return 结果 + */ + @Override + @Transactional + public void updateReceiptPlans(Long receivableBillId, List receiptPlanList) { + // 获取数据库中现有收款计划的ID + List existingPlans = omsReceivableReceiptPlanMapper.selectOmsReceivableReceiptPlanListByReceivableBillId(receivableBillId); + List existingPlanIds = existingPlans.stream().map(OmsReceivableReceiptPlan::getId).collect(Collectors.toList()); + Set existingPlanIdSet = existingPlanIds.stream().collect(Collectors.toSet()); + + // 用于存放前端传入的有效(非新增或已删除)的计划ID + Set incomingPlanIdSet = receiptPlanList.stream() + .filter(plan -> plan.getId() != null) + .map(OmsReceivableReceiptPlan::getId) + .collect(Collectors.toSet()); + + for (OmsReceivableReceiptPlan plan : receiptPlanList) { + plan.setReceivableBillId(receivableBillId); + if (plan.getId() == null) { + // 新增收款计划 + plan.setCreateBy(ShiroUtils.getLoginName()); + omsReceivableReceiptPlanMapper.insertOmsReceivableReceiptPlan(plan); + } else if (existingPlanIdSet.contains(plan.getId())) { + // 更新现有收款计划 + omsReceivableReceiptPlanMapper.updateOmsReceivableReceiptPlan(plan); + } + // 如果plan.getId()不为null但不在existingPlanIdSet中,说明是前端新添加但带有id的脏数据,或者是非法数据,这里不处理 + } + + // 删除数据库中存在但前端未提交的收款计划 + existingPlanIdSet.removeAll(incomingPlanIdSet); + for (Long idToDelete : existingPlanIdSet) { + omsReceivableReceiptPlanMapper.deleteOmsReceivableReceiptPlanById(idToDelete); + } + + List allReceiptPlans = omsReceivableReceiptPlanMapper.selectOmsReceivableReceiptPlanListByReceivableBillId(receivableBillId); + OmsReceivableReceiptPlan receivableReceiptPlan = allReceiptPlans.stream() + .filter(p -> p.getDetailId() == null) // 查找未执行的收款计划 + .min(Comparator.comparing(OmsReceivableReceiptPlan::getPlanReceiptDate)) + .orElse(null); + OmsReceivableBill receivableBill = new OmsReceivableBill(); + receivableBill.setId(receivableBillId); + receivableBill.setLastReceiptPlanId(receivableReceiptPlan == null ? -1L : receivableReceiptPlan.getId()); + billMapper.updateOmsReceivableBill(receivableBill); + } + + /** + * 同步收款计划至开票计划 + * + * @param receivableBillId 应收单ID + * @return 结果 + */ + @Override + @Transactional + public void syncReceiptToInvoicePlan(Long receivableBillId) { + List invoicePlans = invoicePlanService.selectOmsReceivableInvoicePlanList(new OmsReceivableInvoicePlan() {{ + setReceivableBillId(receivableBillId); + }}); + List receiptPlans = selectOmsReceivableReceiptPlanListByReceivableBillId(receivableBillId); + + boolean hasExecutedInvoice = invoicePlans.stream().anyMatch(p -> p.getDetailId() != null); + + if (!hasExecutedInvoice) { + List newPlans = convertReceiptToInvoice(receiptPlans, receivableBillId); + updateInvoicePlan(receivableBillId, newPlans); + } else { + List executedInvoices = invoicePlans.stream() + .filter(p -> p.getDetailId() != null).collect(Collectors.toList()); + List executedReceipts = receiptPlans.stream() + .filter(p -> p.getDetailId() != null).collect(Collectors.toList()); + + List unmatchedExecutedReceipts = new ArrayList<>(executedReceipts); + + for (OmsReceivableInvoicePlan invoice : executedInvoices) { + boolean found = false; + Iterator it = unmatchedExecutedReceipts.iterator(); + while (it.hasNext()) { + OmsReceivableReceiptPlan receipt = it.next(); + if (compareDates(invoice.getPlanInvoiceDate(), receipt.getPlanReceiptDate()) == 0 && + invoice.getPlanAmount().compareTo(receipt.getPlanAmount()) == 0) { + it.remove(); + found = true; + break; + } + } + if (!found) { + throw new ServiceException("因收款计划表与开票计划表中已收款/开票数据已不一致,所以无法关联开票计划"); + } + } + + List unexecutedReceipts = receiptPlans.stream() + .filter(p -> p.getDetailId() == null).collect(Collectors.toList()); + + List toConvert = new ArrayList<>(); + toConvert.addAll(unmatchedExecutedReceipts); + toConvert.addAll(unexecutedReceipts); + + List newPlans = convertReceiptToInvoice(toConvert, receivableBillId); + + List finalPlans = new ArrayList<>(executedInvoices); + finalPlans.addAll(newPlans); + + updateInvoicePlan(receivableBillId, finalPlans); + } + } + + @Override + public OmsReceivableReceiptPlan firstUnPayPlan(Long id) { + 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<>(); + for (OmsReceivableReceiptPlan r : receiptPlans) { + OmsReceivableInvoicePlan i = new OmsReceivableInvoicePlan(); + i.setReceivableBillId(receivableBillId); + i.setPlanInvoiceDate(r.getPlanReceiptDate()); + i.setPlanAmount(r.getPlanAmount()); + i.setPlanRate(r.getPlanRate()); + i.setDetailId(null); + i.setRemark(r.getRemark()); + i.setCreateBy(ShiroUtils.getUserId().toString()); + list.add(i); + } + return list; + } + + private int compareDates(Date d1, Date d2) { + if (d1 == null && d2 == null) return 0; + if (d1 == null) return -1; + if (d2 == null) return 1; + return d1.compareTo(d2); + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/java/com/ruoyi/sip/utils/WriteOffCodeGenerator.java b/ruoyi-sip/src/main/java/com/ruoyi/sip/utils/WriteOffCodeGenerator.java new file mode 100644 index 00000000..45cddbee --- /dev/null +++ b/ruoyi-sip/src/main/java/com/ruoyi/sip/utils/WriteOffCodeGenerator.java @@ -0,0 +1,67 @@ +package com.ruoyi.sip.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 核销单号生成器 + * + * 生成规则:HX + YYMMDD + 四位序列号 + * + * @author zghz + * @date 2025-12-16 + */ +public class WriteOffCodeGenerator { + + private static final String PREFIX = "HX"; + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyMMdd"); + + // 用于生成序列号的锁和计数器 + private static final Object lock = new Object(); + private static int sequenceNumber = 0; + + /** + * 生成核销单号 + * + * @return 核销单号 + */ + public static String generateWriteOffCode() { + synchronized (lock) { + // 获取当前日期 + String dateStr = DATE_FORMAT.format(new Date()); + + // 递增序列号 + sequenceNumber++; + + // 重置序列号 如果超过四位数则重置(实际使用中可能需要更复杂的逻辑来处理) + if (sequenceNumber > 9999) { + sequenceNumber = 1; + } + + // 格式化四位序列号 + String sequenceStr = String.format("%04d", sequenceNumber); + + return PREFIX + dateStr + sequenceStr; + } + } + + /** + * 重置序列号(可用于测试,或在每天开始时重置) + */ + public static void resetSequence() { + synchronized (lock) { + sequenceNumber = 0; + } + } + + /** + * 设置序列号(可用于测试) + * + * @param number 序列号 + */ + public static void setSequenceNumber(int number) { + synchronized (lock) { + sequenceNumber = number; + } + } +} \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffDetailMapper.xml b/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffDetailMapper.xml new file mode 100644 index 00000000..e2b238df --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffDetailMapper.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, write_off_id, payable_bill_id, payable_bill_code, payment_plan_id, payment_bill_id, payment_bill_code, + write_off_amount, write_off_amount_without_tax, write_off_tax_amount, + remark, create_by, create_time, update_by, update_time + from oms_payable_write_off_detail + + + + + + + + + + insert into oms_payable_write_off_detail + + write_off_id, + payable_bill_id, + payable_bill_code, + payment_plan_id, + payment_bill_id, + payment_bill_code, + write_off_amount, + write_off_amount_without_tax, + write_off_tax_amount, + remark, + create_by, + create_time, + update_by, + update_time, + + + #{writeOffId}, + #{payableBillId}, + #{payableBillCode}, + #{paymentPlanId}, + #{paymentBillId}, + #{paymentBillCode}, + #{writeOffAmount}, + #{writeOffAmountWithoutTax}, + #{writeOffTaxAmount}, + #{remark}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update oms_payable_write_off_detail + + write_off_id = #{writeOffId}, + payable_bill_id = #{payableBillId}, + payable_bill_code = #{payableBillCode}, + payment_plan_id = #{paymentPlanId}, + payment_bill_id = #{paymentBillId}, + payment_bill_code = #{paymentBillCode}, + write_off_amount = #{writeOffAmount}, + write_off_amount_without_tax = #{writeOffAmountWithoutTax}, + write_off_tax_amount = #{writeOffTaxAmount}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from oms_payable_write_off_detail where id = #{id} + + + + delete from oms_payable_write_off_detail where write_off_id = #{writeOffId} + + + + delete from oms_payable_write_off_detail where write_off_id in + + #{writeOffId} + + + + + delete from oms_payable_write_off_detail where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffMapper.xml b/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffMapper.xml new file mode 100644 index 00000000..486d6b60 --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/OmsPayableWriteOffMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + select id, write_off_code, write_off_type, payment_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 + from oms_payable_write_off + + + + + + + + insert into oms_payable_write_off + + write_off_code, + write_off_type, + payment_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}, + #{paymentBillCode}, + #{vendorCode}, + #{writeOffAmount}, + #{writeOffAmountWithoutTax}, + #{writeOffTaxAmount}, + #{writeOffTime}, + #{remark}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update oms_payable_write_off + + write_off_code = #{writeOffCode}, + write_off_type = #{writeOffType}, + payment_bill_code = #{paymentBillCode}, + vendor_code = #{vendorCode}, + write_off_amount = #{writeOffAmount}, + write_off_amount_without_tax = #{writeOffAmountWithoutTax}, + write_off_tax_amount = #{writeOffTaxAmount}, + write_off_time = #{writeOffTime}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from oms_payable_write_off where id = #{id} + + + + delete from oms_payable_write_off where id in + + #{id} + + + \ 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 new file mode 100644 index 00000000..36a68c20 --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/OmsReceiptBill/OmsReceiptBillMapper.xml @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, receipt_bill_code, receipt_bill_type, receipt_time, actual_receipt_time, partner_code, order_code, total_price_with_tax, total_price_without_tax, tax_amount, create_by, create_time, update_by, update_time, remark, del_flag, project_code, project_name, receipt_status, approve_status, approve_node, approve_time, receipt_method, receipt_account_name, receipt_bank_number, receipt_bank_open_address, bank_number, refund_status + + + + + + + + + + + + + + INSERT INTO oms_receipt_bill + + + receipt_bill_code, + + + receipt_bill_type, + + + receipt_time, + + + actual_receipt_time, + + + partner_code, + + + order_code, + + + total_price_with_tax, + + + total_price_without_tax, + + + tax_amount, + + + create_by, + + + create_time, + + + update_by, + + + update_time, + + + remark, + + + del_flag, + + + project_code, + + + project_name, + + + receipt_status, + + + approve_status, + + + approve_node, + + + approve_time, + + + receipt_method, + + + receipt_account_name, + + + receipt_bank_number, + + + receipt_bank_open_address, + + + bank_number, + + + refund_status, + + + + + #{receiptBillCode}, + + + #{receiptBillType}, + + + #{receiptTime}, + + + #{actualReceiptTime}, + + + #{partnerCode}, + + + #{orderCode}, + + + #{totalPriceWithTax}, + + + #{totalPriceWithoutTax}, + + + #{taxAmount}, + + + #{createBy}, + + + #{createTime}, + + + #{updateBy}, + + + #{updateTime}, + + + #{remark}, + + + #{delFlag}, + + + #{projectCode}, + + + #{projectName}, + + + #{receiptStatus}, + + + #{approveStatus}, + + + #{approveNode}, + + + #{approveTime}, + + + #{receiptMethod}, + + + #{receiptAccountName}, + + + #{receiptBankNumber}, + + + #{receiptBankOpenAddress}, + + + #{bankNumber}, + + + #{refundStatus}, + + + + + + + UPDATE oms_receipt_bill + + + receipt_bill_code = #{receiptBillCode}, + + + receipt_bill_type = #{receiptBillType}, + + + receipt_time = #{receiptTime}, + + + actual_receipt_time = #{actualReceiptTime}, + + + partner_code = #{partnerCode}, + + + 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}, + + + project_code = #{projectCode}, + + + project_name = #{projectName}, + + + receipt_status = #{receiptStatus}, + + + approve_status = #{approveStatus}, + + + approve_node = #{approveNode}, + + + approve_time = #{approveTime}, + + + receipt_method = #{receiptMethod}, + + + receipt_account_name = #{receiptAccountName}, + + + receipt_bank_number = #{receiptBankNumber}, + + + receipt_bank_open_address = #{receiptBankOpenAddress}, + + + bank_number = #{bankNumber}, + + + refund_status = #{refundStatus}, + + + WHERE id = #{id} + + + + + DELETE + FROM oms_receipt_bill + WHERE id = #{id} + + + + + delete from oms_receipt_bill where id in + + #{id} + + + + + + + diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableBillMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableBillMapper.xml new file mode 100644 index 00000000..36861cec --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableBillMapper.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select t1.id, t1.receivable_bill_code, t1.last_receipt_plan_id, t1.last_invoice_plan_id, t1.partner_code, t1.partner_name, t1.order_code, t1.inventory_code, t1.product_type, + 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 + 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 + + + + + + + + insert into oms_receivable_bill + + receivable_bill_code, + last_receipt_plan_id, + last_invoice_plan_id, + partner_code, + partner_name, + order_code, + inventory_code, + product_type, + total_price_with_tax, + total_price_without_tax, + tax_rate, + tax_amount, + received_amount, + unreceived_amount, + invoiced_amount, + uninvoiced_amount, + create_by, + create_time, + update_by, + update_time, + remark, + + + + #{receivableBillCode}, + #{lastReceiptPlanId}, + #{lastInvoicePlanId}, + #{partnerCode}, + #{partnerName}, + #{orderCode}, + #{inventoryCode}, + #{productType}, + #{totalPriceWithTax}, + #{totalPriceWithoutTax}, + #{taxRate}, + #{taxAmount}, + #{receivedAmount}, + #{unreceivedAmount}, + #{invoicedAmount}, + #{uninvoicedAmount}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + + update oms_receivable_bill + + receivable_bill_code = #{receivableBillCode}, + last_receipt_plan_id = #{lastReceiptPlanId}, + last_invoice_plan_id = #{lastInvoicePlanId}, + partner_code = #{partnerCode}, + partner_name = #{partnerName}, + order_code = #{orderCode}, + inventory_code = #{inventoryCode}, + product_type = #{productType}, + total_price_with_tax = #{totalPriceWithTax}, + total_price_without_tax = #{totalPriceWithoutTax}, + tax_rate = #{taxRate}, + tax_amount = #{taxAmount}, + received_amount = #{receivedAmount}, + unreceived_amount = #{unreceivedAmount}, + invoiced_amount = #{invoicedAmount}, + uninvoiced_amount = #{uninvoicedAmount}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + update oms_receivable_bill set del_flag = '2' where id = #{id} + + + + update oms_receivable_bill set del_flag = '2' where id in + + #{id} + + + + + + + + UPDATE oms_receivable_bill + + invoiced_amount = #{item.invoicedAmount}, + uninvoiced_amount = #{item.uninvoicedAmount}, + last_invoice_plan_id = #{item.lastInvoicePlanId}, + update_time = #{item.updateTime}, + update_by = #{item.updateBy}, + + WHERE id = #{item.id} + + + + + UPDATE oms_receivable_bill + SET + last_receipt_plan_id = #{item.lastReceiptPlanId}, + received_amount = #{item.receivedAmount}, + unreceived_amount = #{item.unreceivedAmount}, + update_time = NOW(), + update_by = #{item.updateBy} + WHERE id = #{item.id} + + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableInvoiceDetailMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableInvoiceDetailMapper.xml new file mode 100644 index 00000000..92ea17ff --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableInvoiceDetailMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + select id, invoice_plan_id, receivable_bill_id, invoice_time, invoice_amount, invoice_rate, invoice_bill_code, remark, create_time, create_by, update_time, update_by + from oms_receivable_invoice_detail + + + + + + + + + + + insert into oms_receivable_invoice_detail + + invoice_plan_id, + receivable_bill_id, + invoice_time, + invoice_amount, + invoice_rate, + invoice_bill_code, + remark, + create_time, + create_by, + update_time, + update_by, + + + #{invoicePlanId}, + #{receivableBillId}, + #{invoiceTime}, + #{invoiceAmount}, + #{invoiceRate}, + #{invoiceBillCode}, + #{remark}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + + + + + update oms_receivable_invoice_detail + + invoice_plan_id = #{invoicePlanId}, + receivable_bill_id = #{receivableBillId}, + invoice_time = #{invoiceTime}, + invoice_amount = #{invoiceAmount}, + invoice_rate = #{invoiceRate}, + invoice_bill_code = #{invoiceBillCode}, + remark = #{remark}, + update_time = #{updateTime}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from oms_receivable_invoice_detail where id = #{id} + + + + delete from oms_receivable_invoice_detail where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableInvoicePlanMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableInvoicePlanMapper.xml new file mode 100644 index 00000000..f1fb6300 --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableInvoicePlanMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + select id, receivable_bill_id, plan_invoice_date, plan_amount, plan_rate, remark, create_time, create_by, update_time + from oms_receivable_invoice_plan + + + + + + + + + insert into oms_receivable_invoice_plan + + receivable_bill_id, + plan_invoice_date, + plan_amount, + plan_rate, + remark, + create_time, + create_by, + update_time, + update_by, + + + #{receivableBillId}, + #{planInvoiceDate}, + #{planAmount}, + #{planRate}, + #{remark}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + + + + + update oms_receivable_invoice_plan + + receivable_bill_id = #{receivableBillId}, + plan_invoice_date = #{planInvoiceDate}, + plan_amount = #{planAmount}, + plan_rate = #{planRate}, + remark = #{remark}, + update_time = #{updateTime}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from oms_receivable_invoice_plan where id = #{id} + + + + delete from oms_receivable_invoice_plan where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptDetailMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptDetailMapper.xml new file mode 100644 index 00000000..69c26b13 --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptDetailMapper.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + select id, receipt_plan_id, receivable_bill_id, receipt_time, receipt_amount, receipt_rate, receipt_bill_code, remark, create_time, create_by, update_time, receivable_detail_type + from oms_receivable_receipt_detail + + + + + + + + + + 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, + + + #{receiptPlanId}, + #{receivableBillId}, + #{receiptTime}, + #{receiptAmount}, + #{receiptRate}, + #{receiptBillCode}, + #{receivableDetailType}, + #{remark}, + #{createTime}, + #{createBy}, + #{updateTime}, + #{updateBy}, + + + + + update oms_receivable_receipt_detail + + receipt_plan_id = #{receiptPlanId}, + receivable_bill_id = #{receivableBillId}, + receipt_time = #{receiptTime}, + receipt_amount = #{receiptAmount}, + receipt_rate = #{receiptRate}, + receipt_bill_code = #{receiptBillCode}, + receivable_detail_type = #{receivableDetailType}, + remark = #{remark}, + update_time = #{updateTime}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from oms_receivable_receipt_detail where id = #{id} + + + + delete from oms_receivable_receipt_detail where id in + + #{id} + + + \ No newline at end of file diff --git a/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptPlanMapper.xml b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptPlanMapper.xml new file mode 100644 index 00000000..69b766af --- /dev/null +++ b/ruoyi-sip/src/main/resources/mapper/sip/OmsReceivableReceiptPlanMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + select id, receivable_bill_id, plan_receipt_date, plan_amount, plan_rate, remark, create_time, create_by, update_time + from oms_receivable_receipt_plan + + + + + + + + + + + insert into oms_receivable_receipt_plan + + receivable_bill_id, + plan_receipt_date, + plan_amount, + plan_rate, + remark, + create_time, + create_by, + update_time, + + + + #{receivableBillId}, + #{planReceiptDate}, + #{planAmount}, + #{planRate}, + #{remark}, + #{createTime}, + #{createBy}, + #{updateTime}, + + + + + + update oms_receivable_receipt_plan + + receivable_bill_id = #{receivableBillId}, + plan_receipt_date = #{planReceiptDate}, + plan_amount = #{planAmount}, + plan_rate = #{planRate}, + remark = #{remark}, + update_time = #{updateTime}, + + + where id = #{id} + + + + delete from oms_receivable_receipt_plan where id = #{id} + + + + delete from oms_receivable_receipt_plan where id in + + #{id} + + + + + delete from oms_receivable_receipt_plan where receivable_bill_id = #{receivableBillId} + + \ No newline at end of file