leftJoin('goods as g','g.id','=','p.goods_id') ->where($where) ->select(['p.id as shopping_id','p.number','p.goods_spec_id','g.id as goods_id','g.shop_id','g.goods_name','g.goods_image','g.price','g.spec_type','g.category_id','g.pack_price']) ->orderBy('p.id','asc') ->get(); $total_num = 0;//总商品数 $total_goods_money = '0.00';//总商品费用 $total_pack_price = 0;//打包费 $goods_list = [];//商品列表 foreach ($shopping as $value){ $goods_id = $value->{'goods_id'};//商品id $goods_price = $value->{'price'};//商品金额 $goods_spec_price = 0;//商品规格金额 $spec_type = $value->{'spec_type'};//商品类型 $status_str = ''; $goods_attr = "";//规则值 $goods_number = $value['number'];//商品数量 $goods_spec_list = [];//商品所选规格信息 if ($spec_type == 2){//存在规格 $details = ShoppingDetail::from('shopping_details as d') ->leftJoin('goods_spec as s','s.id','=','d.goods_spec_id') ->where('d.shopping_id',$value->{'shopping_id'}) ->where('d.goods_id',$value->{'goods_id'}) ->where('s.is_del',0) ->select(['d.id','d.goods_id','d.goods_spec_id','d.number','s.spec_name','s.spec_price']) ->get(); foreach ($details as $detail){ if ($detail->{'number'} > 1){ $goods_attr .= $detail['spec_name'].'x'.$detail->{'number'} . ','; }else{ $goods_attr .= $detail['spec_name'] . ','; } $goods_spec_price = bcadd($goods_spec_price,bcmul($detail['number'],$detail['spec_price'],2),2);//规格数量乘以价格等于 规格总价 } $goods_spec_list = $details; } //计算价格 $goods_money = bcmul($goods_number,bcadd($goods_price,$goods_spec_price,2),2);//商品价格等于 商品数量X(商品底价+商品规格总价) $goods_list[] = [ 'shop_id' => $value['shop_id'], 'category_id' => $value['category_id'], 'goods_id' => $goods_id, 'goods_money' => rtrim(rtrim($goods_money, '0'),'.'), 'goods_number' => $goods_number, 'goods_name' => $value['goods_name'], 'goods_image' => $value['goods_image'], 'spec_type' => $value['spec_type'], 'price' => $goods_price, 'pack_price' => $value['pack_price'], 'goods_spec_id' => $value['goods_spec_id'], 'goods_attr' => trim($goods_attr,','), 'status_str' => $status_str, 'spec_list' => $goods_spec_list, ]; //计算打包费 $total_pack_price = bcadd($total_pack_price,bcmul($goods_number,$value['pack_price'],2),2); //计算总数量 $total_num += $goods_number; //计算总商品费用 $total_goods_money = bcadd($total_goods_money,$goods_money,2); } //订单总价-商品总价+总包装费 $total_price = bcadd($total_goods_money,$total_pack_price,2); $data['total_price'] = rtrim(rtrim($total_price, '0'),'.'); $data['total_num'] = (int)$total_num; $data['total_goods_money'] = rtrim(rtrim($total_goods_money, '0'),'.'); $data['pack_price'] = $total_pack_price; $data['err_msg'] = $this->errorMsg; $data['goods_list'] = $goods_list; $this->errorMsg = ''; return $data; } function saveShopping($m_id,$shop_id,$category_id,$goods_id,$goods_spec_id,$goods_spec,$number) { if (empty($goods_spec)){ $goods_spec = []; } $goods_spec_ids = []; $goods_spec_data = []; //获取商品 $goods = Goods::where('is_del',0) ->where('id',$goods_id) ->where('shop_id',$shop_id) ->where('category_id',$category_id) ->select(['id as goods_id','status','spec_type']) ->first(); if (empty($goods)) return ['code' => 0, 'msg' => '当前商品不存在']; if ($goods->{'status'} != 1) return ['code' => 0, 'msg' => '当前商品已下架']; //如果是单规格但是选择了规格 if ($goods->{'spec_type'} == 1 && !empty($goods_spec)){ return ['code' => 0, 'msg' => '该商品没有规格']; } if (!empty($goods_spec)){ foreach ($goods_spec as $spec){ $spec_number = $spec['number']; $sku_id = GoodsSpec::where('goods_id',$goods_id)->where('id',$spec['id'])->where('is_del',0)->value('sku_id'); if (empty($sku_id)){ return ['code' => 0, 'msg' => '商品规格错误']; } $skuInfo = GoodsSku::where('goods_id',$goods_id)->where('id',$sku_id)->where('is_del',0)->first(); if (empty($skuInfo)){ return ['code' => 0, 'msg' => '商品规格不存在']; } if ($skuInfo->{'sku_type'} == 1){//商品只能单选 $spec_number = 1;//单选购物数量只能为1 }elseif ($skuInfo->{'sku_type'} == 2 && $skuInfo->{'affect_quantity'} == 0){//可多选规格但是不能多添加购物车数量 $spec_number = 1;//数量只能为1 } $goods_spec_ids[] = $spec['id']; $goods_spec_data[] = [ 'id' => $spec['id'], 'number' => $spec_number, ]; } sort($goods_spec_ids); $goods_spec_id = implode('_',$goods_spec_ids); } DB::beginTransaction(); //获取购物车是否存在此商品 $where = [['m_id',$m_id], ['shop_id',$shop_id], ['category_id',$category_id], ['goods_id',$goods_id]]; if ($goods_spec_id) $where[] = ['goods_spec_id',$goods_spec_id]; //查询此商品购物车数量 $shopping_info = Shopping::where($where)->select(['id', 'goods_id', 'number'])->first(); try { if (empty($shopping_info)) {//没购物车信息 if ($number <= 0){ DB::rollBack(); return ['code' => 0, 'msg' => '请选择数量']; } //如果商品是多规格但是没选规格 if ($goods->{'spec_type'} == 2 && empty($goods_spec)){ return ['code' => 0, 'msg' => '请选择商品规格']; } //入库 $shopping = Shopping::create([ 'm_id' => $m_id, 'shop_id' => $shop_id, 'category_id' => $category_id, 'goods_id' => $goods_id, 'goods_spec_id' => $goods_spec_id, 'number' => $number, ]); $shopping_id = $shopping->{'id'}; if (empty($shopping_id)) { DB::rollBack(); return ['code' => 0, 'msg' => '操作失败']; } if (!empty($goods_spec_data)){//规则明细存入 foreach ($goods_spec_data as $spec){ ShoppingDetail::create([ 'shopping_id' => $shopping_id, 'goods_id' => $goods_id, 'goods_spec_id' => $spec['id'], 'number' => $spec['number'], ]); } } }else{ if ($number <= 0){//数量为0直接删除 Shopping::where('id',$shopping_info->{'id'})->delete();//删除主表 ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->delete();//删除详情表 }else{ //如果存在购物车 if (!empty($goods_spec)){//多规格商品 $is_create = false; foreach ($goods_spec as $spec){ $shopping_spec_number = ShoppingDetail::where('shopping_id',$shopping_info->{'id'}) ->where('goods_id',$goods_id) ->where('goods_spec_id',$spec['id']) ->value('number'); if ($shopping_spec_number != $spec['number']){ $is_create = true; } } if ($is_create){//规格数量不一样,创建新的 //入库 $shopping = Shopping::create([ 'm_id' => $m_id, 'shop_id' => $shop_id, 'category_id' => $category_id, 'goods_id' => $goods_id, 'goods_spec_id' => $goods_spec_id, 'number' => $number, ]); $shopping_id = $shopping->{'id'}; if (empty($shopping_id)) { DB::rollBack(); return ['code' => 0, 'msg' => '操作失败']; } if (!empty($goods_spec_data)){//规则明细存入 foreach ($goods_spec_data as $spec){ ShoppingDetail::create([ 'shopping_id' => $shopping_id, 'goods_id' => $goods_id, 'goods_spec_id' => $spec['id'], 'number' => $spec['number'], ]); } } }else{//规格数量一样,在原来基础上增加 Shopping::where('id',$shopping_info->{'id'})->increment('number',$number); } }else{ Shopping::where('id',$shopping_info->{'id'})->update(['number' => $number]); } } } DB::commit(); return ['code' => 1, 'msg' => '操作成功']; }catch (\Exception $e){ DB::rollBack(); return ['code' => 0, 'msg' => '操作失败']; } } // /** // * 添加购物车 // * @param $m_id // * @param $shop_id // * @param $category_id // * @param $goods_id // * @param $goods_spec_id // * @param $number // * @return array // */ // function saveShopping($m_id,$shop_id,$category_id,$goods_id,$goods_spec_id,$number) // { // if (empty($goods_spec_id)){ // $goods_spec_id = ''; // } // //获取商品 // $goods = Goods::where('is_del',0) // ->where('id',$goods_id) // ->where('shop_id',$shop_id) // ->where('category_id',$category_id) // ->select(['id as goods_id','status','spec_type']) // ->first(); // if (empty($goods)) return ['code' => 0, 'msg' => '当前商品不存在']; // if ($goods->{'status'} != 1) return ['code' => 0, 'msg' => '当前商品已下架']; // //如果是单规格但是选择了规格 // if ($goods->{'spec_type'} == 1 && !empty($goods_spec_id)){ // return ['code' => 0, 'msg' => '该商品没有规格']; // } // if (!empty($goods_spec_id)){ // $sku_id = GoodsSpec::where('goods_id',$goods_id)->where('id',$goods_spec_id)->where('is_del',0)->value('sku_id'); // if (empty($sku_id)){ // return ['code' => 0, 'msg' => '商品规格错误']; // } // $skuInfo = GoodsSku::where('goods_id',$goods_id)->where('id',$sku_id)->where('is_del',0)->first(); // if (empty($skuInfo)){ // return ['code' => 0, 'msg' => '商品规格不存在']; // } // } // DB::beginTransaction(); // try { // //获取购物车是否存在此商品 // $where = [['m_id',$m_id], ['shop_id',$shop_id], ['category_id',$category_id], ['goods_id',$goods_id]]; // //查询此商品购物车数量 // $shopping_info = Shopping::where($where)->select(['id', 'goods_id', 'number'])->first(); // // if (empty($shopping_info)) {//没用购物车信息 // //如果商品是多规格但是没选规格 // if ($goods->{'spec_type'} == 2 && empty($goods_spec_id)){ // return ['code' => 0, 'msg' => '请选择商品规格']; // } // if ($number <= 0){ // DB::rollBack(); // return ['code' => 0, 'msg' => '请选择数量']; // } // //入库 // $shopping = Shopping::create([ // 'm_id' => $m_id, // 'shop_id' => $shop_id, // 'category_id' => $category_id, // 'goods_id' => $goods_id, // 'number' => $number, // ]); // $shopping_id = $shopping->{'id'}; // if (empty($shopping_id)) { // DB::rollBack(); // return ['code' => 0, 'msg' => '添加失败']; // } // //如果有规则就入库规则信息 // if (!empty($goods_spec_id)){ // if ($skuInfo->{'sku_type'} == 1){//商品只能单选 // $number = 1;//单选购物数量只能为1 // }elseif ($skuInfo->{'sku_type'} == 2 && $skuInfo->{'affect_quantity'} == 0){//可多选规格但是不能多添加购物车数量 // $number = 1;//数量只能为1 // } // ShoppingDetail::create([ // 'shopping_id' => $shopping_id, // 'goods_id' => $goods_id, // 'goods_spec_id' => $goods_spec_id, // 'number' => $number, // ]); // } // }else{//有购物车信息,更新 // $shopping_id = $shopping_info->{'id'}; // // if (!empty($goods_spec_id)){//选择了规则就是更新购物车详情表 // if ($number <= 0){//数量为0直接删除 // ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->where('goods_id',$goods_id)->where('goods_spec_id',$goods_spec_id)->delete();//删除详情表 // }else{ // //检查该规格信息是否讯息 // $details = ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->where('goods_id',$goods_id)->where('goods_spec_id',$goods_spec_id)->select(['id'])->first(); // // if ($skuInfo->{'sku_type'} == 1){//商品只能单选 // $number = 1;//单选购物数量只能为1 // }elseif ($skuInfo->{'sku_type'} == 2 && $skuInfo->{'affect_quantity'} == 0){//可多选规格但是不能多添加购物车数量 // $number = 1;//数量只能为1 // } // if (empty($details)){ // ShoppingDetail::create([ // 'shopping_id' => $shopping_id, // 'goods_id' => $goods_id, // 'goods_spec_id' => $goods_spec_id, // 'number' => $number, // ]); // }elseif ($skuInfo->{'sku_type'} == 2 && $skuInfo->{'affect_quantity'} == 1){//可多选规格并且能多添加购物车数量 // ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->where('goods_id',$goods_id)->where('goods_spec_id',$goods_spec_id)->update(['number' => $number]);//跟新购物车 // } // } // }else{//没选规则就是更新主表 // if ($number <= 0){//数量为0直接删除 // Shopping::where('id',$shopping_info->{'id'})->delete();//删除主表 // ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->delete();//删除详情表 // }else{ // Shopping::where('id',$shopping_info->{'id'})->update(['number' => $number]); // } // } // // } // // // DB::commit(); // return ['code' => 1, 'msg' => '添加成功']; // }catch (\Exception $e){ // DB::rollBack(); // return ['code' => 0, 'msg' => '添加失败']; // } // // } /** * 删除购物车 * @param $m_id * @param $shop_id * @return array */ function delShopping($m_id,$shop_id) { //删除数据 DB::beginTransaction(); try { $where = [['m_id',$m_id], ['shop_id',$shop_id]]; $shopping_info = Shopping::where($where)->select(['id', 'goods_id', 'number'])->get(); foreach ($shopping_info as $v){ Shopping::where('id',$v->{'id'})->delete();//删除主表 ShoppingDetail::where('shopping_id',$v->{'id'})->delete();//删除详情表 } DB::commit(); return ['code' => 1, 'msg' => '删除成功']; }catch (\Exception $e){ DB::rollBack(); return ['code' => 0, 'msg' => '删除失败']; } } /** * 本地购物车数据组装获取 * @param $cartInfo * @return array */ function getCartList($cartInfo) { $total_num = 0;//总商品数 $total_goods_money = '0.00';//总商品费用 $total_pack_price = 0;//打包费 $goods_list = []; foreach ($cartInfo['goods_list'] as $value){ $goods = Goods::where('id',$value['goods_id']) ->select(['id as goods_id','shop_id','status','goods_name','goods_image','price','spec_type','category_id','pack_price']) ->orderBy('id','asc') ->first(); if (empty($goods)){ return ['code' => 0, 'msg' => '商品不存在']; } if ($goods->{'status'} != 1){ return ['code' => 0, 'msg' => '商品已下架']; } $goods_price = $goods->{'price'};//商品价格 $goods_number = $value['goods_number'];//商品购买数量 $goods_spec_list = []; $goods_spec_price = 0; $goods_attr = ''; if ($goods->{'spec_type'} == 2 && !empty($value['goods_spec'])){//存在规格 foreach ($value['goods_spec'] as $spec){ $specInfo = GoodsSpec::where('goods_id',$value['goods_id']) ->where('id',$spec['id']) ->where('is_del',0) ->select(['spec_name','spec_price']) ->first(); if (empty($specInfo)){ return ['code' => 0, 'msg' => '规则不存在']; } if ($spec['number'] > 1){ $goods_attr .= $specInfo['spec_name'].'x'.$spec['number'] . ','; }else{ $goods_attr .= $specInfo['spec_name'] . ','; } $goods_spec_price = bcadd($goods_spec_price,bcmul($spec['number'],$specInfo['spec_price'],2),2);//规格数量乘以价格等于 规格总价 $goods_spec_list[] = [ 'goods_id' => $value['goods_id'], 'goods_spec_id' => $spec['id'], 'spec_price' => $specInfo['spec_price'], 'spec_name' => $specInfo['spec_name'], 'number' => $spec['number'], ]; } } //计算价格 $goods_money = bcmul($goods_number,bcadd($goods_price,$goods_spec_price,2),2);//商品价格等于 商品数量X(商品底价+商品规格总价) $goods_list[] = [ 'shop_id' => $goods['shop_id'], 'category_id' => $goods['category_id'], 'goods_id' => $goods['goods_id'], 'goods_money' => rtrim(rtrim($goods_money, '0'),'.'), 'goods_number' => $goods_number, 'goods_name' => $goods['goods_name'], 'goods_image' => $goods['goods_image'], 'spec_type' => $goods['spec_type'], 'price' => $goods_price, 'pack_price' => $goods['pack_price'], 'goods_spec_id' => $goods['goods_spec_id'], 'goods_attr' => trim($goods_attr,','), 'spec_list' => $goods_spec_list, ]; //计算打包费 $total_pack_price = bcadd($total_pack_price,bcmul($goods_number,$goods['pack_price'],2),2); //计算总数量 $total_num += $goods_number; //计算总商品费用 $total_goods_money = bcadd($total_goods_money,$goods_money,2); } //订单总价-商品总价+总包装费 $total_price = bcadd($total_goods_money,$total_pack_price,2); $data['total_price'] = rtrim(rtrim($total_price, '0'),'.'); $data['total_num'] = (int)$total_num; $data['total_goods_money'] = rtrim(rtrim($total_goods_money, '0'),'.'); $data['pack_price'] = $total_pack_price; $data['goods_list'] = $goods_list; return ['code' => 1, 'msg' => '成功', 'data'=>$data]; } }