|
@@ -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
|
|
|
// 参数顺序:key longitude latitude member
|
|
|
return Redis::geoadd('coach_locations', $longitude, $latitude, $key);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取技师详细信息
|
|
|
+ *
|
|
|
+ * 业务逻辑:
|
|
|
+ * 1. 获取技师最新基本信息(不包括审核拒绝的记录)
|
|
|
+ * 2. 获取技师邀请码信息
|
|
|
+ * 3. 获取钱包信息
|
|
|
+ * 4. 组装返回数据
|
|
|
+ *
|
|
|
+ * @return array 技师详细信息
|
|
|
+ * @throws \Exception 获取信息失败时抛出异常
|
|
|
+ */
|
|
|
+ public function getCoachDetail(): array
|
|
|
+ {
|
|
|
+ // 获取当前登录用户
|
|
|
+ /** @var MemberUser $user */
|
|
|
+ $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, '技师基本信息不存在');
|
|
|
+
|
|
|
+ // 生成技师工号(例如:8位数字,不足前面补0)
|
|
|
+ $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, // 累计支出
|
|
|
+ ];
|
|
|
+ }
|
|
|
}
|