Update MyOrderController.java

cyj
pbvfus8to 2 months ago
parent 05438d025a
commit 63a37bde2c

@ -8,6 +8,7 @@
*
*/
// 该类所属的包名表明其位于商城API的控制器包下主要用于处理与“我的订单”相关的接口请求及业务逻辑。
package com.yami.shop.api.controller;
import cn.hutool.core.bean.BeanUtil;
@ -36,58 +37,85 @@ import java.util.List;
import java.util.Objects;
/**
* MyOrderControllerSpring RESTful
*
*
* @author lanhai
*/
@RestController
// 定义该控制器类的基础请求路径,所有该类中的接口请求路径都将以此为前缀,表明是与“我的订单”相关的操作接口。
@RequestMapping("/p/myOrder")
// 使用Swagger的@Tag注解对该控制器类进行标记用于在API文档中生成对应的分类标签方便接口文档的分类展示和阅读这里表示该类下的接口都属于“我的订单接口”这一分类。
@Tag(name = "我的订单接口")
// 使用lombok的@AllArgsConstructor注解自动生成包含所有final字段的构造函数方便依赖注入这里会为所有注入的服务类生成对应的构造函数参数。
@AllArgsConstructor
public class MyOrderController {
// 通过构造函数注入OrderService实例用于调用与订单相关的业务逻辑方法比如获取订单、取消订单、确认收货等操作。
private final OrderService orderService;
// 通过构造函数注入UserAddrOrderService实例用于处理用户地址与订单相关的业务逻辑可能涉及获取订单对应的用户地址等操作。
private final UserAddrOrderService userAddrOrderService;
// 通过构造函数注入ProductService实例用于操作产品相关的业务逻辑例如可能在某些操作后需要清除产品缓存等情况会用到该服务。
private final ProductService productService;
// 通过构造函数注入SkuService实例用于处理商品库存单元SKU相关的业务逻辑比如根据SKU ID进行缓存清除等操作。
private final SkuService skuService;
// 通过构造函数注入MyOrderService实例用于获取与“我的订单”相关的分页数据等业务逻辑例如根据用户ID和订单状态查询订单列表等操作。
private final MyOrderService myOrderService;
// 通过构造函数注入ShopDetailService实例用于获取店铺详情信息比如在获取订单详情时需要展示店铺名称等信息时会调用该服务获取相应数据。
private final ShopDetailService shopDetailService;
// 通过构造函数注入OrderItemService实例用于获取订单商品项相关的业务逻辑例如根据订单号获取订单中包含的具体商品项信息等操作。
private final OrderItemService orderItemService;
/**
*
*
* orderNumber
* ServerResponseEntity
*
* @param orderNumber
* @return ServerResponseEntityOrderShopDto
*/
@GetMapping("/orderDetail")
// 使用Swagger的@Operation注解对该接口方法进行描述用于在API文档中生成对应的接口说明信息这里简要说明了该接口的功能是获取订单详情信息。
@Operation(summary = "订单详情信息", description = "根据订单号获取订单详情信息")
// 使用Swagger的@Parameter注解对接口方法的参数进行描述这里指定了orderNumber参数的名称、描述以及其为必填项等信息方便在API文档中展示参数详情。
@Parameter(name = "orderNumber", description = "订单号", required = true)
public ServerResponseEntity<OrderShopDto> orderDetail(@RequestParam(value = "orderNumber") String orderNumber) {
// 通过SecurityUtils获取当前登录用户的ID用于后续验证用户是否有权限获取该订单信息等操作。
String userId = SecurityUtils.getUser().getUserId();
OrderShopDto orderShopDto = new OrderShopDto();
// 调用OrderService的getOrderByOrderNumber方法根据订单号获取对应的订单对象如果订单不存在则抛出异常。
Order order = orderService.getOrderByOrderNumber(orderNumber);
if (order == null) {
throw new RuntimeException("该订单不存在");
}
// 验证当前登录用户是否有权限获取该订单信息通过比较订单中的用户ID和当前登录用户的ID是否一致来判断如果不一致则抛出异常。
if (!Objects.equals(order.getUserId(), userId)) {
throw new RuntimeException("你没有权限获取该订单信息");
}
// 调用ShopDetailService的getShopDetailByShopId方法根据订单所属店铺的ID获取店铺详情信息用于填充订单详情中的店铺相关信息。
ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(order.getShopId());
// 调用UserAddrOrderService的getById方法根据订单关联的地址订单ID获取对应的用户地址订单对象用于获取用户地址信息。
UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId());
// 使用BeanUtil将UserAddrOrder对象的属性复制到UserAddrDto对象中进行数据类型转换方便后续统一处理和返回数据。
UserAddrDto userAddrDto = BeanUtil.copyProperties(userAddrOrder, UserAddrDto.class);
// 调用OrderItemService的getOrderItemsByOrderNumber方法根据订单号获取该订单下包含的所有商品项信息列表。
List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber);
// 使用BeanUtil将List<OrderItem>中的每个OrderItem对象的属性复制到OrderItemDto对象中组成新的列表用于后续统一处理和返回数据。
List<OrderItemDto> orderItemList = BeanUtil.copyToList(orderItems, OrderItemDto.class);
// 将获取到的店铺相关信息设置到OrderShopDto对象中如店铺ID、店铺名称等。
orderShopDto.setShopId(shopDetail.getShopId());
orderShopDto.setShopName(shopDetail.getShopName());
// 设置订单的实际总价、用户地址信息、订单商品项信息、运费、优惠金额、创建时间、备注以及订单状态等信息到OrderShopDto对象中。
orderShopDto.setActualTotal(order.getActualTotal());
orderShopDto.setUserAddrDto(userAddrDto);
orderShopDto.setOrderItemDtos(orderItemList);
@ -97,21 +125,28 @@ public class MyOrderController {
orderShopDto.setRemarks(order.getRemarks());
orderShopDto.setStatus(order.getStatus());
// 计算订单中商品的总金额和商品总数量,通过遍历订单商品项列表,累加每个商品项的商品总金额和商品数量来实现。
double total = 0.0;
Integer totalNum = 0;
for (OrderItemDto orderItem : orderShopDto.getOrderItemDtos()) {
total = Arith.add(total, orderItem.getProductTotalAmount());
totalNum += orderItem.getProdCount();
}
// 将计算得到的商品总金额和商品总数量设置到OrderShopDto对象中。
orderShopDto.setTotal(total);
orderShopDto.setTotalNum(totalNum);
return ServerResponseEntity.success(orderShopDto);
}
/**
*
*
* statuspage
* 0ServerResponseEntity
*
* @param status 12
* @param page
* @return ServerResponseEntityIPage<MyOrderDto>
*/
@GetMapping("/myOrder")
@Operation(summary = "订单列表信息", description = "根据订单状态获取订单列表信息状态为0时获取所有订单")
@ -119,19 +154,29 @@ public class MyOrderController {
@Parameter(name = "status", description = "订单状态 1:待付款 2:待发货 3:待收货 4:待评价 5:成功 6:失败")
})
public ServerResponseEntity<IPage<MyOrderDto>> myOrder(@RequestParam(value = "status") Integer status, PageParam<MyOrderDto> page) {
// 通过SecurityUtils获取当前登录用户的ID用于查询该用户对应的订单列表信息。
String userId = SecurityUtils.getUser().getUserId();
// 调用MyOrderService的pageMyOrderByUserIdAndStatus方法根据用户ID和订单状态进行分页查询订单列表信息获取到IPage<MyOrderDto>类型的分页数据对象。
IPage<MyOrderDto> myOrderDtoIpage = myOrderService.pageMyOrderByUserIdAndStatus(page, userId, status);
return ServerResponseEntity.success(myOrderDtoIpage);
}
/**
*
*
* orderNumber
* OrderServicecancelOrders
* SKUServerResponseEntity
*
* @param orderNumber
* @return ServerResponseEntityString
*/
@PutMapping("/cancel/{orderNumber}")
@Operation(summary = "根据订单号取消订单", description = "根据订单号取消订单")
@Parameter(name = "orderNumber", description = "订单号", required = true)
public ServerResponseEntity<String> cancel(@PathVariable("orderNumber") String orderNumber) {
// 通过SecurityUtils获取当前登录用户的ID用于验证用户是否有权限操作该订单。
String userId = SecurityUtils.getUser().getUserId();
// 调用OrderService的getOrderByOrderNumber方法根据订单号获取对应的订单对象。
Order order = orderService.getOrderByOrderNumber(orderNumber);
if (!Objects.equals(order.getUserId(), userId)) {
throw new YamiShopBindException("你没有权限获取该订单信息");
@ -139,12 +184,14 @@ public class MyOrderController {
if (!Objects.equals(order.getStatus(), OrderStatus.UNPAY.value())) {
throw new YamiShopBindException("订单已支付,无法取消订单");
}
// 调用OrderItemService的getOrderItemsByOrderNumber方法根据订单号获取该订单下包含的所有商品项信息列表。
List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber);
order.setOrderItems(orderItems);
// 取消订单
// 调用OrderService的cancelOrders方法传入包含该订单的列表这里使用Collections.singletonList将单个订单包装成列表取消订单操作。
orderService.cancelOrders(Collections.singletonList(order));
// 清除缓存
// 循环遍历订单商品项信息列表针对每个商品项调用ProductService的removeProductCacheByProdId方法清除对应产品的缓存
// 以及调用SkuService的removeSkuCacheBySkuId方法清除对应SKU的缓存以保证数据的一致性和缓存的有效性。
for (OrderItem orderItem : orderItems) {
productService.removeProductCacheByProdId(orderItem.getProdId());
skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
@ -152,14 +199,21 @@ public class MyOrderController {
return ServerResponseEntity.success();
}
/**
*
*
* orderNumber
* OrderServiceconfirmOrder
* SKUServerResponseEntity
*
* @param orderNumber
* @return ServerResponseEntityString
*/
@PutMapping("/receipt/{orderNumber}")
@Operation(summary = "根据订单号确认收货", description = "根据订单号确认收货")
public ServerResponseEntity<String> receipt(@PathVariable("orderNumber") String orderNumber) {
// 通过SecurityUtils获取当前登录用户的ID用于验证用户是否有权限操作该订单。
String userId = SecurityUtils.getUser().getUserId();
// 调用OrderService的getOrderByOrderNumber方法根据订单号获取对应的订单对象。
Order order = orderService.getOrderByOrderNumber(orderNumber);
if (!Objects.equals(order.getUserId(), userId)) {
throw new YamiShopBindException("你没有权限获取该订单信息");
@ -167,9 +221,10 @@ public class MyOrderController {
if (!Objects.equals(order.getStatus(), OrderStatus.CONSIGNMENT.value())) {
throw new YamiShopBindException("订单未发货,无法确认收货");
}
// 调用OrderItemService的getOrderItemsByOrderNumber方法根据订单号获取该订单下包含的所有商品项信息列表。
List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(orderNumber);
order.setOrderItems(orderItems);
// 确认收货
// 调用OrderService的confirmOrder方法传入包含该订单的列表这里使用Collections.singletonList将单个订单包装成列表进行确认收货操作。
orderService.confirmOrder(Collections.singletonList(order));
for (OrderItem orderItem : orderItems) {
@ -180,41 +235,10 @@ public class MyOrderController {
}
/**
*
*/
@DeleteMapping("/{orderNumber}")
@Operation(summary = "根据订单号删除订单", description = "根据订单号删除订单")
@Parameter(name = "orderNumber", description = "订单号", required = true)
public ServerResponseEntity<String> delete(@PathVariable("orderNumber") String orderNumber) {
String userId = SecurityUtils.getUser().getUserId();
Order order = orderService.getOrderByOrderNumber(orderNumber);
if (order == null) {
throw new YamiShopBindException("该订单不存在");
}
if (!Objects.equals(order.getUserId(), userId)) {
throw new YamiShopBindException("你没有权限获取该订单信息");
}
if (!Objects.equals(order.getStatus(), OrderStatus.SUCCESS.value()) && !Objects.equals(order.getStatus(), OrderStatus.CLOSE.value())) {
throw new YamiShopBindException("订单未完成或未关闭,无法删除订单");
}
// 删除订单
orderService.deleteOrders(Collections.singletonList(order));
return ServerResponseEntity.success("删除成功");
}
/**
*
*/
@GetMapping("/orderCount")
@Operation(summary = "获取我的订单订单数量", description = "获取我的订单订单数量")
public ServerResponseEntity<OrderCountData> getOrderCount() {
String userId = SecurityUtils.getUser().getUserId();
OrderCountData orderCountMap = orderService.getOrderCount(userId);
return ServerResponseEntity.success(orderCountMap);
}
}
*
* orderNumber
* OrderServicedeleteOrdersServerResponseEntity
*
*
* @param orderNumber
* @return ServerResponseEntity
Loading…
Cancel
Save