601,'msg'=>'缺少必要参数','data'=>'']);
} else{
// echo 'what happend';
}
$all_time = explode('至',$set_time);
if(count($all_time) <2){
return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
}
$start_time = intval(str_replace('-','',$all_time[0]));
$end_time = intval(str_replace('-','',$all_time[1]));
$first_day = strtotime($all_time[0]);
// DB::enableQueryLog();
$sche_dule = Schedule::whereBetween('schedule_day',[$start_time,$end_time])
->where(['docter_id'=>$docter_id])
->pluck('id')
->toArray();
// echo '
';
// print_r(DB::getQueryLog());
// echo '
';
//dd($sche_dule);
$sche_dule_arr =[
[
'date'=>"上午",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"下午",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"晚上",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
]
];
//周字段映射
$week_arr = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];
//时段区间id
$schedule_config = SystemConfig::get('docter_config');
$times[] = TimePeriod::where('start_time_period','>=',$schedule_config['morning_start'])->where('end_time_period','<=',$schedule_config['morning_end'])->pluck('id')->toArray();
$times[] = TimePeriod::where('start_time_period','>=',$schedule_config['afternoon_start'])->where('end_time_period','<=',$schedule_config['afternoon_end'])->pluck('id')->toArray();
$times[] = TimePeriod::where('start_time_period','>=',$schedule_config['evening_start'])->where('end_time_period','<=',$schedule_config['evening_end'])->pluck('id')->toArray();
if(empty($sche_dule)){
return ['status'=>200,'msg'=>'ok','data'=>['docter'=>$sche_dule_arr,'org_id'=>$org_id,'docter_id'=>$docter_id]];
}
$role = 2;
if($role == 1){
$ids = DocterOrganization::where(['organization_id'=>$org_id])->pluck('docter_id');
$list = Docter::whereIn('id',$ids)->get(['id as value','name as label'])->toArray();
$name = Organization::where('id',$docter_id)->value('name');
$user_id = $org_id;
for ($i = 1; $i<7; $i++){
$str_time = date('Y-m-d',($first_day + $i * 86400));
for($j=0;$j<3;$j++){
//检测上午
$is_mo_have = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
->where('organization_id','!=',$org_id)->count();
['schedule_id'=>$sche_dule,'schedule_date'=>$str_time,'organization_id'=>$org_id,'docter_id'=>$docter_id];
$is_self = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
->where('organization_id',$org_id)->count();
if($is_self){
$sche_dule_arr[$j][$week_arr[$i]] = true;
}
if($is_mo_have){
$sche_dule_arr[$j][$week_arr[$i]] = 'other';
}
}
}
} else {
$ids = DocterOrganization::where(['docter_id'=>$docter_id])->pluck('organization_id');
$list = Organization::whereIn('id',$ids)->get(['id as value','name as label'])->toArray();
$name = Docter::where('id',$docter_id)->value('name');
$user_id = $docter_id;
for ($i=0; $i<=6; $i++){
$str_time = date('Y-m-d',($first_day + $i * 86400));
for($j=0;$j<=2;$j++){
//检测上午
$is_mo_have = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
->where('organization_id','!=',$org_id)->where('docter_id','=',$docter_id)->count();
$is_mo_self = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
->where('organization_id',$org_id)->where('docter_id',$docter_id)->count();
if($is_mo_self){
$sche_dule_arr[$j][$week_arr[$i]] = true;
}
if($is_mo_have){
$sche_dule_arr[$j][$week_arr[$i]] = 'other';
}
}
}
}
// "morning_start" => "09:00"
// "morning_end" => "12:00"
// "afternoon_start" => "13:00"
// "afternoon_end" => "18:00"
// "evening_start" => "19:00"
// "evening_end" => "20:00"
$data['docter'] = $sche_dule_arr;
$data['name'] = $name;
// $data['list'] = $list;
$data['role'] = $role;
$data['user_id'] = $user_id;
return (json_encode(['code'=>200,'msg'=>'ok','data'=>$data]));
}
//获取周排班
public function getComSchedule(){
$docter_id = request('docter_id',1);
$org_id = request('org_id',1);
$type = request('type',2);
$role = request('role',2);
if(empty($docter_id) || empty($type)){
return apiReturn(604,'缺少必要参数');
}
$docter_id = 1;
$docter_setting = DocterSetting::where(['docter_id'=>$docter_id,'type'=>$type])->first();
$times = [];
if(!empty($docter_setting)){
$time_period = object_array(json_decode($docter_setting->service_time));
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[0]['startTime']),intval($time_period[0]['endTime'])])->pluck('id')->toArray();
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[1]['startTime']),intval($time_period[1]['endTime'])])->pluck('id')->toArray();
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[2]['startTime']),intval($time_period[2]['endTime'])])->pluck('id')->toArray();
}
if(count($times) < 3){
dd('no have times');
}
//周字段映射
$week_arr = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];
$data = [
[
'date'=>"上午",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"下午",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"晚上",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
]
];
if($role == 2){
for ($i=0;$i<6;$i++){
for($j=0;$j<=2;$j++){
$is_self_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'organization_id'=>$org_id,'week'=>$i+1])->whereIn('time_period_id',$times[$j])->count();
$is_other_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'week'=>$i+1])->where('organization_id','!=',$org_id)->whereIn('time_period_id',$times[$j])->count();
if($is_self_have){
$data[$j][$week_arr[$i]] = true;
}
if($is_other_have){
$data[$j][$week_arr[$i]] = 'other';
}
}
}
} else {
for ($i=0;$i<6;$i++){
for($j=0;$j<=2;$j++){
$is_self_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'organization_id'=>$org_id,'week'=>$i+1])->whereIn('time_period_id',$times[$j])->count();
$is_other_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'week'=>$i+1])->where('docter_id','!=',$docter_id)->whereIn('time_period_id',$times[$j])->count();
if($is_self_have){
$data[$j][$week_arr[$i]] = true;
}
if($is_other_have){
$data[$j][$week_arr[$i]] = 'other';
}
}
}
}
$name = Docter::where('id',$docter_id)->value('name');
$shcedule_data['docter'] = $data;
$shcedule_data['name'] = $name;
$shcedule_data['role'] = $role;
$shcedule_data['user_id'] = $docter_id;
return apiReturn(200,'ok',$shcedule_data);
}
//编辑排班
public function setDocCheduleback()
{
$docter_id = request('docter_id');
$org_id = request('org_id');
$set_time = request('time');
$data = request('schedulingtime');
// $set_time = '2020-12-07至2020-12-13';
if(empty($set_time) || empty($org_id) || empty($docter_id)){
return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
}
$all_time = explode('至',$set_time);
$schedule_id = Schedule::where(['organization_id'=>$org_id,'docter_id'=>$docter_id,'schedule_date'=>$all_time[0]])->value('id');
if(count($all_time) <2) {
return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
}
$start_time = intval(str_replace('-','',$all_time[0]));
$end_time = intval(str_replace('-','',$all_time[1]));
$first_day = strtotime($start_time);
//周字段映射
$week_arr = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];
$data = [
[
'date'=>"上午",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>true,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"下午",
'monday'=>false,
'tuesday'=>true,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"晚上",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>true,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
]
];
//时段区间id
$schedule_config = SystemConfig::get('docter_config');
$times[1] = TimePeriod::where('start_time_period','>=',$schedule_config['morning_start'])
->where('end_time_period','<=',$schedule_config['morning_end'])
->pluck('id')->toArray();
$times[2] = TimePeriod::where('start_time_period','>=',$schedule_config['afternoon_start'])
->where('end_time_period','<=',$schedule_config['afternoon_end'])
->pluck('id')->toArray();
$times[3] = TimePeriod::where('start_time_period','>=',$schedule_config['evening_start'])
->where('end_time_period','<=',$schedule_config['evening_end'])
->pluck('id')->toArray();
foreach ($times as $val){
foreach ($val as $t){
$time_period[] = $t;
}
}
$data[0] = array_values(object_array(json_decode($data[0])));
$data[1] = array_values(object_array(json_decode($data[1])));
$data[2] = array_values(object_array(json_decode($data[2])));
$mo_schedule = array_values($data[0]);
$af_schedule = array_values($data[1]);
$ev_schedule = array_values($data[2]);
DB::beginTransaction();
try {
$schedule_insert = [
'organization_id'=>$org_id,
'docter_id'=>$docter_id,
'schedule_date'=>$all_time[0],
'schedule_day'=>$start_time,
'created_at'=>Carbon::now(),
'updated_at'=>Carbon::now(),
];
if(!$schedule_id){
$schedule_id = Schedule::insertGetId($schedule_insert);
}
unset($schedule_insert['schedule_day']);
$schedule_insert['schedule_id'] =$schedule_id;
$info = [];
for ($i = 1 ;$i<=3;$i++){
$mo_schedule = array_values($data[$i-1]);
foreach ($mo_schedule as $key=>$val){
if($key==0) continue;
$schedule_date = $start_time + $key;
$strtime = "$schedule_date";
$time_insert = $schedule_insert;
$time_insert['type'] = $i;
$schedule_time = $times[$i];
$real_time = date('Y-m-d',($first_day + ($key-1)*86400));
$time_insert['schedule_date'] = $real_time;
$time_insert['me_sure'] = 1;
if($val == true){
$data['schedule_date'] = $start_time ;
foreach ($schedule_time as $time_id){
$is_have = SchedulePeriod::where(['time_period_id'=>$time_id,'type'=>($i),'docter_id'=>$docter_id,'schedule_date'=>$real_time,'organization_id'=>$org_id,'docter_id'=>$docter_id,'schedule_id'=>$schedule_id])->value('id');
if($is_have) break;
$time_insert['time_period_id'] = $time_id;
$info[] = $time_insert;
SchedulePeriod::insert($time_insert);
}
} else {
$data['schedule_date'] = $start_time;
foreach ($schedule_time as $time_id){
$is_have = SchedulePeriod::where(['time_period_id'=>$time_id,'type'=>($i),'docter_id'=>$docter_id,'schedule_date'=>$real_time,'organization_id'=>$org_id,'docter_id'=>$docter_id,'schedule_id'=>$schedule_id])->value('id');
if($is_have) SchedulePeriod::where(['time_period_id'=>$time_id,'type'=>($i),'docter_id'=>$docter_id,'schedule_date'=>$real_time,'organization_id'=>$org_id,'docter_id'=>$docter_id,'schedule_id'=>$schedule_id])->delete();
}
}
}
}
DB::commit();
} catch (Exception $e){
DB::rollBack();
Log::info($e->getMessage());
}
return json_encode(['status'=>200,'msg'=>'插入成功','data'=>count($info)]);
}
public function setDocChedule()
{
$docter_id = request('docter_id',1);
$org_id = request('org_id',1);
$type = request('type',2);
if(empty($docter_id) || empty($org_id) || empty($type)){
return apiReturn(601,'缺少必要参数');
}
$data = request('schedulingtime');
if(empty($org_id) || empty($docter_id) || $data){
return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
}
$docter_setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
// $data = [
// [
// 'date'=>"上午",
// 'monday'=>false,
// 'tuesday'=>true,
// 'wednesday'=>false,
// 'thursday'=>false,
// 'friday'=>true,
// 'saturday'=>false,
// 'sunday'=>false,
// ],
// [
// 'date'=>"下午",
// 'monday'=>false,
// 'tuesday'=>false,
// 'wednesday'=>false,
// 'thursday'=>false,
// 'friday'=>false,
// 'saturday'=>true,
// 'sunday'=>false,
// ],
// [
// 'date'=>"晚上",
// 'monday'=>true,
// 'tuesday'=>true,
// 'wednesday'=>false,
// 'thursday'=>false,
// 'friday'=>false,
// 'saturday'=>false,
// 'sunday'=>false,
// ]
// ];
if(!empty($docter_setting)){
$time_period = object_array(json_decode($docter_setting->service_time));
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[0]['startTime']),intval($time_period[0]['endTime'])])->pluck('id')->toArray();
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[1]['startTime']),intval($time_period[1]['endTime'])])->pluck('id')->toArray();
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[2]['startTime']),intval($time_period[2]['endTime'])])->pluck('id')->toArray();
}
$week_data = [
'schedule_type'=>$type,
'organization_id'=>$org_id,
'docter_id'=>$docter_id
];
$k = 0;
DB::beginTransaction();
$data[0] = array_values(object_array(json_decode($data[0])));
$data[1] = array_values(object_array(json_decode($data[1])));
$data[2] = array_values(object_array(json_decode($data[2])));
// $data[0] = array_values($data[0]);
// $data[1] = array_values($data[1]);
// $data[2] = array_values($data[2]);
try {
for($i=0;$i<=2;$i++){
$schedule_data = $data[$i];
foreach ($schedule_data as $key=>$schedule){
if($key == 0) continue;
$week_data ['type'] = $i+1;
$week_data ['week'] = $key;
if($schedule == true){
// echo '时间列类型'.($i+1).'----'.$key.'星期数'.'
';
foreach ($times[$i] as $id){
$week_data['time_period_id'] = $id;
$is_have = WeekSchedule::where(['docter_id'=>$docter_id,'organization_id'=>$org_id,'schedule_type'=>$type,'type'=>$i+1,'week'=>$key])->where('time_period_id',$id)->value('id');
$is = $is_have?'有':'沒有';
// echo '时间段id'.$id.'----'.$is.'';
if($is_have) continue;
$k++;
WeekSchedule::insert($week_data);
}
} else {
$is_have = WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i+1,'week'=>$key])->whereIn('time_period_id', $times[$i])->value('id');
if($is_have) WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i+1,'week'=>$key])->whereIn('time_period_id', $times[$i])->delete();
}
}
}
DB::commit();
} catch (\Exception $e){
DB::rollBack();
return apiReturn(602,$e->getLine().'行'.$e->getMessage());
}
return apiReturn(200,'ok',$k);
}
//设置自己排班
public function setSelfSchedule()
{
//todo 记得把默认值取消
$docter_id = request('docter_id',0);
$org_id = request('org_id',0);
$date = request('date');
$type = request('type','1,2'); //1 上午,2 下午,3 晚上
$schedule_type = request('schedule_type',1);
$Ttype = 1;
if($schedule_type == 1) $Ttype = 2;
$self_setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
$times = [];
if(!empty($self_setting)){
$time_period = object_array(json_decode($self_setting->service_time));
$where = ['docter_id'=>$docter_id,'type'=>$Ttype];
if($Ttype == 1){
$where['org_id'] = $org_id;
}
// dd($time_period);
$times[1] = TimePeriod::where($where)->whereBetween('end_time_period',[intval($time_period[1]['amStartTime']),intval($time_period[1]['amEndTime'])])->pluck('id')->toArray();
$times[2] = TimePeriod::where($where)->whereBetween('end_time_period',[intval($time_period[2]['pmStartTime']),intval($time_period[2]['pmEndTime'])])->pluck('id')->toArray();
$times[3] = TimePeriod::where($where)->whereBetween('end_time_period',[intval($time_period[3]['nightStartTime']),intval($time_period[3]['nightEndTime'])])->pluck('id')->toArray();
}
if(count($times) <3){
return apiReturn(602,'请设置真确的时间段');
}
if(empty($docter_id) || empty($org_id) || empty('date') || empty($type) || empty($schedule_type)){
return apiReturn(601,'缺少必要参数');
}
if(strtotime($date) < strtotime('tomorrow')){
return apiReturn(602,'只能排明天以後的');
}
$week = date("w",strtotime($date));
$types = explode(',',$type);
if(!empty($types)){
foreach ($types as $t){
$self_schedule = [
'schedule_date'=>$date,
'week'=>intval($week),
'schedule_type'=>$schedule_type,
'organization_id'=>$org_id,
'docter_id'=>$docter_id,
'type'=>intval($t)
];
foreach ($times[intval($t)] as $id){
$self_schedule['time_period_id'] = $id;
$is_have = SelfSchedule::where(['docter_id'=>$docter_id,'organization_id'=>$org_id,'schedule_date'=>$date,'type'=>intval($t),'week'=>$week,'time_period_id'=>$id])->value('id');
if($is_have) continue;
SelfSchedule::insert($self_schedule);
}
}
$cha = array_diff([1,2,3],$types);
foreach ($cha as $t){
SelfSchedule::where(['docter_id'=>$docter_id,'organization_id'=>$org_id,'schedule_date'=>$date,'type'=>intval($t)])->delete();
}
}
return apiReturn(200,'ok');
}
//更新用戶設置
public function updateDocterSetting()
{
$docter_id = intval(request('docter_id'));
$configData = request('configData');
$type = intval(request('type'));//医生类型 1 机构 2 医生
$org_id = intval(request('org_id'));
$configData = object_array(json_decode($configData));
if(empty($docter_id) || empty($configData)){
return apiReturn(604,'参数错误');
}
$setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
if($type != 1){
$setting = OrganizationSettings::where(['org_id'=>$org_id])->first();
}
if(empty($setting)){
}
$self_config = object_array(json_decode($setting['service_time']));
//改变时间段
$changeTimer = [];
//是否改变了服务时长
$changeSeviceTime = false;
//同时服务人数
$serviceNum = intval($configData['serviceNum']);
//服务时长
$serviceTime = intval($configData['timeSpan']);
if(empty($setting) || $serviceTime != intval($setting['service_times'])){
$changeSeviceTime = true;
$changeTimer = [1,2,3];
} else {
if($configData['amStartTime'] !== $self_config[1]['amStartTime'] || $configData['amEndTime'] !== $self_config[1]['amEndTime']){
$changeTimer[] = 1;
}
if($configData['pmStartTime'] !== $self_config[2]['pmStartTime'] || $configData['pmEndTime'] !== $self_config[2]['pmEndTime']){
$changeTimer[] = 2;
}
if($configData['nightStartTime'] !== $self_config[3]['nightStartTime'] || $configData['nightEndTime'] !== $self_config[3]['nightEndTime']){
$changeTimer[] = 3;
}
}
//添加时间段
$countArr = [
1=>$configData['amNum'],
2=>$configData['pmNum'],
3=>$configData['nightNum'],
];
$c_r = [
1=>['count'=>$configData['amNum'],'start_time'=>$configData['amStartTime'],'end_time'=>$configData['amEndTime']],
2=>['count'=>$configData['pmNum'],'start_time'=>$configData['pmStartTime'],'end_time'=>$configData['pmEndTime']],
3=>['count'=>$configData['nightNum'],'start_time'=>$configData['nightStartTime'],'end_time'=>$configData['nightEndTime']]
];
$changeTimer = [1,2,3];
//todo 零时关闭排班功能,后续需要解除
if($changeSeviceTime || !empty($changeTimer)){
foreach ($changeTimer as $tType){
DB::beginTransaction();
try {
//1.删除旧时间段,并删除排班数据
$type == 1 ? $id = $docter_id : $id = $org_id;
//todo 暂时未删除周排班
self::delteScheduleInfo($id,$type);
$count = intval($countArr[$tType] / $serviceNum);
//2.创建新时间段
self::makeTimePeriod($type,$docter_id,$org_id,$tType,$c_r[$tType],$count,$serviceTime);
if($type == 1){
$time_periods = TimePeriod::where(['org_id' => '', 'docter_id' => $docter_id, 'type' => $tType])->pluck('id')->toArray();
$self_schedule = SelfSchedule::where(['docter_id' => $docter_id, 'schedule_type' => $type, 'organization_id'=>0,'type' =>1])->distinct('type')
->orderBy('schedule_date')->get(['schedule_date', 'type', 'week'])->toArray();
$schedule = Schedule::where(['docter_id' => $docter_id, 'organization_id'=>0])->pluck('schedule_date', 'id')->toArray();
$week_schedule = WeekSchedule::where(['docter_id' => $docter_id, 'type' => $tType,'schedule_type'=>$type])
->distinct('type')
->orderBy('week')
->get(['week','organization_id'])
->GroupBy('week')
->toArray();
}
if($type !=1 ){
$time_periods = TimePeriod::where(['org_id' => $org_id, 'docter_id' => 0, 'type' => $tType])->pluck('id')->toArray();
$schedule = Schedule::where(['docter_id' => 0, 'organization_id'=>$org_id])->pluck('schedule_date', 'id')->toArray();
$self_schedule = SelfSchedule::where(['docter_id' => 0, 'schedule_type' => $type,'organization_id'=>$org_id,'type' =>$tType])->distinct('type')
->orderBy('schedule_date')->get(['schedule_date', 'type', 'week'])->toArray();
$week_schedule = WeekSchedule::where(['organization_id' =>$org_id, 'type' => $tType,'schedule_type'=>$type])
->distinct('type')
->orderBy('week')
->pluck('type')
->GroupBy('week')
->toArray();
}
if (empty($week_schedule)) {
// Schedule::where(['docter_id' => $docter_id])->delete();
// SelfSchedule::where(['docter_id' => $docter_id])->delete();
} else {
//3.以周模板添加2个月的数据
self::makeSchedule($docter_id,$org_id,$type,$schedule,$week_schedule,$time_periods);
//4.回复自己设置的排班
self::makeSelfScheeule($docter_id,$org_id,$type,$time_periods,$self_schedule);
}
DB::commit();
} catch (\Exception $e) {
dd($e->getMessage());
DB::rollBack();
}
}
}
// {"1":{"amStartTime":"08:00","amEndTime":"12:00","amPerson":3},"2":{"pmStartTime":"14:00","pmEndTime":"18:00","pmPerson":5},"3":{"nightStartTime":"18:00","nightEndTime":"23:00","nightPerson":4}}
$config = [
1=>['amStartTime'=>$configData['amStartTime'],"amEndTime"=>$configData['amEndTime'],'amPerson'=>$configData['amNum']],
2=>["pmStartTime"=>$configData['pmStartTime'],"pmEndTime"=>$configData['pmEndTime'],'pmPerson'=>$configData['pmNum']],
3=>["nightStartTime"=>$configData['nightStartTime'],"nightEndTime"=>$configData['nightEndTime'],'nightPerson'=>$configData['nightNum']]
];
$setting = [
'docter_id'=>$docter_id,
'type'=>$type,
'status'=>$configData['status'],
'show_days'=>$configData['showDayNumber'],
'service_num'=>$configData['serviceNum'],
'service_times'=>$configData['timeSpan'],
'service_time'=>json_encode($config)
];
//更新配置
if($type == 1){
$is_have = DocterSetting::where(['docter_id'=>$docter_id])->value('id');
if($is_have){
DocterSetting::where(['docter_id'=>$docter_id])->update($setting);
} else {
DocterSetting::insert($setting);
}
} else {
unset($setting['docter_id']);
$setting['org_id'] = $org_id;
$is_have = OrganizationSettings::where(['id'=>$docter_id])->value('id');
if($is_have){
OrganizationSettings::where(['org_id'=>$org_id])->update($setting);
} else {
OrganizationSettings::insert($setting);
}
}
return apiReturn(200,'ok');
}
public function getDocterSetting()
{
$docter_id = intval(request('docter_id'));
$org_id = intval(request('org_id'));
$type = intval(request('type'));
$setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
if($type == 1){
$setting = OrganizationSettings::where(['org_id'=>$org_id])->first();
}
$docterConfig = SystemConfig::get('docter_config');
if(!empty($setting)){
$setting = $setting->toArray();
} else {
$configData = [
'amStartTime'=>$docterConfig['morning_start'],
'amEndTime'=>$docterConfig['morning_end'],
'amNum'=>0,
'pmStartTime'=>$docterConfig['afternoon_start'],
'pmEndTime'=>$docterConfig['afternoon_start'],
'pmNum'=>0,
'nightStartTime'=>$docterConfig['evening_start'],
'nightEndTime'=>$docterConfig['evening_end'],
'nightNum'=>0,
'serviceNum'=>1,
'showDayNumber'=>7,
'status'=>false,
'timeSpan'=>30,
];
return apiReturn(200,'ok',$configData);
}
$config = object_array(json_decode($setting['service_time']));
$status = $setting['status'] ? true: false;
$configData = [
'amEndTime'=>$config[1]['amEndTime'],
'amNum'=>$config[1]['amPerson'],
'amStartTime'=>$config[1]['amStartTime'],
'nightEndTime'=>$config[3]['nightEndTime'],
'nightNum'=>$config[3]['nightPerson'],
'nightStartTime'=>$config[3]['nightStartTime'],
'pmEndTime'=>$config[2]['pmEndTime'],
'pmNum'=>$config[2]['pmPerson'],
'pmStartTime'=>$config[2]['pmStartTime'],
'serviceNum'=>$setting['service_num'],
'showDayNumber'=>$setting['show_days'],
'status'=>$status,
'timeSpan'=>$setting['service_times'],
];
return apiReturn(200,'ok',$configData);
}
//获取用户信息
public function getScheduleInfo()
{
$id = intval(request('id'));
$isDocter = CdmsUsers::where('docter_id',$id)->first();
$isOrg = CdmsUsers::where('org_id',$id)->first();
$org_id = null;
$role = 1;
if(empty($id)){
return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
}
if($isDocter){
$org_id = $isDocter->org_id;
$docter = Docter::where(['id'=>$id])->first();
$role = 2;
} else {
if(!empty($isOrg->org_id)){
$org_id = $isOrg->org_id;
} else {
$role = 0;
}
}
$lists =[];
if($role == 1){
$ids = DocterOrganization::where(['organization_id'=>$org_id])->pluck('docter_id')->toArray();
$list = Docter::whereIn('id',$ids)->distinct('id')->get(['id','name']);
foreach ($list as $val){
$lists[] = ['value'=>$val->id,'label'=>$val->name];
}
$name = Organization::where('id',$org_id)->value('name');
} else if($role == 2){
$ids = DocterOrganization::where(['docter_id'=>$id])->distinct('docter_id')->pluck('organization_id')->toArray();
$list = Organization::whereIn('id',$ids)->get(['id','name']);
foreach ($list as $val){
$lists[] = ['value'=>$val->id,'label'=>$val->name];
}
$name = Docter::where('id',$id)->value('name');
} else {
$name = '';
}
$type = 1;
$data['user_id'] = $id;
$data['name'] = $name;
$data['org_id'] = $org_id;
$data['docter_type'] = 0;
$data['list'] = [];
if(!empty($docter)){
$data['docter_type'] = $docter->type;
if($docter->type == 1){
$data['list'] = $lists;
}
}
$data['role'] = $role;
return (json_encode(['code'=>200,'msg'=>'ok','data'=>$data]));
}
//获取图文订单
public function get_chat_order()
{
$org_id = 1;
$docter_id = request('docter_id');
if(empty($docter_id)){
return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
}
$list = Order::where(['organization_id'=>$org_id,'docter_id'=>$docter_id,'order_status'=>3])->with('orderUser')->distinct('user_id')->get('user_id');
$user_list = [];
foreach ($list as $val){
$user_list[] = [
'id'=>$val->user_id,
'avatar'=>$val->orderUser->avatar,
'name'=>$val->orderUser->nickname,
];
}
$data['docter'] = Docter::where('id',$docter_id)->first(['id','avatar','name']);
$data['order_list'] = $user_list;
return (json_encode(['code'=>200,'msg'=>'ok','data'=>$data]));
}
public function get_month_schedule()
{
$date = request('date');
$org_id = intval(request('org_id'));
$docter_id = intval(request('docter_id'));
$type = intval(request('type'));
$role = intval(request('role'));
$start_time = strtotime($date);
$month_day = date("t",$start_time);
$end_time = ($start_time + $month_day * 86400);
$start_date = date('Y-m-d',$start_time);
$end_date = date('Y-m-d',$end_time);
$types = [1=>1,2=>2,3=>3];
// if($type == 1){
// $schedule_data = Schedule::where(['docter_id'=>$docter_id,'organization_id'=>0])
// ->whereBetween('schedule_date',[$start_date,$end_date])->pluck('schedule_date','id')->toArray();
// $settingConfig = DocterSetting::where(['docter_id'=>$docter_id])->first();
// $serviceConfig = object_array(json_decode($settingConfig['service_time']));
// } else {
// $schedule_data = Schedule::where(['docter_id'=>0,'organization_id'=>$org_id])->
// whereBetween('schedule_date',[$start_date,$end_date])->pluck('schedule_date','id')->toArray();
// $settingConfig = OrganizationSettings::where(['org_id'=>$org_id])->first();
// $serviceConfig = object_array(json_decode($settingConfig['service_time']));
// }
//
// if(!empty($settingConfig)){
// $baseData = [
// ['status'=>false,'type'=>1,'start'=>$serviceConfig[1]['amStartTime'],'end'=>$serviceConfig[1]['amEndTime']],
// ['status'=>false,'type'=>2,'start'=>$serviceConfig[2]['pmStartTime'],'end'=>$serviceConfig[2]['pmEndTime']],
// ['status'=>false,'type'=>3,'start'=>$serviceConfig[3]['nightStartTime'],'end'=>$serviceConfig[3]['nightEndTime']],
// ];
//
// } else{
// $serviceConfig = '';
// $baseData = [
// ['status'=>false,'type'=>1,'start'=>$serviceConfig[1]['amStartTime'],'end'=>$serviceConfig[1]['amEndTime']],
// ['status'=>false,'type'=>2,'start'=>$serviceConfig[2]['pmStartTime'],'end'=>$serviceConfig[2]['pmEndTime']],
// ['status'=>false,'type'=>3,'start'=>$serviceConfig[3]['nightStartTime'],'end'=>$serviceConfig[3]['nightEndTime']],
// ];
//
// self::baseMonthSchedule($month_day,$baseData);
// return [];
// }
//
// for($i=1;$i<$month_day; $i++){
// //$startKey = date('d',time());
// $week = date('N',$start_time + ($i-1) * 86400);
// $scheduleDate = date('Y-m-d',$start_time + ($i-1) * 86400);
//
// if(empty($schedule_data)){
// $scheduleList[$i] = [
// 'schedulelingList'=>$baseData,
// 'date'=>$scheduleDate,
// 'week'=>$week,
// 'day'=>$scheduleDate
// ];
// } else {
// if($type == 1){
// $today = SchedulePeriod::where(['docter_id'=>$docter_id,'schedule_date'=>$scheduleDate])->where('organization_id','!=',0)->distinct('organization_id')
// ->distinct('type')->get(['organization_id','type'])->GroupBy('type')->toArray();
//
// if(empty($today)){
// $scheduleList[$i] = [
// 'schedulelingList'=>$baseData,
// 'date'=>$scheduleDate,
// 'week'=>$week,
// 'day'=>$scheduleDate
// ];
// } else {
// foreach ($today as $type => $orginfo){
// $orgids = array_column($orginfo,'organization_id');
// $idSum = array_sum($orgids);
// if($org_id == $idSum) $baseData[$type]['status'] = true;
// if($org_id != $idSum) $baseData[$type]['status'] = 'other';
// }
// $scheduleList[] = [
// 'schedulelingList'=>$baseData,
// 'date'=>$scheduleDate,
// 'week'=>$week,
// 'day'=>$scheduleDate
// ];
// }
//
//
// }
// }
//// if(empty( $schedule_data[$scheduleDate])) continue;
//// $schedule_id = $schedule_data[$schedule_data];
// if($type == 1){
// $today = SchedulePeriod::where(['docter_id'=>$docter_id,'schedule_date'=>$scheduleDate])->get(['organization_id','type'])->GroupBy('type');
//
// dd($today);
// }
//// date'=>($i+1),'day'=>$now_date,'schedulelingList'=>$arr,'week'=>$week
//// dd($scheduleList);
//
// }
//
$status = [1=>true,2=>'other',3=>false];
for($i=0;$i<$month_day;$i++){
$now_time = $start_time + $i*86400;
$now_date = date('Y-m-d',$now_time);
$week = date('N',$now_time);
$arr = [
['status'=>false,'type'=>1,'start'=>"09:00",'end'=>'11:30'],
['status'=>true,'type'=>2,'start'=>'13:30','end'=>'16:30'],
['status'=>false,'type'=>3,'start'=>'19:30','end'=>'21:00'],
];
if($i%2 == 0){
$arr = [
['status'=>false,'type'=>1,'start'=>"09:00",'end'=>'11:30'],
['status'=>true,'type'=>2,'start'=>'13:30','end'=>'16:30'],
['status'=>false,'type'=>3,'start'=>'19:30','end'=>'21:00'],
];
}
if($i%3 == 0){
$arr = [
['status'=>true,'type'=>1,'start'=>"09:00",'end'=>'11:30'],
['status'=>'other','type'=>2,'start'=>'13:30','end'=>'16:30'],
['status'=>true,'type'=>3,'start'=>'19:30','end'=>'21:00'],
];
}
if($i%4 == 0){
$arr = [
['status'=>'other','type'=>1,'start'=>"09:00",'end'=>'11:30'],
['status'=>false,'type'=>2,'start'=>'13:30','end'=>'16:30'],
['status'=>false,'type'=>3,'start'=>'19:30','end'=>'21:00'],
];
}
if($i == 14){
$arr = [
['status'=>false,'type'=>1,'start'=>"09:00",'end'=>'11:30'],
['status'=>false,'type'=>2,'start'=>'13:30','end'=>'16:30'],
['status'=>false,'type'=>3,'start'=>'19:30','end'=>'21:00'],
];
}
$all_time[] = ['date'=>($i+1),'day'=>$now_date,'schedulelingList'=>$arr,'week'=>$week];
}
return apiReturn(200,'ok',$all_time);
}
public function set_day_schedule()
{
//todo 上线取消默认值
$schdule_data = request('schedule_data');
$docter_id = intval(request('docter_id'));
$schedule_type = request('type');
$org_id = intval(request('org_id'));
$date = request('date');
//判断排班类型
$schedule_type == 1?$type=2:$type=1;
if(empty($schdule_data) || empty($docter_id) || !isset($org_id) || empty($type)){
return apiReturn(601,'缺少必要参数');
}
//获取医生排班配置
$schedule = object_array(json_decode($schdule_data));
//默认为门诊排班医生配置
$setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
//获取社区排班设置
if($type == 1) $setting = OrganizationSettings::where(['org_id'=>$org_id])->first();
$schdule_data = [
['status'=>true,'type'=>1,'start'=>"09:00",'end'=>'11:30','date'=>15,'week'=>1],
['status'=>true,'type'=>2,'start'=>'13:30','end'=>'16:30','date'=>15,'week'=>1],
['status'=>false,'type'=>3,'start'=>'19:30','end'=>'21:00','date'=>15,'week'=>1],
];
DB::beginTransaction();
try {
foreach ($schdule_data as $t=>$v){
$today = date('Y-m-d',(strtotime($date) + (intval($v['date'])-1) *86400) );
$week = $schdule_data[0]['week'];
$num_date = intval(str_replace('-','',$today));
if($v['status'] == true){
$sche_data = ['organization_id'=>$org_id,'schedule_date'=>$today,'schedule_day'=>$num_date];
//判断是否有排班信息
$s_id = Schedule::where($sche_data)->value('id');
if(!$s_id){
$s_id = Schedule::insertGetId($sche_data);
}
//获取时间段
$timeperiods = TimePeriod::where(['docter_id'=>intval($docter_id),'org_id'=>intval($org_id),'type'=>intval($v['type'])])->pluck('id')->toArray();
if($type == 2){
$timeperiods = TimePeriod::where(['docter_id'=>intval($docter_id),'org_id'=>0,'type'=>intval($v['type'])])->pluck('id')->toArray();
}
foreach ($timeperiods as $id){
$data = [
'organization_id'=>$org_id,
'time_period_id'=>$id,
'week'=>$week,
'type'=>$v['type'],
'schedule_date'=>$today,
'docter_id'=>$docter_id,
];
//检查是否已经有数据
$self_count = SelfSchedule::where($data)->value('id');
if($self_count) continue;
SelfSchedule::insert($data);
}
} else if($v['status'] == false){
$data = [
'organization_id'=>$org_id,
'week'=>$week,
'type'=>$v['type'],
'docter_id'=>$docter_id,
'schedule_date'=>$today
];
//判断是否有自己的排班
$self_count = SelfSchedule::where($data)->count();
if($self_count) SelfSchedule::where($data)->delete();
//检查是否是有周排班
$week_schedule = WeekSchedule::where(['week'=>$week,'docter_id'=>$docter_id,'type'=>intval($v['type']),'organization_id'=>$org_id])->count();
if(!$week_schedule) continue;
//获取排班id
$s_id = Schedule::where(['schedule_date'=>$today,'docter_id'=>$org_id])->value('id');
if(!$s_id) continue;
//删除排班和详细排班数据
Schedule::where(['id'=>$s_id])->delete();
TimePeriod::where(['docter_id'=>$docter_id,'org_id'=>$org_id,'type'=>$t,'schedule_id'=>$s_id])->delete();
}
}
DB::commit();
} catch (\Exception $e){
dd($e->getLine().'行 '.$e->getMessage());
DB::rollBack();
return apiReturn(603,'操作失败');
}
return apiReturn(200,'操作成功');
}
//获取周排班模板
public function getWeekSchedule()
{
$docter_id = intval(request('docter_id'));
$org_id = intval(request('org_id'));
$type = intval(request('type'));
if(empty($docter_id) || empty($type)){
return apiReturn(604,'缺少必要参数');
}
if($type == 1){
$role = 2;
$setting = DocterSetting::where(['docter_id'=>$docter_id,'type'=>$type])->first();
} else {
$role = 1;
$setting = OrganizationSettings::where(['org_id'=>$docter_id])->first();
}
//周字段映射
$week_arr = [1=>'monday',2=>'tuesday',3=>'wednesday',4=>'thursday',5=>'friday',6=>'saturday',7=>'sunday'];
$data = [
[
'date'=>"上午",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"下午",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
],
[
'date'=>"晚上",
'monday'=>false,
'tuesday'=>false,
'wednesday'=>false,
'thursday'=>false,
'friday'=>false,
'saturday'=>false,
'sunday'=>false,
]
];
if($role == 2){
for ($i=0;$i<=7;$i++){
if($i == 0) continue;
for($j=0;$j<=2;$j++){
$is_self_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'organization_id'=>$org_id,'week'=>$i,'type'=>$j+1])->count();
$is_other_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'week'=>$i,'type'=>$j+1])->where('organization_id','!=',$org_id)->count();
if($is_self_have){
$data[$j][$week_arr[$i]] = true;
}
if($is_other_have){
$data[$j][$week_arr[$i]] = 'other';
}
}
}
} else {
for ($i=0;$i<6;$i++){
for($j=0;$j<=2;$j++){
$is_self_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'organization_id'=>$org_id,'week'=>$i+1])->count();
$is_other_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'week'=>$i+1])->where('docter_id','!=',$docter_id)->count();
if($is_self_have){
$data[$j][$week_arr[$i]] = true;
}
if($is_other_have){
$data[$j][$week_arr[$i]] = 'other';
}
}
}
}
$name = Docter::where('id',$docter_id)->value('name');
$shcedule_data['docter'] = $data;
$shcedule_data['name'] = $name;
$shcedule_data['role'] = $role;
$shcedule_data['user_id'] = $docter_id;
return apiReturn(200,'ok',$shcedule_data);
}
//设置周排班模板
public function setWeekSchedule()
{
$docter_id = intval(request('docter_id'));
$org_id = intval(request('org_id'));
$type = intval(request('type')); //排班类型 1门诊 2 儿保 3计免
$data = request('schedulingtime');
if(empty($docter_id) || empty($org_id) || empty($type) || empty($data)){
return apiReturn(601,'缺少必要参数');
}
$docter_setting = [];
if($type == 1){
$docter_setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
} else {
$docter_setting = OrganizationSettings::where(['org_id'=>$org_id])->first();
}
$time = [];
if(!empty($docter_setting)){
$time_period = object_array(json_decode($docter_setting->service_time));
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[1]['amStartTime']),intval($time_period[1]['amEndTime'])])->pluck('id')->toArray();
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[2]['pmStartTime']),intval($time_period[2]['pmEndTime'])])->pluck('id')->toArray();
$times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[3]['nightStartTime']),intval($time_period[3]['nightEndTime'])])->pluck('id')->toArray();
}
//沒有配置就新建
if(empty($docter_setting) || $times){
$docter_config = SystemConfig::get('docter_config');
$amCount = intval(((strtotime($docter_config['morning_end'])) - (strtotime($docter_config['morning_start']))) / ($docter_config['service_time']*60));
$pmCount = intval(((strtotime($docter_config['afternoon_end'])) - (strtotime($docter_config['afternoon_start']))) / ($docter_config['service_time']*60));
$evCount = intval(((strtotime($docter_config['evening_end'])) - (strtotime($docter_config['evening_start']))) / ($docter_config['service_time']*60));
$c_r = [
1=>['count'=>$amCount,'start_time'=>$docter_config['morning_start'],'end_time'=>$docter_config['morning_end']],
2=>['count'=>$pmCount,'start_time'=>$docter_config['afternoon_start'],'end_time'=>$docter_config['afternoon_end']],
3=>['count'=>$evCount,'start_time'=>$docter_config['evening_start'],'end_time'=>$docter_config['evening_end']]
];
if($type == 1){
$setingData = [
'docter_id'=>$docter_id,
'type'=>$type,
'status'=>false,
'show_days'=>7,
'service_time'=>json_encode($c_r),
'service_times'=>30,
];
$isHave = DocterSetting::where($setingData)->count();
if(!$isHave) {
$setingData [ 'created_at']=Carbon::now();
$setingData [ 'updated_at']=Carbon::now();
DocterSetting::insert($setingData);
}
} else {
$setingData = [
'org_id'=>$docter_id,
'type'=>$type,
'status'=>false,
'show_days'=>7,
'service_time'=>json_encode($c_r),
'service_times'=>30,
];
$isHave = OrganizationSettings::where($setingData)->count();
if(!$isHave) {
$setingData [ 'created_at']=Carbon::now();
$setingData [ 'update_at']=Carbon::now();
OrganizationSettings::insert($data);
}
}
foreach ($c_r as $key => $val){
self::makeTimePeriod($type,$docter_id,$org_id,$key,$val,$val['count'],$docter_config['service_time']);
}
}
if($type == 1){
$week_data = [
'organization_id'=>$org_id,
'docter_id'=>$docter_id
];
} else {
$week_data = [
'organization_id'=>$org_id,
'docter_id'=>0
];
}
$week_data ['schedule_type']=$type;
$k = 0;
DB::beginTransaction();
$data[0] = array_values(object_array(json_decode($data[0])));
$data[1] = array_values(object_array(json_decode($data[1])));
$data[2] = array_values(object_array(json_decode($data[2])));
try {
for($i=0;$i<=2;$i++){
$schedule_data = $data[$i];
foreach ($schedule_data as $key=>$schedule){
if($key == 0) continue;
$week_data ['type'] = $i+1;
$week_data ['week'] = $key;
if($schedule == true){
// echo '时间列类型'.($i+1).'----'.$key.'星期数'.'
';
foreach ($times[$i] as $id){
$week_data['time_period_id'] = $id;
if($type == 1){
$is_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'type'=>$i+1,'week'=>$key])->where('time_period_id',$id)->value('id');
} else {
$is_have = WeekSchedule::where(['docter_id'=>0,'schedule_type'=>$type,'type'=>$i+1,'week'=>$key])->where('time_period_id',$id)->value('id');
}
if($is_have) continue;
$k++;
WeekSchedule::insert($week_data);
}
} else {
if($type == 1){
$is_have = WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i+1,'week'=>$key])->whereIn('time_period_id', $times[$i])->value('id');
if($is_have) WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i+1,'week'=>$key])->whereIn('time_period_id', $times[$i])->delete();
} else {
$is_have = WeekSchedule::where(['docter_id' => 0, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i+1,'week'=>$key])->whereIn('time_period_id', $times[$i])->value('id');
if($is_have) WeekSchedule::where(['docter_id' => 0, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i+1,'week'=>$key])->whereIn('time_period_id', $times[$i])->delete();
}
}
}
}
DB::commit();
} catch (\Exception $e){
DB::rollBack();
return apiReturn(602,$e->getLine().'行'.$e->getMessage());
}
return apiReturn(200,'ok',$k);
}
public static function get_cloumn_value($arr,$cloumn,$index=''){
if(!is_array($arr) || count($arr) == 0) return [];
foreach ($arr as $key => $val){
$arr[$key] = array_column($val,$cloumn,$index);
}
return $arr;
}
public function insert_times()
{
$docter_id = intval(request('docter_id',2));
$configData = request('configData');
$type = request('type',1);//医生类型 1 机构 2 医生
$schedule_type = request('schedule_type',1); //排班类型 1门诊 2计免 3儿保
$org_id = intval(request('org_id',1));
// if(empty($docter_id) || empty($configData)){
// return apiReturn(604,'参数错误');
// }
$is_new = [1,2,3];
$setting = DocterSetting::where(['docter_id'=>$docter_id,'type'=>$type])->first()->toArray();
$configData = object_array(json_decode($setting['service_time']));
$c_r = [
1=>['count'=>$configData[1]['amPerson'],'start_time'=>$configData[1]['amStartTime'],'end_time'=>$configData[1]['amEndTime']],
2=>['count'=>$configData[2]['pmPerson'],'start_time'=>$configData[2]['pmStartTime'],'end_time'=>$configData[2]['pmEndTime']],
3=>['count'=>$configData[3]['nightPerson'],'start_time'=>$configData[3]['nightStartTime'],'end_time'=>$configData[3]['nightEndTime']]
];
$configData['timeSpan'] = 30;
if(1==1){
foreach ($is_new as $c){
for($i=1;$i<=$c_r[$c]['count'];$i++){
$evdata = [
'org_id'=>$org_id,
'docter_id'=>$docter_id,
'type'=>$c,
'start_time_period'=> date('H:i',strtotime($c_r[$c]['start_time']) + ($i-1)*$configData['timeSpan']*60),
'end_time_period'=> date('H:i',strtotime($c_r[$c]['start_time']) + $i*$configData['timeSpan']*60),
];
$is_have = TimePeriod::where($evdata)->count();
if($is_have) continue;
TimePeriod::insert($evdata);
}
}
}
$configData = [
'amEndTime'=>"11:30",
'amNum'=>5,
'amStartTime'=>"09:00",
'nightEndTime'=>"20:30",
'nightStartTime'=>"19:00",
'nightNum'=>3,
'pmEndTime'=>"16:00",
'pmNum'=>5,
'pmStartTime'=>"13:30",
'showDayNumber'=>7,
'serviceNum'=>2,
'status'=>false,
'timeSpan'=>30,
];
$config = [
1=>['amStartTime'=>$configData['amStartTime'],"amEndTime"=>$configData['amEndTime'],'amPerson'=>$configData['amNum']],
2=>["pmStartTime"=>$configData['pmStartTime'],"pmEndTime"=>$configData['pmEndTime'],'pmPerson'=>$configData['pmNum']],
3=>["nightStartTime"=>$configData['nightStartTime'],"nightEndTime"=>$configData['nightEndTime'],'nightPerson'=>$configData['nightNum']]
];
$setting = [
'docter_id'=>$docter_id,
'type'=>$type,
'status'=>$configData['status'],
'show_days'=>$configData['showDayNumber'],
'service_num'=>$configData['serviceNum'],
'service_times'=>$configData['timeSpan'],
'service_time'=>json_encode($config)
];
if($is_have){
DocterSetting::where(['docter_id'=>$docter_id])->update($setting);
} else {
DocterSetting::insert($setting);
}
return 'ok';
}
public static function selfSchedule($time_periods,$schedule,$org_id,$docter_id,$type,$week_schedule)
{
if(!is_array($schedule) || count($schedule) <1){
return ;
}
foreach ($schedule as $id => $date) {
$week = intval(date('N', strtotime($date)));
foreach ($week_schedule as $w) {
if ($week == $w) {
foreach ($time_periods as $idt) {
$s_t = [
'organization_id' => $org_id,
'docter_id' => $docter_id,
'type' => $type,
'schedule_date' => $date,
'schedule_id' => $id,
'time_period_id' => $idt
];
$schedule_is_have = SchedulePeriod::where($s_t)->count();
if ($schedule_is_have) continue;
$s_t['created_at'] = Carbon::now();
$s_t['updated_at'] = Carbon::now();
SchedulePeriod::insert($s_t);
}
}
}
}
}
/*
* @param
* $id int 医生或社区id
* $type int 排班类型
* @descript 删除排班数据
*/
public static function delteScheduleInfo($id,$type){
if($type == 1){
TimePeriod::where(['docter_id'=>$id,'type'=>$type])->where('org_id','=',0)->delete();
SchedulePeriod::where(['docter_id'=>$id,'type'=>$type])->where('organization_id','=',0)->delete();
} else {
TimePeriod::where(['org_id'=>$id,'type'=>$type])->where('docter_id','=',0)->delete();
SchedulePeriod::where(['organization_id'=>$id,'type'=>$type])->where('docter_id','=',0)->delete();
}
return true;
}
//插入时间段
public static function makeTimePeriod($scheduleType,$docterId,$orgId,$timeType,$timeConfig,$timerCount,$serviceTime)
{
for($i=1;$i<=$timerCount;$i++){
$timePreiod = [
'org_id'=>$orgId,
'docter_id'=>$docterId,
'type'=>$timeType,
'start_time_period'=> date('H:i',strtotime($timeConfig['start_time']) + ($i-1)*$serviceTime*60),
'end_time_period'=> date('H:i',strtotime($timeConfig['start_time']) + $i*$serviceTime*60),
];
if($scheduleType == 1){
$timePreiod['org_id'] = 0;
$timePreiod['docter_id'] = $docterId;
} else {
$timePreiod['docter_id'] = 0;
$timePreiod['org_id'] = $orgId;
}
$isHave = TimePeriod::where($timePreiod)->count();
if($isHave) continue;
TimePeriod::insert($timePreiod);
}
return true;
}
//以周模板进行排班
public static function makeSchedule ($docterId,$orgId,$type,$schedule,$weekSchedule,$timePeriods){
if(empty($schedule) || count($schedule) < 58){
$start = strtotime(date('Y-m-1',time()));
$today = date('j',time());
$allDay = date('t',time());
//门诊排班
if($type == 1){
$scheduleData['docter_id']=$docterId;
$scheduleData['organization_id']= 0;
} else {
$scheduleData['docter_id']=0;
$scheduleData['organization_id']= $orgId;
}
//第一个月
for ($i=$today;$i<=$allDay;$i++){
$todayTimer = $start + (($i - 1) *86400);
$week = date('N',$todayTimer);
$date = date('Y-m-d',$todayTimer);
$numDate = date('Ymd',$todayTimer);
$scheduleData['schedule_date'] = $date;
$scheduleData['schedule_day'] = $numDate;
$scheduleIsHave = Schedule::where($scheduleData)->count();
if ($scheduleIsHave) continue;
Schedule::insertGetId($scheduleData);
}
$nextStart = strtotime(date('Y-m-1',strtotime('next month')));
$nextAllDay = date('t',strtotime('nex month'));
//第二个月
for($j=1;$j<=$nextAllDay;$j++){
$todayTimer = $nextStart + (($j-1)*86400);
$week = date('N',$todayTimer);
$date = date('Y-m-d',$todayTimer);
$numDate = date('Ymd',$todayTimer);
$scheduleData['schedule_date'] = $date;
$scheduleData['schedule_day'] = $numDate;
$scheduleIsHave = Schedule::where($scheduleData)->count();
if ($scheduleIsHave) continue;
Schedule::insertGetId($scheduleData);
}
$schedule = Schedule::where(['docter_id'=>$docterId,'organization_id'=>0])->where('schedule_date','>',date('Y-m-d',time()))
->distinct('schedule_date')->pluck('schedule_date','id')->toArray();
if($type == 2){
$schedule = Schedule::where(['docter_id'=>0,'organization_id'=>$orgId])->where('schedule_date','>',date('Y-m-d',time()))
->distinct('schedule_date')->pluck('schedule_date','id')->toArray();
}
}
foreach ($schedule as $id => $date) {
$week = intval(date('N', strtotime($date)));
foreach ($weekSchedule as $w) {
//门诊和儿保,计免排班分开
if($type == 1){
$realWeek = $w[0]['week'];
$oId = $w = $w[0]['organization_id'];
} else {
$realWeek = $w;
$oId = $orgId;
}
if ($week == $realWeek) {
foreach ($timePeriods as $idt) {
$s_t = [
'organization_id' => $oId,
'docter_id' => $docterId,
'type' => $type,
'schedule_date' => $date,
'schedule_id' => $id,
'time_period_id' => $idt
];
$scheduleIsHave = SchedulePeriod::where($s_t)->count();
if ($scheduleIsHave) continue;
$s_t['created_at'] = Carbon::now();
$s_t['updated_at'] = Carbon::now();
SchedulePeriod::insert($s_t);
}
}
}
}
return true;
}
public static function makeOrgainzationSchedule ($docterId,$orgId,$type,$schedule,$weekSchedule,$timePeriods){
//门诊排班
if(empty($schedule) || count($schedule) < 58){
$start = strtotime(date('Y-m-1',time()));
$today = date('j',time());
$allDay = date('t',time());
//第一个月
for ($i=$today;$i<=$allDay;$i++){
$todayTimer = $start + (($i - 1) *86400);
$week = date('N',$todayTimer);
$date = date('Y-m-d',$todayTimer);
$numDate = date('Ymd',$todayTimer);
$scheduleData = [
'schedule_date'=>$date,
'schedule_day'=>$numDate,
'week'=>$week,
'docter_id'=>0,
'organization_id'=>$orgId
];
$scheduleIsHave = Schedule::where($scheduleData)->count();
if ($scheduleIsHave) continue;
Schedule::insertGetId($scheduleData);
}
$nextStart = strtotime(date('Y-m-1',strtotime('next month')));
$nextAllDay = date('t',strtotime('nex month'));
//第二个月
for($j=1;$j<=$nextAllDay;$j++){
$todayTimer = $nextStart + (($j-1)*86400);
$week = date('N',$todayTimer);
$date = date('Y-m-d',$todayTimer);
$numDate = date('Ymd',$todayTimer);
$scheduleData = [
'schedule_date'=>$date,
'schedule_day'=>$numDate,
'week'=>$week,
'docter_id'=>$docterId,
'organization_id'=>0
];
$scheduleIsHave = Schedule::where($scheduleData)->count();
if ($scheduleIsHave) continue;
Schedule::insertGetId($scheduleData);
}
$schedule = Schedule::where(['docter_id'=>$docterId,'organization_id'=>0])->where('schedule_date','>',date('Y-m-d',time()))
->distinct('schedule_date')->pluck('schedule_date','id')->toArray();
}
foreach ($schedule as $id => $date) {
$week = intval(date('N', strtotime($date)));
foreach ($weekSchedule as $w) {
if ($week == $w[0]['week']) {
foreach ($timePeriods as $idt) {
$s_t = [
'organization_id' => $orgId,
'docter_id' => 0,
'type' => $type,
'schedule_date' => $date,
'schedule_id' => $id,
'time_period_id' => $idt
];
$scheduleIsHave = SchedulePeriod::where($s_t)->count();
if ($scheduleIsHave) continue;
$s_t['created_at'] = Carbon::now();
$s_t['updated_at'] = Carbon::now();
$isHave = SchedulePeriod::where($s_t)->count();
if($isHave) continue;
SchedulePeriod::insert($s_t);
}
}
}
}
return true;
}
//自己排班
public function makeSelfScheeule($docterId,$orgId,$type,$timesPeriods,$selfSchedule){
if($type == 1){
$orgId = 0;
SelfSchedule::where(['type'=>1,'docter_id'=>$docterId,'organization_id'=>0,'schedule_type'=>$type])->whereIn('time_period_id',$timesPeriods)->delete();
} else {
SelfSchedule::where(['type'=>1,'docter_id'=>0,'organization_id'=>$orgId,'schedule_type'=>$type])->whereIn('time_period_id',$timesPeriods)->delete();
$docterId = 0;
}
foreach ($selfSchedule as $val) {
$self_data = $val;
$self_data['organization_id'] = $orgId;
$self_data['docter_id'] = $docterId;
foreach ($timesPeriods as $idt) {
$self_data['time_period_id'] = $idt;
$is_self_have = SelfSchedule::where($self_data)->count();
if ($is_self_have) continue;
$self_data['created_at'] = Carbon::now();
$self_data['updated_at'] = Carbon::now();
SelfSchedule::insert($self_data);
}
}
}
public static function baseMonthSchedule($monthDay, $baseData){
$start_time = strtotime(date('Y-m-1',time()));
for($i = 1 ; $i<=$monthDay; $i++){
$week = date('N',$start_time + ($i-1) * 86400);
$scheduleDate = date('Y-m-d',$start_time + ($i-1) * 86400);
}
}
}