mitao
2024-06-03 a756255136e9244180f90d6dcfb51529e2ac8a9b
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -14,6 +14,7 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import com.ruoyi.auction.controller.forepart.dto.AuctionSalesroomGoodsDTO;
import com.ruoyi.auction.controller.forepart.dto.ForepartAuctionBidRecordDTO;
import com.ruoyi.auction.controller.forepart.vo.ForepartAuctionSalesroomGoodsVO;
@@ -23,8 +24,11 @@
import com.ruoyi.auction.controller.management.dto.MgtAuctionSaleroomBidRecordQuery;
import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomDTO;
import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomGoodsDTO;
import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomGoodsQuery;
import com.ruoyi.auction.controller.management.dto.MgtAuctionSalesroomQuery;
import com.ruoyi.auction.controller.management.dto.MgtScreenBidPage;
import com.ruoyi.auction.controller.management.dto.MgtScreenSalesroomGoodsDTO;
import com.ruoyi.auction.controller.management.dto.MgtScreenVideoDTO;
import com.ruoyi.auction.controller.management.vo.MgtAuctionBidRecordVO;
import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomGoodsVO;
import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomScreenVO;
@@ -42,6 +46,7 @@
import com.ruoyi.auction.service.IAuctionVideoService;
import com.ruoyi.auction.util.CreateQrCode;
import com.ruoyi.auction.util.HttpUtils;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.enums.AuctionGoodsStatusEnum;
@@ -62,6 +67,7 @@
import com.ruoyi.system.api.domain.GoodsSku;
import com.ruoyi.system.api.domain.Member;
import com.ruoyi.system.api.domain.OrderAuctionBond;
import com.ruoyi.system.api.domain.PromotionVideo;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO;
import com.ruoyi.system.api.domain.dto.BidDTO;
@@ -75,6 +81,7 @@
import com.ruoyi.system.api.feignClient.GoodsSkuClient;
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.feignClient.OrderClient;
import com.ruoyi.system.api.feignClient.PromotionClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import java.math.BigDecimal;
@@ -137,6 +144,8 @@
    @Resource
    private IAuctionBrowseRecordService  iAuctionBrowseRecordService;
    @Resource
    private PromotionClient promotionClient;
    //微信
    private static final String ACCESS_TOKEN_HOST = "https://api.weixin.qq.com/cgi-bin/token";
@@ -810,21 +819,22 @@
    /**
     * 查看详情
     *
     * @param id 拍卖会id
     * @return 拍卖场视图对象
     * @param isScreen 是否为大屏控制台
     * @return MgtAuctionSalesroomVO
     */
    @Override
    public MgtAuctionSalesroomVO getAuctionSalesroom(Long id) {
    public MgtAuctionSalesroomVO getAuctionSalesroom(Long id, Boolean isScreen) {
        // 获取拍卖场
        AuctionSalesroom auctionSalesroom = this.getById(id);
        MgtAuctionSalesroomVO mgtAuctionSalesroomVO = BeanUtils.copyBean(auctionSalesroom,
                MgtAuctionSalesroomVO.class);
        // 获取拍卖场商品
        LambdaQueryWrapper<AuctionSalesroomGoods> wrappers=new LambdaQueryWrapper<AuctionSalesroomGoods>();
        wrappers.eq(AuctionSalesroomGoods::getAuctionSalesroomId, id);
        wrappers.orderByDesc(AuctionSalesroomGoods::getSortNum);
        List<AuctionSalesroomGoods> list = auctionSalesroomGoodsMapper.selectList(wrappers);
        List<AuctionSalesroomGoods> list;
        if (isScreen) {
            list = getAuctionSalesroomGoods(id, Boolean.TRUE);
        } else {
            list = getAuctionSalesroomGoods(id, null);
        }
        if (StringUtils.isNotEmpty(list)) {
            List<MgtAuctionSalesroomGoodsVO> mgtAuctionSalesroomGoodsVOS = BeanUtils.copyList(list,
                    MgtAuctionSalesroomGoodsVO.class);
@@ -848,6 +858,16 @@
            mgtAuctionSalesroomVO.setAuctionSalesroomGoodsVOS(mgtAuctionSalesroomGoodsVOS);
        }
        return mgtAuctionSalesroomVO;
    }
    private List<AuctionSalesroomGoods> getAuctionSalesroomGoods(Long id, Boolean isBackup) {
        // 获取拍卖场商品
        LambdaQueryWrapper<AuctionSalesroomGoods> wrappers = new LambdaQueryWrapper<AuctionSalesroomGoods>();
        wrappers.eq(AuctionSalesroomGoods::getAuctionSalesroomId, id);
        wrappers.eq(StringUtils.isNotNull(isBackup), AuctionSalesroomGoods::getBackupStatus,
                isBackup);
        wrappers.orderByDesc(AuctionSalesroomGoods::getSortNum);
        return auctionSalesroomGoodsMapper.selectList(wrappers);
    }
    /**
@@ -936,7 +956,7 @@
     */
    @Override
    public MgtAuctionSalesroomScreenVO getAuctionSalesroomDetail(Long id) {
        MgtAuctionSalesroomVO mgtAuctionSalesroomVO = this.getAuctionSalesroom(id);
        MgtAuctionSalesroomVO mgtAuctionSalesroomVO = this.getAuctionSalesroom(id, Boolean.TRUE);
        MgtAuctionSalesroomScreenVO vo = BeanUtils.copyBean(
                mgtAuctionSalesroomVO, MgtAuctionSalesroomScreenVO.class);
        if (vo.getStatus().equals(AuctionStartStatusEnum.IN_AUCTION)) {
@@ -987,14 +1007,14 @@
    /**
     * 进入详情-出价会员列表
     *
     * @param mgtScreenBidPage
     * @param mgtScreenBidPage 分页参数对象
     * @return PageDTO<MgtAuctionBidRecordVO>
     */
    @Override
    public PageDTO<MgtAuctionBidRecordVO> getScreenBidRecordList(
            MgtScreenBidPage mgtScreenBidPage) {
        MgtAuctionSalesroomVO mgtAuctionSalesroomVO = this.getAuctionSalesroom(
                mgtScreenBidPage.getId());
                mgtScreenBidPage.getId(), Boolean.TRUE);
        List<MgtAuctionSalesroomGoodsVO> auctionSalesroomGoodsVOS = mgtAuctionSalesroomVO.getAuctionSalesroomGoodsVOS();
        if (StringUtils.isEmpty(auctionSalesroomGoodsVOS)) {
            throw new ServiceException("该拍卖会暂无拍卖商品");
@@ -1017,4 +1037,146 @@
        }
        return PageDTO.of(page, MgtAuctionBidRecordVO.class);
    }
    /**
     * 添加商品
     *
     * @param dto 大屏操作台添加商品数据传输对象
     */
    @Override
    @Transactional
    @GlobalTransactional(rollbackFor = Exception.class)
    public void addGoods(MgtScreenSalesroomGoodsDTO dto) {
        GoodsSku data = goodsSkuClient.getGoodsSkuOne(dto.getGoodsSkuId(), SecurityConstants.INNER)
                .getData();
        if (StringUtils.isNull(data)) {
            throw new ServiceException("商品不存在");
        }
        // 扣减库存
        GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
        goodsStockUpdDTO.setGoodsSkuId(data.getId());
        goodsStockUpdDTO.setAuctionStock(dto.getSalesroomStock() * -1);
        R<?> result = goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                SecurityConstants.INNER);
        if (result.getCode() != Constants.SUCCESS) {
            throw new ServiceException("添加商品失败");
        }
        AuctionSalesroomGoods auctionSalesroomGoods = BeanUtils.copyBean(dto,
                AuctionSalesroomGoods.class);
        auctionSalesroomGoods.setBackupStatus(false);
        auctionSalesroomGoodsMapper.insert(auctionSalesroomGoods);
    }
    /**
     * 获取备选拍品列表的分页数据
     *
     * @param query 拍卖场商品关系查询对象
     * @return PageDTO<MgtAuctionSalesroomGoodsVO>
     */
    @Override
    public PageDTO<MgtAuctionSalesroomGoodsVO> backupGoods(MgtAuctionSalesroomGoodsQuery query) {
        Set<Long> goodsSkuIdSet = null;
        if (StringUtils.isNotBlank(query.getGoodsName())) {
            List<GoodsSku> data = goodsSkuClient.getGoodsByName(query.getGoodsName(),
                    SecurityConstants.INNER).getData();
            if (StringUtils.isNotEmpty(data)) {
                goodsSkuIdSet = data.stream().map(GoodsSku::getId)
                        .collect(Collectors.toSet());
            }
        }
        Page<AuctionSalesroomGoods> page = auctionSalesroomGoodsMapper.selectPage(
                new Page<>(query.getPageCurr(), query.getPageSize()),
                Wrappers.<AuctionSalesroomGoods>lambdaQuery()
                        .in(StringUtils.isNotEmpty(goodsSkuIdSet),
                                AuctionSalesroomGoods::getGoodsSkuId, goodsSkuIdSet));
        if (StringUtils.isNotEmpty(page.getRecords())) {
            return PageDTO.empty(page);
        }
        Set<Long> skuIdList = page.getRecords().stream().map(AuctionSalesroomGoods::getGoodsSkuId)
                .collect(Collectors.toSet());
        List<GoodsSku> goodsSkuList = goodsSkuClient.getGoodsListByIds(skuIdList,
                SecurityConstants.INNER).getData();
        Map<Long, GoodsSku> goodsSkuMap = goodsSkuList.stream()
                .collect(Collectors.toMap(GoodsSku::getId, e -> e));
        PageDTO<MgtAuctionSalesroomGoodsVO> mgtAuctionSalesroomGoodsVOPageDTO = PageDTO.of(page,
                MgtAuctionSalesroomGoodsVO.class);
        mgtAuctionSalesroomGoodsVOPageDTO.getList().forEach(item -> {
            item.setGoodsSkuName(goodsSkuMap.get(item.getGoodsSkuId()).getSkuName());
        });
        return mgtAuctionSalesroomGoodsVOPageDTO;
    }
    /**
     * 选择备选商品
     *
     * @param idList 备选商品id集合
     */
    @Override
    public void addBackupGoods(List<Long> idList) {
        List<AuctionSalesroomGoods> auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectList(
                Wrappers.<AuctionSalesroomGoods>lambdaQuery()
                        .in(AuctionSalesroomGoods::getId, idList)
                        .eq(AuctionSalesroomGoods::getBackupStatus, Boolean.TRUE));
        if (StringUtils.isNotEmpty(auctionSalesroomGoods)) {
            auctionSalesroomGoods.forEach(item -> {
                item.setStatus(AuctionGoodsStatusEnum.WAITING);
            });
            auctionSalesroomGoodsMapper.updateBatchById(auctionSalesroomGoods);
        }
    }
    /**
     * 结束当前拍卖商品
     *
     * @param id 拍卖场商品id
     */
    @Override
    public void stopCurrentGoods(Long id) {
        AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById(id);
        if (StringUtils.isNull(auctionSalesroomGoods)) {
            throw new ServiceException("拍卖商品不存在");
        }
        auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.ENDED);
        auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods);
    }
    /**
     * 开始下一拍卖商品
     *
     * @param id 拍卖场商品id
     */
    @Override
    public void startNextGoods(Long id) {
        AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById(id);
        if (StringUtils.isNull(auctionSalesroomGoods)) {
            throw new ServiceException("拍卖商品不存在");
        }
        auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.IN_PROGRESS);
        auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods);
    }
    /**
     * 播放视频
     *
     * @param dto 大屏播放视频对象
     */
    @Override
    public void play(MgtScreenVideoDTO dto) {
        PromotionVideo data = promotionClient.getPromotionVideoOne(dto.getVideoId(),
                SecurityConstants.INNER).getData();
        if (StringUtils.isNull(data)) {
            throw new ServiceException("视频不存在");
        }
        AuctionVideo auctionVideo = new AuctionVideo();
        auctionVideo.setAuctionSalesroomId(dto.getAuctionSalesroomId());
        auctionVideo.setPromotionVideoId(dto.getVideoId());
        auctionVideo.setPromotionVideoUrl(data.getVideoUrl());
        iAuctionVideoService.save(auctionVideo);
    }
    @Override
    public void stopPlay(Long auctionSalesroomId) {
        iAuctionVideoService.remove(Wrappers.<AuctionVideo>lambdaQuery().eq
                (AuctionVideo::getAuctionSalesroomId, 1L));
    }
}