|
|
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") + "%");
|
|
|
}
|
|
|
}
|
|
|
} |