修正A2C过火墙、删除工单同步删除工单关联的号码

This commit is contained in:
root
2026-06-26 21:24:31 +08:00
parent 09bfa9ae01
commit 6130125427
8 changed files with 100 additions and 28 deletions
+25 -25
View File
@@ -57,33 +57,12 @@ require_once __DIR__ . '/Whatshub.php'; // Whatshub 工单平台
// } // }
try {
echo "🚀 开始执行<ChatKnow SCRM>抓取任务 (多引擎智能调度)...\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 { // try {
// echo "🚀 开始执行<A2c云控>抓取任务 (多引擎智能调度)...\n\r"; // echo "🚀 开始执行<ChatKnow SCRM>抓取任务 (多引擎智能调度)...\n\r";
// $pageUrl = 'https://yyk.ink/8415O53'; // PageUrl 入口授权页 // $pageUrl = 'https://user.chatknow.com/child/workorder-share?shareKey=jf5t6MNrJ2mC76N'; // PageUrl 入口授权页
// $username = ""; // 登录账号 // $username = ""; // 登录账号
// $password = ""; // 登录密码 // $password = ""; // 登录密码
// $spider = new A2c($pageUrl, $username, $password); // $spider = new Chatknow($pageUrl, $username, $password);
// $finalData = $spider->run(); // $finalData = $spider->run();
// echo "✅ 任务完成!统一数据如下:\n\r"; // echo "✅ 任务完成!统一数据如下:\n\r";
@@ -95,11 +74,32 @@ try {
// echo "实际总共抓取:" . count($finalData->numbers) . " 个号码\n\r"; // echo "实际总共抓取:" . count($finalData->numbers) . " 个号码\n\r";
// echo "号码列表:\n\r"; // echo "号码列表:\n\r";
// echo dd($finalData->numbers); // echo dd($finalData->numbers);
// } catch (Exception $e) { // } catch (Exception $e) {
// echo "🚨 抓取异常:" . $e->getMessage() . "\n\r"; // echo "🚨 抓取异常:" . $e->getMessage() . "\n\r";
// } // }
try {
echo "🚀 开始执行<A2c云控>抓取任务 (多引擎智能调度)...\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 { // try {
// echo "🚀 开始执行<星河云控>抓取任务 (多引擎智能调度)...\n\r"; // echo "🚀 开始执行<星河云控>抓取任务 (多引擎智能调度)...\n\r";
// $pageUrl = 'http://8.218.14.51/share/share/index.html?token=hn6z3egq4nnnebkv4063pcdouzr4ug5js902mlqo2n3yp9gzhe'; // PageUrl 入口授权页 // $pageUrl = 'http://8.218.14.51/share/share/index.html?token=hn6z3egq4nnnebkv4063pcdouzr4ug5js902mlqo2n3yp9gzhe'; // PageUrl 入口授权页
+11
View File
@@ -5,6 +5,8 @@ declare(strict_types=1);
namespace app\admin\model\split; namespace app\admin\model\split;
use app\common\service\SplitSyncConfigService; use app\common\service\SplitSyncConfigService;
use app\common\service\SplitTicketRuleService;
use app\common\service\SplitTicketSyncLockService;
use think\Db; use think\Db;
use think\Model; use think\Model;
@@ -15,6 +17,15 @@ class Ticket extends Model
{ {
protected $name = 'split_ticket'; 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 $autoWriteTimestamp = 'integer';
protected $createTime = 'createtime'; protected $createTime = 'createtime';
@@ -5,10 +5,11 @@ declare(strict_types=1);
namespace app\common\library\scrm\spider; namespace app\common\library\scrm\spider;
use app\common\library\scrm\AbstractScrmSpider; use app\common\library\scrm\AbstractScrmSpider;
use app\common\library\scrm\AntiBotConfigBuilder;
use app\common\library\scrm\UnifiedScrmData; use app\common\library\scrm\UnifiedScrmData;
/** /**
* A2C 云控蜘蛛 * A2C 云控蜘蛛Real Browser + Turnstile 过盾 + UI 翻页)
*/ */
class A2cSpider extends AbstractScrmSpider class A2cSpider extends AbstractScrmSpider
{ {
@@ -50,6 +51,7 @@ class A2cSpider extends AbstractScrmSpider
'authActions' => [ 'authActions' => [
['type' => 'wait', 'ms' => 2000], ['type' => 'wait', 'ms' => 2000],
], ],
'antiBot' => AntiBotConfigBuilder::build('a2c', $this->pageUrl),
]; ];
} }
@@ -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();
}
/** /**
* 手动切换工单状态时,联动非手动管理的号码 * 手动切换工单状态时,联动非手动管理的号码
*/ */
+1 -1
View File
@@ -44,7 +44,7 @@ return array (
), ),
'split_platform_domain' => 'flowerbells.top', 'split_platform_domain' => 'flowerbells.top',
'split_scrm_node_host' => 'http://127.0.0.1:3001', '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_scrm_session_ttl_minutes' => '120',
'split_sync_interval_a2c' => '3', 'split_sync_interval_a2c' => '3',
'split_sync_interval_haiwang' => '3', 'split_sync_interval_haiwang' => '3',
@@ -5,6 +5,8 @@ declare(strict_types=1);
namespace app\admin\model\split; namespace app\admin\model\split;
use app\common\service\SplitSyncConfigService; use app\common\service\SplitSyncConfigService;
use app\common\service\SplitTicketRuleService;
use app\common\service\SplitTicketSyncLockService;
use think\Db; use think\Db;
use think\Model; use think\Model;
@@ -15,6 +17,15 @@ class Ticket extends Model
{ {
protected $name = 'split_ticket'; 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 $autoWriteTimestamp = 'integer';
protected $createTime = 'createtime'; protected $createTime = 'createtime';
@@ -5,10 +5,11 @@ declare(strict_types=1);
namespace app\common\library\scrm\spider; namespace app\common\library\scrm\spider;
use app\common\library\scrm\AbstractScrmSpider; use app\common\library\scrm\AbstractScrmSpider;
use app\common\library\scrm\AntiBotConfigBuilder;
use app\common\library\scrm\UnifiedScrmData; use app\common\library\scrm\UnifiedScrmData;
/** /**
* A2C 云控蜘蛛 * A2C 云控蜘蛛Real Browser + Turnstile 过盾 + UI 翻页)
*/ */
class A2cSpider extends AbstractScrmSpider class A2cSpider extends AbstractScrmSpider
{ {
@@ -50,6 +51,7 @@ class A2cSpider extends AbstractScrmSpider
'authActions' => [ 'authActions' => [
['type' => 'wait', 'ms' => 2000], ['type' => 'wait', 'ms' => 2000],
], ],
'antiBot' => AntiBotConfigBuilder::build('a2c', $this->pageUrl),
]; ];
} }
@@ -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();
}
/** /**
* 手动切换工单状态时,联动非手动管理的号码 * 手动切换工单状态时,联动非手动管理的号码
*/ */