Orders.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <?php
  2. namespace app\api\controller\mall;
  3. use app\common\controller\Api;
  4. use app\common\model\OrderInfo;
  5. use app\common\model\OrderVoucher;
  6. use app\common\model\Refund;
  7. use app\common\service\OrderService;
  8. use app\common\service\RefundService;
  9. use app\common\validate\TaxValidate;
  10. use Carbon\Carbon;
  11. use think\Cache;
  12. use think\Db;
  13. use app\common\model\Orders as Order;
  14. use think\db\Query;
  15. use Yansongda\Supports\Arr;
  16. /**
  17. * 商城订单接口
  18. * @inheritdoc
  19. */
  20. class Orders extends Api
  21. {
  22. use TaxValidate;
  23. protected $noNeedRight="*";
  24. public $taxApi=false;
  25. /**
  26. * 预下单
  27. * @ApiMethod (POST)
  28. * @ApiParams (name=frm,description="来源1直接下单2购物车")
  29. * @ApiParams (name=form,description="key为规格id,对象:num购买数量,num_install安装数量")
  30. * @ApiParams (name=coupon_use,description=是否使用优惠券)
  31. * @ApiParams (name=coupon_id,description=优惠券id)
  32. * @ApiReturnParams (name=amount_total,description=总价,包含没有优惠的所有的价格)
  33. * @ApiReturnParams (name=amount_pay,description=实际需要支付的价格)
  34. * @ApiReturnParams (name=amount_coupon,description=优惠券优惠的金额)
  35. * @ApiReturnParams (name=amount_coupon_kill,description=秒杀活动优惠的金额)
  36. * @ApiReturnParams (name=amount_install,description=安装费的金额)
  37. * @ApiReturnParams (name=amount_discount,description=总优惠金额)
  38. * @ApiReturnParams (name=num,description=总数量)
  39. * @ApiReturnParams (name=num_install,description=总安装数量)
  40. * @ApiReturnParams (name=goods,0.description=商品列表数组)
  41. * @ApiReturnParams (name=goods.0.num,description=购买数量)
  42. * @ApiReturnParams (name=goods.0.num_install,description=安装数量)
  43. * @ApiReturnParams (name=goods.0.sku,description=sku对象)
  44. * @ApiReturnParams (name=goods.0.goods,description=商品对象)
  45. * @ApiReturnParams (name=goods.0.amount_total,description=总价,包含没有优惠的所有的价格)
  46. * @ApiReturnParams (name=goods.0.amount_pay,description=实际需要支付的价格)
  47. * @ApiReturnParams (name=goods.0.amount_goods,description=商品总价)
  48. * @ApiReturnParams (name=goods.0.amount_goods_real,description=商品扣除优惠的实际总价)
  49. * @ApiReturnParams (name=goods.0.amount_coupon,description=优惠券优惠的金额)
  50. * @ApiReturnParams (name=goods.0.amount_coupon_kill,description=秒杀活动优惠的金额)
  51. * @ApiReturnParams (name=goods.0.amount_install,description=安装费的金额)
  52. */
  53. public function preview(){
  54. $data=$this->_validate([
  55. 'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'],
  56. 'form|商品'=>['require','array','min:1'],
  57. 'frm|来源'=>['require','in:1,2'],
  58. ]);
  59. $user=$this->auth->getUser();
  60. $goods=$data['form'];
  61. $service=new OrderService();
  62. $service->setUser($user);
  63. $service->setGoods($goods);
  64. $service->setFrm($data['frm']);
  65. $service->setCouponUse($data['coupon_use']??false);
  66. $service->setCouponId($data['coupon_id']??0);
  67. $info=$service->calculate();
  68. $this->success('',$info);
  69. }
  70. /**
  71. * 提交订单
  72. * @ApiMethod (POST)
  73. * @ApiParams (name=frm,description="来源1直接下单2购物车")
  74. * @ApiParams (name=form,description="key为规格id,对象:num购买数量,num_install安装数量,{1:{num:1,num_install:2}}")
  75. * @ApiParams (name=coupon_use,description=是否使用优惠券)
  76. * @ApiParams (name=coupon_id,description=优惠券id)
  77. * @ApiParams (name=remark,description=留言)
  78. * @ApiParams (name=address_id,description=收货地址id)
  79. * @ApiParams (name=is_tax,description=是1否0需要开票)
  80. * @ApiParams (name=customer_send_time,description="预定发货时间,datetime")
  81. * @ApiParams (name=tax,description=发票信息)
  82. * @ApiParams (name=tax.paper_type,description=1电子2纸质)
  83. * @ApiParams (name=tax.self_type,description=1专票2普票)
  84. * @ApiParams (name=tax.u_type,description=1个人2企业)
  85. * @ApiParams (name=tax.name,description="姓名u_type=1时候必须")
  86. * @ApiParams (name=tax.com_name,description="单位名称,self_type=1或2,u_type=2时候必须")
  87. * @ApiParams (name=tax.bank_name,description="开户行,self_type=1,u_type=2时候必须")
  88. * @ApiParams (name=tax.bank_no,description="开户行账号,self_type=1,u_type=2时候必须")
  89. * @ApiParams (name=tax.tax_no,description="税号,self_type=1或2,u_type=2时候必须")
  90. * @ApiParams (name=tax.reg_addr,description="注册地址,self_type=1,u_type=2时候必须")
  91. * @ApiParams (name=tax.reg_phone,description="注册电话,self_type=1,u_type=2时候必须")
  92. */
  93. public function create(){
  94. $data=$this->_validate([
  95. 'coupon_id|优惠券'=>['integer','requireIf:coupon_use,1'],
  96. 'form|商品'=>['require','array','min:1'],
  97. 'frm|来源'=>['require','in:1,2'],
  98. 'remark|备注'=>['max:50'],
  99. 'address_id|收货地址'=>['require','integer','gt:0'],
  100. 'customer_send_time|发货时间'=>['date'],
  101. ]);
  102. $this->validateTax();
  103. if(!empty($data['customer_send_time']) && strtotime($data['customer_send_time'])<Carbon::now()->startOfDay()->addDays(config('site.send_delay_day')?:0)->timestamp){
  104. $this->error('发货时间过早');
  105. }
  106. $user=$this->auth->getUser();
  107. $address=$user->address()->find($data['address_id']);
  108. abortIf(!$address,'地址不存在');
  109. $goods=$data['form'];
  110. $service=new OrderService();
  111. $service->setUser($user);
  112. $service->setGoods($goods);
  113. $service->setFrm(1);
  114. $service->setSubmit(true);
  115. $service->setClearCart(true);
  116. $service->setCouponUse($data['coupon_use']??false);
  117. $service->setCouponId($data['coupon_id']??0);
  118. Db::startTrans();
  119. $info=$service->calculate();
  120. if($info['amount_pay']==0){
  121. $this->error('支付金额有误');
  122. }
  123. $order=new Order();
  124. $order['user_id']=$user['id'];
  125. $order['order_no']=order_no();
  126. $order['amount_total']=$info['amount_total'];
  127. $order['amount_pay']=$info['amount_pay'];
  128. $order['amount_install']=$info['amount_install'];
  129. $order['amount_coupon']=$info['amount_coupon'];
  130. $order['amount_coupon_kill']=$info['amount_coupon_kill'];
  131. $order['amount_coupon_level']=$info['amount_coupon_level'];
  132. $order['amount_discount']=$info['amount_discount'];
  133. $order['amount_cmn']=$info['amount_cmn'];
  134. $order['num']=$info['num'];
  135. $order['num_install']=$info['num_install'];
  136. $order['tax']=$data['tax']??null;
  137. $order['coupon_id']=empty($data['coupon_id'])?null:$data['coupon_id'];
  138. $order->save();
  139. $amount_profit=0;
  140. foreach ($info['goods'] as $everyGoods){
  141. $orderInfo=OrderInfo::saveInfo($order,$everyGoods);
  142. $amount_profit=bcadd($amount_profit,$orderInfo['amount_profit']);
  143. }
  144. $order['amount_profit']=$amount_profit;
  145. $order['amount_profit_per']=bcmul(100,bcdiv($order['amount_profit'],$order['amount_pay']));
  146. $order->save();
  147. $order->address()->save($address->orderAddress());
  148. Db::commit();
  149. $this->success('',$this->orderDetail($order['id']));
  150. }
  151. /**
  152. * 订单详情
  153. * @ApiParams (name=id,description="订单ID")
  154. */
  155. public function show(){
  156. $data=$this->_validate([
  157. 'id'=>['require'],
  158. ]);
  159. $user=$this->auth->getUser();
  160. $order=$this->orderDetail($data['id']);
  161. $goodsBak=$order->info[0]->goodsBak;
  162. if(!($goodsBak['goods']['is_fix']??0)) {
  163. Cache::remember("user_order_show_{$user['id']}", time(), 86400);
  164. }
  165. $this->success('',$order);
  166. }
  167. protected function orderDetail($orderId){
  168. $order= Order::with(['info','info.refund','address','logistics','logistics.com','voucher'])->findOrFail($orderId);
  169. foreach ($order['info'] as $info){
  170. $info->append(['goods','sku']);
  171. Refund::makeRefundConfig($info,true,true);
  172. }
  173. return $order;
  174. }
  175. /**
  176. * 取消订单
  177. * @ApiParams (name=id,description="订单ID")
  178. */
  179. public function cancel(){
  180. $data=$this->_validate([
  181. 'id'=>['require'],
  182. ]);
  183. $user=$this->auth->getUser();
  184. $order=$user->orders()->findOrFail($data['id']);
  185. $order->allowCancel() && $order->makeCancel();
  186. $this->success();
  187. }
  188. /**
  189. * 用户订单列表
  190. * @ApiParams (name=page,description=分页)
  191. * @ApiParams (name=limit,description=分页)
  192. * @ApiParams (name=status,description=状态)
  193. * @ApiReturnParams (name=is_evaled,description=是否已评价)
  194. */
  195. public function users(){
  196. $user=$this->auth->getUser();
  197. $map=[];
  198. $status=input('status');
  199. /*if(is_numeric($status)){
  200. $map['status']=$status;
  201. }*/
  202. if($this->taxApi){
  203. $map['tax']=['neq','[]'];
  204. }
  205. if($status==40){
  206. $orders=$user->orders()
  207. ->where($map)
  208. ->hasRefund()
  209. ->with(['info','voucher','logistics','logistics.com'])
  210. ->order('id','desc')
  211. ->paginate(input('limit',15));
  212. }elseif (is_numeric($status)){
  213. $orders=$user->orders()
  214. ->where($map)
  215. ->where('status',$status)
  216. ->with(['info','voucher','logistics','logistics.com'])
  217. ->order('id','desc')
  218. ->paginate(input('limit',15));
  219. }else{
  220. $orders=$user->orders()
  221. ->where($map)
  222. ->with(['info','voucher','logistics','logistics.com'])
  223. ->order('id','desc')
  224. ->paginate(input('limit',15));
  225. }
  226. foreach ($orders as $order){
  227. $order->append(['is_evaled']);
  228. }
  229. $this->success('',$orders);
  230. }
  231. /**
  232. * 支付订单
  233. * @ApiParams (name=id,description=订单ID)
  234. * @ApiParams (name=pay_type,description=支付方式1企业网银2微信3支付宝4银联5代付6线下支付)
  235. * @ApiReturnParams (name=qr,description=微信支付宝返回的二维码)
  236. * @ApiReturnParams (name=account_name,description=线下支付会返【账户名称】)
  237. * @ApiReturnParams (name=bank_no,description=线下支付会返【银行卡号】)
  238. * @ApiReturnParams (name=bank_name,description=线下支付会返【银行名称】)
  239. */
  240. public function pay(){
  241. $data=$this->_validate([
  242. 'id'=>['require'],
  243. 'pay_type|支付方式'=>['require','in:'.implode(',',array_keys(Order::getPayTypes()))]
  244. ]);
  245. $user=$this->auth->getUser();
  246. $order=Order::findOrFail($data['id']);
  247. if(!$order->is_wait_pay){
  248. $this->error('非待支付状态无法支付');
  249. }
  250. $data=$order->makePayInfo($data['pay_type']);
  251. $this->success('',$data);
  252. }
  253. /**
  254. * 申请售后或修改售后信息
  255. * @ApiParams (name=refund_type,description=1取消订单2退款退货3仅退货4取消订单5换货保修)
  256. * @ApiParams (name=num,description=退货数量)
  257. * @ApiParams (name=num_install,description=退安装数量)
  258. * @ApiParams (name=order_info_id,description=订单ID)
  259. * @ApiParams (name=refund_by,description=配置里的type里的key)
  260. * @ApiParams (name=reason1,description=配置里的reason里的key)
  261. * @ApiParams (name=reason2,description=原因2)
  262. * @ApiParams (name=fix_order_no,description=维修订单号,在拍维修费时需要)
  263. * @ApiParams (name=is_edit,description="是1否0修改售后信息")
  264. */
  265. public function refund(){
  266. $save=[];
  267. $data=$this->_validate([
  268. 'order_info_id|订单'=>['require','integer','gt:0'],
  269. ]);
  270. $user=$this->auth->getUser();
  271. Db::startTrans();
  272. $orderInfo=$user->orderInfo()->lock(true)->findOrFail($data['order_info_id']);
  273. $order= Order::lock(true)->where('id',$orderInfo['order_id'])->find();
  274. if(!$order){
  275. Db::rollback();
  276. $this->error('订单不存在');
  277. }
  278. $order->allowRefund();
  279. $refund=$orderInfo->refund;
  280. $isEdit=false;
  281. if(!empty($data['is_edit'])) {
  282. if(!$refund){
  283. Db::rollback();
  284. $this->error('未找到售后信息无法修改');
  285. }
  286. if ($refund && !$refund->allowEdit()) {
  287. Db::rollback();
  288. $this->error('该售后无法修改');
  289. }
  290. $isEdit=true;
  291. }
  292. $config=Refund::makeRefundConfig($orderInfo,false);
  293. if(empty($config)){
  294. Db::rollback();
  295. $this->error('该订单无法满足售后条件');
  296. }
  297. $this->_validate([
  298. 'refund_type|售后方式'=>['require','in:'.implode(',',array_keys($config['refund_type']))],
  299. 'reason1|退款退货原因'=>['require','integer','egt:0','in:'.implode(',',array_keys($config['reason']))],
  300. 'reason2|原因'=>['require','max:100'],
  301. 'num|数量'=>['require','integer','egt:0',"elt:{$orderInfo['num']}"],
  302. 'num_install|安装数量'=>['require','integer','egt:0',"elt:{$orderInfo['num_install']}"],
  303. ]);
  304. if($config['type'][$data['refund_type']]) {
  305. $this->_validate([
  306. 'refund_by|退货方式' => ['require', 'integer', 'in:' . implode(',', array_keys($config['type'][$data['refund_type']]))],
  307. ]);
  308. }else{
  309. $data['refund_by']=null;
  310. }
  311. if($data['refund_type']==Refund::REFUND_TYPE_HHBX){
  312. $save['amount']=0;
  313. $save['amount_install']=0;
  314. }
  315. else{
  316. if($data['num']==0 && $data['num_install']==0){
  317. Db::rollback();
  318. $this->error('数量不能同时为0');
  319. }
  320. $save['amount']=bcmul($data['num'],$config['amount_single']);
  321. $save['amount_install']=bcmul($data['num'],$config['amount_install_single']);
  322. }
  323. $save['amount_last']=bcadd($save['amount'],$save['amount_install']);
  324. $fix_order_id=0;
  325. if($config['req_order'][$data['refund_type']]){
  326. $this->_validate([
  327. 'fix_order_no|维修订单号'=>['require',],
  328. ]);
  329. $showTime=Cache::get("user_order_show_{$user['id']}",null);
  330. if(!$showTime){
  331. $this->error('请先支付维修单',$showTime);
  332. }
  333. $fixOrder=$user->orders()->statusPay()
  334. ->where('order_no',$data['fix_order_no'])
  335. ->where('pay_time','>',$showTime)
  336. ->find();
  337. if(!$fixOrder){
  338. $this->error('未找到维修订单',$showTime);
  339. }
  340. $goodsBak=$fixOrder->info[0]->goodsBak;
  341. if(!$fixOrder||($goodsBak['goods']['is_fix']??0)!=1){
  342. $this->error('请完成维修订单支付');
  343. }
  344. $fix_order_id=$fixOrder['id'];
  345. }
  346. /*if($data['refund_type']==Refund::REFUND_TYPE_ALL){
  347. $refundCount=$orderInfo->refunds()->where('refund_type',Refund::REFUND_TYPE_ALL)->count();
  348. if($refundCount>=3){
  349. Db::rollback();
  350. $this->error('申请超过3次无法再次申请');
  351. }
  352. }*/
  353. $will=array_merge($save,[
  354. 'user_id'=>$user->id,
  355. 'order_id'=>$orderInfo['order_id'],
  356. 'order_info_id'=>$orderInfo['id'],
  357. 'goods_id'=>$orderInfo['goods_id'],
  358. 'refund_type'=>$data['refund_type'],
  359. 'refund_by'=>$data['refund_by'],
  360. 'num'=>$data['num'],
  361. 'num_install'=>$data['num_install'],
  362. 'reason1'=>$data['reason1'],
  363. 'reason2'=>$data['reason2'],
  364. 'fix_order_id'=>$fix_order_id,
  365. 'refund_status'=>Refund::REFUND_ING,
  366. 'audit_remark'=>null,
  367. ]);
  368. if($isEdit){
  369. $refund->save($will);
  370. }else{
  371. $refund=Refund::create($will);
  372. }
  373. $orderInfo['refund_id']=$refund['id'];
  374. $orderInfo->save();
  375. #未发货直接退款取消
  376. /* if($order->is_wait_send){
  377. $newRefund['refund_type']=Refund::REFUND_TYPE_MONEY;
  378. $newRefund['amount']=$orderInfo['amount_pay'];
  379. $newRefund['num']=$orderInfo['num'];
  380. $newRefund->save();
  381. $newRefund->makeAudit(1);
  382. }*/
  383. Db::commit();
  384. $this->success();
  385. }
  386. /**
  387. * 取消售后
  388. * @ApiParams (name=order_info_id,description=子订单ID)
  389. */
  390. public function refund_cancel(){
  391. $data=$this->_validate([
  392. 'order_info_id'=>['require'],
  393. ]);
  394. $user=$this->auth->getUser();
  395. $orderInfo=$user->orderInfo()->findOrFail($data['order_info_id']);
  396. $refund=$orderInfo->refund;
  397. if(!$refund){
  398. $this->error('售后不存在');
  399. }
  400. if(!$refund->allowCancel()){
  401. $this->error('该售后不允许取消');
  402. }
  403. $refund->makeCancel();
  404. $this->success();
  405. }
  406. /**
  407. * 确认收货
  408. * @ApiParams (name=id,description=订单ID)
  409. */
  410. public function commit(){
  411. $data=$this->_validate([
  412. 'id'=>['require','integer'],
  413. ]);
  414. $user=$this->auth->getUser();
  415. $order=$user->orders()->findOrFail($data['id']);
  416. if(!$order->allowOver()){
  417. $this->error('该订单不允许确认');
  418. }
  419. $order->makeOver();
  420. $this->success();
  421. }
  422. /**
  423. * 上传(重新上传)打款凭证
  424. * @ApiParams (name=id,description=订单ID)
  425. * @ApiParams (name=bank_no,description=银行卡号)
  426. * @ApiParams (name=bank_name,description=银行开户行)
  427. * @ApiParams (name=bank_username,description=银行持卡人姓名)
  428. * @ApiParams (name=image,description=凭证图片)
  429. */
  430. public function po_complete(){
  431. $user=$this->auth->getUser();
  432. $data=$this->_validate([
  433. 'id|订单'=>['require'],
  434. //'bank_no|银行卡号'=>['require'],
  435. //'bank_name|银行开户行'=>['require'],
  436. //'bank_username|银行持卡人姓名'=>['require'],
  437. //'image|凭证图片'=>['require'],
  438. ]);
  439. Db::startTrans();
  440. $voucher=OrderVoucher::where('order_id',$data['id'])->order('id','desc')->lock(true)->find();
  441. if($voucher && $voucher['status']==1){
  442. Db::rollback();
  443. $this->error('该凭证已通过无法再次提交');
  444. }
  445. $order=$user->orders()->lock(true)->findOrFail($data['id']);
  446. if($order->is_closed){
  447. Db::rollback();
  448. $this->error('订单已关闭');
  449. }
  450. if($order->is_payed && $order->pay_type!=$order::PT_OFF){
  451. $this->error('支付方式不支持提交');
  452. }
  453. $newData= Arr::only($data,['bank_no','bank_name','bank_username','image']);
  454. $newData['status']=0;
  455. if($voucher && $voucher['status']==0){
  456. $voucher->save($newData);
  457. }else{
  458. $newData['order_id']=$data['id'];
  459. $newData['user_id']=$user['id'];
  460. $voucher=OrderVoucher::create($newData);
  461. }
  462. if($order->is_payed){
  463. $voucher['status']=1;
  464. $voucher['is_auto']=1;
  465. $voucher->save();
  466. }
  467. $order['order_voucher_id']=$voucher['id'];
  468. $order['pay_type']= Order::PT_OFF;
  469. $order->save();
  470. Db::commit();
  471. $this->success('',$voucher);
  472. }
  473. /**
  474. * 售后列表
  475. * @ApiParams (name=page,description=分页)
  476. * @ApiParams (name=limit,description=分页)
  477. * @ApiReturnParams (name=id,description=退款记录ID)
  478. * @ApiReturnParams (name=refund_status,description="退款状态10申请处理中20申请通过30申请驳回40已取消")
  479. * @ApiReturnParams (name=refund_type,description="退款退货类型1仅退款2退款退货3仅退货")
  480. * @ApiReturnParams (name=refund_by,description="退货方式")
  481. * @ApiReturnParams (name=reason1,description="退款退货原因")
  482. * @ApiReturnParams (name=reason2,description="退款退货原因")
  483. * @ApiReturnParams (name=num,description="退款退货数量")
  484. * @ApiReturnParams (name=amount,description="退款退货金额")
  485. * @ApiReturnParams (name=create_time,description="创建时间")
  486. * @ApiReturnParams (name=audit_remark,description="审核备注")
  487. * @ApiReturnParams (name=order_no,description="退款单号")
  488. * @ApiReturnParams (name=pay_status,description="退款状态1成功2失败")
  489. * @ApiReturnParams (name=pay_remark,description="支付备注")
  490. */
  491. public function service_list(){
  492. $user=$this->auth->getUser();
  493. $list=$user->refund()
  494. ->order('id','desc')
  495. ->with(['order_info','orders'])
  496. ->paginate(input('limit',15));
  497. $this->success('',$list);
  498. }
  499. /**
  500. * 订单物流查询
  501. * @ApiParams (name=id,description=订单ID)
  502. * @ApiReturnParams (name=time,description="时间")
  503. * @ApiReturnParams (name=content,description="内容")
  504. */
  505. public function logistics_order(){
  506. $user=$this->auth->getUser();
  507. $data=$this->_validate([
  508. 'id'=>['require'],
  509. ]);
  510. $order=$user->orders()->findOrFail($data['id']);
  511. $logistics=$order->logistics;
  512. if(!$logistics){
  513. $this->error('未上传物流信息');
  514. }
  515. $info['logistics']=logistics()
  516. ->setNo($logistics['trans_no'])
  517. ->setLogistics($logistics->com)
  518. ->setPhone($order->address->mobile)
  519. ->query();
  520. $this->success('',$info);
  521. }
  522. /**
  523. * 订单物流地图轨迹
  524. * @ApiParams (name=id,description=订单ID)
  525. * @ApiReturnParams (name=trailUrl,description="轨迹地图链接")
  526. */
  527. public function logistics_map(){
  528. $user=$this->auth->getUser();
  529. $data=$this->_validate([
  530. 'id'=>['require'],
  531. ]);
  532. $order=$user->orders()->findOrFail($data['id']);
  533. $logistics=$order->logistics;
  534. if(!$logistics){
  535. $this->error('未上传物流信息');
  536. }
  537. $info['logistics']=logistics()
  538. ->setNo($logistics['trans_no'])
  539. ->setLogistics($logistics->com)
  540. ->setPhone($order->address->mobile)
  541. ->setExtend([
  542. 'from' =>$logistics->from(),
  543. 'to'=>$order->address->to(),
  544. ])
  545. ->maptrack();
  546. $this->success('',$info);
  547. }
  548. }