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','g.is_infinite','g.stock']) ->orderBy('p.id','asc') ->get(); $total_num = 0;//总商品数 $total_goods_money = '0.00';//总商品费用 $total_pack_price = 0;//打包费 $goods_list = [];//商品列表 $goodsNumber = [];//记录商品一共点了多少,判断是否限购超库存 foreach ($shopping as $value){ $goods_id = $value->{'goods_id'};//商品id $goods_price = $value->{'price'};//商品金额 $spec_type = $value->{'spec_type'};//商品类型 $goods_spec_id = $value->{'goods_spec_id'};//商品规格id $status_str = ''; $goods_attr = "";//规则值 $goods_number = $value['number'];//商品数量 $goods_spec = []; //记录商品一共点了多少,判断是否限购超库存 if (isset($goodsNumber[$goods_id])){ $goodsNumber[$goods_id] = bcadd($goodsNumber[$goods_id],$goods_number); }else{ $goodsNumber[$goods_id] = $goods_number; } if ($goods_spec_id && $spec_type == 2){//存在规格 $specIds = array_filter(explode('_', $goods_spec_id)); $goods_spec = GoodsSpec::where('goods_id',$goods_id) ->whereIn('id',$specIds) ->where('is_del',0) ->select(['spec_name','spec_price']) ->get(); foreach ($goods_spec as $spec_value){ $goods_attr .= $spec_value['spec_name'] . ','; $goods_price = bcadd($spec_value['spec_price'],$goods_price,2); } } //商品不是无限库存,判断库存是否足够 if ($value->{'is_infinite'} != 1){ if ($value->{'stock'} < $goodsNumber[$goods_id]){ $status_str = '库存不足'; $this->errorMsg = $value['goods_name'].'库存不足'; } } //计算价格 $goods_money = bcmul($goods_price,$goods_number,2); $goods_list[] = [ 'shop_id' => $value['shop_id'], 'category_id' => $value['category_id'], 'goods_id' => $goods_id, 'goods_spec_id' => $goods_spec_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_attr' => $goods_attr, 'is_infinite' => $value['is_infinite'], 'status_str' => $status_str, ]; //计算打包费 $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; } /** * 添加购物车 * @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','is_infinite','stock','status','spec_type']) ->first(); if (empty($goods)) return ['code' => 0, 'msg' => '当前商品不存在']; if ($goods->{'status'} != 1) return ['code' => 0, 'msg' => '当前商品已下架']; //如果商品是多规格但是没选规格 if ($goods->{'spec_type'} == 2 && empty($goods_spec_id)){ return ['code' => 0, 'msg' => '请选择商品规格']; }elseif ($goods->{'spec_type'} == 2 && $goods_spec_id){ //如果商品是多规格,查询规格商品是否选择全 $skuIds = GoodsSku::where('goods_id',$goods->{'goods_id'})->where('is_del',0)->pluck('id')->toArray(); $spec = array_filter(explode('_', $goods_spec_id)); foreach ($skuIds as $skuId){ $specIds = GoodsSpec::where('goods_id',$goods->{'goods_id'})->where('is_del',0)->where('sku_id',$skuId)->pluck('id')->toArray(); if (!array_intersect($spec,$specIds)){ return ['code' => 0, 'msg' => '请完整选择规格']; } } } //获取购物车是否存在此商品 $where = [['m_id',$m_id], ['shop_id',$shop_id], ['category_id',$category_id], ['goods_id',$goods_id]]; //获取此商品数量 $shopping_number = Shopping::where($where)->sum('number'); $total_number = bcadd($shopping_number,$number); if ($goods_spec_id) $where[] = ['goods_spec_id',$goods_spec_id]; //查询 $shopping_info = Shopping::where($where)->select(['id', 'goods_id', 'number'])->first(); //商品不是无限库存,判断库存是否足够 if ($goods->{'is_infinite'} != 1){ if ($goods->{'stock'} < $total_number){ return ['code' => 0, 'msg' => '商品库存余'.$goods->{'stock'}.'份']; } } if (empty($shopping_info)) { if ($number <= 0){ return ['code' => 0, 'msg' => '请选择数量']; } //入库 $shopping = Shopping::create([ 'm_id' => $m_id, 'type' => 1, 'shop_id' => $shop_id, 'category_id' => $category_id, 'goods_id' => $goods_id, 'goods_spec_id' => $goods_spec_id, 'number' => $number, ]); }else{ if ($number <= 0){//数量为0直接删除 $shopping = Shopping::where('id',$shopping_info->{'id'})->delete(); }else{ $shopping = Shopping::where('id',$shopping_info->{'id'})->update(['number' => $number]); } } if (empty($shopping)){ return ['code' => 0, 'msg' => '添加失败']; } return ['code' => 1, 'msg' => '添加成功']; } /** * 删除购物车 * @param $m_id * @param $shop_id * @return array */ function delShopping($m_id,$shop_id) { //删除数据 $where = [['m_id',$m_id], ['shop_id',$shop_id]]; $res = Shopping::where($where)->delete(); if (empty($res)){ return ['code' => 0, 'msg' => '删除失败']; } return ['code' => 1, 'msg' => '删除成功']; } }