You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
6.0 KiB
161 lines
6.0 KiB
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | Niucloud-admin 企业快速开发的多应用管理平台
|
|
// +----------------------------------------------------------------------
|
|
// | 官方网址:https://www.niucloud.com
|
|
// +----------------------------------------------------------------------
|
|
// | niucloud团队 版权所有 开源版本可自由商用
|
|
// +----------------------------------------------------------------------
|
|
// | Author: Niucloud Team
|
|
// +----------------------------------------------------------------------
|
|
|
|
namespace app\api\controller\apiController;
|
|
|
|
use app\Request;
|
|
use app\service\admin\campus\CampusService;
|
|
use app\service\api\apiService\AttendanceService;
|
|
use app\service\api\apiService\CommonService;
|
|
use core\base\BaseApiService;
|
|
|
|
/**
|
|
* 员工考勤控制器相关接口
|
|
* Class Personnel
|
|
* @package app\api\controller\apiController
|
|
*/
|
|
class Attendance extends BaseApiService
|
|
{
|
|
|
|
//列表
|
|
public function index(Request $request){
|
|
|
|
$where = [
|
|
'campus_id' => $request->param('campus_id', ''),//
|
|
'staff_id' => $request->param('staff_id', ''),//
|
|
'attendance_date' => $request->param('attendance_date', ''),//
|
|
'status' => $request->param('status', ''),//
|
|
'status_arr' => $request->param('status_arr', []),//
|
|
];
|
|
|
|
$res = (new AttendanceService())->getList($where);
|
|
return success($res);
|
|
}
|
|
|
|
//员工考勤-编辑(员工打卡/请假/签退)
|
|
public function edit(Request $request){
|
|
$campus_id =$request->param('campus_id','');//校区ID
|
|
$staff_id =$this->member_id;//人员ID
|
|
$attendance_date =$request->param('attendance_date','');//考勤日期
|
|
$remarks =$request->param('remarks','');//备注
|
|
$status =$request->param('status','');//考勤状态: present-出勤, absent-缺勤, late-迟到, leave_early-早退,leave-请假,sign_out-签退
|
|
$longitude = $request->param('longitude','');//经度
|
|
$latitude = $request->param('latitude','');//纬度
|
|
$coordinate = '';//坐标
|
|
if(!empty($longitude) && !empty($latitude)){
|
|
$coordinate = "{$longitude},{$latitude}";
|
|
}else{
|
|
return fail('缺少定位坐标');
|
|
}
|
|
|
|
if(empty($campus_id) || empty($attendance_date) || empty($status)){
|
|
return fail('缺少参数');
|
|
}
|
|
if(!in_array($status,['present','absent','late','leave_early','leave','sign_out'])){
|
|
return fail('状态类型不正确');
|
|
}
|
|
|
|
//获取校区的经纬度坐标
|
|
$campus_data = (new CampusService)->getInfo($campus_id);//查校区详情
|
|
$campus_lng = $campus_data['campus_coordinates']['lng'];//校区经度坐标
|
|
$campus_lat = $campus_data['campus_coordinates']['lat'];//校区纬度坐标
|
|
$radius = 1500.0;//打卡半径(米)
|
|
|
|
//判断签到+签退时是否超出打卡范围
|
|
if(in_array($status,['present','sign_out'])){
|
|
$isInCheckRange = (new CommonService())->isInCheckRange((float)$campus_lng, (float)$campus_lat, (float)$longitude, (float)$latitude, (float)$radius);
|
|
if(!$isInCheckRange){
|
|
return fail("超出打卡范围,规定打卡范围({$radius}米)");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//查询数据是否存在,一天一个校区同一个人只能产生一条数据
|
|
$date_h = date('H:i:s');
|
|
|
|
$obj = (new AttendanceService());
|
|
$info = $obj->info([
|
|
'campus_id'=>$campus_id,
|
|
'staff_id'=>$staff_id,
|
|
'attendance_date'=>$attendance_date,
|
|
])['data'];
|
|
|
|
//如果是签退的时候就是修改
|
|
if($status == 'sign_out'){
|
|
|
|
if (($info['status'] ?? '') != 'present') {
|
|
return fail('未查询到今日签到信息,无法签退');
|
|
}
|
|
|
|
//签退的情况
|
|
$where = [
|
|
'id'=>$info['id']
|
|
];
|
|
$data = [
|
|
'check_out_time'=>$date_h,//签退时间
|
|
'coordinate'=>$coordinate,//坐标|经度,纬度
|
|
];
|
|
//执行修改操作
|
|
$res = $obj->editData($where,$data);
|
|
}else{
|
|
//如果是签到/请假
|
|
$data = [
|
|
'campus_id'=>$campus_id,//校区ID
|
|
'staff_id'=>$staff_id,//人员ID
|
|
'attendance_date'=>$attendance_date,//考勤日期
|
|
'coordinate'=>$coordinate,//坐标|经度,纬度
|
|
'status'=>$status,//考勤状态
|
|
];
|
|
//如果是签到的情况
|
|
if($info){
|
|
if($status == 'present' && $info['status'] == 'present'){
|
|
//更新签到数据
|
|
//执行修改操作
|
|
$edit_data = [
|
|
'check_in_time'=>$date_h,//签到时间
|
|
'coordinate'=>$coordinate,//坐标|经度,纬度
|
|
'status'=>$status//考勤状态
|
|
];
|
|
$res = $obj->editData(['id'=>$info['id']],$edit_data);
|
|
if(!$res['code']){
|
|
return fail($res['msg']);
|
|
}
|
|
return success($res['data']);
|
|
}
|
|
$status_arr = (new \app\model\attendance\Attendance())::STATUS;
|
|
$status_name = $status_arr[$info['status']] ?? '';
|
|
if(!$status_name){
|
|
$status_name = '考勤';
|
|
}
|
|
return fail("今日已{$status_name}重复操作");
|
|
}else{
|
|
$data['check_in_time'] = $date_h;//签到时间
|
|
if($remarks){
|
|
$data['remarks'] = $remarks;
|
|
}
|
|
//执行创建操作
|
|
$res = $obj->addData($data);
|
|
if(!$res['code']){
|
|
return fail($res['msg']);
|
|
}
|
|
return success($res['data']);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|