Wenzhen.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. namespace app\api\controller\tvuser;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use addons\epay\library\Service;
  6. use app\common\library\Tenim;
  7. use app\common\model\Wenzhenorder;
  8. /**
  9. * 问诊订单
  10. */
  11. class Wenzhen extends Api
  12. {
  13. protected $noNeedLogin = '';
  14. protected $noNeedRight = '*';
  15. //添加成员
  16. private function add_member(){
  17. $field = [
  18. 'gender',
  19. 'age',
  20. 'marital_status',
  21. 'allergies_status',
  22. 'familymedical_status',
  23. 'chronicdisease_status',
  24. ];
  25. $data = request_post_hub($field);
  26. $data['user_id'] = $this->auth->id;
  27. return $data;
  28. }
  29. //检查是否月vip
  30. private function checkvip(){
  31. $tv_userid = $this->auth->tv_userid;
  32. return true;
  33. }
  34. //创建订单
  35. public function create_order(){
  36. //判断用户来源
  37. if($this->auth->comefrom != 2){
  38. $this->error('用户错误');
  39. }
  40. //判断是否是电视盒子月vip
  41. $checkvip = $this->checkvip();
  42. if(!$checkvip){
  43. $this->error('您还不是月VIP');
  44. }
  45. $member_data = $this->add_member();
  46. //问诊信息
  47. $doctor_id = input('doctor_id',0);
  48. $ordertype = 2;
  49. $book_date = input('book_date',0); //2024-05-05
  50. $book_hour = input('book_time',0); //10:00
  51. $book_time = strtotime($book_date.' '.$book_hour);
  52. $auth_id = $this->auth->id;
  53. $order_no = createUniqueNo('TV',$auth_id);
  54. //医生信息
  55. $doctor_info = Db::name('doctor_info')->where('doctor_id',$doctor_id)->find();
  56. if(empty($doctor_info)){
  57. $this->error('不存在的医生');
  58. }
  59. //价格
  60. $price = 0;
  61. if($ordertype == 2){
  62. if($doctor_info['video_switch'] != 1){
  63. $this->error('该医生未开通视频问诊');
  64. }
  65. }
  66. //排班判断
  67. if($ordertype == 2){
  68. //检查
  69. if($book_time < time() + 7200){
  70. //测试临时屏蔽
  71. //$this->error('最早只能预约'.date('m-d H:00',time() + 10800)); //最早预约两个小时后的一个整点
  72. }
  73. //排班状态
  74. $doctor_paiban = Db::name('doctor_paiban')->where('doctor_id',$doctor_id)->where('activetime',$book_time)->find();
  75. if(empty($doctor_paiban)){
  76. $this->error('您预约的时间该医生无法接诊');
  77. }
  78. if($doctor_paiban['active'] != 1){
  79. $this->error('您预约的时间该医生无法接诊');
  80. }
  81. //是否排满
  82. $map = [
  83. 'doctor_id' => $doctor_id,
  84. 'book_time' => $book_time,
  85. 'ordertype' => 2,
  86. 'status' => ['IN','10,20,25,30'],
  87. ];
  88. $order_count = Db::name('wenzhen_order')->where($map)->count();
  89. if($order_count >= 4){
  90. $this->error('该时间点已排满');
  91. }
  92. }
  93. //订单数据
  94. $order_data = [
  95. 'order_no' => $order_no,
  96. 'user_id' => $auth_id,
  97. 'member_id' => 0,
  98. 'doctor_id' => $doctor_id,
  99. 'ordertype' => $ordertype,
  100. 'total_fee' => $price,
  101. 'book_time' => $book_time,
  102. 'createtime' => time(),
  103. 'status' => 10,//订单状态enum
  104. 'pay_type' => 'tvvip',
  105. 'pay_time' => time(),
  106. 'comefrom' => 2,
  107. ];
  108. Db::startTrans();
  109. //下单
  110. $order_id = Db::name('wenzhen_order')->insertGetId($order_data);
  111. if(!$order_id){
  112. Db::rollback();
  113. $this->error('下单失败');
  114. }
  115. //订单附表,就诊人信息
  116. $member_data['order_id'] = $order_id;
  117. $order_member_id = Db::name('wenzhen_order_member')->insertGetId($member_data);
  118. if(!$order_member_id){
  119. Db::rollback();
  120. $this->error('下单失败');
  121. }
  122. //
  123. Db::commit();
  124. $this->success('下单成功',$order_id);
  125. }
  126. //订单列表
  127. public function order_list(){
  128. $status = input('status','all');
  129. $where = ['user_id'=>$this->auth->id];
  130. if($status != 'all'){
  131. $where['order.status'] = $status;
  132. if($status == 20){// 已接诊、问诊中
  133. $where['order.status'] = ['IN',[20,25]];
  134. }
  135. }
  136. $field = [
  137. 'order.id','order.order_no','order.book_time','order.status','order.ordertype','order.accept_time','order.video_time','order.doctor_id',
  138. 'doctor.avatar as doctor_avatar','doctor.nickname as doctor_nickname','doctor.hospital as doctor_hospital',
  139. 'keshi.name as keshi_name',
  140. 'level.name as level_name',
  141. ];
  142. $list = Db::name('wenzhen_order')->alias('order')
  143. ->field($field)
  144. ->join('doctor','order.doctor_id = doctor.id','LEFT')
  145. ->join('doctor_level level','doctor.level_id = level.id','LEFT')
  146. ->join('keshi','doctor.keshi_id = keshi.id','LEFT')
  147. ->order('order.id desc')
  148. ->where($where)
  149. ->autopage()->select();
  150. $list = list_domain_image($list,['doctor_avatar']);
  151. if(!empty($list)){
  152. //循环处理
  153. foreach($list as $key => $val){
  154. //医生原因的退款,都直接算到退珍
  155. if(in_array($val['status'],[16,18,22])){
  156. $val['status'] = 100;
  157. }
  158. //视频拨打中 也算问诊中
  159. if($val['status'] == 25){
  160. $val['status'] = 20;
  161. }
  162. $list[$key] = $val;
  163. }
  164. }
  165. $this->success(1,$list);
  166. }
  167. //用户发起退珍
  168. //因为存在第三方,悲观锁
  169. public function tuizhen(){
  170. $apilimit = $this->apiLimit();
  171. if(!$apilimit){
  172. $this->error('操作频繁');
  173. }
  174. //订单详情
  175. $order_id = input('order_id',0);
  176. Db::startTrans();
  177. $wenzhen_order = Db::name('wenzhen_order')->where('user_id',$this->auth->id)->where('comefrom',2)->where('id',$order_id)->lock(true)->find();
  178. if(empty($wenzhen_order)){
  179. Db::rollback();
  180. $this->error('不存在的订单');
  181. }
  182. //仅限视频订单
  183. if($wenzhen_order['ordertype'] == 1){
  184. Db::rollback();
  185. $this->error('图文问诊不能退诊');
  186. }
  187. //状态限制
  188. if(!in_array($wenzhen_order['status'],[10,20])){
  189. Db::rollback();
  190. $this->error('当前订单不能退诊');
  191. }
  192. //修改订单
  193. $nowtime = time();
  194. $update = [
  195. 'status' => 13,
  196. 'cancel_time' => $nowtime,
  197. 'cancel_reason' => '用户退诊',
  198. 'finish_time' => $nowtime,
  199. ];
  200. $update_rs = Db::name('wenzhen_order')->where('id',$order_id)->update($update);
  201. if(!$update_rs){
  202. Db::rollback();
  203. $this->error('退诊失败');
  204. }
  205. Db::commit();
  206. $this->success('退珍成功');
  207. }
  208. }