ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/GoodsStockUpdDTO.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.system.api.domain.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import lombok.Data; /** * @author mitao * @date 2024/5/30 */ @Data @ApiModel(value = "商品库存修改数据传输对象", description = "商品库存修改数据传输对象") public class GoodsStockUpdDTO implements Serializable { private static final long serialVersionUID = 4679049589585565620L; @ApiModelProperty(value = "商品skuId") private Long goodsSkuId; @ApiModelProperty(value = "库存") private Integer auctionStock; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/GoodsSkuFactory.java
@@ -1,7 +1,13 @@ package com.ruoyi.system.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.*; import com.ruoyi.system.api.domain.GoodsBrand; import com.ruoyi.system.api.domain.GoodsCategory; import com.ruoyi.system.api.domain.GoodsFlavorType; import com.ruoyi.system.api.domain.GoodsSeckill; import com.ruoyi.system.api.domain.GoodsSeries; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import java.util.List; import org.slf4j.Logger; @@ -79,15 +85,9 @@ } @Override public R<?> deductStock(Long goodsSkuId, Integer auctionStock, String source) { return R.fail("扣减商品库存失败:" + cause.getMessage()); public R<?> updGoodsStock(List<GoodsStockUpdDTO> goodsStockUpdDTOS, String source) { return R.fail("更新商品库存失败:" + cause.getMessage()); } @Override public R<?> returningStock(Long goodsSkuId, Integer auctionStock, String source) { return R.fail("回退商品库存失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/GoodsSkuClient.java
@@ -3,7 +3,13 @@ import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.*; import com.ruoyi.system.api.domain.GoodsBrand; import com.ruoyi.system.api.domain.GoodsCategory; import com.ruoyi.system.api.domain.GoodsFlavorType; import com.ruoyi.system.api.domain.GoodsSeckill; import com.ruoyi.system.api.domain.GoodsSeries; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.factory.GoodsSkuFactory; import java.util.List; import org.springframework.cloud.openfeign.FeignClient; @@ -13,7 +19,6 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestParam; ; @@ -66,13 +71,13 @@ R<List<GoodsSku>> getGoodsByName(@PathVariable("goodsSkuName") String goodsSkuName, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @PutMapping("/goods-sku/deduct-stock") R<?> deductStock(@RequestParam("goodsSkuId") Long goodsSkuId, @RequestParam("auctionStock") Integer auctionStock, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @PutMapping("/goods-sku/returning-stock") R<?> returningStock(@RequestParam("goodsSkuId") Long goodsSkuId, @RequestParam("auctionStock") Integer auctionStock, /** * 批量更新商品库存 auctionStock 负数则为减库存,正数为加库存 * * @param goodsStockUpdDTOS 商品库存修改数据传输对象 * @param source 请求来源 */ @PutMapping("/goods-sku/upd-stock") R<?> updGoodsStock(@RequestBody List<GoodsStockUpdDTO> goodsStockUpdDTOS, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/AuctionBrowseRecordController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.auction.controller.forepart; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 会员商品浏览记录表 前端控制器 * </p> * * @author mitao * @since 2024-05-30 */ @RestController @RequestMapping("/auction-browse-record") public class AuctionBrowseRecordController { } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java
@@ -66,6 +66,11 @@ } } /** * 添加/编辑 拍卖场 * * @param dto 拍卖场数据传输对象 */ @PostMapping("/save") @ApiOperation(value = "添加/编辑 拍卖场", notes = "添加/编辑 拍卖场") public R<?> saveAuctionSalesroom( @@ -73,4 +78,5 @@ auctionSalesroomService.saveAuctionSalesroom(dto); return R.ok(); } } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBrowseRecord.java
New file @@ -0,0 +1,68 @@ package com.ruoyi.auction.domain; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.enums.AuctionOrderTypeEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 会员商品浏览记录表 * </p> * * @author mitao * @since 2024-05-30 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_auction_browse_record") @ApiModel(value = "AuctionBrowseRecord对象", description = "会员商品浏览记录表") public class AuctionBrowseRecord implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "会员商品浏览记录id") @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; @ApiModelProperty(value = "浏览类型 1=普通拍品 2=拍卖会") private AuctionOrderTypeEnum browseType; @ApiModelProperty(value = "浏览目标id") private Long targetId; @ApiModelProperty(value = "会员id") private Long memberId; @ApiModelProperty(value = "创建者") @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; @ApiModelProperty(value = "创建时间") @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "更新者") @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) private String updateBy; @ApiModelProperty(value = "更新时间") @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") @TableLogic private Integer delFlag; } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/mapper/AuctionBrowseRecordMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.auction.mapper; import com.ruoyi.auction.domain.AuctionBrowseRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 会员商品浏览记录表 Mapper 接口 * </p> * * @author mitao * @since 2024-05-30 */ public interface AuctionBrowseRecordMapper extends BaseMapper<AuctionBrowseRecord> { } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionBrowseRecordService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.auction.service; import com.ruoyi.auction.domain.AuctionBrowseRecord; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 会员商品浏览记录表 服务类 * </p> * * @author mitao * @since 2024-05-30 */ public interface IAuctionBrowseRecordService extends IService<AuctionBrowseRecord> { } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionBrowseRecordServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.auction.service.impl; import com.ruoyi.auction.domain.AuctionBrowseRecord; import com.ruoyi.auction.mapper.AuctionBrowseRecordMapper; import com.ruoyi.auction.service.IAuctionBrowseRecordService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 会员商品浏览记录表 服务实现类 * </p> * * @author mitao * @since 2024-05-30 */ @Service public class AuctionBrowseRecordServiceImpl extends ServiceImpl<AuctionBrowseRecordMapper, AuctionBrowseRecord> implements IAuctionBrowseRecordService { } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.auction.controller.forepart.vo.MemberAuctionSalesroomVO; import com.google.common.collect.Lists; import com.ruoyi.auction.controller.management.dto.AuctionGoodsDTO; import com.ruoyi.auction.controller.management.dto.AuctionGoodsQuery; import com.ruoyi.auction.controller.management.vo.AuctionBidRecordVO; @@ -28,6 +29,15 @@ import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.system.api.domain.AuctionGoods; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.dto.AuctionGoodsListDTO; import com.ruoyi.system.api.domain.dto.AuctionGoodsListPageDTO; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.Member; import com.ruoyi.system.api.domain.MemberAddress; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; import com.ruoyi.system.api.domain.vo.AuctionGoodsListVO; import com.ruoyi.system.api.domain.vo.AuctionGoodsinfoVO; import com.ruoyi.system.api.feignClient.GoodsSkuClient; @@ -108,8 +118,8 @@ } @Override @GlobalTransactional(rollbackFor = Exception.class) @Transactional @GlobalTransactional(rollbackFor = Exception.class) public void saveAuctionGoods(AuctionGoodsDTO dto) { Long id = dto.getId(); Long goodsSkuId = dto.getGoodsSkuId(); @@ -129,7 +139,11 @@ } this.save(auctionGoods); // 扣减商品库存 goodsSkuClient.deductStock(goodsSkuId, dto.getAuctionStock(), SecurityConstants.INNER); GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(goodsSkuId); goodsStockUpdDTO.setAuctionStock(dto.getAuctionStock() * -1); goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO), SecurityConstants.INNER); } else { // 编辑 AuctionGoods auctionGoodsOrg = this.getById(id); @@ -150,9 +164,6 @@ if (goodsSku.getStock() + auctionGoodsOrg.getAuctionStock() < dto.getAuctionStock()) { throw new ServiceException("商品库存不足"); } // 编辑商品时需要先回退商品库存,再扣减最新的商品库存 goodsSkuClient.returningStock(auctionGoodsOrg.getGoodsSkuId(), auctionGoodsOrg.getAuctionStock(), SecurityConstants.INNER); auctionGoodsOrg.setStartingPrice(dto.getStartingPrice()); auctionGoodsOrg.setMinimumMarkupAmount(dto.getMinimumMarkupAmount()); auctionGoodsOrg.setStartTime(dto.getStartTime()); @@ -164,9 +175,13 @@ auctionGoodsOrg.setShareTitle(dto.getShareTitle()); auctionGoodsOrg.setSharePic(dto.getSharePic()); this.updateById(auctionGoodsOrg); // 扣减库存 goodsSkuClient.deductStock(auctionGoodsOrg.getGoodsSkuId(), auctionGoodsOrg.getAuctionStock(), SecurityConstants.INNER); // 更新商品库存 GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(goodsSkuId); goodsStockUpdDTO.setAuctionStock( auctionGoodsOrg.getAuctionStock() - dto.getAuctionStock()); goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO), SecurityConstants.INNER); } } @@ -253,8 +268,11 @@ orderClient.saveOrderOne(orderDTO, SecurityConstants.INNER); } else { // 没有人出价,退回拍卖商品库存 goodsSkuClient.returningStock(auctionGoods.getGoodsSkuId(), auctionGoods.getAuctionStock(), SecurityConstants.INNER); GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(auctionGoods.getGoodsSkuId()); goodsStockUpdDTO.setAuctionStock(auctionGoods.getAuctionStock()); goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO), SecurityConstants.INNER); } // 结束拍卖 this.lambdaUpdate().set(AuctionGoods::getStartStatus, AuctionStartStatusEnum.ENDED) ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -55,6 +55,12 @@ import com.ruoyi.system.api.domain.Member; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO; import com.ruoyi.system.api.domain.dto.BidDTO; import com.ruoyi.system.api.domain.dto.BidVO; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.vo.PayInfoVO; import com.ruoyi.system.api.domain.vo.WdMemberAuctionSalesroomVO; @@ -62,6 +68,7 @@ import com.ruoyi.system.api.feignClient.MemberClient; import com.ruoyi.system.api.feignClient.OrderClient; import com.ruoyi.system.api.feignClient.SysUserClient; import io.seata.spring.annotation.GlobalTransactional; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; @@ -70,6 +77,7 @@ import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; @@ -582,6 +590,8 @@ } @Override @Transactional @GlobalTransactional(rollbackFor = Exception.class) public void saveAuctionSalesroom(MgtAuctionSalesroomDTO dto) { Long id = dto.getId(); AuctionSalesroom auctionSalesroom = BeanUtils.copyBean(dto, AuctionSalesroom.class); @@ -612,6 +622,13 @@ auctionSalesroom.setAuctionSalesroomNo(nextId.toString()); // 添加 this.save(auctionSalesroom); List<GoodsStockUpdDTO> goodsStockUpdDTOS = auctionSalesroomGoods.stream().map(item -> { GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(item.getGoodsSkuId()); goodsStockUpdDTO.setAuctionStock(item.getSalesroomStock() * -1); return goodsStockUpdDTO; }).collect(Collectors.toList()); goodsSkuClient.updGoodsStock(goodsStockUpdDTOS, SecurityConstants.INNER); } else { // 编辑 AuctionSalesroom auctionSalesroomOrg = this.getById(id); @@ -626,6 +643,23 @@ } auctionSalesroom.setId(auctionSalesroomOrg.getId()); this.updateById(auctionSalesroom); List<AuctionSalesroomGoods> list = auctionSalesroomGoodsService.list( Wrappers.<AuctionSalesroomGoods>lambdaQuery() .eq(AuctionSalesroomGoods::getAuctionSalesroomId, id)); // 封装库存修改实体 List<GoodsStockUpdDTO> goodsStockUpdDTOS = list.stream() .flatMap(salesroomGoods -> auctionSalesroomGoods.stream() .filter(auctionSalesroomGood -> salesroomGoods.getId() .equals(auctionSalesroomGood.getId())) .map(auctionSalesroomGood -> { GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(salesroomGoods.getGoodsSkuId()); goodsStockUpdDTO.setAuctionStock(salesroomGoods.getSalesroomStock() - auctionSalesroomGood.getSalesroomStock()); return goodsStockUpdDTO; })) .collect(Collectors.toList()); goodsSkuClient.updGoodsStock(goodsStockUpdDTOS, SecurityConstants.INNER); // 移除原来地拍卖商品 auctionSalesroomGoodsService.remove(Wrappers.<AuctionSalesroomGoods>lambdaQuery() .eq(AuctionSalesroomGoods::getAuctionSalesroomId, id)); ruoyi-modules/ruoyi-auction/src/main/resources/mapper/auction/AuctionBrowseRecordMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.auction.mapper.AuctionBrowseRecordMapper"> </mapper> ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsBrowseRecordController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.controller.inner; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 会员商品浏览记录表 前端控制器 * </p> * * @author mitao * @since 2024-05-30 */ @RestController @RequestMapping("/goods-browse-record") public class GoodsBrowseRecordController { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSkuController.java
@@ -5,6 +5,7 @@ import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.goods.service.IGoodsSkuService; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import java.util.List; import javax.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; @@ -13,7 +14,6 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @@ -65,31 +65,17 @@ return R.ok(iGoodsSkuService.getGoodsByName(goodsSkuName)); } /** * 扣减商品库存 * * @param goodsSkuId 商品SKU ID * @param auctionStock 拍卖商品库存 */ @InnerAuth @PutMapping("/deduct-stock") R<?> deductStock(@RequestParam("goodsSkuId") Long goodsSkuId, @RequestParam("auctionStock") Integer auctionStock) { iGoodsSkuService.deductStock(goodsSkuId, auctionStock); return R.ok(); } /** * 退回商品库存 * 批量更新商品库存 auctionStock 负数则为减库存,正数为加库存 * * @param goodsSkuId 商品SKU ID * @param auctionStock 拍卖商品库存 * @param goodsStockUpdDTOS 商品库存修改数据传输对象 * @param source 请求来源 */ @InnerAuth @PutMapping("/goods-sku/returning-stock") R<?> returningStock(@RequestParam("goodsSkuId") Long goodsSkuId, @RequestParam("auctionStock") Integer auctionStock) { iGoodsSkuService.returningStock(goodsSkuId, auctionStock); @PutMapping("/goods-sku/upd-stock") R<?> returningStock(@RequestBody List<GoodsStockUpdDTO> goodsStockUpdDTOS) { iGoodsSkuService.returningStock(goodsStockUpdDTOS); return R.ok(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsBrowseRecord.java
New file @@ -0,0 +1,65 @@ package com.ruoyi.goods.domain; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * 会员商品浏览记录表 * </p> * * @author mitao * @since 2024-05-30 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_goods_browse_record") @ApiModel(value = "GoodsBrowseRecord对象", description = "会员商品浏览记录表") public class GoodsBrowseRecord implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "会员商品浏览记录id") @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; @ApiModelProperty(value = "商品id") private Long goodsSkuId; @ApiModelProperty(value = "会员id") private Long memberId; @ApiModelProperty(value = "创建者") @TableField(value = "create_by", fill = FieldFill.INSERT) private String createBy; @ApiModelProperty(value = "创建时间") @TableField(value = "create_time", fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty(value = "更新者") @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) private String updateBy; @ApiModelProperty(value = "更新时间") @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") @TableLogic private Integer delFlag; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsBrowseRecordMapper.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.goods.mapper; import com.ruoyi.goods.domain.GoodsBrowseRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 会员商品浏览记录表 Mapper 接口 * </p> * * @author mitao * @since 2024-05-30 */ public interface GoodsBrowseRecordMapper extends BaseMapper<GoodsBrowseRecord> { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrowseRecordService.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.goods.service; import com.ruoyi.goods.domain.GoodsBrowseRecord; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 会员商品浏览记录表 服务类 * </p> * * @author mitao * @since 2024-05-30 */ public interface IGoodsBrowseRecordService extends IService<GoodsBrowseRecord> { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java
@@ -7,6 +7,7 @@ import com.ruoyi.goods.controller.management.dto.GoodsSkuQuery; import com.ruoyi.goods.controller.management.vo.GoodsSkuVO; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.ListStatusDTO; import java.util.List; @@ -53,12 +54,9 @@ List<GoodsSku> getGoodsByName(String goodsSkuName); /** * 扣减商品库存 * 批量退回商品库存 * * @param goodsSkuId 商品SKU ID * @param auctionStock 拍卖库存 * @param goodsStockUpdDTOS 退货库存数据传输对象 */ void deductStock(Long goodsSkuId, Integer auctionStock); void returningStock(Long goodsSkuId, Integer auctionStock); void returningStock(List<GoodsStockUpdDTO> goodsStockUpdDTOS); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrowseRecordServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.goods.service.impl; import com.ruoyi.goods.domain.GoodsBrowseRecord; import com.ruoyi.goods.mapper.GoodsBrowseRecordMapper; import com.ruoyi.goods.service.IGoodsBrowseRecordService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 会员商品浏览记录表 服务实现类 * </p> * * @author mitao * @since 2024-05-30 */ @Service public class GoodsBrowseRecordServiceImpl extends ServiceImpl<GoodsBrowseRecordMapper, GoodsBrowseRecord> implements IGoodsBrowseRecordService { } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -24,11 +24,15 @@ import com.ruoyi.goods.service.IGoodsSkuService; import com.ruoyi.system.api.domain.GoodsSeckill; import com.ruoyi.system.api.domain.GoodsSku; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.ListStatusDTO; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -49,6 +53,8 @@ private final IGoodsInfoTitleValueService goodsInfoTitleValueService; private final IGoodsSeckillService goodsSeckillService; private final IGoodsGroupPurchaseService goodsGroupPurchaseService; private final RedissonClient redissonClient; private static final ObjectMapper objectMapper = new ObjectMapper(); /** @@ -203,37 +209,52 @@ .list(); } /** * 扣减商品库存 * 批量更新商品库存 auctionStock 负数则为减库存,正数为加库存 * * @param goodsSkuId 商品SKU ID * @param auctionStock 拍卖库存 * @param goodsStockUpdDTOS 商品库存修改数据传输对象 */ @Override public void deductStock(Long goodsSkuId, Integer auctionStock) { GoodsSku goodsSku = this.getById(goodsSkuId); if (StringUtils.isNull(goodsSku)) { @Transactional(propagation = Propagation.REQUIRES_NEW) public void returningStock(List<GoodsStockUpdDTO> goodsStockUpdDTOS) { List<Long> goodsSkuIdList = goodsStockUpdDTOS.stream() .map(GoodsStockUpdDTO::getGoodsSkuId) .collect(Collectors.toList()); List<GoodsSku> goodsSkus = this.listByIds(goodsSkuIdList); if (StringUtils.isEmpty(goodsSkus)) { throw new ServiceException("商品不存在"); } if (goodsSku.getStock() < auctionStock) { throw new ServiceException("库存不足"); Map<Long, Integer> stockMap = goodsStockUpdDTOS.stream() .collect(Collectors.toMap(GoodsStockUpdDTO::getGoodsSkuId, GoodsStockUpdDTO::getAuctionStock)); for (GoodsSku skus : goodsSkus) { Integer auctionStock = stockMap.get(skus.getId()); if (StringUtils.isNotNull(auctionStock) && auctionStock > 0) { // 更新商品库存,更新五次失败抛出异常 boolean isUpdated = false; for (int i = 0; i < 5; i++) { isUpdated = updateGoodsStock(skus, auctionStock); if (isUpdated) { break; } else { skus = this.getById(skus.getId()); } // 更新商品库存 this.lambdaUpdate().set(GoodsSku::getStock, goodsSku.getStock() - auctionStock) .ge(GoodsSku::getStock, auctionStock).eq(GoodsSku::getId, goodsSku.getId()) .update(); } if (!isUpdated) { throw new ServiceException("商品库存回退失败"); } } } @Override public void returningStock(Long goodsSkuId, Integer auctionStock) { GoodsSku goodsSku = this.getById(goodsSkuId); if (StringUtils.isNull(goodsSku)) { throw new ServiceException("商品不存在"); } // 更新商品库存 this.lambdaUpdate() .set(auctionStock > 0, GoodsSku::getStock, goodsSku.getStock() + auctionStock) .eq(GoodsSku::getId, goodsSku.getId()) private boolean updateGoodsStock(GoodsSku skus, Integer auctionStock) { return this.lambdaUpdate() .set(GoodsSku::getStock, skus.getStock() + auctionStock) .eq(GoodsSku::getId, skus.getId()) .eq(GoodsSku::getStock, skus.getStock()) .update(); } } ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsBrowseRecordMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.goods.mapper.GoodsBrowseRecordMapper"> </mapper> ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderAuctionBondServiceImpl.java
@@ -26,6 +26,8 @@ import javax.annotation.Resource; import org.apache.poi.ss.formula.functions.T; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * <p> @@ -109,6 +111,7 @@ * @param bondStatusEnum 保证金状态 */ @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateOrderAuctionBondStatus(List<Long> ids, BondStatusEnum bondStatusEnum) { this.lambdaUpdate().set(OrderAuctionBond::getBoundStatus, bondStatusEnum) .in(OrderAuctionBond::getId, ids).update();