mitao
2024-06-09 c80281c4269623609f5b815d60b241f5462de9cc
提交【管理后台】-营销管理模块相关接口
11个文件已添加
21个文件已修改
985 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/CouponMember.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/CouponMemberDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/MemberFallbackFactory.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/MemberClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/validate/InsertGroup.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/validate/ModifyGroup.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CouponUseEnum.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DistributionMethodEnum.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/inner/MemberController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtCouponController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponDTO.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponQuery.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponReceiveQuery.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponUpdDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/CouponReceiveDetailVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtCouponVO.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionBannerVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionVideoVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionWishListVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/Coupon.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/ICouponService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/async/AsyncMethodService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponMemberServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishListServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/CouponMember.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.enums.CouponTypeEnum;
import com.ruoyi.common.core.enums.CouponUseEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@@ -46,9 +47,9 @@
    @ApiModelProperty(value = "优惠券类型 1=满减券 2=代金券 3=折扣券")
    private CouponTypeEnum couponType;
    @ApiModelProperty(value = "优惠券状态-1删除0已过期1已领取2已使用")
    private Integer couponStatus;
    @ApiModelProperty(value = "优惠券状态 0:未使用, 1:已使用")
    private CouponUseEnum couponStatus;
    @ApiModelProperty(value = "满减金额,例如:满100元")
    private BigDecimal fullReductionAmount;
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/CouponMemberDTO.java
@@ -15,6 +15,6 @@
    @ApiModelProperty(value = "会员id")
    private  Long memberId;
    @ApiModelProperty(value = "优惠券状态-1删除0已过期1已领取2已使用")
    @ApiModelProperty(value = "优惠券状态 0:未使用, 1:已使用")
    private Integer couponStatus;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/MemberFallbackFactory.java
@@ -5,12 +5,12 @@
import com.ruoyi.system.api.domain.Member;
import com.ruoyi.system.api.domain.MemberAddress;
import com.ruoyi.system.api.domain.dto.AppMiniLoginDTO;
import com.ruoyi.system.api.domain.dto.AppMiniRegisterDTO;
import com.ruoyi.system.api.domain.dto.MemberDTO;
import com.ruoyi.system.api.domain.dto.MemberPointsDTO;
import com.ruoyi.system.api.domain.dto.updMembeOneDTO;
import com.ruoyi.system.api.feignClient.MemberClient;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.springframework.cloud.openfeign.FallbackFactory;
/**
@@ -35,10 +35,12 @@
            }
            @Override
            public R<List<Member>> getMemberListByIds(Set<Long> memberIdList, String source) {
            public R<List<Member>> getMemberListByIds(Collection<Long> memberIdList,
                    String source) {
                return R.fail("获取用户列表失败:" + cause.getMessage());
            }
            @Override
            public R<AppMiniLoginVO> miniLogin(AppMiniLoginDTO appMiniLoginDto)
            {
                return R.fail("登录用户失败:" + cause.getMessage());
@@ -54,6 +56,17 @@
            public R<?> updMembeOne(updMembeOneDTO dMembeOneDTO) {
                return R.fail("修改用户等级失败:" + cause.getMessage());
            }
            @Override
            public R<List<Member>> getMemberListByCondition(MemberDTO memberDTO, String source) {
                return R.fail("获取用户列表失败:" + cause.getMessage());
            }
            @Override
            public R<List<Member>> getMemberListByLevel(List<String> memberLevelList,
                    String source) {
                return R.fail("获取用户列表失败:" + cause.getMessage());
            }
        };
        }
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/OrderFallbackFactory.java
@@ -5,15 +5,17 @@
import com.ruoyi.common.core.enums.BondStatusEnum;
import com.ruoyi.system.api.domain.Order;
import com.ruoyi.system.api.domain.OrderAuctionBond;
import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO;
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.dto.*;
import com.ruoyi.system.api.domain.vo.OrderVO;
import com.ruoyi.system.api.domain.vo.PayInfoVO;
import com.ruoyi.system.api.feignClient.OrderClient;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -107,7 +109,10 @@
                return R.fail("生成保证金失败" + cause.getMessage());
            }
            @Override
            public R<List<Order>> getOrderByCouponIds(Collection<Long> couponIds, String source) {
                return R.fail("根据优惠券id列表获取订单列表失败" + cause.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/MemberClient.java
@@ -46,4 +46,8 @@
    @PostMapping("/member/list-by-condition")
    R<List<Member>> getMemberListByCondition(@RequestBody MemberDTO memberDTO,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @PostMapping("/member/list-by-level")
    R<List<Member>> getMemberListByLevel(@RequestBody List<String> memberLevelList,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/OrderClient.java
@@ -7,15 +7,17 @@
import com.ruoyi.common.core.enums.BondStatusEnum;
import com.ruoyi.system.api.domain.Order;
import com.ruoyi.system.api.domain.OrderAuctionBond;
import com.ruoyi.system.api.domain.dto.HomeGoodsSkuDTO;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO;
import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO;
import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO;
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.dto.*;
import com.ruoyi.system.api.domain.vo.OrderVO;
import com.ruoyi.system.api.domain.vo.PayInfoVO;
import com.ruoyi.system.api.factory.OrderFallbackFactory;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.cloud.openfeign.FeignClient;
@@ -137,5 +139,14 @@
    R<PayInfoVO> SaveOrderAuctionBond(@RequestBody MemberAuctionSalesroomBondDTO memberAuctionSalesroomBondDTO,
                                     @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 根据优惠券id集合查询订单列表
     *
     * @param couponIdSet 优惠券id集合
     * @param inner       内部调用标志
     * @return List<Order>
     */
    @PostMapping("/order/list-by-coupon")
    R<List<Order>> getOrderByCouponIds(@RequestBody Collection<Long> couponIds,
            @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/validate/InsertGroup.java
New file
@@ -0,0 +1,10 @@
package com.ruoyi.system.api.validate;
/**
 * @author mitao
 * @date 2024/6/9
 * <p>插入数据校验分组</p>
 */
public interface InsertGroup {
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/validate/ModifyGroup.java
New file
@@ -0,0 +1,10 @@
package com.ruoyi.system.api.validate;
/**
 * @author mitao
 * @date 2024/6/9
 * <p>编辑数据校验分组</p>
 */
public interface ModifyGroup {
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CouponUseEnum.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.common.core.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum CouponUseEnum {
    UNUSED(0, "未使用"),
    USED(1, "已使用");
    @EnumValue
    private final Integer code;
    @JsonValue
    private final String desc;
    public static CouponUseEnum getEnumByCode(Integer code) {
        for (CouponUseEnum e : CouponUseEnum.values()) {
            if (e.code.equals(code)) {
                return e;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DistributionMethodEnum.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.common.core.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum DistributionMethodEnum {
    ALL_MEMBERS(1, "全部会员"),
    SPECIFY_MEMBERSHIP_LEVEL(2, "指定会员等级"),
    DESIGNATED_MEMBERS(3, "指定会员");
    @EnumValue
    private final Integer code;
    @JsonValue
    private final String desc;
    public static DistributionMethodEnum getEnumByCode(Integer code) {
        for (DistributionMethodEnum e : DistributionMethodEnum.values()) {
            if (e.code.equals(code)) {
                return e;
            }
        }
        return null;
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/controller/inner/MemberController.java
@@ -48,8 +48,14 @@
    }
    @InnerAuth
    @PostMapping("/member/list-by-condition")
    @PostMapping("/list-by-condition")
    R<List<Member>> getMemberListByCondition(@RequestBody MemberDTO memberDTO) {
        return R.ok(memberService.getMemberListByCondition(memberDTO));
    }
    @InnerAuth
    @PostMapping("/list-by-level")
    R<List<Member>> getMemberListByLevel(@RequestBody List<String> memberLevelList) {
        return R.ok(memberService.getMemberListByLevel(memberLevelList));
    }
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/IMemberService.java
@@ -66,4 +66,6 @@
    void updMembeOne(@RequestBody updMembeOneDTO dMembeOneDTO);
    List<Member> getMemberListByCondition(MemberDTO memberDTO);
    List<Member> getMemberListByLevel(List<String> memberLevelList);
}
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberServiceImpl.java
@@ -592,9 +592,19 @@
        return this.lambdaQuery()
                .like(StringUtils.isNotBlank(memberDTO.getNickname()), Member::getNickname,
                        memberDTO.getNickname())
                .like(StringUtils.isNotBlank(memberDTO.getRealName()), Member::getRealName,
                        memberDTO.getRealName())
                .like(StringUtils.isNotBlank(memberDTO.getPhone()), Member::getPhone,
                        memberDTO.getPhone()).list();
    }
    @Override
    public List<Member> getMemberListByLevel(List<String> memberLevelList) {
        return this.lambdaQuery()
                .in(StringUtils.isNotEmpty(memberLevelList), Member::getLevel, memberLevelList)
                .orderByDesc(Member::getLevel)
                .list();
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/inner/OrderController.java
@@ -9,13 +9,20 @@
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 java.util.List;
import com.ruoyi.system.api.domain.vo.OrderVO;
import java.util.Collection;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
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;
/**
@@ -106,4 +113,15 @@
        orderService.updateBatchById(orders);
        return R.ok();
    }
    /**
     * 根据优惠券id集合查询订单列表
     *
     * @param couponIds 优惠券id集合
     * @return List<Order>
     */
    @PostMapping("/order/list-by-coupon")
    R<List<Order>> getOrderByCouponIds(@RequestBody Collection<Long> couponIds) {
        return R.ok(orderService.getOrderByCouponIds(couponIds));
    }
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/IOrderService.java
@@ -10,9 +10,9 @@
import com.ruoyi.system.api.domain.vo.MemberOrderListVO;
import com.ruoyi.system.api.domain.vo.MemberTiOrderVO;
import com.ruoyi.system.api.domain.vo.OrderVO;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Collection;
import java.util.List;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * <p>
@@ -64,4 +64,11 @@
    void AffirmOrderOne(@RequestBody MemberOrderListDTO memberOrderListDTO);
    /**
     * 根据优惠券id集合查询订单列表
     *
     * @param couponIds 优惠券id集合
     * @return List<Order>
     */
    List<Order> getOrderByCouponIds(Collection<Long> couponIds);
}
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -12,27 +12,28 @@
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.order.domain.MemberInvoiceRise;
import com.ruoyi.order.domain.Paylog;
import com.ruoyi.order.mapper.OrderAuctionBondMapper;
import com.ruoyi.order.mapper.OrderMapper;
import com.ruoyi.order.service.IOrderAuctionBondService;
import com.ruoyi.order.service.IOrderService;
import com.ruoyi.order.service.IPaylogService;
import com.ruoyi.order.util.OrderUtil;
import com.ruoyi.system.api.domain.*;
import com.ruoyi.system.api.domain.dto.*;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import com.ruoyi.order.util.SinataUtil;
import com.ruoyi.system.api.domain.CouponMember;
import com.ruoyi.system.api.domain.CustomConfig;
import com.ruoyi.system.api.domain.GoodsGroupPurchase;
import com.ruoyi.system.api.domain.GoodsSeckill;
import com.ruoyi.system.api.domain.GoodsSku;
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.dto.CouponMemberDTO;
import com.ruoyi.system.api.domain.dto.GoodsStockUpdDTO;
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.dto.OrderDTO;
import com.ruoyi.system.api.domain.dto.updMembeOneDTO;
import com.ruoyi.system.api.domain.vo.MemberOrderListVO;
import com.ruoyi.system.api.domain.vo.MemberTiOrderVO;
import com.ruoyi.system.api.domain.vo.OrderVO;
@@ -40,6 +41,13 @@
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.feignClient.PromotionClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Service;
@@ -608,4 +616,15 @@
            baseMapper.updateById(order);
        }
    }
    /**
     * 根据优惠券id集合查询订单列表
     *
     * @param couponIds 优惠券id集合
     * @return List<Order>
     */
    @Override
    public List<Order> getOrderByCouponIds(Collection<Long> couponIds) {
        return this.lambdaQuery().in(Order::getCouponId, couponIds).list();
    }
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtCouponController.java
@@ -1,6 +1,24 @@
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.MgtCouponDTO;
import com.ruoyi.promotion.controller.management.dto.MgtCouponQuery;
import com.ruoyi.promotion.controller.management.dto.MgtCouponReceiveQuery;
import com.ruoyi.promotion.controller.management.dto.MgtCouponUpdDTO;
import com.ruoyi.promotion.controller.management.vo.CouponReceiveDetailVO;
import com.ruoyi.promotion.controller.management.vo.MgtCouponVO;
import com.ruoyi.promotion.service.ICouponService;
import com.ruoyi.system.api.validate.InsertGroup;
import com.ruoyi.system.api.validate.ModifyGroup;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
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;
@@ -14,6 +32,71 @@
 */
@RestController
@RequestMapping("/mgt/coupon")
@RequiredArgsConstructor
@Api(value = "管理后台-优惠券管理相关接口", tags = "管理后台-优惠券管理相关接口")
public class MgtCouponController {
    private final ICouponService couponService;
    /**
     * 获取优惠券列表的分页数据
     *
     * @param query 管理后台-优惠券查询对象
     * @return PageDTO<MgtCouponVO>
     */
    @ApiOperation(value = "获取优惠券列表的分页数据", notes = "优惠券列表的分页数据")
    @PostMapping("/page")
    public R<PageDTO<MgtCouponVO>> getCouponPage(@Validated @RequestBody MgtCouponQuery query) {
        return R.ok(couponService.getCouponPage(query));
    }
    /**
     * 添加优惠券
     *
     * @param dto 管理后台-优惠券数据传输对象
     */
    @ApiOperation("添加优惠券")
    @PostMapping("/add")
    public R<?> saveCoupon(@Validated(InsertGroup.class) @RequestBody MgtCouponDTO dto) {
        couponService.saveCoupon(dto);
        return R.ok();
    }
    /**
     * 编辑优惠券
     *
     * @param dto 管理后台-优惠券数据传输对象
     */
    @ApiOperation("编辑优惠券")
    @PutMapping("/update")
    public R<?> updateCoupon(@Validated(ModifyGroup.class) @RequestBody MgtCouponDTO dto) {
        couponService.updateCoupon(dto);
        return R.ok();
    }
    /**
     * 上架/下架
     *
     * @param dto
     * @return
     */
    @ApiOperation("上架/下架")
    @PutMapping("/upd-status")
    public R<?> updStatus(@Validated @RequestBody MgtCouponUpdDTO dto) {
        couponService.updStatus(dto);
        return R.ok();
    }
    /**
     * 领取详情
     *
     * @param query 管理后台-优惠券领取详情查询对象
     * @return PageDTO<CouponReceiveDetailVO>
     */
    @ApiOperation("领取详情")
    @PostMapping("/receive-detail")
    public R<PageDTO<CouponReceiveDetailVO>> getReceiveDetail(
            @Validated @RequestBody MgtCouponReceiveQuery query) {
        return R.ok(couponService.getReceiveDetail(query));
    }
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponDTO.java
New file
@@ -0,0 +1,85 @@
package com.ruoyi.promotion.controller.management.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.enums.CouponTypeEnum;
import com.ruoyi.common.core.enums.DistributionMethodEnum;
import com.ruoyi.system.api.validate.InsertGroup;
import com.ruoyi.system.api.validate.ModifyGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author mitao
 * @date 2024/6/9
 */
@Data
@ApiModel(value = "管理后台-优惠券数据传输对象", description = "管理后台-优惠券数据传输对象")
public class MgtCouponDTO implements Serializable {
    private static final long serialVersionUID = 471073836029292058L;
    @ApiModelProperty(value = "优惠券id", notes = "添加不传,更新必传")
    @NotNull(message = "优惠券id不能为空", groups = {ModifyGroup.class})
    private Long id;
    @ApiModelProperty(value = "优惠券名称")
    @NotBlank(message = "优惠券名称不能为空", groups = {InsertGroup.class, ModifyGroup.class})
    private String couponName;
    @ApiModelProperty(value = "优惠券类型 1=满减券 2=代金券 3=折扣券")
    @NotNull(message = "优惠券类型不能为空", groups = {InsertGroup.class})
    private CouponTypeEnum couponType;
    @ApiModelProperty(value = "满减金额,例如:满100元")
    private BigDecimal fullReductionAmount;
    @ApiModelProperty(value = "减少金额,例如:减50元")
    private BigDecimal reductionAmount;
    @ApiModelProperty(value = "代金券金额,例如:50元")
    private BigDecimal voucherAmount;
    @ApiModelProperty(value = "折扣额度,例如:8折")
    private Double discountRate;
    @ApiModelProperty(value = "最高可抵扣金额,例如:200元")
    private BigDecimal maxDiscount;
    @ApiModelProperty(value = "优惠券说明")
    @NotBlank(message = "优惠券说明不能为空", groups = {InsertGroup.class, ModifyGroup.class})
    private String description;
    @ApiModelProperty(value = "有效期起")
    @NotNull(message = "有效期起不能为空", groups = {InsertGroup.class})
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startDate;
    @ApiModelProperty(value = "有效期止")
    @NotNull(message = "有效期止不能为空", groups = {InsertGroup.class})
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endDate;
    @ApiModelProperty(value = "发放方式 全部会员 指定会员等级 指定会员")
    @NotNull(message = "发放方式不能为空", groups = {InsertGroup.class})
    private DistributionMethodEnum distributionMethod;
    @ApiModelProperty(value = "会员等级,多等级以 , 隔开")
    private String memberLevel;
    @ApiModelProperty(value = "发放张数")
    @NotNull(message = "发放张数不能为空", groups = {InsertGroup.class})
    private Integer issuedQuantity;
    @ApiModelProperty(value = "会员id列表")
    @NotEmpty(message = "会员id列表不能为空", groups = {InsertGroup.class})
    private List<Long> memberIdList;
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponQuery.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.promotion.controller.management.dto;
import com.ruoyi.common.core.enums.CouponTypeEnum;
import com.ruoyi.common.core.enums.DistributionMethodEnum;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author mitao
 * @date 2024/6/9
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "管理后台-优惠券查询对象", description = "管理后台-优惠券查询对象")
public class MgtCouponQuery extends BasePage {
    private static final long serialVersionUID = -3645816773946506015L;
    @ApiModelProperty(value = "优惠券名称")
    private String couponName;
    @ApiModelProperty(value = "优惠券类型 1=满减券 2=代金券 3=折扣券")
    private CouponTypeEnum couponType;
    @ApiModelProperty(value = "发放方式 1=全部会员 2=指定会员等级 3=指定会员")
    private DistributionMethodEnum distributionMethod;
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponReceiveQuery.java
New file
@@ -0,0 +1,33 @@
package com.ruoyi.promotion.controller.management.dto;
import com.ruoyi.common.core.enums.CouponUseEnum;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * @author mitao
 * @date 2024/6/9
 */
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "管理后台-优惠券领取详情查询对象", description = "管理后台-优惠券领取详情查询对象")
public class MgtCouponReceiveQuery extends BasePage {
    private static final long serialVersionUID = -2131590270318555753L;
    @ApiModelProperty(value = "优惠券id")
    @NotNull(message = "优惠券id不能为空")
    private Long id;
    @ApiModelProperty(value = "会员姓名")
    private String realName;
    @ApiModelProperty(value = "联系电话")
    private String phone;
    @ApiModelProperty(value = "优惠券状态 0:未使用, 1:已使用")
    private CouponUseEnum couponStatus;
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtCouponUpdDTO.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.promotion.controller.management.dto;
import com.ruoyi.common.core.enums.ListingStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.Data;
/**
 * @author mitao
 * @date 2024/6/9
 */
@Data
@ApiModel(value = "管理后台-优惠券上架下架数据传输对象", description = "管理后台-优惠券上架下架数据传输对象")
public class MgtCouponUpdDTO implements Serializable {
    private static final long serialVersionUID = 3742544140798931375L;
    @ApiModelProperty(value = "优惠券id", notes = "添加不传,更新必传")
    @NotNull(message = "优惠券id不能为空")
    private Long id;
    @ApiModelProperty(value = "状态 上架中 已下架")
    @NotNull(message = "状态不能为空")
    private ListingStatusEnum couponStatus;
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/CouponReceiveDetailVO.java
New file
@@ -0,0 +1,40 @@
package com.ruoyi.promotion.controller.management.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.enums.CouponUseEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDateTime;
import lombok.Data;
/**
 * @author mitao
 * @date 2024/6/9
 */
@Data
@ApiModel(value = "管理后台-优惠券领取详情视图对象", description = "管理后台-优惠券领取详情视图对象")
public class CouponReceiveDetailVO {
    @ApiModelProperty(value = "优惠券id")
    private Long couponId;
    @ApiModelProperty(value = "优惠券id")
    private Long memberId;
    @ApiModelProperty(value = "会员姓名")
    private String realName;
    @ApiModelProperty(value = "联系电话")
    private String phone;
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
    @ApiModelProperty(value = "使用时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "优惠券状态 0:未使用, 1:已使用")
    private CouponUseEnum couponStatus;
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtCouponVO.java
New file
@@ -0,0 +1,72 @@
package com.ruoyi.promotion.controller.management.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.enums.CouponTypeEnum;
import com.ruoyi.common.core.enums.DistributionMethodEnum;
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/6/9
 */
@Data
@ApiModel(value = "管理后台-优惠券视图对象", description = "管理后台-优惠券视图对象")
public class MgtCouponVO {
    @ApiModelProperty(value = "优惠券id")
    private Long id;
    @ApiModelProperty(value = "优惠券名称")
    private String couponName;
    @ApiModelProperty(value = "优惠券类型 1=满减券 2=代金券 3=折扣券")
    private CouponTypeEnum couponType;
    @ApiModelProperty(value = "状态 0=已上架 1=已下架")
    private Integer couponStatus;
    @ApiModelProperty(value = "满减金额,例如:满100元")
    private BigDecimal fullReductionAmount;
    @ApiModelProperty(value = "减少金额,例如:减50元")
    private BigDecimal reductionAmount;
    @ApiModelProperty(value = "代金券金额,例如:50元")
    private BigDecimal voucherAmount;
    @ApiModelProperty(value = "折扣额度,例如:8折")
    private Double discountRate;
    @ApiModelProperty(value = "最高可抵扣金额,例如:200元")
    private BigDecimal maxDiscount;
    @ApiModelProperty(value = "优惠券说明")
    private String description;
    @ApiModelProperty(value = "有效期起")
    private LocalDateTime startDate;
    @ApiModelProperty(value = "有效期止")
    private LocalDateTime endDate;
    @ApiModelProperty(value = "发放方式 1=全部会员 2=指定会员等级 3=指定会员")
    private DistributionMethodEnum distributionMethod;
    @ApiModelProperty(value = "会员等级,多等级以 , 隔开")
    private String memberLevel;
    @ApiModelProperty(value = "发放张数")
    private Integer issuedQuantity;
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "优惠券详情")
    private String details;
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionBannerVO.java
@@ -14,7 +14,7 @@
 * @date 2024/6/6
 */
@Data
@ApiModel(value = "轮播图视图对象", description = "轮播图视图对象")
@ApiModel(value = "管理后台-轮播图视图对象", description = "管理后台-轮播图视图对象")
public class MgtPromotionBannerVO implements Serializable {
    private static final long serialVersionUID = -6660029413001641863L;
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionVideoVO.java
@@ -10,7 +10,7 @@
 * @date 2024/6/3
 */
@Data
@ApiModel(value = "大屏视频视图对象", description = "大屏视频视图对象")
@ApiModel(value = "管理后台-大屏视频视图对象", description = "管理后台-大屏视频视图对象")
public class MgtPromotionVideoVO implements Serializable {
    private static final long serialVersionUID = -1717120548273715375L;
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/vo/MgtPromotionWishListVO.java
@@ -20,7 +20,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value = "心愿求购视图对象", description = "心愿求购视图对象")
@ApiModel(value = "管理后台-心愿求购视图对象", description = "管理后台-心愿求购视图对象")
public class MgtPromotionWishListVO implements Serializable {
    private static final long serialVersionUID = 1L;
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/Coupon.java
@@ -7,6 +7,8 @@
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.enums.CouponTypeEnum;
import com.ruoyi.common.core.enums.DistributionMethodEnum;
import com.ruoyi.common.core.enums.ListingStatusEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
@@ -43,7 +45,7 @@
    private CouponTypeEnum couponType;
    @ApiModelProperty(value = "状态 0=已上架 1=已下架")
    private Integer couponStatus;
    private ListingStatusEnum couponStatus;
    @ApiModelProperty(value = "满减金额,例如:满100元")
    private BigDecimal fullReductionAmount;
@@ -69,6 +71,9 @@
    @ApiModelProperty(value = "有效期止")
    private LocalDateTime endDate;
    @ApiModelProperty(value = "发放方式 1=全部会员 2=指定会员等级 3=指定会员")
    private DistributionMethodEnum distributionMethod;
    @ApiModelProperty(value = "会员等级,多等级以 , 隔开")
    private String memberLevel;
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/ICouponService.java
@@ -1,6 +1,13 @@
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.MgtCouponDTO;
import com.ruoyi.promotion.controller.management.dto.MgtCouponQuery;
import com.ruoyi.promotion.controller.management.dto.MgtCouponReceiveQuery;
import com.ruoyi.promotion.controller.management.dto.MgtCouponUpdDTO;
import com.ruoyi.promotion.controller.management.vo.CouponReceiveDetailVO;
import com.ruoyi.promotion.controller.management.vo.MgtCouponVO;
import com.ruoyi.promotion.domain.Coupon;
/**
@@ -13,4 +20,35 @@
 */
public interface ICouponService extends IService<Coupon> {
    /**
     * 获取优惠券列表的分页数据
     *
     * @param query 管理后台-优惠券查询对象
     * @return PageDTO<MgtCouponVO>
     */
    PageDTO<MgtCouponVO> getCouponPage(MgtCouponQuery query);
    /**
     * 添加优惠券
     *
     * @param dto 管理后台-优惠券数据传输对象
     */
    void saveCoupon(MgtCouponDTO dto);
    /**
     * 编辑优惠券
     *
     * @param dto 管理后台-优惠券数据传输对象
     */
    void updateCoupon(MgtCouponDTO dto);
    void updStatus(MgtCouponUpdDTO dto);
    /**
     * 领取详情
     *
     * @param query 管理后台-优惠券领取详情查询对象
     * @return PageDTO<CouponReceiveDetailVO>
     */
    PageDTO<CouponReceiveDetailVO> getReceiveDetail(MgtCouponReceiveQuery query);
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/async/AsyncMethodService.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.promotion.service.async;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.page.BeanUtils;
import com.ruoyi.promotion.domain.Coupon;
import com.ruoyi.promotion.service.ICouponMemberService;
import com.ruoyi.system.api.domain.CouponMember;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
 * @author mitao
 * @date 2024/6/9
 */
@Service
@RequiredArgsConstructor
public class AsyncMethodService {
    private final ICouponMemberService couponMemberService;
    /**
     * 异步处理优惠券发放
     *
     * @param coupon       发放的优惠券
     * @param memberIdList 发放的会员id
     */
    @Async
    public void issueCoupon(Coupon coupon, List<Long> memberIdList) {
        Long couponId = coupon.getId();
        Integer issuedQuantity = coupon.getIssuedQuantity();
        List<CouponMember> memberCouponList = new ArrayList<>();
        for (Long memberId : memberIdList) {
            coupon.setId(null);
            CouponMember couponMember = BeanUtils.copyBean(coupon, CouponMember.class);
            couponMember.setMemberId(memberId);
            couponMember.setCouponId(couponId);
            memberCouponList.add(couponMember);
            if (StringUtils.isNotNull(issuedQuantity)
                    && memberCouponList.size() >= issuedQuantity) {
                break;
            }
        }
        if (StringUtils.isNotEmpty(memberCouponList)) {
            couponMemberService.saveBatch(memberCouponList);
        }
    }
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponMemberServiceImpl.java
@@ -4,12 +4,12 @@
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.ruoyi.common.core.enums.CouponUseEnum;
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.system.api.domain.dto.CouponMemberDTO;
import com.ruoyi.system.api.domain.CouponMember;
import com.ruoyi.promotion.mapper.CouponMemberMapper;
import com.ruoyi.promotion.service.ICouponMemberService;
import java.time.LocalDateTime;
import com.ruoyi.system.api.domain.CouponMember;
import com.ruoyi.system.api.domain.dto.CouponMemberDTO;
import java.util.List;
import org.springframework.stereotype.Service;
@@ -28,18 +28,19 @@
    @Override
    public PageDTO<CouponMember> getCouponMemberList(CouponMemberDTO couponMemberDTO) {
        LambdaQueryWrapper<CouponMember> wrapper= Wrappers.lambdaQuery();
        wrapper.eq(CouponMember::getCouponStatus,1);
        wrapper.eq(CouponMember::getCouponStatus, CouponUseEnum.UNUSED);
        wrapper.eq(CouponMember::getDelFlag,0);
            List<CouponMember> couponMemberList=this.list(wrapper);
        for (CouponMember couponMember:couponMemberList){
    /*    for (CouponMember couponMember:couponMemberList){
            if(LocalDateTime.now().isAfter(couponMember.getEndDate())){
                couponMember.setCouponStatus(0);
                this.updateById(couponMember);
            }
        }
        }*/
        Page<CouponMember> page = new Page<>(couponMemberDTO.getPageCurr(), couponMemberDTO.getPageSize());
        LambdaQueryWrapper<CouponMember> wrapper1= Wrappers.lambdaQuery();
        wrapper1.eq(CouponMember::getCouponStatus,couponMemberDTO.getCouponStatus());
        wrapper1.eq(CouponMember::getCouponStatus,
                CouponUseEnum.getEnumByCode(couponMemberDTO.getCouponStatus()));
        wrapper1.eq(CouponMember::getDelFlag,0);
        Page<CouponMember> page1 = this.page(page, wrapper);
        return PageDTO.of(page1);
@@ -53,7 +54,7 @@
    @Override
    public void updCouponMember(CouponMemberDTO couponMemberDTO) {
        CouponMember byId = this.getById(couponMemberDTO.getId());
        byId.setCouponStatus(couponMemberDTO.getCouponStatus());
        byId.setCouponStatus(CouponUseEnum.getEnumByCode(couponMemberDTO.getCouponStatus()));
        this.updateById(byId);
    }
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/CouponServiceImpl.java
@@ -1,9 +1,41 @@
package com.ruoyi.promotion.service.impl;
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.CouponTypeEnum;
import com.ruoyi.common.core.enums.CouponUseEnum;
import com.ruoyi.common.core.enums.DistributionMethodEnum;
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.CollUtils;
import com.ruoyi.common.core.utils.page.PageDTO;
import com.ruoyi.promotion.controller.management.dto.MgtCouponDTO;
import com.ruoyi.promotion.controller.management.dto.MgtCouponQuery;
import com.ruoyi.promotion.controller.management.dto.MgtCouponReceiveQuery;
import com.ruoyi.promotion.controller.management.dto.MgtCouponUpdDTO;
import com.ruoyi.promotion.controller.management.vo.CouponReceiveDetailVO;
import com.ruoyi.promotion.controller.management.vo.MgtCouponVO;
import com.ruoyi.promotion.domain.Coupon;
import com.ruoyi.promotion.mapper.CouponMapper;
import com.ruoyi.promotion.service.ICouponMemberService;
import com.ruoyi.promotion.service.ICouponService;
import com.ruoyi.promotion.service.async.AsyncMethodService;
import com.ruoyi.system.api.domain.CouponMember;
import com.ruoyi.system.api.domain.Member;
import com.ruoyi.system.api.domain.Order;
import com.ruoyi.system.api.domain.dto.MemberDTO;
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.feignClient.OrderClient;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
@@ -15,6 +47,216 @@
 * @since 2024-05-16
 */
@Service
@RequiredArgsConstructor
public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements ICouponService {
    private final AsyncMethodService asyncMethodService;
    private final MemberClient memberClient;
    private final OrderClient orderClient;
    private final ICouponMemberService couponMemberService;
    /**
     * 获取优惠券列表的分页数据
     *
     * @param query 管理后台-优惠券查询对象
     * @return PageDTO<MgtCouponVO>
     */
    @Override
    public PageDTO<MgtCouponVO> getCouponPage(MgtCouponQuery query) {
        Page<Coupon> page = this.lambdaQuery()
                .select(Coupon::getId, Coupon::getCouponName, Coupon::getCouponType,
                        Coupon::getFullReductionAmount, Coupon::getReductionAmount,
                        Coupon::getVoucherAmount, Coupon::getDiscountRate,
                        Coupon::getDistributionMethod, Coupon::getCouponStatus,
                        Coupon::getDescription, Coupon::getCreateTime)
                .like(StringUtils.isNotBlank(query.getCouponName()), Coupon::getCouponName,
                        query.getCouponName())
                .eq(StringUtils.isNotNull(query.getCouponType()), Coupon::getCouponType,
                        query.getCouponType())
                .eq(StringUtils.isNotNull(query.getDistributionMethod()),
                        Coupon::getDistributionMethod, query.getDistributionMethod())
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        if (StringUtils.isEmpty(page.getRecords())) {
            return PageDTO.empty(page);
        }
        PageDTO<MgtCouponVO> mgtCouponVOPageDTO = PageDTO.of(page, MgtCouponVO.class);
        List<MgtCouponVO> collect = mgtCouponVOPageDTO.getList().stream().peek(coupon -> {
            if (CouponTypeEnum.FULL_REDUCTION_COUPON.equals(coupon.getCouponType())) {
                coupon.setDetails("满" + coupon.getFullReductionAmount() + "元减"
                        + coupon.getReductionAmount() + "元");
            } else if (CouponTypeEnum.CASH_COUPON.equals(coupon.getCouponType())) {
                coupon.setDetails(coupon.getVoucherAmount().toString());
            } else if (CouponTypeEnum.COUPON.equals(coupon.getCouponType())) {
                coupon.setDetails(coupon.getDiscountRate() + "折");
            }
        }).collect(Collectors.toList());
        mgtCouponVOPageDTO.setList(collect);
        return mgtCouponVOPageDTO;
    }
    /**
     * 添加优惠券
     *
     * @param dto 管理后台-优惠券数据传输对象
     */
    @Override
    public void saveCoupon(MgtCouponDTO dto) {
        // 参数校验
        if (dto.getCouponType().equals(CouponTypeEnum.FULL_REDUCTION_COUPON)) {
            if (StringUtils.isNull(dto.getFullReductionAmount()) || StringUtils.isNull(
                    dto.getReductionAmount())) {
                throw new ServiceException("满减券的满减金额不能为空");
            }
        } else if (dto.getCouponType().equals(CouponTypeEnum.CASH_COUPON) && StringUtils.isNull(
                dto.getVoucherAmount())) {
            throw new ServiceException("代金券的代金券金额不能为空");
        } else if (dto.getCouponType().equals(CouponTypeEnum.COUPON) && StringUtils.isNull(
                dto.getDiscountRate())) {
            throw new ServiceException("折扣券的折扣额度不能为空");
        }
        if (dto.getDistributionMethod().equals(DistributionMethodEnum.SPECIFY_MEMBERSHIP_LEVEL)
                && StringUtils.isBlank(dto.getMemberLevel())) {
            throw new ServiceException("会员等级不能为空");
        } else if (dto.getDistributionMethod().equals(DistributionMethodEnum.DESIGNATED_MEMBERS)
                && StringUtils.isEmpty(dto.getMemberIdList())) {
            throw new ServiceException("会员id列表不能为空");
        }
        Coupon coupon = BeanUtils.copyBean(dto, Coupon.class);
        this.save(coupon);
        List<Long> memberIdList = new ArrayList<>();
        if (dto.getDistributionMethod().equals(DistributionMethodEnum.DESIGNATED_MEMBERS)) {
            memberIdList = dto.getMemberIdList();
        } else if (dto.getDistributionMethod()
                .equals(DistributionMethodEnum.SPECIFY_MEMBERSHIP_LEVEL)) {
            String[] memberLevelsStr = dto.getMemberLevel().replace(",", ",").split(",");
            // 转为List<String>集合
            List<Member> memberList = memberClient.getMemberListByLevel(
                    Lists.newArrayList(memberLevelsStr), SecurityConstants.INNER).getData();
            memberIdList = memberList.stream().map(Member::getId).collect(Collectors.toList());
        } else if (dto.getDistributionMethod().equals(DistributionMethodEnum.ALL_MEMBERS)) {
            List<Member> memberList = memberClient.getMemberListByLevel(
                    CollUtils.emptyList(), SecurityConstants.INNER).getData();
            memberIdList = memberList.stream().map(Member::getId).collect(Collectors.toList());
        }
        // 发放优惠券
        asyncMethodService.issueCoupon(coupon, memberIdList);
    }
    /**
     * 编辑优惠券
     *
     * @param dto 管理后台-优惠券数据传输对象
     */
    @Override
    public void updateCoupon(MgtCouponDTO dto) {
        Coupon coupon = this.getById(dto.getId());
        if (StringUtils.isNull(coupon)) {
            throw new ServiceException("优惠券不存在");
        }
        coupon.setCouponName(dto.getCouponName());
        coupon.setDescription(dto.getDescription());
        this.updateById(coupon);
    }
    @Override
    public void updStatus(MgtCouponUpdDTO dto) {
        this.lambdaUpdate()
                .set(Coupon::getCouponStatus, dto.getCouponStatus())
                .eq(Coupon::getId, dto.getId());
    }
    /**
     * 领取详情
     *
     * @param query 管理后台-优惠券领取详情查询对象
     * @return PageDTO<CouponReceiveDetailVO>
     */
    @Override
    public PageDTO<CouponReceiveDetailVO> getReceiveDetail(MgtCouponReceiveQuery query) {
        MemberDTO memberDTO = null;
        Set<Long> memberIdSet = null;
        if (StringUtils.isNotBlank(query.getRealName()) || StringUtils.isNotBlank(
                query.getPhone())) {
            memberDTO = new MemberDTO();
            memberDTO.setRealName(query.getRealName());
            memberDTO.setPhone(query.getPhone());
        }
        if (StringUtils.isNotNull(memberDTO)) {
            List<Member> data = memberClient.getMemberListByCondition(memberDTO,
                    SecurityConstants.INNER).getData();
            memberIdSet = data.stream().map(Member::getId).collect(Collectors.toSet());
        }
        Page<CouponMember> page = couponMemberService.lambdaQuery()
                .eq(StringUtils.isNotNull(query.getCouponStatus()),
                        CouponMember::getCouponStatus, query.getCouponStatus())
                .in(StringUtils.isNotEmpty(memberIdSet), CouponMember::getMemberId, memberIdSet)
                .eq(CouponMember::getCouponId, query.getId())
                .page(new Page<>(query.getPageCurr(), query.getPageSize()));
        if (StringUtils.isEmpty(page.getRecords())) {
            return PageDTO.empty(page);
        }
        PageDTO<CouponReceiveDetailVO> couponReceiveDetailVOPageDTO = PageDTO.of(page,
                CouponReceiveDetailVO.class);
        // 远程调用会员服务,获取会员信息
        List<Long> memberIdList = page.getRecords().stream().map(CouponMember::getMemberId)
                .collect(Collectors.toList());
        if (StringUtils.isNotEmpty(memberIdList)) {
            List<Member> memberList = memberClient.getMemberListByIds(memberIdList,
                    SecurityConstants.INNER).getData();
            Map<Long, Member> memberMap = memberList.stream()
                    .collect(Collectors.toMap(Member::getId, Function.identity()));
            couponReceiveDetailVOPageDTO.getList().forEach(item -> {
                Member member = memberMap.get(item.getMemberId());
                item.setRealName(member.getRealName());
                item.setPhone(member.getPhone());
            });
        }
        // 远程调用订单服务,获取订单信息
        List<CouponReceiveDetailVO> usedCouponList = couponReceiveDetailVOPageDTO.getList().stream()
                .filter(item -> item.getCouponStatus().equals(
                        CouponUseEnum.USED)).collect(Collectors.toList());
        Set<Long> couponIdSet = usedCouponList.stream().map(CouponReceiveDetailVO::getCouponId)
                .collect(Collectors.toSet());
        Map<String, Order> orderMap = null;
        Map<Long, Member> memberMap = null;
        if (StringUtils.isNotEmpty(usedCouponList)) {
            List<Order> data = orderClient.getOrderByCouponIds(couponIdSet, SecurityConstants.INNER)
                    .getData();
            orderMap = data.stream().collect(
                    Collectors.toMap(order -> order.getCouponId() + "-" + order.getMemberId(),
                            Function.identity()));
        }
        Set<Long> memberSet = couponReceiveDetailVOPageDTO.getList().stream()
                .map(CouponReceiveDetailVO::getMemberId).collect(
                        Collectors.toSet());
        if (StringUtils.isNotEmpty(memberSet)) {
            List<Member> data = memberClient.getMemberListByIds(memberSet, SecurityConstants.INNER)
                    .getData();
            memberMap = data.stream().collect(
                    Collectors.toMap(Member::getId, Function.identity()));
        }
        // 封装VO
        for (CouponReceiveDetailVO couponReceiveDetailVO : couponReceiveDetailVOPageDTO.getList()) {
            if (StringUtils.isNotEmpty(memberMap)) {
                Member member = memberMap.get(couponReceiveDetailVO.getMemberId());
                if (StringUtils.isNotNull(member)) {
                    couponReceiveDetailVO.setRealName(member.getRealName());
                    couponReceiveDetailVO.setPhone(member.getPhone());
                }
            } else if (StringUtils.isNotEmpty(orderMap)) {
                Order order = orderMap.get(couponReceiveDetailVO.getCouponId() + "-"
                        + couponReceiveDetailVO.getMemberId());
                if (StringUtils.isNotNull(order)) {
                    couponReceiveDetailVO.setOrderNo(order.getOrderNo());
                    couponReceiveDetailVO.setCreateTime(order.getCreateTime());
                }
            } else {
                break;
            }
        }
        return couponReceiveDetailVOPageDTO;
    }
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishListServiceImpl.java
@@ -85,17 +85,22 @@
    public PageDTO<MgtPromotionWishListVO> getPromotionWishListPage(
            MgtPromotionWishListQuery query) {
        // 封装会员条件查询对象
        MemberDTO memberDTO = new MemberDTO();
        if (StringUtils.isNotBlank(query.getNickname())) {
        MemberDTO memberDTO = null;
        Set<Long> memberIdSet = null;
        if (StringUtils.isNotBlank(query.getNickname()) || StringUtils.isNotBlank(
                query.getPhone())) {
            memberDTO = new MemberDTO();
            memberDTO.setNickname(query.getNickname());
        }
        if (StringUtils.isNotBlank(query.getPhone())) {
            memberDTO.setPhone(query.getPhone());
        }
        // 远程调用会员服务进行条件查询
        List<Member> memberList = memberClient.getMemberListByCondition(memberDTO,
                SecurityConstants.INNER).getData();
        Set<Long> memberIdSet = memberList.stream().map(Member::getId).collect(Collectors.toSet());
        if (StringUtils.isNotNull(memberDTO)) {
            // 远程调用会员服务进行条件查询
            List<Member> memberList = memberClient.getMemberListByCondition(memberDTO,
                    SecurityConstants.INNER).getData();
            memberIdSet = memberList.stream().map(Member::getId)
                    .collect(Collectors.toSet());
        }
        // 分页查询心愿求购列表
        Page<PromotionWishList> page = this.lambdaQuery()
                .eq(StringUtils.isNotNull(query.getReplyStatus()),