소스 검색

feat:后台-审核实名技师

刘学玺 3 달 전
부모
커밋
07eda8e0cb
5개의 변경된 파일165개의 추가작업 그리고 64개의 파일을 삭제
  1. 109 61
      app/Admin/Controllers/CoachRealRecordController.php
  2. 2 1
      app/Services/CoachInfoRecordService.php
  3. 50 2
      app/Services/CoachRealRecordService.php
  4. 2 0
      routes/admin.php
  5. 2 0
      routes/web.php

+ 109 - 61
app/Admin/Controllers/CoachRealRecordController.php

@@ -4,6 +4,8 @@ namespace App\Admin\Controllers;
 
 use App\Services\CoachRealRecordService;
 use Slowlyo\OwlAdmin\Controllers\AdminController;
+use Illuminate\Http\Request;
+use Slowlyo\OwlAdmin\Admin;
 
 /**
  * 技师实名认证
@@ -12,68 +14,114 @@ use Slowlyo\OwlAdmin\Controllers\AdminController;
  */
 class CoachRealRecordController extends AdminController
 {
-	protected string $serviceName = CoachRealRecordService::class;
+    protected string $serviceName = CoachRealRecordService::class;
 
-	public function list()
-	{
-		$crud = $this->baseCRUD()
-			->filterTogglable(false)
-			->headerToolbar([
-				$this->createButton('dialog'),
-				...$this->baseHeaderToolBar()
-			])
-			->columns([
-				amis()->TableColumn('id', 'ID')->sortable(),
-				amis()->TableColumn('coach_id', '技师编号'),
-				amis()->TableColumn('real_name', '姓名'),
-				amis()->TableColumn('id_card', '身份证号'),
-				amis()->TableColumn('id_card_front_photo', '身份证正面照片'),
-				amis()->TableColumn('id_card_back_photo', '身份证反面照片'),
-				amis()->TableColumn('id_card_hand_photo', '手持身份证照片'),
-				amis()->TableColumn('auditor', '审核人'),
-				amis()->TableColumn('audit_time', '审核时间'),
-				amis()->TableColumn('audit_remark', '审核回执'),
-				amis()->TableColumn('state', '状态')->sortable(),
-				amis()->TableColumn('created_at', admin_trans('admin.created_at'))->type('datetime')->sortable(),
-				amis()->TableColumn('updated_at', admin_trans('admin.updated_at'))->type('datetime')->sortable(),
-				$this->rowActions('dialog')
-			]);
+    public function list()
+    {
+        $crud = $this->baseCRUD()
+            ->filterTogglable(false)
+            ->headerToolbar([
+                $this->createButton('dialog'),
+                ...$this->baseHeaderToolBar()
+            ])
+            ->columns([
+                amis()->TableColumn('id', 'ID')->sortable(),
+                amis()->TableColumn('coach_id', '技师编号'),
+                amis()->TableColumn('real_name', '姓名'),
+                amis()->TableColumn('id_card', '身份证号'),
+                amis()->TableColumn('id_card_front_photo', '身份证正面照片'),
+                amis()->TableColumn('id_card_back_photo', '身份证反面照片'),
+                amis()->TableColumn('id_card_hand_photo', '手持身份证照片'),
+                amis()->TableColumn('auditor', '审核人'),
+                amis()->TableColumn('audit_time', '审核时间'),
+                amis()->TableColumn('audit_remark', '审核回执'),
+                amis()->TableColumn('state', '状态')->sortable(),
+                amis()->TableColumn('created_at', admin_trans('admin.created_at'))->type('datetime')->sortable(),
+                amis()->TableColumn('updated_at', admin_trans('admin.updated_at'))->type('datetime')->sortable(),
+                $this->rowActions('dialog')
+            ]);
 
-		return $this->baseList($crud);
-	}
+        return $this->baseList($crud);
+    }
 
-	public function form($isEdit = false)
-	{
-		return $this->baseForm()->body([
-			amis()->TextControl('coach_id', '技师编号'),
-			amis()->TextControl('real_name', '姓名'),
-			amis()->TextControl('id_card', '身份证号'),
-			amis()->TextControl('id_card_front_photo', '身份证正面照片'),
-			amis()->TextControl('id_card_back_photo', '身份证反面照片'),
-			amis()->TextControl('id_card_hand_photo', '手持身份证照片'),
-			amis()->TextControl('auditor', '审核人'),
-			amis()->TextControl('audit_time', '审核时间'),
-			amis()->TextControl('audit_remark', '审核回执'),
-			amis()->TextControl('state', '状态'),
-		]);
-	}
+    public function form($isEdit = false)
+    {
+        return $this->baseForm()->body([
+            amis()->TextControl('coach_id', '技师编号'),
+            amis()->TextControl('real_name', '姓名'),
+            amis()->TextControl('id_card', '身份证号'),
+            amis()->TextControl('id_card_front_photo', '身份证正面照片'),
+            amis()->TextControl('id_card_back_photo', '身份证反面照片'),
+            amis()->TextControl('id_card_hand_photo', '手持身份证照片'),
+            amis()->TextControl('auditor', '审核人'),
+            amis()->TextControl('audit_time', '审核时间'),
+            amis()->TextControl('audit_remark', '审核回执'),
+            amis()->TextControl('state', '状态'),
+        ]);
+    }
 
-	public function detail()
-	{
-		return $this->baseDetail()->body([
-			amis()->TextControl('id', 'ID')->static(),
-			amis()->TextControl('coach_id', '技师编号')->static(),
-			amis()->TextControl('real_name', '姓名')->static(),
-			amis()->TextControl('id_card', '身份证号')->static(),
-			amis()->TextControl('id_card_front_photo', '身份证正面照片')->static(),
-			amis()->TextControl('id_card_back_photo', '身份证反面照片')->static(),
-			amis()->TextControl('id_card_hand_photo', '手持身份证照片')->static(),
-			amis()->TextControl('auditor', '审核人')->static(),
-			amis()->TextControl('audit_time', '审核时间')->static(),
-			amis()->TextControl('audit_remark', '审核回执')->static(),
-			amis()->TextControl('state', '状态')->static(),
-			amis()->TextControl('created_at', admin_trans('admin.created_at'))->static(),
-			amis()->TextControl('updated_at', admin_trans('admin.updated_at'))->static(),
-		]);
-	}
-}
+    public function detail()
+    {
+        return $this->baseDetail()->body([
+            amis()->TextControl('id', 'ID')->static(),
+            amis()->TextControl('coach_id', '技师编号')->static(),
+            amis()->TextControl('real_name', '姓名')->static(),
+            amis()->TextControl('id_card', '身份证号')->static(),
+            amis()->TextControl('id_card_front_photo', '身份证正面照片')->static(),
+            amis()->TextControl('id_card_back_photo', '身份证反面照片')->static(),
+            amis()->TextControl('id_card_hand_photo', '手持身份证照片')->static(),
+            amis()->TextControl('auditor', '审核人')->static(),
+            amis()->TextControl('audit_time', '审核时间')->static(),
+            amis()->TextControl('audit_remark', '审核回执')->static(),
+            amis()->TextControl('state', '状态')->static(),
+            amis()->TextControl('created_at', admin_trans('admin.created_at'))->static(),
+            amis()->TextControl('updated_at', admin_trans('admin.updated_at'))->static(),
+        ]);
+    }
+
+    /**
+     * [审核]审核技师实名认证
+     *
+     * @description 审核技师的实名认证记录,可通过或驳回
+     *
+     * @header x-xsrf-token required CSRF令牌 Example: your_csrf_token
+     *
+     * @bodyParam real_auth_record_id integer required 实名认证记录ID Example: 1
+     * @bodyParam real_auth_state integer required 审核状态(2:通过 3:驳回) Example: 2
+     * @bodyParam audit_remark string required 审核意见 Example: 身份信息核实无误,审核通过
+     *
+     * @response scenario=success {
+     *   "code": 200,
+     *   "message": "操作成功"
+     * }
+     *
+     * @response status=400 scenario="已审核" {
+     *   "message": "该认证已审核"
+     * }
+     *
+     * @response status=404 scenario="不存在" {
+     *   "message": "认证记录不存在"
+     * }
+     */
+    public function audit(Request $request)
+    {
+        $validated = $request->validate([
+            'real_auth_record_id' => 'required|integer|exists:coach_real_records,id',
+            'real_auth_state' => 'required|integer|in:2,3', // 2:通过 3:驳回
+            'audit_remark' => 'required|string|max:255',
+        ]);
+
+        try {
+            $result = $this->service->audit(
+                $validated['real_auth_record_id'],
+                $validated['real_auth_state'],
+                $validated['audit_remark'],
+                Admin::user()->id
+            );
+
+            return $this->autoResponse($result);
+        } catch (\Exception $e) {
+            return $this->error($e->getMessage());
+        }
+    }
+}

+ 2 - 1
app/Services/CoachInfoRecordService.php

@@ -52,7 +52,8 @@ class CoachInfoRecordService extends AdminService
             // 如果审核通过,更新技师状态
             if ($state == TechnicianAuthStatus::PASSED->value) {
                 CoachUser::where('id', $record->coach_id)->update([
-                    'state' => TechnicianStatus::ACTIVE->value
+                    'state' => TechnicianStatus::ACTIVE->value,
+                    'info_record_id' => $record->id
                 ]);
             }
 

+ 50 - 2
app/Services/CoachRealRecordService.php

@@ -4,6 +4,9 @@ namespace App\Services;
 
 use App\Models\CoachRealRecord;
 use Slowlyo\OwlAdmin\Services\AdminService;
+use Illuminate\Support\Facades\DB;
+use App\Models\CoachUser;
+use App\Enums\TechnicianAuthStatus;
 
 /**
  * 技师实名认证
@@ -13,5 +16,50 @@ use Slowlyo\OwlAdmin\Services\AdminService;
  */
 class CoachRealRecordService extends AdminService
 {
-	protected string $modelName = CoachRealRecord::class;
-}
+    protected string $modelName = CoachRealRecord::class;
+
+    /**
+     * 审核技师实名认证
+     *
+     * @param int $id 认证记录ID
+     * @param int $state 审核状态 2:通过 3:驳回
+     * @param string $remark 审核意见
+     * @param int $adminId 审核人ID
+     * @return bool
+     * @throws \Exception
+     */
+    public function audit(int $id, int $state, string $remark, int $adminId): bool
+    {
+        DB::beginTransaction();
+        try {
+            // 获取认证记录
+            $record = $this->getModel()::findOrFail($id);
+
+            // 检查状态
+            if ((int)$record->state != TechnicianAuthStatus::AUDITING->value) {
+                throw new \Exception('该认证已审核');
+            }
+
+            // 更新认证记录
+            $record->update([
+                'state' => $state,
+                'audit_remark' => $remark,
+                'auditor' => $adminId,
+                'audit_time' => now(),
+            ]);
+
+            // 如果审核通过,更新技师状态
+            if ($state == TechnicianAuthStatus::PASSED->value) {
+                CoachUser::where('id', $record->coach_id)->update([
+                    'real_auth_record_id' => $record->id
+                ]);
+            }
+
+            DB::commit();
+            return true;
+        } catch (\Exception $e) {
+            DB::rollBack();
+            throw $e;
+        }
+    }
+}

+ 2 - 0
routes/admin.php

@@ -87,6 +87,8 @@ Route::group([
     $router->resource('project', \App\Admin\Controllers\ProjectController::class);
     // 技师实名认证
     $router->resource('coach_real_records', \App\Admin\Controllers\CoachRealRecordController::class);
+    // 审核技师实名认证记录
+    $router->post('coach_real_records/audit', [\App\Admin\Controllers\CoachRealRecordController::class, 'audit']);
     // 设置分组管理
     $router->resource('setting_groups', \App\Admin\Controllers\SettingGroupController::class);
     // 设置项管理

+ 2 - 0
routes/web.php

@@ -230,5 +230,7 @@ Route::group([
         Route::post('shop/freeze-balance', [ShopInfoController::class, 'freezeBalance']);
         // 审核技师申请
         Route::post('coach_info_records/audit', [\App\Admin\Controllers\CoachInfoRecordController::class, 'audit']);
+        // 审核技师实名认证记录
+        Route::post('coach_real_records/audit', [\App\Admin\Controllers\CoachRealRecordController::class, 'audit']);
     });
 });