Browse Source

周排班逻辑优化

Swdz-WangHaiJun 4 years ago
parent
commit
8bbe71eaeb
1 changed files with 161 additions and 149 deletions
  1. 161 149
      app/Community/Controllers/ApiController.php

+ 161 - 149
app/Community/Controllers/ApiController.php

xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd xqd
@@ -276,7 +276,7 @@ class ApiController extends Controller
 
 
         if($type == 1){
-            if($role == 2){
+            if($role == 2||$role == 1){
                 for ($i=1;$i<=7;$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,'type'=>$j+1])->count();
@@ -290,18 +290,18 @@ class ApiController extends Controller
                     }
                 }
             } 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';
-                        }
-                    }
-                }
+//                for ($i=1;$i<=7;$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';
+//                        }
+//                    }
+//                }
             }
         } else {
             $docter_id = 0;
@@ -341,6 +341,7 @@ class ApiController extends Controller
         } else {
             $docter_setting = OrganizationSettings::where(['org_id'=>$org_id])->first();
         }
+        $serviceNum = $docter_setting->service_num;
 
 
         $times = [];
@@ -358,9 +359,12 @@ class ApiController extends Controller
         if($type != 1){
             $docter_id = 0;
         }
+
         $week_data  ['schedule_type'] = $type;
         $week_data  ['organization_id'] = $org_id;
         $week_data  ['docter_id'] = $docter_id;
+
+
         DB::beginTransaction();
         $data[0] = array_values(object_array(json_decode($data[0])));
         $data[1] = array_values(object_array(json_decode($data[1])));
@@ -375,110 +379,118 @@ class ApiController extends Controller
                         $new_week_data = $week_data;
                         $new_week_data ['type'] = $i;
                         $new_week_data ['week'] = $key;
-//                        echo '时间列类型'.($i+1).'----'.$key.'星期数'.'<br>';
-                        foreach ($times[$i-1] as $id){
-                            $new_week_data['time_period_id'] = $id;
+//                        echo '时间列类型'.($i).'----'.$key.'星期数'.'<br>';
+//                        foreach ($times[$i-1] as $id){
+//                            $new_week_data['time_period_id'] = $id;
                             $is_have = WeekSchedule::where(['docter_id'=>$docter_id,'schedule_type'=>$type,'type'=>$i,'week'=>$key])->value('id');
                             if(!$is_have)  WeekSchedule::insert($new_week_data);
+//                            dump($new_week_data);
                             $k++;
-                        }
+//                        }
                     } else if ($schedule == false) {
                         if($type == 1){
-                            $is_have = WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->whereIn('time_period_id', $times[$i-1])->value('id');
-                            if($is_have) WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->whereIn('time_period_id', $times[$i-1])->delete();
+                            $is_have = WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->value('id');
+                            if($is_have) WeekSchedule::where(['docter_id' => $docter_id, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->delete();
                         } else {
-                            $is_have = WeekSchedule::where(['docter_id' => 0, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->whereIn('time_period_id', $times[$i-1])->value('id');
-                            if($is_have) WeekSchedule::where(['docter_id' => 0, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->whereIn('time_period_id', $times[$i-1])->delete();
+                            $is_have = WeekSchedule::where(['docter_id' => 0, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->value('id');
+                            if($is_have) WeekSchedule::where(['docter_id' => 0, 'organization_id' => $org_id, 'schedule_type' => $type,'type'=>$i,'week'=>$key])->delete();
                         }
-//                        $k++;
+                        $k++;
                     }
-
                 }
             }
 
             //todo 修改月视图
 
-
             DB::commit();
         } catch (\Exception $e){
             DB::rollBack();
             return apiReturn(602,$e->getLine().'行'.$e->getMessage());
         }
+        self::setmonthScheduel($docter_id,$org_id,$type,$serviceNum,$times);
+
         return apiReturn(200,'ok',$k);
     }
 
     //设置月排班
-    public function setmonthScheduel()
+    public function setmonthScheduel($docterId,$orgId,$scheduleType,$serviceNum,$timePeriods)
     {
-        $docter_id = request('docter_id',1);
-        $org_id = request('org_id',1);
-        $type = request('type',2);
-        $role = request('role',2);
-        $date = request('date');
-        if(empty($docter_id) || empty($type)){
-            return apiReturn(604,'缺少必要参数');
-        }
-        $start_time = date('Y-m-d', strtotime($date));
-        $end_time = date('Y-m-d',strtotime($date.'+1 month'));
-        $docter_setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
-
-        $self_schedule = SelfSchedule::where(['docter_id'=>$docter_id,'organization_id'=>$org_id])->whereBetween('schedule_date',[$start_time,$end_time])->distinct('type')->get(['type','week'])->GroupBy('week')->toArray();
-        $week_schedule = WeekSchedule::where(['docter_id'=>$docter_id,'organization_id'=>$org_id])->orderby('week')->distinct('type')->get(['type','week'])->GroupBy('week')->toArray();
-
-        for ($i=1;$i<=7;$i++){
-            $s = [];
-            $w=[];
-            if(!empty($self_schedule[$i])){
-                $s =array_column($self_schedule[$i],'type');
-            }
-            if(!empty($week_schedule[$i])){
-                $w =array_column($week_schedule[$i],'type');
-            }
-            if(!empty($s) || !empty($w)){
-                $sn = $s+$w;
-                $all_schedule[$i] = $sn;
-            } else {
-                $all_schedule[$i] = [];
-            }
+
+
+        $today = intval(date('Ymd',time()));
+        $start = time();
+
+        //删除排班
+        $schedule_ids = Schedule::where(['docter_id'=>$docterId,'organization_id'=>$orgId])->where('schedule_day','>',$today)->pluck('id')->toArray();
+        Schedule::where(['docter_id'=>$docterId,'organization_id'=>$orgId])->where('schedule_day','>',$today)->delete();
+        //删除具体排班
+        SchedulePeriod::whereIn('schedule_id',$schedule_ids)->delete();
+
+        //插入两个月的数据
+        for ($i=1;$i<60;$i++){
+
+            $todayTimer = $start + (($i - 1) *86400);
+
+            $date = date('Y-m-d',$todayTimer);
+            $numDate = date('Ymd',$todayTimer);
+
+            $scheduleData['docter_id'] = $docterId;
+            $scheduleData['schedule_date'] = $date;
+            $scheduleData['schedule_day'] = $numDate;
+            $scheduleData['organization_id'] = $orgId;
+
+            $scheduleIsHave = Schedule::where($scheduleData)->count();
+            $scheduleData['per_time_num'] = $serviceNum;
+            //循环外批量插入
+            if (!$scheduleIsHave)  Schedule::insert($scheduleData);
         }
 
-        if(!empty($docter_setting)){
-            $time_period = object_array(json_decode($docter_setting->service_time));
-            $times[1] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[0]['startTime']),intval($time_period[0]['endTime'])])->pluck('id')->toArray();
-            $times[2] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[1]['startTime']),intval($time_period[1]['endTime'])])->pluck('id')->toArray();
-            $times[3] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[2]['startTime']),intval($time_period[2]['endTime'])])->pluck('id')->toArray();
+        $schedule = Schedule::where(['docter_id'=>$docterId,'organization_id'=>$orgId])->where('schedule_date','>=',date('Y-m-d',time()))
+            ->distinct('schedule_date')->pluck('schedule_date','id')->toArray();
+        if($docterId == 0){
+            $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();
         }
 
-        $start_time = strtotime($date);
-        $month_day = date("t",strtotime($date));
-        $begainDay = date("d",time()) - 1;
+        for($tType = 1; $tType<=3 ; $tType++){
+            foreach ($schedule as $id => $date) {
+                $week = intval(date('N', strtotime($date)));
+                $real_id = WeekSchedule::where(['docter_id'=>$docterId,'organization_id'=>$orgId,'week'=>$week,'type'=>$tType])->first();
 
-        DB::beginTransaction();
-        try {
-            for($i=$begainDay;$i<=$month_day;$i++){
-                $today = $start_time + $i*86400;
-                $nutoday = intval(date('Ymd',$today));
-                $week = date('w',$today);
-                if($week == 0){
-                    $every_day = $all_schedule[7];
-                } else {
-                    $every_day = $all_schedule[$week];
-                }
-                $schedule_data = ['docter_id'=>$docter_id,'schedule_date'=>date('Y-m-d',$today),'schedule_day'=>$nutoday,'organization_id'=>$org_id];
-                $is_have_schedule = Schedule::where(['docter_id'=>$docter_id,'schedule_date'=>date('Y-m-d',$today),'organization_id'=>$org_id])->first();
-                $schedule_id = Schedule::insertGetId($schedule_data);
-                foreach ($every_day as $type){
-                    foreach ($times[$type] as $tp){
-                        $data = ['docter_id'=>$docter_id,'schedule_date'=>date('Y-m-d',$today),'organization_id'=>$org_id,'time_period_id'=>$tp,'type'=>$type,'schedule_id'=>$schedule_id];
-                        SchedulePeriod::insert($data);
+                if (!empty($real_id)) {
+                    foreach ($timePeriods[$tType-1] as $idt) {
+                        if($docterId != 0){//门诊
+                            $s_t = [
+                                'docter_id' => $docterId,
+                                'organization_id' => $orgId,
+                                'type' => $tType,
+                                'schedule_date' => $date,
+                                'schedule_id' => $id,
+                                'time_period_id' => $idt
+                            ];
+                            $scheduleIsHave = SchedulePeriod::where($s_t)->count();
+                            $s_t['order_num'] = $serviceNum;
+
+                            if (!$scheduleIsHave) SchedulePeriod::insert($s_t);
+
+                        } else {
+                            $s_t = [
+                                'docter_id' => 0,
+                                'organization_id' => $orgId,
+                                'type' => $tType,
+                                'schedule_date' => $date,
+                                'schedule_id' => $id,
+                                'time_period_id' => $idt
+                            ];
+
+                            $scheduleIsHave = SchedulePeriod::where($s_t)->count();
+                            $s_t['order_num'] = $serviceNum;
+                            if (!$scheduleIsHave) SchedulePeriod::insert($s_t);
+                        }
                     }
                 }
-                DB::commit();
             }
-        } catch (\Exception $e){
-             dd('第'.$e->getLine().'行报错: '.$e->getMessage());
-             DB::rollBack();
-             return apiReturn('603','插入失败');
+
         }
 
         return apiReturn('200','ok');
@@ -511,7 +523,6 @@ class ApiController extends Controller
             $serviceConfig = object_array(json_decode($settingConfig['service_time']));
         }
 
-
         if(!empty($settingConfig)){
             $baseData =  [
                 ['status'=>false,'type'=>1,'start'=>$serviceConfig[1]['amStartTime'],'end'=>$serviceConfig[1]['amEndTime']],
@@ -519,13 +530,13 @@ class ApiController extends Controller
                 ['status'=>false,'type'=>3,'start'=>$serviceConfig[3]['nightStartTime'],'end'=>$serviceConfig[3]['nightEndTime']],
             ];
 
+        } else {
+            $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{
-//            $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 [];
@@ -683,6 +694,7 @@ class ApiController extends Controller
         $type = intval(request('type'));
 
         $setting = DocterSetting::where(['docter_id'=>$docter_id,'org_id'=>$org_id])->first();
+//        dump($docter_id);
         if($type  == 2){
             $setting = OrganizationSettings::where(['org_id'=>$org_id])->first();
         }
@@ -707,7 +719,7 @@ class ApiController extends Controller
             ];
             return apiReturn(200,'ok',$configData);
         }
-        $config = object_array(json_decode($setting['service_time']));
+          $config = object_array(json_decode($setting['service_time']));
 
         $status = $setting['status'] ? true: false;
         $configData = [
@@ -801,7 +813,6 @@ class ApiController extends Controller
         if(!$changeSeviceTime && empty($changeTimer)){
             return apiReturn(603,'数据为改变');
         }
-
        for ($i=1;$i<=3;$i++){
            $tType = $i;
             DB::beginTransaction();
@@ -887,7 +898,7 @@ class ApiController extends Controller
                 DocterSetting::insert($setting);
             }
         } else {
-            $setting['docter_id'] = 0 ;
+            unset($setting['docter_id']);
             $setting['org_id'] = $org_id;
             $is_have = OrganizationSettings::where(['org_id'=>$org_id])->value('id');
             if($is_have){
@@ -902,66 +913,65 @@ class ApiController extends Controller
     //获取用户信息
     public function getScheduleInfo()
     {
-        $id = intval(request('id'));
-        $isDocter = CdmsUsers::where('docter_id',$id)->first();
-        $isOrg = CdmsUsers::where('org_id',$id)->first();
-
-        $org_id = null;
+//        $id = intval(request('id'));
+//        $isDocter = CdmsUsers::where(['docter_id'=>$id,'org_id'=>$id])->first();
+//        $isOrg = CdmsUsers::where(['org_id'=>$id,'docter_id'=>null])->first();
+        $user = Admin::user();
+//        dump($user);
         $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();
+        $docter_id=0;
+        $data['docter_type'] = 1;
+        if($user->docter_id&&$user->org_id){
             $role = 2;
-        } else {
-            if(!empty($isOrg->org_id)){
-                $org_id = $isOrg->org_id;
-            } else {
-                $role = 0;
-            }
+            $docter = Docter::where(['id'=>$user->docter_id])->first();
+            $data['docter_type'] = $docter->type;
+            $docter_id = $user->docter_id;
+        }else if(!$user->docter_id&&$user->org_id){
+            $role = 1;
+        }else if(!$user->docter_id&&!$user->org_id){
+            $role = 0;
         }
+        $org_id = intval($user->org_id);
 
-        $lists =[];
+        $list =[];
         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];
+            $docters = Docter::whereIn('id',$ids)->distinct('id')->get(['id','name'])->toArray();
+            if(!empty($docters)){
+                //机构默认取第一个医生id
+                $docter_id = $docters[0]['id'];
+                foreach ($docters as $val){
+                    $list[] = ['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];
+            $ids = DocterOrganization::where(['docter_id'=>$user->docter_id])->distinct('docter_id')->pluck('organization_id')->toArray();
+            $docters = Organization::whereIn('id',$ids)->get(['id','name']);
+            foreach ($docters as $val){
+                $list[] = ['value'=>$val->id,'label'=>$val->name];
             }
-            $name = Docter::where('id',$id)->value('name');
+            $name = Docter::where('id',$user->docter_id)->value('name');
         } else {
             $name = '';
         }
 
-
-        $type = 1;
-        $data['user_id'] = $id;
+        $data['user_id'] = $docter_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;
-            } else {
-                $organization = Organization::where(['id'=>$org_id])->first();
-                $data['list'] = ['value'=>$organization->id,'label'=>$organization->name];
-            }
-        }
+        $data['list'] = $list;
+//
+//        if(!empty($docter)){
+//            if($docter->type == 1){
+//                $data['list'] = $lists;
+//            } else {
+//                $organization = Organization::where(['id'=>$org_id])->first();
+//                $data['list'] = ['value'=>$organization->id,'label'=>$organization->name];
+//            }
+//        }
         $data['role'] = $role;
+
         return (json_encode(['code'=>200,'msg'=>'ok','data'=>$data]));
     }
 
@@ -1130,6 +1140,7 @@ class ApiController extends Controller
         }
         //获取医生排班配置
         $schedule = object_array(json_decode($schdule_data));
+        dd($schedule);
         //默认为门诊排班医生配置
         $setting = self::getSetting($type,$docter_id,$org_id);
         if(empty($setting)){
@@ -1297,15 +1308,17 @@ class ApiController extends Controller
                 DocterSetting::where(['docter_id'=>$docterId,'org_id'=>$orgId])->update($setting);
             }
             return true;
-        }
-
-        $is_have = OrganizationSettings::where(['org_id'=>$orgId])->count();
-        if(!$is_have){
-            OrganizationSettings::insert($setting);
         } else {
-            $setting['docter_id'] = $docterId;
-            OrganizationSettings::where(['org_id'=>$orgId])->update($setting);
+
+            $is_have = OrganizationSettings::where(['org_id'=>$orgId])->count();
+            if(!$is_have){
+                OrganizationSettings::insert($setting);
+            } else {
+                $setting['org_id'] = $docterId;
+                OrganizationSettings::where(['org_id'=>$orgId])->update($setting);
+            }
         }
+
         return true;
     }
 
@@ -1337,8 +1350,7 @@ class ApiController extends Controller
     public static function changeWeekSchedule($docterId,$orgId,$scheduleType,$timeType,$timePeriod)
     {
         //获取旧的周排班
-        $oldWeekSchedule = WeekSchedule::where(['docter_id'=>$docterId,'organization_id'=>$orgId,'schedule_type'=>$scheduleType])->orderBy('week')->distinct('type')->get(['organization_id','docter_id','schedule_type','week','type'])->toArray();
-
+        $oldWeekSchedule = WeekSchedule::where(['docter_id'=>$docterId,'organization_id'=>$orgId,'schedule_type'=>$scheduleType,'type'=>$timeType])->orderBy('week')->distinct('type')->get(['organization_id','docter_id','schedule_type','week','type'])->toArray();
         //删除老周排班
         WeekSchedule::where(['docter_id'=>$docterId,'organization_id'=>$orgId,'schedule_type'=>$scheduleType,'type'=>$timeType])->delete();
 
@@ -1346,7 +1358,7 @@ class ApiController extends Controller
 //        //更新时间段
         foreach ($oldWeekSchedule as $daySchedule){
             foreach ($timePeriod as $id){
-                $daySchedule['time_period_id'] = $id;
+//                $daySchedule['time_period_id'] = $id;
                 WeekSchedule::insert($daySchedule);
             }
         }