Usercenter.php 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use app\common\library\Email;
  6. /**
  7. * 会员中心
  8. */
  9. class Usercenter extends Api
  10. {
  11. protected $noNeedLogin = [];
  12. protected $noNeedRight = ['*'];
  13. //我的配套
  14. //预存配套
  15. public function my_package(){
  16. $user_status = input('user_status',1); //默认已启用
  17. $map = [
  18. 'order.user_id' => $this->auth->id,
  19. 'order.order_status' => 1,
  20. //'order.remain' => ['gt',0],
  21. 'order.is_gift' => 0,
  22. 'order.use_status' => $user_status,
  23. ];
  24. $list = Db::name('package_order')->alias('order')
  25. ->field('order.id,order.starttime,order.endtime,order.days,order.is_gift,order.remain,order.price,order.use_apply_status,order.createtime,order.pay_type,order.remark,
  26. p.name,p.name_en,p.image,p.activeremark,p.activeremark_en,p.validity,p.validity_en')
  27. ->join('lesson_package p','order.package_id = p.id','LEFT')
  28. ->where($map)->order('order.remain desc,order.endtime asc')
  29. ->autopage()->select();
  30. $list = $this->list_lang($list,['name','activeremark','validity']);
  31. $list = list_domain_image($list,['image']);
  32. if(!empty($list)){
  33. foreach($list as $key => &$val){
  34. //转换remain
  35. $val['remain'] = floatval($val['remain']);
  36. //日期
  37. $val['time_text'] = $this->date_lang($val['starttime']).'-'.$this->date_lang($val['endtime']);
  38. $val['createtime_text'] = $this->date_lang($val['createtime']);
  39. //是否有延期按钮
  40. $val['expired'] = 0;
  41. if($val['endtime'] < time()){
  42. $val['expired'] = 1;
  43. }
  44. //支付方式
  45. $val['pay_type_text'] = $val['pay_type'] == 1 ? '线上支付' : '线下支付('.$val['remark'].')';
  46. $val['pay_type_text_en'] = $val['pay_type'] == 1 ? 'Paid Online' : 'Paid Offline ('.$val['remark'].')';
  47. }
  48. $list = $this->list_lang($list,['pay_type_text']);
  49. }
  50. $this->success(1,$list);
  51. }
  52. //未激活配套,申请激活
  53. public function package_use_apply(){
  54. $id = input('id',0);
  55. $map = [
  56. 'id' => $id,
  57. 'user_id' => $this->auth->id,
  58. 'order_status' => 1,
  59. 'is_gift' => 0,
  60. 'use_status' => 0,
  61. ];
  62. $info = Db::name('package_order')->where($map)->find();
  63. if(empty($info)){
  64. $this->error('未找到配套,请刷新重试');
  65. }
  66. if($info['use_apply_status'] == 1){
  67. $this->error('已经申请过了,无需重复操作');
  68. }
  69. if($info['use_apply_status'] == 2){
  70. $this->error('已经激活了,无需重复操作');
  71. }
  72. Db::name('package_order')->where('id',$id)->update(['use_apply_status'=>1]);
  73. $this->success('申请成功');
  74. }
  75. //赠课记录,已启用的赠送配套
  76. public function package_gift(){
  77. $map = [
  78. 'order.user_id' => $this->auth->id,
  79. 'order.order_status' => 1,
  80. //'order.remain' => ['gt',0],
  81. 'order.is_gift' => 1,
  82. 'order.use_status' => 1,
  83. ];
  84. $list = Db::name('package_order')->alias('order')
  85. ->field('order.id,order.order_no,order.starttime,order.endtime,order.days,order.is_gift,order.sessions,order.remain,order.use_status,
  86. p.name as package_name,p.name_en as package_name_en')
  87. ->join('lesson_package p','order.package_id = p.id','LEFT')
  88. ->where($map)->order('order.remain desc,order.endtime asc')
  89. ->autopage()->select();
  90. $list = $this->list_lang($list,['package_name']);
  91. foreach($list as $key => &$order){
  92. //转换remain
  93. $order['remain'] = floatval($order['remain']);
  94. //日期
  95. $order['showtime_text'] = $this->date_lang($order['starttime']).'-'.$this->date_lang($order['endtime']);
  96. $order['remark'] = __('购买套餐赠送').' '.$order['remain'].'/'.$order['sessions'];
  97. }
  98. $this->success(1,$list);
  99. }
  100. //上课记录,预约点了名的
  101. //前端用不到了
  102. public function lesson_order_finish(){
  103. $map = [
  104. 'order.user_id' => $this->auth->id,
  105. 'order.order_status' => 20,//已点名
  106. 'order.usernumber_sign' => ['gt',0],
  107. ];
  108. $list = Db::name('lesson_order')->alias('order')
  109. ->field([
  110. 'order.id','order.order_amount','order.paytype','order.package_order_id','order.package_remark','order.trylesson_order_id','order.userremark','order.usernumber','order.jointype',
  111. 'lesson.name','lesson.name_en',
  112. 'slot.starttime','slot.hours','slot.address','slot.coach_ids',
  113. 'coach.nickname as coach_text'
  114. ])
  115. ->join('lesson_slot slot','order.slot_id = slot.id','LEFT')
  116. ->join('lesson','order.lesson_id = lesson.id','LEFT')
  117. ->join('coach','slot.coach_ids = coach.id','LEFT')
  118. ->where($map)
  119. ->order('slot.starttime desc,order.id desc')
  120. ->autopage()->select();
  121. $list = $this->list_lang($list,['name']);
  122. foreach($list as $key => &$order){
  123. //hours转换
  124. $order['hours'] = floatval($order['hours']);
  125. //24小时内可以申请取消
  126. $order['can_cancel'] = 0;
  127. //显示时间
  128. $order['showtime_text'] = $this->weektime_lang($order['starttime']);
  129. //备注
  130. if(!empty($order['userremark'])){
  131. $order['userremark'] = __('备注:').$order['userremark'];
  132. }else{
  133. $order['userremark'] = '';
  134. }
  135. //预约情况
  136. $yuyue = $order['usernumber'] . ($order['jointype'] == 1 ? ' 人预约' : ' 人候补');
  137. $yuyue_en = $order['usernumber'] . ($order['jointype'] == 1 ? ' Booked' : ' Waitlisted');
  138. $yuyue = $this->lang == 'en' ? $yuyue_en : $yuyue;
  139. $order['coach_text'] = $yuyue.' '.$order['coach_text'];
  140. //放入支付套餐
  141. $order['package_name'] = '';
  142. $order['package_name_en'] = '';
  143. $order['package_showtime_text'] = '';
  144. if($order['paytype'] == 1){
  145. $package_order = Db::name('package_order')->alias('order')
  146. ->field('p.name,p.name_en,order.starttime,order.endtime')
  147. ->join('lesson_package p','order.package_id = p.id','LEFT')
  148. ->where('order.id',$order['package_order_id'])->find();
  149. if(!empty($package_order)){
  150. $order['package_name'] = $package_order['name'];
  151. $order['package_name_en'] = $package_order['name_en'];
  152. /*$order['package_starttime'] = $package_order['starttime'];
  153. $order['package_endtime'] = $package_order['endtime'];*/
  154. $order['package_showtime_text'] = $this->date_lang($package_order['starttime']).'-'.$this->date_lang($package_order['endtime']);
  155. }
  156. }
  157. if($order['paytype'] == 4){
  158. $trylesson_order = Db::name('trylesson_order')->alias('order')
  159. ->field('t.name,t.name_en,order.starttime,order.endtime')
  160. ->join('trylesson t','order.trylesson_id = t.id','LEFT')
  161. ->where('order.id',$order['trylesson_order_id'])->find();
  162. if(!empty($trylesson_order)){
  163. $order['package_name'] = $trylesson_order['name'];
  164. $order['package_name_en'] = $trylesson_order['name_en'];
  165. /*$order['package_starttime'] = $trylesson_order['starttime'];
  166. $order['package_endtime'] = $trylesson_order['endtime'];*/
  167. $order['package_showtime_text'] = $this->date_lang($trylesson_order['starttime']).'-'.$this->date_lang($trylesson_order['endtime']);
  168. }
  169. }
  170. if($order['paytype'] == 2){
  171. $order['package_name'] = '在线支付';
  172. $order['package_name_en'] = 'Pay online';
  173. $order['package_showtime_text'] = '';
  174. }
  175. }
  176. $list = $this->list_lang($list,['package_name']);
  177. $this->success(1,$list);
  178. }
  179. //过往记录,取消了的+点了名的
  180. public function lesson_order_cancel(){
  181. $map = [
  182. 'order.user_id' => $this->auth->id,
  183. 'order.order_status' => ['IN',[20,30,40]],
  184. ];
  185. $list = Db::name('lesson_order')->alias('order')
  186. ->field([
  187. 'order.id','order.order_amount','order.paytype','order.package_order_id','order.package_remark','order.trylesson_order_id','order.userremark','order.usernumber','order.jointype','order.cancel_reason','order.order_status',
  188. 'lesson.name','lesson.name_en',
  189. 'slot.starttime','slot.hours','slot.address','slot.coach_ids',
  190. 'coach.nickname as coach_text',
  191. 'danceroom.name as danceroom_name','danceroom.name_en as danceroom_name_en',
  192. ])
  193. ->join('lesson_slot slot','order.slot_id = slot.id','LEFT')
  194. ->join('lesson','order.lesson_id = lesson.id','LEFT')
  195. ->join('coach','slot.coach_ids = coach.id','LEFT')
  196. ->join('danceroom','slot.danceroom_id = danceroom.id','LEFT')
  197. ->where($map)
  198. ->order('slot.starttime desc,order.id desc')
  199. ->autopage()->select();
  200. $list = $this->list_lang($list,['name']);
  201. foreach($list as $key => &$order){
  202. //hours转换
  203. $order['hours'] = floatval($order['hours']);
  204. //24小时内可以申请取消
  205. $order['can_cancel'] = 0;
  206. //显示时间
  207. $order['showtime_text'] = $this->weektime_lang($order['starttime']);
  208. //备注
  209. if(!empty($order['userremark'])){
  210. $order['userremark'] = __('备注:').$order['userremark'];
  211. }else{
  212. $order['userremark'] = '';
  213. }
  214. //预约情况
  215. $yuyue = $order['usernumber'] . ($order['jointype'] == 1 ? ' 人预约' : ' 人候补');
  216. $yuyue_en = $order['usernumber'] . ($order['jointype'] == 1 ? ' Booked' : ' Waitlisted');
  217. $yuyue = $this->lang == 'en' ? $yuyue_en : $yuyue;
  218. //舞蹈室
  219. $danceroom = $this->lang == 'en' ? $order['danceroom_name_en'] : $order['danceroom_name'];
  220. unset($order['danceroom_name']);
  221. unset($order['danceroom_name_en']);
  222. $order['coach_text'] = $yuyue." ".$order['coach_text']."\n".$danceroom;
  223. //放入支付套餐
  224. $order['package_name'] = '';
  225. $order['package_name_en'] = '';
  226. $order['package_showtime_text'] = '';
  227. if($order['paytype'] == 1){
  228. $package_order = Db::name('package_order')->alias('order')
  229. ->field('p.name,p.name_en,order.starttime,order.endtime')
  230. ->join('lesson_package p','order.package_id = p.id','LEFT')
  231. ->where('order.id',$order['package_order_id'])->find();
  232. if(!empty($package_order)){
  233. $order['package_name'] = $package_order['name'];
  234. $order['package_name_en'] = $package_order['name_en'];
  235. /*$order['package_starttime'] = $package_order['starttime'];
  236. $order['package_endtime'] = $package_order['endtime'];*/
  237. $order['package_showtime_text'] = $this->date_lang($package_order['starttime']).'-'.$this->date_lang($package_order['endtime']);
  238. }
  239. }
  240. if($order['paytype'] == 4){
  241. $trylesson_order = Db::name('trylesson_order')->alias('order')
  242. ->field('t.name,t.name_en,order.starttime,order.endtime')
  243. ->join('trylesson t','order.trylesson_id = t.id','LEFT')
  244. ->where('order.id',$order['trylesson_order_id'])->find();
  245. if(!empty($trylesson_order)){
  246. $order['package_name'] = $trylesson_order['name'];
  247. $order['package_name_en'] = $trylesson_order['name_en'];
  248. /*$order['package_starttime'] = $trylesson_order['starttime'];
  249. $order['package_endtime'] = $trylesson_order['endtime'];*/
  250. $order['package_showtime_text'] = $this->date_lang($trylesson_order['starttime']).'-'.$this->date_lang($trylesson_order['endtime']);
  251. }
  252. }
  253. if($order['paytype'] == 2){
  254. $order['package_name'] = '在线支付';
  255. $order['package_name_en'] = 'Pay online';
  256. $order['package_showtime_text'] = '';
  257. }
  258. //状态:0=待支付,10=已支付,20=已点名,30=已取消,40=已退课
  259. $status_arr = [20=>'已完成',30=>'已取消',40=>'已取消'];
  260. $status_arr_en = [20=>'Finished',30=>'Canceled',40=>'Canceled'];
  261. $order['status_text'] = $status_arr[$order['order_status']];
  262. $order['status_text_en'] = $status_arr_en[$order['order_status']];
  263. }
  264. $list = $this->list_lang($list,['package_name','status_text']);
  265. $this->success(1,$list);
  266. }
  267. //售课预约单 执行取消
  268. public function cancel_lesson_order(){
  269. $order_id = input('order_id',0);
  270. $map = [
  271. 'id' => $order_id,
  272. 'user_id' => $this->auth->id,
  273. ];
  274. Db::startTrans();
  275. $lesson_order = Db::name('lesson_order')->where($map)->lock(true)->find();
  276. //取消候补单
  277. if($lesson_order['jointype'] == 2){
  278. $update = [
  279. 'order_status' => 30,
  280. 'cancel_time' => time(),
  281. 'cancel_reason' => __('用户主动取消'),
  282. ];
  283. $rs = Db::name('lesson_order')->where($map)->update($update);
  284. Db::commit();
  285. $this->success('取消完成');
  286. }
  287. //剩下的都是预约单
  288. if($lesson_order['order_status'] != 10){
  289. Db::rollback();
  290. $this->error('此订单已无法取消');
  291. }
  292. //还有24小时上课,不能取消
  293. $slot = Db::name('lesson_slot')->where('id',$lesson_order['slot_id'])->find();
  294. if($slot['starttime'] - time() <= 86400){
  295. Db::rollback();
  296. $this->error('距离上课时间不足24小时,不能取消');
  297. }
  298. //套餐给加回去
  299. if($lesson_order['paytype'] == 1){
  300. $package_order = Db::name('package_order')->where('id',$lesson_order['package_order_id'])->lock(true)->find();
  301. $update = [
  302. 'remain' => bcadd($package_order['remain'],$lesson_order['usernumber_hours'],1),
  303. 'updatetime' => time(),
  304. ];
  305. $rs_remain = Db::name('package_order')->where('id',$lesson_order['package_order_id'])->update($update);
  306. if($rs_remain === false){
  307. Db::rollback();
  308. $this->error('取消失败');
  309. }
  310. }
  311. //试课给改回去
  312. if($lesson_order['paytype'] == 4){
  313. $update = [
  314. 'order_status' => 10,
  315. 'updatetime' => time(),
  316. 'lesson_order_id' => 0,
  317. ];
  318. $rs_remain = Db::name('trylesson_order')->where('id',$lesson_order['trylesson_order_id'])->update($update);
  319. if($rs_remain === false){
  320. Db::rollback();
  321. $this->error('取消失败');
  322. }
  323. }
  324. //现金支付不给退,线下处理
  325. //取消预约单
  326. $update = [
  327. 'order_status' => 30,
  328. 'cancel_time' => time(),
  329. 'cancel_reason' => __('用户主动取消'),
  330. ];
  331. if($lesson_order['paytype'] == 1 || $lesson_order['paytype'] == 4){
  332. $update['order_status'] = 40;
  333. }
  334. $rs = Db::name('lesson_order')->where($map)->update($update);
  335. if($rs === false){
  336. Db::rollback();
  337. $this->error('取消失败');
  338. }
  339. //候补上位
  340. $wait_rs = $this->lesson_order_wait($lesson_order,$slot);
  341. //更新已预约人数
  342. $pay_number = Db::name('lesson_order')->where('slot_id',$lesson_order['slot_id'])->where('order_status',10)->sum('usernumber');
  343. $rs_slot = Db::name('lesson_slot')->where('id',$lesson_order['slot_id'])->update(['bookednum' => $pay_number]);
  344. if($rs_slot === false){
  345. Db::rollback();
  346. $this->error('取消失败');
  347. }
  348. Db::commit();
  349. $this->success('取消完成');
  350. }
  351. //候补上位
  352. private function lesson_order_wait($lesson_order,$slot){
  353. //找到所有的候补单
  354. $houbu_list = Db::name('lesson_order')->alias('order')
  355. ->field('order.*,user.firstname,user.lastname,user.email,user.whatsapp,lesson.name_en')
  356. ->join('user','order.user_id = user.id','LEFT')
  357. ->join('lesson','order.lesson_id = lesson.id','LEFT')
  358. ->where('order.slot_id',$lesson_order['slot_id'])->where('order.jointype',2)->where('order.order_status',0)->order('order.id asc')->select();
  359. //有多少个空位
  360. $pay_number = Db::name('lesson_order')->where('slot_id',$lesson_order['slot_id'])->where('jointype',1)->where('order_status',10)->sum('usernumber');
  361. $num_remain = $slot['num_max'] - $pay_number;
  362. $coach_name = Db::name('coach')->where('id',$slot['coach_ids'])->value('nickname');
  363. if(!empty($houbu_list)){
  364. $up_usernumber = 0; //此次循环转正的人数
  365. foreach($houbu_list as $key => $order){
  366. if($order['usernumber'] + $up_usernumber <= $num_remain){
  367. //此订单可以转正
  368. //检查可用的套餐,找一个就可以
  369. $map = [
  370. 'user_id' => $order['user_id'],
  371. 'endtime' => ['gt',time()],
  372. 'remain' => ['gt',$order['usernumber_hours']],
  373. 'order_status' => 1,
  374. 'use_status' => 1, //已激活的
  375. 'id' => $order['package_order_id'],
  376. ];
  377. $package_order = Db::name('package_order')->where($map)->where('find_in_set(:lesson_ids,lesson_ids)', ['lesson_ids' => $slot['lesson_id']])->lock(true)->find();
  378. if(!$package_order){
  379. continue;
  380. }
  381. //扣除一节。
  382. $update = [
  383. 'remain' => bcsub($package_order['remain'],$order['usernumber_hours'],1),
  384. 'updatetime' => time(),
  385. ];
  386. $rs1 = Db::name('package_order')->where('id',$package_order['id'])->update($update);
  387. if($rs1 === false){
  388. Db::rollback();
  389. // $this->error('扣除套餐余额失败');
  390. $this->error('取消失败');
  391. }
  392. //修改预约单数据。延迟到转正的时候处理
  393. $update_order['order_amount'] = 0;
  394. $update_order['order_status'] = 10;
  395. $update_order['paytime'] = time();
  396. $update_order['package_order_id'] = $package_order['id'];
  397. $update_order['package_remark'] = ($package_order['sessions'] - $package_order['remain']) . '-' . ($package_order['sessions'] - $package_order['remain'] + $order['usernumber_hours']) .'/'. $package_order['sessions'];
  398. $update_order['paytype'] = 1; //修改支付方式为配套
  399. $update_order['jointype'] = 1; //修改加入方式为预约
  400. $rs2 = Db::name('lesson_order')->where('id',$order['id'])->update($update_order);
  401. if($rs2 === false){
  402. Db::rollback();
  403. // $this->error('扣除套餐余额失败');
  404. $this->error('取消失败');
  405. }
  406. //加上本次转正的人数
  407. $up_usernumber += $order['usernumber'];
  408. //额外的通知
  409. $obj = new Email();
  410. try {
  411. //给这些用户发邮件
  412. $result = $obj
  413. ->to($order['email'])
  414. ->subject('Elin Dance Studio 您候补预订的课程已转为正式预约')
  415. ->message('Hi,'.$order['firstname']. ' ' .$order['lastname'].',您候补预定的课程['.$order['name_en'].']即时起已转为正式预约,时间:'.date('Y-m-d H:i',$slot['starttime']).',请及时来上课!')
  416. ->send();
  417. //发whatsapp
  418. $parameters = [
  419. [
  420. 'type' => 'text',
  421. 'text' => $order['firstname'].' '.$order['lastname'],
  422. ],
  423. [
  424. 'type' => 'text',
  425. 'text' => $order['name_en'],
  426. ],
  427. [
  428. 'type' => 'text',
  429. 'text' => $coach_name,
  430. ],
  431. [
  432. 'type' => 'text',
  433. 'text' => date('Y-m-d H:i',$slot['starttime']),
  434. ],
  435. ];
  436. $this->whatapp($order['whatsapp'],'lessonorder_alternate_to_booking','en_US',$parameters);
  437. } catch (Exception $e) {
  438. }
  439. //额外的通知
  440. }else{
  441. continue;//跳出
  442. }
  443. }
  444. }
  445. return true;
  446. }
  447. //发送whatapp消息的方法
  448. private function whatapp($receive_mobile,$template,$code,$parameters){
  449. if(empty($receive_mobile)){return true;}
  450. $token = config('site.whatsapp_token');
  451. //发送者
  452. $mobile_id = '337736419413019'; //Elin Dance Stuido 2:+65 8015 4154 , WhatsApp Business Account ID: 336509229537586
  453. //发送
  454. $url = 'https://graph.facebook.com/v19.0/'.$mobile_id.'/messages';
  455. $header = [
  456. 'Authorization: Bearer ' . $token,
  457. 'Content-Type: application/json',
  458. ];
  459. $body = [
  460. 'messaging_product' => 'whatsapp',
  461. 'recipient_type' => 'individual',
  462. 'to' => $receive_mobile,
  463. 'type' => 'template',
  464. 'template' => [
  465. 'name' => $template,
  466. 'language' => [
  467. 'code' => $code
  468. ],
  469. 'components' => [
  470. [
  471. 'type' => 'body',
  472. 'parameters' => $parameters
  473. ]
  474. ],
  475. ],
  476. ];
  477. $body = json_encode($body);
  478. $rs = curl_post($url,$body,$header);
  479. return true;
  480. }
  481. //过期课程。就是过了上课时间,没签到的
  482. //前端用不到了
  483. public function lesson_order_signout(){
  484. $map = [
  485. 'order.user_id' => $this->auth->id,
  486. 'order.order_status' => 20,//已点名
  487. 'order.usernumber_sign' => 0,//没签到的
  488. ];
  489. $list = Db::name('lesson_order')->alias('order')
  490. ->field([
  491. 'order.id','order.order_amount','order.paytype','order.package_order_id','order.package_remark','order.trylesson_order_id','order.userremark','order.usernumber','order.jointype',
  492. 'lesson.name','lesson.name_en',
  493. 'slot.starttime','slot.hours','slot.address','slot.coach_ids',
  494. 'coach.nickname as coach_text'
  495. ])
  496. ->join('lesson_slot slot','order.slot_id = slot.id','LEFT')
  497. ->join('lesson','order.lesson_id = lesson.id','LEFT')
  498. ->join('coach','slot.coach_ids = coach.id','LEFT')
  499. ->where($map)
  500. ->order('slot.starttime desc,order.id desc')
  501. ->autopage()->select();
  502. $list = $this->list_lang($list,['name']);
  503. foreach($list as $key => &$order){
  504. //hours转换
  505. $order['hours'] = floatval($order['hours']);
  506. //24小时内可以申请取消
  507. $order['can_cancel'] = 0;
  508. //显示时间
  509. $order['showtime_text'] = $this->weektime_lang($order['starttime']);
  510. //备注
  511. if(!empty($order['userremark'])){
  512. $order['userremark'] = __('备注:').$order['userremark'];
  513. }else{
  514. $order['userremark'] = '';
  515. }
  516. //预约情况
  517. $yuyue = $order['usernumber'] . ($order['jointype'] == 1 ? ' 人预约' : ' 人候补');
  518. $yuyue_en = $order['usernumber'] . ($order['jointype'] == 1 ? ' Booked' : ' Waitlisted');
  519. $yuyue = $this->lang == 'en' ? $yuyue_en : $yuyue;
  520. $order['coach_text'] = $yuyue.' '.$order['coach_text'];
  521. //放入支付套餐
  522. $order['package_name'] = '';
  523. $order['package_name_en'] = '';
  524. $order['package_showtime_text'] = '';
  525. if($order['paytype'] == 1){
  526. $package_order = Db::name('package_order')->alias('order')
  527. ->field('p.name,p.name_en,order.starttime,order.endtime')
  528. ->join('lesson_package p','order.package_id = p.id','LEFT')
  529. ->where('order.id',$order['package_order_id'])->find();
  530. if(!empty($package_order)){
  531. $order['package_name'] = $package_order['name'];
  532. $order['package_name_en'] = $package_order['name_en'];
  533. /*$order['package_starttime'] = $package_order['starttime'];
  534. $order['package_endtime'] = $package_order['endtime'];*/
  535. $order['package_showtime_text'] = $this->date_lang($package_order['starttime']).'-'.$this->date_lang($package_order['endtime']);
  536. }
  537. }
  538. if($order['paytype'] == 4){
  539. $trylesson_order = Db::name('trylesson_order')->alias('order')
  540. ->field('t.name,t.name_en,order.starttime,order.endtime')
  541. ->join('trylesson t','order.trylesson_id = t.id','LEFT')
  542. ->where('order.id',$order['trylesson_order_id'])->find();
  543. if(!empty($trylesson_order)){
  544. $order['package_name'] = $trylesson_order['name'];
  545. $order['package_name_en'] = $trylesson_order['name_en'];
  546. /*$order['package_starttime'] = $trylesson_order['starttime'];
  547. $order['package_endtime'] = $trylesson_order['endtime'];*/
  548. $order['package_showtime_text'] = $this->date_lang($trylesson_order['starttime']).'-'.$this->date_lang($trylesson_order['endtime']);
  549. }
  550. }
  551. if($order['paytype'] == 2){
  552. $order['package_name'] = '在线支付';
  553. $order['package_name_en'] = 'Pay online';
  554. $order['package_showtime_text'] = '';
  555. }
  556. }
  557. $list = $this->list_lang($list,['package_name']);
  558. $this->success(1,$list);
  559. }
  560. //课程预约,即将到来24小时,售课
  561. //用不到了
  562. public function lesson_order_near(){
  563. $starttime = strtotime(date('Y-m-d')); //今天早上
  564. // $todaytime = strtotime(date('Y-m-d')) + 86400*3 - 1; //后天晚上
  565. $todaytime = time() + 86400; //未来24小时
  566. $map = [
  567. 'order.user_id' => $this->auth->id,
  568. 'slot.starttime' => ['BETWEEN',[$starttime,$todaytime]],
  569. ];
  570. $list = Db::name('lesson_order')->alias('order')
  571. ->field([
  572. 'order.id','order.order_amount','order.paytype','order.package_order_id','order.package_remark','order.trylesson_order_id','order.userremark','order.usernumber','order.jointype',
  573. 'lesson.name','lesson.name_en',
  574. 'slot.starttime','slot.hours','slot.address','slot.coach_ids',
  575. 'coach.nickname as coach_text',
  576. 'danceroom.name as danceroom_name','danceroom.name_en as danceroom_name_en',
  577. ])
  578. ->join('lesson_slot slot','order.slot_id = slot.id','LEFT')
  579. ->join('lesson','order.lesson_id = lesson.id','LEFT')
  580. ->join('coach','slot.coach_ids = coach.id','LEFT')
  581. ->join('danceroom','slot.danceroom_id = danceroom.id','LEFT')
  582. ->where($map)
  583. ->where('(order.jointype = 1 and order.order_status = 10) or (order.jointype = 2 and order.order_status = 0)') //已支付的 或 候补单
  584. ->order('slot.starttime desc,order.id desc')
  585. ->autopage()->select();
  586. $list = $this->list_lang($list,['name']);
  587. foreach($list as $key => &$order){
  588. //hours转换
  589. $order['hours'] = floatval($order['hours']);
  590. //距离开课大于24小时可以申请取消
  591. if($order['starttime'] - time() > 86400){
  592. $order['can_cancel'] = 1;
  593. }else{
  594. $order['can_cancel'] = 0;
  595. }
  596. //显示时间
  597. $order['showtime_text'] = $this->weektime_lang($order['starttime']);
  598. //备注
  599. if(!empty($order['userremark'])){
  600. $order['userremark'] = __('备注:').$order['userremark'];
  601. }else{
  602. $order['userremark'] = '';
  603. }
  604. //预约情况
  605. $yuyue = $order['usernumber'] . ($order['jointype'] == 1 ? ' 人预约' : ' 人候补');
  606. $yuyue_en = $order['usernumber'] . ($order['jointype'] == 1 ? ' Booked' : ' Waitlisted');
  607. $yuyue = $this->lang == 'en' ? $yuyue_en : $yuyue;
  608. //舞蹈室
  609. $danceroom = $this->lang == 'en' ? $order['danceroom_name_en'] : $order['danceroom_name'];
  610. unset($order['danceroom_name']);
  611. unset($order['danceroom_name_en']);
  612. $order['coach_text'] = $yuyue." ".$order['coach_text']."\n".$danceroom;
  613. //放入支付套餐
  614. $order['package_name'] = '';
  615. $order['package_name_en'] = '';
  616. $order['package_showtime_text'] = '';
  617. if($order['paytype'] == 1){
  618. $package_order = Db::name('package_order')->alias('order')
  619. ->field('p.name,p.name_en,order.starttime,order.endtime')
  620. ->join('lesson_package p','order.package_id = p.id','LEFT')
  621. ->where('order.id',$order['package_order_id'])->find();
  622. if(!empty($package_order)){
  623. $order['package_name'] = $package_order['name'];
  624. $order['package_name_en'] = $package_order['name_en'];
  625. /*$order['package_starttime'] = $package_order['starttime'];
  626. $order['package_endtime'] = $package_order['endtime'];*/
  627. $order['package_showtime_text'] = $this->date_lang($package_order['starttime']).'-'.$this->date_lang($package_order['endtime']);
  628. }
  629. }
  630. if($order['paytype'] == 4){
  631. $trylesson_order = Db::name('trylesson_order')->alias('order')
  632. ->field('t.name,t.name_en,order.starttime,order.endtime')
  633. ->join('trylesson t','order.trylesson_id = t.id','LEFT')
  634. ->where('order.id',$order['trylesson_order_id'])->find();
  635. if(!empty($trylesson_order)){
  636. $order['package_name'] = $trylesson_order['name'];
  637. $order['package_name_en'] = $trylesson_order['name_en'];
  638. /*$order['package_starttime'] = $trylesson_order['starttime'];
  639. $order['package_endtime'] = $trylesson_order['endtime'];*/
  640. $order['package_showtime_text'] = $this->date_lang($trylesson_order['starttime']).'-'.$this->date_lang($trylesson_order['endtime']);
  641. }
  642. }
  643. if($order['paytype'] == 2){
  644. $order['package_name'] = '在线支付';
  645. $order['package_name_en'] = 'Pay online';
  646. $order['package_showtime_text'] = '';
  647. }
  648. }
  649. $list = $this->list_lang($list,['package_name']);
  650. $this->success(1,$list);
  651. }
  652. //课程预约,预约记录,售课
  653. public function lesson_order(){
  654. $map = [
  655. 'order.user_id' => $this->auth->id,
  656. ];
  657. $list = Db::name('lesson_order')->alias('order')
  658. ->field([
  659. 'order.id','order.order_amount','order.paytype','order.package_order_id','order.package_remark','order.trylesson_order_id','order.userremark','order.usernumber','order.jointype',
  660. 'lesson.name','lesson.name_en',
  661. 'slot.starttime','slot.hours','slot.address','slot.coach_ids',
  662. 'coach.nickname as coach_text',
  663. 'danceroom.name as danceroom_name','danceroom.name_en as danceroom_name_en',
  664. ])
  665. ->join('lesson_slot slot','order.slot_id = slot.id','LEFT')
  666. ->join('lesson','order.lesson_id = lesson.id','LEFT')
  667. ->join('coach','slot.coach_ids = coach.id','LEFT')
  668. ->join('danceroom','slot.danceroom_id = danceroom.id','LEFT')
  669. ->where($map)
  670. ->where('(order.jointype = 1 and order.order_status = 10) or (order.jointype = 2 and order.order_status = 0)') //已支付的 或 候补单
  671. ->order('slot.starttime desc,order.id desc')
  672. ->autopage()->select();
  673. $list = $this->list_lang($list,['name']);
  674. foreach($list as $key => &$order){
  675. //hours转换
  676. $order['hours'] = floatval($order['hours']);
  677. //24小时内可以申请取消
  678. if($order['starttime'] - time() > 86400){
  679. $order['can_cancel'] = 1;
  680. }else{
  681. $order['can_cancel'] = 0;
  682. }
  683. //显示时间
  684. $order['showtime_text'] = $this->weektime_lang($order['starttime']);
  685. //备注
  686. if(!empty($order['userremark'])){
  687. $order['userremark'] = __('备注:').$order['userremark'];
  688. }else{
  689. $order['userremark'] = '';
  690. }
  691. //预约情况
  692. $yuyue = $order['usernumber'] . ($order['jointype'] == 1 ? ' 人预约' : ' 人候补');
  693. $yuyue_en = $order['usernumber'] . ($order['jointype'] == 1 ? ' Booked' : ' Waitlisted');
  694. $yuyue = $this->lang == 'en' ? $yuyue_en : $yuyue;
  695. //舞蹈室
  696. $danceroom = $this->lang == 'en' ? $order['danceroom_name_en'] : $order['danceroom_name'];
  697. unset($order['danceroom_name']);
  698. unset($order['danceroom_name_en']);
  699. $order['coach_text'] = $yuyue." ".$order['coach_text']."\n".$danceroom;
  700. //放入支付套餐
  701. $order['package_name'] = '';
  702. $order['package_name_en'] = '';
  703. $order['package_showtime_text'] = '';
  704. if($order['paytype'] == 1){
  705. $package_order = Db::name('package_order')->alias('order')
  706. ->field('p.name,p.name_en,order.starttime,order.endtime')
  707. ->join('lesson_package p','order.package_id = p.id','LEFT')
  708. ->where('order.id',$order['package_order_id'])->find();
  709. if(!empty($package_order)){
  710. $order['package_name'] = $package_order['name'];
  711. $order['package_name_en'] = $package_order['name_en'];
  712. /*$order['package_starttime'] = $package_order['starttime'];
  713. $order['package_endtime'] = $package_order['endtime'];*/
  714. $order['package_showtime_text'] = $this->date_lang($package_order['starttime']).'-'.$this->date_lang($package_order['endtime']);
  715. }
  716. }
  717. if($order['paytype'] == 4){
  718. $trylesson_order = Db::name('trylesson_order')->alias('order')
  719. ->field('t.name,t.name_en,order.starttime,order.endtime')
  720. ->join('trylesson t','order.trylesson_id = t.id','LEFT')
  721. ->where('order.id',$order['trylesson_order_id'])->find();
  722. if(!empty($trylesson_order)){
  723. $order['package_name'] = $trylesson_order['name'];
  724. $order['package_name_en'] = $trylesson_order['name_en'];
  725. /*$order['package_starttime'] = $trylesson_order['starttime'];
  726. $order['package_endtime'] = $trylesson_order['endtime'];*/
  727. $order['package_showtime_text'] = $this->date_lang($trylesson_order['starttime']).'-'.$this->date_lang($trylesson_order['endtime']);
  728. }
  729. }
  730. if($order['paytype'] == 2){
  731. $order['package_name'] = '在线支付';
  732. $order['package_name_en'] = 'Pay online';
  733. $order['package_showtime_text'] = '';
  734. }
  735. }
  736. $list = $this->list_lang($list,['package_name']);
  737. $this->success(1,$list);
  738. }
  739. //我的试课订单
  740. public function trylesson_order(){
  741. $map = [
  742. 'order.user_id' => $this->auth->id,
  743. 'order.order_status' => ['in',[10,20]],
  744. ];
  745. $list = Db::name('trylesson_order')->alias('order')
  746. ->field('order.id,order.order_amount,order.paytime,order.order_status,order.starttime,order.endtime,
  747. trylesson.name,trylesson.name_en')
  748. ->join('trylesson','order.trylesson_id = trylesson.id','LEFT')
  749. ->where($map)->order('order.order_status asc,order.endtime asc')
  750. ->autopage()->select();
  751. $list = $this->list_lang($list,['name']);
  752. foreach($list as $key => &$order){
  753. //显示时间
  754. $order['showtime_text'] = $this->date_lang($order['starttime']).'-'.$this->date_lang($order['endtime']);
  755. }
  756. $this->success(1,$list);
  757. }
  758. //设置通知方式
  759. //可以转让的、延期的配套,下拉用的
  760. public function package_list(){
  761. $map = [
  762. 'order.user_id' => $this->auth->id,
  763. 'order.order_status' => 1,
  764. 'order.remain' => ['gt',0],
  765. ];
  766. $list = Db::name('package_order')->alias('order')
  767. ->field('order.id,order.starttime,order.endtime,order.is_gift,order.remain,
  768. p.name,p.name_en')
  769. ->join('lesson_package p','order.package_id = p.id','LEFT')
  770. ->where($map)->order('order.remain desc,order.endtime asc')
  771. ->select();
  772. $list = $this->list_lang($list,['name']);
  773. if(!empty($list)){
  774. foreach($list as $key => &$val){
  775. //转换remain
  776. $val['remain'] = floatval($val['remain']);
  777. $val['time_text'] = $this->date_lang($val['starttime']).'-'.$this->date_lang($val['endtime']);
  778. //是否有延期按钮
  779. $val['expired'] = 0;
  780. if($val['endtime'] < time()){
  781. $val['expired'] = 1;
  782. }
  783. }
  784. }
  785. $this->success(1,$list);
  786. }
  787. //配套转让申请
  788. public function package_move(){
  789. $field = ['name','mobile','email','reason','reason_files','package_order_id','sessions','to_name','to_mobile','to_email','remark'];
  790. $data = request_post_hub($field);
  791. //检查被装让套餐
  792. $package = Db::name('package_order')->where('order_status',1)->where('user_id',$this->auth->id)->where('id',$data['package_order_id'])->find();
  793. if(empty($package)){
  794. $this->error('不存在的套餐订单');
  795. }
  796. if($package['remain'] < $data['sessions']){
  797. $this->error('套餐剩余课时不足');
  798. }
  799. if($package['endtime'] < time()){
  800. //$this->error('套餐已过期');
  801. }
  802. //检查被转让人
  803. $to_user = Db::name('user')->where('email',$data['to_email'])->find();
  804. if(empty($to_user)){
  805. $this->error('被转让人的邮箱没找到对应用户');
  806. }
  807. if($to_user['id'] == $this->auth->id){
  808. $this->error('不能转让给自己');
  809. }
  810. $data['to_user_id'] = $to_user['id'];
  811. //入库
  812. $data['user_id'] = $this->auth->id;
  813. $data['createtime'] = time();
  814. Db::name('package_move')->insertGetId($data);
  815. $this->success('申请成功,请等待审核');
  816. }
  817. //配套延期申请
  818. public function package_delay(){
  819. $field = ['name','mobile','email','package_order_id','delay_week','reason','remark','reason_files'];
  820. $data = request_post_hub($field);
  821. //检查被装让套餐
  822. $package = Db::name('package_order')->where('order_status',1)->where('user_id',$this->auth->id)->where('id',$data['package_order_id'])->find();
  823. if(empty($package)){
  824. $this->error('不存在的套餐订单');
  825. }
  826. if($package['use_status'] != 1){
  827. $this->error('该配套还没有激活');
  828. }
  829. $data['user_id'] = $this->auth->id;
  830. $data['createtime'] = time();
  831. Db::name('package_delay')->insertGetId($data);
  832. $this->success('申请成功,请等待审核');
  833. }
  834. //可以申请退课的,下拉用的
  835. public function refund_lesson_order(){
  836. //试课单
  837. /*$map = [
  838. 'order.user_id' => $this->auth->id,
  839. 'order.order_status' => 10
  840. ];
  841. $list = Db::name('trylesson_order')->alias('order')
  842. ->field('order.id,order.order_amount,order.paytime,
  843. trylesson.name,trylesson.name_en')
  844. ->join('trylesson','order.trylesson_id = trylesson.id','LEFT')
  845. ->where($map)->order('order.paytime desc')
  846. ->select();
  847. $trylist = $this->list_lang($list,['name']);*/
  848. /*if(!empty($trylist)){
  849. foreach($trylist as $key2 => $val2){
  850. //日期
  851. $trylist[$key2]['showtime_text'] = date('Y-m-d H:i',$val2['paytime']);
  852. }
  853. }*/
  854. //售课单(已支付开课24小时内不能取消的,已点名实到人不足的),已取消只是个暂时状态,后台处理完会改成已退课
  855. $map = [
  856. 'order.user_id' => $this->auth->id,
  857. ];
  858. $map2 = '( (order.order_status = 10 ) or (order.order_status = 20 and order.usernumber_sign != order.usernumber) )';
  859. $list = Db::name('lesson_order')->alias('order')
  860. ->field('order.id,order.order_amount,
  861. lesson.name,lesson.name_en,
  862. slot.starttime,slot.hours,slot.endtime')
  863. ->join('lesson_slot slot','order.slot_id = slot.id','LEFT')
  864. ->join('lesson','order.lesson_id = lesson.id','LEFT')
  865. ->where($map)
  866. ->where($map2)
  867. ->order('order.id desc')
  868. ->select();
  869. $lesson = $this->list_lang($list,['name']);
  870. if(!empty($list)){
  871. foreach($lesson as $key => &$val){
  872. //hours转换
  873. $val['hours'] = floatval($val['hours']);
  874. //日期
  875. $val['showtime_text'] = $this->weektime_lang($val['starttime']);
  876. }
  877. }
  878. //
  879. $result = [
  880. 'trylesson' => [],
  881. 'lesson' => $lesson,
  882. ];
  883. $this->success(1,$result);
  884. }
  885. //课时退课申请
  886. public function order_refund(){
  887. $field = ['name','mobile','email','order_table','order_id','remark','reason_files'];
  888. $require = ['order_table','order_id'];
  889. $data = request_post_hub($field,$require);
  890. $data['user_id'] = $this->auth->id;
  891. $data['createtime'] = time();
  892. //冗余订单号,售课=1,试课=2
  893. $data['order_table'] = 1;
  894. if($data['order_table'] == 1){
  895. $data['order_no'] = Db::name('lesson_order')->where('id',$data['order_id'])->value('order_no');
  896. }else{
  897. $data['order_no'] = Db::name('trylesson_order')->where('id',$data['order_id'])->value('order_no');
  898. }
  899. Db::name('order_refund')->insertGetId($data);
  900. $this->success('申请成功,请等待审核');
  901. }
  902. //公司团建活动信息
  903. public function company_apply(){
  904. $field = ['name','mobile','email','company_name','company_type','remark'];
  905. $data = request_post_hub($field);
  906. $data['user_id'] = $this->auth->id;
  907. $data['createtime'] = time();
  908. Db::name('company_apply')->insertGetId($data);
  909. $this->success('申请成功,请等待审核');
  910. }
  911. }