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.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;
}
$coach_name = Db::name('coach')->where('id',$slot['coach_ids'])->value('nickname');
//给这些预约单的用户发邮件
try {
$obj = new Email();
foreach($order_list as $order){
$message =
'Hi,'.$order['firstname']. ' ' .$order['lastname'].'!
We are looking forward to seeing you at the following class tomorrow!
Class:'.$order['name_en'].'
Date: '.date('D l Y',$slot['starttime']).'
Time: '.date('H:i a',$slot['starttime']).'
Please arrive 10 minutes before the class timing to prepare for the harness fitting!
We are located at 450 Alexandra Road, #02-01,
Singapore 119960. For those who are driving, parking is available on level 2 of the building. For those who are taking public transport, the nearest mrt is Labrador Park MRT (7-10 minutes walk) and there is also a bus stop available just outside the building!
We look forward to seeing you for an amazing session! ❤
Best Regards,
Elin Dance Studio
';
$result = $obj
->to($order['email'])
->subject('You have a class tomorrow!')
->message($message)
->send();
//发whatsapp
$parameters = [
[
'type' => 'text',
'text' => $order['firstname'].' '.$order['lastname'],
],
[
'type' => 'text',
'text' => $order['name_en'],
],
[
'type' => 'text',
'text' => $coach_name,
],
[
'type' => 'text',
'text' => date('Y-m-d H:i',$slot['starttime']),
],
];
$this->whatapp($order['whatsapp'],'the_class_will_start_tomorrow','en_US',$parameters);
}
} catch (Exception $e) {
}
//这节课时,任务完成
$update = [
'notice_status' => 1,
];
Db::name('lesson_slot')->where('id',$slot['id'])->update($update);
}
}
//课程取消,通知。计划任务5分钟执行一次
public function auto_lesson_slot_cancel(){
$map = [
'status' => 30,
'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.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;
}
//给这些预约单的用户发邮件
try {
$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'].']已取消')
->send();
$coach_name = Db::name('coach')->where('id',$slot['coach_ids'])->value('nickname');
//发whatsapp
$parameters = [
[
'type' => 'text',
'text' => $order['firstname'].' '.$order['lastname'],
],
[
'type' => 'text',
'text' => $order['name_en'],
],
[
'type' => 'text',
'text' => $coach_name,
],
[
'type' => 'text',
'text' => date('Y-m-d H:i',$slot['starttime']),
],
];
$this->whatapp($order['whatsapp'],'class_cancelled','en_US',$parameters);
}
} catch (Exception $e) {
}
//这节课时,任务完成
$update = [
'cancel_notice_status' => 1,
];
Db::name('lesson_slot')->where('id',$slot['id'])->update($update);
}
}
//购买新套餐之后,通知。计划任务5分钟执行一次
public function auto_after_buy_package(){
$map = [
'order.order_status' => 1,
'order.buy_notice_status' => 0,
'order.is_gift' => 0,
];
$task_list = Db::name('package_order')->alias('order')
->field('order.id,order.starttime,order.endtime,p.name,p.name_en,user.firstname,user.lastname,user.email,user.whatsapp')
->join('lesson_package p','order.package_id = p.id','LEFT')
->join('user','order.user_id = user.id','LEFT')
->where($map)->order('order.paytime asc')->limit(1)->select();
if(empty($task_list)){
echo 'empty';
exit;
}
$obj = new Email();
foreach($task_list as $order){
try {
//给这些用户发邮件
$result = $obj
->to($order['email'])
->subject('Elin Dance Studio 您购买的套餐已到账')
->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您购买的套餐['.$order['name'].']即日起生效!')
->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',$order['starttime']),
],
[
'type' => 'text',
'text' => date('Y-m-d H:i',$order['endtime']),
],
[
'type' => 'text',
'text' => $order['firstname'].' '.$order['lastname'],
],
];
$this->whatapp($order['whatsapp'],'buy_new_package','en_US',$parameters);
} catch (Exception $e) {
}
//任务完成
$update = [
'buy_notice_status' => 1,
];
Db::name('package_order')->where('id',$order['id'])->update($update);
}
}
//套餐将要到期,一个月,两周,一周,逐级通知,提醒三次。计划任务分别一小时执行一次
public function auto_package_order_notice_mon(){
$map = [
'order.order_status' => 1,
'order.use_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,order.remain,user.firstname,user.lastname,user.email,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(2)->select();
if(empty($task_list)){
echo 'empty';
exit;
}
$obj = new Email();
foreach($task_list as $order){
try {
//给这些用户发邮件
$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();
//发whatsapp
$parameters = [
[
'type' => 'text',
'text' => $order['firstname'].' '.$order['lastname'],
],
[
'type' => 'text',
'text' => '30',
],
[
'type' => 'text',
'text' => $order['name_en'],
],
[
'type' => 'text',
'text' => date('Y-m-d H:i',$order['endtime']),
],
[
'type' => 'text',
'text' => ''.$order['remain'].'',
],
];
$this->whatapp($order['whatsapp'],'package_expiration_reminder','en_US',$parameters);
} catch (Exception $e) {
}
//任务完成
$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.use_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,order.remain,user.firstname,user.lastname,user.email,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(2)->select();
if(empty($task_list)){
echo 'empty';
exit;
}
$obj = new Email();
foreach($task_list as $order){
try {
//给这些用户发邮件
$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();
//发whatsapp
$parameters = [
[
'type' => 'text',
'text' => $order['firstname'].' '.$order['lastname'],
],
[
'type' => 'text',
'text' => '14',
],
[
'type' => 'text',
'text' => $order['name_en'],
],
[
'type' => 'text',
'text' => date('Y-m-d H:i',$order['endtime']),
],
[
'type' => 'text',
'text' => ''.$order['remain'].'',
],
];
$this->whatapp($order['whatsapp'],'package_expiration_reminder','en_US',$parameters);
} catch (Exception $e) {
}
//任务完成
$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.use_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,order.remain,user.firstname,user.lastname,user.email,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(2)->select();
if(empty($task_list)){
echo 'empty';
exit;
}
$obj = new Email();
foreach($task_list as $order){
try {
//给这些用户发邮件
$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();
//发whatsapp
$parameters = [
[
'type' => 'text',
'text' => $order['firstname'].' '.$order['lastname'],
],
[
'type' => 'text',
'text' => '7',
],
[
'type' => 'text',
'text' => $order['name_en'],
],
[
'type' => 'text',
'text' => date('Y-m-d H:i',$order['endtime']),
],
[
'type' => 'text',
'text' => ''.$order['remain'].'',
],
];
$this->whatapp($order['whatsapp'],'package_expiration_reminder','en_US',$parameters);
} catch (Exception $e) {
}
//任务完成
$update = [
'notice_status' => 3,//1周通知已发送
];
Db::name('package_order')->where('id',$order['id'])->update($update);
}
}
/**
* 复制本周的课程表
*/
public function auto_slot_copyweek_old(){
$week = date('w');
if($week != 1){
//exit;
}
//先查找 下周有没有数据
$starttime = strtotime('this week Monday') + (86400*7);
$endtime = $starttime + (86400*7);
$check = Db::name('lesson_slot')->where('starttime','BETWEEN',[$starttime,$endtime])->find();
if($check){
echo '下周有数据了';
exit;
}
echo '准备复制';
//拿上周,复制到下周
$starttime = strtotime('this week Monday') - (86400*7); // 获取本周一的时间戳
$endtime = $starttime + (86400*7);
$list = Db::name('lesson_slot')->where('is_show',1)->where('starttime','BETWEEN',[$starttime,$endtime])->order('starttime asc')->select();
if(empty($list)){
echo 'empty';
exit;
}
foreach($list as $key => &$val){
unset($val['id']);
$val['starttime'] = $val['starttime'] + (86400*14);
$val['endtime'] = $val['endtime'] + (86400*14);
$val['bookednum'] = 0;
$val['status'] = 0;
$val['notice_status'] = 0;
$val['finishtime'] = 0;
$val['cancel_reason'] = '';
$val['cancel_time'] = 0;
$val['cancel_notice_status'] = 0;
}
Db::name('lesson_slot')->insertAll($list);
echo '复制完成';
//$this->success('已复制到下周');
}
//每两周一次
//周一早上,复制本周+下周的课,到下下周+下下下周
public function auto_slot_copyweek(){
$week = date('w');
if($week != 1){
echo '不是周一';
exit;
}
$check = Db::name('plantask')->where('key','auto_slot_copyweek')->whereTime('lasttime','week')->find();
if($check){
echo '本周执行过了';
exit;
}
$check = Db::name('plantask')->where('key','auto_slot_copyweek')->whereTime('lasttime','last week')->find();
if($check){
echo '上周执行过了';
exit;
}
//先查找 下周有没有数据
/*$starttime = strtotime('this week Monday') + (86400*14);
$endtime = $starttime + (86400*14);
$check = Db::name('lesson_slot')->where('starttime','BETWEEN',[$starttime,$endtime])->find();
if($check){
echo '下下周和下下下周有数据了';
exit;
}*/
echo '准备复制';
//复制本周+下周的课
$starttime = strtotime('this week Monday'); // 获取本周一的时间戳
$endtime = $starttime + (86400*14);
$list = Db::name('lesson_slot')->where('starttime','BETWEEN',[$starttime,$endtime])->order('starttime asc')->select();
if(empty($list)){
echo 'empty';
exit;
}
//到下下周+下下下周
foreach($list as $key => &$val){
unset($val['id']);
$val['starttime'] = $val['starttime'] + (86400*14);
$val['endtime'] = $val['endtime'] + (86400*14);
$val['bookednum'] = 0;
$val['status'] = 0;
$val['notice_status'] = 0;
$val['finishtime'] = 0;
$val['cancel_reason'] = '';
$val['cancel_time'] = 0;
$val['is_show'] = 0;
$val['cancel_notice_status'] = 0;
}
Db::startTrans();
$rs1 = Db::name('plantask')->where('key','auto_slot_copyweek')->update(['lasttime'=>time()]);
if($rs1 === false){
Db::rollback();
$this->error('同步失败');
}
$rs2 = Db::name('lesson_slot')->insertAll($list);
if(!$rs2){
Db::rollback();
$this->error('复制失败');
}
Db::commit();
echo '复制完成';
}
/////////////////////////////////////////下面都是工具方法////////////////////////////////////////////////
//发送whatapp消息的方法
private 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;
}
}