where('key',$where['key']); } $res = $model->field($field)->find();//员工信息 if($res){ $res = $res->toArray(); }else{ $res = []; } return $res; } /** * 对比新旧数据改变 * @param array $old_data 旧数据 * @param array $new_data 新数据 * @param array $ignoreFields 忽略验证的字段|默认[] * @return array */ public function compareData(array $old_data, array $new_data, array $ignoreFields = ['updated_at']) { $changedFields = [];//改了那些字段 $oldChanges = [];//数据修改前的样子 $newChanges = [];//数据修改后的样子 foreach ($new_data as $key => $value) { // 如果字段在忽略列表中,则跳过 if (in_array($key, $ignoreFields)) { continue; } if (!isset($old_data[$key]) || $old_data[$key] != $value) { $changedFields[] = $key; $oldChanges[$key] = $old_data[$key] ?? null; $newChanges[$key] = $value; } } return [ 'changed_fields' => $changedFields, 'old_values' => $oldChanges, 'new_values' => $newChanges, 'changed_fields_json' => json_encode($changedFields, JSON_UNESCAPED_UNICODE), 'old_values_json' => json_encode($oldChanges, JSON_UNESCAPED_UNICODE), 'new_values_json' => json_encode($newChanges, JSON_UNESCAPED_UNICODE) ]; } /** * 判断是否在打卡范围内 * @param float $campusLat 地理围栏中心纬度 * @param float $campusLng 地理围栏中心经度 * @param float $checkLat 打卡纬度 * @param float $checkLng 打卡经度 * @param float $radius 地理围栏半径(单位:米) * @return bool 返回是否在范围内的布尔值 */ public function isInCheckRange(float $campusLat, float $campusLng, float $checkLat, float $checkLng, float $radius = 3000.0): bool { // 使用 Haversine 公式计算两点之间的距离 $earthRadius = 6371000; // 地球半径,单位为米 $latFrom = deg2rad($campusLat); $lngFrom = deg2rad($campusLng); $latTo = deg2rad($checkLat); $lngTo = deg2rad($checkLng); $latDelta = $latTo - $latFrom; $lngDelta = $lngTo - $lngFrom; $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) + cos($latFrom) * cos($latTo) * pow(sin($lngDelta / 2), 2))); $distance = $angle * $earthRadius; // 判断计算出的距离是否小于等于设定的围栏半径 return $distance <= $radius;//false=超出打卡范围 } }