package com.tourguide.api.mini; import com.tourguide.common.api.ApiResponse; import com.tourguide.common.api.PageResponse; import com.tourguide.modules.order.dto.MiniOrderListResponse; import com.tourguide.modules.order.dto.MiniOrderCreateRequest; import com.tourguide.modules.order.dto.MiniOrderSummaryResponse; import com.tourguide.modules.order.dto.TourOrderResponse; import com.tourguide.modules.order.service.MiniTourOrderCommandService; import com.tourguide.modules.order.service.MiniTourOrderService; import com.tourguide.security.AppUserPrincipal; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; /** * 游客小程序个人订单查询接口。 * 所有查询均使用 MINI Token 中的游客主键限定数据范围,客户端不能查看其他游客订单。 */ @RestController @RequestMapping("/api/mini/orders") public class MiniTourOrderController { private final MiniTourOrderService orderService; private final MiniTourOrderCommandService commandService; public MiniTourOrderController(MiniTourOrderService orderService, MiniTourOrderCommandService commandService) { this.orderService = orderService; this.commandService = commandService; } /** * 分页查询当前游客的订单,并按下单时间从新到旧排序。 * completed 分组同时包含待评价和已评价订单,响应中的 displayStatus 用于区分按钮和状态文案。 * * @param principal 安全过滤器解析出的当前游客身份 * @param status 页面状态标签:all、pendingPay、pendingGuide、serving 或 completed * @param page 页码,从 1 开始 * @param size 每页记录数 * @return 当前游客的订单分页结果 */ @GetMapping public ApiResponse> page( @AuthenticationPrincipal AppUserPrincipal principal, @RequestParam(defaultValue = "all") String status, @RequestParam(defaultValue = "1") long page, @RequestParam(defaultValue = "10") long size) { return ApiResponse.success(orderService.page(principal.getUserId(), status, page, size)); } /** * 查询个人中心订单入口的各状态数量,用于展示待付款、待讲解、讲解中和已完成角标。 * * @param principal 安全过滤器解析出的当前游客身份 * @return 当前游客各主要订单状态数量 */ @GetMapping("/summary") public ApiResponse summary(@AuthenticationPrincipal AppUserPrincipal principal) { return ApiResponse.success(orderService.summary(principal.getUserId())); } @PostMapping public ApiResponse create( @AuthenticationPrincipal AppUserPrincipal principal, @Valid @RequestBody MiniOrderCreateRequest request) { return ApiResponse.success(commandService.create(principal.getUserId(), request)); } /** * 确认当前游客的订单支付成功,将订单从待支付流转为等待导游接单。 * 当前用于小程序模拟支付完成;正式微信支付接入后应改由服务端支付回调确认。 * * @param principal 安全过滤器解析出的当前游客身份 * @param id 当前游客订单主键 * @return 支付完成后的订单详情 */ @PutMapping("/{id}/pay") public ApiResponse pay( @AuthenticationPrincipal AppUserPrincipal principal, @PathVariable Long id) { return ApiResponse.success(commandService.confirmPayment(principal.getUserId(), id)); } @GetMapping("/active") public ApiResponse active(@AuthenticationPrincipal AppUserPrincipal principal) { return ApiResponse.success(commandService.active(principal.getUserId())); } @GetMapping("/{id}") public ApiResponse detail( @AuthenticationPrincipal AppUserPrincipal principal, @PathVariable Long id) { return ApiResponse.success(commandService.detail(principal.getUserId(), id)); } @PutMapping("/{id}/cancel") public ApiResponse cancel( @AuthenticationPrincipal AppUserPrincipal principal, @PathVariable Long id) { return ApiResponse.success(commandService.cancel(principal.getUserId(), id)); } }