huodongdong преди 7 години
родител
ревизия
74f882a885
променени са 45 файла, в които са добавени 1247 реда и са изтрити 17 реда
  1. 40 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/controller/CallbackController.java
  2. 8 4
      rankin-api-web/src/main/java/cn/rankin/apiweb/controller/CourseController.java
  3. 47 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/controller/ShopCartController.java
  4. 16 1
      rankin-api-web/src/main/java/cn/rankin/apiweb/controller/SupportController.java
  5. 15 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/event/EventClient.java
  6. 19 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/event/EventService.java
  7. 18 4
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/product/ProductClient.java
  8. 33 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/shopcart/ShopCartClient.java
  9. 100 0
      rankin-api-web/src/main/java/cn/rankin/apiweb/service/shopcart/ShopCartService.java
  10. 44 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/buymsg/BuyMsgController.java
  11. 15 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/trade/OrderController.java
  12. 21 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/buymsg/BuyMsgClient.java
  13. 70 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/buymsg/BuyMsgService.java
  14. 5 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/MerchantProductService.java
  15. 42 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/PlatformTypeEnum.java
  16. 13 0
      rankin-data-api/src/main/java/cn/rankin/data/api/app/dto/GoodsDTO.java
  17. 30 0
      rankin-data-api/src/main/java/cn/rankin/data/api/app/vo/GoodsVo.java
  18. 3 0
      rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/Goods.java
  19. 3 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderDTO.java
  20. 38 0
      rankin-data-api/src/main/java/cn/rankin/data/api/user/dto/EventLogDTO.java
  21. 18 0
      rankin-data-api/src/main/java/cn/rankin/data/api/user/dto/ShopCartDTO.java
  22. 44 0
      rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/BuyMsg.java
  23. 63 0
      rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/EventLog.java
  24. 44 0
      rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/ShopCart.java
  25. 0 2
      rankin-data-api/src/main/java/cn/rankin/data/api/user/vo/TerminalUserVo.java
  26. 22 0
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/app/AppGoodsController.java
  27. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/app/AppTagController.java
  28. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/app/CourseController.java
  29. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/app/ItemController.java
  30. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/app/SupportController.java
  31. 6 0
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/cms/MerchantProductController.java
  32. 3 0
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/GoodsRepository.java
  33. 4 0
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/MerchantProductRepository.java
  34. 36 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/MerchantProductService.java
  35. 112 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/app/AppGoodsService.java
  36. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemService.java
  37. 23 0
      rankin-user-service/src/main/java/cn/rankin/userservice/controller/EventLogController.java
  38. 65 0
      rankin-user-service/src/main/java/cn/rankin/userservice/controller/ShopCartController.java
  39. 13 0
      rankin-user-service/src/main/java/cn/rankin/userservice/repository/BuyMsgRepository.java
  40. 7 0
      rankin-user-service/src/main/java/cn/rankin/userservice/repository/EventLogRepository.java
  41. 22 0
      rankin-user-service/src/main/java/cn/rankin/userservice/repository/ShopCartRepository.java
  42. 71 0
      rankin-user-service/src/main/java/cn/rankin/userservice/service/BuyMsgService.java
  43. 23 0
      rankin-user-service/src/main/java/cn/rankin/userservice/service/EventLogService.java
  44. 78 0
      rankin-user-service/src/main/java/cn/rankin/userservice/service/ShopCartService.java
  45. 8 0
      rankin-user-service/src/main/java/cn/rankin/userservice/utils/DTOConverter.java

+ 40 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/controller/CallbackController.java

@@ -0,0 +1,40 @@
+package cn.rankin.apiweb.controller;
+
+import cn.rankin.apiweb.assist.resolver.NeedUser;
+import cn.rankin.apiweb.code.ApiWebCode;
+import cn.rankin.apiweb.service.event.EventService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.app.vo.DeviceUserVo;
+import cn.rankin.data.api.user.dto.EventLogDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * CallbackController
+ * Created by huodongdong on 2017/10/27.
+ */
+@RestController
+@RequestMapping(value = "/callback")
+public class CallbackController {
+
+    @Autowired
+    private EventService eventService;
+
+    @RequestMapping(value = "/event", method = RequestMethod.POST)
+    public APIResult<Boolean> addEvent(@NeedUser DeviceUserVo user, @RequestBody EventLogDTO eventLog) {
+        if (eventLog.getEventType() == null ) {
+            return APIResult.error(ApiWebCode.PARAMETER_ERROR);
+        }
+
+        eventLog.setMerchantId(user.getMerchantId());
+        eventLog.setUserId(user.getUid());
+
+        APIResult<Boolean> result = eventService.addLog(eventLog);
+        return result;
+    }
+}
+

+ 8 - 4
rankin-api-web/src/main/java/cn/rankin/apiweb/controller/CourseController.java

@@ -4,11 +4,9 @@ import cn.rankin.apiweb.assist.resolver.NeedUser;
 import cn.rankin.apiweb.service.auth.AuthService;
 import cn.rankin.apiweb.service.collection.CollectionService;
 import cn.rankin.apiweb.service.product.ProductService;
+import cn.rankin.apiweb.service.shopcart.ShopCartService;
 import cn.rankin.common.utils.api.model.APIResult;
-import cn.rankin.data.api.app.vo.CourseDetailVo;
-import cn.rankin.data.api.app.vo.CourseVo;
-import cn.rankin.data.api.app.vo.DeviceUserVo;
-import cn.rankin.data.api.app.vo.ItemVo;
+import cn.rankin.data.api.app.vo.*;
 import cn.rankin.data.api.auth.vo.AuthResult;
 import cn.rankin.data.api.user.entity.Collection;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +27,9 @@ public class CourseController {
     @Autowired
     private AuthService authService;
 
+    @Autowired
+    private ShopCartService shopCartService;
+
     @RequestMapping(value = "/{courseId}/lessons", method = RequestMethod.GET)
     public APIResult<CourseVo> getCourseLessons(@NeedUser DeviceUserVo user, @PathVariable("courseId") String courseId) {
         String userId = user.getUid();
@@ -65,6 +66,9 @@ public class CourseController {
             courseDetailVo.setEndTime(authResult.getEndTime());
         }
 
+        List<ItemGoodsVo> itemGoodsVoList = courseDetailVo.getGoods();
+        shopCartService.isInCart(userId, itemGoodsVoList);
+
         return courseDetailVoAPIResult;
     }
 

+ 47 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/controller/ShopCartController.java

@@ -1,4 +1,51 @@
 package cn.rankin.apiweb.controller;
 
+import cn.rankin.apiweb.assist.resolver.NeedUser;
+import cn.rankin.apiweb.service.shopcart.ShopCartService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.data.api.app.dto.GoodsDTO;
+import cn.rankin.data.api.app.vo.DeviceUserVo;
+import cn.rankin.data.api.app.vo.GoodsVo;
+import cn.rankin.data.api.user.dto.ShopCartDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/user/shopcart")
 public class ShopCartController {
+
+    @Autowired
+    private ShopCartService shopCartService;
+
+    @RequestMapping(value = "/totalNum", method = RequestMethod.GET)
+    public APIResult getTotalNum(@NeedUser DeviceUserVo user) {
+        return shopCartService.getTotalNum(user.getUid());
+    }
+
+    @RequestMapping(method = RequestMethod.GET)
+    public APIResult<Page<GoodsVo>> getPage(@NeedUser DeviceUserVo user, @RequestParam("pageNo") Integer pageNo, @RequestParam("pageSize") Integer paegSize) {
+        String userId = user.getUid();
+        String merchantId = user.getMerchantId();
+        return shopCartService.getPage(userId, merchantId, pageNo, paegSize);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<Boolean> add(@NeedUser DeviceUserVo user, @RequestBody ShopCartDTO shopCartDTO) {
+        String userId = user.getUid();
+        String goodsId = shopCartDTO.getGoodsId();
+        return shopCartService.add(userId, goodsId);
+    }
+
+    @RequestMapping(value = "/{goodsId}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@NeedUser DeviceUserVo user, @PathVariable("goodsId") String goodsId) {
+        return shopCartService.delete(user.getUid(), goodsId);
+    }
+
+    @RequestMapping(value = "/buymsg", method = RequestMethod.POST)
+    public APIResult<Boolean> push(@NeedUser DeviceUserVo user) {
+        String userId = user.getUid();
+        return shopCartService.push(userId);
+    }
+
 }

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

@@ -2,8 +2,10 @@ package cn.rankin.apiweb.controller;
 
 import cn.rankin.apiweb.assist.resolver.NeedUser;
 import cn.rankin.apiweb.service.product.ProductService;
+import cn.rankin.apiweb.service.shopcart.ShopCartService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.data.api.app.vo.DeviceUserVo;
+import cn.rankin.data.api.app.vo.ItemGoodsVo;
 import cn.rankin.data.api.product.vo.SupportItemVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -11,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 @RestController
 @RequestMapping(value = "/support")
 public class SupportController {
@@ -18,9 +22,20 @@ public class SupportController {
     @Autowired
     private ProductService productService;
 
+    @Autowired
+    private ShopCartService shopCartService;
+
     @RequestMapping(value = "/{supportId}", method = RequestMethod.GET)
     public APIResult<SupportItemVo> getSupport(@NeedUser DeviceUserVo user, @PathVariable("supportId") String supportId) {
+        String userId = user.getUid();
         String merchantId = user.getMerchantId();
-        return productService.getSupport(supportId, merchantId);
+        APIResult<SupportItemVo> result = productService.getSupport(supportId, merchantId);
+        if (!result.getSuccess()) {
+            return result;
+        }
+        SupportItemVo supportItemVo = result.getData();
+        List<ItemGoodsVo> itemGoodsVoList = supportItemVo.getGoods();
+        shopCartService.isInCart(userId, itemGoodsVoList);
+        return result;
     }
 }

+ 15 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/event/EventClient.java

@@ -0,0 +1,15 @@
+package cn.rankin.apiweb.service.event;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.user.dto.EventLogDTO;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@FeignClient(name = "${service.user.name}")
+public interface EventClient {
+
+    @RequestMapping(value = "/event", method = RequestMethod.POST)
+    APIResult<Boolean> addLog(@RequestBody EventLogDTO eventLogDTO);
+}

+ 19 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/event/EventService.java

@@ -0,0 +1,19 @@
+package cn.rankin.apiweb.service.event;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.user.dto.EventLogDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class EventService {
+
+    @Autowired
+    private EventClient eventClient;
+
+    public APIResult<Boolean> addLog(EventLogDTO eventLogDTO) {
+        return eventClient.addLog(eventLogDTO);
+    }
+}

+ 18 - 4
rankin-api-web/src/main/java/cn/rankin/apiweb/service/product/ProductClient.java

@@ -4,11 +4,9 @@ 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.app.dto.ItemSearchDTO;
+import cn.rankin.data.api.app.vo.GoodsVo;
 import cn.rankin.data.api.app.vo.ItemVo;
-import cn.rankin.data.api.product.entity.Course;
-import cn.rankin.data.api.product.entity.Lesson;
-import cn.rankin.data.api.product.entity.MerchantProduct;
-import cn.rankin.data.api.product.entity.Recommend;
+import cn.rankin.data.api.product.entity.*;
 import cn.rankin.data.api.product.vo.CourseItemVo;
 import cn.rankin.data.api.product.vo.SupportItemVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
@@ -47,6 +45,12 @@ public interface ProductClient {
     @RequestMapping(value = "/app/lesson/{lessonId}", method = RequestMethod.GET)
     APIResult<Lesson> getLesson(@PathVariable("lessonId") String lessonId, @RequestParam("courseId") String courseId);
 
+    @RequestMapping(value = "/app/goods", method = RequestMethod.POST)
+    APIResult<List<GoodsVo>> findGoodsByIds(@RequestBody List<String> goodsIdList, @RequestParam("merchantId") String merchantId);
+
+    @RequestMapping(value = "/goods/{goodsId}", method = RequestMethod.GET)
+    APIResult<Goods> findGoods(@PathVariable("goodsId") String goodsId);
+
     @Component
     class ProductClientHystrix implements ProductClient {
 
@@ -94,5 +98,15 @@ public interface ProductClient {
         public APIResult getSupport(String supportId, String merchantId) {
             return APIResult.error(ApiWebCode.SERVER_ERROR);
         }
+
+        @Override
+        public APIResult<List<GoodsVo>> findGoodsByIds(List<String> goodsIdList, String merchantId) {
+            return APIResult.error(ApiWebCode.SERVER_ERROR);
+        }
+
+        @Override
+        public APIResult<Goods> findGoods(String goodsId) {
+            return APIResult.error(ApiWebCode.SERVER_ERROR);
+        }
     }
 }

+ 33 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/shopcart/ShopCartClient.java

@@ -0,0 +1,33 @@
+package cn.rankin.apiweb.service.shopcart;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.data.api.user.dto.ShopCartDTO;
+import cn.rankin.data.api.user.entity.ShopCart;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(value = "${service.user.name}")
+public interface ShopCartClient {
+
+    @RequestMapping(value = "/shopcart", method = RequestMethod.GET)
+    APIResult<Page<ShopCart>> getPage(@RequestParam("userId") String userId, @RequestParam("pageNo") Integer pageNo, @RequestParam("pageSize") Integer pageSize);
+
+    @RequestMapping(value = "/shopcart", method = RequestMethod.PUT)
+    APIResult<Boolean> add(@RequestBody ShopCartDTO shopCartDTO);
+
+    @RequestMapping(value = "/shopcart", method = RequestMethod.DELETE)
+    APIResult<Boolean> delete(@RequestParam("userId") String userId, @RequestParam("goodsId") String goodsId);
+
+    @RequestMapping(value = "/shopcart/totalNum", method = RequestMethod.GET)
+    APIResult<Map<String, Long>> getToatlNum(@RequestParam("userId") String userId);
+
+    @RequestMapping(value = "/shopcart/list", method = RequestMethod.POST)
+    APIResult<List<ShopCart>> findByIds(@RequestBody List<String> goodsIdList, @RequestParam("userId") String userId);
+
+    @RequestMapping(value = "/shopcart/buymsg", method = RequestMethod.POST)
+    APIResult<Boolean> push(@RequestParam("userId") String userId);
+}

+ 100 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/shopcart/ShopCartService.java

@@ -0,0 +1,100 @@
+package cn.rankin.apiweb.service.shopcart;
+
+import cn.rankin.apiweb.code.ApiWebCode;
+import cn.rankin.apiweb.service.product.ProductClient;
+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.data.api.app.vo.GoodsVo;
+import cn.rankin.data.api.app.vo.ItemGoodsVo;
+import cn.rankin.data.api.product.entity.Goods;
+import cn.rankin.data.api.user.dto.ShopCartDTO;
+import cn.rankin.data.api.user.entity.ShopCart;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class ShopCartService {
+
+    @Autowired
+    private ShopCartClient shopCartClient;
+
+    @Autowired
+    private ProductClient productClient;
+
+    public APIResult<Page<GoodsVo>> getPage(String userId, String merchantId, Integer pageNo, Integer pageSize) {
+        APIResult<Page<ShopCart>> shopCartApiResult = shopCartClient.getPage(userId, pageNo, pageSize);
+        if (!shopCartApiResult.getSuccess()) {
+            return APIResult.error(new BaseCode(shopCartApiResult.getCode(), shopCartApiResult.getMessage()));
+        }
+        Page<ShopCart> shopCartPage = shopCartApiResult.getData();
+        Page<GoodsVo> goodsPage = new Page(shopCartPage.getTotalSize(), shopCartPage.getPageNo(), shopCartPage.getPageSize());
+        List<ShopCart> shopCartList = shopCartPage.getList();
+        if (CollectionUtils.isEmpty(shopCartList)) {
+            return APIResult.ok(goodsPage);
+        }
+        List<String> goodsIdList = new ArrayList<>();
+        shopCartList.forEach(shopCart -> goodsIdList.add(shopCart.getGoodsId()));
+
+        APIResult<List<GoodsVo>> goodsApiResult = productClient.findGoodsByIds(goodsIdList, merchantId);
+        if (!goodsApiResult.getSuccess()) {
+            return APIResult.error(new BaseCode(goodsApiResult.getCode(), goodsApiResult.getMessage()));
+        }
+        List<GoodsVo> goodsVoList = goodsApiResult.getData();
+        goodsPage.setList(goodsVoList);
+        return APIResult.ok(goodsPage);
+    }
+
+    public APIResult<Boolean> add(String userId, String goodsId) {
+        APIResult<Goods> apiResult = productClient.findGoods(goodsId);
+        if (!apiResult.getSuccess()) {
+            return APIResult.error(new BaseCode(apiResult.getCode(), apiResult.getMessage()));
+        }
+        Goods goods = apiResult.getData();
+        ShopCartDTO shopCartDTO = new ShopCartDTO();
+        shopCartDTO.setUserId(userId);
+        shopCartDTO.setGoodsId(goodsId);
+        shopCartDTO.setPid(goods.getPid());
+        return shopCartClient.add(shopCartDTO);
+    }
+
+    public APIResult<Boolean> delete(String userId, String goodsId) {
+        return shopCartClient.delete(userId, goodsId);
+    }
+
+    public APIResult getTotalNum(String userId) {
+        return shopCartClient.getToatlNum(userId);
+    }
+
+    public APIResult<Boolean> push(String userId) {
+        return shopCartClient.push(userId);
+    }
+
+    public void isInCart(String userId, List<ItemGoodsVo> itemGoodsVoList) {
+        if (CollectionUtils.isEmpty(itemGoodsVoList)) return;
+        List<String> goodsIdList = new ArrayList<>();
+        itemGoodsVoList.forEach(itemGoodsVo -> goodsIdList.add(itemGoodsVo.getId()));
+        APIResult<List<ShopCart>> apiResult = shopCartClient.findByIds(goodsIdList, userId);
+        if (!apiResult.getSuccess()) return;
+        List<ShopCart> shopCartList = apiResult.getData();
+        Map<String, ShopCart> shopCartMap = new HashMap<>();
+        for (ShopCart shopCart : shopCartList) {
+            String goodsId = shopCart.getGoodsId();
+            shopCartMap.put(goodsId, shopCart);
+        }
+        for (ItemGoodsVo itemGoodsVo : itemGoodsVoList) {
+            String goodsId = itemGoodsVo.getId();
+            if (shopCartMap.containsKey(goodsId)) {
+                itemGoodsVo.setIsInCart(Boolean.TRUE);
+            }else {
+                itemGoodsVo.setIsInCart(Boolean.FALSE);
+            }
+        }
+    }
+}

+ 44 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/buymsg/BuyMsgController.java

@@ -0,0 +1,44 @@
+package cn.rankin.cmsweb.controller.buymsg;
+
+import cn.rankin.cmsweb.assist.resolver.NeedUser;
+import cn.rankin.cmsweb.code.CmsWebAPICode;
+import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.service.buymsg.BuyMsgService;
+import cn.rankin.cmsweb.service.user.TerminalUserService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.model.BaseCode;
+import cn.rankin.data.api.product.vo.MerchantProductVo;
+import cn.rankin.data.api.user.vo.TerminalUserVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/buymsg")
+public class BuyMsgController {
+
+    @Autowired
+    private BuyMsgService buyMsgService;
+
+    @Autowired
+    private TerminalUserService terminalUserService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<List<MerchantProductVo>> getList(@NeedUser UserDetails user, @RequestParam("userId") String userId) {
+        APIResult<TerminalUserVo> userResult = terminalUserService.getUser(userId);
+        if (!userResult.getSuccess()) {
+            return APIResult.error(new BaseCode(userResult.getCode(), userResult.getMessage()));
+        }
+        TerminalUserVo terminalUserVo = userResult.getData();
+        String merchantId = terminalUserVo.getMerchantId();
+        if (user.isPlatForm() || user.getMerchantId().equals(merchantId)) {
+            return buyMsgService.getListByBuyMsg(userId, merchantId);
+        }else {
+            return APIResult.error(CmsWebAPICode.ACCESS_DENIED);
+        }
+    }
+}

+ 15 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/trade/OrderController.java

@@ -3,6 +3,7 @@ package cn.rankin.cmsweb.controller.trade;
 import cn.rankin.cmsweb.assist.resolver.NeedUser;
 import cn.rankin.cmsweb.code.CmsWebAPICode;
 import cn.rankin.cmsweb.entity.UserDetails;
+import cn.rankin.cmsweb.service.buymsg.BuyMsgClient;
 import cn.rankin.cmsweb.service.trade.order.OrderService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
@@ -14,6 +15,7 @@ import cn.rankin.data.api.trade.dto.OrderSendDTO;
 import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
 import cn.rankin.data.api.trade.vo.OrderDetailVo;
 import cn.rankin.data.api.trade.vo.OrderVo;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.propertyeditors.CustomDateEditor;
 import org.springframework.web.bind.ServletRequestDataBinder;
@@ -23,6 +25,7 @@ import javax.servlet.http.HttpServletRequest;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+@Slf4j
 @RestController
 @RequestMapping(value = "/order")
 public class OrderController {
@@ -36,9 +39,20 @@ public class OrderController {
     @Autowired
     private OrderService orderService;
 
+    @Autowired
+    private BuyMsgClient buyMsgClient;
+
     @RequestMapping(method = RequestMethod.POST)
     public APIResult<OrderVo> create(@RequestBody OrderDTO orderDTO) {
-        return orderService.create(orderDTO);
+        String userId = orderDTO.getUid();
+        APIResult<OrderVo> orderResult = orderService.create(orderDTO);
+        if (orderResult.getSuccess() && Boolean.TRUE.equals(orderDTO.getIsFromCart())) {
+            APIResult<Boolean> buyMsgResult = buyMsgClient.delete(userId);
+            if (!buyMsgResult.getSuccess()) {
+                log.error("delete user buy msg error: {}", userId);
+            }
+        }
+        return orderResult;
     }
 
     @RequestMapping(value = "/{orderId}", method = RequestMethod.GET)

+ 21 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/buymsg/BuyMsgClient.java

@@ -0,0 +1,21 @@
+package cn.rankin.cmsweb.service.buymsg;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.user.entity.BuyMsg;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(name = "${service.user.name}")
+public interface BuyMsgClient {
+
+    @RequestMapping(value = "/shopcart/buymsg", method = RequestMethod.GET)
+    APIResult<List<BuyMsg>> getBuyMsg(@RequestParam("userId") String userId);
+
+    @RequestMapping(value = "/shopcart/buymsg", method = RequestMethod.DELETE)
+    APIResult<Boolean> delete(@RequestParam("userId") String userId);
+
+}

+ 70 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/buymsg/BuyMsgService.java

@@ -0,0 +1,70 @@
+package cn.rankin.cmsweb.service.buymsg;
+
+import cn.rankin.cmsweb.service.product.MerchantProductService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.model.BaseCode;
+import cn.rankin.data.api.product.entity.Goods;
+import cn.rankin.data.api.product.vo.MerchantProductVo;
+import cn.rankin.data.api.user.entity.BuyMsg;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class BuyMsgService {
+
+    @Autowired
+    private BuyMsgClient buyMsgClient;
+
+    @Autowired
+    private MerchantProductService merchantProductService;
+
+    public APIResult<List<MerchantProductVo>> getListByBuyMsg(String userId, String merchantId) {
+        APIResult<List<BuyMsg>> buyMsgResult = buyMsgClient.getBuyMsg(userId);
+        if (!buyMsgResult.getSuccess()) {
+            return APIResult.error(new BaseCode(buyMsgResult.getCode(), buyMsgResult.getMessage()));
+        }
+
+        List<BuyMsg> buyMsgList = buyMsgResult.getData();
+        List<String> productIdList = new ArrayList<>();
+        Map<String, BuyMsg> buyMsgMap = new HashMap<>();
+        for (BuyMsg buyMsg : buyMsgList) {
+            String productId = buyMsg.getPid();
+            String goodsId = buyMsg.getGoodsId();
+            productIdList.add(productId);
+            buyMsgMap.put(goodsId, buyMsg);
+        }
+
+        if (CollectionUtils.isEmpty(productIdList)) {
+            return APIResult.ok(new ArrayList<>());
+        }
+
+        APIResult<List<MerchantProductVo>> productResult = merchantProductService.getList(productIdList, merchantId);
+        if (!productResult.getSuccess()) {
+            return APIResult.error(new BaseCode(productResult.getCode(), productResult.getMessage()));
+        }
+
+        List<MerchantProductVo> merchantProductVoList = productResult.getData();
+        for (MerchantProductVo merchantProductVo : merchantProductVoList) {
+            List<Goods> goodsList = merchantProductVo.getGoods();
+            if (CollectionUtils.isEmpty(goodsList)) {
+                continue;
+            }
+            for (Goods goods : goodsList) {
+                String goodsId = goods.getId();
+                if (buyMsgMap.containsKey(goodsId)) {
+                    goods.setIsInCart(Boolean.TRUE);
+                }else {
+                    goods.setIsInCart(Boolean.FALSE);
+                }
+            }
+        }
+
+        return APIResult.ok(merchantProductVoList);
+    }
+}

+ 5 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/MerchantProductService.java

@@ -3,6 +3,7 @@ package cn.rankin.cmsweb.service.product;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.product.dto.MerchantProductDTO;
+import cn.rankin.data.api.product.entity.MerchantProduct;
 import cn.rankin.data.api.product.vo.MerchantProductVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -10,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
 import java.util.Map;
 
 @FeignClient(name = "${service.product.name}")
@@ -26,4 +28,7 @@ public interface MerchantProductService {
 
     @RequestMapping(value = "/merchant/product/tags", method = RequestMethod.PUT)
     APIResult<MerchantProductVo> mountTags(@RequestBody MerchantProductDTO productDTO);
+
+    @RequestMapping(value = "/merchant/product/list", method = RequestMethod.POST)
+    APIResult<List<MerchantProductVo>> getList(@RequestBody List<String> productIdList, @RequestParam("merchantId") String merchantId);
 }

+ 42 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/PlatformTypeEnum.java

@@ -0,0 +1,42 @@
+package cn.rankin.common.utils.enums;
+
+public enum PlatformTypeEnum {
+
+    APP("app"), TV("TV"), WEIXIN("微信");
+
+    private String desc;
+
+    PlatformTypeEnum(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public static PlatformTypeEnum getByName(String name) {
+        if (name == null) {
+            return null;
+        }
+        for (PlatformTypeEnum favoritesType : values()) {
+            if (favoritesType.name().equals(name)) {
+                return favoritesType;
+            }
+        }
+        return null;
+    }
+
+    public static PlatformTypeEnum getByNameWithDefault(String name) {
+        if (name == null) {
+            return TV;
+        }
+        for (PlatformTypeEnum favoritesType : values()) {
+            if (favoritesType.name().equals(name)) {
+                return favoritesType;
+            }
+        }
+        return TV;
+    }
+
+}
+

+ 13 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/app/dto/GoodsDTO.java

@@ -0,0 +1,13 @@
+package cn.rankin.data.api.app.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class GoodsDTO implements Serializable {
+
+    private String goodsId;
+}

+ 30 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/app/vo/GoodsVo.java

@@ -0,0 +1,30 @@
+package cn.rankin.data.api.app.vo;
+
+import cn.rankin.common.utils.enums.ProductTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ToString
+public class GoodsVo implements Serializable {
+
+    private String id;
+
+    private String pid;
+
+    private ProductTypeEnum type;
+
+    private BigDecimal terminalPrice;
+
+    private String chargeUnit;
+
+    private String title;
+
+    private String subTitle;
+
+    private String coverUrl;
+
+}

+ 3 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/Goods.java

@@ -81,4 +81,7 @@ public class Goods implements Serializable {
     @Column(name = "gmt_modified", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtModified;
+
+    @Transient
+    private Boolean isInCart;
 }

+ 3 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderDTO.java

@@ -35,4 +35,7 @@ public class OrderDTO implements Serializable {
     private String note;
 
     private List<OrderGoodsDTO> goods;
+
+    private Boolean isFromCart;
+
 }

+ 38 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/dto/EventLogDTO.java

@@ -0,0 +1,38 @@
+package cn.rankin.data.api.user.dto;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.PlatformTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.persistence.Column;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.io.Serializable;
+
+@Data
+@ToString
+public class EventLogDTO implements Serializable {
+
+    private String id;
+
+    private String userId;
+
+    private String merchantId;
+
+    private Integer eventType;
+
+    private String tarName;
+
+    private String tarId;
+
+    private Integer value;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name="platform_type")
+    private PlatformTypeEnum platformType;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name="status")
+    private BaseStatusEnum status;
+}

+ 18 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/dto/ShopCartDTO.java

@@ -0,0 +1,18 @@
+package cn.rankin.data.api.user.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class ShopCartDTO implements Serializable {
+
+    private String userId;
+
+    private String goodsId;
+
+    private String pid;
+
+}

+ 44 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/BuyMsg.java

@@ -0,0 +1,44 @@
+package cn.rankin.data.api.user.entity;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+@Entity
+@Table(name = "u_buy_msg", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "pid"})})
+@DynamicInsert
+@DynamicUpdate
+public class BuyMsg implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "user_id", nullable = false)
+    private String userId;
+
+    @Column(name = "goods_id", nullable = false)
+    private String goodsId;
+
+    @Column(nullable = false)
+    private String pid;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name="status")
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtModified;
+}

+ 63 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/EventLog.java

@@ -0,0 +1,63 @@
+package cn.rankin.data.api.user.entity;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.PlatformTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+
+@Data
+@ToString
+@Entity
+@Table(name = "u_event_log")
+@DynamicInsert
+@DynamicUpdate
+public class EventLog implements Serializable {
+    @Id
+    @Column(name="id")
+    private String id;
+
+    @Column(name="user_id")
+    private String userId;
+
+    @Column(name="merchant_id")
+    private String merchantId;
+
+    @Column(name="event_type", nullable = false)
+    private Integer eventType;
+
+    @Column(name="tar_name")
+    private String tarName;
+
+    @Column(name="tar_id")
+    private String tarId;
+
+    @Column(name="value")
+    private Integer value;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name="platform_type")
+    private PlatformTypeEnum platformType;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name="status")
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtModified;
+
+}
+
+
+

+ 44 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/user/entity/ShopCart.java

@@ -0,0 +1,44 @@
+package cn.rankin.data.api.user.entity;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+@Entity
+@Table(name = "u_shop_cart", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "pid"})})
+@DynamicInsert
+@DynamicUpdate
+public class ShopCart implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "user_id", nullable = false)
+    private String userId;
+
+    @Column(name = "goods_id", nullable = false)
+    private String goodsId;
+
+    @Column(name = "pid", nullable = false)
+    private String pid;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name="status")
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtModified;
+}

+ 0 - 2
rankin-data-api/src/main/java/cn/rankin/data/api/user/vo/TerminalUserVo.java

@@ -31,8 +31,6 @@ public class TerminalUserVo implements Serializable {
 
     private String merchantId;
 
-    private String uid;
-
     private String merchantName;
 
     private String merchantContactName;

+ 22 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/controller/app/AppGoodsController.java

@@ -0,0 +1,22 @@
+package cn.rankin.productservice.controller.app;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.app.vo.GoodsVo;
+import cn.rankin.productservice.service.app.AppGoodsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/app/goods")
+public class AppGoodsController {
+
+    @Autowired
+    private AppGoodsService goodsService;
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<List<GoodsVo>> findByIds(@RequestBody List<String> goodsIdList, @RequestParam("merchantId") String merchantId) {
+        return goodsService.findByIds(goodsIdList, merchantId);
+    }
+}

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

@@ -4,7 +4,7 @@ import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.app.vo.ItemVo;
 import cn.rankin.data.api.product.entity.TagGroup;
-import cn.rankin.productservice.service.ItemService;
+import cn.rankin.productservice.service.app.ItemService;
 import cn.rankin.productservice.service.TagGroupService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;

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

@@ -6,7 +6,7 @@ import cn.rankin.data.api.product.entity.Course;
 import cn.rankin.data.api.product.vo.CourseItemVo;
 import cn.rankin.productservice.code.ProductServiceAPICode;
 import cn.rankin.productservice.service.CourseService;
-import cn.rankin.productservice.service.ItemService;
+import cn.rankin.productservice.service.app.ItemService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 

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

@@ -4,7 +4,7 @@ import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.app.dto.ItemSearchDTO;
 import cn.rankin.data.api.app.vo.ItemVo;
-import cn.rankin.productservice.service.ItemService;
+import cn.rankin.productservice.service.app.ItemService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 

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

@@ -3,7 +3,7 @@ package cn.rankin.productservice.controller.app;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.data.api.product.vo.SupportItemVo;
 import cn.rankin.productservice.code.ProductServiceAPICode;
-import cn.rankin.productservice.service.ItemService;
+import cn.rankin.productservice.service.app.ItemService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 

+ 6 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/controller/cms/MerchantProductController.java

@@ -9,6 +9,7 @@ import cn.rankin.common.utils.enums.BaseOrderEnum;
 import cn.rankin.data.api.product.entity.MerchantProduct;
 import cn.rankin.productservice.code.ProductServiceAPICode;
 import cn.rankin.productservice.service.MerchantProductService;
+import cn.rankin.productservice.service.app.AppGoodsService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -84,4 +85,9 @@ public class MerchantProductController {
 
         return merchantProductService.mountTags(productId, merchantId, tagIdList);
     }
+
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public APIResult<List<MerchantProduct>> getList(@RequestBody List<String> productIdList, @RequestParam("merchantId") String merchantId) {
+        return merchantProductService.findByPidList(productIdList, merchantId);
+    }
 }

+ 3 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/repository/GoodsRepository.java

@@ -22,6 +22,9 @@ public interface GoodsRepository extends BasicJpaRepository<Goods, String> {
     @Query(value = "select g from Goods g where g.id in (?1) and g.status = ?2")
     List<Goods> findByIds(List<String> goodIds, BaseStatusEnum status);
 
+    @Query(value = "select g from Goods g where g.id in (?1) and g.merchantId = ?2 and g.status = 0")
+    List<Goods> findByIds(List<String> goodsIdList, String merchantId);
+
     @Modifying
     @Query(value = "update Goods g set g.status = 1 where g.id = ?1")
     Integer deleteById(String id);

+ 4 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/repository/MerchantProductRepository.java

@@ -1,5 +1,6 @@
 package cn.rankin.productservice.repository;
 
+import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.jpa.BasicJpaRepository;
 import cn.rankin.data.api.product.entity.MerchantProduct;
 import org.springframework.data.jpa.repository.Modifying;
@@ -18,6 +19,9 @@ public interface MerchantProductRepository extends BasicJpaRepository<MerchantPr
     @Query(value = "select m from MerchantProduct m where m.pid in (?1) and m.merchantId = ?2 order by m.sort")
     List<MerchantProduct> findByPidsAndMerchantId(List<String> pids, String merchantId);
 
+    @Query(value = "select m from MerchantProduct m where m.pid in (?1) and m.merchantId = ?2 and m.status = ?3 order by m.sort")
+    List<MerchantProduct> findByPidsAndMerchantId(List<String> pids, String merchantId, BaseStatusEnum status);
+
     MerchantProduct findByPidAndMerchantId(String pid, String merchantId);
 
     @Modifying

+ 36 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/service/MerchantProductService.java

@@ -233,4 +233,40 @@ public class MerchantProductService {
             return APIResult.ok();
         }
     }
+
+    public APIResult<List<MerchantProduct>> findByPidList(List<String> productIdList, String merchantId) {
+
+        if (CollectionUtils.isEmpty(productIdList)) {
+            return APIResult.ok(new ArrayList<>());
+        }
+
+        List<MerchantProduct> merchantProductList = merchantProductRepository.findByPidsAndMerchantId(productIdList, merchantId, BaseStatusEnum.NORMAL);
+        if (merchantProductList.size() == 0) {
+            return APIResult.ok(merchantProductList);
+        }
+
+        // map同一产品同一渠道下多个标价商品
+        Map<String, List<Goods>> goodsMap = new HashMap<>();
+        List<Goods> goodsList = goodsRepository.findByPidsAndMerchantId(productIdList, merchantId);
+
+        for (Goods goods : goodsList) {
+            String productId = goods.getPid();
+            if (goodsMap.containsKey(productId)) {
+                List<Goods> tmp = goodsMap.get(productId);
+                tmp.add(goods);
+            } else {
+                List<Goods> tmpList = new ArrayList<>();
+                tmpList.add(goods);
+                goodsMap.put(productId, tmpList);
+            }
+        }
+
+        for (MerchantProduct merchantProduct : merchantProductList) {
+            String productId = merchantProduct.getPid();
+            List<Goods> tmp = goodsMap.get(productId);
+            merchantProduct.setGoods(tmp);
+        }
+
+        return APIResult.ok(merchantProductList);
+    }
 }

+ 112 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/service/app/AppGoodsService.java

@@ -0,0 +1,112 @@
+package cn.rankin.productservice.service.app;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.enums.ProductTypeEnum;
+import cn.rankin.data.api.app.vo.GoodsVo;
+import cn.rankin.data.api.product.entity.Course;
+import cn.rankin.data.api.product.entity.Goods;
+import cn.rankin.data.api.product.entity.Support;
+import cn.rankin.productservice.repository.CourseRepository;
+import cn.rankin.productservice.repository.GoodsRepository;
+import cn.rankin.productservice.repository.SupportRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class AppGoodsService {
+
+    @Autowired
+    private GoodsRepository goodsRepository;
+
+    @Autowired
+    private CourseRepository courseRepository;
+
+    @Autowired
+    private SupportRepository supportRepository;
+
+    public APIResult<List<GoodsVo>> findByIds(List<String> goodsIdList, String merchantId) {
+        if (CollectionUtils.isEmpty(goodsIdList)) {
+            return APIResult.ok(new ArrayList<>());
+        }
+
+        List<Goods> goodsList = goodsRepository.findByIds(goodsIdList, merchantId);
+
+        Map<String, Goods> goodsMap = new HashMap<>();
+        List<String> courseIdList = new ArrayList<>();
+        List<String> supportIdList = new ArrayList<>();
+        for (Goods goods : goodsList) {
+            String productId = goods.getPid();
+            ProductTypeEnum type = goods.getType();
+            if (ProductTypeEnum.COURSE.equals(type)) {
+                courseIdList.add(productId);
+            } else if (type.equals(ProductTypeEnum.SUPPORT)) {
+                supportIdList.add(productId);
+            }
+            String goodsId = goods.getId();
+            goodsMap.put(goodsId, goods);
+        }
+
+        List<Course> courseList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(courseIdList)) {
+            courseList = courseRepository.findByIds(courseIdList);
+        }
+
+        List<Support> supportList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(supportIdList)) {
+            supportList = supportRepository.findByIds(supportIdList);
+        }
+
+        // 拿产品信息
+        Map<String, Course> courseMap = new HashMap<>();
+        for (Course course : courseList) {
+            String productId = course.getId();
+            courseMap.put(productId, course);
+        }
+        Map<String, Support> supportMap = new HashMap<>();
+        for (Support support : supportList) {
+            String productId = support.getId();
+            supportMap.put(productId, support);
+        }
+
+        // 组装
+        List<GoodsVo> goodsVoList = new ArrayList<>();
+        for (String goodsId : goodsIdList) {
+            Goods goods = goodsMap.get(goodsId);
+            if (StringUtils.isEmpty(goods)) {
+                continue;
+            }
+            GoodsVo goodsVo = new GoodsVo();
+            goodsVo.setId(goods.getId());
+            goodsVo.setPid(goods.getPid());
+            goodsVo.setType(goods.getType());
+            goodsVo.setChargeUnit(goods.getChargeUnit());
+            goodsVo.setTerminalPrice(goods.getTerminalPrice());
+            ProductTypeEnum type = goods.getType();
+            String productId = goods.getPid();
+            if (ProductTypeEnum.COURSE.equals(type)) {
+                Course course = courseMap.get(productId);
+                if (course != null) {
+                    goodsVo.setTitle(course.getTitle());
+                    goodsVo.setSubTitle(course.getSubTitle());
+                    goodsVo.setCoverUrl(course.getCoverUrl());
+                }
+            } else if (ProductTypeEnum.SUPPORT.equals(type)) {
+                Support support = supportMap.get(productId);
+                if (support != null) {
+                    goodsVo.setTitle(support.getTitle());
+                    goodsVo.setSubTitle(support.getSubTitle());
+                    goodsVo.setCoverUrl(support.getCoverUrl());
+                }
+            }
+            goodsVoList.add(goodsVo);
+        }
+        return APIResult.ok(goodsVoList);
+    }
+}

+ 1 - 1
rankin-product-service/src/main/java/cn/rankin/productservice/service/ItemService.java

@@ -1,4 +1,4 @@
-package cn.rankin.productservice.service;
+package cn.rankin.productservice.service.app;
 
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;

+ 23 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/controller/EventLogController.java

@@ -0,0 +1,23 @@
+package cn.rankin.userservice.controller;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.user.dto.EventLogDTO;
+import cn.rankin.userservice.service.EventLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/event")
+public class EventLogController {
+
+    @Autowired
+    private EventLogService eventLogService;
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<Boolean> addLog(@RequestBody EventLogDTO eventLogDTO) {
+        return eventLogService.addLog(eventLogDTO);
+    }
+}

+ 65 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/controller/ShopCartController.java

@@ -0,0 +1,65 @@
+package cn.rankin.userservice.controller;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.data.api.user.dto.ShopCartDTO;
+import cn.rankin.data.api.user.entity.BuyMsg;
+import cn.rankin.data.api.user.entity.ShopCart;
+import cn.rankin.userservice.service.BuyMsgService;
+import cn.rankin.userservice.service.ShopCartService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/shopcart")
+public class ShopCartController {
+
+    @Autowired
+    private ShopCartService shopCartService;
+
+    @Autowired
+    private BuyMsgService buyMsgService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.POST)
+    public APIResult<List<ShopCart>> findByIds(@RequestBody List<String> goodsIdList, @RequestParam("userId") String userId) {
+        return shopCartService.findByIds(userId, goodsIdList);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<Boolean> add(@RequestBody ShopCartDTO shopCartDTO) {
+        return shopCartService.add(shopCartDTO.getUserId(), shopCartDTO.getGoodsId(), shopCartDTO.getPid());
+    }
+
+    @RequestMapping(method = RequestMethod.GET)
+    public APIResult<Page<ShopCart>> getPage(@RequestParam("userId") String userId, @RequestParam("pageNo") Integer pageNo,
+                                             @RequestParam("pageSize") Integer pageSize) {
+        return shopCartService.getPage(userId, pageNo, pageSize);
+    }
+
+    @RequestMapping(method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@RequestParam("userId") String userId, @RequestParam("goodsId") String goodsId) {
+        return shopCartService.delete(userId, goodsId);
+    }
+
+    @RequestMapping(value = "/totalNum", method = RequestMethod.GET)
+    public APIResult getTotalNum(@RequestParam("userId") String userId) {
+        return shopCartService.getTotalNum(userId);
+    }
+
+    @RequestMapping(value = "/buymsg", method = RequestMethod.POST)
+    public APIResult<Boolean> push(@RequestParam("userId") String userId) {
+        return buyMsgService.push(userId);
+    }
+
+    @RequestMapping(value = "/buymsg", method = RequestMethod.GET)
+    public APIResult<List<BuyMsg>> get(@RequestParam("userId") String userId) {
+        return buyMsgService.get(userId);
+    }
+
+    @RequestMapping(value = "/buymsg", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@RequestParam("userId") String userId) {
+        return buyMsgService.delete(userId);
+    }
+}

+ 13 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/repository/BuyMsgRepository.java

@@ -0,0 +1,13 @@
+package cn.rankin.userservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.data.api.user.entity.BuyMsg;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+public interface BuyMsgRepository extends BasicJpaRepository<BuyMsg, String> {
+
+    @Modifying
+    @Query(value = "update BuyMsg b set b.status = 1 where b.userId = ?1")
+    Integer deleteByUserId(String userId);
+}

+ 7 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/repository/EventLogRepository.java

@@ -0,0 +1,7 @@
+package cn.rankin.userservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.data.api.user.entity.EventLog;
+
+public interface EventLogRepository extends BasicJpaRepository<EventLog, String> {
+}

+ 22 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/repository/ShopCartRepository.java

@@ -0,0 +1,22 @@
+package cn.rankin.userservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.data.api.user.entity.ShopCart;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+public interface ShopCartRepository extends BasicJpaRepository<ShopCart, String> {
+
+    @Query(value = "select s from ShopCart s where s.goodsId in (?1) and s.userId = ?2 and s.status = 0")
+    List<ShopCart> findByGoodsIds(List<String> goodsIdList, String userId);
+
+    @Modifying
+    @Query(value = "update ShopCart s set s.status = 1 where s.userId = ?1 and s.goodsId = ?2")
+    Integer deleteByUserIdAndGoodsId(String userId, String goodsId);
+
+    @Modifying
+    @Query(value = "update ShopCart s set s.status = 1 where s.userId = ?1")
+    Integer deleteByUserId(String userId);
+}

+ 71 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/BuyMsgService.java

@@ -0,0 +1,71 @@
+package cn.rankin.userservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.data.api.user.entity.BuyMsg;
+import cn.rankin.data.api.user.entity.ShopCart;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.repository.BuyMsgRepository;
+import cn.rankin.userservice.repository.ShopCartRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.transaction.Transactional;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class BuyMsgService {
+
+    @Autowired
+    private BuyMsgRepository buyMsgRepository;
+
+    @Autowired
+    private ShopCartRepository shopCartRepository;
+
+    @Transactional
+    public APIResult<Boolean> push(String userId) {
+        ShopCart sample = new ShopCart();
+        sample.setUserId(userId);
+        sample.setStatus(BaseStatusEnum.NORMAL);
+        List<ShopCart> shopCartList = shopCartRepository.find(sample);
+        if (!CollectionUtils.isEmpty(shopCartList)) {
+            List<BuyMsg> buyMsgList = convert(shopCartList);
+            buyMsgRepository.save(buyMsgList);
+            shopCartRepository.deleteByUserId(userId);
+            return APIResult.ok(Boolean.TRUE);
+        }
+        return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+    }
+
+    public APIResult<List<BuyMsg>> get(String userId) {
+        BuyMsg buyMsg = new BuyMsg();
+        buyMsg.setUserId(userId);
+        buyMsg.setStatus(BaseStatusEnum.NORMAL);
+        List<BuyMsg> buyMsgList = buyMsgRepository.find(buyMsg);
+        return APIResult.ok(buyMsgList);
+    }
+
+    @Transactional
+    public APIResult<Boolean> delete(String userId) {
+        Integer count = buyMsgRepository.deleteByUserId(userId);
+        if (count > 0) {
+            return APIResult.ok(Boolean.TRUE);
+        }
+        return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+    }
+
+    public static List<BuyMsg> convert(List<ShopCart> shopCartList) {
+        List<BuyMsg> buyMsgList = new ArrayList<>();
+        for (ShopCart shopCart : shopCartList) {
+            BuyMsg buyMsg = new BuyMsg();
+            buyMsg.setUserId(shopCart.getUserId());
+            buyMsg.setGoodsId(shopCart.getGoodsId());
+            buyMsg.setPid(shopCart.getPid());
+            buyMsg.setStatus(BaseStatusEnum.NORMAL);
+            buyMsgList.add(buyMsg);
+        }
+        return buyMsgList;
+    }
+}

+ 23 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/EventLogService.java

@@ -0,0 +1,23 @@
+package cn.rankin.userservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.user.dto.EventLogDTO;
+import cn.rankin.data.api.user.entity.EventLog;
+import cn.rankin.userservice.repository.EventLogRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import static cn.rankin.userservice.utils.DTOConverter.convert;
+
+@Service
+public class EventLogService {
+
+    @Autowired
+    private EventLogRepository eventLogRepository;
+
+    public APIResult<Boolean> addLog(EventLogDTO eventLogDTO) {
+        EventLog eventLog = convert(eventLogDTO);
+        eventLogRepository.save(eventLog);
+        return APIResult.ok(Boolean.TRUE);
+    }
+}

+ 78 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/service/ShopCartService.java

@@ -0,0 +1,78 @@
+package cn.rankin.userservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.data.api.user.dto.ShopCartDTO;
+import cn.rankin.data.api.user.entity.ShopCart;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.repository.ShopCartRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.util.*;
+
+@Service
+public class ShopCartService {
+
+    @Autowired
+    private ShopCartRepository shopCartRepository;
+
+    public APIResult<List<ShopCart>> findByIds(String userId, List<String> goodsIdList) {
+        List<ShopCart> shopCartList = shopCartRepository.findByGoodsIds(goodsIdList, userId);
+        return APIResult.ok(shopCartList);
+    }
+
+    public APIResult<Page<ShopCart>> getPage(String userId, Integer pageNo, Integer pageSize) {
+        ShopCart sample = new ShopCart();
+        sample.setUserId(userId);
+        sample.setStatus(BaseStatusEnum.NORMAL);
+        Long total = shopCartRepository.count(sample);
+        Page<ShopCart> page = new Page(total, pageNo, pageSize);
+        if (total == 0) {
+            return APIResult.ok(page);
+        }
+        List<ShopCart> shopCartList = shopCartRepository.find(sample, page.getStart(), pageSize);
+        page.setList(shopCartList);
+        return APIResult.ok(page);
+    }
+
+    public APIResult<Map<String, Long>> getTotalNum(String userId) {
+        ShopCart sample = new ShopCart();
+        sample.setUserId(userId);
+        sample.setStatus(BaseStatusEnum.NORMAL);
+        Long total = shopCartRepository.count(sample);
+        Map<String, Long> result = new HashMap<>();
+        result.put("totalNum", total);
+        return APIResult.ok(result);
+    }
+
+    @Transactional
+    public APIResult<Boolean> add(String userId, String goodsId, String productId) {
+        ShopCart shopCart = new ShopCart();
+        shopCart.setUserId(userId);
+        shopCart.setPid(productId);
+
+        ShopCart shopCartBefore = shopCartRepository.findFirst(shopCart);
+        if (shopCartBefore != null) {
+            shopCartBefore.setGoodsId(goodsId);
+            shopCartBefore.setStatus(BaseStatusEnum.NORMAL);
+            shopCartRepository.save(shopCartBefore);
+        }else {
+            shopCart.setGoodsId(goodsId);
+            shopCart.setStatus(BaseStatusEnum.NORMAL);
+            shopCartRepository.save(shopCart);
+        }
+        return APIResult.ok();
+    }
+
+    @Transactional
+    public APIResult<Boolean> delete(String userId, String goodsId) {
+        Integer count = shopCartRepository.deleteByUserIdAndGoodsId(userId, goodsId);
+        if (count > 0) {
+            return APIResult.ok(Boolean.TRUE);
+        }
+        return APIResult.error(UserServiceAPICode.NOT_EXISTS);
+    }
+}

+ 8 - 0
rankin-user-service/src/main/java/cn/rankin/userservice/utils/DTOConverter.java

@@ -1,6 +1,7 @@
 package cn.rankin.userservice.utils;
 
 import cn.rankin.common.utils.constant.Constant;
+import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.data.api.user.dto.*;
 import cn.rankin.data.api.user.entity.*;
 import cn.rankin.userservice.dto.UserRegistry;
@@ -49,4 +50,11 @@ public class DTOConverter {
         BeanUtils.copyProperties(collectionDTO, collection);
         return collection;
     }
+
+    public static EventLog convert(EventLogDTO eventLogDTO) {
+        EventLog eventLog = new EventLog();
+        BeanUtils.copyProperties(eventLogDTO, eventLog);
+        eventLog.setStatus(BaseStatusEnum.NORMAL);
+        return eventLog;
+    }
 }