mitao
2024-05-30 269e239a677763fb16da6bc39ab649eaccf3c9c1
Merge branch 'dev-mitao'

# Conflicts:
# ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
# ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
9个文件已修改
13个文件已添加
525 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/GoodsStockUpdDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/GoodsSkuFactory.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/GoodsSkuClient.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/AuctionBrowseRecordController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionSalesroomController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionBrowseRecord.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/mapper/AuctionBrowseRecordMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionBrowseRecordService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionBrowseRecordServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/resources/mapper/auction/AuctionBrowseRecordMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsBrowseRecordController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSkuController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/GoodsBrowseRecord.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/GoodsBrowseRecordMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsBrowseRecordService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsBrowseRecordServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsBrowseRecordMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderAuctionBondServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
@@ -29,6 +30,11 @@
import com.ruoyi.system.api.domain.AuctionGoods;
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;
@@ -111,8 +117,8 @@
    }
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    @Transactional
    @GlobalTransactional(rollbackFor = Exception.class)
    public void saveAuctionGoods(AuctionGoodsDTO dto) {
        Long id = dto.getId();
        Long goodsSkuId = dto.getGoodsSkuId();
@@ -132,7 +138,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);
@@ -153,9 +163,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());
@@ -167,9 +174,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);
        }
    }
@@ -256,8 +267,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
@@ -57,6 +57,8 @@
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.vo.PayInfoVO;
@@ -64,6 +66,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.ArrayList;
@@ -75,6 +78,7 @@
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
@@ -585,6 +589,8 @@
    }
    @Override
    @Transactional
    @GlobalTransactional(rollbackFor = Exception.class)
    public void saveAuctionSalesroom(MgtAuctionSalesroomDTO dto) {
        Long id = dto.getId();
        AuctionSalesroom auctionSalesroom = BeanUtils.copyBean(dto, AuctionSalesroom.class);
@@ -615,6 +621,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);
@@ -629,6 +642,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();