From 1794429446df460995c5db95729258e922710338 Mon Sep 17 00:00:00 2001
From: zhaowenxuan <chacca165@163.com>
Date: 星期三, 30 七月 2025 09:27:20 +0800
Subject: [PATCH] 结算价格处理

---
 ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java |  119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 119 insertions(+), 0 deletions(-)

diff --git a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java
index 019a71c..ed72e7d 100644
--- a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java
+++ b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java
@@ -14,6 +14,7 @@
 import java.util.concurrent.*;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 import java.util.stream.Stream;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -1575,6 +1576,23 @@
             }
 
             if(StringUtil.isNotBlank(lycdzjhmxj) && lycdzjhmxj.equalsIgnoreCase("N")){
+                BigDecimal paidIn = tjFlowingWater.getPaidIn();
+                BigDecimal difference = zongjia.subtract(paidIn);
+                if (difference.compareTo(BigDecimal.ZERO) > 0) {
+                    log.info("閲戦澶氬嚭浜嗭細{}",difference);
+                    log.info("-----------------------鍘熸槑缁�-------------------------");
+                    calculateTotalPrice(array,false);
+                    log.info("-----------------------鏂版槑缁�-------------------------");
+                    adjustPrice(array,paidIn);
+                    zongjia = calculateTotalPrice(array,true);
+                } else if (difference.compareTo(BigDecimal.ZERO) < 0) {
+                    log.info("閲戦缂哄皯浜嗭細{}", difference.abs());
+                    log.info("-----------------------鍘熸槑缁�-------------------------");
+                    calculateTotalPrice(array,false);
+                    log.info("-----------------------鏂版槑缁�-------------------------");
+                    adjustPrice(array,paidIn);
+                    zongjia = calculateTotalPrice(array,true);
+                }
                 map.put("feiYongInfoList", array);
             }else {
                 zongjia = tjFlowingWater.getPaidIn();
@@ -1618,6 +1636,107 @@
         return null;
     }
 
+    /**
+     * 鍒ゆ柇鎬讳环鏄惁涓�鑷� 鏄惁杩涜浠锋牸琛ュ噺
+     * - 淇濊瘉鎵�鏈夊崟浠蜂笉涓鸿礋鏁�
+     * - 宸鍒嗘憡绛栫暐涓猴細骞冲潎鍒嗘憡 + 璇樊琛ユ渶鍚庝竴椤�
+     *
+     * @param items       his浼犻�掔殑鏄庣粏椤圭洰
+     * @param targetTotal 鎬讳环
+     */
+    public static void adjustPrice(JSONArray items, BigDecimal targetTotal) {
+        BigDecimal actualTotal = BigDecimal.ZERO;
+        int size = items.size();
+
+        // 璁$畻鐩墠鏄庣粏闆嗗悎鎬讳环
+        for (int i = 0; i < size; i++) {
+            JSONObject item = items.getJSONObject(i);
+            BigDecimal danJia = item.getBigDecimal("danJia");
+            BigDecimal shuliang = item.getBigDecimal("shuliang");
+            BigDecimal jieSuanJe = danJia.multiply(shuliang).setScale(2, RoundingMode.HALF_UP);
+            item.set("jieSuanJe", jieSuanJe);
+            actualTotal = actualTotal.add(jieSuanJe);
+        }
+        BigDecimal diff = targetTotal.subtract(actualTotal).setScale(2, RoundingMode.HALF_UP);
+        // 鏃犻渶璋冩暣
+        if (diff.compareTo(BigDecimal.ZERO) == 0 || size == 0) {
+            return;
+        }
+
+        // 鍓╀綑寰呭垎鎽婂樊棰�
+        BigDecimal remainingDiff = diff;
+        for (int i = 0; i < size; i++) {
+            JSONObject item = items.getJSONObject(i);
+            BigDecimal danJia = item.getBigDecimal("danJia");
+            BigDecimal shuliang = item.getBigDecimal("shuliang");
+
+            if (shuliang.compareTo(BigDecimal.ZERO) == 0) continue;
+
+            // 鍒嗘憡姣斾緥锛堝钩鍧囧垎锛�
+            // 绀轰緥锛氳嫢鍓╀綑宸 remainingDiff = 1.50锛屽墿浣� 3 椤癸紝褰撳墠 portion = 1.50 梅 3 = 0.50
+            BigDecimal portion = remainingDiff.divide(new BigDecimal(size - i), 10, RoundingMode.HALF_UP);
+
+            // 鍒嗘憡鍒板崟浠蜂笂
+            // 绀轰緥锛歱ortion = 0.50锛宻huliang = 2锛宒eltaPerUnit = 0.25
+            BigDecimal deltaPerUnit = portion.divide(shuliang, 10, RoundingMode.HALF_UP);
+
+            // 璋冩暣鍗曚环锛氭柊鍗曚环 = 鍘熷崟浠� + 鍗曚綅宸
+            BigDecimal adjustedDanJia = danJia.add(deltaPerUnit).setScale(2, RoundingMode.HALF_UP);
+
+            // 闃叉璐熸暟浠锋牸
+            if (adjustedDanJia.compareTo(BigDecimal.ZERO) < 0) {
+                adjustedDanJia = BigDecimal.ZERO;
+            }
+
+            item.set("danJia", adjustedDanJia);
+            BigDecimal adjustedJieSuan = adjustedDanJia.multiply(shuliang).setScale(2, RoundingMode.HALF_UP);
+            item.set("jieSuanJe", adjustedJieSuan);
+
+            // 璁$畻鏈瀹為檯璋冩暣鐨勫樊棰濓紝缁х画鍒嗘憡鍓╀綑閮ㄥ垎
+            BigDecimal oldJieSuan = danJia.multiply(shuliang).setScale(2, RoundingMode.HALF_UP);
+            remainingDiff = remainingDiff.subtract(adjustedJieSuan.subtract(oldJieSuan));
+        }
+
+        // 鑻ヤ粛瀛樺湪灏忛宸锛堝鐢变簬鍥涜垗浜斿叆瀵艰嚧锛夛紝灏濊瘯鎶婂樊棰濊ˉ鍒版渶鍚庝竴椤�
+        if (remainingDiff.abs().compareTo(new BigDecimal("0.01")) > 0) {
+            JSONObject lastItem = items.getJSONObject(size - 1);
+            BigDecimal danJia = lastItem.getBigDecimal("danJia");
+            BigDecimal shuliang = lastItem.getBigDecimal("shuliang");
+            if (shuliang.compareTo(BigDecimal.ZERO) != 0) {
+                BigDecimal delta = remainingDiff.divide(shuliang, 10, RoundingMode.HALF_UP);
+                BigDecimal newDanJia = danJia.add(delta).setScale(2, RoundingMode.HALF_UP);
+                if (newDanJia.compareTo(BigDecimal.ZERO) < 0) {
+                    newDanJia = BigDecimal.ZERO;
+                }
+                lastItem.set("danJia", newDanJia);
+                BigDecimal newJieSuan = newDanJia.multiply(shuliang).setScale(2, RoundingMode.HALF_UP);
+                lastItem.set("jieSuanJe", newJieSuan);
+            }
+        }
+    }
+
+    /**
+     * 鏄庣粏浠锋牸鏃ュ織杈撳嚭
+     * @param array
+     */
+    public static BigDecimal calculateTotalPrice(JSONArray array,Boolean isOverride) {
+        BigDecimal total = BigDecimal.ZERO;
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject obj = array.getJSONObject(i);
+            BigDecimal danJia = new BigDecimal(obj.getStr("danJia", "0")).setScale(2, RoundingMode.HALF_UP);
+            BigDecimal shuliang = new BigDecimal(obj.getStr("shuliang", "0")).setScale(2, RoundingMode.HALF_UP);
+            BigDecimal jieSuanJe = danJia.multiply(shuliang).setScale(2, RoundingMode.HALF_UP);
+            obj.set("danJia", danJia);
+            obj.set("shuliang", shuliang);
+            obj.set("jieSuanJe", jieSuanJe);
+            total = total.add(jieSuanJe);
+            log.info(String.format("绗�%d椤� -> 鍗曚环: %s, 鏁伴噺: %s, 缁撶畻閲戦: %s", i + 1, danJia, shuliang, jieSuanJe));
+        }
+        log.info("鎬讳环涓�: {}", total.setScale(2, RoundingMode.HALF_UP));
+        if (isOverride) return total.setScale(2, RoundingMode.HALF_UP);
+        return null;
+    }
+
     public void addCaiYangDengJi(List<TjOrderDetail> detailList, boolean detailList1, TjOrder order, SysUser sysUser, String jxbz) {
         String lis_tmh_prefix = configService.selectConfigByKey("make_lis_tmh_prefix");
         String config = configService.selectConfigByKey("sfkqdyhis");

--
Gitblit v1.8.0