Przeglądaj źródła

Merge branch 'user_ts'

zoujiajian 1 rok temu
rodzic
commit
c83ea1be82
17 zmienionych plików z 786 dodań i 2 usunięć
  1. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserFeedbackProgressRecordMapper.java
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserFeedbackRecordMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserRecommendGoodsRecordMapper.java
  4. 43 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserFeedbackProgressRecord.java
  5. 44 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserFeedbackRecord.java
  6. 37 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserRecommendGoodsRecord.java
  7. 6 2
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaFrontView.java
  8. 41 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserFeedbackProgressRecordFrontView.java
  9. 66 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserFeedbackRecordView.java
  10. 55 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserRecommendGoodsRecordView.java
  11. 34 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserRecommendGoodsUserView.java
  12. 18 0
      netflix-service/src/main/java/com/cyksj/service/suggest/UserSuggestService.java
  13. 120 0
      netflix-service/src/main/java/com/cyksj/service/suggest/impl/UserSuggestServiceImpl.java
  14. 12 0
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  15. 10 0
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  16. 114 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/feedback/UserFeedbackController.java
  17. 147 0
      netflix-web/src/main/java/com/cyksj/web/controller/suggest/UserSuggestController.java

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserFeedbackProgressRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserFeedbackProgressRecord;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserFeedbackProgressRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:29
+ */
+public interface UserFeedbackProgressRecordMapper extends BaseMapper<UserFeedbackProgressRecord> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserFeedbackRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserFeedbackRecord;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserFeedbackRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:27
+ */
+public interface UserFeedbackRecordMapper extends BaseMapper<UserFeedbackRecord> {
+}

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/UserRecommendGoodsRecordMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.UserRecommendGoodsRecord;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserRecommendGoodsRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:30
+ */
+public interface UserRecommendGoodsRecordMapper extends BaseMapper<UserRecommendGoodsRecord> {
+}

+ 43 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserFeedbackProgressRecord.java

@@ -0,0 +1,43 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserFeedbackProgressRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:28
+ */
+@Getter
+@Setter
+public class UserFeedbackProgressRecord extends BaseEntity{
+	private Long feedbackId;
+
+	private Long goodsId;
+
+	private String goodsTitle;
+
+	private Long userId;
+
+	/**
+	 * 用户昵称
+	 */
+	private String nickname;
+
+	/**
+	 * 反馈内容
+	 */
+	private String content;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private String phone;
+
+	/**
+	 * 截图
+	 */
+	private String imgs;
+}

+ 44 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserFeedbackRecord.java

@@ -0,0 +1,44 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserFeedbackRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:22
+ */
+@Getter
+@Setter
+public class UserFeedbackRecord extends BaseEntity{
+	private Long userId;
+
+	private String nickname;
+
+	private Long goodsId;
+
+	private String goodsTitle;
+
+	/**
+	 * 描述
+	 */
+	private String description;
+
+	/**
+	 * 手机号
+	 */
+	private String phone;
+
+	/**
+	 * 是否有新留言
+	 */
+	private Boolean isNewMessage;
+
+	/**
+	 * 是否有最新客服回复
+	 */
+	private Boolean isNewReply;
+
+	private Boolean status;
+}

+ 37 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserRecommendGoodsRecord.java

@@ -0,0 +1,37 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserRecommendGoodsReocrd
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:29
+ */
+@Getter
+@Setter
+public class UserRecommendGoodsRecord extends BaseEntity{
+
+	private Long userId;
+
+	/**
+	 * 推荐平台
+	 */
+	private String goodsTitle;
+
+	/**
+	 * 相关参考链接
+	 */
+	private String url;
+
+	/**
+	 * 使用说明
+	 */
+	private String remark;
+
+	/**
+	 * 文件
+	 */
+	private String files;
+}

+ 6 - 2
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaFrontView.java

@@ -13,8 +13,9 @@ import lombok.Setter;
  */
 @Getter
 @Setter
-@SearchBean(tables = "goods_don_qa_relate gr inner join goods_don_qa ga on ga.id = gr.question_id",
-		where = "ga.status is true and ga.deleted is true",
+@SearchBean(tables = "goods_don_qa_relate gr inner join goods_don_qa ga on ga.id = gr.question_id" +
+		" inner join goods_don g on g.id = gr.goods_id",
+		where = "ga.status is true and ga.deleted is true and g.status is true",
 		orderBy = "ga.sorted asc,ga.update_time desc")
 public class GoodsDonQaFrontView {
 	@DbField("ga.id")
@@ -29,6 +30,9 @@ public class GoodsDonQaFrontView {
 	@DbField("gr.goods_id")
 	private Long goodsId;
 
+	@DbField("g.title")
+	private String title;
+
 	@DbField("ga.content")
 	private String content;
 

+ 41 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserFeedbackProgressRecordFrontView.java

@@ -0,0 +1,41 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserFeedbackProgressRecordFrontView
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 16:43
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_feedback_progress_record upr",
+orderBy = "upr.id asc")
+public class UserFeedbackProgressRecordFrontView {
+	@DbField("upr.feedback_id")
+	private Long feedbackId;
+
+	@DbField("upr.user_id")
+	private Long userId;
+
+	@DbField("upr.goods_id")
+	private Long goodsId;
+
+	@DbField("upr.goods_title")
+	private String goodsTitle;
+
+	@DbField("upr.content")
+	private String content;
+
+	@DbField("upr.imgs")
+	private String imgs;
+
+	@DbField("upr.created_time")
+	private Date createdTime;
+}

+ 66 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserFeedbackRecordView.java

@@ -0,0 +1,66 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserFeedbackRecordView
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:46
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_feedback_record ufr left join user u on u.id = ufr.user_id" +
+		" left join goods_don g on g.id = ufr.goods_id",
+orderBy = "ufr.update_time desc")
+public class UserFeedbackRecordView {
+	@DbField("ufr.id")
+	private Long id;
+
+	@DbField("ufr.user_id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	@DbField("ufr.goods_id")
+	private Long goodsId;
+
+	/**
+	 * 平台名称
+	 */
+	@DbField("g.title")
+	private String goodsTitle;
+
+	/**
+	 * 描述
+	 */
+	@DbField("ufr.description")
+	private String description;
+
+	/**
+	 * 手机号
+	 */
+	@DbField("ufr.phone")
+	private String phone;
+
+	/**
+	 * 是否有新留言
+	 */
+	@DbField("ufr.is_new_message")
+	private Boolean isNewMessage;
+
+	@DbField("ufr.status")
+	private Boolean status;
+
+	@DbField("ufr.created_time")
+	private Date createdTime;
+
+	@DbField("ufr.update_time")
+	private Date updateTime;
+}

+ 55 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserRecommendGoodsRecordView.java

@@ -0,0 +1,55 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserRecommendGoodsRecordView
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 16:02
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_recommend_goods_record ur left join user u on u.id = ur.user_id")
+public class UserRecommendGoodsRecordView {
+	@DbField("ur.id")
+	private Long id;
+
+	@DbField("ur.user_id")
+	private Long userId;
+
+	@DbField("u.nickname")
+	private String nickname;
+
+	/**
+	 * 推荐平台
+	 */
+	@DbField("ur.goods_title")
+	private String goodsTitle;
+
+	/**
+	 * 相关参考链接
+	 */
+	@DbField("ur.url")
+	private String url;
+
+	/**
+	 * 使用说明
+	 */
+	@DbField("ur.remark")
+	private String remark;
+
+	@DbField("ur.files")
+	private String files;
+
+	@DbField("ur.created_time")
+	private Date createdTime;
+
+	@DbField("ur.update_time")
+	private Date updateTime;
+}

+ 34 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserRecommendGoodsUserView.java

@@ -0,0 +1,34 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserRecommendGoodsUserView
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:54
+ */
+@Getter
+@Setter
+@SearchBean(tables = "user_recommend_goods_record ur1",
+groupBy = "goods_title")
+public class UserRecommendGoodsUserView{
+
+	@DbField("count(distinct user_id)")
+	private Integer userNum;
+
+	@DbField("any_value(url)")
+	private String url;
+
+	@DbField("any_value(remark)")
+	private String remark;
+
+	@DbField("any_value(files)")
+	private String files;
+
+	@DbField("goods_title")
+	private String goodsTitle;
+}

+ 18 - 0
netflix-service/src/main/java/com/cyksj/service/suggest/UserSuggestService.java

@@ -0,0 +1,18 @@
+package com.cyksj.service.suggest;
+
+import com.cyksj.model.entity.UserFeedbackProgressRecord;
+import com.cyksj.model.entity.UserRecommendGoodsRecord;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSuggestService
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 17:10
+ */
+public interface UserSuggestService {
+	void suggestGoodsUsage(UserFeedbackProgressRecord progressRecord);
+
+	void recommendGoods(UserRecommendGoodsRecord userRecommendGoodsRecord);
+
+	void userFeedbackMsg(UserFeedbackProgressRecord progressRecord);
+}

+ 120 - 0
netflix-service/src/main/java/com/cyksj/service/suggest/impl/UserSuggestServiceImpl.java

@@ -0,0 +1,120 @@
+package com.cyksj.service.suggest.impl;
+
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.*;
+import com.cyksj.model.entity.*;
+import com.cyksj.service.suggest.UserSuggestService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserSuggestServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 17:10
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class UserSuggestServiceImpl implements UserSuggestService {
+	private final UserFeedbackRecordMapper userFeedbackRecordMapper;
+
+	private final UserFeedbackProgressRecordMapper userFeedbackProgressRecordMapper;
+
+	private final UserRecommendGoodsRecordMapper userRecommendGoodsRecordMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final UserMapper userMapper;
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void suggestGoodsUsage(UserFeedbackProgressRecord progressRecord) {
+		Long goodsId = progressRecord.getGoodsId();
+		Long userId = progressRecord.getUserId();
+		String imgs = progressRecord.getImgs();
+		String content = progressRecord.getContent();
+		if (StrUtil.isAllEmpty(imgs, content)) {
+			throw BusinessRuntimeException.getInstance("请填写问题内容或截图");
+		}
+		if (StrUtil.isNotBlank(imgs) && imgs.length() > 2024) {
+			throw BusinessRuntimeException.getInstance("图片过多");
+		}
+		if (StrUtil.isNotEmpty(content) && content.length() > 1000) {
+			throw BusinessRuntimeException.getInstance("问题内容描述过多");
+		}
+		String phone = progressRecord.getPhone();
+		if (StrUtil.isEmpty(phone)) {
+			throw BusinessRuntimeException.getInstance("请输入正确的手机号");
+		}
+		String goodsTitle = null;
+		if (goodsId != null && goodsId != 0) {
+			GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
+			Assert.notNull(goodsDon, "反馈的平台不存在");
+			goodsTitle = goodsDon.getTitle();
+		}
+		User user = userMapper.selectById(userId);
+		UserFeedbackRecord userFeedbackRecord = new UserFeedbackRecord();
+		userFeedbackRecord.setUserId(userId);
+		userFeedbackRecord.setGoodsId(goodsId);
+		userFeedbackRecord.setGoodsTitle(goodsTitle);
+		userFeedbackRecord.setPhone(phone);
+		userFeedbackRecord.setDescription(content);
+		userFeedbackRecord.setNickname(user.getNickname());
+		userFeedbackRecordMapper.insert(userFeedbackRecord);
+
+		progressRecord.setFeedbackId(userFeedbackRecord.getId());
+		progressRecord.setNickname(user.getNickname());
+		userFeedbackProgressRecordMapper.insert(progressRecord);
+	}
+
+	@Override
+	public void recommendGoods(UserRecommendGoodsRecord userRecommendGoodsRecord) {
+		String url = userRecommendGoodsRecord.getUrl();
+		if (StrUtil.isEmpty(url) || url.length() > 512) {
+			throw BusinessRuntimeException.getInstance("请输入正确的参考链接地址");
+		}
+		String goodsTitle = userRecommendGoodsRecord.getGoodsTitle();
+		if (StrUtil.isEmpty(goodsTitle) || goodsTitle.length() > 128) {
+			throw BusinessRuntimeException.getInstance("请填写正确的新品名称");
+		}
+		userRecommendGoodsRecordMapper.insert(userRecommendGoodsRecord);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void userFeedbackMsg(UserFeedbackProgressRecord progressRecord) {
+		Long feedbackId = progressRecord.getFeedbackId();
+		Long userId = progressRecord.getUserId();
+		if (feedbackId == null) {
+			throw BusinessRuntimeException.getInstance("反馈留言错误");
+		}
+		UserFeedbackRecord userFeedbackRecord = userFeedbackRecordMapper.selectOne(Wrappers.lambdaQuery(UserFeedbackRecord.class)
+				.eq(UserFeedbackRecord::getUserId, userId)
+				.eq(UserFeedbackRecord::getId, feedbackId));
+		if (userFeedbackRecord == null) {
+			throw BusinessRuntimeException.getInstance("反馈记录不存在");
+		}
+		String content = progressRecord.getContent();
+		String imgs = progressRecord.getImgs();
+		if (StrUtil.isAllEmpty(imgs, content)) {
+			throw BusinessRuntimeException.getInstance("请填写留言内容或截图");
+		}
+		if (StrUtil.isNotBlank(imgs) && imgs.length() > 2024) {
+			throw BusinessRuntimeException.getInstance("图片过多");
+		}
+		if (StrUtil.isNotEmpty(content) && content.length() > 1000) {
+			throw BusinessRuntimeException.getInstance("留言内容过多");
+		}
+		User user = userMapper.selectById(userId);
+		progressRecord.setNickname(user.getNickname());
+		userFeedbackProgressRecordMapper.insert(progressRecord);
+		userFeedbackRecord.setIsNewMessage(true);
+		userFeedbackRecordMapper.updateById(userFeedbackRecord);
+	}
+}

+ 12 - 0
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -1334,6 +1334,18 @@ public class GoodsDonController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * 获取所有平台列表
+	 */
+	@GetMapping("/get/goods")
+	public Result<List<GoodsDon>> getAllGoodsList() {
+		List<GoodsDon> goodsDons = beanSearcher.searchAll(GoodsDon.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsDon::getStatus, 1)
+				.onlySelect(GoodsDon::getId, GoodsDon::getTitle)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDons);
+	}
+
+
 	/**
 	 * 获取平台销量
 	 * @param goodsId

+ 10 - 0
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -870,6 +870,16 @@ public class GroupRelationController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(donQaFrontViews);
     }
 
+    /**
+     * 车票所有常见问题
+     */
+    @GetMapping("/get/questions")
+    public Result<List<GoodsDonQaFrontView>> getAllTicketQuestions() {
+        List<GoodsDonQaFrontView> donQaFrontViews = beanSearcher.searchAll(GoodsDonQaFrontView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(donQaFrontViews);
+    }
+
+
     /**
      * 是否首次购买车票
      */

+ 114 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/feedback/UserFeedbackController.java

@@ -0,0 +1,114 @@
+package com.cyksj.web.controller.manage.feedback;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserFeedbackProgressRecordMapper;
+import com.cyksj.mapper.UserFeedbackRecordMapper;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.entity.UserFeedbackProgressRecord;
+import com.cyksj.model.entity.UserFeedbackRecord;
+import com.cyksj.model.views.UserFeedbackRecordView;
+import com.cyksj.model.views.UserRecommendGoodsRecordView;
+import com.cyksj.model.views.UserRecommendGoodsUserView;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * admin/投诉与建议
+ * 项目名: yhlxj2
+ * 文件名: UserFeedbackController
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 15:35
+ */
+@RestController
+@RequestMapping("/manage/suggest")
+@RequiredArgsConstructor
+public class UserFeedbackController {
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final UserFeedbackRecordMapper userFeedbackRecordMapper;
+
+	private final CmsUserMapper cmsUserMapper;
+
+	private final UserFeedbackProgressRecordMapper userFeedbackProgressRecordMapper;
+
+	/**
+	 * 使用建议列表
+	 */
+	@GetMapping("/feedback/list")
+	public Result<SearchResult<UserFeedbackRecordView>> getFeedbackList() {
+		SearchResult<UserFeedbackRecordView> search = beanSearcher.search(UserFeedbackRecordView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 标记解决
+	 */
+	@PutMapping("/feedback/mark/status/{id}")
+	public Result<String> markUserFeedbackStatus(@PathVariable Long id) {
+		userFeedbackRecordMapper.update(null, Wrappers.lambdaUpdate(UserFeedbackRecord.class)
+				.set(UserFeedbackRecord::getStatus, 1)
+				.eq(UserFeedbackRecord::getId, id)
+				.eq(UserFeedbackRecord::getStatus, 0));
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 用户反馈留言进度列表
+	 */
+	@GetMapping("/feedback/progress/list")
+	public Result<SearchResult<UserFeedbackProgressRecord>> getFeedbackProgressList() {
+		SearchResult<UserFeedbackProgressRecord> search = beanSearcher.search(UserFeedbackProgressRecord.class, MapUtils.flatBuilder(request.getParameterMap()).orderBy(UserFeedbackProgressRecord::getId).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
+	/**
+	 * 留言回复
+	 */
+	@PostMapping("/feedback/reply")
+	public Result<String> replyFeedback(@RequestBody UserFeedbackProgressRecord userFeedbackProgressRecord) {
+		long adminId = StpUtil.getLoginIdAsLong();
+		CmsUser cmsUser = cmsUserMapper.selectById(adminId);
+		userFeedbackProgressRecord.setNickname(cmsUser.getNickname());
+		userFeedbackProgressRecordMapper.insert(userFeedbackProgressRecord);
+
+		UserFeedbackRecord userFeedbackRecord = userFeedbackRecordMapper.selectById(userFeedbackProgressRecord.getFeedbackId());
+		userFeedbackRecord.setIsNewReply(true);
+		userFeedbackRecordMapper.updateById(userFeedbackRecord);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+
+	//====================================推荐新品======================================
+
+	/**
+	 * 推荐新品列表
+	 */
+	@GetMapping("/recommend/list")
+	public Result<SearchResult<UserRecommendGoodsRecordView>> getRecommendList() {
+		SearchResult<UserRecommendGoodsRecordView> search = beanSearcher.search(UserRecommendGoodsRecordView.class, MapUtils.flatBuilder(request.getParameterMap()).orderBy(UserRecommendGoodsRecordView::getUpdateTime).desc().build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+
+	/**
+	 * 按推荐人数查看列表
+	 */
+	@GetMapping("/recommend/user/list")
+	public Result<SearchResult<UserRecommendGoodsUserView>> getRecommendGoodsUserList() {
+		SearchResult<UserRecommendGoodsUserView> search = beanSearcher.search(UserRecommendGoodsUserView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+}

+ 147 - 0
netflix-web/src/main/java/com/cyksj/web/controller/suggest/UserSuggestController.java

@@ -0,0 +1,147 @@
+package com.cyksj.web.controller.suggest;
+
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UserFeedbackRecordMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.model.entity.UserFeedbackProgressRecord;
+import com.cyksj.model.entity.UserFeedbackRecord;
+import com.cyksj.model.entity.UserRecommendGoodsRecord;
+import com.cyksj.model.views.UserFeedbackProgressRecordFrontView;
+import com.cyksj.service.suggest.UserSuggestService;
+import com.cyksj.service.user.UserBindRelationService;
+import com.cyksj.web.util.StpUserUtil;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * server/投诉建议
+ * 项目名: yhlxj2
+ * 文件名: UserSuggestController
+ * 创建者: JavaZou
+ * 创建时间:2024/10/11 16:05
+ */
+@RestController
+@RequestMapping("/applets/user/suggest")
+@RequiredArgsConstructor
+public class UserSuggestController {
+
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final UserMapper userMapper;
+
+	private final UserFeedbackRecordMapper userFeedbackRecordMapper;
+
+	private final UserSuggestService userSuggestService;
+
+	private final UserBindRelationService userBindRelationService;
+
+
+	/**
+	 * 平台使用建议
+	 */
+	@PostMapping("/goods/usage")
+	public Result<String> suggestGoodsUsage(@RequestBody UserFeedbackProgressRecord progressRecord) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		progressRecord.setUserId(userId);
+		userSuggestService.suggestGoodsUsage(progressRecord);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 是否有最新留言
+	 */
+	@GetMapping("/goods/usage/isReply")
+	public Result<Boolean> isSuggestReply() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		Integer selectCount = userFeedbackRecordMapper.selectCount(Wrappers.lambdaQuery(UserFeedbackRecord.class)
+				.in(UserFeedbackRecord::getUserId, userIdList)
+				.eq(UserFeedbackRecord::getIsNewReply, 1));
+		return GatewayResponse.SUCCESS.newBuilder().toResult(selectCount > 0);
+	}
+
+	/**
+	 * 用户建议反馈列表
+	 */
+	@GetMapping("/goods/usage/feedback/list")
+	public Result<SearchResult<UserFeedbackRecord>> getFeedbackList() {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		SearchResult<UserFeedbackRecord> search = beanSearcher.search(UserFeedbackRecord.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(UserFeedbackRecord::getUserId, userIdList).op(Operator.InList)
+				.orderBy(UserFeedbackRecord::getUpdateTime).desc()
+				.onlySelect(UserFeedbackRecord::getId, UserFeedbackRecord::getGoodsId, UserFeedbackRecord::getIsNewReply, UserFeedbackRecord::getDescription, UserFeedbackRecord::getGoodsTitle, UserFeedbackRecord::getCreatedTime, UserFeedbackRecord::getUpdateTime)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 用户建议反馈留言
+	 */
+	@PostMapping("/feedback/msg")
+	public Result<String> userFeedbackMsg(@RequestBody UserFeedbackProgressRecord progressRecord) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		progressRecord.setUserId(userId);
+		userSuggestService.userFeedbackMsg(progressRecord);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 用户查看最新反馈内容
+	 */
+	@GetMapping("/goods/usage/feedback/content/list")
+	public Result<List<UserFeedbackProgressRecordFrontView>> getFeedbackContentList(Long feedbackId) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		Assert.notNull(feedbackId, "查看错误");
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		userIdList.add(0l);
+		List<UserFeedbackProgressRecordFrontView> search = beanSearcher.searchAll(UserFeedbackProgressRecordFrontView.class, MapUtils.flatBuilder(request.getParameterMap())
+				.field(UserFeedbackProgressRecordFrontView::getFeedbackId, feedbackId)
+				.field(UserFeedbackProgressRecordFrontView::getUserId, userIdList).op(Operator.InList)
+				.build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 记录用户推荐上架新品
+	 */
+	@PostMapping("/recommend/goods")
+	public Result<String> recommendGoods(@RequestBody UserRecommendGoodsRecord userRecommendGoodsRecord) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		userRecommendGoodsRecord.setUserId(userId);
+		userSuggestService.recommendGoods(userRecommendGoodsRecord);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 标记留意已读
+	 */
+	@PutMapping("/update/status/{feedBackId}")
+	public Result<String> updateFeedBackStatus(@PathVariable Long feedBackId) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		Optional.ofNullable(userFeedbackRecordMapper.selectById(feedBackId)).ifPresent(fe->{
+			if (userIdList.contains(fe.getUserId())) {
+				fe.setIsNewReply(false);
+				userFeedbackRecordMapper.updateById(fe);
+			}
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}
+