package com.ruoyi.app.flashdelivery.controller; import com.ruoyi.app.flashdelivery.dto.*; import com.ruoyi.app.flashdelivery.exception.FlashDeliveryQuoteChangedException; import com.ruoyi.app.flashdelivery.service.FlashDeliveryApplicationService; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.system.utils.Auth; import com.ruoyi.system.utils.JwtUtil; import org.springframework.web.bind.annotation.*; /** 用户端闪送接口;用户身份始终从请求头 token 解析。 */ @RestController @RequestMapping("/system/flashDelivery") @Anonymous public class FlashDeliveryUserController extends BaseController { private final FlashDeliveryApplicationService service; public FlashDeliveryUserController(FlashDeliveryApplicationService service) { this.service = service; } /** 获取当前启用的服务类型和公开计价摘要。 */ @GetMapping("/home") @Auth public AjaxResult home(@RequestHeader String token) { return success(service.home()); } /** 根据取送坐标获取服务端实时报价。 */ @PostMapping("/quote") @Auth public AjaxResult quote(@RequestHeader String token, @RequestBody FlashDeliveryQuoteRequest request) { userId(token); return success(service.quote(request)); } /** 幂等创建闪送订单,客户端不能指定用户、距离或金额。 */ @PostMapping("/orders") @Auth public AjaxResult create(@RequestHeader String token, @RequestBody FlashDeliveryCreateRequest request) { try { return success(service.create(userId(token), request)); } catch (FlashDeliveryQuoteChangedException exception) { return AjaxResult.error(MessageUtils.message("flash.delivery.quote.changed"), exception.getLatestQuote()); } } /** * 分页查询当前用户参与的闪送订单。 * * @param token 登录令牌,用于解析当前用户 ID * @param page 页码,从 1 开始,默认 1 * @param size 每页数量,默认 10,服务端限制为 1 至 100 * @param role 订单角色;sender 表示我发的,receiver 表示我收的,不传按 sender 处理 */ @GetMapping("/orders") @Auth public AjaxResult orders(@RequestHeader String token, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size, @RequestParam(required = false) String role) { return success(service.userOrders(userId(token), page, size, role)); } /** 查询本人订单详情,直接返回订单字段和按类型分组的履约图片。 */ @GetMapping("/orders/{id}") @Auth public AjaxResult detail(@RequestHeader String token, @PathVariable Long id) { return success(service.userDetail(userId(token), id)); } /** 修改取送信息的预报价,不写订单;沿用该订单计价快照。 */ @PostMapping("/orders/{id}/address/quote") @Auth public AjaxResult quoteAddress(@RequestHeader String token, @PathVariable Long id, @RequestBody FlashDeliveryAddressChangeRequest request) { return success(service.quoteAddress(userId(token), id, request)); } /** 确认修改当前订单取送信息;路线或报价变化时返回最新报价。 */ @PostMapping("/orders/address") @Auth public AjaxResult updateAddress(@RequestHeader String token, @RequestBody FlashDeliveryAddressConfirmRequest request) { try { return success(service.updateAddress(userId(token), request == null ? null : request.getOrderId(), request)); } catch (FlashDeliveryQuoteChangedException exception) { return AjaxResult.error(MessageUtils.message("flash.delivery.quote.changed"), exception.getLatestQuote()); } } /** 待接单时追加正整数小费,同步增加订单总金额。 */ @PostMapping("/orders/tip") @Auth public AjaxResult addTip(@RequestHeader String token, @RequestBody FlashDeliveryTipAddRequest request) { return success(service.addTip(userId(token), request == null ? null : request.getOrderId(), request)); } /** 在待接单或已接单阶段取消本人订单。 */ @PostMapping("/orders/{id}/cancel") @Auth public AjaxResult cancel(@RequestHeader String token, @PathVariable Long id, @RequestBody FlashDeliveryReasonRequest request) { service.userCancel(userId(token), id, request); return success(); } /** 用户确认已经收到物品,将已送达订单置为已完成。 */ @PostMapping("/orders/{id}/confirmReceipt") @Auth public AjaxResult confirmReceipt(@RequestHeader String token, @PathVariable Long id) { service.confirmReceipt(userId(token), id); return success(); } private Long userId(String token) { return Long.valueOf(new JwtUtil().getusid(token)); } }