Преглед изворни кода

Merge branch 'awaken_user' into bonus_rate

stanley-king пре 7 година
родитељ
комит
3e9508993e

+ 85 - 10
admin/control/oper_sms.php

@@ -126,31 +126,106 @@ class oper_smsControl extends SystemControl
             showMessage("成功放入推送队列", 'ndex.php?act=oper_sms&op=awaken_user');
         }
     }
+
+    private function format_member_filter($input)
+    {
+        $filters = [];
+        if(isset($input['offtime']) && intval($input['offtime']) > 0) {
+            $filters[] = ['type' => 'offtime', 'days' => intval($input['offtime'])];
+        }
+        if(isset($input['regtime']) && intval($input['regtime']) > 0) {
+            $filters[] = ['type' => 'regtime', 'days' => intval($input['regtime'])];
+        }
+        if(isset($input['order_numgt']) && intval($input['order_numgt']) > 0) {
+            $filters[] = ['type' => 'order_numgt', 'count' => intval($input['order_numgt'])];
+        }
+        if(isset($input['order_days']) && intval($input['order_days']) > 0) {
+            $filters[] = ['type' => 'order_days', 'days' => intval($input['order_days'])];
+        }
+        if(isset($input['bonus_amount']) && intval($input['bonus_amount']) > 0) {
+            $filters[] = ['type' => 'bonus', 'amount' => intval($input['bonus_amount'])];
+        }
+        if(isset($input['gift']) && !empty($input['gift'])) {
+            $filters[] = ['type' => 'gift', 'value' => boolval($input['gift'])];
+        }
+        if(isset($input['invitor']) && !empty($input['invitor'])) {
+            $filters[] = ['type' => 'invitor', 'value' => boolval($input['invitor'])];
+        }
+        return $filters;
+    }
+
+    private function format_sms_filter($input)
+    {
+        $filters = [];
+        if(isset($input['sms_offtime']) && intval($input['sms_offtime']) > 0) {
+            $filters[] = ['type' => 'offtime', 'days' => intval($input['sms_offtime'])];
+        }
+        if(isset($input['sms_regtime']) && intval($input['sms_regtime']) > 0) {
+            $filters[] = ['type' => 'regtime', 'days' => intval($input['sms_regtime'])];
+        }
+        return $filters;
+    }
+
     public function brand_awakenOp()
     {
-        $amount = intval($_POST['amount']);
+
+        $amount = intval($_POST['bonus_num']);
         $brand = trim($_POST['brand']);
         $openurl = trim($_POST['openurl']);
 
-        $days = intval($_POST['days']);
-        $et_amount = intval($_POST['et_amount']);
-
-        if(empty($amount) ||empty($brand) || empty($openurl) || empty($et_amount)) {
-            showMessage("参数错误,paysn 不能为空",'index.php?act=oper_sms&op=awaken_user','','error');
+        //if(empty($amount) ||empty($brand) || empty($openurl) || empty($et_amount)) {
+        if(empty($amount) ||empty($brand) || empty($openurl)) {
+            showMessage("参数错误,红包金额或宣传品牌或传送地址 不能为空",'index.php?act=oper_sms&op=awaken_user','','error');
         }
         else
         {
+            $filters = [
+                'member_filters' => [],
+                'sms_filters' => []
+            ];
             $send_params =['type' => Sms::tpl_new_goods,
                 'sms_params'  => ['day' => '周一','amount' => $amount,'brand' => $brand,'url' => $openurl],
                 'push_params' => []];
 
-            $filters = ['member_filters' => [ ['type' => 'bonus','amount' => $et_amount]],
-                'sms_filters' => [['type' => 'regtime','days' => $days]]];
+            $member_filters = $this->format_member_filter($_POST);
+            if(count($member_filters)){
+                $filters['member_filters'] = $member_filters;
+            }
 
-            $oper_param = ['type' => 'bonus','rate' => 30,'amount' => 50];
+            $sms_filters = $this->format_sms_filter($_POST);
+            if(count($sms_filters)){
+                $filters['sms_filters'] = $sms_filters;
+            }
 
+            $oper_param = ['type' => 'bonus','rate' => 30,'amount' => 50];
+            if(isset($_POST['bonus_amount']) && intval($_POST['bonus_amount']) > 0)
+            {
+                $oper_param = ['type' => 'bonus','rate' => 30,'amount' => intval($_POST['bonus_amount'])];
+            }
             QueueClient::push('onAsyncBroadcastNormal',['filters' => $filters,'oper_param' => $oper_param,'send_params' => $send_params]);
-            showMessage("成功放入推送队列", 'ndex.php?act=oper_sms&op=awaken_user');
+            showMessage("成功放入推送队列", 'index.php?act=oper_sms&op=awaken_user');
+        }
+    }
+
+    public function view_usersOp()
+    {
+        $filter_params = $this->format_member_filter($_POST);
+        if(!empty($filter_params))
+        {
+            $filters = async\filter::create($filter_params);
+            $broadcast = new async\broadcast($filters);
+            $match_users = $broadcast->count();
+
+            if($match_users > 0){
+                showMessage("有 ". $match_users. " 个用户符合筛选条件", '','json','succ');
+            }
+            else {
+                showMessage("没有用户符合筛选条件", '','json','error');
+            }
+        }
+        else
+        {
+            showMessage("请设置筛选条件", '','json','error');
         }
     }
 }

+ 193 - 89
admin/templates/default/oper_send.awaken.php

@@ -12,102 +12,206 @@
         </div>
     </div>
     <div class="fixed-empty"></div>
-    <div>
-        <table class="tb-type1 noborder search">
-            <tbody>
-            <tr style="background: rgb(255, 255, 255);">
-                <td>
-                    <label>全局过滤条件:
-                        <select name="golbal_last_login" class="golbal_last_login">
-                            <option value="all">全部</option>
-                            <option value="10">未登录10天</option>
-                            <option value="20">未登录20天</option>
-                            <option value="30">未登录30天</option>
-                            <option value="40">未登录40天</option>
-                        </select>
-                    </label>
-                </td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-    <table class="table tb-type2" id="prompt">
-        <tbody>
-        <tr class="space odd">
-            <th class="nobg" colspan="12">
-                <div class="title">
-                    <h5><?php echo $lang['nc_prompts']; ?></h5>
-                    <span class="arrow"></span>
-                </div>
-            </th>
-        </tr>
-        <tr>
-            <td>
-                <ul>
-                    <li>根据订单发红包雨</li>
-                </ul>
-            </td>
-        </tr>
-        </tbody>
-    </table>
-    <form id="points_form" class="form" method="post" action="index.php?act=oper_sms&op=bonus_awaken" name="form1">
-        <input type="hidden" name="form_submit" value="ok"/>
-        <table class="table tb-type2 nobdb">
-            <tbody>
-                    <tr>
-                        <td class="w120 align-left">根据订单发红包雨:</td>
-                        <td class="w400 align-left"><label>paysn:<input class="w300" type="text" name="paysn" placeholder="请输入paysn"></label></td>
-                        <td class="w200 align-left"><label>金额:<input type="text" name="amount" placeholder="单个用户红包金额"></label></td>
-                        <td class="w250 align-left"><label>最近多少天注册用户:<input type="text" name="days" placeholder="请输入天数"></label></td>
-                        <input type="hidden" class="golbal_last_login" name="global_condition" value="all">
-                        <td class="w200 align-left"><a href="JavaScript:void(0);" class="submit_btn btn" id="submit_form"><span><?php echo $lang['nc_submit']; ?></span></a></td>
-                    </tr>
-            </tbody>
-        </table>
-    </form>
-    <table class="table tb-type2" id="prompt">
-        <tbody>
-        <tr>
-            <td>
-                <ul>
-                    <li>短信内容,【熊猫美妆】周末福利大放送,{50}元红包已到账!{雪花秀、兰芝补货,SNP、婵真}上新,传送门:{http://t.cn/RY9Iiba},退订回复N:</li>
-                </ul>
-            </td>
-        </tr>
-        </tbody>
-    </table>
     <form id="newbrand_form" class="form" method="post" action="index.php?act=oper_sms&op=brand_awaken" name="form1">
         <input type="hidden" name="form_submit" value="ok"/>
-        <table class="table tb-type2 nobdb">
-            <tbody>
-            <tr>
-                <td class="w100 align-left">品牌上新:</td>
-                <td class="w200 align-left"><label>金额:<input type="text" name="amount" placeholder="单个用户红包金额"></label></td>
-                <td class="w250 align-left"><label>品牌:<input class="w200" type="text" name="brand" placeholder="请输入品牌语"></label></td>
-                <td class="w200 align-left"><label>网页地址:<input type="text" name="openurl" placeholder="请输入可打开地址"></label></td>
-                <td class="w250 align-left"><label>最近多少天注册用户:<input type="text" name="days" placeholder="请输入天数"></label></td>
-                <td class="w250 align-left"><label>红包少于多少元用户:<input type="text" name="et_amount" placeholder="请输入金额"></label></td>
-                <input type="hidden" class="golbal_last_login" name="global_condition" value="all">
-                <td class="w200 align-left"><a href="JavaScript:void(0);" class="submit_btn btn" id="submit_form"><span><?php echo $lang['nc_submit']; ?></span></a></td>
-            </tr>
-            </tbody>
-        </table>
+        <div>
+            <h4>用户筛选条件(按照这个条件给用户发送push和短信)</h4>
+        </div>
+        <div>
+            <table class="table tb-type2 nobdb">
+                <tbody>
+                <tr>
+                    <td class="w200 align-left"><label>用户几天未登录:</label><input type="text" name="offtime" id="offtime" placeholder="输入天数"></td>
+                    <td class="w200 align-left"><label>用户注册天数:</label><input type="text" name="regtime" id="regtime" placeholder="多少天内注册的用户"></td>
+                    <td class="w400 align-left"></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div>
+            <table class="table tb-type2 nobdb">
+                <tbody>
+                <tr>
+                    <td class="w200 align-left"><label>最后下单时间:</label><input type="text" name="order_days" id="order_days" placeholder="多少天内未下单"></td>
+                    <td class="w200 align-left"><label>用户订单数量大于:</label><input type="text" name="order_numgt" id="order_numgt" placeholder="用户已下单数量"></td>
+                    <td class="w400 align-left"></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div>
+            <table class="table tb-type2 nobdb">
+                <tbody>
+                <tr>
+                    <td class="w200 align-left"><label>用户红包少于:</label><input type="text" name="bonus_amount" id="bonus_amount" placeholder="多少元"/></td>
+                    <td class="w200 align-left"><label>用户是否已领首单礼:</label><input type="text" name="gift" id="gift" placeholder="1为是,0为否"/></td>
+                    <td class="w400 align-left"><label>用户是否有邀请者:</label><input type="text" name="invitor" id="invitor" placeholder="1为是,0为否" /></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div>
+            <h4>短信接收条件(不具备push条件的用户,给他们发短信)</h4>
+        </div>
+        <div>
+            <table class="table tb-type2 nobdb">
+                <tbody>
+                <tr>
+                    <td class="w200 align-left"><label>用户几天未登录:</label><input type="text" name="sms_offtime" id="sms_offtime" class="" placeholder="输入天数"></td>
+                    <td class="w200 align-left"><label>用户注册天数:</label><input type="text" name="sms_regtime" id="sms_regtime" placeholder="多少天内注册的用户"></td>
+                    <td class="w400 align-left"></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+
+        <div>
+            <h4>推送内容:</h4>
+        </div>
+        <div>
+            <table class="table tb-type2" id="prompt">
+                <tbody>
+                <tr>
+                    <td>【熊猫美妆】周末福利大放送,{金额}元红包已到账!{品牌}上新,传送门:{传送地址},退订回复N:</td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+
+        <div>
+            <table class="table tb-type2 nobdb">
+                <tbody>
+                <tr>
+                    <td class="w250 align-left"><label>发送红包金额:</label><input type="text" name="bonus_num" id="bonus_num" placeholder="红包金额" /></td>
+                    <td class="w200 align-left"><label>宣传品牌:</label><input type="text" name="brand" id="brand" placeholder="宣传品牌" /></td>
+                    <td class="w200 align-left"><label>传送地址:</label><input type="text" name="openurl" id="openurl" placeholder="传送地址" /></td>
+                    <td class="w200 align-left"></td>
+                    <td class="w100 align-right"><a href="JavaScript:void(0);" class="submit_btn btn" id="submit_form"><span><?php echo $lang['nc_submit']; ?></span></a></td>
+                    <!--<td class="w100 align-right"><a href="JavaScript:void(0);" class="submit_btn btn" id="view_result"><span>查看用户</span></a></td>-->
+                    <td class="w100 align-right"><button class="btn" id="view_result" style="width:80px;height:30px;">查看用户</button></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
     </form>
 </div>
 <script type="text/javascript">
+    var $los = {
+        saveObj: function(key, obj) {
+            if(typeof(obj)=="object") {
+                window.localStorage[key] = JSON.stringify(obj);
+            } else {
+                return false;
+            }
 
-    $('.golbal_last_login').on('change',function(){
-        var last_login = $(this).val();
-        $('.golbal_last_login').val(last_login);
-    });
+            if(window.localStorage[key]!==undefined){
+                return true;
+            } else {
+                return false;
+            }
+        },
 
-    $('.submit_btn').on('click', function () {
-        var confirm = window.confirm('确认提交?');
-        if (confirm) {
-          $(this).parents('form').submit();
+        loadObj: function(key) {
+            return JSON.parse(window.localStorage[key] || '{}');
+        },
+
+        remove: function(key) {
+            return window.localStorage.removeItem(key);
+        }
+    };
+
+    function local_save() {
+        if($los) {
+            var $params = {
+                offtime:        $("#offtime").val(),
+                regtime:        $("#regtime").val(),
+                order_days:     $("#order_days").val(),
+                order_numgt:    $("#order_numgt").val(),
+                bonus_amount:   $("#bonus_amount").val(),
+                gift:           $("#gift").val(),
+                invitor:        $("#invitor").val(),
+                sms_offtime:    $("#sms_offtime").val(),
+                sms_regtime:    $("#sms_regtime").val(),
+                bonus_num:      $("#bonus_num").val(),
+                brand:          $("#brand").val(),
+                openurl:        $("#openurl").val()
+            };
+            $los.saveObj('params', $params);
         }
-        else {
-            return;
+    }
+
+    function local_load() {
+        if($los) {
+            var $params = $los.loadObj('params');
+            if($params && $params!==undefined){
+                $("#offtime").val($params.offtime);
+                $("#regtime").val($params.regtime);
+                $("#order_days").val($params.order_days);
+                $("#order_numgt").val($params.order_numgt);
+                $("#bonus_amount").val($params.bonus_amount);
+                $("#gift").val($params.gift);
+                $("#invitor").val($params.invitor);
+                $("#sms_offtime").val($params.sms_offtime);
+                $("#sms_regtime").val($params.sms_regtime);
+                $("#bonus_num").val($params.bonus_num);
+                $("#brand").val($params.brand);
+                $("#openurl").val($params.openurl);
+            }
         }
-    })
+    }
+
+    function disable_post() {
+
+    }
+
+    function enable_post() {
+
+    }
+
+    function disable_query() {
+        $("#view_result").attr("disabled",true);
+    }
+
+    function enable_query($frequence) {
+        //removeAttr('disabled')
+        var t = setTimeout(
+                "$('#view_result').attr('disabled',false)",
+            $frequence * 1000);
+    }
+
+    $(document).ready(function() {
+        local_load();
+
+        $('#submit_form').on('click', function () {
+            //var $submit_url = "index.php?act=oper_sms&op=brand_awaken";
+            var confirm = window.confirm('确认提交?');
+            if (confirm) {
+                //$(this).parents('form').attr("action", $submit_url);
+                local_save();
+                $(this).parents('form').submit();
+            }
+            else {
+                return;
+            }
+        });
+
+        $('#view_result').on('click', function () {
+            var $view_result_url = "index.php?act=oper_sms&op=view_users";
+            disable_query();
+            $.ajax({
+                type: 'post',
+                url: $view_result_url,
+                data: $("#newbrand_form").serialize(),
+                async: false,
+                success: function($data) {
+                    //console.log($data);
+                    alert(JSON.parse($data).msg);
+                    enable_query(10);
+                },
+                error: function($data) {
+                    alert("error: "+ $data);
+                }
+            });
+        });
+    });
 </script>

+ 1 - 0
data/model/user_bonus.model.php

@@ -43,6 +43,7 @@ class user_bonusModel extends Model
         $cond = array('user_id' => $member_id,'bonus_status' => 3,'usable_time' => array('gt',time()),'remain_amount' => array('gt','0.00'));
         return $this->getBonusList($cond,'*','usable_time asc');
     }
+
     public function getShareableBonus($member_id)
     {
         $cond = array('user_id' => $member_id,'bonus_status' => 3,'usable_time' => array('gt',time()),'remain_amount' => array('gt','0.00'),'can_share' => 1);

+ 30 - 4
helper/async/broadcast.php

@@ -25,9 +25,10 @@ class broadcast
     private $mSender;
     private $mSmstype;
 
-    public function __construct($filters, operator $operator, sender $sender,$sms_type)
+    public function __construct($filters, operator $operator = null, sender $sender = null,$sms_type = null)
     {
         $this->mFilters = $filters;
+
         $this->mOperator = $operator;
         $this->mSender = $sender;
         $this->mSmstype = $sms_type;
@@ -42,9 +43,7 @@ class broadcast
         {
             $start = $i * 1000;
             $items = $mod_member->field('*')->order('member_id asc')->limit("{$start},1000")->select();
-            if(empty($items)) {
-                return;
-            }
+            if(empty($items)) break;
             $i++;
 
             $match_users = [];
@@ -55,13 +54,40 @@ class broadcast
                     $match_users[] = $minfo;
                 }
             }
+
             $ret = $this->mOperator->operate($match_users,$params);
+
             if($ret != false) {
                 $this->mSender->run($match_users,$ret);
             }
         }
     }
 
+    public function count()
+    {
+        $mod_member = Model('member');
+
+        $count = 0;
+        $i = 0;
+        while (true)
+        {
+            $start = $i * 1000;
+            $items = $mod_member->field('*')->order('member_id asc')->limit("{$start},1000")->select();
+            if(empty($items)) break;
+            $i++;
+
+            foreach ($items as $item)
+            {
+                $minfo = new member_info($item);
+                if($this->filtrate($minfo)) {
+                    $count++;
+                }
+            }
+        }
+
+        return $count;
+    }
+
     private function filtrate(member_info $minfo)
     {
         foreach ($this->mFilters as $filter)

+ 122 - 5
helper/async/broadcast/filter.php

@@ -34,9 +34,25 @@ abstract class filter
             elseif($type == 'mobile') {
                 $filter = new mobile_filter();
             }
+            elseif($type == 'offtime') {
+                $filter = new offtime_filter($param);
+            }
+            elseif($type == 'order_numgt') {
+                $filter = new order_numgt_filter($param);
+            }
+            elseif($type == 'order_days') {
+                $filter = new order_days_filter($param);
+            }
+            elseif($type == 'invitor') {
+                $filter = new inviter_filter($param);
+            }
+            elseif($type == 'gift') {
+                $filter = new gift_filter($param);
+            }
             else {
-                return null;
+                continue;
             }
+
             $result[] = $filter;
         }
 
@@ -70,6 +86,31 @@ class regtime_filter extends filter
     }
 }
 
+class offtime_filter extends filter
+{
+    private $mIncludeTime;
+    public function __construct($param)
+    {
+        $days = intval($param['days']);
+        if($days < 0) {
+            $this->mIncludeTime = 0;
+        } else {
+            $this->mIncludeTime = time() - $days * 86400;
+        }
+        parent::__construct();
+    }
+
+    public function filtrate(member_info $minfo)
+    {
+        return $minfo->lastest_logtm() < $this->mIncludeTime;
+    }
+
+    public static function format($input)
+    {
+        return ['type' => 'offtime', 'days' => intval($input['offtime'])];
+    }
+}
+
 class bonus_filter extends filter
 {
     private $mMaxAmount;
@@ -131,18 +172,94 @@ class mobile_filter extends filter
     }
 }
 
-class order_filter extends filter
+class order_numgt_filter extends filter
 {
     private $mod_order;
-    public function __construct()
+    private $mGtNum;
+    public function __construct($param)
     {
         $this->mod_order = Model('order');
+        $this->mGtNum = $param['count'];
+
         parent::__construct();
     }
 
     public function filtrate(member_info $minfo)
     {
-        $mobile = $minfo->mobile();
-        return in_array($mobile,$this->mIncludes);
+        $user = $minfo->member_id();
+        $order_num = $this->order_num($user);
+        return $order_num > $this->mGtNum;
+    }
+
+    private function order_num($buyer_id)
+    {
+        return $this->mod_order->getOrderCount(['buyer_id'=>$buyer_id]);
     }
 }
+
+class order_days_filter extends filter
+{
+    private $days;
+    private $mod_order;
+    public function __construct($param)
+    {
+        $this->days = $param['days'];
+        $this->mod_order = Model('order');
+    }
+
+    public function filtrate(member_info $minfo)
+    {
+        $user = $minfo->member_id();
+        $filt_time = time() - $this->days * 86400;
+        return $this->last_order_time($user) < $filt_time;
+    }
+
+    private function last_order_time($buyer_id)
+    {
+        $orders = $this->mod_order->getOrderList(['buyer_id' => $buyer_id,'order_state' => ['egt',20]], '', '*','order_id desc',1);
+        if(!empty($orders)) {
+            $order_info = $orders[0];
+            return intval($order_info['add_time']);
+        } else {
+            return 0;
+        }
+    }
+}
+
+class gift_filter extends filter
+{
+    protected $gift_got;
+
+    public function __construct($param) {
+        $this->gift_got = intval($param['value']) == 0 ? false : true;
+
+    }
+    public function filtrate(member_info $minfo)
+    {
+        if($this->gift_got) {
+            return $minfo->first_present() > 0;
+        }
+        else {
+            return $minfo->first_present() == 0;
+        }
+    }
+}
+
+class inviter_filter extends filter
+{
+    protected $has_inviter;
+
+    public function __construct($param) {
+        $this->has_inviter = intval($param['value']) == 0 ? false : true;
+    }
+
+    public function filtrate(member_info $minfo)
+    {
+        if($this->has_inviter) {
+            return $minfo->inviter_id() > 0;
+        }
+        else {
+            return $minfo->inviter_id() == 0;
+        }
+    }
+}

+ 0 - 1
helper/async/broadcast/sender.php

@@ -22,7 +22,6 @@ class sender
     private $mSmsType;
     private $mSmsObject;
 
-
     public function __construct($sms_filters,$sends_params)
     {
         $this->mSmsFilters = $sms_filters;

+ 3 - 0
helper/model/member_info.php

@@ -137,6 +137,9 @@ class member_info
     public function reg_time() {
         return intval($this->member_info['member_time']);
     }
+    public function lastest_logtm() {
+        return intval($this->member_info['member_login_time']);
+    }
     public function order_num() {
         return intval($this->member_info['order_num']);
     }

+ 1 - 1
mac_start.sh

@@ -4,6 +4,6 @@ sudo pkill nginx
 sudo nginx
 sudo pkill php-fpm
 php-fpm
-redis-server /etc/redis/6379.conf
+sudo redis-server /etc/redis/6379.conf
 sudo pkill -9 $(pidof python)
 ./qwatch.py

+ 80 - 6
test/TestPush.php

@@ -9,6 +9,7 @@
 
 define('BASE_ROOT_PATH',str_replace('/test','',dirname(__FILE__)));
 require_once(BASE_ROOT_PATH . '/fooder.php');
+require_once(BASE_ROOT_PATH . '/helper/member_helper.php');
 require_once(BASE_ROOT_PATH . '/helper/memsg/message_sender.php');
 require_once(BASE_ROOT_PATH . '/helper/push_sender.php');
 
@@ -51,7 +52,7 @@ class TestPush extends PHPUnit_Framework_TestCase
     {
         $pushor = new push_sender();
 
-        $info['member_id'] = self::test_member_id;
+        $info['member_id'] = self::test_android_member_id;
         $info['text'] = 'hello message';
         $info['custom'] = ['type' => 'add_special','special_id' => 300];
         $pushor->send_message($info);
@@ -72,21 +73,94 @@ class TestPush extends PHPUnit_Framework_TestCase
     }
     public function testBroadcast()
     {
-        //"http://t.cn/RYTpzAr"
         $send_params =['type' => Sms::tpl_new_goods,
             'sms_params'  => ['day' => '周一','amount' => 50,'brand' => "婵真",'url' => "http://t.cn/RYTpzAr"],
             'push_params' => []];
 
-        $filters = ['member_filters' => [ ['type' => 'bonus','amount' => 50000],['type' => 'mobile']],
-            'sms_filters' => [['type' => 'regtime','days' => 5]]];
+        $filters = ['member_filters' =>
+               [
+                   ['type' => 'bonus',  'amount' => 50000],
+                    ['type' => 'mobile', 'mobiles' => ['13911129867']]
+                   ,
+                'sms_filters' =>
+                    [
+                        ['type' => 'regtime','days' => 5],
+                        ['type' => 'offtime','days' => 10]
+                    ]
+               ]
+        ];
 
         $oper_param = ['type' => 'bonus','rate' => 30,'amount' => 50];
 
         account_helper::onAsyncBroadcastNormal($filters,$oper_param,$send_params);
     }
 
-    public function testStaticCall()
+    public function testRegtimeFilter()
     {
-        
+        $member_id = 39653;
+        $filter = new async\regtime_filter(['days' => 180]);
+        $info = new member_info($member_id);
+        $result = $filter->filtrate($info);
+        $this->assertTrue($result);
+    }
+
+    public function testOfftimeFilter()
+    {
+        $member_id = 36485;
+        $filter = new async\offtime_filter(['days' => 30]);
+        $info = new member_info($member_id);
+        $result = $filter->filtrate($info);
+        $this->assertTrue($result);
+    }
+
+    public function testOrderDaysFilter()
+    {
+        $member_id = 36485;
+        $filter = new async\order_days_filter(['days' => 10]);
+        $info = new member_info($member_id);
+        $result = $filter->filtrate($info);
+        $this->assertTrue($result);
+    }
+
+    public function testOrderNumgtFilter()
+    {
+        $member_id = 36485;
+        $filter = new async\order_numgt_filter(['count' => 5]);
+        $info = new member_info($member_id);
+        $result = $filter->filtrate($info);
+        $this->assertTrue($result);
+    }
+
+    public function testInvitorFilter()
+    {
+        $member_id = 36486;
+        $info = new member_info($member_id);
+
+        $filter = new async\inviter_filter(['value' => true]);
+        $result = $filter->filtrate($info);
+        $this->assertTrue($result);
+    }
+
+    public function testGiftFilter()
+    {
+        $member_id = 36486;
+        $info = new member_info($member_id);
+
+        $filter = new async\gift_filter(['value' => false]);
+        $result = $filter->filtrate($info);
+        $this->assertTrue($result);
+    }
+
+    public function testBroadcastCount()
+    {
+        //$filter_arr = [['type' => 'regtime', 'days' => 90]];
+        $filter_arr = [
+            ['type' => 'regtime', 'days' => 60],
+            ['type' => 'offtime', 'days' => 60]
+        ];
+        $filter_inst = async\filter::create($filter_arr);
+        $broadcast = new async\broadcast($filter_inst);
+        $result = $broadcast->count();
+        $this->assertGreaterThan(0, $result);
     }
 }