xxxrrrdddd 2 年之前
父节点
当前提交
81a00cf256

+ 138 - 0
application/admin/controller/Mobile.php

@@ -8,9 +8,14 @@ use app\common\library\MobileConstant;
 use app\common\service\MobileImport;
 use app\common\service\MobilePriceLogService;
 use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\IOFactory;
 use PhpOffice\PhpSpreadsheet\Reader\Csv;
 use PhpOffice\PhpSpreadsheet\Reader\Xls;
 use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Style\Alignment;
+use PhpOffice\PhpSpreadsheet\Style\Border;
+use PhpOffice\PhpSpreadsheet\Style\Fill;
 use think\App;
 use think\Db;
 use think\Exception;
@@ -465,4 +470,137 @@ class Mobile extends Backend
     public function status(){
         return \app\common\model\Mobile::$status;
     }
+
+    public function add()
+    {
+        if($this->request->isPost()) {
+            $data = input('row/a');
+            if (!empty($data['city'])) {
+                $data['city'] = explode('/', $data['city'])[1];
+            }
+            Db::startTrans();
+            $this->validate($data, \app\admin\validate\Mobile::class);
+            $data['type'] = 1;
+            $info = [];
+            if (isset($data['describe'])) {
+                $info['describe'] = $data['describe'];
+                unset($data['describe']);
+            }
+            $mobile = $this->model::create($data);
+            $mobile->info()->save($info);
+            Db::commit();
+            $this->success();
+        }else{
+            return view();
+        }
+    }
+    public function export($ids){
+        $mobiles=$this->model->whereIn('id',$ids)->select();
+        $excel = new Spreadsheet();
+        $excel->getProperties()
+            ->setCreator("admin")
+            ->setLastModifiedBy("admin")
+            ->setTitle("导出号码")
+            ->setSubject("导出号码");
+        $excel->getDefaultStyle()->getFont()->setName('Microsoft Yahei');
+        $excel->getDefaultStyle()->getFont()->setSize(12);
+        $excel->getDefaultStyle()->applyFromArray(
+            array(
+                'fill'      => array(
+                    'type'  => Fill::FILL_SOLID,
+                    'color' => array('rgb' => '000000')
+                ),
+                'font'      => array(
+                    'color' => array('rgb' => "000000"),
+                ),
+                'alignment' => array(
+                    'vertical'   => Alignment::VERTICAL_CENTER,
+                    'horizontal' => Alignment::HORIZONTAL_CENTER,
+                    'indent'     => 1
+                ),
+                'borders'   => array(
+                    'allborders' => array('style' => Border::BORDER_THIN),
+                )
+            ));
+        $excel->getActiveSheet()->setCellValue('A1','ID');
+        $excel->getActiveSheet()->setCellValue('B1','手机号');
+        $excel->getActiveSheet()->setCellValue('C1','省份');
+        $excel->getActiveSheet()->setCellValue('D1','归属地');
+        $excel->getActiveSheet()->setCellValue('E1','运营商');
+        $excel->getActiveSheet()->setCellValue('F1','供应商');
+        $excel->getActiveSheet()->setCellValue('G1','卡品牌');
+        $excel->getActiveSheet()->setCellValue('H1','规律');
+        $excel->getActiveSheet()->setCellValue('I1','套餐信息');
+        $excel->getActiveSheet()->setCellValue('J1','原价');
+        $excel->getActiveSheet()->setCellValue('K1','底价');
+        $excel->getActiveSheet()->setCellValue('L1','售价');
+        $excel->getActiveSheet()->setCellValue('M1','秒杀价');
+        $excel->getActiveSheet()->setCellValue('N1','预存话费');
+        $excel->getActiveSheet()->setCellValue('O1','备注');
+        $excel->getActiveSheet()->setCellValue('P1','置顶');
+        $excel->getActiveSheet()->setCellValue('Q1','推荐');
+        $excel->getActiveSheet()->setCellValue('R1','号码状态');
+        $excel->getActiveSheet()->setCellValue('S1','更新时间');
+        $excel->getActiveSheet()->setCellValue('T1','上架时间');
+        $excel->getActiveSheet()->setCellValue('U1','排序');
+        $excel->getActiveSheet()->setCellValue('V1','预占通道');
+        $excel->getActiveSheet()->setCellValue('W1','预占用户ID');
+        $excel->getActiveSheet()->setCellValue('X1','上传用户');
+        $i=2;
+        foreach ($mobiles as $mobile){
+            $rules=[];
+            foreach (MobileConstant::getFilters() as $rule=>$field){
+                foreach (array_values($field) as $column){
+                    if($mobile[$column]==1){
+                        $rules[]=$rule;
+                    }
+                }
+            }
+            $mobile['rules']=array_values(array_unique($rules));
+            $status=$mobile['is_activity']?'预占':\app\common\model\Mobile::$status[$mobile['status']];
+            $excel->getActiveSheet()->setCellValue('A'.$i,$mobile['id']);
+            $excel->getActiveSheet()->setCellValue('B'.$i,$mobile['no']);
+            $excel->getActiveSheet()->setCellValue('C'.$i,$mobile['province']);
+            $excel->getActiveSheet()->setCellValue('D'.$i,$mobile['city']);
+            $excel->getActiveSheet()->setCellValue('E'.$i,$mobile['network']);
+            $excel->getActiveSheet()->setCellValue('F'.$i,$mobile['proxy']['nickname']??'');
+            $excel->getActiveSheet()->setCellValue('G'.$i,$mobile['brand']);
+            $excel->getActiveSheet()->setCellValue('H'.$i,implode(',',$mobile['rules']));
+            $excel->getActiveSheet()->setCellValue('I'.$i,$mobile['info']['describe']??'');
+            $excel->getActiveSheet()->setCellValue('J'.$i,$mobile['amount_original']);
+            $excel->getActiveSheet()->setCellValue('K'.$i,$mobile['amount_di']);
+            $excel->getActiveSheet()->setCellValue('L'.$i,$mobile['amount_base']);
+            $excel->getActiveSheet()->setCellValue('M'.$i,$mobile['amount_kill']);
+            $excel->getActiveSheet()->setCellValue('N'.$i,$mobile['amount_charge']);
+            $excel->getActiveSheet()->setCellValue('O'.$i,$mobile['remark']);
+            $excel->getActiveSheet()->setCellValue('P'.$i,$mobile['top_time']?'是':'否');
+            $excel->getActiveSheet()->setCellValue('Q'.$i,$mobile['rec_time']?'是':'否');
+            $excel->getActiveSheet()->setCellValue('R'.$i,$status);
+            $excel->getActiveSheet()->setCellValue('S'.$i,date('Y-m-d H:i:s',$mobile['update_time']));
+            $excel->getActiveSheet()->setCellValue('T'.$i,date('Y-m-d H:i:s',$mobile['create_time']));
+            $excel->getActiveSheet()->setCellValue('U'.$i,$mobile['sort']);
+            $excel->getActiveSheet()->setCellValue('V'.$i,$mobile['hold_chan']);
+            $excel->getActiveSheet()->setCellValue('W'.$i,$mobile['hold_user']);
+            $excel->getActiveSheet()->setCellValue('X'.$i,$mobile['admin_id']);
+            $i++;
+        }
+        $excel->createSheet();
+        // Redirect output to a client’s web browser (Excel2007)
+        $title = date("YmdHis");
+        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+        header('Content-Disposition: attachment;filename="' . $title . '.xlsx"');
+        header('Cache-Control: max-age=0');
+        // If you're serving to IE 9, then the following may be needed
+        header('Cache-Control: max-age=1');
+
+        // If you're serving to IE over SSL, then the following may be needed
+        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+        header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
+        header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
+        header('Pragma: public'); // HTTP/1.0
+
+
+        $objWriter = IOFactory::createWriter($excel, 'Xlsx');
+        $objWriter->save('php://output');
+    }
 }

+ 12 - 0
application/admin/validate/Mobile.php

@@ -10,6 +10,18 @@ class Mobile extends Validate
      * 验证规则
      */
     protected $rule = [
+        'no'=>['require','integer','length:11'],
+        'proxy_id'=>['require','integer'],
+        'city'=>['require'],
+        'brand'=>['require'],
+        'describe'=>['require'],
+        'amount_original'=>['require','number'],
+        'amount_di'=>['require','number'],
+        'amount_base'=>['require','number'],
+        'amount_charge'=>['require','number'],
+        'top_time'=>['require','number'],
+        'rec_time'=>['require','number'],
+        'status'=>['require','number'],
     ];
     /**
      * 提示消息

+ 7 - 52
application/admin/view/mobile/add.html

@@ -2,19 +2,13 @@
     <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="">
+            <input id="c-no" class="form-control" name="row[no]" type="text" data-rule="required;length(11);integer">
         </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="/"></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="">
+            <div class='control-relative'><input id="c-city" class="form-control" data-toggle="city-picker" name="row[city]" data-level="city" type="text" value="" data-rule="required"></div>
         </div>
     </div>
     <div class="form-group">
@@ -32,7 +26,7 @@
     <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"></textarea>
+            <textarea id="c-describe" class="form-control" name="row[describe]" type="text" data-rule="required"></textarea>
         </div>
     </div>
     <div class="form-group">
@@ -44,58 +38,25 @@
     <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="">
+            <input id="c-amount_original" class="form-control" name="row[amount_original]" type="number" value="" data-rule="required">
         </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="">
+            <input id="c-amount_di" class="form-control" name="row[amount_di]" type="number" value="" data-rule="required">
         </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="">
+            <input id="c-amount_base" class="form-control" name="row[amount_base]" type="number" value="" data-rule="required">
         </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="">
-        </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="">
-        </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" style="font-size: 20px;">
-            <label><input type="radio" class="kill-discount-radio" name="discount" value="0.95"/>95折</label>
-            <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>
-            <label><input type="radio" class="kill-discount-radio" name="discount" value="0.8"/>8折</label>
-            <label><input type="radio" class="kill-discount-radio" name="discount" value="0.75"/>75折</label>
-            <label><input type="radio" class="kill-discount-radio" name="discount" value="0.7"/>7折</label>
-            <div>
-                自定义<input type="number" value="" class="kill-discount" style="width: 150px;"/>
-            </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">
-            {:build_radios('row[is_activity]',[1=>'是',0=>'否'],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">
-            <input type="number" min="0" class="form-control" name="row[activity_time_end]" value=""/>
+            <input id="c-amount_charge" class="form-control" name="row[amount_charge]" type="number" value="" data-rule="required">
         </div>
     </div>
     <div class="form-group">
@@ -116,12 +77,6 @@
             {:build_radios('row[status]',$status,0)}
         </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="">
-        </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">

+ 2 - 0
application/admin/view/mobile/index.html

@@ -25,6 +25,7 @@
                         <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="/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('network/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</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-danger btn-del btn-disabled disabled {:$auth->check('mobile/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
@@ -35,6 +36,7 @@
 
 -->
                         <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>
+                        <a href="javascript:;" class="btn btn-danger btn-export disabled btn-disabled {:$auth->check('mobile/export')?'':'hide'}" id="btn-export-file"><i class="fa fa-expand"></i> {:__('导出')}</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">

+ 13 - 1
public/assets/js/backend/mobile.js

@@ -14,6 +14,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                     multi_edit_proxy_url: 'mobile/multi_edit_proxy',
                     multi_edit_status_url: 'mobile/multi_edit_status',
                     import_url: 'mobile/import',
+                    export_url: 'mobile/export',
                     batch: 'mobile/batch',
                     table: 'mobile',
                     cancel_discount: 'mobile/cancelsetdiscount',
@@ -38,6 +39,17 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 }
                 Fast.api.open(`${$.fn.bootstrapTable.defaults.extend.multi_edit_url}/ids/${ids.join(',')}`,'批量编辑')
             })
+            $('.btn-export').click(function (){
+                let ids=[]
+                $('#table').bootstrapTable('getSelections').forEach(item=>{
+                    ids.push(item.id)
+                })
+                if(!ids.length){
+                    parent.layer.alert('请选择')
+                    return
+                }
+                open(`${$.fn.bootstrapTable.defaults.extend.export_url}/ids/${ids.join(',')}`)
+            })
             $('.btn-multi-edit-proxy').click(function (){
                 let ids=[]
                 $('#table').bootstrapTable('getSelections').forEach(item=>{
@@ -224,7 +236,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 ]
             });
 
-            $('.btn-add').data('area',["100%","100%"])
+            $('.btn-add,.btn-edit').data('area',["100%","100%"])
 
             let setStatus = function (_this, field) {
                 let a = layer.load()