huodongdong 7 years ago
parent
commit
120f9de598
38 changed files with 771 additions and 34 deletions
  1. 44 4
      pom.xml
  2. 5 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/FeignConfiguration.java
  3. 1 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/product/GroupController.java
  4. 1 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderService.java
  5. 1 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderServiceFeign.java
  6. 12 0
      rankin-cms-web/src/test/java/cn/rankin/cmsweb/service/trade/order/OrderServiceFeignTest.java
  7. 4 4
      rankin-common-utils/pom.xml
  8. 10 0
      rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/Constant.java
  9. 6 6
      rankin-data-api/pom.xml
  10. 27 0
      rankin-data-api/src/main/java/cn/rankin/data/api/auth/dto/AuthDTO.java
  11. 2 0
      rankin-data-api/src/main/java/cn/rankin/data/api/product/vo/TagVo.java
  12. 6 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/UserOrder.java
  13. 65 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/UserOrderSplit.java
  14. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/configuration/PersistConfiguration.java
  15. 6 0
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/ProductController.java
  16. 1 1
      rankin-product-service/src/main/java/cn/rankin/productservice/controller/TagGroupController.java
  17. 6 0
      rankin-product-service/src/main/java/cn/rankin/productservice/service/ProductService.java
  18. 2 0
      rankin-product-service/src/main/java/cn/rankin/productservice/utils/DTOConverter.java
  19. 2 0
      rankin-task/src/main/java/cn/rankin/task/RankinTaskApplication.java
  20. 6 0
      rankin-task/src/main/java/cn/rankin/task/code/TaskAPICode.java
  21. 40 0
      rankin-task/src/main/java/cn/rankin/task/configuration/FeignConfiguration.java
  22. 25 0
      rankin-task/src/main/java/cn/rankin/task/service/AuthService.java
  23. 46 0
      rankin-task/src/main/java/cn/rankin/task/service/ProductService.java
  24. 40 0
      rankin-task/src/main/java/cn/rankin/task/service/TradeService.java
  25. 38 0
      rankin-task/src/main/java/cn/rankin/task/service/UserService.java
  26. 192 0
      rankin-task/src/main/java/cn/rankin/task/task/order/OrderCompleteTask.java
  27. 47 0
      rankin-task/src/main/java/cn/rankin/task/task/order/OrderSplitTask.java
  28. 0 0
      rankin-task/src/main/resources/application.properties
  29. 17 0
      rankin-task/src/main/resources/bootstrap.yml
  30. 1 1
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/configuration/PersistConfiguration.java
  31. 11 2
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/controller/OrderController.java
  32. 4 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderGoodsRepository.java
  33. 5 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderRepository.java
  34. 4 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderGoodsService.java
  35. 35 4
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderService.java
  36. 29 0
      rankin-trade-service/src/test/java/cn/rankin/tradeservice/repository/OrderRepositoryTest.java
  37. 28 6
      rankin-user-service/pom.xml
  38. 1 1
      rankin-user-service/src/main/java/cn/rankin/userservice/configuration/PersistConfiguration.java

+ 44 - 4
pom.xml

@@ -73,12 +73,52 @@
 
 	<build>
 		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.3.2</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-release-plugin</artifactId>
+                <version>2.5.3</version>
+                <configuration>
+                    <useReleaseProfile>false</useReleaseProfile>
+                    <autoVersionSubmodules>true</autoVersionSubmodules>
+                </configuration>
+            </plugin>
 		</plugins>
 	</build>
 
+    <repositories>
+        <repository>
+            <id>nexus</id>
+            <url>http://192.168.1.96:8081/nexus/content/groups/public/</url>
+            <layout>default</layout>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+    <distributionManagement>
+        <repository>
+            <id>nexus-releases</id>
+            <name>Releases</name>
+            <url>http://192.168.1.96:8081/nexus/content/repositories/releases/</url>
+        </repository>
+        <snapshotRepository>
+            <id>nexus-snapshots</id>
+            <name>Snapshots</name>
+            <url>http://192.168.1.96:8081/nexus/content/repositories/snapshots/</url>
+        </snapshotRepository>
+    </distributionManagement>
 
 </project>

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

@@ -1,10 +1,15 @@
 package cn.rankin.cmsweb.configuration;
 
+import cn.rankin.common.utils.enums.OrderStatusEnum;
+import com.sun.beans.editors.EnumEditor;
 import feign.RequestInterceptor;
 import feign.RequestTemplate;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.support.WebBindingInitializer;
+import org.springframework.web.context.request.WebRequest;
 
 @Slf4j
 @Configuration
@@ -21,5 +26,4 @@ public class FeignConfiguration {
     public ContentTypeInterceptor contentTypeInterceptor() {
         return new ContentTypeInterceptor();
     }
-
 }

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

@@ -41,7 +41,7 @@ public class GroupController {
     }
 
     @RequestMapping(method = RequestMethod.PUT)
-    public APIResult<GroupVo> update(@Valid @RequestBody GroupDTO groupDTO) {
+    public APIResult<GroupVo> update(@RequestBody GroupDTO groupDTO) {
         APIResult<GroupVo> groupVoAPIResult = groupService.update(groupDTO);
         merchantServiceUtil.setMerchantInfo(groupVoAPIResult);
         return groupVoAPIResult;

+ 1 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderService.java

@@ -86,7 +86,7 @@ public class OrderService {
         }
 
         // 更新订单状态
-        APIResult<Boolean> orderAPIResult = orderServiceFeign.pay(orderId, OrderStatusEnum.PAYOK);
+        APIResult<Boolean> orderAPIResult = orderServiceFeign.pay(orderId);
         if (!orderAPIResult.getSuccess()) {
             return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
         }

+ 1 - 1
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderServiceFeign.java

@@ -24,7 +24,7 @@ public interface OrderServiceFeign {
     APIResult<UserOrder> getOrder(@PathVariable("orderId") String orderId);
 
     @RequestMapping(value = "/order/pay/{orderId}", method = RequestMethod.POST)
-    APIResult<Boolean> pay(@PathVariable("orderId") String orderId, @RequestParam("status") OrderStatusEnum status);
+    APIResult<Boolean> pay(@PathVariable("orderId") String orderId);
 
     @RequestMapping(value = "/order/pay/{orderId}", method = RequestMethod.DELETE)
     APIResult<Boolean> cancel(@PathVariable("orderId") String orderId);

+ 12 - 0
rankin-cms-web/src/test/java/cn/rankin/cmsweb/service/trade/order/OrderServiceFeignTest.java

@@ -0,0 +1,12 @@
+package cn.rankin.cmsweb.service.trade.order;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class OrderServiceFeignTest {
+    @Test
+    public void pay() throws Exception {
+    }
+
+}

+ 4 - 4
rankin-common-utils/pom.xml

@@ -12,10 +12,10 @@
 	<description>Common Utils for Spring Boot</description>
 
     <parent>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-parent</artifactId>
-        <version>1.5.8.RELEASE</version>
-        <relativePath/> <!-- lookup parent from repository -->
+        <groupId>cn.rankin</groupId>
+        <artifactId>rankin</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
     </parent>
 
 	<properties>

+ 10 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/constant/Constant.java

@@ -15,4 +15,14 @@ public class Constant {
         public final static int WECHAT = 2;
     }
 
+    public final static String BIZ_CODE = "0129";
+
+    public final static class ProductType {
+
+        public final static int VIP = 0;
+
+        public final static int PKG = 1;
+
+        public final static int COURSE = 2;
+    }
 }

+ 6 - 6
rankin-data-api/pom.xml

@@ -11,12 +11,12 @@
 	<name>rankin-data-api</name>
 	<description>data api for Spring Boot</description>
 
-	<parent>
-		<groupId>org.springframework.boot</groupId>
-		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>1.5.9.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
-	</parent>
+    <parent>
+        <groupId>cn.rankin</groupId>
+        <artifactId>rankin</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

+ 27 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/auth/dto/AuthDTO.java

@@ -0,0 +1,27 @@
+package cn.rankin.data.api.auth.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class AuthDTO implements Serializable {
+
+    // 为鉴权中心的uid,与本地uid不同
+    private String uid;
+
+    private String gid;
+
+    private String pid;
+
+    private Integer type;
+
+    private String bizCode;
+
+    private String title;
+
+    private Integer addDays;
+
+}

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

@@ -11,6 +11,8 @@ public class TagVo implements Serializable {
 
     private String id;
 
+    private String groupId;
+
     private String code;
 
     private String name;

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

@@ -40,6 +40,12 @@ public class UserOrder implements Serializable {
 
     private String note;
 
+    private String address;
+
+    private String mobile;
+
+    private String name;
+
     @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtCreated;

+ 65 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/UserOrderSplit.java

@@ -0,0 +1,65 @@
+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_split")
+@DynamicInsert
+@DynamicUpdate
+public class UserOrderSplit implements Serializable {
+
+    @Id
+    private String id;
+
+    @Column(name = "order_id")
+    private String orderId;
+
+    @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;
+
+    private String address;
+
+    private String mobile;
+
+    private String name;
+
+    @Column(name = "track_no")
+    private String trackNo;
+
+    @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;
+}

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

@@ -26,7 +26,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
  * @version 2016年7月26日
  */
 @Configuration
-@EntityScan(basePackages={"cn.rankin.data.api.product.entity"})
+@EntityScan(basePackages={"cn.rankin.data.api.product"})
 public class PersistConfiguration implements EnvironmentAware {
 	
 	// 日志记录器

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

@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.LinkedHashMap;
+import java.util.List;
 
 @RestController
 @RequestMapping(value = "/product")
@@ -87,4 +88,9 @@ public class ProductController {
     public APIResult delete(@PathVariable("productId") String productId) {
         return productService.delete(productId);
     }
+
+    @RequestMapping(value = "/ids", method = RequestMethod.GET)
+    public APIResult<List<Product>> findByPids(@RequestParam("id") List<String> pidList) {
+        return productService.findByPids(pidList);
+    }
 }

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

@@ -53,7 +53,7 @@ public class TagGroupController {
     }
 
     @RequestMapping(method = RequestMethod.PUT)
-    public APIResult<TagGroup> update(@Valid @RequestBody GroupDTO groupDTO) {
+    public APIResult<TagGroup> update(@RequestBody GroupDTO groupDTO) {
         return tagGroupService.update(groupDTO);
     }
 

+ 6 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/service/ProductService.java

@@ -161,4 +161,10 @@ public class ProductService {
 
         return packageAPIResult;
     }
+
+    public APIResult<List<Product>> findByPids(List<String> pidList) {
+        List<Product> productList = productRepository.findByPids(pidList);
+        return APIResult.ok(productList);
+    }
 }
+

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

@@ -87,6 +87,7 @@ public class DTOConverter {
         Product product = new Product();
         product.setId(course.getId());
         product.setPid(course.getId());
+        product.setCpId(course.getCpId());
         product.setCode(course.getCode());
         product.setName(course.getName());
         product.setType(ProductTypeEnum.COURSE);
@@ -100,6 +101,7 @@ public class DTOConverter {
         product.setCode(support.getCode());
         product.setName(support.getName());
         product.setType(ProductTypeEnum.SUPPORT);
+        product.setCpId(support.getCpId());
         product.setStatus(support.getStatus());
         return product;
     }

+ 2 - 0
rankin-task/src/main/java/cn/rankin/task/RankinTaskApplication.java

@@ -6,9 +6,11 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 @EnableFeignClients
 @EnableDiscoveryClient
+@EnableScheduling
 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
 public class RankinTaskApplication {
 

+ 6 - 0
rankin-task/src/main/java/cn/rankin/task/code/TaskAPICode.java

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

+ 40 - 0
rankin-task/src/main/java/cn/rankin/task/configuration/FeignConfiguration.java

@@ -0,0 +1,40 @@
+package cn.rankin.task.configuration;
+
+import cn.rankin.common.utils.constant.Constant;
+import cn.rankin.common.utils.util.UUIDUtil;
+import feign.Logger;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Slf4j
+@Configuration
+public class FeignConfiguration {
+
+    public static class FeignHeaderInterceptor implements RequestInterceptor {
+        // 设置公共头参数
+        @Override
+        public void apply(RequestTemplate requestTemplate) {
+            requestTemplate.header("bizCode", Constant.BIZ_CODE);
+            requestTemplate.header("requestId", UUIDUtil.getUUID());
+            requestTemplate.header("appCode", Constant.APP_CODE);
+            requestTemplate.header("platform", "3");
+            requestTemplate.header("os", "0");
+            requestTemplate.header("dist", "1112");
+            requestTemplate.header("terminal", "mobile");
+            requestTemplate.header("Content-Type", "application/json");
+            requestTemplate.header("userIp", "0.0.0.0");
+            requestTemplate.header("appVer", "6.1.1");
+            log.info("run header interceptor");
+        }
+    }
+
+    @Bean
+    public Logger.Level feignLoggerLevel() {
+
+        return Logger.Level.HEADERS;
+
+    }
+}

+ 25 - 0
rankin-task/src/main/java/cn/rankin/task/service/AuthService.java

@@ -0,0 +1,25 @@
+package cn.rankin.task.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.task.code.TaskAPICode;
+import cn.rankin.data.api.auth.dto.AuthDTO;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@FeignClient(name = "auth-service", url = "${remote.auth.url}", fallback = AuthService.AuthServiceHystrix.class)
+public interface AuthService {
+
+    @RequestMapping(value = "/acenter/v1/auth", method = RequestMethod.POST)
+    APIResult add(AuthDTO authDTO);
+
+    @Component
+    class AuthServiceHystrix implements AuthService {
+
+        @Override
+        public APIResult add(AuthDTO authDTO) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+    }
+}

+ 46 - 0
rankin-task/src/main/java/cn/rankin/task/service/ProductService.java

@@ -0,0 +1,46 @@
+package cn.rankin.task.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.product.vo.GoodsVo;
+import cn.rankin.data.api.product.vo.ProductVo;
+import cn.rankin.task.code.TaskAPICode;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(name = "${service.product.name}")
+public interface ProductService {
+
+    @RequestMapping(value = "/goods/ids", method = RequestMethod.GET)
+    APIResult<List<GoodsVo>> findGoodsByIds(@RequestParam("id") List<String> goodsIdList);
+
+    @RequestMapping(value = "/product/ids", method = RequestMethod.GET)
+    APIResult<List<ProductVo>> findProductByIds(@RequestParam("id") List<String> pidList);
+
+    @RequestMapping(value = "/product/{productId}", method = RequestMethod.GET)
+    APIResult findProductById(@PathVariable("productId") String productId);
+
+    @Component
+    class ProductServiceHystrix implements ProductService {
+
+        @Override
+        public APIResult findGoodsByIds(List<String> goodsIdList) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+
+        @Override
+        public APIResult findProductByIds(List<String> pidList) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+
+        @Override
+        public APIResult findProductById(String productId) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+    }
+}

+ 40 - 0
rankin-task/src/main/java/cn/rankin/task/service/TradeService.java

@@ -0,0 +1,40 @@
+package cn.rankin.task.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.enums.OrderStatusEnum;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.task.code.TaskAPICode;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(name = "${service.trade.name}", fallback = TradeService.TradeServiceHystrix.class)
+public interface TradeService {
+
+    @RequestMapping(value = "/order/pay/list", method = RequestMethod.GET)
+    APIResult<List<UserOrder>> findPayList(@RequestParam("limit") Integer limit);
+
+    @RequestMapping(value = "/order/pay/{orderId}", method = RequestMethod.POST)
+    APIResult<Boolean> complete(@PathVariable("orderId") String orderId, @RequestParam("status") OrderStatusEnum status);
+
+    @Component
+    class TradeServiceHystrix implements TradeService {
+
+        @Override
+        public APIResult findPayList(Integer limit) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+
+        @Override
+        public APIResult complete(String orderId, OrderStatusEnum status) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+
+    }
+}
+

+ 38 - 0
rankin-task/src/main/java/cn/rankin/task/service/UserService.java

@@ -0,0 +1,38 @@
+package cn.rankin.task.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.user.vo.CampusVo;
+import cn.rankin.data.api.user.vo.TerminalUserVo;
+import cn.rankin.task.code.TaskAPICode;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(name = "${service.user.name}", fallback = UserService.UserServiceHystrix.class)
+public interface UserService {
+
+    @RequestMapping(value = "/user/ids", method = RequestMethod.GET)
+    APIResult<List<TerminalUserVo>> findUserByIds(@RequestParam("id") List<String> userIdList);
+
+    @RequestMapping(value = "/campus/ids", method = RequestMethod.GET)
+    APIResult<Map<String, CampusVo>> findCampusByIds(@RequestParam("id") List<String> campusIdList);
+
+    @Component
+    class UserServiceHystrix implements UserService {
+
+        @Override
+        public APIResult findUserByIds(List<String> userIdList) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+
+        @Override
+        public APIResult findCampusByIds(List<String> campusIdList) {
+            return APIResult.error(TaskAPICode.SERVER_ERROR);
+        }
+    }
+}

+ 192 - 0
rankin-task/src/main/java/cn/rankin/task/task/order/OrderCompleteTask.java

@@ -0,0 +1,192 @@
+package cn.rankin.task.task.order;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.constant.Constant;
+import cn.rankin.common.utils.enums.OrderStatusEnum;
+import cn.rankin.common.utils.enums.ProductTypeEnum;
+import cn.rankin.data.api.product.vo.GoodsVo;
+import cn.rankin.data.api.product.vo.PackageVo;
+import cn.rankin.data.api.product.vo.ProductVo;
+import cn.rankin.data.api.trade.entity.OrderGoods;
+import cn.rankin.data.api.trade.entity.ProductSoldSnapshot;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.data.api.user.vo.CampusVo;
+import cn.rankin.data.api.user.vo.TerminalUserVo;
+import cn.rankin.task.service.ProductService;
+import cn.rankin.task.service.TradeService;
+import cn.rankin.task.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class OrderCompleteTask {
+
+    public final static long ONE_MINUTE = 10 * 1000;
+
+    public final static Integer SIZE = 100;
+
+    @Autowired
+    private TradeService tradeService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private ProductService productService;
+
+    @Scheduled(fixedDelay = ONE_MINUTE)
+    public void run() {
+        // 查询订单
+        APIResult<List<UserOrder>> orderListResult = tradeService.findPayList(SIZE);
+        if (!orderListResult.getSuccess()) {
+            log.error("get order list error: {}", orderListResult.getMessage());
+            return;
+        }
+
+        List<UserOrder> userOrderList = orderListResult.getData();
+        if (CollectionUtils.isEmpty(userOrderList)) {
+            log.info("order list empty, return");
+            return;
+        }
+
+        //取预加载信息所需信息
+        List<String> userIdList = new ArrayList<>();
+        for (UserOrder userOrder : userOrderList) {
+            String userId = userOrder.getUid();
+            if (!userIdList.contains(userId)) {
+                userIdList.add(userId);
+            }
+        }
+
+        // 加载用户信息
+        List<TerminalUserVo> terminalUserVoList = loadUser(userIdList);
+        if (CollectionUtils.isEmpty(terminalUserVoList)) {
+            return;
+        }
+
+        List<String> campusIdList = new ArrayList<>();
+        Map<String, TerminalUserVo> terminalUserVoMap = new HashMap<>();
+        for (TerminalUserVo terminalUserVo : terminalUserVoList) {
+            String userId = terminalUserVo.getId();
+            String campusId = terminalUserVo.getCampusId();
+            if (!campusIdList.contains(campusId)) {
+                campusIdList.add(campusId);
+            }
+            terminalUserVoMap.put(userId, terminalUserVo);
+        }
+
+        // 加载校区信息
+        Map<String, CampusVo> campusVoMap = loadCampus(campusIdList);
+        if (CollectionUtils.isEmpty(campusVoMap)) {
+            return;
+        }
+
+        // 逐单处理
+        for (UserOrder userOrder : userOrderList) {
+            String orderId = userOrder.getId();
+            APIResult<Boolean> orderChangeResult = tradeService.complete(orderId, OrderStatusEnum.COMPLETE);
+            if (!orderChangeResult.getSuccess()) {
+                log.error("order complete status error, orderId={}", orderId);
+                continue;
+            }
+
+
+        }
+    }
+
+    public List<ProductSoldSnapshot> toSnaptshots(UserOrder userOrder, TerminalUserVo terminalUserVo, CampusVo campusVo) {
+        List<ProductSoldSnapshot> snapshotList = new ArrayList<>();
+        String orderId = userOrder.getId();
+        String userId = userOrder.getUid();
+        String userName = terminalUserVo.getName();
+        String userCode = terminalUserVo.getCode();
+        String campusId = campusVo.getId();
+        String campusCode = campusVo.getCode();
+        String campusName = campusVo.getName();
+
+        List<String> goodsIdList = new ArrayList<>();
+        List<String> productIdList = new ArrayList<>();
+        List<OrderGoods> orderGoodsList = userOrder.getGoods();
+
+        for (OrderGoods orderGoods : orderGoodsList) {
+            ProductTypeEnum type = orderGoods.getType();
+            String goodsId = orderGoods.getGoodsId();
+            String productId = orderGoods.getPid();
+            if (!goodsIdList.contains(goodsId)) {
+                goodsIdList.add(goodsId);
+            }
+            if(!productIdList.contains(productId)) {
+                productIdList.add(productId);
+            }
+            if (type.equals(ProductTypeEnum.PACKAGE)) {
+                APIResult<PackageVo> apiResult = productService.findProductById(productId);
+            }
+        }
+        return null;
+
+    }
+
+    public List<TerminalUserVo> loadUser(List<String> userIdList) {
+        APIResult<List<TerminalUserVo>> apiResult = userService.findUserByIds(userIdList);
+        if (!apiResult.getSuccess()) {
+            log.error("load user error, {}", apiResult.getMessage());
+            return null;
+        }
+
+        List<TerminalUserVo> terminalUserVoList = apiResult.getData();
+        return terminalUserVoList;
+    }
+
+    public Map<String, CampusVo> loadCampus(List<String> campusIdList) {
+        APIResult<Map<String, CampusVo>> apiResult = userService.findCampusByIds(campusIdList);
+        if (!apiResult.getSuccess()) {
+            log.error("load campus error, {}", apiResult.getMessage());
+            return null;
+        }
+        return apiResult.getData();
+    }
+
+    public Map<String, ProductVo> loadProduct(List<String> productIdList) {
+        APIResult<List<ProductVo>> apiResult = productService.findProductByIds(productIdList);
+        if (!apiResult.getSuccess()) {
+            log.error("load product error, {}", apiResult.getMessage());
+            return null;
+        }
+
+        List<ProductVo> productVoList = apiResult.getData();
+        Map<String, ProductVo> productVoMap = new HashMap<>();
+        for (ProductVo productVo : productVoList) {
+            String pid = productVo.getPid();
+            productVoMap.put(pid, productVo);
+        }
+
+        return productVoMap;
+    }
+
+    public Map<String, GoodsVo> loadGoods(List<String> goodsIdList) {
+        APIResult<List<GoodsVo>> apiResult = productService.findGoodsByIds(goodsIdList);
+        if (!apiResult.getSuccess()) {
+            log.error("load goods error, {}", apiResult.getMessage());
+            return null;
+        }
+
+        List<GoodsVo> goodsVoList = apiResult.getData();
+        Map<String, GoodsVo> goodsVoMap = new HashMap<>();
+        for (GoodsVo goodsVo : goodsVoList) {
+            String goodsId = goodsVo.getId();
+            goodsVoMap.put(goodsId, goodsVo);
+        }
+
+        return goodsVoMap;
+    }
+}
+

+ 47 - 0
rankin-task/src/main/java/cn/rankin/task/task/order/OrderSplitTask.java

@@ -0,0 +1,47 @@
+package cn.rankin.task.task.order;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.data.api.trade.entity.UserOrderSplit;
+import cn.rankin.task.service.TradeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Slf4j
+@Component
+public class OrderSplitTask {
+
+    public final static long ONE_MINUTE = 10 * 1000;
+
+    public final static Integer SIZE = 100;
+
+    @Autowired
+    private TradeService tradeService;
+
+    @Scheduled(fixedDelay = ONE_MINUTE)
+    public void run() {
+        List<UserOrder> userOrderList = loadOrder(SIZE);
+
+    }
+
+    // 取订单
+    public List<UserOrder> loadOrder(Integer limit) {
+        APIResult<List<UserOrder>> apiResult = tradeService.findPayList(limit);
+        if (!apiResult.getSuccess()) {
+            log.error("load order error: %s", apiResult.getMessage());
+            return null;
+        }
+        return apiResult.getData();
+    }
+
+    // 分拆
+    public List<UserOrderSplit> splitOrder(List<UserOrder> userOrderList) {
+        return null;
+    }
+
+    // 保存
+}

+ 0 - 0
rankin-task/src/main/resources/application.properties


+ 17 - 0
rankin-task/src/main/resources/bootstrap.yml

@@ -0,0 +1,17 @@
+spring:
+  application:
+    name: rankin-task
+  cloud:
+    config:
+      uri: http://config.rankin.com:8921
+      label: master
+      profile: dev
+
+feign:
+  httpclient:
+    enabled: true
+  hystrix:
+    enabled: false
+
+server:
+  port: 10100

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

@@ -18,7 +18,7 @@ import org.springframework.core.env.Environment;
  * @version 2016年7月26日
  */
 @Configuration
-@EntityScan(basePackages={"cn.rankin.data.api.trade.entity"})
+@EntityScan(basePackages={"cn.rankin.data.api.trade"})
 public class PersistConfiguration implements EnvironmentAware {
 	
 	// 日志记录器

+ 11 - 2
rankin-trade-service/src/main/java/cn/rankin/tradeservice/controller/OrderController.java

@@ -7,6 +7,7 @@ import cn.rankin.data.api.trade.dto.OrderSearchDTO;
 import cn.rankin.data.api.trade.dto.UserOrderDTO;
 import cn.rankin.data.api.trade.entity.UserOrder;
 import cn.rankin.tradeservice.service.OrderService;
+import com.sun.beans.editors.EnumEditor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.propertyeditors.CustomDateEditor;
 import org.springframework.web.bind.WebDataBinder;
@@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.List;
 
 @RestController
 @RequestMapping(value = "/order")
@@ -24,6 +26,7 @@ public class OrderController {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         dateFormat.setLenient(false);
         binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));   //true:允许输入空值,false:不能为空值
+        binder.registerCustomEditor(OrderStatusEnum.class, new EnumEditor(OrderStatusEnum.class));
     }
 
     @Autowired
@@ -46,12 +49,18 @@ public class OrderController {
     }
 
     @RequestMapping(value = "/pay/{orderId}", method = RequestMethod.POST)
-    public APIResult<Boolean> pay(@PathVariable("orderId") String orderId, @RequestParam("status") OrderStatusEnum status) {
-        return orderService.pay(orderId, status);
+    public APIResult<Boolean> pay(@PathVariable("orderId") String orderId) {
+        return orderService.pay(orderId, OrderStatusEnum.PAYOK);
     }
 
     @RequestMapping(value = "/pay/{orderId}", method = RequestMethod.DELETE)
     public APIResult<Boolean> cancel(@PathVariable("orderId") String orderId) {
         return orderService.cancel(orderId);
     }
+
+    // 内部task调用
+    @RequestMapping(value = "/pay/list", method = RequestMethod.GET)
+    public APIResult<List<UserOrder>> getPayList(@RequestParam("limit") Integer limit) {
+        return orderService.findPayList(limit);
+    }
 }

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

@@ -2,10 +2,14 @@ package cn.rankin.tradeservice.repository;
 
 import cn.rankin.common.utils.jpa.BasicJpaRepository;
 import cn.rankin.data.api.trade.entity.OrderGoods;
+import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
 
 public interface OrderGoodsRepository extends BasicJpaRepository<OrderGoods, String> {
 
     List<OrderGoods> findByOrderId(String orderId);
+
+    @Query(value = "select g from OrderGoods g where g.orderId in (?1)")
+    List<OrderGoods> findByOrderIds(List<String> orderIds);
 }

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

@@ -5,6 +5,8 @@ import cn.rankin.data.api.trade.entity.UserOrder;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
+import java.util.List;
+
 public interface OrderRepository extends BasicJpaRepository<UserOrder, String> {
 
     @Modifying(clearAutomatically = true)
@@ -26,4 +28,7 @@ public interface OrderRepository extends BasicJpaRepository<UserOrder, String> {
     @Modifying(clearAutomatically = true)
     @Query(value = "update UserOrder o set o.status = 2 where o.status = 0 and o.id = ?1")
     Integer cancel(String orderId);
+
+    @Query(value = "select * from user_order o where o.status in (1, 5) limit ?1", nativeQuery = true)
+    List<UserOrder> findPayList(Integer limit);
 }

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

@@ -31,4 +31,8 @@ public class OrderGoodsService {
     public List<OrderGoods> findByOrderId(String orderId) {
         return orderGoodsRepository.findByOrderId(orderId);
     }
+
+    public List<OrderGoods> findByOrderIds(List<String> orderIds) {
+        return orderGoodsRepository.findByOrderIds(orderIds);
+    }
 }

+ 35 - 4
rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderService.java

@@ -22,10 +22,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.List;
+import java.util.*;
 
 import static cn.rankin.tradeservice.utils.DTOConverter.convert;
 
@@ -89,6 +86,40 @@ public class OrderService {
         return APIResult.ok(userOrder);
     }
 
+    public APIResult<List<UserOrder>> findPayList(Integer limit) {
+        List<UserOrder> userOrderList = orderRepository.findPayList(limit);
+        if (CollectionUtils.isEmpty(userOrderList)) {
+            return APIResult.ok(userOrderList);
+        }
+
+        List<String> orderIdList = new ArrayList<>();
+        for (UserOrder userOrder : userOrderList) {
+            orderIdList.add(userOrder.getId());
+        }
+
+        List<OrderGoods> orderGoodsList = orderGoodsService.findByOrderIds(orderIdList);
+        Map<String, List<OrderGoods>> orderGoodsMap = new HashMap<>();
+        for (OrderGoods orderGoods : orderGoodsList) {
+            String orderId = orderGoods.getOrderId();
+            if (!orderGoodsMap.containsKey(orderId)) {
+                List<OrderGoods> tmpList = new ArrayList<>();
+                tmpList.add(orderGoods);
+                orderGoodsMap.put(orderId, tmpList);
+            }else {
+                List<OrderGoods> tmpList = orderGoodsMap.get(orderId);
+                tmpList.add(orderGoods);
+            }
+        }
+
+        for (UserOrder userOrder : userOrderList) {
+            String orderId = userOrder.getId();
+            List<OrderGoods> tmpList = orderGoodsMap.get(orderId);
+            userOrder.setGoods(tmpList);
+        }
+
+        return APIResult.ok(userOrderList);
+    }
+
     public APIResult<Page<UserOrder>> search(OrderSearchDTO searchDTO) {
         Specification<UserOrder> specification = new Specification<UserOrder>() {
             @Override

+ 29 - 0
rankin-trade-service/src/test/java/cn/rankin/tradeservice/repository/OrderRepositoryTest.java

@@ -0,0 +1,29 @@
+package cn.rankin.tradeservice.repository;
+
+import cn.rankin.data.api.trade.entity.UserOrder;
+import cn.rankin.tradeservice.TradeServiceApplication;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = TradeServiceApplication.class)
+public class OrderRepositoryTest {
+
+    @Autowired
+    private OrderRepository orderRepository;
+
+    @Test
+    public void findPayList() throws Exception {
+        List<UserOrder> userOrderList = orderRepository.findPayList(10);
+    }
+
+}

+ 28 - 6
rankin-user-service/pom.xml

@@ -72,12 +72,34 @@
 	</dependencyManagement>
 
 	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-			</plugin>
-		</plugins>
+        <plugins>
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <attach>true</attach>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.3</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>UTF-8</encoding>
+                    <showWarnings>true</showWarnings>
+                </configuration>
+            </plugin>
+        </plugins>
 	</build>
 
 

+ 1 - 1
rankin-user-service/src/main/java/cn/rankin/userservice/configuration/PersistConfiguration.java

@@ -26,7 +26,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
  * @version 2016年7月26日
  */
 @Configuration
-@EntityScan(basePackages={"cn.rankin.data.api.user.entity"})
+@EntityScan(basePackages={"cn.rankin.data.api.user"})
 public class PersistConfiguration implements EnvironmentAware {
 	
 	// 日志记录器