From 3d7646ef6a39930b9942fa608130cc40bed5ca92 Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Mon, 29 Apr 2024 21:30:11 +0800 Subject: [PATCH] api sign.position --- app/Enums/SignTime.php | 2 +- .../Controllers/Api/Hr/SignController.php | 38 ++++++++++++++----- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/app/Enums/SignTime.php b/app/Enums/SignTime.php index fe64f92..55be388 100644 --- a/app/Enums/SignTime.php +++ b/app/Enums/SignTime.php @@ -3,7 +3,7 @@ namespace App\Enums; /** - * 打卡时机 + * 打卡时机(上班打卡/下班打卡) */ enum SignTime: int { diff --git a/app/Http/Controllers/Api/Hr/SignController.php b/app/Http/Controllers/Api/Hr/SignController.php index 24e29fc..7bb76a1 100644 --- a/app/Http/Controllers/Api/Hr/SignController.php +++ b/app/Http/Controllers/Api/Hr/SignController.php @@ -44,24 +44,28 @@ class SignController extends Controller { $user = $this->guard()->user(); $store = $user->store; + if (!$store) { + throw new RuntimeException('没有绑定门店'); + } $date = now(); // 是否允许打卡 - $enable = true; + $enable = false; // 上班/下班 打卡, 当天是否打卡 $time = EmployeeSignLog::filter(['date' => $date->format('Y-m-d')])->exists() ? SignTime::Afternoon : SignTime::Morning; // 根据定位的距离判断, 是否外勤 - $maxDistance = AdminSettingService::make()->arrayGet('sign', 'distance'); + $maxDistance = AdminSettingService::make()->arrayGet('sign', 'distance', 0); $type = SignType::Outside; $distance = null; - $description = '当前位置不在考勤范围内,请选择外勤打卡'; - if ($request->filled(['lon', 'lat']) && $store && $maxDistance) { + $description = '请打开手机定位, 并给予APP获取位置信息权限'; + if ($request->filled(['lon', 'lat'])) { $distance = $service->haversineDistance($request->input('lat'), $request->input('lon'), $store->lat, $store->lon); if ($distance <= $maxDistance) { + $enable = true; $description = '已进入考勤范围: ' . $store->title; $type = SignType::Normal; } else { - $enable = false; + $description = '当前位置不在考勤范围内, 请选择外勤打卡'; } } @@ -71,16 +75,30 @@ class SignController extends Controller public function store(Request $request, EmployeeSignService $service) { $request->validate([ - 'type' => ['required'], - 'time' => ['required'], + 'type' => ['required', Rule::enum(SignType::class)], + 'time' => ['required', Rule::enum(SignTime::class)], + 'position' => ['required'], + 'position.lon' => ['required'], + 'position.lat' => ['required'], + ], [ + 'type.required' => __('employee_sign_log.sign_type') . '必填', + 'time.required' => __('employee_sign_log.sign_time') . '必填', + 'position.required' => __('employee_sign_log.position') . '必填', + 'position.*.required' => __('employee_sign_log.position') . '必填', ]); $user = $this->guard()->user(); + $store = $user->store; + if (!$store) { + throw new RuntimeException('没有绑定门店'); + } $time = SignTime::from($request->input('time')); $type = SignType::from($request->input('type')); - // 没有定位坐标, 必须是外勤打卡 - if (!$request->filled('position') && $type == SignType::Normal) { - + // 根据定位的距离判断, 是否需要外勤打卡 + $maxDistance = AdminSettingService::make()->arrayGet('sign', 'distance', 0); + $distance = $service->haversineDistance($request->input('position.lat'), $request->input('position.lon'), $store->lat, $store->lon); + if ($distance > $maxDistance && $type == SignType::Normal) { + throw new RuntimeException('当前位置不在考勤范围内, 请选择外勤打卡'); } try { DB::beginTransaction();