| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- <?php
- /**
- * Created by PhpStorm.
- * Author: 芸众商城 www.yunzshop.com
- * Date: 2017/2/22
- * Time: 19:35
- */
- namespace app\common\models;
- use app\common\events\goods\GoodsStockNotEnoughEvent;
- use app\common\exceptions\AppException;
- use app\frontend\modules\goods\models\Goods;
- use app\frontend\modules\goods\services\TradeGoodsPointsServer;
- use app\frontend\modules\goods\stock\GoodsStock;
- use app\frontend\modules\orderGoods\price\adapter\GoodsOptionPriceAdapter;
- /**
- * Class GoodsOption
- * @package app\common\models
- * @property int uniacid
- * @property int goods_id
- * @property int product_price
- * @property int market_price
- * @property int title
- * @property int stock
- */
- class GoodsOption extends \app\common\models\BaseModel
- {
- public $table = 'yz_goods_option';
- public $guarded = [];
- public $timestamps = false;
- protected $hidden = [
- "created_at",
- "updated_at",
- "deleted_at",
- ];
- /**
- * 库存是否充足
- * @param $num
- * @return bool
- * @author shenyang
- */
- public function stockEnough($num)
- {
- if($this->goods->reduce_stock_method == 2){
- return true;
- }
- return $this->goodsStock()->enough($num);
- }
- public function goods()
- {
- return $this->belongsTo(app('GoodsManager')->make('Goods'), 'goods_id', 'id');
- }
- public static function boot()
- {
- parent::boot();
- static::observe(new \app\common\modules\goods\GoodsOptionObserverBase);
- }
- public function save()
- {
- if ($this->attributes['reduce_stock_method'] != $this->original['reduce_stock_method']) {
- if ($this->withhold_stock > 0) {
- throw new AppException('商品规格[' . $this->title . ']存在预扣库存,无法修改减库存方式设置。');
- }
- }
- // 提交的库存是扣除预扣的,保存的时候必须将预扣的数量加回来
- if(isset($this->attributes['stock']) && $this->attributes['stock'] != $this->original['stock']){
- $this->attributes['stock'] = $this->attributes['stock'] + $this->withhold_stock;
- }
- $result = parent::save();
- return $result;
- }
- private $goodsStock;
- public function goodsStock()
- {
- if (!isset($this->goodsStock)) {
- $this->goodsStock = new GoodsStock($this);
- }
- return $this->goodsStock;
- }
- public function getStockAttribute()
- {
- return $this->goodsStock()->usableStock();
- }
- public function getWithholdStockAttribute()
- {
- return $this->goodsStock()->withholdStock();
- }
- public function fireStockNotEnoughtEvent($goods)
- {
- event(new GoodsStockNotEnoughEvent([],$goods));
- }
- //todo blank 商品价格适配器
- public function getGoodsPriceAdapter()
- {
- return new GoodsOptionPriceAdapter($this);
- }
- /**
- * @description 下单页积分
- * @return string
- */
- public function getPointsAttribute()
- {
- $tradeGoodsPointsServer = app(TradeGoodsPointsServer::class);
- if ($tradeGoodsPointsServer->close(TradeGoodsPointsServer::GOODS_PAGE)){
- return '';
- }
- $points = $tradeGoodsPointsServer->finalSetPoint();
- return $tradeGoodsPointsServer->getPoint($points, $this->product_price, $this->cost_price);
- }
- /**
- * @return int
- * @throws AppException
- */
- public function getVipPriceAttribute()
- {
- if (!\YunShop::app()->getMemberId()) {
- return $this->product_price;
- }
- $member = \app\frontend\models\Member::current();
- $level_id = $member->yzMember->level_id;
- if (empty($level_id)) {
- return $this->product_price;
- }
- $goods = $this->goods->hasManyGoodsDiscount->where('level_id', $level_id)->first();
- if ($goods) {
- return sprintf('%.2f', max($this->product_price - $goods->getAmount($this->getGoodsPriceAdapter(), $member), 0));
- }
- $level = MemberLevel::getMemberLevel($level_id);
- if (empty($level)) {
- return $this->product_price;
- }
- $price = $level->getDiscountCalculation($this->getGoodsPriceAdapter());
- $return_price = sprintf('%.2f', $this->product_price - $price);
- return $return_price >= 0 ? $return_price : 0;
- }
- /**
- * @return int
- * @throws AppException
- */
- public function getNextVipPriceAttribute()
- {
- if (!\YunShop::app()->getMemberId()) {
- return $this->product_price;
- }
- $member = \app\frontend\models\Member::current();
- $level_id = $member->yzMember->level_id;
- if (empty($level_id)) {
- $nextLevel = MemberLevel::getFirstLevel();
- } else {
- $level = MemberLevel::getMemberLevel($level_id);
- $nextLevel = MemberLevel::getNextMemberLevel($level);
- }
- $priceClass = $this->getGoodsPriceAdapter();
- if ($nextLevel) {
- $goods = $this->goods->hasManyGoodsDiscount->where('level_id', $nextLevel->id)->first();
- if (!$goods) {
- /**
- * @param \app\common\models\MemberLevel $nextLevel
- */
- $price = $nextLevel->getDiscountCalculation($priceClass);
- return sprintf('%.2f', max($this->product_price - $price,0));
- }
- return sprintf('%.2f', max($this->product_price - $goods->getNextAmount($priceClass, $nextLevel),0));
- } else {
- $goods = $this->goods->hasManyGoodsDiscount->where('level_id', $level->id)->first();
- if (!$goods) {
- if (is_null($level)) {
- return $this->product_price;
- }
- $price = $level->getDiscountCalculation($priceClass);
- return sprintf('%.2f', max($this->product_price - $price,0));
- }
- return sprintf('%.2f', max($this->product_price - $goods->getAmount($priceClass, $member), 0));
- }
- }
- public function getAllLevelPriceAttribute()
- {
- if (\YunShop::app()->getMemberId()) {
- $member = \app\frontend\models\Member::current();
- } else {
- $member = new \app\frontend\models\Member();
- }
- $level_id = $member->yzMember->level_id;
- $all_level_price = [];
- $priceClass = $this->getGoodsPriceAdapter();
- // if (!$level_id) {
- // $nextLevel = MemberLevel::getFirstLevel();
- // if ($nextLevel) {
- // $goods = $this->hasManyGoodsDiscount->where('level_id', $nextLevel->id)->first();
- // if (!$goods) {
- // /**
- // * @param \app\common\models\MemberLevel $nextLevel
- // */
- // $price = $nextLevel->getDiscountCalculation($priceClass);
- // $deal_price = sprintf('%.2f', $this->deal_price - $price);
- // } else {
- // $deal_price = sprintf('%.2f', $this->deal_price - $goods->getNextAmount($priceClass, $nextLevel));
- // }
- // } else {
- // $deal_price = $this->deal_price;
- // }
- // $all_level_price[] = [
- // 'level_name' => $nextLevel->level_name,
- // 'level_id' => $nextLevel->id,
- // 'level' => $nextLevel->level,
- // 'price' => $deal_price,
- // ];
- // } else {
- $member_levels = MemberLevel::uniacid()->groupBy('level')->orderBy('level', 'asc')->get();
- if ($member_levels->isEmpty()) {
- $default_level = \Setting::get('shop.member.level_name');
- $level_name = $default_level ?: '普通会员';
- $all_level_price[] = [
- 'level_name' => $level_name,
- 'level_id' => 0,
- 'level' => 0,
- 'price' => $this->product_price,
- 'is_select' => true,
- 'is_next' => false,
- ];
- return $all_level_price;
- }
- $is_check_next = true;
- $level_count = $member_levels->count();
- $i = 0;
- $can_upgrade = false;
- foreach ($member_levels as $level) {
- $goods = $this->goods->hasManyGoodsDiscount->where('level_id', $level->id)->first();
- if (!$goods) {
- $price = $level->getDiscountCalculation($priceClass);
- $deal_price = sprintf('%.2f', $this->product_price - $price);
- } else {
- $deal_price = sprintf('%.2f', $this->product_price - $goods->getNextAmount($priceClass, $level));
- }
- $level_data = [
- 'level_name' => $level->level_name,
- 'level_id' => $level->id,
- 'level' => $level->level,
- 'price' => $deal_price,
- 'is_select' => false,
- 'is_next' => false,
- 'is_last' => false,
- ];
- if ($level_id == $level->id) {
- $level_data['is_select'] = true;
- }
- if ($level_id < $level->id && $is_check_next) {
- $level_data['is_next'] = true;
- $is_check_next = false;
- $can_upgrade = true;
- }
- $i++;
- if ($level_count == $i && $level->id == $level_id) {
- $level_data['is_last'] = true;
- }
- array_push($all_level_price, $level_data);
- }
- // }
- return [$all_level_price, $can_upgrade];
- }
- }
|