ScheDuleController.php 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\CdmsUsers;
  4. use App\Models\CommunitySchedule;
  5. use App\Models\Docter;
  6. use App\Models\DocterOrganization;
  7. use App\Models\DocterSetting;
  8. use App\Models\Order;
  9. use App\Models\Organization;
  10. use App\Models\Schedule;
  11. use App\Models\SchedulePeriod;
  12. use App\Models\SelfSchedule;
  13. use App\Models\SystemConfig;
  14. use App\Models\TimePeriod;
  15. use App\Models\WeekSchedule;
  16. use Carbon\Carbon;
  17. use Encore\Admin\Admin;
  18. use Illuminate\Support\Facades\DB;
  19. use Illuminate\Support\Facades\Log;
  20. use mysql_xdevapi\Exception;
  21. use phpDocumentor\Reflection\DocBlock\Description;
  22. class ScheDuleController extends Controller
  23. {
  24. public function __construct()
  25. {
  26. // 允许 $originarr 数组内的 域名跨域访问
  27. header('Access-Control-Allow-Origin:*');
  28. // 响应类型
  29. header('Access-Control-Allow-Methods:POST,GET');
  30. // 带 cookie 的跨域访问
  31. header('Access-Control-Allow-Credentials: true');
  32. // 响应头设置
  33. header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token');
  34. }
  35. //获取排班页面
  36. public function getComScheduleback()
  37. {
  38. $set_time = request('time');//时间
  39. $org_id = request('org_id');//机构
  40. $docter_id = request('docter_id');//医生
  41. // $set_time = '2020-11-30至2020-12-06';
  42. // $org_id = 1;
  43. // $docter_id = 47;
  44. $role = 2;
  45. if(empty($set_time) || empty($org_id) || empty($docter_id)){
  46. return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
  47. } else{
  48. // echo 'what happend';
  49. }
  50. $all_time = explode('至',$set_time);
  51. if(count($all_time) <2){
  52. return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
  53. }
  54. $start_time = intval(str_replace('-','',$all_time[0]));
  55. $end_time = intval(str_replace('-','',$all_time[1]));
  56. $first_day = strtotime($all_time[0]);
  57. // DB::enableQueryLog();
  58. $sche_dule = Schedule::whereBetween('schedule_day',[$start_time,$end_time])
  59. ->where(['docter_id'=>$docter_id])
  60. ->pluck('id')
  61. ->toArray();
  62. // echo '<pre>';
  63. // print_r(DB::getQueryLog());
  64. // echo '</pre>';
  65. //dd($sche_dule);
  66. $sche_dule_arr =[
  67. [
  68. 'date'=>"上午",
  69. 'monday'=>false,
  70. 'tuesday'=>false,
  71. 'wednesday'=>false,
  72. 'thursday'=>false,
  73. 'friday'=>false,
  74. 'saturday'=>false,
  75. 'sunday'=>false,
  76. ],
  77. [
  78. 'date'=>"下午",
  79. 'monday'=>false,
  80. 'tuesday'=>false,
  81. 'wednesday'=>false,
  82. 'thursday'=>false,
  83. 'friday'=>false,
  84. 'saturday'=>false,
  85. 'sunday'=>false,
  86. ],
  87. [
  88. 'date'=>"晚上",
  89. 'monday'=>false,
  90. 'tuesday'=>false,
  91. 'wednesday'=>false,
  92. 'thursday'=>false,
  93. 'friday'=>false,
  94. 'saturday'=>false,
  95. 'sunday'=>false,
  96. ]
  97. ];
  98. //周字段映射
  99. $week_arr = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];
  100. //时段区间id
  101. $schedule_config = SystemConfig::get('docter_config');
  102. $times[] = TimePeriod::where('start_time_period','>=',$schedule_config['morning_start'])->where('end_time_period','<=',$schedule_config['morning_end'])->pluck('id')->toArray();
  103. $times[] = TimePeriod::where('start_time_period','>=',$schedule_config['afternoon_start'])->where('end_time_period','<=',$schedule_config['afternoon_end'])->pluck('id')->toArray();
  104. $times[] = TimePeriod::where('start_time_period','>=',$schedule_config['evening_start'])->where('end_time_period','<=',$schedule_config['evening_end'])->pluck('id')->toArray();
  105. if(empty($sche_dule)){
  106. return ['status'=>200,'msg'=>'ok','data'=>['docter'=>$sche_dule_arr,'org_id'=>$org_id,'docter_id'=>$docter_id]];
  107. }
  108. $role = 2;
  109. if($role == 1){
  110. $ids = DocterOrganization::where(['organization_id'=>$org_id])->pluck('docter_id');
  111. $list = Docter::whereIn('id',$ids)->get(['id as value','name as label'])->toArray();
  112. $name = Organization::where('id',$docter_id)->value('name');
  113. $user_id = $org_id;
  114. for ($i = 1; $i<7; $i++){
  115. $str_time = date('Y-m-d',($first_day + $i * 86400));
  116. for($j=0;$j<3;$j++){
  117. //检测上午
  118. $is_mo_have = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
  119. ->where('organization_id','!=',$org_id)->count();
  120. ['schedule_id'=>$sche_dule,'schedule_date'=>$str_time,'organization_id'=>$org_id,'docter_id'=>$docter_id];
  121. $is_self = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
  122. ->where('organization_id',$org_id)->count();
  123. if($is_self){
  124. $sche_dule_arr[$j][$week_arr[$i]] = true;
  125. }
  126. if($is_mo_have){
  127. $sche_dule_arr[$j][$week_arr[$i]] = 'other';
  128. }
  129. }
  130. }
  131. } else {
  132. $ids = DocterOrganization::where(['docter_id'=>$docter_id])->pluck('organization_id');
  133. $list = Organization::whereIn('id',$ids)->get(['id as value','name as label'])->toArray();
  134. $name = Docter::where('id',$docter_id)->value('name');
  135. $user_id = $docter_id;
  136. for ($i=0; $i<=6; $i++){
  137. $str_time = date('Y-m-d',($first_day + $i * 86400));
  138. for($j=0;$j<=2;$j++){
  139. //检测上午
  140. $is_mo_have = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
  141. ->where('organization_id','!=',$org_id)->where('docter_id','=',$docter_id)->count();
  142. $is_mo_self = SchedulePeriod::whereIn('schedule_id',$sche_dule)->where('schedule_date',$str_time)->whereIn('time_period_id',$times[$j])
  143. ->where('organization_id',$org_id)->where('docter_id',$docter_id)->count();
  144. // echo $i.'--'.$j.'is_self---'.$is_mo_self.'<br>';
  145. if($is_mo_self){
  146. $sche_dule_arr[$j][$week_arr[$i]] = true;
  147. }
  148. if($is_mo_have){
  149. $sche_dule_arr[$j][$week_arr[$i]] = 'other';
  150. }
  151. }
  152. }
  153. }
  154. // "morning_start" => "09:00"
  155. // "morning_end" => "12:00"
  156. // "afternoon_start" => "13:00"
  157. // "afternoon_end" => "18:00"
  158. // "evening_start" => "19:00"
  159. // "evening_end" => "20:00"
  160. $data['docter'] = $sche_dule_arr;
  161. $data['name'] = $name;
  162. // $data['list'] = $list;
  163. $data['role'] = $role;
  164. $data['user_id'] = $user_id;
  165. return (json_encode(['code'=>200,'msg'=>'ok','data'=>$data]));
  166. }
  167. //获取周排班
  168. public function getComSchedule(){
  169. $docter_id = request('docter_id',1);
  170. $org_id = request('org_id',1);
  171. $type = request('type',2);
  172. $role = request('role',2);
  173. if(empty($docter_id) || empty($type)){
  174. return apiReturn(604,'缺少必要参数');
  175. }
  176. $docter_id = 1;
  177. $docter_setting = DocterSetting::where(['docter_id'=>$docter_id,'type'=>$type])->first();
  178. $times = [];
  179. if(!empty($docter_setting)){
  180. $time_period = object_array(json_decode($docter_setting->service_time));
  181. $times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[0]['startTime']),intval($time_period[0]['endTime'])])->pluck('id')->toArray();
  182. $times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[1]['startTime']),intval($time_period[1]['endTime'])])->pluck('id')->toArray();
  183. $times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[2]['startTime']),intval($time_period[2]['endTime'])])->pluck('id')->toArray();
  184. }
  185. if(count($times) < 3){
  186. dd('no have times');
  187. }
  188. //周字段映射
  189. $week_arr = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];
  190. $data = [
  191. [
  192. 'date'=>"上午",
  193. 'monday'=>false,
  194. 'tuesday'=>false,
  195. 'wednesday'=>false,
  196. 'thursday'=>false,
  197. 'friday'=>false,
  198. 'saturday'=>false,
  199. 'sunday'=>false,
  200. ],
  201. [
  202. 'date'=>"下午",
  203. 'monday'=>false,
  204. 'tuesday'=>false,
  205. 'wednesday'=>false,
  206. 'thursday'=>false,
  207. 'friday'=>false,
  208. 'saturday'=>false,
  209. 'sunday'=>false,
  210. ],
  211. [
  212. 'date'=>"晚上",
  213. 'monday'=>false,
  214. 'tuesday'=>false,
  215. 'wednesday'=>false,
  216. 'thursday'=>false,
  217. 'friday'=>false,
  218. 'saturday'=>false,
  219. 'sunday'=>false,
  220. ]
  221. ];
  222. if($role == 2){
  223. for ($i=0;$i<6;$i++){
  224. for($j=0;$j<=2;$j++){
  225. $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();
  226. $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();
  227. if($is_self_have){
  228. $data[$j][$week_arr[$i]] = true;
  229. }
  230. if($is_other_have){
  231. $data[$j][$week_arr[$i]] = 'other';
  232. }
  233. }
  234. }
  235. } else {
  236. for ($i=0;$i<6;$i++){
  237. for($j=0;$j<=2;$j++){
  238. $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();
  239. $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();
  240. if($is_self_have){
  241. $data[$j][$week_arr[$i]] = true;
  242. }
  243. if($is_other_have){
  244. $data[$j][$week_arr[$i]] = 'other';
  245. }
  246. }
  247. }
  248. }
  249. $name = Docter::where('id',$docter_id)->value('name');
  250. $shcedule_data['docter'] = $data;
  251. $shcedule_data['name'] = $name;
  252. $shcedule_data['role'] = $role;
  253. $shcedule_data['user_id'] = $docter_id;
  254. return apiReturn(200,'ok',$shcedule_data);
  255. }
  256. //编辑排班
  257. public function setDocCheduleback()
  258. {
  259. $docter_id = request('docter_id');
  260. $org_id = request('org_id');
  261. $set_time = request('time');
  262. $data = request('schedulingtime');
  263. // $set_time = '2020-12-07至2020-12-13';
  264. if(empty($set_time) || empty($org_id) || empty($docter_id)){
  265. return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
  266. }
  267. $all_time = explode('至',$set_time);
  268. $schedule_id = Schedule::where(['organization_id'=>$org_id,'docter_id'=>$docter_id,'schedule_date'=>$all_time[0]])->value('id');
  269. if(count($all_time) <2) {
  270. return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
  271. }
  272. $start_time = intval(str_replace('-','',$all_time[0]));
  273. $end_time = intval(str_replace('-','',$all_time[1]));
  274. $first_day = strtotime($start_time);
  275. //周字段映射
  276. $week_arr = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];
  277. // $data = [
  278. // [
  279. // 'date'=>"上午",
  280. // 'monday'=>false,
  281. // 'tuesday'=>false,
  282. // 'wednesday'=>false,
  283. // 'thursday'=>true,
  284. // 'friday'=>false,
  285. // 'saturday'=>false,
  286. // 'sunday'=>false,
  287. // ],
  288. // [
  289. // 'date'=>"下午",
  290. // 'monday'=>false,
  291. // 'tuesday'=>true,
  292. // 'wednesday'=>false,
  293. // 'thursday'=>false,
  294. // 'friday'=>false,
  295. // 'saturday'=>false,
  296. // 'sunday'=>false,
  297. // ],
  298. // [
  299. // 'date'=>"晚上",
  300. // 'monday'=>false,
  301. // 'tuesday'=>false,
  302. // 'wednesday'=>true,
  303. // 'thursday'=>false,
  304. // 'friday'=>false,
  305. // 'saturday'=>false,
  306. // 'sunday'=>false,
  307. // ]
  308. // ];
  309. //时段区间id
  310. $schedule_config = SystemConfig::get('docter_config');
  311. $times[1] = TimePeriod::where('start_time_period','>=',$schedule_config['morning_start'])
  312. ->where('end_time_period','<=',$schedule_config['morning_end'])
  313. ->pluck('id')->toArray();
  314. $times[2] = TimePeriod::where('start_time_period','>=',$schedule_config['afternoon_start'])
  315. ->where('end_time_period','<=',$schedule_config['afternoon_end'])
  316. ->pluck('id')->toArray();
  317. $times[3] = TimePeriod::where('start_time_period','>=',$schedule_config['evening_start'])
  318. ->where('end_time_period','<=',$schedule_config['evening_end'])
  319. ->pluck('id')->toArray();
  320. foreach ($times as $val){
  321. foreach ($val as $t){
  322. $time_period[] = $t;
  323. }
  324. }
  325. $data[0] = array_values(object_array(json_decode($data[0])));
  326. $data[1] = array_values(object_array(json_decode($data[1])));
  327. $data[2] = array_values(object_array(json_decode($data[2])));
  328. $mo_schedule = array_values($data[0]);
  329. $af_schedule = array_values($data[1]);
  330. $ev_schedule = array_values($data[2]);
  331. DB::beginTransaction();
  332. try {
  333. $schedule_insert = [
  334. 'organization_id'=>$org_id,
  335. 'docter_id'=>$docter_id,
  336. 'schedule_date'=>$all_time[0],
  337. 'schedule_day'=>$start_time,
  338. 'created_at'=>Carbon::now(),
  339. 'updated_at'=>Carbon::now(),
  340. ];
  341. if(!$schedule_id){
  342. $schedule_id = Schedule::insertGetId($schedule_insert);
  343. }
  344. unset($schedule_insert['schedule_day']);
  345. $schedule_insert['schedule_id'] =$schedule_id;
  346. $info = [];
  347. for ($i = 1 ;$i<=3;$i++){
  348. $mo_schedule = array_values($data[$i-1]);
  349. foreach ($mo_schedule as $key=>$val){
  350. if($key==0) continue;
  351. $schedule_date = $start_time + $key;
  352. $strtime = "$schedule_date";
  353. $time_insert = $schedule_insert;
  354. $time_insert['type'] = $i;
  355. $schedule_time = $times[$i];
  356. $real_time = date('Y-m-d',($first_day + ($key-1)*86400));
  357. $time_insert['schedule_date'] = $real_time;
  358. $time_insert['me_sure'] = 1;
  359. if($val == true){
  360. $data['schedule_date'] = $start_time ;
  361. foreach ($schedule_time as $time_id){
  362. $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');
  363. if($is_have) break;
  364. $time_insert['time_period_id'] = $time_id;
  365. $info[] = $time_insert;
  366. SchedulePeriod::insert($time_insert);
  367. }
  368. } else {
  369. $data['schedule_date'] = $start_time;
  370. foreach ($schedule_time as $time_id){
  371. $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');
  372. 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();
  373. }
  374. }
  375. }
  376. }
  377. DB::commit();
  378. } catch (Exception $e){
  379. DB::rollBack();
  380. Log::info($e->getMessage());
  381. }
  382. return json_encode(['status'=>200,'msg'=>'插入成功','data'=>count($info)]);
  383. }
  384. public function setDocChedule()
  385. {
  386. $docter_id = request('docter_id',1);
  387. $org_id = request('org_id',1);
  388. $type = request('type',2);
  389. if(empty($docter_id) || empty($org_id) || empty($type)){
  390. return apiReturn(601,'缺少必要参数');
  391. }
  392. $data = request('schedulingtime');
  393. if(empty($org_id) || empty($docter_id) || $data){
  394. return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
  395. }
  396. $docter_setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
  397. // $data = [
  398. // [
  399. // 'date'=>"上午",
  400. // 'monday'=>false,
  401. // 'tuesday'=>true,
  402. // 'wednesday'=>false,
  403. // 'thursday'=>false,
  404. // 'friday'=>true,
  405. // 'saturday'=>false,
  406. // 'sunday'=>false,
  407. // ],
  408. // [
  409. // 'date'=>"下午",
  410. // 'monday'=>false,
  411. // 'tuesday'=>false,
  412. // 'wednesday'=>false,
  413. // 'thursday'=>false,
  414. // 'friday'=>false,
  415. // 'saturday'=>true,
  416. // 'sunday'=>false,
  417. // ],
  418. // [
  419. // 'date'=>"晚上",
  420. // 'monday'=>true,
  421. // 'tuesday'=>true,
  422. // 'wednesday'=>false,
  423. // 'thursday'=>false,
  424. // 'friday'=>false,
  425. // 'saturday'=>false,
  426. // 'sunday'=>false,
  427. // ]
  428. // ];
  429. if(!empty($docter_setting)){
  430. $time_period = object_array(json_decode($docter_setting->service_time));
  431. $times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[0]['startTime']),intval($time_period[0]['endTime'])])->pluck('id')->toArray();
  432. $times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[1]['startTime']),intval($time_period[1]['endTime'])])->pluck('id')->toArray();
  433. $times[] = TimePeriod::where(['docter_id'=>$docter_id])->whereBetween('end_time_period',[intval($time_period[2]['startTime']),intval($time_period[2]['endTime'])])->pluck('id')->toArray();
  434. }
  435. $week_data = [
  436. 'schedule_type'=>$type,
  437. 'organization_id'=>$org_id,
  438. 'docter_id'=>$docter_id
  439. ];
  440. $k = 0;
  441. DB::beginTransaction();
  442. $data[0] = array_values(object_array(json_decode($data[0])));
  443. $data[1] = array_values(object_array(json_decode($data[1])));
  444. $data[2] = array_values(object_array(json_decode($data[2])));
  445. // $data[0] = array_values($data[0]);
  446. // $data[1] = array_values($data[1]);
  447. // $data[2] = array_values($data[2]);
  448. try {
  449. for($i=0;$i<=2;$i++){
  450. $schedule_data = $data[$i];
  451. foreach ($schedule_data as $key=>$schedule){
  452. if($key == 0) continue;
  453. $week_data ['type'] = $i+1;
  454. $week_data ['week'] = $key;
  455. if($schedule == true){
  456. // echo '时间列类型'.($i+1).'----'.$key.'星期数'.'<br>';
  457. foreach ($times[$i] as $id){
  458. $week_data['time_period_id'] = $id;
  459. $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');
  460. $is = $is_have?'有':'沒有';
  461. // echo '时间段id'.$id.'----'.$is.'</br>';
  462. if($is_have) continue;
  463. $k++;
  464. WeekSchedule::insert($week_data);
  465. }
  466. } else {
  467. $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');
  468. 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();
  469. }
  470. }
  471. }
  472. DB::commit();
  473. } catch (\Exception $e){
  474. DB::rollBack();
  475. return apiReturn(602,$e->getLine().'行'.$e->getMessage());
  476. }
  477. return apiReturn(200,'ok',$k);
  478. }
  479. //设置自己排班
  480. public function setSelfSchedule()
  481. {
  482. $docter_id = request('docter_id');
  483. $org_id = request('org_id');
  484. $date = request('date');
  485. $type = request('type','1,2'); //1 上午,2 下午,3 晚上
  486. $schedule_type = request('schedule_type');
  487. $self_setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
  488. $times = [];
  489. if(!empty($self_setting)){
  490. $time_period = object_array(json_decode($self_setting->service_time));
  491. $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();
  492. $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();
  493. $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();
  494. }
  495. if(count($times) <3){
  496. return apiReturn(602,'请设置真确的时间段');
  497. }
  498. if(empty($docter_id) || empty($org_id) || empty('date') || empty($type) || empty($schedule_type)){
  499. return apiReturn(601,'缺少必要参数');
  500. }
  501. if(strtotime($date) < strtotime('tomorrow')){
  502. return apiReturn(602,'只能排明天以後的');
  503. }
  504. $week = date("w",strtotime($date));
  505. $types = explode(',',$type);
  506. if(!empty($types)){
  507. foreach ($types as $t){
  508. $self_schedule = [
  509. 'schedule_date'=>$date,
  510. 'week'=>intval($week),
  511. 'schedule_type'=>$schedule_type,
  512. 'organization_id'=>$org_id,
  513. 'docter_id'=>$docter_id,
  514. 'type'=>intval($t)
  515. ];
  516. foreach ($times[intval($t)] as $id){
  517. $self_schedule['time_period_id'] = $id;
  518. $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');
  519. if($is_have) continue;
  520. SelfSchedule::insert($self_schedule);
  521. }
  522. }
  523. $cha = array_diff([1,2,3],$types);
  524. foreach ($cha as $t){
  525. SelfSchedule::where(['docter_id'=>$docter_id,'organization_id'=>$org_id,'schedule_date'=>$date,'type'=>intval($t)])->delete();
  526. }
  527. }
  528. return apiReturn(200,'ok');
  529. }
  530. //更新用戶設置
  531. public function updateDocterSetting()
  532. {
  533. $docter_id = request('docter_id',1);
  534. $configData = request('configData');
  535. $type = request('type');
  536. if(empty($docter_id) || $configData){
  537. return apiReturn(604,'参数错误');
  538. }
  539. $configData = [
  540. 'amEndTime'=>"11:30",
  541. 'amNum'=>20,
  542. 'amStartTime'=>"09:00",
  543. 'nightEndTime'=>"19:30",
  544. 'nightNum'=>8,
  545. 'nightStartTime'=>"11:30",
  546. 'pmEndTime'=>"16:00",
  547. 'pmNum'=>20,
  548. 'pmStartTime'=>"13:30",
  549. 'serviceNum'=>2,
  550. 'status'=>false,
  551. 'timeSpan'=>15,
  552. ];
  553. $setting = DocterSetting::where(['docter_id'=>$docter_id])->first()->toArray();
  554. $self_config = object_array(json_decode($setting['service_time']));
  555. $is_new = [];
  556. //
  557. // if(intval($configData['timeSpan']) != $setting['service_num']){
  558. // $is_new[] = 4 ;
  559. // }
  560. //
  561. // if($configData['amStartTime'] != $self_config[1]['amStartTime'] || $configData['amEndTime'] != $self_config[1]['amEndTime']){
  562. // $is_new[] = 1;
  563. // }
  564. //
  565. // if($configData['pmStartTime'] != $self_config[2]['pmStartTime'] || $configData['pmEndTime'] != $self_config[2]['pmEndTime']){
  566. // $is_new[] = 2;
  567. // }
  568. //
  569. // if($configData['nightStartTime'] != $self_config[3]['nightStartTime'] || $configData['nightEndTime'] != $self_config[3]['nightEndTime']){
  570. // $is_new[] = 3;
  571. // }
  572. //
  573. // configData: {
  574. //         amEndTime: "11:30", //上午结束时间 string
  575. //        amNum: 20, //上午号源 Num
  576. //        amStartTime: "09:00", //上午开始时间 string
  577. //        nightEndTime: "19:30", //晚上结束时间 string
  578. //        nightNum: 8, //晚上号源 num
  579. //        nightStartTime: "18:30", //晚上开始时间 staring
  580. //        pmEndTime: "16:00", //下午结束时间 string
  581. //        pmNum: 20, //下午号源 num
  582. //        pmStartTime: "13:30", //下午开始时间 string
  583. //        serviceNum: 2, //同时服务人数 Num
  584. //        showDayNumber: 7, //可预约服务天数 Num
  585. //        status: false, // 是否开启 true false
  586. //        timeSpan: "15", // 就诊时长 string
  587. //      },
  588. //添加时间段
  589. $is_new = [1];
  590. if(count($is_new) > 0){
  591. // $data = ['docter_id'=>$docter_id,'am_start'=>'8:30','am_end'=>'11:30','pm_start'=>'12:00','pm_end'=>'15:00','ev_start'=>'19:00','ev_end'=>'22:00','service_time'=>15];
  592. // $amtimes[] = explode(':',$configData['amStartTime']);
  593. // $amtimes[] = explode(':',$configData['amEndTime']);
  594. // $amcha = ($amtimes[1][0] - $amtimes[0][0])*60 +($amtimes[1][1] - $amtimes[0][1]);
  595. // $amCount = $amcha/$data['service_time'];
  596. // $amCount = intval(floor((strtotime($configData['amEndTime']) - strtotime($configData['amStartTime'])) / (60*$configData['timeSpan'])));
  597. // $pmtimes[] = explode(':',$configData['pmStartTime']);
  598. // $pmtimes[] = explode(':',$configData['pmEndTime']);
  599. // $pmCount =intval(floor((strtotime($configData['pmEndTime']) - strtotime($configData['pmStartTime'])) / (60*$configData['timeSpan'])));
  600. //
  601. //
  602. // $evtimes[] = explode(':',$configData['nightStartTime']);
  603. // $evtimes[] = explode(':',$configData['nightEndTime']);
  604. // $evcha = ($evtimes[1][0] - $evtimes[0][0])*60 +($evtimes[1][1] - $evtimes[0][1]);
  605. // $evCount = $evcha/$configData['service_time'];
  606. $amCount = $configData['amNum'];
  607. $pmCount = $configData['pmNum'];
  608. $evCount = $configData['nightNum'];
  609. $today_id = Schedule::where(['docter_id'=>$docter_id])->where('schedule_date','=',date('Y-m-d'))->value('id');
  610. if(in_array(4,$is_new)){
  611. TimePeriod::where(['docter_id'=>$docter_id])->delete();
  612. $schuedule_ids = Schedule::where(['docter_id'=>$docter_id])->where(['schedule_date','>',date('Y-m-d')])->pluck('id')->toArray();
  613. SchedulePeriod::where(['docter_id'=>$docter_id])->whereIn('schedule_id',$schuedule_ids)->delete();
  614. for($i=1;$i<=$amCount;$i++){
  615. $amdata = [
  616. 'docter_id'=>$docter_id,
  617. 'start_time_period'=> date('H:i',strtotime($configData['amStartTime']) + ($i-1)*$configData['timeSpan']*60),
  618. 'end_time_period'=> date('H:i',strtotime($configData['amStartTime']) + $i*$configData['timeSpan']*60),
  619. ];
  620. TimePeriod::insert($amdata);
  621. }
  622. for($i=1;$i<=$pmCount;$i++){
  623. $pmdata = [
  624. 'docter_id'=>$docter_id,
  625. 'start_time_period'=> date('H:i',strtotime($configData['pmStartTime']) + ($i-1)*$configData['timeSpan']*60),
  626. 'end_time_period'=> date('H:i',strtotime($configData['pmStartTime']) + $i*$configData['timeSpan']*60),
  627. ];
  628. TimePeriod::insert($pmdata);
  629. }
  630. for($i=1;$i<=$evCount;$i++){
  631. $evdata = [
  632. 'docter_id'=>$docter_id,
  633. 'start_time_period'=> date('H:i',strtotime($configData['nightStartTime']) + ($i-1)*$configData['timeSpan']*60),
  634. 'end_time_period'=> date('H:i',strtotime($configData['nightStartTime']) + $i*$configData['timeSpan']*60),
  635. ];
  636. TimePeriod::insert($evdata);
  637. }
  638. } else {
  639. if(in_array(1,$is_new)){
  640. TimePeriod::where(['docter_id'=>$docter_id,'type'=>1])->delete();
  641. $old_ids = SelfSchedule::where(['docter_id'=>$docter_id,'type'=>1])->distinct('week')->pluck('week','type')->toArray();
  642. $schedule_ids = Schedule::where(['docter_id'=>$docter_id])->where(['schedule_date','>',date('Y-m-d')])->pluck('id')->toArray();
  643. SelfSchedule::where(['docter_id'=>$docter_id,'type'=>1])->whereIn('schedule_id',$schedule_ids)->delete();
  644. SchedulePeriod::where(['docter_id'=>$docter_id])->whereIn('schedule_id',$schedule_ids)->delete();
  645. for($i=1;$i<=$amCount;$i++){
  646. $amdata = [
  647. 'docter_id'=>$docter_id,
  648. 'start_time_period'=> date('H:i',strtotime($configData['amStartTime']) + ($i-1)*$configData['timeSpan']*60),
  649. 'end_time_period'=> date('H:i',strtotime($configData['amStartTime']) + $i*$configData['timeSpan']*60),
  650. ];
  651. TimePeriod::insert($amdata);
  652. }
  653. }
  654. if(in_array(2,$is_new)){
  655. for($i=1;$i<=$pmCount;$i++){
  656. $pmdata = [
  657. 'docter_id'=>$docter_id,
  658. 'start_time_period'=> date('H:i',strtotime($configData['pmStartTime']) + ($i-1)*$configData['timeSpan']*60),
  659. 'end_time_period'=> date('H:i',strtotime($configData['pmStartTime']) + $i*$configData['timeSpan']*60),
  660. ];
  661. TimePeriod::insert($pmdata);
  662. }
  663. }
  664. if(in_array(2,$is_new)) {
  665. for($i=1;$i<=$evCount;$i++){
  666. $evdata = [
  667. 'docter_id'=>$docter_id,
  668. 'start_time_period'=> date('H:i',strtotime($configData['nightStartTime']) + ($i-1)*$configData['timeSpan']*60),
  669. 'end_time_period'=> date('H:i',strtotime($configData['nightStartTime']) + $i*$configData['timeSpan']*60),
  670. ];
  671. TimePeriod::insert($evdata);
  672. }
  673. }
  674. }
  675. }
  676. // {"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}}
  677. $config = [
  678. 1=>['amStartTime'=>$configData['amStartTime'],"amEndTime"=>$configData['amEndTime'],'amPerson'=>$configData['amNum']],
  679. 2=>["pmStartTime"=>$configData['pmStartTime'],"pmEndTime"=>$configData['pmEndTime'],'pmPerson'=>$configData['pmNum']],
  680. 3=>["nightStartTime"=>$configData['nightStartTime'],"nightEndTime"=>$configData['nightEndTime'],'nightPerson'=>$configData['nightNum']]
  681. ];
  682. $setting = [
  683. 'docter_id'=>$docter_id,
  684. 'type'=>$type,
  685. 'status'=>$configData['status'],
  686. 'show_days'=>$configData['serviceNum'],
  687. 'service_num'=>$configData['serviceNum'],
  688. 'service_times'=>$configData['timeSpan'],
  689. 'service_time'=>json_encode($config)
  690. ];
  691. // configData: {
  692. //         amEndTime: "11:30", //上午结束时间 string
  693. //        amNum: 20, //上午号源 Num
  694. //        amStartTime: "09:00", //上午开始时间 string
  695. //        nightEndTime: "19:30", //晚上结束时间 string
  696. //        nightNum: 8, //晚上号源 num
  697. //        nightStartTime: "18:30", //晚上开始时间 staring
  698. //        pmEndTime: "16:00", //下午结束时间 string
  699. //        pmNum: 20, //下午号源 num
  700. //        pmStartTime: "13:30", //下午开始时间 string
  701. //        serviceNum: 2, //同时服务人数 Num
  702. //        showDayNumber: 7, //可预约服务天数 Num
  703. //        status: false, // 是否开启 true false
  704. //        timeSpan: "15", // 就诊时长 string
  705. //      },
  706. $is_have = DocterSetting::where(['docter_id'=>$docter_id])->value('id');
  707. if($is_have){
  708. DocterSetting::where(['docter_id'=>$docter_id])->update($setting);
  709. } else {
  710. DocterSetting::insert($setting);
  711. }
  712. return apiReturn(200,'ok');
  713. }
  714. public function getDocterSetting()
  715. {
  716. $docter_id = request('docter_id',1);
  717. $setting = DocterSetting::where(['docter_id'=>$docter_id])->first();
  718. }
  719. //获取用户信息
  720. public function getScheduleInfo()
  721. {
  722. $docter_id = request('id');
  723. $org_id = request('org_id');
  724. $is_docter = CdmsUsers::where('docter_id',$docter_id)->first();
  725. if(empty($org_id) && empty($docter_id)){
  726. return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
  727. }
  728. $role = 1;
  729. if($is_docter){
  730. $role = 2;
  731. }
  732. $lists =[];
  733. if($role == 1){
  734. $ids = DocterOrganization::where(['organization_id'=>$org_id])->pluck('docter_id')->toArray();
  735. $list = Docter::whereIn('id',$ids)->get(['id','name']);
  736. foreach ($list as $val){
  737. $lists[] = ['value'=>$val->id,'label'=>$val->name];
  738. }
  739. $name = Organization::where('id',$org_id)->value('name');
  740. $user_id = $org_id;
  741. } else {
  742. $ids = DocterOrganization::where(['docter_id'=>$docter_id])->pluck('organization_id');
  743. $list = Organization::whereIn('id',$ids)->get(['id','name']);
  744. foreach ($list as $val){
  745. $lists[] = ['value'=>$val->id,'label'=>$val->name];
  746. }
  747. $name = Docter::where('id',$docter_id)->value('name');
  748. $user_id = $docter_id;
  749. }
  750. $data['user_id'] = $user_id;
  751. $data['name'] = $name;
  752. $data['role'] = $role;
  753. $data['list'] = $lists;
  754. return (json_encode(['code'=>200,'msg'=>'ok','data'=>$data]));
  755. }
  756. //获取图文订单
  757. public function get_chat_order()
  758. {
  759. $org_id = 1;
  760. // $docter_id = 1;
  761. $docter_id = request('docter_id');
  762. if(empty($docter_id)){
  763. return json_encode(['status'=>601,'msg'=>'缺少必要参数','data'=>'']);
  764. }
  765. $list = Order::where(['organization_id'=>$org_id,'docter_id'=>$docter_id,'order_status'=>3])->with('orderUser')->distinct('user_id')->get('user_id');
  766. $user_list = [];
  767. foreach ($list as $val){
  768. $user_list[] = [
  769. 'id'=>$val->user_id,
  770. 'avatar'=>$val->orderUser->avatar,
  771. 'name'=>$val->orderUser->nickname,
  772. ];
  773. }
  774. $data['docter'] = Docter::where('id',$docter_id)->first(['id','avatar','name']);
  775. $data['order_list'] = $user_list;
  776. return (json_encode(['code'=>200,'msg'=>'ok','data'=>$data]));
  777. }
  778. public function get_month_schedule()
  779. {
  780. $date = request('date');
  781. $start_time = strtotime($date);
  782. //$start_time = strtotime(date('Y-m',time()));
  783. $month_day = date("t",$start_time);
  784. $types = [1=>1,2=>2,3=>3];
  785. $status = [1=>true,2=>'other',3=>false];
  786. for($i=0;$i<$month_day;$i++){
  787. $now_time = $start_time + $i*86400;
  788. $now_date = date('Y-m-d',$now_time);
  789. $week = date('N',$now_time);
  790. $arr = [
  791. 1=>['status'=>false],
  792. 2=>['status'=>false],
  793. 3=>['status'=>false]
  794. ];
  795. if($i%2 == 0){
  796. $arr = [
  797. 1=>['status'=>true],
  798. 2=>['status'=>false],
  799. 3=>['status'=>false]
  800. ];
  801. }
  802. if($i%3 == 0){
  803. $arr = [
  804. 1=>['status'=>true],
  805. 2=>['status'=>true],
  806. 3=>['status'=>'other']
  807. ];
  808. }
  809. if($i%3 == 0){
  810. $arr = [
  811. 1=>['status'=>false],
  812. 2=>['status'=>false],
  813. 3=>['status'=>'other']
  814. ];
  815. }
  816. // $su = rand(1,3);
  817. // if($su == 0){
  818. // $arr = [];
  819. // } else {
  820. // $arr = array_rand($types,$su);
  821. // if(!is_array($arr)) {
  822. // $arr = [
  823. // 1=>['status'=>true],
  824. // 2=>['status'=>'other'],
  825. // 3=>['status'=>false]
  826. // ];
  827. // }
  828. // }
  829. $all_time[] = ['date'=>($i+1),'day'=>$now_date,'schedulelingList'=>$arr,'week'=>$week];
  830. }
  831. return apiReturn(200,'ok',$all_time);
  832. }
  833. }