123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 |
- <?php
- // +----------------------------------------------------------------------
- // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
- // +----------------------------------------------------------------------
- // | Author: 萤火科技 <admin@yiovo.com>
- // +----------------------------------------------------------------------
- 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;
- }
- }
|