소스 검색

大文件导出优化

wufeng 2 년 전
부모
커밋
2e578fdfd0
2개의 변경된 파일53개의 추가작업 그리고 8개의 파일을 삭제
  1. 41 6
      app/admin/controller/SaleReport.php
  2. 12 2
      app/common.php

+ 41 - 6
app/admin/controller/SaleReport.php

@@ -543,6 +543,46 @@ class SaleReport extends Base
         $where = [['s.is_del', '=', 0], ['oo.status', '=', 2]];
         if ($param['start_date'] != '' && $param['end_date'] != '') $where[] = ['s.addtime', 'between', [$param['start_date'] . ' 00:00:00', $param['end_date'] . ' 23:59:59']];
 
+//        $data = Db::name('order_out')
+//            ->alias('oo')
+//            ->field('s.apply_name 创建人,"" 创建人所属部门,s.addtime 下单时间,s.orderCode 订单号,"" 一级企业,"" 二级企业,csi.companyName 客户名称,s.good_name 商品名称,s.good_num 数量,"" 单位,s.sale_price 单价,s.total_price 金额,oo.sendtime 发货时间,csi.itemid,s.good_code,s.order_type,s.apply_id')
+//            ->leftJoin('sale s', 's.orderCode=oo.orderCode')
+//            ->leftJoin('customer_info csi', 'csi.companyNo=s.customer_code')
+//            ->leftJoin('order_out out', 'out.orderCode=s.orderCode')
+//            ->where($where)
+//            ->order('s.addtime', 'desc')
+//            ->cursor('oo.id');
+
+//        $list = [];
+//        foreach ($data as $value) {
+//
+//            if (!empty($value['itemid'])) {
+//                $customer_org1 = array_column(get_top_customer_org($value['itemid']), 'name', 'level');
+//                $value['一级企业'] = isset($customer_org1[1]) ? $customer_org1[1] : '';
+//                $value['二级企业'] = isset($customer_org1[2]) ? $customer_org1[2] : '';
+//            }
+//
+//            if ($value['order_type'] == 3 || $value['order_type'] == 4) $value['单位'] = Db::name("good_zixun")->alias('gz')->leftJoin('unit u', 'u.id=gz.good_unit')->where(["gz.spuCode" => $value['good_code'], "gz.is_del" => 0])->value('u.unit');
+//            else $value['单位'] = Db::name('good_basic')->alias('gb')->leftJoin('unit u', 'u.id=gb.good_unit')->where(["gb.spuCode" => $value['good_code'], "gb.is_del" => 0])->value('u.unit');
+//
+//            $value['创建人所属部门'] = get_company_name_by_uid($value['apply_id']);//获取创建人的所属部门
+//
+//            unset($value['itemid']);
+//            unset($value['good_code']);
+//            unset($value['order_type']);
+//            unset($value['apply_id']);
+//
+//            $list[] = $value;
+//        }
+
+        $list = $this->saleNotSignedExportTemp($where);
+        excelSave('未签收报表' . date('YmdHis'), ['创建人','创建人所属部门','下单时间','订单号','一级企业','二级企业','客户名称','商品名称','数量','单位','单价','金额','发货时间'], $list);
+
+    }
+
+
+    //针对"【一、管理报表】5.未签收报表_导出"数据量太大
+    private function saleNotSignedExportTemp(array $where=[]){
         $data = Db::name('order_out')
             ->alias('oo')
             ->field('s.apply_name 创建人,"" 创建人所属部门,s.addtime 下单时间,s.orderCode 订单号,"" 一级企业,"" 二级企业,csi.companyName 客户名称,s.good_name 商品名称,s.good_num 数量,"" 单位,s.sale_price 单价,s.total_price 金额,oo.sendtime 发货时间,csi.itemid,s.good_code,s.order_type,s.apply_id')
@@ -553,10 +593,8 @@ class SaleReport extends Base
             ->order('s.addtime', 'desc')
             ->cursor();
 
-        $list = [];
         foreach ($data as $value) {
 
-
             if (!empty($value['itemid'])) {
                 $customer_org1 = array_column(get_top_customer_org($value['itemid']), 'name', 'level');
                 $value['一级企业'] = isset($customer_org1[1]) ? $customer_org1[1] : '';
@@ -573,12 +611,9 @@ class SaleReport extends Base
             unset($value['order_type']);
             unset($value['apply_id']);
 
-            $list[] = $value;
+            yield $value;
         }
 
-        if (empty($list)) $list[] = '没有相关可导出的数据';
-        excelSave('未签收报表' . date('YmdHis'), array_keys($list[0]), $list);
-
     }
 
     //【一、管理报表】6.售后报表

+ 12 - 2
app/common.php

@@ -577,6 +577,8 @@ function excelSave($fileName = '', $headArr = [], $data = [])
     if(!is_dir($dir)){
         mkdir($dir,0777,true);
     }
+
+    PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized);
     $objPHPExcel->setActiveSheetIndex(0); // 设置活动单指数到第一个表,所以Excel打开这是第一个表
     $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
     $objWriter->save($dir . $file); // 文件通过浏览器下载
@@ -908,8 +910,12 @@ if (!function_exists('excelSaveBatch')) {
         header('Content-disposition: attachment; filename=' . basename($file_dir)); # 处理文件名
         header("Content-Type: application/octet-stream");                           # 流文件输出
         header("Content-Transfer-Encoding: binary");                                # 告诉浏览器,这是二进制文件
-        header('Content-Length: ' . filesize($file_dir));                           # 告诉浏览器,文件大小
-        readfile($file_dir);//输出文件
+//        header('Content-Length: ' . filesize($file_dir));                           # 告诉浏览器,文件大小
+//        readfile($file_dir);//输出文件
+        $res = read_big_file($file_dir);
+        foreach ($res as $val) {
+            echo $val;
+        }
         @unlink($file_dir);
         exit();
     }
@@ -963,9 +969,13 @@ if (!function_exists('excelSaveFile')) {
             }
             $column++;
         }
+
         $file = $filename . ".xls";
 
         $objPHPExcel->setActiveSheetIndex(0); // 设置活动单指数到第一个表,所以Excel打开这是第一个表
+
+        PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized);
+
         $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
         $objWriter->save($dir . $file); // 文件通过浏览器下载
         $url = $dir . $file;