Sfoglia il codice sorgente

add export task job 增加导出任务

fly 4 anni fa
parent
commit
7fda0c45ad

+ 4 - 5
src/Controllers/BaseControllerConfig.php

@@ -26,12 +26,12 @@ trait BaseControllerConfig
 {
     public function __get($name)
     {
-        if (!isset($this->$name)) {
+        if (!isset($this->field[$name])) {
             return $this->$name();
         }
     }
 
-    protected function channel()
+    protected function channel(): Model
     {
         if (empty(session('ydychannel'))) {
             if (env('APP_ENV') == 'local') return Channel::find(1);
@@ -44,10 +44,9 @@ trait BaseControllerConfig
         return redisEnv('SHENJI_SWITCH') ? 1 : 0;
     }
 
-
     protected function is_sj_inner(): bool
     {
-        return in_array($this->phone, $this->inner_phones);
+        return in_array($this->phone(), $this->getInnerPhone());
     }
 
     protected function inner_phones(): array
@@ -100,7 +99,7 @@ trait BaseControllerConfig
     {
         $inner_phones = [];
         foreach ($this->inner_phones as $item) {
-            $inner_phones[] = $item . '2';
+            $inner_phones[] = $item->phone . '2';
         }
         return in_array($this->phone, $inner_phones);
     }

+ 1 - 2
src/Controllers/LandingPage/LinkController.php

@@ -3,13 +3,13 @@
 namespace General\Controllers\LandingPage;
 
 use App\Http\Controllers\Controller;
+use App\Jobs\AutoCheckLandingPage;
 use App\Libs\AliOSS;
 use General\Controllers\BaseControllerConfig;
 use General\Controllers\LandingPage\Transformers\BaiDuAdAccountTransformer;
 use General\Controllers\LandingPage\Transformers\LinkTransformer;
 use General\Controllers\LandingPage\Transformers\ReportOrderTramsformer;
 use General\Helpers\ExcelHelper;
-use General\Jobs\AutoCheckLandingPage;
 use General\Models\LandingPage\LandingPageLink;
 use General\Requests\BaiDuAdAccountRequest;
 use General\Requests\LandingPageLinkRequest;
@@ -183,7 +183,6 @@ class LinkController extends Controller
             '下单IP',
             '绑定ID',
             '广告计划ID',
-            '广告计划名称',
             '推广平台',
             '回传状态',
             '回传结果类型',

+ 1 - 1
src/Controllers/LandingPage/Transformers/LinkTransformer.php

@@ -45,7 +45,7 @@ class LinkTransformer
             case 'kuaishou':
                 return "{$model->cdn_link}?dycallback=6&channel_id={$model->channel_id}";
             default:
-                return "{$model->cdn_link}?dycallback=1&channel_id={$model->channel_id}&link_source={$model->link_source}&aid_name=__AID_NAME__";
+                return "{$model->cdn_link}?dycallback=1&channel_id={$model->channel_id}&link_source={$model->link_source}";
         }
     }
 }

+ 18 - 8
src/Controllers/LandingPage/Transformers/ReportOrderTramsformer.php

@@ -13,7 +13,6 @@ use General\Models\Order\Order;
 class ReportOrderTramsformer
 {
     const REPORT_TYPE = [
-        'no_log' => '无回传日志',
         'amount_filter' => '回传金额过滤',
         'register_24_charge' => '充值时间和注册时间必须在24小时以内',
         'current_day_register' => '注册时间和充值时间必须同一天',
@@ -34,6 +33,13 @@ class ReportOrderTramsformer
 
     public function transform($item)
     {
+
+        $reason = $this->getType($item);
+        $status = $item->reportOrder ? $item->reportOrder->status : 0;
+        if ($status == 1) {
+            $reason = '';
+        }
+
         return [
             'order_no' => $item->trade_no,
             'uid' => $item->uid,
@@ -44,11 +50,10 @@ class ReportOrderTramsformer
             'charge_ip' => $item->create_ip,
             'bind_id' => $item->reportUser ? $item->reportUser->id : 0,
             'adid' => $item->reportUser ? $item->reportUser->adid : 0,
-            'aid_name' => $item->reportUser ? urldecode($item->reportUser->aid_name) ?? '' : '',
             'platform' => $this->getPlatform($item),
-            'status' => $item->reportOrder ? $item->reportOrder->status : 0,
+            'status' => $status,
             'type' => $item->reportOrder ? $item->reportOrder->type : '',
-            'content' =>  $item->reportOrder && $item->reportOrder->status == 1 ? '' : $this->getType($item),
+            'content' => $reason,
             'report_percent' => ($item->reportOrder ? $item->reportOrder->report_percent * 100 : 0) . '%',
             'config_percent' => ($item->reportOrder ? $item->reportOrder->config_percent * 100 : 0) . '%',
         ];
@@ -56,13 +61,18 @@ class ReportOrderTramsformer
 
     private function getPlatform(Order $item)
     {
-        return $item->reportUser ? self::platform[$item->reportUser->platform] : '';
+        if ($item->reportUser) {
+            return self::platform[$item->reportUser->platform];
+        }
+        return '';
     }
 
     private function getType(Order $item)
     {
-        return $item->reportOrder ?
-            (array_key_exists($item->reportOrder->type, self::REPORT_TYPE) ? self::REPORT_TYPE[$item->reportOrder->type] : '')
-            : self::REPORT_TYPE['no_log'];
+        if ($item->reportOrder) {
+            return array_key_exists($item->reportOrder->type, self::REPORT_TYPE) ? self::REPORT_TYPE[$item->reportOrder->type] : '';
+        } else {
+            return self::REPORT_TYPE['no_user_match'];
+        }
     }
 }

+ 45 - 0
src/Helpers/AliOSSHelper.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace General\Helpers;
+
+use Illuminate\Support\Facades\Log;
+use OSS\Core\OssException;
+use OSS\OssClient;
+
+class AliOSSHelper
+{
+
+    private $oss_client;
+
+    private $bucket;
+
+    public function __construct()
+    {
+        $this->oss_client = new OssClient(env('OSS_ACCESS_ID'), env('OSS_ACCESS_KEY'), env('OSS_END_POINT'));
+        $this->bucket = env('OSS_BUCKET', 'zhuishuyun');
+    }
+
+    public function uploadFile(string $oss_path, string $file_path, string $bucket = null)
+    {
+        $bucket = $bucket ? $bucket : $this->bucket;
+        try {
+            $oss_file = $this->oss_client->uploadFile($bucket, $oss_path, $file_path);
+            return $oss_file['oss-request-url'];
+        } catch (OssException $e) {
+            Log::error($e->getMessage());
+            return null;
+        }
+    }
+
+    public function uploadString(string $oss_path, string $content, string $bucket = null)
+    {
+        $bucket = $bucket ? $bucket : $this->bucket;
+        try {
+            $oss_file = $this->oss_client->putObject($bucket, $oss_path, $content);
+            return $oss_file['oss-request-url'];
+        } catch (OssException $e) {
+            Log::error($e->getMessage());
+            return null;
+        }
+    }
+}

+ 115 - 0
src/Helpers/ExcelHelper.php

@@ -2,6 +2,9 @@
 
 namespace General\Helpers;
 
+use PhpOffice\PhpSpreadsheet\IOFactory;
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+
 /**
  * excel 工具类
  */
@@ -31,4 +34,116 @@ class ExcelHelper
         }
         exit();
     }
+
+    /**
+     * 导出csv到服务器
+     */
+    public static function saveFileCsv(array $column_names, array $data, string $file_name, string $path)
+    {
+        $file_path = $path . '/' . $file_name;
+        if (file_exists($file_path)) {
+            unlink($file_path);
+        }
+        $fp = fopen($file_path, "a");
+        $column_names = collect($column_names)->map(function ($item) {
+            return mb_convert_encoding($item, "GBK", "UTF-8");
+        })->all();
+        fputcsv($fp, $column_names);
+        $limit = 1000;
+        $calc = 1;
+        foreach ($data as $item) {
+            $calc++;
+            if ($limit == $calc) {
+                ob_flush();
+                flush();
+                $calc = 0;
+            }
+            $rows = collect($item)->map(function ($row) {
+                return mb_convert_encoding(is_numeric($row) && strlen($row) > 10 ? "'" . $row : $row, "GBK", "UTF-8");
+            })->all();
+            fputcsv($fp, $rows);
+        }
+        fclose($fp);
+    }
+
+
+    protected $excel_service;
+
+    public function __construct()
+    {
+        $this->excel_service = new Spreadsheet();
+    }
+
+    /**
+     * 保存Excel格式数据表 需要composer require phpoffice/phpspreadsheet
+     * @param string $title 
+     * @param array $header
+     * @param array $data
+     * @param string $file_name 
+     * @param string $path 
+     */
+    public function setExcelData(string $title, array $header, array $data, int $sheet_index = 0)
+    {
+        if ($sheet_index > 0) {
+            $this->excel_service->createSheet($sheet_index);
+        }
+        $this->excel_service->setActiveSheetIndex($sheet_index);
+        $sheet = $this->excel_service->getActiveSheet();
+        $sheet->setTitle($title);
+        $column_index = 1;
+        foreach ($header as $value) {
+            $sheet->getColumnDimensionByColumn($column_index)->setAutoSize(true);
+            $sheet->setCellValueByColumnAndRow($column_index, 1, $value);
+            $column_index++;
+        }
+        myLog('test')->info(memory_get_usage());
+        $row = 2;
+        foreach ($data as $val) {
+            $column_index = 1;
+            foreach ($val as $item) {
+                $sheet->setCellValueByColumnAndRow($column_index, $row, is_numeric($item) && strlen($item) > 10 ?  "'" . $item : $item);
+                $column_index++;
+            }
+            $row++;
+        }
+        myLog('test')->info(memory_get_usage());
+    }
+
+    public function saveExcelFile(string $file_name, string $path)
+    {
+        if (!$path) {
+            // Redirect output to a client’s web browser (Xlsx)
+            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+            header('Content-Disposition: attachment;filename=' . $file_name . ".xlsx");
+            header('Cache-Control: max-age=0');
+            // If you're serving to IE 9, then the following may be needed
+            header('Cache-Control: max-age=1');
+            // If you're serving to IE over SSL, then the following may be needed
+            header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
+            header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); // always modified
+            header('Cache-Control: cache, must-revalidate'); // HTTP/1.1
+            header('Pragma: public'); // HTTP/1.0
+
+            $writer = IOFactory::createWriter($this->excel_service, 'Xlsx');
+            $writer->save('php://output');
+            //return true;
+        } else {
+            $writer = IOFactory::createWriter($this->excel_service, 'Xlsx');
+            $writer->save($path . '/' . $file_name);
+        }
+    }
+
+    public function saveExcelData(array $header, array $data, string $file_name, string $path)
+    {
+        $this->setExcelData(substr($file_name, 0, 30), $header, $data);
+        $this->saveExcelFile($file_name, $path);
+    }
+
+    public function saveExcelDataToMultiSheet(array $param, string $file_name, string $path = '')
+    {
+        foreach ($param as $item) {
+            $this->setExcelData($item['title'], $item['header'], $item['data']);
+        }
+        $this->saveExcelFile($file_name, $path);
+    }
 }

+ 58 - 0
src/Jobs/ExportTaskJob.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace General\Jobs;
+
+use General\Helpers\AliOSSHelper;
+use General\Helpers\ExcelHelper;
+use General\Services\Export\AbstractDataExportHandle;
+use General\Services\Export\AbstractExportTask;
+use Illuminate\Bus\Queueable;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+
+class ExportTaskJob implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    private $task;
+    private $export_handle;
+
+    /**
+     * Create a new job instance.
+     *
+     * @return void
+     */
+    public function __construct(AbstractExportTask $task, AbstractDataExportHandle $handle)
+    {
+        $this->task = $task;
+        $this->export_handle = $handle;
+    }
+
+    /**
+     * Execute the job.
+     *
+     * @return void
+     */
+    public function handle()
+    {
+        $task_model =  $this->task->getModel();
+        $data = $this->export_handle->getExportData();
+        $headers = $this->export_handle->getHeaders();
+        $file_name = md5($task_model->id . strtotime($task_model->created_at)) . ".csv";
+        $local_path = storage_path('tmp');
+        ExcelHelper::saveFileCsv($headers, $data, $file_name, $local_path);
+        dd(1);
+        $oss_service = new AliOSSHelper;
+        $oss_path = $oss_service->uploadFile("reports", $local_path);
+        unlink($local_path . '/' . $file_name);
+        if ($oss_path) {
+            $task_model->file_path = $oss_path;
+            $task_model->status = 3;
+        } else {
+            $task_model->status = 4;
+        }
+        $task_model->save();
+    }
+}

+ 0 - 1
src/Models/Report/ReportUserBindRecord.php

@@ -19,7 +19,6 @@ class ReportUserBindRecord extends Model
     protected  $fillable = [
         'uid',
         'adid',
-        'aid_name',
         'platform',
         'link',
         'muid',

+ 0 - 13
src/Requests/QueryReportRequest.php

@@ -2,8 +2,6 @@
 
 namespace General\Requests;
 
-use General\Services\LandingPage\LandingPageLinkService;
-use Illuminate\Validation\Rule;
 
 class QueryReportRequest extends Request
 {
@@ -15,17 +13,6 @@ class QueryReportRequest extends Request
             'uid' => 'integer',
             'send_order_id' => 'integer|exists:qapp_send_orders:send_order_id',
             'adid' => 'string',
-            'type' => ['string', Rule::in([
-                'no_log',
-                'amount_filter',
-                'register_24_charge',
-                'current_day_register',
-                'no_user_match',
-                'feedback_user',
-                'percent_filter',
-                'protected_eligible',
-            ])],
-            'status' => ['integer', Rule::in([0, 1])],
         ];
     }
 }

+ 1 - 2
src/Requests/Request.php

@@ -17,8 +17,7 @@ abstract class Request extends FormRequest
     {
         throw (new HttpResponseException(response()->json([
             'code' => -1,
-            'msg' => '请求错误',
-            'data' => $validator->errors()->first(),
+            'msg' => $validator->errors()->first(),
         ], 200)));
     }
 

+ 69 - 0
src/Services/Export/AbstractDataExportHandle.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace General\Services\Export;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Collection;
+
+/**
+ * 统计数据导出处理对象
+ */
+abstract class AbstractDataExportHandle
+{
+    private $query_params;
+    private $headers;
+
+    public function __construct(array $query_params, array $headers)
+    {
+        $this->query_params = $query_params;
+        $this->headers = $headers;
+    }
+
+    public function __call($name, $arguments)
+    {
+        $property_name = $name . 's';
+        $id = $arguments[0];
+        return array_key_exists($id, $this->$property_name) ? $this->$property_name[$id] : null;
+    }
+
+    /**
+     * 设置每行数据
+     */
+    abstract public function setItemData(Model $item): array;
+
+    /**
+     * 查询
+     */
+    abstract public function query(array $params): array;
+
+    /**
+     * Collection 对象转数组提高键值查询效率
+     */
+    protected function collectToArray(Collection $collections, string $key)
+    {
+        return $collections->keyBy($key)->all();
+    }
+
+    /**
+     * 获取导出数据
+     */
+    public function getExportData()
+    {
+        $result = [];
+        foreach ($this->query($this->query_params) as $item) {
+            $value = $this->setItemData($item);
+            if ($value) {
+                $result[] = $value;
+            }
+        }
+        return $result;
+    }
+
+    /**
+     * 导出excel的标题头
+     */
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+}

+ 52 - 0
src/Services/Export/AbstractExportTask.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace General\Services\Export;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 导出任务
+ */
+abstract class AbstractExportTask
+{
+    private $model;
+    private $query_data;
+
+    public function __construct(Model $model, ExportQueryData $query_data)
+    {
+        $this->model = $model;
+        $this->query_data = $query_data;
+    }
+
+    abstract public function getTaskData(): array;
+
+    /**
+     * 创建导出任务
+     */
+    public function addTask(array $query_params)
+    {
+        $params = array_merge($this->getTaskData(), [
+            'name' => $this->query_data->memu_name,
+            'query_condition' => $this->query_data->getQueryParamsContent($query_params)
+        ]);
+        $this->setModel($this->model::create($params));
+    }
+
+    /**
+     * 更新任务状态
+     */
+    public function updateTask(int $id, int $status)
+    {
+        return $this->model::where('id', $id)->update(['status' => $status]);
+    }
+
+    public function setModel(Model $model)
+    {
+        $this->model = $model;
+    }
+
+    public function getModel(): Model
+    {
+        return $this->model;
+    }
+}

+ 28 - 0
src/Services/Export/ExportQueryData.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace General\Services\Export;
+
+/**
+ * 导出查询类
+ */
+class ExportQueryData
+{
+    public $query_params_map;
+    public $memu_name;
+
+    public function __construct(array $query_params_map, string $memu_name)
+    {
+        $this->query_params_map = $query_params_map;
+        $this->memu_name = $memu_name;
+    }
+
+    public function getQueryParamsContent(array $params)
+    {
+        $content = "";
+        foreach ($params as $key => $value) {
+            $content .= isset($this->query_params_map[$key]) && $value !== '' ?
+                "{$this->query_params_map[$key]}: {$value};" : '';
+        }
+        return $content;
+    }
+}

+ 3 - 3
src/Services/LandingPage/ChargeFeedBack/QappRereport.php

@@ -11,7 +11,7 @@ use General\Services\Report\BaseReport;
 /**
  * qapp付费重传
  */
-class QappRereport extends Rereport
+class QappRereport
 {
     public function reportInstance(string $link_source): BaseReport
     {
@@ -21,11 +21,11 @@ class QappRereport extends Rereport
         return $instance;
     }
 
-    public function addReportCount(ReportUserBindRecord $report_user): array
+    public function addReportCount(ReportUserBindRecord $report_user)
     {
         $service = new Report;
         $user = User::find($report_user->uid);
-        return $service->report('api/report/add', [
+        $service->report('api/report/add', [
             'source' => BaseConst::Platform,
             'adid' => $report_user->adid,
             'channel_id' => $user->distribution_channel_id,

+ 0 - 25
src/Services/LandingPage/LandingPageLinkService.php

@@ -217,31 +217,6 @@ class LandingPageLinkService
                     ->where('report_user_bind_records.adid', $params['adid']);
             });
         }
-        if (isset($params['type']) && $params['type']) {
-            if ($params['type'] == 'no_log') {
-                $sql->whereNotExists(function ($query) use ($params) {
-                    $query->select(DB::raw(1))
-                        ->from('report_user_charge_records')
-                        ->whereRaw('report_user_charge_records.order_no = orders.trade_no');
-                });
-            } else {
-                $sql->whereExists(function ($query) use ($params) {
-                    $query->select(DB::raw(1))
-                        ->from('report_user_charge_records')
-                        ->whereRaw('report_user_charge_records.order_no = orders.trade_no')
-                        ->where('report_user_charge_records.type', $params['type'])
-                        ->where('report_user_charge_records.status', 0);
-                });
-            }
-        }
-        if (isset($params['status']) && is_numeric($params['status'])) {
-            $sql->whereExists(function ($query) use ($params) {
-                $query->select(DB::raw(1))
-                    ->from('report_user_charge_records')
-                    ->whereRaw('report_user_charge_records.order_no = orders.trade_no')
-                    ->where('report_user_charge_records.status', $params['status']);
-            });
-        }
         if ($is_page) {
             return $sql->paginate();
         } else {

+ 1 - 1
src/Services/Report/BaiduReport.php

@@ -14,7 +14,7 @@ class BaiduReport extends BaseReport
     public function __construct()
     {
         $this->charge_event_type = 19;
-        $this->register_event_type = 16;
+        $this->register_event_type = 3;
         $this->report_url = 'https://ocpc.baidu.com/ocpcapi/api/uploadConvertData';
     }