mitao
2024-11-04 11fa4b3bcdda902de8d9818038a1bd35beaa5ec4
09.25心愿求购新增
9个文件已添加
866 ■■■■■ 已修改文件
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/PromotionWish.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishRecommendMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishRecommendService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishService.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishRecommendServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishServiceImpl.java 397 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishRecommendMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/PromotionWish.java
New file
@@ -0,0 +1,76 @@
package com.ruoyi.promotion.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
 * <p>
 * 心愿求购
 * </p>
 *
 * @author mitao
 * @since 2024-10-29
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_promotion_wish")
@ApiModel(value="PromotionWish对象", description="心愿求购")
public class PromotionWish implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键id")
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;
    @ApiModelProperty(value = "用户id")
    private Long memberId;
    @ApiModelProperty(value = "联系方式")
    private String phone;
    @ApiModelProperty(value = "推荐状态 0:未推荐商品 1:已推荐商品")
    private Integer recommendStatus;
    @ApiModelProperty(value = "首次进入标志 0:未查看 1:已查看")
    private Integer firstEnterFlag;
    @ApiModelProperty(value = "上次弹窗时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate lastPromptDate;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建者")
    private String createBy;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新者")
    private String updateBy;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
    private Integer delFlag;
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishMapper.java
New file
@@ -0,0 +1,60 @@
package com.ruoyi.promotion.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishBulletVO;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishRecommendVO;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishVO;
import com.ruoyi.promotion.domain.PromotionWish;
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * 心愿求购 Mapper 接口
 * </p>
 *
 * @author mitao
 * @since 2024-10-29
 */
public interface PromotionWishMapper extends BaseMapper<PromotionWish> {
    /**
     * 个人中心-获取推荐商品可购买数
     * @return
     */
    Integer getRecommendNum(Long memberId);
    /**
     * 获取首页弹幕数据
     * @return
     */
    List<ForepartPromotionWishBulletVO> getBulletList();
    /**
     * 获取推荐商品列表
     * @param memberId
     * @return
     */
    List<ForepartPromotionWishRecommendVO> getRecommendList(Long memberId);
    /**
     * 获取未推荐的心愿求购数量
     * @param memberId
     * @return
     */
    List<PromotionWish> selectNotRecommend(Long memberId);
    /**
     * 心愿求购历史列表
     * @param page
     * @param memberId
     * @return
     */
    Page<ForepartPromotionWishVO> getWishHistory(Page<ForepartPromotionWishVO> page,
            @Param("memberId") Long memberId);
    /**
     * 求购历史-达成心愿数
     * @return
     */
    Long getCompletedWishCount();
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishRecommendMapper.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.promotion.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.api.domain.PromotionWishRecommend;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * 心愿求购平台推荐商品 Mapper 接口
 * </p>
 *
 * @author mitao
 * @since 2024-10-29
 */
public interface PromotionWishRecommendMapper extends BaseMapper<PromotionWishRecommend> {
    /**
     * 扣减推荐商品库存
     * @param goodsQuantity
     * @param id
     * @return
     */
    Integer subRecommendAvailableNum(@Param("goodsQuantity") Integer goodsQuantity, @Param("id")Long id);
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishRecommendService.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.promotion.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.api.domain.PromotionWishRecommend;
/**
 * <p>
 * 心愿求购平台推荐商品 服务类
 * </p>
 *
 * @author mitao
 * @since 2024-10-29
 */
public interface IPromotionWishRecommendService extends IService<PromotionWishRecommend> {
    /**
     * 扣减推荐商品库存
     * @param goodsQuantity
     * @param id
     * @return
     */
    Integer subRecommendAvailableNum(Integer goodsQuantity, Long id);
    /**
     * 恢复荐商品可购数量
     * @param goodsQuantity
     * @param id
     * @return
     */
    void addRecommendAvailableNum(Integer goodsQuantity, Long id);
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishService.java
New file
@@ -0,0 +1,97 @@
package com.ruoyi.promotion.service;
import com.baomidou.mybatisplus.extension.service.IService;
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.controller.management.dto.MgtPromotionWishQuery;
import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishRecommendDTO;
import com.ruoyi.promotion.controller.management.vo.MgtPromotionWishVO;
import com.ruoyi.promotion.domain.PromotionWish;
import java.util.List;
/**
 * <p>
 * 心愿求购 服务类
 * </p>
 *
 * @author mitao
 * @since 2024-10-29
 */
public interface IPromotionWishService extends IService<PromotionWish> {
    /**
     * 个人中心-获取推荐商品可购买数
     * @return
     */
    Integer getRecommendNum();
    /**
     * 获取心愿求购列表
     *
     * @param query
     * @return
     */
    PageDTO<MgtPromotionWishVO> queryPage(MgtPromotionWishQuery query);
    /**
     * 查看详情
     *
     * @param id
     * @return
     */
    MgtPromotionWishVO getDetails(Long id);
    /**
     * 推荐商品
     * @param dto
     * @return
     */
    void recommend(MgtPromotionWishRecommendDTO dto);
    /**
     * 删除
     * @param id
     * @return
     */
    void deleteById(Long id);
    /**
     * 删除推荐商品
     * @param id
     * @return
     */
    void deleteRecommend(Long id);
    /**
     * 获取首页弹幕数据
     * @return
     */
    List<ForepartPromotionWishBulletVO> getBulletList();
    /**
     * 求购历史-达成心愿数
     * @return
     */
    Long getCompletedWishCount();
    /**
     * 获取弹窗信息
     * @return
     */
    ForepartPopupVO getPopup();
    /**
     * 求购历史
     * @param page
     * @return
     */
    PageDTO<ForepartPromotionWishVO> getWishHistory(BasePage page);
    /**
     * 发布求购
     * @param dto
     * @return
     */
    Long publish(ForepartPromotionWishDTO dto);
    /**
     * 心愿求购详情
     * @param id
     * @return
     */
    ForepartPromotionWishVO getPromotionWishDetails(Long id);
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishRecommendServiceImpl.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.promotion.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.promotion.mapper.PromotionWishRecommendMapper;
import com.ruoyi.promotion.service.IPromotionWishRecommendService;
import com.ruoyi.system.api.domain.PromotionWishRecommend;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 心愿求购平台推荐商品 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2024-10-29
 */
@Service
public class PromotionWishRecommendServiceImpl extends
        ServiceImpl<PromotionWishRecommendMapper, PromotionWishRecommend> implements
        IPromotionWishRecommendService {
    /**
     * 扣减推荐商品库存
     * @param goodsQuantity
     * @param id
     * @return
     */
    @Override
    public Integer subRecommendAvailableNum(Integer goodsQuantity, Long id) {
        return baseMapper.subRecommendAvailableNum(goodsQuantity, id);
    }
    /**
     * 恢复荐商品可购数量
     * @param goodsQuantity
     * @param id
     * @return
     */
    @Override
    public void addRecommendAvailableNum(Integer goodsQuantity, Long id) {
        this.lambdaUpdate()
                .setSql("available_num = available_num +" + goodsQuantity)
                .eq(PromotionWishRecommend::getId, id).update();
    }
}
ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishServiceImpl.java
New file
@@ -0,0 +1,397 @@
package com.ruoyi.promotion.service.impl;
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.constant.SecurityConstants;
import com.ruoyi.common.core.enums.DisabledEnum;
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.common.core.web.page.BasePage;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.promotion.controller.forepart.dto.ForepartPromotionWishDTO;
import com.ruoyi.promotion.controller.forepart.dto.ForepartPromotionWishListDTO;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPopupVO;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishBulletVO;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishListVO;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishRecommendVO;
import com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishVO;
import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishQuery;
import com.ruoyi.promotion.controller.management.dto.MgtPromotionWishRecommendDTO;
import com.ruoyi.promotion.controller.management.vo.MgtPromotionWishListVO;
import com.ruoyi.promotion.controller.management.vo.MgtPromotionWishVO;
import com.ruoyi.promotion.domain.PromotionWish;
import com.ruoyi.promotion.domain.PromotionWishList;
import com.ruoyi.promotion.mapper.PromotionWishMapper;
import com.ruoyi.promotion.service.IPromotionWishListService;
import com.ruoyi.promotion.service.IPromotionWishRecommendService;
import com.ruoyi.promotion.service.IPromotionWishService;
import com.ruoyi.system.api.domain.Member;
import com.ruoyi.system.api.domain.PromotionWishRecommend;
import com.ruoyi.system.api.domain.dto.MemberDTO;
import com.ruoyi.system.api.domain.vo.MgtPromotionWishRecommendVO;
import com.ruoyi.system.api.feignClient.MemberClient;
import com.ruoyi.system.api.feignClient.OrderClient;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
 * 心愿求购 服务实现类
 * </p>
 *
 * @author mitao
 * @since 2024-10-29
 */
@Service
@RequiredArgsConstructor
public class PromotionWishServiceImpl extends
        ServiceImpl<PromotionWishMapper, PromotionWish> implements
        IPromotionWishService {
    private final MemberClient memberClient;
    private final IPromotionWishListService promotionWishListService;
    private final IPromotionWishRecommendService promotionWishRecommendService;
    private final OrderClient orderClient;
    /**
     * 个人中心-获取推荐商品可购买数
     * @return
     */
    @Override
    public Integer getRecommendNum() {
        Member currentMember = getCurrentMember();
        return baseMapper.getRecommendNum(currentMember.getId());
    }
    /**
     * 获取心愿求购列表
     *
     * @param query
     * @return
     */
    @Override
    public PageDTO<MgtPromotionWishVO> queryPage(MgtPromotionWishQuery query) {
        // 封装会员条件查询对象
        MemberDTO memberDTO = null;
        Set<Long> memberIdSet = null;
        Page<PromotionWish> 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.getRecommendStatus()),
                        PromotionWish::getRecommendStatus, query.getRecommendStatus())
                .in(StringUtils.isNotEmpty(memberIdSet), PromotionWish::getMemberId,
                        memberIdSet).orderByDesc(PromotionWish::getCreateTime).page(page);
        if (StringUtils.isEmpty(page.getRecords())) {
            return PageDTO.empty(page);
        }
        // 封装VO
        PageDTO<MgtPromotionWishVO> pageVO = PageDTO.of(page,
                MgtPromotionWishVO.class);
        List<MgtPromotionWishVO> MgtPromotionWishVOList = pageVO.getList();
        Set<Long> memberIdSets = MgtPromotionWishVOList.stream()
                .map(MgtPromotionWishVO::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 (MgtPromotionWishVO mgtPromotionWishVO : MgtPromotionWishVOList) {
                    Member member = memberMap.get(mgtPromotionWishVO.getMemberId());
                    if (StringUtils.isNotNull(member)) {
                        mgtPromotionWishVO.setNickname(member.getNickname());
                        if (StringUtils.isBlank(mgtPromotionWishVO.getPhone())) {
                            mgtPromotionWishVO.setPhone(member.getPhone());
                        }
                    }
                }
            }
        }
        return pageVO;
    }
    /**
     * 查看详情
     *
     * @param id
     * @return
     */
    @Override
    public MgtPromotionWishVO getDetails(Long id) {
        PromotionWish promotionWish = baseMapper.selectById(id);
        MgtPromotionWishVO mgtPromotionWishVO = BeanUtils.copyBean(promotionWish,
                MgtPromotionWishVO.class);
        if (StringUtils.isNotNull(mgtPromotionWishVO)) {
            //查询用户信息
            Member member = memberClient.getMembeOne(promotionWish.getMemberId(),
                    SecurityConstants.INNER).getData();
            if (StringUtils.isNotNull(member)) {
                mgtPromotionWishVO.setNickname(member.getNickname());
                if (StringUtils.isBlank(mgtPromotionWishVO.getPhone())) {
                    mgtPromotionWishVO.setPhone(member.getPhone());
                }
            }
            //查询心愿求购商品
            List<PromotionWishList> wishLists = promotionWishListService.list(
                    Wrappers.lambdaQuery(PromotionWishList.class)
                            .eq(PromotionWishList::getWishId, id));
            mgtPromotionWishVO.setWishListVOList(BeanUtils.copyList(wishLists,
                    MgtPromotionWishListVO.class));
            if (promotionWish.getRecommendStatus().equals(DisabledEnum.YES.getCode())) {
                //查询推荐商品
                List<PromotionWishRecommend> recommendList = promotionWishRecommendService.list(
                        Wrappers.lambdaQuery(PromotionWishRecommend.class)
                                .eq(PromotionWishRecommend::getWishId, id));
                if (CollUtils.isNotEmpty(recommendList)) {
                    List<MgtPromotionWishRecommendVO> recommendVOList = BeanUtils.copyToList(
                            recommendList, MgtPromotionWishRecommendVO.class);
                    for (MgtPromotionWishRecommendVO vo : recommendVOList) {
                        MgtPromotionWishRecommendVO result = orderClient.getWishDataBySkuId(vo.getId(),
                                SecurityConstants.INNER).getData();
                        if (StringUtils.isNotNull(result)) {
                            vo.setPurchasedNum(result.getPurchasedNum());
                            vo.setOrderNo(result.getOrderNo());
                        }
                    }
                    mgtPromotionWishVO.setRecommendListVOList(recommendVOList);
                }
            }
        }
        return mgtPromotionWishVO;
    }
    /**
     * 推荐商品
     * @param dto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void recommend(MgtPromotionWishRecommendDTO dto) {
        PromotionWish promotionWish = baseMapper.selectById(dto.getWishId());
        if (StringUtils.isNull(promotionWish)) {
            throw new ServiceException("该心愿求购不存在");
        }
        PromotionWishRecommend promotionWishRecommend = BeanUtils.copyBean(dto,
                PromotionWishRecommend.class);
        promotionWishRecommendService.save(promotionWishRecommend);
        promotionWish.setRecommendStatus(DisabledEnum.YES.getCode());
        baseMapper.updateById(promotionWish);
    }
    /**
     * 删除
     * @param id
     * @return
     */
    @Override
    public void deleteById(Long id) {
        Long count = promotionWishRecommendService.lambdaQuery()
                .eq(PromotionWishRecommend::getWishId, id)
                .eq(PromotionWishRecommend::getPurchaseStatus, DisabledEnum.YES.getCode()).count();
        if (count > 0) {
            throw new ServiceException("用户已购买推荐商品,不能删除");
        }
        baseMapper.deleteById(id);
    }
    /**
     * 删除推荐商品
     * @param id
     * @return
     */
    @Override
    public void deleteRecommend(Long id) {
        PromotionWishRecommend promotionWishRecommend = promotionWishRecommendService.getById(id);
        if (Objects.nonNull(promotionWishRecommend)) {
            if (promotionWishRecommend.getPurchaseStatus().equals(DisabledEnum.YES.getCode())) {
                throw new ServiceException("用户已购买推荐商品,不能删除");
            }
            baseMapper.deleteById(id);
        }
    }
    /**
     * 获取首页弹幕数据
     * @return
     */
    @Override
    public List<ForepartPromotionWishBulletVO> getBulletList() {
        List<ForepartPromotionWishBulletVO> bulletList = baseMapper.getBulletList();
        if (CollUtils.isEmpty(bulletList)) {
            return bulletList;
        }
        List<Long> memberIds = bulletList.stream().map(ForepartPromotionWishBulletVO::getMemberId)
                .collect(Collectors.toList());
        List<Member> data = memberClient.getMemberListByIds(memberIds, SecurityConstants.INNER)
                .getData();
        if (CollUtils.isNotEmpty(data)) {
            Map<Long, Member> memberMap = data.stream()
                    .collect(Collectors.toMap(Member::getId, e -> e));
            bulletList = bulletList.stream().peek(bullet -> {
                Member member = memberMap.get(bullet.getMemberId());
                if (StringUtils.isNotNull(member)) {
                    bullet.setNickname(member.getNickname());
                    bullet.setAvatar(member.getAvatar());
                }
            }).collect(Collectors.toList());
        }
        return bulletList;
    }
    /**
     * 求购历史-达成心愿数
     * @return
     */
    @Override
    public Long getCompletedWishCount() {
        return baseMapper.getCompletedWishCount();
    }
    /**
     * 获取弹窗信息
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ForepartPopupVO getPopup() {
        // 获取当前登录用户
        Member member = getCurrentMember();
        ForepartPopupVO forepartPopupVO = new ForepartPopupVO();
        if (StringUtils.isNotNull(member)) {
            // 查询用户心愿求购
            List<PromotionWish> wishList = this.lambdaQuery()
                    .eq(PromotionWish::getMemberId, member.getId())
                    .eq(PromotionWish::getRecommendStatus, DisabledEnum.YES.getCode())
                    .eq(PromotionWish::getFirstEnterFlag, DisabledEnum.NO.getCode())
                    .list();
            // 默认不显示弹窗
            forepartPopupVO.setShowPopup(DisabledEnum.NO.getCode());
            // 查询推荐商品列表
            List<ForepartPromotionWishRecommendVO> recommendList = baseMapper.getRecommendList(
                    member.getId());
            forepartPopupVO.setRecommendList(recommendList);
            if (CollUtils.isNotEmpty(wishList)) {
                //已推荐,且未查看
                forepartPopupVO.setPopupType(1);
                forepartPopupVO.setShowPopup(DisabledEnum.YES.getCode());
                // 查询未推荐心愿数量
                long wishNum = this.lambdaQuery()
                        .eq(PromotionWish::getMemberId, member.getId())
                        .eq(PromotionWish::getRecommendStatus, DisabledEnum.NO.getCode())
                        .count();
                forepartPopupVO.setWishNum((int) wishNum);
                // 心愿达成:更新首次进入标志
                this.lambdaUpdate()
                        .eq(PromotionWish::getMemberId, member.getId())
                        .eq(PromotionWish::getRecommendStatus, DisabledEnum.YES.getCode())
                        .set(PromotionWish::getFirstEnterFlag, DisabledEnum.YES.getCode())
                        .update();
            }else {
                //心愿进行中
                List<PromotionWish> promotionWisheList = baseMapper.selectNotRecommend(member.getId());
                forepartPopupVO.setWishNum(promotionWisheList.size());
                if (CollUtils.isNotEmpty(promotionWisheList)) {
                    forepartPopupVO.setShowPopup(DisabledEnum.YES.getCode());
                    forepartPopupVO.setPopupType(2);
                    //更新上次弹窗时间
                    promotionWisheList.forEach(wish -> wish.setLastPromptDate(LocalDate.now()));
                    updateBatchById(promotionWisheList);
                }
            }
        }
        return forepartPopupVO;
    }
    /**
     * 获取当前登录用户
     * @return
     */
    private Member getCurrentMember() {
        Long userId = SecurityUtils.getUserId();
        return memberClient.getMemberByUserId(userId, SecurityConstants.INNER).getData();
    }
    /**
     * 求购历史
     * @param basePage
     * @return
     */
    @Override
    public PageDTO<ForepartPromotionWishVO> getWishHistory(BasePage basePage) {
        Member currentMember = getCurrentMember();
        if (StringUtils.isNotNull(currentMember)) {
          Page<ForepartPromotionWishVO> page = baseMapper.getWishHistory(new Page<>(basePage.getPageCurr(),basePage.getPageSize()), currentMember.getId());
          return PageDTO.of(page);
        }
        return null;
    }
    /**
     * 发布求购
     * @param dto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long publish(ForepartPromotionWishDTO dto) {
        //当前用户
        Member currentMember = getCurrentMember();
        PromotionWish promotionWish = BeanUtils.copyBean(dto, PromotionWish.class);
        promotionWish.setMemberId(currentMember.getId());
        baseMapper.insert(promotionWish);
        // 保存商品列表
        List<ForepartPromotionWishListDTO> wishList = dto.getWishList();
        List<PromotionWishList> promotionWishLists = BeanUtils.copyToList(wishList,
                PromotionWishList.class);
        promotionWishLists.forEach(promotionWishList -> promotionWishList.setWishId(promotionWish.getId()));
        promotionWishListService.saveBatch(promotionWishLists);
        return promotionWish.getId();
    }
    /**
     * 心愿求购详情
     * @param id
     * @return
     */
    @Override
    public ForepartPromotionWishVO getPromotionWishDetails(Long id) {
        PromotionWish promotionWish = this.getById(id);
        ForepartPromotionWishVO vo = null;
        if (StringUtils.isNotNull(promotionWish)) {
            vo = BeanUtils.copyBean(promotionWish, ForepartPromotionWishVO.class);
            //查询心愿求购商品列表
            List<PromotionWishList> wishList = promotionWishListService.lambdaQuery()
                    .eq(PromotionWishList::getWishId, promotionWish.getId()).list();
            vo.setWishList(BeanUtils.copyList(wishList, ForepartPromotionWishListVO.class));
            // 查询推荐商品列表
            List<PromotionWishRecommend> list = promotionWishRecommendService.lambdaQuery()
                    .eq(PromotionWishRecommend::getWishId, promotionWish.getId()).list();
            vo.setRecommendList(BeanUtils.copyList(list, ForepartPromotionWishRecommendVO.class));
        }
        return vo;
    }
}
ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml
New file
@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.promotion.mapper.PromotionWishMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.promotion.domain.PromotionWish">
        <id column="id" property="id" />
        <result column="member_id" property="memberId" />
        <result column="phone" property="phone" />
        <result column="recommend_status" property="recommendStatus" />
        <result column="remark" property="remark" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="del_flag" property="delFlag" />
    </resultMap>
    <resultMap id="WishResultMap" type="com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishVO">
        <id column="id" property="id" />
        <result column="member_id" property="memberId" />
        <result column="phone" property="phone" />
        <result column="recommend_status" property="recommendStatus" />
        <result column="goodsName" property="goodsName" />
        <result column="create_time" property="createTime" />
        <collection property="recommendList" javaType="java.util.List" resultMap="RecommendResultMap"/>
    </resultMap>
    <resultMap id="RecommendResultMap" type="com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishRecommendVO">
        <id column="recommendId" property="id" />
        <result column="recommendGoodsName" property="goodsName" />
        <result column="selling_price" property="sellingPrice" />
        <result column="available_num" property="availableNum" />
        <result column="goods_image_url" property="goodsImageUrl" />
        <result column="expire_time" property="expireTime" />
    </resultMap>
    <select id="getBulletList"
      resultType="com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishBulletVO">
        SELECT tpw.member_id, tpw.create_time, tpwl.expected_year, tpwl.goods_name
        FROM t_promotion_wish tpw
                 INNER JOIN t_promotion_wish_list tpwl ON tpw.id = tpwl.wish_id
        <where>
            tpw.del_flag = 0 AND tpw.recommend_status = 1
        </where>
            GROUP BY  tpwl.wish_id,tpw.member_id
    </select>
    <select id="getRecommendList"
      resultType="com.ruoyi.promotion.controller.forepart.vo.ForepartPromotionWishRecommendVO"
      parameterType="java.lang.Long">
        SELECT
        r.id, r.goods_name, r.selling_price, r.available_num, r.goods_image_url,r.expire_time
        FROM
        t_promotion_wish w
       LEFT JOIN
        t_promotion_wish_recommend r ON w.id  = r.wish_id
        <where>
            w.del_flag = 0
            AND w.member_id = #{memberId}
            AND w.recommend_status = 1
            AND r.purchase_status = 0
            AND r.expire_time &gt; NOW();
        </where>
    </select>
    <select id="selectNotRecommend" resultType="com.ruoyi.promotion.domain.PromotionWish"
      parameterType="java.lang.Long">
        SELECT
            *
        FROM
        t_promotion_wish
        <where>
            del_flag = 0
            AND member_id = #{memberId}
            AND recommend_status = 0
            AND (last_prompt_date IS NULL OR last_prompt_date &lt; CURDATE());
        </where>
    </select>
    <select id="getWishHistory" resultMap="WishResultMap">
        SELECT tpw.id,
               tpw.member_id,
               tpw.phone,
               tpw.recommend_status,
               tpw.create_time,
               GROUP_CONCAT(tpwl.goods_name) AS goodsName,
               tpwr.id AS recommendId,
               tpwr.goods_name AS recommendGoodsName,
               tpwr.selling_price,
               tpwr.available_num,
               tpwr.goods_image_url,
               tpwr.expire_time
        FROM t_promotion_wish tpw
                 LEFT JOIN t_promotion_wish_list tpwl ON tpw.id = tpwl.wish_id
                 LEFT JOIN t_promotion_wish_recommend tpwr ON tpwr.wish_id = tpw.id
        <where>
            tpw.del_flag = 0 AND tpw.member_id = #{memberId}
        </where>
        GROUP BY tpw.id
    </select>
  <select id="getRecommendNum" resultType="java.lang.Integer"
    parameterType="java.lang.Long">
    SELECT COALESCE(SUM(tpwr.available_num), 0)
    FROM t_promotion_wish tpw
           LEFT JOIN t_promotion_wish_recommend tpwr ON tpwr.wish_id = tpw.id
    <where>
      tpw.del_flag = 0
      AND tpwr.expire_time &gt;= NOW()
      AND tpw.member_id = #{memberId}
    </where>
  </select>
  <select id="getCompletedWishCount" resultType="java.lang.Long">
    SELECT COUNT(id)
    FROM t_promotion_wish
  </select>
</mapper>
ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishRecommendMapper.xml
New file
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.promotion.mapper.PromotionWishRecommendMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.system.api.domain.PromotionWishRecommend">
        <id column="id" property="id" />
        <result column="wish_id" property="wishId" />
        <result column="goods_name" property="goodsName" />
        <result column="selling_price" property="sellingPrice" />
        <result column="available_num" property="availableNum" />
        <result column="goods_image_url" property="goodsImageUrl" />
        <result column="expire_time" property="expireTime" />
        <result column="purchase_status" property="purchaseStatus" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="del_flag" property="delFlag" />
    </resultMap>
    <update id="subRecommendAvailableNum">
        UPDATE t_promotion_wish_recommend SET available_num = available_num - #{goodsQuantity}
        WHERE id = #{id} AND available_num &gt;= #{goodsQuantity}
    </update>
</mapper>