CoachInfoRecordService.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace App\Services;
  3. use App\Models\CoachUser;
  4. use App\Enums\TechnicianStatus;
  5. use App\Models\CoachInfoRecord;
  6. use Illuminate\Support\Facades\DB;
  7. use App\Enums\TechnicianAuthStatus;
  8. use Slowlyo\OwlAdmin\Services\AdminService;
  9. /**
  10. * 技师信息记录
  11. *
  12. * @method CoachInfoRecord getModel()
  13. * @method CoachInfoRecord|\Illuminate\Database\Query\Builder query()
  14. */
  15. class CoachInfoRecordService extends AdminService
  16. {
  17. protected string $modelName = CoachInfoRecord::class;
  18. /**
  19. * 审核技师基本信息认证
  20. *
  21. * 审核流程:
  22. * 1. 验证基本信息认证记录是否存在且状态为待审核
  23. * 2. 更新认证记录的审核状态、意见、审核人和时间
  24. * 3. 如果审核通过:
  25. * - 如果技师首次申请,将技师状态设为激活
  26. * - 更新技师表中的基本信息认证记录ID
  27. * 4. 使用事务确保数据一致性
  28. *
  29. * @param int $id 认证记录ID
  30. * @param int $state 审核状态(2:通过 3:驳回) {@see TechnicianAuthStatus}
  31. * @param string $remark 审核意见
  32. * @param int $adminId 审核人ID
  33. *
  34. * @return bool 审核是否成功
  35. * @throws \Exception 当记录不存在或已审核时抛出异常
  36. */
  37. public function audit(int $id, int $state, string $remark, int $adminId): bool
  38. {
  39. return DB::transaction(function () use ($id, $state, $remark, $adminId) {
  40. // 获取认证记录及关联的技师信息
  41. $record = $this->getModel()::with('coach')->findOrFail($id);
  42. $coach = $record->coach;
  43. // 检查技师信息和认证状态
  44. abort_if(!$coach, 400, '技师信息不存在');
  45. abort_if(
  46. (int)$record->state !== TechnicianAuthStatus::AUDITING->value,
  47. 400,
  48. '该申请已审核'
  49. );
  50. // 更新认证记录
  51. $record->state = $state;
  52. $record->audit_remark = $remark;
  53. $record->auditor = $adminId;
  54. $record->audit_time = now();
  55. $record->save();
  56. // 审核通过时的处理
  57. if ($state === TechnicianAuthStatus::PASSED->value) {
  58. $updateData = ['info_record_id' => $record->id];
  59. // 首次申请通过时,激活技师状态
  60. if (!$coach->info_record_id) {
  61. $updateData['state'] = TechnicianStatus::ACTIVE->value;
  62. }
  63. // 更新技师信息
  64. $coach->update($updateData);
  65. }
  66. return true;
  67. });
  68. }
  69. }