import java.util.Arrays; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { System.out.println("========= 订单处理系统高级版测试 =========\n"); // 创建基础依赖对象 Logger logger = new ConsoleLogger(); OrderValidator orderValidator = new OrderValidator(); OrderNotifier orderNotifier = new OrderNotifier(); // 创建订单仓库 OrderRepository orderRepository = new InMemoryOrderRepository(); // 创建折扣策略 DiscountStrategy percentageDiscount = new PercentageDiscountStrategy(0.1); // 10%折扣 DiscountStrategy fixedDiscount = new FixedAmountDiscountStrategy(50, 200); // 满200减50 // ========= 1. 测试多级审批工作流 ========= System.out.println("\n========================================"); System.out.println("1. 测试多级审批工作流系统"); System.out.println("========================================"); // 创建审批链 ApprovalChain approvalChain = new ApprovalChain(logger); // 创建不同级别的审批者 Approver manager = new ManagerApprover("张经理", logger); Approver director = new DirectorApprover("李总监", logger); Approver vp = new VPApprover("王副总裁", logger); Approver ceo = new CEOApprover("陈CEO", logger); // 添加审批者到审批链 approvalChain.addApprover(manager); approvalChain.addApprover(director); approvalChain.addApprover(vp); approvalChain.addApprover(ceo); // 创建支持审批工作流的订单处理器 OrderProcessor workflowProcessor = new OrderProcessor( orderValidator, orderNotifier, logger, percentageDiscount, approvalChain, orderRepository); // 测试1.1: 经理级别审批(小额订单) System.out.println("\n[测试1.1] 经理级别审批(小额订单)"); Order smallOrder = new Order("ORD-APP-001", 3000.0, "张三"); workflowProcessor.processOrder(smallOrder); System.out.println("订单最终状态: " + smallOrder.getApprovalStatus()); // 测试1.2: 总监级别审批(中额订单) System.out.println("\n[测试1.2] 总监级别审批(中额订单)"); Order mediumOrder = new Order("ORD-APP-002", 8000.0, "李四"); workflowProcessor.processOrder(mediumOrder); System.out.println("订单最终状态: " + mediumOrder.getApprovalStatus()); // 测试1.3: VP级别审批(大额订单) System.out.println("\n[测试1.3] VP级别审批(大额订单)"); Order largeOrder = new Order("ORD-APP-003", 30000.0, "王五"); workflowProcessor.processOrder(largeOrder); System.out.println("订单最终状态: " + largeOrder.getApprovalStatus()); // 测试1.4: CEO级别审批(特大额订单) System.out.println("\n[测试1.4] CEO级别审批(特大额订单)- 此测试将失败,因为审批链不完整"); Order hugeOrder = new Order("ORD-APP-004", 60000.0, "赵六"); // 注意:这个测试会失败,因为需要完整的审批链 workflowProcessor.processOrder(hugeOrder); System.out.println("订单最终状态: " + hugeOrder.getApprovalStatus()); System.out.println("拒绝原因: " + hugeOrder.getRejectionReason()); // ========= 2. 测试订单数据分析模块 ========= System.out.println("\n========================================"); System.out.println("2. 测试订单数据分析模块"); System.out.println("========================================"); // 先添加更多订单用于分析 addMoreOrdersForAnalysis(orderRepository, logger, percentageDiscount); // 创建订单报表生成器 OrderReportGenerator reportGenerator = new OrderReportGenerator(logger, orderRepository); // 添加不同的分析策略 OrderAnalysisStrategy amountStrategy = new AmountAnalysisStrategy(); OrderAnalysisStrategy customerStrategy = new CustomerAnalysisStrategy(); OrderAnalysisStrategy discountStrategy = new DiscountAnalysisStrategy(); reportGenerator.addAnalysisStrategy(amountStrategy); reportGenerator.addAnalysisStrategy(customerStrategy); reportGenerator.addAnalysisStrategy(discountStrategy); // 测试2.1: 金额统计分析 System.out.println("\n[测试2.1] 金额统计分析"); Map amountReport = reportGenerator.generateReport(amountStrategy); printReportSummary(amountReport); // 测试2.2: 客户分析 System.out.println("\n[测试2.2] 客户分析"); Map customerReport = reportGenerator.generateReport(customerStrategy); printReportSummary(customerReport); // 测试2.3: 折扣分析 System.out.println("\n[测试2.3] 折扣分析"); Map discountReport = reportGenerator.generateReport(discountStrategy); printReportSummary(discountReport); // 测试2.4: 生成综合报表 System.out.println("\n[测试2.4] 生成综合报表"); List customStrategies = Arrays.asList(amountStrategy, customerStrategy); Map customReport = reportGenerator.generateCustomReport(customStrategies); System.out.println("综合报表名称: " + customReport.get("reportName")); System.out.println("使用的策略数量: " + customReport.get("strategiesUsed")); // ========= 3. 展示完整的系统集成 ========= System.out.println("\n========================================"); System.out.println("3. 展示完整的系统集成"); System.out.println("========================================"); // 创建一个新的复杂订单 Order complexOrder = new Order("ORD-COMPLEX-001", 15000.0, "周七"); complexOrder.setCustomerName("VIP客户-周七"); System.out.println("处理复杂订单前:"); System.out.println(complexOrder); // 使用完整的系统处理订单 workflowProcessor.processOrder(complexOrder); System.out.println("\n处理复杂订单后:"); System.out.println(complexOrder); // 再次生成报表查看变化 System.out.println("\n更新后的金额统计:"); Map updatedReport = reportGenerator.generateReport(amountStrategy); System.out.println("总订单数: " + updatedReport.get("totalOrdersAnalyzed")); System.out.println("总金额: " + ((Map)updatedReport.get("data")).get("totalAmount")); System.out.println("\n========================================"); System.out.println("测试完成!"); System.out.println("========================================"); } // 辅助方法:添加更多订单用于分析 private static void addMoreOrdersForAnalysis(OrderRepository repository, Logger logger, DiscountStrategy discountStrategy) { logger.info("添加更多订单用于数据分析..."); // 创建不同金额和客户的订单 Order order1 = new Order("ORD-ANALYSIS-001", 1000.0, "陈八"); applyDiscount(order1, discountStrategy); Order order2 = new Order("ORD-ANALYSIS-002", 2500.0, "吴九"); applyDiscount(order2, discountStrategy); Order order3 = new Order("ORD-ANALYSIS-003", 5000.0, "郑十"); applyDiscount(order3, discountStrategy); Order order4 = new Order("ORD-ANALYSIS-004", 7500.0, "陈八"); // 重复客户 applyDiscount(order4, discountStrategy); Order order5 = new Order("ORD-ANALYSIS-005", 12000.0, "王十一"); applyDiscount(order5, discountStrategy); // 添加到仓库 repository.addOrder(order1); repository.addOrder(order2); repository.addOrder(order3); repository.addOrder(order4); repository.addOrder(order5); logger.info("已添加5个订单用于分析,当前仓库订单总数: " + repository.getOrderCount()); } // 辅助方法:应用折扣 private static void applyDiscount(Order order, DiscountStrategy strategy) { if (strategy != null) { double discount = strategy.calculateDiscount(order); order.setDiscountAmount(discount); order.setDiscountDescription(strategy.getDescription()); } order.setProcessed(true); } // 辅助方法:打印报表摘要 private static void printReportSummary(Map report) { System.out.println("报表名称: " + report.get("reportName")); System.out.println("描述: " + report.get("description")); System.out.println("分析订单数: " + report.get("totalOrdersAnalyzed")); Map data = (Map) report.get("data"); // 根据不同报表类型打印关键信息 if (report.get("reportName").equals("金额统计分析")) { System.out.println("总金额: " + data.get("totalAmount")); System.out.println("平均金额: " + data.get("averageAmount")); System.out.println("总折扣: " + data.get("totalDiscount")); } else if (report.get("reportName").equals("客户分析")) { System.out.println("独立客户数: " + data.get("uniqueCustomers")); System.out.println("最活跃客户: " + data.get("mostActiveCustomer")); System.out.println("消费最多客户: " + data.get("topSpendingCustomer")); } else if (report.get("reportName").equals("折扣分析")) { System.out.println("使用折扣订单数: " + data.get("ordersWithDiscount")); System.out.println("折扣使用率: " + data.get("percentageWithDiscount") + "%"); System.out.println("总体折扣率: " + data.get("overallDiscountPercentage") + "%"); } } }