You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<String, Object> amountReport = reportGenerator.generateReport(amountStrategy);
printReportSummary(amountReport);
// 测试2.2: 客户分析
System.out.println("\n[测试2.2] 客户分析");
Map<String, Object> customerReport = reportGenerator.generateReport(customerStrategy);
printReportSummary(customerReport);
// 测试2.3: 折扣分析
System.out.println("\n[测试2.3] 折扣分析");
Map<String, Object> discountReport = reportGenerator.generateReport(discountStrategy);
printReportSummary(discountReport);
// 测试2.4: 生成综合报表
System.out.println("\n[测试2.4] 生成综合报表");
List<OrderAnalysisStrategy> customStrategies = Arrays.asList(amountStrategy, customerStrategy);
Map<String, Object> 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<String, Object> updatedReport = reportGenerator.generateReport(amountStrategy);
System.out.println("总订单数: " + updatedReport.get("totalOrdersAnalyzed"));
System.out.println("总金额: " + ((Map<String, Object>)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<String, Object> report) {
System.out.println("报表名称: " + report.get("reportName"));
System.out.println("描述: " + report.get("description"));
System.out.println("分析订单数: " + report.get("totalOrdersAnalyzed"));
Map<String, Object> data = (Map<String, Object>) 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") + "%");
}
}
}