OrderController.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <?php
  2. namespace App\Http\Controllers\Client;
  3. use App\Enums\OrderType;
  4. use App\Http\Controllers\Controller;
  5. use App\Services\Client\OrderService;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\Auth;
  8. /**
  9. * @group 用户端
  10. *
  11. * 订单相关的API接口
  12. */
  13. class OrderController extends Controller
  14. {
  15. protected OrderService $service;
  16. public function __construct(OrderService $service)
  17. {
  18. $this->service = $service;
  19. }
  20. /**
  21. * [订单]订单初始化
  22. *
  23. * 初始化订单
  24. *
  25. * @authenticated
  26. *
  27. * @bodyParam coach_id int required 技师ID. Example: 6
  28. * @bodyParam area_code string required 区划代码. Example: 370602
  29. * @bodyParam project_id int required 项目ID. Example: 1
  30. * @bodyParam latitude int 纬度. Example: 37.4219983
  31. * @bodyParam longitude int 经度. Example: 122.1347344
  32. *
  33. * @response {
  34. * "status": "success",
  35. * "data": {}
  36. * }
  37. */
  38. public function initialize(Request $request)
  39. {
  40. $data = $request->only(['coach_id', 'area_code', 'project_id', 'latitude', 'longitude']);
  41. return $this->service->initialize(Auth::user()->id, $data);
  42. }
  43. /**
  44. * [订单]创建订单
  45. *
  46. * 创建订单
  47. *
  48. * @authenticated
  49. *
  50. * @bodyParam project_id int required 项目ID. Example: 1
  51. * @bodyParam address_id int required 地址ID. Example: 1
  52. * @bodyParam coach_id int required 技师ID. Example: 6
  53. * @bodyParam use_balance boolean 使用余额. Example: false
  54. * @bodyParam service_time datetime required 服务时间. Example: 2024-01-01 10:00:00
  55. * @bodyParam order_id int 订单ID. Example: null
  56. * @bodyParam payment_type number required 支付类型. Example: 1 (1:余额,2:微信,3:支付宝)
  57. * @bodyParam order_type int required 订单类型. Example: 1
  58. * @bodyParam distance float 距离. Example: 10
  59. *
  60. * @response {
  61. * "status": "success",
  62. * "data": {}
  63. * }
  64. */
  65. public function create(Request $request)
  66. {
  67. $data = $request->only(['project_id', 'address_id', 'coach_id', 'use_balance', 'order_id', 'service_time', 'payment_type', 'order_type', 'distance']);
  68. return $this->service->createOrder(Auth::user()->id, $data);
  69. }
  70. /**
  71. * [订单]结束订单
  72. *
  73. * 结束订单
  74. *
  75. * @authenticated
  76. *
  77. * @bodyParam order_id int required 订单ID. Example: 1
  78. *
  79. * @response {
  80. * "status": "success",
  81. * "data": {}
  82. * }
  83. */
  84. public function finish(Request $request)
  85. {
  86. $userId = Auth::user()->id;
  87. $orderId = $request->input('order_id');
  88. return $this->service->finishOrder($userId, $orderId);
  89. }
  90. /**
  91. * [订单]确认技师离开
  92. *
  93. * 确认技师离开
  94. *
  95. * @authenticated
  96. *
  97. * @bodyParam order_id int required 订单ID. Example: 123
  98. *
  99. * @response {
  100. * "status": "success",
  101. * "data": {}
  102. * }
  103. */
  104. public function confirmLeave(Request $request)
  105. {
  106. $userId = Auth::user()->id;
  107. $orderId = $request->input('order_id');
  108. return $this->service->confirmLeave($userId, $orderId);
  109. }
  110. /**
  111. * [订单]取消订单
  112. *
  113. * 取消订单
  114. *
  115. * @authenticated
  116. *
  117. * @bodyParam order_id int required 订单ID. Example: 123
  118. * @bodyParam reason string required 取消原因. Example: 123
  119. *
  120. * @response {
  121. * "status": "success",
  122. * "data": {}
  123. * }
  124. */
  125. public function cancel(Request $request)
  126. {
  127. $userId = Auth::user()->id;
  128. $orderId = $request->input('order_id');
  129. $reason = $request->input('reason');
  130. return $this->service->cancelOrder($userId, $orderId, $reason);
  131. }
  132. /**
  133. * [订单]获取订单列表
  134. *
  135. * 获取订单列表
  136. *
  137. * @authenticated
  138. *
  139. * @response {
  140. * "status": "success",
  141. * "data": []
  142. * }
  143. */
  144. public function list()
  145. {
  146. return $this->service->getOrderList(Auth::user()->id);
  147. }
  148. /**
  149. * [订单]获取订单详情
  150. *
  151. * 获取订单详情
  152. *
  153. * @authenticated
  154. *
  155. * @urlParam id required 订单ID. Example: 6
  156. *
  157. * @response {
  158. * "status": "success",
  159. * "data": {}
  160. * }
  161. */
  162. public function detail($id)
  163. {
  164. return $this->service->getOrderDetail(Auth::user()->id, $id);
  165. }
  166. /**
  167. * [订单]订单退款
  168. *
  169. * 订单退款
  170. *
  171. * @authenticated
  172. *
  173. * @urlParam id required 订单ID. Example: 1
  174. *
  175. * @response {
  176. * "status": "success",
  177. * "data": {}
  178. * }
  179. */
  180. public function refund($id)
  181. {
  182. return $this->service->refundOrder($id);
  183. }
  184. /**
  185. * [订单]获取代理商配置
  186. *
  187. * 获取代理商配置
  188. *
  189. * @authenticated
  190. *
  191. * @bodyParam agent_id int required 代理商ID. Example: 1
  192. *
  193. * @response {
  194. * "min_distance": 0,
  195. * "min_fee": 0,
  196. * "per_km_fee": 0
  197. * }
  198. */
  199. public function getAgentConfig(Request $request)
  200. {
  201. $agentId = $request->input('agent_id');
  202. return $this->service->getAgentConfig($agentId);
  203. }
  204. /**
  205. * [订单]获取技师配置
  206. *
  207. * 获取技师配置
  208. *
  209. * @authenticated
  210. *
  211. * @bodyParam coach_id int required 技师ID. Example: 1
  212. *
  213. * @response {
  214. * "delivery_fee_type": "round_trip",
  215. * "charge_delivery_fee": true
  216. * }
  217. */
  218. public function getCoachConfig(Request $request)
  219. {
  220. $coachId = $request->input('coach_id');
  221. return $this->service->getCoachConfig($coachId);
  222. }
  223. /**
  224. * [订单]计算订单金额
  225. *
  226. * 计算订单金额
  227. *
  228. * @authenticated
  229. *
  230. * @bodyParam address_id int required 地址ID. Example: 1
  231. * @bodyParam coach_id int required 技师ID. Example: 1
  232. * @bodyParam project_id int required 项目ID. Example: 1
  233. * @bodyParam agent_id int 代理商ID. Example: 1
  234. * @bodyParam use_balance boolean 使用余额. Example: 0
  235. * @bodyParam distance float 距离. Example: 0
  236. *
  237. * @response {
  238. * "total_amount": 0,
  239. * "balance_amount": 0,
  240. * "pay_amount": 0,
  241. * "coupon_amount": 0,
  242. * "tip_amount": 0,
  243. * "project_amount": 0,
  244. * "delivery_fee": 0
  245. * }
  246. */
  247. public function calculateOrderAmount(Request $request)
  248. {
  249. $userId = Auth::user()->id;
  250. $addressId = $request->input('address_id');
  251. $coachId = $request->input('coach_id');
  252. $projectId = $request->input('project_id');
  253. $agentId = $request->input('agent_id');
  254. $useBalance = $request->input('use_balance', 0);
  255. $distance = $request->input('distance', 0);
  256. return $this->service->calculateOrderAmount($userId, $addressId, $coachId, $projectId, $agentId, $useBalance, $distance);
  257. }
  258. /**
  259. * [订单]加钟
  260. *
  261. * 加钟
  262. *
  263. * @authenticated
  264. *
  265. * @bodyParam project_id int required 项目ID. Example: 1
  266. * @bodyParam use_balance boolean 使用余额. Example: false
  267. * @bodyParam order_id int 订单ID. Example: 15
  268. * @bodyParam payment_type number 支付类型. Example: 1 (1:余额,2:微信,3:支付宝)
  269. *
  270. * @response {
  271. * "status": "success",
  272. * "data": {}
  273. * }
  274. */
  275. public function addTime(Request $request)
  276. {
  277. $data = $request->only(['project_id', 'use_balance', 'order_id', 'payment_type']);
  278. $data['order_type'] = OrderType::OVERTIME->value;
  279. return $this->service->createOrder(Auth::user()->id, $data);
  280. }
  281. /**
  282. * [订单]指定技师
  283. *
  284. * @authenticated
  285. *
  286. * @bodyParam coach_id int required 技师ID. Example: 1
  287. * @bodyParam order_id int required 订单ID. Example: 1
  288. *
  289. * @response {
  290. * "status": "success",
  291. * "data": {}
  292. * }
  293. */
  294. public function assignCoach(Request $request)
  295. {
  296. $userId = Auth::user()->id;
  297. $coachId = $request->input('coach_id');
  298. $orderId = $request->input('order_id');
  299. return $this->service->assignCoach($userId, $orderId, $coachId);
  300. }
  301. /**
  302. * [订单]获取抢单列表
  303. *
  304. * 获取抢单列表
  305. *
  306. * @queryParam order_id int required 订单ID. Example: 7
  307. *
  308. * @response {
  309. * "data": [
  310. * {
  311. * "id": 1,
  312. * "coach_id": 1,
  313. * "nickname": "技师昵称",
  314. * "avatar": "头像地址",
  315. * "created_at": "2024-03-21 10:00:00"
  316. * }
  317. * ]
  318. * }
  319. */
  320. public function getOrderGrabList(Request $request)
  321. {
  322. $orderId = $request->input('order_id');
  323. return $this->service->getOrderGrabList($orderId);
  324. }
  325. /**
  326. * [订单]生成核销码
  327. *
  328. * 生成订单核销码,用于技师扫码开始服务
  329. *
  330. * @authenticated
  331. *
  332. * @urlParam id required 订单ID. Example: 1
  333. *
  334. * @response {
  335. * "qr_code": "order_123_1679876543_abcdef123456",
  336. * "expired_at": "2024-03-27 10:30:00"
  337. * }
  338. */
  339. public function generateCode($id)
  340. {
  341. return $this->service->generateVerificationCode(Auth::user()->id, $id);
  342. }
  343. }