|
|
@@ -10,6 +10,8 @@ use App\Models\Goods;
|
|
|
use App\Models\GoodsSku;
|
|
|
use App\Models\GoodsSpec;
|
|
|
use App\Models\Shopping;
|
|
|
+use App\Models\ShoppingDetail;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
/**
|
|
|
* 购物车服务
|
|
|
@@ -51,7 +53,7 @@ class ShoppingCartServer
|
|
|
$shopping = Shopping::from('shopping as p')
|
|
|
->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'])
|
|
|
+ ->select(['p.id as shopping_id','p.number','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();
|
|
|
|
|
|
@@ -59,52 +61,42 @@ class ShoppingCartServer
|
|
|
$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'};//商品金额
|
|
|
+ $goods_spec_price = 0;//商品规格金额
|
|
|
$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'])
|
|
|
+ $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.*','s.spec_name','s.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'].'库存不足';
|
|
|
+ $spec_total_price = 0;//规则总价置为0
|
|
|
+ foreach ($details as $detail){
|
|
|
+
|
|
|
+ $goods_attr .= $detail['spec_name'] . ',';
|
|
|
+ $spec_total_price = bcmul($detail['number'],$detail['spec_price'],2);//规格数量乘以价格等于 规格总价
|
|
|
}
|
|
|
+ $goods_spec_price = bcmul($goods_spec_price,$spec_total_price,2);
|
|
|
+ $goods_spec_list = $details;
|
|
|
}
|
|
|
//计算价格
|
|
|
- $goods_money = bcmul($goods_price,$goods_number,2);
|
|
|
+ $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_spec_id' => $goods_spec_id,
|
|
|
'goods_money' => rtrim(rtrim($goods_money, '0'),'.'),
|
|
|
'goods_number' => $goods_number,
|
|
|
'goods_name' => $value['goods_name'],
|
|
|
@@ -113,8 +105,8 @@ class ShoppingCartServer
|
|
|
'price' => $goods_price,
|
|
|
'pack_price' => $value['pack_price'],
|
|
|
'goods_attr' => $goods_attr,
|
|
|
- 'is_infinite' => $value['is_infinite'],
|
|
|
'status_str' => $status_str,
|
|
|
+ 'spec_list' => $goods_spec_list,
|
|
|
];
|
|
|
//计算打包费
|
|
|
$total_pack_price = bcadd($total_pack_price,bcmul($goods_number,$value['pack_price'],2),2);
|
|
|
@@ -165,63 +157,88 @@ class ShoppingCartServer
|
|
|
//如果商品是多规格但是没选规格
|
|
|
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 ($goods->{'spec_type'} == 1 && !empty($goods_spec_id)){
|
|
|
+ return ['code' => 0, 'msg' => '该商品没有规格'];
|
|
|
}
|
|
|
- if (empty($shopping_info)) {
|
|
|
- if ($number <= 0){
|
|
|
- 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' => '商品规格错误'];
|
|
|
}
|
|
|
-
|
|
|
- //入库
|
|
|
- $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]);
|
|
|
+ $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 ($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{//有购物车信息,更新
|
|
|
+ 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{
|
|
|
+ if ($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]);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- if (empty($shopping)){
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ return ['code' => 1, 'msg' => '添加成功'];
|
|
|
+ }catch (\Exception $e){
|
|
|
+ DB::rollBack();
|
|
|
return ['code' => 0, 'msg' => '添加失败'];
|
|
|
}
|
|
|
|
|
|
- return ['code' => 1, 'msg' => '添加成功'];
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -234,15 +251,22 @@ class ShoppingCartServer
|
|
|
function delShopping($m_id,$shop_id)
|
|
|
{
|
|
|
//删除数据
|
|
|
- $where = [['m_id',$m_id], ['shop_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'])->first();
|
|
|
|
|
|
- $res = Shopping::where($where)->delete();
|
|
|
+ Shopping::where('id',$shopping_info->{'id'})->delete();//删除主表
|
|
|
+ ShoppingDetail::where('shopping_id',$shopping_info->{'id'})->delete();//删除详情表
|
|
|
|
|
|
- if (empty($res)){
|
|
|
+ DB::commit();
|
|
|
+ return ['code' => 1, 'msg' => '删除成功'];
|
|
|
+ }catch (\Exception $e){
|
|
|
+ DB::rollBack();
|
|
|
return ['code' => 0, 'msg' => '删除失败'];
|
|
|
}
|
|
|
|
|
|
- return ['code' => 1, 'msg' => '删除成功'];
|
|
|
}
|
|
|
|
|
|
}
|