Browse Source

order detail api

huodongdong 7 years ago
parent
commit
4f2560e16a

+ 127 - 0
rankin-api-web/src/main/java/cn/rankin/apiweb/configuration/RedisCacheConfig.java

@@ -0,0 +1,127 @@
+package cn.rankin.apiweb.configuration;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.lang.reflect.Method;
+
+@Configuration
+@EnableCaching //加上这个注解是的支持缓存注解
+public class RedisCacheConfig extends CachingConfigurerSupport {
+
+    @Value("${spring.redis.host}")
+    private String host;
+
+    @Value("${spring.redis.port}")
+    private int port;
+
+    @Value("${spring.redis.timeout}")
+    private int timeout;
+
+    @Value("${spring.redis.database}")
+    private Integer database;
+
+    @Value("${spring.redis.password}")
+    private String password;
+
+
+    /**
+     * 连接redis的工厂类
+     *
+     * @return
+     */
+    @Bean
+    public JedisConnectionFactory jedisConnectionFactory() {
+        JedisConnectionFactory factory = new JedisConnectionFactory();
+        factory.setHostName(host);
+        factory.setPort(port);
+        factory.setTimeout(timeout);
+        factory.setPassword(password);
+        if (database != null) {
+            factory.setDatabase(database);
+        }
+        return factory;
+    }
+
+    /**
+     * 配置RedisTemplate
+     * 设置添加序列化器
+     * key 使用string序列化器
+     * value 使用Json序列化器
+     * 还有一种简答的设置方式,改变defaultSerializer对象的实现。
+     *
+     * @return
+     */
+    @Bean
+    public RedisTemplate<Object, Object> redisTemplate() {
+        //StringRedisTemplate的构造方法中默认设置了stringSerializer
+        RedisTemplate<Object, Object> template = new RedisTemplate<>();
+        //设置开启事务
+        template.setEnableTransactionSupport(true);
+        //set key serializer
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+        template.setKeySerializer(stringRedisSerializer);
+        template.setHashKeySerializer(stringRedisSerializer);
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+
+        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+
+        //set value serializer
+//        template.setDefaultSerializer(jackson2JsonRedisSerializer);
+        template.setValueSerializer(jackson2JsonRedisSerializer);
+        template.setHashValueSerializer(jackson2JsonRedisSerializer);
+
+        template.setConnectionFactory(jedisConnectionFactory());
+        template.afterPropertiesSet();
+        return template;
+    }
+
+    /**
+     * 设置RedisCacheManager
+     * 使用cache注解管理redis缓存
+     *
+     * @return
+     */
+    @Bean
+    public RedisCacheManager cacheManager() {
+        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
+        return redisCacheManager;
+    }
+
+    /**
+     * 自定义生成redis-key
+     *
+     * @return
+     */
+    @Override
+    public KeyGenerator keyGenerator() {
+        return new KeyGenerator() {
+            @Override
+            public Object generate(Object o, Method method, Object... objects) {
+                StringBuilder sb = new StringBuilder();
+                sb.append(o.getClass().getName()).append(".");
+                sb.append(method.getName()).append(".");
+                for (Object obj : objects) {
+                    sb.append(obj.toString());
+                }
+                System.out.println("keyGenerator=" + sb.toString());
+                return sb.toString();
+            }
+        };
+    }
+}

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

@@ -0,0 +1,7 @@
+package cn.rankin.apiweb.service.user;
+
+import org.springframework.cloud.netflix.feign.FeignClient;
+
+@FeignClient
+public interface UserClient {
+}

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

@@ -0,0 +1,7 @@
+package cn.rankin.apiweb.service.user;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserService {
+}

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

@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.propertyeditors.CustomDateEditor;
 import org.springframework.web.bind.ServletRequestDataBinder;
 import org.springframework.web.bind.annotation.*;
+import sun.misc.Request;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.SimpleDateFormat;
@@ -81,6 +82,11 @@ public class OrderController {
         return orderService.search(searchDTO);
     }
 
+    @RequestMapping(value = "/detail/{detailId}", method = RequestMethod.GET)
+    public APIResult<OrderDetailVo> getDetailOrder(@PathVariable("detailId") String detailId) {
+        return orderService.getDetailOrder(detailId);
+    }
+
     @RequestMapping(value = "/send/{detailId}", method = RequestMethod.POST)
     public APIResult<Boolean> send(@NeedUser UserDetails user, @PathVariable("detailId") String detailId) {
         if (user.isCp() || user.isPlatForm()) {

+ 4 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderClient.java

@@ -9,6 +9,7 @@ import cn.rankin.data.api.trade.dto.OrderSnapshotSearchDTO;
 import cn.rankin.data.api.trade.entity.Order;
 import cn.rankin.data.api.trade.entity.OrderDetail;
 import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
+import cn.rankin.data.api.trade.vo.OrderDetailVo;
 import org.springframework.cloud.netflix.feign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
@@ -39,6 +40,9 @@ public interface OrderClient {
     @RequestMapping(value = "/order/detail", method = RequestMethod.POST)
     APIResult<Page<OrderDetail>> searchDetail(@RequestBody OrderDetailSearchDTO searchDTO);
 
+    @RequestMapping(value = "/order/detail/{detailId}", method = RequestMethod.GET)
+    APIResult<OrderDetail> getDetailOrder(@PathVariable("detailId") String detailId);
+
     @RequestMapping(value = "/order/send/{detailId}", method = RequestMethod.POST)
     APIResult<Boolean> send(@PathVariable("detailId") String detailId);
 

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

@@ -3,6 +3,7 @@ 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.CampusService;
+import cn.rankin.cmsweb.service.user.MerchantService;
 import cn.rankin.cmsweb.service.user.TerminalUserService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.model.BaseCode;
@@ -13,6 +14,7 @@ import cn.rankin.common.utils.util.BeanUtil;
 import cn.rankin.data.api.cms.OrderDetailWebSearchDTO;
 import cn.rankin.data.api.cms.OrderSearchWebDTO;
 import cn.rankin.data.api.cms.OrderSnapshotWebSearchDTO;
+import cn.rankin.data.api.product.entity.Goods;
 import cn.rankin.data.api.product.vo.GoodsVo;
 import cn.rankin.data.api.trade.dto.OrderDTO;
 import cn.rankin.data.api.trade.dto.OrderDetailSearchDTO;
@@ -23,12 +25,14 @@ import cn.rankin.data.api.trade.entity.OrderGoods;
 import cn.rankin.data.api.trade.entity.Order;
 import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
 import cn.rankin.data.api.trade.vo.OrderDetailVo;
+import cn.rankin.data.api.trade.vo.OrderGoodsVo;
 import cn.rankin.data.api.trade.vo.OrderVo;
 import cn.rankin.data.api.user.dto.CampusSearchDTO;
 import cn.rankin.data.api.user.dto.PayDTO;
 import cn.rankin.data.api.user.vo.CampusVo;
 import cn.rankin.data.api.user.vo.TerminalUserVo;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -61,6 +65,9 @@ public class OrderService {
     @Autowired
     private PayingService payingService;
 
+    @Autowired
+    private MerchantService merchantService;
+
     // 支付
     public APIResult<Boolean> pay(String orderId) {
         APIResult<Order> userOrderAPIResult = orderClient.getOrder(orderId);
@@ -118,6 +125,46 @@ public class OrderService {
         return orderClient.receive(detailId);
     }
 
+    // 查询详单
+    public APIResult<OrderDetailVo> getDetailOrder(String detailId) {
+        APIResult<OrderDetail> orderAPIResult = orderClient.getDetailOrder(detailId);
+        if (!orderAPIResult.getSuccess()) {
+            return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
+        }
+
+        OrderDetail orderDetail = orderAPIResult.getData();
+        OrderDetailVo orderDetailVo = convert(orderDetail);
+
+        List<OrderGoods> orderGoodsList = orderDetail.getGoods();
+        if (CollectionUtils.isEmpty(orderGoodsList)) {
+            return APIResult.ok(orderDetailVo);
+        }
+
+        String uid = orderDetailVo.getUid();
+        APIResult<TerminalUserVo> userAPIResult = terminalUserService.getUser(uid);
+        TerminalUserVo terminalUserVo = userAPIResult.getData();
+
+        if (userAPIResult.getSuccess()) {
+            orderDetailVo.setMerchantId(terminalUserVo.getMerchantId());
+            orderDetailVo.setMerchantName(terminalUserVo.getMerchantName());
+            orderDetailVo.setUserCode(terminalUserVo.getCode());
+            orderDetailVo.setClassroomName(terminalUserVo.getName());
+        }
+
+        String campusId = terminalUserVo.getCampusId();
+        APIResult<CampusVo> campusAPIResult = campusService.getCampus(campusId);
+        CampusVo campusVo = campusAPIResult.getData();
+
+        if (campusVo != null) {
+            orderDetailVo.setProvinceCode(campusVo.getProvinceCode());
+            orderDetailVo.setCityName(campusVo.getCityName());
+            orderDetailVo.setZoneName(campusVo.getZoneName());
+        }
+
+        orderDetailVo.setGoods(this.toOrderGoodsVo(orderGoodsList));
+        return APIResult.ok(orderDetailVo);
+    }
+
     // 创建订单
     public APIResult<OrderVo> create(OrderDTO orderDTO) {
         String uid = orderDTO.getUid();
@@ -216,14 +263,43 @@ public class OrderService {
             orderVo.setZoneName(campusVo.getZoneName());
         }
 
+        orderVo.setGoods(this.toOrderGoodsVo(orderGoodsList));
+        return APIResult.ok(orderVo);
+    }
+
+    public List<OrderGoodsVo> toOrderGoodsVo(List<OrderGoods> orderGoodsList) {
         List<String> goodsIdList = new ArrayList<>();
         orderGoodsList.forEach(orderGoods -> goodsIdList.add(orderGoods.getGoodsId()));
         APIResult<List<GoodsVo>> goodsAPIResult = goodsService.findByIds(goodsIdList);
         if (!goodsAPIResult.getSuccess()) {
             log.error("goods api error: {}", goodsAPIResult.getMessage());
+            return null;
         }
-        orderVo.setGoods(goodsAPIResult.getData());
-        return APIResult.ok(orderVo);
+
+        List<GoodsVo> goodsVoList = goodsAPIResult.getData();
+        Map<String, GoodsVo> goodsVoMap = new HashMap<>();
+        for (GoodsVo goodsVo : goodsVoList) {
+            goodsVoMap.put(goodsVo.getId(), goodsVo);
+        }
+
+        List<OrderGoodsVo> orderGoodsVoList = new ArrayList<>();
+        for (OrderGoods orderGoods : orderGoodsList) {
+            String goodsId = orderGoods.getGoodsId();
+
+            OrderGoodsVo orderGoodsVo = new OrderGoodsVo();
+            BeanUtils.copyProperties(orderGoods, orderGoodsVo);
+
+            GoodsVo goodsVo = goodsVoMap.get(goodsId);
+            if (goodsVo == null) {
+                log.error("goods not exists, goodsId={}", goodsId);
+                continue;
+            }
+            BeanUtils.copyProperties(goodsVo, orderGoodsVo);
+            goodsVo.setId(orderGoods.getId());
+
+            orderGoodsVoList.add(orderGoodsVo);
+        }
+        return orderGoodsVoList;
     }
 
     public APIResult<Page<OrderVo>> search(OrderSearchWebDTO searchWebDTO) {

+ 3 - 1
rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/OrderDetailVo.java

@@ -50,6 +50,8 @@ public class OrderDetailVo implements Serializable {
 
     private String cpId;
 
+    private String cpName;
+
     private String userCode;
 
     private String provinceCode;
@@ -64,5 +66,5 @@ public class OrderDetailVo implements Serializable {
 
     private Date gmtModified;
 
-    private List<OrderGoods> goods;
+    private List<OrderGoodsVo> goods;
 }

+ 45 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/OrderGoodsVo.java

@@ -0,0 +1,45 @@
+package cn.rankin.data.api.trade.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;
+
+@Data
+@ToString
+public class OrderGoodsVo implements Serializable {
+
+    private String id;
+
+    private String goodsId;
+
+    private String pid;
+
+    private ProductTypeEnum type;
+
+    private String merchantId;
+
+    private String cpId;
+
+    private Integer duration;
+
+    private String chargeUnit;
+
+    private BigDecimal cpPrice;
+
+    private BigDecimal merchantPrice;
+
+    private BigDecimal terminalPrice;
+
+    private BaseStatusEnum status;
+
+    private String orderId;
+
+    private Integer quantity;
+
+    private String detailId;
+
+}

+ 1 - 1
rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/OrderVo.java

@@ -58,7 +58,7 @@ public class OrderVo implements Serializable {
 
     private Date gmtModified;
 
-    private List<GoodsVo> goods;
+    private List<OrderGoodsVo> goods;
 
     private List<OrderDetailVo> detailList;
 }

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

@@ -72,6 +72,12 @@ public class OrderController {
         return orderDetailService.search(searchDTO);
     }
 
+    // 查询分拆订单详细
+    @RequestMapping(value = "/detail/{detailId}", method = RequestMethod.GET)
+    public APIResult<OrderDetail> getDetailOrder(@PathVariable("detailId") String detailId) {
+        return orderDetailService.getOrder(detailId);
+    }
+
     // 查询交易快照
     @RequestMapping(value = "/snapshot", method = RequestMethod.POST)
     public APIResult<Page<OrderProductSnapshot>> search(@RequestBody OrderSnapshotSearchDTO searchDTO) {

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

@@ -94,7 +94,7 @@ public class OrderDetailService {
             return APIResult.error(TradeServiceAPICode.NOT_EXISTS);
         }
 
-        List<OrderGoods> orderGoodsList = orderGoodsRepository.findByOrderId(detailId);
+        List<OrderGoods> orderGoodsList = orderGoodsRepository.findByDetailId(detailId);
         orderDetail.setGoods(orderGoodsList);
         return APIResult.ok(orderDetail);
     }