package cn.iocoder.yudao.module.product.service.history; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.product.controller.admin.history.vo.ProductBrowseHistoryPageReqVO; import cn.iocoder.yudao.module.product.dal.dataobject.history.ProductBrowseHistoryDO; import cn.iocoder.yudao.module.product.dal.mysql.history.ProductBrowseHistoryMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.Collection; /** * 商品浏览记录 Service 实现类 * * @author owen */ @Service @Validated public class ProductBrowseHistoryServiceImpl implements ProductBrowseHistoryService { private static final int USER_STORE_MAXIMUM = 100; @Resource private ProductBrowseHistoryMapper browseHistoryMapper; @Override public void createBrowseHistory(Long userId, Long spuId) { // 用户未登录时不记录 if (userId == null) { return; } // 情况一:同一个商品,只保留最新的一条记录 ProductBrowseHistoryDO history = browseHistoryMapper.selectByUserIdAndSpuId(userId, spuId); if (history != null) { browseHistoryMapper.deleteById(history); } else { // 情况二:限制每个用户的浏览记录的条数(只查一条最早地记录、记录总数) // TODO @疯狂:这里最好先查询一次数量。如果发现超过了,再删除;主要考虑,可能有部分不超过,提前就多了一次 sql 查询了 Page pageResult = browseHistoryMapper.selectPageByUserIdOrderByCreateTimeAsc(userId, 1, 1); if (pageResult.getTotal() >= USER_STORE_MAXIMUM) { browseHistoryMapper.deleteById(CollUtil.getFirst(pageResult.getRecords())); } } // 插入 ProductBrowseHistoryDO browseHistory = new ProductBrowseHistoryDO() .setUserId(userId) .setSpuId(spuId); browseHistoryMapper.insert(browseHistory); } @Override public void hideUserBrowseHistory(Long userId, Collection spuIds) { browseHistoryMapper.updateUserDeletedByUserId(userId, spuIds, true); } @Override public PageResult getBrowseHistoryPage(ProductBrowseHistoryPageReqVO pageReqVO) { return browseHistoryMapper.selectPage(pageReqVO); } }