where('is_show',1)->order('weigh asc')->autopage()->select(); $list = list_domain_image($list,['image']); $list = $this->list_lang($list,['name','title','info','shiherenqun','pingjunrenshu','sirenkecheng','daoshi']); $this->success(1,$list); } //售课分类列表 public function lesson_cate(){ $result = [ ['id'=>0,'name'=>'全部','name_en'=>'ALL'] ]; $list = Db::name('lesson_cate')->order('id asc')->select(); foreach($list as $key => $val){ $result[] = $val; } $result = $this->list_lang($result,['name']); $this->success(1,$result); } //日历列表 //教练列表 public function coach_list(){ $list = Db::name('coach')->field('id,nickname,avatar')->where('status',1)->order('nickname asc')->select(); $list = list_domain_image($list,['avatar']); $this->success(1,$list); } //课时列表首页 //根据年,月获取当月剩余日期,有课程的标记1 public function slot_index(){ $getdate = input('date',date('Y-m')); if(empty($getdate)){ $getdate = date('Y-m'); } $year = substr($getdate,0,4); $month = substr($getdate,-2,2); //今天是哪日 if($year == date('Y') && $month == date('m')){ //如果是今年今月,默认今天开始 $startday = date('d'); }else{ //从1号开始 $startday = '01'; } //所有课程点进来的 额外传参 $lesson_id = input('lesson_id',0); if($lesson_id){ $first_starttime = Db::name('lesson_slot')->where('lesson_id',$lesson_id)->where('status',0)->where('starttime','gt',time())->where('is_show',1)->order('starttime asc')->value('starttime'); // $first_startdate = date('Y-m-d H:i:s',$first_starttime);dump($first_startdate);exit; if($first_starttime){ $year = date('Y',$first_starttime); $month = date('m',$first_starttime); $startday = date('d',$first_starttime); } } //一周 $week_arr = [ 1 => '周一', 2 => '周二', 3 => '周三', 4 => '周四', 5 => '周五', 6 => '周六', 7 => '周日', ]; //本月结束日 $endday_arr = [ '01' => 31, '02' => 28, '03' => 31, '04' => 30, '05' => 31, '06' => 30, '07' => 31, '08' => 31, '09' => 30, '10' => 31, '11' => 30, '12' => 31, ]; if($year%4 == 0){ $endday_arr['02'] = 29; } $endday = $endday_arr[$month]; //拿数据 $startdate = $getdate.'-'.$startday; $enddate = $getdate.'-'.$endday; $where = [ 'starttime' => ['BETWEEN',[strtotime($startdate),strtotime($enddate)+86399]], 'status' => 0, 'is_show' => 1, ]; //dump($where);exit; $slots = Db::name('lesson_slot')->where($where)->field('id,starttime')->select(); $date_arr = []; for($i=intval($startday);$i<=$endday;$i++){ $j = $i; if($j < 10){ $j = 0 . $j; } $idate = $year.'-'.$month.'-'.$j; $itime = strtotime($idate); $week = $this->lang == 'en' ? date('D',$itime) : $week_arr[date('N',$itime)]; $i_data = [ 'yeah' =>$year, 'month'=>$month, 'day' => $j.'', 'date' => $idate, 'week' => $week, 'is_today' => 0, 'slot_num' => 0, 'date_show'=> $this->lang == 'en' ? $j.'.'.$month : $month.'.'.$j, ]; foreach($slots as $slot){ if(date('Y-m-d',$slot['starttime']) == $idate) { $i_data['slot_num'] += 1; } } if($idate == date('Y-m-d')){ $i_data['is_today'] = 1; } $date_arr[] = $i_data; } $this->success(1,$date_arr); } //某日课时列表 public function slot_list(){ $date = strtotime(input('date',date('Y-m-d'))); $cate_id = input('cate_id',0); $coach_id = input('coach_id',0); //所有课程点进来的 额外传参 $lesson_id = input('lesson_id',0); $where = [ 'slot.starttime' => ['BETWEEN',[$date,$date+86399]], 'slot.status' => 0, //状态:0=报名中,20=已点名,30=已取消 //'slot.is_show' => 1, //是否显示:1=上架,0=下架 'lesson.is_show' => 1,//课程须上架 ]; //课时 $list = Db::name('lesson_slot')->alias('slot') ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price') ->join('lesson','slot.lesson_id = lesson.id','LEFT') ->where($where); if($lesson_id){ $list->where('slot.lesson_id',$lesson_id); }else{ if($cate_id){ $list->where('lesson.lessoncate_id',$cate_id); } if($coach_id){ $list->where('find_in_set(:coach_ids,coach_ids)', ['coach_ids' => $coach_id]); } } $list = $list->order('slot.starttime asc,slot.id asc')->select(); if(empty($list)){ $this->success(1,[]); } $list = list_domain_image($list,['image']); $list = $this->list_lang($list,['name']); //准备教练数据 $coach_list = Db::name('coach')->column('id,nickname'); foreach($list as $key => &$slot){ //hours转换 $slot['hours'] = floatval($slot['hours']); //放入教练 $coach_text = ''; $coach_ids = explode(',',$slot['coach_ids']); foreach($coach_ids as $coach_id){ if(isset($coach_list[$coach_id])){ $coach_text .= $coach_list[$coach_id].','; } } $slot['coach_text'] = substr($coach_text,0,-1); //剩余空位数量 $pay_number = Db::name('lesson_order')->where('slot_id',$slot['id'])->where('jointype',1)->where('order_status',10)->sum('usernumber'); $slot['num_remain'] = $slot['num_max'] - $pay_number; if($slot['num_remain'] < 0){ $slot['num_remain'] = 0; } //剩余候补数量 $slot['wait_remain'] = 0; if($slot['waitnum_max'] > 0){ $wait_number = Db::name('lesson_order')->where('slot_id',$slot['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber'); $slot['wait_remain'] = $slot['waitnum_max'] - $wait_number; if($slot['wait_remain'] < 0){ $slot['wait_remain'] = 0; } } //预约按钮,1能预约,0不能 $slot['button_status'] = 0; if($slot['status'] == 0 && $slot['num_remain'] > 0){ $slot['button_status'] = 1;//能预约 } if($slot['status'] == 0 && $slot['wait_remain'] > 0){ $slot['button_status'] = 2;//能候补 } //右上角备注 if(time() >= $slot['starttime']){ $slot['num_remark'] = __('报名已截止'); $slot['button_status'] = 0;//报名截止了,强制改 }else{ // $slot['num_remark'] = __('剩N个名额',['number'=>$slot['num_remain']]); $slot['num_remark'] = __('预约:').$pay_number.'/'.$slot['num_max']; if($slot['waitnum_max'] > 0){ $slot['num_remark'] .= ' '. __('候补:') .$wait_number.'/'.$slot['waitnum_max']; } } //上下架的影响 if($slot['is_show'] == 0){ $slot['num_remark'] = __('限制预约'); $slot['button_status'] = 0;//不能预约,强制改 } } $this->success(1,$list); } public function test(){ echo __('剩N个名额',['number'=>8]); } //课时详情 public function slot_info(){ $slot_id = input('slot_id',0); $number = input('number',1,'intval'); //课时 $info = Db::name('lesson_slot')->alias('slot') ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price,danceroom.name as danceroom_name,danceroom.name_en as danceroom_name_en') ->join('lesson','slot.lesson_id = lesson.id','LEFT') ->join('danceroom','slot.danceroom_id = danceroom.id','LEFT') ->where('slot.id',$slot_id)->where('slot.is_show',1)->find(); if(empty($info)){ $this->error('课程可能已取消,请刷新重试'); } $info = info_domain_image($info,['image']); $info = $this->info_lang($info,['name','danceroom_name','address','remark']); //准备教练数据 $coach_list = Db::name('coach')->where('id','IN',$info['coach_ids'])->column('nickname'); $info['coach_text'] = implode(',',$coach_list); //剩余空位数量 $pay_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',1)->where('order_status',10)->sum('usernumber'); $info['num_remain'] = $info['num_max'] - $pay_number; if($info['num_remain'] < 0){ $info['num_remain'] = 0; } //剩余候补数量 $info['wait_remain'] = 0; $info['wait_number'] = 0; if($info['waitnum_max'] > 0){ $wait_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber'); $info['wait_number'] = $wait_number; $info['wait_remain'] = $info['waitnum_max'] - $wait_number; if($info['wait_remain'] < 0){ $info['wait_remain'] = 0; } } //时间 if($this->lang == 'en'){ $info['slot_time'] = date('M d',$info['starttime']).'('.date('D',$info['starttime']).')'.','.date('H:i',$info['starttime']).'-'.date('H:i',$info['endtime']); }else{ $info['slot_time'] = date('n月d',$info['starttime']).'(周'.date('N',$info['starttime']).')'.','.date('H:i',$info['starttime']).'-'.date('H:i',$info['endtime']); } //是否有可买配套 $wait_buy_package = Db::name('lesson_package') ->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']]) ->where('is_show',1) ->find(); $info['wait_buy_package'] = !empty($wait_buy_package) ? 1 : 0; //预约按钮,1能预约,0不能 $info['button_status'] = 0; if($info['status'] == 0 && $info['num_remain'] > 0){ $info['button_status'] = 1;//能预约 } if($info['status'] == 0 && $info['wait_remain'] > 0){ $info['button_status'] = 2;//能候补 } //右上角备注 if(time() >= $info['starttime']){ $info['button_status'] = 0;//报名截止了,强制改 } //总价格乘出来 $info['price'] = bcmul($info['price'],$number,2); //此课程是否还有未使用的套餐(多个包含赠送的) $number_hours = bcmul($number,$info['hours'],1);//每日课时按小时扣 $map = [ 'o.user_id' =>$this->auth->id, 'o.endtime' => ['gt',time()], 'o.remain' => ['egt',$number_hours], //不能只是大于0,还得大于等于报名人数 'o.order_status' => 1, 'o.use_status' => 1, //已激活的。 ]; $package_list = Db::name('package_order')->alias('o') ->join('lesson_package p','o.package_id = p.id','LEFT') ->field('o.id,o.remain,o.starttime,o.endtime,o.is_gift,p.name,p.name_en') ->where($map) ->where('find_in_set(:lesson_ids,o.lesson_ids)', ['lesson_ids' => $info['lesson_id']]) ->order('o.endtime asc')->select(); $package_list = $this->list_lang($package_list,['name']); if(!empty($package_list)){ foreach($package_list as $key => &$val){ //转换remain $val['remain'] = floatval($val['remain']); if($this->lang == 'zh-cn'){ $val['time_text'] = date('m月d,Y',$val['starttime']).'-'.date('m月d,Y',$val['endtime']); }else{ $val['time_text'] = date('M d,Y',$val['starttime']).'-'.date('M d,Y',$val['endtime']); } } } $info['package_list'] = $package_list; //可用试课 if($number == 1){ $try_map = [ 'o.user_id' => $this->auth->id, 'o.endtime' => ['gt',time()], 'o.order_status' => 10, ]; $tryorder_list = Db::name('trylesson_order')->alias('o') ->join('trylesson','o.trylesson_id = trylesson.id','LEFT') ->field('o.id,o.starttime,o.endtime,trylesson.name,trylesson.name_en') ->where($try_map) ->where('find_in_set(:lesson_ids,o.lesson_ids)', ['lesson_ids' => $info['lesson_id']]) ->order('o.endtime asc')->select(); $tryorder_list = $this->list_lang($tryorder_list,['name']); if(!empty($tryorder_list)){ foreach($tryorder_list as $key => &$val){ if($this->lang == 'zh-cn'){ $val['time_text'] = date('m月d,Y',$val['starttime']).'-'.date('m月d,Y',$val['endtime']); }else{ $val['time_text'] = date('M d,Y',$val['starttime']).'-'.date('M d,Y',$val['endtime']); } } } }else{ $tryorder_list = []; } $info['tryorder_list'] = $tryorder_list; //hours转换 $info['hours'] = floatval($info['hours']); $this->success(1,$info); } //课时申请报名,提前预判 public function slot_apply_before(){ if(!$this->apiLimit()){ $this->error(__('点击太频繁,休息一下吧')); } $slot_id = input('slot_id',0,'intval'); $number = input('number',1,'intval'); if($number <= 0){ $this->error('预约人数错误'); } //课时 $info = Db::name('lesson_slot')->alias('slot') ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price') ->join('lesson','slot.lesson_id = lesson.id','LEFT') ->where('slot.id',$slot_id)->where('slot.status',0)->where('slot.is_show',1)->find(); if(empty($info)){ $this->error('课程可能已取消,请刷新重试'); } if($info['endtime'] < time()){ $this->error('课程已经结束了,不能再进行预约'); } //剩余空位数量 $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('jointype',1)->where('order_status',10)->sum('usernumber'); $num_remain = $info['num_max'] - $pay_number; if($num_remain < 0){ $num_remain = 0; } //预约数量足够 if($num_remain >= $number){ $this->success('success',1); } //剩余候补数量 $wait_remain = 0; if($info['waitnum_max'] > 0){ $wait_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber'); $wait_remain = $info['waitnum_max'] - $wait_number; if($wait_remain < 0){ $wait_remain = 0; } } //候补数量足够 if($wait_remain >= $number){ $this->success(__('可预约人数不足。请确认您是否想在候补名单上。一旦他人取消,您将被自动添加到班级中'),2); } //两者都不够了 $this->error('可预约名额不足'); } //课时申请报名 public function slot_apply(){ if(!$this->apiLimit()){ $this->error(__('点击太频繁,休息一下吧')); } $slot_id = input('slot_id',0,'intval'); $number = input('number',1,'intval'); $remark = input('remark','','trim'); $paytype = input('paytype',1,'intval');//支付类型:1=课程套餐,2=线上付款,3=购买套餐中,4=试课单,5=候补 $packageorder_id = input('packageorder_id',0,'intval'); $trylessonorder_id = input('trylessonorder_id',0,'intval'); $jointype = input('jointype',1);//预约类型:1=预约,2=候补 if($number <= 0){ $this->error('预约人数错误'); } if(!in_array($paytype,[1,2,3,4])){ $this->error(); } if(!in_array($jointype,[1,2])){ $this->error(); } //课时 $info = Db::name('lesson_slot')->alias('slot') ->field('slot.*,lesson.name,lesson.name_en,lesson.image,lesson.price') ->join('lesson','slot.lesson_id = lesson.id','LEFT') ->where('slot.id',$slot_id)->where('slot.status',0)->where('slot.is_show',1)->find(); if(empty($info)){ $this->error('课程可能已取消,请刷新重试'); } if($info['endtime'] < time()){ $this->error('课程已经结束了,不能再进行预约'); } //剩余空位数量 $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('jointype',1)->where('order_status',10)->sum('usernumber'); $num_remain = $info['num_max'] - $pay_number; if($num_remain < 0){ $num_remain = 0; } //剩余候补数量 $wait_remain = 0; if($info['waitnum_max'] > 0){ $wait_number = Db::name('lesson_order')->where('slot_id',$info['id'])->where('jointype',2)->where('order_status',0)->sum('usernumber'); $wait_remain = $info['waitnum_max'] - $wait_number; if($wait_remain < 0){ $wait_remain = 0; } } //报名人数不能超限 if($jointype == 1){ if($num_remain < $number){ $this->error(__('预约名额只剩N名',['number'=>$num_remain])); } //可以继续 }else{ /*if($num_remain > 0){ $this->error(__('预约还有名额,不能候补')); }*/ //候补人数不能超限 if($wait_remain < $number){ $this->error(__('候补名额只剩N名',['number'=>$wait_remain])); } //可以继续 if($paytype != 1){ $this->error('请选择配套'); } $paytype = 5;//强改支付方式,候补,不能去除 } // $number_hours = bcmul($number,$info['hours'],1);//每日课时按小时扣 $lesson_order = [ 'order_no' => createUniqueNo('S',$this->auth->id), 'user_id' => $this->auth->id, 'slot_id' => $slot_id, 'lesson_id' => $info['lesson_id'], 'order_amount' => bcmul($info['price'],$number,2), 'order_status' => 0, 'paytype' => $paytype, //支付类型:1=课程套餐,2=线上付款,3=购买套餐中,4=试课单,5=候补 'paytime' => 0, 'createtime' => time(), // 'updatetime' => , // 'finishtime' => , 'usernumber' => $number, 'usernumber_hours' => $number_hours, 'userremark' => $remark, 'package_order_id' => 0, 'package_remark' => '',// 比如:5/30,5-7/30 'jointype' => $jointype, ]; // Db::startTrans(); if($paytype == 1){ //检查已选择套餐 $map = [ 'user_id' =>$this->auth->id, 'endtime' => ['gt',time()], 'remain' => ['gt',0], 'order_status' => 1, // 'use_status' => 1, //已激活的 'id' => $packageorder_id, ]; $package_order = Db::name('package_order')->where($map)->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']])->lock(true)->find(); if(!$package_order){ Db::rollback(); $this->error('配套信息不正确,请刷新重试'); } //课时不足支撑报名人数 if($package_order['remain'] < $number_hours){ Db::rollback(); $this->error('该配套余额不足'); } if($package_order['use_status'] != 1){ Db::rollback(); $this->error('该配套尚未激活'); } //扣除一节 $update = [ 'remain' => bcsub($package_order['remain'],$number_hours,1), 'updatetime' => time(), ]; $rs1 = Db::name('package_order')->where('id',$packageorder_id)->update($update); if($rs1 === false){ Db::rollback(); $this->error('扣除套餐余额失败'); } //修改预约单数据 $lesson_order['order_amount'] = 0; $lesson_order['order_status'] = 10; $lesson_order['paytime'] = time(); $lesson_order['package_order_id'] = $packageorder_id; $lesson_order['package_remark'] = ($package_order['sessions'] - $package_order['remain']) . '-' . ($package_order['sessions'] - $package_order['remain'] + $number_hours) .'/'. $package_order['sessions']; //预约单写入 $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order); if(!$lesson_order_id){ Db::rollback(); $this->error('预约失败'); } //更新已预约人数 $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('order_status',10)->sum('usernumber'); $rs_slot = Db::name('lesson_slot')->where('id',$slot_id)->update(['bookednum' => $pay_number]); if($rs_slot === false){ Db::rollback(); $this->error('预约失败'); } Db::commit(); $this->success('预约成功',['returntype'=>1]); } elseif($paytype == 2) { //预约单写入 $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order); if(!$lesson_order_id){ Db::rollback(); $this->error('预约失败'); } //支付订单下单 $pay_order = []; $pay_order['user_id'] = $lesson_order['user_id']; $pay_order['out_trade_no'] = $lesson_order['order_no']; $pay_order['order_amount'] = $lesson_order['order_amount']; $pay_order['createtime'] = $lesson_order['createtime']; $pay_order['pay_type'] = 'hitpay'; $pay_order['platform'] = 'app'; $pay_order['order_status'] = 0; $pay_order['table_name'] = 'lesson_order'; $pay_order['table_id'] = $lesson_order_id; $pay_order['args'] = ''; //拉起支付 $notify_url = config('notify_cdnurl'); $redirect_cdnurl = config('hitpay.lesson_redirect_cdnurl').'?out_trade_no='.$pay_order['out_trade_no'].'&lang='.$this->lang; $hitpay_return = $this->hitpay_payment($pay_order['out_trade_no'],$pay_order['order_amount'],$notify_url,$redirect_cdnurl); if($hitpay_return['status'] !== true){ $this->error($hitpay_return['msg']); } //支付请求id $pay_order['payment_request_id'] = $hitpay_return['id']; $pay_order_id = Db::name('pay_order')->insertGetId($pay_order); if(!$pay_order_id){ Db::rollback(); $this->error('下单失败'); } Db::commit(); $return = [ 'url' => $hitpay_return['url'], 'id' => $hitpay_return['id'], 'returntype' => 2, ]; $this->success(1,$return); } elseif($paytype == 3) { //预约单写入 $lesson_order['order_amount'] = 0; $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order); if(!$lesson_order_id){ Db::rollback(); $this->error('预约失败'); } Db::commit(); //去购买套餐,参数代入过去 $return = [ 'lesson_order_id' => $lesson_order_id, 'returntype' => 3, ]; $this->success(1,$return); } elseif($paytype == 4) { //使用试课单 $map = [ 'id' => $trylessonorder_id, 'user_id' =>$this->auth->id, 'endtime' => ['gt',time()], 'order_status' => 10, ]; $trylesson_order = Db::name('trylesson_order')->where($map)->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']])->lock(true)->find(); if(!$trylesson_order){ Db::rollback(); $this->error('未找到对应的试课'); } //修改预约单数据 $lesson_order['order_amount'] = 0; $lesson_order['order_status'] = 10; $lesson_order['paytime'] = time(); $lesson_order['trylesson_order_id'] = $trylessonorder_id; //预约单写入 $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order); if(!$lesson_order_id){ Db::rollback(); $this->error('预约失败'); } //改掉试课单状态 $update = [ 'order_status' => 20, 'updatetime' => time(), 'lesson_order_id' => $lesson_order_id, ]; $rs1 = Db::name('trylesson_order')->where('id',$trylessonorder_id)->update($update); if($rs1 === false){ Db::rollback(); $this->error('使用试课失败'); } //更新已预约人数 $pay_number = Db::name('lesson_order')->where('slot_id',$slot_id)->where('order_status',10)->sum('usernumber'); $rs_slot = Db::name('lesson_slot')->where('id',$slot_id)->update(['bookednum' => $pay_number]); if($rs_slot === false){ Db::rollback(); $this->error('预约失败'); } Db::commit(); $this->success('预约成功',['returntype'=>4]); } elseif($paytype == 5) { //检查可用的套餐,找一个就可以 $map = [ 'user_id' =>$this->auth->id, 'endtime' => ['gt',time()], 'remain' => ['gt',0], 'order_status' => 1, // 'use_status' => 1, //已激活的 'id' => $packageorder_id, ]; $package_order = Db::name('package_order')->where($map)->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $info['lesson_id']])->find(); if(!$package_order){ Db::rollback(); $this->error('配套信息不正确,请刷新重试'); } //课时不足支撑报名人数 if($package_order['remain'] < $number_hours){ Db::rollback(); $this->error('该配套余额不足'); } if($package_order['use_status'] != 1){ Db::rollback(); $this->error('该配套尚未激活'); } //扣除一节。延迟到转正的时候处理 //修改预约单数据。延迟到转正的时候处理 $lesson_order['package_order_id'] = $packageorder_id; //预约单写入 $lesson_order_id = Db::name('lesson_order')->insertGetId($lesson_order); if(!$lesson_order_id){ Db::rollback(); $this->error('预约失败'); } //更新已预约人数。候补就不需要了 Db::commit(); $this->success('预约候补成功',['returntype'=>5]); } } //配套商店 所有套餐列表 public function package_shop(){ $where2 = []; //排除限购一次的 $map = [ 'o.user_id' => $this->auth->id, 'o.order_status' => 1, 'o.is_gift' => 0, 'p.buytimes' => 1, ]; $check_first = Db::name('package_order')->alias('o') ->join('lesson_package p','o.package_id = p.id','LEFT') ->where($map)->column('o.package_id'); if(!empty($check_first)){ $where2['id'] = ['NOTIN',$check_first]; } //排除新旧会员群体 if($this->auth->oldstatus == 0){ //新会员 $where2['newuser'] = 1; } if($this->auth->oldstatus == 1){ //旧会员 $where2['olduser'] = 1; } //套餐列表 $list = Db::name('lesson_package') ->where('is_show',1) ->where($where2) ->order('weigh desc')->select(); $list = list_domain_image($list,['image']); $list = $this->list_lang($list,['name','validity','activeremark']); $this->success(1,$list); } //从预约过来的 售课套餐列表 public function package_list(){ $lesson_id = input('lesson_id',0); $where2 = []; //排除限购一次的 $map = [ 'o.user_id' => $this->auth->id, 'o.order_status' => 1, 'o.is_gift' => 0, 'p.buytimes' => 1, ]; $check_first = Db::name('package_order')->alias('o') ->join('lesson_package p','o.package_id = p.id','LEFT') ->where($map)->column('o.package_id'); if(!empty($check_first)){ $where2['id'] = ['NOTIN',$check_first]; } //排除新旧会员群体 if($this->auth->oldstatus == 0){ //新会员 $where2['newuser'] = 1; } if($this->auth->oldstatus == 1){ //旧会员 $where2['olduser'] = 1; } //套餐列表 $list = Db::name('lesson_package') ->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $lesson_id]) ->where('is_show',1) ->where($where2) ->order('weigh desc')->select(); $list = list_domain_image($list,['image']); $list = $this->list_lang($list,['name','validity','activeremark']); $this->success(1,$list); } //售课套餐详情 public function package_info(){ $package_id = input('package_id',0); //套餐详情 $list = Db::name('lesson_package') ->where('id',$package_id) ->order('weigh desc')->find(); $list = info_domain_image($list,['image']); $list = $this->info_lang($list,['name','validity','activeremark','content']); $this->success(1,$list); } //下单购买售课套餐 public function package_buy(){ $package_id = input('package_id',0); $lesson_order_id = input('lesson_order_id',0,'intval');//预约单id $package_info = Db::name('lesson_package')->where('id',$package_id)->find(); //如果限购,则报错 if($package_info['buytimes'] == 1){ $map = [ 'user_id' => $this->auth->id, 'order_status' => 1, 'is_gift' => 0, 'package_id' => $package_id, ]; $check_first = Db::name('package_order')->where($map)->find(); if(!empty($check_first)){ $this->error('该配套限购一次,您已经买过了'); } } //排除新旧会员群体 if($this->auth->oldstatus == 0 && $package_info['newuser'] != 1 ){ //新会员 $this->error('您不能购买改配套,请刷新并重试'); } if($this->auth->oldstatus == 1 && $package_info['olduser'] != 1 ){ //旧会员 $this->error('您不能购买改配套,请刷新并重试'); } //套餐订单 $data = [ 'order_no' => createUniqueNo('P',$this->auth->id), 'user_id' => $this->auth->id, 'type' => $package_info['type'], 'package_id' => $package_id, 'lesson_ids' => $package_info['lesson_ids'], 'sessions' => $package_info['sessions'], 'starttime' => 0, 'days' => $package_info['days'], 'endtime' => 0, 'price' => $package_info['price'], 'remain' => $package_info['sessions'], 'order_status'=> 0, 'use_status' => 0,//默认不激活 'paytime' => 0, 'pay_type' => 1, //线上支付 'createtime' => time(), 'updatetime' => 0, 'is_gift' => 0, ]; //如果有赠品,赠品订单 $gift = []; if(!empty($package_info['gift_lesson_id']) && !empty($package_info['gift_sessions'])){ $gift = $data; //订单号不换了 $gift['type'] = $package_info['gift_type']; $gift['lesson_ids'] = $package_info['gift_lesson_id']; $gift['sessions'] = $package_info['gift_sessions']; $gift['remain'] = $package_info['gift_sessions']; $gift['is_gift'] = 1; } //支付订单下单 $pay_order = []; $pay_order['user_id'] = $data['user_id']; $pay_order['out_trade_no'] = $data['order_no']; $pay_order['order_amount'] = $data['price']; $pay_order['createtime'] = $data['createtime']; $pay_order['pay_type'] = 'hitpay'; $pay_order['platform'] = 'app'; $pay_order['order_status'] = 0; $pay_order['table_name'] = 'package_order'; $pay_order['table_id'] = 0; $pay_order['args'] = json_encode(['lesson_order_id'=>$lesson_order_id]);//用来支付完成回调时,扣除N节课,并改掉预约单的状态 //拉起支付 $notify_url = config('notify_cdnurl'); $redirect_cdnurl = config('hitpay.package_redirect_cdnurl').'?out_trade_no='.$pay_order['out_trade_no'].'&lang='.$this->lang; $hitpay_return = $this->hitpay_payment($pay_order['out_trade_no'],$pay_order['order_amount'],$notify_url,$redirect_cdnurl); if($hitpay_return['status'] !== true){ $this->error($hitpay_return['msg']); } //支付请求id $pay_order['payment_request_id'] = $hitpay_return['id']; //入库 Db::startTrans(); $order_id = Db::name('package_order')->insertGetId($data); if(!$order_id){ Db::rollback(); $this->error('下单失败'); } //礼物 if(!empty($gift)){ $gift_order_id = Db::name('package_order')->insertGetId($gift); if(!$gift_order_id){ Db::rollback(); $this->error('下单失败'); } } //支付单 $pay_order['table_id'] = $order_id; $pay_order_id = Db::name('pay_order')->insertGetId($pay_order); if(!$pay_order_id){ Db::rollback(); $this->error('下单失败'); } Db::commit(); $return = [ 'url' => $hitpay_return['url'], 'id' => $hitpay_return['id'], ]; $this->success(1,$return); } //拉起支付 private function hitpay_payment($out_trade_no,$money,$notifyurl,$redirect_cdnurl) { $return = [ 'status' => false, 'msg' => '', 'url' => '', 'id' => 0, ]; $apiKey = config('hitpay.apikey'); try { $hitPayClient = new \HitPay\Client($apiKey, true); $request = new \HitPay\Request\CreatePayment(); $request->setAmount($money) ->setCurrency('SGD') ->setRedirectUrl($redirect_cdnurl) // ->setPaymentMethods(['paynow_online','card']) ->setPaymentMethods(['paynow_online']) ->setPurpose('Elin Dance Studio') ->setWebhook($notifyurl) ->setReferenceNumber($out_trade_no); $result = $hitPayClient->createPayment($request); $return['status'] = true; $return['url'] = $result->getUrl(); $return['id'] = $result->getId(); //print_r($result); /*$data = $hitPayClient->getPaymentStatus($result->getId()); dump($data); dump($data->status);*/ /*$data = $hitPayClient->deletePaymentRequest($data->getId()); print_r($data);*/ } catch (\Exception $e) { $return['msg'] = $e->getMessage(); } return $return; } }