Browse Source

计划任务,4个通知

lizhen_gitee 1 year ago
parent
commit
7b6b12610b
2 changed files with 172 additions and 159 deletions
  1. 1 1
      application/api/controller/User.php
  2. 171 158
      application/index/controller/Plantask.php

+ 1 - 1
application/api/controller/User.php

@@ -191,7 +191,7 @@ class User extends Api
      */
     public function profile()
     {
-        $field_array = ['firstname','lastname','height','age','weight','address','avatar'];
+        $field_array = ['firstname','lastname','height','age','weight','address','avatar','notice_type'];
 
         $data = [];
         foreach($field_array as $key => $field){

+ 171 - 158
application/index/controller/Plantask.php

@@ -3,10 +3,9 @@
 namespace app\index\controller;
 
 use think\Controller;
-
-use Redis;
 use think\Db;
-use app\common\library\Easemob;
+use app\common\library\Email;
+
 class Plantask extends Controller
 {
     //关于本文件里的计划任务
@@ -14,186 +13,200 @@ class Plantask extends Controller
 
 ////////////////////////////////////////下面都是计划任务方法///////////////////////////////////////////////////////////////
 
+    //明天有课,通知。计划任务1小时执行一次
+    public function auto_lesson_slot_notice(){
+        $starttime = strtotime(date('Y-m-d')) + 86400;
+        $endtime   = $starttime + 86399;
+
+        $map = [
+            'status' => 0,
+            'starttime' => ['BETWEEN',[$starttime,$endtime]],
+            'notice_status' => 0,
+        ];
 
-    //送礼物(api/party/giveGiftToYou)拆分出来的异步用户升级方法,
-    public function auto_user_level_up(){
-        Db::startTrans();
-        $tasklist = Db::name('gift_user_party')->where('task_status',0)->limit(20)->lock(true)->select();
-        if(empty($tasklist)){
-            Db::rollback();
+        $task_list = Db::name('lesson_slot')->where($map)->order('starttime asc')->limit(1)->select();
+        if(empty($task_list)){
             echo 'empty';
             exit;
         }
 
-        try {
-            //redis
-            $redis = new Redis();
-            $redisconfig = config("redis");
-            $redis->connect($redisconfig["host"], $redisconfig["port"]);
-            if ($redisconfig['redis_pwd']) {
-                $redis->auth($redisconfig['redis_pwd']);
+        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;
             }
-            if($redisconfig['redis_selectdb'] > 0){
-                $redis->select($redisconfig['redis_selectdb']);
+
+            //给这些预约单的用户发邮件
+            foreach($order_list as $order){
+                $obj = new Email();
+                $result = $obj
+                    ->to($order['email'])
+                    ->subject('Elin Dance Studio 明天开课!')
+                    ->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您预约的['.$order['name'].']将于'.date('Y-m-d H:i:s',$slot['starttime']).'开课,请合理安排时间,准时来上课哦!')
+                    ->send();
             }
 
-            $money_to_jewel = config('site.money_to_jewel') ?: 10; //余额兑换金币
-//            $getempirical_conf = config("site.getempirical");
+            //这节课时,任务完成
+            $update = [
+                'notice_status' => 1,
+            ];
+            Db::name('lesson_slot')->where('id',$slot['id'])->update($update);
+        }
 
-            foreach($tasklist as $key => $giftuserparty){
-                echo $giftuserparty['id'].'<br>';
+    }
 
-                $giftValue = $giftuserparty['value'];
-                $hotValue  = $giftValue;
+    //套餐将要到期,一个月,两周,一周,逐级通知,提醒三次。计划任务分别一小时执行一次
+    public function auto_package_order_notice_mon(){
 
-                //用户信息
-                $authuser_info = Db::name('user')->field('nickname')->where('id',$giftuserparty['user_id'])->find();
-                $touserInfo    = Db::name('user')->field('nickname')->where('id',$giftuserparty['user_to_id'])->find();
-                $party_id = $giftuserparty['party_id'];
+        $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();
 
-                //添加获赠用户余额
-                $user_id = $giftuserparty['user_to_id'];
-                if($giftuserparty['getvalue'] > 0){
-                    $getMoney = bcdiv($giftuserparty['getvalue'],$money_to_jewel,2);
-                    if($getMoney > 0){
-                        $rs_wallet = model('wallet')->lockChangeAccountRemain($user_id,$getMoney,'+',0,"{$authuser_info['nickname']}送你{$giftuserparty['gift_name']}x{$giftuserparty['number']}",101,'money');
-                        if($rs_wallet['status'] == false){
-                            Db::rollback();
-                            $this->error($rs_wallet['msg']);
-                        }
-                    }
-                }
-                $partyInfo = \app\common\model\Party::field("id,room_type,party_name,party_hot,user_id,platRate,guilderRate,easemob_room_id")->where(["id"=>$giftuserparty['party_id']])->find();
-                //增加房主抽成
-                if ($partyInfo && $giftuserparty['guildervalue'] > 0) {
-                    $guilderMoney = bcdiv($giftuserparty['guildervalue'],$money_to_jewel,2);
-                    if($guilderMoney > 0){
-                        $rs_wallet = model('wallet')->lockChangeAccountRemain($partyInfo->user_id,$guilderMoney,'+',0,"{$authuser_info['nickname']}送礼物{$giftuserparty['gift_name']}x{$giftuserparty['number']}给{$touserInfo['nickname']},房间礼物抽成",102,'money');
-                        if($rs_wallet['status'] == false){
-                            Db::rollback();
-                            $this->error($rs_wallet['msg']);
-                        }
-                    }
-                }
+        if(empty($task_list)){
+            echo 'empty';
+            exit;
+        }
 
-                //更新麦位魅力值
-                $this->updateSeatCharm($partyInfo['easemob_room_id'],$giftuserparty['seat_num'],$hotValue,$partyInfo);
-
-                // 如果是主播,则添加魅力值记录做榜单统计,这个表和送礼物日志表重复了,无意义
-                /*if($partyInfo) {
-                    $data = [];
-                    $data["user_id"] = $giftuserparty['user_to_id'];
-                    $data["party_id"] = $party_id;
-                    $data["charm"] = $hotValue;
-                    $data["createtime"] = time();
-                    \app\common\model\UserCharmRank::insert($data);
-
-                }*/
-
-                //用户经验升级
-                //$getempirical = $getempirical_conf * $hotValue;
-                // 获取用户贵族信息
-                /*$noble = \app\common\model\User::getUserNoble($giftuserparty['user_id']);
-                if(isset($noble["noble_on"]) && $noble["noble_on"] == 1) {
-                    $getempirical = $getempirical + $getempirical * ($noble["explain"]/100);
-                }*/
-
-                // 增加用户经验值
-                //$res = \app\common\model\User::addEmpirical($giftuserparty['user_id'],$getempirical);
-                /*if ($res){
-                    $this->auth->level = $res->level;
-                }*/
-
-                //增加被送礼物用户的魅力等级
-                $res_charm = \app\common\model\User::add_charm_level($giftuserparty['user_to_id'],$giftValue);
-
-                // +exp
-//                \app\common\model\TaskLog::tofinish($giftuserparty['user_id'],"OBHqCX4g",$giftuserparty['number']);
-
-                // +message
-                \app\common\model\Message::addMessage($giftuserparty['user_to_id'],"礼物通知","收到 ".$authuser_info['nickname']." 赠送的".$giftuserparty['gift_name']." x".$giftuserparty['number']." 价值 ".$giftValue ." 金币");
-
-                //增加送礼用户的财富等级
-                $res_wealth = \app\common\model\User::add_wealth_level($giftuserparty['user_id'],$giftValue);
-
-                // tcp 获取房间用户周前三名 getPartyUserTop里面摘出来的一部分
-                //[环信]更新财富榜前3。
-                $avatarArr = $redis->hGet("user_jewel_top3",$partyInfo['id']);
-                $easemob = new Easemob();
-                $matedata = [
-                    'wealth_top3_userlist'  => $avatarArr,
-                ];
-                $easemob->room_setRoomCustomAttributeForced($partyInfo['easemob_room_id'],$partyInfo['user_id'],$matedata);
-
-                //结束
-                $rs_up = Db::name('gift_user_party')->where('id',$giftuserparty['id'])->update(['task_status'=>1]);
-                if($rs_up === false){
-                    Db::rollback();
-                    echo '更新错误'.$giftuserparty['id'];
-                    exit;
-                }
-            }
-            Db::commit();
-        } catch (ValidateException $e) {
-            Db::rollback();
-            $this->error($e->getMessage());
-        } catch (PDOException $e) {
-            Db::rollback();
-            $this->error($e->getMessage());
-        } catch (Exception $e) {
-            Db::rollback();
-            $this->error($e->getMessage());
+        foreach($task_list as $order){
+
+            //给这些用户发邮件
+            $obj = new Email();
+            $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,
+        ];
 
-    /**
-     *  用户赠送礼物后房间内麦位魅力值增加,更新到麦位自定义信息
-     * $seatnum 座位数字 1,不是键名 seat1
-     */
-    private function updateSeatCharm($easemob_room_id,$seatnum,$giftValue,$party_info) {
-        //获取已有信息
-        $key = 'seat'.$seatnum;
-        $easemob = new Easemob();
-        $seatdata = $easemob->room_getRoomCustomAttribute($easemob_room_id,[$key]);
-
-        if(empty($seatdata)){
-            //默认为空
-            $seatdata = [
-                'charm'    => 0,                    //红心,魅力值
-
-                'isMaster'       => false,            // 是否是房主
-                'headUrl'        => '',              // 头像
-                'userNo'         => '',               // 座位上用户no
-                'rtcUid'         => '',               // 座位上用户id,与rtc的userId一致
-                'name'           => '',                 // 座位上用户昵称
-                'seatIndex'      => $seatnum,               // 座位编号
-                'chorusSongCode' => '',             // 是否合唱
-                'isAudioMuted'   => 1,            // 是否静音
-                'isVideoMuted'   => 0,            // 是否开启视频
-                'checked'        => false,       // 用于送礼物选择用户
-                'isUsed'         => true,          // 用于送礼物选择用户
-                'gender'         => 1, //性别
-            ];
-        }else{
-            $seatdata = json_decode($seatdata[$key],true);
+        $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;
         }
 
-        //魅力值自增
-        $seatdata['charm'] = intval($seatdata['charm']);
-        $seatdata['charm'] += $giftValue;
+        foreach($task_list as $order){
 
-        //重新设置
-        $matedata = [
-            $key  => json_encode($seatdata),
+            //给这些用户发邮件
+            $obj = new Email();
+            $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,
         ];
-        $easemob->room_setRoomCustomAttributeForced($easemob_room_id,$party_info['user_id'],$matedata);
 
-        return true;
+        $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;
+        }
+
+        foreach($task_list as $order){
+
+            //给这些用户发邮件
+            $obj = new Email();
+            $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);
+        }
     }
 
+/////////////////////////////////////////下面都是工具方法////////////////////////////////////////////////
+
+    //结果集信息里,多个字段需要翻译
+    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;
+    }
 
 }