From c95421808823aa339aacf93b03500b30ef3ca6cb Mon Sep 17 00:00:00 2001 From: "HESU\\HESU" <1696136552@qq.com> Date: Thu, 17 Apr 2025 10:14:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 6 +- app/controller/DailyController.php | 13 +++- app/middleware/DataTracker.php | 48 ++++++++------ app/process/Task.php | 100 ++++++++++++++++++++--------- config/const.php | 13 +++- config/middleware.php | 4 +- 6 files changed, 125 insertions(+), 59 deletions(-) diff --git a/.env.example b/.env.example index 2da6de2..52e4add 100644 --- a/.env.example +++ b/.env.example @@ -19,4 +19,8 @@ JWT_EXPIRATION = 2592000 WEBMAN_LISTEN = 'http://0.0.0.0:9007' WEBMAN_COUNT = 8 -RPC_DOMAIN = http://219.157.255.213:25015 \ No newline at end of file +# 公共服务 +RPC_DOMAIN = http://219.157.255.213:25015 + +# 前端域名 +WEB_DOMAIN = http://219.157.255.213:8085 \ No newline at end of file diff --git a/app/controller/DailyController.php b/app/controller/DailyController.php index 61cc700..e3a0b02 100644 --- a/app/controller/DailyController.php +++ b/app/controller/DailyController.php @@ -26,13 +26,20 @@ class DailyController $perPage = $request->input('per_page', 10); //id - $user_id = $request->user['id']; - if(Util::isEmpty($user_id)){ + $userId = $request->user['id']; + if(Util::isEmpty($userId)){ return Util::fail([],'user_id'.trans('not_null')); } $where = []; - $where['user_id'] = $user_id; + + //判断领导 + $mast = config('const.daily_group_2'); + if ($userId == $mast['master']) { + $where['leader_id'] = $mast['master']; + }else{ + $where['user_id'] = $userId; + } // 执行分页查询 $data = Daily::with('user')->where($where) diff --git a/app/middleware/DataTracker.php b/app/middleware/DataTracker.php index 5d06b4d..2696f48 100644 --- a/app/middleware/DataTracker.php +++ b/app/middleware/DataTracker.php @@ -5,12 +5,17 @@ use app\model\RequestTracks; class DataTracker { + // 不需要埋点的路径 + protected $excludePaths = [ + '/user/login' + ]; + public function process($request, \Closure $next) { - // 前置处理 - if($request->path() != 'user/login'){ - return $request; + if ($this->shouldSkipTracking($request)) { + return $next($request); } + // 前置处理 $this->logRequestData($request); $response = $next($request); @@ -21,11 +26,31 @@ class DataTracker return $response; } + protected function shouldSkipTracking($request) + { + $currentPath = $request->path(); + + $eventTracking = config('const.event_tracking'); + + // 检查是否在排除列表中 +// foreach ($this->excludePaths as $path) { +// if (str_starts_with($currentPath, $path)) { +// return true; +// } +// } + + if (in_array($currentPath, $eventTracking)) { + return false; + } + + return true; + } + protected function logRequestData($request) { $trackData = [ 'app_id' => 'crm/api', - 'user_id' => $request->user['id'], + 'user_id' => $request->user['id']??0, 'ip' => $request->getRealIp(), 'method' => $request->method(), 'path' => $request->path(), @@ -38,20 +63,7 @@ class DataTracker $requestTrack = RequestTracks::create($trackData); } - protected function sendToQueue($data) - { - // 使用Redis队列 - try { - redis()->lpush('track_queue', json_encode($data)); - } catch (\Exception $e) { - // 失败降级处理 - file_put_contents( - runtime_path('logs/track_fallback.log'), - json_encode($data) . PHP_EOL, - FILE_APPEND - ); - } - } + protected function generateTraceId() { diff --git a/app/process/Task.php b/app/process/Task.php index 926a7b6..555c28e 100644 --- a/app/process/Task.php +++ b/app/process/Task.php @@ -5,6 +5,7 @@ namespace app\process; use app\controller\FeishuController; use app\model\Customer; use app\model\CustomerHis; +use app\model\Daily; use app\model\FeishuUser; use app\model\RequestTracks; use app\model\User; @@ -18,9 +19,9 @@ class Task public function onWorkerStart() { // 每半小时执行一次 - new Crontab('0 */30 * * * *', function(){ + new Crontab('0 */30 * * * *', function () { echo date('Y-m-d H:i:s') . "\n"; - Log::info('send follow start',[time()]); + Log::info('send follow start', [time()]); // FeishuController::send('xinyouhe','ou_e33bb3017ada6c4781398a68e55a4696', '跟进提醒', '您有新的跟进提醒', ''); // $customer = Customer::where(['follow_next', '<=', time() + 3600]) // ->where(['follow_next', '>', time()]) @@ -56,29 +57,29 @@ class Task $feishuUser = FeishuUser::where(['user_id' => $item->user_id])->first(); if ($feishuUser) { // 获取凭证 - $certificate = config('feishu.'.$feishuUser->sign); + $certificate = config('feishu.' . $feishuUser->sign); // 使用parse_url解析URL $parsedUrl = parse_url($certificate['rUrl']); // 获取域名和端口 $host = $parsedUrl['host']; $port = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : ''; - $url = 'http://'. $host .$port. '/pages/customer/detile?id='.$item->id; + $url = 'http://' . $host . $port . '/pages/customer/detile?id=' . $item->id; $item->warn = 1; $item->update(); - Log::info('send',['open_id'=>$item['open_id'],'url'=>$url]); - $content = FeishuController::postMsg( '跟进提醒', '您有新的跟进提醒', $url); + Log::info('send', ['open_id' => $item['open_id'], 'url' => $url]); + $content = FeishuController::postMsg('跟进提醒', '您有新的跟进提醒', $url); FeishuController::send($feishuUser->sign, $feishuUser->open_id, $content, 'post'); } } - Log::info('send follow start',[time()]); + Log::info('send follow start', [time()]); }); //回收站客户转向公海 每小时执行一次 - new Crontab('0 10 * * * *', function(){ + new Crontab('0 10 * * * *', function () { echo date('Y-m-d H:i:s') . "\n"; - Log::info('send high seas start',[time()]); + Log::info('send high seas start', [time()]); $where = [ ['deleted_at', '<=', time() - 3600], @@ -94,51 +95,67 @@ class Task ]); } - Log::info('send high seas end',[time()]); + Log::info('send high seas end', [time()]); }); //总结日报, 每天执行一次 new Crontab('0 30 17 * * *', function () { - echo date('Y-m-d H:i:s') . "\n"; + echo date('Y-m-d H:i:s') . " start daily \n"; Log::info('start daily', [time()]); - + $where[] = ["user_id", ">", 0]; $where = [ ['created_at', '<=', time() - (3600 * 24)], ]; - $requestTracks = RequestTracks::select('*, COUNT(*) as count') + $eventTracking = config('const.event_tracking'); + $requestTracks = RequestTracks::selectRaw('user_id,path, COUNT(*) as count',) +// select('*',' COUNT(*) as count') ->where($where) - ->whereIn('path', ['customer/claim', 'customer/save', 'follow/save', 'customer/collect']) - ->groupBy('user_id','path') - ->orderBy('user_id', 'asc') + ->whereIn('path', $eventTracking) + ->groupBy('user_id', 'path') +// ->orderBy('user_id', 'asc') ->get(); $statistics = []; $users = []; - $daily = ''; + $content = ''; foreach ($requestTracks as $item) { $statistics[$item->user_id][$item->path] = $item->count; $users[] = $item->user_id; } foreach ($users as $userId) { - $daily .= date('Y-m-d') . "\n"; - $daily .= '领取客户'.$statistics[$userId]['customer/claim'].'位\n'; - $daily .= '创建或修改客户'.$statistics[$userId]['customer/save'].'位\n'; - $daily .= '添加跟进'.$statistics[$userId]['follow/save'].'次\n'; - $daily .= '询盘跟单客户'.$statistics[$userId]['customer/collect'].'位\n'; - $daily .= '请及时查看,30分钟后将向主管发送'; + $data = [ + 'user_id' => $userId, + 'customer_claim' => $statistics[$userId]['customer/claim'] ?? 0, + 'customer_save' => $statistics[$userId]['customer/save'] ?? 0, + 'follow_add' => $statistics[$userId]['follow/save'] ?? 0, + 'customer_collect' => $statistics[$userId]['customer/collect'] ?? 0, + 'content' => '', + ]; + + //判断领导 + $mast = config('const.daily_group_2'); + if (in_array($userId, $mast['member'])) { + $data['leader_id'] = $mast['master']; + }else{ + $data['leader_id'] = 5; + } + + $content .= date('Y-m-d') . "\n"; + $data['content'] .= '领取客户' . ($statistics[$userId]['customer/claim'] ?? 0) . '位\n'; + $data['content'] .= '创建或修改客户' . ($statistics[$userId]['customer/save'] ?? 0) . '位\n'; + $data['content'] .= '添加跟进' . ($statistics[$userId]['follow/save'] ?? 0) . '次\n'; + $data['content'] .= '询盘跟单客户' . ($statistics[$userId]['customer/collect'] ?? 0) . '位\n'; + $content .= $data['content']; + + $daily = Daily::create($data); + + $content .= '请及时查看,30分钟后将向主管发送'; $feishuUser = FeishuUser::where(['user_id' => $userId])->first(); if ($feishuUser) { - // 获取凭证 - $certificate = config('feishu.'.$feishuUser->sign); - // 使用parse_url解析URL - $parsedUrl = parse_url($certificate['rUrl']); - // 获取域名和端口 - $host = $parsedUrl['host']; - $port = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : ''; - $url = 'http://'. $host .$port. '/pages/customer/detile?id='; - $content = FeishuController::postMsg( '跟进提醒', $daily, $url); + $url = config('const.web_domain') . '/pages/mine/workreportdetil?id=' . $daily->id; + $content = FeishuController::postMsg(date('Y-m-d') . '日报', $content, $url); FeishuController::send($feishuUser->sign, $feishuUser->open_id, $content, 'post'); } @@ -147,6 +164,25 @@ class Task Log::info('send high seas end', [time()]); }); + + //向领导发送日报 每天执行一次 + new Crontab('0 0 18 * * *', function () { + echo date('Y-m-d H:i:s') . "\n"; + Log::info('send daily to leader', [time()]); + $where = []; + $where[] = ['send', '=', 0]; + $where[] = ['created_at', '>=', strtotime(date('Y-m-d 00:00:00'))]; + $daily = Daily::select('leader_id')->where($where)->groupBy('leader_id')->get(); + foreach ($daily as $item) { + $feishuUser = FeishuUser::where(['user_id' => $item->leader_id])->first(); + if ($feishuUser) { + $url = config('const.web_domain') . '/pages/mine/workreport'; + $content = FeishuController::postMsg(date('Y-m-d') . '日报已汇总', '请点击查看', $url); + FeishuController::send($feishuUser->sign, $feishuUser->open_id, $content, 'post'); + } + } + }); + } } \ No newline at end of file diff --git a/config/const.php b/config/const.php index cfcfe6e..eecc67c 100644 --- a/config/const.php +++ b/config/const.php @@ -3,8 +3,15 @@ return [ 'rpc_domain' => getenv('RPC_DOMAIN'), 'event_tracking' => [ - 'follow/save', - 'customer/claim', - 'customer/save', + '/follow/save', + '/customer/claim', + '/customer/save', + '/customer/collect', + '/user/login', + ], + 'web_domain' => getenv('WEB_DOMAIN'), + 'daily_group_2' => [ + 'master' => 28, //组长 + 'member' => [22, 23, 28, 34, 44, 46, 77, 87] //组员 ], ]; \ No newline at end of file diff --git a/config/middleware.php b/config/middleware.php index 9d8c0e5..51e9def 100644 --- a/config/middleware.php +++ b/config/middleware.php @@ -17,12 +17,12 @@ return [ '' => [ app\middleware\CrossDomain::class, // 全局跨域中间件 app\middleware\AuthMiddleware::class, // 鉴权中间件 -// app\middleware\DataTracker::class, //埋点 + app\middleware\DataTracker::class, //埋点 ], // 路由中间件 'route' => [ -// 'track' => app\middleware\DataTracker::class, + 'track' => app\middleware\DataTracker::class, ] ]; \ No newline at end of file