remy.liu 4 jaren geleden
bovenliggende
commit
67d6250674

+ 4 - 0
base-module/pom.xml

@@ -22,6 +22,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 24 - 0
common-module/src/main/java/com/remy/common/module/OrderDTO.java

@@ -0,0 +1,24 @@
+package com.remy.common.module;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.math.BigDecimal;
+
+@Data
+@SuperBuilder
+@NoArgsConstructor
+public class OrderDTO extends BaseDTO {
+
+    private String orderNo;
+
+    private String goodsSerialNo;
+
+    private BigDecimal discount;
+
+    private BigDecimal originalAmount;
+
+    private BigDecimal discountAmount;
+
+}

+ 2 - 1
goods-service/src/main/java/com/remy/goods/controller/GoodsServiceController.java

@@ -2,6 +2,7 @@ package com.remy.goods.controller;
 
 import com.remy.goods.entity.Goods;
 import com.remy.goods.service.GoodsService;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -27,7 +28,7 @@ public class GoodsServiceController {
 
     @PostMapping()
     public Goods save(@RequestBody Goods goods) {
-        goods.setSerialNo(UUID.randomUUID().toString());
+        goods.setSerialNo(RandomStringUtils.randomAlphanumeric(8));
         return goodsService.save(goods);
     }
 }

+ 2 - 1
goods-service/src/main/java/com/remy/goods/dao/GoodsDAO.java

@@ -5,10 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.repository.CrudRepository;
 
 import javax.persistence.Id;
+import java.util.List;
 
 public interface GoodsDAO extends JpaRepository<Goods, Id> {
 
-    Goods findByName(String name);
+    List<Goods> findGoodsByNameLike(String name);
 
     Goods findGoodsBySerialNo(String serialNo);
 }

+ 0 - 8
graphql-api/pom.xml

@@ -29,14 +29,6 @@
             <groupId>com.graphql-java-kickstart</groupId>
             <artifactId>playground-spring-boot-starter</artifactId>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.graphql-java-kickstart</groupId>-->
-<!--            <artifactId>voyager-spring-boot-starter</artifactId>-->
-<!--        </dependency>-->
-        <dependency>
-            <groupId>com.graphql-java-kickstart</groupId>
-            <artifactId>graphql-java-tools</artifactId>
-        </dependency>
         <dependency>
             <groupId>com.graphql-java-kickstart</groupId>
             <artifactId>graphql-spring-boot-starter-test</artifactId>

+ 2 - 0
graphql-api/src/main/java/com/remy/graphql/evn/RestAPIEnv.java

@@ -12,4 +12,6 @@ import org.springframework.context.annotation.Configuration;
 public class RestAPIEnv {
 
     private String goodsEndpoint;
+
+    private String ordersEndpoint;
 }

+ 23 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/OrderMutation.java

@@ -0,0 +1,23 @@
+package com.remy.graphql.resolvers.mutation;
+
+import com.remy.common.module.OrderDTO;
+import com.remy.graphql.evn.RestAPIEnv;
+import graphql.kickstart.tools.GraphQLMutationResolver;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.concurrent.CompletableFuture;
+
+@Component
+public class OrderMutation implements GraphQLMutationResolver {
+
+    @Autowired
+    RestAPIEnv apiEnv;
+
+    CompletableFuture<OrderDTO> createOrder(OrderDTO orderDTO) {
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().postForObject(apiEnv.getOrdersEndpoint(),
+                        orderDTO, OrderDTO.class));
+    }
+}

+ 46 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/query/OrderQuery.java

@@ -0,0 +1,46 @@
+package com.remy.graphql.resolvers.query;
+
+import com.remy.common.module.OrderDTO;
+import com.remy.graphql.evn.RestAPIEnv;
+import graphql.kickstart.tools.GraphQLQueryResolver;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+@Component
+public class OrderQuery implements GraphQLQueryResolver {
+
+    @Autowired
+    RestAPIEnv apiEnv;
+
+    public CompletableFuture<List<OrderDTO>> orderList() {
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().exchange(
+                        apiEnv.getOrdersEndpoint(),
+                        HttpMethod.GET,
+                        new HttpEntity(null),
+                        new ParameterizedTypeReference<List<OrderDTO>>() {
+                        }).getBody());
+    }
+
+    public CompletableFuture<List<OrderDTO>> orderQuery(String goodsSerialNo) {
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().exchange(
+                        apiEnv.getOrdersEndpoint() + "query?goodsSerialNo=" + goodsSerialNo,
+                        HttpMethod.GET,
+                        new HttpEntity(null),
+                        new ParameterizedTypeReference<List<OrderDTO>>() {
+                        }).getBody());
+    }
+
+    public CompletableFuture<OrderDTO> orderInfo(String orderNo) {
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().getForObject(apiEnv.getOrdersEndpoint() + orderNo, OrderDTO.class));
+    }
+}

+ 3 - 1
graphql-api/src/main/resources/application.yml

@@ -4,6 +4,7 @@ spring:
 server:
   port: 8080
 graphql:
+  extended-scalars: BigDecimal, Date
   servlet:
     exception-handlers-enabled: true
   graphiql:
@@ -13,4 +14,5 @@ graphql:
 
 rest:
   api:
-    goods-endpoint: http://localhost:8081/goods/
+    goods-endpoint: http://localhost:8081/goods/
+    orders-endpoint: http://localhost:8082/orders/

+ 0 - 28
graphql-api/src/main/resources/goods.graphqls

@@ -1,28 +0,0 @@
-type Query{
-    goods(serialNo: String!): Goods!
-    goodsList: [Goods]
-}
-
-type Mutation{
-    createGoods(input:GoodsInput): Goods!
-}
-
-type Goods {
-    id: ID!
-    serialNo: String!
-    name: String!
-    price: Float!
-    itemCount: Int!
-    img: String!
-    description: String
-    detail: String
-}
-
-input GoodsInput{
-    name: String!
-    price: Float!
-    itemCount: Int!
-    img: String!
-    description: String
-    detail: String
-}

+ 54 - 0
graphql-api/src/main/resources/schema.graphqls

@@ -0,0 +1,54 @@
+type Query{
+    goods(serialNo: String!): Goods!
+    goodsList: [Goods]
+    orderInfo(orderNo: String!): Order!
+    orderList: [Order]
+    orderQuery(goodsSerialNo: String!): [Order]
+}
+
+type Mutation{
+    createGoods(input:GoodsInput): Goods!
+    createOrder(input:OrderInput): Order!
+}
+
+scalar BigDecimal
+scalar Date
+
+type Goods {
+    id: ID!
+    serialNo: String!
+    name: String!
+    price: BigDecimal!
+    itemCount: Int!
+    img: String!
+    description: String
+    detail: String
+}
+
+input GoodsInput{
+    name: String!
+    price: BigDecimal!
+    itemCount: Int!
+    img: String!
+    description: String
+    detail: String
+}
+
+
+type Order {
+    id: ID!
+    orderNo: String!
+    goodsSerialNo: String!
+    discount: Float!
+    originalAmount: BigDecimal!
+    discountAmount: BigDecimal!
+    createTime: Date!
+    updateTime: Date!
+}
+
+input OrderInput{
+    goodsSerialNo: String!
+    discount: Float!
+    originalAmount: BigDecimal!
+    discountAmount: BigDecimal!
+}

+ 38 - 0
order-service/src/main/java/com/remy/order/controller/OrderController.java

@@ -0,0 +1,38 @@
+package com.remy.order.controller;
+
+import com.remy.order.entity.Order;
+import com.remy.order.service.OrderService;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("orders")
+public class OrderController {
+
+    @Autowired
+    OrderService orderService;
+
+    @RequestMapping()
+    public List<Order> findAll() {
+        return orderService.findAll();
+    }
+
+    @RequestMapping("{orderNo}")
+    public Order findBySerialNo(@PathVariable("orderNo") String orderNo) {
+        return orderService.findByOrderNo(orderNo);
+    }
+
+    @RequestMapping("query")
+    public List<Order> findALlByGoodsSerialNo(@RequestParam("goodsSerialNo") String goodsSerialNo){
+        return orderService.findAllByGoodsSerialNo(goodsSerialNo);
+    }
+
+    @PostMapping()
+    public Order save(@RequestBody Order order) {
+        order.setOrderNo(RandomStringUtils.randomAlphanumeric(10));
+        return orderService.save(order);
+    }
+}

+ 13 - 0
order-service/src/main/java/com/remy/order/dao/OrderDAO.java

@@ -0,0 +1,13 @@
+package com.remy.order.dao;
+
+import com.remy.order.entity.Order;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface OrderDAO extends JpaRepository<Order, Long> {
+
+    Order findOrderByOrderNo(String orderNo);
+
+    List<Order> findAllByGoodsSerialNo(String goodsSerialNo);
+}

+ 13 - 0
order-service/src/main/java/com/remy/order/entity/Order.java

@@ -5,8 +5,10 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.SuperBuilder;
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Table;
+import java.math.BigDecimal;
 
 @Entity
 @Data
@@ -15,8 +17,19 @@ import javax.persistence.Table;
 @Table(name = "t_order")
 public class Order extends BaseEntity {
 
+    @Column(name = "order_no")
     private String orderNo;
 
+    @Column(name = "goods_serial_no")
     private String goodsSerialNo;
 
+    @Column(name = "discount")
+    private BigDecimal discount;
+
+    @Column(name = "original_amount")
+    private BigDecimal originalAmount;
+
+    @Column(name = "discount_amount")
+    private BigDecimal discountAmount;
+
 }

+ 16 - 0
order-service/src/main/java/com/remy/order/service/OrderService.java

@@ -0,0 +1,16 @@
+package com.remy.order.service;
+
+import com.remy.order.entity.Order;
+
+import java.util.List;
+
+public interface OrderService {
+
+    Order findByOrderNo(String orderNo);
+
+    List<Order> findAllByGoodsSerialNo(String goodsSerialNo);
+
+    List<Order> findAll();
+
+    Order save(Order order);
+}

+ 36 - 0
order-service/src/main/java/com/remy/order/service/impl/OrderServiceImpl.java

@@ -0,0 +1,36 @@
+package com.remy.order.service.impl;
+
+import com.remy.order.dao.OrderDAO;
+import com.remy.order.entity.Order;
+import com.remy.order.service.OrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class OrderServiceImpl implements OrderService {
+
+    @Autowired
+    OrderDAO orderDAO;
+
+    @Override
+    public Order findByOrderNo(String orderNo) {
+        return orderDAO.findOrderByOrderNo(orderNo);
+    }
+
+    @Override
+    public List<Order> findAllByGoodsSerialNo(String goodsSerialNo) {
+        return orderDAO.findAllByGoodsSerialNo(goodsSerialNo);
+    }
+
+    @Override
+    public List<Order> findAll() {
+        return orderDAO.findAll();
+    }
+
+    @Override
+    public Order save(Order order) {
+        return orderDAO.save(order);
+    }
+}

+ 19 - 20
pom.xml

@@ -23,9 +23,17 @@
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
         <kotlin.version>1.3.70</kotlin.version>
-        <graphql-kickstart.version>11.0.0</graphql-kickstart.version>
+        <graphql-kickstart.version>11.1.0</graphql-kickstart.version>
     </properties>
 
+    <repositories>
+        <repository>
+            <id>osshr-snapshots</id>
+            <name>osshr-sonatype-snapshots</name>
+            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+        </repository>
+    </repositories>
+
     <dependencies>
         <dependency>
             <groupId>org.projectlombok</groupId>
@@ -89,17 +97,6 @@
                 <version>${graphql-kickstart.version}</version>
                 <scope>runtime</scope>
             </dependency>
-            <dependency>
-                <groupId>com.graphql-java-kickstart</groupId>
-                <artifactId>voyager-spring-boot-starter</artifactId>
-                <version>${graphql-kickstart.version}</version>
-                <scope>runtime</scope>
-            </dependency>
-            <dependency>
-                <groupId>com.graphql-java-kickstart</groupId>
-                <artifactId>graphql-java-tools</artifactId>
-                <version>${graphql-kickstart.version}</version>
-            </dependency>
             <dependency>
                 <groupId>com.graphql-java-kickstart</groupId>
                 <artifactId>graphql-spring-boot-starter-test</artifactId>
@@ -113,15 +110,17 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
+            <dependency>
+                <groupId>com.graphql-java</groupId>
+                <artifactId>graphql-java-extended-scalars</artifactId>
+                <version>16.0.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>3.11</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
-    <repositories>
-        <repository>
-            <id>osshr-snapshots</id>
-            <name>osshr-sonatype-snapshots</name>
-            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-        </repository>
-    </repositories>
-
 </project>