$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_id, platform_id, platform_outer_sku) * * 用于 create/update 前的预检,避免击中索引冲突返回 500 */ public function isUniqueMapping( int $origin_sku_id, int $platform_id, string $platform_outer_sku, ?int $exclude_id = null, ): bool { $query = SkuMapping::query() ->where('origin_sku_id', $origin_sku_id) ->where('platform_id', $platform_id) ->where('platform_outer_sku', $platform_outer_sku); if ($exclude_id !== null) { $query->where('id', '!=', $exclude_id); } return !$query->exists(); } /** * 读取 skus_origin.sku,用作 skus_mapping.origin_sku 快照值 */ public function autoFillOriginSku(int $origin_sku_id): ?string { return SkuOrigin::query()->find($origin_sku_id)?->sku; } /** * 检查 origin_sku 是否有映射引用(用于删除前检查) */ public function hasReferences(int $origin_sku_id): bool { return SkuMapping::query() ->where('origin_sku_id', $origin_sku_id) ->exists(); } }