OrderService 采用了统一数据流的设计理念,无论订单数据来源于购物车还是商品规格,最终都会转换为标准化的 goods_list
格式进行处理。这种设计确保了核心业务逻辑的统一性和代码的可维护性。
输入层 数据转换层 核心处理层 输出层
┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐
│购物车ID │ ──► │ 转换为 │ ──► │ │ ──► │ │
│cart_ids │ │ goods_list │ │ 统一计算/ │ │ 订单 │
└─────────┘ └─────────────┘ │ 创建方法 │ │ 结果 │
│ │ │ │
┌─────────┐ ┌─────────────┐ │ calculate │ └─────────┘
│商品规格 │ ──► │ 验证格式 │ ──► │ Order() │
│goods_list│ │ 直接使用 │ │ │
└─────────┘ └─────────────┘ │ createOrder │
│ () │
└─────────────┘
goods_list
,计算订单明细goods_list
,创建订单goods_list
public static function calculateOrderByGoods($goods_list, $user_id, $area_id, $user_coupon_id)
{
return self::calculateOrder($goods_list, $user_id, $area_id, $user_coupon_id);
}
public static function calculateOrderByCart($cart_ids, $user_id, $area_id, $user_coupon_id)
{
$goods_list = self::convertCartToGoodsList($cart_ids, $user_id);
return self::calculateOrder($goods_list, $user_id, $area_id, $user_coupon_id);
}
public static function createOrderByGoods($address_id, $user_id, $goods_list, $user_coupon_id, $memo)
{
return self::createOrder($address_id, $user_id, $goods_list, $user_coupon_id, $memo);
}
public static function createOrderByCart($address_id, $user_id, $cart_ids, $user_coupon_id, $memo)
{
$goods_list = self::convertCartToGoodsList($cart_ids, $user_id);
return self::createOrder($address_id, $user_id, $goods_list, $user_coupon_id, $memo, $cart_ids);
}
$goods_list = [
[
'goods_id' => 1, // 商品ID(必填)
'goods_sku_id' => 5, // 商品规格ID(可选,系统会自动补充默认SKU)
'nums' => 2 // 购买数量(必填)
],
[
'goods_id' => 2,
'goods_sku_id' => 0, // 可以传0或不传,系统会自动查询默认SKU
'nums' => 1
]
];
在FastAdmin商城系统中,所有商品(包括单规格商品)都会在SKU表中生成记录:
spec_value_ids
为空,is_default=1
is_default=1
系统处理逻辑:
goods_sku_id > 0
,直接使用指定的SKUgoods_sku_id = 0
或不传,系统自动查询该商品的默认SKU这种设计确保了:
// 原始购物车数据
$cartItems = [
['id' => 1, 'goods_id' => 1, 'goods_sku_id' => 5, 'nums' => 2],
['id' => 2, 'goods_id' => 2, 'goods_sku_id' => 0, 'nums' => 1]
];
// 转换后的 goods_list
$goods_list = [
['goods_id' => 1, 'goods_sku_id' => 5, 'nums' => 2],
['goods_id' => 2, 'goods_sku_id' => 0, 'nums' => 1]
];
优化前(循环查询):
foreach ($goods_list as $item) {
// 每次循环都要查询数据库
$goods = Goods::where('id', $goods_id)->find(); // N次查询
$sku = Sku::where('id', $sku_id)->find(); // N次查询
$sku_attr = Db::name('shop_goods_sku_spec')... // N次查询
}
// 总计: 3N 次数据库查询
优化后(批量查询):
// 批量查询所有商品
$goodsData = Goods::where('id', 'in', $goods_ids)->select(); // 1次查询
// 批量查询指定的SKU
$skuData = Sku::where('id', 'in', $sku_ids)->select(); // 1次查询
// 批量查询没有指定SKU的商品的默认SKU
$defaultSkuData = Sku::where('goods_id', 'in', $goods_without_sku)
->where('is_default', 1)->select(); // 1次查询
// 批量查询所有规格属性
$skuAttrData = Db::name('shop_goods_sku_spec')... // 1次查询
foreach ($goods_list as $item) {
// 直接从内存中获取数据,无需查询数据库
$goods = $goodsData[$goods_id];
$sku = $skuData[$sku_id]; // 统一使用SKU数据
}
// 总计: 最多4次数据库查询(固定)
性能提升:
// 购物车计算
$cartResult = OrderService::calculateOrderByCart($cart_ids, $user_id, $area_id, $coupon_id);
// 商品规格计算
$goodsResult = OrderService::calculateOrderByGoods($goods_list, $user_id, $area_id, $coupon_id);
// 两套不同的内部实现逻辑
// 购物车模式:先转换,再统一计算
$goods_list = OrderService::convertCartToGoodsList($cart_ids, $user_id);
$result = OrderService::calculateOrder($goods_list, $user_id, $area_id, $coupon_id);
// 商品规格模式:直接统一计算
$result = OrderService::calculateOrder($goods_list, $user_id, $area_id, $coupon_id);
// 同一套核心实现逻辑
public function calculate()
{
// 根据类型获取标准化的商品列表
if ($type === 'cart') {
$cart_ids = $this->request->post('cart_ids');
$goods_list = OrderService::convertCartToGoodsList($cart_ids, $this->auth->id);
} else {
$goods_list = $this->request->post('goods_list/a');
}
// 统一调用计算方法
$result = OrderService::calculateOrder($goods_list, $this->auth->id, $area_id, $user_coupon_id);
}
convertFavoritesToGoodsList()
convertRecommendToGoodsList()
convertPackageToGoodsList()
calculateOrder()
支持预约模式这种统一的架构设计通过数据标准化 + 核心逻辑统一的方式,实现了:
这种设计模式体现了软件工程中的单一职责原则和开闭原则,是一个优秀的架构设计实践。