diff --git a/agileboot-api/src/main/java/com/agileboot/api/controller/ApprovalApiController.java b/agileboot-api/src/main/java/com/agileboot/api/controller/ApprovalApiController.java index bceb258..87ec696 100644 --- a/agileboot-api/src/main/java/com/agileboot/api/controller/ApprovalApiController.java +++ b/agileboot-api/src/main/java/com/agileboot/api/controller/ApprovalApiController.java @@ -1,15 +1,86 @@ package com.agileboot.api.controller; +import com.agileboot.common.core.dto.ResponseDTO; +import com.agileboot.common.exception.ApiException; +import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.domain.shop.approval.ReturnApprovalApplicationService; +import com.agileboot.domain.shop.approval.command.AddReturnApprovalCommand; +import com.agileboot.domain.shop.order.OrderApplicationService; +import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.validation.Valid; + +/** + * 审批请求控制器 + *

+ * 处理与审批相关的HTTP请求,包括退货审批的提交等操作 + *

+ */ @RestController @RequestMapping("/api/approval") @CrossOrigin(origins = "*", allowedHeaders = "*") @RequiredArgsConstructor +@Slf4j +@Api(tags = "审批接口") public class ApprovalApiController { + + /** 退货审批应用服务,用于处理审批相关业务逻辑 */ private final ReturnApprovalApplicationService approvalApplicationService; + + /** 订单应用服务,用于处理订单相关查询操作 */ + private final OrderApplicationService orderApplicationService; + + /** + * 提交退货审批申请 + * + * @param command 包含审批信息的命令对象,需要包含订单ID、商品ID、退货数量及图片 + * @return 包含操作结果的响应对象 + * @throws ApiException 当参数校验失败或业务逻辑出错时抛出 + */ + @PostMapping("/submit") + @ApiOperation(value = "提交退货审批") + public ResponseDTO submitApproval(@Valid @RequestBody AddReturnApprovalCommand command) { + try { + if (null == command.getOrderId()) { + return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "订单ID不能为空")); + } + if (null == command.getGoodsId()) { + return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "商品ID不能为空")); + } + if (null == command.getReturnQuantity()) { + return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "归还数量不能为空")); + } + if (StringUtils.isBlank(command.getReturnImages())) { + return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "归还图片不能为空")); + } + + // 查询订单商品信息 + ShopOrderGoodsEntity orderGoods = orderApplicationService.getOrderGoodsByOrderIdAndGoodsId(command.getOrderId(), command.getGoodsId()); + if (null == orderGoods) { + return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "订单商品不存在")); + } + + // 设置商品价格并初始化审批状态 + command.setGoodsPrice(orderGoods.getPrice()); + command.setStatus(1); + + // 执行业务逻辑 + approvalApplicationService.addApproval(command); + return ResponseDTO.ok("审批提交成功"); + } catch (Exception e) { + log.error("提交审批失败", e); + return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "提交审批失败")); + } + } } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java index 386f258..551c7cf 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/OrderApplicationService.java @@ -37,6 +37,8 @@ import java.util.Objects; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; + +import org.checkerframework.checker.units.qual.s; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -301,4 +303,8 @@ public class OrderApplicationService { return new GetOrdersByOpenIdDTO(orderList, orderGoods, goods); } + + public ShopOrderGoodsEntity getOrderGoodsByOrderIdAndGoodsId(Long orderId, Long goodsId) { + return orderGoodsService.getByOrderIdAndGoodsId(orderId, goodsId); + } } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java index 2f4854b..a807897 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsMapper.java @@ -1,5 +1,8 @@ package com.agileboot.domain.shop.order.db; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** @@ -12,4 +15,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface ShopOrderGoodsMapper extends BaseMapper { + @Select("SELECT * FROM shop_order_goods WHERE order_id = #{orderId} AND goods_id = #{goodsId} LIMIT 1") + ShopOrderGoodsEntity selectByOrderIdAndGoodsId(@Param("orderId") Long orderId, @Param("goodsId") Long goodsId); + } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java index b7a935f..cf6b3f7 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsService.java @@ -11,5 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2025-03-10 */ public interface ShopOrderGoodsService extends IService { - + ShopOrderGoodsEntity getByOrderIdAndGoodsId(Long orderId, Long goodsId); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java index 59d0582..8279a31 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/order/db/ShopOrderGoodsServiceImpl.java @@ -14,4 +14,9 @@ import org.springframework.stereotype.Service; @Service public class ShopOrderGoodsServiceImpl extends ServiceImpl implements ShopOrderGoodsService { + @Override + public ShopOrderGoodsEntity getByOrderIdAndGoodsId(Long orderId, Long goodsId) { + return baseMapper.selectByOrderIdAndGoodsId(orderId, goodsId); + } + }