// +---------------------------------------------------------------------- declare (strict_types=1); namespace app\api\controller\groupbuylb; use app\api\model\Goods as GoodsModel; use app\api\model\User as UserModel; use app\api\service\User as UserService; use app\common\enum\order\OrderStatus; use app\common\enum\order\PayType as OrderPayTypeEnum; use app\common\library\helper; use app\common\model\BrowseRecords; use app\api\controller\Controller; use app\api\model\groupbuylb\GroupBuyLbActivity; use app\api\model\groupbuylb\GroupBuyLbGoods; use app\api\model\groupbuylb\GroupBuyLbHelp; use app\api\model\groupbuylb\GroupBuyLbJoin; use think\facade\Db; use app\api\model\order\GroupBuyLbPay; use app\common\service\goods\source\Factory as StockFactory; use app\common\enum\order\OrderSource as OrderSourceEnum; /** * 活动 * Class service * @package app\api\controller\user\order */ class Activity extends Controller { //如果真有拼团不成功 public function toCheckPtFail(){ $now = Date("Y-m-d H:i:s",time()); $joinList = GroupBuyLbJoin::where('status',0)->where('end_time','<',$now)->select(); foreach($joinList as $row){ if($row->people_count>$row->help_count){ $join = GroupBuyLbJoin::where('id',$row->id)->lock('for update')->find(); $join->status = 2; $join->save(); //通知 if($join->is_virtual==0){ (new GroupBuyLbPay)->activityEnd($join->user_id,$join->id); }else{ (new GroupBuyLbPay)->virtualActivityEnd($join->user_id,$join->id); } } } } //测试回退库存 public function testStock(){ $goods_id = 10137; $goods_sku_id = 0; $total_num = 1; // $res = StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($goods_id,$goods_sku_id,$total_num); // $res = StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSalesExpress($goods_id,$total_num); // var_dump($res); } public function cancel(int $order_id){ $user = UserService::getCurrentLoginUser(true); Db::startTrans(); $help = GroupBuyLbHelp::where("pay_state",0)->where(' id',$order_id)->find(); $k = 0; if($help){ $help->pay_state = 2; $help->save(); if($help->rice_card_id > 0){ riceCardReturn($help->rice_card_id,$help->rice_card_money,$help->order_no,$help->pay_money); } $k++; $join = GroupBuyLbJoin::where('id',$help->join_id)->find(); if($join){ //说明是团长发起的,但没有付款 if($join->help_count == 0){ $join->end_time = Date("Y-m-d H:i:s",time()); $join->status = 3; $join->save(); $k++; } } $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$help->group_buy_activity_id)->find(); //取消订单 回退库存 if($groupgoods){ StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$help->goods_num); } } Db::commit(); echo 'success:'.$k; } public function headPicture(){ $host = env('APP_URL'); $rel = rand(1,16); $url = $host.'/uploads/image/'.$rel.'.jpeg'; return $url; } //自动补位逻辑 public function toIncHelp(){ $nts = time() + 3600; $now = Date("Y-m-d H:i:s",time()); $time = Date("Y-m-d H:i:s",$nts); $list = GroupBuyLbJoin::where('status','=',0)->where('end_time','>',$now)->where('end_time','<',$time)->where('help_count','>',0)->select(); $k = 0; foreach($list as $row){ $group_buy_lb_activity_id = $row['group_buy_lb_activity_id']; $activity = GroupBuyLbActivity::where('id',$group_buy_lb_activity_id)->find(); //这一拼团的真实付费用户有几个 $real_pay_cnt = GroupBuyLbHelp::where('join_id',$row['id'])->where('pay_state',1)->where("fans",0)->where('is_virtual_join_user',0)->count(); if($activity->tb_cnt>=0&&$real_pay_cnt>=$activity->tb_cnt){ if($row['people_count']>$row['help_count']){ $k++; //开始补位 // Db::startTrans(); $join = GroupBuyLbJoin::where('id',$row['id'])->find(); $help['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id']; $help['join_id'] = $row['id']; $help['user_id'] = 0; $help['pay_state'] = 1; $help['pay_time'] = time(); $help['order_id'] = -1;//补位的统一用-1 $help['fans'] = 1; $help['goods_num'] = 0; $help['head_picture'] = $this->headPicture(); $model = new GroupBuyLbHelp; $model->save($help); $join->help_count += 1; // 拼团人数+1 $flag = false; //拼团人数够了 if($join->help_count==$join->people_count){ $flag = true; } $join->save(); if($flag){ //成功了话写真实订单 $pay = new GroupBuyLbPay; $pay->ptSuccessNotify($join->id); // Db::commit(); } if($flag){ $pay2 = new GroupBuyLbPay; $pay2->receiveCoupon($join->user_id,$join->group_buy_lb_activity_id); } } } } echo 'success:k:'.$k; } /** * 拼团裂变每小时自动补位逻辑zq * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function toIncHelpHourly(){ $nts = time() - 600; $nts1 = time() - 2400; $now = Date("Y-m-d H:i:s",time()); /* $list = GroupBuyLbJoin::where('status','=',0)->where('start_time','>',$now) ->where('end_time','<',$now)->where('help_count','>',0) ->select();*/ $list = GroupBuyLbJoin::where('status','=',0) ->where('create_time','<=',$nts) //->where('create_time','>=',$nts1) ->where('end_time','>=',$now) ->where('help_count','>',0) ->order('id desc') ->select(); //dd($list->toArray()); $k = 0; $this->toIncHelpCommonTwo($list); echo 'success hourly:k:'.$k; } private function toIncHelpCommonTwo($list){ $model = new GroupBuyLbHelp; $time = time(); foreach($list as $row){ $helps = []; $group_buy_lb_activity_id = $row['group_buy_lb_activity_id']; $activity = GroupBuyLbActivity::where('id',$group_buy_lb_activity_id)->where('need_fill_order',1)->find(); if (!$activity){ continue; } //这一拼团的真实付费用户有几个 $real_pay_cnt = GroupBuyLbHelp::where('join_id',$row['id'])->where('pay_state',1)->where('user_id','>',0)->count(); //dd($real_pay_cnt); if($real_pay_cnt<2){ if($row['people_count']>$row['help_count']){ // Db::startTrans(); $join = GroupBuyLbJoin::where('id',$row['id'])->find(); $help['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id']; $help['join_id'] = $row['id']; $help['user_id'] = 0; $help['pay_state'] = 1; $help['pay_time'] = time(); $help['order_id'] = -1;//补位的统一用-1 $help['fans'] = 1; $help['goods_num'] = 0; $help['create_time'] = $time; $help['update_time'] = $time; $help['head_picture'] = $this->headPicture(); $helps[] = $help; if ($row['people_count'] - $row['help_count'] >= 2){//空位大于=2人补两个,其余补一个 //$k++; //开始补位 $help1['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id']; $help1['join_id'] = $row['id']; $help1['user_id'] = 0; $help1['pay_state'] = 1; $help1['pay_time'] = time(); $help1['order_id'] = -1;//补位的统一用-1 $help1['fans'] = 1; $help1['goods_num'] = 0; $help1['create_time'] = $time; $help1['update_time'] = $time; $help1['head_picture'] = $this->headPicture(); $helps[] = $help1; $join->help_count = $join->help_count + 2; // 拼团人数+1 }else{ $join->help_count = $join->help_count + 1; } $model->insertAll($helps); $flag = false; if ($join->help_count >= $join->people_count){ $flag = true; $join->status = 1; } if($flag){ //成功了话写真实订单 $pay = new GroupBuyLbPay; $pay->ptSuccessNotify($join->id); $pay->receiveCoupon($join->user_id,$join->group_buy_lb_activity_id); } $join->save(); // Db::commit(); } } } } /* private function toIncHelpCommon($list){ foreach($list as $row){ $group_buy_lb_activity_id = $row['group_buy_lb_activity_id']; $activity = GroupBuyLbActivity::where('id',$group_buy_lb_activity_id)->find(); if (!$activity){ continue; } //这一拼团的真实付费用户有几个 $real_pay_cnt = GroupBuyLbHelp::where('join_id',$row['id'])->where('pay_state',1)->where("fans",0)->where('is_virtual_join_user',0)->count(); if($activity->tb_cnt>=0&&$real_pay_cnt>=$activity->tb_cnt){ if($row['people_count']>$row['help_count']){ //$k++; //开始补位 Db::startTrans(); $join = GroupBuyLbJoin::where('id',$row['id'])->lock('for update')->find(); $help['group_buy_lb_activity_id'] = $row['group_buy_lb_activity_id']; $help['join_id'] = $row['id']; $help['user_id'] = 0; $help['pay_state'] = 1; $help['pay_time'] = time(); $help['order_id'] = -1;//补位的统一用-1 $help['fans'] = 1; $help['goods_num'] = 0; $help['head_picture'] = $this->headPicture(); $model = new GroupBuyLbHelp; $model->save($help); $join->help_count += 1; // 拼团人数+1 //$flag = false; //拼团人数够了 if($join->help_count==$join->people_count){ $join->status = 1; } $join->save(); Db::commit(); } } } }*/ //订单处理 public function orderDeal(){ $this->toIncHelp(); //自动补单 $this->cancelOrder();//取消未支付订单 $this->toCheckPtFail();//拼团没成功的 join status =2 } //取消订单 public function cancelOrder(){ $list = GroupBuyLbHelp::where("pay_state",0)->limit(5)->order(['create_time'=>'asc'])->field('id')->select(); $now = time(); $k = 0; foreach($list as $row){ Db::startTrans(); $one = GroupBuyLbHelp::where('id',$row['id'])->lock('for update')->find(); $ts = time()-strtotime($one->create_time); if($ts>60){ //超过1分钟没支付 $order_no = $one->order_no; $one->pay_state = 2; $one->save(); //有米卡支付的话 if($one->rice_card_id > 0){ $this->riceCardReturn($one->rice_card_id,$one->rice_card_money,$one->order_no,$one->pay_money); } $join = GroupBuyLbJoin::where('id',$one->join_id)->find(); if($join){ //说明是团长发起的,但没有付款 if($join->help_count == 0){ $join->end_time = Date("Y-m-d H:i:s",time()); $join->status = 3; $join->save(); } } $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$one->group_buy_lb_activity_id)->find(); //取消订单 回退库存 if($groupgoods){ StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$one->goods_num); } $k++; } Db::commit(); } echo 'success:k:'.$k; } public function testWx(){ $order_no = 'ysc2022041698489710'; $result = $this->reqWx($order_no); echo $result; } //回调微信 public function reqWx($order_no){ $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/'.$order_no.'?mchid=1615908904'; $data['mchid'] = '1615908904'; $data['out_trade_no'] = $order_no; $result = curl_post($url,json_encode($data)); return $result; } public function getActivity($activity_id){ $activity = GroupBuyLbActivity::where("id",$activity_id)->find(); if(empty($activity)){ return false; } $now = Date("Y-m-d H:i:s",time()); if($now > $activity->end_time){ return false; } if($activity->start_time>$now){ return false; } if($activity->audit_status!=1||$activity->status!=1){ return false; } return $activity; } /** * 获取商品详情 * @param int $id * @return array */ public function detail($activity_id =0) { if(empty($activity_id)){ $activity_id = 5; } $activity = $this->getActivity($activity_id); if(!$activity){ return $this->renderError("活动已结束"); } $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$activity_id)->find(); $id = $groupgoods->goods_id; $addressId = 0; $staffUserId = 0; $user = UserService::getCurrentLoginUser(false); $user_id = $user->user_id??0; // 商品详情 $model = new GoodsModel; $goodsInfo = $model->getDetails($id, $user, $addressId, $staffUserId); $goodsInfo->inc('view_num', 1)->update(); if ($user) { $browseRecord = BrowseRecords::whereDay('create_time')->where(['user_id' =>$user_id, 'source_type' => 1, 'source_id' => $id])->find(); if (!$browseRecord) { BrowseRecords::create([ 'user_id' => $user_id, 'source_type' => 1, 'source_id' => $id ]); $goodsInfo->inc('view_distinct_num', 1)->update(); } else { $browseRecord->update_time = time(); $browseRecord->save(); } } $goods = $goodsInfo->toArray(); $goods['goods_sku_id'] = $groupgoods->goods_sku_id; $data['goods'] = $goods; $help = GroupBuyLbHelp::where("group_buy_lb_activity_id",$activity_id)->where('user_id',$user_id)->where('pay_state',1)->where('order_id',0)->find(); $helpdata = null; if($help){ $thatjoin = GroupBuyLbJoin::where('id',$help->join_id)->where('status','in',[0,1])->find(); } if($help&&$thatjoin){ $helpdata['join_id'] = $help->join_id; $helpdata['pay_state'] = $help->pay_state; $helpdata['activity_id'] = $help->group_buy_lb_activity_id; } $now = Date("Y-m-d H:i:s",time()); $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(); $toPtList = [];//去拼团列表 if(!empty($joinList)){ foreach($joinList as $row){ $toPtList[] = [ 'hc_count' =>$row['hc_count'], 'head_picture'=>$row['user']['avatar']['preview_url']??'', 'nick_name'=>$row['user']['nick_name']??'', 'user_id'=>$row['user_id'], 'join_id'=>$row['id'] ]; } } $data['groupbuy'] = ['fmt_end_time'=> $activity->fmt_end_time, 'group_price'=> $groupgoods->group_price, 'people_count'=>$activity->people_count, 'share_copy_writing'=>$activity->share_copy_writing, 'share_title'=>$activity->share_title, 'help'=> $helpdata, 'to_pt_list'=>$toPtList ]; return $this->renderSuccess(compact('data')); } //分享详情(拼团详情团长/团员) public function joininfo(int $join_id){ $user = UserService::getCurrentLoginUser(false); $user_id = $user->user_id??0; $joinInfo = GroupBuyLbJoin::with(['help'])->where("id",$join_id)->find(); $join = $joinInfo->toArray(); // var_dump($user_id); // die(); if(empty($join)){ return $this->renderError("找不到记录"); } $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$join['group_buy_lb_activity_id'])->find(); if(empty($groupgoods)){ return $this->renderError("找不到商品"); } $id = $groupgoods->goods_id; $addressId = 0; $staffUserId =0; $model = new GoodsModel; $goodsInfo = $model->getDetails($id, $user, $addressId, $staffUserId); $join['hc_count'] = $joinInfo->hc_count; $join['fmt_end_time'] = $joinInfo->fmt_end_time; if($user){ $join['is_self'] = $user->user_id==$join['user_id']?true:false; }else{ $join['is_self'] = false; } $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(); $join['cur_user_have_help'] = $cur_user_help; $help = $join['help']; $newhelp = []; $k = 0; if(!empty($help)){ foreach($help as $row){ $newhelp[] = ['head_picture'=>$row['head_picture'], 'pay_state'=>$row['pay_state'],'is_tz'=>$row['user_id']==$join['user_id']?true:false ]; } } $join['help'] = $newhelp; //优惠券 $activity = GroupBuyLbActivity::with(['coupon'])->find($join['group_buy_lb_activity_id']); $share_title = $activity['share_title']; if($activity->an_share_title==1){ $share_title = ($user->nick_name??0).''.$share_title; } $join['share_title'] = $share_title; $data['join'] = $join; $goods = $goodsInfo->toArray(); $goods['goods_sku_id'] = $groupgoods->goods_sku_id; $data['goods'] = $goods; //优惠券 $activity = GroupBuyLbActivity::with(['coupon'])->find($join['group_buy_lb_activity_id']); // $data['coupon'] = $activity['coupon']??null; $coupon_price_total = 0; if($activity['coupon']){ foreach ($activity['coupon'] as $coupon){ $coupon_price_total += $coupon['reduce_price']; } } $data['coupon_price_total'] = $coupon_price_total; $data['groupbuy'] = ['group_price'=> $groupgoods->group_price]; return $this->renderSuccess(compact('data')); } //我的拼团列表 public function mylist(){ $user = UserService::getCurrentLoginUser(); $user_id = $user->user_id??0; $model = new GroupBuyLbHelp; $list = $model->getList($user_id); return $this->renderSuccess(compact('list')); } /** * 发起虚拟拼团 * @param $join_id * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author: zjwhust * @Time: 2022/6/11 11:27 */ public function addJoin($join_id){ $user = UserService::getCurrentLoginUser(true); $user_id = $user->user_id??0; // dd($join_id); $join = GroupBuyLbJoin::find($join_id); if(!$join){ return $this->renderError("拼团找不到"); } $lbhelp = GroupBuyLbHelp::where(['join_id'=>$join_id,'user_id'=>$user_id])->find(); if(!$lbhelp){ return $this->renderError('找不到参与的团'); } if($lbhelp['is_virtual_join_user']==1){ return $this->renderError('团长不能再次发起免费团'); } if($lbhelp['virtual_join_id']>0){ return $this->renderError('已经发起过免费团'); } //发起拼团 $activity = GroupBuyLbActivity::where("id",$join['group_buy_lb_activity_id'])->find(); if($activity['start_time']>date('Y-m-d H:i:s') || $activity['end_time']renderError('拼团活动已经结束了'); } Db::startTrans(); try{ $share_title = $activity['share_title']; if($activity->an_share_title==1){ $share_title = $user->nick_name.''.$share_title; } //写入发团记录 $join = [ 'group_buy_lb_activity_id' => $join['group_buy_lb_activity_id'], 'people_count'=> $activity['people_count'], 'help_count'=> 1, //虚拟团长也算一个人 'end_time' => Date("Y-m-d H:i:s",time() + $activity['during_time']*60*60), 'share_title'=>$share_title, 'share_copy_writing'=>$activity['share_copy_writing'], 'create_time'=>time(), 'update_time'=>time(), 'user_id'=>$user_id, 'is_virtual'=>1 //虚拟团 ]; $new_join = GroupBuyLbJoin::create($join); //写入参团记录 $help = [ 'user_id' => $user_id, 'order_no' => '', 'group_buy_lb_activity_id' => $join['group_buy_lb_activity_id'], 'join_id'=>$new_join['id'], 'goods_num' =>0, 'head_picture'=>$user->avatar['preview_url']??'', 'rice_card_id'=>0, 'rice_card_money'=>0.00, 'rice_card_express_money'=>0.00, 'pay_money'=> 0.00, 'express_money'=> 0.00, 'order_money'=> 0.00, 'provider_ids'=>'', 'good_rice_card_money'=>0, 'is_virtual_join_user'=>1, //是虚拟团长 'virtual_join_id'=>0,//发起的虚拟团id 'pay_state'=>1,//默认写成已支付,因为不需要真的下单 'fans'=>1,//0真实用户 1假用户 'user_name'=>'', 'phone'=>'', 'province_id'=>0, 'city_id'=>0, 'detail'=>'', 'pay_type'=>OrderPayTypeEnum::WECHAT, ]; GroupBuyLbHelp::create($help); //上一个团员的参与记录写入发起的虚拟团id $lbhelp->virtual_join_id = $join_id; $lbhelp->save(); //如果一人成团直接成功 if($activity['people_count']==1){ $GroupBuyLbPay = new GroupBuyLbPay(); //拼团成功,写入订单逻辑 $GroupBuyLbPay->ptSuccessNotify($new_join['id']); //发放优惠 if ($user_id > 0 ){ $GroupBuyLbPay->receiveCoupon($user_id,$join['group_buy_lb_activity_id']); } } Db::commit(); return $this->renderSuccess(['join_id'=>$new_join['id']]); } catch (\Exception $e) { Db::rollback(); return $this->renderError('提交失败'); } } }