cqpCow 2 年之前
父节点
当前提交
5adb3f76f6

+ 133 - 0
app/Exports/Exports.php

@@ -0,0 +1,133 @@
+<?php
+
+namespace App\Exports;
+
+
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Redis;
+use Maatwebsite\Excel\Concerns\FromCollection;
+
+use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
+use Maatwebsite\Excel\Concerns\WithEvents;     // 自动注册事件监听器
+use Maatwebsite\Excel\Concerns\WithHeadings;
+use Maatwebsite\Excel\Concerns\WithStrictNullComparison;    // 导出 0 原样显示,不为 null
+use Maatwebsite\Excel\Events\AfterSheet;
+use PhpOffice\PhpSpreadsheet\Cell\Cell;
+use PhpOffice\PhpSpreadsheet\Cell\DataType;
+use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
+
+
+class Exports extends DefaultValueBinder implements WithCustomValueBinder , FromCollection, WithEvents, WithStrictNullComparison,withHeadings
+{
+
+    /**
+     * @return \Illuminate\Support\Collection
+     */
+    public function __construct($data,$type=1,$headers)
+    {
+        $this->data = $data;
+        $this->type = $type;
+        $this->headers = $headers;
+    }
+
+    public function registerEvents(): array
+    {
+        //区分不通状态的合同导出,格式不同
+            $type = $this->type.'_set';
+            return $this->$type();
+    }
+
+    //数组转集合
+    public function collection()
+    {
+        return new Collection($this->createData());
+    }
+    //业务代码
+    public function createData()
+    {
+        $name = $this->type;
+        $data = $this->export();
+        return $data;
+
+    }
+
+    public function bindValue(Cell $cell, $value)
+    {
+        if (is_numeric($value)) {
+            $cell->setValueExplicit($value, DataType::TYPE_STRING2);
+
+            return true;
+        }
+
+        // else return default behavior
+        return parent::bindValue($cell, $value);
+    }
+
+    //use Maatwebsite\Excel\Concerns\WithColumnFormatting;
+    //use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
+//    public function columnFormats(): array
+//    {
+//        return [
+//            'F' => NumberFormat::FORMAT_NUMBER,
+//        ];
+//    }
+
+    // 自定义表头,需实现withHeadings接口
+    public function headings(): array
+    {
+        return $this->headers;
+    }
+
+    private function export(){
+        $list = [];
+        foreach ($this->data as $v){
+            $list[] = $v;
+        }
+        return $list;
+    }
+
+    private function production_order_set(){
+        return [
+            AfterSheet::class => function (AfterSheet $event) {
+                $count = count($this->data);
+
+                //设置区域单元格水平居中
+                $event->sheet->getDelegate()->getStyle('A1:'.'M'.($count+1))->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
+
+                // 定义列宽度
+                $widths = ['A' => 20, 'B' => 20, 'C' => 20, 'D' => 20, 'E' => 20, 'F' => 35, 'G' => 25, 'H' => 25, 'I' => 25, 'J' => 25];
+                foreach ($widths as $k => $v) {
+                    // 设置列宽度
+                    $event->sheet->getDelegate()->getColumnDimension($k)->setWidth($v);
+                }
+
+                $row = 2;
+                //设置字段
+                foreach ($this->data as $item) {
+                    $event->sheet->setCellValue('A'.$row, $item['production_time']);
+                    $event->sheet->setCellValue('B'.$row, $item['production_no']);
+                    $event->sheet->setCellValue('C'.$row, $item['out_order_no_time']);
+                    $event->sheet->setCellValue('D'.$row, $item['out_order_no']);
+                    $event->sheet->setCellValue('E'.$row, $item['customer_no']);
+                    $event->sheet->setCellValue('F'.$row, $item['customer_name']);
+                    $event->sheet->setCellValue('G'.$row, $item['table_header_mark']);
+                    $event->sheet->setCellValue('H'.$row, $item['product_no']);
+                    $event->sheet->setCellValue('I'.$row, $item['product_title']);
+                    $event->sheet->setCellValue('J'.$row, $item['product_size']);
+                    $event->sheet->setCellValue('K'.$row, $item['product_unit']);
+                    $event->sheet->setCellValue('L'.$row, $item['order_quantity']);
+                    $event->sheet->setCellValue('M'.$row, $item['production_quantity']);
+                    $event->sheet->setCellValue('N'.$row, $item['not_production']);
+                    $event->sheet->setCellValue('O'.$row, $item['technology_material']);
+                    $event->sheet->setCellValue('P'.$row, $item['technology_name']);
+                    $event->sheet->setCellValue('Q'.$row, $item['wood_name']);
+                    $event->sheet->setCellValue('R'.$row, $item['process_mark']);
+                    $event->sheet->setCellValue('S'.$row, $item['table_body_mark']);
+                    $event->sheet->setCellValue('T'.$row, $item['out_crt_man']);
+
+                    $row++; // 行数增加
+                }
+            },
+        ];
+    }
+}

+ 19 - 0
app/Http/Controllers/Api/ProductionOrderController.php

@@ -75,4 +75,23 @@ class ProductionOrderController extends BaseController
             return $this->json_return(201,$data);
             return $this->json_return(201,$data);
         }
         }
     }
     }
+
+    public function productionExport(Request $request)
+    {
+        $service = new ProductionOrderService();
+        $user = $request->get('auth');
+        list($status,$data) = $service->productionExport($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    //获取文件的位置
+    public function getItemFile($file_name){
+        $path = storage_path() . "/app/public/productionOrder/".$file_name;
+        return response()->file($path)->deleteFileAfterSend(true);
+    }
 }
 }

+ 65 - 0
app/Service/ProductionOrderService.php

@@ -2,6 +2,7 @@
 
 
 namespace App\Service;
 namespace App\Service;
 
 
+use App\Exports\Exports;
 use App\Model\OrdersProduct;
 use App\Model\OrdersProduct;
 use App\Model\OrdersProductBom;
 use App\Model\OrdersProductBom;
 use App\Model\OrdersProductMain;
 use App\Model\OrdersProductMain;
@@ -9,6 +10,7 @@ use App\Model\OrdersProductProcess;
 use App\Model\SaleOrdersProduct;
 use App\Model\SaleOrdersProduct;
 use App\Model\Technology;
 use App\Model\Technology;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\DB;
+use Maatwebsite\Excel\Facades\Excel;
 
 
 /**
 /**
  * bom相关
  * bom相关
@@ -246,4 +248,67 @@ class ProductionOrderService extends Service
 
 
         return $result;
         return $result;
     }
     }
+
+    public function productionExport($data){
+        $model = OrdersProduct::where('del_time',0)
+            ->select('id','order_no','out_order_no','out_order_no_time','customer_no','customer_name','table_header_mark','product_no','product_title','product_size','product_unit','order_quantity','technology_material','technology_name','wood_name','process_mark','table_body_mark','out_crt_man','out_checker_man','out_checker_time','production_quantity','production_time','production_no','status','sale_orders_product_id')
+            ->orderBy('id','desc');
+
+        if(! empty($data['order_no'])) $model->where('order_no', 'LIKE', '%'.$data['order_no'].'%');
+        if(! empty($data['out_order_no'])) $model->where('out_order_no', 'LIKE', '%'.$data['out_order_no'].'%');
+        if(! empty($data['production_no'])) $model->where('production_no', 'LIKE', '%'.$data['production_no'].'%');
+        if(! empty($data['customer_name'])) $model->where('customer_name', 'LIKE', '%'.$data['customer_name'].'%');
+        if(! empty($data['product_title'])) $model->where('product_title', 'LIKE', '%'.$data['product_title'].'%');
+        if(! empty($data['product_size'])) $model->where('product_size', 'LIKE', '%'.$data['product_size'].'%');
+        if(! empty($data['technology_material'])) $model->where('technology_material', 'LIKE', '%'.$data['technology_material'].'%');
+        if(! empty($data['technology_name'])) $model->where('technology_name', 'LIKE', '%'.$data['technology_name'].'%');
+        if(! empty($data['wood_name'])) $model->where('wood_name', 'LIKE', '%'.$data['wood_name'].'%');
+        if(! empty($data['process_mark'])) $model->where('process_mark', 'LIKE', '%'.$data['process_mark'].'%');
+        if(! empty($data['table_header_mark'])) $model->where('table_header_mark', 'LIKE', '%'.$data['table_header_mark'].'%');
+        if(! empty($data['table_body_mark'])) $model->where('table_body_mark', 'LIKE', '%'.$data['table_body_mark'].'%');
+        if(! empty($data['out_checker_man'])) $model->where('out_checker_man', 'LIKE', '%'.$data['out_checker_man'].'%');
+        if(! empty($data['out_crt_man'])) $model->where('out_crt_man', 'LIKE', '%'.$data['out_crt_man'].'%');
+        if(! empty($data['out_checker_time'][0]) && ! empty($data['out_checker_time'][1])) $model->whereBetween('out_checker_time',[$data['out_checker_time'][0],$data['out_checker_time'][1]]);
+        if(! empty($data['out_order_no_time'][0]) && ! empty($data['out_order_no_time'][1])) $model->whereBetween('out_order_no_time',[$data['out_order_no_time'][0],$data['out_order_no_time'][1]]);
+        if(! empty($data['production_time'][0]) && ! empty($data['production_time'][1])) $model->whereBetween('production_time',[$data['production_time'][0],$data['production_time'][1]]);
+        if(isset($data['status'])) $model->where('status',$data['status']);
+
+        $list = $model->get()->toArray();
+
+        //组织数据
+        $data = $this->fillExportData($list);
+
+        //保存导出数据
+        $name = $this->saveExportData($data);
+
+        return [true,$name];
+    }
+
+    public function fillExportData($data){
+        if(empty($data)) return $data;
+
+        $sale_orders_product_id = array_unique(array_column($data,'sale_orders_product_id'));
+        $production_map = $this->getProductionOrderQuantity($sale_orders_product_id);
+
+        date_default_timezone_set("PRC");
+        foreach ($data as $key => $value){
+            $data[$key]['out_order_no_time'] = $value['out_order_no_time'] ? date('Y-m-d',$value['out_order_no_time']) : '';
+            $data[$key]['out_checker_time'] = $value['out_checker_time'] ? date('Y-m-d',$value['out_checker_time']) : '';
+            $data[$key]['production_time'] = $value['production_time'] ? date('Y-m-d',$value['production_time']) : '';
+            $data[$key]['not_production'] = $value['order_quantity'] - ($production_map[$value['sale_orders_product_id']] ?? 0);
+        }
+
+        return $data;
+    }
+
+    public function saveExportData($data){
+        $file_name = time(). '_' . rand(1000,9999);
+        $filename =  $file_name.'.' . 'xlsx';
+        $headers = [
+            ['生产订单日期','生产订单号','销售订单日期','销售订单编号','客户编码','客户名称','表头备注','产品编码','产品名称','规格型号','计量单位','订单数量','生产数量','未下生产数量','工艺/材质','工艺名称','木皮名称','加工备注','表体备注','制单人']];
+
+        $bool = Excel::store(new Exports($data,'production_order',$headers),"/public/productionOrder/{$filename}", null, 'Xlsx', []);
+
+        return $filename;
+    }
 }
 }

文件差异内容过多而无法显示
+ 257 - 174
composer.lock


+ 2 - 1
routes/api.php

@@ -23,7 +23,7 @@ Route::any('getHeaderWord', 'Api\HeaderWordController@getHeaderWord');
 Route::any('getHeaderSetting', 'Api\HeaderWordController@getHeaderSettings');
 Route::any('getHeaderSetting', 'Api\HeaderWordController@getHeaderSettings');
 Route::any('deviceList', 'Api\Device\DeviceController@deviceList');
 Route::any('deviceList', 'Api\Device\DeviceController@deviceList');
 Route::any('fyy_set','Api\FyyOrderController@setFyy');
 Route::any('fyy_set','Api\FyyOrderController@setFyy');
-//Route::any('fyySaveOutOrder','Api\FyyOrderController@fyySaveOutOrder');
+Route::any('getProductionOrder/{file_name}','Api\ProductionOrderController@getItemFile');
 
 
 //测试接口
 //测试接口
 Route::any('test', 'Api\TestController@aa');
 Route::any('test', 'Api\TestController@aa');
@@ -139,6 +139,7 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('productionEdit', 'Api\ProductionOrderController@edit');
     $route->any('productionEdit', 'Api\ProductionOrderController@edit');
     $route->any('productionDel', 'Api\ProductionOrderController@del');
     $route->any('productionDel', 'Api\ProductionOrderController@del');
     $route->any('productionList', 'Api\ProductionOrderController@orderList');
     $route->any('productionList', 'Api\ProductionOrderController@orderList');
+    $route->any('productionExport', 'Api\ProductionOrderController@productionExport');
 
 
     //派工界面
     //派工界面
     $route->any('dispatchAdd', 'Api\DispatchController@add');
     $route->any('dispatchAdd', 'Api\DispatchController@add');

+ 0 - 2
storage/app/public/.gitignore

@@ -1,2 +0,0 @@
-*
-!.gitignore

部分文件因为文件数量过多而无法显示