// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\api\controller; use app\common\model\kjactivity\KjActivity as KjActivityModel; use app\common\model\kjactivity\KjActivityJoin as KjActivityJoinModel; use app\common\model\kjactivity\KjActivityGood as KjActivityGoodModel; use app\common\model\kjactivity\KjActivityHelp as KjActivityHelpModel; use app\common\service\Export as ExportService; use think\facade\Validate; use app\api\model\Goods as GoodsModel; use app\common\model\GoodsSku; use app\common\library\helper; use app\api\service\User as UserService; use app\common\model\User; use think\facade\Db; use app\common\model\Order; use app\api\model\subscribe\WechatSub; use app\api\model\kj\KjActivityJoin as KjActivityJoinApiModel; /** * 活动中心 ▸ 砍价 * Class Files * @package app\store\controller */ class KjActivity extends Controller { public function info(int $activity_id = 0,int $join_id = 0){ // $userId = UserService::getCurrentLoginUserId(false); $user = UserService::getCurrentLoginUser(false); $userId = $user->user_id??0; $activity = KjActivityModel::where("id",$activity_id)->find(); if(empty($activity)){ return $this->renderError("活动不存在"); } // if(!isset($activity->status)||$activity->status!=1){ // $activity = KjActivityModel::getCurrent(); // if(empty($activity)){ // return $this->renderError("活动已结束"); // } // } $join = null; $now = Date("Y-m-d H:i:s",time()); $data['now'] = $now; if($userId){ $filter['activity_id'] = $activity->id; $filter['user_id'] = $userId; if($join_id>0){ $filter['id'] = $join_id; } $join = KjActivityJoinModel::where($filter)->order('id','desc')->with(['help'])->find(); if($join&&$now>$join->end_time){ if($join->kj_type==1){ $join->status = 1; $join->save(); } if($join->kj_type==2){ if($join->status==0){ $join->status = 2; $join->save(); } } $this->push($join->user_id,$join->activity_id,$join->id); } if($join&&$join->order_id>0&&$join->is_pay==0){ $order = Order::where('order_id','=',$join->order_id)->find(); if($order){ if($order->pay_status==20){ $join->is_pay = 1; $join->save(); } if($order->order_status==20){ $join->is_pay = 2; $join->save(); } } } } if(($join&&$join->is_pay==2)||($join&&$join->is_pay==1)){ unset($join->help); $join['help'] =[]; } $kjgoods = KjActivityGoodModel::where('activity_id',$activity->id)->find(); if(empty($kjgoods)){ return $this->renderError("缺少砍价商品信息"); } $goods_id = $kjgoods['goods_id']; $payCnt = KjActivityJoinModel::where('activity_id',$activity->id)->where("user_id",$userId)->count(); $activity->hn_fq_count = $activity->fq_count - $payCnt; $data['activity'] = $activity; $data['join'] = $join; $data['goods'] = $this->goods($goods_id,$kjgoods['low_price'],$kjgoods['limit_stock'] - $kjgoods['purchase_stock']); return $this->renderSuccess(compact('data')); } //商品 public function goods($goods_id,$low_price, $over_stock){ $user = UserService::getCurrentLoginUser(); $goodsModel = new GoodsModel; $goodsInfo = $goodsModel->getDetails($goods_id, $user,0, 0); $goods['goods_id'] = $goodsInfo['goods_id']; $goods['goods_name'] = $goodsInfo['goods_name']??''; $goods['goods_price'] = $goodsInfo['goods_price_min']; $goods['low_price'] = $low_price; $goods['over_stock'] = $over_stock; $goods['line_price'] = $goodsInfo['line_price_min']; $goods['goods_image'] =$goodsInfo['goods_image']; return $goods; } //发起接口 public function join(int $activity_id=0){ $activity = KjActivityModel::where("id",$activity_id)->find(); if(!isset($activity->status)||$activity->status!=1){ return $this->renderError("活动已结束"); } $activity_id = $activity->id; $goods = $userId = UserService::getCurrentLoginUserId(); $filter['activity_id'] = $activity_id; $filter['user_id'] = $userId; $fq_count = KjActivityJoinModel::where($filter)->count(); if($fq_count>=$activity->fq_count){ return $this->renderError("你发起的砍价次数超过系统设置"); } $join = KjActivityJoinModel::where($filter)->find(); if($join&&$join->status==0){ return $this->renderError("你有一个正在进行中的砍价"); } if($join&&$join->is_pay==0&&$join->order_id>0){ return $this->renderError("你有一个待支付订单"); } else{ $kjgoods = KjActivityGoodModel::where('activity_id',$activity_id)->find(); if(empty($kjgoods)){ return $this->renderError("缺少砍价商品 信息"); } if($kjgoods['residue_stock']<=0){ return $this->renderError("砍价库存不足"); } $goods_id = $kjgoods['goods_id']; $goods = GoodsModel::where("goods_id",$goods_id)->find(); $data['activity_id'] = $activity->id; $data['user_id'] = $userId; $data['goods_id'] = $kjgoods['goods_id']; $data['goods_name'] = $goods['goods_name']??''; $data['goods_price'] = $goods['goods_price_min']; $data['goods_sku_id'] = $kjgoods['goods_sku_id']; $data['goods_sku_no'] = $kjgoods['goods_sku_no']; $data['low_price'] = $kjgoods['low_price']; $data['line_price'] = $goods['line_price_min']; $data['help_kj_up_cnt'] =$kjgoods['help_kj_up_cnt']; $data['kj_type'] = $activity->kj_type; $data['end_time'] = Date("Y-m-d H:i:s",time()+$activity->expire_hour*60*60); $self_kj_price =helper::bcsub(($goods['goods_price_min'] - $kjgoods['low_price'])*($activity->self_kj_percent/100),0,2); $data['kj_price'] = helper::bcsub($goods['goods_price_min'] - $self_kj_price,0,2); $num = $kjgoods['help_kj_up_cnt']; $a_price = ($data['kj_price'] - $kjgoods['low_price'])*100;//保存可砍价格 if($a_price<=0){ return $this->renderError("发起砍价异常"); } // 单位为分 $res = $this->create_rand_array($num,$a_price); $data['remark_json'] = json_encode($res); $join = new KjActivityJoinModel; $join->save($data); unset($data); } $join = KjActivityJoinModel::where($filter)->order('id','desc')->find(); $data['join'] = $join; return $this->renderSuccess(compact('data')); } public function helpinfo(int $join_id){ $userId = UserService::getCurrentLoginUserId(); $filter['id'] = $join_id; $join = KjActivityJoinModel::where($filter)->with(['help'])->find(); $now = Date("Y-m-d H:i:s",time()); if($join&&$now>$join->end_time){ if($join->kj_type==1){ $join->status = 1; $join->save(); } if($join->kj_type==2){ if($join->status==0){ $join->status = 2; $join->save(); } } } if(empty($join)){ return $this->renderError("找不到信息"); } $myjoin = KjActivityJoinModel::where("user_id",$userId)->find(); $one = KjActivityHelpModel::where("user_id",$userId)->where('join_id',$join_id)->find(); $activity = KjActivityModel::where("id",$join->activity_id)->find(); $kjgoods = KjActivityGoodModel::where('activity_id',$activity->id)->find(); if(empty($kjgoods)){ return $this->renderError("缺少砍价商品信息"); } $goods_id = $kjgoods['goods_id']; $data['activity'] = $activity; $data['my_help'] = $one; $data['is_join'] = $myjoin?true:false; $data['join'] = $join; $data['goods'] = $this->goods($goods_id,$kjgoods['low_price'],$kjgoods['limit_stock'] - $kjgoods['purchase_stock']); return $this->renderSuccess(compact('data')); } //推送砍价结果 public function push($user_id,$activity_id,$join_id){ $kjgoods = KjActivityGoodModel::where('activity_id',$activity_id)->find(); $goods_name = ''; $goods_id = $kjgoods['goods_id']??0; if($goods_id>0){ $goods_name = GoodsModel::where('goods_id',$goods_id)->value("goods_name"); } $template_type = 'kj_finish'; $sub = new WechatSub($template_type); $page = 'pages/activity/pages/bargain/index/index?activity_id='.$activity_id."&join_id=".$join_id; $data= ['thing1'=>["value"=>$goods_name],'thing3'=>["value"=>"活动已结束,去看看活动结果"]]; $res = $sub->pushSub($user_id,$page,$data); return $res; } //觉得价格美丽,不砍价了 public function stopkj($join_id){ $userId = UserService::getCurrentLoginUserId(); $filter['id'] = $join_id; $join = KjActivityJoinModel::where($filter)->with(['help'])->find(); if(empty($join)){ return $this->renderError("找不到信息"); } if($join->user_id!=$userId){ return $this->renderError("信息出错了"); } $activity = KjActivityModel::where("id",$join->activity_id)->find(); if($activity->kj_type==2){ if($join->kj_price>$join->low_price){ return $this->renderError("必须砍到底价才行"); } } if($join->status==2){ return $this->renderError("砍价失败了"); } if($join->status==1){ return $this->renderError("请不要重复操作"); } $join->status = 1; $join->save(); return $this->renderSuccess(); } //帮砍价 public function help(int $join_id){ $userId = UserService::getCurrentLoginUserId(); $filter['id'] = $join_id; Db::startTrans(); $join = KjActivityJoinModel::where($filter)->lock("for update")->find(); if(empty($join)){ Db::rollback(); return $this->renderError("找不到砍价信息"); } if($join->forbidden==1){ Db::rollback(); return $this->renderError("刷量禁止中"); } $activity = KjActivityModel::where("id",$join->activity_id)->lock("for update")->find(); $today = Date("Y-m-d",time())." 00:00:00"; $count = KjActivityHelpModel::where("user_id",$userId)->where("create_time",'>',$today)->where('activity_id',$join->activity_id)->count(); if($count>=$activity['limit_kj_day_cnt']){ return $this->renderError("同一用户每日最多可帮助".$activity['limit_kj_day_cnt']."位好友砍价"); } $one = KjActivityHelpModel::where("user_id",$userId)->where('join_id',$join_id)->find(); if($one){ return $this->renderError("你已经帮砍过价了"); } if($join['user_id']==$userId){ return $this->renderError("自己不能帮自己砍价"); } if($join['status']==2){ return $this->renderError("砍价失败了"); } if($join['status']==1){ return $this->renderError("砍价已结束"); } $now = Date("Y-m-d H:i:s",time()); if($now>$join['end_time']){ return $this->renderError("砍价已过期"); } if($join['help_cnt']>=$join['help_kj_up_cnt']){ return $this->renderError("帮砍价人数已到上限"); } if($join['low_price']>=$join['kj_price']){ return $this->renderError("已经砍到底价了"); } $remarkJson = $join['remark_json']; $arr = json_decode($remarkJson,true); $help_price = array_shift($arr); $help_price = helper::bcsub($help_price/100,0,2); if($join['low_price']>$join['kj_price'] - $help_price){ $help_price = $join['kj_price'] - $join['low_price']; } //如果是最后一个了 if($join->help_kj_up_cnt==$join->help_cnt+1){ $help_price = $join['kj_price'] - $join['low_price']; } $help_price = helper::bcsub($help_price,0,2); if($help_price<=0){ return $this->renderError("砍价出错了"); } $data['activity_id'] = $join['activity_id']; $data['join_id'] = $join['id']; $data['user_id'] = $userId; $data['help_price'] = $help_price; $help = new KjActivityHelpModel; $help->save($data); $join->remark_json = json_encode($arr); $join->help_cnt = $join['help_cnt'] + 1; $join->kj_price = $join['kj_price'] - $help_price; // 砍到底了 if(($join['kj_price'] - $help_price)==$join['low_price']){ $join->status = 1; } //砍价人数到上限了 if($join->help_kj_up_cnt==$join->help_cnt){ $join->status = 1; } $join->save(); Db::commit(); if($join->status==1){ //砍价完成 $this->push($join->user_id,$join->activity_id,$join->id); } $j = new KjActivityJoinApiModel; $j->lastHelpAdd($join->id,$userId); $c = $j->lastHelp($join->id,5);//过去5秒的砍价用户数量 if(count($c)>=5){ KjActivityJoinModel::where('id',$join->id)->update(['forbidden'=>1]); } return $this->renderSuccess(compact('data')); } public function test(){ // $money = $_GET['money']??100; // $num = $_GET['num']??10; // $arr = $this->create_rand_array($num,$money); // return $this->renderSuccess(compact('arr')); // $res = array_sum($arr); // var_dump($arr); // var_dump($res); $res = $this->push(228882,95,113); var_dump($res); } //生成随机数 public function create_rand_array($n, $max = 100){ if ($n <= 1) { return [$max]; } $array = $zero = $normal = []; for ($i = 1; $i <= $n; $i++) { $array[] = mt_rand(0, 100); } $k = $max / array_sum($array); //求出放大系数k foreach ($array as $key => $val) { $value = floor($val * $k); //直接保留整数,以保证下一步的和肯定<100 if ($value < 1) { $zero[] = $value; } else { $normal[] = $value; } } $sum = array_sum($normal); $diff = $max - $sum; //这个值肯定<100 if (!empty($zero)) { //如果有为0的值 $count = count($zero); foreach ($zero as $z) { $normal[] = $diff / $count; } } else { //随机分配给一个人 $key = array_rand($normal); $normal[$key] = $normal[$key] + $diff; } unset($array, $zero, $sum, $diff); return $normal; } }