xxxrrrdddd 3 年之前
父節點
當前提交
61131265b6

+ 2 - 127
application/admin/controller/Mobile.php

@@ -5,6 +5,7 @@ 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 PhpOffice\PhpSpreadsheet\Cell\Coordinate;
 use PhpOffice\PhpSpreadsheet\Reader\Csv;
 use PhpOffice\PhpSpreadsheet\Reader\Xls;
@@ -36,133 +37,7 @@ class Mobile extends Backend
 
     public function import()
     {
-
-        $file = $this->request->request('file');
-        if (!$file) {
-            $this->error(__('Parameter %s can not be empty', 'file'));
-        }
-        $file=parse_url($file,PHP_URL_PATH);
-        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
-        if (!is_file($filePath)) {
-            $this->error(__('No results were found'));
-        }
-        //实例化reader
-        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
-        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
-            $this->error(__('Unknown data format'));
-        }
-        if ($ext === 'csv') {
-            $file = fopen($filePath, 'r');
-            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
-            $fp = fopen($filePath, "w");
-            $n = 0;
-            while ($line = fgets($file)) {
-                $line = rtrim($line, "\n\r\0");
-                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
-                if ($encoding != 'utf-8') {
-                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
-                }
-                if ($n == 0 || preg_match('/^".*"$/', $line)) {
-                    fwrite($fp, $line . "\n");
-                } else {
-                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
-                }
-                $n++;
-            }
-            fclose($file) || fclose($fp);
-
-            $reader = new Csv();
-        } elseif ($ext === 'xls') {
-            $reader = new Xls();
-        } else {
-            $reader = new Xlsx();
-        }
-
-        //导入文件首行类型,默认是注释,如果需要使用字段名称请使用name
-        $importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment';
-
-        $table = $this->model->getQuery()->getTable();
-        $database = \think\Config::get('database.database');
-        $fieldArr = [];
-        $list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]);
-        foreach ($list as $k => $v) {
-            if ($importHeadType == 'comment') {
-                $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME'];
-            } else {
-                $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME'];
-            }
-        }
-
-        //加载文件
-        $insert = [];
-        try {
-            if (!$PHPExcel = $reader->load($filePath)) {
-                $this->error(__('Unknown data format'));
-            }
-            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
-            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
-            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
-            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
-            $fields = [];
-            for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
-                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
-                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
-                    $fields[] = $val;
-                }
-            }
-
-            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
-                $values = [];
-                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
-                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
-                    $values[] = is_null($val) ? '' : $val;
-                }
-                $row = [];
-                $temp = array_combine($fields, $values);
-                foreach ($temp as $k => $v) {
-                    if (isset($fieldArr[$k]) && $k !== '') {
-                        $row[$fieldArr[$k]] = $v;
-                    }
-                }
-                if ($row) {
-                    $insert[] = $row;
-                }
-            }
-        } catch (Exception $exception) {
-            $this->error($exception->getMessage());
-        }
-        if (!$insert) {
-            $this->error(__('No rows were updated'));
-        }
-
-        try {
-            //是否包含admin_id字段
-            $has_admin_id = false;
-            foreach ($fieldArr as $name => $key) {
-                if ($key == 'admin_id') {
-                    $has_admin_id = true;
-                    break;
-                }
-            }
-            if ($has_admin_id) {
-                $auth = Auth::instance();
-                foreach ($insert as &$val) {
-                    if (!isset($val['admin_id']) || empty($val['admin_id'])) {
-                        $val['admin_id'] = $auth->isLogin() ? $auth->id : 0;
-                    }
-                }
-            }
-            $this->model->saveAll($insert);
-        } catch (PDOException $exception) {
-            $msg = $exception->getMessage();
-            if (preg_match("/.+Integrity constraint violation: 1062 Duplicate entry '(.+)' for key '(.+)'/is", $msg, $matches)) {
-                $msg = "导入失败,包含【{$matches[1]}】的记录已存在";
-            };
-            $this->error($msg);
-        } catch (Exception $e) {
-            $this->error($e->getMessage());
-        }
-
+        MobileImport::import(input('file'));
         $this->success();
     }
 

+ 1 - 1
application/admin/lang/zh-cn/mobile.php

@@ -21,7 +21,7 @@ return [
     'Summary'           => '简介',
     'Saled'             => '是否已出售',
     'Is_activity'       => '是否特价号',
-    'Activity_time_end' => '特价号活动结束时间',
+    'Activity_time_end' => '特价结束时间',
     'Filter_num_0'      => '数量',
     'Filter_num_1'      => '数量',
     'Filter_num_2'      => '数量',

+ 2 - 2
application/common/model/Mobile.php

@@ -50,9 +50,9 @@ class Mobile extends Model
         });
 
         self::afterInsert(function (self $mobile){
-            if(!$mobile->info()->find()){
+            /*if(!$mobile->info()->find()){
                 $mobile->info()->save([]);
-            }
+            }*/
         });
 
         self::beforeInsert(function (self $mobile){

+ 12 - 0
application/common/model/MobileInfo.php

@@ -3,13 +3,25 @@
 namespace app\common\model;
 
 use think\Model;
+use Yansongda\Supports\Str;
 
 /**
  * 配置模型
  */
 class MobileInfo extends Model
 {
+    protected $type=[
+    ];
     public function mobile(){
         return $this->belongsTo(Mobile::class);
     }
+
+    protected static function init()
+    {
+        self::beforeWrite(function (self $info){
+            if(!is_numeric($info['first_month_free'])){
+                $info['first_month_free']=Str::contains($info['first_month_free'],'是')?1:0;
+            }
+        });
+    }
 }

+ 137 - 0
application/common/service/MobileImport.php

@@ -0,0 +1,137 @@
+<?php
+namespace app\common\service;
+
+use app\admin\library\Auth;
+use app\common\model\Mobile;
+use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
+use PhpOffice\PhpSpreadsheet\Reader\Csv;
+use PhpOffice\PhpSpreadsheet\Reader\Xls;
+use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
+use think\Db;
+use think\Exception;
+use think\exception\PDOException;
+
+class MobileImport{
+    public static function import($file){
+        if (!$file) {
+            throw_user(__('Parameter %s can not be empty', 'file'));
+        }
+        $file=parse_url($file,PHP_URL_PATH);
+        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
+        if (!is_file($filePath)) {
+            throw_user(__('No results were found'));
+        }
+        //实例化reader
+        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
+        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
+            throw_user(__('Unknown data format'));
+        }
+        if ($ext === 'csv') {
+            $file = fopen($filePath, 'r');
+            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
+            $fp = fopen($filePath, "w");
+            $n = 0;
+            while ($line = fgets($file)) {
+                $line = rtrim($line, "\n\r\0");
+                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
+                if ($encoding != 'utf-8') {
+                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
+                }
+                if ($n == 0 || preg_match('/^".*"$/', $line)) {
+                    fwrite($fp, $line . "\n");
+                } else {
+                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");
+                }
+                $n++;
+            }
+            fclose($file) || fclose($fp);
+
+            $reader = new Csv();
+        } elseif ($ext === 'xls') {
+            $reader = new Xls();
+        } else {
+            $reader = new Xlsx();
+        }
+
+        //导入文件首行类型,默认是注释,如果需要使用字段名称请使用name
+        $importHeadType = 'comment';
+
+        $table = (new Mobile)->getTable();
+        $database = \think\Config::get('database.database');
+        $fieldArr = [];
+        $list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]);
+        foreach ($list as $k => $v) {
+            if ($importHeadType == 'comment') {
+                $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME'];
+            } else {
+                $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME'];
+            }
+        }
+    $infoArr=[
+        '免流APP'=>'free_app',
+        '套餐说明|资费详情'=>'describe',
+        '详细内容|注意事项'=>'content',
+        '每年流量(G'=>'flow_year',
+        '费用'=>'fee',
+        '费用单位'=>'fee_unit',
+        '首月免月租'=>'first_month_free',
+        '简要优惠介绍'=>'discount_title',
+    ];
+        //加载文件
+        $insert = [];
+        try {
+            if (!$PHPExcel = $reader->load($filePath)) {
+                throw_user(__('Unknown data format'));
+            }
+            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
+            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
+            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
+            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
+            $fields = [];
+            for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
+                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
+                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
+                    $fields[] = $val;
+                }
+            }
+
+            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
+                $values = [];
+                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
+                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
+                    $values[] = is_null($val) ? '' : $val;
+                }
+                $row = [];
+                $row_info = [];
+                $temp = array_combine($fields, $values);
+                foreach ($temp as $k => $v) {
+                    if (isset($fieldArr[$k]) && $k !== '') {
+                        $row[$fieldArr[$k]] = $v;
+                    }
+                    if(isset($infoArr[$k]) && $k!==''){
+                        $row_info[$infoArr[$k]]=$v;
+                    }
+                }
+
+                if(Mobile::withTrashed()->where('no',$row['no'])->find()){
+                    continue;
+                }
+
+                Db::startTrans();
+                $mobile=Mobile::create($row);
+                if(!$mobile){
+                    Db::rollback();
+                    continue;
+                }
+                $info=$mobile->info()->save($row_info);
+                if(!$info){
+                    Db::rollback();
+                    continue;
+                }
+                Db::commit();
+            }
+        } catch (Exception $exception) {
+            throw_user($exception->getMessage());
+        }
+    }
+}

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

@@ -27,6 +27,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                     [
                         {checkbox: true},
                         {field: 'id', title: __('Id')},
+                        {field: 'logo', title: __('缩略图'),operate: false,formatter: Table.api.formatter.image},
                         {field: 'name', title: __('Name')},
                         {field: 'no', title: __('No')},
                         {field: 'type', title: __('Type'),formatter: Table.api.formatter.label,searchList:no_type},