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 < CURDATE() AND end_date < CURTIME() </update> </mapper>