package cn.iocoder.yudao.module.product.dal.mysql.sku; import cn.hutool.core.lang.Assert; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.handlers.Jackson3TypeHandler; import org.apache.ibatis.annotations.*; import java.util.Collection; import java.util.List; @Mapper public interface ProductSkuMapper extends BaseMapperX { /** * 查询商品 SKU(包含已删除) * 注意:使用 @Results 手动指定 typeHandler,否则 @Select 不会应用 autoResultMap,properties 字段无法解析 JSON */ @Select("SELECT * FROM product_sku WHERE id = #{id}") @Results({ @Result(column = "properties", property = "properties", typeHandler = Jackson3TypeHandler.class), }) ProductSkuDO selectByIdIncludeDeleted(@Param("id") Long id); default List selectListBySpuId(Long spuId) { return selectList(ProductSkuDO::getSpuId, spuId); } default List selectListBySpuId(Collection spuIds) { return selectList(ProductSkuDO::getSpuId, spuIds); } default void deleteBySpuId(Long spuId) { delete(new LambdaQueryWrapperX().eq(ProductSkuDO::getSpuId, spuId)); } /** * 更新 SKU 库存(增加)、销量(减少) * * @param id 编号 * @param incrCount 增加库存(正数) */ default void updateStockIncr(Long id, Integer incrCount) { Assert.isTrue(incrCount > 0); LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper() .setSql(" stock = stock + " + incrCount + ", sales_count = sales_count - " + incrCount) .eq(ProductSkuDO::getId, id); update(null, lambdaUpdateWrapper); } /** * 更新 SKU 库存(减少)、销量(增加) * * @param id 编号 * @param incrCount 减少库存(负数) * @return 更新条数 */ default int updateStockDecr(Long id, Integer incrCount) { Assert.isTrue(incrCount < 0); incrCount = - incrCount; // 取正 LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() .setSql(" stock = stock - " + incrCount + ", sales_count = sales_count + " + incrCount) .eq(ProductSkuDO::getId, id) .ge(ProductSkuDO::getStock, incrCount); return update(null, updateWrapper); } }