xxxrrrdddd 3 年之前
父節點
當前提交
717d9f4d73

+ 390 - 0
application/admin/controller/MobileFlow.php

@@ -0,0 +1,390 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\admin\library\Auth;
+use app\common\controller\Backend;
+use app\common\library\MobileConstant;
+use app\common\service\MobileImport;
+use app\common\service\MobilePriceLogService;
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\Reader\Csv;
+use PhpOffice\PhpSpreadsheet\Reader\Xls;
+use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
+use think\App;
+use think\Db;
+use think\Exception;
+use think\exception\PDOException;
+use think\Loader;
+use think\Url;
+
+/**
+ * 
+ *
+ * @icon fa fa-mobile
+ */
+class MobileFlow extends Backend
+{
+    
+    /**
+     * Mobile模型对象
+     * @var \app\admin\model\Mobile
+     */
+    protected $model = null;
+    protected $relationSearch=true;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = new \app\admin\model\Mobile;
+
+    }
+
+    public function import()
+    {
+        MobileImport::import(input('file'),$this->auth->id);
+        $this->success();
+    }
+
+    /**
+     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
+     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
+     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
+     */
+
+
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        //当前是否为关联查询
+        $this->relationSearch = false;
+        //设置过滤方法
+        $this->request->filter(['strip_tags', 'trim']);
+        if ($this->request->isAjax()) {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField')) {
+                return $this->selectpage();
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildindexparams();
+
+            $list = $this->model
+                    ->with(['info','proxy'])
+                ->where('type',2)
+                    ->where($where)
+                    ->order($sort, $order)
+                    ->paginate($limit);
+
+            foreach ($list as $row) {
+                $rules=[];
+                foreach (MobileConstant::getFilters() as $rule=>$field){
+                    foreach (array_values($field) as $column){
+                        if($row[$column]==1){
+                            $rules[]=$rule;
+                        }
+                    }
+                }
+                $row['rules']=array_unique($rules);
+            }
+
+            $result = array("total" => $list->total(), "rows" => $list->items());
+
+            return json($result);
+        }
+        $this->assign('no_type',array_column(MobileConstant::getNoType(),'name','id'));
+        $this->assign('network',array_column(MobileConstant::getNetwork(),'name','id'));
+        $this->assign('filters',MobileConstant::getFilters());
+        return $this->view->fetch();
+    }
+
+    public function constant(){
+        return json([
+            'no_type'=>MobileConstant::getNoType(),
+        ]);
+    }
+
+    #置顶推荐
+    public function batch(){
+        $this->validate($data=input(),[
+            'id'=>'require',
+            'field'=>['require','in:rec_time,top_time'],
+            'status'=>'require',
+        ]);
+        $time=$data['status']?time():null;
+        $this->model->where('id',$data['id'])->update([
+            $data['field']=>$time
+        ]);
+        $this->success('','',[
+            'status'=>$time,
+        ]);
+    }
+    #设为特价
+    public function setdiscount($ids){
+        if($this->request->isGet()){
+            return view();
+        }else{
+            $this->validate($data=input('row/a'),[
+                'activity_time_end'=>['date','requireIf:activity_forever,0'],
+                'activity_forever'=>['require','in:0,1'],
+            ]);
+            if($data['activity_forever']){
+                $activity_time_end=null;
+            }else {
+                if (strtotime($data['activity_time_end']) <= time()) {
+                    $this->error('请选择将来时间');
+                }
+                $activity_time_end=$data['activity_time_end'];
+            }
+            $this->model->whereIn('id',$ids)->update([
+                'is_activity'=>1,
+                'activity_time_end'=>$activity_time_end,
+            ]);
+            $this->success();
+        }
+    }
+    #取消设为特价
+    public function cancelsetdiscount(){
+        $ids=input('ids/a');
+        if($ids){
+            $this->model->whereIn('id',$ids)->update([
+                'is_activity'=>0,
+                'activity_time_end'=>null,
+            ]);
+        }
+        $this->success('');
+    }
+    #预占
+    public function takeit($ids){
+        $mobile=$this->model->find($ids);
+        if($this->request->isGet()){
+            $this->assign('row',$mobile);
+            return view();
+        }else{
+            Db::startTrans();
+            $data=input('row/a');
+            $city=$data['city'];
+            if($city){
+                $ex=explode('/',$city);
+                list($data['province'],$data['city'])=$ex;
+                $data['province_id']=\app\common\model\Area::getIdByName($data['province']);
+                $data['city_id']=\app\common\model\Area::getIdByName($data['city']);
+            }
+            (new MobilePriceLogService)->setMobile($mobile)->setAdminId($this->auth->id)->setBeforePrice($mobile['amount_base'])->setAfterPrice($data['amount_base'])->log();
+            $mobile->allowField(true)->save($data);
+            $describe=$data['describe']??'';
+            $mobile->info()->update(compact('describe'));
+            Db::commit();
+            $this->success();
+        }
+    }
+
+    public function edit($ids=null){
+        $mobile=$this->model->find($ids);
+        if($this->request->isGet()){
+            $this->assign('row',$mobile);
+            return view();
+        }else{
+            Db::startTrans();
+            $data=input('row/a');
+            $city=$data['city'];
+            if($city){
+                $ex=explode('/',$city);
+                list($data['province'],$data['city'])=$ex;
+                $data['province_id']=\app\common\model\Area::getIdByName($data['province']);
+                $data['city_id']=\app\common\model\Area::getIdByName($data['city']);
+            }
+            (new MobilePriceLogService)->setMobile($mobile)->setAdminId($this->auth->id)->setBeforePrice($mobile['amount_base'])->setAfterPrice($data['amount_base'])->log();
+            $mobile->allowField(true)->save($data);
+            $describe=$data['describe']??'';
+            $mobile->info()->update(compact('describe'));
+            Db::commit();
+            $this->success();
+        }
+    }
+
+    protected function buildindexparams($searchfields = null, $relationSearch = null)
+    {
+        $searchfields = is_null($searchfields) ? $this->searchFields : $searchfields;
+        $relationSearch = is_null($relationSearch) ? $this->relationSearch : $relationSearch;
+        $search = $this->request->get("search", '');
+        $filter = $this->request->get("filter", '');
+        $op = $this->request->get("op", '', 'trim');
+        $sort = $this->request->get("sort", !empty($this->model) && $this->model->getPk() ? $this->model->getPk() : 'id');
+        $order = $this->request->get("order", "DESC");
+        $offset = $this->request->get("offset/d", 0);
+        $limit = $this->request->get("limit/d", 999999);
+        //新增自动计算页码
+        $page = $limit ? intval($offset / $limit) + 1 : 1;
+        if ($this->request->has("page")) {
+            $page = $this->request->get("page/d", 1);
+        }
+        $this->request->get([config('paginate.var_page') => $page]);
+        $filter = (array)json_decode($filter, true);
+        $op = (array)json_decode($op, true);
+        $filter = $filter ? $filter : [];
+        $where = [];
+        $alias = [];
+        $bind = [];
+        $name = '';
+        $aliasName = '';
+        if (!empty($this->model) && $this->relationSearch) {
+            $name = $this->model->getTable();
+            $alias[$name] = Loader::parseName(basename(str_replace('\\', '/', get_class($this->model))));
+            $aliasName = $alias[$name] . '.';
+        }
+        $sortArr = explode(',', $sort);
+        foreach ($sortArr as $index => & $item) {
+            $item = stripos($item, ".") === false ? $aliasName . trim($item) : $item;
+        }
+        unset($item);
+        $sort = implode(',', $sortArr);
+        $adminIds = $this->getDataLimitAdminIds();
+        if (is_array($adminIds)) {
+            $where[] = [$aliasName . $this->dataLimitField, 'in', $adminIds];
+        }
+        if ($search) {
+            $searcharr = is_array($searchfields) ? $searchfields : explode(',', $searchfields);
+            foreach ($searcharr as $k => &$v) {
+                $v = stripos($v, ".") === false ? $aliasName . $v : $v;
+            }
+            unset($v);
+            $where[] = [implode("|", $searcharr), "LIKE", "%{$search}%"];
+        }
+        $index = 0;
+        foreach ($filter as $k => $v) {
+            if($k=='rules'){
+                continue;
+            }
+            if (!preg_match('/^[a-zA-Z0-9_\-\.]+$/', $k)) {
+                continue;
+            }
+            $sym = isset($op[$k]) ? $op[$k] : '=';
+            if (stripos($k, ".") === false) {
+                $k = $aliasName . $k;
+            }
+            $v = !is_array($v) ? trim($v) : $v;
+            $sym = strtoupper(isset($op[$k]) ? $op[$k] : $sym);
+            //null和空字符串特殊处理
+            if (!is_array($v)) {
+                if (in_array(strtoupper($v), ['NULL', 'NOT NULL'])) {
+                    $sym = strtoupper($v);
+                }
+                if (in_array($v, ['""', "''"])) {
+                    $v = '';
+                    $sym = '=';
+                }
+            }
+
+            switch ($sym) {
+                case '=':
+                case '<>':
+                    $where[] = [$k, $sym, (string)$v];
+                    break;
+                case 'LIKE':
+                case 'NOT LIKE':
+                case 'LIKE %...%':
+                case 'NOT LIKE %...%':
+                    $where[] = [$k, trim(str_replace('%...%', '', $sym)), "%{$v}%"];
+                    break;
+                case '>':
+                case '>=':
+                case '<':
+                case '<=':
+                    $where[] = [$k, $sym, intval($v)];
+                    break;
+                case 'FINDIN':
+                case 'FINDINSET':
+                case 'FIND_IN_SET':
+                    $v = is_array($v) ? $v : explode(',', str_replace(' ', ',', $v));
+                    $findArr = array_values($v);
+                    foreach ($findArr as $idx => $item) {
+                        $bindName = "item_" . $index . "_" . $idx;
+                        $bind[$bindName] = $item;
+                        $where[] = "FIND_IN_SET(:{$bindName}, `" . str_replace('.', '`.`', $k) . "`)";
+                    }
+                    break;
+                case 'IN':
+                case 'IN(...)':
+                case 'NOT IN':
+                case 'NOT IN(...)':
+                    $where[] = [$k, str_replace('(...)', '', $sym), is_array($v) ? $v : explode(',', $v)];
+                    break;
+                case 'BETWEEN':
+                case 'NOT BETWEEN':
+                    $arr = array_slice(explode(',', $v), 0, 2);
+                    if (stripos($v, ',') === false || !array_filter($arr)) {
+                        continue 2;
+                    }
+                    //当出现一边为空时改变操作符
+                    if ($arr[0] === '') {
+                        $sym = $sym == 'BETWEEN' ? '<=' : '>';
+                        $arr = $arr[1];
+                    } elseif ($arr[1] === '') {
+                        $sym = $sym == 'BETWEEN' ? '>=' : '<';
+                        $arr = $arr[0];
+                    }
+                    $where[] = [$k, $sym, $arr];
+                    break;
+                case 'RANGE':
+                case 'NOT RANGE':
+                    $v = str_replace(' - ', ',', $v);
+                    $arr = array_slice(explode(',', $v), 0, 2);
+                    if (stripos($v, ',') === false || !array_filter($arr)) {
+                        continue 2;
+                    }
+                    //当出现一边为空时改变操作符
+                    if ($arr[0] === '') {
+                        $sym = $sym == 'RANGE' ? '<=' : '>';
+                        $arr = $arr[1];
+                    } elseif ($arr[1] === '') {
+                        $sym = $sym == 'RANGE' ? '>=' : '<';
+                        $arr = $arr[0];
+                    }
+                    $tableArr = explode('.', $k);
+                    if (count($tableArr) > 1 && $tableArr[0] != $name && !in_array($tableArr[0], $alias) && !empty($this->model)) {
+                        //修复关联模型下时间无法搜索的BUG
+                        $relation = Loader::parseName($tableArr[0], 1, false);
+                        $alias[$this->model->$relation()->getTable()] = $tableArr[0];
+                    }
+                    $where[] = [$k, str_replace('RANGE', 'BETWEEN', $sym) . ' TIME', $arr];
+                    break;
+                case 'NULL':
+                case 'IS NULL':
+                case 'NOT NULL':
+                case 'IS NOT NULL':
+                    $where[] = [$k, strtolower(str_replace('IS ', '', $sym))];
+                    break;
+                default:
+                    break;
+            }
+            $index++;
+        }
+        if (!empty($this->model)) {
+            $this->model->alias($alias);
+        }
+        if(isset($filter['rules']) && $filter['rules']){
+            $temp=[];
+            foreach (MobileConstant::getFilters()[$filter['rules']] as $pos=>$column){
+                $temp[]=$column;
+            }
+            $where[]=[implode("|",$temp),1];
+        }
+
+        $model = $this->model;
+        $where = function ($query) use ($where, $alias, $bind, &$model) {
+            if (!empty($model)) {
+                $model->alias($alias);
+                $model->bind($bind);
+            }
+            foreach ($where as $k => $v) {
+                if (is_array($v)) {
+                    call_user_func_array([$query, 'where'], $v);
+                } else {
+                    $query->where($v);
+                }
+            }
+        };
+        return [$where, $sort, $order, $offset, $limit, $page, $alias, $bind];
+    }
+}

+ 127 - 0
application/admin/view/mobile_flow/edit.html

@@ -0,0 +1,127 @@
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('id')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-logo" class="form-control" name="row[id]" type="text" value="{$row.id}" readonly>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('手机号')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-no" class="form-control" name="row[no]" type="text" value="{$row.no}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('City')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class='control-relative'><input id="c-city" class="form-control" data-toggle="city-picker" name="row[city]" data-level="city" type="text" value="{$row.province}/{$row.city}"></div>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('运营商')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-network" class="form-control" name="row[network]" type="text" value="{$row.network}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('代理商')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-proxy_id" data-field="nickname" data-params='{"custom[proxy]":1}' data-rule="required" data-source="auth/proxy/selectpage" class="form-control selectpage" name="row[proxy_id]" type="text" value="{$row.proxy_id}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('卡品牌')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-brand" class="form-control" name="row[brand]" type="text" value="{$row.brand}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('套餐信息')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-describe" class="form-control" name="row[describe]" type="text">{$row.info.describe}</textarea>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('备注')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-remark" class="form-control" name="row[remark]" type="text" value="{$row.remark}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('原价')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-amount_original" class="form-control" name="row[amount_original]" type="number" value="{$row.amount_original}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('底价')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-amount_di" class="form-control" name="row[amount_di]" type="number" value="{$row.amount_di}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('售价')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-amount_base" class="form-control" name="row[amount_base]" type="number" value="{$row.amount_base}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('预充')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-amount_charge" class="form-control" name="row[amount_charge]" type="number" value="{$row.amount_charge}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('秒杀价')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-amount_kill" class="form-control" name="row[amount_kill]" type="number" value="{$row.amount_kill}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <label><input type="radio" class="kill-discount-radio" name="discount" value="0.9"/>9折</label>
+            <label><input type="radio" class="kill-discount-radio" name="discount" value="0.88"/>8.8折</label>
+            <label><input type="radio" class="kill-discount-radio" name="discount" value="0.85"/>8.5折</label>
+            自定义<input type="number" value="" class="kill-discount" style="width: 100px;"/>
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('是否秒杀')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[is_activity]',[1=>'是',0=>'否'],$row['is_activity'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('是否置顶')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[top_time]',[1=>'是',0=>'否'],$row['top_time']?1:0)}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('是否推荐')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[rec_time]',[1=>'是',0=>'否'],$row['rec_time']?1:0)}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('状态')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[status]',[0=>'正常',1=>'已售',2=>'已下架'],$row['status'])}
+        </div>
+    </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('Sort')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-sort" min="0" class="form-control" name="row[sort]" type="number" value="{$row.sort|htmlentities}">
+        </div>
+    </div>
+    <div class="form-group layer-footer">
+        <label class="control-label col-xs-12 col-sm-2"></label>
+        <div class="col-xs-12 col-sm-8">
+            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
+            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+        </div>
+    </div>
+</form>

+ 56 - 0
application/admin/view/mobile_flow/index.html

@@ -0,0 +1,56 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
+                        <a href="/lh_export.xlsx" class="btn btn-info" target="_blank">号码上架模版下载</a>
+                        <!--<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('mobile/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                        <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('mobile/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
+                        -->
+                       <!-- <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('mobile/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                        <a href="javascript:;" data-set="1" class="btn btn-info-light btn-set-discount btn-disabled disabled {:$auth->check('mobile/setdiscount')?'':'hide'}">设为特价</a>
+                        <a href="javascript:;" data-set="0" class="btn btn-info-light btn-set-discount btn-disabled disabled {:$auth->check('mobile/cancelsetdiscount')?'':'hide'}">取消特价</a>
+
+
+
+
+
+
+
+
+
+
+
+
+-->
+                        <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('mobile/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
+                      <!--  <div class="dropdown btn-group {:$auth->check('mobile/multi')?'':'hide'}">
+                            <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
+                            <ul class="dropdown-menu text-left" role="menu">
+                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
+                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
+                            </ul>
+                        </div>
+-->
+                        
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
+                           data-operate-edit="{:$auth->check('mobile_flow/edit')}"
+                           data-operate-del="0"
+                           width="100%">
+                    </table>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script>
+    var no_type={:json_encode($no_type)};
+    var network={:json_encode($network)};
+    var filters={:json_encode($filters)};
+</script>

+ 143 - 0
public/assets/js/backend/mobile_flow.js

@@ -0,0 +1,143 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'mobile_flow/index' + location.search,
+                    add_url: 'mobile_flow/add',
+                    edit_url: 'mobile_flow/edit',
+                    del_url: 'mobile_flow/del',
+                    multi_url: 'mobile_flow/multi',
+                    import_url: 'mobile_flow/import',
+                    batch: 'mobile_flow/batch',
+                    table: 'mobile',
+                    cancel_discount: 'mobile_flow/cancelsetdiscount',
+                    set_discount: 'mobile_flow/setdiscount',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                search:false,
+                searchFormVisible:true,
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: __('Id')},
+                        {field: 'no', title: __('手机号'),operate: "LIKE"},
+                        {field: 'province', title: __('省份')},
+                        {field: 'city', title: __('归属地')},
+                        {field: 'network', title: __('运营商'),formatter: Table.api.formatter.label},
+                        {field: 'proxy.nickname', title: __('代理商'),formatter: Table.api.formatter.label},
+                        {field: 'brand', title: __('卡品牌'),formatter: Table.api.formatter.label},
+                        {field: 'summary', title: __('简介'),operate: "like",formatter: Table.api.formatter.content,width: 300},
+                        {field: 'info.describe', title: __('套餐信息'),operate: "like",formatter: Table.api.formatter.content,width: 300},
+                        {field: 'remark', title: __('备注'), operate:'BETWEEN'},
+                        {field: 'is_hold', title: __('状态'),formatter: Table.api.formatter.normal,searchList:{0:'正常',1:'预占'}},
+                        {field: 'update_time', title: __('Update_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false,formatter: Table.api.formatter.datetime},
+                        {field: 'create_time', title: __('上架时间'), operate:'RANGE', addclass:'datetimerange', autocomplete:false,formatter: Table.api.formatter.datetime},
+                        {field: 'sort', title: __('Sort'),operate: "BETWEEN"},
+                        {field: 'admin_id', title: __('上传用户'),operate: "="},
+
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate,buttons:[
+                            ]},
+                    ]
+                ]
+            });
+
+            let setStatus=function (_this,field) {
+                let a=layer.load()
+                $.post('mobile/batch',{id:_this.attr('data-id'),status:_this.attr('data-value')?0:1,field:field},function (res){
+                    if(res.code){
+                        _this.attr('data-value',res.data.status)
+                        if(res.data.status){
+                            _this.find('i').removeClass('fa-flip-horizontal text-gray')
+                        }else{
+                            _this.find('i').addClass('fa-flip-horizontal text-gray')
+                        }
+                    }else{
+                        layer.msg('操作失败')
+                    }
+                    layer.close(a)
+                })
+            }
+
+            $(document).on('click','.btn-change-top',function (){
+                setStatus($(this),'top_time')
+            })
+            $(document).on('click','.btn-change-rec',function (){
+                setStatus($(this),'rec_time')
+            })
+            $(document).on('click','.btn-set-discount',function (){
+                let set=$(this).data('set')
+                let select=table.bootstrapTable('getSelections'),
+                    a=[]
+                if(!select.length){
+                    return
+                }
+                select.forEach(item=>{
+                    a.push(item.id)
+                })
+                if(!set){
+                    $.post($.fn.bootstrapTable.defaults.extend.cancel_discount,{ids:a},function (){
+                        layer.msg('操作成功')
+                        $('.btn-refresh').trigger('click')
+                    })
+                }else{
+                    Fast.api.open($.fn.bootstrapTable.defaults.extend.set_discount+`/ids/${a.join(',')}`,'设置特价',{
+                        close(){
+                            $('.btn-refresh').trigger('click')
+                        }
+                    })
+                }
+            })
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        setdiscount(){
+            Controller.api.bindevent();
+            $(document).on('click','#activity_forever input',function (){
+                if(this.value==0){
+                    $('input[name="row[activity_time_end]"]').attr('disabled',false)
+                }else{
+                    $('input[name="row[activity_time_end]"]').attr('disabled',true)
+                }
+            })
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        },
+        takeit(){
+            Controller.api.bindevent();
+            $('.kill-discount-radio').change(function (){
+                let amount=$('#c-amount_base').val(),
+                    dis=this.value
+                let total=amount*dis
+                $('#c-amount_kill').val(total.toFixed(2))
+            })
+            $('.kill-discount').bind('input propertychange',function (){
+                let amount=$('#c-amount_base').val(),
+                    dis=this.value
+                let total=amount*dis/10
+                $('#c-amount_kill').val(total.toFixed(2))
+            })
+        }
+    };
+    return Controller;
+});