123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- <?php
- namespace addons\shopro\controller\activity;
- use addons\shopro\controller\Common;
- use think\Db;
- class Kan extends Common
- {
- protected $noNeedLogin = ['kan_productsku_list', 'kan_info'];
- protected $noNeedRight = ['*'];
- //砍价商品列表
- public function kan_productsku_list(){
- $category_id = $this->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);
- }
- }
|