FlashDeliveryRiderController.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package com.ruoyi.app.flashdelivery.controller;
  2. import com.ruoyi.app.flashdelivery.dto.FlashDeliveryTargetRequest;
  3. import com.ruoyi.app.flashdelivery.dto.FlashDeliveryProofRequest;
  4. import com.ruoyi.app.flashdelivery.dto.FlashDeliveryDeliverRequest;
  5. import com.ruoyi.app.flashdelivery.dto.FlashDeliveryStopDeliverRequest;
  6. import com.ruoyi.app.flashdelivery.service.FlashDeliveryApplicationService;
  7. import com.ruoyi.common.annotation.Anonymous;
  8. import com.ruoyi.common.core.controller.BaseController;
  9. import com.ruoyi.common.core.domain.AjaxResult;
  10. import com.ruoyi.common.exception.ServiceException;
  11. import com.ruoyi.common.utils.MessageUtils;
  12. import com.ruoyi.system.utils.Auth;
  13. import com.ruoyi.system.utils.JwtUtil;
  14. import org.springframework.web.bind.annotation.*;
  15. import java.math.BigDecimal;
  16. /** 骑手端闪送接口;仅 userType=2 的 token 可执行接单和履约操作。 */
  17. @RestController
  18. @RequestMapping("/system/flashDelivery/rider")
  19. @Anonymous
  20. public class FlashDeliveryRiderController extends BaseController {
  21. private final FlashDeliveryApplicationService service;
  22. public FlashDeliveryRiderController(FlashDeliveryApplicationService service) { this.service = service; }
  23. /**
  24. * 按页签查询可抢任务或当前骑手自己的任务。
  25. *
  26. * @param token 登录令牌,用于解析当前骑手 ID
  27. * @param page 页码,从 1 开始,默认 1
  28. * @param size 每页数量,默认 10,服务端限制为 1 至 100
  29. * @param tab 骑手任务页签:newTask、toPickup、delivering、completed 或 cancelled
  30. * @param longitude 骑手当前经度;newTask 页签选填,传入时必须与纬度同时提供
  31. * @param latitude 骑手当前纬度;newTask 页签选填,传入时必须与经度同时提供
  32. */
  33. @GetMapping("/orders")
  34. @Auth
  35. public AjaxResult orders(@RequestHeader String token,
  36. @RequestParam(defaultValue = "1") int page,
  37. @RequestParam(defaultValue = "10") int size,
  38. @RequestParam(defaultValue = "newTask") String tab,
  39. @RequestParam(required = false) BigDecimal longitude,
  40. @RequestParam(required = false) BigDecimal latitude) {
  41. return success(service.riderOrders(userId(token), page, size, tab, longitude, latitude));
  42. }
  43. /**
  44. * 骑手端任务角标数量:一次返回闪送订单 newTask/toPickup/delivering 三个页签的计数,
  45. * App 无需逐页签切换请求;newTask 距离过滤口径与列表一致。
  46. *
  47. * @param token 登录令牌,用于解析当前骑手 ID
  48. * @param longitude 骑手当前经度;选填,传入时必须与纬度同时提供
  49. * @param latitude 骑手当前纬度;选填,传入时必须与经度同时提供
  50. */
  51. @GetMapping("/orderCount")
  52. @Auth
  53. public AjaxResult orderCount(@RequestHeader String token,
  54. @RequestParam(required = false) BigDecimal longitude,
  55. @RequestParam(required = false) BigDecimal latitude) {
  56. return success(service.riderOrderCounts(userId(token), longitude, latitude));
  57. }
  58. /** 接单前隐藏敏感字段;接单后仅中单骑手可见完整履约信息。 */
  59. @GetMapping("/orders/{id}")
  60. @Auth
  61. public AjaxResult detail(@RequestHeader String token, @PathVariable Long id) {
  62. return success(service.riderDetail(userId(token), id));
  63. }
  64. /** 按订单编号查询订单详情;脱敏与归属校验和数字 ID 查询一致。 */
  65. @GetMapping("/orders/byOrderNo")
  66. @Auth
  67. public AjaxResult detailByOrderNo(@RequestHeader String token, @RequestParam String orderNo) {
  68. return success(service.riderDetailByOrderNo(userId(token), orderNo));
  69. }
  70. /** 原子抢单;同一订单只能由一个骑手成功接取。 */
  71. @PostMapping("/orders/{id}/accept")
  72. @Auth
  73. public AjaxResult accept(@RequestHeader String token, @PathVariable Long id) {
  74. return success(service.accept(userId(token), id));
  75. }
  76. /** 骑手确认实际收款;仅首次条件更新写入审计日志,重复调用幂等成功。 */
  77. @PostMapping("/orders/{id}/confirmPayment")
  78. @Auth
  79. public AjaxResult confirmPayment(@RequestHeader String token, @PathVariable Long id) {
  80. service.confirmPayment(userId(token), id);
  81. return success();
  82. }
  83. /** 上传指定取货站凭证;全部取货站完成后订单才进入已取件。 */
  84. @PostMapping("/orders/{id}/pickup")
  85. @Auth
  86. public AjaxResult pickup(@RequestHeader String token, @PathVariable Long id,
  87. @RequestBody FlashDeliveryProofRequest request) {
  88. service.pickup(userId(token), id, request);
  89. return success();
  90. }
  91. /** 上传送达凭证并将已取件订单推进为已送达。 */
  92. @Deprecated
  93. @PostMapping("/orders/{id}/deliver")
  94. @Auth
  95. public AjaxResult deliver(@RequestHeader String token, @PathVariable Long id,
  96. @RequestBody FlashDeliveryDeliverRequest request) {
  97. service.deliver(userId(token), id, request);
  98. return success();
  99. }
  100. /** v2 逐站送达:业务参数统一放 body,全部收货站完成订单才进入已送达。 */
  101. @PostMapping("/orders/stops/deliver")
  102. @Auth
  103. public AjaxResult deliverAtStop(@RequestHeader String token,
  104. @RequestBody FlashDeliveryStopDeliverRequest request) {
  105. if (request == null) throw new ServiceException(MessageUtils.message("flash.delivery.request.required"));
  106. if (request.getOrderId() == null || request.getOrderId() <= 0) {
  107. throw new ServiceException(MessageUtils.message("flash.delivery.order.not.found"));
  108. }
  109. if (request.getStopId() == null || request.getStopId() <= 0) {
  110. throw new ServiceException(MessageUtils.message("flash.delivery.stop.id.required"));
  111. }
  112. service.deliverAtStop(userId(token), request.getOrderId(), request.getStopId(), request);
  113. return success();
  114. }
  115. /** 只确认指定站点取货,不自动选择其他待取站点。 */
  116. @PostMapping("/orders/{id}/stops/{stopId}/pickup")
  117. @Auth
  118. public AjaxResult pickupStop(@RequestHeader String token, @PathVariable Long id, @PathVariable Long stopId,
  119. @RequestBody FlashDeliveryProofRequest request) {
  120. service.pickupAtStop(userId(token), id, stopId, request);
  121. return success();
  122. }
  123. /** 保存前往目标及必要的骑手同意声明,不推进取件状态。 */
  124. @PostMapping("/orders/{id}/stops/{stopId}/target")
  125. @Auth
  126. public AjaxResult target(@RequestHeader String token, @PathVariable Long id, @PathVariable Long stopId,
  127. @RequestBody FlashDeliveryTargetRequest request) {
  128. return success(service.selectTarget(userId(token), id, stopId, request));
  129. }
  130. private Long userId(String token) { return Long.valueOf(new JwtUtil().getusid(token)); }
  131. }