123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php namespace App\Models;
- use Illuminate\Database\Eloquent\Factories\HasFactory;
- use Illuminate\Database\Eloquent\Model;
- /**
- * 产品促销活动商品范围模型
- *
- */
- class PromoProduct extends Model
- {
- use HasFactory;
- // 与模型关联的表名
- protected $table = 'promo_product';
- // 是否主动维护时间戳
- public $timestamps = false;
- // 定义时间戳字段名
- // const CREATED_AT = 'insert_time';
- // const UPDATED_AT = 'update_time';
- /**
- * 添加数据
- *
- */
- public function add($data)
- {
- // 时间
- $data['insert_time'] = time();
- $data['update_time'] = time();
- // 写入数据表
- $id = $this->query()->insertGetId($data);
- // 返回结果
- return $id;
- }
- /**
- * 添加数据
- *
- */
- public function edit($id,$data)
- {
- // 更新时间
- $data['update_time'] = time();
- // 写入数据表
- $result = $this->query()->where(['id'=>$id])->update($data);
- // 返回结果
- return $result;
- }
- /**
- * 查询多个优惠券的商品范围列表
- *
- * @param array $couponIds 适用产品的列表
- *
- */
- public function getProductList($couponIds)
- {
- // 写入数据表
- $result = $this->query()->whereIn('coupon_id',$couponIds)->get(['coupon_id','product_id'])->toArray();
- // 返回结果
- return $result;
- }
- /**
- * 通过产品ids查询活动列表
- *
- */
- public function getListByIds($productIds)
- {
- $time = time();
- $where = [
- ['promo.status','=','0'],
- ['promo.start_time','<=',$time],
- ['promo.end_time','>=',$time],
- ['promo_product.status','=',0],
- ];
- $data = $this->query()
- ->join('promo','promo.id','=','promo_product.promo_id')
- ->where($where)
- ->whereIn('promo_product.product_id',$productIds)
- ->select('promo.*','promo_product.product_id','promo_product.id as promo_product_id')
- ->get()
- ->toArray();
- // 列表
- $list = [];
- // 循环处理
- foreach ($data as $value) {
- // 重组数据
- $list[$value['product_id']]= $value;
- }
- // 返回结果
- return $list;
- }
- /**
- * 通过产品id查询活动
- *
- */
- public function getListById($productId)
- {
- $time = time();
- $where = [
- ['promo.status','=','0'],
- ['promo.start_time','<=',$time],
- ['promo.end_time','>=',$time],
- ['promo_product.status','=',0],
- ['promo_product.product_id','=',$productId],
- ];
- $data = $this->query()
- ->join('promo','promo.id','=','promo_product.promo_id')
- ->where($where)
- ->select('promo.*','promo_product.product_id','promo_product.id as promo_product_id')
- ->first();
- // 返回结果
- return $data;
- }
- /**
- * 获取优惠券扣减金额
- *
- */
- public function getRebatePrice($productIds,$uid,$productPrice,$cityId,$tags){
- // 如果有产品
- if( !$productIds ) return ['is_used'=>0,'product_price'=>$productPrice,'rebate_product'=>[]];
- // 获取产品活动
- $promoList = $this->getListByIds($productIds);
- $promoProductList = [];
- foreach ($promoList as $promoInfo) {
- $promoInfoCity = [];
- if ($promoInfo['city_ids']){
- $promoInfoCity = explode(',',$promoInfo['city_ids']);
- }
- $promoInfo['price_total'] = $productPrice[$promoInfo['product_id']]['price_total'];
- // 判断是不是可以参与
- if (!$promoInfoCity || in_array($cityId, $promoInfoCity)) {
- if ($promoInfo['tag_scope']) {
- // 解析数组
- $promoInfo['tag_scope'] = explode(',', $promoInfo['tag_scope']);
- // 标签范围限定时,默认不能参与
- $allowJoin = 0;
- // 判断标签是不是存在
- if ($tags) {
- foreach ($tags as $v) {
- // 标签范围内,允许参加
- if (in_array($v['name'], $promoInfo['tag_scope'])) $allowJoin = 1;
- }
- // 在范围
- if ($allowJoin) {
- $promoProductList[$promoInfo['id']][] = $promoInfo;
- }
- }
- } else {
- $promoProductList[$promoInfo['id']][] = $promoInfo;
- }
- }
- }
- if( !$promoProductList ) return ['is_used'=>0,'product_price'=>$productPrice,'rebate_product'=>[]];
- $reductionTotal = 0;
- $promoRebateIds = [];
- foreach ($promoProductList as $key => $value){
- $reduction = 0;
- $priceSum = array_sum(array_column($value,'price_total'));
- if ($priceSum >= $value[0]['std_pay']) {
- switch ($value[0]['rebate_type']){
- case 1:
- $reduction = $value[0]['rebate'];
- $reductionTotal += $value[0]['rebate'];
- break;
- case 2:
- $reduction = $priceSum - number_format($priceSum * $value[0]['rebate']/10,2);
- $reductionTotal += $priceSum - number_format($priceSum * $value[0]['rebate']/10,2);
- break;
- case 3:
- $promoRebateIds[] = $key;
- }
- }
- if ($reduction){
- foreach ($value as $k=>$v){
- // 优惠价格 = 价格占总价的比例 * 优惠的总价
- $productPrice[$v['product_id']]['promo_rebate_price'] = number_format( $reduction * ($productPrice[$v['product_id']]['price_total'] / $priceSum) , 2 , '.' ,'');
- }
- }
- }
- //如果有赠品
- $list = [];
- if ($promoRebateIds){
- $promoRebateList = PromoRebate::query()
- ->join('product','promo_rebate.product_id','=','product.id')
- ->where('status','=',0)
- ->whereIn('promo_id',$promoRebateIds)
- ->select(['promo_rebate.id as promo_rebate_id','promo_rebate.rebate_num as buy_num','product.id as product_id','product.stock','product.business_id','product.spec','product.thumb','product.name','product.price','product.market_price','product.status as product_status','product.spec as sku_attr_names'])
- ->get()
- ->toArray();
- if ($promoRebateList){
- foreach ($promoRebateList as $value){
- // 库存超出的时候
- if($value['buy_num'] > $value['stock'] && $value['stock'] > 0) $value['buy_num'] = $value['stock'];
- $value['price_total'] = $value['price'] * $value['buy_num'];
- $value['pay_total'] = 0;
- $value['coupon_total']= 0;
- $list[$value['business_id']][] = $value;
- }
- }
- }
- // 返回扣减结果
- return ['product_price'=>$productPrice,'rebate_product'=>$list,'reduction_total'=>$reductionTotal];
- }
- }
|