OrderRentController.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Filters\OrderRentFilter;
  4. use App\Handlers\BaseBikeControl;
  5. use App\Handlers\BikeStatusInfoSyncHandler;
  6. use App\Handlers\OrderRentHandler;
  7. use App\Http\Requests\OrderRentRequest;
  8. use App\Http\Resources\OrderRentResource;
  9. use App\Models\AdminMerchant;
  10. use App\Models\AdminUser;
  11. use App\Models\AdminUserArea;
  12. use App\Models\Area;
  13. use App\Models\AreaSetting;
  14. use App\Models\Bike;
  15. use App\Models\LocationsLog;
  16. use App\Models\OrderRent;
  17. use App\Models\OrderRentBikeOperate;
  18. use App\Models\RentOrder;
  19. use App\Models\User;
  20. use App\Models\WalletLog;
  21. use App\Notifications\OrderNoPayNotification;
  22. use App\Notifications\OrderRefundNotification;
  23. use App\Utils\Admin;
  24. use Carbon\Carbon;
  25. use EasyWeChat\Factory;
  26. use Illuminate\Http\Request;
  27. use App\Http\Controllers\Controller;
  28. use Illuminate\Support\Facades\DB;
  29. use Illuminate\Support\Facades\Log;
  30. use Illuminate\Support\Facades\Notification;
  31. class OrderRentController extends Controller
  32. {
  33. //
  34. public function index(OrderRentFilter $filter, Request $request)
  35. {
  36. $admin_id = Admin::user()->id;
  37. $orders = OrderRent::query();
  38. $status = $request->get('status') ?? '';
  39. if (empty($status)) {
  40. $orders = $orders->where('status', '!=', OrderRent::STATUS_CLOSE_ORDER);
  41. }
  42. $orders = $orders
  43. ->filter($filter)
  44. ->where(AdminMerchant::getMerchantWhere())
  45. ->orderByDesc('id')
  46. ->orderBy('status');
  47. if (!Admin::isAdministrator()) {
  48. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  49. if (count($area_ids) !== 0) {
  50. $orders = $orders->whereIn('area_id', $area_ids);
  51. } else {
  52. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  53. $area_id = $area_id->area_id ?? 0;
  54. $orders = $orders->where('area_id', $area_id);
  55. }
  56. }
  57. $orders = $request->get('all') ? $orders->get() : $orders->paginate();
  58. return $this->ok(OrderRentResource::collection($orders));
  59. }
  60. /**
  61. * restful API update put
  62. *
  63. * */
  64. public function update(OrderRentRequest $request, OrderRent $order)
  65. {
  66. $inputs = $request->validated();
  67. $order->update($inputs);
  68. return $this->ok();
  69. }
  70. // 订单轨迹 订单列表
  71. public function orderRentLocationsearch(Request $request, OrderRentFilter $filter)
  72. {
  73. $admin_id = Admin::user()->id;
  74. $orders = OrderRent::query();
  75. $status = $request->get('status') ?? '';
  76. if (empty($status)) {
  77. $orders = $orders->where('status', '!=', OrderRent::STATUS_CLOSE_ORDER);
  78. }
  79. $orders = $orders
  80. ->filter($filter)
  81. ->where(AdminMerchant::getMerchantWhere())
  82. ->orderByDesc('id')
  83. ->orderBy('status');
  84. if (!Admin::isAdministrator()) {
  85. $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
  86. if (count($area_ids) !== 0) {
  87. $orders = $orders->whereIn('area_id', $area_ids);
  88. } else {
  89. $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->first('area_id');
  90. $area_id = $area_id->area_id ?? 0;
  91. $orders = $orders->where('area_id', $area_id);
  92. }
  93. }
  94. $orders = $orders->limit(100)->get();
  95. return $this->ok(OrderRentResource::collection($orders));
  96. }
  97. /**
  98. * 订单状态 订单操作状态
  99. *
  100. * @return array order_status 订单状态
  101. * @return array order_orerate_status 订单操作状态
  102. *
  103. * */
  104. public function orderRentStatus()
  105. {
  106. $orderStatus = [];
  107. foreach (OrderRent::$statusMaps as $k => $v) {
  108. $arr = [];
  109. $arr['id'] = $k;
  110. $arr['name'] = $v;
  111. $orderStatus[] = $arr;
  112. }
  113. $data['order_status'] = $orderStatus;
  114. $orderOperateStatus = [];
  115. foreach (OrderRentBikeOperate::$typeMaps as $k => $v) {
  116. $arr1 = [];
  117. $arr1['id'] = $k;
  118. $arr1['name'] = $v;
  119. $orderOperateStatus[] = $arr1;
  120. }
  121. $data['order_operate_status'] = $orderOperateStatus;
  122. return $this->ok($data);
  123. }
  124. /**
  125. * 订单操作自行车详情
  126. *
  127. * @param $order_id 订单id
  128. *
  129. * @return object 订单详情
  130. * */
  131. public function orderRentBikeOperate(Request $request)
  132. {
  133. $order_id = $request->get('order_id');
  134. if (empty($order_id)) return $this->error('参数错误');
  135. $data = OrderRentBikeOperate::query()
  136. ->where('order_id', $order_id)
  137. ->select(['created_at', 'name'])
  138. ->get();
  139. $data2 = OrderRent::find($order_id)->walletLogs->toArray();
  140. $data3 = RentOrder::find($order_id)->walletLogs->toArray();
  141. return $this->ok(['orderRentBikeOperate' => $data, 'walletLogs' => array_merge($data2, $data3)]);
  142. }
  143. /**
  144. * 订单轨迹
  145. * */
  146. public function orderRentLocation(Request $request)
  147. {
  148. $order_id = $request->get('order_id') ?? '';
  149. if (empty($order_id)) return $this->error('参数错误');
  150. $orderLocations = [];
  151. $locationsTimes = [];
  152. $dataRoles = [];
  153. try {
  154. $locationsLog = LocationsLog::query()->where('order_id', (int)$order_id)->where('is_rent', LocationsLog::RENT_YES)->whereBetween('latitude', [3, 53])->whereBetween('longitude', [73, 136])->orderBy('box_time', 'asc')->get();
  155. } catch (\Exception $exception) {
  156. Log::error($exception->getMessage());
  157. }
  158. if (!empty($locationsLog)) {
  159. foreach ($locationsLog as $vv) {
  160. $orderLocations[] = [$vv->longitude, $vv->latitude];
  161. $dataRoles[] = $vv->type;
  162. $locationsTimes[] = Carbon::parse($vv->created_at)->format('Y-m-d H:i:s');
  163. }
  164. }
  165. $data = [
  166. 'orderLocations' => $orderLocations,
  167. 'locationsTimes' => $locationsTimes,
  168. 'locations_role' => $dataRoles,
  169. ];
  170. return $this->ok($data);
  171. }
  172. /**
  173. * 修改订单为待支付
  174. * */
  175. public function changeOrderRentStatus(Request $request)
  176. {
  177. $order_id = $request->get('order_id');
  178. if (empty($order_id)) return $this->error('参数错误');
  179. $closeOrderBool = OrderRentHandler::closeOrderRent($order_id);
  180. if (!$closeOrderBool) return $this->error('操作失败,请联系管理员');
  181. $order = OrderRent::find($order_id);
  182. $user = User::find($order->user_id);
  183. if (!empty($order)) {
  184. Notification::send($user, new OrderNoPayNotification($user, $order));
  185. }
  186. return $this->ok('关锁成功');
  187. }
  188. /**
  189. * 结算订单
  190. *
  191. *
  192. * */
  193. public function settlementOrderRent(Request $request)
  194. {
  195. $order_id = $request->get('order_id');
  196. if (empty($order_id)) return $this->error('参数错误');
  197. $ridding_money = $request->get('ridding_money') ?? 0; //骑行费
  198. $rent_money = $request->get('rent_money') ?? 0; //租金
  199. $dispatch_money = $request->get('dispatch_money') ?? 0; //调度费
  200. $pay_money = $request->get('pay_money') ?? 0;
  201. $order = OrderRent::query()->find($order_id);
  202. if (empty($order)) return $this->error('找不到订单信息');
  203. $user_id = $order->user_id;
  204. $area_id = $order->area_id;
  205. if ($order->status == OrderRent::STATUS_CLOSE_RENT_BIKE) {
  206. //1.判断用户钱包余额是否大于支付金额
  207. $user = User::query()->find($user_id);
  208. if (empty($user)) return $this->error('出现错误,请联系管理员');
  209. $wallet_money = $user->wallet_money;
  210. $result = bcsub($wallet_money, $pay_money, 2);
  211. $order->pay_type = OrderRent::PAY_TYPE_ACCOUNT;
  212. try {
  213. DB::beginTransaction();
  214. // 修改调度费 各种费用
  215. $order->dispatch_money = (float)$dispatch_money;
  216. $order->time_money = (float)$ridding_money;
  217. $order->rent_money = (float)$rent_money;
  218. $order->pay_money = bcadd(bcadd($dispatch_money, $ridding_money, 2), $rent_money, 2);
  219. $order->total_money = $order->pay_money;
  220. $order->order_total_money = $order->pay_money;
  221. if (bccomp($order->total_money, 0) === 0) {
  222. $order->pay_type = OrderRent::PAY_STATUS_OK;
  223. $order->status = OrderRent::STATUS_COMPLETE_ORDER;
  224. }
  225. $order->save();
  226. //4.给订单车辆操作表添加一条新纪录
  227. $orderRentBikeOperate = new OrderRentBikeOperate();
  228. $orderRentBikeOperate->name = OrderRentBikeOperate::$typeMaps[OrderRentBikeOperate::TYPE_ADMIN_SETTLRMENT] . '修改租用超时费为' . $ridding_money . ',租金为' . $rent_money . ',调度费为' . $dispatch_money;
  229. $orderRentBikeOperate->type = OrderRentBikeOperate::TYPE_ADMIN_SETTLRMENT;
  230. $orderRentBikeOperate->bike_id = $order->bike_id;
  231. $orderRentBikeOperate->is_admin = OrderRentBikeOperate::IS_ADMIN_YES;
  232. $orderRentBikeOperate->order_id = $order_id;
  233. $orderRentBikeOperate->user_id = $order->user_id;
  234. $orderRentBikeOperate->save();
  235. $user = User::find($order->user_id);
  236. if (!empty($order)) {
  237. Notification::send($user, new OrderNoPayNotification($user, $order));
  238. }
  239. DB::commit();
  240. return $this->ok('费用已调整');
  241. } catch (\Exception $e) {
  242. DB::rollBack();
  243. Log::info($e->getMessage());
  244. return $this->error('操作失败请联系管理员');
  245. }
  246. // 只有状态为待支付才能后台操作结算
  247. // DB::beginTransaction();
  248. // try {
  249. // // 2.更新用户余额
  250. // $user->wallet_money = $result;
  251. // $res1 = $user->save();
  252. // if (!$res1) {
  253. // DB::rollBack();
  254. // Log::error('更新用户余额失败');
  255. // return $this->error('操作失败请联系管理员');
  256. // }
  257. //
  258. // // 3.插入钱包消费记录
  259. // $wallet_log = new WalletLog();
  260. // $wallet_log->name = WalletLog::$typeMaps[WalletLog::TYPE_ADMIN_SUB_BIKE_ORDER];
  261. // $wallet_log->type = WalletLog::TYPE_ADMIN_SUB_BIKE_ORDER;
  262. // $wallet_log->operate_type = WalletLog::OPERATE_TYPE_SUB;
  263. // $wallet_log->money = -(float)bcadd(bcadd($dispatch_money, $ridding_money, 2), $rent_money, 2);
  264. // $wallet_log->user_id = $user_id;
  265. // $wallet_log->area_id = $area_id;
  266. // $wallet_log->log_id = $order_id;
  267. // $wallet_log->log_type = RentOrder::class;
  268. // $res2 = $wallet_log->save();
  269. // if (!$res2) {
  270. // DB::rollBack();
  271. // Log::error('消费记录插入失败');
  272. // return $this->error('操作失败请联系管理员');
  273. // }
  274. //
  275. // // 3.更新订单
  276. // $order->dispatch_money = (float)$dispatch_money;
  277. // $order->time_money = (float)$ridding_money;
  278. // $order->rent_money = (float)$rent_money;
  279. //
  280. // $order->pay_money = bcadd(bcadd($dispatch_money, $ridding_money, 2), $order->rent_money, 2);
  281. // $order->total_money = $order->pay_money;
  282. // $order->order_total_money = $order->pay_money;
  283. // $order->status = OrderRent::STATUS_COMPLETE_ORDER; // 更新订单状态为已完成
  284. // $order->pay_status = OrderRent::PAY_STATUS_OK; //订单为已支付
  285. // $order->pay_type = OrderRent::PAY_TYPE_ACCOUNT; // 余额支付
  286. // $order->is_admin_settle_order = OrderRent::ADMIN_SETTLE_ORDER_ADMIN;
  287. // // $order->end_use_bike_time = Carbon::now();
  288. // $res3 = $order->save();
  289. // if (!$res3) {
  290. // DB::rollBack();
  291. // Log::error('更新订单失败');
  292. // return $this->error('操作失败请联系管理员');
  293. // }
  294. //
  295. // //4.给订单车辆操作表添加一条新纪录
  296. // $orderRentBikeOperate = new OrderRentBikeOperate();
  297. // $orderRentBikeOperate->name = OrderRentBikeOperate::$typeMaps[OrderRentBikeOperate::TYPE_ADMIN_SETTLRMENT] . '修改租用超时费为' . $ridding_money . ',租金为' . $rent_money . ',调度费为' . $dispatch_money;
  298. // $orderRentBikeOperate->type = OrderRentBikeOperate::TYPE_ADMIN_SETTLRMENT;
  299. // $orderRentBikeOperate->bike_id = $order->bike_id;
  300. // $orderRentBikeOperate->order_id = $order_id;
  301. // $orderRentBikeOperate->user_id = $order->user_id;
  302. // $res4 = $orderRentBikeOperate->save();
  303. // if (!$res4) {
  304. // DB::rollBack();
  305. // Log::error('订单车辆操作插入失败');
  306. // return $this->error('操作失败请联系管理员');
  307. // }
  308. // DB::commit();
  309. // } catch (\Exception $e) {
  310. // DB::rollBack();
  311. // Log::info($e->getMessage());
  312. // return $this->error('操作失败请联系管理员');
  313. // }
  314. //
  315. // return $this->ok($res3);
  316. } else {
  317. return $this->error('车辆处于租车中,请刷新后重试');
  318. }
  319. }
  320. /**
  321. * 日租订单返还
  322. *
  323. * 返还时修改的 rent_money time_money dispatch_money total_money order_total_money
  324. *
  325. * */
  326. public function orderRentReturnMoney(Request $request)
  327. {
  328. $order_id = $request->get('order_id');
  329. $return_type = $request->get('return_type') ?? '';
  330. if ($return_type !== 'wallet' && $return_type !== 'wechat') return $this->error('返还类型错误');
  331. if (empty($order_id) || empty($return_type)) return $this->error('参数错误');
  332. $return_ridding_money = $request->get('ridding_money') ?? 0;
  333. $return_dispatch_money = $request->get('dispatch_money') ?? 0;
  334. $return_base_rent_money = $request->get('base_rent_money') ?? 0;
  335. if ($return_ridding_money == 0 && $return_dispatch_money == 0 && $return_base_rent_money == 0) {
  336. return $this->error('返还金额为0,请填写返还金额');
  337. }
  338. $order = OrderRent::query()->find($order_id);
  339. if (empty($order)) return $this->error('找不到该订单,请联系管理员');
  340. if ($order->is_refund_money == OrderRent::REFUND_MONEY_OK) {
  341. return $this->error('此订单已返还过了 ');
  342. }
  343. // 大于24 * 5小时 不能返还
  344. $order_create_time = Carbon::now()->diffInHours($order->updated_at);
  345. if (abs($order_create_time) > 24 * 5) {
  346. return $this->error('返还已过期,不能进行返还操作');
  347. }
  348. $user_id = $order->user_id;
  349. $area_id = $order->area_id;
  350. $dispatch_money = $order->dispatch_money; //订单调度费
  351. $rent_money = $order->rent_money;//基础租金
  352. $time_money = $order->time_money;// 超时费
  353. $total_money = $order->total_money; //订单骑行费(不带基础租金)
  354. $pay_money = $order->pay_money; //订单实际二次支付费用
  355. $order_total_money = $order->order_total_money; //订单总收入
  356. if (bcsub($dispatch_money, $return_dispatch_money, 2) < 0) {
  357. return $this->error('返还调度费不能大于' . $dispatch_money);
  358. }
  359. if (bcsub($rent_money, $return_base_rent_money, 2) < 0) {
  360. return $this->error('返还基础租金不能大于' . $rent_money);
  361. }
  362. if (bcsub($time_money, $return_ridding_money, 2) < 0) {
  363. return $this->error('返还骑行费不能大于' . $total_money - $dispatch_money);
  364. }
  365. $return_money = bcadd(bcadd($return_dispatch_money, $return_ridding_money, 2), $return_base_rent_money, 2);
  366. if (bcsub($order_total_money, $return_money, 2) < 0) {
  367. return $this->error('返还金额不能大于' . $pay_money);
  368. }
  369. DB::beginTransaction();
  370. try {
  371. $old_pay_money = $order->pay_money;
  372. //1.更新订单
  373. $order->dispatch_money = bcsub($dispatch_money, $return_dispatch_money, 2);
  374. $order->rent_money = bcsub($rent_money, $return_base_rent_money, 2);
  375. $order->time_money = bcsub($time_money, $return_ridding_money, 2);
  376. $order->total_money = bcsub($total_money, $return_money, 2);
  377. $order->order_total_money = bcsub($order_total_money, $return_money, 2);
  378. $order->pay_money = $order->total_money;
  379. $order->is_refund_money = OrderRent::REFUND_MONEY_OK;
  380. $res1 = $order->save();
  381. OrderRentBikeOperate::logs(
  382. OrderRentBikeOperate::$typeMaps[OrderRentBikeOperate::TYPE_ADMIN_ORDER_REFUND] . '(' . Admin::user()->name . ')',
  383. OrderRentBikeOperate::TYPE_ADMIN_ORDER_REFUND,
  384. $order->bike_id,
  385. $order->id,
  386. $order->user_id,
  387. OrderRentBikeOperate::IS_ADMIN_YES
  388. );
  389. if (!$res1) {
  390. DB::rollBack();
  391. Log::error('更新订单失败');
  392. return $this->error('操作失败请联系管理员');
  393. }
  394. if ($return_type === 'wallet') {
  395. $return_type_name = '退平台钱包';
  396. //2.插入钱包记录
  397. $wallet_log = new WalletLog();
  398. $wallet_log->name = WalletLog::$typeMaps[WalletLog::TYPE_ADMIN_ADD_TO_WALLET];
  399. $wallet_log->type = WalletLog::TYPE_ADMIN_ADD_TO_WALLET;
  400. $wallet_log->operate_type = WalletLog::OPERATE_TYPE_ADD;
  401. $wallet_log->money = (float)$return_money;
  402. $wallet_log->user_id = $user_id;
  403. $wallet_log->area_id = $area_id;
  404. $wallet_log->log_id = $order_id;
  405. $wallet_log->log_type = RentOrder::class;
  406. $wallet_log->merchant_id = $order->merchant_id;
  407. $res2 = $wallet_log->save();
  408. if (!$res2) {
  409. DB::rollBack();
  410. Log::error('插入钱包记录失败');
  411. return $this->error('操作失败请联系管理员');
  412. }
  413. //3.更新用户余额
  414. $user = User::query()->find($user_id);
  415. $wallet_money = $user->wallet_money;
  416. $user->wallet_money = bcadd($wallet_money, $return_money, 2);
  417. $res3 = $user->save();
  418. if (!$res3) {
  419. DB::rollBack();
  420. Log::error('更新用户余额失败');
  421. return $this->error('操作失败请联系管理员');
  422. }
  423. $user = User::find($order->user_id);
  424. // 返还通知
  425. Notification::send($user, new OrderRefundNotification($user, $order, $return_money, $return_type_name));
  426. DB::commit();
  427. } else if ($return_type === 'wechat') {
  428. $return_type_name = '原路退回';
  429. //退微信
  430. if ($order->pay_type == OrderRent::PAY_TYPE_ACCOUNT) {
  431. DB::rollBack();
  432. return $this->error('此订单为余额支付 ');
  433. }
  434. //插入钱包记录 增加
  435. $wallet_log_add = new WalletLog();
  436. $wallet_log_add->name = WalletLog::$typeMaps[WalletLog::TYPE_ADD_WECHAT_PAY_ORDER_MONEY];
  437. $wallet_log_add->type = WalletLog::TYPE_ADD_WECHAT_PAY_ORDER_MONEY;
  438. $wallet_log_add->operate_type = WalletLog::OPERATE_TYPE_ADD;
  439. $wallet_log_add->money = (float)$return_money;
  440. $wallet_log_add->user_id = $user_id;
  441. $wallet_log_add->area_id = $area_id;
  442. $wallet_log_add->log_id = $order_id;
  443. $wallet_log_add->log_type = RentOrder::class;
  444. $wallet_log_add->merchant_id = $order->merchant_id;
  445. $wallet_log_add->save();
  446. //3.插入钱包记录 减少
  447. $wallet_log = new WalletLog();
  448. $wallet_log->name = WalletLog::$typeMaps[WalletLog::TYPE_SUB_ORDER_MONEY_PAY_WECHAT];
  449. $wallet_log->type = WalletLog::TYPE_SUB_ORDER_MONEY_PAY_WECHAT;
  450. $wallet_log->operate_type = WalletLog::OPERATE_TYPE_SUB;
  451. $wallet_log->money = -(float)$return_money;
  452. $wallet_log->user_id = $user_id;
  453. $wallet_log->area_id = $area_id;
  454. $wallet_log->log_id = $order_id;
  455. $wallet_log->status = WalletLog::STATUS_PAUSE;
  456. $wallet_log->log_type = RentOrder::class;
  457. $wallet_log->merchant_id = $order->merchant_id;
  458. $res2 = $wallet_log->save();
  459. if (!$res2) {
  460. DB::rollBack();
  461. Log::error('插入钱包记录失败');
  462. return $this->error('操作失败请联系管理员');
  463. }
  464. switch ($order->pay_type ){
  465. case OrderRent::PAY_TYPE_WECHAT:
  466. //微信返还支付
  467. $payment = Factory::payment(wechat_pay_config(AdminMerchant::byId($order->merchant_id)));
  468. $refund_no = $order->no;
  469. $result = $payment->refund->byOutTradeNumber($order->no, $refund_no, wechat_fee($old_pay_money), wechat_fee($return_money), [
  470. // 可在此处传入其他参数,详细参数见微信支付文档
  471. 'refund_desc' => '退订单支付费用',
  472. ]);
  473. if ($result['return_code'] === 'SUCCESS') {
  474. $user = User::find($order->user_id);
  475. // 返还通知
  476. Notification::send($user, new OrderRefundNotification($user, $order, $return_money, $return_type_name));
  477. DB::commit();
  478. return $this->ok('退还成功');
  479. } else {
  480. Log::error('微信退款接口失败');
  481. DB::rollBack();
  482. return $this->error('退还失败,请联系管理员');
  483. }
  484. break;
  485. case OrderRent::PAY_TYPE_ALIPAYMINI:
  486. //支付宝返还支付
  487. $user = User::find($order->user_id);
  488. $refund_no = $order->no;//OrderRent::makeNo();
  489. $url = config('systemConfig.api_url') . '/api/common/alipay-refund-little?merchant_id='.$user->merchant_id.'&no='.$order->no.'&money='.$return_money.'&out_request_no='.$refund_no;
  490. $data = [
  491. 'merchant_id'=>$user->merchant_id,
  492. 'no' => $order->no,
  493. 'money' => $return_money,
  494. 'out_request_no'=>$refund_no
  495. ];
  496. $res = curl_request($url, 'get', $data);
  497. $res = json_decode($res, true);
  498. if ($res['is_refund_status']) {
  499. $user = User::find($order->user_id);
  500. // 返还通知
  501. Notification::send($user, new OrderRefundNotification($user, $order, $return_money, $return_type_name));
  502. DB::commit();
  503. return $this->ok('退还成功');
  504. } else {
  505. Log::error('支付宝退款接口失败');
  506. DB::rollBack();
  507. return $this->error('退还失败,请联系管理员');
  508. }
  509. break;
  510. default:
  511. DB::rollBack();
  512. return $this->error('支付方式类型错误');
  513. }
  514. } else {
  515. DB::rollBack();
  516. return $this->error('返还类型错误');
  517. }
  518. } catch (\Exception $e) {
  519. DB::rollBack();
  520. Log::info($e->getMessage());
  521. return $this->error('操作失败请联系管理员');
  522. }
  523. return $this->ok($res3);
  524. }
  525. /**
  526. * 订单位置详情
  527. * @params 订单id
  528. * @return mongo中最后一个位置 根据订单查Mongo中最后一个位置
  529. * */
  530. public function orderRentDetailPosition(Request $request)
  531. {
  532. $order_id = $request->get('order_id') ?? '';
  533. if (empty($order_id)) return $this->error('参数错误');
  534. $order = OrderRent::find($order_id);
  535. $orderPosition = LocationsLog::query()->where('order_id', $order_id)->where('is_rent', LocationsLog::RENT_YES)
  536. ->whereBetween('latitude', [3, 53])->whereBetween('longitude', [73, 136])->orderByDesc('created_at')->first();
  537. $bike_no = $order->bike_no;
  538. $bikePositioin = LocationsLog::getNewestLocationByBikeNo($bike_no);
  539. $end_use_bike_location = json_decode($order->end_use_bike_location);
  540. $area_id = $order->area_id;
  541. $areaSetting = AreaSetting::where('area_id', $area_id)->first();
  542. $data = [
  543. 'orderPosition' => [$orderPosition->longitude ?? $end_use_bike_location->longitude, $orderPosition->latitude ?? $end_use_bike_location->latitude],
  544. 'bikePosition' => [$bikePositioin['lng'] ?? 0, $bikePositioin['lat'] ?? 0],
  545. 'is_whole_area_huanche' => $areaSetting->is_whole_area_huanche == 1 ? true : false,
  546. ];
  547. return $this->ok($data);
  548. }
  549. /**
  550. * 订单回溯到骑行状态
  551. * */
  552. public function changeRentOrderRiding(Request $request)
  553. {
  554. $order_id = $request->get('order_id');
  555. if (empty($order_id)) return $this->error('参数错误');
  556. $order = OrderRent::find($order_id);
  557. if (empty($order)) return $this->error('找不到该订单');
  558. $is_low_electric = $request->get('is_low_electric') ?? false;
  559. $order_end_time = Carbon::now()->diffInHours($order->end_use_bike_time);
  560. if ($order->status == OrderRent::STATUS_CLOSE_RENT_BIKE && $order_end_time < 4) {
  561. // 4小时内可回溯
  562. try {
  563. DB::beginTransaction();
  564. $bike = Bike::find($order->bike_id);
  565. $bike->is_riding = Bike::RIDING_YES;
  566. $bike->is_rent = Bike::RENT_YES;
  567. $bike->save();
  568. $order->status = OrderRent::STATUS_RENT_BIKE;
  569. $order->save();
  570. $orderBikeOperate = new OrderRentBikeOperate();
  571. if ($is_low_electric) {
  572. $orderBikeOperate->name = OrderRentBikeOperate::$typeMaps[OrderRentBikeOperate::TYPE_ADMIN_ORDER_BACK_LOW_POWER];
  573. $orderBikeOperate->type = OrderRentBikeOperate::TYPE_ADMIN_ORDER_BACK_LOW_POWER;
  574. } else {
  575. $orderBikeOperate->name = OrderRentBikeOperate::$typeMaps[OrderRentBikeOperate::TYPE_ADMIN_ORDER_BACK];
  576. $orderBikeOperate->type = OrderRentBikeOperate::TYPE_ADMIN_ORDER_BACK;
  577. }
  578. $orderBikeOperate->bike_id = $order->bike_id;
  579. $orderBikeOperate->order_id = $order_id;
  580. $orderBikeOperate->user_id = $order->user_id;
  581. $orderBikeOperate->is_admin = OrderRentBikeOperate::IS_ADMIN_YES;
  582. $orderBikeOperate->save();
  583. DB::commit();
  584. (new BikeStatusInfoSyncHandler())->toBikeRideStatus(BikeStatusInfoSyncHandler::ROLE_USER, $order->bike_no,
  585. [
  586. 'id' => $order_id,
  587. 'area_id' => $order->area_id,
  588. 'bike_id' => $order->bike_id,
  589. 'is_rent' => 1,
  590. ]);
  591. (new BikeStatusInfoSyncHandler())->toBikeRentWaitRideStatus($bike->bike_no);
  592. if ($is_low_electric) {
  593. (new BikeStatusInfoSyncHandler())->toBikeNoElectric($bike->box_no);
  594. }
  595. return $this->ok('操作成功');
  596. } catch (\Exception $e) {
  597. Log::error($e->getMessage());
  598. return $this->error('操作失败,请联系管理员');
  599. }
  600. } else {
  601. return $this->error('时间过长不可回溯');
  602. }
  603. }
  604. /**
  605. * orderBikeContro 订单车辆控制
  606. *
  607. * @param Request $request
  608. * @return \Illuminate\Http\JsonResponse
  609. * @author Fx
  610. *
  611. */
  612. public function orderBikeContro(Request $request)
  613. {
  614. $type = $request->get('type') ?? '';
  615. $order_no = $request->get('order_no') ?? '';
  616. if (empty($type) || empty($order_no)) return $this->error('参数错误');
  617. $order = OrderRent::query()->where('no', $order_no)->first();
  618. if ($order->status == OrderRent::STATUS_RENT_BIKE) {
  619. switch ($type) {
  620. case 'huiDian':
  621. (new BikeStatusInfoSyncHandler())->toBikeGetElectric($order->bike_no);
  622. (new BaseBikeControl($order->bikes->box_no))::outAreaGetElectric();
  623. $res = OrderRentBikeOperate::logs(
  624. OrderRentBikeOperate::$typeMaps[OrderRentBikeOperate::TYPE_ADMIN_ORDER_HUI_DIAN] . '(' . Admin::user()->name . ')',
  625. OrderRentBikeOperate::TYPE_ADMIN_ORDER_HUI_DIAN,
  626. $order->bike_id,
  627. $order->id,
  628. $order->user_id,
  629. OrderRentBikeOperate::IS_ADMIN_YES
  630. );
  631. break;
  632. case 'openLock':
  633. (new BaseBikeControl($order->bikes->box_no))::openLock();
  634. $res = OrderRentBikeOperate::logs(
  635. OrderRentBikeOperate::$typeMaps[OrderRentBikeOperate::TYPE_ADMIN_ORDER_OPEN_LOCK] . '(' . Admin::user()->name . ')',
  636. OrderRentBikeOperate::TYPE_ADMIN_ORDER_OPEN_LOCK,
  637. $order->bike_id,
  638. $order->id,
  639. $order->user_id,
  640. OrderRentBikeOperate::IS_ADMIN_YES
  641. );
  642. break;
  643. default:
  644. return $this->error('参数错误,请检查后重新提交');
  645. }
  646. if ($res) {
  647. return $this->ok('操作成功');
  648. } else {
  649. return $this->error('出现错误,请联系管理员');
  650. }
  651. } else {
  652. return $this->error('订单状态不为在骑行,无法操作车辆');
  653. }
  654. }
  655. }