Files
cunkebao_v3/Moncter/app/service/StoreService.php

165 lines
5.6 KiB
PHP
Raw Normal View History

2026-01-05 10:16:20 +08:00
<?php
namespace app\service;
use app\repository\StoreRepository;
use app\utils\LoggerHelper;
use Ramsey\Uuid\Uuid as UuidGenerator;
/**
* 门店服务
*
* 职责:
* - 创建门店
* - 查询门店信息
* - 根据门店名称获取或创建门店ID
*/
class StoreService
{
public function __construct(
protected StoreRepository $storeRepository
) {
}
/**
* 根据门店名称获取或创建门店ID
*
* @param string $storeName 门店名称
* @param string|null $source 数据源标识(用于生成默认门店编码)
* @param array<string, mixed> $extraData 额外的门店信息
* @return string 门店ID
*/
public function getOrCreateStoreByName(
string $storeName,
?string $source = null,
array $extraData = []
): string {
// 1. 先查找是否已存在同名门店(正常状态)
$existingStore = $this->storeRepository->findByStoreName($storeName);
if ($existingStore) {
LoggerHelper::logBusiness('store_found_by_name', [
'store_name' => $storeName,
'store_id' => $existingStore->store_id,
]);
return $existingStore->store_id;
}
// 2. 如果不存在,创建新门店
$storeId = $this->createStore($storeName, $source, $extraData);
LoggerHelper::logBusiness('store_created_by_name', [
'store_name' => $storeName,
'store_id' => $storeId,
'source' => $source,
]);
return $storeId;
}
/**
* 创建门店
*
* @param string $storeName 门店名称
* @param string|null $source 数据源标识
* @param array<string, mixed> $extraData 额外的门店信息
* @return string 门店ID
*/
public function createStore(string $storeName, ?string $source = null, array $extraData = []): string
{
$now = new \DateTimeImmutable('now');
$storeId = UuidGenerator::uuid4()->toString();
// 生成门店编码如果提供了store_code则使用否则自动生成
$storeCode = $extraData['store_code'] ?? $this->generateStoreCode($storeName, $source);
// 检查门店编码是否已存在
$existingStore = $this->storeRepository->findByStoreCode($storeCode);
if ($existingStore) {
// 如果编码已存在,重新生成
$storeCode = $this->generateStoreCode($storeName, $source, true);
}
// 创建门店记录
$store = new StoreRepository();
$store->store_id = $storeId;
$store->store_code = $storeCode;
$store->store_name = $storeName;
$store->store_type = $extraData['store_type'] ?? '线上店'; // 默认线上店
$store->store_level = $extraData['store_level'] ?? null;
$store->industry_id = $extraData['industry_id'] ?? 'default'; // 默认行业ID后续可配置
$store->industry_detail_id = $extraData['industry_detail_id'] ?? null;
$store->store_address = $extraData['store_address'] ?? null;
$store->store_province = $extraData['store_province'] ?? null;
$store->store_city = $extraData['store_city'] ?? null;
$store->store_district = $extraData['store_district'] ?? null;
$store->store_business_area = $extraData['store_business_area'] ?? null;
$store->store_longitude = isset($extraData['store_longitude']) ? (float)$extraData['store_longitude'] : null;
$store->store_latitude = isset($extraData['store_latitude']) ? (float)$extraData['store_latitude'] : null;
$store->store_phone = $extraData['store_phone'] ?? null;
$store->status = 0; // 0-正常
$store->create_time = $now;
$store->update_time = $now;
$store->save();
LoggerHelper::logBusiness('store_created', [
'store_id' => $storeId,
'store_name' => $storeName,
'store_code' => $storeCode,
'store_type' => $store->store_type,
]);
return $storeId;
}
/**
* 生成门店编码
*
* @param string $storeName 门店名称
* @param string|null $source 数据源标识
* @param bool $addTimestamp 是否添加时间戳(用于避免重复)
* @return string 门店编码
*/
private function generateStoreCode(string $storeName, ?string $source = null, bool $addTimestamp = false): string
{
// 清理门店名称,移除特殊字符,保留中英文和数字
$cleanedName = preg_replace('/[^\p{L}\p{N}]/u', '', $storeName);
// 如果名称过长截取前20个字符
if (mb_strlen($cleanedName) > 20) {
$cleanedName = mb_substr($cleanedName, 0, 20);
}
// 如果名称为空,使用默认值
if (empty($cleanedName)) {
$cleanedName = 'STORE';
}
// 生成编码:{source}_{cleaned_name}_{hash}
$hash = substr(md5($storeName . ($source ?? '')), 0, 8);
$code = strtoupper(($source ? $source . '_' : '') . $cleanedName . '_' . $hash);
// 如果需要添加时间戳(用于避免重复)
if ($addTimestamp) {
$code .= '_' . time();
}
return $code;
}
/**
* 根据门店ID获取门店信息
*
* @param string $storeId 门店ID
* @return StoreRepository|null
*/
public function getStoreById(string $storeId): ?StoreRepository
{
return $this->storeRepository->newQuery()
->where('store_id', $storeId)
->first();
}
}