OrderController.php 8.1 KB

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