From 027c1328165a0d37a778ec7f58760bb0fe1ffebb Mon Sep 17 00:00:00 2001
From: zjh <1084500556@qq.com>
Date: 星期三, 30 七月 2025 17:00:01 +0800
Subject: [PATCH] zjh20250730-1

---
 ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java |  154 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 154 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 372f240..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;
@@ -46,6 +47,7 @@
 import com.ltkj.common.core.redis.RedisCache;
 import com.ltkj.common.enums.DataSourceType;
 import com.ltkj.common.utils.*;
+import com.ltkj.db.DataSourceContextHolder;
 import com.ltkj.framework.config.MatchUtils;
 import com.ltkj.framework.config.ThreadPoolConfig;
 import com.ltkj.framework.config.UserHoder;
@@ -81,6 +83,7 @@
 import com.ltkj.web.controller.lis.LisApiMethod;
 import com.ltkj.web.controller.pacs.PacsApiMethodService;
 import com.ltkj.web.controller.service.TjSysAsyncServiceImpl;
+import com.ltkj.web.controller.service.UtilsService;
 import com.ltkj.web.wxUtils.HttpClientUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -242,6 +245,8 @@
     private TjOrderYcxmService ycxmService;
     @Autowired
     private TbTransitionMapper tbTransitionMapper;
+    @Autowired
+    private UtilsService utilsService;
 
     private static final String TJH = "tjhs:tjh";
 
@@ -1046,6 +1051,7 @@
 //                tjOrder.setTjType("2");
 //            }
         }
+        utilsService.saveCustomerSfzImg(tjOrder.getSfzImg(), DataSourceContextHolder.getDataSourceKey(), String.valueOf(tjCustomer.getCusId()));
         if (StringUtil.isBlank(tjOrder.getFirmId())) {
             tjOrder.setFirmId("0");
         }
@@ -1570,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();
@@ -1610,6 +1633,107 @@
                 return AjaxResult.error();
             }
         }
+        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;
     }
 
@@ -2923,10 +3047,12 @@
             for (TbTransition tbTransition : list) {
                 if (tbTransition.getParentProId().toString().equals(project.getProId().toString())) {
                     JSONObject obj = JSONUtil.createObj();
+                    TjOrderRemark remark = remarkService.getTjOrderRemarkByTjNumAndProParentId(tjNumber, tbTransition.getParentProId().toString());
                     obj.putOpt("index", index++);
                     obj.putOpt("parent_pro_name", tbTransition.getParentProName());
                     obj.putOpt("price", tbTransition.getOrdPrice());
                     obj.putOpt("ks", dept.getDeptName());
+                   if(null !=remark) obj.putOpt("sfzt", remark.getSfbz());
                     huiZong.add(obj);
                 }
             }
@@ -3877,6 +4003,34 @@
     }
 
 
+    @GetMapping("/chushenyemianyijianjiekou")
+    @ApiOperation(value = "鍒濆椤甸潰宸叉鎺ュ彛")
+    @Transactional
+    public AjaxResult chushenyemianyijianjiekou(@RequestParam String tjNUm, @RequestParam String proId) {
+        LambdaQueryWrapper<TjOrderRemark> wq = new LambdaQueryWrapper<>();
+        wq.eq(TjOrderRemark::getTjNumber, tjNUm);
+        wq.eq(TjOrderRemark::getProId, proId);
+        TjOrderRemark remark = remarkService.getOne(wq);
+        remark.setType(1);
+        remarkService.updateById(remark);
+        return AjaxResult.success("鎿嶄綔鎴愬姛!");
+    }
+
+
+    @GetMapping("/chushenyemianchexiaojiekou")
+    @ApiOperation(value = "鍒濆椤甸潰鎾ら攢鎺ュ彛")
+    @Transactional
+    public AjaxResult chushenyemianchexiaojiekou(@RequestParam String tjNUm, @RequestParam String proId) {
+        LambdaQueryWrapper<TjOrderRemark> wq = new LambdaQueryWrapper<>();
+        wq.eq(TjOrderRemark::getTjNumber, tjNUm);
+        wq.eq(TjOrderRemark::getProId, proId);
+        TjOrderRemark remark = remarkService.getOne(wq);
+        remark.setType(0);
+        remarkService.updateById(remark);
+        return AjaxResult.success("鎿嶄綔鎴愬姛!");
+    }
+
+
     @PostMapping("/zongjanyemianshjianzhou")
     @ApiOperation(value = "鎬绘鑾峰彇鏃堕棿杞存帴鍙�")
     @Transactional

--
Gitblit v1.8.0