From 7ab0221edafd81468b37935fd6e8a9f7cebd181f Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 08 六月 2026 15:14:41 +0800
Subject: [PATCH] 销售台账/采购台账,在新增产品数据的时候,增加一个运费单价(非必填),就像那个含税单价一样,当用户填完数量和运费单价之后,可以直接计算出这个产品的总运费

---
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |    3 +
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                  |    2 +
 src/main/java/com/ruoyi/purchase/pojo/SalesLedgerProductTemplate.java         |    6 +++
 src/main/java/com/ruoyi/common/utils/FreightUtils.java                        |   33 ++++++++++++++++
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java      |   12 ++++++
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java  |    4 ++
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                    |   12 ++++++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java        |    8 ++--
 doc/20260608_add_freight_fields_to_sales_ledger_product.sql                   |    7 +++
 src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java            |   12 ++++++
 10 files changed, 94 insertions(+), 5 deletions(-)

diff --git a/doc/20260608_add_freight_fields_to_sales_ledger_product.sql b/doc/20260608_add_freight_fields_to_sales_ledger_product.sql
new file mode 100644
index 0000000..f8613c5
--- /dev/null
+++ b/doc/20260608_add_freight_fields_to_sales_ledger_product.sql
@@ -0,0 +1,7 @@
+alter table sales_ledger_product
+    add freight_unit_price decimal(16, 2) null comment '杩愯垂鍗曚环' after tax_inclusive_total_price,
+    add total_freight decimal(16, 2) null comment '鎬昏繍璐�' after freight_unit_price;
+
+alter table sales_ledger_product_template
+    add freight_unit_price decimal(16, 2) null comment '杩愯垂鍗曚环' after tax_inclusive_total_price,
+    add total_freight decimal(16, 2) null comment '鎬昏繍璐�' after freight_unit_price;
diff --git a/src/main/java/com/ruoyi/common/utils/FreightUtils.java b/src/main/java/com/ruoyi/common/utils/FreightUtils.java
new file mode 100644
index 0000000..398bc1d
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/utils/FreightUtils.java
@@ -0,0 +1,33 @@
+package com.ruoyi.common.utils;
+
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * 杩愯垂璁$畻宸ュ叿绫�
+ */
+public class FreightUtils {
+
+    private FreightUtils() {
+        // 绉佹湁鏋勯�犲嚱鏁帮紝闃叉瀹炰緥鍖�
+    }
+
+    /**
+     * 璁$畻鎬昏繍璐�
+     * 鎬昏繍璐� = 鏁伴噺 脳 杩愯垂鍗曚环
+     *
+     * @param product 浜у搧淇℃伅
+     */
+    public static void fillFreightAmount(SalesLedgerProduct product) {
+        if (product == null) {
+            return;
+        }
+        if (product.getQuantity() == null || product.getFreightUnitPrice() == null) {
+            product.setTotalFreight(null);
+            return;
+        }
+        product.setTotalFreight(product.getQuantity().multiply(product.getFreightUnitPrice()).setScale(2, RoundingMode.HALF_UP));
+    }
+}
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java
index 3db4abe..acbe0a8 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerProductImportDto.java
@@ -69,6 +69,18 @@
     private BigDecimal taxInclusiveTotalPrice;
 
     /**
+     * 杩愯垂鍗曚环
+     */
+    @Excel(name = "杩愯垂鍗曚环")
+    private BigDecimal freightUnitPrice;
+
+    /**
+     * 鎬昏繍璐�
+     */
+    @Excel(name = "鎬昏繍璐�")
+    private BigDecimal totalFreight;
+
+    /**
      * 鍙戠エ绫诲瀷
      */
     @Excel(name = "鍙戠エ绫诲瀷")
diff --git a/src/main/java/com/ruoyi/purchase/pojo/SalesLedgerProductTemplate.java b/src/main/java/com/ruoyi/purchase/pojo/SalesLedgerProductTemplate.java
index 793fba6..d53fd50 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/SalesLedgerProductTemplate.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/SalesLedgerProductTemplate.java
@@ -59,6 +59,12 @@
     @Schema(description = "鍚◣鎬讳环")
     private BigDecimal taxInclusiveTotalPrice;
 
+    @Schema(description = "杩愯垂鍗曚环")
+    private BigDecimal freightUnitPrice;
+
+    @Schema(description = "鎬昏繍璐�")
+    private BigDecimal totalFreight;
+
     @Schema(description = "涓嶅惈绋庢�讳环")
     private BigDecimal taxExclusiveTotalPrice;
 
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 a3458b8..0833069 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -27,6 +27,7 @@
 import com.ruoyi.common.enums.ReviewStatusEnum;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.FreightUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -678,6 +679,7 @@
         // 鎵ц鏇存柊鎿嶄綔
         if (!updateList.isEmpty()) {
             for (SalesLedgerProduct product : updateList) {
+                FreightUtils.fillFreightAmount(product);
                 product.setType(ledgerType);
                 salesLedgerProductMapper.updateById(product);
             }
@@ -685,6 +687,7 @@
         // 鎵ц鎻掑叆鎿嶄綔
         if (!insertList.isEmpty()) {
             for (SalesLedgerProduct salesLedgerProduct : insertList) {
+                FreightUtils.fillFreightAmount(salesLedgerProduct);
                 salesLedgerProduct.setType(ledgerType);
                 Date entryDate = purchaseLedger.getEntryDate();
 
@@ -974,6 +977,7 @@
                 for (PurchaseLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
                     SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
                     BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
+                    FreightUtils.fillFreightAmount(salesLedgerProduct);
                     salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                     salesLedgerProduct.setType(2);
                     // 璁$畻涓嶅惈绋庢�讳环
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
index 9f05b60..9346354 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductImportDto.java
@@ -62,6 +62,18 @@
     private BigDecimal taxInclusiveTotalPrice;
 
     /**
+     * 杩愯垂鍗曚环
+     */
+    @Excel(name = "杩愯垂鍗曚环")
+    private BigDecimal freightUnitPrice;
+
+    /**
+     * 鎬昏繍璐�
+     */
+    @Excel(name = "鎬昏繍璐�")
+    private BigDecimal totalFreight;
+
+    /**
      * 鍙戠エ绫诲瀷
      */
     @Excel(name = "鍙戠エ绫诲瀷")
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index d9f8eff..53e6c08 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -87,6 +87,18 @@
     private BigDecimal taxInclusiveTotalPrice;
 
     /**
+     * 杩愯垂鍗曚环
+     */
+    @Excel(name = "杩愯垂鍗曚环")
+    private BigDecimal freightUnitPrice;
+
+    /**
+     * 鎬昏繍璐�
+     */
+    @Excel(name = "鎬昏繍璐�")
+    private BigDecimal totalFreight;
+
+    /**
      * 涓嶅惈绋庢�讳环
      */
     @Excel(name = "涓嶅惈绋庢�讳环")
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 9f6e004..5153928 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.common.utils.FreightUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.ProductionPlan;
@@ -165,7 +166,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
-
+        FreightUtils.fillFreightAmount(salesLedgerProduct);
         int result;
         Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
         if (salesLedgerProduct.getId() == null) {
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 7b71ef3..6b77527 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -22,10 +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.DateUtils;
-import com.ruoyi.common.utils.EnumUtil;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.*;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
@@ -402,6 +399,7 @@
                 for (SalesLedgerProductImportDto salesLedgerProductImportDto : salesLedgerProductImportDtos) {
                     SalesLedgerProduct salesLedgerProduct = new SalesLedgerProduct();
                     BeanUtils.copyProperties(salesLedgerProductImportDto, salesLedgerProduct);
+                    FreightUtils.fillFreightAmount(salesLedgerProduct);
                     salesLedgerProduct.setSalesLedgerId(salesLedger.getId());
                     salesLedgerProduct.setType(1);
                     // 璁$畻涓嶅惈绋庢�讳环
@@ -616,6 +614,7 @@
         // 鎵ц鏇存柊鎿嶄綔
         if (!updateList.isEmpty()) {
             for (SalesLedgerProduct product : updateList) {
+                FreightUtils.fillFreightAmount(product);
                 product.setType(type.getCode());
                 salesLedgerProductMapper.updateById(product);
             }
@@ -623,6 +622,7 @@
         // 鎵ц鎻掑叆鎿嶄綔
         if (!insertList.isEmpty()) {
             for (SalesLedgerProduct salesLedgerProduct : insertList) {
+                FreightUtils.fillFreightAmount(salesLedgerProduct);
                 salesLedgerProduct.setType(type.getCode());
                 salesLedgerProductMapper.insert(salesLedgerProduct);
                 // 娣诲姞鐢熶骇鏁版嵁
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index e2e6277..48890f5 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -14,6 +14,8 @@
         T1.tax_rate,
         T1.tax_inclusive_unit_price,
         T1.tax_inclusive_total_price,
+        T1.freight_unit_price,
+        T1.total_freight,
         T1.tax_exclusive_total_price,
         T1.invoice_type,
         T1.type,

--
Gitblit v1.9.3