package cn.iocoder.yudao.module.trade.controller.app.order; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.*; import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemRespVO; import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleService; import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderQueryService; import cn.iocoder.yudao.module.trade.service.order.TradeOrderUpdateService; import cn.iocoder.yudao.module.trade.service.price.TradePriceService; import com.google.common.collect.Maps; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @Tag(name = "用户 App - 交易订单") @RestController @RequestMapping("/trade/order") @Validated @Slf4j public class AppTradeOrderController { @Resource private TradeOrderUpdateService tradeOrderUpdateService; @Resource private TradeOrderQueryService tradeOrderQueryService; @Resource private DeliveryExpressService deliveryExpressService; @Resource private AfterSaleService afterSaleService; @Resource private TradePriceService priceService; @Resource private TradeOrderProperties tradeOrderProperties; @GetMapping("/settlement") @Operation(summary = "获得订单结算信息") public CommonResult settlementOrder(@Valid AppTradeOrderSettlementReqVO settlementReqVO) { return success(tradeOrderUpdateService.settlementOrder(getLoginUserId(), settlementReqVO)); } @GetMapping("/settlement-product") @Operation(summary = "获得商品结算信息", description = "用于商品列表、商品详情,获得参与活动后的价格信息") @Parameter(name = "spuIds", description = "商品 SPU 编号数组") @PermitAll public CommonResult> settlementProduct(@RequestParam("spuIds") List spuIds) { return success(priceService.calculateProductPrice(getLoginUserId(), spuIds)); } @PostMapping("/create") @Operation(summary = "创建订单") public CommonResult createOrder(@Valid @RequestBody AppTradeOrderCreateReqVO createReqVO) { TradeOrderDO order = tradeOrderUpdateService.createOrder(getLoginUserId(), createReqVO); return success(new AppTradeOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId())); } @PostMapping("/update-paid") @Operation(summary = "更新订单为已支付") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob @PermitAll public CommonResult updateOrderPaid(@RequestBody PayOrderNotifyReqDTO notifyReqDTO) { tradeOrderUpdateService.updateOrderPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()), notifyReqDTO.getPayOrderId()); return success(true); } @GetMapping("/get-detail") @Operation(summary = "获得交易订单") @Parameters({ @Parameter(name = "id", description = "交易订单编号"), @Parameter(name = "sync", description = "是否同步支付状态", example = "true") }) public CommonResult getOrderDetail(@RequestParam("id") Long id, @RequestParam(value = "sync", required = false) Boolean sync) { // 1.1 查询订单 TradeOrderDO order = tradeOrderQueryService.getOrder(getLoginUserId(), id); if (order == null) { return success(null); } // 1.2 sync 仅在等待支付 if (Boolean.TRUE.equals(sync) && TradeOrderStatusEnum.isUnpaid(order.getStatus()) && !order.getPayStatus()) { tradeOrderUpdateService.syncOrderPayStatusQuietly(order.getId(), order.getPayOrderId()); // 重新查询,因为同步后,可能会有变化 order = tradeOrderQueryService.getOrder(id); } // 2.1 查询订单项 List orderItems = tradeOrderQueryService.getOrderItemListByOrderId(order.getId()); // 2.2 查询物流公司 DeliveryExpressDO express = order.getLogisticsId() != null && order.getLogisticsId() > 0 ? deliveryExpressService.getDeliveryExpress(order.getLogisticsId()) : null; // 2.3 最终组合 return success(TradeOrderConvert.INSTANCE.convert02(order, orderItems, tradeOrderProperties, express)); } @GetMapping("/get-express-track-list") @Operation(summary = "获得交易订单的物流轨迹") @Parameter(name = "id", description = "交易订单编号") public CommonResult> getOrderExpressTrackList(@RequestParam("id") Long id) { return success(TradeOrderConvert.INSTANCE.convertList02( tradeOrderQueryService.getExpressTrackList(id, getLoginUserId()))); } @GetMapping("/page") @Operation(summary = "获得交易订单分页") public CommonResult> getOrderPage(AppTradeOrderPageReqVO reqVO) { // 查询订单 PageResult pageResult = tradeOrderQueryService.getOrderPage(getLoginUserId(), reqVO); // 查询订单项 List orderItems = tradeOrderQueryService.getOrderItemListByOrderId( convertSet(pageResult.getList(), TradeOrderDO::getId)); // 最终组合 return success(TradeOrderConvert.INSTANCE.convertPage02(pageResult, orderItems)); } @GetMapping("/get-count") @Operation(summary = "获得交易订单数量") public CommonResult> getOrderCount() { Map orderCount = Maps.newLinkedHashMapWithExpectedSize(5); // 全部 orderCount.put("allCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), null, null)); // 待付款(未支付) orderCount.put("unpaidCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), TradeOrderStatusEnum.UNPAID.getStatus(), null)); // 待发货 orderCount.put("undeliveredCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), TradeOrderStatusEnum.UNDELIVERED.getStatus(), null)); // 待收货 orderCount.put("deliveredCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), TradeOrderStatusEnum.DELIVERED.getStatus(), null)); // 待评价 orderCount.put("uncommentedCount", tradeOrderQueryService.getOrderCount(getLoginUserId(), TradeOrderStatusEnum.COMPLETED.getStatus(), false)); // 售后数量 orderCount.put("afterSaleCount", afterSaleService.getApplyingAfterSaleCount(getLoginUserId())); return success(orderCount); } @PutMapping("/receive") @Operation(summary = "确认交易订单收货") @Parameter(name = "id", description = "交易订单编号") public CommonResult receiveOrder(@RequestParam("id") Long id) { tradeOrderUpdateService.receiveOrderByMember(getLoginUserId(), id); return success(true); } @DeleteMapping("/cancel") @Operation(summary = "取消交易订单") @Parameter(name = "id", description = "交易订单编号") public CommonResult cancelOrder(@RequestParam("id") Long id) { tradeOrderUpdateService.cancelOrderByMember(getLoginUserId(), id); return success(true); } @DeleteMapping("/delete") @Operation(summary = "删除交易订单") @Parameter(name = "id", description = "交易订单编号") public CommonResult deleteOrder(@RequestParam("id") Long id) { tradeOrderUpdateService.deleteOrder(getLoginUserId(), id); return success(true); } // ========== 订单项 ========== @GetMapping("/item/get") @Operation(summary = "获得交易订单项") @Parameter(name = "id", description = "交易订单项编号") public CommonResult getOrderItem(@RequestParam("id") Long id) { TradeOrderItemDO item = tradeOrderQueryService.getOrderItem(getLoginUserId(), id); return success(TradeOrderConvert.INSTANCE.convert03(item)); } @PostMapping("/item/create-comment") @Operation(summary = "创建交易订单项的评价") public CommonResult createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) { return success(tradeOrderUpdateService.createOrderItemCommentByMember(getLoginUserId(), createReqVO)); } }