mitao
2024-07-19 7106d8205f0af944a34b880405c1b33effcc5393
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -46,6 +46,7 @@
import com.ruoyi.common.core.enums.BidStatusEnum;
import com.ruoyi.common.core.enums.BondStatusEnum;
import com.ruoyi.common.core.enums.ClientTypeEnum;
import com.ruoyi.common.core.enums.OrderFromEnum;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.IDhelper;
import com.ruoyi.common.core.utils.StringUtils;
@@ -55,12 +56,15 @@
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.RemoteFileService;
import com.ruoyi.system.api.constants.ConfigEnum;
import com.ruoyi.system.api.constants.NotificationTypeConstant;
import com.ruoyi.system.api.domain.AppMiniLoginVO;
import com.ruoyi.system.api.domain.AuctionGoods;
import com.ruoyi.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.CustomConfig;
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.PromotionVideo;
import com.ruoyi.system.api.domain.SysUser;
@@ -72,8 +76,8 @@
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.MemberAuctionSalesroomWdDTO;
import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO;
import com.ruoyi.system.api.domain.dto.OrderDTO;
import com.ruoyi.system.api.domain.dto.RefundDTO;
import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO;
import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomVO;
@@ -89,6 +93,7 @@
import io.seata.spring.annotation.GlobalTransactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
@@ -97,6 +102,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;
@@ -824,7 +830,8 @@
                .select(AuctionSalesroom::getId, AuctionSalesroom::getSalesroomName,
                        AuctionSalesroom::getCreateTime, AuctionSalesroom::getStartTime,
                        AuctionSalesroom::getEndTime, AuctionSalesroom::getType,
                        AuctionSalesroom::getAuthentication, AuctionSalesroom::getStatus)
                        AuctionSalesroom::getAuthentication, AuctionSalesroom::getStatus,
                        AuctionSalesroom::getQrCode)
                .like(StringUtils.isNotEmpty(query.getSalesroomName()),
                        AuctionSalesroom::getSalesroomName, query.getSalesroomName())
                .eq(StringUtils.isNotNull(query.getAuthentication()),
@@ -1110,28 +1117,28 @@
                .orderByDesc(query.getSortType() == 1, AuctionBidRecord::getLastBidAmount)
                .orderByDesc(query.getSortType() == 2, AuctionBidRecord::getBidCount)
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        if (StringUtils.isNull(page.getRecords())) {
        if (StringUtils.isEmpty(page.getRecords())) {
            return PageDTO.empty(page);
        }
        PageDTO<MgtAuctionBidRecordVO> mgtAuctionBidRecordVOPageDTO = PageDTO.of(page,
                MgtAuctionBidRecordVO.class);
        List<MgtAuctionBidRecordVO> list = mgtAuctionBidRecordVOPageDTO.getList();
        Set<Long> goodsIdList = list.stream().map(MgtAuctionBidRecordVO::getGoodsSkuId)
                .collect(Collectors.toSet());
        AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById(
                query.getId());
        Set<Long> memberIdList = list.stream().map(MgtAuctionBidRecordVO::getMemberId)
                .collect(Collectors.toSet());
        List<GoodsSku> goodsSkuList = goodsSkuClient.getGoodsListByIds(goodsIdList,
        GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(
                        auctionSalesroomGoods.getGoodsSkuId(),
                        SecurityConstants.INNER)
                .getData();
        List<Member> memberList = memberClient.getMemberListByIds(memberIdList,
                        SecurityConstants.INNER)
                .getData();
        Map<Long, GoodsSku> goodsSkuMap = goodsSkuList.stream()
                .collect(Collectors.toMap(GoodsSku::getId, Function.identity()));
        Map<Long, Member> memberMap = memberList.stream()
                .collect(Collectors.toMap(Member::getId, Function.identity()));
        for (MgtAuctionBidRecordVO vo : list) {
            GoodsSku goodsSku = goodsSkuMap.get(vo.getGoodsSkuId());
            Member member = memberMap.get(vo.getMemberId());
            if (StringUtils.isNotNull(goodsSku)) {
                vo.setGoodsSkuName(goodsSku.getSkuName());
@@ -1227,7 +1234,10 @@
                    vo.setMgtAuctionBidRecordVOList(
                            BeanUtils.copyList(list, MgtAuctionBidRecordVO.class));
                } else {
                    vo.setNextAuctionSalesroomGoods(collect.get(0));
                    Optional<MgtAuctionSalesroomGoodsVO> first = collect.stream()
                            .filter(c -> c.getStatus().equals(AuctionGoodsStatusEnum.WAITING))
                            .findFirst();
                    vo.setNextAuctionSalesroomGoods(first.orElse(null));
                }
            }
        }
@@ -1262,10 +1272,26 @@
                .eq(AuctionBidRecord::getAuctionType,
                        AuctionOrderTypeEnum.AUCTION_ITEMS)
                .page(new Page<>(mgtScreenBidPage.getPageCurr(), mgtScreenBidPage.getPageSize()));
        if (StringUtils.isNotEmpty(page.getRecords())) {
        if (StringUtils.isEmpty(page.getRecords())) {
            return PageDTO.empty(page);
        }
        return PageDTO.of(page, MgtAuctionBidRecordVO.class);
        PageDTO<MgtAuctionBidRecordVO> vo = PageDTO.of(page,
                MgtAuctionBidRecordVO.class);
        List<Long> id = vo.getList().stream().map(MgtAuctionBidRecordVO::getMemberId)
                .collect(Collectors.toList());
        List<Member> data = memberClient.getMemberListByIds(id, SecurityConstants.INNER).getData();
        if (CollUtils.isNotEmpty(data)) {
            Map<Long, Member> memberMap = data.stream()
                    .collect(Collectors.toMap(Member::getId, e -> e));
            vo.getList().forEach(item -> {
                Member member = memberMap.get(item.getMemberId());
                if (StringUtils.isNotNull(member)) {
                    item.setMemberName(member.getNickname());
                    item.setPhone(member.getPhone());
                }
            });
        }
        return vo;
    }
    /**
@@ -1375,8 +1401,51 @@
        if (StringUtils.isNull(auctionSalesroomGoods)) {
            throw new ServiceException("拍卖商品不存在");
        }
        AuctionSalesroom auctionSalesroom = this.getById(
                auctionSalesroomGoods.getAuctionSalesroomId());
        auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.ENDED);
        auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods);
        List<AuctionBidRecord> auctionBidRecordList = auctionBidRecordMapper.selectList(
                Wrappers.lambdaQuery(AuctionBidRecord.class)
                        .eq(AuctionBidRecord::getAuctionSalesroomId,
                                auctionSalesroomGoods.getAuctionSalesroomId())
                        .eq(AuctionBidRecord::getTargetId, auctionSalesroomGoods.getGoodsSkuId())
                        .eq(AuctionBidRecord::getAuctionType, AuctionOrderTypeEnum.AUCTION_ITEMS)
                        .orderByDesc(AuctionBidRecord::getLastBidAmount));
        if (CollUtils.isNotEmpty(auctionBidRecordList)) {
            List<AuctionBidRecord> auctionBidRecords = new ArrayList<>();
            if (auctionBidRecordList.size() >= auctionSalesroomGoods.getSalesroomStock()) {
                for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) {
                    AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i);
                    auctionBidRecords.add(auctionBidRecord);
                }
            } else {
                for (int i = 0; i < auctionSalesroomGoods.getSalesroomStock(); i++) {
                    AuctionBidRecord auctionBidRecord = auctionBidRecordList.get(i);
                    auctionBidRecords.add(auctionBidRecord);
                }
                // 没有出价记录,回退库存
                GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
                goodsStockUpdDTO.setGoodsSkuId(auctionSalesroomGoods.getGoodsSkuId());
                goodsStockUpdDTO.setAuctionStock(
                        auctionSalesroomGoods.getSalesroomStock() - auctionBidRecordList.size());
                goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                        SecurityConstants.INNER);
            }
            for (AuctionBidRecord auctionBidRecord : auctionBidRecords) {
                addOrder(auctionBidRecord.getTargetId(), auctionBidRecord.getMemberId(),
                        auctionBidRecord.getLastBidAmount(),
                        auctionSalesroom.getBond());
            }
        } else {
            // 没有出价记录,回退库存
            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
            goodsStockUpdDTO.setGoodsSkuId(auctionSalesroomGoods.getGoodsSkuId());
            goodsStockUpdDTO.setAuctionStock(
                    auctionSalesroomGoods.getSalesroomStock());
            goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                    SecurityConstants.INNER);
        }
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("notification_type", NotificationTypeConstant.AUCTION_SALESROOM_GOODS);
        map.put("auctionSalesroomId", auctionSalesroomGoods.getAuctionSalesroomId().toString());
@@ -1388,6 +1457,59 @@
        sysUserClient.pushAll(msg, SecurityConstants.INNER);
    }
    public void addOrder(Long goodsSkuId, Long memberId, BigDecimal lastBidAmount,
            BigDecimal bound) {
        OrderDTO order = new OrderDTO();
        order.setGoodsSkuId(goodsSkuId);
        order.setOrderTime(LocalDateTime.now());
        order.setOrderFrom(OrderFromEnum.AUCTION_ORDERS);
        order.setMemberId(memberId);
        AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectById(
                goodsSkuId);
        order.setGoodsQuantity(1);
        order.setTotalAmount(lastBidAmount);
        order.setAuctionSalesroomId(auctionSalesroomGoods.getAuctionSalesroomId());
        R<MemberAddress> memberAddressR = memberClient.getMemberAddressOne(memberId,
                SecurityConstants.INNER);
        MemberAddress memberAddress = memberAddressR.getData();
        CustomConfig memberPointsMoney = sysUserClient.getconfig(
                ConfigEnum.MEMBER_POINTS_MONEY.getKey()).getData();
        CustomConfig memberPointsPoints = sysUserClient.getconfig(
                        ConfigEnum.MEMBER_POINTS_POINTS.getKey())
                .getData();
        if (lastBidAmount.intValue() > 0) {
            BigDecimal divide = lastBidAmount.divide(
                    BigDecimal.valueOf(Long.parseLong(memberPointsMoney.getConfigValue())), 0,
                    RoundingMode.DOWN);
            int points = divide.multiply(
                    BigDecimal.valueOf(
                            Long.parseLong((memberPointsPoints.getConfigValue())))).intValue();
            order.setPoints(points);
        } else {
            order.setPoints(0);
        }
        if (memberAddress != null) {
            order.setReceiverCity(memberAddress.getCity());
            order.setReceiverDetailAddress(memberAddress.getDetailedAddress());
            order.setReceiverphone(memberAddress.getRecipientPhone());
            order.setReceiverName(memberAddress.getRecipientName());
        }
        order.setBound(bound);
        order.setAuctionType(AuctionOrderTypeEnum.AUCTION_ITEMS);
        GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(auctionSalesroomGoods.getGoodsSkuId(),
                        SecurityConstants.INNER)
                .getData();
        order.setSkuName(goodsSku.getSkuName());
        order.setCoverPic(goodsSku.getCoverPic());
        order.setPrice(lastBidAmount);
        orderClient.saveOrderOne(order, SecurityConstants.INNER);
    }
    /**
     * 开始下一拍卖商品
     *
@@ -1400,6 +1522,7 @@
            throw new ServiceException("拍卖商品不存在");
        }
        auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.IN_PROGRESS);
        auctionSalesroomGoods.setStartTime(LocalDateTime.now());
        auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods);
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("notification_type", NotificationTypeConstant.AUCTION_SALESROOM_GOODS);