购物车相关代码

This commit is contained in:
litianxiang
2026-05-20 16:53:58 +08:00
parent 45885bf509
commit c825f6af70
8 changed files with 88 additions and 1 deletions

View File

@@ -13,6 +13,8 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
/** /**
* 商城首页商品 ControllerFeign 端) * 商城首页商品 ControllerFeign 端)
*/ */
@@ -39,4 +41,12 @@ public class ListingMallController {
ListingDetailVO detail = listingMallService.getListingDetail(id); ListingDetailVO detail = listingMallService.getListingDetail(id);
return Response.success(detail); return Response.success(detail);
} }
@Operation(summary = "批量获取商品简要信息(购物车用)", description = "返回指定商品ID列表的基本信息")
@PostMapping("/mall/batch")
public Response<List<ListingMallVO>> getListingSummaries(
@RequestBody List<Long> listingIds) {
List<ListingMallVO> result = listingMallService.getListingSummaries(listingIds);
return Response.success(result);
}
} }

View File

@@ -5,6 +5,8 @@ import com.aida.seller.module.listing.vo.ListingDetailVO;
import com.aida.seller.module.listing.vo.ListingMallVO; import com.aida.seller.module.listing.vo.ListingMallVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/** /**
* 商城首页商品 Service 接口 * 商城首页商品 Service 接口
*/ */
@@ -25,4 +27,12 @@ public interface ListingMallService {
* @return 商品详情 * @return 商品详情
*/ */
ListingDetailVO getListingDetail(Long id); ListingDetailVO getListingDetail(Long id);
/**
* 批量获取商品简要信息(购物车用)
*
* @param listingIds 商品ID列表
* @return 商品简要信息列表
*/
List<ListingMallVO> getListingSummaries(List<Long> listingIds);
} }

View File

@@ -26,6 +26,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.aida.seller.module.listing.vo.ListingMallVO;
/** /**
* 商城首页商品 Service 实现 * 商城首页商品 Service 实现
*/ */
@@ -164,4 +166,31 @@ public class ListingMallServiceImpl extends ServiceImpl<ListingMallMapper, Listi
vo.setImages(imageMap); vo.setImages(imageMap);
return vo; return vo;
} }
@Override
public List<ListingMallVO> getListingSummaries(List<Long> listingIds) {
if (listingIds == null || listingIds.isEmpty()) {
return List.of();
}
List<ListingEntity> entities = this.list(
new LambdaQueryWrapper<ListingEntity>()
.in(ListingEntity::getId, listingIds)
.eq(ListingEntity::getDeleted, 0));
Map<Long, ListingEntity> entityMap = entities.stream()
.collect(Collectors.toMap(ListingEntity::getId, e -> e));
List<ListingMallVO> 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;
}
} }

View File

@@ -22,4 +22,6 @@ public class ListingMallVO implements Serializable {
private String title; private String title;
private BigDecimal price; private BigDecimal price;
private Integer status;
} }

View File

@@ -66,4 +66,13 @@ public interface OrderService {
* @return 已购商品分页列表,按购买时间降序排列 * @return 已购商品分页列表,按购买时间降序排列
*/ */
IPage<AssetsItemVO> getAssetsPage(AssetsDTO dto); IPage<AssetsItemVO> getAssetsPage(AssetsDTO dto);
/**
* 批量查询指定商品是否已被买家购买
*
* @param listingIds 商品ID列表
* @param buyerId 买家ID
* @return 已购买的商品ID列表
*/
List<Long> getPurchasedListingIds(List<Long> listingIds, Long buyerId);
} }

View File

@@ -209,12 +209,22 @@ public class OrderServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
throw new BusinessException("买家账号不能为空"); throw new BusinessException("买家账号不能为空");
} }
List<Long> purchasedListingIds = getPurchasedListingIds(dto.getListingIds(), dto.getBuyerId());
List<Long> unpurchasedListingIds = dto.getListingIds().stream()
.filter(id -> !purchasedListingIds.contains(id))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(unpurchasedListingIds)) {
throw new BusinessException("所有商品均已购买,无需重复下单");
}
dto.setListingIds(unpurchasedListingIds);
List<ListingEntity> listings = listingMapper.selectBatchIds(dto.getListingIds()); List<ListingEntity> listings = listingMapper.selectBatchIds(dto.getListingIds());
if (CollectionUtils.isEmpty(listings)) { if (CollectionUtils.isEmpty(listings)) {
throw new BusinessException("未找到对应的商品"); throw new BusinessException("未找到对应的商品");
} }
Map<Long, List<ListingEntity>> listingsBySeller = listings.stream() Map<Long, List<ListingEntity>> listingsBySeller = listings.stream()
.filter(l -> l.getStatus() == 1)
.collect(Collectors.groupingBy(ListingEntity::getSellerId)); .collect(Collectors.groupingBy(ListingEntity::getSellerId));
List<Long> orderIds = new ArrayList<>(); List<Long> orderIds = new ArrayList<>();
@@ -279,6 +289,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
BigDecimal grandTotal = totalPrices.stream() BigDecimal grandTotal = totalPrices.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
result.setTotalAmount(grandTotal); result.setTotalAmount(grandTotal);
result.setUnpurchasedListingIds(dto.getListingIds());
return result; return result;
} }
@@ -321,4 +332,18 @@ public class OrderServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfoEnti
resultPage.setRecords(records); resultPage.setRecords(records);
return resultPage; return resultPage;
} }
@Override
public List<Long> getPurchasedListingIds(List<Long> listingIds, Long buyerId) {
if (CollectionUtils.isEmpty(listingIds) || buyerId == null) {
return Collections.emptyList();
}
LambdaQueryWrapper<OrderItemEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderItemEntity::getBuyerId, buyerId)
.in(OrderItemEntity::getListingId, listingIds);
return orderItemMapper.selectList(wrapper).stream()
.map(OrderItemEntity::getListingId)
.distinct()
.collect(Collectors.toList());
}
} }

View File

@@ -18,4 +18,7 @@ public class CreateOrderResultVO implements Serializable {
@Schema(description = "所有订单总金额HK$") @Schema(description = "所有订单总金额HK$")
private BigDecimal totalAmount; private BigDecimal totalAmount;
@Schema(description = "本次成功下单的未购买商品ID列表")
private List<Long> unpurchasedListingIds;
} }

View File

@@ -5,7 +5,6 @@ CREATE TABLE seller_listing (
title VARCHAR(255) NOT NULL COMMENT '商品标题', title VARCHAR(255) NOT NULL COMMENT '商品标题',
description TEXT COMMENT '商品描述', description TEXT COMMENT '商品描述',
price DECIMAL(10,2) COMMENT '价格', price DECIMAL(10,2) COMMENT '价格',
stock INT COMMENT '库存数量',
cover VARCHAR(200) COMMENT '封面图URL', cover VARCHAR(200) COMMENT '封面图URL',
view_count INT DEFAULT 0 COMMENT '浏览量', view_count INT DEFAULT 0 COMMENT '浏览量',
status INT(1) DEFAULT 0 COMMENT '状态: 0-草稿, 1-已发布, 2-已删除', status INT(1) DEFAULT 0 COMMENT '状态: 0-草稿, 1-已发布, 2-已删除',