Activity.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  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\groupbuylb;
  13. use app\api\model\Goods as GoodsModel;
  14. use app\api\model\User as UserModel;
  15. use app\api\service\User as UserService;
  16. use app\common\enum\order\OrderStatus;
  17. use app\common\enum\order\PayType as OrderPayTypeEnum;
  18. use app\common\library\helper;
  19. use app\common\model\BrowseRecords;
  20. use app\api\controller\Controller;
  21. use app\api\model\groupbuylb\GroupBuyLbActivity;
  22. use app\api\model\groupbuylb\GroupBuyLbGoods;
  23. use app\api\model\groupbuylb\GroupBuyLbHelp;
  24. use app\api\model\groupbuylb\GroupBuyLbJoin;
  25. use think\facade\Db;
  26. use app\api\model\order\GroupBuyLbPay;
  27. use app\common\service\goods\source\Factory as StockFactory;
  28. use app\common\enum\order\OrderSource as OrderSourceEnum;
  29. /**
  30. * 活动
  31. * Class service
  32. * @package app\api\controller\user\order
  33. */
  34. class Activity extends Controller
  35. {
  36. //如果真有拼团不成功
  37. public function toCheckPtFail(){
  38. $now = Date("Y-m-d H:i:s",time());
  39. $joinList = GroupBuyLbJoin::where('status',0)->where('end_time','<',$now)->select();
  40. foreach($joinList as $row){
  41. if($row->people_count>$row->help_count){
  42. $join = GroupBuyLbJoin::where('id',$row->id)->lock('for update')->find();
  43. $join->status = 2;
  44. $join->save();
  45. //通知
  46. if($join->is_virtual==0){
  47. (new GroupBuyLbPay)->activityEnd($join->user_id,$join->id);
  48. }else{
  49. (new GroupBuyLbPay)->virtualActivityEnd($join->user_id,$join->id);
  50. }
  51. }
  52. }
  53. }
  54. //测试回退库存
  55. public function testStock(){
  56. $goods_id = 10137;
  57. $goods_sku_id = 0;
  58. $total_num = 1;
  59. // $res = StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($goods_id,$goods_sku_id,$total_num);
  60. // $res = StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSalesExpress($goods_id,$total_num);
  61. // var_dump($res);
  62. }
  63. public function cancel(int $order_id){
  64. $user = UserService::getCurrentLoginUser(true);
  65. Db::startTrans();
  66. $help = GroupBuyLbHelp::where("pay_state",0)->where('
  67. id',$order_id)->find();
  68. $k = 0;
  69. if($help){
  70. $help->pay_state = 2;
  71. $help->save();
  72. if($help->rice_card_id > 0){
  73. riceCardReturn($help->rice_card_id,$help->rice_card_money,$help->order_no,$help->pay_money);
  74. }
  75. $k++;
  76. $join = GroupBuyLbJoin::where('id',$help->join_id)->find();
  77. if($join){ //说明是团长发起的,但没有付款
  78. if($join->help_count == 0){
  79. $join->end_time = Date("Y-m-d H:i:s",time());
  80. $join->status = 3;
  81. $join->save();
  82. $k++;
  83. }
  84. }
  85. $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$help->group_buy_activity_id)->find();
  86. //取消订单 回退库存
  87. if($groupgoods){
  88. StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$help->goods_num);
  89. }
  90. }
  91. Db::commit();
  92. echo 'success:'.$k;
  93. }
  94. public function headPicture(){
  95. $host = env('APP_URL');
  96. $rel = rand(1,16);
  97. $url = $host.'/uploads/image/'.$rel.'.jpeg';
  98. return $url;
  99. }
  100. //自动补位逻辑
  101. public function toIncHelp(){
  102. $nts = time() + 3600;
  103. $now = Date("Y-m-d H:i:s",time());
  104. $time = Date("Y-m-d H:i:s",$nts);
  105. $list = GroupBuyLbJoin::where('status','=',0)->where('end_time','>',$now)->where('end_time','<',$time)->where('help_count','>',0)->select();
  106. $k = 0;
  107. foreach($list as $row){
  108. $group_buy_lb_activity_id = $row['group_buy_lb_activity_id'];
  109. $activity = GroupBuyLbActivity::where('id',$group_buy_lb_activity_id)->find();
  110. //这一拼团的真实付费用户有几个
  111. $real_pay_cnt = GroupBuyLbHelp::where('join_id',$row['id'])->where('pay_state',1)->where("fans",0)->where('is_virtual_join_user',0)->count();
  112. if($activity->tb_cnt>=0&&$real_pay_cnt>=$activity->tb_cnt){
  113. if($row['people_count']>$row['help_count']){
  114. $k++;
  115. //开始补位
  116. // Db::startTrans();
  117. $join = GroupBuyLbJoin::where('id',$row['id'])->find();
  118. $help['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id'];
  119. $help['join_id'] = $row['id'];
  120. $help['user_id'] = 0;
  121. $help['pay_state'] = 1;
  122. $help['pay_time'] = time();
  123. $help['order_id'] = -1;//补位的统一用-1
  124. $help['fans'] = 1;
  125. $help['goods_num'] = 0;
  126. $help['head_picture'] = $this->headPicture();
  127. $model = new GroupBuyLbHelp;
  128. $model->save($help);
  129. $join->help_count += 1; // 拼团人数+1
  130. $flag = false;
  131. //拼团人数够了
  132. if($join->help_count==$join->people_count){
  133. $flag = true;
  134. }
  135. $join->save();
  136. if($flag){ //成功了话写真实订单
  137. $pay = new GroupBuyLbPay;
  138. $pay->ptSuccessNotify($join->id);
  139. // Db::commit();
  140. }
  141. if($flag){
  142. $pay2 = new GroupBuyLbPay;
  143. $pay2->receiveCoupon($join->user_id,$join->group_buy_lb_activity_id);
  144. }
  145. }
  146. }
  147. }
  148. echo 'success:k:'.$k;
  149. }
  150. /**
  151. * 拼团裂变每小时自动补位逻辑zq
  152. * @throws \think\db\exception\DataNotFoundException
  153. * @throws \think\db\exception\DbException
  154. * @throws \think\db\exception\ModelNotFoundException
  155. */
  156. public function toIncHelpHourly(){
  157. $nts = time() - 600;
  158. $nts1 = time() - 2400;
  159. $now = Date("Y-m-d H:i:s",time());
  160. /* $list = GroupBuyLbJoin::where('status','=',0)->where('start_time','>',$now)
  161. ->where('end_time','<',$now)->where('help_count','>',0)
  162. ->select();*/
  163. $list = GroupBuyLbJoin::where('status','=',0)
  164. ->where('create_time','<=',$nts)
  165. //->where('create_time','>=',$nts1)
  166. ->where('end_time','>=',$now)
  167. ->where('help_count','>',0)
  168. ->order('id desc')
  169. ->select();
  170. //dd($list->toArray());
  171. $k = 0;
  172. $this->toIncHelpCommonTwo($list);
  173. echo 'success hourly:k:'.$k;
  174. }
  175. private function toIncHelpCommonTwo($list){
  176. $model = new GroupBuyLbHelp;
  177. $time = time();
  178. foreach($list as $row){
  179. $helps = [];
  180. $group_buy_lb_activity_id = $row['group_buy_lb_activity_id'];
  181. $activity = GroupBuyLbActivity::where('id',$group_buy_lb_activity_id)->where('need_fill_order',1)->find();
  182. if (!$activity){
  183. continue;
  184. }
  185. //这一拼团的真实付费用户有几个
  186. $real_pay_cnt = GroupBuyLbHelp::where('join_id',$row['id'])->where('pay_state',1)->where('user_id','>',0)->count();
  187. //dd($real_pay_cnt);
  188. if($real_pay_cnt<2){
  189. if($row['people_count']>$row['help_count']){
  190. // Db::startTrans();
  191. $join = GroupBuyLbJoin::where('id',$row['id'])->find();
  192. $help['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id'];
  193. $help['join_id'] = $row['id'];
  194. $help['user_id'] = 0;
  195. $help['pay_state'] = 1;
  196. $help['pay_time'] = time();
  197. $help['order_id'] = -1;//补位的统一用-1
  198. $help['fans'] = 1;
  199. $help['goods_num'] = 0;
  200. $help['create_time'] = $time;
  201. $help['update_time'] = $time;
  202. $help['head_picture'] = $this->headPicture();
  203. $helps[] = $help;
  204. if ($row['people_count'] - $row['help_count'] >= 2){//空位大于=2人补两个,其余补一个
  205. //$k++;
  206. //开始补位
  207. $help1['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id'];
  208. $help1['join_id'] = $row['id'];
  209. $help1['user_id'] = 0;
  210. $help1['pay_state'] = 1;
  211. $help1['pay_time'] = time();
  212. $help1['order_id'] = -1;//补位的统一用-1
  213. $help1['fans'] = 1;
  214. $help1['goods_num'] = 0;
  215. $help1['create_time'] = $time;
  216. $help1['update_time'] = $time;
  217. $help1['head_picture'] = $this->headPicture();
  218. $helps[] = $help1;
  219. $join->help_count = $join->help_count + 2; // 拼团人数+1
  220. }else{
  221. $join->help_count = $join->help_count + 1;
  222. }
  223. $model->insertAll($helps);
  224. $flag = false;
  225. if ($join->help_count >= $join->people_count){
  226. $flag = true;
  227. $join->status = 1;
  228. }
  229. if($flag){ //成功了话写真实订单
  230. $pay = new GroupBuyLbPay;
  231. $pay->ptSuccessNotify($join->id);
  232. $pay->receiveCoupon($join->user_id,$join->group_buy_lb_activity_id);
  233. }
  234. $join->save();
  235. // Db::commit();
  236. }
  237. }
  238. }
  239. }
  240. /* private function toIncHelpCommon($list){
  241. foreach($list as $row){
  242. $group_buy_lb_activity_id = $row['group_buy_lb_activity_id'];
  243. $activity = GroupBuyLbActivity::where('id',$group_buy_lb_activity_id)->find();
  244. if (!$activity){
  245. continue;
  246. }
  247. //这一拼团的真实付费用户有几个
  248. $real_pay_cnt = GroupBuyLbHelp::where('join_id',$row['id'])->where('pay_state',1)->where("fans",0)->where('is_virtual_join_user',0)->count();
  249. if($activity->tb_cnt>=0&&$real_pay_cnt>=$activity->tb_cnt){
  250. if($row['people_count']>$row['help_count']){
  251. //$k++;
  252. //开始补位
  253. Db::startTrans();
  254. $join = GroupBuyLbJoin::where('id',$row['id'])->lock('for update')->find();
  255. $help['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id'];
  256. $help['join_id'] = $row['id'];
  257. $help['user_id'] = 0;
  258. $help['pay_state'] = 1;
  259. $help['pay_time'] = time();
  260. $help['order_id'] = -1;//补位的统一用-1
  261. $help['fans'] = 1;
  262. $help['goods_num'] = 0;
  263. $help['head_picture'] = $this->headPicture();
  264. $model = new GroupBuyLbHelp;
  265. $model->save($help);
  266. $join->help_count += 1; // 拼团人数+1
  267. //$flag = false;
  268. //拼团人数够了
  269. if($join->help_count==$join->people_count){
  270. $join->status = 1;
  271. }
  272. $join->save();
  273. Db::commit();
  274. }
  275. }
  276. }
  277. }*/
  278. //订单处理
  279. public function orderDeal(){
  280. $this->toIncHelp(); //自动补单
  281. $this->cancelOrder();//取消未支付订单
  282. $this->toCheckPtFail();//拼团没成功的 join status =2
  283. }
  284. //取消订单
  285. public function cancelOrder(){
  286. $list = GroupBuyLbHelp::where("pay_state",0)->limit(5)->order(['create_time'=>'asc'])->field('id')->select();
  287. $now = time();
  288. $k = 0;
  289. foreach($list as $row){
  290. Db::startTrans();
  291. $one = GroupBuyLbHelp::where('id',$row['id'])->lock('for update')->find();
  292. $ts = time()-strtotime($one->create_time);
  293. if($ts>60){ //超过1分钟没支付
  294. $order_no = $one->order_no;
  295. $one->pay_state = 2;
  296. $one->save();
  297. //有米卡支付的话
  298. if($one->rice_card_id > 0){
  299. $this->riceCardReturn($one->rice_card_id,$one->rice_card_money,$one->order_no,$one->pay_money);
  300. }
  301. $join = GroupBuyLbJoin::where('id',$one->join_id)->find();
  302. if($join){ //说明是团长发起的,但没有付款
  303. if($join->help_count == 0){
  304. $join->end_time = Date("Y-m-d H:i:s",time());
  305. $join->status = 3;
  306. $join->save();
  307. }
  308. }
  309. $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$one->group_buy_lb_activity_id)->find();
  310. //取消订单 回退库存
  311. if($groupgoods){
  312. StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$one->goods_num);
  313. }
  314. $k++;
  315. }
  316. Db::commit();
  317. }
  318. echo 'success:k:'.$k;
  319. }
  320. public function testWx(){
  321. $order_no = 'ysc2022041698489710';
  322. $result = $this->reqWx($order_no);
  323. echo $result;
  324. }
  325. //回调微信
  326. public function reqWx($order_no){
  327. $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/'.$order_no.'?mchid=1615908904';
  328. $data['mchid'] = '1615908904';
  329. $data['out_trade_no'] = $order_no;
  330. $result = curl_post($url,json_encode($data));
  331. return $result;
  332. }
  333. public function getActivity($activity_id){
  334. $activity = GroupBuyLbActivity::where("id",$activity_id)->find();
  335. if(empty($activity)){
  336. return false;
  337. }
  338. $now = Date("Y-m-d H:i:s",time());
  339. if($now > $activity->end_time){
  340. return false;
  341. }
  342. if($activity->start_time>$now){
  343. return false;
  344. }
  345. if($activity->audit_status!=1||$activity->status!=1){
  346. return false;
  347. }
  348. return $activity;
  349. }
  350. /**
  351. * 获取商品详情
  352. * @param int $id
  353. * @return array
  354. */
  355. public function detail($activity_id =0)
  356. {
  357. if(empty($activity_id)){
  358. $activity_id = 5;
  359. }
  360. $activity = $this->getActivity($activity_id);
  361. if(!$activity){
  362. return $this->renderError("活动已结束");
  363. }
  364. $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$activity_id)->find();
  365. $id = $groupgoods->goods_id;
  366. $addressId = 0;
  367. $staffUserId = 0;
  368. $user = UserService::getCurrentLoginUser(false);
  369. $user_id = $user->user_id??0;
  370. // 商品详情
  371. $model = new GoodsModel;
  372. $goodsInfo = $model->getDetails($id, $user, $addressId, $staffUserId);
  373. $goodsInfo->inc('view_num', 1)->update();
  374. if ($user) {
  375. $browseRecord = BrowseRecords::whereDay('create_time')->where(['user_id' =>$user_id, 'source_type' => 1, 'source_id' => $id])->find();
  376. if (!$browseRecord) {
  377. BrowseRecords::create([
  378. 'user_id' => $user_id,
  379. 'source_type' => 1,
  380. 'source_id' => $id
  381. ]);
  382. $goodsInfo->inc('view_distinct_num', 1)->update();
  383. } else {
  384. $browseRecord->update_time = time();
  385. $browseRecord->save();
  386. }
  387. }
  388. $goods = $goodsInfo->toArray();
  389. $goods['goods_sku_id'] = $groupgoods->goods_sku_id;
  390. $data['goods'] = $goods;
  391. $help = GroupBuyLbHelp::where("group_buy_lb_activity_id",$activity_id)->where('user_id',$user_id)->where('pay_state',1)->where('order_id',0)->find();
  392. $helpdata = null;
  393. if($help){
  394. $thatjoin = GroupBuyLbJoin::where('id',$help->join_id)->where('status','in',[0,1])->find();
  395. }
  396. if($help&&$thatjoin){
  397. $helpdata['join_id'] = $help->join_id;
  398. $helpdata['pay_state'] = $help->pay_state;
  399. $helpdata['activity_id'] = $help->group_buy_lb_activity_id;
  400. }
  401. $now = Date("Y-m-d H:i:s",time());
  402. $joinList = GroupBuyLbJoin::where("status",0)->with(['user'=>['avatar']])->where('group_buy_lb_activity_id',$activity_id)->where('end_time','>',$now)->order(['help_count'=>'desc'])->limit(7)->select();
  403. $toPtList = [];//去拼团列表
  404. if(!empty($joinList)){
  405. foreach($joinList as $row){
  406. $toPtList[] = [
  407. 'hc_count' =>$row['hc_count'],
  408. 'head_picture'=>$row['user']['avatar']['preview_url']??'',
  409. 'nick_name'=>$row['user']['nick_name']??'',
  410. 'user_id'=>$row['user_id'],
  411. 'join_id'=>$row['id']
  412. ];
  413. }
  414. }
  415. $data['groupbuy'] = ['fmt_end_time'=> $activity->fmt_end_time,
  416. 'group_price'=> $groupgoods->group_price,
  417. 'people_count'=>$activity->people_count,
  418. 'share_copy_writing'=>$activity->share_copy_writing,
  419. 'share_title'=>$activity->share_title,
  420. 'help'=> $helpdata,
  421. 'to_pt_list'=>$toPtList
  422. ];
  423. return $this->renderSuccess(compact('data'));
  424. }
  425. //分享详情(拼团详情团长/团员)
  426. public function joininfo(int $join_id){
  427. $user = UserService::getCurrentLoginUser(false);
  428. $user_id = $user->user_id??0;
  429. $joinInfo = GroupBuyLbJoin::with(['help'])->where("id",$join_id)->find();
  430. $join = $joinInfo->toArray();
  431. // var_dump($user_id);
  432. // die();
  433. if(empty($join)){
  434. return $this->renderError("找不到记录");
  435. }
  436. $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$join['group_buy_lb_activity_id'])->find();
  437. if(empty($groupgoods)){
  438. return $this->renderError("找不到商品");
  439. }
  440. $id = $groupgoods->goods_id;
  441. $addressId = 0;
  442. $staffUserId =0;
  443. $model = new GoodsModel;
  444. $goodsInfo = $model->getDetails($id, $user, $addressId, $staffUserId);
  445. $join['hc_count'] = $joinInfo->hc_count;
  446. $join['fmt_end_time'] = $joinInfo->fmt_end_time;
  447. if($user){
  448. $join['is_self'] = $user->user_id==$join['user_id']?true:false;
  449. }else{
  450. $join['is_self'] = false;
  451. }
  452. $cur_user_help = GroupBuyLbHelp::where('user_id',$user_id)->where('join_id',$join_id)->field("user_id,pay_state,order_id")->order(['id'=>'desc'])->find();
  453. $join['cur_user_have_help'] = $cur_user_help;
  454. $help = $join['help'];
  455. $newhelp = [];
  456. $k = 0;
  457. if(!empty($help)){
  458. foreach($help as $row){
  459. $newhelp[] = ['head_picture'=>$row['head_picture'],
  460. 'pay_state'=>$row['pay_state'],'is_tz'=>$row['user_id']==$join['user_id']?true:false
  461. ];
  462. }
  463. }
  464. $join['help'] = $newhelp;
  465. //优惠券
  466. $activity = GroupBuyLbActivity::with(['coupon'])->find($join['group_buy_lb_activity_id']);
  467. $share_title = $activity['share_title'];
  468. if($activity->an_share_title==1){
  469. $share_title = ($user->nick_name??0).''.$share_title;
  470. }
  471. $join['share_title'] = $share_title;
  472. $data['join'] = $join;
  473. $goods = $goodsInfo->toArray();
  474. $goods['goods_sku_id'] = $groupgoods->goods_sku_id;
  475. $data['goods'] = $goods;
  476. //优惠券
  477. $activity = GroupBuyLbActivity::with(['coupon'])->find($join['group_buy_lb_activity_id']);
  478. // $data['coupon'] = $activity['coupon']??null;
  479. $coupon_price_total = 0;
  480. if($activity['coupon']){
  481. foreach ($activity['coupon'] as $coupon){
  482. $coupon_price_total += $coupon['reduce_price'];
  483. }
  484. }
  485. $data['coupon_price_total'] = $coupon_price_total;
  486. $data['groupbuy'] = ['group_price'=> $groupgoods->group_price];
  487. return $this->renderSuccess(compact('data'));
  488. }
  489. //我的拼团列表
  490. public function mylist(){
  491. $user = UserService::getCurrentLoginUser();
  492. $user_id = $user->user_id??0;
  493. $model = new GroupBuyLbHelp;
  494. $list = $model->getList($user_id);
  495. return $this->renderSuccess(compact('list'));
  496. }
  497. /**
  498. * 发起虚拟拼团
  499. * @param $join_id
  500. * @return array
  501. * @throws \think\db\exception\DataNotFoundException
  502. * @throws \think\db\exception\DbException
  503. * @throws \think\db\exception\ModelNotFoundException
  504. * @author: zjwhust
  505. * @Time: 2022/6/11 11:27
  506. */
  507. public function addJoin($join_id){
  508. $user = UserService::getCurrentLoginUser(true);
  509. $user_id = $user->user_id??0;
  510. // dd($join_id);
  511. $join = GroupBuyLbJoin::find($join_id);
  512. if(!$join){
  513. return $this->renderError("拼团找不到");
  514. }
  515. $lbhelp = GroupBuyLbHelp::where(['join_id'=>$join_id,'user_id'=>$user_id])->find();
  516. if(!$lbhelp){
  517. return $this->renderError('找不到参与的团');
  518. }
  519. if($lbhelp['is_virtual_join_user']==1){
  520. return $this->renderError('团长不能再次发起免费团');
  521. }
  522. if($lbhelp['virtual_join_id']>0){
  523. return $this->renderError('已经发起过免费团');
  524. }
  525. //发起拼团
  526. $activity = GroupBuyLbActivity::where("id",$join['group_buy_lb_activity_id'])->find();
  527. if($activity['start_time']>date('Y-m-d H:i:s') || $activity['end_time']<date('Y-m-d H:i:s')){
  528. return $this->renderError('拼团活动已经结束了');
  529. }
  530. Db::startTrans();
  531. try{
  532. $share_title = $activity['share_title'];
  533. if($activity->an_share_title==1){
  534. $share_title = $user->nick_name.''.$share_title;
  535. }
  536. //写入发团记录
  537. $join = [
  538. 'group_buy_lb_activity_id' => $join['group_buy_lb_activity_id'],
  539. 'people_count'=> $activity['people_count'],
  540. 'help_count'=> 1, //虚拟团长也算一个人
  541. 'end_time' => Date("Y-m-d H:i:s",time() + $activity['during_time']*60*60),
  542. 'share_title'=>$share_title,
  543. 'share_copy_writing'=>$activity['share_copy_writing'],
  544. 'create_time'=>time(),
  545. 'update_time'=>time(),
  546. 'user_id'=>$user_id,
  547. 'is_virtual'=>1 //虚拟团
  548. ];
  549. $new_join = GroupBuyLbJoin::create($join);
  550. //写入参团记录
  551. $help = [
  552. 'user_id' => $user_id,
  553. 'order_no' => '',
  554. 'group_buy_lb_activity_id' => $join['group_buy_lb_activity_id'],
  555. 'join_id'=>$new_join['id'],
  556. 'goods_num' =>0,
  557. 'head_picture'=>$user->avatar['preview_url']??'',
  558. 'rice_card_id'=>0,
  559. 'rice_card_money'=>0.00,
  560. 'rice_card_express_money'=>0.00,
  561. 'pay_money'=> 0.00,
  562. 'express_money'=> 0.00,
  563. 'order_money'=> 0.00,
  564. 'provider_ids'=>'',
  565. 'good_rice_card_money'=>0,
  566. 'is_virtual_join_user'=>1, //是虚拟团长
  567. 'virtual_join_id'=>0,//发起的虚拟团id
  568. 'pay_state'=>1,//默认写成已支付,因为不需要真的下单
  569. 'fans'=>1,//0真实用户 1假用户
  570. 'user_name'=>'',
  571. 'phone'=>'',
  572. 'province_id'=>0,
  573. 'city_id'=>0,
  574. 'detail'=>'',
  575. 'pay_type'=>OrderPayTypeEnum::WECHAT,
  576. ];
  577. GroupBuyLbHelp::create($help);
  578. //上一个团员的参与记录写入发起的虚拟团id
  579. $lbhelp->virtual_join_id = $join_id;
  580. $lbhelp->save();
  581. //如果一人成团直接成功
  582. if($activity['people_count']==1){
  583. $GroupBuyLbPay = new GroupBuyLbPay();
  584. //拼团成功,写入订单逻辑
  585. $GroupBuyLbPay->ptSuccessNotify($new_join['id']);
  586. //发放优惠
  587. if ($user_id > 0 ){
  588. $GroupBuyLbPay->receiveCoupon($user_id,$join['group_buy_lb_activity_id']);
  589. }
  590. }
  591. Db::commit();
  592. return $this->renderSuccess(['join_id'=>$new_join['id']]);
  593. } catch (\Exception $e) {
  594. Db::rollback();
  595. return $this->renderError('提交失败');
  596. }
  597. }
  598. }