From 655c2fa1d8ffbd5f9a1decefee7ef03ebca20922 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Wed, 1 May 2024 13:36:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8D=A1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Controllers/SettingController.php | 2 +- app/Admin/Services/EmployeeSignService.php | 14 +++++++------- app/Http/Controllers/Api/Hr/SignController.php | 18 ++++++++++++++---- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/app/Admin/Controllers/SettingController.php b/app/Admin/Controllers/SettingController.php index a3c2f89..bb39508 100644 --- a/app/Admin/Controllers/SettingController.php +++ b/app/Admin/Controllers/SettingController.php @@ -40,7 +40,7 @@ class SettingController extends AdminController amis()->SwitchControl('oss_config.use_ssl', '开启SSL')->value(false)->visibleOn('${upload_disk == "oss"}'), ]), Tab::make()->title('打卡设置')->body([ - amisMake()->NumberControl()->min(0)->name('sign.distance')->label('允许打卡的距离(公里)') + amis()->NumberControl()->min(0)->name('sign.distance')->label('允许打卡的距离(米)') ]), ]) ); diff --git a/app/Admin/Services/EmployeeSignService.php b/app/Admin/Services/EmployeeSignService.php index 0f6b622..a924554 100644 --- a/app/Admin/Services/EmployeeSignService.php +++ b/app/Admin/Services/EmployeeSignService.php @@ -91,7 +91,7 @@ class EmployeeSignService extends BaseService /** * 打卡 - * + * * @param Employee $user 用户 * @param SignTime $time 上班/下班 打卡 * @param mixed $date 打卡时间 @@ -147,28 +147,28 @@ class EmployeeSignService extends BaseService } /** - * 计算两点之间的距离(千米) + * 计算两点之间的距离(米) */ public function haversineDistance($lat1, $lon1, $lat2, $lon2) { // 地球半径(千米) $R = 6371; - + // 将角度转换为弧度 $lat1 = deg2rad($lat1); $lon1 = deg2rad($lon1); $lat2 = deg2rad($lat2); $lon2 = deg2rad($lon2); - + // 经纬度差值 $dlon = $lon2 - $lon1; $dlat = $lat2 - $lat1; - + // Calculate the Haversine formula $a = pow(sin($dlat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($dlon/2), 2); $c = 2 * atan2(sqrt($a), sqrt(1-$a)); $distance = $R * $c; - - return floor($distance * 1000) / 1000; + + return floor($distance * 1000); } } diff --git a/app/Http/Controllers/Api/Hr/SignController.php b/app/Http/Controllers/Api/Hr/SignController.php index 7bb76a1..265de35 100644 --- a/app/Http/Controllers/Api/Hr/SignController.php +++ b/app/Http/Controllers/Api/Hr/SignController.php @@ -95,11 +95,21 @@ class SignController extends Controller $type = SignType::from($request->input('type')); // 根据定位的距离判断, 是否需要外勤打卡 - $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('当前位置不在考勤范围内, 请选择外勤打卡'); + $maxDistance = (int) AdminSettingService::make()->arrayGet('sign', 'distance'); + + if ($maxDistance > 0 && $type == SignType::Normal) { + $distance = $service->haversineDistance( + $request->input('position.lat'), + $request->input('position.lon'), + $store->lat, + $store->lon, + ); + + if ($distance > $maxDistance) { + throw new RuntimeException('当前位置不在考勤范围内, 请选择外勤打卡'); + } } + try { DB::beginTransaction(); if (!$service->signDay($user, $time, now(), $request->only(['remarks', 'position', 'type']))) {