root 1 year ago
parent
commit
d068f8c8e2

+ 83 - 0
app/Exports/CommonExport.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace App\Exports;
+
+
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Redis;
+use Maatwebsite\Excel\Concerns\FromCollection;
+
+use Maatwebsite\Excel\Concerns\WithEvents;     // 自动注册事件监听器
+use Maatwebsite\Excel\Concerns\WithStrictNullComparison;    // 导出 0 原样显示,不为 null
+use Maatwebsite\Excel\Events\AfterSheet;
+
+
+
+
+class CommonExport implements FromCollection, WithEvents, WithStrictNullComparison
+{
+
+    public $data;
+
+    /**
+     * @return \Illuminate\Support\Collection
+     */
+    public function __construct($data)
+    {
+        $this->data = $data;
+    }
+
+    public function registerEvents(): array
+    {
+        //这边处理数据格式
+
+        //关于表单的合并
+        $params = $this->data['params'];
+
+        $style = [
+            AfterSheet::class => function (AfterSheet $event) use($params) {
+                $count = count($this->data['data']);
+
+                //设置区域单元格水平居中
+                $event->sheet->getDelegate()->getStyle('A1:'.'BZ'.($count+1))->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
+
+
+                //合并相关
+                $merge = $params['merge'];
+                $event->sheet->getDelegate()->setMergeCells($merge);
+            },
+        ];
+
+        return $style;
+
+    }
+
+
+    //数组转集合
+    public function collection()
+    {
+        return new Collection($this->createData());
+    }
+    //业务代码
+    public function createData()
+    {
+        $data = $this->export();
+        return $data;
+
+    }
+
+    private function export(){
+//        var_dump($this->data);die;
+        $data = $this->data['data'];
+        $list = [];
+        foreach ($data as $v){
+            $list[] = $v;
+        }
+        return $list;
+    }
+
+
+
+
+
+}

+ 30 - 0
app/Exports/MyExport.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Exports;
+
+use Maatwebsite\Excel\Facades\Excel;
+
+
+
+
+class MyExport {
+
+    public $base1_path = '/app';
+    public $base2_path = '/excel';
+
+    public function commonExport($data,$path = ''){
+
+        $param = $data;
+        $export = new CommonExport($param);
+        $date = date('Ymd');
+        $path = $date.'/'.$path;
+        Excel::store($export, $path);
+        return ['file'=>$this->base2_path.'/'.$path];
+    }
+
+
+    public function excelDownload($file){
+        return response()->file(storage_path().$this->base1_path.$this->base2_path.'/'.$file);
+    }
+
+}

+ 23 - 0
app/Http/Controllers/Api/ExcelController.php

@@ -0,0 +1,23 @@
+<?php
+namespace App\Http\Controllers\Api;
+
+use App\Exports\MyExport;
+use Illuminate\Http\Request;
+
+//导入导出
+class ExcelController extends BaseController
+{
+    /**
+     * 下载
+     * @param Request $request
+     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
+     */
+    public function excelDownload(Request $request){
+
+        $data = $request->all();
+        $file_name = $data['file_name'];
+        $excel = new MyExport();
+        return  $excel->excelDownload($file_name);
+    }
+
+}

+ 42 - 0
app/Http/Controllers/Api/IOController.php

@@ -0,0 +1,42 @@
+<?php
+namespace App\Http\Controllers\Api;
+
+use App\Exports\MyExport;
+use App\Service\IOService;
+use Illuminate\Http\Request;
+
+
+//导入导出
+class IOController extends BaseController
+{
+    /**
+     * 下载
+     * @param Request $request
+     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
+     */
+    public function excelDownload(Request $request){
+
+        $data = $request->all();
+        $file_name = $data['file_name'];
+        $excel = new MyExport();
+        return  $excel->excelDownload($file_name);
+    }
+
+
+    public function apiExport(Request $request){
+
+
+
+//        $data = $request->all();
+
+        $service = new IOService();
+        list($status,$data) = $service->apiExport($request);
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+
+
+    }
+}

+ 148 - 0
app/Service/IOService.php

@@ -0,0 +1,148 @@
+<?php
+
+namespace App\Service;
+
+use App\Exports\MyExport;
+use App\Model\Header_ext;
+use Illuminate\Support\Facades\Route;
+
+class IOService extends Service
+{
+
+
+    public function apiExport($request){
+
+        list($status,$data) = $this->apiHook($request);
+        if($status != 200) return [false,$data];
+        $list = $data['data']['data'];
+
+        $data = $request->all();
+        $menu_id = $data['menu_id'];
+
+        $head_list = Header_ext::where('menu_id',$menu_id)->where('del_time',0)->get()->toArray();
+        $marge = [];
+        foreach ($head_list as &$value){
+            $positions = explode(':',$value['position']);
+            $value['e_words'] = [];
+            foreach ($positions as $vv){
+                $value['e_words'][] = $vv;
+            }
+            if(count($positions) === 2) $marge[] = $value['position'];
+        }
+        list($head,$max_row) = $this->setHeadEWordChangeNum($head_list);
+        //初始化一个列数组
+        $init_row = [];
+        for ($i=0;$i<$max_row;$i++){
+            $init_row[$i] = '';
+        }
+
+        //拼所有的表头,先确认每行的表头
+
+        $excel_head  = [];
+        $line_max = 0;
+        foreach ($head as $v){
+            $line = $v['lines'][0]-1;
+            $detail = [
+                'key' => $v['key'],
+                'value' => $v['value'],
+                'rows' => $v['rows'],
+                'lines' => $v['lines'],
+            ];
+            foreach ($v['lines'] as $vv){
+                if($vv > $line_max) $line_max = $vv;
+            }
+            $excel_head[$line][] = $detail;
+        }
+
+        //初始化表头的行
+        $excel_data = [];
+        for ($i=0;$i<$line_max;$i++){
+            $excel_data[$i] = $init_row;
+        }
+        $key_word = [];
+        foreach ($excel_head as $k=>$v){
+            foreach ($v as $vv){
+                $row = $vv['rows'][0];
+                if(!empty($vv['key']))  $key_word[$vv['key']] = $row;
+
+                $excel_data[$k][$row] = $vv['value'];
+            }
+
+        }
+        foreach ($list as $v){
+            $detail = $init_row;
+
+            foreach ($key_word as $key=>$vv){
+                if(isset($v[$key])) $detail[$vv] = $v;
+            }
+
+            $excel_data[] = $detail;
+        }
+
+        $excel = (new MyExport())->commonExport( [
+            'data' => $data,
+            'params' => [
+                'merge' => $marge
+            ],
+        ]);
+
+        return [true,$excel];
+    }
+
+
+    /**
+     * 获取具体数据,通过访问页面相同接口
+     * @param $request
+     * @return array
+     */
+    public function apiHook($request){
+
+        $data = $request->all();
+        $api = $data['api'];
+        $route = Route::getRoutes();
+        $return = [];
+        foreach ($route as $v){
+
+            $uri = $v->uri();
+            $action = $v->getAction();
+            $return[$uri] = $action['uses'];
+        }
+
+        $class = explode('@',$return[$api]);
+        $use_name = '\\'.$class[0];
+        $example = new $use_name();
+        $name = $class[1];
+        $return = $example->$name($request);
+        return $return;
+    }
+
+    /**
+     * 将合并定位的excel数据进行处理
+     * @param $head
+     * @return mixed
+     */
+    public function setHeadEWordChangeNum($head){
+        $max_row = 0;
+        foreach ($head as &$v){
+            $v['rows'] = [];
+            $v['lines'] = [];
+            foreach ($v['e_words'] as $vv){
+                preg_match_all('/\d+/', $vv, $matches);
+                $number = $matches[0][0];
+                $v['lines'][] = $number;
+                $row = eWordChangeNum(str_replace($number,'',$vv));
+                $v['rows'][] = $row;
+                if($row>$max_row) $max_row = $row;
+            }
+        }
+        foreach ($head as &$v){
+            sort($v['rows']);
+            sort($v['lines']);
+        }
+        return [$head,$max_row];
+    }
+
+
+
+
+}

+ 20 - 0
app/helpers.php

@@ -260,3 +260,23 @@ function setOrderNo(){
 
 
     return $order_no;
     return $order_no;
 }
 }
+
+//26位英文转换为10进制
+function eWordChangeNum($value){
+    $letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 26个英文字母
+//    $value = "ABC"; // 要转换的英文进制值
+
+    $decimalValue = 0;
+    $base = strlen($letters); // 进制的基数为26
+
+// 从最高位开始逐个处理
+    for ($i = 0; $i < strlen($value); $i++) {
+        $char = strtoupper($value[$i]);
+        $position = strpos($letters, $char); // 获取字母在进制中的位置
+        $decimalValue = $decimalValue * $base + ($position + 1); // 转换为十进制
+    }
+
+    return $decimalValue;
+}
+
+

+ 5 - 1
composer.json

@@ -13,7 +13,8 @@
         "firebase/php-jwt": "^6.4",
         "firebase/php-jwt": "^6.4",
         "fruitcake/laravel-cors": "^2.2",
         "fruitcake/laravel-cors": "^2.2",
         "laravel/framework": "^6.20.26",
         "laravel/framework": "^6.20.26",
-        "laravel/tinker": "^2.5"
+        "laravel/tinker": "^2.5",
+        "maatwebsite/excel": "^3.1"
     },
     },
     "require-dev": {
     "require-dev": {
         "facade/ignition": "^1.16.15",
         "facade/ignition": "^1.16.15",
@@ -39,6 +40,9 @@
         "classmap": [
         "classmap": [
             "database/seeds",
             "database/seeds",
             "database/factories"
             "database/factories"
+        ],
+        "files": [
+            "app/helpers.php"
         ]
         ]
     },
     },
     "autoload-dev": {
     "autoload-dev": {

File diff suppressed because it is too large
+ 775 - 159
composer.lock


+ 6 - 1
routes/api.php

@@ -21,7 +21,7 @@ Route::any('login', 'Api\LoginController@login');
 Route::any('test', 'Api\TestController@aa');
 Route::any('test', 'Api\TestController@aa');
 Route::any('getHeaderWord', 'Api\HeaderWordController@getHeaderWord');
 Route::any('getHeaderWord', 'Api\HeaderWordController@getHeaderWord');
 Route::any('deviceList', 'Api\Device\DeviceController@deviceList');
 Route::any('deviceList', 'Api\Device\DeviceController@deviceList');
-Route::group(['middleware'=> ['checkLogin']],function ($route){
+Route::group(['middleware'=> []],function ($route){
     $route->any('menuAdd', 'Api\SysMenuController@add');
     $route->any('menuAdd', 'Api\SysMenuController@add');
     $route->any('menuEdit', 'Api\SysMenuController@edit');
     $route->any('menuEdit', 'Api\SysMenuController@edit');
     $route->any('menuDel', 'Api\SysMenuController@del');
     $route->any('menuDel', 'Api\SysMenuController@del');
@@ -112,4 +112,9 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('boxTransport', 'Api\OrderTransportController@boxTransport');
     $route->any('boxTransport', 'Api\OrderTransportController@boxTransport');
     $route->any('transportConfirm', 'Api\OrderTransportController@transportConfirm');
     $route->any('transportConfirm', 'Api\OrderTransportController@transportConfirm');
 
 
+
+    $route->any('apiExport', 'Api\IOController@apiExport');
+
+
+
 });
 });

Some files were not shown because too many files changed in this diff