|
@@ -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];
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|