作者 邓超

es

@@ -144,7 +144,6 @@ class MailListV2Es extends Base { @@ -144,7 +144,6 @@ class MailListV2Es extends Base {
144 } 144 }
145 } 145 }
146 // 搜索标题 146 // 搜索标题
147 - $where['subject'] = [];  
148 $keyword = app()->request('keyword'); 147 $keyword = app()->request('keyword');
149 if($keyword){ 148 if($keyword){
150 $where['subject'] = $keyword; 149 $where['subject'] = $keyword;
@@ -193,12 +192,15 @@ class MailListV2Es extends Base { @@ -193,12 +192,15 @@ class MailListV2Es extends Base {
193 ]; 192 ];
194 foreach ($where as $k=>$v){ 193 foreach ($where as $k=>$v){
195 if($k=='subject'){ 194 if($k=='subject'){
196 - $query['bool']['must'][] = [  
197 - 'query_string' => [  
198 - 'query'=>'"'.addcslashes($keyword,'"').'"',  
199 - "default_field"=> "subject"  
200 - ]  
201 - ]; 195 + if($v){
  196 + $query['bool']['must'][] = [
  197 + 'query_string' => [
  198 + 'query'=>'"'.addcslashes($v,'"').'"',
  199 + "default_field"=> "subject"
  200 + ]
  201 + ];
  202 + }
  203 +
202 }else{ 204 }else{
203 $query['bool']['must'][] = [ 205 $query['bool']['must'][] = [
204 'term' => [ 206 'term' => [
@@ -216,33 +218,41 @@ class MailListV2Es extends Base { @@ -216,33 +218,41 @@ class MailListV2Es extends Base {
216 $query['bool']['must'][] = $this->assignSql2(); 218 $query['bool']['must'][] = $this->assignSql2();
217 } 219 }
218 220
219 - 221 + logs('请求es前');
220 $result = $this->es->search(['query'=>$query],($page-1) * $limit,$limit,['udate'=>"desc"]); 222 $result = $this->es->search(['query'=>$query],($page-1) * $limit,$limit,['udate'=>"desc"]);
221 - app()->_json($result); 223 + logs('请求es后');
222 224
  225 + $total = $result['hits']['total']['value']??0;
  226 + $lists = $result['hits']['hits']??[];
223 // map 227 // map
224 -// $lists = array_map(function ($v){  
225 -// $v['uuid'] = md5($v['email_id'].'-'.$v['folder_id'].'-'.$v['uid']);  
226 -// if(!empty($v['description'])){  
227 -// $v['description'] = @html_entity_decode($v['description'], ENT_COMPAT, 'UTF-8');  
228 -// }  
229 -// $v['to_name'] = @json_decode($v['to_name'],true);  
230 -// $v['to_name'] = $v['to_name']?:[];  
231 -// if($v['to_name']){  
232 -// if(!empty($v['to_name'][0]['email'])){  
233 -// $v['to'] = $v['to_name'][0]['email'];  
234 -// }  
235 -// $v['to_name'] = MailFun::mb_coding($v['to_name'][0]['name']??'');  
236 -// }  
237 -// if(is_array($v['to_name'])){  
238 -// $v['to_name'] = '';  
239 -// }  
240 -// return $v;  
241 -// },$lists?:[]);  
242 -  
243 -  
244 -  
245 -// app()->_json(listsPage($lists,$total,$page,$limit)); 228 + $lists = array_map(function ($v){
  229 + $v = $v['_source'];
  230 + $v['id'] = $v['uuid'];
  231 +
  232 + $v['from_name'] = $v['from']['name']??'';
  233 + $v['from'] = $v['from']['email']??'';
  234 +
  235 + $v['uuid'] = md5($v['email_id'].'-'.$v['folder_id'].'-'.$v['uid']);
  236 + if(!empty($v['description'])){
  237 + $v['description'] = @html_entity_decode($v['description'], ENT_COMPAT, 'UTF-8');
  238 + }
  239 + $v['to_name'] = @json_decode($v['to_name'],true);
  240 + $v['to_name'] = $v['to_name']?:[];
  241 + if($v['to_name']){
  242 + if(!empty($v['to_name'][0]['email'])){
  243 + $v['to'] = $v['to_name'][0]['email'];
  244 + }
  245 + $v['to_name'] = MailFun::mb_coding($v['to_name'][0]['name']??'');
  246 + }
  247 + if(is_array($v['to_name'])){
  248 + $v['to_name'] = '';
  249 + }
  250 + return $v;
  251 + },$lists?:[]);
  252 +
  253 +
  254 +
  255 + app()->_json(listsPage($lists,$total,$page,$limit));
246 256
247 } 257 }
248 258
@@ -401,14 +411,20 @@ class MailListV2Es extends Base { @@ -401,14 +411,20 @@ class MailListV2Es extends Base {
401 } 411 }
402 412
403 // 默认 413 // 默认
404 - return dbWhere(['email_id'=>$this->getEmails('id')]).' and '; 414 + return [
  415 + 'query'=>[
  416 + 'bool'=> [
  417 + 'must'=>[['terms'=>['email_id'=> $this->getEmails('id')]]]
  418 + ]
  419 + ]
  420 + ];
405 421
406 } 422 }
  423 +
407 private function assignSql3($folder){ 424 private function assignSql3($folder){
408 // 被分配的 425 // 被分配的
409 $assign = app()->request('assign'); 426 $assign = app()->request('assign');
410 - $sql = '';  
411 - $fids = []; 427 +
412 if(!empty($assign['email_id'])){ 428 if(!empty($assign['email_id'])){
413 // 此处请求中的 429 // 此处请求中的
414 $email = array_diff($this->getEmails('id'),$assign['email_id']); 430 $email = array_diff($this->getEmails('id'),$assign['email_id']);
@@ -416,15 +432,39 @@ class MailListV2Es extends Base { @@ -416,15 +432,39 @@ class MailListV2Es extends Base {
416 $fids = $this->getFolderId($folder,$email); 432 $fids = $this->getFolderId($folder,$email);
417 // 有目录id和from 433 // 有目录id和from
418 if($fids){ 434 if($fids){
419 - return dbWhere(['folder_id'=>$fids]).' and '; 435 + return [
  436 + 'query'=>[
  437 + 'bool' =>[
  438 + 'must' =>[
  439 + ['terms'=>['folder_id'=>$fids]]
  440 + ]
  441 + ]
  442 + ]
  443 + ];
420 } 444 }
421 } 445 }
422 446
423 -  
424 - return '`folder_id` = -1 and '; 447 + return [
  448 + 'query'=>[
  449 + 'bool' =>[
  450 + 'must' =>[
  451 + ['term'=>['folder_id'=>-1]]
  452 + ]
  453 + ]
  454 + ]
  455 + ];
425 456
426 } 457 }
427 458
  459 + return [
  460 + 'query'=>[
  461 + 'bool' =>[
  462 + 'must' =>[
  463 + ['terms'=>['folder_id'=> $this->getFolderId($folder)]]
  464 + ]
  465 + ]
  466 + ]
  467 + ];
428 return dbWhere(['folder_id'=>$this->getFolderId($folder)]).' and '; 468 return dbWhere(['folder_id'=>$this->getFolderId($folder)]).' and ';
429 469
430 } 470 }
@@ -432,9 +472,133 @@ class MailListV2Es extends Base { @@ -432,9 +472,133 @@ class MailListV2Es extends Base {
432 472
433 473
434 public function count(){ 474 public function count(){
435 - return []; 475 + if(!$this->getEmails('id')){
  476 + app()->e('email_request_required');
  477 + }
  478 +
  479 + $body = [];
  480 + $body['query'] = [
  481 + 'bool'=>[
  482 + 'must'=>[
  483 + ['term'=>['deleted'=>0]]
  484 + ]
  485 + ]
  486 + ];
  487 + // 时间 必须是数组
  488 + $udate = app()->request('udate');
  489 + if($udate && is_array($udate) && count($udate) == 2){
  490 + $udate = array_values($udate);
  491 + $udate = array_map(function ($v){
  492 + if(is_numeric($v)) return $v;
  493 + return strtotime($v);
  494 + },$udate);
  495 + // 时间范围搜索
  496 + $body['query']['bool']['must'][] = [
  497 + 'query' => [
  498 + 'range' => [
  499 + 'udate' => [
  500 + 'gte' => $udate[0], // 大于等于开始日期
  501 + 'lte' => $udate[1] // 小于等于结束日期
  502 + ]
  503 + ]
  504 + ]
  505 + ];
  506 +
  507 + }
  508 +
  509 +
  510 + // show_count_filed
  511 + $show_count_filed = app()->requestArr('show_count_filed',['inbox', 'send', 'unseen', 'flagged', 'junk', 'hot_inbox', 'hot_send']);
  512 +
  513 +
  514 + // 发件箱
  515 + if(in_array('hot_send',$show_count_filed)){
  516 + // 预热发件箱
  517 + $fCount = $this->countHot($body,'发件箱');
  518 + }
  519 +
  520 + // 预热收件箱
  521 + if(in_array('hot_inbox',$show_count_filed)) {
  522 + $sCount = $this->countHot($body,'收件箱');
  523 + }
  524 +
  525 + if(in_array('send',$show_count_filed)) {
  526 + $faCount = $this->countMail($body,'发件箱');
  527 + }
  528 +// 垃圾箱
  529 + if(in_array('junk',$show_count_filed)) {
  530 + $lajiCount = $this->countMail($body,'垃圾箱');
  531 + }
  532 +
  533 + // 收件箱
  534 + $lajiCount = $this->countMail($body,'收件箱');
  535 +
  536 + // 收件箱
  537 + if(in_array('inbox',$show_count_filed) || in_array('replied',$show_count_filed)) {
  538 + $repliedCount = $shouCount = $this->countMail($body,'收件箱');
  539 + }
  540 +
  541 + // 未读
  542 + if(in_array('unseen',$show_count_filed)) {
  543 + $seenCount = $shouCount = $this->countMail($body,'收件箱', 0);
  544 + }
  545 +
  546 +
  547 + // 星标
  548 + if(in_array('flagged',$show_count_filed)) {
  549 + $flaggedCount = $this->countFlagged($body);
  550 + }
  551 +
  552 + $data = [];
  553 + if(isset($shouCount)) $data['inbox'] = $shouCount;
  554 + if(isset($repliedCount)) $data['replied'] = $repliedCount;
  555 + if(isset($faCount)) $data['send'] = $faCount;
  556 + if(isset($seenCount)) $data['unseen'] = $seenCount;
  557 + if(isset($flaggedCount)) $data['flagged'] = $flaggedCount;
  558 + if(isset($lajiCount)) $data['junk'] = $lajiCount;
  559 + if(isset($sCount)) $data['hot_inbox'] = $sCount;
  560 + if(isset($fCount)) $data['hot_send'] = $fCount;
  561 +
  562 + app()->_json($data);
436 } 563 }
437 564
  565 + /**
  566 + * 统计预热邮件
  567 + * @param $body
  568 + * @param $folder
  569 + * @author:dc
  570 + * @time 2025/3/6 15:24
  571 + */
  572 + private function countHot($body,$folder){
  573 + $body['query']['bool']['must'][] = ['term'=>['is_hots'=>1]];
  574 + $body['query']['bool']['must'][] = $this->assignSql3($folder);
  575 + return $this->es->count($body);
  576 + }
  577 +
  578 + private function countMail($body,$folder,$seen=null){
  579 + if($folder == '收件箱'){
  580 + $body['query']['bool']['must'][] = ['term'=>['is_auto'=>0]];
  581 + }
  582 + if($seen!==null){
  583 + $body['query']['bool']['must'][] = ['term'=>['seen'=>$seen]];
  584 + }
  585 + $body['query']['bool']['must'][] = ['term'=>['is_hots'=>0]];
  586 + $body['query']['bool']['must'][] = $this->assignSql($folder);
  587 + return $this->es->count($body);
  588 + }
  589 +
  590 + /**
  591 + * 统计星标
  592 + * @param $body
  593 + * @return int|mixed
  594 + * @author:dc
  595 + * @time 2025/3/6 16:01
  596 + */
  597 + private function countFlagged($body){
  598 + $body['query']['bool']['must'][] = ['term'=>['flagged'=>1]];
  599 + $body['query']['bool']['must'][] = $this->assignSql2();
  600 + return $this->es->count($body);
  601 + }
438 602
439 } 603 }
440 604
@@ -105,10 +105,10 @@ class Es { @@ -105,10 +105,10 @@ class Es {
105 $response = $this->client->count($params); 105 $response = $this->client->count($params);
106 }catch (\Throwable $e) { 106 }catch (\Throwable $e) {
107 logs("搜索数据es:".$e->getMessage()); 107 logs("搜索数据es:".$e->getMessage());
108 - return []; 108 + return 0;
109 } 109 }
110 110
111 - return $response->asArray(); 111 + return $response->asArray()['count']??0;
112 } 112 }
113 113
114 114