소스 검색

Merge branch 'master' of https://mc.cloudpure.cn/mjava/cont

wzy 2 주 전
부모
커밋
bfe3775124

+ 4 - 0
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/HeiHuOrderService.java

@@ -4,6 +4,7 @@ package com.malk.fenggefushi.service;
 import com.fasterxml.jackson.core.JacksonException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.malk.server.common.McR;
+import lombok.SneakyThrows;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
@@ -45,6 +46,9 @@ public interface HeiHuOrderService {
     /*采购订单定时同步*/
     McR purchaseSchedule(List<Map<String, Object>> dataList) throws JacksonException;
 
+    @SneakyThrows
+    McR purchaseScheduleTest(List<Map<String, Object>> dataList);
+
     List<Map<String, Object>> queryAllPurchase();
 
     McR purchaseUpdateSchedule() throws JacksonException;

+ 505 - 18
mjava-fenggefushi/src/main/java/com/malk/fenggefushi/service/Impl/HeiHuOrderServiceImpl.java

@@ -8,9 +8,7 @@ import com.fasterxml.jackson.core.JacksonException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.malk.fenggefushi.service.HeiHuOrderService;
-import com.malk.fenggefushi.test.test;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.aliwork.YDSearch;
@@ -20,7 +18,6 @@ import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
-import jdk.nashorn.internal.ir.ObjectNode;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -1157,11 +1154,12 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                             double orderTotalPurchaseAmount = 0.0;
                             double orderTotalFlygcb = 0.0;
 
-                            //todo:查询订单的销售订单 | 客户  销售订单号  款式  产品描述  颜色 | 数量  销售单价  销售金额 | 币别 美金汇率 辅料预估成本 销售总金额
+                            //todo:查询订单的销售订单 | 客户  销售订单号  款式  产品描述  颜色 | 数量  销售单价  销售金额 | 币别 美金汇率 辅料预估成本 销售总金额 税率
                             String customerName = "",orderNumber ="",styleNumber ="",productDescription = "",color = "";
                             Double number,unitPrice,salesAmount;
                             String currency = ""; Double USDrate = 0.00; Double flygcb = 0.00; Double saletotalAmount = 0.00;
                             Double estimatedPrice = 0.00;//辅料预估单价
+                            double orderFax = 1.13;
 
                             HashMap body = new HashMap();
                             body.put("orderCode",orderCode);//订单编号
@@ -1189,6 +1187,17 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                     if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
                                         orderNumber = saleOrders.get(0).asText();//销售订单号
                                     }
+                                    JsonNode customFieldValues = item.get("customFieldValues");
+                                    for (JsonNode field : customFieldValues) {
+                                        JsonNode fieldIdNode = field.get("fieldId");
+                                        if (fieldIdNode != null && fieldIdNode.asInt() == 503296) {
+                                            JsonNode valueNode = field.get("value");
+                                            if (valueNode != null) {
+                                                orderFax = valueNode.asDouble() == 0.0 ? 1.13 : valueNode.asDouble() + 1;//税率
+                                                log.info("采购订单税率:{}",orderFax);
+                                            }
+                                        }
+                                    }
                                 }
                             }
 
@@ -1198,11 +1207,6 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                             log.info("saleOrder/queryList2:{}",jsonString2);
                             JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
                             String finalOrderNumber = orderNumber;
-//                            array = array.stream()
-//                                    .filter(item -> item instanceof JSONObject)          // 确保是 JSONObject
-//                                    .map(item -> (JSONObject) item)
-//                                    .filter(obj -> obj.getString("contractNo").equals(finalOrderNumber))
-//                                    .collect(Collectors.toCollection(JSONArray::new));
                             boolean isSample = false;//销售订单若为样品订单则不发起钉钉流程
                             for(int i=0;i<array.size();i++){
                                 JSONObject data = array.getJSONObject(i);
@@ -1272,7 +1276,7 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                         try {
                                             color_AAA = getProductColor(colorList);
                                         } catch (JacksonException e) {
-                                            throw new RuntimeException(e);
+                                            e.printStackTrace();
                                         }
                                         row.put("textField_ml7c3yhs", color_AAA);//todo:颜色
 
@@ -1297,7 +1301,6 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                                 currency = node.get("value").asText();
                                             } else if (node.get("fieldId").asInt() == 165251) {
                                                 USDrate = node.get("value").asDouble();
-
                                             } else if (node.get("fieldId").asInt() == 161783) {
                                                 flygcb = node.get("value").asDouble();
                                             }
@@ -1306,7 +1309,8 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                         row.put("numberField_ml86221y", USDrate);//todo:美金汇率
                                         row.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
                                         if(currency.equals("USD")){
-                                            saletotalAmount = salesAmount * USDrate;
+                                            Double newUSDrate = USDrate == 0.0 ? 7.0 : USDrate;
+                                            saletotalAmount = salesAmount * newUSDrate;
                                         }else {
                                             saletotalAmount = salesAmount;
                                         }
@@ -1314,7 +1318,7 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                         //下面是采购订单的明细数据
                                         row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
                                         for(int j=0;j<products.size();j++){
-                                            if(styleNumber.equals(products.getJSONObject(j).getString("productCode"))){
+                                            if(detail.getString("seq").equals(products.getJSONObject(j).getString("seq"))){
                                                 //找到对应的采购一行数据
                                                 row.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
                                                 row.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
@@ -1328,6 +1332,7 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                             Object value = row.get(key);
                                             rowMap.put(key.toString(), value != null ? value.toString() : "");
                                         }
+                                        rowMap.put("orderFax",orderFax);
                                         currentOrderRows.add(rowMap);
 
                                         // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
@@ -1340,7 +1345,7 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
                                 // ========== 修改点6:计算当前订单的毛利率 ==========
                                 double mlv = 0.0;
                                 if (orderTotalSalesAmount > 0) {
-                                    mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
+                                    mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount/orderFax - orderTotalFlygcb) / orderTotalSalesAmount;
                                 }
 
                                 System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
@@ -1524,6 +1529,485 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
         return null;
     }
 
+    @SneakyThrows
+    @Override
+    public McR purchaseScheduleTest(List<Map<String, Object>> dataList) {
+        HashMap header = new HashMap();
+        header.put("X-AUTH", HeiHuAccessToken().getData().toString());
+        header.put("Content-Type", "application/json");
+        String targetValue = "合同确认,提交审批";
+        String targetValueUpdate = "合同修改,修改审批";
+
+        // 定义一个字符串集合,默认包含两个值:"默认值1"、"默认值2"
+        List<String> targetValues = new ArrayList() {{
+            add("合同确认,提交审批");
+            add("合同修改,修改审批");
+        }};
+        Map<String, List<String>> purchaserOrderCodes = new HashMap<>();
+
+
+        if (ObjectUtil.isNotNull(dataList) && dataList.size() > 0) {
+            for (Map<String, Object> item : dataList) {
+                String purchaserName = (String) item.get("purchaserName");
+                if (purchaserName == null) purchaserName = "未知";
+
+//                boolean hasTargetStatus = false;
+                List<Map<String, Object>> customFieldValues = (List<Map<String, Object>>) item.get("customFieldValues");
+                if (customFieldValues != null) {
+                    for (Map<String, Object> field : customFieldValues) {
+                        if (targetValue.equals(field.get("value") ) || targetValueUpdate.equals(field.get("value"))) {
+                            System.out.println("合同状态类型:"+field.get("value"));
+//                        if (targetValue.equals(field.get("value"))) {
+//                            hasTargetStatus = true;
+                            String orderCode = (String) item.get("orderCode");
+                            if (orderCode != null) {
+                                purchaserOrderCodes.computeIfAbsent(purchaserName + "-" + field.get("value"), k -> new ArrayList<>()).add(orderCode);
+                            }
+                            break;
+                        }
+                    }
+                }
+
+            }
+
+        }
+
+        // 输出所有采购员的待审批订单
+        System.out.println("========== 所有采购员的待审批订单统计 ==========");
+
+        if (purchaserOrderCodes.isEmpty()) {
+            System.out.println("没有找到钉钉审批状态为'" + targetValue + "'的订单");
+        } else {
+            int totalPurchasers = purchaserOrderCodes.size();
+            int totalOrders = purchaserOrderCodes.values().stream().mapToInt(List::size).sum();
+
+            System.out.println("共找到 " + totalOrders + " 个待审批订单");
+            System.out.println("涉及 " + totalPurchasers + " 位采购员");
+            System.out.println();
+
+            // 输出每个采购员的情况
+            for (Map.Entry<String, List<String>> entry : purchaserOrderCodes.entrySet()) {
+                String[] split = entry.getKey().split("-");
+                String purchaserName = split[0];
+                String type = split[1];
+                List<String> orderCodes = entry.getValue();
+                int orderCount = orderCodes.size();
+
+                System.out.println("采购员: " + purchaserName);
+                System.out.println("待审批订单数量: " + orderCount);
+                System.out.println("审批类型: " + type);
+
+                if (orderCount > 1) {
+                    System.out.println("⚠️  注意:该采购员有 " + orderCount + " 个待审批订单");
+                }
+                System.out.println("订单编号: " + String.join(", ", orderCodes));
+            }
+
+            // 按订单数量排序输出
+            System.out.println("========== 按待审批订单数量排序 ==========");
+            purchaserOrderCodes.entrySet().stream()
+                    .sorted((e1, e2) -> Integer.compare(e2.getValue().size(), e1.getValue().size()))
+                    .forEach(entry -> {
+                        String[] split = entry.getKey().split("-");
+                        String purchaserName = split[0];
+                        String type = split[1];
+                        List<String> orderCodes = entry.getValue();
+
+                        System.out.println(purchaserName + " (" + orderCodes.size() + "个): " +
+                                String.join(", ", orderCodes));
+
+                        // ========== 修改点1:声明两个列表分别存储不同毛利率的订单数据 ==========
+                        // 针对同一个采购员,遍历下面的订单编号
+                        System.out.println("开始处理采购员 " + purchaserName + " 的 " + orderCodes.size() + " 个待审批订单");
+
+                        // 高毛利率表单数据 (mlv >= 0.15)
+                        HashMap formdataHigh = new HashMap();
+                        List<Map<String,Object>> tabledataHigh = new ArrayList();
+
+                        // 低毛利率表单数据 (mlv < 0.15)
+                        HashMap formdataLow = new HashMap();
+                        List<Map<String,Object>> tabledataLow = new ArrayList();
+
+                        // ========== 修改点2:为每个订单创建临时存储列表 ==========
+                        // 用于暂存每个订单的明细数据,等计算出毛利率后再决定添加到哪个列表
+//                        Map<String, List<Map<String, String>>> tempOrderDataMap = new HashMap<>();
+                        // 用于存储每个订单的汇总数据,用于计算毛利率
+//                        Map<String, Map<String, Double>> orderSummaryForMlv = new HashMap<>();
+                        List<String> oldIds = new ArrayList<>();
+
+                        for (String orderCode : orderCodes) {
+                            System.out.println("正在处理订单: " + orderCode);
+                            if (type.equals(targetValueUpdate)){
+                                oldIds.add(orderCode);
+                            }
+                            // ========== 修改点3:为当前订单创建临时数据存储 ==========
+                            List<Map<String, Object>> currentOrderRows = new ArrayList<>();
+                            double orderTotalSalesAmount = 0.0;
+                            double orderTotalPurchaseAmount = 0.0;
+                            double orderTotalFlygcb = 0.0;
+
+                            //todo:查询订单的销售订单 | 客户  销售订单号  款式  产品描述  颜色 | 数量  销售单价  销售金额 | 币别 美金汇率 辅料预估成本 销售总金额
+                            String customerName = "",orderNumber ="",styleNumber ="",productDescription = "",color = "";
+                            Double number,unitPrice,salesAmount;
+                            String currency = ""; Double USDrate = 0.00; Double flygcb = 0.00; Double saletotalAmount = 0.00;
+                            Double estimatedPrice = 0.00;//辅料预估单价
+
+                            HashMap body = new HashMap();
+                            body.put("orderCode",orderCode);//订单编号
+                            String jsonString = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/queryList2", header, null, body);
+                            //todo:查询采购订单 生产工厂(供应商)
+                            String shortName = "";
+                            JSONArray dataArray = JSONObject.parseObject(jsonString).getJSONArray("data");
+                            for (int i=0;i<dataArray.size();i++) {
+                                JSONObject data = dataArray.getJSONObject(i);
+                                shortName = data.getString("shortName");//供应商:shortName
+                            }
+                            JSONArray products = JSONObject.parseObject(jsonString).getJSONArray("data").getJSONObject(0).getJSONArray("purchaseSubOrderVOS");
+
+                            List<Map<String, Object>> purchaseRows = new ArrayList<>();
+                            for(int j=0;j<products.size();j++){
+                                Map<String,Object> purchaseRow = new HashMap();
+//                                row.put("textField_mm2t71jm",orderCode);//todo:采购订单单号
+//                                row.put("textField_ml6g7k5e", customerName);//todo:客户
+//                                row.put("textField_ml6g7k5f", orderNumber);//todo:订单号
+//                                //下面是采购订单的明细数据
+//                                row.put("textField_ml7c3yhx",shortName);//todo:生产工厂
+                                    //找到对应的采购一行数据
+                                purchaseRow.put("productCode",products.getJSONObject(j).getString("productCode"));
+                                purchaseRow.put("numberField_ml7c3yhy",products.getJSONObject(j).getDouble("purchasePrice"));//todo:采购单价
+                                purchaseRow.put("numberField_ml7c3yhz",products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购数量
+                                purchaseRow.put("numberField_ml7c3yi0",products.getJSONObject(j).getDouble("purchasePrice") * products.getJSONObject(j).getDouble("purchaseNum"));//todo:采购金额
+                                purchaseRows.add(purchaseRow);
+                            }
+
+
+                            ObjectMapper objectMapper = new ObjectMapper();
+                            JsonNode rootNode = null;
+                            try {
+                                rootNode = objectMapper.readTree(jsonString);
+                            } catch (JsonProcessingException e) {
+                                throw new RuntimeException(e);
+                            }
+                            JsonNode dataNode = rootNode.get("data");
+                            if(dataNode != null && dataNode.isArray()){
+                                for(JsonNode item : dataNode){
+                                    JsonNode orderNoNode = item.get("orderCode");
+                                    JsonNode saleOrders = item.get("relationSaleOrders");
+                                    if(saleOrders != null && saleOrders.isArray() && saleOrders.size() > 0){
+                                        orderNumber = saleOrders.get(0).asText();//销售订单号
+                                    }
+                                }
+                            }
+
+                            HashMap body_A = new HashMap();
+                            body_A.put("orderNo",orderNumber);
+                            String jsonString2 = UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/saleOrder/queryList2", header, null, body_A);//todo:查询销售订单,获取客户、订单号、款号、产品描述、颜色、数量、销售单价、销售金额、币别
+                            log.info("saleOrder/queryList2:{}",jsonString2);
+                            JSONArray array = JSONObject.parseObject(jsonString2).getJSONArray("data");//主表数据
+                            String finalOrderNumber = orderNumber;
+                            boolean isSample = false;//销售订单若为样品订单则不发起钉钉流程
+                            for(int i=0;i<array.size();i++){
+                                JSONObject data = array.getJSONObject(i);
+                                customerName = data.getString("customerCode");//客户
+                                if (finalOrderNumber.equals(data.getString("contractNo"))){
+                                    log.info("customer123:{}",customerName);
+                                }
+                            }
+                            ObjectMapper objectMapper2 = new ObjectMapper();
+                            JsonNode dataNode2 = null;//主表数据
+                            List<JsonNode> list = new ArrayList<>();
+                            try {
+                                dataNode2 = objectMapper2.readTree(jsonString2).get("data");
+                                list = StreamSupport.stream(dataNode2.spliterator(), false)
+                                        .filter(node -> finalOrderNumber.equals(node.get("orderNo").asText()))
+                                        .collect(Collectors.toList());
+                                for (JsonNode item : list){
+                                    JsonNode customFieldValues = item.get("customFieldValues");
+                                    for (JsonNode field : customFieldValues){
+                                        JsonNode fieldIdNode = field.get("fieldId");
+                                        if(fieldIdNode != null && fieldIdNode.asInt() == 161769){
+                                            JsonNode valueNode = field.get("value");
+                                            if(valueNode != null){
+                                                estimatedPrice = valueNode.asDouble();//辅料预估单价
+                                            }
+                                        }
+                                        else if(fieldIdNode != null && fieldIdNode.asInt() == 47771){
+                                            JsonNode valueNode = field.get("value");
+                                            log.info("销售订单类型:{}",valueNode.asText());
+                                            if("样品订单".equals(valueNode.asText())){
+                                                isSample = true;
+                                            }
+                                        }
+                                    }
+                                }
+                            } catch (JsonProcessingException e) {
+                                e.printStackTrace();
+                            }
+
+                            if (!isSample){
+                                JSONArray products_A = JSONObject.parseObject(jsonString2).getJSONArray("data").getJSONObject(0).getJSONArray("saleManageOrderDetailRowApiVOList");//销售订单明细数据
+
+                                if(products_A != null) {
+                                    List<Map<String, Object>> saleRows = new ArrayList<>();
+                                    for (int i = 0; i < products_A.size(); i++) {
+                                        JSONObject detail = products_A.getJSONObject(i);
+                                        Map<String,Object> saleRow = new HashMap();
+
+                                        styleNumber = detail.getString("productCode");//款号
+                                        saleRow.put("textField_ml7c3yhq", styleNumber);//todo:款号
+
+                                        productDescription = detail.getString("productName");//产品描述
+                                        saleRow.put("textField_ml7c3yhr", productDescription);//todo:产品描述
+
+                                        JSONArray array1 = detail.getJSONArray("customFieldValues");
+                                        color = array1.stream()
+                                                .map(obj -> (JSONObject) obj)
+                                                .filter(item -> item.getIntValue("fieldId") == 82259)
+                                                .map(item -> item.getString("value"))
+                                                .findFirst()
+                                                .orElse(null);
+                                        ArrayList colorList = new ArrayList();
+                                        colorList.add(color);
+                                        String color_AAA = null;
+                                        try {
+                                            color_AAA = getProductColor(colorList);
+                                        } catch (JacksonException e) {
+                                            e.printStackTrace();
+                                        }
+                                        saleRow.put("textField_ml7c3yhs", color_AAA);//todo:颜色
+
+                                        number = detail.getDoubleValue("qty");//数量
+                                        saleRow.put("numberField_ml7c3yht", number);//todo:数量
+
+                                        unitPrice = detail.getDoubleValue("unitPrice");//销售单价
+                                        saleRow.put("numberField_ml7c3yhu", unitPrice);//todo:销售单价
+
+                                        salesAmount = number * unitPrice;//销售金额
+                                        saleRow.put("numberField_ml7c3yhv", salesAmount);//todo:销售金额
+                                        String customFieldValues = detail.getString("customFieldValues");
+                                        ObjectMapper mapper = new ObjectMapper();
+                                        JsonNode jsonarray = null;
+                                        try {
+                                            jsonarray = mapper.readTree(customFieldValues);
+                                        } catch (JsonProcessingException e) {
+                                            throw new RuntimeException(e);
+                                        }
+                                        for (JsonNode node : jsonarray) {
+                                            if (node.get("fieldId").asInt() == 47919) {
+                                                currency = node.get("value").asText();
+                                            } else if (node.get("fieldId").asInt() == 165251) {
+                                                USDrate = node.get("value").asDouble();
+
+                                            } else if (node.get("fieldId").asInt() == 161783) {
+                                                flygcb = node.get("value").asDouble();
+                                            }
+                                        }
+                                        saleRow.put("textField_ml7c3yhw", currency);//todo:币别
+                                        saleRow.put("numberField_ml86221y", USDrate);//todo:美金汇率
+                                        saleRow.put("numberField_ml86221z", flygcb);//todo:辅料预估成本
+                                        if(currency.equals("USD")){
+                                            saletotalAmount = salesAmount * USDrate;
+                                        }else {
+                                            saletotalAmount = salesAmount;
+                                        }
+                                        saleRow.put("numberField_ml862220",saletotalAmount);
+
+                                        saleRows.add(saleRow);
+
+                                        // ========== 修改点5:累加当前订单的汇总数据用于计算毛利率 ==========
+                                        orderTotalSalesAmount += saletotalAmount;
+//                                        orderTotalPurchaseAmount += (Double)row.get("numberField_ml7c3yi0");
+                                        orderTotalFlygcb += flygcb;
+                                    }
+                                }
+
+                                // ========== 修改点6:计算当前订单的毛利率 ==========
+                                double mlv = 0.0;
+                                if (orderTotalSalesAmount > 0) {
+                                    mlv = (orderTotalSalesAmount - orderTotalPurchaseAmount - orderTotalFlygcb) / orderTotalSalesAmount;
+                                }
+
+                                System.out.println("订单 " + orderCode + " 毛利率: " + String.format("%.2f%%", mlv * 100));
+
+                                // ========== 修改点7:根据毛利率决定添加到哪个列表 ==========
+                                if (mlv >= 0.15) {
+                                    // 高毛利率订单
+                                    tabledataHigh.addAll(currentOrderRows);
+                                    System.out.println("订单 " + orderCode + " 归类到高毛利率审批(>=15%)");
+                                } else {
+                                    // 低毛利率订单
+                                    tabledataLow.addAll(currentOrderRows);
+                                    System.out.println("订单 " + orderCode + " 归类到低毛利率审批(<15%)");
+                                }
+                            } else {
+                                try {
+                                    log.info("采购订单编号:{}将不发起钉钉审批",orderCode);
+                                    HashMap body1 = new HashMap();
+                                    body1.put("orderCode",orderCode);//订单编号:orderCode
+                                    body1.put("vendorCode",dataArray.getJSONObject(0).getString("vendorCode"));//供应商编码:gysnumber
+                                    String aa = dataArray.getJSONObject(0).getLong("purchaseTime").toString();
+                                    String purchaseTime = Instant.ofEpochMilli(Long.parseLong(aa))
+                                            .atZone(ZoneId.of("Asia/Shanghai"))
+                                            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                                    body1.put("purchaseTime",purchaseTime);//采购日期:purchaseTime
+                                    String bb = dataArray.getJSONObject(0).getLong("planArrivalTime").toString();
+                                    String planArrivalTime = Instant.ofEpochMilli(Long.parseLong(bb))
+                                            .atZone(ZoneId.of("Asia/Shanghai"))
+                                            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+                                    body1.put("planArrivalTime",planArrivalTime);//计划到货日期:planArrivalTime
+                                    ArrayList<Map<String,String>> customFiled = new ArrayList();
+                                    HashMap field = new HashMap();
+                                    field.put("name","采购订单钉钉审批状态");
+                                    field.put("value","审批完成");//审批状态
+                                    customFiled.add(field);
+                                    body1.put("purchaseOrderCustomFieldsValue",customFiled);
+                                    UtilHttp.doPost("https://liteweb.blacklake.cn/api/dytin/external/purchaseOrder/update", header, null, body1);
+                                    log.info("---------【回传,{},采购订单状态完成】-----------",dataArray.getJSONObject(0).getString("orderCode"));
+                                } catch (Exception e) {
+                                    log.info("样品订单的采购订单自动通过审批失败,采购订单编号为:{}",orderCode);
+                                    e.printStackTrace();
+                                }
+                            }
+                        }
+
+                        List<Map<String, Object>> oldList = new ArrayList<>();
+                        List<Map<String, Object>> faxList = new ArrayList<>();
+                        if (type.equals(targetValueUpdate)){
+                            oldIds.forEach(h->{
+                                List<Map> oldDataList = ydService.queryFormData_all(YDParam.builder()
+                                        .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                        .formUuid("FORM-278D56A5065641F8AC95BCA0A8CE8447D8QY")
+                                        .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_mmx9gyct", h)))
+                                        .build());
+                                if (ObjectUtil.isNotNull(oldDataList) && oldDataList.size()>0){
+                                    List<Map> sonList = ydService.queryDetails(YDParam.builder()
+                                            .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                            .formInstanceId(UtilMap.getString(oldDataList.get(0),"textField_mmx9gycu"))
+                                            .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
+                                            .tableFieldId("tableField_ml6g7k5d")
+                                            .build());
+                                    if (ObjectUtil.isNotNull(sonList) && sonList.size() > 0){
+                                        sonList.forEach(s->{
+                                            Map<String, Object> map = new HashMap<>();
+                                            TABLEFIELD_ENUM.forEach((k,v)->{
+                                                map.put(v,UtilMap.getString(s,k));
+                                            });
+                                            oldList.add(map);
+                                        });
+                                    }
+                                    List<Map> sonFaxList = ydService.queryDetails(YDParam.builder()
+                                            .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                            .formInstanceId(UtilMap.getString(oldDataList.get(0),"textField_mmx9gycu"))
+                                            .formUuid("FORM-3A54B12BE3D241218A75242B935F2987YWV2")
+                                            .tableFieldId("tableField_ml7ch2pj")
+                                            .build());
+                                    if (ObjectUtil.isNotNull(sonFaxList) && sonFaxList.size() > 0){
+                                        sonFaxList.forEach(s->{
+                                            Map<String, Object> map = new HashMap<>();
+                                            TABLEFIELD_ENUM2.forEach((k,v)->{
+                                                map.put(v,UtilMap.getString(s,k));
+                                            });
+                                            faxList.add(map);
+                                        });
+                                    }
+                                }
+                            });
+                            log.info("oldList:{}",oldList.toString());
+                            log.info("faxList:{}",faxList.toString());
+                        }
+
+                        // ========== 修改点8:分别处理高低毛利率的审批 ==========
+
+                        // 处理高毛利率的审批 (mlv >= 0.15)
+                        if (!tabledataHigh.isEmpty()) {
+                            System.out.println("\n========== 开始处理分类汇总前高毛利率审批(>=15%),共 " + tabledataHigh.size() + " 条明细 ==========");
+                            List<Map<String, Object>> mapList = groupAndSum(tabledataHigh);
+                            System.out.println("\n========== 开始处理分类汇总后高毛利率审批(>=15%),共 " + mapList.size() + " 条明细 ==========");
+                            //组装数据塞到采购明细表
+                            formdataHigh.put("tableField_ml6g7k5d", mapList);
+
+                            //组装数据塞到采购审批单号明细
+                            List<Map<String, String>> orderSummaryListHigh = calculateOrderSummary(tabledataHigh);
+                            formdataHigh.put("tableField_ml7ch2pj", orderSummaryListHigh);
+                            formdataHigh.put("tableField_mmx6gata", oldList);
+                            formdataHigh.put("tableField_mnekj8oq", faxList);
+
+                            //数值统计毛利率
+                            int szHigh = 0;
+                            for (Map map : orderSummaryListHigh) {
+                                Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
+                                log.info((String) numberFieldMm2t71jo);
+                                szHigh += Integer.parseInt((String) numberFieldMm2t71jo);
+                            }
+                            formdataHigh.put("numberField_mm2t71jp", szHigh);
+
+                            /*发起流程 - 高毛利率审批*/
+                            String userId = getDDToken(purchaserName);
+                            ydClient.operateData(YDParam.builder()
+                                    .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                    .formUuid("FORM-6D814824193941BC9D4FD2A046E986E0R74Y")  // 高毛利率使用原表单
+                                    .userId(userId)
+                                    .formDataJson(JSON.toJSONString(formdataHigh))
+                                    .build(), YDConf.FORM_OPERATION.start).toString();
+
+                            /*修改采购订单为审批中*/
+                            for (Map map : orderSummaryListHigh) {
+                                String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
+                                callback(textFieldMl7ch2pk);
+                            }
+
+                            System.out.println("高毛利率审批流程发起完成");
+                        }
+
+                        // 处理低毛利率的审批 (mlv < 0.15)
+                        if (!tabledataLow.isEmpty()) {
+                            System.out.println("\n========== 开始处理分类汇总前低毛利率审批(<15%),共 " + tabledataLow.size() + " 条明细 ==========");
+                            List<Map<String, Object>> mapList = groupAndSum(tabledataLow);
+                            System.out.println("\n========== 开始处理分类汇总后低毛利率审批(<15%),共 " + mapList.size() + " 条明细 ==========");
+
+                            //组装数据塞到采购明细表
+                            formdataLow.put("tableField_ml6g7k5d", mapList);
+                            formdataLow.put("tableField_mmx6gata", oldList);
+                            formdataLow.put("tableField_mnekj8oq", faxList);
+
+                            //组装数据塞到采购审批单号明细
+                            List<Map<String, String>> orderSummaryListLow = calculateOrderSummary(tabledataLow);
+                            formdataLow.put("tableField_ml7ch2pj", orderSummaryListLow);
+
+                            //数值统计毛利率
+                            int szLow = 0;
+                            for (Map map : orderSummaryListLow) {
+                                Object numberFieldMm2t71jo = map.get("numberField_mm2t71jo");
+                                log.info((String) numberFieldMm2t71jo);
+                                szLow += Integer.parseInt((String) numberFieldMm2t71jo);
+                            }
+                            formdataLow.put("numberField_mm2t71jp", szLow);
+
+                            /*发起流程 - 低毛利率审批*/
+                            String userId = getDDToken(purchaserName);
+                            // ========== 修改点9:如果低毛利率需要不同表单,可以在这里修改formUuid ==========
+                            ydClient.operateData(YDParam.builder()
+                                    .appType(ydConf.getAppType()).systemToken(ydConf.getSystemToken())
+                                    .formUuid("FORM-6D814824193941BC9D4FD2A046E986E0R74Y")  // 如果需要不同流程,替换这里的UUID
+                                    .userId(userId)
+                                    .formDataJson(JSON.toJSONString(formdataLow))
+                                    .build(), YDConf.FORM_OPERATION.start).toString();
+
+                            /*修改采购订单为审批中*/
+                            for (Map map : orderSummaryListLow) {
+                                String textFieldMl7ch2pk = (String) map.get("textField_ml7ch2pk");
+                                callback(textFieldMl7ch2pk);
+                            }
+
+                            System.out.println("低毛利率审批流程发起完成");
+                        }
+
+                    });
+        }
+
+        return null;
+    }
+
     @SneakyThrows
     @Override
     public List<Map<String, Object>> queryAllPurchase() {
@@ -2069,12 +2553,13 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
         for (Map<String, Object> row : tableData) {
 //            String orderCode = row.get("textField_mm2t71jm"); // 采购订单号
             String orderCode = UtilMap.getString(row,"textField_mm2t71jm");
+            String orderFax = UtilMap.getString(row,"orderFax");
             if (orderCode == null || orderCode.isEmpty()) {
                 continue;
             }
 
             // 获取或创建该订单的汇总Map
-            Map<String, Double> orderSum = summaryMap.computeIfAbsent(orderCode,
+            Map<String, Double> orderSum = summaryMap.computeIfAbsent(orderCode+"~"+orderFax,
                     k -> {
                         Map<String, Double> newMap = new HashMap<>();
                         newMap.put("salesAmount", 0.0);      // 销售金额总和
@@ -2115,7 +2600,9 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
         List<Map<String, String>> result = new ArrayList<>();
 
         for (Map.Entry<String, Map<String, Double>> entry : summaryMap.entrySet()) {
-            String orderCode = entry.getKey();
+            String[] split = entry.getKey().split("~");
+            String orderCode = split[0];
+            Double orderFax = Double.parseDouble(split[1]);
             Map<String, Double> sums = entry.getValue();
 
             double salesAmount = sums.get("salesAmount");
@@ -2128,8 +2615,8 @@ public class HeiHuOrderServiceImpl implements HeiHuOrderService {
             summaryRow.put("numberField_ml862225", formatNumber(salesAmount));//salesAmount:销售总金额
             summaryRow.put("numberField_ml862226", formatNumber(purchaseAmount));//purchaseAmount:采购订单总金额
             summaryRow.put("numberField_ml862228", formatNumber(flygcb));//flygcb:辅料预估总成本
-            summaryRow.put("numberField_ml86222d",formatNumber((salesAmount - purchaseAmount - flygcb) / salesAmount));//毛利率
-            Double mlv = (salesAmount - purchaseAmount - flygcb) / salesAmount;
+            summaryRow.put("numberField_ml86222d",formatNumber((salesAmount - purchaseAmount/orderFax - flygcb) / salesAmount));//毛利率
+            Double mlv = (salesAmount - purchaseAmount/orderFax - flygcb) / salesAmount;
             if(mlv >= 0.15){
                 summaryRow.put("numberField_mm2t71jo", String.valueOf(1));
             }else {