|
@@ -7,10 +7,13 @@ use App\Enums\OrderStatus;
|
|
|
use App\Models\MemberUser;
|
|
|
use App\Models\CoachLocation;
|
|
|
use App\Models\CoachSchedule;
|
|
|
+use App\Enums\TechnicianStatus;
|
|
|
+use App\Models\CoachInfoRecord;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use App\Enums\TechnicianAuthStatus;
|
|
|
use App\Enums\TechnicianWorkStatus;
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
+use Illuminate\Support\Facades\Auth;
|
|
|
use App\Enums\TechnicianLocationType;
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
use Illuminate\Support\Facades\Redis;
|
|
@@ -304,7 +307,7 @@ class AccountService
|
|
|
return [
|
|
|
'nickname' => $info->nickname,
|
|
|
'avatar' => $info->avatar,
|
|
|
- 'life_photos' => json_decode($info->life_photos, true) ?? [],
|
|
|
+ 'life_photos' => $info->life_photos ?? [],
|
|
|
'gender' => $info->gender,
|
|
|
'mobile' => $this->maskMobile($info->mobile),
|
|
|
'birthday' => $info->birthday,
|
|
@@ -411,7 +414,7 @@ class AccountService
|
|
|
* 1. 验证经纬度参数
|
|
|
* 2. 验证位置类型
|
|
|
* 3. 保存到Redis的地理位置数据结构
|
|
|
- * 4. 同步保存到数据库
|
|
|
+ * 4. 同步保存到据库
|
|
|
*
|
|
|
* @param int $coachId 技师ID
|
|
|
* @param float $latitude 纬度
|
|
@@ -939,7 +942,7 @@ class AccountService
|
|
|
$coach = $user->coach;
|
|
|
abort_if(! $coach, 404, '技师信息不存在');
|
|
|
|
|
|
-
|
|
|
+
|
|
|
$cacheKey = "coach:schedule:{$coach->id}";
|
|
|
$cached = Redis::get($cacheKey);
|
|
|
if ($cached) {
|
|
@@ -1073,4 +1076,104 @@ class AccountService
|
|
|
|
|
|
return Redis::geoadd('coach_locations', $longitude, $latitude, $key);
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ * 获取技师详细信息
|
|
|
+ *
|
|
|
+ * 业务逻辑:
|
|
|
+ * 1. 获取技师最新基本信息(不包括审核拒绝的记录)
|
|
|
+ * 2. 获取技师邀请码信息
|
|
|
+ * 3. 获取钱包信息
|
|
|
+ * 4. 组装返回数据
|
|
|
+ *
|
|
|
+ * @return array 技师详细信息
|
|
|
+ * @throws \Exception 获取信息失败时抛出异常
|
|
|
+ */
|
|
|
+ public function getCoachDetail(): array
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ $user = Auth::user();
|
|
|
+
|
|
|
+
|
|
|
+ $coach = $user->coach;
|
|
|
+ abort_if(!$coach, 404, '技师信息不存在');
|
|
|
+
|
|
|
+
|
|
|
+ $latestInfo = CoachInfoRecord::where('coach_id', $coach->id)
|
|
|
+ ->where('state', '<>', TechnicianAuthStatus::REJECTED->value)
|
|
|
+ ->latest()
|
|
|
+ ->first();
|
|
|
+ abort_if(!$latestInfo, 404, '技师基本信息不存在');
|
|
|
+
|
|
|
+
|
|
|
+ $coachNo = str_pad($coach->id, 8, '0', STR_PAD_LEFT);
|
|
|
+
|
|
|
+
|
|
|
+ $inviteCode = $this->generateInviteCode($coach->id);
|
|
|
+
|
|
|
+
|
|
|
+ $wallet = $this->getWalletInfo($coach->id);
|
|
|
+
|
|
|
+
|
|
|
+ $baseInfo = $this->formatBaseInfo($latestInfo);
|
|
|
+
|
|
|
+
|
|
|
+ return array_merge(
|
|
|
+ [
|
|
|
+ 'coach_no' => $coachNo,
|
|
|
+ 'invite_code' => $inviteCode,
|
|
|
+ 'wallet' => $wallet,
|
|
|
+ ],
|
|
|
+ $baseInfo
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 生成技师邀请码
|
|
|
+ *
|
|
|
+ * @param int $coachId 技师ID
|
|
|
+ * @return string 邀请码
|
|
|
+ */
|
|
|
+ private function generateInviteCode(int $coachId): string
|
|
|
+ {
|
|
|
+ return sprintf('C%d', $coachId);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 获取技师钱包信息
|
|
|
+ *
|
|
|
+ * 业务逻辑:
|
|
|
+ * 1. 获取技师钱包关联数据
|
|
|
+ * 2. 如果钱包不存在,返回默认值
|
|
|
+ * 3. 返回钱包概况数据
|
|
|
+ *
|
|
|
+ * @param int $coachId 技师ID
|
|
|
+ * @return array 钱包概况信息
|
|
|
+ */
|
|
|
+ private function getWalletInfo(int $coachId): array
|
|
|
+ {
|
|
|
+
|
|
|
+ $coach = CoachUser::with('wallet')->find($coachId);
|
|
|
+
|
|
|
+
|
|
|
+ if (!$coach || !$coach->wallet) {
|
|
|
+ return [
|
|
|
+ 'total_balance' => 0,
|
|
|
+ 'available_balance' => 0,
|
|
|
+ 'frozen_amount' => 0,
|
|
|
+ 'total_income' => 0,
|
|
|
+ 'total_expense' => 0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'total_balance' => $coach->wallet->total_balance ?? 0,
|
|
|
+ 'available_balance' => $coach->wallet->available_balance ?? 0,
|
|
|
+ 'frozen_amount' => $coach->wallet->frozen_amount ?? 0,
|
|
|
+ 'total_income' => $coach->wallet->total_income ?? 0,
|
|
|
+ 'total_expense' => $coach->wallet->total_expense ?? 0,
|
|
|
+ ];
|
|
|
+ }
|
|
|
}
|