KjActivity.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types = 1);
  12. namespace app\api\controller;
  13. use app\common\model\kjactivity\KjActivity as KjActivityModel;
  14. use app\common\model\kjactivity\KjActivityJoin as KjActivityJoinModel;
  15. use app\common\model\kjactivity\KjActivityGood as KjActivityGoodModel;
  16. use app\common\model\kjactivity\KjActivityHelp as KjActivityHelpModel;
  17. use app\common\service\Export as ExportService;
  18. use think\facade\Validate;
  19. use app\api\model\Goods as GoodsModel;
  20. use app\common\model\GoodsSku;
  21. use app\common\library\helper;
  22. use app\api\service\User as UserService;
  23. use app\common\model\User;
  24. use think\facade\Db;
  25. use app\common\model\Order;
  26. use app\api\model\subscribe\WechatSub;
  27. use app\api\model\kj\KjActivityJoin as KjActivityJoinApiModel;
  28. /**
  29. * 活动中心 ▸ 砍价
  30. * Class Files
  31. * @package app\store\controller
  32. */
  33. class KjActivity extends Controller
  34. {
  35. public function info(int $activity_id = 0,int $join_id = 0){
  36. // $userId = UserService::getCurrentLoginUserId(false);
  37. $user = UserService::getCurrentLoginUser(false);
  38. $userId = $user->user_id??0;
  39. $activity = KjActivityModel::where("id",$activity_id)->find();
  40. if(empty($activity)){
  41. return $this->renderError("活动不存在");
  42. }
  43. // if(!isset($activity->status)||$activity->status!=1){
  44. // $activity = KjActivityModel::getCurrent();
  45. // if(empty($activity)){
  46. // return $this->renderError("活动已结束");
  47. // }
  48. // }
  49. $join = null;
  50. $now = Date("Y-m-d H:i:s",time());
  51. $data['now'] = $now;
  52. if($userId){
  53. $filter['activity_id'] = $activity->id;
  54. $filter['user_id'] = $userId;
  55. if($join_id>0){
  56. $filter['id'] = $join_id;
  57. }
  58. $join = KjActivityJoinModel::where($filter)->order('id','desc')->with(['help'])->find();
  59. if($join&&$now>$join->end_time){
  60. if($join->kj_type==1){
  61. $join->status = 1;
  62. $join->save();
  63. }
  64. if($join->kj_type==2){
  65. if($join->status==0){
  66. $join->status = 2;
  67. $join->save();
  68. }
  69. }
  70. $this->push($join->user_id,$join->activity_id,$join->id);
  71. }
  72. if($join&&$join->order_id>0&&$join->is_pay==0){
  73. $order = Order::where('order_id','=',$join->order_id)->find();
  74. if($order){
  75. if($order->pay_status==20){
  76. $join->is_pay = 1;
  77. $join->save();
  78. }
  79. if($order->order_status==20){
  80. $join->is_pay = 2;
  81. $join->save();
  82. }
  83. }
  84. }
  85. }
  86. if(($join&&$join->is_pay==2)||($join&&$join->is_pay==1)){
  87. unset($join->help);
  88. $join['help'] =[];
  89. }
  90. $kjgoods = KjActivityGoodModel::where('activity_id',$activity->id)->find();
  91. if(empty($kjgoods)){
  92. return $this->renderError("缺少砍价商品信息");
  93. }
  94. $goods_id = $kjgoods['goods_id'];
  95. $payCnt = KjActivityJoinModel::where('activity_id',$activity->id)->where("user_id",$userId)->count();
  96. $activity->hn_fq_count = $activity->fq_count - $payCnt;
  97. $data['activity'] = $activity;
  98. $data['join'] = $join;
  99. $data['goods'] = $this->goods($goods_id,$kjgoods['low_price'],$kjgoods['limit_stock'] - $kjgoods['purchase_stock']);
  100. return $this->renderSuccess(compact('data'));
  101. }
  102. //商品
  103. public function goods($goods_id,$low_price, $over_stock){
  104. $user = UserService::getCurrentLoginUser();
  105. $goodsModel = new GoodsModel;
  106. $goodsInfo = $goodsModel->getDetails($goods_id, $user,0, 0);
  107. $goods['goods_id'] = $goodsInfo['goods_id'];
  108. $goods['goods_name'] = $goodsInfo['goods_name']??'';
  109. $goods['goods_price'] = $goodsInfo['goods_price_min'];
  110. $goods['low_price'] = $low_price;
  111. $goods['over_stock'] = $over_stock;
  112. $goods['line_price'] = $goodsInfo['line_price_min'];
  113. $goods['goods_image'] =$goodsInfo['goods_image'];
  114. return $goods;
  115. }
  116. //发起接口
  117. public function join(int $activity_id=0){
  118. $activity = KjActivityModel::where("id",$activity_id)->find();
  119. if(!isset($activity->status)||$activity->status!=1){
  120. return $this->renderError("活动已结束");
  121. }
  122. $activity_id = $activity->id;
  123. $goods =
  124. $userId = UserService::getCurrentLoginUserId();
  125. $filter['activity_id'] = $activity_id;
  126. $filter['user_id'] = $userId;
  127. $fq_count = KjActivityJoinModel::where($filter)->count();
  128. if($fq_count>=$activity->fq_count){
  129. return $this->renderError("你发起的砍价次数超过系统设置");
  130. }
  131. $join = KjActivityJoinModel::where($filter)->find();
  132. if($join&&$join->status==0){
  133. return $this->renderError("你有一个正在进行中的砍价");
  134. }
  135. if($join&&$join->is_pay==0&&$join->order_id>0){
  136. return $this->renderError("你有一个待支付订单");
  137. }
  138. else{
  139. $kjgoods = KjActivityGoodModel::where('activity_id',$activity_id)->find();
  140. if(empty($kjgoods)){
  141. return $this->renderError("缺少砍价商品 信息");
  142. }
  143. if($kjgoods['residue_stock']<=0){
  144. return $this->renderError("砍价库存不足");
  145. }
  146. $goods_id = $kjgoods['goods_id'];
  147. $goods = GoodsModel::where("goods_id",$goods_id)->find();
  148. $data['activity_id'] = $activity->id;
  149. $data['user_id'] = $userId;
  150. $data['goods_id'] = $kjgoods['goods_id'];
  151. $data['goods_name'] = $goods['goods_name']??'';
  152. $data['goods_price'] = $goods['goods_price_min'];
  153. $data['goods_sku_id'] = $kjgoods['goods_sku_id'];
  154. $data['goods_sku_no'] = $kjgoods['goods_sku_no'];
  155. $data['low_price'] = $kjgoods['low_price'];
  156. $data['line_price'] = $goods['line_price_min'];
  157. $data['help_kj_up_cnt'] =$kjgoods['help_kj_up_cnt'];
  158. $data['kj_type'] = $activity->kj_type;
  159. $data['end_time'] = Date("Y-m-d H:i:s",time()+$activity->expire_hour*60*60);
  160. $self_kj_price =helper::bcsub(($goods['goods_price_min'] - $kjgoods['low_price'])*($activity->self_kj_percent/100),0,2);
  161. $data['kj_price'] = helper::bcsub($goods['goods_price_min'] - $self_kj_price,0,2);
  162. $num = $kjgoods['help_kj_up_cnt'];
  163. $a_price = ($data['kj_price'] - $kjgoods['low_price'])*100;//保存可砍价格
  164. if($a_price<=0){
  165. return $this->renderError("发起砍价异常");
  166. }
  167. // 单位为分
  168. $res = $this->create_rand_array($num,$a_price);
  169. $data['remark_json'] = json_encode($res);
  170. $join = new KjActivityJoinModel;
  171. $join->save($data);
  172. unset($data);
  173. }
  174. $join = KjActivityJoinModel::where($filter)->order('id','desc')->find();
  175. $data['join'] = $join;
  176. return $this->renderSuccess(compact('data'));
  177. }
  178. public function helpinfo(int $join_id){
  179. $userId = UserService::getCurrentLoginUserId();
  180. $filter['id'] = $join_id;
  181. $join = KjActivityJoinModel::where($filter)->with(['help'])->find();
  182. $now = Date("Y-m-d H:i:s",time());
  183. if($join&&$now>$join->end_time){
  184. if($join->kj_type==1){
  185. $join->status = 1;
  186. $join->save();
  187. }
  188. if($join->kj_type==2){
  189. if($join->status==0){
  190. $join->status = 2;
  191. $join->save();
  192. }
  193. }
  194. }
  195. if(empty($join)){
  196. return $this->renderError("找不到信息");
  197. }
  198. $myjoin = KjActivityJoinModel::where("user_id",$userId)->find();
  199. $one = KjActivityHelpModel::where("user_id",$userId)->where('join_id',$join_id)->find();
  200. $activity = KjActivityModel::where("id",$join->activity_id)->find();
  201. $kjgoods = KjActivityGoodModel::where('activity_id',$activity->id)->find();
  202. if(empty($kjgoods)){
  203. return $this->renderError("缺少砍价商品信息");
  204. }
  205. $goods_id = $kjgoods['goods_id'];
  206. $data['activity'] = $activity;
  207. $data['my_help'] = $one;
  208. $data['is_join'] = $myjoin?true:false;
  209. $data['join'] = $join;
  210. $data['goods'] = $this->goods($goods_id,$kjgoods['low_price'],$kjgoods['limit_stock'] - $kjgoods['purchase_stock']);
  211. return $this->renderSuccess(compact('data'));
  212. }
  213. //推送砍价结果
  214. public function push($user_id,$activity_id,$join_id){
  215. $kjgoods = KjActivityGoodModel::where('activity_id',$activity_id)->find();
  216. $goods_name = '';
  217. $goods_id = $kjgoods['goods_id']??0;
  218. if($goods_id>0){
  219. $goods_name = GoodsModel::where('goods_id',$goods_id)->value("goods_name");
  220. }
  221. $template_type = 'kj_finish';
  222. $sub = new WechatSub($template_type);
  223. $page = 'pages/activity/pages/bargain/index/index?activity_id='.$activity_id."&join_id=".$join_id;
  224. $data= ['thing1'=>["value"=>$goods_name],'thing3'=>["value"=>"活动已结束,去看看活动结果"]];
  225. $res = $sub->pushSub($user_id,$page,$data);
  226. return $res;
  227. }
  228. //觉得价格美丽,不砍价了
  229. public function stopkj($join_id){
  230. $userId = UserService::getCurrentLoginUserId();
  231. $filter['id'] = $join_id;
  232. $join = KjActivityJoinModel::where($filter)->with(['help'])->find();
  233. if(empty($join)){
  234. return $this->renderError("找不到信息");
  235. }
  236. if($join->user_id!=$userId){
  237. return $this->renderError("信息出错了");
  238. }
  239. $activity = KjActivityModel::where("id",$join->activity_id)->find();
  240. if($activity->kj_type==2){
  241. if($join->kj_price>$join->low_price){
  242. return $this->renderError("必须砍到底价才行");
  243. }
  244. }
  245. if($join->status==2){
  246. return $this->renderError("砍价失败了");
  247. }
  248. if($join->status==1){
  249. return $this->renderError("请不要重复操作");
  250. }
  251. $join->status = 1;
  252. $join->save();
  253. return $this->renderSuccess();
  254. }
  255. //帮砍价
  256. public function help(int $join_id){
  257. $userId = UserService::getCurrentLoginUserId();
  258. $filter['id'] = $join_id;
  259. Db::startTrans();
  260. $join = KjActivityJoinModel::where($filter)->lock("for update")->find();
  261. if(empty($join)){
  262. Db::rollback();
  263. return $this->renderError("找不到砍价信息");
  264. }
  265. if($join->forbidden==1){
  266. Db::rollback();
  267. return $this->renderError("刷量禁止中");
  268. }
  269. $activity = KjActivityModel::where("id",$join->activity_id)->lock("for update")->find();
  270. $today = Date("Y-m-d",time())." 00:00:00";
  271. $count = KjActivityHelpModel::where("user_id",$userId)->where("create_time",'>',$today)->where('activity_id',$join->activity_id)->count();
  272. if($count>=$activity['limit_kj_day_cnt']){
  273. return $this->renderError("同一用户每日最多可帮助".$activity['limit_kj_day_cnt']."位好友砍价");
  274. }
  275. $one = KjActivityHelpModel::where("user_id",$userId)->where('join_id',$join_id)->find();
  276. if($one){
  277. return $this->renderError("你已经帮砍过价了");
  278. }
  279. if($join['user_id']==$userId){
  280. return $this->renderError("自己不能帮自己砍价");
  281. }
  282. if($join['status']==2){
  283. return $this->renderError("砍价失败了");
  284. }
  285. if($join['status']==1){
  286. return $this->renderError("砍价已结束");
  287. }
  288. $now = Date("Y-m-d H:i:s",time());
  289. if($now>$join['end_time']){
  290. return $this->renderError("砍价已过期");
  291. }
  292. if($join['help_cnt']>=$join['help_kj_up_cnt']){
  293. return $this->renderError("帮砍价人数已到上限");
  294. }
  295. if($join['low_price']>=$join['kj_price']){
  296. return $this->renderError("已经砍到底价了");
  297. }
  298. $remarkJson = $join['remark_json'];
  299. $arr = json_decode($remarkJson,true);
  300. $help_price = array_shift($arr);
  301. $help_price = helper::bcsub($help_price/100,0,2);
  302. if($join['low_price']>$join['kj_price'] - $help_price){
  303. $help_price = $join['kj_price'] - $join['low_price'];
  304. }
  305. //如果是最后一个了
  306. if($join->help_kj_up_cnt==$join->help_cnt+1){
  307. $help_price = $join['kj_price'] - $join['low_price'];
  308. }
  309. $help_price = helper::bcsub($help_price,0,2);
  310. if($help_price<=0){
  311. return $this->renderError("砍价出错了");
  312. }
  313. $data['activity_id'] = $join['activity_id'];
  314. $data['join_id'] = $join['id'];
  315. $data['user_id'] = $userId;
  316. $data['help_price'] = $help_price;
  317. $help = new KjActivityHelpModel;
  318. $help->save($data);
  319. $join->remark_json = json_encode($arr);
  320. $join->help_cnt = $join['help_cnt'] + 1;
  321. $join->kj_price = $join['kj_price'] - $help_price;
  322. // 砍到底了
  323. if(($join['kj_price'] - $help_price)==$join['low_price']){
  324. $join->status = 1;
  325. }
  326. //砍价人数到上限了
  327. if($join->help_kj_up_cnt==$join->help_cnt){
  328. $join->status = 1;
  329. }
  330. $join->save();
  331. Db::commit();
  332. if($join->status==1){
  333. //砍价完成
  334. $this->push($join->user_id,$join->activity_id,$join->id);
  335. }
  336. $j = new KjActivityJoinApiModel;
  337. $j->lastHelpAdd($join->id,$userId);
  338. $c = $j->lastHelp($join->id,5);//过去5秒的砍价用户数量
  339. if(count($c)>=5){
  340. KjActivityJoinModel::where('id',$join->id)->update(['forbidden'=>1]);
  341. }
  342. return $this->renderSuccess(compact('data'));
  343. }
  344. public function test(){
  345. // $money = $_GET['money']??100;
  346. // $num = $_GET['num']??10;
  347. // $arr = $this->create_rand_array($num,$money);
  348. // return $this->renderSuccess(compact('arr'));
  349. // $res = array_sum($arr);
  350. // var_dump($arr);
  351. // var_dump($res);
  352. $res = $this->push(228882,95,113);
  353. var_dump($res);
  354. }
  355. //生成随机数
  356. public function create_rand_array($n, $max = 100){
  357. if ($n <= 1) {
  358. return [$max];
  359. }
  360. $array = $zero = $normal = [];
  361. for ($i = 1; $i <= $n; $i++) {
  362. $array[] = mt_rand(0, 100);
  363. }
  364. $k = $max / array_sum($array); //求出放大系数k
  365. foreach ($array as $key => $val) {
  366. $value = floor($val * $k); //直接保留整数,以保证下一步的和肯定<100
  367. if ($value < 1) {
  368. $zero[] = $value;
  369. } else {
  370. $normal[] = $value;
  371. }
  372. }
  373. $sum = array_sum($normal);
  374. $diff = $max - $sum; //这个值肯定<100
  375. if (!empty($zero)) { //如果有为0的值
  376. $count = count($zero);
  377. foreach ($zero as $z) {
  378. $normal[] = $diff / $count;
  379. }
  380. } else { //随机分配给一个人
  381. $key = array_rand($normal);
  382. $normal[$key] = $normal[$key] + $diff;
  383. }
  384. unset($array, $zero, $sum, $diff);
  385. return $normal;
  386. }
  387. }