src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
@@ -69,7 +69,7 @@ */ @Log(title = "付款登记", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody PaymentRegistration paymentRegistration) { public AjaxResult add(@RequestBody List<PaymentRegistration> paymentRegistration) { return toAjax(paymentRegistrationService.insertPaymentRegistration(paymentRegistration)); } src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
@@ -37,6 +37,11 @@ private Long purchaseLedgerId; /** * 采购订单产品id */ private Long saleLedgerProductId; /** * 供应商id */ private Long supplierId; @@ -66,9 +71,11 @@ /** * 登记人 */ @TableField(fill = FieldFill.INSERT) private Long registrantId; // 租户id @TableField(fill = FieldFill.INSERT) private Long tenantId; /** src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java
@@ -41,7 +41,7 @@ * @param paymentRegistration 付款登记 * @return 结果 */ public int insertPaymentRegistration(PaymentRegistration paymentRegistration); public int insertPaymentRegistration(List<PaymentRegistration> paymentRegistration); /** * 修改付款登记 src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -22,10 +22,12 @@ import com.ruoyi.purchase.service.IPaymentRegistrationService; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.ReceiptPayment; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; @@ -91,43 +93,33 @@ /** * 新增付款登记 * * @param paymentRegistration 付款登记 * @param paymentRegistrationList 付款登记 * @return 结果 */ @Override public int insertPaymentRegistration(PaymentRegistration paymentRegistration) { public int insertPaymentRegistration(List<PaymentRegistration> paymentRegistrationList) { for (PaymentRegistration paymentRegistration : paymentRegistrationList) { PaymentRegistration byId = paymentRegistration; if (!ObjectUtils.isEmpty(paymentRegistration.getId())){ paymentRegistration = this.getById(paymentRegistration.getId()); } PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(paymentRegistration.getPurchaseLedgerId()); SalesLedger salesLedger = salesLedgerMapper.selectOne(new QueryWrapper<SalesLedger>(). eq("sales_contract_no", purchaseLedger.getSalesContractNo())); // if (salesLedger == null) { // throw new RuntimeException("关联销售合同号不存在"); // } if (salesLedger != null) { paymentRegistration.setSaleLedgerId(salesLedger.getId()); if(null==purchaseLedger) throw new RuntimeException("未找到采购单"); // 已回款金额 SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(paymentRegistration.getSaleLedgerProductId()); if(null==salesLedgerProduct) throw new RuntimeException("未找到采购单产品"); if (salesLedgerProduct.getPendingInvoiceTotal().compareTo(paymentRegistration.getCurrentPaymentAmount())<0){ throw new RuntimeException("本次回款金额不能大于待回款金额"); } paymentRegistration.setSupplierId(purchaseLedger.getSupplierId()); TicketRegistration tr = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getId, paymentRegistration.getTicketRegistrationId())); if (tr == null) { throw new RuntimeException("关联发票不存在"); } List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>() .eq("ticket_registration_id", tr.getId())); BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(tr.getInvoiceAmount()) > 0) { throw new RuntimeException("付款金额超出发票金额"); } LoginUser loginUser = SecurityUtils.getLoginUser(); Long tenantId = loginUser.getTenantId(); paymentRegistration.setTenantId(tenantId); paymentRegistration.setRegistrantId(loginUser.getUserId()); paymentRegistration.setCreateTime(DateUtils.getNowDate()); paymentRegistration.setUpdateTime(DateUtils.getNowDate()); return paymentRegistrationMapper.insert(paymentRegistration); salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getInvoiceTotal().add(paymentRegistration.getCurrentPaymentAmount())); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal())); paymentRegistrationMapper.insert(paymentRegistration); salesLedgerProductMapper.updateById(salesLedgerProduct); } return 1; } /** src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -331,6 +331,7 @@ LocalDateTime localDateTime = entryDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); salesLedgerProduct.setRegisterDate(localDateTime); salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); } } src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
@@ -40,7 +40,7 @@ * @return */ @PostMapping("/saveOrUpdate") public AjaxResult receiptPaymentSaveOrUpdate (@RequestBody ReceiptPayment receiptPayment) { public AjaxResult receiptPaymentSaveOrUpdate (@RequestBody List<ReceiptPayment> receiptPayment) { receiptPaymentService.receiptPaymentSaveOrUpdate(receiptPayment); return AjaxResult.success(); } src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -8,6 +8,7 @@ import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,6 +41,28 @@ private ISalesLedgerProductService salesLedgerProductService; @Autowired private ProcurementRecordService procurementRecordService; /** * 回款登记分页查询 */ @GetMapping("/listPageSalesLedger") public AjaxResult listPage(Page page, SalesLedgerProductDto salesLedgerProduct) { IPage<SalesLedgerProductDto> list = salesLedgerProductService.listPage(page,salesLedgerProduct); return AjaxResult.success(list); } /** * 付款登记分页查询 */ @GetMapping("/listPagePurchaseLedger") public AjaxResult listPagePurchaseLedger(Page page, SalesLedgerProductDto salesLedgerProduct) { IPage<SalesLedgerProductDto> list = salesLedgerProductService.listPagePurchaseLedger(page,salesLedgerProduct); return AjaxResult.success(list); } /** * 查询产品信息列表 */ @@ -52,6 +75,7 @@ procurementDto.setSalesLedgerProductId(item.getId()); procurementDto.setProductCategory(item.getProductCategory()); IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(new Page<>(1,-1), procurementDto); if(result.getTotal()==0) return; ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0); if(item.getQuantity().compareTo(procurementDtoCopy.getInboundNum0())>=0){ item.setApproveStatus(1); src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java
@@ -44,7 +44,7 @@ @ApiModelProperty(value = "销售台账sales_ledger") @Excel(isExport = false) private Integer salesLedgerId; private Long salesLedgerId; @ApiModelProperty(value = "销售合同号") @Excel(name = "销售合同号") src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDto.java
@@ -1,4 +1,47 @@ package com.ruoyi.sales.dto; public class SalesLedgerProductDto { import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; import com.ruoyi.sales.pojo.SalesLedgerProduct; import java.math.BigDecimal; import java.time.LocalDate; @Data public class SalesLedgerProductDto extends SalesLedgerProduct { /** * 采购合同号 */ @Excel(name = "采购合同号") private String purchaseContractNumber; /** * 销售合同号 */ private String salesContractNo; /** * 客户合同号 */ private String customerContractNo; /** * 项目名称 */ private String projectName; /** * 客户名称 */ private String customerName; /** * 状态 */ private String statusName; /** * true:不显示待付款,回款为0的数据 */ private Boolean status; } src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -1,6 +1,9 @@ package com.ruoyi.sales.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.config.MyBaseMapper; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.pojo.SalesLedgerProduct; import org.apache.ibatis.annotations.Param; @@ -17,4 +20,7 @@ SalesLedgerProduct selectSalesLedgerProductByMainId(@Param("productMainId") Long productMainId); IPage<SalesLedgerProductDto> listPage(Page page, @Param("req") SalesLedgerProductDto salesLedgerProduct); IPage<SalesLedgerProductDto> listPagePurchaseLedger(Page page,@Param("req") SalesLedgerProductDto salesLedgerProduct); } src/main/java/com/ruoyi/sales/pojo/ReceiptPayment.java
@@ -12,6 +12,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @Data public class ReceiptPayment { @@ -34,6 +35,12 @@ @ApiModelProperty(value = "invoice_ledger开票台账主键ID") private Integer invoiceLedgerId; @ApiModelProperty(value = "sales_ledger销售台账主键ID") private Long salesLedgerId; @ApiModelProperty(value = "sales_ledger_product销售台账产品主键ID") private Long salesLedgerProductId; @ApiModelProperty(value = "来款日期") @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -209,4 +209,16 @@ // @TableField(exist = false) @ApiModelProperty(value = "审批状态:0未生产,1已生产,2待审核(审核中),3审核完成,4审核失败") private Integer approveStatus; @ApiModelProperty(value = "待回款总金额") private BigDecimal pendingInvoiceTotal; @ApiModelProperty(value = "回款总金额") private BigDecimal invoiceTotal; @ApiModelProperty(value = "待付款总金额") private BigDecimal pendingTicketsTotal; @ApiModelProperty(value = "付款总金额") private BigDecimal ticketsTotal; } src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
@@ -1,6 +1,9 @@ package com.ruoyi.sales.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.pojo.SalesLedgerProduct; import java.util.List; @@ -20,4 +23,8 @@ int deleteSalesLedgerProductByIds(Long[] ids); int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct); IPage<SalesLedgerProductDto> listPage(Page page, SalesLedgerProductDto salesLedgerProduct); IPage<SalesLedgerProductDto> listPagePurchaseLedger(Page page, SalesLedgerProductDto salesLedgerProduct); } src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java
@@ -19,7 +19,7 @@ * @param receiptPayment * @return */ int receiptPaymentSaveOrUpdate(ReceiptPayment receiptPayment); int receiptPaymentSaveOrUpdate(List<ReceiptPayment> receiptPayment); /** * 回款登记修改 src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
@@ -13,12 +13,15 @@ import com.ruoyi.sales.mapper.InvoiceLedgerMapper; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.ReceiptPayment; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ReceiptPaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; @@ -37,39 +40,47 @@ @Autowired private SalesLedgerMapper salesLedgerMapper; @Autowired private SalesLedgerProductMapper salesLedgerProductMapper; @Autowired private InvoiceLedgerMapper invoiceLedgerMapper; /** * 回款登记新增 * @param receiptPayment * @param receiptPaymentList * @return */ @Override public int receiptPaymentSaveOrUpdate(ReceiptPayment receiptPayment) { @Transactional(rollbackFor = Exception.class) public int receiptPaymentSaveOrUpdate(List<ReceiptPayment> receiptPaymentList) { for (ReceiptPayment receiptPayment : receiptPaymentList) { ReceiptPayment byId = receiptPayment; if (!ObjectUtils.isEmpty(receiptPayment.getId())){ byId = this.getById(receiptPayment.getId()); receiptPayment = this.getById(receiptPayment.getId()); } InvoiceLedger invoiceLedger = invoiceLedgerMapper.selectById(byId.getInvoiceLedgerId()); Page<ReceiptPaymentDto> objectPage = new Page<>(); ReceiptPaymentDto receiptPaymentDto = new ReceiptPaymentDto(); receiptPaymentDto.setInvoiceLedgerId(invoiceLedger.getId()); IPage<ReceiptPaymentDto> receiptPaymentDtoIPage = receiptPaymentMapper.bindInvoiceNoRegPage(objectPage, receiptPaymentDto); ReceiptPaymentDto receiptPaymentDto1 = receiptPaymentDtoIPage.getRecords().get(0); if (!ObjectUtils.isEmpty(byId.getId())){ receiptPaymentDto1.setNoReceiptAmount(receiptPaymentDto1.getNoReceiptAmount().add(byId.getReceiptPaymentAmount())); } if (receiptPaymentDto1.getNoReceiptAmount().compareTo(receiptPayment.getReceiptPaymentAmount())<0){ // InvoiceLedger invoiceLedger = invoiceLedgerMapper.selectById(byId.getInvoiceLedgerId()); SalesLedger salesLedger = salesLedgerMapper.selectById(receiptPayment.getSalesLedgerId()); if(null==salesLedger) throw new RuntimeException("未找到销售单"); // 已回款金额 SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(receiptPayment.getSalesLedgerProductId()); if(null==salesLedgerProduct) throw new RuntimeException("未找到销售单产品"); if (salesLedgerProduct.getPendingInvoiceTotal().compareTo(receiptPayment.getReceiptPaymentAmount())<0){ throw new RuntimeException("本次回款金额不能大于待回款金额"); } if(null==receiptPayment.getId()){ return receiptPaymentMapper.insert(receiptPayment); salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getInvoiceTotal().add(receiptPayment.getReceiptPaymentAmount())); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal())); receiptPaymentMapper.insert(receiptPayment); }else { return receiptPaymentMapper.updateById(receiptPayment); BigDecimal subtract = receiptPayment.getReceiptPaymentAmount().subtract(byId.getReceiptPaymentAmount()); salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getInvoiceTotal().add(subtract)); salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getInvoiceTotal())); receiptPaymentMapper.updateById(receiptPayment); } salesLedgerProductMapper.updateById(salesLedgerProduct); } return 1; } /** src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -3,12 +3,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; @@ -270,6 +274,34 @@ return result; } @Override public IPage<SalesLedgerProductDto> listPage(Page page, SalesLedgerProductDto salesLedgerProduct) { IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPage(page, salesLedgerProduct); salesLedgerProductDtoIPage.getRecords().forEach(item -> { // 判断状态 if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){ item.setStatusName("已完成付款"); }else{ item.setStatusName("未完成付款"); } }); return salesLedgerProductDtoIPage; } @Override public IPage<SalesLedgerProductDto> listPagePurchaseLedger(Page page, SalesLedgerProductDto salesLedgerProduct) { IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPagePurchaseLedger(page, salesLedgerProduct); salesLedgerProductDtoIPage.getRecords().forEach(item -> { // 判断状态 if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){ item.setStatusName("已完成付款"); }else{ item.setStatusName("未完成付款"); } }); return salesLedgerProductDtoIPage; } /** * 通用方法:根据主表ID和子表列表,更新主表的合同金额 */ src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -680,6 +680,7 @@ salesLedgerProduct.setType(type); salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProduct.setInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); ProductOrder productOrder = new ProductOrder(); src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -33,4 +33,66 @@ </select> <select id="listPage" resultType="com.ruoyi.sales.dto.SalesLedgerProductDto"> select slp.*, sl.project_name, sl.customer_name, sl.sales_contract_no, sl.customer_contract_no from sales_ledger_product slp left join sales_ledger sl on slp.sales_ledger_id = sl.id <where> slp.type = 1 <if test="req.salesContractNo != null and req.salesContractNo != '' "> AND sl.sales_contract_no like concat('%',#{req.salesContractNo},'%') </if> <if test="req.customerContractNo != null and req.customerContractNo != '' "> AND sl.customer_contract_no like concat('%',#{req.customerContractNo},'%') </if> <if test="req.projectName != null and req.projectName != '' "> AND sl.project_name like concat('%',#{req.projectName},'%') </if> <if test="req.customerName != null and req.customerName != '' "> AND sl.customer_name like concat('%',#{req.customerName},'%') </if> <if test="req.productCategory != null and req.productCategory != '' "> AND slp.product_category like concat('%',#{req.productCategory},'%') </if> <if test="req.status != null and req.status "> AND slp.pending_invoice_total > 0 </if> </where> order by slp.register_date desc </select> <select id="listPagePurchaseLedger" resultType="com.ruoyi.sales.dto.SalesLedgerProductDto"> select slp.*, sl.project_name, sl.customer_name, sl.sales_contract_no, sl.customer_contract_no from sales_ledger_product slp left join purchase_ledger sl on slp.sales_ledger_id = sl.id <where> slp.type = 2 <if test="req.purchaseContractNumber != null and req.purchaseContractNumber != '' "> AND sl.purchase_contract_number like concat('%',#{req.purchaseContractNumber},'%') </if> <if test="req.customerContractNo != null and req.customerContractNo != '' "> AND sl.customer_contract_no like concat('%',#{req.customerContractNo},'%') </if> <if test="req.projectName != null and req.projectName != '' "> AND sl.project_name like concat('%',#{req.projectName},'%') </if> <if test="req.customerName != null and req.customerName != '' "> AND sl.customer_name like concat('%',#{req.customerName},'%') </if> <if test="req.productCategory != null and req.productCategory != '' "> AND slp.product_category like concat('%',#{req.productCategory},'%') </if> <if test="req.status != null and req.status "> AND slp.pending_invoice_total > 0 </if> </where> order by slp.register_date desc </select> </mapper>