getOrderProjectList($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 getOrderProjectList($user, $cart_ids = []) { // 购物车列表 $projectList = []; // 获取购物车列表 $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 $projectList; } // 购物车中所有商品id集 $projectIds = array_unique(helper::getArrayColumn($cartList, 'project_id')); // 获取并格式化商品数据 $sourceData = (new ProjectModel)->getListByIds($projectIds); $sourceData = helper::arrayColumn2Key($sourceData, 'project_id'); // 供应商信息 $supplierData = []; // 格式化购物车数据列表 foreach ($cartList as $key => $item) { // 判断商品不存在则自动删除 if (!isset($sourceData[$item['project_id']])) { $this->delete($key); continue; } // 项目信息 $project = clone $sourceData[$item['project_id']]; // 判断商品是否已删除 if (empty($project)) { $this->delete($key); continue; } // 购买数量 $project['total_num'] = $item['total_num']; // 总价 $project['total_price'] = bcmul($project['price'], $item['total_num'], 2); // 总佣金 $project['total_money'] = bcmul($project['money'], $item['total_num'], 2); // 供应商 $project['shop_supplier_id'] = $item['shop_supplier_id']; //购物车id $project['cart_id'] = $item['cart_id']; $projectList[] = $project; } $supplierIds = array_unique(helper::getArrayColumn($projectList, 'shop_supplier_id')); foreach($supplierIds as $supplierId){ $supplierData[] = [ 'shop_supplier_id' => $supplierId, 'supplier' => SupplierModel::detail($supplierId), 'projectList' => $this->getProjectBySupplier($supplierId, $projectList) ]; } return $supplierData; } private function getProjectBySupplier($supplierId, $projectList) { $result = []; foreach ($projectList as $project){ if($project['shop_supplier_id'] == $supplierId){ array_push($result, $project); } } return $result; } /** * 加入购物车 */ public function add($user, $projectId, $projectNum) { $model = $this; // 获取信息 $project = ProjectModel::detail($projectId); // 获取商品购物车信息 $cartDetail = $model->where('user_id', '=', $user['user_id']) ->where('project_id', '=', $projectId) ->find(); // 验证能否加入 if (!$project_price = $this->checkProject($project)) { return false; } // 记录到购物车列表 if ($cartDetail) { return $cartDetail->save(['total_num' => $cartDetail['total_num'] + $projectNum]); } else { return $this->save([ 'user_id' => $user['user_id'], 'project_id' => $projectId, 'total_num' => $projectNum, 'join_price' => $project_price, 'shop_supplier_id' => $project['shop_supplier_id'], 'app_id' => self::$app_id, ]); } } /** * 验证是否可以下单 */ private function checkProject($project) { // 判断项目 if (!$project) { $this->setError('很抱歉,信息不存在'); return false; } return $project['price']; } /** * 减少购物车中某商品数量 */ public function sub($user, $projectId) { $cartDetail = $this->where('user_id', '=', $user['user_id']) ->where('project_id', '=', $projectId) ->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(); } /** * 设置错误信息 */ private function setError($error) { empty($this->error) && $this->error = $error; } /** * 获取错误信息 */ public function getError() { return $this->error; } }