diff --git a/app/command/TbCommand.php b/app/command/TbCommand.php index fa0a33a..265d24c 100644 --- a/app/command/TbCommand.php +++ b/app/command/TbCommand.php @@ -29,7 +29,7 @@ class TbCommand extends Command // } $m = new Emails(); - $m->process(); + $m->fenpai(); return self::SUCCESS; } diff --git a/app/common/logic/AuthLogic.php b/app/common/logic/AuthLogic.php index b2a74fc..59155dc 100644 --- a/app/common/logic/AuthLogic.php +++ b/app/common/logic/AuthLogic.php @@ -93,7 +93,7 @@ class AuthLogic ->orWhere('email', $email); }) ->first(); - + $user->isLogin = true; if (!$user) { // 获取编号 $userSn = $this->getAvailableUserSn(); diff --git a/app/common/model/EmailParsedResult.php b/app/common/model/EmailParsedResult.php new file mode 100644 index 0000000..de1a1be --- /dev/null +++ b/app/common/model/EmailParsedResult.php @@ -0,0 +1,49 @@ +first(); + + // 固定渠道 + $channel = 8; + $channelInfo = InquiryChannel::where('id', $channel)->first(); + + // 初始化 UID 轮询器 + \app\common\utils\UidRotator::initialize([64, 63, 83, 93, 108, 118, 131, 132, 145, 150, 143, 156, 157, 158]); + + EmailParsedResult::where('status', 0) + ->chunkById($batchSize, function ($records) use ($delaySeconds, $throttleAfter, $throttleSeconds, $enterUser, $channelInfo) { + $count = 0; + + foreach ($records as $record) { + try { + // Mail::to($record->mailto)->send(new CustomEmail($record)); + + // 获取国家信息 + $countryName = removeParentheses($record->iplocation); + $countryInfo = Country::where('cn_addr', $countryName)->first(); +// var_dump($countryName); +// var_dump($countryInfo); +// var_dump('====== ====== ====== ====== ====== ====== '); + // 获取下一个分配的UID + $assignedUid = \app\common\utils\UidRotator::next(); +// var_dump($assignedUid); +// var_dump('====== ====== ====== ====== ====== ====== '); + // 获取分配的用户信息 + $recipientInfo = User::where('id', $assignedUid)->first(); +// var_dump($recipientInfo); +// var_dump('====== ====== ====== ====== ====== ====== '); + // 生成录单 + $log = [ + 'order_no' => orderNum(), + 'enter_user_id' => $enterUser->id, + 'recipient' => $assignedUid, + 'quality' => 2, + 'channel' => $channelInfo->id, + 'email' => $record->email, + 'tel' => $record->tel, + 'whatsapp' => '', + 'country' => $countryInfo->id, + 'contacts' => $record->name, + 'content' => $record->message, + 'r_time' => time(), + 't_time' => time(), + 'status' => 2, + 'sync_crm' => 1 + ]; +// var_dump($log); +// var_dump('====== ====== ====== ====== ====== ====== '); + $inquiryLogResult = InquiryLog::create($log); + if (!$inquiryLogResult) { + throw new BusinessException('录单失败~'); + } + + // 同步客户 + $crmCustomer = new CrmCustomer(); + $crmCustomer->sn = $inquiryLogResult->order_no; + $crmCustomer->corp_abbr = $recipientInfo->corp_id; + $crmCustomer->user_id = $assignedUid; + $crmCustomer->type = 1; + $crmCustomer->channel_id = $inquiryLogResult->channel; + $crmCustomer->country_id = $inquiryLogResult->country; + $crmCustomer->magnitude = $inquiryLogResult->quality; + $crmCustomer->email = $inquiryLogResult->email; + $crmCustomer->phone = $inquiryLogResult->tel; + $crmCustomer->WhatsApp = $inquiryLogResult->whatsapp; + $crmCustomer->contacts = $inquiryLogResult->contacts; + $crmCustomer->desc_collect = $inquiryLogResult->content; + $crmCustomer->enter_user_id = $inquiryLogResult->enter_user_id; +// var_dump($crmCustomer); +// var_dump('====== ====== ====== ====== ====== ====== '); + if (!$crmCustomer->save()) { + throw new BusinessException('同步失败~'); + } + + // 邮件模板 + $data = [ + 'order_no' => $inquiryLogResult->order_no, + 'enter_user_id' => $enterUser->name, + 'recipient' => $recipientInfo->name, + 'quality' => (new \app\inquiry\service\InquiryLogService())->qualityName($inquiryLogResult->quality), + 'channel' => $channelInfo->name, + 'email' => $inquiryLogResult->email && $inquiryLogResult->email != '' ? $inquiryLogResult->email : ' - ', + 'tel' => $inquiryLogResult->tel && $inquiryLogResult->tel != '' ? $inquiryLogResult->tel : ' - ', + 'whatsapp' => $inquiryLogResult->whatsapp && $inquiryLogResult->whatsapp != '' ? $inquiryLogResult->whatsapp : ' - ', + 'country' => $countryName, + 'contacts' => $inquiryLogResult->contacts && $inquiryLogResult->contacts != '' ? $inquiryLogResult->contacts : ' - ', + 'content' => $inquiryLogResult->content && $inquiryLogResult->content != '' ? $inquiryLogResult->content : ' - ', + 'r_time' => $inquiryLogResult->r_time ? date('Y-m-d H:i:s', $inquiryLogResult->r_time) : ' - ', + 't_time' => $inquiryLogResult->t_time ? date('Y-m-d H:i:s', $inquiryLogResult->t_time) : ' - ' + ]; + \app\common\utils\email\MailSend::send($recipientInfo->email, '【XYH】新的客户线索', replaceTpl($data)); +// var_dump($data); +// var_dump('====== ====== ====== ====== ====== ====== '); + // 更新状态 + $record->update(['status' => 1]); + + // 每封邮件后延迟 + if ($delaySeconds > 0) { + sleep($delaySeconds); + } + + // 每发送一定数量后额外休息 + if (++$count % $throttleAfter === 0) { + sleep($throttleSeconds); + Log::info("已发送 {$count} 封邮件,休息 {$throttleSeconds} 秒"); + } + + } catch (\Exception $e) { + Log::error("邮件发送失败 ID:{$record->id} - " . $e->getMessage()); + // 更新状态 + $record->update(['status' => 3]); + // 失败后也加入延迟,避免快速连续失败 + sleep($delaySeconds); + } + } + }); + } catch (\Throwable $th) { + flg(dpr($th)); + return false; + } + } } \ No newline at end of file diff --git a/app/controller/IndexController.php b/app/controller/IndexController.php index d9ac96c..6dc874b 100644 --- a/app/controller/IndexController.php +++ b/app/controller/IndexController.php @@ -80,7 +80,7 @@ class IndexController // ], 'model' => [ 'module' => 'common', - 'name' => 'inquiry_channel' + 'name' => 'email_parsed_result' ], // 'service' => [ // 'module' => 'inquiry', @@ -94,7 +94,7 @@ class IndexController // 'module' => 'inquiry', // 'name' => 'country' // ], - 'table' => 'inquiry_channel' + 'table' => 'email_parsed_result' ]; $result = (new Generate($options))->doGenerate(); diff --git a/app/functions.php b/app/functions.php index 45af92c..f69f082 100644 --- a/app/functions.php +++ b/app/functions.php @@ -194,4 +194,30 @@ if (!function_exists('InquiryFormat')) { $content .= '内容:'.$data['content']; return $content; } +} + +/** + * 移除字符串中的括号及其内部内容(仅移除第一个匹配项) + * + * @param string $str 要处理的字符串 + * @return string 处理后的字符串 + */ +if (!function_exists('removeParentheses')) { + function removeParentheses(string $str): string + { + // 匹配模式:半角括号或全角括号及其内部内容 + $pattern = '/ + (?: # 非捕获分组开始 + \( # 匹配半角左括号 + [^)]* # 匹配除半角右括号外的任意字符 + \) # 匹配半角右括号 + )|(?: # 或 + \( # 匹配全角左括号 + [^)]* # 匹配除全角右括号外的任意字符 + \) # 匹配全角右括号 + ) # 非捕获分组结束 + /xu'; // x: 忽略空白 u: Unicode模式 + + return trim(preg_replace($pattern, '', $str, 1)); + } } \ No newline at end of file diff --git a/app/queue/redis/InquiryToCrm.php b/app/queue/redis/InquiryToCrm.php index 8eb88c5..8e1ae51 100644 --- a/app/queue/redis/InquiryToCrm.php +++ b/app/queue/redis/InquiryToCrm.php @@ -53,7 +53,7 @@ class InquiryToCrm implements Consumer $crmCustomer->type = 1; $crmCustomer->channel_id = $info->channel; $crmCustomer->country_id = $info->country; - $crmCustomer->magnitude = $info->quality - 1; + $crmCustomer->magnitude = $info->quality; $crmCustomer->email = $info->email; $crmCustomer->phone = $info->tel; $crmCustomer->WhatsApp = $info->whatsapp;