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]; } }