GoodsController.java 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package com.cdu.lys.graduation.controller.goods;
  2. import com.cdu.lys.graduation.commons.result.ActionResult;
  3. import com.cdu.lys.graduation.commons.result.PageResult;
  4. import com.cdu.lys.graduation.domain.goods.dto.GoodsDTO;
  5. import com.cdu.lys.graduation.domain.goods.dto.GoodsListDTO;
  6. import com.cdu.lys.graduation.domain.goods.dto.GoodsOptionDTO;
  7. import com.cdu.lys.graduation.domain.goods.dto.GoodsTypeDTO;
  8. import com.cdu.lys.graduation.domain.goods.vo.*;
  9. import com.cdu.lys.graduation.mini.goods.service.GoodsService;
  10. import com.cdu.lys.graduation.redis.RedisService;
  11. import com.cdu.lys.graduation.types.PageQuery;
  12. import com.cdu.lys.graduation.types.exception.ErrorType;
  13. import com.cdu.lys.graduation.types.exception.ParamException;
  14. import com.cdu.lys.graduation.types.goods.GoodsListQuery;
  15. import io.swagger.annotations.Api;
  16. import io.swagger.annotations.ApiOperation;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.beans.BeanUtils;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.cache.annotation.Cacheable;
  21. import org.springframework.http.MediaType;
  22. import org.springframework.validation.annotation.Validated;
  23. import org.springframework.web.bind.annotation.*;
  24. import javax.validation.Valid;
  25. import javax.validation.constraints.NotBlank;
  26. import java.util.ArrayList;
  27. import java.util.List;
  28. import java.util.Set;
  29. /**
  30. * @author liyinsong
  31. * @date 2022/2/8 11:49
  32. */
  33. @RestController
  34. @Api(tags = "Goods接口")
  35. @RequestMapping("/eorder/app/goods")
  36. @Validated
  37. @Slf4j
  38. public class GoodsController {
  39. @Autowired
  40. private GoodsService goodsService;
  41. @Autowired
  42. private RedisService redisService;
  43. @ApiOperation("查询商品列表list")
  44. @PostMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
  45. @Cacheable(value = "Goods:List", key = "#pageQuery.pageNo+''+#pageQuery.pageSize")
  46. public ActionResult<PageResult<List<GoodsListVO>>> selectGoodsList(@RequestBody @Valid PageQuery pageQuery) {
  47. PageResult<List<GoodsListDTO>> goodsList = goodsService.selectGoodsList(pageQuery.getPageNo(), pageQuery.getPageSize());
  48. PageResult<List<GoodsListVO>> result = this.getGoodsListPageVO(goodsList);
  49. log.info("select goods list success, PageQuery:[ {} ]", pageQuery);
  50. return ActionResult.getSuccessResult(result);
  51. }
  52. @ApiOperation("查询所有商品类型")
  53. @GetMapping(value = "/type/list", produces = MediaType.APPLICATION_JSON_VALUE)
  54. @Cacheable(value = "Goods:Types")
  55. public ActionResult<List<GoodsTypeVO>> selectGoodsTypes() {
  56. List<GoodsTypeDTO> goodsTypeDTOS = goodsService.selectGoodsTypes();
  57. List<GoodsTypeVO> goodsTypeVOS = new ArrayList<>();
  58. goodsTypeDTOS.forEach(goodsTypeDTO -> {
  59. GoodsTypeVO goodsTypeVO = new GoodsTypeVO();
  60. BeanUtils.copyProperties(goodsTypeDTO, goodsTypeVO);
  61. goodsTypeVOS.add(goodsTypeVO);
  62. });
  63. log.info("select all goods type success");
  64. return ActionResult.getSuccessResult(goodsTypeVOS);
  65. }
  66. @ApiOperation("根据Query查询GoodsList")
  67. @PostMapping(value = "/listByType", produces = MediaType.APPLICATION_JSON_VALUE)
  68. @Cacheable(value = "Goods:List:Type", key = "#query.pageNo+''+#query.pageSize+''+#query.goodsType")
  69. public ActionResult<PageResult<List<GoodsListVO>>> selectGoodsListByType(@RequestBody @Valid GoodsListQuery query) {
  70. PageResult<List<GoodsListDTO>> goodsList = goodsService.selectGoodsListByType(query.getPageNo(), query.getPageSize(), query.getGoodsType());
  71. PageResult<List<GoodsListVO>> result = this.getGoodsListPageVO(goodsList);
  72. log.info("select goods list by goodsType success, query is[ {} ]", query);
  73. return ActionResult.getSuccessResult(result);
  74. }
  75. @ApiOperation("查询热门商品list")
  76. @PostMapping(value = "/list/hot", produces = MediaType.APPLICATION_JSON_VALUE)
  77. @Cacheable(value = "Goods:List:Hot", key = "#query.pageNo+''+#query.pageSize")
  78. public ActionResult<PageResult<List<GoodsListVO>>> getHotGoodsList(@RequestBody @Valid PageQuery query) {
  79. PageResult<List<GoodsListDTO>> goodsList = goodsService.selectHotGoodsList(query);
  80. PageResult<List<GoodsListVO>> result = this.getGoodsListPageVO(goodsList);
  81. log.info("select hot goods list success, query is[ {} ]", query);
  82. return ActionResult.getSuccessResult(result);
  83. }
  84. @GetMapping(value = "/getGoods", produces = MediaType.APPLICATION_JSON_VALUE)
  85. @ApiOperation("根据id查询goods")
  86. @Cacheable(value = "Goods:ID", key = "#goodsId")
  87. public ActionResult<GoodsVO> selectGoodsInfo(Integer goodsId) {
  88. GoodsDTO goodsDTO = goodsService.selectGoodsById(goodsId);
  89. log.info("select Goods by id success, goods_id is:{}", goodsId);
  90. GoodsVO goodsVO = convertGoodsDTO2GoodsVO(goodsDTO);
  91. return ActionResult.getSuccessResult(goodsVO);
  92. }
  93. @GetMapping(value = "/search", produces = MediaType.APPLICATION_JSON_VALUE)
  94. @ApiOperation("商品搜索")
  95. public ActionResult<List<GoodsVO>> searchGoods(@NotBlank(message = "搜索词不能为空") String inputValue) {
  96. String input = inputValue.trim();
  97. //添加到热搜list
  98. redisService.increaseHotSearchList(input);
  99. //查询
  100. List<GoodsDTO> goodsDTOS = goodsService.searchGoods(input);
  101. List<GoodsVO> goods = new ArrayList<>();
  102. goodsDTOS.forEach(goodsDTO -> {
  103. GoodsVO goodsVO = convertGoodsDTO2GoodsVO(goodsDTO);
  104. goods.add(goodsVO);
  105. });
  106. log.info("search goods success");
  107. return ActionResult.getSuccessResult(goods);
  108. }
  109. @GetMapping(value = "/search/top/{num}")
  110. @ApiOperation("获取前num个热搜词")
  111. public ActionResult<Set<String>> getTopSearch(@PathVariable("num") int top) {
  112. if (top <= 0) {
  113. throw new ParamException(ErrorType.PARAM_ERROR, "top 必须大于0");
  114. }
  115. Set<String> topList = redisService.getHotSearchTopList(top);
  116. log.info("get top search list success");
  117. return ActionResult.getSuccessResult(topList);
  118. }
  119. /**
  120. * 得到商品list page vo对象
  121. *
  122. * @param goodsList 商品page
  123. * @return vo
  124. */
  125. private PageResult<List<GoodsListVO>> getGoodsListPageVO(PageResult<List<GoodsListDTO>> goodsList) {
  126. List<GoodsListVO> goodsListVOS = new ArrayList<>();
  127. goodsList.getData().forEach(goodsListDTO -> {
  128. GoodsListVO goodsListVO = convertGoodsListDTO2VO(goodsListDTO);
  129. goodsListVOS.add(goodsListVO);
  130. });
  131. PageResult<List<GoodsListVO>> pageResult = new PageResult<>();
  132. BeanUtils.copyProperties(goodsList, pageResult);
  133. pageResult.setData(goodsListVOS);
  134. return pageResult;
  135. }
  136. /**
  137. * 将GoodsListDTO转为GoodsListVO
  138. *
  139. * @param goodsListDTO dto
  140. * @return vo
  141. */
  142. private GoodsListVO convertGoodsListDTO2VO(GoodsListDTO goodsListDTO) {
  143. GoodsListVO goodsListVO = new GoodsListVO();
  144. BeanUtils.copyProperties(goodsListDTO, goodsListVO);
  145. List<GoodsVO> goodsVOS = new ArrayList<>();
  146. goodsListDTO.getGoods().forEach(goodsDTO -> {
  147. goodsVOS.add(convertGoodsDTO2GoodsVO(goodsDTO));
  148. });
  149. goodsListVO.setGoods(goodsVOS);
  150. return goodsListVO;
  151. }
  152. /**
  153. * 将GoodsDTO转换为GoodsVO
  154. *
  155. * @param goodsDTO dto
  156. * @return vo
  157. */
  158. private GoodsVO convertGoodsDTO2GoodsVO(GoodsDTO goodsDTO) {
  159. GoodsVO goodsVO = new GoodsVO();
  160. BeanUtils.copyProperties(goodsDTO, goodsVO);
  161. List<GoodsPictureVO> pictureVOS = new ArrayList<>();
  162. List<GoodsOptionVO> goodsOptionVOS = new ArrayList<>();
  163. goodsDTO.getPictures().forEach(pictureDTO -> {
  164. GoodsPictureVO pictureVO = new GoodsPictureVO();
  165. BeanUtils.copyProperties(pictureDTO, pictureVO);
  166. pictureVOS.add(pictureVO);
  167. });
  168. goodsDTO.getGoodsOptions().forEach(goodsOptionDTO -> {
  169. GoodsOptionVO goodsOptionVO = convertGoodsOptionDTO2VO(goodsOptionDTO);
  170. goodsOptionVOS.add(goodsOptionVO);
  171. });
  172. goodsVO.setPictures(pictureVOS);
  173. goodsVO.setGoodsOptions(goodsOptionVOS);
  174. return goodsVO;
  175. }
  176. /**
  177. * 将GoodsOptionDTO转化为GoodsOptionVO
  178. *
  179. * @param goodsOptionDTO dto
  180. * @return vo
  181. */
  182. private GoodsOptionVO convertGoodsOptionDTO2VO(GoodsOptionDTO goodsOptionDTO) {
  183. GoodsOptionVO goodsOptionVO = new GoodsOptionVO();
  184. BeanUtils.copyProperties(goodsOptionDTO, goodsOptionVO);
  185. List<GoodsOptionItemVO> goodsOptionItemVOS = new ArrayList<>();
  186. goodsOptionDTO.getGoodsOptionItems().forEach(goodsOptionItemDTO -> {
  187. GoodsOptionItemVO goodsOptionItemVO = new GoodsOptionItemVO();
  188. BeanUtils.copyProperties(goodsOptionItemDTO, goodsOptionItemVO);
  189. goodsOptionItemVOS.add(goodsOptionItemVO);
  190. });
  191. goodsOptionVO.setGoodsOptionItems(goodsOptionItemVOS);
  192. return goodsOptionVO;
  193. }
  194. }