IOService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace App\Service;
  3. use App\Exports\MyExport;
  4. use App\Model\Header_ext;
  5. use Illuminate\Support\Facades\Route;
  6. class IOService extends Service
  7. {
  8. public function apiExport($request){
  9. list($status,$data) = $this->apiHook($request);
  10. if($status != 200) return [false,$data];
  11. $list = $data['data']['data'];
  12. $data = $request->all();
  13. $menu_id = $data['menu_id'];
  14. $head_list = Header_ext::where('menu_id',$menu_id)->where('del_time',0)->get()->toArray();
  15. $marge = [];
  16. foreach ($head_list as &$value){
  17. $positions = explode(':',$value['position']);
  18. $value['e_words'] = [];
  19. foreach ($positions as $vv){
  20. $value['e_words'][] = $vv;
  21. }
  22. if(count($positions) === 2) $marge[] = $value['position'];
  23. }
  24. list($head,$max_row) = $this->setHeadEWordChangeNum($head_list);
  25. //初始化一个列数组
  26. $init_row = [];
  27. for ($i=0;$i<$max_row;$i++){
  28. $init_row[$i] = '';
  29. }
  30. //拼所有的表头,先确认每行的表头
  31. $excel_head = [];
  32. $line_max = 0;
  33. foreach ($head as $v){
  34. $line = $v['lines'][0]-1;
  35. $detail = [
  36. 'key' => $v['key'],
  37. 'value' => $v['value'],
  38. 'rows' => $v['rows'],
  39. 'lines' => $v['lines'],
  40. ];
  41. foreach ($v['lines'] as $vv){
  42. if($vv > $line_max) $line_max = $vv;
  43. }
  44. $excel_head[$line][] = $detail;
  45. }
  46. //初始化表头的行
  47. $excel_data = [];
  48. for ($i=0;$i<$line_max;$i++){
  49. $excel_data[$i] = $init_row;
  50. }
  51. $key_word = [];
  52. foreach ($excel_head as $k=>$v){
  53. foreach ($v as $vv){
  54. $row = $vv['rows'][0];
  55. if(!empty($vv['key'])) $key_word[$vv['key']] = $row;
  56. $excel_data[$k][$row] = $vv['value'];
  57. }
  58. }
  59. foreach ($list as $v){
  60. $detail = $init_row;
  61. foreach ($key_word as $key=>$vv){
  62. if(isset($v[$key])) $detail[$vv] = $v;
  63. }
  64. $excel_data[] = $detail;
  65. }
  66. $excel = (new MyExport())->commonExport( [
  67. 'data' => $data,
  68. 'params' => [
  69. 'merge' => $marge
  70. ],
  71. ]);
  72. return [true,$excel];
  73. }
  74. /**
  75. * 获取具体数据,通过访问页面相同接口
  76. * @param $request
  77. * @return array
  78. */
  79. public function apiHook($request){
  80. $data = $request->all();
  81. $api = $data['api'];
  82. $route = Route::getRoutes();
  83. $return = [];
  84. foreach ($route as $v){
  85. $uri = $v->uri();
  86. $action = $v->getAction();
  87. $return[$uri] = $action['uses'];
  88. }
  89. $class = explode('@',$return[$api]);
  90. $use_name = '\\'.$class[0];
  91. $example = new $use_name();
  92. $name = $class[1];
  93. $return = $example->$name($request);
  94. return $return;
  95. }
  96. /**
  97. * 将合并定位的excel数据进行处理
  98. * @param $head
  99. * @return mixed
  100. */
  101. public function setHeadEWordChangeNum($head){
  102. $max_row = 0;
  103. foreach ($head as &$v){
  104. $v['rows'] = [];
  105. $v['lines'] = [];
  106. foreach ($v['e_words'] as $vv){
  107. preg_match_all('/\d+/', $vv, $matches);
  108. $number = $matches[0][0];
  109. $v['lines'][] = $number;
  110. $row = eWordChangeNum(str_replace($number,'',$vv));
  111. $v['rows'][] = $row;
  112. if($row>$max_row) $max_row = $row;
  113. }
  114. }
  115. foreach ($head as &$v){
  116. sort($v['rows']);
  117. sort($v['lines']);
  118. }
  119. return [$head,$max_row];
  120. }
  121. }