diff --git a/src/main/java/com/aida/seller/module/listing/controller/ListingMallController.java b/src/main/java/com/aida/seller/module/listing/controller/ListingMallController.java index d2ea091..496b004 100644 --- a/src/main/java/com/aida/seller/module/listing/controller/ListingMallController.java +++ b/src/main/java/com/aida/seller/module/listing/controller/ListingMallController.java @@ -13,6 +13,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 商城首页商品 Controller(Feign 端) */ @@ -39,4 +41,12 @@ public class ListingMallController { ListingDetailVO detail = listingMallService.getListingDetail(id); return Response.success(detail); } + + @Operation(summary = "批量获取商品简要信息(购物车用)", description = "返回指定商品ID列表的基本信息") + @PostMapping("/mall/batch") + public Response> getListingSummaries( + @RequestBody List listingIds) { + List result = listingMallService.getListingSummaries(listingIds); + return Response.success(result); + } } diff --git a/src/main/java/com/aida/seller/module/listing/service/ListingMallService.java b/src/main/java/com/aida/seller/module/listing/service/ListingMallService.java index 104bff0..b15411b 100644 --- a/src/main/java/com/aida/seller/module/listing/service/ListingMallService.java +++ b/src/main/java/com/aida/seller/module/listing/service/ListingMallService.java @@ -5,6 +5,8 @@ import com.aida.seller.module.listing.vo.ListingDetailVO; import com.aida.seller.module.listing.vo.ListingMallVO; import com.baomidou.mybatisplus.core.metadata.IPage; +import java.util.List; + /** * 商城首页商品 Service 接口 */ @@ -25,4 +27,12 @@ public interface ListingMallService { * @return 商品详情 */ ListingDetailVO getListingDetail(Long id); + + /** + * 批量获取商品简要信息(购物车用) + * + * @param listingIds 商品ID列表 + * @return 商品简要信息列表 + */ + List getListingSummaries(List listingIds); } diff --git a/src/main/java/com/aida/seller/module/listing/service/impl/ListingMallServiceImpl.java b/src/main/java/com/aida/seller/module/listing/service/impl/ListingMallServiceImpl.java index 4ecc902..09a1251 100644 --- a/src/main/java/com/aida/seller/module/listing/service/impl/ListingMallServiceImpl.java +++ b/src/main/java/com/aida/seller/module/listing/service/impl/ListingMallServiceImpl.java @@ -26,6 +26,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import com.aida.seller.module.listing.vo.ListingMallVO; + /** * 商城首页商品 Service 实现 */ @@ -164,4 +166,31 @@ public class ListingMallServiceImpl extends ServiceImpl getListingSummaries(List listingIds) { + if (listingIds == null || listingIds.isEmpty()) { + return List.of(); + } + List entities = this.list( + new LambdaQueryWrapper() + .in(ListingEntity::getId, listingIds) + .eq(ListingEntity::getDeleted, 0)); + Map entityMap = entities.stream() + .collect(Collectors.toMap(ListingEntity::getId, e -> e)); + List listingMallVOS = listingIds.stream() + .filter(entityMap::containsKey) + .map(id -> { + ListingEntity entity = entityMap.get(id); + ListingMallVO vo = new ListingMallVO(); + vo.setId(entity.getId()); + vo.setCover(minioUtil.processMinioResource(entity.getCover(), CommonConstants.MINIO_PATH_TIMEOUT)); + vo.setTitle(entity.getTitle()); + vo.setPrice(entity.getPrice()); + vo.setStatus(entity.getStatus()); + return vo; + }) + .toList(); + return listingMallVOS; + } } diff --git a/src/main/java/com/aida/seller/module/listing/vo/ListingMallVO.java b/src/main/java/com/aida/seller/module/listing/vo/ListingMallVO.java index 8e55153..0764336 100644 --- a/src/main/java/com/aida/seller/module/listing/vo/ListingMallVO.java +++ b/src/main/java/com/aida/seller/module/listing/vo/ListingMallVO.java @@ -22,4 +22,6 @@ public class ListingMallVO implements Serializable { private String title; private BigDecimal price; + + private Integer status; } diff --git a/src/main/java/com/aida/seller/module/order/service/OrderService.java b/src/main/java/com/aida/seller/module/order/service/OrderService.java index b5ca1b7..4977f4f 100644 --- a/src/main/java/com/aida/seller/module/order/service/OrderService.java +++ b/src/main/java/com/aida/seller/module/order/service/OrderService.java @@ -66,4 +66,13 @@ public interface OrderService { * @return 已购商品分页列表,按购买时间降序排列 */ IPage getAssetsPage(AssetsDTO dto); + + /** + * 批量查询指定商品是否已被买家购买 + * + * @param listingIds 商品ID列表 + * @param buyerId 买家ID + * @return 已购买的商品ID列表 + */ + List getPurchasedListingIds(List listingIds, Long buyerId); } diff --git a/src/main/java/com/aida/seller/module/order/service/OrderServiceImpl.java b/src/main/java/com/aida/seller/module/order/service/OrderServiceImpl.java index 5d52135..13bf065 100644 --- a/src/main/java/com/aida/seller/module/order/service/OrderServiceImpl.java +++ b/src/main/java/com/aida/seller/module/order/service/OrderServiceImpl.java @@ -209,12 +209,22 @@ public class OrderServiceImpl extends ServiceImpl purchasedListingIds = getPurchasedListingIds(dto.getListingIds(), dto.getBuyerId()); + List unpurchasedListingIds = dto.getListingIds().stream() + .filter(id -> !purchasedListingIds.contains(id)) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(unpurchasedListingIds)) { + throw new BusinessException("所有商品均已购买,无需重复下单"); + } + dto.setListingIds(unpurchasedListingIds); + List listings = listingMapper.selectBatchIds(dto.getListingIds()); if (CollectionUtils.isEmpty(listings)) { throw new BusinessException("未找到对应的商品"); } Map> listingsBySeller = listings.stream() + .filter(l -> l.getStatus() == 1) .collect(Collectors.groupingBy(ListingEntity::getSellerId)); List orderIds = new ArrayList<>(); @@ -279,6 +289,7 @@ public class OrderServiceImpl extends ServiceImpl getPurchasedListingIds(List listingIds, Long buyerId) { + if (CollectionUtils.isEmpty(listingIds) || buyerId == null) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrderItemEntity::getBuyerId, buyerId) + .in(OrderItemEntity::getListingId, listingIds); + return orderItemMapper.selectList(wrapper).stream() + .map(OrderItemEntity::getListingId) + .distinct() + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/aida/seller/module/order/vo/CreateOrderResultVO.java b/src/main/java/com/aida/seller/module/order/vo/CreateOrderResultVO.java index 980b4df..5642eac 100644 --- a/src/main/java/com/aida/seller/module/order/vo/CreateOrderResultVO.java +++ b/src/main/java/com/aida/seller/module/order/vo/CreateOrderResultVO.java @@ -18,4 +18,7 @@ public class CreateOrderResultVO implements Serializable { @Schema(description = "所有订单总金额(HK$)") private BigDecimal totalAmount; + + @Schema(description = "本次成功下单的未购买商品ID列表") + private List unpurchasedListingIds; } diff --git a/src/main/resources/db/schema.sql b/src/main/resources/db/schema.sql index e319182..51a967b 100644 --- a/src/main/resources/db/schema.sql +++ b/src/main/resources/db/schema.sql @@ -5,7 +5,6 @@ CREATE TABLE seller_listing ( title VARCHAR(255) NOT NULL COMMENT '商品标题', description TEXT COMMENT '商品描述', price DECIMAL(10,2) COMMENT '价格', - stock INT COMMENT '库存数量', cover VARCHAR(200) COMMENT '封面图URL', view_count INT DEFAULT 0 COMMENT '浏览量', status INT(1) DEFAULT 0 COMMENT '状态: 0-草稿, 1-已发布, 2-已删除',