From 6f0d0d7fbdc99fe85f419f54601430d578041b99 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 22 一月 2026 16:19:31 +0800
Subject: [PATCH] fix: 修正开票与未开票数量、金额计算错误

---
 src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java |  158 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 140 insertions(+), 18 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
index eaf278b..d1ec847 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
@@ -1,53 +1,138 @@
 package com.ruoyi.sales.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 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.SecurityUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.sales.dto.InvoiceRegistrationDto;
 import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
-import com.ruoyi.sales.mapper.InvoiceRegistrationMapper;
-import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
+import com.ruoyi.sales.dto.SalesLedgerDto;
+import com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto;
+import com.ruoyi.sales.mapper.*;
+import com.ruoyi.sales.pojo.InvoiceLedger;
 import com.ruoyi.sales.pojo.InvoiceRegistration;
 import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.InvoiceRegistrationService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 
-import java.util.Collections;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 public class InvoiceRegistrationServiceImpl extends ServiceImpl<InvoiceRegistrationMapper, InvoiceRegistration> implements InvoiceRegistrationService {
 
+    @Autowired
     private InvoiceRegistrationMapper invoiceRegistrationMapper;
 
+    @Autowired
     private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
 
+    @Autowired
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+
+    @Autowired
+    private InvoiceLedgerMapper invoiceLedgerMapper;
 
     /**
-     * 寮�绁ㄧ櫥璁版柊澧�
-     * @param invoiceRegistrationDto
+     * 寮�绁ㄧ櫥璁拌褰曟柊澧�
+     * @param salesLedgerDto
      * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void invoiceRegistrationAdd(InvoiceRegistrationDto invoiceRegistrationDto) {
+    public void invoiceRegistrationSave(SalesLedgerDto salesLedgerDto) {
+        //  鏂板寮�绁ㄧ櫥璁颁富琛�
         InvoiceRegistration invoiceRegistration = new InvoiceRegistration();
-        BeanUtils.copyProperties(invoiceRegistrationDto, invoiceRegistration);
-        // 鏂板寮�绁ㄧ櫥璁�
+        BeanUtils.copyProperties(salesLedgerDto, invoiceRegistration);
+        invoiceRegistration.setId(null);
+        invoiceRegistration.setCustomerId(salesLedgerDto.getCustomerId().intValue());
+        invoiceRegistration.setSalesLedgerId(salesLedgerDto.getId().intValue());
         invoiceRegistrationMapper.insert(invoiceRegistration);
-        List<InvoiceRegistrationProductDto> productDtoList = invoiceRegistrationDto.getProductDtoList();
-        // 鏂板寮�绁ㄤ骇鍝佺櫥璁�
-        if(CollectionUtils.isNotEmpty(productDtoList)){
-            for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) {
-                InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct();
-                BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProduct);
-                invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId());
-                invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct);
+
+        List<SalesLedgerProduct> productData = salesLedgerDto.getProductData();
+        if (CollectionUtils.isEmpty(productData)) {
+            return;
+        }
+
+        for (SalesLedgerProduct productDatum : productData) {
+            //  鏈寮�绁ㄦ暟 / 閲戦
+            BigDecimal currentInvoiceNum = productDatum.getCurrentInvoiceNum();
+            BigDecimal currentInvoiceAmount = productDatum.getCurrentInvoiceAmount();
+
+            if (currentInvoiceNum == null || BigDecimal.ZERO.compareTo(currentInvoiceNum) == 0) {
+                continue;
             }
+
+            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<SalesLedgerProduct>()
+                    .eq(SalesLedgerProduct::getId, productDatum.getId())
+                    .eq(SalesLedgerProduct::getSalesLedgerId, productDatum.getSalesLedgerId());
+            SalesLedgerProduct dbProduct = salesLedgerProductMapper.selectOne(salesLedgerProductLambdaQueryWrapper);
+
+            if (dbProduct == null) {
+                throw new RuntimeException("閿�鍞彴璐︿骇鍝佷笉瀛樺湪锛孖D锛�" + productDatum.getId());
+            }
+
+            //  璁$畻绱寮�绁�
+            BigDecimal newInvoiceNum = dbProduct.getInvoiceNum().add(currentInvoiceNum);
+
+            BigDecimal newInvoiceAmount = dbProduct.getInvoiceAmount().add(currentInvoiceAmount);
+
+            //  璁$畻鏈紑绁�
+            BigDecimal newNoInvoiceNum = dbProduct.getQuantity().subtract(newInvoiceNum);
+
+            BigDecimal newNoInvoiceAmount = dbProduct.getTaxInclusiveTotalPrice().subtract(newInvoiceAmount);
+
+            if (newNoInvoiceNum.compareTo(BigDecimal.ZERO) < 0
+                    || newNoInvoiceAmount.compareTo(BigDecimal.ZERO) < 0) {
+                throw new RuntimeException("寮�绁ㄦ暟閲忔垨閲戦瓒呰繃鍚堝悓鎬婚噺");
+            }
+
+            //  鏇存柊 sales_ledger_product
+            salesLedgerProductMapper.update(
+                    null,
+                    new LambdaUpdateWrapper<SalesLedgerProduct>()
+                            .eq(SalesLedgerProduct::getId, dbProduct.getId())
+                            .set(SalesLedgerProduct::getInvoiceNum, newInvoiceNum)
+                            .set(SalesLedgerProduct::getInvoiceAmount, newInvoiceAmount)
+                            .set(SalesLedgerProduct::getNoInvoiceNum, newNoInvoiceNum)
+                            .set(SalesLedgerProduct::getNoInvoiceAmount, newNoInvoiceAmount)
+            );
+
+            InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct();
+            BeanUtils.copyProperties(dbProduct, invoiceRegistrationProduct);
+
+            invoiceRegistrationProduct.setId(null);
+            invoiceRegistrationProduct.setSalesLedgerId(salesLedgerDto.getId().intValue());
+            invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId());
+            invoiceRegistrationProduct.setSalesLedgerProductId(dbProduct.getId().intValue());
+            invoiceRegistrationProduct.setInvoiceNum(currentInvoiceNum);
+            invoiceRegistrationProduct.setInvoiceAmount(currentInvoiceAmount);
+            invoiceRegistrationProduct.setNoInvoiceAmount(newNoInvoiceAmount);
+
+            invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct);
+
+            InvoiceLedger invoiceLedger = new InvoiceLedger();
+            invoiceLedger.setInvoiceDate(salesLedgerDto.getIssueDate());
+            invoiceLedger.setInvoiceRegistrationProductId(invoiceRegistrationProduct.getId());
+            invoiceLedger.setInvoiceTotal(currentInvoiceAmount);
+            invoiceLedger.setInvoiceNo(salesLedgerDto.getInvoiceNo());
+            invoiceLedger.setCreateUser(SecurityUtils.getUserId().intValue());
+            invoiceLedger.setInvoicePerson(dbProduct.getRegister());
+
+            invoiceLedgerMapper.insert(invoiceLedger);
         }
     }
 
@@ -96,7 +181,7 @@
      */
     @Override
     public IPage<InvoiceRegistrationDto> invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto) {
-        return null;
+        return invoiceRegistrationMapper.invoiceRegistrationListPage(page, invoiceRegistrationDto);
     }
 
     /**
@@ -106,6 +191,43 @@
      */
     @Override
     public List<InvoiceRegistrationProductDto> invoiceRegistrationProductList(InvoiceRegistrationProductDto invoiceRegistrationProductDto) {
-        return Collections.emptyList();
+        return invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
+    }
+
+    /**
+     * 寮�绁ㄧ櫥璁拌鎯�
+     * @param id
+     * @return
+     */
+    @Override
+    public InvoiceRegistrationDto invoiceRegistrationDetail(Integer id) {
+        InvoiceRegistration invoiceRegistration = invoiceRegistrationMapper.selectById(id);
+        if(ObjectUtils.isEmpty(invoiceRegistration)){
+            throw new RuntimeException("寮�绁ㄧ櫥璁颁俊鎭煡鎵惧け璐�");
+        }
+        InvoiceRegistrationDto invoiceRegistrationDto = new InvoiceRegistrationDto();
+        BeanUtils.copyProperties(invoiceRegistration, invoiceRegistrationDto);
+        QueryWrapper<InvoiceRegistrationProduct> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("invoice_registration_id", id);
+        List<InvoiceRegistrationProduct> invoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(queryWrapper);
+        List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductList.stream().map(item -> {
+            InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
+            BeanUtils.copyProperties(item, invoiceRegistrationProductDto);
+            return invoiceRegistrationProductDto;
+        }).collect(Collectors.toList());
+        invoiceRegistrationDto.setProductDtoList(invoiceRegistrationProductDtoList);
+        return invoiceRegistrationDto;
+    }
+
+    /**
+     * 寮�绁ㄧ櫥璁板鍑�
+     * @param response
+     * @param invoiceRegistrationDto
+     */
+    @Override
+    public void invoiceRegistrationExport(HttpServletResponse response, InvoiceRegistrationDto invoiceRegistrationDto) {
+        List<InvoiceRegisAndProductExcelDto> invoiceRegisAndProductExcelDtoList = invoiceRegistrationMapper.invoiceRegisAndProductExcelDtoList();
+        ExcelUtil<InvoiceRegisAndProductExcelDto> util = new ExcelUtil<InvoiceRegisAndProductExcelDto>(InvoiceRegisAndProductExcelDto.class);
+        util.exportExcel(response, invoiceRegisAndProductExcelDtoList, "寮�绁ㄧ櫥璁颁俊鎭�");
     }
 }

--
Gitblit v1.9.3