diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java index 852f12e..c9a7124 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java @@ -242,15 +242,15 @@ public class InstructionServiceImpl implements IInstructionService { List outputs = new ArrayList<>(); List>> dmEntries = new ArrayList<>(byDM.entrySet()); dmEntries.sort(Comparator.comparing(en -> en.getKey() == null ? "" : en.getKey())); - - + + // 全局型号数量和金额统计 Map globalModelCounts = new HashMap<>(); Map globalPaymentAmounts = new HashMap<>(); Map globalRebateAmounts = new HashMap<>(); // 记录每个型号的最高单价订单 Map globalMaxPriceOrders = new HashMap<>(); - + for (Map.Entry> e : dmEntries) { String dm = e.getKey() != null ? e.getKey() : "未提供"; List orders = e.getValue(); @@ -258,7 +258,7 @@ public class InstructionServiceImpl implements IInstructionService { Map byModel = orders.stream().collect(Collectors.groupingBy(JDOrder::getModelNumber, Collectors.counting())); Map modelPaymentAmounts = orders.stream().collect(Collectors.groupingBy(JDOrder::getModelNumber, Collectors.summingDouble(o -> o.getPaymentAmount() != null ? o.getPaymentAmount() : 0.0))); Map modelRebateAmounts = orders.stream().collect(Collectors.groupingBy(JDOrder::getModelNumber, Collectors.summingDouble(o -> o.getRebateAmount() != null ? o.getRebateAmount() : 0.0))); - + int totalCount = 0; StringBuilder summary = new StringBuilder(); List> modelEntries = new ArrayList<>(byModel.entrySet()); @@ -267,22 +267,22 @@ public class InstructionServiceImpl implements IInstructionService { int c = em.getValue().intValue(); totalCount += c; String model = em.getKey() != null ? em.getKey() : "未知"; - + summary.append("型号:").append(model).append(" 数量:").append(c).append("\n"); - + // 累积到全局统计 globalModelCounts.put(model, globalModelCounts.getOrDefault(model, 0) + c); Double paymentAmount = modelPaymentAmounts.get(model); Double rebateAmount = modelRebateAmounts.get(model); globalPaymentAmounts.put(model, globalPaymentAmounts.getOrDefault(model, 0.0) + (paymentAmount != null ? paymentAmount : 0.0)); globalRebateAmounts.put(model, globalRebateAmounts.getOrDefault(model, 0.0) + (rebateAmount != null ? rebateAmount : 0.0)); - + // 找到该型号价格最高的订单 for (JDOrder order : orders) { if (model.equals(order.getModelNumber())) { JDOrder currentMax = globalMaxPriceOrders.get(model); - if (currentMax == null || - (order.getPaymentAmount() != null && + if (currentMax == null || + (order.getPaymentAmount() != null && (currentMax.getPaymentAmount() == null || order.getPaymentAmount() > currentMax.getPaymentAmount()))) { globalMaxPriceOrders.put(model, order); } @@ -304,47 +304,47 @@ public class InstructionServiceImpl implements IInstructionService { infoSingle.append("分销标记:").append(dm).append("\n").append(summary).append(detail).append("\n"); outputs.add(infoSingle.toString().trim()); } - + // 添加算钱文本(全局统计版本) if (!globalModelCounts.isEmpty()) { StringBuilder priceText = new StringBuilder(); - + // 先输出型号和数量 List> sortedEntries = globalModelCounts.entrySet().stream() .sorted(Comparator.comparing(Map.Entry::getKey)) .collect(Collectors.toList()); - + for (Map.Entry entry : sortedEntries) { String model = entry.getKey(); int count = entry.getValue(); priceText.append("型号:").append(model).append(" 数量:").append(count).append("\n"); } - + priceText.append("\n"); - + // 输出金额计算(单台价格-返现+佣金=净价×数量=总价) double grandTotal = 0.0; StringBuilder calculationLines = new StringBuilder(); List totalPricesList = new ArrayList<>(); - + for (Map.Entry entry : sortedEntries) { String model = entry.getKey(); int count = entry.getValue(); - + // 获取该型号最高价格的订单 JDOrder maxPriceOrder = globalMaxPriceOrders.get(model); double singlePayment = 0.0; double singleRebate = 0.0; - + if (maxPriceOrder != null) { singlePayment = maxPriceOrder.getPaymentAmount() != null ? maxPriceOrder.getPaymentAmount() : 0.0; singleRebate = maxPriceOrder.getRebateAmount() != null ? maxPriceOrder.getRebateAmount() : 0.0; } - + // 四舍五入到2位小数 singlePayment = Math.round(singlePayment * 100.0) / 100.0; singleRebate = Math.round(singleRebate * 100.0) / 100.0; - + // 从Redis获取佣金 double commission = 0.0; try { @@ -355,32 +355,32 @@ public class InstructionServiceImpl implements IInstructionService { } catch (Exception e) { // 如果获取失败,佣金为0 } - + // 计算净价(单台价格 - 返现 + 佣金) double netPrice = singlePayment - singleRebate + commission; // 四舍五入到2位小数 netPrice = Math.round(netPrice * 100.0) / 100.0; - + // 计算总价 double totalPrice = netPrice * count; // 四舍五入到2位小数 totalPrice = Math.round(totalPrice * 100.0) / 100.0; totalPricesList.add(totalPrice); grandTotal += totalPrice; - + // 格式:单台价格-返现+佣金=净价×数量=总价 if (count == 1) { // 数量为1时,不显示×1 - calculationLines.append(String.format("%.2f-%.2f+%.2f=%.2f\n", + calculationLines.append(String.format("%.2f-%.2f+%.2f=%.2f\n", singlePayment, singleRebate, commission, totalPrice)); } else { - calculationLines.append(String.format("%.2f-%.2f+%.2f=%.2f×%d=%.2f\n", + calculationLines.append(String.format("%.2f-%.2f+%.2f=%.2f×%d=%.2f\n", singlePayment, singleRebate, commission, netPrice, count, totalPrice)); } } - + priceText.append(calculationLines); - + // 输出汇总(各型号总价相加) if (sortedEntries.size() > 1) { priceText.append("\n"); @@ -395,10 +395,10 @@ public class InstructionServiceImpl implements IInstructionService { grandTotal = Math.round(grandTotal * 100.0) / 100.0; priceText.append(String.format("=%.2f", grandTotal)); } - + outputs.add(priceText.toString().trim()); } - + return outputs.isEmpty() ? Collections.singletonList("无数据") : outputs; } if (input.startsWith("单")) { @@ -646,7 +646,7 @@ public class InstructionServiceImpl implements IInstructionService { if (isEmpty(order.getAddress())) missing.append("收货地址\n"); if (isEmpty(order.getModelNumber())) missing.append("型号\n"); if (missing.length() > 0) { - String warn = "录单警告!!! \n缺少表单字段 \n" + missing; + String warn = "[炸弹] [炸弹] [炸弹] 录单警告!!! \n缺少表单字段 \n" + missing; return warn; }