Files
links/patches/application/common/service/SplitScrmSpiderFactory.php
T

124 lines
3.3 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace app\common\service;
use app\common\library\scrm\AbstractScrmSpider;
use app\common\library\scrm\ScrmSpiderInterface;
use app\common\library\scrm\spider\A2cSpider;
use app\common\library\scrm\spider\ChatknowSpider;
use app\common\library\scrm\spider\HaiwangSpider;
use app\common\library\scrm\spider\HuojianSpider;
use app\common\library\scrm\spider\SsCustomerSpider;
use app\common\library\scrm\spider\WhatshubSpider;
use app\common\library\scrm\spider\XingheSpider;
/**
* 工单类型 -> 云控蜘蛛工厂
*
* 新增云控类型:在 spider/ 下新增类并在此注册 ticket_type => Class
*/
class SplitScrmSpiderFactory
{
/** @var array<string, class-string<ScrmSpiderInterface>> */
private const MAP = [
'a2c' => A2cSpider::class,
'haiwang' => HaiwangSpider::class,
'huojian' => HuojianSpider::class,
'xinghe' => XingheSpider::class,
'ss_customer' => SsCustomerSpider::class,
'chatknow' => ChatknowSpider::class,
'whatshub' => WhatshubSpider::class,
// ceo_scrm 等未实现类型:新增 spider 类后在此注册
];
/**
* @return class-string<ScrmSpiderInterface>|null
*/
public static function resolveClass(string $ticketType): ?string
{
$ticketType = trim($ticketType);
return self::MAP[$ticketType] ?? null;
}
/**
* 是否已实现蜘蛛
*/
public static function isSupported(string $ticketType): bool
{
return self::resolveClass($ticketType) !== null;
}
/**
* 已注册且已实现蜘蛛的类型列表
*
* @return list<string>
*/
public static function listSupportedTypes(): array
{
return array_keys(self::MAP);
}
/**
* 同步是否依赖 Node Headless(纯 PHP cURL 等为 false
*/
public static function requiresNode(string $ticketType): bool
{
$class = self::resolveClass($ticketType);
if ($class === null) {
return true;
}
return is_subclass_of($class, AbstractScrmSpider::class);
}
/**
* @return list<string>
*/
public static function listDirectSyncTypes(): array
{
$types = [];
foreach (self::listSupportedTypes() as $ticketType) {
if (!self::requiresNode($ticketType)) {
$types[] = $ticketType;
}
}
return $types;
}
/**
* @return list<string>
*/
public static function listNodeSyncTypes(): array
{
$types = [];
foreach (self::listSupportedTypes() as $ticketType) {
if (self::requiresNode($ticketType)) {
$types[] = $ticketType;
}
}
return $types;
}
/**
* @return ScrmSpiderInterface|null
*/
public static function create(
string $ticketType,
string $pageUrl,
string $account = '',
string $password = '',
string $nodeHost = ''
): ?ScrmSpiderInterface {
$class = self::resolveClass($ticketType);
if ($class === null) {
return null;
}
$host = $nodeHost !== '' ? $nodeHost : SplitSyncConfigService::getNodeHost();
return new $class($pageUrl, $account, $password, $host);
}
}