zx/app/common/model/store/order/StoreCart.php

333 lines
12 KiB
PHP
Raw Normal View History

2024-07-02 15:32:59 +08:00
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\common\model\store\order;
use app\common\model\BaseModel;
use app\common\model\store\product\Product;
use app\common\model\store\product\ProductAssistSet;
use app\common\model\store\product\ProductAttr;
use app\common\model\store\product\ProductAttrValue;
use app\common\model\store\product\ProductGroup;
use app\common\model\store\product\ProductPresell;
use app\common\model\store\product\ProductPresellSku;
use app\common\model\store\product\ProductSku;
use app\common\model\store\product\Spu;
use app\common\model\store\product\StoreDiscounts;
use app\common\model\system\merchant\Merchant;
use app\common\repositories\store\order\StoreOrderProductRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\store\product\ProductAssistSkuRepository;
use app\common\repositories\store\product\ProductAttrValueRepository;
use app\common\repositories\store\product\ProductGroupSkuRepository;
use app\common\repositories\store\product\ProductPresellSkuRepository;
use app\common\repositories\store\product\ProductSkuRepository;
use app\common\repositories\store\StoreSeckillActiveRepository;
use function Symfony\Component\String\b;
class StoreCart extends BaseModel
{
public static function tablePk(): ?string
{
return 'cart_id';
}
public static function tableName(): string
{
return 'store_cart';
}
public function searchCartIdAttr($query,$value)
{
$query->where('cart_id',$value);
}
public function product()
{
return $this->hasOne(Product::class, 'product_id', 'product_id');
}
public function productAttr()
{
return $this->hasOne(ProductAttrValue::class, 'unique', 'product_attr_unique');
}
public function attr()
{
return $this->hasMany(ProductAttr::class,'product_id','product_id');
}
public function attrValue()
{
return $this->hasMany(ProductAttrValue::class, 'product_id', 'product_id');
}
public function merchant()
{
return $this->hasOne(Merchant::class, 'mer_id', 'mer_id');
}
public function productPresell()
{
return $this->hasOne(ProductPresell::class,'product_presell_id','source_id');
}
public function productDiscount()
{
return $this->hasOne(StoreDiscounts::class, 'discount_id', 'source_id');
}
public function getProductDiscountAttrAttr()
{
return app()->make(ProductSkuRepository::class)->getSearch(['active_id' => $this->source_id, 'unique' => $this->product_attr_unique,'active_type'=> 10])->find();
}
public function productAssistSet()
{
return $this->hasOne(ProductAssistSet::class,'product_assist_set_id','source_id');
}
public function getProductPresellAttrAttr()
{
return app()->make(ProductPresellSkuRepository::class)->getSearch(['product_presell_id' => $this->source_id, 'unique' => $this->product_attr_unique])->find();
}
public function getProductAssistAttrAttr()
{
$make = app()->make(ProductAssistSkuRepository::class);
$where = [
"product_assist_id" => $this->productAssistSet->product_assist_id,
"unique" => $this->product_attr_unique
];
return $make->getSearch($where)->find();
}
/**
* TODO 活动商品 SKU
* @return array|\think\Model|null
* @author Qinii
* @day 1/13/21
*/
public function getActiveSkuAttr()
{
switch ($this->product_type)
{
case 2:
$make = app()->make(ProductPresellSkuRepository::class);
$where['product_presell_id'] = $this->source_id;
break;
case 3:
$make = app()->make(ProductAssistSkuRepository::class);
$where['product_assist_id'] = $this->productAssistSet->product_assist_id;
break;
case 4:
$make = app()->make(ProductGroupSkuRepository::class);
$where['product_group_id'] = $this->product->productGroup->product_group_id;
break;
default:
$make = app()->make(ProductAttrValueRepository::class);
$where['product_id'] = $this->product_id;
break;
}
$where['unique'] = $this->product_attr_unique;
return $make->getSearch($where)->find();
}
public function getSpuAttr()
{
if ($this->product_type) {
$where = [
'activity_id' => $this->source_id,
'product_type' => $this->product_type,
];
} else {
$where = [
'product_id' => $this->product_id,
'product_type' => $this->product_type,
];
}
return Spu::where($where)->field('spu_id,store_name')->find();
}
/**
* TODO 检测商品是否有效
* @return bool
* @author Qinii
* @day 2020-10-29
*/
public function getCheckCartProductAttr()
{
if($this->is_fail == 1) return false;
if(is_null($this->product) || is_null($this->productAttr) || $this->product->status !== 1 || $this->product->mer_status !== 1 || $this->product->is_del !== 0)
{$this->is_fail = 1;$this->save();return false;}
switch ($this->product_type)
{
case 0: //普通商品
if ($this->product->product_type !== 0 || $this->product->is_show !== 1 || $this->productAttr->stock < $this->cart_num || $this->product->is_used !== 1) {
return false;
}
break;
case 1: //秒杀商品
if ($this->product->product_type !== 1 || $this->product->is_show !== 1) return false;
//结束时间
if ($this->product->seckill_status !== 1) return false;
//限量
$order_make = app()->make(StoreOrderRepository::class);
$count = $order_make->seckillOrderCounut($this->product_id);
if ($this->productAttr->stock <= $count) return false;
//原商品sku库存
$value_make = app()->make(ProductAttrValueRepository::class);
$sku = $value_make->getWhere(['sku' => $this->productAttr->sku, 'product_id' => $this->product->old_product_id]);
if (!$sku || $sku['stock'] <= 0) return false;
break;
case 2: //预售商品
if($this->source !== 2 || $this->product->product_type !== 2) return false;
if($this->productPresell->status !== 1 ||
$this->productPresell->is_show !== 1 ||
$this->productPresell->is_del !== 0 ||
$this->productPresell->presell_status !== 1)
{$this->is_fail = 1;$this->save();return false;}
$sku = $this->ActiveSku;
if(!$sku || !$sku->sku()) {$this->is_fail = 1; $this->save(); return false; }
//库存不足
if($sku->stock < $this->cart_num || $sku->sku->stock < $this->cart_num) return false;
break;
case 3: //助力商品
if($this->source !== 3 || $this->product->product_type !== 3 || ($this->productAssistSet->assist_count !== $this->productAssistSet->yet_assist_count)) return false;
if(
$this->productAssistSet->stop_time < time() ||
$this->productAssistSet->sataus === -1 ||
!$this->productAssistSet->assist->is_show ||
$this->productAssistSet->assist->is_del !== 0 ||
$this->productAssistSet->assist->status !== 1)
{$this->is_fail = 1;$this->save();return false;}
$sku = $this->ActiveSku;
if(!$sku || !$sku->sku()) { $this->is_fail = 1; $this->save(); return false; }
//库存不足
if($sku->stock < $this->cart_num || $sku->sku->stock < $this->cart_num) return false;
break;
case 4:
if($this->source !== 4 || $this->product->product_type !== 4 ) return false;
$sku = $this->ActiveSku;
if(!$sku || !$sku->sku()) { $this->is_fail = 1; $this->save(); return false; }
//库存不足
if($sku->stock < $this->cart_num || $sku->sku->stock < $this->cart_num) return false;
break;
}
return true;
}
/**
* TODO
* @return bool
* @author Qinii
* @day 2020-10-29
*/
public function getUserPayCountAttr()
{
$make = app()->make(StoreOrderRepository::class);
switch ($this->product_type)
{
case 1: //秒杀
if(!$make->getDayPayCount($this->uid,$this->product_id,$this->cart_num) || !$make->getPayCount($this->uid,$this->product_id,$this->cart_num))
return false;
break;
case 2: //预售
$count = $this->productPresell->pay_count;
if($count == 0) return true;
$tattend = [
'activity_id' => $this->source_id,
'product_type' => 2,
];
$pay_count = $make->getTattendCount($tattend,$this->uid)->sum('total_num');
if($pay_count < $count) return false;
if (($count - $pay_count) < $this->cart_num) return false;
break;
case 3: //助力
$tattend = [
'activity_id' => $this->source_id,
'product_type' => 3,
];
$pay_count = $make->getTattendCount($tattend,$this->uid)->count();
if($pay_count) return false;
$count = $this->productAssistSet->assist->pay_count;
if($count !== 0){
$_tattend = [
'exsits_id' => $this->productAssistSet->assist->product_assist_id,
'product_type' => 3,
];
$_count = $make->getTattendCount($_tattend,$this->uid)->count();
if($_count >= $count) return false;
}
break;
case 4:
$tattend = [
'exsits_id' => $this->product_id,
'product_type' => 4,
];
$pay_count = $make->getTattendCount($tattend,$this->uid)->count();
if($pay_count) return false;
$count = $this->product->productGroup->pay_count;
if($count !== 0){
$_tattend = [
'exsits_id' => $this->product_id,
'product_type' => 34,
];
$_count = $make->getTattendCount($_tattend,$this->uid)->count();
if($_count >= $count) return false;
}
break;
}
return true;
}
public function searchProductIdAttr($query,$value)
{
$query->where('product_id',$value);
}
public function searchUidAttr($query,$value)
{
$query->where('uid',$value);
}
public function searchIsNewAttr($query,$value)
{
$query->where('is_new',$value);
}
public function searchIsPayAttr($query,$value)
{
$query->where('is_pay',$value);
}
public function searchIsDelAttr($query,$value)
{
$query->where('is_del',$value);
}
public function searchIsFailAttr($query,$value)
{
$query->where('is_fail',$value);
}
}