1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
from dataclasses import dataclass
from typing import Optional
from decimal import Decimal
@dataclass
class OrderResult:
"""订单操作的统一结果。"""
success: bool
order_id: Optional[str] = None
reason: Optional[str] = None
transaction_id: Optional[str] = None
tracking_number: Optional[str] = None
total_amount: Optional[Decimal] = None
class OrderFacade:
"""
简化企业订单处理子系统编排的外观。
"""
def __init__(self, inventory=None, payments=None,
shipping=None, notifications=None):
# 依赖注入以提高灵活性
self.inventory = inventory or InventoryService()
self.payments = payments or PaymentGateway()
self.shipping = shipping or ShippingService()
self.notifications = notifications or NotificationService()
def place_order(self, customer_id: str, sku: str, qty: int,
payment_info: dict, unit_price: float) -> OrderResult:
"""
✨ 一个单一方法处理完整订单。
外观在内部编排所有子系统。
"""
order_id = str(uuid.uuid4())
try:
# 🔍 步骤1:验证并预留库存
if not self._reserve_inventory(sku, qty):
return OrderResult(False, order_id, "库存不足")
# 💳 步骤2:处理支付
total_amount = Decimal(str(qty * unit_price))
payment_result = self._process_payment(payment_info, total_amount)
if not payment_result.success:
self._rollback_inventory(sku, qty)
return OrderResult(False, order_id, f"支付失败: {payment_result.message}")
# 🚚 步骤3:安排配送
shipping_result = self._create_shipment(customer_id, sku, qty)
if not shipping_result.success:
self._rollback_inventory(sku, qty)
return OrderResult(False, order_id, f"配送错误: {shipping_result.message}",
transaction_id=payment_result.transaction_id)
# 📧 步骤4:通知客户
self._notify_customer(customer_id, order_id, payment_result.transaction_id,
shipping_result.tracking_number)
# ✅ 成功:返回完整结果
return OrderResult(
success=True,
order_id=order_id,
transaction_id=payment_result.transaction_id,
tracking_number=shipping_result.tracking_number,
total_amount=total_amount
)
except Exception as e:
# 🛡️ 集中错误处理
self._handle_unexpected_error(sku, qty, order_id, str(e))
return OrderResult(False, order_id, f"内部错误: {str(e)}")
def _reserve_inventory(self, sku: str, qty: int) -> bool:
"""封装库存预留逻辑。"""
return (self.inventory.check_stock(sku, qty) and
self.inventory.reserve(sku, qty))
def _process_payment(self, payment_info: dict, amount: Decimal):
"""封装支付处理。"""
return self.payments.charge(payment_info, float(amount))
def _create_shipment(self, customer_id: str, sku: str, qty: int):
"""封装配送创建。"""
return self.shipping.create_shipment(
customer_id,
[{"sku": sku, "qty": qty}]
)
def _notify_customer(self, customer_id: str, order_id: str,
transaction_id: str, tracking_number: str):
"""封装客户通知。"""
self.notifications.send_order_notification(
customer_id,
"order_confirmed",
{
"order_id": order_id,
"transaction_id": transaction_id,
"tracking_number": tracking_number
}
)
def _rollback_inventory(self, sku: str, qty: int):
"""集中库存回滚处理。"""
self.inventory.release(sku, qty)
def _handle_unexpected_error(self, sku: str, qty: int, order_id: str, error: str):
"""集中意外错误处理。"""
try:
self._rollback_inventory(sku, qty)
except:
pass # 记录错误但不要失败两次
# 记录错误用于监控
print(f"严重错误 - 订单 {order_id}: {error}")
|