huodongdong 7 anni fa
parent
commit
2bd43244b7
63 ha cambiato i file con 1231 aggiunte e 521 eliminazioni
  1. 0 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/FeignConfiguration.java
  2. 3 3
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/GoodsController.java
  3. 19 4
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/GroupController.java
  4. 2 2
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/MerchantProductController.java
  5. 12 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/ProductController.java
  6. 26 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/trade/OrderController.java
  7. 14 29
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/MerchantController.java
  8. 9 7
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/GoodsService.java
  9. 5 5
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/MerchantProductService.java
  10. 8 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/ProductService.java
  11. 107 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/Order/OrderService.java
  12. 20 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/Order/OrderServiceFeign.java
  13. 117 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/utils/MerchantServiceUtil.java
  14. 15 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/utils/DTOConverter.java
  15. 0 4
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/search/GroupSearchDTO.java
  16. 0 4
      rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/search/TagSearchDTO.java
  17. 21 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/OrderStatusEnum.java
  18. 1 1
      rankin-data-api/src/main/java/cn/rankin/data/api/product/dto/PackageProductDTO.java
  19. 2 3
      rankin-data-api/src/main/java/cn/rankin/data/api/product/dto/TagDTO.java
  20. 2 0
      rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/MerchantProduct.java
  21. 1 20
      rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/Tag.java
  22. 3 3
      rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/TagGroup.java
  23. 41 0
      rankin-data-api/src/main/java/cn/rankin/data/api/product/vo/GoodsVo.java
  24. 2 0
      rankin-data-api/src/main/java/cn/rankin/data/api/product/vo/GroupVo.java
  25. 31 0
      rankin-data-api/src/main/java/cn/rankin/data/api/product/vo/PackageVo.java
  26. 20 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderGoodsDTO.java
  27. 30 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/UserOrderDTO.java
  28. 40 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/OrderGoods.java
  29. 119 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/ProductSoldSnapshot.java
  30. 53 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/UserOrder.java
  31. 41 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/UserOrderVo.java
  32. 0 2
      rankin-data-api/src/main/java/cn/rankin/data/api/user/dto/MerchantDTO.java
  33. 0 2
      rankin-data-api/src/main/java/cn/rankin/data/api/user/vo/MerchantVo.java
  34. 1 1
      rankin-data-api/src/main/java/cn/rankin/data/api/user/vo/TerminalUserVo.java
  35. 7 0
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/GoodsController.java
  36. 0 130
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/GroupController.java
  37. 2 2
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/MerchantProductController.java
  38. 19 122
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/TagController.java
  39. 69 0
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/TagGroupController.java
  40. 4 0
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/GoodsRepository.java
  41. 2 6
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/MerchantProductRepository.java
  42. 4 6
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagGroupRepository.java
  43. 5 19
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagRepository.java
  44. 0 48
      rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagRepositoryImpl.java
  45. 12 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/GoodsService.java
  46. 3 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/MerchantProductService.java
  47. 5 1
      rankin-product-service/src/main/java/cn/rankin/productservice/service/MerchantProductTagRelationService.java
  48. 1 2
      rankin-product-service/src/main/java/cn/rankin/productservice/service/PackageProductRelationService.java
  49. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/service/PackageService.java
  50. 23 22
      rankin-product-service/src/main/java/cn/rankin/productservice/service/TagGroupService.java
  51. 89 68
      rankin-product-service/src/main/java/cn/rankin/productservice/service/TagService.java
  52. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/utils/DTOConverter.java
  53. 6 0
      rankin-product-service/src/test/java/cn/rankin/productservice/repository/tagRepositoryImplTest.java
  54. 5 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/TradeServiceApplication.java
  55. 6 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/code/TradeServiceAPICode.java
  56. 44 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/configuration/PersistConfiguration.java
  57. 27 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/controller/OrderController.java
  58. 11 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderGoodsRepository.java
  59. 7 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderRepository.java
  60. 34 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderGoodsService.java
  61. 52 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderService.java
  62. 26 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/utils/DTOConverter.java
  63. 1 1
      rankin-trade-service/src/main/resources/bootstrap.yml

+ 0 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/FeignConfiguration.java

@@ -14,7 +14,6 @@ public class FeignConfiguration {
         @Override
         public void apply(RequestTemplate template) {
             template.header("Content-Type", "application/json");
-            log.info("add header content type");
         }
     }
 

+ 3 - 3
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/GoodsController.java

@@ -3,7 +3,7 @@ package cn.rankin.cmsweb.controller.product;
 import cn.rankin.cmsweb.service.product.GoodsService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.data.api.product.dto.GoodsDTO;
-import cn.rankin.data.api.product.entity.Goods;
+import cn.rankin.data.api.product.vo.GoodsVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,12 +15,12 @@ public class GoodsController {
     private GoodsService goodsService;
 
     @RequestMapping(method = RequestMethod.POST)
-    public APIResult<Goods> create(@RequestBody GoodsDTO goodsDTO) {
+    public APIResult<GoodsVo> create(@RequestBody GoodsDTO goodsDTO) {
         return goodsService.create(goodsDTO);
     }
 
     @RequestMapping(method = RequestMethod.PUT)
-    public APIResult<Goods> update(@RequestBody GoodsDTO goodsDTO) {
+    public APIResult<GoodsVo> update(@RequestBody GoodsDTO goodsDTO) {
         return goodsService.update(goodsDTO);
     }
 

+ 19 - 4
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/GroupController.java

@@ -1,17 +1,21 @@
 package cn.rankin.cmsweb.controller.product;
 
 import cn.rankin.cmsweb.service.product.GroupService;
+import cn.rankin.cmsweb.service.user.utils.MerchantServiceUtil;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.product.dto.GroupDTO;
 import cn.rankin.common.utils.dto.search.GroupSearchDTO;
 import cn.rankin.common.utils.util.BeanUtil;
 import cn.rankin.data.api.product.vo.GroupVo;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.List;
 
+@Slf4j
 @RestController
 @RequestMapping(value = "/group")
 public class GroupController {
@@ -19,19 +23,28 @@ public class GroupController {
     @Autowired
     private GroupService groupService;
 
+    @Autowired
+    private MerchantServiceUtil<GroupVo> merchantServiceUtil;
+
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     public APIResult<Page<GroupVo>> search(GroupSearchDTO searchDTO) {
-        return groupService.search(BeanUtil.convertToMap(searchDTO));
+        APIResult<Page<GroupVo>> pageAPIResult = groupService.search(BeanUtil.convertToMap(searchDTO));
+        merchantServiceUtil.setPageMerchantInfo(pageAPIResult);
+        return pageAPIResult;
     }
 
     @RequestMapping(method = RequestMethod.POST)
     public APIResult<GroupVo> create(@Valid @RequestBody GroupDTO groupDTO) {
-        return groupService.create(groupDTO);
+        APIResult<GroupVo> groupVoAPIResult = groupService.create(groupDTO);
+        merchantServiceUtil.setMerchantInfo(groupVoAPIResult);
+        return groupVoAPIResult;
     }
 
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<GroupVo> update(@Valid @RequestBody GroupDTO groupDTO) {
-        return groupService.update(groupDTO);
+        APIResult<GroupVo> groupVoAPIResult = groupService.update(groupDTO);
+        merchantServiceUtil.setMerchantInfo(groupVoAPIResult);
+        return groupVoAPIResult;
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@@ -41,6 +54,8 @@ public class GroupController {
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public APIResult<GroupVo> getGroup(@PathVariable("id") String id) {
-        return groupService.getGroup(id);
+        APIResult<GroupVo> groupVoAPIResult = groupService.getGroup(id);
+        merchantServiceUtil.setMerchantInfo(groupVoAPIResult);
+        return groupVoAPIResult;
     }
 }

+ 2 - 2
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/MerchantProductController.java

@@ -18,7 +18,7 @@ import java.util.List;
 import java.util.Map;
 
 @RestController
-@RequestMapping(value = "/merchant/products")
+@RequestMapping(value = "/merchant/product")
 public class MerchantProductController {
 
     @Autowired
@@ -56,7 +56,7 @@ public class MerchantProductController {
     }
 
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
-    public APIResult<MerchantProductVo> getProduct(@RequestParam("productId") String productId, @RequestParam("merchantId") String merchantId) {
+    public APIResult<MerchantProductVo> getProduct(@RequestParam("pid") String productId, @RequestParam("merchantId") String merchantId) {
         return merchantProductService.getProduct(productId, merchantId);
     }
 

+ 12 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/ProductController.java

@@ -3,12 +3,13 @@ package cn.rankin.cmsweb.controller.product;
 import cn.rankin.cmsweb.service.product.ProductService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
-import cn.rankin.common.utils.enums.ProductTypeEnum;
 import cn.rankin.common.utils.util.BeanUtil;
 import cn.rankin.data.api.product.dto.CourseDTO;
+import cn.rankin.data.api.product.dto.PackageDTO;
 import cn.rankin.data.api.product.dto.ProductSearchDTO;
 import cn.rankin.data.api.product.dto.SupportDTO;
 import cn.rankin.data.api.product.vo.CourseVo;
+import cn.rankin.data.api.product.vo.PackageVo;
 import cn.rankin.data.api.product.vo.ProductVo;
 import cn.rankin.data.api.product.vo.SupportVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,6 +52,16 @@ public class ProductController {
         return productService.updateSupport(supportDTO);
     }
 
+    @RequestMapping(value = "/package", method = RequestMethod.POST)
+    public APIResult<PackageVo> createPackage(@RequestBody PackageDTO packageDTO) {
+        return productService.createPackage(packageDTO);
+    }
+
+    @RequestMapping(value = "/package", method = RequestMethod.PUT)
+    public APIResult<PackageVo> updatePackage(@RequestBody PackageDTO packageDTO) {
+        return productService.updatePackage(packageDTO);
+    }
+
     @RequestMapping(value = "/{productId}", method = RequestMethod.DELETE)
     public APIResult delete(@PathVariable("productId") String productId) {
         return productService.delete(productId);

+ 26 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/trade/OrderController.java

@@ -0,0 +1,26 @@
+package cn.rankin.cmsweb.controller.trade;
+
+import cn.rankin.cmsweb.service.trade.Order.OrderService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.trade.dto.UserOrderDTO;
+import cn.rankin.data.api.trade.vo.UserOrderVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/order")
+public class OrderController {
+
+    @Autowired
+    private OrderService orderService;
+
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<UserOrderVo> create(@RequestBody UserOrderDTO userOrderDTO) {
+        return orderService.create(userOrderDTO);
+    }
+
+    @RequestMapping(value = "/{goodId}", method = RequestMethod.GET)
+    public APIResult<UserOrderVo> getOrder(@PathVariable String orderId) {
+        return null;
+    }
+}

+ 14 - 29
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/user/MerchantController.java

@@ -1,17 +1,15 @@
 package cn.rankin.cmsweb.controller.user;
 
-import cn.rankin.cmsweb.code.CmsWebAPICode;
 import cn.rankin.cmsweb.service.product.RecommendService;
 import cn.rankin.cmsweb.service.user.MerchantService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.data.api.product.vo.RecommendVo;
 import cn.rankin.data.api.user.dto.MerchantDTO;
 import cn.rankin.data.api.user.dto.MerchantSearchDTO;
 import cn.rankin.common.utils.util.BeanUtil;
-import cn.rankin.data.api.product.vo.RecommendVo;
 import cn.rankin.data.api.user.vo.MerchantVo;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -39,23 +37,7 @@ public class MerchantController {
 
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<MerchantVo> update(@RequestBody @Valid MerchantDTO merchantDTO) {
-        APIResult<MerchantVo> result = merchantService.update(merchantDTO);
-        if (!result.getSuccess()) {
-            return result;
-        }
-
-        MerchantVo merchantVo = result.getData();
-        List<String> recommendIdList = merchantDTO.getRecommendIdList();
-
-        if (!CollectionUtils.isEmpty(recommendIdList)) {
-            APIResult<List<RecommendVo>> recommendAPIResult = recommendService.put(merchantDTO.getId(), recommendIdList);
-            if (!recommendAPIResult.getSuccess()) {
-                return APIResult.error(CmsWebAPICode.error("更新推荐位失败"));
-            }
-            merchantVo.setRecommendVoList(recommendAPIResult.getData());
-        }
-
-        return result;
+        return merchantService.update(merchantDTO);
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@@ -65,15 +47,18 @@ public class MerchantController {
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     public APIResult<MerchantVo> getMerchant(@PathVariable String id) {
-        APIResult<MerchantVo> result = merchantService.getMerchant(id);
-        if (result.getSuccess()) {
-            MerchantVo merchantVo = result.getData();
-            APIResult<List<RecommendVo>> recommendAPIResult = recommendService.get(id);
-            if (recommendAPIResult.getSuccess()) {
-                merchantVo.setRecommendVoList(recommendAPIResult.getData());
-            }
-        }
-        return result;
+        return merchantService.getMerchant(id);
+    }
+
+    // 推荐位设置
+    @RequestMapping(value = "/recommend", method = RequestMethod.GET)
+    public APIResult<List<RecommendVo>> getRecommend(@RequestParam("merchantId") String merchantId) {
+        return recommendService.get(merchantId);
+    }
+
+    @RequestMapping(value = "/recommend", method = RequestMethod.PUT)
+    public APIResult<List<RecommendVo>> updateRecommend(@RequestParam("merchantId") String merchantId, @RequestBody List<String> recommendIdList) {
+        return recommendService.put(merchantId, recommendIdList);
     }
 
 }

+ 9 - 7
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/GoodsService.java

@@ -2,22 +2,24 @@ package cn.rankin.cmsweb.service.product;
 
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.data.api.product.dto.GoodsDTO;
-import cn.rankin.data.api.product.entity.Goods;
+import cn.rankin.data.api.product.vo.GoodsVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
-import org.springframework.web.bind.annotation.PathVariable;
-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.*;
+
+import java.util.List;
 
 @FeignClient(name = "${service.product.name}")
 public interface GoodsService {
 
     @RequestMapping(value = "/goods", method = RequestMethod.POST)
-    APIResult<Goods> create(@RequestBody GoodsDTO goodsDTO);
+    APIResult<GoodsVo> create(@RequestBody GoodsDTO goodsDTO);
 
     @RequestMapping(value = "/goods", method = RequestMethod.PUT)
-    APIResult<Goods> update(@RequestBody GoodsDTO goodsDTO);
+    APIResult<GoodsVo> update(@RequestBody GoodsDTO goodsDTO);
 
     @RequestMapping(value = "/goods/{goodsId}", method = RequestMethod.DELETE)
     APIResult<Boolean> delete(@PathVariable("goodsId") String goodsId);
+
+    @RequestMapping(value = "/goods/ids", method = RequestMethod.GET)
+    APIResult<List<GoodsVo>> findByIds(@RequestParam("id") List<String> ids);
 }

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

@@ -15,15 +15,15 @@ import java.util.Map;
 @FeignClient(name = "${service.product.name}")
 public interface MerchantProductService {
 
-    @RequestMapping(value = "/merchant/products", method = RequestMethod.GET)
+    @RequestMapping(value = "/merchant/product", method = RequestMethod.GET)
     APIResult<Page<MerchantProductVo>> search(@RequestParam Map<String, Object> searchDTO);
 
-    @RequestMapping(value = "/merchant/products/detail", method = RequestMethod.GET)
-    APIResult<MerchantProductVo> getProduct(@RequestParam("productId") String productId, @RequestParam("merchantId") String merchantId);
+    @RequestMapping(value = "/merchant/product/detail", method = RequestMethod.GET)
+    APIResult<MerchantProductVo> getProduct(@RequestParam("pid") String productId, @RequestParam("merchantId") String merchantId);
 
-    @RequestMapping(value = "/merchant/products/status", method = RequestMethod.PUT)
+    @RequestMapping(value = "/merchant/product/status", method = RequestMethod.PUT)
     APIResult<Boolean> change(@RequestBody MerchantProductDTO merchantProductDTO);
 
-    @RequestMapping(value = "/merchant/products/tags", method = RequestMethod.PUT)
+    @RequestMapping(value = "/merchant/product/tags", method = RequestMethod.PUT)
     APIResult<MerchantProductVo> mountTags(@RequestBody MerchantProductDTO productDTO);
 }

+ 8 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/product/ProductService.java

@@ -4,8 +4,10 @@ import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.enums.ProductTypeEnum;
 import cn.rankin.data.api.product.dto.CourseDTO;
+import cn.rankin.data.api.product.dto.PackageDTO;
 import cn.rankin.data.api.product.dto.SupportDTO;
 import cn.rankin.data.api.product.vo.CourseVo;
+import cn.rankin.data.api.product.vo.PackageVo;
 import cn.rankin.data.api.product.vo.ProductVo;
 import cn.rankin.data.api.product.vo.SupportVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
@@ -34,6 +36,12 @@ public interface ProductService {
     @RequestMapping(value = "/product/support", method = RequestMethod.POST)
     APIResult<SupportVo> createSupport(@RequestBody SupportDTO supportDTO);
 
+    @RequestMapping(value = "/product/package", method = RequestMethod.POST)
+    APIResult<PackageVo> createPackage(@RequestBody PackageDTO packageDTO);
+
+    @RequestMapping(value = "/product/package", method = RequestMethod.PUT)
+    APIResult<PackageVo> updatePackage(@RequestBody PackageDTO packageDTO);
+
     @RequestMapping(value = "/product/{id}", method = RequestMethod.DELETE)
     APIResult delete(@PathVariable("id") String id);
 }

+ 107 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/Order/OrderService.java

@@ -0,0 +1,107 @@
+package cn.rankin.cmsweb.service.trade.Order;
+
+import cn.rankin.cmsweb.code.CmsWebAPICode;
+import cn.rankin.cmsweb.service.product.GoodsService;
+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.GoodsVo;
+import cn.rankin.data.api.trade.dto.UserOrderDTO;
+import cn.rankin.data.api.trade.dto.OrderGoodsDTO;
+import cn.rankin.data.api.trade.entity.OrderGoods;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.data.api.trade.vo.UserOrderVo;
+import cn.rankin.data.api.user.vo.TerminalUserVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class OrderService {
+
+    @Autowired
+    private OrderServiceFeign orderServiceFeign;
+
+    @Autowired
+    private GoodsService goodsService;
+
+    @Autowired
+    private TerminalUserService terminalUserService;
+
+    public APIResult<UserOrderVo> create(UserOrderDTO userOrderDTO) {
+        String uid = userOrderDTO.getUid();
+        APIResult<TerminalUserVo> userVoAPIResult = terminalUserService.getUser(uid);
+        if (!userVoAPIResult.getSuccess()) {
+            return APIResult.error(CmsWebAPICode.error("用户不存在"));
+        }
+
+        TerminalUserVo terminalUserVo = userVoAPIResult.getData();
+
+        List<OrderGoodsDTO> orderGoodsDTOList = userOrderDTO.getGoods();
+        if (CollectionUtils.isEmpty(orderGoodsDTOList)) {
+            return APIResult.error(CmsWebAPICode.error("商品为空"));
+        }
+
+        List<String> goodsIdList = new ArrayList<>();
+        Map<String, Integer> goodsCountMap = new HashMap<>();
+        orderGoodsDTOList.forEach(goods -> {
+            String goodsId = goods.getGoodsId();
+            goodsIdList.add(goodsId);
+            goodsCountMap.put(goodsId, goods.getQuantity());
+        });
+
+        APIResult<List<GoodsVo>> goodsVoAPIResult = goodsService.findByIds(goodsIdList);
+        if (!goodsVoAPIResult.getSuccess()) {
+            return APIResult.error(CmsWebAPICode.error("查询商品错误"));
+        }
+
+        List<GoodsVo> goodsVoList = goodsVoAPIResult.getData();
+        if (goodsVoList.size() != orderGoodsDTOList.size()) {
+            return APIResult.error(CmsWebAPICode.error("包含不可售卖的商品"));
+        }
+
+        BigDecimal totalPrice = BigDecimal.ZERO;
+        List<OrderGoodsDTO> finalGoodsList = new ArrayList<>();
+        for (GoodsVo goodsVo : goodsVoList) {
+            String goodsMerchantId = goodsVo.getMerchantId();
+            if (!terminalUserVo.getMerchantId().equals(goodsMerchantId)) {
+                return APIResult.error(CmsWebAPICode.error("不可以购买其他渠道商品"));
+            }
+            String goodsId = goodsVo.getId();
+            OrderGoodsDTO orderGoodsDTO = new OrderGoodsDTO();
+            orderGoodsDTO.setGoodsId(goodsId);
+            orderGoodsDTO.setPid(goodsVo.getPid());
+            orderGoodsDTO.setType(goodsVo.getType());
+            orderGoodsDTO.setQuantity(goodsCountMap.get(goodsId));
+            finalGoodsList.add(orderGoodsDTO);
+            totalPrice = totalPrice.add(goodsVo.getMerchantPrice());
+        }
+        userOrderDTO.setFinalPrice(totalPrice.subtract(userOrderDTO.getAdjustPrice()));
+        userOrderDTO.setOriginPrice(totalPrice);
+        userOrderDTO.setGoods(finalGoodsList);
+
+        APIResult userOrderAPIResult = orderServiceFeign.create(userOrderDTO);
+        return userOrderAPIResult;
+    }
+
+    public APIResult<UserOrderVo> getOrder(String orderId) {
+        APIResult<UserOrder> userOrderVoAPIResult = orderServiceFeign.getOrder(orderId);
+        if (!userOrderVoAPIResult.getSuccess()) {
+            return APIResult.error(new BaseCode(userOrderVoAPIResult.getCode(), userOrderVoAPIResult.getMessage()));
+        }
+
+        UserOrder userOrder = userOrderVoAPIResult.getData();
+        List<OrderGoods> orderGoodsList = userOrder.getGoods();
+        if (CollectionUtils.isEmpty(orderGoodsList)) {
+            return APIResult.ok();
+        }
+        return null;
+
+    }
+}

+ 20 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/Order/OrderServiceFeign.java

@@ -0,0 +1,20 @@
+package cn.rankin.cmsweb.service.trade.Order;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.trade.dto.UserOrderDTO;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@FeignClient(name = "${service.trade.name}")
+public interface OrderServiceFeign {
+
+    @RequestMapping(value = "/order", method = RequestMethod.POST)
+    APIResult<UserOrder> create(@RequestBody UserOrderDTO userOrderDTO);
+
+    @RequestMapping(value = "/order/{orderId}", method = RequestMethod.GET)
+    APIResult<UserOrder> getOrder(@PathVariable("orderId") String orderId);
+}

+ 117 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/user/utils/MerchantServiceUtil.java

@@ -0,0 +1,117 @@
+package cn.rankin.cmsweb.service.user.utils;
+
+import cn.rankin.cmsweb.service.user.MerchantService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.data.api.user.vo.MerchantVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class MerchantServiceUtil<V> {
+
+    @Autowired
+    private MerchantService merchantService;
+
+    public Map<String, MerchantVo> findByIds(List<String> idList) {
+        if (CollectionUtils.isEmpty(idList)) {
+            log.error("merchant idList is empty!");
+            return new HashMap<>();
+        }
+
+        APIResult<Map<String, MerchantVo>> merchantAPIResult = merchantService.findByIds(idList);
+        if (!merchantAPIResult.getSuccess()) {
+            log.error("api error: {}", merchantAPIResult.getMessage());
+            return new HashMap<>();
+        }
+
+        return merchantAPIResult.getData();
+    }
+
+    public MerchantVo findById(String merchantId) {
+        APIResult<MerchantVo> merchantVoAPIResult = merchantService.getMerchant(merchantId);
+        if (!merchantVoAPIResult.getSuccess()) {
+            log.error("api error: {}", merchantVoAPIResult.getMessage());
+            return null;
+        }
+        return merchantVoAPIResult.getData();
+    }
+
+    public void setMerchantInfo(APIResult<V> apiResult) {
+        if (!apiResult.getSuccess()) {
+            log.error("api error: {}", apiResult.getMessage());
+            return;
+        }
+        V v = apiResult.getData();
+        try {
+            Class clazz = v.getClass();
+            Field idField = clazz.getDeclaredField("merchantId");
+            idField.setAccessible(true);
+            String merchantId = (String) idField.get(v);
+            idField.setAccessible(false);
+
+            Field nameField = clazz.getDeclaredField("merchantName");
+            nameField.setAccessible(true);
+            MerchantVo merchantVo = findById(merchantId);
+            nameField.set(v, merchantVo.getName());
+            nameField.setAccessible(false);
+
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    public void setPageMerchantInfo(APIResult<Page<V>> pageAPIResult) {
+        if (!pageAPIResult.getSuccess()) {
+            log.error("api page error, {}", pageAPIResult.getMessage());
+            return;
+        }
+        List<V> list = pageAPIResult.getData().getList();
+        if (CollectionUtils.isEmpty(list)) return;
+
+        List<String> merchantIdList = new ArrayList<>();
+        for (V v : list) {
+            try {
+                Class clazz = v.getClass();
+                Field idField = clazz.getDeclaredField("merchantId");
+                idField.setAccessible(true);
+                String merchantId = (String) idField.get(v);
+                idField.setAccessible(false);
+                merchantIdList.add(merchantId);
+            } catch (Exception e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+
+        Map<String, MerchantVo> merchantVoMap = findByIds(merchantIdList);
+        for (V v : list) {
+            try {
+                Class clazz = v.getClass();
+                Field idField = clazz.getDeclaredField("merchantId");
+                idField.setAccessible(true);
+                String merchantId = (String) idField.get(v);
+                idField.setAccessible(false);
+
+                MerchantVo merchantVo = merchantVoMap.get(merchantId);
+                Field nameField = clazz.getDeclaredField("merchantName");
+                nameField.setAccessible(true);
+                nameField.set(v, merchantVo.getName());
+                nameField.setAccessible(false);
+            } catch (Exception e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 15 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/utils/DTOConverter.java

@@ -0,0 +1,15 @@
+package cn.rankin.cmsweb.utils;
+
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.data.api.trade.vo.UserOrderVo;
+import org.springframework.beans.BeanUtils;
+
+public class DTOConverter {
+
+    public static UserOrderVo convert(UserOrder userOrder) {
+        UserOrderVo userOrderVo = new UserOrderVo();
+        BeanUtils.copyProperties(userOrder, userOrderVo);
+        return userOrderVo;
+    }
+
+}

+ 0 - 4
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/search/GroupSearchDTO.java

@@ -1,7 +1,5 @@
 package cn.rankin.common.utils.dto.search;
 
-import cn.rankin.common.utils.enums.BaseStatusEnum;
-import cn.rankin.common.utils.enums.WareTypeEnum;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -15,8 +13,6 @@ public class GroupSearchDTO implements Serializable{
 
     private String merchantId;
 
-    private BaseStatusEnum status;
-
     private String sort;
 
     private Integer by;

+ 0 - 4
rankin-common-utils/src/main/java/cn/rankin/common/utils/dto/search/TagSearchDTO.java

@@ -17,10 +17,6 @@ public class TagSearchDTO implements Serializable {
 
     private String merchantId;
 
-    private TagTypeEnum type;
-
-    private BaseStatusEnum status;
-
     private String sort;
 
     private Integer by;

+ 21 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/enums/OrderStatusEnum.java

@@ -0,0 +1,21 @@
+package cn.rankin.common.utils.enums;
+
+public enum OrderStatusEnum {
+
+    UNPAID("待支付"), PAYOK("已支付"), CANCEL("取消"), REFUND("退款");
+
+    String name;
+
+    OrderStatusEnum(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return this.name;
+    }
+}

+ 1 - 1
rankin-data-api/src/main/java/cn/rankin/data/api/product/dto/PackageProductDTO.java

@@ -10,7 +10,7 @@ import java.math.BigDecimal;
 @ToString
 public class PackageProductDTO implements Serializable {
 
-    private String productId;
+    private String pid;
 
     private BigDecimal cpPrice;
 }

+ 2 - 3
rankin-data-api/src/main/java/cn/rankin/data/api/product/dto/TagDTO.java

@@ -1,7 +1,6 @@
 package cn.rankin.data.api.product.dto;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
-import cn.rankin.common.utils.enums.TagTypeEnum;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -16,11 +15,11 @@ public class TagDTO implements Serializable {
 
     private String name;
 
-    private TagTypeEnum type;
+    private String merchantId;
 
     private Integer sort;
 
-    private List<String> itemList;
+    private List<String> productList;
 
     private BaseStatusEnum status;
 }

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/MerchantProduct.java

@@ -36,6 +36,8 @@ public class MerchantProduct implements Serializable {
     @Column(name = "merchant_id", nullable = false)
     private String merchantId;
 
+    private Integer sort;
+
     @Enumerated(EnumType.ORDINAL)
     private BaseStatusEnum status;
 

+ 1 - 20
rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/Tag.java

@@ -35,10 +35,6 @@ public class Tag implements Serializable {
 
     @Column
     @Enumerated(EnumType.ORDINAL)
-    private TagTypeEnum type;
-
-    @Column
-    @Enumerated(EnumType.ORDINAL)
     private BaseStatusEnum status;
 
     @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
@@ -56,21 +52,6 @@ public class Tag implements Serializable {
     private String groupName;
 
     @Transient
-    private List itemList;
-
-    public Tag() {}
+    private List<MerchantProduct> products;
 
-    public Tag(String id, String name, TagTypeEnum type, String groupId, Integer sort, BaseStatusEnum status,
-               Date gmtCreated, Date gmtModified, String groupName, String merchantId) {
-        this.id = id;
-        this.name = name;
-        this.type = type;
-        this.groupId = groupId;
-        this.sort = sort;
-        this.status = status;
-        this.gmtCreated = gmtCreated;
-        this.gmtModified = gmtModified;
-        this.merchantId = merchantId;
-        this.groupName = groupName;
-    }
 }

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

@@ -38,9 +38,6 @@ public class TagGroup implements Serializable {
     @Enumerated(EnumType.ORDINAL)
     private BaseStatusEnum status;
 
-    @Transient
-    private List<Tag> tagList;
-
     @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtCreated;
@@ -48,4 +45,7 @@ public class TagGroup 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 List<Tag> tagList;
 }

+ 41 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/product/vo/GoodsVo.java

@@ -0,0 +1,41 @@
+package cn.rankin.data.api.product.vo;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.ProductTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ToString
+public class GoodsVo implements Serializable {
+
+    private String id;
+
+    private String pid;
+
+    private ProductTypeEnum type;
+
+    private String merchantId;
+
+    private Integer duration;
+
+    private String chargeUnit;
+
+    private BigDecimal cpPrice;
+
+    private BigDecimal merchantPrice;
+
+    private BigDecimal terminalPrice;
+
+    private Integer sort;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+}

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/product/vo/GroupVo.java

@@ -18,6 +18,8 @@ public class GroupVo {
 
     private String merchantId;
 
+    private String merchantName;
+
     private Integer sort;
 
     private BaseStatusEnum status;

+ 31 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/product/vo/PackageVo.java

@@ -0,0 +1,31 @@
+package cn.rankin.data.api.product.vo;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ToString
+public class PackageVo implements Serializable {
+
+    private String id;
+
+    private String code;
+
+    private String name;
+
+    private Integer sort;
+
+    private BaseStatusEnum status;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private List<PackageProductVo> products;
+
+}

+ 20 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderGoodsDTO.java

@@ -0,0 +1,20 @@
+package cn.rankin.data.api.trade.dto;
+
+import cn.rankin.common.utils.enums.ProductTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class OrderGoodsDTO implements Serializable {
+
+    private String goodsId;
+
+    private String pid;
+
+    private ProductTypeEnum type;
+
+    private Integer quantity;
+}

+ 30 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/UserOrderDTO.java

@@ -0,0 +1,30 @@
+package cn.rankin.data.api.trade.dto;
+
+import cn.rankin.common.utils.enums.OrderStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ToString
+public class UserOrderDTO implements Serializable {
+
+    private String id;
+
+    private String uid;
+
+    private BigDecimal originPrice;
+
+    private BigDecimal finalPrice;
+
+    private BigDecimal adjustPrice;
+
+    private OrderStatusEnum status;
+
+    private String note;
+
+    private List<OrderGoodsDTO> goods;
+}

+ 40 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/OrderGoods.java

@@ -0,0 +1,40 @@
+package cn.rankin.data.api.trade.entity;
+
+import cn.rankin.common.utils.enums.ProductTypeEnum;
+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 = "order_goods")
+@DynamicInsert
+@DynamicUpdate
+public class OrderGoods implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "order_id")
+    private String orderId;
+
+    private String pid;
+
+    @Column(name = "goods_id")
+    private String goodsId;
+
+    private Integer quantity;
+
+    @Enumerated(EnumType.ORDINAL)
+    private ProductTypeEnum type;
+
+    @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtCreated;
+}

+ 119 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/ProductSoldSnapshot.java

@@ -0,0 +1,119 @@
+package cn.rankin.data.api.trade.entity;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.ProductTypeEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/*
+| field | type | null | default | desc | extra |
+|----|:-----|:-------|:------|:-----|:-----|
+| id | varchar(512) | no | | 主键 | pri |
+| uid | varchar(512) | no | | 下单终端用户id |  |
+| userCode | varchar(512) | no | | 下单终端用户学号 |  |
+| userName | varchar(512) | no | | 下单终端用户名称 |  |
+| campusId | varchar(512) | no | | 下单终端学校 |  |
+| campusCode | varchar(512) | no | | 下单终端学校编号 |  |
+| campusName | varchar(512) | no | | 下单终端学校名称 |  |
+| order_id | varchar(512) | no | | 订单id |  |
+| goods_id | varchar(512) | no | | 订单id |  |
+| pkg_id | varchar | no | '' | 课程包id, 不为空则表示以package方式购买 |  |
+| pid | varchar(512) | no | | 商品id |  |
+| product_type | smallint | no | | 商品类型,{课程包,配套, 课程} |  |
+| product_code | varchar(512) | no | | 商品code |  |
+| product_name | varchar(512) | no | | 商品名称 |  |
+| merchant_id | varchar(512) | no | | 渠道id |  |
+| duration | int | no | | 时长 |  |
+| cp_id | varchar(512) | yes | | cp id |  |
+| cp_price | double(16,2) | no | 0 | 此订单成交时,内容提供商可获得价格, 当pkg_id不为空时,值为cpPriceInPackage | |
+| merchant_price | double(16,2) | no | 0 | 给渠道价格, 当pkg_id不为空时,值为0 | |
+| terminal_price | double(16,2) | no | 0 | 终端显示价格, 当pkg_id不为空时,值为0 | |
+| charge_unit | varchar(512) | no | 0 | 计价单位 | |
+| quantity | int | no | 0 | 购买的数量 | |
+| gmt_created | timestamp | no | | 快照创建时间 | |
+ */
+@Data
+@ToString
+public class ProductSoldSnapshot implements Serializable {
+
+    @Id
+    private String id;
+
+    private String uid;
+
+    @Column(name = "user_code")
+    private String userCode;
+
+    @Column(name = "user_name")
+    private String userName;
+
+    @Column(name = "campus_id")
+    private String campusId;
+
+    @Column(name = "campus_code")
+    private String campusCode;
+
+    @Column(name = "campus_name")
+    private String campusName;
+
+    @Column(name = "order_id")
+    private String orderId;
+
+    @Column(name = "goods_id")
+    private String goodsId;
+
+    @Column(name = "pkg_id")
+    private String pkgId;
+
+    private String pid;
+
+    @Column(name = "product_type")
+    @Enumerated(EnumType.ORDINAL)
+    private ProductTypeEnum productType;
+
+    @Column(name = "product_code")
+    private String productCode;
+
+    @Column(name = "product_name")
+    private String productName;
+
+    @Column(name = "merchant_id")
+    private String merchantId;
+
+    @Column(name = "merchant_name")
+    private String merchantName;
+
+    private Integer duration;
+
+    @Column(name = "cp_id")
+    private String cpId;
+
+    @Column(name = "cp_name")
+    private String cpName;
+
+    @Column(name = "cp_price")
+    private BigDecimal cpPrice;
+
+    @Column(name = "merchant_price")
+    private BigDecimal merchantPrice;
+
+    @Column(name = "terminal_price")
+    private BigDecimal terminalPrice;
+
+    @Column(name = "charge_unit")
+    private String chargeUnit;
+
+    private Integer quantity;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
+    private Date gmtCreated;
+}

+ 53 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/UserOrder.java

@@ -0,0 +1,53 @@
+package cn.rankin.data.api.trade.entity;
+
+import cn.rankin.common.utils.enums.OrderStatusEnum;
+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.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ToString
+@Entity
+@Table(name = "user_order")
+@DynamicInsert
+@DynamicUpdate
+public class UserOrder implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(updatable = false)
+    private String uid;
+
+    @Column(name = "origin_price")
+    private BigDecimal originPrice;
+
+    @Column(name = "final_price")
+    private BigDecimal finalPrice;
+
+    @Column(name = "adjust_price")
+    private BigDecimal adjustPrice;
+
+    @Enumerated(EnumType.ORDINAL)
+    private OrderStatusEnum status;
+
+    private String note;
+
+    @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;
+
+    @Transient
+    private List<OrderGoods> goods;
+}

+ 41 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/UserOrderVo.java

@@ -0,0 +1,41 @@
+package cn.rankin.data.api.trade.vo;
+
+import cn.rankin.common.utils.enums.OrderStatusEnum;
+import cn.rankin.data.api.product.vo.GoodsVo;
+import lombok.Data;
+import lombok.ToString;
+import org.springframework.aop.target.LazyInitTargetSource;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ToString
+public class UserOrderVo implements Serializable {
+
+    private String id;
+
+    private String uid;
+
+    private String merchantId;
+
+    private String merchantName;
+
+    private BigDecimal originPrice;
+
+    private BigDecimal finalPrice;
+
+    private BigDecimal adjustPrice;
+
+    private OrderStatusEnum status;
+
+    private String note;
+
+    private Date gmtCreated;
+
+    private Date gmtModified;
+
+    private List<GoodsVo> goods;
+}

+ 0 - 2
rankin-data-api/src/main/java/cn/rankin/data/api/user/dto/MerchantDTO.java

@@ -34,6 +34,4 @@ public class MerchantDTO implements Serializable{
 
     @NotNull
     private BaseStatusEnum status;
-
-    private List<String> recommendIdList;
 }

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

@@ -2,7 +2,6 @@ package cn.rankin.data.api.user.vo;
 
 import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.enums.ReceiptTypeEnum;
-import cn.rankin.data.api.product.vo.RecommendVo;
 import lombok.Data;
 import lombok.ToString;
 
@@ -44,5 +43,4 @@ public class MerchantVo implements Serializable {
 
     private List<CmsUserVo> adminList;
 
-    private List<RecommendVo> recommendVoList;
 }

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

@@ -31,7 +31,7 @@ public class TerminalUserVo implements Serializable {
 
     private String merchantId;
 
-    private String remoteUid;
+    private String uid;
 
     private String merchantName;
 

+ 7 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/controller/GoodsController.java

@@ -7,6 +7,8 @@ import cn.rankin.productservice.service.GoodsService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 @RestController
 @RequestMapping(value = "/goods")
 public class GoodsController {
@@ -33,4 +35,9 @@ public class GoodsController {
     public APIResult<Boolean> delete(@PathVariable("goodsId") String goodsId) {
         return goodsService.delete(goodsId);
     }
+
+    @RequestMapping(value = "/ids", method = RequestMethod.GET)
+    public APIResult<List<Goods>> findByIds(@RequestParam("id") List<String> goodsIdList) {
+        return goodsService.findByIds(goodsIdList);
+    }
 }

+ 0 - 130
rankin-product-service/src/main/java/cn/rankin/productservice/controller/GroupController.java

@@ -1,130 +0,0 @@
-package cn.rankin.productservice.controller;
-
-import cn.rankin.common.utils.api.model.BaseCode;
-import cn.rankin.common.utils.api.model.APIResult;
-import cn.rankin.common.utils.api.page.Page;
-import cn.rankin.data.api.product.dto.GroupDTO;
-import cn.rankin.data.api.product.dto.TagDTO;
-import cn.rankin.common.utils.dto.search.GroupSearchDTO;
-import cn.rankin.common.utils.enums.BaseOrderEnum;
-import cn.rankin.data.api.product.entity.TagGroup;
-import cn.rankin.data.api.product.entity.Tag;
-import cn.rankin.productservice.service.TagGroupService;
-import cn.rankin.productservice.service.TagService;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-@RestController
-@RequestMapping(value = "group")
-public class GroupController {
-
-    @Autowired
-    private TagGroupService tagGroupService;
-
-    @Autowired
-    private TagService tagService;
-
-    @RequestMapping(value = "/list", method = RequestMethod.GET)
-    public APIResult<Page<TagGroup>> search(GroupSearchDTO searchDTO) {
-        TagGroup tagGroup = new TagGroup();
-
-        String code = searchDTO.getCode();
-        if (!StringUtils.isEmpty(code)) {
-            tagGroup.setCode("%" + code + "%");
-        }
-
-        String name = searchDTO.getName();
-        if (!StringUtils.isEmpty(name)) {
-            tagGroup.setName("%" + name + "%");
-        }
-
-        // others
-        tagGroup.setStatus(searchDTO.getStatus());
-        tagGroup.setMerchantId(searchDTO.getMerchantId());
-
-        // sort
-        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap<>();
-        sort.put("gmtModified", BaseOrderEnum.DESC);
-
-        return tagGroupService.search(tagGroup, searchDTO.getPageNo(), searchDTO.getPageSize(), sort);
-    }
-
-    @Transactional
-    @RequestMapping(method = RequestMethod.POST)
-    public APIResult<TagGroup> create(@Valid @RequestBody GroupDTO groupDTO) {
-
-        APIResult<TagGroup> result = tagGroupService.create(groupDTO);
-        if (!result.getSuccess()) {
-            return result;
-        }
-
-        TagGroup tagGroup = result.getData();
-
-        List<TagDTO> tagDTOList = groupDTO.getTagList();
-        if (!CollectionUtils.isEmpty(tagDTOList)) {
-            APIResult<List<Tag>> tagResult = tagService.updateGroupRelation(tagGroup.getId(), tagDTOList);
-            tagGroup.setTagList(tagResult.getData());
-        }
-
-        return result;
-    }
-
-    @Transactional
-    @RequestMapping(method = RequestMethod.PUT)
-    public APIResult<TagGroup> update(@Valid @RequestBody GroupDTO groupDTO) {
-        APIResult<TagGroup> result = tagGroupService.update(groupDTO);
-        if (!result.getSuccess()) {
-            return result;
-        }
-
-        TagGroup tagGroup = result.getData();
-
-        List<TagDTO> tagDTOList = groupDTO.getTagList();
-        if (tagDTOList != null) {
-            APIResult<List<Tag>> tagResult = tagService.updateGroupRelation(tagGroup.getId(), tagDTOList);
-            if (!tagResult.getSuccess()) {
-                return APIResult.error(new BaseCode(tagResult.getCode(), tagResult.getMessage()));
-            }
-            tagGroup.setTagList(tagResult.getData());
-        }
-
-        return result;
-    }
-
-    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
-    public APIResult<Boolean> delete(@PathVariable("id") String id) {
-        APIResult<Boolean> groupResult = tagGroupService.delete(id);
-        if (!groupResult.getSuccess()) {
-            return groupResult;
-        }
-
-        // 同时删除下属所有tag
-        return tagService.deleteByGroupId(id);
-    }
-
-    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public APIResult<TagGroup> getGroup(@PathVariable("id") String id) {
-        APIResult<TagGroup> result = tagGroupService.findNormalById(id);
-        TagGroup tagGroup = result.getData();
-        if (!result.getSuccess() || tagGroup == null) {
-            return result;
-        }
-
-        APIResult<List<Tag>> tagResult = tagService.findNormalByGroupId(id);
-        if (!tagResult.getSuccess()) {
-            return APIResult.error(new BaseCode(tagResult.getCode(), tagResult.getMessage()));
-        }
-
-        tagGroup.setTagList(tagResult.getData());
-        return result;
-
-    }
-
-}

+ 2 - 2
rankin-product-service/src/main/java/cn/rankin/productservice/controller/MerchantProductController.java

@@ -17,7 +17,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 
 @RestController
-@RequestMapping(value = "/merchant/products")
+@RequestMapping(value = "/merchant/product")
 public class MerchantProductController {
 
     @Autowired
@@ -49,7 +49,7 @@ public class MerchantProductController {
     }
 
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
-    public APIResult<MerchantProduct> getProduct(@RequestParam("productId") String productId, @RequestParam("merchantId") String merchantId) {
+    public APIResult<MerchantProduct> getProduct(@RequestParam("pid") String productId, @RequestParam("merchantId") String merchantId) {
         return merchantProductService.getProduct(productId, merchantId);
     }
 

+ 19 - 122
rankin-product-service/src/main/java/cn/rankin/productservice/controller/TagController.java

@@ -1,11 +1,18 @@
 package cn.rankin.productservice.controller;
 
-import cn.rankin.productservice.service.MerchantProductTagRelationService;
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.dto.search.TagSearchDTO;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.data.api.product.dto.TagDTO;
+import cn.rankin.data.api.product.entity.Tag;
 import cn.rankin.productservice.service.TagService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.LinkedHashMap;
+
 @Slf4j
 @RestController
 @RequestMapping(value = "tag")
@@ -14,25 +21,9 @@ public class TagController {
     @Autowired
     private TagService tagService;
 
-    @Autowired
-    private MerchantProductTagRelationService tagRelationService;
-/*
-    @Autowired
-    private ItemService itemService;
-
-    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public APIResult<Tag> getTag(@PathVariable("id") String id) {
-        APIResult<Tag> result = tagService.findById(id);
-        Tag tag = result.getData();
-        if (tag == null) {
-            return result;
-        }
-
-        APIResult<List<Item>> itemResult = getTagItem(tag.getId());
-        tag.setItemList(itemResult.getData());
-
-        return result;
-
+    @RequestMapping(value = "/{tagId}", method = RequestMethod.GET)
+    public APIResult<Tag> getTag(@PathVariable("tagId") String tagId) {
+        return tagService.getTag(tagId);
     }
 
     @RequestMapping(value = "/list", method = RequestMethod.GET)
@@ -43,120 +34,26 @@ public class TagController {
         if (name != null) {
             tag.setName("%" + name + "%");
         }
-
         tag.setMerchantId(searchDTO.getMerchantId());
-        tag.setType(searchDTO.getType());
-
-        return tagService.search(tag, searchDTO.getPageNo(), searchDTO.getPageSize());
+        // sort
+        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap<>();
+        sort.put("gmtModified", BaseOrderEnum.DESC);
+        return tagService.search(tag, searchDTO.getPageNo(), searchDTO.getPageSize(), sort);
     }
 
-    @Transactional
     @RequestMapping(method = RequestMethod.POST)
     public APIResult<Tag> create(@RequestBody TagDTO tagDTO) {
-
-        APIResult<Tag> result = tagService.create(tagDTO);
-        Tag tag = result.getData();
-
-        List<String> itemIdList = tagDTO.getItemList();
-        if (itemIdList == null || tag == null) {
-            return result;
-        }
-
-        APIResult<List<Item>> relationResult = updateTagRelation(tag, itemIdList);
-        if (!relationResult.getSuccess()) {
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return APIResult.error(new BaseCode(relationResult.getCode(), relationResult.getMessage()));
-        }
-        tag.setItemList(relationResult.getData());
-
-        return result;
-
+        return tagService.create(tagDTO);
     }
 
-    @Transactional
     @RequestMapping(method = RequestMethod.PUT)
     public APIResult<Tag> update(@RequestBody TagDTO tagDTO) {
-        if (tagDTO.getId() == null) {
-            return APIResult.error(APICode.PARAMETER_ERROR);
-        }
-
-        APIResult<Tag> result = tagService.update(tagDTO);
-        Tag tag = result.getData();
-
-        List<String> itemIdList = tagDTO.getItemList();
-        if (itemIdList == null || tag == null) {
-            return result;
-        }
-
-        APIResult<List<Item>> relationResult = updateTagRelation(tag, itemIdList);
-        if (!relationResult.getSuccess()) {
-            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return APIResult.error(new BaseCode(relationResult.getCode(), relationResult.getMessage()));
-        }
-        tag.setItemList(relationResult.getData());
-
         return tagService.update(tagDTO);
     }
 
-    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
-    public APIResult delete(@PathVariable("id") String id) {
-        if (StringUtils.isEmpty(id)) {
-            return APIResult.error(APICode.PARAMETER_ERROR);
-        }
-
-        List<ProductTagRelation> relationList = tagRelationService.findAllByTagId(id);
-        if (CollectionUtils.isEmpty(relationList)) {
-            return tagService.delete(id);
-        }
-
-        List<String> itemIdList = new ArrayList<>();
-        relationList.forEach( relation -> {
-            String itemId = relation.getItemId();
-            if (itemId != null && !itemIdList.contains(itemId)) {
-                itemIdList.add(itemId);
-            }
-        });
-
-        List<Item> itemList = itemService.findAllByIds(itemIdList).getData();
-
-        APIResult<List<Item>> result = APIResult.error(APICode.CAN_NOT_DEL);
-        result.setData(itemList);
-
-        return result;
+    @RequestMapping(value = "/{tagId}", method = RequestMethod.DELETE)
+    public APIResult delete(@PathVariable("tagId") String tagId) {
+        return tagService.delete(tagId);
     }
 
-    @Transactional
-    public APIResult<List<Item>> updateTagRelation(Tag tag, List<String> itemIdList) {
-        List<Item> itemList = itemService.findAllByIds(itemIdList).getData();
-        if (itemList == null || itemList.size() != itemIdList.size()) {
-            return APIResult.error(APICode.error("itemId不匹配"));
-        }
-
-        TagTypeEnum tagType = tag.getType();
-        String merchantId = tag.getMerchantId();
-        for (int i = 0; i < itemList.size(); i++) {
-            Item item = itemList.get(i);
-            if (!item.getMerchantId().equals(merchantId) || !EnumUtil.compare(item.getType(), tagType)) {
-                return APIResult.error(APICode.error("类型或渠道商不匹配"));
-            }
-        }
-
-        tagRelationService.updateByTag(tag.getId(), itemIdList);
-        return APIResult.ok(itemList);
-    }
-
-    public APIResult<List<Item>> getTagItem(String tagId) {
-        List<ProductTagRelation> relationList = tagRelationService.findByTagId(tagId);
-        if (relationList == null || relationList.size() == 0) {
-            return APIResult.ok();
-        }
-
-        List<String> itemIdList = new ArrayList<>();
-        relationList.forEach( relation -> itemIdList.add(relation.getItemId()));
-
-        // 返回上架的item
-        return itemService.findAllByIds(itemIdList, ItemStatusEnum.DEL);
-
-    }
-    */
 }

+ 69 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/controller/TagGroupController.java

@@ -0,0 +1,69 @@
+package cn.rankin.productservice.controller;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.data.api.product.dto.GroupDTO;
+import cn.rankin.common.utils.dto.search.GroupSearchDTO;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.data.api.product.entity.TagGroup;
+import cn.rankin.productservice.service.TagGroupService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.LinkedHashMap;
+
+@RestController
+@RequestMapping(value = "group")
+public class TagGroupController {
+
+    @Autowired
+    private TagGroupService tagGroupService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    public APIResult<Page<TagGroup>> search(GroupSearchDTO searchDTO) {
+        TagGroup tagGroup = new TagGroup();
+
+        String code = searchDTO.getCode();
+        if (!StringUtils.isEmpty(code)) {
+            tagGroup.setCode("%" + code + "%");
+        }
+
+        String name = searchDTO.getName();
+        if (!StringUtils.isEmpty(name)) {
+            tagGroup.setName("%" + name + "%");
+        }
+
+        // others
+        tagGroup.setMerchantId(searchDTO.getMerchantId());
+
+        // sort
+        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap<>();
+        sort.put("gmtModified", BaseOrderEnum.DESC);
+
+        return tagGroupService.search(tagGroup, searchDTO.getPageNo(), searchDTO.getPageSize(), sort);
+    }
+
+    @Transactional
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<TagGroup> create(@Valid @RequestBody GroupDTO groupDTO) {
+        return tagGroupService.create(groupDTO);
+    }
+
+    @RequestMapping(method = RequestMethod.PUT)
+    public APIResult<TagGroup> update(@Valid @RequestBody GroupDTO groupDTO) {
+        return tagGroupService.update(groupDTO);
+    }
+
+    @RequestMapping(value = "/{groupId}", method = RequestMethod.DELETE)
+    public APIResult<Boolean> delete(@PathVariable("groupId") String groupId) {
+        return tagGroupService.delete(groupId);
+    }
+
+    @RequestMapping(value = "/{groupId}", method = RequestMethod.GET)
+    public APIResult<TagGroup> getGroup(@PathVariable("groupId") String groupId) {
+        return tagGroupService.getTagGroup(groupId);
+    }
+}

+ 4 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/repository/GoodsRepository.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.Goods;
 import org.springframework.data.jpa.repository.Modifying;
@@ -15,6 +16,9 @@ public interface GoodsRepository extends BasicJpaRepository<Goods, String> {
     @Query(value = "select g from Goods g where g.pid = ?1 and g.merchantId = ?2 and g.status = 0 order by g.sort")
     List<Goods> findByPidAndMerchantId(String pid, String merchantId);
 
+    @Query(value = "select g from Goods g where g.id in (?1) and g.status = ?2")
+    List<Goods> findByIds(List<String> goodIds, BaseStatusEnum status);
+
     @Modifying(clearAutomatically = true)
     @Query(value = "update Goods g set g.status = 1 where g.id = ?1")
     Integer deleteById(String id);

+ 2 - 6
rankin-product-service/src/main/java/cn/rankin/productservice/repository/MerchantProductRepository.java

@@ -1,6 +1,5 @@
 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;
@@ -14,15 +13,12 @@ public interface MerchantProductRepository extends BasicJpaRepository<MerchantPr
     @Query(value = "select m from MerchantProduct m where m.pid in (:pids) and m.status = 0")
     List<MerchantProduct> findByPidIn(@Param("pids") List<String> pids);
 
-    List<MerchantProduct> findByPid(String pid);
+    @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);
 
     MerchantProduct findByPidAndMerchantId(String pid, String merchantId);
 
     @Modifying(clearAutomatically = true)
     @Query(value = "update MerchantProduct m set m.status = 1 where m.pid = ?1")
     Integer deleteByPid(String pid);
-
-    @Modifying(clearAutomatically = true)
-    @Query(value = "update MerchantProduct m set m.status = ?2 where m.id = ?1")
-    Integer updateStatusById(String Id, BaseStatusEnum status);
 }

+ 4 - 6
rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagGroupRepository.java

@@ -1,6 +1,5 @@
 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.TagGroup;
 import org.springframework.data.jpa.repository.Modifying;
@@ -8,15 +7,14 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 public interface TagGroupRepository extends BasicJpaRepository<TagGroup, String> {
 
     Long countByCode(String code);
 
-    @Query(value = "select g from TagGroup g where g.id = :id and g.status = :status")
-    TagGroup findNormalById(@Param("id") String id, @Param("status") BaseStatusEnum status);
-
     @Transactional
     @Modifying(clearAutomatically = true)
-    @Query(value = "update TagGroup g set g.status = :status where g.id = :id")
-    Integer deleteById(@Param("id") String id, @Param("status")BaseStatusEnum status);
+    @Query(value = "update TagGroup g set g.status = 1 where g.id = :id")
+    Integer deleteById(@Param("id") String id);
 }

+ 5 - 19
rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagRepository.java

@@ -5,31 +5,17 @@ import cn.rankin.common.utils.jpa.BasicJpaRepository;
 import cn.rankin.data.api.product.entity.Tag;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
-
 public interface TagRepository extends BasicJpaRepository<Tag, String> {
 
-    String SQL = "select new Tag(t.id, t.name, t.type, t.groupId, t.sort, t.status, t.gmtCreated, t.gmtModified, g.name, g.merchantId) from Tag t, TagGroup g where t.groupId = g.id";
-
-    List<Tag> search(Tag tag, Integer start, Integer size);
-
-    @Query(value = SQL + " and t.groupId = :groupId and t.status = :status")
-    List<Tag> findNormalByGroupId(@Param("groupId") String groupId, @Param("status") BaseStatusEnum status);
+    List<Tag> findByGroupId(String groupId);
 
-    @Query(value = SQL + " and t.id in (:ids) and t.status = :status order by t.sort asc")
-    List<Tag> findByIds(@Param("ids") List<String> ids, @Param("status") BaseStatusEnum status);
-
-    @Transactional
-    @Modifying(clearAutomatically = true)
-    @Query(value = "update Tag t set t.status = :status where t.id = :id")
-    Integer updateStatusById(@Param("id") String id, @Param("status") BaseStatusEnum status);
+    @Query(value = "select t from Tag t where t.id in (?1) and t.status = ?2")
+    List<Tag> findByIds(List<String> tagIdList, BaseStatusEnum status);
 
-    @Transactional
     @Modifying(clearAutomatically = true)
-    @Query(value = "update Tag t set t.status = :status where t.groupId = :groupId")
-    Integer deleteByGroupId(@Param("groupId") String groupId, @Param("status") BaseStatusEnum status);
+    @Query(value = "update Tag t set t.status = 1 where t.id = ?1")
+    Integer deleteById(String tagId);
 }

+ 0 - 48
rankin-product-service/src/main/java/cn/rankin/productservice/repository/TagRepositoryImpl.java

@@ -1,48 +0,0 @@
-package cn.rankin.productservice.repository;
-
-import cn.rankin.common.utils.enums.TagTypeEnum;
-import cn.rankin.data.api.product.entity.Tag;
-import org.springframework.stereotype.Repository;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import java.util.List;
-
-@Repository
-public class TagRepositoryImpl {
-
-    @PersistenceContext
-    private EntityManager entityManager;
-
-    List<Tag> search(Tag tag, Integer start, Integer size) {
-        StringBuilder builder = new StringBuilder(TagRepository.SQL);
-
-        String name = tag.getName();
-        if (name != null) {
-            builder.append(String.format(" and t.name like '%s'", name));
-        }
-
-        String merchantId = tag.getMerchantId();
-        if (merchantId != null) {
-            builder.append(String.format(" and g.merchantId = %s", merchantId));
-        }
-
-        TagTypeEnum type = tag.getType();
-        if (type != null) {
-            builder.append(" and t.type = :type");
-        }
-
-        builder.append(" order by t.gmtModified desc");
-
-        Query query = entityManager.createQuery(builder.toString());
-        if (type != null) {
-            query.setParameter("type", type);
-        }
-
-        query.setFirstResult(start);
-        query.setMaxResults(size);
-
-        return query.getResultList();
-    }
-}

+ 12 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/service/GoodsService.java

@@ -1,6 +1,7 @@
 package cn.rankin.productservice.service;
 
 import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.data.api.product.dto.GoodsDTO;
 import cn.rankin.data.api.product.entity.Goods;
 import cn.rankin.data.api.product.entity.Product;
@@ -9,6 +10,9 @@ import cn.rankin.productservice.repository.GoodsRepository;
 import cn.rankin.productservice.repository.ProductRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 import static cn.rankin.productservice.utils.DTOConverter.convert;
 
@@ -31,6 +35,7 @@ public class GoodsService {
     }
 
     // 创建一个带价格的商品
+    @Transactional
     public APIResult<Goods> create(GoodsDTO goodsDTO) {
         String productId = goodsDTO.getPid();
         Product product = productRepository.findByPid(productId);
@@ -44,12 +49,14 @@ public class GoodsService {
     }
 
     // 修改商品
+    @Transactional
     public APIResult<Goods> update(GoodsDTO goodsDTO) {
         Goods goods = convert(goodsDTO);
         Goods result = goodsRepository.update(goods);
         return APIResult.ok(result);
     }
 
+    @Transactional
     public APIResult<Boolean> delete(String goodsId) {
         Integer count = goodsRepository.deleteById(goodsId);
         if (count > 0) {
@@ -57,4 +64,9 @@ public class GoodsService {
         }
         return APIResult.error(ProductServiceAPICode.NOT_EXISTS);
     }
+
+    public APIResult<List<Goods>> findByIds(List<String> goodsIdList) {
+        List<Goods> goodsList = goodsRepository.findByIds(goodsIdList, BaseStatusEnum.NORMAL);
+        return APIResult.ok(goodsList);
+    }
 }

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

@@ -173,6 +173,9 @@ public class MerchantProductService {
             }
             merchantProduct = new MerchantProduct();
             merchantProduct.setPid(productId);
+            merchantProduct.setCode(product.getCode());
+            merchantProduct.setName(product.getName());
+            merchantProduct.setType(product.getType());
             merchantProduct.setMerchantId(merchantId);
         }
         merchantProduct.setStatus(status);

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

@@ -19,6 +19,10 @@ public class MerchantProductTagRelationService {
     @Autowired
     private ProductTagRelationRepository relationRepository;
 
+    public List<MerchantProductTagRelation> findByTagId(String tagId) {
+        return relationRepository.findByTagId(tagId);
+    }
+
     public List<MerchantProductTagRelation> findByPidsAndMerchantIds(List<String> pids, List<String> merchantIds) {
         List<MerchantProductTagRelation> merchantProductTagRelationList = relationRepository.findByPidsAndMerchantIds(pids, merchantIds);
         return merchantProductTagRelationList;
@@ -67,7 +71,7 @@ public class MerchantProductTagRelationService {
     }
 
     @Transactional
-    public void updateByTag(String tagId, String merchantId, List<String> productIdList) {
+    public void updateByTagId(String tagId, String merchantId, List<String> productIdList) {
         if (productIdList == null) {
             return;
         }else if (productIdList.size() == 0) {

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

@@ -9,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.transaction.Transactional;
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -40,7 +39,7 @@ public class PackageProductRelationService {
         Map<String, PackageProductDTO> packageProductDTOMap = new HashMap<>();
 
         packageProductDTOList.forEach( packageProductDTO -> {
-            String productId = packageProductDTO.getProductId();
+            String productId = packageProductDTO.getPid();
             productIdList.add(productId);
             packageProductDTOMap.put(productId, packageProductDTO);
         });

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

@@ -142,7 +142,7 @@ public class PackageService {
         }
 
         List<String> productIdList = new ArrayList<>();
-        packageProductDTOList.forEach(packageProductDTO -> productIdList.add(packageProductDTO.getProductId()));
+        packageProductDTOList.forEach(packageProductDTO -> productIdList.add(packageProductDTO.getPid()));
 
         List<Product> productList = productRepository.findByPids(productIdList);
         if (productIdList.size() != productList.size()) {

+ 23 - 22
rankin-product-service/src/main/java/cn/rankin/productservice/service/TagGroupService.java

@@ -5,9 +5,10 @@ import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.product.dto.GroupDTO;
 import cn.rankin.common.utils.enums.BaseOrderEnum;
-import cn.rankin.common.utils.enums.BaseStatusEnum;
 import cn.rankin.common.utils.util.JpaSortUtil;
+import cn.rankin.data.api.product.entity.Tag;
 import cn.rankin.data.api.product.entity.TagGroup;
+import cn.rankin.productservice.code.ProductServiceAPICode;
 import cn.rankin.productservice.repository.TagGroupRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -24,20 +25,12 @@ public class TagGroupService {
     @Autowired
     private TagGroupRepository tagGroupRepository;
 
-    public APIResult<TagGroup> findById(String id) {
-        TagGroup tagGroup = tagGroupRepository.find(id);
-        if (tagGroup == null) {
-            return APIResult.error(APICode.NOT_EXISTS);
-        }
-        return APIResult.ok(tagGroup);
-    }
+    @Autowired
+    private TagService tagService;
 
-    public APIResult<TagGroup> findNormalById(String id) {
-        TagGroup tagGroup = tagGroupRepository.findNormalById(id, BaseStatusEnum.NORMAL);
-        if (tagGroup == null) {
-            return APIResult.error(APICode.NOT_EXISTS);
-        }
-        return APIResult.ok(tagGroup);
+    public boolean exists(String code) {
+        Long count = tagGroupRepository.countByCode(code);
+        return count > 0;
     }
 
     public APIResult<Page<TagGroup>> search(TagGroup tagGroup, Integer pageNo, Integer pageSize, LinkedHashMap<String, BaseOrderEnum> sort) {
@@ -54,11 +47,6 @@ public class TagGroupService {
         return APIResult.ok(page);
     }
 
-    public boolean exists(String code) {
-        Long count = tagGroupRepository.countByCode(code);
-        return count > 0;
-    }
-
     @Transactional
     public APIResult<TagGroup> create(GroupDTO groupDTO) {
         String code = groupDTO.getCode();
@@ -68,7 +56,6 @@ public class TagGroupService {
 
         TagGroup tagGroup = convert(groupDTO);
         TagGroup result = tagGroupRepository.save(tagGroup);
-
         return APIResult.ok(result);
     }
 
@@ -81,7 +68,21 @@ public class TagGroupService {
 
     @Transactional
     public APIResult<Boolean> delete(String id) {
-        Integer count = tagGroupRepository.deleteById(id, BaseStatusEnum.DEL);
-        return APIResult.ok(count > 0);
+        Integer count = tagGroupRepository.deleteById(id);
+        if (count > 0) {
+            return APIResult.ok();
+        }
+        return APIResult.error(ProductServiceAPICode.error("删除失败"));
+    }
+
+    public APIResult<TagGroup> getTagGroup(String groupId) {
+        TagGroup tagGroup = tagGroupRepository.find(groupId);
+        if (tagGroup == null) {
+            return APIResult.error(ProductServiceAPICode.NOT_EXISTS);
+        }
+
+        List<Tag> tagList = tagService.findByGroupId(groupId);
+        tagGroup.setTagList(tagList);
+        return APIResult.ok(tagGroup);
     }
 }

+ 89 - 68
rankin-product-service/src/main/java/cn/rankin/productservice/service/TagService.java

@@ -3,18 +3,28 @@ package cn.rankin.productservice.service;
 import cn.rankin.common.utils.api.model.APICode;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.common.utils.util.JpaSortUtil;
 import cn.rankin.common.utils.util.ListUtil;
 import cn.rankin.data.api.product.dto.TagDTO;
 import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.data.api.product.entity.MerchantProduct;
+import cn.rankin.data.api.product.entity.MerchantProductTagRelation;
 import cn.rankin.data.api.product.entity.Tag;
+import cn.rankin.data.api.product.entity.TagGroup;
+import cn.rankin.productservice.code.ProductServiceAPICode;
+import cn.rankin.productservice.repository.MerchantProductRepository;
+import cn.rankin.productservice.repository.TagGroupRepository;
 import cn.rankin.productservice.repository.TagRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 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;
 import java.util.List;
 import java.util.Map;
 
@@ -27,106 +37,117 @@ public class TagService {
     @Autowired
     private TagRepository tagRepository;
 
-    public APIResult<Tag> findById(String id) {
-        Tag tag = tagRepository.find(id);
-        return APIResult.ok(tag);
-    }
+    @Autowired
+    private TagGroupRepository tagGroupRepository;
+
+    @Autowired
+    private MerchantProductRepository merchantProductRepository;
+
+    @Autowired
+    private MerchantProductTagRelationService merchantProductTagRelationService;
 
-    public List<Tag> findByIds(List<String> tagIdList) {
-        List<Tag> tagList = tagRepository.findByIds(tagIdList, BaseStatusEnum.NORMAL);
+    public List<Tag> findByGroupId(String groupId) {
+        List<Tag> tagList = tagRepository.findByGroupId(groupId);
+        setGroupInfo(tagList);
         return tagList;
     }
 
-    public APIResult<Page<Tag>> search(Tag tag, Integer pageNo, Integer pageSize) {
+    public void setGroupInfo(List<Tag> tagList) {
+        if (CollectionUtils.isEmpty(tagList)) return;
+        List<String> groupIdList = new ArrayList<>();
+        tagList.forEach(tag -> {
+            String groupId = tag.getGroupId();
+            if (!groupIdList.contains(groupId)) {
+                groupIdList.add(groupId);
+            }
+        });
+
+        List<TagGroup> groupList = tagGroupRepository.findByIds(groupIdList);
+        Map<String, TagGroup> tagGroupMap = ListUtil.convert(groupList, "id", TagGroup.class);
+
+        for (Tag tag : tagList) {
+            String groupId = tag.getGroupId();
+            TagGroup tagGroup = tagGroupMap.get(groupId);
+            if (tagGroup != null) {
+                tag.setGroupName(tagGroup.getName());
+            }
+        }
+    }
+
+    public List<MerchantProduct> getMerchantProductList(String tagId, String merchantId) {
+        List<MerchantProductTagRelation> relationList = merchantProductTagRelationService.findByTagId(tagId);
+        if (CollectionUtils.isEmpty(relationList)) {
+            return new ArrayList<>();
+        }
+
+        List<String> productIdList = new ArrayList<>();
+        relationList.forEach(relation -> productIdList.add(relation.getPid()));
+        return merchantProductRepository.findByPidsAndMerchantId(productIdList, merchantId);
+    }
+
+    // 搜索标签
+    public APIResult<Page<Tag>> search(Tag tag, Integer pageNo, Integer pageSize, LinkedHashMap<String, BaseOrderEnum> sort) {
         Long count = tagRepository.count(tag);
         Page<Tag> page = new Page(count, pageNo, pageSize);
-
         if (count == 0) {
             return APIResult.ok(page);
         }
 
-        List<Tag> tagList = tagRepository.search(tag, Long.valueOf(page.getStart()).intValue(), pageSize);
-//        List<Tag> tagList = tagRepository.find(tag, page.getStart(), pageSize, JpaSortUtil.sort(sort));
+        List<Tag> tagList = tagRepository.find(tag, page.getStart(), page.getPageSize(), JpaSortUtil.sort(sort));
+        setGroupInfo(tagList);
         page.setList(tagList);
 
         return APIResult.ok(page);
     }
 
+    // 标签详情
+    public APIResult<Tag> getTag(String tagId) {
+        Tag tag = tagRepository.find(tagId);
+        String merchantId = tag.getMerchantId();
+
+        List<MerchantProduct> merchantProductList = getMerchantProductList(tagId, merchantId);
+        tag.setProducts(merchantProductList);
+        return APIResult.ok(tag);
+    }
+
     @Transactional
     public APIResult<Tag> create(TagDTO tagDTO) {
-
         Tag tag = convert(tagDTO);
         Tag result = tagRepository.save(tag);
 
-        return APIResult.ok(result);
+        String tagId = result.getId();
+        String merchantId = result.getMerchantId();
+        List<String> productIdList = tagDTO.getProductList();
+        merchantProductTagRelationService.updateByTagId(tagId, merchantId, productIdList);
+
+        List<MerchantProduct> merchantProductList = getMerchantProductList(tagId, merchantId);
+        tag.setProducts(merchantProductList);
+
+        return APIResult.ok(tag);
     }
 
     @Transactional
     public APIResult<Tag> update(TagDTO tagDTO) {
-
         Tag tag = convert(tagDTO);
         Tag result = tagRepository.update(tag);
 
-        return APIResult.ok(result);
-    }
-
-    @Transactional
-    public APIResult<Boolean> delete(String id) {
-        Integer count = tagRepository.updateStatusById(id, BaseStatusEnum.DEL);
-        if (count > 0) {
-            return APIResult.ok(true);
-        }
-        return APIResult.error(APICode.NOT_EXISTS);
-    }
+        String tagId = result.getId();
+        String merchantId = result.getMerchantId();
+        List<String> productIdList = tagDTO.getProductList();
+        merchantProductTagRelationService.updateByTagId(tagId, merchantId, productIdList);
 
-    @Transactional
-    public APIResult<Boolean> deleteByGroupId(String groupId) {
-        tagRepository.deleteByGroupId(groupId, BaseStatusEnum.DEL);
-        return APIResult.ok(true);
-    }
+        List<MerchantProduct> merchantProductList = getMerchantProductList(tagId, merchantId);
+        tag.setProducts(merchantProductList);
 
-    public APIResult<List<Tag>> findNormalByGroupId(String groupId) {
-        List<Tag> tagList = tagRepository.findNormalByGroupId(groupId, BaseStatusEnum.NORMAL);
-        return APIResult.ok(tagList);
+        return APIResult.ok(tag);
     }
 
     @Transactional
-    public APIResult<List<Tag>> updateGroupRelation(String groupId, List<TagDTO> tagDTOList) {
-        if (tagDTOList == null) {
-            return APIResult.ok();
-        }
-
-        deleteByGroupId(groupId);
-
-        if (tagDTOList.size() == 0) {
-            return APIResult.ok(new ArrayList<>());
-        }
-
-        List<String> tagIdList = new ArrayList<>();
-        List<Tag> tagList = new ArrayList<>();
-        for (int i = 0; i < tagDTOList.size(); i++) {
-            TagDTO dto = tagDTOList.get(i);
-            if (dto == null) {
-                continue;
-            }
-
-            String tagId = dto.getId();
-            if (!StringUtils.isEmpty(tagId)) {
-                tagIdList.add(tagId);
-            }
-
-            Tag tag = convert(dto);
-            tag.setGroupId(groupId);
-            tag.setSort(i);
-            tag.setStatus(BaseStatusEnum.NORMAL);
-
-            tagList.add(tag);
+    public APIResult<Boolean> delete(String tagId) {
+        Integer count = tagRepository.deleteById(tagId);
+        if (count > 0) {
+            return APIResult.ok(true);
         }
-
-        List<Tag> result = tagRepository.save(tagList);
-
-        return APIResult.ok(result);
-
+        return APIResult.error(ProductServiceAPICode.NOT_EXISTS);
     }
-
 }

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

@@ -65,7 +65,7 @@ public class DTOConverter {
     public static PackageProductRelation convert(String pkgId, PackageProductDTO productDTO) {
         PackageProductRelation relation = new PackageProductRelation();
         relation.setPackageId(pkgId);
-        relation.setPid(productDTO.getProductId());
+        relation.setPid(productDTO.getPid());
         relation.setCpPrice(productDTO.getCpPrice());
         relation.setStatus(BaseStatusEnum.NORMAL);
         return relation;

+ 6 - 0
rankin-product-service/src/test/java/cn/rankin/productservice/repository/tagRepositoryImplTest.java

@@ -27,4 +27,10 @@ public class tagRepositoryImplTest {
         idList.add("1");
         List<Tag> tagList = tagRepository.findByIds(idList, BaseStatusEnum.NORMAL);
     }
+
+    @Test
+    public void find() {
+        Tag tag = new Tag();
+        tag.setStatus(BaseStatusEnum.NORMAL);
+    }
 }

+ 5 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/TradeServiceApplication.java

@@ -1,9 +1,14 @@
 package cn.rankin.tradeservice;
 
+import cn.rankin.common.utils.jpa.SimpleJpaRepository;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
 
+@EnableDiscoveryClient
 @SpringBootApplication
+@EnableJpaRepositories(repositoryBaseClass = SimpleJpaRepository.class)
 public class TradeServiceApplication {
 
 	public static void main(String[] args) {

+ 6 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/code/TradeServiceAPICode.java

@@ -0,0 +1,6 @@
+package cn.rankin.tradeservice.code;
+
+import cn.rankin.common.utils.api.model.APICode;
+
+public class TradeServiceAPICode extends APICode {
+}

+ 44 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/configuration/PersistConfiguration.java

@@ -0,0 +1,44 @@
+package cn.rankin.tradeservice.configuration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.EnvironmentAware;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+
+
+/**
+ * 类名:PersistConfiguration  <br />
+ *
+ * 功能:持久化相关配置
+ *
+ * @author xtwin <br />
+ * 创建时间:2016年7月26日 上午9:56:48  <br />
+ * @version 2016年7月26日
+ */
+@Configuration
+@EntityScan(basePackages={"cn.rankin.data.api.trade.entity"})
+public class PersistConfiguration implements EnvironmentAware {
+	
+	// 日志记录器
+	private static final Logger logger = LoggerFactory.getLogger(PersistConfiguration.class);
+	
+	// 应用环境信息
+	private Environment environment;
+
+	/**
+	 * 功能: 由spring注入环境信息 <br/>
+	 * 
+	 * 重写:xtwin <br/>
+	 * 
+	 * @version :2016年7月27日 上午10:02:15<br/>
+	 * 
+	 * @param environment <br/>
+	 * @see EnvironmentAware#setEnvironment(Environment)
+	 */
+	@Override
+	public void setEnvironment(Environment environment) {
+		this.environment = environment;
+	}
+}

+ 27 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/controller/OrderController.java

@@ -0,0 +1,27 @@
+package cn.rankin.tradeservice.controller;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.trade.dto.UserOrderDTO;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.tradeservice.service.OrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping(value = "/order")
+public class OrderController {
+
+    @Autowired
+    private OrderService orderService;
+
+    // cms web需要做前置校验
+    @RequestMapping(method = RequestMethod.POST)
+    public APIResult<UserOrder> create(@RequestBody UserOrderDTO userOrderDTO) {
+        return orderService.create(userOrderDTO);
+    }
+
+    @RequestMapping(value = "/{orderId}", method = RequestMethod.GET)
+    public APIResult<UserOrder> getOrder(@PathVariable String orderId) {
+        return orderService.getOrder(orderId);
+    }
+}

+ 11 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderGoodsRepository.java

@@ -0,0 +1,11 @@
+package cn.rankin.tradeservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.data.api.trade.entity.OrderGoods;
+
+import java.util.List;
+
+public interface OrderGoodsRepository extends BasicJpaRepository<OrderGoods, String> {
+
+    List<OrderGoods> findByOrderId(String orderId);
+}

+ 7 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderRepository.java

@@ -0,0 +1,7 @@
+package cn.rankin.tradeservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.data.api.trade.entity.UserOrder;
+
+public interface OrderRepository extends BasicJpaRepository<UserOrder, String> {
+}

+ 34 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderGoodsService.java

@@ -0,0 +1,34 @@
+package cn.rankin.tradeservice.service;
+
+import cn.rankin.data.api.trade.dto.OrderGoodsDTO;
+import cn.rankin.data.api.trade.entity.OrderGoods;
+import cn.rankin.tradeservice.repository.OrderGoodsRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.rankin.tradeservice.utils.DTOConverter.convert;
+
+@Service
+public class OrderGoodsService {
+
+    @Autowired
+    private OrderGoodsRepository orderGoodsRepository;
+
+    @Transactional
+    public void createRelation(String orderId, List<OrderGoodsDTO> orderGoodsDTOList) {
+        List<OrderGoods> orderGoodsList = new ArrayList<>();
+        for (OrderGoodsDTO orderGoodsDTO : orderGoodsDTOList) {
+            OrderGoods relation = convert(orderId, orderGoodsDTO);
+            orderGoodsList.add(relation);
+        }
+        orderGoodsRepository.save(orderGoodsList);
+    }
+
+    public List<OrderGoods> findByOrderId(String orderId) {
+        return orderGoodsRepository.findByOrderId(orderId);
+    }
+}

+ 52 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderService.java

@@ -0,0 +1,52 @@
+package cn.rankin.tradeservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.enums.OrderStatusEnum;
+import cn.rankin.data.api.trade.dto.UserOrderDTO;
+import cn.rankin.data.api.trade.dto.OrderGoodsDTO;
+import cn.rankin.data.api.trade.entity.OrderGoods;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.tradeservice.code.TradeServiceAPICode;
+import cn.rankin.tradeservice.repository.OrderRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+import static cn.rankin.tradeservice.utils.DTOConverter.convert;
+
+@Service
+public class OrderService {
+
+    @Autowired
+    private OrderRepository orderRepository;
+
+    @Autowired
+    private OrderGoodsService orderGoodsService;
+
+    @Transactional
+    public APIResult<UserOrder> create(UserOrderDTO userOrderDTO) {
+        UserOrder userOrder = convert(userOrderDTO);
+        userOrder.setStatus(OrderStatusEnum.UNPAID);
+        userOrder = orderRepository.saveAndFlush(userOrder);
+        String orderId = userOrder.getId();
+        List<OrderGoodsDTO> orderGoodsDTOList = userOrderDTO.getGoods();
+        orderGoodsService.createRelation(orderId, orderGoodsDTOList);
+        List<OrderGoods> orderGoodsList = orderGoodsService.findByOrderId(orderId);
+        userOrder.setGoods(orderGoodsList);
+        return APIResult.ok(userOrder);
+    }
+
+    public APIResult<UserOrder> getOrder(String orderId) {
+        UserOrder userOrder = orderRepository.find(orderId);
+        if (userOrder == null) {
+            return APIResult.error(TradeServiceAPICode.NOT_EXISTS);
+        }
+
+        List<OrderGoods> orderGoodsList = orderGoodsService.findByOrderId(orderId);
+        userOrder.setGoods(orderGoodsList);
+        return APIResult.ok(userOrder);
+    }
+
+}

+ 26 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/utils/DTOConverter.java

@@ -0,0 +1,26 @@
+package cn.rankin.tradeservice.utils;
+
+import cn.rankin.data.api.trade.dto.UserOrderDTO;
+import cn.rankin.data.api.trade.dto.OrderGoodsDTO;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.data.api.trade.entity.OrderGoods;
+import org.springframework.beans.BeanUtils;
+
+public class DTOConverter {
+
+    public static UserOrder convert(UserOrderDTO userOrderDTO) {
+        UserOrder userOrder = new UserOrder();
+        BeanUtils.copyProperties(userOrderDTO, userOrder);
+        return userOrder;
+    }
+
+    public static OrderGoods convert(String orderId, OrderGoodsDTO orderGoodsDTO) {
+        OrderGoods relation = new OrderGoods();
+        relation.setOrderId(orderId);
+        relation.setGoodsId(orderGoodsDTO.getGoodsId());
+        relation.setPid(orderGoodsDTO.getPid());
+        relation.setQuantity(orderGoodsDTO.getQuantity());
+        relation.setType(orderGoodsDTO.getType());
+        return relation;
+    }
+}

+ 1 - 1
rankin-trade-service/src/main/resources/bootstrap.yml

@@ -5,7 +5,7 @@ spring:
     config:
       uri: http://config.rankin.com:8921
       label: master
-      profile: prod
+      profile: dev
 
 server:
   port: 8300