diff --git a/_php_code/index.php b/_php_code/index.php index b0ed85e..8ffe84a 100755 --- a/_php_code/index.php +++ b/_php_code/index.php @@ -57,33 +57,12 @@ require_once __DIR__ . '/Whatshub.php'; // Whatshub 工单平台 // } -try { - echo "🚀 开始执行抓取任务 (多引擎智能调度)...\n\r"; - $pageUrl = 'https://user.chatknow.com/child/workorder-share?shareKey=jf5t6MNrJ2mC76N'; // PageUrl 入口授权页 - $username = ""; // 登录账号 - $password = ""; // 登录密码 - $spider = new Chatknow($pageUrl, $username, $password); - $finalData = $spider->run(); - - echo "✅ 任务完成!统一数据如下:\n\r"; - echo "----------------------------------------\n\r"; - echo "当日新增:{$finalData->todayNewCount} 人\n\r"; - echo "在线号码:{$finalData->totalOnline} 个\n\r"; - echo "离线号码:{$finalData->totalOffline} 个\n\r"; - echo "Total:" . $finalData->total . " 个号码\n\r"; - echo "实际总共抓取:" . count($finalData->numbers) . " 个号码\n\r"; - echo "号码列表:\n\r"; - echo dd($finalData->numbers); -} catch (Exception $e) { - echo "🚨 抓取异常:" . $e->getMessage() . "\n\r"; -} - // try { -// echo "🚀 开始执行抓取任务 (多引擎智能调度)...\n\r"; -// $pageUrl = 'https://yyk.ink/8415O53'; // PageUrl 入口授权页 +// echo "🚀 开始执行抓取任务 (多引擎智能调度)...\n\r"; +// $pageUrl = 'https://user.chatknow.com/child/workorder-share?shareKey=jf5t6MNrJ2mC76N'; // PageUrl 入口授权页 // $username = ""; // 登录账号 // $password = ""; // 登录密码 -// $spider = new A2c($pageUrl, $username, $password); +// $spider = new Chatknow($pageUrl, $username, $password); // $finalData = $spider->run(); // echo "✅ 任务完成!统一数据如下:\n\r"; @@ -95,11 +74,32 @@ try { // echo "实际总共抓取:" . count($finalData->numbers) . " 个号码\n\r"; // echo "号码列表:\n\r"; // echo dd($finalData->numbers); - // } catch (Exception $e) { // echo "🚨 抓取异常:" . $e->getMessage() . "\n\r"; // } +try { + echo "🚀 开始执行抓取任务 (多引擎智能调度)...\n\r"; + $pageUrl = 'https://yyk.ink/52oXZRG'; // PageUrl 入口授权页 + $username = ""; // 登录账号 + $password = ""; // 登录密码 + $spider = new A2c($pageUrl, $username, $password); + $finalData = $spider->run(); + + echo "✅ 任务完成!统一数据如下:\n\r"; + echo "----------------------------------------\n\r"; + echo "当日新增:{$finalData->todayNewCount} 人\n\r"; + echo "在线号码:{$finalData->totalOnline} 个\n\r"; + echo "离线号码:{$finalData->totalOffline} 个\n\r"; + echo "Total:" . $finalData->total . " 个号码\n\r"; + echo "实际总共抓取:" . count($finalData->numbers) . " 个号码\n\r"; + echo "号码列表:\n\r"; + echo dd($finalData->numbers); + +} catch (Exception $e) { + echo "🚨 抓取异常:" . $e->getMessage() . "\n\r"; +} + // try { // echo "🚀 开始执行<星河云控>抓取任务 (多引擎智能调度)...\n\r"; // $pageUrl = 'http://8.218.14.51/share/share/index.html?token=hn6z3egq4nnnebkv4063pcdouzr4ug5js902mlqo2n3yp9gzhe'; // PageUrl 入口授权页 diff --git a/application/admin/model/split/Ticket.php b/application/admin/model/split/Ticket.php index 53feb4d..5e890d4 100755 --- a/application/admin/model/split/Ticket.php +++ b/application/admin/model/split/Ticket.php @@ -5,6 +5,8 @@ declare(strict_types=1); namespace app\admin\model\split; use app\common\service\SplitSyncConfigService; +use app\common\service\SplitTicketRuleService; +use app\common\service\SplitTicketSyncLockService; use think\Db; use think\Model; @@ -15,6 +17,15 @@ class Ticket extends Model { protected $name = 'split_ticket'; + protected static function init(): void + { + // 删除工单时:释放同步锁,并物理删除同步导入的号码(manual_manage=0) + self::beforeDelete(function (self $ticket): void { + (new SplitTicketSyncLockService())->release((int) $ticket['id']); + (new SplitTicketRuleService())->deleteSyncedNumbersForTicket($ticket); + }); + } + protected $autoWriteTimestamp = 'integer'; protected $createTime = 'createtime'; diff --git a/application/common/library/scrm/spider/A2cSpider.php b/application/common/library/scrm/spider/A2cSpider.php index 3ecafb8..f311ba5 100755 --- a/application/common/library/scrm/spider/A2cSpider.php +++ b/application/common/library/scrm/spider/A2cSpider.php @@ -5,10 +5,11 @@ declare(strict_types=1); namespace app\common\library\scrm\spider; use app\common\library\scrm\AbstractScrmSpider; +use app\common\library\scrm\AntiBotConfigBuilder; use app\common\library\scrm\UnifiedScrmData; /** - * A2C 云控蜘蛛 + * A2C 云控蜘蛛(Real Browser + Turnstile 过盾 + UI 翻页) */ class A2cSpider extends AbstractScrmSpider { @@ -50,6 +51,7 @@ class A2cSpider extends AbstractScrmSpider 'authActions' => [ ['type' => 'wait', 'ms' => 2000], ], + 'antiBot' => AntiBotConfigBuilder::build('a2c', $this->pageUrl), ]; } diff --git a/application/common/service/SplitTicketRuleService.php b/application/common/service/SplitTicketRuleService.php index a4f65bd..c62f1d3 100755 --- a/application/common/service/SplitTicketRuleService.php +++ b/application/common/service/SplitTicketRuleService.php @@ -45,6 +45,29 @@ class SplitTicketRuleService ]); } + /** + * 工单物理删除时,移除该工单同步导入的号码(manual_manage=0) + * + * 关联键与 SplitTicketNumberSyncService 一致:admin_id + split_link_id + ticket_name + * manual_manage=1 的手动管理号码保留 + * + * @return int 删除行数 + */ + public function deleteSyncedNumbersForTicket(Ticket $ticket): int + { + $ticketName = trim((string) ($ticket['ticket_name'] ?? '')); + $linkId = (int) ($ticket['split_link_id'] ?? 0); + if ($ticketName === '' || $linkId <= 0) { + return 0; + } + + return Number::where('admin_id', (int) $ticket['admin_id']) + ->where('split_link_id', $linkId) + ->where('ticket_name', $ticketName) + ->where('manual_manage', 0) + ->delete(); + } + /** * 手动切换工单状态时,联动非手动管理的号码 */ diff --git a/application/extra/site.php b/application/extra/site.php index de7eba1..c127bd5 100755 --- a/application/extra/site.php +++ b/application/extra/site.php @@ -44,7 +44,7 @@ return array ( ), 'split_platform_domain' => 'flowerbells.top', 'split_scrm_node_host' => 'http://127.0.0.1:3001', - 'split_scrm_antibot_types' => 'whatshub,chatknow', + 'split_scrm_antibot_types' => 'whatshub,chatknow,a2c', 'split_scrm_session_ttl_minutes' => '120', 'split_sync_interval_a2c' => '3', 'split_sync_interval_haiwang' => '3', diff --git a/patches/application/admin/model/split/Ticket.php b/patches/application/admin/model/split/Ticket.php index 53feb4d..5e890d4 100755 --- a/patches/application/admin/model/split/Ticket.php +++ b/patches/application/admin/model/split/Ticket.php @@ -5,6 +5,8 @@ declare(strict_types=1); namespace app\admin\model\split; use app\common\service\SplitSyncConfigService; +use app\common\service\SplitTicketRuleService; +use app\common\service\SplitTicketSyncLockService; use think\Db; use think\Model; @@ -15,6 +17,15 @@ class Ticket extends Model { protected $name = 'split_ticket'; + protected static function init(): void + { + // 删除工单时:释放同步锁,并物理删除同步导入的号码(manual_manage=0) + self::beforeDelete(function (self $ticket): void { + (new SplitTicketSyncLockService())->release((int) $ticket['id']); + (new SplitTicketRuleService())->deleteSyncedNumbersForTicket($ticket); + }); + } + protected $autoWriteTimestamp = 'integer'; protected $createTime = 'createtime'; diff --git a/patches/application/common/library/scrm/spider/A2cSpider.php b/patches/application/common/library/scrm/spider/A2cSpider.php index 3ecafb8..f311ba5 100755 --- a/patches/application/common/library/scrm/spider/A2cSpider.php +++ b/patches/application/common/library/scrm/spider/A2cSpider.php @@ -5,10 +5,11 @@ declare(strict_types=1); namespace app\common\library\scrm\spider; use app\common\library\scrm\AbstractScrmSpider; +use app\common\library\scrm\AntiBotConfigBuilder; use app\common\library\scrm\UnifiedScrmData; /** - * A2C 云控蜘蛛 + * A2C 云控蜘蛛(Real Browser + Turnstile 过盾 + UI 翻页) */ class A2cSpider extends AbstractScrmSpider { @@ -50,6 +51,7 @@ class A2cSpider extends AbstractScrmSpider 'authActions' => [ ['type' => 'wait', 'ms' => 2000], ], + 'antiBot' => AntiBotConfigBuilder::build('a2c', $this->pageUrl), ]; } diff --git a/patches/application/common/service/SplitTicketRuleService.php b/patches/application/common/service/SplitTicketRuleService.php index a4f65bd..c62f1d3 100755 --- a/patches/application/common/service/SplitTicketRuleService.php +++ b/patches/application/common/service/SplitTicketRuleService.php @@ -45,6 +45,29 @@ class SplitTicketRuleService ]); } + /** + * 工单物理删除时,移除该工单同步导入的号码(manual_manage=0) + * + * 关联键与 SplitTicketNumberSyncService 一致:admin_id + split_link_id + ticket_name + * manual_manage=1 的手动管理号码保留 + * + * @return int 删除行数 + */ + public function deleteSyncedNumbersForTicket(Ticket $ticket): int + { + $ticketName = trim((string) ($ticket['ticket_name'] ?? '')); + $linkId = (int) ($ticket['split_link_id'] ?? 0); + if ($ticketName === '' || $linkId <= 0) { + return 0; + } + + return Number::where('admin_id', (int) $ticket['admin_id']) + ->where('split_link_id', $linkId) + ->where('ticket_name', $ticketName) + ->where('manual_manage', 0) + ->delete(); + } + /** * 手动切换工单状态时,联动非手动管理的号码 */