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.MiniPaymentResponse;
|
import com.tourguide.modules.order.dto.TourOrderResponse;
|
import com.tourguide.modules.order.service.HuifuMiniPaymentService;
|
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;
|
private final HuifuMiniPaymentService paymentService;
|
|
public MiniTourOrderController(MiniTourOrderService orderService,
|
MiniTourOrderCommandService commandService,
|
HuifuMiniPaymentService paymentService) {
|
this.orderService = orderService;
|
this.commandService = commandService;
|
this.paymentService = paymentService;
|
}
|
|
/**
|
* 分页查询当前游客的订单,并按下单时间从新到旧排序。
|
* completed 分组同时包含待评价和已评价订单,响应中的 displayStatus 用于区分按钮和状态文案。
|
*
|
* @param principal 安全过滤器解析出的当前游客身份
|
* @param status 页面状态标签:all、pendingPay、pendingGuide、serving 或 completed
|
* @param page 页码,从 1 开始
|
* @param size 每页记录数
|
* @return 当前游客的订单分页结果
|
*/
|
@GetMapping
|
public ApiResponse<PageResponse<MiniOrderListResponse>> 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<MiniOrderSummaryResponse> summary(@AuthenticationPrincipal AppUserPrincipal principal) {
|
return ApiResponse.success(orderService.summary(principal.getUserId()));
|
}
|
|
@PostMapping
|
public ApiResponse<TourOrderResponse> 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<MiniPaymentResponse> pay(
|
@AuthenticationPrincipal AppUserPrincipal principal,
|
@PathVariable Long id) {
|
return ApiResponse.success(paymentService.create(principal.getUserId(), id));
|
}
|
|
@GetMapping("/active")
|
public ApiResponse<TourOrderResponse> active(@AuthenticationPrincipal AppUserPrincipal principal) {
|
return ApiResponse.success(commandService.active(principal.getUserId()));
|
}
|
|
@GetMapping("/{id}")
|
public ApiResponse<TourOrderResponse> detail(
|
@AuthenticationPrincipal AppUserPrincipal principal,
|
@PathVariable Long id) {
|
return ApiResponse.success(commandService.detail(principal.getUserId(), id));
|
}
|
|
@PutMapping("/{id}/cancel")
|
public ApiResponse<TourOrderResponse> cancel(
|
@AuthenticationPrincipal AppUserPrincipal principal,
|
@PathVariable Long id) {
|
return ApiResponse.success(commandService.cancel(principal.getUserId(), id));
|
}
|
}
|