作者 邓超

es

... ... @@ -46,7 +46,7 @@ class HotMail {
}
$id = end($ids);
if($id<($maxId-100000)){
if($id<($maxId-200000)){
continue;
}
... ...
... ... @@ -44,7 +44,7 @@ class SyncToEsCmd {
$data = $db->first(\Model\listsSql::first('`id` = '.$id));
if($data){
// 设置 进程 是否在运行
redis()->set('sync_my_pid:'.getmypid(),time(),86400);
// redis()->set('sync_my_pid:'.getmypid(),time(),86400);
$data['is_auto']=$db->count('select count(*) from `lists_auto` where `list_id` = '.$data['id']) ? 1 : 0;
... ... @@ -79,8 +79,13 @@ class SyncToEsCmd {
'email' => $data['from'],
'name' => $data['from_name']??''
];
unset($data['from_name']);
}else{
$data['from'] = [
'email' => '',
'name' => ''
];
}
unset($data['from_name']);
unset($data['date']);
if(!empty($data['created_at'])){
$data['created_at'] = date('Y-m-d\TH:i:s',strtotime($data['created_at']));
... ...
<?php
namespace Controller\fob_ai;
use Controller\Base;
use Lib\Es\Es;
use Lib\Mail\MailFun;
use Lib\Verify;
use Model\folderSql;
use function Swoole\Coroutine\Http\request;
/**
* 黑格 fob 那边专用 业务
* 为定制逻辑
* @author:dc
* @time 2024/7/18 11:40
* Class MailList
* @package Controller\fob_ai
*/
class MailListV2Es extends Base {
/**
* @var Es
*/
public $es;
public function __construct()
{
$this->es = new Es('hg_ai_emails');
}
/**
* 当前邮箱下指定的文件夹
* @param string $folder
* @return array
* @throws \Lib\Err
* @author:dc
* @time 2024/7/19 11:37
*/
private function getFolderId(string $folder,$emails=[]){
if(!$emails){
$emails = $this->getEmails('id');
}
$k = md5(json_encode($emails));
// 查询 文件夹
static $folderList;
if(empty($folderList[$k])){
$folderList[$k] = db()->all(folderSql::all($emails));
}
$folder_id = [];
// 文件夹id
if($folderList[$k]){
foreach ($folderList[$k] as $item){
if(folderAlias($item['folder']) == $folder){
$folder_id[] = $item['id'];
}
}
}
if(!$folder_id){
app()->e('folder_not_fount');
}
return $folder_id;
}
/**
* 处理like条件
* @param $str
* @return string
* @author:dc
* @time 2024/9/4 11:14
*/
private function getLikeStr($str){
if(str_starts_with($str, '^')){
return addslashes(mb_substr($str,1,99)).'%%';
}
return '%%'.addslashes($str).'%%';
}
/**
* 邮件列表
* 接收参数
* page 分页
* limit 每页数量
* mail_id 指定邮件id
* attachment 是否附件
* emails 邮箱
* folder 文件夹
* from_not_in 不在这些发件箱的邮件
* @throws \Lib\Err
* @author:dc
* @time 2024/7/18 11:40
*/
public function lists(){
// 分页 页数
$page = app()->request('page',1,'intval') ? : 1;
$limit = app()->request('limit',20,'intval') ? : 1;
// 指定id
$ids = app()->requestArr('mail_id');
foreach ($ids as $i=>$d){
if(!is_numeric($d)){
unset($ids[$i]);
}
}
// 目录
$folder = app()->request('folder','收件箱');
// 只允许查询这里文件夹
if(!in_array($folder,['收件箱','发件箱','垃圾箱','星标邮件','预热收件箱','预热发件箱','自动回复收件箱','Starred','草稿箱'])){
app()->e('folder_not_fount');
}
$where['is_hots'] = 0;
if($folder=='星标邮件'||$folder=='Starred'){
$folder = '收件箱';
$where['flagged'] = 1; // 星标
unset($where['is_hots']);
}elseif ($folder=='预热收件箱'){
$folder = '收件箱';
$where['is_hots'] = 1;
}elseif ($folder=='预热发件箱'){
$folder = '发件箱';
$where['is_hots'] = 1;
} elseif ($folder=='自动回复收件箱'){
$is_auto_inbox = 1;
$folder = '收件箱';
$where['is_hots'] = 0;
}elseif ($folder=='草稿箱'){
$folder = '草稿箱';
$where['is_hots'] = 0;
}
$seen = app()->request('seen',-1,'intval');
// 已读/未读
if(paramHas('seen')){
if(in_array($seen,[0,1])){
$where['seen'] = $seen;
}
}
// 搜索标题
$where['subject'] = [];
$keyword = app()->request('keyword');
if($keyword){
$where['subject'] = $keyword;
}
// 联系人
$address = app()->request('address');
if($address){
if(is_array($address)){
// 发贱人
if(Verify::sEmail($address['from']??'')){
if($folder=='发件箱'){
$where['to'] = $address['from'];
}else{
$where['from'] = $address['from'];
}
}
}
}
if($ids) $where['uuid'] = $ids;
if(app()->request('attachment',0,'bool_Val')){
// 附件
$where['is_file'] = 1; //附件
}
// 软删
$where['deleted'] = 0;
/************ 2024-09-02 *************/
if($folder=='收件箱' && empty($where['flagged']) && !$ids) {
if(!empty($is_auto_inbox)){
// 是否是自动收件箱
$where['is_auto'] = 1;
}else{
$where['is_auto'] = 0;
}
}
/************ 2024-09-02 *************/
$query = [
'bool'=>[
'must' => []
]
];
foreach ($where as $k=>$v){
if($k=='subject'){
$query['bool']['must'][] = [
'query_string' => [
'query'=>'"'.addcslashes($keyword,'"').'"',
"default_field"=> "subject"
]
];
}else{
$query['bool']['must'][] = [
'term' => [
$k=>$v
]
];
}
}
// 星标就不加文件夹赛选
if(empty($where['flagged'])){
$query['bool']['must'][] = $this->assignSql($folder);
}else{
$query['bool']['must'][] = $this->assignSql2();
}
$result = $this->es->search(['query'=>$query],($page-1) * $limit,$limit,['udate'=>"desc"]);
app()->_json($result);
// map
// $lists = array_map(function ($v){
// $v['uuid'] = md5($v['email_id'].'-'.$v['folder_id'].'-'.$v['uid']);
// if(!empty($v['description'])){
// $v['description'] = @html_entity_decode($v['description'], ENT_COMPAT, 'UTF-8');
// }
// $v['to_name'] = @json_decode($v['to_name'],true);
// $v['to_name'] = $v['to_name']?:[];
// if($v['to_name']){
// if(!empty($v['to_name'][0]['email'])){
// $v['to'] = $v['to_name'][0]['email'];
// }
// $v['to_name'] = MailFun::mb_coding($v['to_name'][0]['name']??'');
// }
// if(is_array($v['to_name'])){
// $v['to_name'] = '';
// }
// return $v;
// },$lists?:[]);
// app()->_json(listsPage($lists,$total,$page,$limit));
}
private function assignSql($folder){
// 被分配的
$assign = app()->request('assign');
$query = [];
$fids = [];
if(!empty($assign['email_id'])){
// 此处请求中的
$email = array_values(array_intersect($assign['email_id'],$this->getEmails('id')));
if($email){
$fids = $this->getFolderId($folder,$email);
// 有目录id和from
if($fids && !empty($assign['from'])){
if($folder=='发件箱'){
$query = [
'query' =>[
'bool' => [
'must' => [
['terms'=>['folder_id'=>$fids]],
['query_string'=>[
'query'=> implode(' ',$assign['from']),
'default_field'=>'to'
]]
]
]
]
];
}else{
$query = [
'query' =>[
'bool' => [
'must' => [
['terms'=>['folder_id'=>$fids]],
['terms'=>['from.email'=>$assign['from']]],
]
]
]
];
}
}
}
// 返回 不在assign中的目录
$afids = array_values(array_diff($this->getFolderId($folder),$fids));
if($query && $afids){
$query = [
'query' =>[
'bool' => [
'must' => [
$query
],
'should' =>[
['terms'=>['folder_id'=>$afids]]
]
]
]
];
}else if($afids){
return [
'query' =>[
'bool' => [
'must' =>[
['terms'=>['folder_id'=>$afids]]
]
]
]
];
}else if($query&&!$afids){
return $query;
}
return ['term'=>['folder_id'=> -1]];
}
return ['terms'=>['folder_id'=> $this->getFolderId($folder)]];
}
private function assignSql2(){
// 被分配的
$assign = app()->request('assign');
$sql = '';
$query = [];
if(!empty($assign['email_id'])){
// 分配的联系人
$email = array_values(array_intersect($assign['email_id'],$this->getEmails('id')));
if($email&&!empty($assign['from'])){
$query['must'] = [
['terms'=>['email_id'=>$email]]
];
$query['must'][] = [
'query'=>[
'bool'=>[
'must'=>[
['terms'=>['from.email'=>$assign['from']]]
],
'should'=>[
"query_string" =>[
"query" => implode(' ',$assign['from']),
'default_field' => 'to'
]
]
]
]
];
}
// 分配的邮箱
$email2 = array_diff($this->getEmails('id'),$assign['email_id']);
if($email2){
if($query){
$query['must'][] = [
'query'=>[
'bool'=>[
'must'=>[
$query
],
'should'=>[
['terms'=>['email_id'=>$email2]]
]
]
]
];
return ['query'=>[
'bool'=> $query
]];
}
return ['query'=>[
'bool'=> [
'must'=>[
['terms'=>['email_id'=>$email2]]
]
]
]];
}
if($sql){
return ['query'=>[
'bool'=> $query
]];
}
return [
'query'=>[
'bool'=> [
'must'=>[['term'=>['email_id'=>-1]]]
]
]
];
}
// 默认
return dbWhere(['email_id'=>$this->getEmails('id')]).' and ';
}
private function assignSql3($folder){
// 被分配的
$assign = app()->request('assign');
$sql = '';
$fids = [];
if(!empty($assign['email_id'])){
// 此处请求中的
$email = array_diff($this->getEmails('id'),$assign['email_id']);
if($email){
$fids = $this->getFolderId($folder,$email);
// 有目录id和from
if($fids){
return dbWhere(['folder_id'=>$fids]).' and ';
}
}
return '`folder_id` = -1 and ';
}
return dbWhere(['folder_id'=>$this->getFolderId($folder)]).' and ';
}
public function count(){
return [];
}
}
... ...
... ... @@ -55,7 +55,7 @@ class Es {
* @param array $body
* @param int $from
* @param int $size
* @param array $sort
* @param array $sort [key=>val,...]
* @return array
* @author:dc
* @time 2023/6/5 14:35
... ... @@ -66,14 +66,17 @@ class Es {
'index' => $this->getIndex(),
'body' => $body,
'from' => $from,
'size' => $size
'size' => $size,
"track_total_hits"=> true // 确保返回总匹配文档数量
];
// 排序
if($sort){
$params['sort'] = $sort;
if(empty($params['body']['sort'])) $params['body']['sort'] = [];
foreach ($sort as $k=>$s){
$params['body']['sort'][] = [ $k => [ 'order' => $s ] ];
}
}
try {
$response = $this->client->search($params);
}catch (\Throwable $e) {
... ... @@ -85,6 +88,16 @@ class Es {
}
/**
* 统计数量
* @param array $param
* @author:dc
* @time 2025/3/4 9:47
*/
public function count(array $param){
}
/**
* @param array $param
... ... @@ -219,7 +232,7 @@ class Es {
}
return $response;
return $response->asArray();
}
... ... @@ -281,18 +294,6 @@ class Es {
return $response[$this->getIndex()]['mappings']['properties']??[];
}
/**
* 判断是否存在索引
* @return bool
* @author:dc
* @time 2023/6/29 12:37
*/
public function hasIndex(){
$params['index'] = $this->getIndex();
$response = $this->client->indices()->exists($params);
return $response;
}
}
... ...
... ... @@ -22,6 +22,12 @@ return [
'fob/v2/lists' => [\Controller\fob_ai\MailListV2::class, 'lists'],
'fob/v2/count' => [\Controller\fob_ai\MailListV2::class, 'count'],// 统计数量
// 查询es的
'fob/es/lists' => [\Controller\fob_ai\MailListV2Es::class, 'lists'],
'fob/es/count' => [\Controller\fob_ai\MailListV2Es::class, 'count'],// 统计数量
// 邮件详情
'info' => [\Controller\Home::class, 'info'],
... ...