|
@@ -22,34 +22,61 @@ class AccountService
|
|
|
|
|
|
/**
|
|
|
* 提交技师基本信息
|
|
|
+ * 包括个人基础资料的提交和审核
|
|
|
+ *
|
|
|
+ * 业务流程:
|
|
|
+ * 1. 验证技师信息存在性
|
|
|
+ * 2. 检查是否有待审核的记录
|
|
|
+ * 3. 创建新的基本信息记录
|
|
|
+ * 4. 清除相关缓存
|
|
|
+ *
|
|
|
+ * 注意事项:
|
|
|
+ * - 同一时间只能有一条待审核记录
|
|
|
+ * - 审核不通过可以重新提交
|
|
|
+ * - 头像图片数据不限制格式
|
|
|
+ * - 除性别和手机号外,其他字段均为可选
|
|
|
+ * - 手机号会进行脱敏处理
|
|
|
+ *
|
|
|
+ * @param User $user 当前认证用户
|
|
|
+ * @param array $data 基本信息数据,包含:
|
|
|
+ * - nickname: string|null 昵称(可选)
|
|
|
+ * - avatar: string|null 头像图片(可选)
|
|
|
+ * - gender: string 性别(1:男 2:女)
|
|
|
+ * - mobile: string 手机号
|
|
|
+ * - birthday: string|null 出生日期(可选)
|
|
|
+ * - work_years: int|null 工作年限(可选)
|
|
|
+ * - intention_city: string|null 意向城市(可选)
|
|
|
+ * - introduction: string|null 个人简介(可选)
|
|
|
+ * @return array 返回结果
|
|
|
+ * @throws \Exception 当验证失败或保存失败时抛出异常
|
|
|
*/
|
|
|
public function submitBaseInfo($user, array $data)
|
|
|
{
|
|
|
DB::beginTransaction();
|
|
|
try {
|
|
|
+ // 验证技师信息是否存在
|
|
|
+ abort_if(!$user->coach, 404, '技师信息不存在');
|
|
|
|
|
|
- abort_if(! $user->coach, 404, '技师信息不存在');
|
|
|
-
|
|
|
- // 检查是否有待审核的记录
|
|
|
+ // 检查是否有待审核的记录,避免重复提交
|
|
|
$pendingRecord = $this->hasPendingRecord($user->coach, 'info');
|
|
|
abort_if($pendingRecord, 422, '已有待审核的基本信息记录');
|
|
|
|
|
|
// 创建技师信息
|
|
|
- $record = $user->coach->infoRecords()->create(array_merge($data, [
|
|
|
+ $user->coach->infoRecords()->create(array_merge($data, [
|
|
|
'state' => TechnicianAuthStatus::AUDITING->value,
|
|
|
]));
|
|
|
|
|
|
- // 清除技师信息缓存
|
|
|
+ // 清除技师信息缓存,确保数据一致性
|
|
|
$this->clearCoachCache($user->coach->id);
|
|
|
|
|
|
+ // 提交事务
|
|
|
DB::commit();
|
|
|
|
|
|
- $this->logInfo('技师提交基本信息成功', $user, $data);
|
|
|
-
|
|
|
+ // 返回成功结果
|
|
|
return ['message' => '基本信息提交成功'];
|
|
|
} catch (\Exception $e) {
|
|
|
+ // 发生异常时回滚事务
|
|
|
DB::rollBack();
|
|
|
- $this->logError('提交技师基本信息失败', $user, $data, $e);
|
|
|
throw $e;
|
|
|
}
|
|
|
}
|
|
@@ -96,15 +123,11 @@ class AccountService
|
|
|
abort_if($pendingRecord, 422, '已有待审核的资质信息记录');
|
|
|
|
|
|
// 创建新的资质审核记录,设置为待审核状态
|
|
|
- $record = $user->coach->qualRecords()->create([
|
|
|
- 'qual_type' => $data['qual_type'],
|
|
|
- 'qual_photo' => $data['qual_photo'],
|
|
|
- 'business_license' => $data['business_license'],
|
|
|
- 'health_cert' => $data['health_cert'],
|
|
|
- 'state' => TechnicianAuthStatus::AUDITING->value
|
|
|
- ]);
|
|
|
+ $record = $user->coach->qualRecords()->create(array_merge($data, [
|
|
|
+ 'state' => TechnicianAuthStatus::AUDITING->value,
|
|
|
+ ]));
|
|
|
|
|
|
- // 清除技师信息缓存,确��数据一致性
|
|
|
+ // 清除技师信息缓存,确保数据一致性
|
|
|
$this->clearCoachCache($user->coach->id);
|
|
|
|
|
|
// 提交事务
|
|
@@ -166,7 +189,7 @@ class AccountService
|
|
|
abort_if($pendingRecord, 422, '已有待审核的实名认证信息');
|
|
|
|
|
|
// 创建新的实名认证记录,设置为待审核状态
|
|
|
- $record = $user->coach->realRecords()->create(array_merge($data, [
|
|
|
+ $user->coach->realRecords()->create(array_merge($data, [
|
|
|
'state' => TechnicianAuthStatus::AUDITING->value,
|
|
|
]));
|
|
|
|
|
@@ -190,53 +213,18 @@ class AccountService
|
|
|
*/
|
|
|
public function getCoachInfo($user)
|
|
|
{
|
|
|
- try {
|
|
|
- abort_if(! $user, 404, '用户不存在');
|
|
|
- abort_if(! $user->coach, 404, '技师信息不存在');
|
|
|
-
|
|
|
- return Cache::remember(
|
|
|
- self::CACHE_KEY_PREFIX . $user->coach->id,
|
|
|
- self::CACHE_TTL,
|
|
|
- function () use ($user) {
|
|
|
- return $this->fetchCoachInfo($user->coach);
|
|
|
- }
|
|
|
- );
|
|
|
- } catch (\Exception $e) {
|
|
|
- $this->logError('获取技师信息失败', $user, [], $e);
|
|
|
- throw $e;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 记录信息日志
|
|
|
- */
|
|
|
- private function logInfo(string $message, $user, array $data)
|
|
|
- {
|
|
|
- Log::info($message, [
|
|
|
- 'user_id' => $user->id,
|
|
|
- 'coach_id' => $user->coach->id,
|
|
|
- 'data' => $data,
|
|
|
- 'ip' => request()->ip(),
|
|
|
- 'timestamp' => now()->toDateTimeString(),
|
|
|
- ]);
|
|
|
+ abort_if(! $user, 404, '用户不存在');
|
|
|
+ abort_if(! $user->coach, 404, '技师信息不存在');
|
|
|
+
|
|
|
+ return Cache::remember(
|
|
|
+ self::CACHE_KEY_PREFIX . $user->coach->id,
|
|
|
+ self::CACHE_TTL,
|
|
|
+ function () use ($user) {
|
|
|
+ return $this->fetchCoachInfo($user->coach);
|
|
|
+ }
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 记录错误日志
|
|
|
- */
|
|
|
- private function logError(string $message, $user, array $data, \Exception $e)
|
|
|
- {
|
|
|
- Log::error($message, [
|
|
|
- 'user_id' => $user->id,
|
|
|
- 'coach_id' => $user->coach->id ?? null,
|
|
|
- 'data' => $data,
|
|
|
- 'error' => $e->getMessage(),
|
|
|
- 'file' => $e->getFile(),
|
|
|
- 'line' => $e->getLine(),
|
|
|
- 'ip' => request()->ip(),
|
|
|
- 'timestamp' => now()->toDateTimeString(),
|
|
|
- ]);
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 获取技师详细信息
|
|
@@ -326,21 +314,6 @@ class AccountService
|
|
|
return substr_replace($idCard, '****', 6, 8);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 敏感数据脱敏
|
|
|
- */
|
|
|
- private function maskSensitiveData(array $data)
|
|
|
- {
|
|
|
- if (isset($data['id_card'])) {
|
|
|
- $data['id_card'] = $this->maskIdCard($data['id_card']);
|
|
|
- }
|
|
|
- if (isset($data['mobile'])) {
|
|
|
- $data['mobile'] = $this->maskMobile($data['mobile']);
|
|
|
- }
|
|
|
-
|
|
|
- return $data;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 清除技师信息缓存
|
|
|
*/
|
|
@@ -845,7 +818,7 @@ class AccountService
|
|
|
|
|
|
Redis::setex($cacheKey, 86400, json_encode($cacheData));
|
|
|
} catch (\Exception $e) {
|
|
|
- Log::error('更新工作状态缓存��败', [
|
|
|
+ Log::error('更新工作状态缓存失败', [
|
|
|
'coach_id' => $coachId,
|
|
|
'error' => $e->getMessage(),
|
|
|
]);
|