Browse Source

Merge branch 'dev.3.0'

xuchaolang 6 years ago
parent
commit
027257e268

+ 30 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/controller/RecommendController.java

@@ -6,11 +6,14 @@ import cn.rankin.apiweb.service.product.ProductService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.data.api.app.vo.DeviceUserVo;
 import cn.rankin.data.api.app.vo.RecommendVo;
+import cn.rankin.data.api.product.entity.Poster;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 @RestController
@@ -29,4 +32,31 @@ public class RecommendController {
         String merchantId = user.getMerchantId();
         return productService.getRecommendCourses(merchantId);
     }
+
+    /**
+     * Get recommend posters
+      * @param user
+     * @return
+     */
+    @RequestMapping(value = "/posters", method = RequestMethod.GET)
+    public APIResult<Object> getPosters(@NeedUser DeviceUserVo user) {
+        if (user == null) {
+            return APIResult.error(ApiWebCode.NOT_EXISTS);
+        }
+
+        String merchantId = user.getMerchantId();
+
+        //productService.getRecommendCourses(merchantId);
+
+        List<Poster> posters = productService.getPosters(merchantId);
+        if (null == posters){
+            posters = new ArrayList<>();
+        }
+
+        HashMap<String, Object> data = new HashMap<String, Object>();
+        data.put("num", posters.size());
+        data.put("recs",posters);
+
+        return APIResult.ok(data);
+    }
 }

+ 37 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/controller/UserController.java

@@ -12,6 +12,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @RestController
 @RequestMapping(value = "/user")
 public class UserController {
@@ -30,4 +35,36 @@ public class UserController {
         return APIResult.ok(userInfoVo);
     }
 
+    @RequestMapping(value="/product/valid", method = RequestMethod.GET)
+    public APIResult getProductValid(@NeedUser DeviceUserVo user) {
+        String uid = user.getUid();
+        if (StringUtils.isEmpty(uid)) {
+            return APIResult.error(ApiWebCode.NOT_EXISTS);
+        }
+
+        List<Map<String, Object>> products =  userService.getProductValid(uid);
+
+        if (null == products){
+            products = new ArrayList<>();
+        }
+
+        List<Map<String, Object> > recs = new ArrayList<>();
+
+        for(Map<String, Object> item : products){
+            Map<String, Object> rec = new HashMap<>();
+            rec.put("id", item.get("pid"));
+            rec.put("title", item.get("name"));
+            rec.put("beginTime", item.get("beginTime"));
+            rec.put("endTime", item.get("endTime"));
+
+            recs.add(rec);
+        }
+
+        HashMap<String, Object> data = new HashMap<String, Object>();
+        data.put("totalNum", recs.size());
+        data.put("recs", recs);
+
+        return APIResult.ok(data);
+    }
+
 }

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

@@ -11,9 +11,11 @@ import cn.rankin.data.api.product.vo.CourseItemVo;
 import cn.rankin.data.api.product.vo.SupportItemVo;
 import cn.rankin.data.api.product.vo.TrainingItemVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @FeignClient(name = "${service.product.name}")
@@ -55,6 +57,12 @@ public interface ProductClient {
     @RequestMapping(value = "/goods/{goodsId}", method = RequestMethod.GET)
     APIResult<Goods> findGoods(@PathVariable("goodsId") String goodsId);
 
+    @RequestMapping(value = "/{merchantId}/posters", method = RequestMethod.GET)
+    List<Poster> getPosters(@PathVariable("merchantId") String merchantId, @RequestParam("start") Long start,
+                                   @RequestParam("offset") Integer offset, @RequestParam("sortKey") String sortKey,
+                                   @RequestParam("direction") Sort.Direction direction);
+
+
     @Component
     class ProductClientHystrix implements ProductClient {
 
@@ -117,5 +125,12 @@ public interface ProductClient {
         public APIResult<Goods> findGoods(String goodsId) {
             return APIResult.error(ApiWebCode.SERVER_ERROR);
         }
+
+        public List<Poster> getPosters(String merchantId, Long start,
+                                Integer offset, String sortKey, Sort.Direction direction){
+            return new ArrayList<>();
+        }
+
+
     }
 }

+ 5 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/service/product/ProductService.java

@@ -12,6 +12,7 @@ import cn.rankin.data.api.product.vo.CourseItemVo;
 import cn.rankin.data.api.product.vo.SupportItemVo;
 import cn.rankin.data.api.product.vo.TrainingItemVo;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -101,4 +102,8 @@ public class ProductService {
         return APIResult.error(ApiWebCode.ACCESS_DENIED);
     }
 
+    public List<Poster> getPosters(String merchantId){
+        return productClient.getPosters(merchantId, 0L, 10, "sort", Sort.Direction.ASC);
+    }
+
 }

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

@@ -7,9 +7,14 @@ import cn.rankin.data.api.user.vo.TerminalDeviceVo;
 import cn.rankin.data.api.user.vo.TerminalUserVo;
 import cn.rankin.data.api.user.vo.WhiteUserVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 @FeignClient(name = "${service.user.name}", fallback = UserClient.UserServiceHystrix.class)
 public interface UserClient {
 
@@ -34,6 +39,11 @@ public interface UserClient {
     @RequestMapping(value = "/white/user/{userId}", method = RequestMethod.GET)
     APIResult<WhiteUserVo> findWhiteUserById(@PathVariable("userId") String userId);
 
+    @RequestMapping(value = "/user/{uid}/product/valid", method = RequestMethod.GET)
+    List<Map<String, Object>> getProductValid(@PathVariable("uid") String uid, @RequestParam("start") Long start,
+                                              @RequestParam("offset") Integer offset, @RequestParam("sortKey") String sortKey,
+                                              @RequestParam("direction") Sort.Direction direction);
+
     @Component
     class UserServiceHystrix implements UserClient {
 
@@ -71,5 +81,11 @@ public interface UserClient {
         public APIResult<WhiteUserVo> findWhiteUserById(String userId) {
             return APIResult.error(ApiWebCode.SERVER_ERROR);
         }
+
+        @Override
+        public List<Map<String, Object>> getProductValid(String uid, Long start,
+                                             Integer offset, String sortKey, Sort.Direction direction){
+            return new ArrayList<>();
+        }
     }
 }

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

@@ -18,9 +18,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 
 @Service
@@ -248,4 +251,8 @@ public class UserService {
         deviceUserVo.setExpireAt(expireAt);
         deviceUserVo.setRefreshAt(nowTime);
     }
+
+    public List<Map<String, Object>> getProductValid(String uid){
+        return userClient.getProductValid(uid, 0L, 50, "endTime", Sort.Direction.ASC);
+    }
 }

+ 5 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/utils/RequestHeaderManager.java

@@ -34,10 +34,15 @@ public class RequestHeaderManager {
      */
     public static String getRequestParameter(HttpServletRequest request, String key){
         //first check header
+        /*
         if (null != request.getHeader(key)){
             return request.getHeader(key);
         }
         return request.getParameter(key);
+        */
+
+        //use Header directly
+        return request.getHeader(key);
     }
 
 

+ 43 - 0
rankin-common-utils/src/main/java/cn/rankin/common/utils/Proxy/ProxyWrapper.java

@@ -0,0 +1,43 @@
+package cn.rankin.common.utils.Proxy;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+
+
+class ProxyWrapper implements InvocationHandler {
+    //被代理类的对象
+    private Object target;
+
+    //绑定被代理对象
+    public Object bind(Object target){
+        this.target = target;
+        //返回实现了被代理类所实现的所有接口的Object对象,即动态代理,需要强制转型
+        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
+                target.getClass().getInterfaces(), this);
+    }
+
+    //日志记录方法
+    private void log(String method){
+        return;
+    }
+
+    /**
+     * <p>Discription:覆盖InvocationHandler接口中的invoke()方法</p>
+     * @param proxy 需要代理的对象
+     * @param method 真实主体要调用的执行方法
+     * @param args 调用方法时传递的参数
+     * @return
+     * @throws Throwable
+     * @author       : lcma
+     * @update       : 2016年10月9日下午2:46:29
+     */
+    @Override
+    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+        //使用反射中的invoke()对方法进行动态调用
+        Object obj = method.invoke(this.target, args);
+        return obj;
+    }
+
+}
+

+ 56 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/Poster.java

@@ -0,0 +1,56 @@
+package cn.rankin.data.api.product.entity;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+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 = "p_posters")
+@DynamicInsert
+@DynamicUpdate
+public class Poster implements Serializable {
+    /**
+     * 推荐
+     */
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    private String id;
+
+    @Column(name = "merchant_id")
+    private String merchantId;
+
+    @Column
+    private String pid;
+
+    @Column
+    private Integer img;
+
+    @Column
+    private Integer sort;
+
+    @Enumerated(EnumType.ORDINAL)
+    private ProductTypeEnum type;
+
+    @Enumerated(EnumType.ORDINAL)
+    private BaseStatusEnum status;
+
+    @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtCreated;
+
+    @Column(name = "gmt_modified", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date gmtModified;
+
+}
+

+ 4 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/product/entity/Support.java

@@ -67,6 +67,10 @@ public class Support implements Serializable {
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtModified;
 
+    //QR code
+    @Column(name = "shop_qr")
+    private String shopQR;
+
     @Transient
     private List<Support> supportList;
 }

+ 41 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/controller/MerchantController.java

@@ -0,0 +1,41 @@
+package cn.rankin.productservice.controller;
+
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.data.api.product.entity.Poster;
+import cn.rankin.productservice.repository.PosterRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/merchant")
+@Slf4j
+public class MerchantController {
+
+    @Autowired
+    private PosterRepository posterRepo;
+
+    @RequestMapping(value = "/{merchantId}/posters", method = RequestMethod.GET)
+    public List<Poster> getPosters(@PathVariable("merchantId") String merchantId, @RequestParam("start") Long start,
+                                         @RequestParam("offset") Integer offset, @RequestParam("sortKey") String sortKey,
+                                         @RequestParam("direction") Sort.Direction direction) {
+
+        //get posters
+        Poster findSample = new Poster();
+        findSample.setMerchantId(merchantId);
+        findSample.setStatus(BaseStatusEnum.NORMAL);
+
+        List<Poster> posters = posterRepo.find(findSample, start, offset, new Sort(direction, sortKey));
+
+        if (null == posters){
+            posters = new ArrayList<Poster>();
+        }
+        log.info("Find Posters, len={}", posters.size());
+        return posters;
+    }
+}
+

+ 74 - 4
rankin-product-service/src/main/java/cn/rankin/productservice/controller/auth/AuthController.java

@@ -1,21 +1,42 @@
 package cn.rankin.productservice.controller.auth;
 
 import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.constant.Constant;
+import cn.rankin.common.utils.util.BeanUtil;
 import cn.rankin.data.api.auth.dto.InnerAuthDTO;
 import cn.rankin.data.api.auth.vo.AuthResult;
+import cn.rankin.data.api.auth.vo.AuthVo;
+import cn.rankin.data.api.product.entity.Product;
+import cn.rankin.productservice.repository.ProductRepository;
+import cn.rankin.productservice.service.ProductService;
+import cn.rankin.productservice.service.auth.AuthClient;
 import cn.rankin.productservice.service.auth.AuthService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.data.domain.Sort;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @RestController
+@Slf4j
 public class AuthController {
 
     @Autowired
     private AuthService authService;
 
+    @Autowired
+    private AuthClient authClient;
+
+    @Autowired
+    private ProductRepository productRepository;
+
+    @Autowired
+    private ProductService  productService;
+
     @RequestMapping(value = "/auth", method = RequestMethod.POST)
     public APIResult<AuthResult> auth(@RequestBody InnerAuthDTO authDTO) {
         String userId = authDTO.getUserId();
@@ -23,4 +44,53 @@ public class AuthController {
         String merchantId = authDTO.getMerchantId();
         return authService.auth(userId, merchantId, itemId);
     }
+
+    @RequestMapping(value = "/user/{uid}/product/valid", method = RequestMethod.GET)
+    public List<Map<String, Object>> getProductValid(@PathVariable("uid") String uid, @RequestParam("start") Long start,
+                                                     @RequestParam("offset") Integer offset, @RequestParam("sortKey") String sortKey,
+                                                     @RequestParam("direction") Sort.Direction direction){
+
+        List<AuthVo> authItems =  authClient.getUserValidProduct(uid, Constant.BIZ_CODE).getData();
+        if (null == authItems){
+            authItems = new ArrayList<>();
+        }
+
+        ArrayList<String> pids = new ArrayList<>();
+
+        HashMap<String, AuthVo> authMap = new HashMap<>();
+        for (AuthVo item: authItems ) {
+            if(null == item.getPid()) {
+                log.error("Pid-Is-Null, uid={}", uid);
+                continue;
+            }
+            pids.add(item.getPid());
+            authMap.put(item.getPid(), item);
+        }
+
+        List<Product> products = productRepository.findByPids(pids);
+
+        //assemble result
+        List< Map<String, Object> > result = new ArrayList<>();
+        for(Product product : products){
+
+            String pid = product.getPid();
+            if (!authMap.containsKey(pid)){
+                log.error("pid Not Exist in authMap, pid={}", pid);
+                continue;
+            }
+
+            AuthVo authInfo = authMap.get(pid);
+
+            Map<String, Object> rec = BeanUtil.convertToMap(product, true);
+
+            rec.put("beginTime", authInfo.getStartTime());
+            rec.put("endTime", authInfo.getEndTime());
+
+            result.add(rec);
+
+        }
+
+        return result;
+    }
+
 }

+ 9 - 0
rankin-product-service/src/main/java/cn/rankin/productservice/repository/PosterRepository.java

@@ -0,0 +1,9 @@
+package cn.rankin.productservice.repository;
+
+import cn.rankin.common.utils.jpa.BasicJpaRepository;
+import cn.rankin.data.api.product.entity.Poster;
+
+public interface PosterRepository extends BasicJpaRepository<Poster, String> {
+
+}
+

+ 4 - 3
rankin-product-service/src/main/java/cn/rankin/productservice/service/auth/AuthClient.java

@@ -4,9 +4,7 @@ import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.data.api.auth.dto.AuthQueryDTO;
 import cn.rankin.data.api.auth.vo.AuthVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -16,6 +14,9 @@ public interface AuthClient {
     @RequestMapping(value = "/acenter/v1/auth/list", method = RequestMethod.POST, consumes = "application/json")
     APIResult<List<AuthVo>> auth(@RequestBody AuthQueryDTO authQueryDTO);
 
+    @RequestMapping(value = "/acenter/v1/auth/uid/{uid}", method = RequestMethod.GET, consumes = "application/json")
+    APIResult<List<AuthVo>> getUserValidProduct(@PathVariable("uid") String uid, @RequestParam("bizCode") String bizCode);
+
 //    @Component
 //    class AuthServiceHystrix implements AuthClient {
 //

+ 5 - 4
rankin-user-service/src/main/java/cn/rankin/userservice/controller/TerminalUserController.java

@@ -2,17 +2,17 @@ package cn.rankin.userservice.controller;
 
 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.enums.BaseStatusEnum;
+import cn.rankin.common.utils.util.HttpUtil;
 import cn.rankin.common.utils.util.ProvinceUtil;
 import cn.rankin.data.api.user.dto.TerminalUserDTO;
 import cn.rankin.data.api.user.dto.TerminalUserSearchDTO;
-import cn.rankin.common.utils.enums.BaseOrderEnum;
-import cn.rankin.common.utils.util.HttpUtil;
-import cn.rankin.userservice.code.UserServiceAPICode;
-import cn.rankin.userservice.dto.RemoteUser;
 import cn.rankin.data.api.user.entity.Campus;
 import cn.rankin.data.api.user.entity.Merchant;
 import cn.rankin.data.api.user.entity.TerminalUser;
+import cn.rankin.userservice.code.UserServiceAPICode;
+import cn.rankin.userservice.dto.RemoteUser;
 import cn.rankin.userservice.proxy.RemoteUserProxy;
 import cn.rankin.userservice.service.CampusService;
 import cn.rankin.userservice.service.MerchantService;
@@ -241,6 +241,7 @@ public class TerminalUserController {
         return terminalUserService.delete(id);
     }
 
+
     public static void setUserInfo(TerminalUser terminalUser, Campus campus, Merchant merchant) {
         if (terminalUser == null) {
             return;