FreeTimeRecord.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. class FreeTimeRecord extends MongoAr
  3. {
  4. public $_id;//时间戳,整点时间戳格式
  5. public $free_technician = array();//此时间段空闲保洁师列表
  6. public function __construct($scenario='insert'){
  7. $this->setMongoDBComponent(Yii::app()->getComponent('mongodb_o2o'));
  8. parent::__construct($scenario);
  9. }
  10. public static function model($className=__CLASS__)
  11. {
  12. return parent::model($className);
  13. }
  14. public static function get($_id) {
  15. $criteria = new EMongoCriteria();
  16. $criteria->_id('==', $_id);
  17. $model = self::model()->find($criteria);
  18. return $model;
  19. }
  20. /**
  21. * 获取所有可用时间戳
  22. */
  23. public function getAvailableTimeList() {
  24. $timeList = [];
  25. for ($index = 0; $index < 15; $index++) {
  26. $date = date('Ymd', strtotime('+'.$index.' days', time()));
  27. $timeList[$date] = [
  28. 'name' => date('m月d日', strtotime($date)),
  29. 'timestampList' => [
  30. strtotime($date.'0900'), strtotime($date.'1000'), strtotime($date.'1100'),
  31. strtotime($date.'1200'), strtotime($date.'1300'), strtotime($date.'1400'),
  32. strtotime($date.'1500'), strtotime($date.'1600'), strtotime($date.'1700'),
  33. strtotime($date.'1800'), strtotime($date.'1900'),
  34. ],
  35. ];
  36. }
  37. return $timeList;
  38. }
  39. /**
  40. * 获取某个保洁师的时间线
  41. * 0: 此时段未设置
  42. * 1: 此时段已设置且空闲
  43. * 2: 此时段已预约
  44. */
  45. public function getTechTimeline($tech_id){
  46. // 检索Order表
  47. $criteria = new EMongoCriteria();
  48. $timestamp_start_book = strtotime('today');
  49. $timestamp_end_book = strtotime('+15 day', strtotime('today'));
  50. $criteria->technician('==', $tech_id);
  51. $criteria->status('notin',array(-3,-2,-1,7));
  52. $criteria->booking_time('>=', $timestamp_start_book);
  53. $criteria->booking_time('<=', $timestamp_end_book);
  54. $criteria->sort('booking_time',EMongoCriteria::SORT_ASC);
  55. $cursor = ROrder::model()->findAll($criteria);
  56. $time_line = [];
  57. foreach ($cursor as $key => $order) {
  58. $booking_time = strtotime(date('YmdH00',$order->booking_time));
  59. $time_line[$booking_time] = 2;//此时段已预约
  60. }
  61. // 检索free_time_record表
  62. $free_list = array();
  63. $criteria = new EMongoCriteria();
  64. $criteria->free_technician('==', $tech_id);
  65. $criteria->sort('_id', EMongoCriteria::SORT_ASC);
  66. $cursor = FreeTimeRecord::model()->findAll($criteria);
  67. foreach ($cursor as $key => $value) {
  68. if(array_key_exists($value->_id, $time_line)){
  69. $value->TechUnsetFreetime($tech_id,$value->_id);
  70. }else{
  71. $time_line[$value->_id] = 1;//此时段空闲
  72. }
  73. }
  74. // 遍历availableTimeList生成TimeLine
  75. $availabelTimeList = $this->getAvailableTimeList();
  76. $data = [];
  77. foreach ($availabelTimeList as $key => $item) {
  78. $data[$key]['name'] = $item['name'];
  79. $data[$key]['selected'] = 0;
  80. $all_day = true;
  81. foreach ($item['timestampList'] as $k => $time) {
  82. if (array_key_exists($time, $time_line)) {
  83. $data[$key]['selectedHours'][] = $time_line[$time];
  84. $data[$key]['selected'] = 1;
  85. } else {
  86. $data[$key]['selectedHours'][] = 0;
  87. $all_day = false;
  88. }
  89. }
  90. $data[$key]['selected'] = $all_day ? 2 : $data[$key]['selected'];
  91. $data[$key]['selectedHours'] = array_merge(
  92. [0, 0, 0, 0, 0, 0, 0, 0, 0],
  93. $data[$key]['selectedHours'],
  94. [0, 0, 0, 0]
  95. );
  96. }
  97. return $data;
  98. }
  99. //设置某时段保洁师忙碌
  100. public static function TechUnsetFreetime($tech_id,$time_stamp){
  101. if($time_stamp > time()+86400*15 || $time_stamp < strtotime('today') ){
  102. return false;
  103. }
  104. $time_record = self::get($time_stamp);
  105. if($time_record){
  106. $old_free_list = $time_record->free_technician;
  107. if(in_array($tech_id,$old_free_list) !== false){
  108. unset($old_free_list[array_search($tech_id,$old_free_list)]);
  109. $time_record->free_technician = array_values($old_free_list);
  110. return $time_record->update(array('free_technician'),true);
  111. }else{
  112. return true;
  113. }
  114. }else{
  115. return true;
  116. }
  117. }
  118. //设置保洁师某时段空闲
  119. public static function TechsetFreetime($tech_id,$time_stamp){
  120. if($time_stamp > time()+86400*15 || $time_stamp < strtotime('today') ){
  121. return false;
  122. }
  123. $time_record = self::get($time_stamp);
  124. if($time_record){
  125. $old_free_list = $time_record->free_technician;
  126. if(in_array($tech_id,$old_free_list)){
  127. return true;
  128. }else{
  129. $old_free_list[] = $tech_id;
  130. $time_record->free_technician = array_values($old_free_list);
  131. return $time_record->update(array('free_technician'),true);
  132. }
  133. }else{
  134. $time_record = new FreeTimeRecord();
  135. $time_record->_id = $time_stamp;
  136. $time_record->free_technician = array($tech_id);
  137. return $time_record->save();
  138. }
  139. }
  140. public function getCollectionName()
  141. {
  142. return 'free_time_record';
  143. }
  144. /**
  145. * 空闲时间段格式转换
  146. * 具体时间 -> 明天9:00
  147. */
  148. public static function parseFreeTime($time) {
  149. $today = date('Ymd');
  150. // 时间整理
  151. $hour = date('H', $time);
  152. if (intval($hour) != 10 && intval($hour) != 0) {
  153. $hour = str_replace('0', '', $hour);
  154. }
  155. $min = date('i', $time);
  156. $parsedTime = $hour.':'.$min;
  157. // 是否今天
  158. if ($today == date('Ymd', $time)) {
  159. return '今天 '.$parsedTime;
  160. // 是否明天
  161. } else if ($today == date('Ymd', strtotime('-1 day', $time))) {
  162. return '明天 '.$parsedTime;
  163. // 是否后天
  164. } else if ($today == date('Ymd', strtotime('-2 day', $time))) {
  165. return '后天 '.$parsedTime;
  166. } else {
  167. $month = date('m', $time);
  168. $day = date('d', $time);
  169. if (intval($month) != 10) {
  170. $month = str_replace('0', '', $month);
  171. }
  172. if (!in_array(intval($day), [10, 20, 30])) {
  173. $day = str_replace('0', '', $day);
  174. }
  175. return $month.'-'.$day.' '.$parsedTime;
  176. }
  177. }
  178. }