| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- <?php
- namespace App\Servers;
- 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;
- /**
- * 购物车服务
- */
- class ShoppingCartServer
- {
- static private $server = null;
- private $errorMsg = '';
- private function __construct()
- {
- }
- /**
- * 创建对象
- * @return ShoppingCartServer
- */
- static function creatServer()
- {
- if (empty(self::$server)) self::$server = new ShoppingCartServer();
- return self::$server;
- }
- /**
- * 获取购物车列表
- * @param $m_id
- * @param $shop_id
- * @return array
- */
- function getShoppingList($m_id,$shop_id)
- {
- //获取购物车商品数据
- $where = [['p.m_id',$m_id], ['p.shop_id',$shop_id], ['g.is_del',0], ['g.status',1]];
- $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','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_attr' => $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;
- }
- /**
- * 添加购物车
- * @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' => '删除失败'];
- }
- }
- }
|