ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/constants/ConfigEnum.java
@@ -24,7 +24,10 @@ RETURN_ADDRESS_USER_ADDRESS("RETURN_ADDRESS_USER_ADDRESS",1,"退货地址"), RETURN_CYCLE("RETURN_CYCLE", 1, "退货周期,用户在收货后{}天可申请售后"), MEMBER_POINTS_MONEY("MEMBER_POINTS_MONEY", 1, "会员每实际消费{}元"), MEMBER_POINTS_POINTS("MEMBER_POINTS_POINTS", 1, "可获得{}积分"); MEMBER_POINTS_POINTS("MEMBER_POINTS_POINTS", 1, "可获得{}积分"), WISH_DESCRIPTION("WISH_DESCRIPTION", 1, "心愿求购说明配置"), WISH_SHARE_TITLE("WISH_SHARE_TITLE", 1, "心愿求购分享标题"), WISH_SHARE_IMG_URL("WISH_SHARE_IMG_URL", 1, "心愿求购分享图片"); private final String key; private final Integer keyType; //1=系统配置 private final String keyName; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/Order.java
@@ -46,7 +46,7 @@ @ApiModelProperty(value = "下单时间") private LocalDateTime orderTime; @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单") @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单 5=团购订单") private OrderFromEnum orderFrom; @ApiModelProperty(value = "拍卖订单类型 1=普通拍品 2=拍卖会拍品") ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MemberOrderDTO.java
@@ -1,20 +1,15 @@ package com.ruoyi.system.api.domain.dto; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.enums.OrderStatusEnum; import com.ruoyi.common.core.enums.PaymentMethodEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "用户订单详情传输对象", description = "用户订单详情传输对象") public class MemberOrderDTO { @ApiModelProperty("订单id") private Long id; @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单") @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单 5心愿求购") private Integer orderFrom; @ApiModelProperty(value = "会员id") ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MemberOrderListVO.java
@@ -50,7 +50,7 @@ private OrderStatusEnum orderStatus; @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单") @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单 5=心愿求购") @JsonInclude(JsonInclude.Include.ALWAYS) private OrderFromEnum orderFrom; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MgtPromotionWishRecommendVO.java
New file @@ -0,0 +1,46 @@ package com.ruoyi.system.api.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Data; /** * @author mitao * @date 2024/10/29 */ @Data @ApiModel(value = "心愿求购平台推荐商品视图对象") public class MgtPromotionWishRecommendVO { @ApiModelProperty(value = "推荐商品id") private Long id; @ApiModelProperty(value = "心愿求购id") private Long wishId; @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "商品售价") private BigDecimal sellingPrice; @ApiModelProperty(value = "可购数量") private Integer availableNum; @ApiModelProperty(value = "商品图片") private String goodsImageUrl; @ApiModelProperty(value = "失效时间") private LocalDateTime expireTime; @ApiModelProperty(value = "回复状态 0用户未购买 1用户已购买") private Integer purchaseStatus; @ApiModelProperty(value = "用户已购数量") private Integer purchasedNum; @ApiModelProperty(value = "订单号") private String orderNo; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/OrderVO.java
@@ -30,7 +30,7 @@ @JsonInclude(JsonInclude.Include.ALWAYS) private LocalDateTime orderTime; @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单") @ApiModelProperty(value = "订单来源 1=商品订单 2=秒杀订单 3=团购订单 4=拍卖订单 5=心愿求购") @JsonInclude(JsonInclude.Include.ALWAYS) private OrderFromEnum orderFrom; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java
@@ -14,6 +14,7 @@ import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.OrderUpdDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; import com.ruoyi.system.api.domain.vo.MgtPromotionWishRecommendVO; import com.ruoyi.system.api.domain.vo.OrderVO; import com.ruoyi.system.api.domain.vo.PayInfoVO; import com.ruoyi.system.api.feignClient.OrderClient; @@ -177,15 +178,18 @@ @Override public R<?> updateOrderStatusByMubres1(String formedGroupMubres, String source) { return null; return R.fail("修改订单展示状态失败" + cause.getMessage()); } @Override public R<List<Order>> updateOrderStatusByMubres2(String formedGroupMubres, String source) { return null; return R.fail("修改订单展示状态失败" + cause.getMessage()); } @Override public R<MgtPromotionWishRecommendVO> getWishDataBySkuId(Long id, String source) { return R.fail("获取心愿求购订单数据失败" + cause.getMessage()); } }; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/PromotionFallbackFactory.java
@@ -3,6 +3,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.CouponMember; import com.ruoyi.system.api.domain.PromotionVideo; import com.ruoyi.system.api.domain.PromotionWishRecommend; import com.ruoyi.system.api.domain.dto.CouponMemberDTO; import com.ruoyi.system.api.feignClient.PromotionClient; import java.util.List; @@ -35,6 +36,22 @@ public R<?> updCouponMember(CouponMemberDTO couponMemberDTO, String source) { return R.fail("修改会员优惠券信息失败:" + cause.getMessage()); } @Override public R<PromotionWishRecommend> getPromotionWishRecommend(Long id, String source) { return R.fail("获取推荐商品失败:" + cause.getMessage()); } @Override public R<Integer> subRecommendAvailableNum(Integer goodsQuantity, Long id, String source) { return R.fail("扣减推荐商品可购数量失败:" + cause.getMessage()); } @Override public R<?> addRecommendAvailableNum(Integer goodsQuantity, Long id, String source) { return R.fail("增加推荐商品可购数量失败:" + cause.getMessage()); } }; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java
@@ -16,6 +16,7 @@ import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.OrderUpdDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; import com.ruoyi.system.api.domain.vo.MgtPromotionWishRecommendVO; import com.ruoyi.system.api.domain.vo.OrderVO; import com.ruoyi.system.api.domain.vo.PayInfoVO; import com.ruoyi.system.api.factory.OrderFallbackFactory; @@ -212,4 +213,8 @@ @PostMapping("/order/updOrderStatusByMubres2") R<List<Order>> updateOrderStatusByMubres2(@RequestBody String formedGroupMubres, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @GetMapping("/order/getWishDataBySkuId/{id}") R<MgtPromotionWishRecommendVO> getWishDataBySkuId(@PathVariable("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/PromotionClient.java
@@ -5,13 +5,16 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.CouponMember; import com.ruoyi.system.api.domain.PromotionVideo; import com.ruoyi.system.api.domain.PromotionWishRecommend; import com.ruoyi.system.api.domain.dto.CouponMemberDTO; import com.ruoyi.system.api.factory.PromotionFallbackFactory; import java.util.List; import org.springframework.cloud.openfeign.FeignClient; 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.RequestHeader; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(contextId = "promotionClient", value = ServiceNameConstants.RUOYI_PROMOTION, fallbackFactory = PromotionFallbackFactory.class) public interface PromotionClient { @@ -34,4 +37,29 @@ R<?> updCouponMember(@RequestBody CouponMemberDTO couponMemberDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** * 获取推荐商品 * @param id * @param source * @return */ @PostMapping("/inner/promotion-wish-recommend/{id}") R<PromotionWishRecommend> getPromotionWishRecommend(@PathVariable("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** * 扣减推荐商品库存 * @param goodsQuantity * @param id * @return */ @PostMapping("/inner/promotion-wish-recommend/subAvailableNum") R<Integer> subRecommendAvailableNum(@RequestParam("goodsQuantity") Integer goodsQuantity, @RequestParam("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); @PostMapping("/inner/promotion-wish-recommend/addAvailableNum") R<?> addRecommendAvailableNum(@RequestParam("goodsQuantity") Integer goodsQuantity, @RequestParam("id") Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java
@@ -1,7 +1,7 @@ package com.ruoyi.common.core.domain; import java.io.Serializable; import com.ruoyi.common.core.constant.Constants; import java.io.Serializable; /** * 响应信息主体 @@ -26,7 +26,7 @@ public static <T> R<T> ok() { return restResult(null, SUCCESS, null); return restResult(null, SUCCESS, "操作成功"); } public static <T> R<T> ok(T data) ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/OrderFromEnum.java
@@ -15,7 +15,8 @@ COMMODITY_ORDER(1, "商品"), SNAP_ORDERS(2, "秒杀"), GROUP_PURCHASE_ORDERS(3, "团购"), AUCTION_ORDERS(4, "拍卖"); AUCTION_ORDERS(4, "拍卖"), WISH_ORDER(5, "心愿求购"); @EnumValue private final int code; @JsonValue ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/forepart/ForepartOrderController.java
@@ -1,25 +1,27 @@ package com.ruoyi.order.controller.forepart; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.order.service.IOrderService; import com.ruoyi.order.vo.HomeGoodsSkuDTO1; import com.ruoyi.order.vo.WdOrderVO; import com.ruoyi.system.api.domain.Order; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; import com.ruoyi.system.api.domain.dto.MemberOrderDTO; import com.ruoyi.system.api.domain.dto.MemberOrderListDTO; import com.ruoyi.system.api.domain.vo.*; 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.GoodsSkuClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import javax.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; 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; /** @@ -43,13 +45,13 @@ private GoodsSkuClient goodsSkuClient; @PostMapping("/saveMemberOrder") @ApiOperation(value = "用户端-立即下单") @ApiOperation(value = "【09.25改】用户端-立即下单") public R<MemberTiOrderVO> saveMemberOrder(@RequestBody MemberOrderDTO memberOrderDTO) { return R.ok(orderService.saveMemberOrder(memberOrderDTO)); } @PostMapping("/updMemberOrder") @ApiOperation(value = "用户端-修改订单") @ApiOperation(value = "【09.25改】用户端-修改订单") public R<MemberTiOrderVO> updMemberOrder(@RequestBody MemberOrderDTO memberOrderDTO) { return R.ok(orderService.updMemberOrder(memberOrderDTO)); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java
@@ -12,7 +12,9 @@ import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.dto.OrderUpdDTO; import com.ruoyi.system.api.domain.vo.MgtPromotionWishRecommendVO; import com.ruoyi.system.api.domain.vo.OrderVO; import com.ruoyi.system.api.feignClient.PromotionClient; import java.util.Collection; import java.util.List; import lombok.RequiredArgsConstructor; @@ -43,6 +45,7 @@ public class OrderController { private final IOrderService orderService; private final PromotionClient promotionClient; @PostMapping("/saveOrderOne") @ResponseBody @InnerAuth @@ -247,4 +250,16 @@ orderService.updateOrderStatusByMubres2(formedGroupMubres); return R.ok(); } /** * 根据skuId获取心愿求购详情数据 * * @param id * @return */ @InnerAuth @GetMapping("/getWishDataBySkuId/{id}") R<MgtPromotionWishRecommendVO> getWishDataBySkuId(@PathVariable("id") Long id) { return R.ok(orderService.getWishDataBySkuId(id)); } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java
@@ -12,8 +12,11 @@ import com.ruoyi.system.api.domain.dto.MemberOrderDTO; import com.ruoyi.system.api.domain.dto.MemberOrderListDTO; import com.ruoyi.system.api.domain.dto.OrderDTO; import com.ruoyi.system.api.domain.vo.*; 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.MgtPromotionWishRecommendVO; import com.ruoyi.system.api.domain.vo.OrderVO; import java.time.LocalDateTime; import java.util.Collection; import java.util.List; @@ -158,4 +161,12 @@ void updateOrderStatusByMubres1(String formedGroupMubres); List<Order> updateOrderStatusByMubres2(@RequestBody String formedGroupMubres); /** * 根据skuId获取心愿求购详情数据 * * @param id * @return */ MgtPromotionWishRecommendVO getWishDataBySkuId(Long id); } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -56,6 +56,7 @@ import com.ruoyi.system.api.domain.MemberAddress; import com.ruoyi.system.api.domain.Order; import com.ruoyi.system.api.domain.OrderAuctionBond; import com.ruoyi.system.api.domain.PromotionWishRecommend; import com.ruoyi.system.api.domain.dto.CouponMemberDTO; import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO; import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO; @@ -71,6 +72,7 @@ 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.MgtPromotionWishRecommendVO; import com.ruoyi.system.api.domain.vo.OrderVO; import com.ruoyi.system.api.feignClient.AuctionClient; import com.ruoyi.system.api.feignClient.GoodsSkuClient; @@ -317,6 +319,10 @@ order.setOrderNo(OrderUtil.getOrderNoForPrefix("TG")); order.setIsOrder(2); } if (memberOrderDTO.getOrderFrom() == OrderFromEnum.WISH_ORDER.getCode()) { order.setOrderFrom(OrderFromEnum.WISH_ORDER); order.setOrderNo(OrderUtil.getOrderNoForPrefix("QG")); } if (memberOrderDTO.getPaymentMethod()==1){ order.setPaymentMethod(PaymentMethodEnum.WECHAT); }if (memberOrderDTO.getPaymentMethod()==2){ @@ -461,6 +467,33 @@ order.setSjPrice(goodsSku.getPrice()); order.setGoodsId(goodsSku.getId()); } if (memberOrderDTO.getOrderFrom() == OrderFromEnum.WISH_ORDER.getCode()) { // 远程调用营销服务,获取推荐商品信息 PromotionWishRecommend recommend = promotionClient.getPromotionWishRecommend( memberOrderDTO.getGoodsSkuId(), SecurityConstants.INNER).getData(); if (Objects.isNull(recommend)) { throw new ServiceException("推荐商品不存在"); } if (recommend.getExpireTime().isBefore(LocalDateTime.now())) { throw new ServiceException("推荐商品已过期"); } if (recommend.getAvailableNum().compareTo(memberOrderDTO.getGoodsQuantity()) < 0) { throw new ServiceException("推荐商品可购数量不足"); } // 远程调用,更新可购数量 Integer res = promotionClient.subRecommendAvailableNum( memberOrderDTO.getGoodsQuantity(), recommend.getId(), SecurityConstants.INNER).getData(); if (res == 0) { throw new ServiceException("推荐商品可购数量不足"); } memberOrderVO.setGoodsSkuId(memberOrderDTO.getGoodsSkuId()); memberOrderVO.setPrice(recommend.getSellingPrice()); memberOrderVO.setCoverPic(recommend.getGoodsImageUrl()); memberOrderVO.setSkuName(recommend.getGoodsName()); pice = recommend.getSellingPrice(); } order.setOrderRemark(memberOrderDTO.getOrderRemark()); order.setMemberId(memberOrderDTO.getMemberId()); order.setGoodsQuantity(memberOrderDTO.getGoodsQuantity()); @@ -574,8 +607,6 @@ memberOrderVO.setCoverPic(goodsSku.getCoverPic()); memberOrderVO.setSkuName(goodsSku.getSkuName()); } if (order.getOrderFrom().getCode()==2){ MemberOrderDTO memberOrderDTO1=new MemberOrderDTO(); memberOrderDTO1.setMemberId(order.getMemberId()); @@ -629,8 +660,8 @@ memberOrderVO.setYouhiPrice(data.getSeckillPrice()); } if (order.getOrderFrom().getCode()==3){ } if (order.getOrderFrom().getCode() == 3) { order.setOrderFrom(OrderFromEnum.GROUP_PURCHASE_ORDERS); GoodsGroupPurchase data = goodsSkuClient.getGoodsSeckiGoodsGroupPurchaseOne(order.getGoodsSkuId(), SecurityConstants.INNER).getData(); GoodsSku goodsSku = goodsSkuClient.getGoodsSkuOne(data.getGoodsSkuId(), SecurityConstants.INNER).getData(); @@ -660,6 +691,40 @@ } } } } if (memberOrderDTO.getOrderFrom() == OrderFromEnum.WISH_ORDER.getCode()) { // 远程调用营销服务,获取推荐商品信息 PromotionWishRecommend recommend = promotionClient.getPromotionWishRecommend( memberOrderDTO.getGoodsSkuId(), SecurityConstants.INNER).getData(); if (Objects.isNull(recommend)) { throw new ServiceException("推荐商品不存在"); } Integer availableNum = recommend.getAvailableNum() + order.getGoodsQuantity(); if (availableNum.compareTo(memberOrderDTO.getGoodsQuantity()) < 0) { throw new ServiceException("推荐商品可购数量不足"); } // 如果最新购买数比锁定库存数大,则扣减多出来的商品数量,否则恢复多出的锁定库存 if (memberOrderDTO.getGoodsQuantity().compareTo(order.getGoodsQuantity()) > 0) { // 远程调用,更新可购数量 Integer res = promotionClient.subRecommendAvailableNum( memberOrderDTO.getGoodsQuantity() - order.getGoodsQuantity(), recommend.getId(), SecurityConstants.INNER).getData(); if (res == 0) { throw new ServiceException("推荐商品可购数量不足"); } } else { promotionClient.addRecommendAvailableNum( order.getGoodsQuantity() - memberOrderDTO.getGoodsQuantity(), recommend.getId(), SecurityConstants.INNER); } order.setTotalAmount(recommend.getSellingPrice() .multiply(new BigDecimal(memberOrderDTO.getGoodsQuantity()))); order.setGoodsQuantity(memberOrderDTO.getGoodsQuantity()); memberOrderVO.setGoodsSkuId(memberOrderDTO.getGoodsSkuId()); memberOrderVO.setPrice(recommend.getSellingPrice()); memberOrderVO.setCoverPic(recommend.getGoodsImageUrl()); memberOrderVO.setSkuName(recommend.getGoodsName()); } } if (memberOrderDTO.getGoodsQuantity()!=null){ @@ -824,7 +889,10 @@ Map<Long, GoodsSku> goodsUnitMap = getGoodsUnitMap(list); for (MemberOrderListVO MemberOrderList:list){ if (MemberOrderList.getOrderStatus().getCode()==1){ if (MemberOrderList.getOrderFrom().getCode()==1||MemberOrderList.getOrderFrom().getCode()==2||MemberOrderList.getOrderFrom().getCode()==3){ if (MemberOrderList.getOrderFrom().getCode() == 1 || MemberOrderList.getOrderFrom().getCode() == 2 || MemberOrderList.getOrderFrom().getCode() == 3 || MemberOrderList.getOrderFrom().equals(OrderFromEnum.WISH_ORDER)) { LocalDateTime localDateTime = MemberOrderList.getOrderTime().plusMinutes(30); if (LocalDateTime.now().isAfter(localDateTime)) { // dateTime1 在 dateTime2 之后 @@ -865,7 +933,12 @@ } goodsSkuClient.updGoodsSeckill(goodsStockUpdDTO1,SecurityConstants.INNER); } // 恢复推荐商品可购数量 if (MemberOrderList.getOrderFrom().equals(OrderFromEnum.WISH_ORDER)) { promotionClient.addRecommendAvailableNum( MemberOrderList.getGoodsQuantity(), MemberOrderList.getGoodsSkuId(), SecurityConstants.INNER); } this.updateById(order); } @@ -1138,6 +1211,11 @@ } } // 恢复可购数量 if (order.getOrderFrom().equals(OrderFromEnum.WISH_ORDER)) { promotionClient.addRecommendAvailableNum( order.getGoodsQuantity(), order.getGoodsSkuId(), SecurityConstants.INNER); } } if (order.getOrderStatus().getCode() == 2) { @@ -1181,7 +1259,11 @@ } } // 恢复可购数量 if (order.getOrderFrom().equals(OrderFromEnum.WISH_ORDER)) { promotionClient.addRecommendAvailableNum( order.getGoodsQuantity(), order.getGoodsSkuId(), SecurityConstants.INNER); } if (order.getCouponId()!=0){ CouponMemberDTO couponMemberDTO1=new CouponMemberDTO(); couponMemberDTO1.setId(order.getCouponId()); @@ -2042,4 +2124,27 @@ List<Order> page1 = this.list(wrapper); return page1; } /** * 根据skuId获取心愿求购详情数据 * * @param id * @return */ @Override public MgtPromotionWishRecommendVO getWishDataBySkuId(Long id) { MgtPromotionWishRecommendVO vo = null; List<Order> list = this.lambdaQuery().eq(Order::getGoodsSkuId, id) .eq(Order::getOrderFrom, OrderFromEnum.WISH_ORDER) .ne(Order::getOrderStatus, OrderStatusEnum.CANCELED).list(); if (CollUtils.isNotEmpty(list)) { vo = new MgtPromotionWishRecommendVO(); Integer purchasedNum = list.stream().map(Order::getGoodsQuantity) .reduce(0, Integer::sum); String orderNo = list.stream().map(Order::getOrderNo).collect(Collectors.joining(",")); vo.setPurchasedNum(purchasedNum); vo.setOrderNo(orderNo); } return vo; } } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/ForepartPromotionVideoController.java
File was renamed from ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/FrepartPromotionVideoController.java @@ -14,7 +14,7 @@ */ @RestController @RequestMapping("/forepart/promotion-video") public class FrepartPromotionVideoController { public class ForepartPromotionVideoController { } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/ForepartPromotionWishController.java
New file @@ -0,0 +1,131 @@ package com.ruoyi.promotion.controller.forepart; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.promotion.controller.forepart.dto.ForepartPromotionWishDTO; import com.ruoyi.promotion.controller.forepart.vo.ForepartPopupVO; import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishBulletVO; import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishVO; import com.ruoyi.promotion.service.IPromotionWishService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import java.util.List; import javax.validation.Valid; import javax.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; 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; import org.springframework.web.bind.annotation.RestController; /** * <p> * 心愿求购 前端控制器 * </p> * * @author mitao * @since 2024-10-29 */ @Validated @RestController @RequiredArgsConstructor @RequestMapping("/forepart/promotion-wish") @Api(value = "用户端-心愿求购相关接口", tags = "【09.25】用户端-心愿求购相关接口") public class ForepartPromotionWishController { private final IPromotionWishService promotionWishService; /** * 个人中心-获取推荐商品可购买数 * @return */ @GetMapping("/getRecommendNum") @ApiOperation(value = "个人中心-获取推荐商品可购买数") public R<Integer> getRecommendNum() { return R.ok(promotionWishService.getRecommendNum()); } /** * 获取首页弹幕数据 * @return */ @GetMapping("/bulletList") @ApiOperation(value = "获取首页弹幕数据", notes = "达成心愿数为数组长度") public R<List<ForepartPromotionWishBulletVO>> getBulletList() { return R.ok(promotionWishService.getBulletList()); } /** * 求购历史-达成心愿数 * @return */ @GetMapping("/getCompletedWishCount") @ApiOperation(value = "求购历史-达成心愿数") public R<Long> getCompletedWishCount() { return R.ok(promotionWishService.getCompletedWishCount()); } /** * 获取弹窗信息 * @return */ @GetMapping("/popup") @ApiOperation(value = "获取弹窗信息", notes = "获取弹窗信息") public R<ForepartPopupVO> getPopup() { return R.ok(promotionWishService.getPopup()); } /** * 求购历史 * @param page * @return */ @PostMapping("/wishHistory") @ApiOperation(value = "求购历史") public R<PageDTO<ForepartPromotionWishVO>> getWishHistory(@Valid @RequestBody BasePage page) { return R.ok(promotionWishService.getWishHistory(page)); } /** * 发布求购 * @param dto * @return */ @PostMapping("/publish") @ApiOperation(value = "发布求购") public R<Long> publish(@Valid @RequestBody ForepartPromotionWishDTO dto) { return R.ok(promotionWishService.publish(dto)); } /** * 心愿求购详情 * @param id * @return */ @GetMapping("/detail/{id}") @ApiOperation(value = "心愿求购详情") public R<ForepartPromotionWishVO> getDetails( @ApiParam(name = "id", value = "心愿求购id", required = true) @NotNull(message = "心愿求购id不能为空") @PathVariable("id") Long id) { return R.ok(promotionWishService.getPromotionWishDetails(id)); } /** * 撤回求购 * @param id * @return */ @DeleteMapping("/{id}") @ApiOperation(value = "撤回心愿求购") public R<?> delete( @ApiParam(name = "id", value = "心愿求购id", required = true) @NotNull(message = "心愿求购id不能为空") @PathVariable("id") Long id) { promotionWishService.deleteById(id); return R.ok(); } } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/ForepartPromotionWishListController.java
New file @@ -0,0 +1,29 @@ package com.ruoyi.promotion.controller.forepart; import com.ruoyi.promotion.service.IPromotionWishListService; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 心愿求购表 前端控制器 * </p> * * @author mitao * @since 2024-05-16 */ @Validated @RestController @RequiredArgsConstructor @RequestMapping("/forepart/promotion-wish-list") @Api(value = "【09.25】用户端-心愿求购相关接口", tags = "用户端-心愿求购相关接口", description = "用户端-心愿单相关接口") public class ForepartPromotionWishListController { private final IPromotionWishListService promotionWishListService; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/ForepartPromotionWishRecommendController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.promotion.controller.forepart; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 心愿求购平台推荐商品 前端控制器 * </p> * * @author mitao * @since 2024-10-29 */ @RestController @RequestMapping("/promotion-wish-recommend") public class ForepartPromotionWishRecommendController { } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/FrepartPromotionWishListController.java
File was deleted ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/dto/ForepartPromotionWishDTO.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.promotion.controller.forepart.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.util.List; import javax.validation.Valid; import lombok.Data; /** * @author mitao * @date 2024/10/30 */ @Data @ApiModel(value = "用户端-心愿求购数据传输对象") public class ForepartPromotionWishDTO { @ApiModelProperty(value = "联系方式") private String phone; @ApiModelProperty(value = "备注") private String remark; @ApiModelProperty(value = "求购商品列表") @Valid private List<ForepartPromotionWishListDTO> wishList; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/dto/ForepartPromotionWishListDTO.java
New file @@ -0,0 +1,32 @@ package com.ruoyi.promotion.controller.forepart.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.NotBlank; import lombok.Data; /** * @author mitao * @date 2024/10/30 */ @Data @ApiModel(value = "心愿求购商品数据传输对象") public class ForepartPromotionWishListDTO { @ApiModelProperty(value = "商品品牌") @NotBlank(message = "商品品牌不能为空") private String goodsBrand; @ApiModelProperty(value = "商品名称") @NotBlank(message = "商品名称不能为空") private String goodsName; @ApiModelProperty(value = "期望年份") private String expectedYear; @ApiModelProperty(value = "求购数量 1瓶 1箱") private String goodsNum; @ApiModelProperty(value = "商品图片,多张图片使用英文逗号拼接") private String goodsImageUrl; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/vo/ForepartPopupVO.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.promotion.controller.forepart.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.util.List; import lombok.Data; /** * @author mitao * @date 2024/10/29 */ @Data @ApiModel(value = "心愿求购弹窗视图对象") public class ForepartPopupVO { @ApiModelProperty(value = "是否弹出 1:是 0:否") private Integer showPopup; @ApiModelProperty(value = "弹窗类型 1:恭喜您心愿达成 2:您有有心愿进行中") private Integer popupType; @ApiModelProperty(value = "未推荐心愿数量") private Integer wishNum; @ApiModelProperty(value = "推荐商品列表") private List<ForepartPromotionWishRecommendVO> recommendList; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/vo/ForepartPromotionWishBulletVO.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.promotion.controller.forepart.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.time.LocalDateTime; import lombok.Data; /** * @author mitao * @date 2024/10/29 */ @Data @ApiModel(value = "首页弹幕数据视图对象") public class ForepartPromotionWishBulletVO { @ApiModelProperty(value = "用户id") private Long memberId; @ApiModelProperty(value = "头像") private String avatar; @ApiModelProperty(value = "求购用户") private String nickname; @ApiModelProperty(value = "发起时间") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty(value = "期望年份") private String expectedYear; @ApiModelProperty(value = "求购商品") private String goodsName; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/vo/ForepartPromotionWishListVO.java
New file @@ -0,0 +1,32 @@ package com.ruoyi.promotion.controller.forepart.vo; import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.NotBlank; import lombok.Data; /** * @author mitao * @date 2024/10/30 */ @Data public class ForepartPromotionWishListVO { @ApiModelProperty(value = "心愿求购商品id") private Long id; @ApiModelProperty(value = "商品品牌") private String goodsBrand; @ApiModelProperty(value = "商品名称") @NotBlank(message = "商品名称不能为空") private String goodsName; @ApiModelProperty(value = "期望年份") private String expectedYear; @ApiModelProperty(value = "求购数量") private String goodsNum; @ApiModelProperty(value = "商品图片,多张图片使用英文逗号拼接") private String goodsImageUrl; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/vo/ForepartPromotionWishRecommendVO.java
New file @@ -0,0 +1,33 @@ package com.ruoyi.promotion.controller.forepart.vo; import io.swagger.annotations.ApiModelProperty; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Data; /** * @author mitao * @date 2024/10/29 */ @Data public class ForepartPromotionWishRecommendVO { @ApiModelProperty(value = "推荐商品id") private Long id; @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "商品售价") private BigDecimal sellingPrice; @ApiModelProperty(value = "可购数量") private Integer availableNum; @ApiModelProperty(value = "商品图片") private String goodsImageUrl; @ApiModelProperty(value = "失效时间") private LocalDateTime expireTime; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/forepart/vo/ForepartPromotionWishVO.java
New file @@ -0,0 +1,45 @@ package com.ruoyi.promotion.controller.forepart.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.time.LocalDateTime; import java.util.List; import lombok.Data; /** * @author mitao * @date 2024/10/30 */ @Data @ApiModel(value = "用户端-心愿求购视图对象") public class ForepartPromotionWishVO { @ApiModelProperty(value = "心愿求购id") private Long id; @ApiModelProperty(value = "用户id") private Long memberId; @ApiModelProperty(value = "联系方式") private String phone; @ApiModelProperty(value = "推荐状态 0:未推荐商品 1:已推荐商品") private Integer recommendStatus; @ApiModelProperty(value = "求购商品名称") private String goodsName; @ApiModelProperty(value = "发布时间") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDateTime createTime; @ApiModelProperty(value = "推荐商品列表") private List<ForepartPromotionWishRecommendVO> recommendList; @ApiModelProperty(value = "求购商品列表") private List<ForepartPromotionWishListVO> wishList; @ApiModelProperty(value = "备注") private String remark; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/inner/PromotionWishRecommendController.java
New file @@ -0,0 +1,68 @@ package com.ruoyi.promotion.controller.inner; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.annotation.InnerAuth; import com.ruoyi.promotion.service.IPromotionWishRecommendService; import com.ruoyi.system.api.domain.PromotionWishRecommend; import lombok.RequiredArgsConstructor; 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.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * <p> * 心愿求购平台推荐商品 前端控制器 * </p> * * @author mitao * @since 2024-10-29 */ @RestController @RequestMapping("/inner/promotion-wish-recommend") @RequiredArgsConstructor public class PromotionWishRecommendController { private final IPromotionWishRecommendService promotionWishRecommendService; /** * * @param id * @return */ @InnerAuth @GetMapping("/{id}") public R<PromotionWishRecommend> getById(@PathVariable("id") Long id) { return R.ok(promotionWishRecommendService.getById(id)); } /** * 扣减推荐商品库存 * @param goodsQuantity * @param id * @return */ @InnerAuth @PostMapping("/subAvailableNum") R<Integer> subRecommendAvailableNum(@RequestParam("goodsQuantity") Integer goodsQuantity, @RequestParam("id") Long id) { return R.ok(promotionWishRecommendService.subRecommendAvailableNum(goodsQuantity, id)); } /** * 恢复荐商品可购数量 * @param goodsQuantity * @param id * @return */ @InnerAuth @PostMapping("/addAvailableNum") R<?> addRecommendAvailableNum(@RequestParam("goodsQuantity") Integer goodsQuantity, @RequestParam("id") Long id) { promotionWishRecommendService.addRecommendAvailableNum(goodsQuantity, id); return R.ok(); } } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtPromotionWishController.java
New file @@ -0,0 +1,105 @@ package com.ruoyi.promotion.controller.management; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishQuery; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishRecommendDTO; import com.ruoyi.promotion.controller.management.vo.MgtPromotionWishVO; import com.ruoyi.promotion.service.IPromotionWishService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import javax.validation.Valid; import javax.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; 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; import org.springframework.web.bind.annotation.RestController; /** * <p> * 心愿求购 前端控制器 * </p> * * @author mitao * @since 2024-10-29 */ @Validated @RestController @RequiredArgsConstructor @Api(tags = {"【09.25】管理后台心愿求购管理相关接口"}) @RequestMapping("/mgt/promotion-wish") public class MgtPromotionWishController { private final IPromotionWishService promotionWishService; /** * 获取心愿求购列表 * * @param query * @return */ @PostMapping("/page") @ApiOperation(value = "获取心愿求购列表") public R<PageDTO<MgtPromotionWishVO>> queryPage( @Valid @RequestBody MgtPromotionWishQuery query) { return R.ok(promotionWishService.queryPage(query)); } /** * 查看详情 * * @param id * @return */ @GetMapping("/{id}") @ApiOperation(value = "查看详情") public R<MgtPromotionWishVO> getDetails( @ApiParam(name = "id", value = "心愿求购id", required = true) @NotNull(message = "心愿求购id不能为空") @PathVariable("id") Long id) { return R.ok(promotionWishService.getDetails(id)); } /** * 删除 * @param id * @return */ @DeleteMapping("/{id}") @ApiOperation(value = "删除心愿求购") public R<?> deleteById( @ApiParam(name = "id", value = "心愿求购id", required = true) @NotNull(message = "心愿求购id不能为空") @PathVariable("id") Long id) { promotionWishService.deleteById(id); return R.ok(); } /** * 推荐商品 * @param dto * @return */ @PostMapping("/recommend") @ApiOperation(value = "推荐商品") public R<?> recommend(@Valid @RequestBody MgtPromotionWishRecommendDTO dto) { promotionWishService.recommend(dto); return R.ok(); } /** * 删除推荐商品 * @param id * @return */ @DeleteMapping("/recommend/{id}") @ApiOperation(value = "删除推荐商品") public R<?> deleteRecommend( @ApiParam(name = "id", value = "推荐商品id", required = true) @NotNull(message = "推荐商品id不能为空") @PathVariable("id") Long id) { promotionWishService.deleteRecommend(id); return R.ok(); } } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtPromotionWishListController.java
@@ -1,23 +1,9 @@ package com.ruoyi.promotion.controller.management; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishListDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishListQuery; import com.ruoyi.promotion.controller.management.vo.MgtPromotionWishListVO; import com.ruoyi.promotion.service.IPromotionWishListService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; 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.RestController; @@ -37,54 +23,5 @@ private final IPromotionWishListService promotionWishListService; /** * 获取心愿求购列表的分页数据 * * @param query 心愿求购管理查询对象 * @return PageDTO<MgtPromotionWishListVO> */ @ApiOperation("获取心愿求购列表的分页数据") @PostMapping("page") public R<PageDTO<MgtPromotionWishListVO>> getPromotionWishListPage( @Validated @RequestBody MgtPromotionWishListQuery query) { return R.ok(promotionWishListService.getPromotionWishListPage(query)); } /** * 查看详情 * * @param id 心愿求购id * @return MgtPromotionWishListVO */ @ApiOperation("查看详情") @GetMapping("/detail/{id}") public R<MgtPromotionWishListVO> getPromotionWishDetail( @ApiParam(value = "心愿求购id", required = true) @PathVariable("id") Long id) { return R.ok(promotionWishListService.getPromotionWishDetail(id)); } /** * 回复 * * @param dto 心愿求购数据传输对象 */ @ApiOperation("回复") @PutMapping("/reply") public R<?> reply(@Validated @RequestBody MgtPromotionWishListDTO dto) { promotionWishListService.reply(dto); return R.ok(); } /** * 删除 * * @param id 心愿求购id */ @ApiOperation("删除") @DeleteMapping("/{id}") public R<?> delete( @ApiParam(name = "id", value = "心愿求购id", required = true) @PathVariable("id") Long id) { promotionWishListService.removeById(id); return R.ok(); } } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtPromotionWishRecommendController.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.promotion.controller.management; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 心愿求购平台推荐商品 前端控制器 * </p> * * @author mitao * @since 2024-10-29 */ @RestController @RequestMapping("/promotion-wish-recommend") public class MgtPromotionWishRecommendController { } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtPromotionWishQuery.java
File was renamed from ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtPromotionWishListQuery.java @@ -1,6 +1,5 @@ package com.ruoyi.promotion.controller.management.dto; import com.ruoyi.common.core.enums.ReplyStatusEnum; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -14,7 +13,7 @@ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "心愿求购管理查询对象", description = "心愿求购管理查询对象") public class MgtPromotionWishListQuery extends BasePage { public class MgtPromotionWishQuery extends BasePage { private static final long serialVersionUID = -2289707074791860720L; @@ -24,6 +23,6 @@ @ApiModelProperty(value = "联系电话") private String phone; @ApiModelProperty(value = "回复状态 未回复 已回复") private ReplyStatusEnum replyStatus; @ApiModelProperty(value = "状态 0:未推荐商品 1:已推荐商品", notes = "全部不传") private Integer recommendStatus; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtPromotionWishRecommendDTO.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.promotion.controller.management.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Data; /** * @author mitao * @date 2024/10/29 */ @Data @ApiModel(value = "推荐商品数据传输对象") public class MgtPromotionWishRecommendDTO { @ApiModelProperty(value = "心愿求购id") private Long wishId; @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "商品售价") private BigDecimal sellingPrice; @ApiModelProperty(value = "可购数量") private Integer availableNum; @ApiModelProperty(value = "商品图片") private String goodsImageUrl; @ApiModelProperty(value = "失效时间") private LocalDateTime expireTime; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionWishListVO.java
@@ -1,62 +1,35 @@ package com.ruoyi.promotion.controller.management.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.enums.ReplyStatusEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 心愿求购表 * </p> * * @author mitao * @since 2024-05-16 * @date 2024/10/29 */ @Data @EqualsAndHashCode(callSuper = false) @ApiModel(value = "管理后台-心愿求购视图对象", description = "管理后台-心愿求购视图对象") public class MgtPromotionWishListVO implements Serializable { @ApiModel(value = "管理后台-心愿求购商品视图对象") public class MgtPromotionWishListVO { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "心愿求购商品id") private Long id; @ApiModelProperty(value = "心愿求购id") private Long id; private Long wishId; @ApiModelProperty(value = "商品品牌") private String goodsBrand; @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "期望价格") private BigDecimal expectedPrice; @ApiModelProperty(value = "期望年份") private String expectedYear; @ApiModelProperty(value = "商品图片 ['a','b','c','d','e']") @ApiModelProperty(value = "求购数量") private String goodsNum; @ApiModelProperty(value = "商品图片,多张图片使用英文逗号拼接") private String goodsImageUrl; @ApiModelProperty(value = "备注") private String remark; @ApiModelProperty(value = "平台回复") private String replies; @ApiModelProperty(value = "回复状态 0未回复 1已回复") private ReplyStatusEnum replyStatus; @ApiModelProperty(value = "创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty(value = "会员id") private Long memberId; @ApiModelProperty(value = "会员昵称") private String nickname; @ApiModelProperty(value = "联系电话") private String phone; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionWishVO.java
New file @@ -0,0 +1,55 @@ package com.ruoyi.promotion.controller.management.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.system.api.domain.vo.MgtPromotionWishRecommendVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.time.LocalDateTime; import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 心愿求购表 * </p> * * @author mitao * @since 2024-05-16 */ @Data @EqualsAndHashCode(callSuper = false) @ApiModel(value = "管理后台-心愿求购视图对象", description = "管理后台-心愿求购视图对象") public class MgtPromotionWishVO implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "心愿求购id") private Long id; @ApiModelProperty(value = "求购用户") private String nickname; @ApiModelProperty(value = "联系电话") private String phone; @ApiModelProperty(value = "状态 0:未推荐商品 1:已推荐商品") private Integer recommendStatus; @ApiModelProperty(value = "备注") private String remark; @ApiModelProperty(value = "发起时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty(value = "会员id") private Long memberId; @ApiModelProperty(value = "求购商品列表") private List<MgtPromotionWishListVO> wishListVOList; @ApiModelProperty(value = "推荐商品列表") private List<MgtPromotionWishRecommendVO> recommendListVOList; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/PromotionWishList.java
@@ -6,11 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.enums.ReplyStatusEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; @@ -33,27 +31,27 @@ private static final long serialVersionUID = 1L; @ApiModelProperty(value = "心愿求购id") @ApiModelProperty(value = "心愿求购商品id") @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; @ApiModelProperty(value = "心愿求购id") private Long wishId; @ApiModelProperty(value = "商品品牌") private String goodsBrand; @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "期望价格") private BigDecimal expectedPrice; @ApiModelProperty(value = "期望年份") private String expectedYear; @ApiModelProperty(value = "商品图片 ['a','b','c','d','e']") @ApiModelProperty(value = "求购数量 1瓶 1箱") private String goodsNum; @ApiModelProperty(value = "商品图片,多张图片使用英文逗号拼接") private String goodsImageUrl; @ApiModelProperty(value = "备注") private String remark; @ApiModelProperty(value = "平台回复") private String replies; @ApiModelProperty(value = "回复状态 0未回复 1已回复") private ReplyStatusEnum replyStatus; @ApiModelProperty(value = "创建者") @TableField(value = "create_by", fill = FieldFill.INSERT) @@ -74,9 +72,4 @@ @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)") @TableLogic private Integer delFlag; @ApiModelProperty(value = "会员id") @TableField(value = "member_id") private Long memberId; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishListService.java
@@ -1,12 +1,7 @@ package com.ruoyi.promotion.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishListDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishListQuery; import com.ruoyi.promotion.controller.management.vo.MgtPromotionWishListVO; import com.ruoyi.promotion.domain.PromotionWishList; import com.ruoyi.system.api.domain.dto.PromotionWishListDTO; /** * <p> @@ -18,32 +13,5 @@ */ public interface IPromotionWishListService extends IService<PromotionWishList> { PageDTO<PromotionWishList> getPromotionWishList(PromotionWishListDTO promotionWishListDTO); PromotionWishList getPromotionWishOne(PromotionWishListDTO promotionWishListDTO); void savePromotionWishList(PromotionWishListDTO promotionWishListDTO); void delPromotionWishOne(PromotionWishListDTO promotionWishListDTO); /** * 获取心愿求购列表的分页数据 * * @param query 心愿求购管理查询对象 * @return PageDTO<MgtPromotionWishListVO> */ PageDTO<MgtPromotionWishListVO> getPromotionWishListPage(MgtPromotionWishListQuery query); /** * 查看详情 * * @param id 心愿求购id * @return MgtPromotionWishListVO */ MgtPromotionWishListVO getPromotionWishDetail(Long id); /** * 回复 * * @param dto 心愿求购数据传输对象 */ void reply(MgtPromotionWishListDTO dto); } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishListServiceImpl.java
@@ -1,30 +1,10 @@ package com.ruoyi.promotion.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.enums.ReplyStatusEnum; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishListDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishListQuery; import com.ruoyi.promotion.controller.management.vo.MgtPromotionWishListVO; import com.ruoyi.promotion.domain.PromotionWishList; import com.ruoyi.promotion.mapper.PromotionWishListMapper; import com.ruoyi.promotion.service.IPromotionWishListService; import com.ruoyi.system.api.domain.Member; import com.ruoyi.system.api.domain.dto.MemberDTO; import com.ruoyi.system.api.domain.dto.PromotionWishListDTO; import com.ruoyi.system.api.feignClient.MemberClient; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -42,140 +22,5 @@ private final MemberClient memberClient; @Override public PageDTO<PromotionWishList> getPromotionWishList(PromotionWishListDTO promotionWishListDTO) { Page<PromotionWishList> page = new Page<>(promotionWishListDTO.getPageCurr(), promotionWishListDTO.getPageSize()); LambdaQueryWrapper<PromotionWishList> wrapper= Wrappers.lambdaQuery(); wrapper.eq(PromotionWishList::getMemberId,promotionWishListDTO.getMemberId()); wrapper.orderByDesc(PromotionWishList::getCreateTime); Page<PromotionWishList> page1 = this.page(page, wrapper); return PageDTO.of(page1); } @Override public void savePromotionWishList(PromotionWishListDTO promotionWishListDTO) { PromotionWishList promotionWishList=new PromotionWishList(); promotionWishList.setExpectedPrice(promotionWishListDTO.getExpectedPrice()); promotionWishList.setGoodsName(promotionWishListDTO.getGoodsName()); promotionWishList.setRemark(promotionWishListDTO.getRemark()); promotionWishList.setGoodsImageUrl(promotionWishListDTO.getGoodsImageUrl()); promotionWishList.setMemberId(promotionWishListDTO.getMemberId()); this.save(promotionWishList); } @Override public void delPromotionWishOne(PromotionWishListDTO promotionWishListDTO) { this.removeById(promotionWishListDTO.getRomotionWishId()); } @Override public PromotionWishList getPromotionWishOne(PromotionWishListDTO promotionWishListDTO) { LambdaQueryWrapper<PromotionWishList> wrapper= Wrappers.lambdaQuery(); wrapper.eq(PromotionWishList::getId,promotionWishListDTO.getRomotionWishId()); wrapper.eq(PromotionWishList::getDelFlag,0); return this.getOne(wrapper); } /** * 获取心愿求购列表的分页数据 * * @param query 心愿求购管理查询对象 * @return PageDTO<MgtPromotionWishListVO> */ @Override public PageDTO<MgtPromotionWishListVO> getPromotionWishListPage( MgtPromotionWishListQuery query) { // 封装会员条件查询对象 MemberDTO memberDTO = null; Set<Long> memberIdSet = null; Page<PromotionWishList> page = new Page<>(query.getPageCurr(), query .getPageSize()); if (StringUtils.isNotBlank(query.getNickname()) || StringUtils.isNotBlank( query.getPhone())) { memberDTO = new MemberDTO(); memberDTO.setNickname(query.getNickname()); memberDTO.setPhone(query.getPhone()); } if (StringUtils.isNotNull(memberDTO)) { // 远程调用会员服务进行条件查询 List<Member> memberList = memberClient.getMemberListByCondition(memberDTO, SecurityConstants.INNER).getData(); if (StringUtils.isEmpty(memberList)) { return PageDTO.empty(page); } memberIdSet = memberList.stream().map(Member::getId) .collect(Collectors.toSet()); } // 分页查询心愿求购列表 page = this.lambdaQuery() .eq(StringUtils.isNotNull(query.getReplyStatus()), PromotionWishList::getReplyStatus, query.getReplyStatus()) .in(StringUtils.isNotEmpty(memberIdSet), PromotionWishList::getMemberId, memberIdSet).orderByDesc(PromotionWishList::getCreateTime).page(page); if (StringUtils.isEmpty(page.getRecords())) { return PageDTO.empty(page); } // 封装VO PageDTO<MgtPromotionWishListVO> pageVO = PageDTO.of(page, MgtPromotionWishListVO.class); List<MgtPromotionWishListVO> MgtPromotionWishListVOList = pageVO.getList(); Set<Long> memberIdSets = MgtPromotionWishListVOList.stream() .map(MgtPromotionWishListVO::getMemberId) .collect(Collectors.toSet()); if (StringUtils.isNotEmpty(memberIdSets)) { List<Member> data = memberClient.getMemberListByIds(memberIdSets, SecurityConstants.INNER).getData(); if (StringUtils.isNotEmpty(data)) { Map<Long, Member> memberMap = data.stream() .collect(Collectors.toMap(Member::getId, member -> member)); for (MgtPromotionWishListVO mgtPromotionWishListVO : MgtPromotionWishListVOList) { Member member = memberMap.get(mgtPromotionWishListVO.getMemberId()); if (StringUtils.isNotNull(member)) { mgtPromotionWishListVO.setNickname(member.getNickname()); mgtPromotionWishListVO.setPhone(member.getPhone()); } } } } return pageVO; } /** * 查看详情 * * @param id 心愿求购id * @return MgtPromotionWishListVO */ @Override public MgtPromotionWishListVO getPromotionWishDetail(Long id) { PromotionWishList promotionWishList = this.getById(id); if (StringUtils.isNull(promotionWishList)) { throw new ServiceException("该心愿求购不存在"); } MgtPromotionWishListVO mgtPromotionWishListVO = BeanUtils.copyBean(promotionWishList, MgtPromotionWishListVO.class); List<Member> data = memberClient.getMemberListByIds( Lists.newArrayList(promotionWishList.getMemberId()), SecurityConstants.INNER).getData(); if (StringUtils.isNotEmpty(data)) { mgtPromotionWishListVO.setPhone(data.get(0).getPhone()); mgtPromotionWishListVO.setNickname(data.get(0).getNickname()); } return mgtPromotionWishListVO; } /** * 回复 * * @param dto 心愿求购数据传输对象 */ @Override public void reply(MgtPromotionWishListDTO dto) { PromotionWishList promotionWishList = this.getById(dto.getId()); promotionWishList.setReplies(dto.getReplies()); promotionWishList.setReplyStatus(ReplyStatusEnum.REPLIED); this.updateById(promotionWishList); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CustomConfigController.java
@@ -8,12 +8,14 @@ import com.ruoyi.system.api.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.domain.vo.CustomConfigVO; import com.ruoyi.system.domain.vo.WishSettingVO; import com.ruoyi.system.service.ICustomConfigService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import javax.annotation.Resource; import javax.validation.Valid; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -31,6 +33,7 @@ * @author mitao * @since 2024-05-21 */ @Validated @RestController @RequestMapping("/custom-config") @Api(value = "系统配置接口", tags = "系统配置接口") @@ -153,4 +156,27 @@ iCustomConfigService.deleteServicePhone(phone); return R.ok(); } /** * 获取心愿求购说明 * * @return */ @ApiOperation("获取心愿求购说明、分享配置") @GetMapping("/wish-setting") public R<WishSettingVO> getWishSetting() { return R.ok(iCustomConfigService.getWishSetting()); } /** * 保存心愿求购设置 * * @param vo 保存心愿求购设置 */ @ApiOperation(value = "保存心愿设置") @PostMapping("/save-wish-setting") public R<?> saveWishDescription(@Valid @RequestBody WishSettingVO vo) { iCustomConfigService.saveWishDescription(vo); return R.ok(); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/WishSettingVO.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.system.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import javax.validation.constraints.NotBlank; import lombok.Data; /** * @author mitao * @date 2024/10/30 */ @Data @ApiModel(value = "心愿求购基础设置视图对象") public class WishSettingVO { @ApiModelProperty(value = "说明") @NotBlank(message = "说明不能为空") private String description; @ApiModelProperty(value = "分享标题") @NotBlank(message = "分享标题不能为空") private String shareTitle; @ApiModelProperty(value = "分享图片") @NotBlank(message = "分享图片不能为空") private String shareImgUrl; } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/listener/RedisListener.java
@@ -7,12 +7,10 @@ import com.ruoyi.system.api.constants.DelayTaskEnum; import com.ruoyi.system.api.feignClient.AuctionClient; import com.ruoyi.system.api.feignClient.GoodsSkuClient; import com.ruoyi.system.api.feignClient.OrderClient; import java.util.Date; import javax.annotation.Resource; import com.ruoyi.system.api.feignClient.OrderClient; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ICustomConfigService.java
@@ -5,6 +5,7 @@ import com.ruoyi.system.api.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.domain.vo.CustomConfigVO; import com.ruoyi.system.domain.vo.WishSettingVO; /** * <p> @@ -79,4 +80,19 @@ * @param phone 客服电话 */ void deleteServicePhone(String phone); /** * 获取心愿求购设置 * * @return */ WishSettingVO getWishSetting(); /** * 保存心愿求购设置 * * @param vo 保存心愿求购设置 */ void saveWishDescription(WishSettingVO vo); } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/CustomConfigServiceImpl.java
@@ -10,6 +10,7 @@ import com.ruoyi.system.api.domain.dto.MgtAfterSaleSettingDTO; import com.ruoyi.system.domain.dto.PointsConfigDTO; import com.ruoyi.system.domain.vo.CustomConfigVO; import com.ruoyi.system.domain.vo.WishSettingVO; import com.ruoyi.system.mapper.CustomConfigMapper; import com.ruoyi.system.service.ICustomConfigService; import java.math.BigDecimal; @@ -265,4 +266,72 @@ } } } /** * 获取心愿求购设置 * * @return */ @Override public WishSettingVO getWishSetting() { WishSettingVO vo = new WishSettingVO(); CustomConfig customConfig = getCustomConfigByKey( ConfigEnum.WISH_DESCRIPTION.getKey()).orElse(new CustomConfig()); List<CustomConfig> list = this.lambdaQuery() .in(CustomConfig::getConfigKey, ConfigEnum.WISH_DESCRIPTION.getKey(), ConfigEnum.WISH_SHARE_TITLE.getKey(), ConfigEnum.WISH_SHARE_IMG_URL.getKey()) .eq(CustomConfig::getDelFlag, 0).list(); for (CustomConfig config : list) { if (ConfigEnum.WISH_DESCRIPTION.getKey().equals(config.getConfigKey())) { vo.setDescription(customConfig.getConfigValue()); } else if (ConfigEnum.WISH_SHARE_TITLE.getKey().equals(config.getConfigKey())) { vo.setShareTitle(config.getConfigValue()); } else if (ConfigEnum.WISH_SHARE_IMG_URL.getKey().equals(config.getConfigKey())) { vo.setShareImgUrl(config.getConfigValue()); } } return vo; } /** * 保存心愿求购说明 * * @param vo 保存心愿求购说明 */ @Override public void saveWishDescription(WishSettingVO vo) { String description = vo.getDescription(); String shareTitle = vo.getShareTitle(); String shareImgUrl = vo.getShareImgUrl(); CustomConfig wishDescription = getCustomConfigByKey( ConfigEnum.WISH_DESCRIPTION.getKey()).orElseGet(() -> { CustomConfig customConfig = new CustomConfig(); customConfig.setConfigKey(ConfigEnum.WISH_DESCRIPTION.getKey()); customConfig.setConfigName(ConfigEnum.WISH_DESCRIPTION.getKeyName()); customConfig.setConfigType(ConfigEnum.WISH_DESCRIPTION.getKeyType()); return customConfig; }); wishDescription.setConfigValue(description); CustomConfig wishShareTitle = getCustomConfigByKey( ConfigEnum.WISH_SHARE_TITLE.getKey()).orElseGet(() -> { CustomConfig customConfig = new CustomConfig(); customConfig.setConfigKey(ConfigEnum.WISH_SHARE_TITLE.getKey()); customConfig.setConfigName(ConfigEnum.WISH_SHARE_TITLE.getKeyName()); customConfig.setConfigType(ConfigEnum.WISH_SHARE_TITLE.getKeyType()); return customConfig; }); wishShareTitle.setConfigValue(shareTitle); CustomConfig wishShareImgUrl = getCustomConfigByKey( ConfigEnum.WISH_SHARE_IMG_URL.getKey()).orElseGet(() -> { CustomConfig customConfig = new CustomConfig(); customConfig.setConfigKey(ConfigEnum.WISH_SHARE_IMG_URL.getKey()); customConfig.setConfigName(ConfigEnum.WISH_SHARE_IMG_URL.getKeyName()); customConfig.setConfigType(ConfigEnum.WISH_SHARE_IMG_URL.getKeyType()); return customConfig; }); wishShareImgUrl.setConfigValue(shareImgUrl); saveOrUpdateBatch( Lists.newArrayList(wishDescription, wishShareTitle, wishShareImgUrl)); } } ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
@@ -17,13 +17,13 @@ nacos: discovery: # 服务注册地址 server-addr: 192.168.110.188:8848 server-addr: 127.0.0.1:8848 service: ${spring.application.name} group: DEFAULT_GROUP namespace: 689e0f09-d102-460c-ac5c-5ea50a3174be config: # 配置中心地址 server-addr: 192.168.110.188:8848 server-addr: 127.0.0.1:8848 namespace: 689e0f09-d102-460c-ac5c-5ea50a3174be group: DEFAULT_GROUP name: ${spring.application.name}