Selaa lähdekoodia

平台常见问题

zoujiajian 2 vuotta sitten
vanhempi
sitoutus
15a5b091e3
21 muutettua tiedostoa jossa 570 lisäystä ja 1 poistoa
  1. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonQaMapper.java
  2. 22 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonQaRelateMapper.java
  3. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/UserGoodsNewbieGuideRecordMapper.java
  4. 47 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonQa.java
  5. 22 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonQaRelate.java
  6. 19 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserGoodsNewbieGuideRecord.java
  7. 37 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaFrontView.java
  8. 18 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaGoodsView.java
  9. 47 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaView.java
  10. 3 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  11. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  12. 14 0
      netflix-dao/src/main/resources/mapper/GoodsDonQaRelateMapper.xml
  13. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  14. 16 0
      netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonQaService.java
  15. 2 0
      netflix-service/src/main/java/com/cyksj/service/mange/RefreshCacheService.java
  16. 80 0
      netflix-service/src/main/java/com/cyksj/service/mange/goods/GoodsDonQaServiceImpl.java
  17. 10 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/RefreshCacheServiceImpl.java
  18. 6 1
      netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java
  19. 2 0
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  20. 47 0
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  21. 145 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/GoodsDonQuestionController.java

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

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

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonQaRelateMapper.java

@@ -0,0 +1,22 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GoodsDonQaRelate;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQaRelateMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 16:13
+ */
+public interface GoodsDonQaRelateMapper extends BaseMapper<GoodsDonQaRelate> {
+
+	@Select("select g.id from (select goods_id from goods_don_qa_relate where question_id = #{questionId}) gqr inner join goods_don g on g.id = gqr.goods_id")
+	List<Long> getQaGoodsByQaId(Long questionId);
+
+	void batchInsert(@Param("id") Long id, @Param("list") List<Long> goodsIds);
+}

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

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

+ 47 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonQa.java

@@ -0,0 +1,47 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQa
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 11:47
+ */
+@Getter
+@Setter
+public class GoodsDonQa extends BaseEntity{
+
+	/**
+	 * 1.售前,2.售后
+	 */
+	private Integer type;
+
+	private String problem;
+
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String content;
+
+	/**
+	 * 跳转链接
+	 */
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private String url;
+
+	private Boolean status;
+
+	private Boolean deleted;
+
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private Integer sorted;
+
+	@DbIgnore
+	@TableField(exist = false)
+	private List<Long> goodsIds;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonQaRelate.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQaRelate
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 11:49
+ */
+
+@Getter
+@Setter
+public class GoodsDonQaRelate extends BaseEntity{
+
+	private Long questionId;
+
+	private Long goodsId;
+
+	private Boolean deleted;
+}

+ 19 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserGoodsNewbieGuideRecord.java

@@ -0,0 +1,19 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserGoodsNewbieGuideRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/5/27 12:12
+ */
+@Getter
+@Setter
+public class UserGoodsNewbieGuideRecord extends BaseEntity{
+
+	private Long userId;
+
+	private Long goodsId;
+}

+ 37 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaFrontView.java

@@ -0,0 +1,37 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQaFrontView
+ * 创建者: JavaZou
+ * 创建时间:2024/5/27 11:07
+ */
+@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",
+		orderBy = "ga.sorted asc,ga.update_time desc")
+public class GoodsDonQaFrontView {
+	@DbField("ga.id")
+	private Long id;
+
+	@DbField("ga.problem")
+	private String problem;
+
+	@DbField("ga.type")
+	private Integer type;
+
+	@DbField("gr.goods_id")
+	private Long goodsId;
+
+	@DbField("ga.content")
+	private String content;
+
+	@DbField("ga.url")
+	private String url;
+}

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaGoodsView.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.views;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQaGoodsView
+ * 创建者: JavaZou
+ * 创建时间:2024/5/27 13:33
+ */
+@Getter
+@Setter
+public class GoodsDonQaGoodsView {
+	private Long goodsId;
+
+	private String title;
+}

+ 47 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonQaView.java

@@ -0,0 +1,47 @@
+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
+ * 文件名: GoodsDonQaView
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 16:04
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_qa gq left join goods_don_qa_relate gqr on gqr.question_id = gq.id" +
+		" left join goods_don g on g.id = gqr.goods_id",
+		where = "gq.deleted is true",
+		orderBy = "gq.sorted is null asc,gq.sorted asc",
+		groupBy = "gq.id,gq.type,gq.problem,gq.status,gq.created_time,gq.update_time")
+public class GoodsDonQaView {
+	@DbField("gq.id")
+	private Long id;
+
+	@DbField("gq.type")
+	private Integer type;
+
+	@DbField("gq.problem")
+	private String problem;
+
+	@DbField("GROUP_CONCAT(g.title)")
+	private String title;
+
+	@DbField("gq.status")
+	private Boolean status;
+
+	@DbField("gq.sorted")
+	private Integer sorted;
+
+	@DbField("gq.created_time")
+	private Date createdTime;
+
+	@DbField("gq.update_time")
+	private Date updateTime;
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java

@@ -163,4 +163,7 @@ public class GoodsFrontListView {
 
 	@DbIgnore
 	private OrderCommentFrontView comments;
+
+	@DbIgnore
+	private List<GoodsDonQaFrontView> questions;
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -204,4 +204,10 @@ public class RenewalView {
      */
     @DbIgnore
     private BigDecimal mjPackagePrice;
+
+    /**
+     * 是否有配置售后问题
+     */
+    @DbIgnore
+    private Boolean qa;
 }

+ 14 - 0
netflix-dao/src/main/resources/mapper/GoodsDonQaRelateMapper.xml

@@ -0,0 +1,14 @@
+<?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.cyksj.mapper.GoodsDonQaRelateMapper">
+
+
+    <insert id="batchInsert">
+        insert ignore into
+        goods_don_qa_relate(`question_id`,`goods_id`,`created_time`,`update_time`)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{id},#{item},now(),now())
+        </foreach>
+    </insert>
+</mapper>

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -773,6 +773,7 @@ public class RedisService {
         H5_WEB_CACHE("h5_web_cache", "h5首页平台缓存", 10 * 60),
         YH_HOME_PAGHE_CACHE("yh_home_paghe_cache:", "银河首页缓存", 30 * 60),
         YH_HOME_PAGHE_CACHE_SHOP("yh_home_paghe_cache:shop:", "银河首页店铺缓存", 40 * 60),
+        YH_GOODS_QUESTIONS_DETAIL("yh_goods_questions_detail:%s:%s", "平台售后问题", 60 * 60 * 24),
         REGISTER_HOME_PAGE_CACHE("register_home_page_cache:", "注册首页缓存", 10 * 60),
         CPS_BACK_LOGIN_KEY("cps_back_login:", "cps商务后台登录key", 3 * 60),
         CPS_AUTH_SUCCESS_KEY("cps_auth_success_key:%s", "cps后台微信授权", 60 * 10),

+ 16 - 0
netflix-service/src/main/java/com/cyksj/service/mange/GoodsDonQaService.java

@@ -0,0 +1,16 @@
+package com.cyksj.service.mange;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.entity.GoodsDonQa;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQaService
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 15:57
+ */
+public interface GoodsDonQaService extends IService<GoodsDonQa> {
+	void saveOrdUpdateQa(GoodsDonQa goodsDonQa);
+
+	GoodsDonQa getDetailById(Long id);
+}

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/mange/RefreshCacheService.java

@@ -30,4 +30,6 @@ public interface RefreshCacheService {
 	 * 清除用户店铺缓存
 	 */
 	void refreshUserShopMangeCache(String customId);
+
+	void goodsQuestionCache();
 }

+ 80 - 0
netflix-service/src/main/java/com/cyksj/service/mange/goods/GoodsDonQaServiceImpl.java

@@ -0,0 +1,80 @@
+package com.cyksj.service.mange.goods;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.mapper.GoodsDonQaMapper;
+import com.cyksj.mapper.GoodsDonQaRelateMapper;
+import com.cyksj.model.entity.GoodsDonQa;
+import com.cyksj.model.entity.GoodsDonQaRelate;
+import com.cyksj.service.mange.GoodsDonQaService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQaServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 15:57
+ */
+@Service
+@RequiredArgsConstructor
+public class GoodsDonQaServiceImpl extends ServiceImpl<GoodsDonQaMapper, GoodsDonQa> implements GoodsDonQaService {
+	private final GoodsDonQaRelateMapper goodsDonQaRelateMapper;
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void saveOrdUpdateQa(GoodsDonQa goodsDonQa) {
+		checkQAParams(goodsDonQa);
+
+		Long id = goodsDonQa.getId();
+		List<Long> goodsIds = goodsDonQa.getGoodsIds();
+		if (id != null) {
+			goodsDonQaRelateMapper.delete(Wrappers.lambdaQuery(GoodsDonQaRelate.class).notIn(GoodsDonQaRelate::getGoodsId, goodsIds).eq(GoodsDonQaRelate::getQuestionId, id));
+			this.updateById(goodsDonQa);
+		} else {
+			this.save(goodsDonQa);
+			id = goodsDonQa.getId();
+		}
+		goodsDonQaRelateMapper.batchInsert(id, goodsIds);
+	}
+
+	private void checkQAParams(GoodsDonQa goodsDonQa) {
+		String problem = goodsDonQa.getProblem();
+		Integer type = goodsDonQa.getType();
+		if (type == null || type < 1 || type > 2) {
+			throw BusinessRuntimeException.getInstance("请选择对应问题类型");
+		}
+		if (StrUtil.isEmpty(problem)) {
+			throw BusinessRuntimeException.getInstance("问题不为空");
+		}
+		String url = goodsDonQa.getUrl();
+		String content = goodsDonQa.getContent();
+		if (ObjectUtil.isAllEmpty(url, content)) {
+			throw BusinessRuntimeException.getInstance("请选择对应回答");
+		}
+		if (StrUtil.isNotBlank(url)) {
+			goodsDonQa.setContent(null);
+		}
+		if (StrUtil.isNotBlank(content)) {
+			goodsDonQa.setUrl(null);
+		}
+		List<Long> goodsIds = goodsDonQa.getGoodsIds();
+		if (CollUtil.isEmpty(goodsIds)) {
+			throw BusinessRuntimeException.getInstance("请选择对应展示平台");
+		}
+	}
+
+	@Override
+	public GoodsDonQa getDetailById(Long id) {
+		GoodsDonQa byId = this.getById(id);
+		byId.setGoodsIds(goodsDonQaRelateMapper.getQaGoodsByQaId(id));
+		return byId;
+	}
+}

+ 10 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/RefreshCacheServiceImpl.java

@@ -50,4 +50,14 @@ public class RefreshCacheServiceImpl implements RefreshCacheService {
 		Set<String> keys = redisService.keys(RedisService.key.YH_HOME_PAGHE_CACHE_SHOP.getEnvName() + customId + "*");
 		redisService.del(keys.toArray(String[]::new));
 	}
+
+	@Override
+	public void goodsQuestionCache() {
+		//售前
+		String goodsQuestionKey = RedisService.key.YH_HOME_PAGHE_CACHE.getEnvName() + "goods_detail:*";
+		Set<String> keys = redisService.keys(goodsQuestionKey);
+		redisService.del(keys.toArray(String[]::new));
+		//售后缓存
+		redisService.del(redisService.keys(RedisService.key.YH_GOODS_QUESTIONS_DETAIL.name().toLowerCase() + "*").toArray(String[]::new));
+	}
 }

+ 6 - 1
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -109,9 +109,10 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	//脆球邮箱后缀
 	private final static String CUI_QIU_EMAIL_SUFFIX = "@kindvd.com";
+
 	private final UpgradePackageMapper upgradePackageMapper;
 
-	private final static String VERIFY_CODE_SECRET = "q1w2e3";
+	private final GoodsDonQaRelateMapper goodsDonQaRelateMapper;
 
 	@Override
 	public SearchResult<RenewalView> getMyTicket(long userId, Boolean isLoginPopularize, String customId, String account) {
@@ -247,6 +248,10 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 				Integer codeNum = getUserCodeNumBySkuId(ticket.getUserId(), ticket.getSkuId(), isHasVerifyCode);
 				ticket.setCodeNum(codeNum);
 			}
+			Integer qa = goodsDonQaRelateMapper.selectCount(Wrappers.lambdaQuery(GoodsDonQaRelate.class)
+					.eq(GoodsDonQaRelate::getGoodsId, ticket.getGoodsId())
+					.eq(GoodsDonQaRelate::getDeleted, 1));
+			ticket.setQa(qa > 0 ? true : false);
 		});
 		userLoginRecordService.saveUserLoginDayRecord(userId);
 		return list;

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

@@ -374,6 +374,8 @@ public class GoodsDonController {
 			Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
 					.eq(OrderDon::getGoodsId, views.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
 			views.setSold(sold + views.getSold());
+			List<GoodsDonQaFrontView> donQaFrontViews = beanSearcher.searchAll(GoodsDonQaFrontView.class, MapUtils.builder().field(GoodsDonQaFrontView::getGoodsId, id).field(GoodsDonQaFrontView::getType, 1).build());
+			views.setQuestions(donQaFrontViews);
 			redisService.setNx(goodsDetailKey, views, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 60 * RandomUtil.randomInt(10));
 			o = redisService.get(goodsDetailKey);
 		}

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

@@ -118,6 +118,8 @@ public class GroupRelationController {
 
     private final AccountBlockedReplaceRecordMapper accountBlockedReplaceRecordMapper;
 
+    private final UserGoodsNewbieGuideRecordMapper userGoodsNewbieGuideRecordMapper;
+
     private final static Sequence SEQUENCE = new Sequence(0);
 
     @RequestMapping("/get/renewal")
@@ -763,4 +765,49 @@ public class GroupRelationController {
         List<RenewalView> expiryRenewals = groupRelationFrontService.getExpiryRenewalNotify(userId);
         return GatewayResponse.SUCCESS.newBuilder().toResult(expiryRenewals);
     }
+
+    /**
+     * 车票售后常见问题
+     */
+    @GetMapping("/get/questions/{goodsId}")
+    public Result<List<GoodsDonQaFrontView>> getTicketQuestions(@PathVariable Long goodsId, @RequestParam(defaultValue = "1") Integer type) {
+        if (type < 1 || type > 2) {
+            return GatewayResponse.SUCCESS.newBuilder().toResult();
+        }
+        String key = RedisService.key.YH_GOODS_QUESTIONS_DETAIL.getNameFormat(type, goodsId);
+        Object o = redisService.get(key);
+        if (o == null) {
+            List<GoodsDonQaFrontView> donQaFrontViews = beanSearcher.searchAll(GoodsDonQaFrontView.class, MapUtils.builder().field(GoodsDonQaFrontView::getGoodsId, goodsId).field(GoodsDonQaFrontView::getType, type).build());
+            if (CollUtil.isEmpty(donQaFrontViews)) {
+                return GatewayResponse.SUCCESS.newBuilder().toResult();
+            }
+            redisService.setNx(key, donQaFrontViews, RedisService.key.YH_GOODS_QUESTIONS_DETAIL.getTimeout());
+            o = redisService.get(key);
+        }
+        List<GoodsDonQaFrontView> donQaFrontViews = Jsons.parseList(o, GoodsDonQaFrontView.class);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(donQaFrontViews);
+    }
+
+    /**
+     * 是否首次购买车票
+     */
+    @GetMapping("/get/first/pay/{goodsId}")
+    public Result<Boolean> getFirstPay(@PathVariable Long goodsId) {
+        long userId = StpUserUtil.getLoginIdAsLong();
+        List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+        Number number = beanSearcher.searchCount(OrderDon.class, MapUtils.builder()
+                .field(OrderDon::getGoodsId, goodsId)
+                .field(OrderDon::getCreatedTime, new DateTime().toDateStr()).op(Operator.LessEqual)
+                .field(OrderDon::getUserId, userIdList).op(Operator.InList)
+                .field(OrderDon::getStatus, Constant.noOrderStatus).op(Operator.NotIn)
+                .build());
+        if (number.intValue() == 0) {
+            UserGoodsNewbieGuideRecord userGoodsNewbieGuideRecord = new UserGoodsNewbieGuideRecord();
+            userGoodsNewbieGuideRecord.setGoodsId(goodsId);
+            userGoodsNewbieGuideRecord.setUserId(userId);
+            userGoodsNewbieGuideRecordMapper.insert(userGoodsNewbieGuideRecord);
+            return GatewayResponse.SUCCESS.newBuilder().toResult(true);
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(false);
+    }
 }

+ 145 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/GoodsDonQuestionController.java

@@ -0,0 +1,145 @@
+package com.cyksj.web.controller.manage.goods;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonQaRelateMapper;
+import com.cyksj.model.entity.GoodsDonQa;
+import com.cyksj.model.entity.GoodsDonQaRelate;
+import com.cyksj.model.views.GoodsDonQaView;
+import com.cyksj.service.mange.GoodsDonQaService;
+import com.cyksj.service.mange.RefreshCacheService;
+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;
+import java.util.List;
+
+/** admin/平台管理/常见问题
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonQuestionController
+ * 创建者: JavaZou
+ * 创建时间:2024/5/24 15:52
+ */
+@RequestMapping("/manage/goods/question")
+@RestController
+@RequiredArgsConstructor
+public class GoodsDonQuestionController {
+
+	private final GoodsDonQaService goodsDonQaService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final HttpServletRequest request;
+
+	private final RefreshCacheService refreshCacheService;
+
+	private final GoodsDonQaRelateMapper goodsDonQaRelateMapper;
+
+
+	/**
+	 * 新增问题
+	 */
+	@PostMapping("/post")
+	public Result<String> post(@RequestBody GoodsDonQa goodsDonQa) {
+		goodsDonQaService.saveOrdUpdateQa(goodsDonQa);
+		refreshCacheService.goodsQuestionCache();
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 删除问题
+	 */
+	@DeleteMapping("/del/{id}")
+	public Result<String> delById(@PathVariable Long id) {
+		GoodsDonQa byId = goodsDonQaService.getById(id);
+		if (byId != null && byId.getDeleted()) {
+			byId.setDeleted(false);
+			goodsDonQaService.updateById(byId);
+			goodsDonQaRelateMapper.update(null, Wrappers.lambdaUpdate(GoodsDonQaRelate.class)
+					.set(GoodsDonQaRelate::getDeleted, 0)
+					.eq(GoodsDonQaRelate::getQuestionId, id)
+					.eq(GoodsDonQaRelate::getDeleted, 1));
+			refreshCacheService.goodsQuestionCache();
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 更新问题
+	 */
+	@PutMapping("/update")
+	public Result<String> update(@RequestBody GoodsDonQa goodsDonQa) {
+		goodsDonQaService.saveOrdUpdateQa(goodsDonQa);
+		refreshCacheService.goodsQuestionCache();
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 上下架
+	 */
+	@PutMapping("/update/status/{id}")
+	public Result<String> updateStatusById(@PathVariable Long id) {
+		GoodsDonQa byId = goodsDonQaService.getById(id);
+		if (byId != null) {
+			byId.setStatus(!byId.getStatus());
+			goodsDonQaService.updateById(byId);
+			refreshCacheService.goodsQuestionCache();
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 批量上下架
+	 */
+	@PutMapping("/update/status/batch")
+	public Result<String> batchUpdateStatusByIds(@RequestParam("ids") List<Long> ids, Boolean status) {
+		goodsDonQaService.update(null, Wrappers.lambdaUpdate(GoodsDonQa.class)
+				.set(GoodsDonQa::getStatus, status)
+				.ne(GoodsDonQa::getStatus, status)
+				.in(GoodsDonQa::getId, ids)
+				.eq(GoodsDonQa::getDeleted, 1));
+		refreshCacheService.goodsQuestionCache();
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+
+	/**
+	 * 问题列表
+	 */
+	@GetMapping("/get")
+	public Result<SearchResult<GoodsDonQaView>> get() {
+		SearchResult<GoodsDonQaView> search = beanSearcher.search(GoodsDonQaView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
+	/**
+	 * 问题详情
+	 */
+	@GetMapping("/get/detail/{id}")
+	public Result<GoodsDonQa> getDetailById(@PathVariable Long id) {
+		GoodsDonQa byId = goodsDonQaService.getDetailById(id);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(byId);
+	}
+
+	/**
+	 * 排序
+	 */
+	@PutMapping("/sorted")
+	public Result<String> sorted(@RequestBody GoodsDonQa goodsDonQa) {
+		Long id = goodsDonQa.getId();
+		Integer sorted = goodsDonQa.getSorted();
+		GoodsDonQa byId = goodsDonQaService.getById(id);
+		if (byId != null) {
+			byId.setSorted(sorted);
+			goodsDonQaService.updateById(byId);
+			refreshCacheService.goodsQuestionCache();
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}