getOrderProductList($user, $cart_ids); } /** * 获取购物车列表 */ public function getCartList($cartIds = null) { if (empty($cartIds)) return static::$cart; $cartList = []; $indexArr = (strpos($cartIds, ',') !== false) ? explode(',', $cartIds) : [$cartIds]; foreach ($indexArr as $index) { isset(static::$cart[$index]) && $cartList[$index] = static::$cart[$index]; } return $cartList; } /** * 获取购物车中的商品列表 */ public function getOrderProductList($user, $cart_ids = []) { // 购物车商品列表 $productList = []; // 获取购物车列表 $model = $this; if ($cart_ids) { $model = $model->where('cart_id', 'in', explode(',', $cart_ids)); } $cartList = $model->where('user_id', '=', $user['user_id'])->select(); if (empty($cartList)) { $this->setError('当前购物车没有商品'); return $productList; } // 购物车中所有商品id集 $productIds = array_unique(helper::getArrayColumn($cartList, 'product_id')); // 获取并格式化商品数据 $sourceData = (new ProductModel)->getListByIds($productIds, null); $sourceData = helper::arrayColumn2Key($sourceData, 'product_id'); // 供应商信息 $supplierData = []; // 格式化购物车数据列表 foreach ($cartList as $key => $item) { // 判断商品不存在则自动删除 if (!isset($sourceData[$item['product_id']])) { $this->delete($key); continue; } // 商品信息 $product = clone $sourceData[$item['product_id']]; // 判断商品是否已删除 if ($product['is_delete']) { $this->delete($key); continue; } // 商品sku信息 $product['product_sku'] = ProductModel::getProductSku($product, $item['spec_sku_id']); $product['spec_sku_id'] = $item['spec_sku_id']; // 商品sku不存在则自动删除 if (empty($product['product_sku'])) { $this->delete($key); continue; } // 商品单价 $product['product_price'] = $product['product_sku']['product_price']; // 购买数量 $product['total_num'] = $item['total_num']; // 商品总价 $product['total_price'] = bcmul($product['product_price'], $item['total_num'], 2); // 商品总结算价 $product['total_settlement_price'] = bcmul($product['settlement_price'], $item['total_num'], 2); // 供应商 $product['shop_supplier_id'] = $item['shop_supplier_id']; $product['supplier_price'] = bcmul($product['supplier_price'], $item['total_num'], 2); //购物车id $product['cart_id'] = $item['cart_id']; $productList[] = $product->hidden(['category', 'content', 'image']); } $supplierIds = array_unique(helper::getArrayColumn($productList, 'shop_supplier_id')); foreach($supplierIds as $supplierId){ $supplierData[] = [ 'shop_supplier_id' => $supplierId, 'supplier' => SupplierModel::detail($supplierId), 'productList' => $this->getProductBySupplier($supplierId, $productList) ]; } return $supplierData; } private function getProductBySupplier($supplierId, $productList) { $result = []; foreach ($productList as $product){ if($product['shop_supplier_id'] == $supplierId){ array_push($result, $product); } } return $result; } /** * 加入购物车 */ public function add($user, $productId, $productNum, $spec_sku_id) { // 获取商品购物车信息 $cartDetail = $this->where('user_id', '=', $user['user_id']) ->where('product_id', '=', $productId) ->where('spec_sku_id', '=', $spec_sku_id) ->find(); $cartProductNum = $cartDetail ? $cartDetail['total_num'] + $productNum : $productNum; // 获取商品信息 $product = ProductModel::detail($productId); // 验证商品能否加入 if (!$product_price = $this->checkProduct($user, $product, $spec_sku_id, $cartProductNum)) { return false; } // 记录到购物车列表 if ($cartDetail) { return $cartDetail->save(['total_num' => $cartDetail['total_num'] + $productNum]); } else { return $this->save([ 'user_id' => $user['user_id'], 'product_id' => $productId, 'spec_sku_id' => $spec_sku_id, 'total_num' => $productNum, 'join_price' => $product_price, 'shop_supplier_id' => $product['shop_supplier_id'], 'app_id' => self::$app_id, ]); } } /** * 验证商品是否可以购买 */ private function checkProduct($user, $product, $spec_sku_id, $cartProductNum) { // 判断商品是否下架 if (!$product || $product['is_delete'] || $product['product_status']['value'] != 10) { $this->setError('很抱歉,商品信息不存在或已下架'); return false; } // 商品sku信息 $product['product_sku'] = ProductModel::getProductSku($product, $spec_sku_id); // 判断商品库存 if ($cartProductNum > $product['product_sku']['stock_num']) { $this->setError('很抱歉,商品库存不足'); return false; } // 是否是会员商品 if (count($product['grade_ids']) > 0 && $product['grade_ids'][0] != '') { if (!in_array($user['grade_id'], $product['grade_ids'])) { $this->setError('很抱歉,此商品仅特定会员可购买'); return false; } } // 是否超过最大购买数 if ($product['limit_num'] > 0) { $hasNum = OrderModel::getHasBuyOrderNum($user['user_id'], $product['product_id']); if ($hasNum + $product['total_num'] > $product['limit_num']) { $this->error = "很抱歉,购买超过此商品最大限购数量"; return false; } } return $product['product_sku']['product_price']; } /** * 减少购物车中某商品数量 */ public function sub($user, $productId, $spec_sku_id) { $cartDetail = $this->where('user_id', '=', $user['user_id']) ->where('product_id', '=', $productId) ->where('spec_sku_id', '=', $spec_sku_id) ->find(); if ($cartDetail['total_num'] <= 1) { return $cartDetail->delete(); } else { $cartDetail->save(['total_num' => $cartDetail['total_num'] - 1]); } } /** * 删除购物车中指定商品 * @param string $cartIds (支持字符串ID集) */ public function setDelete($user, $cart_id) { return $this->where('user_id', '=', $user['user_id'])->where('cart_id', 'in', explode(',', $cart_id))->delete(); } /** * 获取当前用户购物车商品总数量(含件数) */ public function getTotalNum($user) { $num = $this->where('user_id', '=', $user['user_id'])->sum('total_num'); return $num ? $num : 0; } /** * 获取当前用户购物车商品总数量(不含件数) */ public function getProductNum($user) { return $this->where('user_id', '=', $user['user_id'])->count(); } /** * 清空当前用户购物车 */ public function clearAll($user, $cartIds) { return $this->where('user_id', '=', $user['user_id']) ->where('cart_id', 'in', explode(',', $cartIds)) ->delete(); } public function getCartCount($user_id, $product_id) { $cart=$this->where('user_id',$user_id)->where('product_id',$product_id)->find(); $total_num=$this->where('user_id',$user_id)->where('product_id',$product_id)->sum('total_num'); $cart['total_num']=$total_num; return $cart; } /** * 设置错误信息 */ private function setError($error) { empty($this->error) && $this->error = $error; } /** * 获取错误信息 */ public function getError() { return $this->error; } }