ProjectService.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <?php
  2. namespace App\Services\Coach;
  3. use App\Enums\ProjectStatus;
  4. use App\Models\MemberUser;
  5. use App\Models\Project;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Log;
  8. class ProjectService
  9. {
  10. /**
  11. * 获取可开通的项目列表
  12. *
  13. * @param int $userId 技师用户ID
  14. */
  15. public function getAvailableProjects(int $userId): array
  16. {
  17. try {
  18. // 加载用户和技师信息
  19. $user = MemberUser::with(['coach', 'coach.projects'])->findOrFail($userId);
  20. abort_if(! $user->coach, 404, '技师信息不存在');
  21. // 获取所有可开通的项目
  22. $projects = Project::where('state', ProjectStatus::OPEN->value)
  23. ->select([
  24. 'id',
  25. 'title',
  26. 'subtitle',
  27. 'cover',
  28. 'price',
  29. 'original_price',
  30. 'sales',
  31. 'duration',
  32. 'project_desc',
  33. 'service_desc',
  34. 'type',
  35. ])
  36. ->get();
  37. // 记录日志
  38. Log::info('获取可开通项目列表成功', [
  39. 'user_id' => $userId,
  40. 'coach_id' => $user->coach->id,
  41. 'project_count' => $projects->count(),
  42. ]);
  43. return [
  44. 'items' => $projects,
  45. 'total' => $projects->count(),
  46. ];
  47. } catch (\Exception $e) {
  48. Log::error('获取可开通项目列表失败', [
  49. 'user_id' => $userId,
  50. 'error' => $e->getMessage(),
  51. 'file' => $e->getFile(),
  52. 'line' => $e->getLine(),
  53. ]);
  54. throw $e;
  55. }
  56. }
  57. /**
  58. * 技师开通项目
  59. *
  60. * @param int $userId 技师用户ID
  61. * @param array $data 开通项目数据
  62. */
  63. public function openProject(int $userId, array $data): array
  64. {
  65. return DB::transaction(function () use ($userId, $data) {
  66. try {
  67. // 加载用户和技师信息
  68. $user = MemberUser::with(['coach', 'coach.projects'])->findOrFail($userId);
  69. abort_if(! $user->coach, 404, '技师信息不存在');
  70. // 验证项目是否存在且状态正常
  71. $project = Project::where('id', $data['project_id'])
  72. ->where('state', ProjectStatus::OPEN->value)
  73. ->first();
  74. abort_if(! $project, 404, '项目不存在或已下架');
  75. // 检查是否已开通该项目
  76. $existingProject = $user->coach->projects()
  77. ->where('project_id', $data['project_id'])
  78. ->first();
  79. abort_if($existingProject, 422, '已开通该项目');
  80. // 创建技师项目关联
  81. $coachProject = $user->coach->projects()->create([
  82. // 项目ID
  83. 'project_id' => $data['project_id'],
  84. // 项目状态
  85. 'state' => ProjectStatus::OPEN->value,
  86. // 优惠金额
  87. 'discount_amount' => 0.00,
  88. // 服务性别(0:不限 1:男 2:女)
  89. 'service_gender' => 0,
  90. // 服务距离(公里 0:不限)
  91. 'service_distance' => 0,
  92. // 收取路费(0:免费 1:单程 2:双程)
  93. 'traffic_fee_type' => 2,
  94. // 路费金额
  95. 'traffic_fee' => 0,
  96. ]);
  97. // 记录日志
  98. Log::info('技师开通项目成功', [
  99. 'user_id' => $userId,
  100. 'coach_id' => $user->coach->id,
  101. 'project_id' => $data['project_id'],
  102. 'project_name' => $project->name,
  103. ]);
  104. return [
  105. 'message' => '项目开通成功',
  106. 'project_id' => $project->id,
  107. 'project_name' => $project->name,
  108. ];
  109. } catch (\Exception $e) {
  110. Log::error('技师开通项目失败', [
  111. 'user_id' => $userId,
  112. 'data' => $data,
  113. 'error' => $e->getMessage(),
  114. 'file' => $e->getFile(),
  115. 'line' => $e->getLine(),
  116. ]);
  117. throw $e;
  118. }
  119. });
  120. }
  121. /**
  122. * 获取技师已开通的项目列表
  123. *
  124. * @param int $userId 技师用户ID
  125. */
  126. public function getOpenedProjects(int $userId): array
  127. {
  128. try {
  129. // 加载用户和技师信息
  130. $user = MemberUser::with(['coach'])->findOrFail($userId);
  131. abort_if(! $user->coach, 404, '技师信息不存在');
  132. // 获取已开通的项目
  133. $projects = $user->coach->projects()
  134. ->with('project')
  135. ->where('state', ProjectStatus::ACTIVE->value)
  136. ->get()
  137. ->map(function ($coachProject) {
  138. return [
  139. 'id' => $coachProject->project->id,
  140. 'name' => $coachProject->project->name,
  141. 'cover' => $coachProject->project->cover,
  142. 'price' => $coachProject->project->price,
  143. 'duration' => $coachProject->project->duration,
  144. 'discount_amount' => $coachProject->discount_amount,
  145. 'traffic_fee' => $coachProject->traffic_fee,
  146. 'is_round_trip' => $coachProject->is_round_trip,
  147. 'opened_at' => $coachProject->created_at,
  148. ];
  149. });
  150. // 记录日志
  151. Log::info('获取已开通项目列表成功', [
  152. 'user_id' => $userId,
  153. 'coach_id' => $user->coach->id,
  154. 'project_count' => $projects->count(),
  155. ]);
  156. return [
  157. 'items' => $projects,
  158. 'total' => $projects->count(),
  159. ];
  160. } catch (\Exception $e) {
  161. Log::error('获取已开通项目列表失败', [
  162. 'user_id' => $userId,
  163. 'error' => $e->getMessage(),
  164. 'file' => $e->getFile(),
  165. 'line' => $e->getLine(),
  166. ]);
  167. throw $e;
  168. }
  169. }
  170. }