From 11fa4b3bcdda902de8d9818038a1bd35beaa5ec4 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期一, 04 十一月 2024 09:14:38 +0800
Subject: [PATCH] 09.25心愿求购新增

---
 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishMapper.java                     |   60 ++++
 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishRecommendService.java         |   29 +
 ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml                           |  115 +++++++
 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/PromotionWish.java                           |   76 +++++
 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishRecommendMapper.java            |   23 +
 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishServiceImpl.java          |  397 ++++++++++++++++++++++++++
 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishRecommendServiceImpl.java |   43 ++
 ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishService.java                  |   97 ++++++
 ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishRecommendMapper.xml                  |   26 +
 9 files changed, 866 insertions(+), 0 deletions(-)

diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/PromotionWish.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/PromotionWish.java
new file mode 100644
index 0000000..74b26b4
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/domain/PromotionWish.java
@@ -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;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishMapper.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishMapper.java
new file mode 100644
index 0000000..2fb5589
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishMapper.java
@@ -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();
+}
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishRecommendMapper.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishRecommendMapper.java
new file mode 100644
index 0000000..3155bea
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/mapper/PromotionWishRecommendMapper.java
@@ -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);
+}
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishRecommendService.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishRecommendService.java
new file mode 100644
index 0000000..0261b94
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishRecommendService.java
@@ -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);
+}
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishService.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishService.java
new file mode 100644
index 0000000..648de8b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionWishService.java
@@ -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);
+
+}
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishRecommendServiceImpl.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishRecommendServiceImpl.java
new file mode 100644
index 0000000..822ec1f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishRecommendServiceImpl.java
@@ -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();
+    }
+}
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishServiceImpl.java b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishServiceImpl.java
new file mode 100644
index 0000000..f129003
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionWishServiceImpl.java
@@ -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;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml b/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml
new file mode 100644
index 0000000..26df359
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishMapper.xml
@@ -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>
diff --git a/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishRecommendMapper.xml b/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishRecommendMapper.xml
new file mode 100644
index 0000000..9dc5305
--- /dev/null
+++ b/ruoyi-modules/ruoyi-promotion/src/main/resources/mapper/promotion/PromotionWishRecommendMapper.xml
@@ -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>

--
Gitblit v1.7.1