From 8d350f76d9b8ca447f8eef680745cea2b3ec61d8 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期四, 25 六月 2026 09:09:17 +0800
Subject: [PATCH] fix: 报价、审核、采购台账、供应商往来、销售台账、客户往来小数点保留6位小数

---
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java              |    5 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java            |    9 +
 src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java                      |    4 +
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                             |    2 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java             |   31 ++++++-
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java                   |   23 +++++
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java                |   21 +++++
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |    5 +
 src/main/java/com/ruoyi/common/utils/AmountUtils.java                                    |  124 +++++++++++++++++++++++++++++++
 src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java                      |    3 
 src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java |    5 +
 src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java                            |    5 
 12 files changed, 220 insertions(+), 17 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index 185fa68..c631021 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -26,6 +26,7 @@
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
@@ -109,8 +110,8 @@
         approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? new Date() : dateFormat.parse(approveProcessVO.getApproveTime()));
         approveProcess.setApproveReason(approveProcessVO.getApproveReason());
         approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId());
-        approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice());
-        approveProcess.setPrice(approveProcessVO.getPrice());
+        approveProcess.setMaintenancePrice(AmountUtils.scaleAmount(approveProcessVO.getMaintenancePrice()));
+        approveProcess.setPrice(AmountUtils.scaleAmount(approveProcessVO.getPrice()));
         approveProcess.setStartDate(approveProcessVO.getStartDate());
         approveProcess.setEndDate(approveProcessVO.getEndDate());
         approveProcess.setStartDateTime(approveProcessVO.getStartDateTime());
diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
index 293566a..1c27133 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -16,6 +16,7 @@
 import com.ruoyi.basic.pojo.CustomerUser;
 import com.ruoyi.basic.service.*;
 import com.ruoyi.basic.vo.CustomerVo;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -404,6 +405,7 @@
                     unshippedAmount = BigDecimal.ZERO;
                 }
                 vo.setUnshippedAmount(unshippedAmount);
+                AmountUtils.normalizeCustomerTransaction(vo);
             }
         }
         return p;
@@ -431,6 +433,7 @@
                     unshippedAmount = BigDecimal.ZERO;
                 }
                 vo.setUnshippedAmount(unshippedAmount);
+                AmountUtils.normalizeCustomerTransactionDetail(vo);
             }
         }
         return p;
diff --git a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
index ec8bb26..a46d8de 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
@@ -10,6 +10,7 @@
 import com.ruoyi.basic.mapper.SupplierManageMapper;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.basic.service.ISupplierService;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
@@ -171,6 +172,7 @@
                 vo.setShippedAmount(BigDecimal.ZERO);
                 BigDecimal contractAmount = vo.getContractAmounts() == null ? BigDecimal.ZERO : vo.getContractAmounts();
                 vo.setUnshippedAmount(contractAmount);
+                AmountUtils.normalizeSupplierTransaction(vo);
             }
             return plPage;
         }
@@ -261,6 +263,7 @@
             }
             vo.setShippedAmount(shippedAmount);
             vo.setUnshippedAmount(contractAmount.subtract(shippedAmount));
+            AmountUtils.normalizeSupplierTransaction(vo);
         }
 
         return plPage;
@@ -356,6 +359,7 @@
             }
             vo.setShippedAmount(shippedAmount);
             vo.setUnshippedAmount(contractAmount.subtract(shippedAmount));
+            AmountUtils.normalizeSupplierTransactionDetail(vo);
         }
 
         return plPage;
diff --git a/src/main/java/com/ruoyi/common/utils/AmountUtils.java b/src/main/java/com/ruoyi/common/utils/AmountUtils.java
new file mode 100644
index 0000000..7155fc6
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/utils/AmountUtils.java
@@ -0,0 +1,124 @@
+package com.ruoyi.common.utils;
+
+import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
+import com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo;
+import com.ruoyi.purchase.vo.SupplierTransactionsVo;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo;
+import com.ruoyi.sales.vo.CustomerTransactionsVo;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 閲戦绮惧害宸ュ叿锛氱粺涓�淇濈暀 6 浣嶅皬鏁�
+ */
+public final class AmountUtils {
+
+    public static final int AMOUNT_SCALE = 6;
+    public static final RoundingMode AMOUNT_ROUNDING = RoundingMode.HALF_UP;
+
+    private AmountUtils() {
+    }
+
+    public static BigDecimal scaleAmount(BigDecimal value) {
+        if (value == null) {
+            return BigDecimal.ZERO.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING);
+        }
+        return value.setScale(AMOUNT_SCALE, AMOUNT_ROUNDING);
+    }
+
+    public static BigDecimal calcTaxExclusiveTotalPrice(BigDecimal taxInclusiveTotalPrice, BigDecimal taxRate) {
+        if (taxInclusiveTotalPrice == null || taxRate == null) {
+            return scaleAmount(BigDecimal.ZERO);
+        }
+        BigDecimal divisor = BigDecimal.ONE.add(
+                taxRate.divide(BigDecimal.valueOf(100), AMOUNT_SCALE, AMOUNT_ROUNDING)
+        );
+        return scaleAmount(taxInclusiveTotalPrice.divide(divisor, AMOUNT_SCALE, AMOUNT_ROUNDING));
+    }
+
+    public static void normalizeSalesLedgerProduct(SalesLedgerProduct product) {
+        if (product == null) {
+            return;
+        }
+        product.setTaxInclusiveUnitPrice(scaleAmount(product.getTaxInclusiveUnitPrice()));
+        product.setTaxInclusiveTotalPrice(scaleAmount(product.getTaxInclusiveTotalPrice()));
+        product.setTaxExclusiveTotalPrice(scaleAmount(product.getTaxExclusiveTotalPrice()));
+    }
+
+    public static void normalizeSalesLedgerProducts(Collection<SalesLedgerProduct> products) {
+        if (products == null) {
+            return;
+        }
+        products.forEach(AmountUtils::normalizeSalesLedgerProduct);
+    }
+
+    public static void normalizeContractAmount(Object entity) {
+        if (entity == null) {
+            return;
+        }
+        try {
+            java.lang.reflect.Field field = entity.getClass().getDeclaredField("contractAmount");
+            field.setAccessible(true);
+            field.set(entity, scaleAmount((BigDecimal) field.get(entity)));
+        } catch (NoSuchFieldException ignored) {
+        } catch (Exception e) {
+            throw new RuntimeException("鏍囧噯鍖栧悎鍚岄噾棰濆け璐�", e);
+        }
+    }
+
+    public static void normalizeSupplierTransaction(SupplierTransactionsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmounts(scaleAmount(vo.getContractAmounts()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeSupplierTransactionDetail(SupplierTransactionsDetailsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmount(scaleAmount(vo.getContractAmount()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeCustomerTransaction(CustomerTransactionsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmounts(scaleAmount(vo.getContractAmounts()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeCustomerTransactionDetail(CustomerTransactionsDetailsVo vo) {
+        if (vo == null) {
+            return;
+        }
+        vo.setContractAmount(scaleAmount(vo.getContractAmount()));
+        vo.setShippedAmount(scaleAmount(vo.getShippedAmount()));
+        vo.setUnshippedAmount(scaleAmount(vo.getUnshippedAmount()));
+    }
+
+    public static void normalizeProcurementBusinessSummary(ProcurementBusinessSummaryDto dto) {
+        if (dto == null) {
+            return;
+        }
+        dto.setPurchaseAmount(scaleAmount(dto.getPurchaseAmount()));
+        dto.setAveragePrice(scaleAmount(dto.getAveragePrice()));
+        dto.setReturnAmount(scaleAmount(dto.getReturnAmount()));
+    }
+
+    public static void normalizeProcurementBusinessSummaryList(List<ProcurementBusinessSummaryDto> list) {
+        if (list == null) {
+            return;
+        }
+        list.forEach(AmountUtils::normalizeProcurementBusinessSummary);
+    }
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 1d99dec..cd81a8a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -708,7 +709,9 @@
             dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
             // 搴撳瓨浠峰��
             if(dto.getTaxInclusiveUnitPrice() != null){
-                dto.setTaxInclusiveTotalPrice(dto.getInboundNum0().multiply(dto.getTaxInclusiveUnitPrice()));
+                dto.setTaxInclusiveTotalPrice(AmountUtils.scaleAmount(
+                        dto.getInboundNum0().multiply(dto.getTaxInclusiveUnitPrice())
+                ));
             }
         }
         pageList.setRecords(procurementPageDtoCopyList);
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
index b8ec1d4..45f72a0 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/ProcurementBusinessSummaryServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import lombok.RequiredArgsConstructor;
@@ -20,6 +21,8 @@
     private final SalesLedgerProductMapper salesLedgerProductMapper;
 
     public IPage<ProcurementBusinessSummaryDto> listPage(Page page, ProcurementBusinessSummaryDto procurementBusinessSummaryDto) {
-        return salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto);
+        IPage<ProcurementBusinessSummaryDto> result = salesLedgerProductMapper.procurementBusinessSummaryListPage(page, procurementBusinessSummaryDto);
+        AmountUtils.normalizeProcurementBusinessSummaryList(result.getRecords());
+        return result;
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 09d5d20..fa7726d 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -20,6 +20,7 @@
 import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -61,7 +62,6 @@
 
 import java.io.InputStream;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -122,6 +122,7 @@
         PurchaseLedger purchaseLedger = new PurchaseLedger();
         // DTO杞珽ntity
         BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
+        AmountUtils.normalizeContractAmount(purchaseLedger);
         SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId());
         //褰曞叆浜�
         SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
@@ -235,6 +236,7 @@
 
         // 璁剧疆瀛楁
         for (SalesLedgerProduct product : products) {
+            AmountUtils.normalizeSalesLedgerProduct(product);
             product.setSalesLedgerId(salesLedgerId);
 
             Long productId = product.getProductId();
@@ -276,10 +278,10 @@
         }
 
         // 璁$畻鎬诲惈绋庨噾棰�
-        BigDecimal totalTaxInclusiveAmount = products.stream()
+        BigDecimal totalTaxInclusiveAmount = AmountUtils.scaleAmount(products.stream()
                 .map(SalesLedgerProduct::getTaxInclusiveTotalPrice)
                 .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
+                .reduce(BigDecimal.ZERO, BigDecimal::add));
 
         // 鏇存柊涓昏〃鐨勬�婚噾棰濆瓧娈�
         if (salesLedgerId != null) {
@@ -377,7 +379,9 @@
         // 4. 杞崲 DTO
         PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
         BeanUtils.copyProperties(purchaseLedger, resultDto);
+        AmountUtils.normalizeContractAmount(resultDto);
         if (!products.isEmpty()) {
+            AmountUtils.normalizeSalesLedgerProducts(products);
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
             resultDto.setStorageBlobVOS(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId()));
@@ -420,6 +424,7 @@
         queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
                 .eq(SalesLedgerProduct::getType, 2);
         List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper);
+        AmountUtils.normalizeSalesLedgerProducts(productList);
         resultDto.setProductData(productList);
         return resultDto;
     }
@@ -451,7 +456,14 @@
 
     @Override
     public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) {
-        return purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
+        IPage<PurchaseLedgerDto> page = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
+        if (!CollectionUtils.isEmpty(page.getRecords())) {
+            page.getRecords().forEach(record -> {
+                AmountUtils.normalizeContractAmount(record);
+                AmountUtils.normalizeSalesLedgerProducts(record.getProductData());
+            });
+        }
+        return page;
     }
 
     @Override
@@ -556,8 +568,14 @@
                     BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
                     salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                     salesLedgerProduct.setType(2);
+                    AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
                     // 璁$畻涓嶅惈绋庢�讳环
-                    salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
+                    salesLedgerProduct.setTaxExclusiveTotalPrice(
+                            AmountUtils.calcTaxExclusiveTotalPrice(
+                                    salesLedgerProduct.getTaxInclusiveTotalPrice(),
+                                    salesLedgerProduct.getTaxRate()
+                            )
+                    );
                     list.stream()
                             .filter(map -> map.get("productName").equals(salesLedgerProduct.getProductCategory()) && map.get("model").equals(salesLedgerProduct.getSpecificationModel()))
                             .findFirst()
@@ -605,7 +623,9 @@
         // 4. 杞崲 DTO
         PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
         BeanUtils.copyProperties(purchaseLedger, resultDto);
+        AmountUtils.normalizeContractAmount(resultDto);
         if (!products.isEmpty()) {
+            AmountUtils.normalizeSalesLedgerProducts(products);
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
         }
@@ -623,6 +643,7 @@
         approveProcessVO.setApproveUserIds(purchaseLedger.getApproveUserIds());
         approveProcessVO.setApproveUser(loginUser.getUserId());
         approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessVO.setPrice(AmountUtils.scaleAmount(purchaseLedger.getContractAmount()));
         approveProcessService.addApprove(approveProcessVO);
     }
 
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
index 2e55e79..c5a1856 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
@@ -4,6 +4,7 @@
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 @Data
@@ -27,11 +28,11 @@
     @Schema(description = "鍗曚綅")
     private String unit;
     @Schema(description = "鍗曚环")
-    private Double unitPrice;
+    private BigDecimal unitPrice;
     @Schema(description = "鏁伴噺")
     private Integer quantity;
     @Schema(description = "閲戦")
-    private Double amount;
+    private BigDecimal amount;
     @Schema(description = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 921a844..038396d 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.mapper.*;
@@ -89,7 +90,9 @@
 
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
-        return salesLedgerProductMapper.selectById(id);
+        SalesLedgerProduct product = salesLedgerProductMapper.selectById(id);
+        AmountUtils.normalizeSalesLedgerProduct(product);
+        return product;
     }
 
     @Override
@@ -97,6 +100,7 @@
         List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectSalesLedgerProductList(salesLedgerProduct);
         if(!CollectionUtils.isEmpty(salesLedgerProducts)){
             salesLedgerProducts.forEach(item -> {
+                AmountUtils.normalizeSalesLedgerProduct(item);
                 // 鍙戣揣淇℃伅
                 ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
                         .eq(ShippingInfo::getSalesLedgerProductId, item.getId())
@@ -164,6 +168,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
+        AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
 
         int result;
         Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
@@ -280,7 +285,7 @@
 
             Field amountField = mainEntityClass.getDeclaredField("contractAmount");
             amountField.setAccessible(true);
-            amountField.set(entity, totalAmount);
+            amountField.set(entity, AmountUtils.scaleAmount(totalAmount));
 
             mainMapper.updateById(entity);
         } catch (Exception e) {
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index c94f411..afeddc1 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -22,6 +22,7 @@
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.SaleEnum;
 import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -176,6 +177,7 @@
         productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
         productWrapper.eq(SalesLedgerProduct::getType, 1);
         List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+        AmountUtils.normalizeSalesLedgerProducts(products);
         for (SalesLedgerProduct product : products) {
             product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
             product.setRegisterDate(LocalDateTime.now());
@@ -202,6 +204,7 @@
         // 4. 杞崲 DTO
         SalesLedgerDto resultDto = new SalesLedgerDto();
         BeanUtils.copyProperties(salesLedger, resultDto);
+        AmountUtils.normalizeContractAmount(resultDto);
         if (!products.isEmpty()) {
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
@@ -317,7 +320,11 @@
 
     @Override
     public IPage<SalesLedgerVo> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) {
-        return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+        IPage<SalesLedgerVo> result = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+        if (!CollectionUtils.isEmpty(result.getRecords())) {
+            result.getRecords().forEach(AmountUtils::normalizeContractAmount);
+        }
+        return result;
     }
 
     @Override
@@ -394,8 +401,14 @@
                     BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
                     salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                     salesLedgerProduct.setType(1);
+                    AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
                     // 璁$畻涓嶅惈绋庢�讳环
-                    salesLedgerProduct.setTaxExclusiveTotalPrice(salesLedgerProduct.getTaxInclusiveTotalPrice().divide(new BigDecimal(1).add(salesLedgerProduct.getTaxRate().divide(new BigDecimal(100))), 2, RoundingMode.HALF_UP));
+                    salesLedgerProduct.setTaxExclusiveTotalPrice(
+                            AmountUtils.calcTaxExclusiveTotalPrice(
+                                    salesLedgerProduct.getTaxInclusiveTotalPrice(),
+                                    salesLedgerProduct.getTaxRate()
+                            )
+                    );
                     list.stream()
                             .filter(map -> Objects.equals(map.get("productName"), salesLedgerProduct.getProductCategory()) && Objects.equals(map.get("model"), salesLedgerProduct.getSpecificationModel()))
                             .findFirst()
@@ -558,6 +571,7 @@
 
         // 2. DTO杞珽ntity
         SalesLedger salesLedger = convertToEntity(salesLedgerDto);
+        AmountUtils.normalizeContractAmount(salesLedger);
         salesLedger.setCustomerName(customer.getCustomerName());
         salesLedger.setTenantId(customer.getTenantId());
         // 3. 鏂板鎴栨洿鏂颁富琛�
@@ -576,6 +590,7 @@
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
         if (productList != null && !productList.isEmpty()) {
+            AmountUtils.normalizeSalesLedgerProducts(productList);
             handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType()));
             updateMainContractAmount(
                     salesLedger.getId(),
@@ -605,6 +620,7 @@
         // 鎵ц鏇存柊鎿嶄綔
         if (!updateList.isEmpty()) {
             for (SalesLedgerProduct product : updateList) {
+                AmountUtils.normalizeSalesLedgerProduct(product);
                 product.setType(type.getCode());
                 salesLedgerProductMapper.updateById(product);
             }
@@ -612,6 +628,7 @@
         // 鎵ц鎻掑叆鎿嶄綔
         if (!insertList.isEmpty()) {
             for (SalesLedgerProduct salesLedgerProduct : insertList) {
+                AmountUtils.normalizeSalesLedgerProduct(salesLedgerProduct);
                 salesLedgerProduct.setType(type.getCode());
                 salesLedgerProductMapper.insert(salesLedgerProduct);
                 // 娣诲姞鐢熶骇鏁版嵁
@@ -723,7 +740,7 @@
 
             Field amountField = mainEntityClass.getDeclaredField("contractAmount");
             amountField.setAccessible(true);
-            amountField.set(entity, totalAmount);
+            amountField.set(entity, AmountUtils.scaleAmount(totalAmount));
 
             mainMapper.updateById(entity);
         } catch (Exception e) {
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
index de86ad0..e847384 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -14,6 +14,7 @@
 import com.ruoyi.basic.mapper.CustomerMapper;
 import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.common.enums.IsDeleteEnum;
+import com.ruoyi.common.utils.AmountUtils;
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
@@ -52,14 +53,33 @@
             return salesQuotationDtoIPage;
         }
         salesQuotationDtoIPage.getRecords().forEach(record -> {
+            record.setTotalAmount(AmountUtils.scaleAmount(record.getTotalAmount()));
             List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId());
+            if (!CollectionUtils.isEmpty(products)) {
+                products.forEach(product -> {
+                    product.setUnitPrice(AmountUtils.scaleAmount(product.getUnitPrice()));
+                    product.setAmount(AmountUtils.scaleAmount(product.getAmount()));
+                });
+            }
             record.setProducts(products);
         });
         return salesQuotationDtoIPage;
     }
 
+    private void normalizeAmounts(SalesQuotationDto salesQuotationDto) {
+        salesQuotationDto.setTotalAmount(AmountUtils.scaleAmount(salesQuotationDto.getTotalAmount()));
+        if (CollectionUtils.isEmpty(salesQuotationDto.getProducts())) {
+            return;
+        }
+        salesQuotationDto.getProducts().forEach(product -> {
+            product.setUnitPrice(AmountUtils.scaleAmount(product.getUnitPrice()));
+            product.setAmount(AmountUtils.scaleAmount(product.getAmount()));
+        });
+    }
+
     @Override
     public boolean add(SalesQuotationDto salesQuotationDto) {
+        normalizeAmounts(salesQuotationDto);
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SalesQuotation salesQuotation = new SalesQuotation();
         BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
@@ -101,6 +121,7 @@
     }
     @Override
     public boolean edit(SalesQuotationDto salesQuotationDto) {
+        normalizeAmounts(salesQuotationDto);
         SalesQuotation salesQuotation = new SalesQuotation();
         BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
         ApproveGetAndUpdateVo vo = new ApproveGetAndUpdateVo();
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index 6b48bbe..ab968e2 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -131,7 +131,7 @@
         SUM(slp.tax_inclusive_total_price) AS purchaseAmount,
         COUNT(DISTINCT slp.sales_ledger_id) AS purchaseTimes,
         <!-- 骞冲潎鍗曚环 = 鎬婚噰璐噾棰�/鎬婚噰璐暟閲忥紝淇濈暀2浣嶅皬鏁帮紝閬垮厤闄�0 -->
-        ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 2) AS averagePrice,
+        ROUND(IF(SUM(slp.quantity) = 0, 0, SUM(slp.tax_inclusive_total_price) / SUM(slp.quantity)), 6) AS averagePrice,
         <!-- 璇ヤ骇鍝佸ぇ绫讳笅鏈�鍚庝竴涓綍鍏ユ棩鏈燂紙鍙栧彴璐︿富琛ㄧ殑entry_date锛� -->
         MAX(sl.entry_date) AS entryDate,
         COALESCE(NULLIF(SUM(t1.return_quantity), 0), 0) AS return_quantity,

--
Gitblit v1.9.3