Activity.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  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\groupbuy;
  13. use app\api\model\Goods as GoodsModel;
  14. use app\api\model\groupbuylb\GroupBuyLbActivity as GroupBuyLbActivityModel;
  15. use app\api\model\groupbuylb\GroupBuyLbHelp;
  16. use app\api\model\groupbuylb\GroupBuyLbJoin;
  17. use app\api\model\PromotionMonitor;
  18. use app\api\service\User as UserService;
  19. use app\common\enum\order\PayType as OrderPayTypeEnum;
  20. use app\common\library\helper;
  21. use app\common\model\BrowseRecords;
  22. use app\common\model\User as UserModel;
  23. use app\common\service\delivery\Express as ExpressService;
  24. use app\api\model\Category;
  25. use app\api\model\GoodsCategoryRel;
  26. use app\api\controller\Controller;
  27. use app\api\model\groupbuy\GroupBuyActivity;
  28. use app\api\model\groupbuy\GroupBuyGoods;
  29. use app\api\model\groupbuy\GroupBuyHelp;
  30. use app\api\model\groupbuy\GroupBuyJoin;
  31. use app\common\service\Order as OrderService;
  32. use app\common\service\order\Refund as RefundService;
  33. use think\facade\Db;
  34. use app\api\model\order\GroupBuyPay;
  35. use app\api\model\card\UserRiceCard as UserRiceCardModel;
  36. use app\api\model\card\UserRiceCardConsume;
  37. use app\api\model\card\UserRiceCard;
  38. use app\common\service\goods\source\Factory as StockFactory;
  39. use app\common\enum\order\OrderSource as OrderSourceEnum;
  40. use app\api\model\subscribe\WechatSub;
  41. /**
  42. * 活动
  43. * Class service
  44. * @package app\api\controller\user\order
  45. */
  46. class Activity extends Controller
  47. {
  48. //如果真有拼团不成功
  49. public function toCheckPtFail(){
  50. $now = Date("Y-m-d H:i:s",time());
  51. $joinList = GroupBuyJoin::where('status',0)->where('end_time','<',$now)->select();
  52. foreach($joinList as $row){
  53. if($row->people_count>$row->help_count){
  54. $join = GroupBuyJoin::where('id',$row->id)->lock('for update')->find();
  55. $join->status = 2;
  56. $join->save();
  57. //
  58. (new GroupBuyPay)->activityEnd($join->user_id,$join->id);
  59. }
  60. }
  61. }
  62. //测试回退库存
  63. public function testStock(){
  64. $goods_id = 10137;
  65. $goods_sku_id = 0;
  66. $total_num = 1;
  67. // $res = StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($goods_id,$goods_sku_id,$total_num);
  68. // $res = StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSalesExpress($goods_id,$total_num);
  69. // var_dump($res);
  70. }
  71. public function cancel(int $order_id){
  72. $user = UserService::getCurrentLoginUser(true);
  73. Db::startTrans();
  74. $help = GroupBuyHelp::where("pay_state",0)->where('
  75. id',$order_id)->find();
  76. $k = 0;
  77. if($help){
  78. $help->pay_state = 2;
  79. $help->save();
  80. //有金米粒抵扣
  81. if($help->gold_rice_amount>0){
  82. UserModel::setIncDecByField($help->user_id,['gold_rice'=>(float)$help->gold_rice_amount],['gold_rice_frozen'=>(float)$help->gold_rice_amount]);
  83. }
  84. if($help->rice_card_id > 0){
  85. riceCardReturn($help->rice_card_id,$help->rice_card_money,$help->order_no,$help->pay_money);
  86. }
  87. $k++;
  88. $join = GroupBuyJoin::where('id',$help->join_id)->find();
  89. if($join){ //说明是团长发起的,但没有付款
  90. if($join->help_count == 0){
  91. $join->end_time = Date("Y-m-d H:i:s",time());
  92. $join->status = 3;
  93. $join->save();
  94. $k++;
  95. }
  96. }
  97. $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$help->group_buy_activity_id)->find();
  98. //取消订单 回退库存
  99. if($groupgoods){
  100. StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$help->goods_num);
  101. }
  102. }
  103. Db::commit();
  104. echo 'success:'.$k;
  105. }
  106. public function headPicture(){
  107. $host = env('APP_URL');
  108. $rel = rand(1,16);
  109. $url = $host.'/uploads/image/'.$rel.'.jpeg';
  110. return $url;
  111. }
  112. //自动补位逻辑
  113. public function toIncHelp(){
  114. $nts = time() + 3600;
  115. $now = Date("Y-m-d H:i:s",time());
  116. $time = Date("Y-m-d H:i:s",$nts);
  117. $list = GroupBuyJoin::where('status','=',0)->where('end_time','>',$now)->where('end_time','<',$time)->where('help_count','>',0)->select();
  118. $k = 0;
  119. foreach($list as $row){
  120. $group_buy_activity_id = $row['group_buy_activity_id'];
  121. $activity = GroupBuyActivity::where('id',$group_buy_activity_id)->find();
  122. //这一拼团的真实付费用户有几个
  123. $real_pay_cnt = GroupBuyHelp::where('join_id',$row['id'])->where('pay_state',1)->where("fans",0)->count();
  124. if($activity->tb_cnt>=0&&$real_pay_cnt>=$activity->tb_cnt){
  125. if($row['people_count']>$row['help_count']){
  126. $k++;
  127. //开始补位
  128. Db::startTrans();
  129. $join = GroupBuyJoin::where('id',$row['id'])->lock('for update')->find();
  130. $help['group_buy_activity_id'] = $row['group_buy_activity_id'];
  131. $help['join_id'] = $row['id'];
  132. $help['user_id'] = 0;
  133. $help['pay_state'] = 1;
  134. $help['pay_time'] = time();
  135. $help['order_id'] = -1;//补位的统一用-1
  136. $help['fans'] = 1;
  137. $help['goods_num'] = 0;
  138. $help['head_picture'] = $this->headPicture();
  139. $model = new GroupBuyHelp;
  140. $model->save($help);
  141. $join->help_count += 1; // 拼团人数+1
  142. $flag = false;
  143. //拼团人数够了
  144. if($join->help_count==$join->people_count){
  145. $flag = true;
  146. }
  147. $join->save();
  148. if($flag){ //成功了话写真实订单
  149. $pay = new GroupBuyPay;
  150. $pay->ptSuccessNotify($join->id);
  151. }
  152. Db::commit();
  153. }
  154. }
  155. }
  156. echo 'success:k:'.$k;
  157. }
  158. //订单处理
  159. public function orderDeal(){
  160. $this->toIncHelp(); //自动补单
  161. $this->cancelOrder();//取消未支付订单
  162. $this->toCheckPtFail();//拼团没成功的 join status =2
  163. }
  164. //取消订单
  165. public function cancelOrder(){
  166. $list = GroupBuyHelp::where("pay_state",0)->limit(5)->order(['create_time'=>'asc'])->field('id')->select();
  167. $now = time();
  168. $k = 0;
  169. foreach($list as $row){
  170. Db::startTrans();
  171. $one = GroupBuyHelp::where('id',$row['id'])->lock('for update')->find();
  172. $ts = time()-strtotime($one->create_time);
  173. if($ts>300){ //超过5分钟没支付
  174. $order_no = $one->order_no;
  175. $one->pay_state = 2;
  176. $one->save();
  177. //有金米粒抵扣
  178. if($one->gold_rice_amount>0){
  179. UserModel::setIncDecByField($one->user_id,['gold_rice'=>(float)$one->gold_rice_amount],['gold_rice_frozen'=>(float)$one->gold_rice_amount]);
  180. }
  181. //有米卡支付的话
  182. if($one->rice_card_id > 0){
  183. riceCardReturn($one->rice_card_id,$one->rice_card_money,$one->order_no,$one->pay_money);
  184. }
  185. $join = GroupBuyJoin::where('id',$one->join_id)->find();
  186. if($join){ //说明是团长发起的,但没有付款
  187. if($join->help_count == 0){
  188. $join->end_time = Date("Y-m-d H:i:s",time());
  189. $join->status = 3;
  190. $join->save();
  191. }
  192. }
  193. $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$one->group_buy_activity_id)->find();
  194. //取消订单 回退库存
  195. if($groupgoods){
  196. StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$one->goods_num);
  197. }
  198. $k++;
  199. }
  200. Db::commit();
  201. }
  202. echo 'success:k:'.$k;
  203. }
  204. public function testWx(){
  205. $order_no = 'ysc2022041698489710';
  206. $result = $this->reqWx($order_no);
  207. echo $result;
  208. }
  209. //回调微信
  210. public function reqWx($order_no){
  211. $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/'.$order_no.'?mchid=1615908904';
  212. $data['mchid'] = '1615908904';
  213. $data['out_trade_no'] = $order_no;
  214. $result = curl_post($url,json_encode($data));
  215. return $result;
  216. }
  217. public function getActivity($activity_id){
  218. $activity = GroupBuyActivity::where("id",$activity_id)->find();
  219. if(empty($activity)){
  220. return false;
  221. }
  222. $now = Date("Y-m-d H:i:s",time());
  223. if($now > $activity->end_time){
  224. return false;
  225. }
  226. if($activity->start_time>$now){
  227. return false;
  228. }
  229. if($activity->audit_status!=1||$activity->status!=1){
  230. return false;
  231. }
  232. return $activity;
  233. }
  234. /**
  235. * 获取商品详情
  236. * @param int $id
  237. * @return array
  238. */
  239. public function detail($activity_id =0)
  240. {
  241. if(empty($activity_id)){
  242. $activity_id = 5;
  243. }
  244. $activity = $this->getActivity($activity_id);
  245. if(!$activity){
  246. return $this->renderError("活动已结束");
  247. }
  248. $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$activity_id)->find();
  249. $id = $groupgoods->goods_id;
  250. $addressId = 0;
  251. $staffUserId = 0;
  252. $user = UserService::getCurrentLoginUser(false);
  253. $user_id = $user->user_id??0;
  254. // 商品详情
  255. $model = new GoodsModel;
  256. $goodsInfo = $model->getDetails($id, $user, $addressId, $staffUserId);
  257. $goodsInfo->inc('view_num', 1)->update();
  258. if ($user) {
  259. $browseRecord = BrowseRecords::whereDay('create_time')->where(['user_id' =>$user_id, 'source_type' => 1, 'source_id' => $id])->find();
  260. if (!$browseRecord) {
  261. BrowseRecords::create([
  262. 'user_id' => $user_id,
  263. 'source_type' => 1,
  264. 'source_id' => $id
  265. ]);
  266. $goodsInfo->inc('view_distinct_num', 1)->update();
  267. } else {
  268. $browseRecord->update_time = time();
  269. $browseRecord->save();
  270. }
  271. }
  272. $goods = $goodsInfo->toArray();
  273. $goods['goods_sku_id'] = $groupgoods->goods_sku_id;
  274. $data['goods'] = $goods;
  275. $help = GroupBuyHelp::where("group_buy_activity_id",$activity_id)->where('user_id',$user_id)->where('pay_state',1)->where('order_id',0)->find();
  276. $helpdata = null;
  277. if($help){
  278. $thatjoin = GroupBuyJoin::where('id',$help->join_id)->where('status','in',[0,1])->find();
  279. }
  280. if($help&&$thatjoin){
  281. $helpdata['join_id'] = $help->join_id;
  282. $helpdata['pay_state'] = $help->pay_state;
  283. $helpdata['activity_id'] = $help->group_buy_activity_id;
  284. }
  285. $now = Date("Y-m-d H:i:s",time());
  286. $joinIdArr = GroupBuyJoin::where("status",0)->where('group_buy_activity_id',$activity_id)->where('end_time','>',$now)->order(['id'=>'desc'])->column("id");
  287. $toPtList = [];//去拼团列表
  288. if(!empty($joinIdArr)){
  289. $joinIdStr = implode(",",$joinIdArr);
  290. $idSql = 'select min(id) as ids from yoshop_group_buy_activity_help where join_id in ('.$joinIdStr.') and pay_state=1 and group_buy_activity_id='.$activity_id.' group by join_id order by join_id desc limit 7';
  291. $result = Db::query($idSql);
  292. $idArray = array_column($result,'ids');
  293. // $joinList = GroupBuyHelp::with(['user'])->field("id,join_id,user_id,head_picture")->where('pay_state',1)->limit(7)->where('id','in',$idArray)->order(['join_id'=>'desc'])->select();
  294. $now = Date("Y-m-d H:i:s",time());
  295. $joinList = GroupBuyJoin::where("status",0)->with(['user'=>['avatar']])->where('group_buy_activity_id',$activity_id)->where('end_time','>',$now)->order(['help_count'=>'desc'])->limit(7)->select();
  296. foreach($joinList as $row){
  297. $toPtList[] = [
  298. 'join_id'=>$row['id'],
  299. 'head_picture'=>$row['user']['avatar']['preview_url']??'',
  300. 'nick_name'=>$row['user']['nick_name']??'',
  301. 'user_id'=>$row['user_id'],
  302. 'id'=>$row['id'],
  303. 'hc_count' =>$row['hc_count'],
  304. ];
  305. }
  306. }
  307. $data['groupbuy'] = ['fmt_end_time'=> $activity->fmt_end_time,
  308. 'group_price'=> $groupgoods->group_price,
  309. 'help'=> $helpdata,
  310. 'to_pt_list'=>$toPtList,
  311. 'people_count'=>$activity->people_count
  312. ];
  313. return $this->renderSuccess(compact('data'));
  314. }
  315. //分享详情
  316. public function joininfo(int $join_id){
  317. $user = UserService::getCurrentLoginUser(false);
  318. $user_id = $user->user_id??0;
  319. $joinInfo = GroupBuyJoin::with(['help'])->where("id",$join_id)->find();
  320. $join = $joinInfo->toArray();
  321. // var_dump($user_id);
  322. // die();
  323. if(empty($join)){
  324. return $this->renderError("找不到记录");
  325. }
  326. $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$join['group_buy_activity_id'])->find();
  327. if(empty($groupgoods)){
  328. return $this->renderError("找不到商品");
  329. }
  330. $id = $groupgoods->goods_id;
  331. $addressId = 0;
  332. $staffUserId =0;
  333. $activity = GroupBuyActivity::where("id",$join['group_buy_activity_id'])->find();
  334. $model = new GoodsModel;
  335. $goodsInfo = $model->getDetails($id, $user, $addressId, $staffUserId);
  336. $join['hc_count'] = $joinInfo->hc_count;
  337. $join['fmt_end_time'] = $joinInfo->fmt_end_time;
  338. if($user){
  339. $join['is_self'] = $user->user_id==$join['user_id']?true:false;
  340. }else{
  341. $join['is_self'] = false;
  342. }
  343. $cur_user_help = GroupBuyHelp::where('user_id',$user_id)->where('join_id',$join_id)->field("user_id,pay_state,order_id")->order(['id'=>'desc'])->find();
  344. $join['cur_user_have_help'] = $cur_user_help;
  345. $help = $joinInfo['help'];
  346. $newhelp = [];
  347. $k = 0;
  348. if(!empty($help)){
  349. foreach($help as $row){
  350. $newhelp[] = ['head_picture'=>$row['head_picture'],
  351. 'pay_state'=>$row['pay_state'],'is_tz'=>$row['user_id']==$join['user_id']?true:false
  352. ];
  353. }
  354. }
  355. $join['help'] = $newhelp;
  356. $data['join'] = $join;
  357. $goods = $goodsInfo->toArray();
  358. $goods['goods_sku_id'] = $groupgoods->goods_sku_id;
  359. $data['goods'] = $goods;
  360. $data['groupbuy'] = [
  361. 'group_price'=> $groupgoods->group_price,
  362. 'share_title'=>$join['share_title'],
  363. 'an_share_title'=>$activity['an_share_title']??0
  364. ];
  365. return $this->renderSuccess(compact('data'));
  366. }
  367. //我的拼团列表
  368. public function myptlist(){
  369. $user = UserService::getCurrentLoginUser();
  370. $user_id = $user->user_id??0;
  371. $model = new GroupBuyHelp;
  372. $list = $model->getList($user_id);
  373. return $this->renderSuccess(compact('list'));
  374. }
  375. //我的拼团列表1.4.2
  376. public function myptlist1(){
  377. $user = UserService::getCurrentLoginUser();
  378. $user_id = $user->user_id??0;
  379. $model = new GroupBuyHelp;
  380. $page = intval($this->request->get('page',1));
  381. $list = $model->getListUnionGroup($user_id,15,$page);
  382. return $this->renderSuccess(compact('list'));
  383. }
  384. /**
  385. * 取消拼团
  386. * @return array|\think\response\Json
  387. * @throws \app\common\exception\BaseException
  388. * @throws \think\Exception
  389. * @throws \think\db\exception\DataNotFoundException
  390. * @throws \think\db\exception\DbException
  391. * @throws \think\db\exception\ModelNotFoundException
  392. */
  393. public function ptaCancel(){
  394. $userId = UserService::getCurrentLoginUserId();
  395. $help_id = intval($this->request->get('help_id',0));
  396. if (!$help_id){
  397. return $this->renderError('参数有误');
  398. }
  399. $modelHelp = new GroupBuyHelp;
  400. $help = $modelHelp->find($help_id);
  401. if (!$help){
  402. return $this->renderError('参数有误');
  403. }
  404. $needCloseGroup = false;
  405. $joinM = new GroupBuyJoin();
  406. $join = $joinM->find($help->join_id);
  407. if ($join->user_id == $userId){
  408. //如果团长是自己,判断团中有没有真实团员,如没有真实团员参加,允许取消拼团并退款
  409. $exitRealHelper = $modelHelp->where('join_id',$help->join_id)->where('fans',0)
  410. ->where('user_id','<>',$userId)
  411. ->where('pay_state',1)
  412. ->where('finance_refund',0)->find();
  413. if ($exitRealHelper){
  414. return $this->renderError( '已有团员参团,请成团后申请退款');
  415. }
  416. $needCloseGroup = true;
  417. }
  418. $help['pay_price'] = $help['pay_money'];
  419. $flag1 = false;
  420. //退到米卡
  421. if($help->rice_card_id > 0){
  422. $flag = riceCardReturn($help->rice_card_id,$help->rice_card_money,$help->order_no,$help->pay_money);
  423. if ($flag == false){
  424. log_record('groupBuyHelpId::'.$help_id.'::退款退到米卡失败','error');
  425. return $this->renderError('系统繁忙,稍后再试');
  426. }
  427. }
  428. $data['finance_refund'] = 0;
  429. $data['finance_time'] = time();
  430. if ($help['pay_money'] > 0){
  431. $refund_number = OrderService::createOrderNoPrefix('TKGB'); //申请单编号
  432. //直接退款逻辑
  433. $RefundService = new RefundService();
  434. $refund_ret = $RefundService->execute($help,$refund_number,$help['pay_money']);
  435. $data['refund_number'] = $refund_number;
  436. if ($refund_ret['status'] == 200) {
  437. $data['refund_transaction_id'] = $refund_ret['data']['transaction_id']; // 微信退款交易号
  438. $flag1 = true;
  439. }else{
  440. //退款失败
  441. log_record('groupBuyHelpId::'.$help_id.'::微信退款失败','error');
  442. $data['finance_refund'] = 2;
  443. }
  444. }else{
  445. $flag1 = true;
  446. }
  447. if ($flag1 == true){
  448. $data['finance_refund'] = 1 ;
  449. $msg = '已尝试退款,请联系用户核对';
  450. }else{
  451. $msg = '退款失败';
  452. return $this->renderError($msg);
  453. }
  454. try {
  455. $data['has_canceled'] = 1;
  456. $help->where('id',$help_id)->update($data);
  457. }catch (\Exception $e){
  458. log_record('groupBuyHelpId::'.$help_id.'::更新groupBuyHelp失败::'.$e->getMessage(),'error');
  459. return $this->renderError('系统繁忙,稍后再试');
  460. }
  461. //取消订单 回退库存
  462. $groupgoods = \app\store\model\groupbuy\GroupBuyGoods::where('group_buy_activity_id',$help['group_buy_activity_id'])->find();
  463. if($groupgoods){
  464. StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$help['goods_num']);
  465. StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSalesExpress($groupgoods->goods_id,$help['goods_num'],false);
  466. }
  467. $joinUpdates['help_count'] = $join->help_count>=1?($join->help_count- 1):0;
  468. if ($needCloseGroup == true){
  469. //团长退款关闭团
  470. $joinUpdates['status'] = 4;//取消拼团
  471. }
  472. $join->where('id',$help->join_id)->update($joinUpdates);
  473. return $this->renderSuccess($msg);
  474. }
  475. /**
  476. * 普通拼团和裂变拼团每5分钟,虚拟自动发起5个虚拟团,后续活动拼团中的数量不足5个时就新增虚拟团达到5个
  477. * @return array|\think\response\Json
  478. * @throws \think\db\exception\DataNotFoundException
  479. * @throws \think\db\exception\DbException
  480. * @throws \think\db\exception\ModelNotFoundException
  481. */
  482. public function addVirJoinCrontab()
  483. {
  484. $now = date('Y-m-d H:i:s');
  485. $acts = GroupBuyActivity::field('id,(select count(*) from yoshop_group_buy_activity_join where yoshop_group_buy_activity_join.group_buy_activity_id=yoshop_group_buy_activity.id) as counts')
  486. ->where('start_time','<=',$now)
  487. ->where('end_time','>=',$now)
  488. ->where('audit_status','=',1)
  489. ->where('status','=',1)
  490. ->where('need_fake_group','=',1)
  491. ->having('counts < 5')
  492. ->select();
  493. if ($acts->isEmpty() == false){
  494. foreach ($acts as $item){
  495. for ($i=0;$i<5-$item['counts'];$i++){
  496. $this->addVirJoin(1,$item['id']);
  497. }
  498. }
  499. }
  500. $actsLb = GroupBuyLbActivityModel::field('id,(select count(*) from yoshop_group_buy_lb_activity_join where yoshop_group_buy_lb_activity_join.group_buy_lb_activity_id=yoshop_group_buy_lb_activity.id and status=0) as counts')
  501. ->where('start_time','<=',$now)
  502. ->where('end_time','>=',$now)
  503. ->where('audit_status','=',1)
  504. ->where('status','=',1)
  505. ->where('need_fake_group','=',1)
  506. ->having('counts < 5')
  507. ->select();
  508. foreach ($actsLb as $item){
  509. for ($i=0;$i<5-$item['counts'];$i++){
  510. $this->addVirJoin(2,$item['id']);
  511. }
  512. }
  513. return $this->renderSuccess();
  514. }
  515. /**
  516. * 新增FAKE系统拼团
  517. * @param $type
  518. * @param $group_buy_activity_id
  519. * @return false|int
  520. * @throws \think\db\exception\DataNotFoundException
  521. * @throws \think\db\exception\DbException
  522. * @throws \think\db\exception\ModelNotFoundException
  523. */
  524. private function addVirJoin($type ,$group_buy_activity_id){
  525. $user_id = 0;
  526. $address['user_name'] = '';
  527. $address['phone'] = '';
  528. $address['province_id'] = 0;
  529. $address['city_id'] = 0;
  530. $address['region_id'] = 0;
  531. $address['detail'] = '';
  532. if ($type == 1){
  533. //发起拼团
  534. // 根据推广监控ID判断活动效果归属
  535. $promotionMonitorId = PromotionMonitor::checkActEffectOwner(4, $order['promotionMonitorId'] ?? 0, $group_buy_activity_id);
  536. $activity = GroupBuyActivity::where("id",$group_buy_activity_id)->find();
  537. $join = [
  538. 'group_buy_activity_id' => $group_buy_activity_id,
  539. 'people_count'=> $activity['people_count'],
  540. 'end_time' => Date("Y-m-d H:i:s",time() + $activity['during_time']*60*60),
  541. 'share_title'=>$activity['share_title'],
  542. 'create_time'=>time(),
  543. 'update_time'=>time(),
  544. 'user_id'=>$user_id,
  545. 'help_count'=>1
  546. ];
  547. $buyjoinModel = new GroupBuyJoin();
  548. $joinId = $buyjoinModel->insertGetId($join);
  549. $help = [
  550. 'user_id' => $user_id,
  551. 'order_no' => '0',
  552. 'group_buy_activity_id' => $group_buy_activity_id,
  553. 'join_id'=>$joinId,
  554. 'goods_num' =>0,
  555. 'head_picture'=>$this->headPicture(),
  556. 'gold_rice_amount' => 0,
  557. 'gold_rice_money' => 0,
  558. 'rice_card_id'=>0,
  559. 'rice_card_money'=>0,
  560. 'rice_card_express_money'=>0,
  561. 'pay_money'=> 0,
  562. 'express_money'=> 0,
  563. 'order_money'=> 0,
  564. 'provider_ids'=>0,
  565. 'good_rice_card_money'=>0,
  566. 'promotion_monitor_id' => $promotionMonitorId,
  567. 'staff_user_id' => 0,
  568. 'staff_shop_id' => 0,
  569. 'fans'=>1,
  570. 'pay_state' => 1,
  571. 'pay_time' => time(),
  572. 'pay_type' => OrderPayTypeEnum::WECHAT,
  573. ];
  574. $help = array_merge($help,$address);
  575. // 保存参团记录
  576. $buyhelpModel = new GroupBuyHelp();
  577. $buyhelpModel->save($help);
  578. }
  579. if ($type == 2){
  580. $user_id = 0;
  581. //发起拼团
  582. $activity = GroupBuyLbActivityModel::where("id",$group_buy_activity_id)->find();
  583. $share_title = $activity['share_title'];
  584. if($activity->an_share_title==1){
  585. $share_title = '用户'.rand(1000,9999).$share_title;
  586. }
  587. $join = [
  588. 'group_buy_lb_activity_id' => $group_buy_activity_id,
  589. 'people_count'=> $activity['people_count'],
  590. 'end_time' => Date("Y-m-d H:i:s",time() + $activity['during_time']*60*60),
  591. 'share_title'=>$share_title,
  592. 'share_copy_writing'=>$activity['share_copy_writing'],
  593. 'create_time'=>time(),
  594. 'update_time'=>time(),
  595. 'user_id'=>$user_id,
  596. 'is_virtual'=>1,
  597. 'help_count'=>1
  598. ];
  599. $buyjoinModel = new GroupBuyLbJoin();
  600. $joinId = $buyjoinModel->insertGetId($join);
  601. $help = [
  602. 'user_id' => $user_id,
  603. 'order_no' => '0',
  604. 'group_buy_lb_activity_id' => $group_buy_activity_id,
  605. 'join_id'=>$joinId,
  606. 'goods_num' =>0,
  607. 'head_picture'=>$this->headPicture(),
  608. 'rice_card_id'=>0,
  609. 'rice_card_money'=>0,
  610. 'rice_card_express_money'=>0,
  611. 'order_id'=> -1,//补位的统一用-1
  612. 'pay_money'=> 0,
  613. 'express_money'=> 0,
  614. 'order_money'=> 0,
  615. 'provider_ids'=>0,
  616. 'good_rice_card_money'=>0,
  617. 'is_virtual_join_user'=>0,
  618. 'virtual_join_id'=>1,
  619. 'pay_state'=>1,
  620. 'fans'=>1,
  621. 'pay_time' => time(),
  622. 'pay_type' => OrderPayTypeEnum::WECHAT,
  623. ];
  624. $help = array_merge($help,$address);
  625. // 保存参团记录
  626. $buyhelpModel = new GroupBuyLbHelp();
  627. $buyhelpModel->save($help);
  628. }
  629. return true;
  630. }
  631. }