0, 'starttime' => ['BETWEEN',[$starttime,$endtime]], 'notice_status' => 0, ]; $task_list = Db::name('lesson_slot')->where($map)->order('starttime asc')->limit(1)->select(); if(empty($task_list)){ echo 'empty'; exit; } foreach($task_list as $slot){ //找出这节课时的预约单 $map = [ 'order.order_status' => 10, 'order.slot_id' => $slot['id'], ]; $order_list = Db::name('lesson_order')->alias('order') ->field('lesson.name,lesson.name_en,user.firstname,user.lastname,user.email,user.lang,user.notice_type,user.whatsapp') ->join('user','order.user_id = user.id','LEFT') ->join('lesson','order.lesson_id = lesson.id','LEFT') ->where($map)->order('order.id asc')->select(); //$order_list = $this->list_lang($order_list,['name']); if(empty($order_list)){ continue; } //给这些预约单的用户发邮件 $obj = new Email(); foreach($order_list as $order){ $result = $obj ->to($order['email']) ->subject('Don’t forget about your class tomorrow!') ->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您预约的['.$order['name'].']将于'.date('Y-m-d H:i',$slot['starttime']).'开课,请合理安排时间,准时来上课哦!') ->send(); //发whatsapp $parameters = [ [ 'type' => 'text', 'text' => $order['firstname'].' '.$order['lastname'], ], [ 'type' => 'text', 'text' => $order['name_en'], ], [ 'type' => 'text', 'text' => date('Y-m-d H:i',$slot['starttime']), ], ]; $this->whatapp($order['whatsapp'],'the_class_will_start_tomorrow','en_US',$parameters); } //这节课时,任务完成 $update = [ 'notice_status' => 1, ]; Db::name('lesson_slot')->where('id',$slot['id'])->update($update); } } //课程取消,通知。计划任务1小时执行一次 public function auto_lesson_slot_cancel(){ $starttime = strtotime(date('Y-m-d')) + 86400; $endtime = $starttime + 86399; $map = [ 'status' => 30, // 'starttime' => ['BETWEEN',[$starttime,$endtime]], 'cancel_notice_status' => 0, ]; $task_list = Db::name('lesson_slot')->where($map)->order('starttime asc')->limit(1)->select(); if(empty($task_list)){ echo 'empty'; exit; } foreach($task_list as $slot){ //找出这节课时的预约单 $map = [ 'order.order_status' => 10, 'order.slot_id' => $slot['id'], ]; $order_list = Db::name('lesson_order')->alias('order') ->field('lesson.name,lesson.name_en,user.firstname,user.lastname,user.email,user.lang,user.notice_type,user.whatsapp') ->join('user','order.user_id = user.id','LEFT') ->join('lesson','order.lesson_id = lesson.id','LEFT') ->where($map)->order('order.id asc')->select(); //$order_list = $this->list_lang($order_list,['name']); if(empty($order_list)){ continue; } //给这些预约单的用户发邮件 $obj = new Email(); foreach($order_list as $order){ $result = $obj ->to($order['email']) ->subject('Class is Cancelled!') ->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您预约的['.$order['name'].']将于'.date('Y-m-d H:i:s',$slot['starttime']).'开课,请合理安排时间,准时来上课哦!') ->send(); } //这节课时,任务完成 $update = [ 'cancel_notice_status' => 1, ]; Db::name('lesson_slot')->where('id',$slot['id'])->update($update); } } //套餐将要到期,一个月,两周,一周,逐级通知,提醒三次。计划任务分别一小时执行一次 public function auto_package_order_notice_mon(){ $map = [ 'order.order_status' => 1, 'order.remain' => ['gt',0], 'order.endtime' => ['lt',time()+(86400*30)], 'order.notice_status' => 0, ]; $task_list = Db::name('package_order')->alias('order') ->field('order.id,order.endtime,p.name,p.name_en,user.firstname,user.lastname,user.email,user.lang,user.notice_type,user.whatsapp') ->join('lesson_package p','order.package_id = p.id','LEFT') ->join('user','order.user_id = user.id','LEFT') ->where($map)->order('endtime asc')->limit(5)->select(); if(empty($task_list)){ echo 'empty'; exit; } $obj = new Email(); foreach($task_list as $order){ //给这些用户发邮件 $result = $obj ->to($order['email']) ->subject('Elin Dance Studio 套餐一个月内到期提醒!') ->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您购买的套餐['.$order['name'].']将于'.date('Y-m-d H:i:s',$order['endtime']).'过期,建议您在过期内使用完毕!') ->send(); //任务完成 $update = [ 'notice_status' => 1,//月通知已发送 ]; Db::name('package_order')->where('id',$order['id'])->update($update); } } public function auto_package_order_notice_2week(){ $map = [ 'order.order_status' => 1, 'order.remain' => ['gt',0], 'order.endtime' => ['lt',time()+(86400*14)], 'order.notice_status' => 1, ]; $task_list = Db::name('package_order')->alias('order') ->field('order.id,order.endtime,p.name,p.name_en,user.firstname,user.lastname,user.email,user.lang,user.notice_type,user.whatsapp') ->join('lesson_package p','order.package_id = p.id','LEFT') ->join('user','order.user_id = user.id','LEFT') ->where($map)->order('endtime asc')->limit(5)->select(); if(empty($task_list)){ echo 'empty'; exit; } $obj = new Email(); foreach($task_list as $order){ //给这些用户发邮件 $result = $obj ->to($order['email']) ->subject('Elin Dance Studio 套餐两周内到期提醒!') ->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您购买的套餐['.$order['name'].']将于'.date('Y-m-d H:i:s',$order['endtime']).'过期,建议您在过期内使用完毕!') ->send(); //任务完成 $update = [ 'notice_status' => 2,//2周通知已发送 ]; Db::name('package_order')->where('id',$order['id'])->update($update); } } public function auto_package_order_notice_1week(){ $map = [ 'order.order_status' => 1, 'order.remain' => ['gt',0], 'order.endtime' => ['lt',time()+(86400*7)], 'order.notice_status' => 2, ]; $task_list = Db::name('package_order')->alias('order') ->field('order.id,order.endtime,p.name,p.name_en,user.firstname,user.lastname,user.email,user.lang,user.notice_type,user.whatsapp') ->join('lesson_package p','order.package_id = p.id','LEFT') ->join('user','order.user_id = user.id','LEFT') ->where($map)->order('endtime asc')->limit(5)->select(); if(empty($task_list)){ echo 'empty'; exit; } $obj = new Email(); foreach($task_list as $order){ //给这些用户发邮件 $result = $obj ->to($order['email']) ->subject('Elin Dance Studio 套餐一周内到期提醒!') ->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您购买的套餐['.$order['name'].']将于'.date('Y-m-d H:i:s',$order['endtime']).'过期,建议您在过期内使用完毕!') ->send(); //任务完成 $update = [ 'notice_status' => 3,//2周通知已发送 ]; Db::name('package_order')->where('id',$order['id'])->update($update); } } /////////////////////////////////////////下面都是工具方法//////////////////////////////////////////////// public function whatapp($receive_mobile,$template,$code,$parameters){ if(empty($receive_mobile)){return true;} $token = config('site.whatsapp_token'); //发送者 $mobile_id = '337736419413019'; //Elin Dance Stuido 2:+65 8015 4154 , WhatsApp Business Account ID: 336509229537586 //发送 $url = 'https://graph.facebook.com/v19.0/'.$mobile_id.'/messages'; $header = [ 'Authorization: Bearer ' . $token, 'Content-Type: application/json', ]; $body = [ 'messaging_product' => 'whatsapp', 'recipient_type' => 'individual', 'to' => $receive_mobile, 'type' => 'template', 'template' => [ 'name' => $template, 'language' => [ 'code' => $code ], 'components' => [ [ 'type' => 'body', 'parameters' => $parameters ] ], ], ]; $body = json_encode($body); $rs = curl_post($url,$body,$header); return true; } //结果集信息里,多个字段需要翻译 private function list_lang($list,$field,$lang = ''){ if(!$list || empty($list)){ return $list; } foreach($list as $vo => $info){ $list[$vo] = $this->info_lang($info,$field); } return $list; } //单条信息里,多个字段需要翻译 private function info_lang($data,$field,$lang = ''){ if(!$data || empty($data)){ return $data; } foreach($data as $key => $val){ if(in_array($key,$field)){ if($lang == 'EN'){ $data[$key] = $data[$key.'_en']; unset($data[$key.'_en']); }else{ unset($data[$key.'_en']); } } } return $data; } }