Forráskód Böngészése

API优化 标签逻辑

guozhaoshun 6 éve
szülő
commit
59240036b4

+ 16 - 1
rankin-api-web/src/main/java/cn/rankin/apiweb/controller/TagController.java

@@ -39,10 +39,25 @@ public class TagController {
     public APIResult<Page<ItemVo>> findItemByTagId(@NeedUser DeviceUserVo user, @PathVariable("tagId") String tagId,
                                                    @RequestParam("pageNo") Integer pageNo, @RequestParam("pageSize") Integer pageSize) {
         String merchantId = user.getMerchantId();
+        APIResult<Page<ItemVo>> userTagResult = userService.findPageByUserTagId(tagId, merchantId, pageNo, pageSize);
+        if(userTagResult.getSuccess()){
+            //如果为用户标签,则返回用户标签相关数据
+            Page<ItemVo> data = userTagResult.getData();
+            if(data.getTotalSize() > 0){
+                return userTagResult;
+            }
+        }
+
         return tagService.findPageByTagId(tagId, merchantId, pageNo, pageSize);
     }
 
-    @RequestMapping(value = "/tagType/v1/{code}", method = RequestMethod.GET)
+    /**
+     * 瀑布流
+     * @param user
+     * @param code
+     * @return
+     */
+    @RequestMapping(value = "/tagType/waterfall/{code}", method = RequestMethod.GET)
     public APIResult<List<TagVo>> getTags(@NeedUser DeviceUserVo user,@PathVariable("code") String code) {
         List<TagVo> result = new ArrayList<>();
 

+ 8 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/product/ProductClient.java

@@ -86,6 +86,9 @@ public interface ProductClient {
     List<ItemVo> findItemByPids(@RequestBody List<String> productIdList,
                                 @RequestParam("merchantId") String merchantId);
 
+    @RequestMapping(value = "/item/pid", method = RequestMethod.POST)
+    ItemVo findItemByPid(@RequestParam("merchantId") String merchantId, @RequestParam("pid") String pid);
+
 
     @Component
     class ProductClientHystrix implements ProductClient {
@@ -189,5 +192,10 @@ public interface ProductClient {
             return null;
         }
 
+        @Override
+        public ItemVo findItemByPid(String merchantId, String pid) {
+            return null;
+        }
+
     }
 }

+ 13 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/user/UserClient.java

@@ -2,9 +2,11 @@ package cn.rankin.apiweb.service.user;
 
 import cn.rankin.apiweb.code.ApiWebCode;
 import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.user.dto.TerminalDeviceDTO;
 import cn.rankin.data.api.user.entity.UserRecommend;
 import cn.rankin.data.api.user.entity.UserTag;
+import cn.rankin.data.api.user.entity.UserTagProductRelation;
 import cn.rankin.data.api.user.vo.TerminalDeviceVo;
 import cn.rankin.data.api.user.vo.TerminalUserVo;
 import cn.rankin.data.api.user.vo.WhiteUserVo;
@@ -47,6 +49,11 @@ public interface UserClient {
     @RequestMapping(value = "/device/updatebind", method = RequestMethod.PUT)
     APIResult updateDeviceBind(TerminalDeviceDTO deviceDTO);
 
+    @RequestMapping(value = "/userTagProductRelation/page/{userTagId}", method = RequestMethod.GET)
+    Page<UserTagProductRelation> findPageByUserTagId(@PathVariable("userTagId") String userTagId,
+                                                     @RequestParam("pageNo") Integer pageNo,
+                                                     @RequestParam("pageSize") Integer pageSize);
+
 
     @Component
     class UserServiceHystrix implements UserClient {
@@ -101,5 +108,11 @@ public interface UserClient {
             return APIResult.error(ApiWebCode.SERVER_ERROR);
         }
 
+        @Override
+        public Page<UserTagProductRelation> findPageByUserTagId(String userTagId, Integer pageNo, Integer pageSize) {
+            return null;
+        }
+
+
     }
 }

+ 35 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/user/UserService.java

@@ -5,15 +5,18 @@ import cn.rankin.apiweb.service.product.ProductClient;
 import cn.rankin.apiweb.utils.SecurityManager;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.model.BaseCode;
+import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.constant.PlatForm;
 import cn.rankin.common.utils.constant.RedisKey;
 import cn.rankin.common.utils.service.RedisService;
 import cn.rankin.data.api.app.dto.LoginInfoDTO;
 import cn.rankin.data.api.app.vo.DeviceUserVo;
+import cn.rankin.data.api.app.vo.ItemVo;
 import cn.rankin.data.api.app.vo.UserInfoVo;
 import cn.rankin.data.api.user.dto.TerminalDeviceDTO;
 import cn.rankin.data.api.user.entity.UserRecommend;
 import cn.rankin.data.api.user.entity.UserTag;
+import cn.rankin.data.api.user.entity.UserTagProductRelation;
 import cn.rankin.data.api.user.vo.TerminalDeviceVo;
 import cn.rankin.data.api.user.vo.TerminalUserVo;
 import com.alibaba.fastjson.JSON;
@@ -26,6 +29,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -310,4 +314,35 @@ public class UserService {
     public List<UserRecommend> getUserRecommendCourses(String uid) {
         return userClient.getUserRecommendCourses(uid);
     }
+
+    public APIResult<Page<ItemVo>> findPageByUserTagId(String userTagId,  String merchantId, Integer pageNo, Integer pageSize) {
+        Page<UserTagProductRelation> resultPage = userClient.findPageByUserTagId(userTagId, pageNo, pageSize);
+
+        if(resultPage == null){
+            throw new RuntimeException("请求失败!");
+        }
+
+        List<ItemVo> itemVos = new ArrayList<>();
+        List<UserTagProductRelation> userTagProductRelations = resultPage.getList();
+        userTagProductRelations.forEach(userTagProductRelation -> {
+            String pid = userTagProductRelation.getPid();
+            ItemVo itemVo = productClient.findItemByPid(merchantId, pid);
+            if(itemVo == null){
+                log.info("not found item by pid , pid={}",pid);
+            }else{
+                itemVos.add(itemVo);
+            }
+        });
+
+        Page<ItemVo> page = new Page<>();
+        page.setPageSize(pageSize);
+        page.setPageNo(pageNo);
+        page.setTotalSize((int)resultPage.getTotalSize());
+        page.setList(itemVos);
+
+        return APIResult.ok(page);
+    }
+
+
+
 }

+ 7 - 3
rankin-product-service/src/main/java/cn/rankin/productservice/controller/ItemController.java

@@ -19,7 +19,7 @@ public class ItemController {
 
     @RequestMapping(value = "/app/item/ids", method = RequestMethod.POST)
     public APIResult<List<ItemVo>> findByIds(@RequestBody List<String> productIdList, @RequestParam("merchantId") String merchantId) {
-        List<ItemVo> itemVoList = itemService.findByIds(merchantId, productIdList);
+        List<ItemVo> itemVoList = itemService.findByPids(merchantId, productIdList);
         return APIResult.ok(itemVoList);
     }
 
@@ -35,8 +35,12 @@ public class ItemController {
 
     @RequestMapping(value = "/item/pids", method = RequestMethod.POST)
     public List<ItemVo> findItemByPids(@RequestBody List<String> productIdList, @RequestParam("merchantId") String merchantId) {
-        List<ItemVo> itemVoList = itemService.findByIds(merchantId,productIdList);
-        return itemVoList;
+        return itemService.findByPids(merchantId,productIdList);
+    }
+
+    @RequestMapping(value = "/item/pid", method = RequestMethod.POST)
+    public ItemVo findItemByPid(@RequestParam("pid") String pid, @RequestParam("merchantId") String merchantId) {
+        return itemService.findByPid(merchantId,pid);
     }
 
 }

+ 1 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/controller/app/ItemControllerV0.java

@@ -24,7 +24,7 @@ public class ItemControllerV0 {
 
     @RequestMapping(value = "/ids", method = RequestMethod.POST)
     public APIResult<List<ItemVo>> findByIds(@RequestBody List<String> productIdList, @RequestParam("merchantId") String merchantId) {
-        List<ItemVo> itemVoList = itemService.findByIds(merchantId, productIdList);
+        List<ItemVo> itemVoList = itemService.findByPids(merchantId, productIdList);
         return APIResult.ok(itemVoList);
     }
 

+ 75 - 5
rankin-product-service/src/main/java/cn/rankin/productservice/service/app/ItemService.java

@@ -15,6 +15,7 @@ import cn.rankin.data.api.product.vo.SupportItemVo;
 import cn.rankin.data.api.product.vo.TrainingItemVo;
 import cn.rankin.productservice.repository.*;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -168,7 +169,7 @@ public class ItemService {
         }
         List<String> productIdList = new ArrayList<>();
         relationList.forEach(relation -> productIdList.add(relation.getSupportId()));
-        List<ItemVo> itemVoList = this.findByIds(merchantId, productIdList);
+        List<ItemVo> itemVoList = this.findByPids(merchantId, productIdList);
         return itemVoList;
     }
 
@@ -188,7 +189,76 @@ public class ItemService {
     */
 
 
-    public List<ItemVo> findByIds(String merchantId, List<String> productIdList) {
+    public ItemVo findByPid(String merchantId, String pid) {
+        if (StringUtils.isBlank(pid)) {
+            return null;
+        }
+        MerchantProduct merchantProduct = merchantProductRepository.findByPidAndMerchantId(pid, merchantId);
+
+        if(null == merchantProduct){
+            return null;
+        }
+        // 拿产品信息
+        Map<String, ItemVo> itemVoMap = new HashMap<>();
+        ProductTypeEnum type = merchantProduct.getType();
+        if (type.equals(ProductTypeEnum.COURSE)) {
+            Course course = courseRepository.find(pid);
+            ItemVo itemVo = convert(course);
+            itemVoMap.put(pid, itemVo);
+        } else if (type.equals(ProductTypeEnum.SUPPORT)) {
+            Support support = supportRepository.find(pid);
+            ItemVo itemVo = convert(support);
+            itemVoMap.put(pid, itemVo);
+        } else if (type.equals(ProductTypeEnum.TRAINING)){
+            Training training = trainingRepository.find(pid);
+            ItemVo itemVo = convert(training);
+            itemVoMap.put(pid, itemVo);
+        }
+
+        // 取商品信息
+        List<Goods> goodsList = goodsRepository.findByPidAndMerchantId(pid, merchantId);
+        Map<String, List<Goods>> goodsMap = new HashMap<>();
+        for (Goods goods : goodsList) {
+            String productId = goods.getPid();
+            if (!goodsMap.containsKey(productId)) {
+                List<Goods> tmpList = new ArrayList<>();
+                tmpList.add(goods);
+                goodsMap.put(productId, tmpList);
+            }else {
+                List<Goods> tmpList = goodsMap.get(productId);
+                tmpList.add(goods);
+            }
+        }
+
+        // 开始组装返回数据了啊
+        ItemVo itemVo = itemVoMap.get(pid);
+        if (itemVo == null) {
+            log.error("item not exists, pid={}", pid);
+            return null;
+        }
+        List<Goods> tmpList = goodsMap.get(pid);
+        List<ItemGoodsVo> itemGoodsVoList = new ArrayList<>();
+        if (null == tmpList){
+            log.error("productId not Found in goodsMap, pid={}", pid);
+        }else{
+            tmpList.sort(new Comparator<Goods>() {
+                @Override
+                public int compare(Goods o1, Goods o2) {
+                    return o1.getSort() - o2.getSort();
+                }
+            });
+            for (Goods goods : tmpList) {
+                ItemGoodsVo itemGoodsVo = convert(goods);
+                itemGoodsVoList.add(itemGoodsVo);
+            }
+        }
+
+        itemVo.setGoods(itemGoodsVoList);
+
+        return itemVo;
+    }
+
+    public List<ItemVo> findByPids(String merchantId, List<String> productIdList) {
         if (CollectionUtils.isEmpty(productIdList)) {
             return new ArrayList<>();
         }
@@ -302,7 +372,7 @@ public class ItemService {
             currentIdList.add(productId);
         }
 
-        List<ItemVo> itemVoList = findByIds(merchantId, currentIdList);
+        List<ItemVo> itemVoList = findByPids(merchantId, currentIdList);
         page.setList(itemVoList);
         return APIResult.ok(page);
     }
@@ -329,7 +399,7 @@ public class ItemService {
             String productId = merchantProductTagRelation.getPid();
             productIdList.add(productId);
         }
-        List<ItemVo> itemVoList = this.findByIds(merchantId, productIdList);
+        List<ItemVo> itemVoList = this.findByPids(merchantId, productIdList);
         page.setList(itemVoList);
         return APIResult.ok(page);
     }
@@ -357,7 +427,7 @@ public class ItemService {
             String productId = merchantProductTagRelation.getPid();
             productIdList.add(productId);
         }
-        result = this.findByIds(merchantId, productIdList);
+        result = this.findByPids(merchantId, productIdList);
         return result;
     }
 

+ 8 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/controller/UserTagProductRelationController.java

@@ -1,5 +1,6 @@
 package cn.rankin.userservice.controller;
 
+import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.user.entity.UserTagProductRelation;
 import cn.rankin.userservice.service.UserTagProductRelationService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,5 +21,12 @@ public class UserTagProductRelationController {
         return userTagProductRelations;
     }
 
+    @RequestMapping(value = "/page/{userTagId}",method = RequestMethod.GET)
+    public Page<UserTagProductRelation> findPageByUserTagId(@PathVariable("userTagId") String userTagId,
+                                                            @RequestParam("pageNo") Integer pageNo,
+                                                            @RequestParam("pageSize") Integer pageSize) {
+        return userTagProductRelationService.findPageByUserTagId(userTagId, pageNo, pageSize);
+    }
+
 
 }

+ 21 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/UserTagProductRelationService.java

@@ -1,5 +1,6 @@
 package cn.rankin.userservice.service;
 
+import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.enums.BaseOrderEnum;
 import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.util.JpaSortUtil;
@@ -10,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -84,4 +86,23 @@ public class UserTagProductRelationService {
 
         relationRepository.save(relationList);
     }
+
+    public Page<UserTagProductRelation> findPageByUserTagId(String userTagId, int pageNo, int pageSize) {
+        UserTagProductRelation relation = new UserTagProductRelation();
+        relation.setTagId(userTagId);
+        relation.setStatus(BaseStatusEnum.NORMAL);
+        Long total = relationRepository.count(relation);
+
+        Page<UserTagProductRelation> page = new Page(total, pageNo, pageSize);
+        // sort
+        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap() { {
+            this.put("sort", BaseOrderEnum.ASC);
+        }};
+        List<UserTagProductRelation> relationList = relationRepository.find(relation, page.getStart(), pageSize, JpaSortUtil.sort(sort));
+        if (CollectionUtils.isEmpty(relationList)) {
+            return page;
+        }
+        page.setList(relationList);
+        return page;
+    }
 }