diff --git a/food-common/src/main/java/com/zbkj/common/model/product/StoreProductProblem.java b/food-common/src/main/java/com/zbkj/common/model/product/StoreProductProblem.java index 474f4d9..0944878 100644 --- a/food-common/src/main/java/com/zbkj/common/model/product/StoreProductProblem.java +++ b/food-common/src/main/java/com/zbkj/common/model/product/StoreProductProblem.java @@ -1,5 +1,6 @@ package com.zbkj.common.model.product; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -14,29 +15,49 @@ public class StoreProductProblem implements Serializable { private static final long serialVersionUID = 1L; /** - * ID + * 主键id */ - @TableId + @TableId(value = "id", type = IdType.AUTO) private Integer id; + /** - * 商品id + * 业务外键id */ - private Integer productId; + private Integer businessId; + /** - * 问题 + * 用户id */ - private String problem; + private Integer uid; + /** - * 答案 + * 内容 */ - private String answer; + private String content; + + /** + * 父节点评论,0为根节点 + */ + private Integer parentId; + + /** + * 一级评论ID,0为根节点 + */ + private Integer topId; + /** * 创建时间 */ private Date createTime; + /** - * 更新时间 + * 是否删除: 0(未删除), 1(已删除), 2(递归删除) */ - private Date updateTime; + private Integer isDel; + + /** + * 点赞数 + */ + private Integer praiseNum; } diff --git a/food-common/src/main/java/com/zbkj/common/request/CommitProblemRequest.java b/food-common/src/main/java/com/zbkj/common/request/CommitProblemRequest.java new file mode 100644 index 0000000..26991e0 --- /dev/null +++ b/food-common/src/main/java/com/zbkj/common/request/CommitProblemRequest.java @@ -0,0 +1,28 @@ +package com.zbkj.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CommitProblemRequest对象", description="CommitProblemRequest对象") +public class CommitProblemRequest implements Serializable { + + @NotNull(message = "回复内容不能为空") + @ApiModelProperty(value = "回复内容", required = true) + private String content; + + @ApiModelProperty(value = "业务编号:顶级评论时必传") + private String businessId; + + @ApiModelProperty(value = "回复对象标识:回复评论时必传") + private String majorId; + +} diff --git a/food-common/src/main/java/com/zbkj/common/response/ProductProblemResponse.java b/food-common/src/main/java/com/zbkj/common/response/ProductProblemResponse.java index 7de2739..bfef9d2 100644 --- a/food-common/src/main/java/com/zbkj/common/response/ProductProblemResponse.java +++ b/food-common/src/main/java/com/zbkj/common/response/ProductProblemResponse.java @@ -16,10 +16,37 @@ import java.util.List; public class ProductProblemResponse { private static final long serialVersionUID=1L; - @ApiModelProperty(value = "问题") - private String problem; + @ApiModelProperty(value = "编号") + private String majorId; - @ApiModelProperty(value = "答案") - private String answer; + @ApiModelProperty(value = "用户编号:不返回") + private String userId; + + @ApiModelProperty(value = "用户昵称") + private String nickName; + + @ApiModelProperty(value = "用户昵称") + private String imageUrl; + + @ApiModelProperty(value = "时间") + private String createTime; + + @ApiModelProperty(value = "内容") + private String content; + + @ApiModelProperty(value = "子评论数量") + private Integer sonNum = 0; + + @ApiModelProperty(value = "被回复者") + private String beReplier = ""; + + @ApiModelProperty(value = "点赞数") + private Integer praiseCount = 0; + + @ApiModelProperty(value = "是否点赞 0没,1有") + private Integer praise = 0; + + @ApiModelProperty(value = "可删除标识:0不可删除,1可删除") + private Integer delFlag = 0; } diff --git a/food-common/src/main/java/com/zbkj/common/response/ProductRelationResponse.java b/food-common/src/main/java/com/zbkj/common/response/ProductRelationResponse.java index 077f778..aa6573e 100644 --- a/food-common/src/main/java/com/zbkj/common/response/ProductRelationResponse.java +++ b/food-common/src/main/java/com/zbkj/common/response/ProductRelationResponse.java @@ -1,7 +1,5 @@ package com.zbkj.common.response; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,17 +7,11 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; -import java.math.BigDecimal; -import java.util.List; -/** - * 申请退款订单响应对象 - - */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) -@ApiModel(value="ProductRelationResponse对象", description="关联商品响应对象") +@ApiModel(value="ProductRelationResponse对象", description="ProductRelationResponse对象") public class ProductRelationResponse implements Serializable { private static final long serialVersionUID = 1387727608277207652L; diff --git a/food-front/src/main/java/com/zbkj/front/config/WebConfig.java b/food-front/src/main/java/com/zbkj/front/config/WebConfig.java index 1598527..414342e 100644 --- a/food-front/src/main/java/com/zbkj/front/config/WebConfig.java +++ b/food-front/src/main/java/com/zbkj/front/config/WebConfig.java @@ -83,6 +83,8 @@ public class WebConfig implements WebMvcConfigurer { excludePathPatterns("/api/front/image/domain"). excludePathPatterns("/api/front/product/leaderboard"). excludePathPatterns("/api/front/setMeal/**"). + excludePathPatterns("/api/front/problem/*"). + excludePathPatterns("/api/front/problem/son/*"). excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**"); } diff --git a/food-front/src/main/java/com/zbkj/front/controller/ProblemController.java b/food-front/src/main/java/com/zbkj/front/controller/ProblemController.java new file mode 100644 index 0000000..e74fda3 --- /dev/null +++ b/food-front/src/main/java/com/zbkj/front/controller/ProblemController.java @@ -0,0 +1,70 @@ +package com.zbkj.front.controller; + + +import com.zbkj.common.page.CommonPage; +import com.zbkj.common.request.*; +import com.zbkj.common.response.*; +import com.zbkj.common.vo.CategoryTreeVo; +import com.zbkj.front.service.ProductService; +import com.zbkj.service.service.StoreProductProblemService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Slf4j +@RestController("ProblemController") +@RequestMapping("api/front") +@Api(tags = "商品常见问题") +public class ProblemController { + + @Autowired private StoreProductProblemService storeProductProblemService; + + @ApiOperation(value = "常见问题列表") + @RequestMapping(value = "/problem/{productId}", method = RequestMethod.GET) + public CommonResult> getResponseList(@PathVariable Integer productId, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(storeProductProblemService.getResponseList(productId, pageParamRequest)); + } + + @ApiOperation(value = "常见问题列表-子回复列表") + @RequestMapping(value = "/problem/son/{majorId}", method = RequestMethod.GET) + public CommonResult> getSonResponseList(@PathVariable Integer majorId, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(storeProductProblemService.getSonResponseList(majorId, pageParamRequest)); + } + + @ApiOperation(value = "常见问题-提问/回复") + @PostMapping("/problem/commit") + public CommonResult commitProblem(@RequestBody CommitProblemRequest request) { + if (storeProductProblemService.commitProblem(request) > 0) { + return CommonResult.success(); + } + return CommonResult.failed("提交失败"); + } + + @ApiOperation(value = "常见问题-点赞/取消点赞") + @RequestMapping(value = "/problem/praise/{majorId}", method = RequestMethod.GET) + public CommonResult praise(@PathVariable Integer majorId) { + if (storeProductProblemService.praiseProblem(majorId) > 0) { + return CommonResult.success(); + } + return CommonResult.failed("操作失败"); + } + + @ApiOperation(value = "常见问题列表-删除") + @RequestMapping(value = "/problem/del/{majorId}", method = RequestMethod.GET) + public CommonResult delProblem(@PathVariable Integer majorId) { + if (storeProductProblemService.delProblem(majorId) > 0) { + return CommonResult.success(); + } + return CommonResult.failed("删除失败"); + } + +} + + + diff --git a/food-front/src/main/java/com/zbkj/front/controller/ProductController.java b/food-front/src/main/java/com/zbkj/front/controller/ProductController.java index 98ebd0e..f060dac 100644 --- a/food-front/src/main/java/com/zbkj/front/controller/ProductController.java +++ b/food-front/src/main/java/com/zbkj/front/controller/ProductController.java @@ -2,13 +2,11 @@ package com.zbkj.front.controller; import com.zbkj.common.page.CommonPage; -import com.zbkj.common.request.GetReplyListRequest; -import com.zbkj.common.request.PageParamRequest; -import com.zbkj.common.request.ProductListRequest; -import com.zbkj.common.request.ProductRequest; +import com.zbkj.common.request.*; import com.zbkj.common.response.*; import com.zbkj.common.vo.CategoryTreeVo; import com.zbkj.front.service.ProductService; +import com.zbkj.service.service.StoreProductProblemService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -30,8 +28,7 @@ import java.util.List; @Api(tags = "商品") public class ProductController { - @Autowired - private ProductService productService; + @Autowired private ProductService productService; /** * 1.购物车/我的为你推荐(是否热卖) diff --git a/food-front/src/main/java/com/zbkj/front/service/ProductService.java b/food-front/src/main/java/com/zbkj/front/service/ProductService.java index 780ab58..5a8c8fc 100644 --- a/food-front/src/main/java/com/zbkj/front/service/ProductService.java +++ b/food-front/src/main/java/com/zbkj/front/service/ProductService.java @@ -96,4 +96,5 @@ public interface ProductService { * @return */ CommonPage getProductListByType(Integer type, PageParamRequest pageParamRequest); + } diff --git a/food-front/src/main/java/com/zbkj/front/service/impl/ProductServiceImpl.java b/food-front/src/main/java/com/zbkj/front/service/impl/ProductServiceImpl.java index 26d1b36..131141e 100644 --- a/food-front/src/main/java/com/zbkj/front/service/impl/ProductServiceImpl.java +++ b/food-front/src/main/java/com/zbkj/front/service/impl/ProductServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.zbkj.common.constants.CategoryConstants; import com.zbkj.common.constants.Constants; @@ -90,6 +91,9 @@ public class ProductServiceImpl implements ProductService { @Autowired private UserVisitRecordService userVisitRecordService; + @Autowired + private StoreProductProblemService storeProductProblemService; + @Override public List getCategoryTop() { LambdaQueryWrapper lq = new LambdaQueryWrapper<>(); diff --git a/food-service/src/main/java/com/zbkj/service/dao/StoreProductProblemDao.java b/food-service/src/main/java/com/zbkj/service/dao/StoreProductProblemDao.java index bfc83e3..29e2291 100644 --- a/food-service/src/main/java/com/zbkj/service/dao/StoreProductProblemDao.java +++ b/food-service/src/main/java/com/zbkj/service/dao/StoreProductProblemDao.java @@ -2,7 +2,14 @@ package com.zbkj.service.dao; import com.zbkj.common.model.product.StoreProductProblem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zbkj.common.response.ProductProblemResponse; + +import java.util.List; public interface StoreProductProblemDao extends BaseMapper { + List getResponseList(Integer productId); + + List getSonResponseList(Integer majorId); + } diff --git a/food-service/src/main/java/com/zbkj/service/service/StoreProductProblemService.java b/food-service/src/main/java/com/zbkj/service/service/StoreProductProblemService.java index bd2c338..8deda04 100644 --- a/food-service/src/main/java/com/zbkj/service/service/StoreProductProblemService.java +++ b/food-service/src/main/java/com/zbkj/service/service/StoreProductProblemService.java @@ -3,7 +3,24 @@ package com.zbkj.service.service; import com.baomidou.mybatisplus.extension.service.IService; import com.zbkj.common.model.product.StoreProductProblem; +import com.zbkj.common.page.CommonPage; +import com.zbkj.common.request.CommitProblemRequest; +import com.zbkj.common.request.PageParamRequest; +import com.zbkj.common.response.ProductProblemResponse; + +import java.util.List; public interface StoreProductProblemService extends IService { + + CommonPage getResponseList(Integer productId, PageParamRequest page); + + CommonPage getSonResponseList(Integer majorId, PageParamRequest page); + + Integer commitProblem(CommitProblemRequest request); + + Integer delProblem(Integer majorId); + + Integer praiseProblem(Integer majorId); + } diff --git a/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductProblemServiceImpl.java b/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductProblemServiceImpl.java index e1c26a1..d764ff0 100644 --- a/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductProblemServiceImpl.java +++ b/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductProblemServiceImpl.java @@ -1,12 +1,146 @@ package com.zbkj.service.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.util.StringUtil; +import com.zbkj.common.exception.CrmebException; import com.zbkj.common.model.product.StoreProductProblem; +import com.zbkj.common.model.user.User; +import com.zbkj.common.page.CommonPage; +import com.zbkj.common.request.CommitProblemRequest; +import com.zbkj.common.request.PageParamRequest; +import com.zbkj.common.response.ProductProblemResponse; +import com.zbkj.common.utils.RedisUtil; import com.zbkj.service.dao.StoreProductProblemDao; import com.zbkj.service.service.StoreProductProblemService; +import com.zbkj.service.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + @Service public class StoreProductProblemServiceImpl extends ServiceImpl implements StoreProductProblemService { + @Resource private StoreProductProblemDao dao; + @Autowired private UserService userService; + @Autowired private RedisUtil redisUtil; + private static final String praise_key = "RESPONSE_PRAISE:"; + + @Override + public CommonPage getResponseList(Integer productId, PageParamRequest page) { + User user = userService.getInfo(); + PageHelper.startPage(page.getPage(), page.getLimit()); + List list = dao.getResponseList(productId); + for (ProductProblemResponse vo : list) { + Long praiseCount = redisUtil.getHashSize(praise_key + vo.getMajorId()); + vo.setDelFlag(user == null ? 0 : user.getUid().toString().equals(vo.getUserId()) ? 1 : 0); + vo.setPraiseCount(null == praiseCount ? 0 : praiseCount.intValue()); + if (null != praiseCount && praiseCount > 0 && null != user) { + Object o = redisUtil.hmGet(praise_key + vo.getMajorId(), user.getUid().toString()); + vo.setPraise(null == o ? 0 : 1); + } + vo.setUserId(null); + } + return CommonPage.restPage(list); + } + + @Override + public CommonPage getSonResponseList(Integer majorId, PageParamRequest page) { + User user = userService.getInfo(); + PageHelper.startPage(page.getPage(), page.getLimit()); + List list = dao.getSonResponseList(majorId); + for (ProductProblemResponse vo : list) { + Long praiseCount = redisUtil.getHashSize(praise_key + vo.getMajorId()); + vo.setDelFlag(user == null ? 0 : user.getUid().toString().equals(vo.getUserId()) ? 1 : 0); + vo.setPraiseCount(null == praiseCount ? 0 : praiseCount.intValue()); + if (null != praiseCount && praiseCount > 0 && null != user) { + Object o = redisUtil.hmGet(praise_key + vo.getMajorId(), user.getUid().toString()); + vo.setPraise(null == o ? 0 : 1); + } + vo.setUserId(null); + } + return CommonPage.restPage(list); + } + + @Override + public Integer commitProblem(CommitProblemRequest request) { + User user = userService.getInfo(); + if (null == user) { + throw new CrmebException("请先登录"); + } + Integer pId = 0; + Integer topId = 0; + String businessId = request.getBusinessId(); + // 说明不是一级评论 + if (StringUtil.isNotEmpty(request.getMajorId())) { + StoreProductProblem problem = dao.selectById(Integer.parseInt(request.getMajorId())); + if (null == problem) { + throw new CrmebException("未找到您要回复的对象,可能对方已删除"); + } + pId = problem.getId(); + businessId = problem.getBusinessId() + ""; + topId = (problem.getParentId() == 0L ? problem.getId() : problem.getTopId()); + } else if (StringUtil.isEmpty(businessId)) { + throw new CrmebException("请选择您要提问的商品"); + } + StoreProductProblem add = new StoreProductProblem(); + add.setBusinessId(Integer.parseInt(businessId)); + add.setUid(user.getUid()); + add.setContent(request.getContent()); + add.setParentId(pId); + add.setIsDel(0); + add.setTopId(topId); + return dao.insert(add); + } + + @Override + public Integer delProblem(Integer majorId) { + User user = userService.getInfo(); + StoreProductProblem problem = dao.selectById(majorId); + if (null == problem) { + throw new CrmebException("未查询到记录"); + } + if (!problem.getUid().toString().equals(user.getUid().toString())) { + throw new CrmebException("您无权限操作"); + } + StoreProductProblem upd = new StoreProductProblem(); + upd.setId(problem.getId()); + upd.setIsDel(1); + dao.updateById(upd); + recursionDel(new ArrayList() {{ add(problem.getId()); }}); + return 1; + } + + @Override + public Integer praiseProblem(Integer majorId) { + User user = userService.getInfo(); + Object o = redisUtil.hmGet(praise_key + majorId, user.getUid().toString()); + if (null != o) { + redisUtil.hmDelete(praise_key + majorId, user.getUid().toString()); + } else { + redisUtil.hmSet(praise_key + majorId, user.getUid().toString(), 1); + } + return 1; + } + + private void recursionDel(List ids) { + if (ids.isEmpty()) { return; } + LambdaQueryWrapper lq = new LambdaQueryWrapper<>(); + lq.select(StoreProductProblem::getId); + lq.in(StoreProductProblem::getParentId, ids); + List problems = dao.selectList(lq); + for (StoreProductProblem problem : problems) { + StoreProductProblem upd = new StoreProductProblem(); + upd.setId(problem.getId()); + upd.setIsDel(2); + dao.updateById(upd); + } + ids = problems.stream().map(StoreProductProblem::getId).collect(Collectors.toList()); + recursionDel(ids); + } } diff --git a/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductReplyServiceImpl.java b/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductReplyServiceImpl.java index f38f774..6a04316 100644 --- a/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductReplyServiceImpl.java +++ b/food-service/src/main/java/com/zbkj/service/service/impl/StoreProductReplyServiceImpl.java @@ -317,7 +317,7 @@ public class StoreProductReplyServiceImpl extends ServiceImpl lqwSpp = new LambdaQueryWrapper<>(); - lqwSpp.eq(StoreProductProblem::getProductId, proId); + lqwSpp.eq(StoreProductProblem::getBusinessId, proId); int problemNum = storeProductProblemService.count(lqwSpp); lqw.last(" limit 1"); StoreProductProblem one = storeProductProblemService.getOne(lqwSpp); diff --git a/food-service/src/main/resources/mapper/store/ReviewTagCategoryDao.xml b/food-service/src/main/resources/mapper/store/ReviewTagCategoryMapper.xml similarity index 100% rename from food-service/src/main/resources/mapper/store/ReviewTagCategoryDao.xml rename to food-service/src/main/resources/mapper/store/ReviewTagCategoryMapper.xml diff --git a/food-service/src/main/resources/mapper/store/ReviewTagDao.xml b/food-service/src/main/resources/mapper/store/ReviewTagMapper.xml similarity index 100% rename from food-service/src/main/resources/mapper/store/ReviewTagDao.xml rename to food-service/src/main/resources/mapper/store/ReviewTagMapper.xml diff --git a/food-service/src/main/resources/mapper/store/StoreProductProblemMapper.xml b/food-service/src/main/resources/mapper/store/StoreProductProblemMapper.xml new file mode 100644 index 0000000..ece6dea --- /dev/null +++ b/food-service/src/main/resources/mapper/store/StoreProductProblemMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + +