mitao
2024-07-31 de0026f420814a34a0e94c2de702b563b7e9234e
修改bug
1 文件已重命名
1个文件已添加
35个文件已修改
647 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/AuctionSalesroomGoods.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuctionFallbackFactory.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuctionClient.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/GoodsSkuClient.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomGoodsController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionSalesroomController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/dto/MgtAuctionSalesroomDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/mapper/AuctionSalesroomGoodsMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionSalesroomGoodsService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionSalesroomService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionBidRecordServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionVideoServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/main/resources/mapper/auction/AuctionSalesroomGoodsMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-auction/src/test/java/com/ruoyi/auction/RedissonTest.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSkuController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/dto/MgtMemberQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/vo/MgtOrderVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MemberInvoiceServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/tencent/common/Configure.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/scheduler/PromotionScheduler.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/CouponMemberMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/AuctionSalesroomGoods.java
File was renamed from ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/domain/AuctionSalesroomGoods.java
@@ -1,4 +1,4 @@
package com.ruoyi.auction.domain;
package com.ruoyi.system.api.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
@@ -140,7 +140,9 @@
    @TableField(exist = false)
    private String roleName;
    @ApiModelProperty(value = "是否为拍卖师 1否 2是")
    @TableField(exist = false)
    private Integer isAuctioneer;
    @Override
    public String getRemark() {
        return remark;
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/AuctionFallbackFactory.java
@@ -4,6 +4,7 @@
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.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.OrderAuctionBond;
import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO;
import com.ruoyi.system.api.domain.dto.BondDTO;
@@ -62,6 +63,27 @@
                    Collection<Long> auctionSalesroomGoodsIdSet, String source) {
                return R.fail("获取拍卖场列表失败" + cause.getMessage());
            }
            @Override
            public R<List<AuctionSalesroom>> getAuctionSalesroomBySkuId(Long id, String source) {
                return R.fail("获取拍卖场列表失败" + cause.getMessage());
            }
            @Override
            public R<List<AuctionGoods>> getAuctionGoodsBySkuId(Long id, String source) {
                return R.fail("获取商品竞价列表失败" + cause.getMessage());
            }
            @Override
            public R<AuctionGoods> getAuctionGoodsId(Long goodsSkuId, String source) {
                return R.fail("获取商品竞价失败" + cause.getMessage());
            }
            @Override
            public R<AuctionSalesroomGoods> getAuctionSalesroomGoodsById(Long goodsSkuId,
                    String source) {
                return R.fail("获取拍卖会商品失败" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/AuctionClient.java
@@ -6,6 +6,7 @@
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.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.OrderAuctionBond;
import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO;
import com.ruoyi.system.api.domain.dto.BondDTO;
@@ -14,6 +15,7 @@
import java.util.Collection;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
@@ -51,4 +53,21 @@
    R<List<AuctionSalesroom>> getAuctionSalesroomByIds(
            @RequestBody Collection<Long> auctionSalesroomGoodsIdSet,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @GetMapping("/auction-salesroom/getAuctionSalesroomBySkuId/{id}")
    R<List<AuctionSalesroom>> getAuctionSalesroomBySkuId(@PathVariable("id") Long id,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @GetMapping("/auction-goods/getAuctionGoodsBySkuId/{id}")
    R<List<AuctionGoods>> getAuctionGoodsBySkuId(@PathVariable("id") Long id,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @GetMapping("/auction-goods/getAuctionGoodsId/{goodsSkuId}")
    R<AuctionGoods> getAuctionGoodsId(@PathVariable("goodsSkuId") Long goodsSkuId,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @GetMapping("/auction-salesroom/getAuctionSalesroomGoodsById/{goodsSkuId}")
    R<AuctionSalesroomGoods> getAuctionSalesroomGoodsById(
            @PathVariable("goodsSkuId") Long goodsSkuId,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/GoodsSkuClient.java
@@ -3,7 +3,15 @@
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.GoodsGroupPurchase;
import com.ruoyi.system.api.domain.GoodsGroupPurchaseInfo;
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.Order;
import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
import com.ruoyi.system.api.domain.vo.GoodsInfoTitleValueVO;
import com.ruoyi.system.api.factory.GoodsSkuFactory;
@@ -148,4 +156,8 @@
    @PostMapping("/goods-sku/list")
    R<List<GoodsSku>> getGoodsListByIds(@RequestBody Collection<Long> goodsIdList,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @PostMapping("/goods-sku/returnStockByOrder")
    R<?> returnStockByOrder(@RequestBody Order order,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/forepart/ForepartAuctionSalesroomGoodsController.java
@@ -1,11 +1,11 @@
package com.ruoyi.auction.controller.forepart;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO;
import com.ruoyi.auction.domain.AuctionSalesroomGoods;
import com.ruoyi.auction.service.IAuctionSalesroomGoodsService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO;
import com.ruoyi.system.api.domain.vo.AuctionSalesroomGoodsInfoVO;
import com.ruoyi.system.api.domain.vo.AuctionSalesroomVO;
import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO;
@@ -13,8 +13,10 @@
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java
@@ -7,8 +7,10 @@
import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.system.api.domain.AuctionGoods;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
@@ -62,4 +64,28 @@
        return R.ok();
    }
    /**
     * 根据商品id获取正在进行的拍卖商品
     *
     * @param id 商品id
     * @return
     */
    @InnerAuth
    @GetMapping("/getAuctionGoodsBySkuId/{id}")
    R<List<AuctionGoods>> getAuctionGoodsBySkuId(@PathVariable("id") Long id) {
        return R.ok(auctionGoodsService.getAuctionGoodsBySkuId(id));
    }
    /**
     * 根据id获取拍卖商品
     *
     * @param goodsSkuId
     * @return
     */
    @InnerAuth
    @GetMapping("/getAuctionGoodsId/{goodsSkuId}")
    R<AuctionGoods> getAuctionGoodsId(@PathVariable("goodsSkuId") Long goodsSkuId) {
        return R.ok(auctionGoodsService.getById(goodsSkuId));
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionSalesroomController.java
@@ -5,10 +5,13 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO;
import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -47,4 +50,29 @@
        return R.ok(iAuctionSalesroomService.getAuctionSalesroomByIds(auctionSalesroomGoodsIdSet));
    }
    /**
     * 根据商品id获取正在进行的拍卖会
     *
     * @param id 商品id
     * @return
     */
    @InnerAuth
    @GetMapping("/getAuctionSalesroomBySkuId/{id}")
    R<List<AuctionSalesroom>> getAuctionSalesroomBySkuId(@PathVariable("id") Long id) {
        return R.ok(iAuctionSalesroomService.getAuctionSalesroomBySkuId(id));
    }
    /**
     * 获取拍卖商品
     *
     * @param goodsSkuId
     * @return
     */
    @InnerAuth
    @GetMapping("/getAuctionSalesroomGoodsById/{goodsSkuId}")
    R<AuctionSalesroomGoods> getAuctionSalesroomGoodsById(
            @PathVariable("goodsSkuId") Long goodsSkuId) {
        return R.ok(iAuctionSalesroomService.getAuctionSalesroomGoodsById(goodsSkuId));
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/dto/MgtAuctionSalesroomDTO.java
@@ -54,7 +54,7 @@
    private String coverPic;
    @ApiModelProperty(value = "用户端拍卖场封面图")
    // @NotBlank(message = "用户端拍卖场封面图不能为空")
    @NotBlank(message = "用户端拍卖场封面图不能为空")
    private String clientCoverPic;
    @ApiModelProperty(value = "分享标题")
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/mapper/AuctionSalesroomGoodsMapper.java
@@ -1,7 +1,7 @@
package com.ruoyi.auction.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.auction.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO;
import java.util.List;
import org.apache.ibatis.annotations.Param;
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionGoodsService.java
@@ -11,6 +11,7 @@
import com.ruoyi.system.api.domain.dto.ListStatusDTO;
import com.ruoyi.system.api.domain.vo.AuctionGoodsListVO;
import com.ruoyi.system.api.domain.vo.AuctionGoodsinfoVO;
import java.util.List;
import org.springframework.web.bind.annotation.RequestBody;
/**
@@ -68,4 +69,12 @@
     * @param dto 商品上下架状态对象
     */
    void updStatus(ListStatusDTO dto);
    /**
     * 根据商品id获取正在进行的拍卖商品
     *
     * @param id 商品id
     * @return
     */
    List<AuctionGoods> getAuctionGoodsBySkuId(Long id);
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionSalesroomGoodsService.java
@@ -1,16 +1,15 @@
package com.ruoyi.auction.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO;
import com.ruoyi.auction.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.vo.AuctionBidRecordVO;
import com.ruoyi.system.api.domain.vo.AuctionSalesroomGoodsInfoVO;
import com.ruoyi.system.api.domain.vo.AuctionSalesroomVO;
import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * <p>
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionSalesroomService.java
@@ -17,6 +17,7 @@
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.system.api.domain.AppMiniLoginVO;
import com.ruoyi.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.BidDTO;
@@ -196,4 +197,14 @@
    void stopCurrentAuctionSalesroom(Long auctionSalesroomId) throws JsonProcessingException;
    List<AuctionSalesroom> getAuctionSalesroomByIds(Collection<Long> auctionSalesroomGoodsIdSet);
    /**
     * 根据商品id获取正在进行的拍卖会
     *
     * @param id 商品id
     * @return
     */
    List<AuctionSalesroom> getAuctionSalesroomBySkuId(Long id);
    AuctionSalesroomGoods getAuctionSalesroomGoodsById(Long goodsSkuId);
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionBidRecordServiceImpl.java
@@ -3,14 +3,14 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.auction.domain.AuctionBidRecord;
import com.ruoyi.auction.domain.AuctionSalesroomGoods;
import com.ruoyi.auction.mapper.AuctionBidRecordMapper;
import com.ruoyi.auction.mapper.AuctionSalesroomGoodsMapper;
import com.ruoyi.auction.service.IAuctionBidRecordService;
import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
import com.ruoyi.common.core.enums.BidStatusEnum;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -34,6 +34,7 @@
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.page.BeanUtils;
import com.ruoyi.common.core.utils.page.CollUtils;
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.system.api.constants.ConfigEnum;
import com.ruoyi.system.api.constants.NotificationTypeConstant;
@@ -247,7 +248,19 @@
            auctionGoodsOrg.setSharePic(dto.getSharePic());
            this.updateById(auctionGoodsOrg);
        }
        auctionAsyncMethodService.auctionGoodsScheduleTask(Lists.newArrayList(auctionGoods));
        if (auctionGoods.getEndTime().isBefore(LocalDateTime.now())) {
            // 退回剩余库存
            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
            goodsStockUpdDTO.setAuctionStock(auctionGoods.getAuctionStock());
            goodsStockUpdDTO.setGoodsSkuId(auctionGoods.getGoodsSkuId());
            goodsSkuClient.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO),
                    SecurityConstants.INNER);
            auctionGoods.setStartStatus(AuctionStartStatusEnum.ENDED);
            this.updateById(auctionGoods);
        } else {
            auctionAsyncMethodService.auctionGoodsScheduleTask(Lists.newArrayList(auctionGoods));
        }
    }
    /**
@@ -409,7 +422,8 @@
                for (OrderAuctionBond orderAuctionBond : auctionBondList) {
                    // 已中标需在订单完成后退保证金
                    if (unRefundMemberIdList.contains(orderAuctionBond.getMemberId())) {
                    if (unRefundMemberIdList.contains(orderAuctionBond.getMemberId())
                            || Objects.isNull(orderAuctionBond.getBond())) {
                        continue;
                    }
                    RefundDTO refundDTO = new RefundDTO();
@@ -420,10 +434,10 @@
                // 远程调用订单服务进行退款
                Map<String, Object> data = orderClient.refund(refundDTOList,
                        SecurityConstants.INNER).getData();
                if (CollUtils.isNotEmpty(data)) {
                // 处理退款返回结果
                List<String> successfulOrders = new ArrayList<>();
                List<String> failedOrders = new ArrayList<>();
                data.forEach((key, value) -> {
                    if ((boolean) value) {
                        successfulOrders.add(key);
@@ -439,9 +453,11 @@
                    }
                    return null;
                }).filter(Objects::nonNull).collect(Collectors.toList());
                // 远程调用订单服务修改订单状态
                orderClient.updateOrderAuctionBondStatus(ids, BondStatusEnum.REFUNDED,
                        SecurityConstants.INNER);
                }
            }
        }
    }
@@ -901,6 +917,19 @@
        this.updateById(auctionGoods);
    }
    /**
     * 根据商品id获取正在进行的拍卖商品
     *
     * @param id 商品id
     * @return
     */
    @Override
    public List<AuctionGoods> getAuctionGoodsBySkuId(Long id) {
        return this.list(new LambdaQueryWrapper<AuctionGoods>().eq(AuctionGoods::getGoodsSkuId,
                        id).eq(AuctionGoods::getListingStatus, ListingStatusEnum.ON_SHELVES)
                .eq(AuctionGoods::getStartStatus, AuctionStartStatusEnum.IN_AUCTION));
    }
    public static void main(String[] args) throws JsonProcessingException {
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("notification_type", NotificationTypeConstant.AUCTION_GOODS);
@@ -910,4 +939,5 @@
        String msg = objectMapper.writeValueAsString(map);
        System.out.println(msg);
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomGoodsServiceImpl.java
@@ -8,7 +8,6 @@
import com.google.common.collect.Lists;
import com.ruoyi.auction.domain.AuctionBidRecord;
import com.ruoyi.auction.domain.AuctionBondJl;
import com.ruoyi.auction.domain.AuctionSalesroomGoods;
import com.ruoyi.auction.mapper.AuctionBidRecordMapper;
import com.ruoyi.auction.mapper.AuctionBondJlMapper;
import com.ruoyi.auction.mapper.AuctionSalesroomGoodsMapper;
@@ -26,13 +25,28 @@
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.system.api.constants.NotificationTypeConstant;
import com.ruoyi.system.api.domain.*;
import com.ruoyi.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.CustomConfig;
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.GoodsSeries;
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.Order;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.AuctionSalesroomGoodsInfoDTO;
import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO;
import com.ruoyi.system.api.domain.dto.OrderDTO;
import com.ruoyi.system.api.domain.vo.*;
import com.ruoyi.system.api.domain.vo.AuctionBidRecordVO;
import com.ruoyi.system.api.domain.vo.AuctionSalesroomGoodsInfoVO;
import com.ruoyi.system.api.domain.vo.AuctionSalesroomVO;
import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO;
import com.ruoyi.system.api.domain.vo.GoodsInfoTitleValueVO;
import com.ruoyi.system.api.domain.vo.getHomeGoodsSkuXxiVO;
import com.ruoyi.system.api.feignClient.GoodsSkuClient;
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.feignClient.OrderClient;
@@ -40,7 +54,13 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -24,7 +24,10 @@
import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomGoodsVO;
import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomScreenVO;
import com.ruoyi.auction.controller.management.vo.MgtAuctionSalesroomVO;
import com.ruoyi.auction.domain.*;
import com.ruoyi.auction.domain.AuctionBidRecord;
import com.ruoyi.auction.domain.AuctionBondJl;
import com.ruoyi.auction.domain.AuctionBrowseRecord;
import com.ruoyi.auction.domain.AuctionVideo;
import com.ruoyi.auction.mapper.AuctionBidRecordMapper;
import com.ruoyi.auction.mapper.AuctionBondJlMapper;
import com.ruoyi.auction.mapper.AuctionSalesroomGoodsMapper;
@@ -60,6 +63,7 @@
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.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.CustomConfig;
import com.ruoyi.system.api.domain.GoodsSku;
import com.ruoyi.system.api.domain.Member;
@@ -1732,4 +1736,32 @@
                        Collectors.toSet());
        return this.listByIds(auctionSalesroomIdSet);
    }
    /**
     * 根据商品id获取正在进行的拍卖会
     *
     * @param id 商品id
     * @return
     */
    @Override
    public List<AuctionSalesroom> getAuctionSalesroomBySkuId(Long id) {
        List<AuctionSalesroomGoods> auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectList(
                new LambdaQueryWrapper<AuctionSalesroomGoods>().eq(
                                AuctionSalesroomGoods::getGoodsSkuId, id)
                        .groupBy(AuctionSalesroomGoods::getAuctionSalesroomId));
        if (CollUtils.isNotEmpty(auctionSalesroomGoods)) {
            Set<Long> auctionSalesroomIdSet = auctionSalesroomGoods.stream()
                    .map(AuctionSalesroomGoods::getAuctionSalesroomId).collect(
                            Collectors.toSet());
            return this.lambdaQuery()
                    .eq(AuctionSalesroom::getStatus, AuctionStartStatusEnum.IN_AUCTION).in(
                            AuctionSalesroom::getId, auctionSalesroomGoods).list();
        }
        return CollUtils.emptyList();
    }
    @Override
    public AuctionSalesroomGoods getAuctionSalesroomGoodsById(Long goodsSkuId) {
        return auctionSalesroomGoodsMapper.selectById(goodsSkuId);
    }
}
ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionVideoServiceImpl.java
@@ -3,16 +3,16 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.system.api.domain.dto.ForepartAuctionVideo;
import com.ruoyi.auction.domain.AuctionSalesroomGoods;
import com.ruoyi.auction.domain.AuctionVideo;
import com.ruoyi.auction.mapper.AuctionSalesroomGoodsMapper;
import com.ruoyi.auction.mapper.AuctionVideoMapper;
import com.ruoyi.auction.service.IAuctionVideoService;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.PromotionVideo;
import com.ruoyi.system.api.domain.dto.ForepartAuctionVideo;
import com.ruoyi.system.api.feignClient.PromotionClient;
import java.util.List;
import javax.annotation.Resource;
ruoyi-modules/ruoyi-auction/src/main/resources/mapper/auction/AuctionSalesroomGoodsMapper.xml
@@ -20,7 +20,7 @@
    </foreach>
  </update>
  <select id="getAuctionSalesroomGoods"
    resultType="com.ruoyi.auction.domain.AuctionSalesroomGoods">
    resultType="com.ruoyi.system.api.domain.AuctionSalesroomGoods">
        SELECT * FROM t_auction_salesroom_goods ta
        WHERE ta.del_flag = 0
        <if test="param.auctionSalesroomId!=null and param.auctionSalesroomId != ''">
ruoyi-modules/ruoyi-auction/src/test/java/com/ruoyi/auction/RedissonTest.java
New file
@@ -0,0 +1,72 @@
package com.ruoyi.auction;
import com.alibaba.fastjson2.JSON;
import com.google.common.collect.Lists;
import com.google.zxing.WriterException;
import com.ruoyi.auction.util.CreateQrCode;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.system.api.RemoteFileService;
import com.ruoyi.system.api.domain.Order;
import com.ruoyi.system.api.feignClient.OrderClient;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.web.multipart.MultipartFile;
/**
 * @author mitao
 * @date 2024/5/31
 */
@SpringBootTest
@Slf4j
public class RedissonTest {
    @Resource
    private RedissonClient redissonClient;
    @Resource
    private RemoteFileService remoteFileService;
    @Resource
    private OrderClient orderClient;
    @Test
    public void test() {
   //创建5个线程,模拟并发,同时执行excute()方法
        for (int i = 0; i < 5; i++) {
            final int key = i;
            new Thread(() -> {
                execute(key);
            }).start();
        }
    }
    private void execute(Integer key){
        String goodsLock = "goods_lock:" + key;
        RLock redissonClientLock = redissonClient.getLock(goodsLock);
        try {
            redissonClientLock.lock(30, TimeUnit.SECONDS);
            if (redissonClientLock.isLocked()) {
                log.info("execute:{}",key);
            }
        } finally {
            redissonClientLock.unlock();
        }
    }
    @Test
    public void test2() throws IOException, WriterException {
        MultipartFile file = CreateQrCode.createQRCodeStream("123456");
        String data = remoteFileService.obsUpload(file).getData();
        System.out.println("data:"+data);
    }
    @Test
    public void test3() {
        List<Order> orderVOList = orderClient.getOrderListByMubres(  Lists.newArrayList("cc219177-0494-47c5-a1a5-67ccb00547b7", "45675c47-3f00-4c52-ada9-b2be52ea8cb1"),
                SecurityConstants.INNER).getData();
        System.err.println(JSON.toJSONString(orderVOList));
    }
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/inner/GoodsSkuController.java
@@ -1,17 +1,23 @@
package com.ruoyi.goods.controller.inner;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
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.Order;
import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
@@ -95,11 +101,23 @@
     * 根据商品id集合查询商品
     *
     * @param goodsIdList 商品id集合
     * @param source      请求来源
     * @return 商品集合
     */
    @InnerAuth
    @PostMapping("/list")
    R<List<GoodsSku>> getGoodsListByIds(@RequestBody Collection<Long> goodsIdList) {
        return R.ok(iGoodsSkuService.listByIds(goodsIdList));
    }
    /**
     * 退款退货订单退库存
     *
     * @param order
     */
    @InnerAuth
    @PostMapping("/returnStockByOrder")
    R<?> returnStockByOrder(@RequestBody Order order) {
        iGoodsSkuService.returnStockByOrder(order);
        return R.ok();
    }
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/IGoodsSkuService.java
@@ -7,14 +7,14 @@
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.Order;
import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
import com.ruoyi.system.api.domain.dto.ListStatusDTO;
import com.ruoyi.system.api.domain.vo.HomeGoodsSkuInfoVO;
import com.ruoyi.system.api.domain.vo.HomeGoodsSkuListVO;
import java.util.List;
import com.ruoyi.system.api.domain.vo.getHomeGoodsSkuXxiVO;
import java.util.List;
import org.springframework.web.bind.annotation.RequestBody;
/**
@@ -75,4 +75,6 @@
    List<getHomeGoodsSkuXxiVO> getHomeGoodsSkuXxi(@RequestBody HomeGoodsSkuDTO homeGoodsSkuDTO);
    List<getHomeGoodsSkuXxiVO>   getMsHomeGoodsSkuXxi(@RequestBody HomeGoodsSkuDTO homeGoodsSkuDTO);
    GoodsSkuVO getGoodsDetail(Long id);
    void returnStockByOrder(Order order);
}
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsGroupPurchaseServiceImpl.java
@@ -47,6 +47,7 @@
import com.ruoyi.system.api.domain.vo.WdGoodsGroupPurchaseVO;
import com.ruoyi.system.api.feignClient.OrderClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -144,7 +145,13 @@
                        goodsSku.getSkuName()));
            }
        }
        asyncMethodService.groupPurchaseScheduleTask(Lists.newArrayList(goodsGroupPurchase));
        if (goodsGroupPurchase.getEndTime().isBefore(LocalDateTime.now())) {
            goodsGroupPurchase.setStartStatus(StartStatusEnum.ENDED);
            goodsGroupPurchase.setGroupStatus(GroupStatusEnum.GROUP_FAILURE);
            this.updateById(goodsGroupPurchase);
        } else {
            asyncMethodService.groupPurchaseScheduleTask(Lists.newArrayList(goodsGroupPurchase));
        }
    }
    /**
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSeckillServiceImpl.java
@@ -142,7 +142,12 @@
            goodsStockUpdDTO.setAuctionStock(seckillStock * -1);
            goodsStockUpdDTO.setGoodsSkuId(goodsSku.getId());
            goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
            asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill));
            if (goodsSeckill.getEndTime().isBefore(LocalDateTime.now())) {
                goodsSeckill.setStartStatus(StartStatusEnum.ENDED);
                this.updateById(goodsSeckill);
            } else {
                asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckill));
            }
        }
    }
@@ -181,15 +186,29 @@
        if (goodsSku.getStock() < upd.getSeckillStock()) {
            throw new ServiceException("编辑失败,商品库存不足");
        }
        Optional<GoodsSeckill> seckillOpt = this.lambdaQuery()
                .ne(GoodsSeckill::getStartStatus, StartStatusEnum.ENDED)
                .ne(GoodsSeckill::getId, goodsSeckill.getId())
                .eq(GoodsSeckill::getGoodsSkuId, goodsSeckill.getGoodsSkuId()).oneOpt();
        if (seckillOpt.isPresent()) {
            throw new ServiceException("编辑失败,商品在该时间段内有其他秒杀活动");
        }
        GoodsSeckill goodsSeckillUpd = BeanUtils.copyBean(upd, GoodsSeckill.class);
        goodsSeckillUpd.setListingStatus(ListingStatusEnum.ON_SHELVES);
        goodsSeckillUpd.setStartStatus(StartStatusEnum.NOT_STARTED);
        this.updateById(goodsSeckillUpd);
        GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
        goodsStockUpdDTO.setAuctionStock(upd.getSeckillStock() * -1);
        goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId());
        goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
        asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckillUpd));
        if (goodsSeckillUpd.getEndTime().isBefore(LocalDateTime.now())) {
            goodsSeckillUpd.setStartStatus(StartStatusEnum.ENDED);
            this.updateById(goodsSeckillUpd);
        } else {
            // 修改库存
            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
            goodsStockUpdDTO.setAuctionStock(upd.getSeckillStock() * -1);
            goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId());
            goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
            asyncMethodService.seckillScheduleTask(Lists.newArrayList(goodsSeckillUpd));
        }
    }
    /**
@@ -204,7 +223,8 @@
            throw new ServiceException("秒杀商品不存在");
        }
        goodsSeckill.setListingStatus(dto.getListingStatus());
        if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)) {
        if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)
                && !goodsSeckill.getStartStatus().equals(StartStatusEnum.ENDED)) {
            // 退回剩余库存
            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
            goodsStockUpdDTO.setAuctionStock(goodsSeckill.getSeckillStock());
@@ -280,12 +300,17 @@
        log.info(">>>>>>>>>>>>>>>>>>>>{}秒杀结束<<<<<<<<<<<<<<<<<<<<", seckillId);
        GoodsSeckill goodsSeckill = this.getById(seckillId);
        if (StringUtils.isNotNull(goodsSeckill)
                && goodsSeckill.getStartStatus().equals(StartStatusEnum.STARTED)) {
                && !goodsSeckill.getStartStatus().equals(StartStatusEnum.ENDED)) {
            //结束秒杀
            this.lambdaUpdate().set(GoodsSeckill::getStartStatus, StartStatusEnum.ENDED)
                    .eq(GoodsSeckill::getId, seckillId).update();
//            将秒杀商品从缓存中移除
            redisService.deleteObject(CacheConstants.SECKILL_GOODS + goodsSeckill.getId());
            // 退回剩余库存
            GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO();
            goodsStockUpdDTO.setAuctionStock(goodsSeckill.getSeckillStock());
            goodsStockUpdDTO.setGoodsSkuId(goodsSeckill.getGoodsSkuId());
            goodsSkuService.updGoodsStock(Lists.newArrayList(goodsStockUpdDTO));
        }
        Map<String, Object> map = new ConcurrentHashMap<>();
        map.put("notification_type", NotificationTypeConstant.SECKILL);
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/GoodsSkuServiceImpl.java
@@ -7,7 +7,9 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
import com.ruoyi.common.core.enums.ListingStatusEnum;
import com.ruoyi.common.core.enums.OrderFromEnum;
import com.ruoyi.common.core.enums.StartStatusEnum;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
@@ -29,6 +31,9 @@
import com.ruoyi.goods.service.IGoodsInfoTitleValueService;
import com.ruoyi.goods.service.IGoodsSkuService;
import com.ruoyi.goods.service.IMemberGoodsCollectionService;
import com.ruoyi.system.api.domain.AuctionGoods;
import com.ruoyi.system.api.domain.AuctionSalesroom;
import com.ruoyi.system.api.domain.AuctionSalesroomGoods;
import com.ruoyi.system.api.domain.GoodsBrand;
import com.ruoyi.system.api.domain.GoodsCategory;
import com.ruoyi.system.api.domain.GoodsFlavorType;
@@ -44,6 +49,7 @@
import com.ruoyi.system.api.domain.vo.HomeGoodsSkuInfoVO;
import com.ruoyi.system.api.domain.vo.HomeGoodsSkuListVO;
import com.ruoyi.system.api.domain.vo.getHomeGoodsSkuXxiVO;
import com.ruoyi.system.api.feignClient.AuctionClient;
import com.ruoyi.system.api.feignClient.GoodsSkuClient;
import com.ruoyi.system.api.feignClient.OrderClient;
import java.time.LocalDate;
@@ -82,7 +88,7 @@
    private final GoodsSeckillMapper goodsSeckillMapper;
    private final GoodsGroupPurchaseMapper goodsGroupPurchaseMapper;
    private final RedissonClient redissonClient;
    private final AuctionClient auctionClient;
    @Resource
    private IGoodsBrowseRecordService iGoodsBrowseRecordService;
@@ -222,8 +228,40 @@
                .eq(GoodsSku::getId, dto.getId())
                .set(GoodsSku::getListingStatus, dto.getListingStatus())
                .update();
        //关联的秒杀商品和团购商品同步下架
        if (dto.getListingStatus().equals(ListingStatusEnum.REMOVED_FROM_THE_SHELF)) {
            // 校验是否有秒杀活动商品
            Long seckillCount = goodsSeckillMapper.selectCount(
                    new LambdaQueryWrapper<GoodsSeckill>().eq(GoodsSeckill::getGoodsSkuId,
                                    dto.getId())
                            .eq(GoodsSeckill::getStartStatus, StartStatusEnum.STARTED)
                            .eq(GoodsSeckill::getListingStatus, ListingStatusEnum.ON_SHELVES));
            if (seckillCount > 0) {
                throw new ServiceException("该商品有秒杀活动商品正在进行中,不能下架");
            }
            // 校验是否有团购活动商品
            Long groupCount = goodsGroupPurchaseMapper.selectCount(
                    new LambdaQueryWrapper<GoodsGroupPurchase>().eq(
                                    GoodsGroupPurchase::getGoodsSkuId,
                                    dto.getId())
                            .eq(GoodsGroupPurchase::getStartStatus, StartStatusEnum.STARTED)
                            .eq(GoodsGroupPurchase::getListingStatus,
                                    ListingStatusEnum.ON_SHELVES));
            if (groupCount > 0) {
                throw new ServiceException("该商品有团购活动商品正在进行中,不能下架");
            }
            // 校验是否有拍卖会商品
            List<AuctionSalesroom> auctionSalesrooms = auctionClient.getAuctionSalesroomBySkuId(
                    dto.getId(), SecurityConstants.INNER).getData();
            if (CollUtils.isNotEmpty(auctionSalesrooms)) {
                throw new ServiceException("该商品有拍卖会商品正在进行中,不能下架");
            }
            List<AuctionGoods> auctionGoodsList = auctionClient.getAuctionGoodsBySkuId(dto.getId(),
                    SecurityConstants.INNER).getData();
            if (CollUtils.isNotEmpty(auctionGoodsList)) {
                throw new ServiceException("该商品有商品竞价商品正在进行中,不能下架");
            }
            // 关联的秒杀商品和团购商品同步下架
            updateGoodsStatus(dto);
        }
    }
@@ -233,7 +271,7 @@
        queryWrapper.eq(GoodsSeckill::getListingStatus, ListingStatusEnum.ON_SHELVES)
                .eq(GoodsSeckill::getGoodsSkuId, dto.getId());
        List<GoodsSeckill> goodsSeckillList = goodsSeckillMapper.selectList(queryWrapper);
        if (StringUtils.isNotNull(goodsSeckillList)) {
        if (StringUtils.isNotEmpty(goodsSeckillList)) {
            goodsSeckillList = goodsSeckillList.stream().peek(goodsSeckill -> {
                goodsSeckill.setListingStatus(ListingStatusEnum.REMOVED_FROM_THE_SHELF);
            }).collect(Collectors.toList());
@@ -652,4 +690,43 @@
        goodsSkuVO.setGoodsInfoTitleValueVOList(goodsInfoTitleValueVOList);
        return goodsSkuVO;
    }
    @Override
    public void returnStockByOrder(Order order) {
        Long goodsSkuId = null;
        if (order.getOrderFrom().equals(OrderFromEnum.COMMODITY_ORDER)) {
            goodsSkuId = order.getGoodsSkuId();
        } else if (order.getOrderFrom().equals(OrderFromEnum.SNAP_ORDERS)) {
            GoodsSeckill goodsSeckill = goodsSeckillMapper.selectById(order.getGoodsSkuId());
            if (Objects.nonNull(goodsSeckill)) {
                goodsSkuId = goodsSeckill.getGoodsSkuId();
            }
        } else if (order.getOrderFrom().equals(OrderFromEnum.GROUP_PURCHASE_ORDERS)) {
            GoodsGroupPurchase goodsGroupPurchase = goodsGroupPurchaseMapper.selectById(
                    order.getGoodsSkuId());
            if (Objects.nonNull(goodsGroupPurchase)) {
                goodsSkuId = goodsGroupPurchase.getGoodsSkuId();
            }
        } else if (order.getOrderFrom()
                .equals(OrderFromEnum.AUCTION_ORDERS) && order.getAuctionOrderType()
                .equals(AuctionOrderTypeEnum.REGULAR_ITEMS)) {
            AuctionGoods auctionGoods = auctionClient.getAuctionGoodsId(order.getGoodsSkuId(),
                    SecurityConstants.INNER).getData();
            if (Objects.nonNull(auctionGoods)) {
                goodsSkuId = auctionGoods.getGoodsSkuId();
            }
        } else if (order.getOrderFrom()
                .equals(OrderFromEnum.AUCTION_ORDERS) && order.getAuctionOrderType()
                .equals(AuctionOrderTypeEnum.AUCTION_ITEMS)) {
            AuctionSalesroomGoods auctionSalesroomGoods = auctionClient.getAuctionSalesroomGoodsById(
                    order.getGoodsSkuId(),
                    SecurityConstants.INNER).getData();
            if (Objects.nonNull(auctionSalesroomGoods)) {
                goodsSkuId = auctionSalesroomGoods.getGoodsSkuId();
            }
        }
        if (Objects.nonNull(goodsSkuId)) {
            updateGoodsStock(goodsSkuId, order.getGoodsQuantity());
        }
    }
}
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsGroupPurchaseMapper.xml
@@ -17,11 +17,29 @@
  <select id="getGoodsGroupPurchasePage"
    resultType="com.ruoyi.goods.controller.management.vo.GoodsGroupPurchaseVO">
    SELECT
    tgp.*,
    tgp.id,
    tgp.goods_sku_id,
    tgp.share_title,
    tgp.share_pic,
    tgp.group_purchase_price,
    tgp.group_size,
    IFNULL(tgpi.current_number,0) AS current_number,
    tgp.limit_number,
    tgp.start_time,
    tgp.end_time,
    tgp.description,
    tgp.start_status,
    tgp.listing_status,
    tgp.group_status,
    tgp.group_time,
    tgp.create_time,
    tgp.update_time,
    tgs.sku_name AS goodsSkuName
    FROM
    t_goods_group_purchase tgp
    LEFT JOIN t_goods_sku tgs ON tgp.goods_sku_id = tgs.id
    LEFT JOIN (SELECT current_number,group_purchase_id FROM t_goods_group_purchase_info WHERE
    group_status = 0) tgpi ON tgp.id = tgpi.group_purchase_id
    <where>
      <if test="goodsSkuName != null and goodsSkuName != ''">
        AND tgs.sku_name LIKE CONCAT('%',#{goodsSkuName},'%')
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/management/dto/MgtMemberQuery.java
@@ -23,4 +23,7 @@
    @ApiModelProperty(value = "联系电话")
    private String phone;
    @ApiModelProperty(value = "会员等级")
    private String level;
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberServiceImpl.java
@@ -518,6 +518,7 @@
                .like(StringUtils.isNotBlank(query.getRealName()), Member::getRealName,
                        query.getRealName())
                .like(StringUtils.isNotBlank(query.getPhone()), Member::getPhone, query.getPhone())
                .eq(StringUtils.isNotBlank(query.getLevel()), Member::getLevel, query.getLevel())
                .orderByDesc(Member::getCreateTime)
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        if (StringUtils.isEmpty(page.getRecords())) {
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/management/vo/MgtOrderVO.java
@@ -145,7 +145,7 @@
    @ApiModelProperty("物流信息")
    private Express100VO express100VO;
    @ApiModelProperty("是否售后 1未售后,2 售后")
    @ApiModelProperty("是否售后 1未售后,2 售后待审核 3 售后完成")
    private Integer isRequest;
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MemberInvoiceServiceImpl.java
@@ -222,7 +222,7 @@
        this.updateById(memberInvoice);
        // 更新关联订单状态
        List<MemberInvoiceOrder> memberInvoiceOrderList = iMemberInvoiceOrderService.lambdaQuery()
                .eq(MemberInvoiceOrder::getInvoiceId, memberInvoice)
                .eq(MemberInvoiceOrder::getInvoiceId, memberInvoice.getId())
                .list();
        Set<String> orderNoSet = memberInvoiceOrderList.stream()
                .map(MemberInvoiceOrder::getOrderNo)
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java
@@ -66,11 +66,11 @@
        long mallOrderTotalCount = orderList.stream()
                .filter(order -> !order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS))
                .count();
        // 商城订单统计-订单总数
        // 商城订单统计-商城订单
        long mallOrderCount = orderList.stream()
                .filter(order -> order.getOrderFrom().equals(OrderFromEnum.COMMODITY_ORDER))
                .count();
        // 商城订单统计-商城订单
        // 商城订单统计-秒杀订单
        long seckillOrderCount = orderList.stream()
                .filter(order -> order.getOrderFrom().equals(OrderFromEnum.SNAP_ORDERS))
                .count();
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderReturnRequestServiceImpl.java
@@ -36,6 +36,7 @@
import com.ruoyi.system.api.domain.dto.updMembeOneDTO;
import com.ruoyi.system.api.domain.vo.Express100VO;
import com.ruoyi.system.api.domain.vo.OrderReturnVO;
import com.ruoyi.system.api.feignClient.GoodsSkuClient;
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.feignClient.PromotionClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
@@ -79,7 +80,8 @@
    @Resource
    private PromotionClient promotionClient;
    @Resource
    private GoodsSkuClient goodsSkuClient;
    @Override
    public OrderReturnVO saveOrderReturnRequest(OrderReturnDTO OrderReturnDTO) {
        Order order = orderMapper.selectById(OrderReturnDTO.getOrderId());
@@ -179,7 +181,7 @@
        order.setOrderStatus(OrderStatusEnum.FINISHED);
        order.setIsRequest(1);
        orderMapper.updateById(order);
        this.removeById(byId);
        this.updateById(byId);
    }
    @Override
@@ -188,6 +190,7 @@
        byId.setStatus(ReturnRequestStatusEnum.TO_BE_RECEIVED_BY_THE_PLATFORM);
        byId.setLogisticsNum(OrderReturnDTO.getLogistics());
        byId.setCourierNumber(OrderReturnDTO.getCourierNumber());
        byId.setReturnTime(LocalDateTime.now());
        this.updateById(byId);
    }
@@ -300,6 +303,12 @@
                        }
                    }
                }
                if (Objects.nonNull(order.getCouponId())) {
                    CouponMemberDTO couponMemberDTO = new CouponMemberDTO();
                    couponMemberDTO.setId(order.getCouponId());
                    couponMemberDTO.setCouponStatus(CouponUseEnum.UNUSED.getCode());
                    promotionClient.updCouponMember(couponMemberDTO, SecurityConstants.INNER);
                }
            }
            orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED);
            // 扣除订单积分
@@ -319,12 +328,6 @@
                updMembeOneDTO.setTotalPoints(
                        Math.max(member.getTotalPoints() - order.getPoints(), 0));
                memberClient.updMembeOne(updMembeOneDTO, SecurityConstants.INNER);
            }
            if (Objects.nonNull(order.getCouponId())) {
                CouponMemberDTO couponMemberDTO = new CouponMemberDTO();
                couponMemberDTO.setId(order.getCouponId());
                couponMemberDTO.setCouponStatus(CouponUseEnum.UNUSED.getCode());
                promotionClient.updCouponMember(couponMemberDTO, SecurityConstants.INNER);
            }
        } else {
            orderReturnRequest.setStatus(ReturnRequestStatusEnum.REJECTED);
@@ -400,6 +403,9 @@
            dto.setCouponStatus(CouponUseEnum.UNUSED.getCode());
            promotionClient.updCouponMember(dto, SecurityConstants.INNER);
        }
        // 退回剩余库存
        goodsSkuClient.returnStockByOrder(order, SecurityConstants.INNER);
    }
    private boolean handleRefund(PaymentMethodEnum paymentMethod, Paylog paylog, String orderNo) {
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -7,11 +7,11 @@
import com.google.common.collect.Lists;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.enums.*;
import com.ruoyi.common.core.enums.AuctionOrderTypeEnum;
import com.ruoyi.common.core.enums.AuditStatusEnum;
import com.ruoyi.common.core.enums.BondStatusEnum;
import com.ruoyi.common.core.enums.CouponUseEnum;
import com.ruoyi.common.core.enums.GroupStatusEnum;
import com.ruoyi.common.core.enums.OrderFromEnum;
import com.ruoyi.common.core.enums.OrderStatusEnum;
import com.ruoyi.common.core.enums.OrderTypeEnum;
@@ -65,7 +65,11 @@
import com.ruoyi.system.api.domain.dto.MgtAfterSaleSettingDTO;
import com.ruoyi.system.api.domain.dto.OrderDTO;
import com.ruoyi.system.api.domain.dto.updMembeOneDTO;
import com.ruoyi.system.api.domain.vo.*;
import com.ruoyi.system.api.domain.vo.Express100VO;
import com.ruoyi.system.api.domain.vo.MemberOrderListVO;
import com.ruoyi.system.api.domain.vo.MemberOrderNumVO;
import com.ruoyi.system.api.domain.vo.MemberTiOrderVO;
import com.ruoyi.system.api.domain.vo.OrderVO;
import com.ruoyi.system.api.feignClient.AuctionClient;
import com.ruoyi.system.api.feignClient.GoodsSkuClient;
import com.ruoyi.system.api.feignClient.MemberClient;
@@ -80,6 +84,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
@@ -168,6 +173,9 @@
            order.setOrderFrom(OrderFromEnum.AUCTION_ORDERS);
            order.setOrderNo(OrderUtil.getOrderNoForPrefix("PM"));
            order.setIsOrder(1);
            if (OrderDTO.getAuctionType().equals(AuctionOrderTypeEnum.AUCTION_ITEMS)) {
                order.setAuctionSalesroomId(OrderDTO.getAuctionSalesroomId());
            }
        }
        order.setOrderTime(OrderDTO.getOrderTime());
        order.setOrderFrom(OrderDTO.getOrderFrom());
@@ -908,6 +916,7 @@
            LambdaQueryWrapper<OrderAuctionBond> wrapper3= Wrappers.lambdaQuery();
            wrapper3.eq(OrderAuctionBond::getOrderId,order.getId());
            wrapper3.or().eq(OrderAuctionBond::getOrderNo, order.getOrderNo());
            OrderAuctionBond orderAuctionBond = orderAuctionBondMapper.selectOne(wrapper3);
            if (orderAuctionBond!=null){
                if (orderAuctionBond.getBoundStatus().getCode()==1||orderAuctionBond.getBoundStatus().getCode()==2){
@@ -1368,7 +1377,9 @@
     */
    @Override
    public List<Order> getOrderByCouponIds(Collection<Long> couponIds) {
        return this.lambdaQuery().in(Order::getCouponId, couponIds).list();
        return this.lambdaQuery().in(Order::getCouponId, couponIds)
                .ne(Order::getOrderStatus, OrderStatusEnum.CANCELED).eq(Order::getIsRequest, 1)
                .list();
    }
    /**
@@ -1417,6 +1428,8 @@
                        query.getSkuName())
                .eq(StringUtils.isNotNull(query.getOrderStatus()), Order::getOrderStatus,
                        query.getOrderStatus())
                .eq(StringUtils.isNotNull(query.getOrderStatus()) && query.getOrderStatus()
                        .equals(OrderStatusEnum.FINISHED), Order::getIsRequest, 1)
                .orderByDesc(Order::getCreateTime)
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        if (StringUtils.isEmpty(page.getRecords())) {
@@ -1424,6 +1437,22 @@
        }
        pageVO = PageDTO.of(page, MgtOrderVO.class);
        List<MgtOrderVO> voList = pageVO.getList();
        List<Long> orderIdList = voList.stream().filter(order -> order.getIsRequest().equals(2))
                .map(MgtOrderVO::getId).collect(
                        Collectors.toList());
        if (CollUtils.isNotEmpty(orderIdList)) {
            List<OrderReturnRequest> orderReturnRequestList = orderReturnRequestService.lambdaQuery()
                    .in(OrderReturnRequest::getOrderId, orderIdList)
                    .eq(OrderReturnRequest::getAuditStatus, AuditStatusEnum.PASSED).list();
            List<Long> orderReturnRequestPassedIds = orderReturnRequestList.stream()
                    .map(OrderReturnRequest::getOrderId)
                    .collect(Collectors.toList());
            for (MgtOrderVO order : voList) {
                if (orderReturnRequestPassedIds.contains(order.getId())) {
                    order.setIsRequest(3);
                }
            }
        }
        if (query.getQueryType() == OrderTypeEnum.AUCTION_ORDER) {
            List<MgtOrderVO> list = voList;
            // 封装参数查询拍卖会
@@ -1440,9 +1469,6 @@
                salesroomMap = auctionSalesroomList.stream()
                        .collect(Collectors.toMap(AuctionSalesroom::getId,
                                AuctionSalesroom::getSalesroomName));
                auctionSalesroomList.stream()
                        .map(AuctionSalesroom::getId)
                        .collect(Collectors.toSet());
            }
            // 封装参数查询拍卖订单保证金
            Set<Long> auctionGoodsIdSet = list.stream()
@@ -1627,36 +1653,38 @@
            throw new ServiceException("该订单已是售后状态");
        }
        String orderNo = order.getOrderNo();
        Paylog paylog = iPaylogService.lambdaQuery().eq(Paylog::getOutTradeNo, orderNo)
                .last("limit 1").one();
        Optional<Paylog> paylogOpt = iPaylogService.lambdaQuery().eq(Paylog::getOutTradeNo, orderNo)
                .last("limit 1").oneOpt();
        PaymentMethodEnum paymentMethod = order.getPaymentMethod();
        if (StringUtils.isNotNull(paylog)) {
        if (paylogOpt.isPresent()) {
            Paylog paylog = paylogOpt.get();
            boolean result = handleRefund(paymentMethod, paylog, orderNo);
            if (result) {
                paylog.setState(3);// 已退款
                iPaylogService.updateById(paylog);
            }
            OrderReturnRequest orderReturnRequest = new OrderReturnRequest();
            orderReturnRequest.setOrderId(id);
            orderReturnRequest.setRequestTime(LocalDateTime.now());
            orderReturnRequest.setRequestType(RequestTypeEnum.REFUND);
            orderReturnRequest.setRequestReason("管理后台退款");
            orderReturnRequest.setStatus(ReturnRequestStatusEnum.COMPLETED);
            orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED);
            orderReturnRequest.setAuditTime(LocalDateTime.now());
            orderReturnRequestService.save(orderReturnRequest);
        }
        order.setIsRequest(2);
        this.updateById(order);
        // 生成售后记录
        OrderReturnRequest orderReturnRequest = new OrderReturnRequest();
        orderReturnRequest.setOrderId(id);
        orderReturnRequest.setRequestTime(LocalDateTime.now());
        orderReturnRequest.setRequestType(RequestTypeEnum.REFUND);
        orderReturnRequest.setRequestReason("管理后台退款");
        orderReturnRequest.setStatus(ReturnRequestStatusEnum.COMPLETED);
        orderReturnRequest.setAuditStatus(AuditStatusEnum.PASSED);
        orderReturnRequest.setAuditTime(LocalDateTime.now());
        orderReturnRequestService.save(orderReturnRequest);
        // 扣除订单积分
        Member member = memberClient.getMembeOne(order.getMemberId(), SecurityConstants.INNER)
                .getData();
        if (StringUtils.isNotNull(member)) {
            MemberPointsDTO memberPointsDTO = new MemberPointsDTO();
            memberPointsDTO.setMemberId(order.getMemberId());
            memberPointsDTO.setPointsType(1);
            memberPointsDTO.setPointsStatus(PointStatusEnum.INCREASE);
            memberPointsDTO.setPointsType(2);
            memberPointsDTO.setPointsStatus(PointStatusEnum.REDUCE);
            memberPointsDTO.setPoints(order.getPoints());
            memberClient.addMemberPoints(memberPointsDTO);
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/tencent/common/Configure.java
@@ -42,7 +42,9 @@
    //HTTPS证书的本地路径
    private static String certLocalPath;
    static{//从服务器相对路径中获取
        certLocalPath = Configure.class.getClassLoader().getResource("").getPath() + "com/ruoyi/order/util/tencent/common/cert/apiclient_cert.p12";
        // certLocalPath = Configure.class.getClassLoader().getResource("").getPath() + "com/ruoyi/order/util/tencent/common/cert/apiclient_cert.p12";
        certLocalPath = Configure.class.getClassLoader().getResource("").getPath()
                + "cert/apiclient_cert.p12";
    }
    
    //HTTPS证书密码,默认密码等于商户号MCHID
@@ -51,7 +53,9 @@
    //HTTPS证书的本地路径
    private static String certLocalPath_2;
    static{//从服务器相对路径中获取
        certLocalPath_2 = Configure.class.getClassLoader().getResource("").getPath() + "com/ruoyi/order/util/tencent/common/cert_2/apiclient_cert.p12";
        // certLocalPath_2 = Configure.class.getClassLoader().getResource("").getPath() + "com/ruoyi/order/util/tencent/common/cert_2/apiclient_cert.p12";
        certLocalPath_2 = Configure.class.getClassLoader().getResource("").getPath()
                + "cert_2/apiclient_cert.p12";
    }    
    
    //HTTPS证书密码,默认密码等于商户号MCHID
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -3,15 +3,13 @@
<mapper namespace="com.ruoyi.order.mapper.OrderMapper">
  <select id="getSeckillMembers" resultType="java.lang.Integer">
    SELECT IFNULL(COUNT(id), 0) AS num
    SELECT COUNT(DISTINCT o.member_id) AS num
    FROM t_order o
    WHERE
      o.goods_sku_id = #{id}
      AND o.order_from=2
      AND o.del_flag=0
      AND o.order_from = 2
      AND o.del_flag = 0
      AND o.order_status IN (2, 3, 4)
    GROUP BY
      o.member_id
  </select>
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/scheduler/PromotionScheduler.java
@@ -20,7 +20,9 @@
    /**
     * 每小时定时检查优惠券过期
     */
    @Scheduled(cron = "0 0 * * * *")
    // 每分钟执行一次
    @Scheduled(cron = "0 0/1 * * * *")
    // @Scheduled(cron = "0 0 * * * *")
    private void timingCheckMemberCoupon() {
        log.info("----------------定时检查优惠券过期任务开始执行----------------");
        couponMemberService.timingCheckMemberCoupon();
ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/CouponMemberMapper.xml
@@ -7,6 +7,6 @@
    SET coupon_status = 2
    WHERE del_flag = 0
      AND coupon_status = 0
      AND end_date &lt; CURDATE()
      AND end_date &lt; CURTIME()
  </update>
</mapper>