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