add sku mapping
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use App\Model\SkuMapping;
|
||||
use App\Model\SkuOrigin;
|
||||
use Hyperf\Stringable\Str;
|
||||
|
||||
/**
|
||||
* SKU 业务逻辑服务
|
||||
*
|
||||
* 负责 platform_outer_sku 的自动生成、重复检测等业务逻辑
|
||||
*/
|
||||
class SkuService
|
||||
{
|
||||
/**
|
||||
* 生成 platform_outer_sku
|
||||
*
|
||||
* @param string $strategy 生成策略:prefix | prefix_random | manual
|
||||
* @param string $origin_sku 原始 SKU 编码
|
||||
* @param string $prefix 前缀
|
||||
* @param int $random_length 随机部分长度(仅 prefix_random 模式)
|
||||
* @param string|null $manual_value 手动输入值(仅 manual 模式)
|
||||
* @return string 生成的 platform_outer_sku
|
||||
*/
|
||||
public function generatePlatformOuterSku(
|
||||
string $strategy,
|
||||
string $origin_sku,
|
||||
string $prefix = '',
|
||||
int $random_length = 4,
|
||||
?string $manual_value = null,
|
||||
): string {
|
||||
return match ($strategy) {
|
||||
'prefix' => $this->generatePrefixSku($prefix, $origin_sku),
|
||||
'prefix_random' => $this->generatePrefixRandomSku($prefix, $random_length),
|
||||
'manual' => $manual_value ?? '',
|
||||
default => throw new \InvalidArgumentException("不支持的生成策略: {$strategy}"),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 前缀模式:{prefix}_{origin_sku}
|
||||
*/
|
||||
private function generatePrefixSku(string $prefix, string $origin_sku): string
|
||||
{
|
||||
if ($prefix === '') {
|
||||
return $origin_sku;
|
||||
}
|
||||
return "{$prefix}_{$origin_sku}";
|
||||
}
|
||||
|
||||
/**
|
||||
* 前缀+随机模式:{prefix}_{random_string}
|
||||
*/
|
||||
private function generatePrefixRandomSku(string $prefix, int $random_length): string
|
||||
{
|
||||
$random_part = Str::upper(Str::random($random_length));
|
||||
if ($prefix === '') {
|
||||
return $random_part;
|
||||
}
|
||||
return "{$prefix}_{$random_part}";
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建生成策略记录字符串
|
||||
*/
|
||||
public function buildStrategyRecord(string $strategy, string $prefix = '', int $random_length = 4): string
|
||||
{
|
||||
return match ($strategy) {
|
||||
'prefix' => "prefix:{$prefix}",
|
||||
'prefix_random' => "prefix_random:{$prefix}:{$random_length}",
|
||||
'manual' => 'manual',
|
||||
default => $strategy,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查某个 origin_sku 在指定平台下是否已存在映射记录
|
||||
*
|
||||
* @return array{has_duplicate: bool, existing_mappings: array, message: string}
|
||||
*/
|
||||
public function checkDuplicate(int $origin_sku_id, int $platform_id): array
|
||||
{
|
||||
$existing = SkuMapping::query()
|
||||
->where('origin_sku_id', $origin_sku_id)
|
||||
->where('platform_id', $platform_id)
|
||||
->where('enabled', true)
|
||||
->get(['id', 'store_id', 'platform_outer_sku', 'note']);
|
||||
|
||||
$has_duplicate = $existing->isNotEmpty();
|
||||
|
||||
$message = $has_duplicate
|
||||
? "该 origin_sku 在当前平台下已有 {$existing->count()} 条映射记录,可直接复用已有的 platform_outer_sku"
|
||||
: '';
|
||||
|
||||
return [
|
||||
'has_duplicate' => $has_duplicate,
|
||||
'existing_mappings' => $existing->toArray(),
|
||||
'message' => $message,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查 origin_sku 是否有映射引用(用于删除前检查)
|
||||
*/
|
||||
public function hasReferences(int $origin_sku_id): bool
|
||||
{
|
||||
return SkuMapping::query()
|
||||
->where('origin_sku_id', $origin_sku_id)
|
||||
->exists();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查 platform_outer_sku 在指定平台内是否唯一
|
||||
*/
|
||||
public function isPlatformOuterSkuUnique(string $platform_outer_sku, int $platform_id, ?int $exclude_id = null): bool
|
||||
{
|
||||
$query = SkuMapping::query()
|
||||
->where('platform_outer_sku', $platform_outer_sku)
|
||||
->where('platform_id', $platform_id);
|
||||
|
||||
if ($exclude_id !== null) {
|
||||
$query->where('id', '!=', $exclude_id);
|
||||
}
|
||||
|
||||
return !$query->exists();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user