request->param('category_id'); $list = Db::name('shopro_activity_sku_price')->alias('asp') ->field([ 'asp.activity_id','asp.goods_sku_price_id','asp.goods_id','asp.price','asp.stock', 'a.rules', 'g.title','g.image', 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price'] ) ->join('shopro_activity a','asp.activity_id = a.id','LEFT') ->join('shopro_goods g' ,'asp.goods_id = g.id','LEFT') ->join('shopro_goods_sku_price gsp','asp.goods_sku_price_id = gsp.id','LEFT') ->where('asp.status','up') ->where('a.deletetime',NULL)->where('a.type','kan') ->where('g.deletetime',NULL)->whereIn('g.status', ['up', 'hidden']) ->where('gsp.status','up'); if(!empty($category_id)){ $list->where('find_in_set(:category_ids,g.category_ids)', ['category_ids' => $category_id]); } $list = $list->order('a.end_time asc')->autopage()->select(); $list = list_domain_image($list,['image','sku_image']); foreach($list as $key => $val){ //sku图片代替主图 if(!empty($val['sku_image'])){ $val['image'] = $val['sku_image']; } unset($val['sku_image']); $val['team_num'] = json_decode($val['rules'],true)['team_num'];//砍价人数上限 unset($val['rules']); $list[$key] = $val; } $this->success('获取成功',$list); } //发起砍价 public function kan_newone(){ $user = auth_user(); $nowtime = time(); $goods_id = $this->request->param('goods_id'); $goods_sku_price_id = $this->request->param('goods_sku_price_id'); $activity_id = $this->request->param('activity_id'); //活动 $activity = Db::name('shopro_activity')->where('type','kan')->where('deletetime',NULL)->where('id',$activity_id)->find(); if(empty($activity)){ $this->error('不存在的砍价活动'); } if($activity['end_time'] < time()){ $this->error('该砍价活动已结束'); } $rules = json_decode($activity['rules'],true); //活动商品 $map_sku = [ 'activity_id' => $activity_id, 'goods_id' => $goods_id, 'goods_sku_price_id' => $goods_sku_price_id, 'status' => 'up', ]; $activity_sku_price = Db::name('shopro_activity_sku_price')->where($map_sku)->find(); if(empty($activity_sku_price)){ $this->error('不存在的活动商品'); } if($activity_sku_price['sales'] >= $activity_sku_price['stock']){ $this->error('该活动商品已售罄'); } //限购 $map_can = [ 'user_id' => $user['id'], 'activity_id' => $activity_id, 'goods_id' => $goods_id, 'goods_sku_price_id' => $goods_sku_price_id, 'status' => ['IN',['ing','finish','finish_fictitious']], ]; $check = Db::name('shopro_activity_kan')->where($map_can)->count(); if($check >= $rules['limit_num']){ $this->error('当前活动中此商品限制砍价'.$rules['limit_num'].'次'); } //写入 $data = [ 'user_id' => $user['id'], 'goods_id' => $goods_id, 'goods_sku_price_id' => $goods_sku_price_id, 'activity_id' => $activity_id, 'num' => $rules['team_num'], 'current_num' => 0, 'status' => 'ing', 'expire_time' => $nowtime + $rules['valid_time']*3600, 'finish_time' => 0, 'createtime' => $nowtime, 'updatetime' => $nowtime, 'total_kan_price' => 0, 'activity_sku_price' => $activity_sku_price['price'], ]; $kan_id = Db::name('shopro_activity_kan')->insertGetId($data); $this->success('发起成功',$kan_id); } //帮好友砍价 public function kan_kan(){ $kan_id = $this->request->param('kan_id',0,'intval'); if(!$kan_id){ $this->error(); } // $user = auth_user(); $nowtime = time(); //一人只能砍一次 $map_check = [ 'user_id' => $user['id'], 'kan_id' => $kan_id, ]; $check = Db::name('shopro_activity_kan_log')->where($map_check)->find(); if($check){ $this->error('您已经砍过一次了'); } Db::startTrans(); //此次砍价 $kan = Db::name('shopro_activity_kan')->where('id',$kan_id)->lock(true)->find(); if($kan['user_id'] == $user['id']){ Db::rollback(); $this->error('不能砍自己发起的砍价'); } if(empty($kan)){ Db::rollback(); $this->error('不存在的砍价活动'); } if($kan['status'] == 'invalid'){ Db::rollback(); $this->error('此次砍价已过期,不需要再砍啦!'); } if($kan['status'] != 'ing'){ Db::rollback(); $this->error('此次砍价已完成,不需要再砍啦!'); } if($kan['current_num'] >= $kan['num']){ Db::rollback(); $this->error('已经达到最高砍价人数,不需要再砍啦!'); } //商品原价 $goods_sku_price = Db::name('shopro_goods_sku_price')->where('id',$kan['goods_sku_price_id'])->find(); //总差价 = 商品原价 - 活动低价 $cha_price = bcsub($goods_sku_price['price'],$kan['activity_sku_price'],2); if($cha_price <= 0){$cha_price = 0;} //还能砍的剩余价 = 总差价 - 已经砍掉的价 $remain_price = bcsub($cha_price,$kan['total_kan_price'],2); if($remain_price <= 0){$remain_price = 0;} //本次能砍掉的价格 $kan_price = 0; $is_last = 0; if($kan['num'] - $kan['current_num'] == 1){ //最后一砍 $kan_price = $remain_price; $is_last = 1; }else{ //每次砍价的平均数 $pingjun_price = bcdiv($cha_price,$kan['num'],2); //上下100分钱的浮动 $min = $pingjun_price*100 - 100; if($min <= 0){$min = 0;} $max = $pingjun_price*100 + 100; $kan_price = bcdiv(rand($min,$max),100,2); //一般最后一次的时候 浮动过大,最后一砍,直接强制结束 if($kan_price >= $remain_price){ $kan_price = $remain_price; $is_last = 1; } } //日志 $log_data = [ 'user_id' => $user['id'], 'nickname' => $user['nickname'], 'avatar' => $user['avatar'], 'kan_id' => $kan_id, 'activity_id' => $kan['activity_id'], 'kan_price' => $kan_price, 'createtime' => $nowtime, 'updatetime' => $nowtime, ]; $log_id = Db::name('shopro_activity_kan_log')->insertGetId($log_data); if(!$log_id){ Db::rollback(); $this->error('砍价失败了'); } //砍价修改 $update = [ 'current_num' => $kan['current_num'] + 1, 'updatetime' => $nowtime, 'total_kan_price' => $kan['total_kan_price'] + $kan_price, ]; if($is_last == 1){ $update['status'] = 'finish'; $update['finish_time'] = $nowtime; }; $rs_update = Db::name('shopro_activity_kan')->where('id',$kan_id)->update($update); if(!$rs_update){ Db::rollback(); $this->error('砍价失败了'); } Db::commit(); $this->success('砍价成功'); } //某个已发起的砍价详情 public function kan_info(){ $kan_id = $this->request->param('kan_id',0,'intval'); if(!$kan_id){ $this->error(); } $user = auth_user(); $kan = Db::name('shopro_activity_kan')->alias('kan') ->field(['kan.*', 'g.title','g.image', 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price', ]) ->join('shopro_goods g','kan.goods_id = g.id','LEFT') ->join('shopro_goods_sku_price gsp','kan.goods_sku_price_id = gsp.id','LEFT') ->where('kan.id',$kan_id) ->find(); $kan = info_domain_image($kan,['image','sku_image']); $kan['expire_seconds'] = $kan['expire_time'] - time(); if($kan['expire_seconds'] < 0){$kan['expire_seconds'] = 0;} $kan['remain_price'] = bcsub(bcsub($kan['old_price'],$kan['activity_sku_price'],2),$kan['total_kan_price'],2); if($kan['remain_price'] < 0){$kan['remain_price'] = 0;} $kan['now_buy_price'] = bcsub($kan['old_price'],$kan['total_kan_price'],2); if($kan['now_buy_price'] < 0){$kan['now_buy_price'] = 0;} if(!empty($kan['sku_image'])){ $kan['image'] = $kan['sku_image']; } $kan['is_my'] = $kan['user_id'] == $user['id'] ? 1 : 0; //砍价记录 $kan_log = Db::name('shopro_activity_kan_log')->where('kan_id',$kan_id)->order('id asc')->select(); $kan_log = list_domain_image($kan_log,['avatar']); //我有没有砍过 $my_kan = null; foreach($kan_log as $key => $log){ if($log['user_id'] == $user['id']){ $my_kan = $log; } } $result = [ 'activity' => $kan, 'log' => $kan_log, 'my_kan' => $my_kan, ]; $this->success('获取成功',$result); } //我发起的砍价列表 public function kan_my_list(){ $status = $this->request->param('status','','trim'); $user = auth_user(); $map = [ 'kan.user_id' => $user['id'], ]; if(in_array($status,['invalid','ing','finish'])){ $map['kan.status'] = $status; } $list = Db::name('shopro_activity_kan')->alias('kan') ->field(['kan.*', 'g.title','g.image', 'gsp.goods_sku_text','gsp.image as sku_image','gsp.price as old_price', ]) ->join('shopro_goods g','kan.goods_id = g.id','LEFT') ->join('shopro_goods_sku_price gsp','kan.goods_sku_price_id = gsp.id','LEFT') ->where($map) ->order('kan.id desc')->autopage()->select(); $list = list_domain_image($list,['image','sku_image']); foreach($list as $key => $kan){ $kan['seconds'] = $kan['expire_time'] - time(); if($kan['seconds'] < 0){$kan['seconds'] = 0;} $kan['remain_price'] = bcsub(bcsub($kan['old_price'],$kan['activity_sku_price'],2),$kan['total_kan_price'],2); if($kan['remain_price'] < 0){$kan['remain_price'] = 0;} $kan['now_buy_price'] = bcsub($kan['old_price'],$kan['total_kan_price'],2); if($kan['now_buy_price'] < 0){$kan['now_buy_price'] = 0;} if(!empty($kan['sku_image'])){ $kan['image'] = $kan['sku_image']; } $list[$key] = $kan; } $this->success(1,$list); } }