Преглед на файлове

add oderdetail and snapshot search api

huodongdong преди 7 години
родител
ревизия
049d6eb4c8
променени са 29 файла, в които са добавени 848 реда и са изтрити 157 реда
  1. 49 0
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/GlobalExceptionHandler.java
  2. 41 4
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/trade/OrderController.java
  3. 10 1
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderServiceFeign.java
  4. 243 105
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/service/trade/order/OrderService.java
  5. 12 5
      rankin-cms-web/src/main/java/cn/rankin/cmsweb/utils/DTOConverter.java
  6. 1 1
      rankin-cms-web/src/test/java/cn/rankin/cmsweb/service/trade/order/OrderServiceFeignTest.java
  7. 31 0
      rankin-data-api/src/main/java/cn/rankin/data/api/cms/OrderDetailWebSearchDTO.java
  8. 2 0
      rankin-data-api/src/main/java/cn/rankin/data/api/cms/OrderSearchWebDTO.java
  9. 41 0
      rankin-data-api/src/main/java/cn/rankin/data/api/cms/OrderSnapshotWebSearchDTO.java
  10. 2 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderDTO.java
  11. 28 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderDetailSearchDTO.java
  12. 2 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderSearchDTO.java
  13. 41 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderSnapshotSearchDTO.java
  14. 3 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/Order.java
  15. 3 0
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/OrderDetail.java
  16. 26 9
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/UserOrderVo.java
  17. 14 3
      rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/UserOrderVo.java
  18. 0 9
      rankin-task/src/main/java/cn/rankin/task/task/order/OrderCompleteTask.java
  19. 1 0
      rankin-task/src/main/java/cn/rankin/task/task/order/OrderSplitTask.java
  20. 36 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/controller/OrderController.java
  21. 7 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderDetailRepository.java
  22. 2 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/OrderGoodsRepository.java
  23. 1 1
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/repository/ProductSoldSnapshotRepository.java
  24. 110 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderDetailService.java
  25. 0 4
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderGoodsService.java
  26. 134 0
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderProductSnapshotService.java
  27. 7 1
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderService.java
  28. 0 13
      rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/ProductSoldSnapshotService.java
  29. 1 1
      rankin-user-service/src/main/java/cn/rankin/userservice/controller/CampusController.java

+ 49 - 0
rankin-cms-web/src/main/java/cn/rankin/cmsweb/configuration/GlobalExceptionHandler.java

@@ -0,0 +1,49 @@
+package cn.rankin.cmsweb.configuration;
+
+import cn.rankin.common.utils.api.model.APICode;
+import cn.rankin.common.utils.api.model.APIResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+import javax.servlet.http.HttpServletRequest;
+import java.nio.file.AccessDeniedException;
+
+@RestController
+@ControllerAdvice
+public class GlobalExceptionHandler {
+    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+    /**
+     * 系统异常处理,比如:404,500
+     * @param request
+     * @param e
+     * @return
+     * @throws Exception
+     */
+    @ExceptionHandler(value = Exception.class)
+    @ResponseBody
+    public APIResult defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception {
+        logger.error("{}", e);
+
+        APIResult apiResult = new APIResult();
+        apiResult.setMessage(e.getMessage());
+        apiResult.setSuccess(false);
+
+        if (e instanceof NoHandlerFoundException) {
+            apiResult.setCode(APICode._C_NOT_FOUND);
+        }else if (e instanceof AccessDeniedException){
+            apiResult.setCode(APICode._C_ACCESS_DENIED);
+        }else if (e instanceof MethodArgumentTypeMismatchException){
+            apiResult.setCode(400);
+        }else {
+            apiResult.setCode(500);
+        }
+        return apiResult;
+    }
+}

+ 41 - 4
rankin-cms-web/src/main/java/cn/rankin/cmsweb/controller/trade/OrderController.java

@@ -1,33 +1,54 @@
 package cn.rankin.cmsweb.controller.trade;
 
+import cn.rankin.cmsweb.assist.resolver.NeedUser;
+import cn.rankin.cmsweb.entity.UserDetails;
 import cn.rankin.cmsweb.service.trade.order.OrderService;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
+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.trade.dto.OrderDTO;
-import cn.rankin.data.api.trade.vo.UserOrderVo;
+import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
+import cn.rankin.data.api.trade.vo.OrderDetailVo;
+import cn.rankin.data.api.trade.vo.OrderVo;
 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 javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 @RestController
 @RequestMapping(value = "/order")
 public class OrderController {
 
+    @InitBinder
+    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
+        binder.registerCustomEditor(Date.class,
+                new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));
+    }
+
     @Autowired
     private OrderService orderService;
 
     @RequestMapping(method = RequestMethod.POST)
-    public APIResult<UserOrderVo> create(@RequestBody OrderDTO orderDTO) {
+    public APIResult<OrderVo> create(@RequestBody OrderDTO orderDTO) {
         return orderService.create(orderDTO);
     }
 
     @RequestMapping(value = "/{orderId}", method = RequestMethod.GET)
-    public APIResult<UserOrderVo> getOrder(@PathVariable String orderId) {
+    public APIResult<OrderVo> getOrder(@PathVariable String orderId) {
         return orderService.getOrder(orderId);
     }
 
     @RequestMapping(value = {"/list", ""}, method = RequestMethod.GET)
-    public APIResult<Page<UserOrderVo>> search(OrderSearchWebDTO searchDTO) {
+    public APIResult<Page<OrderVo>> search(@NeedUser UserDetails user, OrderSearchWebDTO searchDTO) {
+        if (!user.isPlatForm()) {
+            searchDTO.setMerchantId(user.getMerchantId());
+        }
         return orderService.search(searchDTO);
     }
 
@@ -40,4 +61,20 @@ public class OrderController {
     public APIResult<Boolean> cancel(@PathVariable("orderId") String orderId) {
         return orderService.cancel(orderId);
     }
+
+    @RequestMapping(value = "/snapshot", method = RequestMethod.GET)
+    public APIResult<Page<OrderProductSnapshot>> search(@NeedUser UserDetails user, OrderSnapshotWebSearchDTO searchDTO) {
+        if (!user.isPlatForm()) {
+            searchDTO.setMerchantId(user.getMerchantId());
+        }
+        return orderService.search(searchDTO);
+    }
+
+    @RequestMapping(value = "/detail", method = RequestMethod.GET)
+    public APIResult<Page<OrderDetailVo>> search(@NeedUser UserDetails user, OrderDetailWebSearchDTO searchDTO) {
+        if (!user.isPlatForm()) {
+            searchDTO.setMerchantId(user.getMerchantId());
+        }
+        return orderService.search(searchDTO);
+    }
 }

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

@@ -3,14 +3,17 @@ package cn.rankin.cmsweb.service.trade.order;
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.data.api.trade.dto.OrderDTO;
+import cn.rankin.data.api.trade.dto.OrderDetailSearchDTO;
 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 org.springframework.cloud.netflix.feign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Map;
 
 @FeignClient(name = "${service.trade.name}")
-public interface OrderServiceFeign {
+public interface OrderClient {
 
     // 此处返回值不用Vo,需要进一步处理
     @RequestMapping(value = "/order/list", method = RequestMethod.GET)
@@ -27,4 +30,10 @@ public interface OrderServiceFeign {
 
     @RequestMapping(value = "/order/pay/{orderId}", method = RequestMethod.DELETE)
     APIResult<Boolean> cancel(@PathVariable("orderId") String orderId);
+
+    @RequestMapping(value = "/order/snapshot", method = RequestMethod.GET)
+    APIResult<Page<OrderProductSnapshot>> searchSnapshot(@RequestParam Map<String, Object> searchDTO);
+
+    @RequestMapping(value = "/order/detail", method = RequestMethod.POST)
+    APIResult<Page<OrderDetail>> searchDetail(@RequestBody OrderDetailSearchDTO searchDTO);
 }

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

@@ -11,13 +11,19 @@ import cn.rankin.common.utils.api.page.Page;
 import cn.rankin.common.utils.enums.LedgerTypeEnum;
 import cn.rankin.common.utils.enums.ProductTypeEnum;
 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.vo.GoodsVo;
 import cn.rankin.data.api.trade.dto.OrderDTO;
+import cn.rankin.data.api.trade.dto.OrderDetailSearchDTO;
 import cn.rankin.data.api.trade.dto.OrderGoodsDTO;
+import cn.rankin.data.api.trade.entity.OrderDetail;
 import cn.rankin.data.api.trade.entity.OrderGoods;
 import cn.rankin.data.api.trade.entity.Order;
-import cn.rankin.data.api.trade.vo.UserOrderVo;
+import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
+import cn.rankin.data.api.trade.vo.OrderDetailVo;
+import cn.rankin.data.api.trade.vo.OrderVo;
 import cn.rankin.data.api.user.dto.CampusSearchDTO;
 import cn.rankin.data.api.user.dto.MerchantPayDTO;
 import cn.rankin.data.api.user.vo.CampusVo;
@@ -41,7 +47,7 @@ import static cn.rankin.cmsweb.utils.DTOConverter.convert;
 public class OrderService {
 
     @Autowired
-    private OrderServiceFeign orderServiceFeign;
+    private OrderClient orderClient;
 
     @Autowired
     private GoodsService goodsService;
@@ -56,7 +62,7 @@ public class OrderService {
     private MerchantService merchantService;
 
     public APIResult<Boolean> pay(String orderId) {
-        APIResult<Order> userOrderAPIResult = orderServiceFeign.getOrder(orderId);
+        APIResult<Order> userOrderAPIResult = orderClient.getOrder(orderId);
         Order order = userOrderAPIResult.getData();
         if (order == null || !userOrderAPIResult.getSuccess()) {
             log.error("查询订单错误, orderId={}, {}", orderId, userOrderAPIResult.getMessage());
@@ -85,7 +91,7 @@ public class OrderService {
         }
 
         // 更新订单状态
-        APIResult<Boolean> orderAPIResult = orderServiceFeign.pay(orderId);
+        APIResult<Boolean> orderAPIResult = orderClient.pay(orderId);
         if (!orderAPIResult.getSuccess()) {
             return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
         }
@@ -96,10 +102,10 @@ public class OrderService {
     }
 
     public APIResult<Boolean> cancel(String orderId) {
-        return orderServiceFeign.cancel(orderId);
+        return orderClient.cancel(orderId);
     }
 
-    public APIResult<UserOrderVo> create(OrderDTO orderDTO) {
+    public APIResult<OrderVo> create(OrderDTO orderDTO) {
         String uid = orderDTO.getUid();
         APIResult<TerminalUserVo> userVoAPIResult = terminalUserService.getUser(uid);
         if (!userVoAPIResult.getSuccess()) {
@@ -108,6 +114,9 @@ public class OrderService {
 
         TerminalUserVo terminalUserVo = userVoAPIResult.getData();
 
+        String merchantId = terminalUserVo.getMerchantId();
+        orderDTO.setMerchantId(merchantId);
+
         List<OrderGoodsDTO> orderGoodsDTOList = orderDTO.getGoods();
         if (CollectionUtils.isEmpty(orderGoodsDTOList)) {
             return APIResult.error(CmsWebAPICode.error("商品为空"));
@@ -155,21 +164,42 @@ public class OrderService {
         orderDTO.setOriginPrice(totalPrice);
         orderDTO.setGoods(finalGoodsList);
 
-        APIResult userOrderAPIResult = orderServiceFeign.create(orderDTO);
+        APIResult userOrderAPIResult = orderClient.create(orderDTO);
         return userOrderAPIResult;
     }
 
-    public APIResult<UserOrderVo> getOrder(String orderId) {
-        APIResult<Order> userOrderVoAPIResult = orderServiceFeign.getOrder(orderId);
-        if (!userOrderVoAPIResult.getSuccess()) {
-            return APIResult.error(new BaseCode(userOrderVoAPIResult.getCode(), userOrderVoAPIResult.getMessage()));
+    public APIResult<OrderVo> getOrder(String orderId) {
+        APIResult<Order> orderAPIResult = orderClient.getOrder(orderId);
+        if (!orderAPIResult.getSuccess()) {
+            return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
         }
 
-        Order order = userOrderVoAPIResult.getData();
-        UserOrderVo userOrderVo = convert(order);
+        Order order = orderAPIResult.getData();
+        OrderVo orderVo = convert(order);
         List<OrderGoods> orderGoodsList = order.getGoods();
         if (CollectionUtils.isEmpty(orderGoodsList)) {
-            return APIResult.ok(userOrderVo);
+            return APIResult.ok(orderVo);
+        }
+
+        String uid = order.getUid();
+        APIResult<TerminalUserVo> userAPIResult = terminalUserService.getUser(uid);
+        TerminalUserVo terminalUserVo = userAPIResult.getData();
+
+        if (userAPIResult.getSuccess()) {
+            orderVo.setMerchantId(terminalUserVo.getMerchantId());
+            orderVo.setMerchantName(terminalUserVo.getMerchantName());
+            orderVo.setUserCode(terminalUserVo.getCode());
+            orderVo.setClassroomName(terminalUserVo.getName());
+        }
+
+        String campusId = terminalUserVo.getCampusId();
+        APIResult<CampusVo> campusAPIResult = campusService.getCampus(campusId);
+        CampusVo campusVo = campusAPIResult.getData();
+
+        if (campusVo != null) {
+            orderVo.setProvinceCode(campusVo.getProvinceCode());
+            orderVo.setCityName(campusVo.getCityName());
+            orderVo.setZoneName(campusVo.getZoneName());
         }
 
         List<String> goodsIdList = new ArrayList<>();
@@ -178,152 +208,260 @@ public class OrderService {
         if (!goodsAPIResult.getSuccess()) {
             log.error("goods api error: {}", goodsAPIResult.getMessage());
         }
-        userOrderVo.setGoods(goodsAPIResult.getData());
-        return APIResult.ok(userOrderVo);
+        orderVo.setGoods(goodsAPIResult.getData());
+        return APIResult.ok(orderVo);
     }
 
-    public APIResult<Page<UserOrderVo>> search(OrderSearchWebDTO searchWebDTO) {
+    public APIResult<Page<OrderVo>> search(OrderSearchWebDTO searchWebDTO) {
         String userCode = searchWebDTO.getUserCode();
         String campusCode = searchWebDTO.getCampusCode();
         String campusName = searchWebDTO.getCampusName();
+        String merchantId = searchWebDTO.getMerchantId();
 
-        List<String> uids = new ArrayList<>();
+        List<String> userIdList = new ArrayList<>();
 
-        // 用户及校区的Map
-        Map<String, TerminalUserVo> userVoMap = new HashMap<>();
-        Map<String, CampusVo> campusVoMap = new HashMap<>();
+        List<TerminalUserVo> terminalUserVoList = findTerminalUsers(userCode, campusCode, campusName, merchantId);
+        terminalUserVoList.forEach(terminalUserVo -> userIdList.add(terminalUserVo.getId()));
 
-        if (!StringUtils.isEmpty(userCode)) {
-            // 按用户查询
-            Map<String, Object> searchDTO = new HashMap<>();
-            searchDTO.put("code", userCode);
-            APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByCondition(searchDTO);
+        Map<String, Object> searchParams = new HashMap<>();
+        searchParams.put("pageNo", searchWebDTO.getPageNo());
+        searchParams.put("pageSize", searchWebDTO.getPageSize());
+        searchParams.put("beginTime", searchWebDTO.getBeginTime());
+        searchParams.put("endTime", searchWebDTO.getEndTime());
+        searchParams.put("status", searchWebDTO.getStatus());
+        searchParams.put("uid", userIdList);
+        searchParams.put("merchantId", merchantId);
+
+        APIResult<Page<Order>> orderAPIResult = orderClient.search(searchParams);
+        if (!orderAPIResult.getSuccess()) {
+            log.error("order query error: {}", orderAPIResult.getMessage());
+            return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
+        }
+
+        Page<Order> userOrderPage = orderAPIResult.getData();
+        Page<OrderVo> page = new Page<>(userOrderPage.getTotalSize(), userOrderPage.getPageNo(), userOrderPage.getPageSize());
+
+        List<Order> orderList = orderAPIResult.getData().getList();
+        List<OrderVo> orderVoList = new ArrayList<>();
+        if (CollectionUtils.isEmpty(orderList)) {
+            return APIResult.ok(page);
+        }
+
+        if (CollectionUtils.isEmpty(userIdList)) {
+            orderList.forEach(order -> userIdList.add(order.getUid()));
+            APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByIds(userIdList);
             if (!userAPIResult.getSuccess()) {
                 return APIResult.error(new BaseCode(userAPIResult.getCode(), userAPIResult.getMessage()));
             }
+            terminalUserVoList = userAPIResult.getData();
+        }
 
-            List<TerminalUserVo> userVoList = userAPIResult.getData();
-            if (CollectionUtils.isEmpty(userVoList)) {
-                return APIResult.ok(new Page<>());
+        // 用户信息
+        Map<String, TerminalUserVo> terminalUserVoMap = new HashMap<>();
+        // 加载校区信息
+        List<String> campusIdList = new ArrayList<>();
+        for (TerminalUserVo terminalUserVo : terminalUserVoList) {
+            String campusId = terminalUserVo.getCampusId();
+            if (!campusIdList.contains(campusId)) {
+                campusIdList.add(campusId);
             }
+            terminalUserVoMap.put(terminalUserVo.getId(), terminalUserVo);
+        }
 
-            List<String> campusIdList = new ArrayList<>();
-            // 记录数据,查到数据后要set回去
-            userVoList.forEach(userVo -> {
-                uids.add(userVo.getId());
-                campusIdList.add(userVo.getCampusId());
-                userVoMap.put(userVo.getId(), userVo);
-            });
-
+        Map<String, CampusVo> campusVoMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(campusIdList)) {
             APIResult<Map<String, CampusVo>> campusAPIResult = campusService.findByIds(campusIdList);
-            if (campusAPIResult.getSuccess()) {
-                campusVoMap = campusAPIResult.getData();
-            }
-        } else if (!StringUtils.isEmpty(campusCode) || !StringUtils.isEmpty(campusName)) {
-            // 按校区查询
-            CampusSearchDTO campusSearchDTO = new CampusSearchDTO();
-            campusSearchDTO.setCode(campusCode);
-            campusSearchDTO.setName(campusName);
-            APIResult<List<CampusVo>> campusAPIResult = campusService.findByCondition(BeanUtil.convertToMap(campusSearchDTO));
             if (!campusAPIResult.getSuccess()) {
-                return APIResult.error(new BaseCode(campusAPIResult.getCode(), campusAPIResult.getMessage()));
-            }
-            List<CampusVo> campusVoList = campusAPIResult.getData();
-            if (CollectionUtils.isEmpty(campusVoList)) {
-                return APIResult.ok(new Page<>());
+                log.error("load campus info error");
+            }else {
+                campusVoMap = campusAPIResult.getData();
             }
+        }
 
-            List<String> campusIdList = new ArrayList<>();
-            for (CampusVo campusVo : campusVoList) {
-                campusIdList.add(campusVo.getId());
-                campusVoMap.put(campusVo.getId(), campusVo);
-            }
+        for (Order order : orderList) {
+            OrderVo orderVo = convert(order);
+            String uid = orderVo.getUid();
 
-            APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByCampusIds(campusIdList);
-            if (!userAPIResult.getSuccess()) {
-                return APIResult.error(new BaseCode(userAPIResult.getCode(), userAPIResult.getMessage()));
+            TerminalUserVo terminalUserVo = terminalUserVoMap.get(uid);
+            if (terminalUserVo == null) {
+                log.error("用户不存在: {}", uid);
+                orderVoList.add(orderVo);
+                continue;
             }
-            List<TerminalUserVo> userVoList = userAPIResult.getData();
-            for (TerminalUserVo userVo : userVoList) {
-                uids.add(userVo.getId());
-                userVoMap.put(userVo.getId(), userVo);
+            orderVo.setMerchantId(terminalUserVo.getMerchantId());
+            orderVo.setMerchantName(terminalUserVo.getMerchantName());
+            orderVo.setUserCode(terminalUserVo.getCode());
+            orderVo.setClassroomName(terminalUserVo.getName());
+
+            String campusId = terminalUserVo.getCampusId();
+            CampusVo campusVo = campusVoMap.get(campusId);
+
+            if (campusVo == null) {
+                log.error("campus is null, uid={}", uid);
+                orderVoList.add(orderVo);
+                continue;
             }
+            orderVo.setProvinceCode(campusVo.getProvinceCode());
+            orderVo.setCityName(campusVo.getCityName());
+            orderVo.setZoneName(campusVo.getZoneName());
+
+            orderVoList.add(orderVo);
         }
 
-        Map<String, Object> searchParams = new HashMap<>();
-        searchParams.put("pageNo", searchWebDTO.getPageNo());
-        searchParams.put("pageSize", searchWebDTO.getPageSize());
-        searchParams.put("beginTime", searchWebDTO.getBeginTime());
-        searchParams.put("endTime", searchWebDTO.getEndTime());
-        searchParams.put("status", searchWebDTO.getStatus());
-        searchParams.put("uid", uids);
+        page.setList(orderVoList);
+        return APIResult.ok(page);
+    }
+
+    // 查拆单
+    public APIResult<Page<OrderDetailVo>> search(OrderDetailWebSearchDTO searchWebDTO) {
+        String userCode = searchWebDTO.getUserCode();
+        String campusCode = searchWebDTO.getCampusCode();
+        String campusName = searchWebDTO.getCampusName();
+        String merchantId = searchWebDTO.getMerchantId();
+
+        List<String> userIdList = new ArrayList<>();
+
+        List<TerminalUserVo> terminalUserVoList = findTerminalUsers(userCode, campusCode, campusName, merchantId);
+        terminalUserVoList.forEach(terminalUserVo -> userIdList.add(terminalUserVo.getId()));
+
+        OrderDetailSearchDTO searchDTO = new OrderDetailSearchDTO();
+        searchDTO.setPageNo(searchWebDTO.getPageNo());
+        searchDTO.setPageSize(searchWebDTO.getPageSize());
+        searchDTO.setBeginTime(searchWebDTO.getBeginTime());
+        searchDTO.setEndTime(searchWebDTO.getEndTime());
+        searchDTO.setStatus(searchWebDTO.getStatus());
+        searchDTO.setUid(userIdList);
+        searchDTO.setMerchantId(merchantId);
 
-        APIResult<Page<Order>> orderAPIResult = orderServiceFeign.search(searchParams);
+        APIResult<Page<OrderDetail>> orderAPIResult = orderClient.searchDetail(searchDTO);
         if (!orderAPIResult.getSuccess()) {
             log.error("order query error: {}", orderAPIResult.getMessage());
             return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
         }
 
-        Page<Order> userOrderPage = orderAPIResult.getData();
-        Page<UserOrderVo> page = new Page<>(userOrderPage.getTotalSize(), userOrderPage.getPageNo(), userOrderPage.getPageSize());
+        Page<OrderDetail> orderPage = orderAPIResult.getData();
+        Page<OrderDetailVo> page = new Page<>(orderPage.getTotalSize(), orderPage.getPageNo(), orderPage.getPageSize());
 
-        List<Order> orderList = orderAPIResult.getData().getList();
-        List<UserOrderVo> userOrderVoList = new ArrayList<>();
-        if (CollectionUtils.isEmpty(orderList)) {
+        List<OrderDetail> orderDetailList = orderAPIResult.getData().getList();
+        if (CollectionUtils.isEmpty(orderDetailList)) {
             return APIResult.ok(page);
         }
 
-        if (uids.isEmpty() && !CollectionUtils.isEmpty(orderList)) {
-            orderList.forEach(userOrderVo -> uids.add(userOrderVo.getUid()));
-            APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByIds(uids);
+        if (CollectionUtils.isEmpty(userIdList)) {
+            orderDetailList.forEach(order -> userIdList.add(order.getUid()));
+            APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByIds(userIdList);
             if (!userAPIResult.getSuccess()) {
                 return APIResult.error(new BaseCode(userAPIResult.getCode(), userAPIResult.getMessage()));
             }
+            terminalUserVoList = userAPIResult.getData();
+        }
 
-            List<TerminalUserVo> userVoList = userAPIResult.getData();
-            if (CollectionUtils.isEmpty(userVoList)) {
-                return APIResult.error(CmsWebAPICode.error("用户信息查询错误"));
-            }
-
-            List<String> campusIdList = new ArrayList<>();
-            // 记录数据,查到数据后要set回去
-            for (TerminalUserVo userVo : userVoList) {
-                campusIdList.add(userVo.getCampusId());
-                userVoMap.put(userVo.getId(), userVo);
+        // 用户信息
+        Map<String, TerminalUserVo> terminalUserVoMap = new HashMap<>();
+        // 加载校区信息
+        List<String> campusIdList = new ArrayList<>();
+        for (TerminalUserVo terminalUserVo : terminalUserVoList) {
+            String campusId = terminalUserVo.getCampusId();
+            if (!campusIdList.contains(campusId)) {
+                campusIdList.add(campusId);
             }
+            terminalUserVoMap.put(terminalUserVo.getId(), terminalUserVo);
+        }
 
-            if (CollectionUtils.isEmpty(campusIdList)) {
-                return APIResult.error(CmsWebAPICode.error("查询校区信息错误"));
-            }
+        Map<String, CampusVo> campusVoMap = new HashMap<>();
+        if (!CollectionUtils.isEmpty(campusIdList)) {
             APIResult<Map<String, CampusVo>> campusAPIResult = campusService.findByIds(campusIdList);
-            if (campusAPIResult.getSuccess()) {
+            if (!campusAPIResult.getSuccess()) {
+                log.error("load campus info error");
+            }else {
                 campusVoMap = campusAPIResult.getData();
             }
         }
 
-        for (Order order : orderList) {
-            UserOrderVo userOrderVo = convert(order);
-            String uid = userOrderVo.getUid();
+        List<OrderDetailVo> orderDetailVoList = new ArrayList<>();
+        for (OrderDetail order : orderDetailList) {
+            OrderDetailVo orderDetailVo = convert(order);
+            String uid = orderDetailVo.getUid();
 
-            TerminalUserVo terminalUserVo = userVoMap.get(uid);
+            TerminalUserVo terminalUserVo = terminalUserVoMap.get(uid);
             if (terminalUserVo == null) {
                 log.error("用户不存在: {}", uid);
+                orderDetailVoList.add(orderDetailVo);
                 continue;
             }
-            userOrderVo.setMerchantId(terminalUserVo.getMerchantId());
-            userOrderVo.setMerchantName(terminalUserVo.getMerchantName());
-            userOrderVo.setUserCode(terminalUserVo.getCode());
-            userOrderVo.setClassroomName(terminalUserVo.getName());
+            orderDetailVo.setMerchantId(terminalUserVo.getMerchantId());
+            orderDetailVo.setMerchantName(terminalUserVo.getMerchantName());
+            orderDetailVo.setUserCode(terminalUserVo.getCode());
+            orderDetailVo.setClassroomName(terminalUserVo.getName());
 
             String campusId = terminalUserVo.getCampusId();
             CampusVo campusVo = campusVoMap.get(campusId);
-            userOrderVo.setProvinceCode(campusVo.getProvinceCode());
-            userOrderVo.setCityName(campusVo.getCityName());
 
-            userOrderVoList.add(userOrderVo);
+            if (campusVo == null) {
+                log.error("campus is null, uid={}", uid);
+                continue;
+            }
+            orderDetailVo.setProvinceCode(campusVo.getProvinceCode());
+            orderDetailVo.setCityName(campusVo.getCityName());
+            orderDetailVo.setZoneName(campusVo.getZoneName());
+
+            orderDetailVoList.add(orderDetailVo);
         }
 
-        page.setList(userOrderVoList);
+        page.setList(orderDetailVoList);
         return APIResult.ok(page);
     }
+
+    public APIResult<Page<OrderProductSnapshot>> search(OrderSnapshotWebSearchDTO searchDTO) {
+        Map<String, Object> map = BeanUtil.convertToMap(searchDTO);
+        return orderClient.searchSnapshot(map);
+    }
+
+    // 根据搜索条件查找用户
+    public List<TerminalUserVo> findTerminalUsers(String userCode, String campusCode, String campusName, String merchantId) {
+        List<TerminalUserVo> terminalUserVoList = new ArrayList<>();
+
+        if (!StringUtils.isEmpty(userCode)) {
+            // 按用户查询
+            Map<String, Object> searchDTO = new HashMap<>();
+            searchDTO.put("code", userCode);
+            searchDTO.put("merchantId", merchantId);
+            APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByCondition(searchDTO);
+            if (!userAPIResult.getSuccess()) {
+                log.error("load user id list error");
+                return terminalUserVoList;
+            }
+            terminalUserVoList = userAPIResult.getData();
+
+        } else if (!StringUtils.isEmpty(campusCode) || !StringUtils.isEmpty(campusName)) {
+            // 按校区查询
+            CampusSearchDTO campusSearchDTO = new CampusSearchDTO();
+            campusSearchDTO.setCode(campusCode);
+            campusSearchDTO.setName(campusName);
+            campusSearchDTO.setMerchantId(merchantId);
+            APIResult<List<CampusVo>> campusAPIResult = campusService.findByCondition(BeanUtil.convertToMap(campusSearchDTO));
+            if (!campusAPIResult.getSuccess()) {
+                log.error("load user id list error when find campus");
+                return terminalUserVoList;
+            }
+
+            List<CampusVo> campusVoList = campusAPIResult.getData();
+            if (CollectionUtils.isEmpty(campusVoList)) {
+                return terminalUserVoList;
+            }
+
+            List<String> campusIdList = new ArrayList<>();
+            for (CampusVo campusVo : campusVoList) {
+                campusIdList.add(campusVo.getId());
+            }
+
+            APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByCampusIds(campusIdList);
+            if (!userAPIResult.getSuccess()) {
+                log.error("load user id list error");
+                return terminalUserVoList;
+            }
+            terminalUserVoList = userAPIResult.getData();
+        }
+        return terminalUserVoList;
+    }
 }

+ 12 - 5
rankin-cms-web/src/main/java/cn/rankin/cmsweb/utils/DTOConverter.java

@@ -1,15 +1,22 @@
 package cn.rankin.cmsweb.utils;
 
 import cn.rankin.data.api.trade.entity.Order;
-import cn.rankin.data.api.trade.vo.UserOrderVo;
+import cn.rankin.data.api.trade.entity.OrderDetail;
+import cn.rankin.data.api.trade.vo.OrderDetailVo;
+import cn.rankin.data.api.trade.vo.OrderVo;
 import org.springframework.beans.BeanUtils;
 
 public class DTOConverter {
 
-    public static UserOrderVo convert(Order order) {
-        UserOrderVo userOrderVo = new UserOrderVo();
-        BeanUtils.copyProperties(order, userOrderVo);
-        return userOrderVo;
+    public static OrderVo convert(Order order) {
+        OrderVo orderVo = new OrderVo();
+        BeanUtils.copyProperties(order, orderVo);
+        return orderVo;
     }
 
+    public static OrderDetailVo convert(OrderDetail orderDetail) {
+        OrderDetailVo orderDetailVo = new OrderDetailVo();
+        BeanUtils.copyProperties(orderDetail, orderDetailVo);
+        return orderDetailVo;
+    }
 }

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

@@ -4,7 +4,7 @@ import org.junit.Test;
 
 import static org.junit.Assert.*;
 
-public class OrderServiceFeignTest {
+public class OrderClientTest {
     @Test
     public void pay() throws Exception {
     }

+ 31 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/cms/OrderDetailWebSearchDTO.java

@@ -0,0 +1,31 @@
+package cn.rankin.data.api.cms;
+
+import cn.rankin.common.utils.enums.OrderDetailStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@ToString
+public class OrderDetailWebSearchDTO implements Serializable {
+
+    private String merchantId;
+
+    private String userCode;
+
+    private String campusName;
+
+    private String campusCode;
+
+    protected Date beginTime;
+
+    protected Date endTime;
+
+    protected OrderDetailStatusEnum status;
+
+    protected Integer pageNo = 1;
+
+    protected Integer pageSize = 10;
+}

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/cms/OrderSearchWebDTO.java

@@ -10,6 +10,8 @@ import java.io.Serializable;
 @ToString
 public class OrderSearchWebDTO implements Serializable {
 
+    private String merchantId;
+
     private String userCode;
 
     private String campusName;

+ 41 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/cms/OrderSnapshotWebSearchDTO.java

@@ -0,0 +1,41 @@
+package cn.rankin.data.api.cms;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+@Data
+@ToString
+public class OrderSnapshotWebSearchDTO implements Serializable {
+
+    private String uid;
+
+    private String userCode;
+
+    private String userName;
+
+    private String campusId;
+
+    private String campusCode;
+
+    private String campusName;
+
+    private String pkgId;
+
+    private String pid;
+
+    private String productCode;
+
+    private String cpId;
+
+    private String merchantId;
+
+    protected String beginTime;
+
+    protected String endTime;
+
+    private Integer pageNo = 1;
+
+    private Integer pageSize = 10;
+}

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderDTO.java

@@ -16,6 +16,8 @@ public class OrderDTO implements Serializable {
 
     private String uid;
 
+    private String merchantId;
+
     private BigDecimal originPrice;
 
     private BigDecimal finalPrice;

+ 28 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderDetailSearchDTO.java

@@ -0,0 +1,28 @@
+package cn.rankin.data.api.trade.dto;
+
+import cn.rankin.common.utils.enums.OrderDetailStatusEnum;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ToString
+public class OrderDetailSearchDTO implements Serializable {
+
+    private String merchantId;
+
+    protected List<String> uid;
+
+    protected Date beginTime;
+
+    protected Date endTime;
+
+    protected OrderDetailStatusEnum status;
+
+    protected Integer pageNo = 1;
+
+    protected Integer pageSize = 10;
+}

+ 2 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderSearchDTO.java

@@ -12,6 +12,8 @@ import java.util.List;
 @ToString
 public class OrderSearchDTO implements Serializable {
 
+    protected String merchantId;
+
     protected List<String> uid;
 
     protected Date beginTime;

+ 41 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/dto/OrderSnapshotSearchDTO.java

@@ -0,0 +1,41 @@
+package cn.rankin.data.api.trade.dto;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.Date;
+
+@Data
+@ToString
+public class OrderSnapshotSearchDTO {
+
+    private String uid;
+
+    private String userCode;
+
+    private String userName;
+
+    private String campusId;
+
+    private String campusCode;
+
+    private String campusName;
+
+    private String pkgId;
+
+    private String pid;
+
+    private String productCode;
+
+    private String cpId;
+
+    private String merchantId;
+
+    protected Date beginTime;
+
+    protected Date endTime;
+
+    private Integer pageNo = 1;
+
+    private Integer pageSize = 10;
+}

+ 3 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/Order.java

@@ -28,6 +28,9 @@ public class Order implements Serializable {
     @Column(updatable = false)
     private String uid;
 
+    @Column(name = "merchant_id")
+    private String merchantId;
+
     @Column(name = "origin_price")
     private BigDecimal originPrice;
 

+ 3 - 0
rankin-data-api/src/main/java/cn/rankin/data/api/trade/entity/OrderDetail.java

@@ -64,6 +64,9 @@ public class OrderDetail implements Serializable {
     @Column(name = "cp_id")
     private String cpId;
 
+    @Column(name = "merchant_id")
+    private String merchantId;
+
     @Column(name = "gmt_created", updatable = false, insertable = false, columnDefinition = "timestamp NULL DEFAULT CURRENT_TIMESTAMP")
     @Temporal(TemporalType.TIMESTAMP)
     private Date gmtCreated;

+ 26 - 9
rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/UserOrderVo.java

@@ -1,10 +1,11 @@
 package cn.rankin.data.api.trade.vo;
 
-import cn.rankin.common.utils.enums.OrderStatusEnum;
-import cn.rankin.data.api.product.vo.GoodsVo;
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.OrderDetailStatusEnum;
+import cn.rankin.common.utils.enums.OrderDetailTypeEnum;
+import cn.rankin.data.api.trade.entity.OrderGoods;
 import lombok.Data;
 import lombok.ToString;
-import org.springframework.aop.target.LazyInitTargetSource;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -13,23 +14,41 @@ import java.util.List;
 
 @Data
 @ToString
-public class UserOrderVo implements Serializable {
+public class OrderDetailVo implements Serializable {
 
     private String id;
 
-    private String uid;
+    private String orderId;
 
     private String merchantId;
 
     private String merchantName;
 
+    private String uid;
+
     private BigDecimal originPrice;
 
     private BigDecimal finalPrice;
 
     private BigDecimal adjustPrice;
 
-    private OrderStatusEnum status;
+    private OrderDetailStatusEnum orderStatus;
+
+    private BaseStatusEnum status;
+
+    private OrderDetailTypeEnum type;
+
+    private String note;
+
+    private String address;
+
+    private String mobile;
+
+    private String name;
+
+    private String trackNo;
+
+    private String cpId;
 
     private String userCode;
 
@@ -41,11 +60,9 @@ public class UserOrderVo implements Serializable {
 
     private String classroomName;
 
-    private String note;
-
     private Date gmtCreated;
 
     private Date gmtModified;
 
-    private List<GoodsVo> goods;
+    private List<OrderGoods> goods;
 }

+ 14 - 3
rankin-data-api/src/main/java/cn/rankin/data/api/trade/vo/UserOrderVo.java

@@ -1,10 +1,11 @@
 package cn.rankin.data.api.trade.vo;
 
+import cn.rankin.common.utils.enums.BaseStatusEnum;
+import cn.rankin.common.utils.enums.OrderSplitStatusEnum;
 import cn.rankin.common.utils.enums.OrderStatusEnum;
 import cn.rankin.data.api.product.vo.GoodsVo;
 import lombok.Data;
 import lombok.ToString;
-import org.springframework.aop.target.LazyInitTargetSource;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -13,7 +14,7 @@ import java.util.List;
 
 @Data
 @ToString
-public class UserOrderVo implements Serializable {
+public class OrderVo implements Serializable {
 
     private String id;
 
@@ -29,7 +30,11 @@ public class UserOrderVo implements Serializable {
 
     private BigDecimal adjustPrice;
 
-    private OrderStatusEnum status;
+    private OrderStatusEnum orderStatus;
+
+    private BaseStatusEnum status;
+
+    private OrderSplitStatusEnum splitStatus;
 
     private String userCode;
 
@@ -43,6 +48,12 @@ public class UserOrderVo implements Serializable {
 
     private String note;
 
+    private String address;
+
+    private String mobile;
+
+    private String name;
+
     private Date gmtCreated;
 
     private Date gmtModified;

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

@@ -1,13 +1,6 @@
 package cn.rankin.task.task.order;
 
-import cn.rankin.common.utils.api.model.APIResult;
-import cn.rankin.common.utils.enums.ProductTypeEnum;
 import cn.rankin.data.api.trade.entity.Order;
-import cn.rankin.data.api.trade.entity.OrderDetail;
-import cn.rankin.data.api.trade.entity.OrderGoods;
-import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
-import cn.rankin.data.api.user.vo.CampusVo;
-import cn.rankin.data.api.user.vo.TerminalUserVo;
 import cn.rankin.task.service.OrderService;
 import cn.rankin.task.service.ProductService;
 import cn.rankin.task.service.UserService;
@@ -15,13 +8,11 @@ import com.alibaba.fastjson.JSON;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.scheduling.config.ScheduledTaskRegistrar;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 @Slf4j
 @Component

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

@@ -215,6 +215,7 @@ public class OrderSplitTask {
         orderDetail.setOriginPrice(BigDecimal.ZERO);
         orderDetail.setAdjustPrice(BigDecimal.ZERO);
         orderDetail.setFinalPrice(BigDecimal.ZERO);
+        orderDetail.setMerchantId(order.getMerchantId());
         return orderDetail;
     }
 }

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

@@ -2,20 +2,44 @@ package cn.rankin.tradeservice.controller;
 
 import cn.rankin.common.utils.api.model.APIResult;
 import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.data.api.trade.dto.OrderDetailSearchDTO;
 import cn.rankin.data.api.trade.dto.OrderSearchDTO;
 import cn.rankin.data.api.trade.dto.OrderDTO;
+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.tradeservice.service.OrderDetailService;
+import cn.rankin.tradeservice.service.OrderProductSnapshotService;
 import cn.rankin.tradeservice.service.OrderService;
 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 javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 @RestController
 @RequestMapping(value = "/order")
 public class OrderController {
 
+    @InitBinder
+    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
+        binder.registerCustomEditor(Date.class,
+                new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));
+    }
+
     @Autowired
     private OrderService orderService;
 
+    @Autowired
+    private OrderProductSnapshotService orderProductSnapshotService;
+
+    @Autowired
+    private OrderDetailService orderDetailService;
+
     // cms web需要做前置校验
     @RequestMapping(method = RequestMethod.POST)
     public APIResult<Order> create(@RequestBody OrderDTO orderDTO) {
@@ -42,4 +66,16 @@ public class OrderController {
         return orderService.cancel(orderId);
     }
 
+    // 查询分拆订单
+    @RequestMapping(value = "/detail", method = RequestMethod.POST)
+    public APIResult<Page<OrderDetail>> search(@RequestBody OrderDetailSearchDTO searchDTO) {
+        return orderDetailService.search(searchDTO);
+    }
+
+    // 查询交易快照
+    @RequestMapping(value = "/snapshot", method = RequestMethod.GET)
+    public APIResult<Page<OrderProductSnapshot>> search(OrderSnapshotSearchDTO searchDTO) {
+        return orderProductSnapshotService.search(searchDTO);
+    }
+
 }

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

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

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

@@ -12,4 +12,6 @@ public interface OrderGoodsRepository extends BasicJpaRepository<OrderGoods, Str
 
     @Query(value = "select g from OrderGoods g where g.orderId in (?1)")
     List<OrderGoods> findByOrderIds(List<String> orderIds);
+
+    List<OrderGoods> findByDetailId(String detailId);
 }

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

@@ -3,5 +3,5 @@ package cn.rankin.tradeservice.repository;
 import cn.rankin.common.utils.jpa.BasicJpaRepository;
 import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
 
-public interface ProductSoldSnapshotRepository extends BasicJpaRepository<OrderProductSnapshot, String> {
+public interface OrderProductSnapshotRepository extends BasicJpaRepository<OrderProductSnapshot, String> {
 }

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

@@ -0,0 +1,110 @@
+package cn.rankin.tradeservice.service;
+
+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.OrderDetailStatusEnum;
+import cn.rankin.common.utils.util.JpaSortUtil;
+import cn.rankin.data.api.trade.dto.OrderDetailSearchDTO;
+import cn.rankin.data.api.trade.entity.OrderDetail;
+import cn.rankin.data.api.trade.entity.OrderGoods;
+import cn.rankin.tradeservice.code.TradeServiceAPICode;
+import cn.rankin.tradeservice.repository.OrderDetailRepository;
+import cn.rankin.tradeservice.repository.OrderGoodsRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+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;
+
+@Service
+public class OrderDetailService {
+
+    @Autowired
+    private OrderDetailRepository orderDetailRepository;
+
+    @Autowired
+    private OrderGoodsRepository orderGoodsRepository;
+
+    public APIResult<OrderDetail> getOrder(String detailId) {
+        OrderDetail orderDetail = orderDetailRepository.find(detailId);
+        if (orderDetail == null) {
+            return APIResult.error(TradeServiceAPICode.NOT_EXISTS);
+        }
+
+        List<OrderGoods> orderGoodsList = orderGoodsRepository.findByOrderId(detailId);
+        orderDetail.setGoods(orderGoodsList);
+        return APIResult.ok(orderDetail);
+    }
+
+    public APIResult<Page<OrderDetail>> search(OrderDetailSearchDTO searchDTO) {
+        Specification<OrderDetail> specification = new Specification<OrderDetail>() {
+            @Override
+            public Predicate toPredicate(Root<OrderDetail> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                return OrderDetailService.this.toPredicate(root, query, cb, searchDTO);
+            }
+        };
+
+        Long count = orderDetailRepository.count(specification);
+        Page<OrderDetail> page = new Page<>(count, searchDTO.getPageNo(), searchDTO.getPageSize());
+
+        Long start = page.getStart();
+        if (count == 0) {
+            return APIResult.ok(page);
+        }
+
+        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap<>();
+        sort.put("gmtModified", BaseOrderEnum.DESC);
+        List<OrderDetail> orderList = orderDetailRepository.find(specification, start, page.getPageSize(), JpaSortUtil.sort(sort));
+        page.setList(orderList);
+
+        return APIResult.ok(page);
+    }
+
+    public Predicate toPredicate(Root<OrderDetail> root, CriteriaQuery<?> query, CriteriaBuilder cb, OrderDetailSearchDTO searchDTO) {
+        // 存放查询条件
+        List<Predicate> list = new ArrayList<Predicate>();
+        Predicate tmp = null;
+
+        List<String> userList = searchDTO.getUid();
+        if (!CollectionUtils.isEmpty(userList)) {
+            tmp = root.get("uid").in(userList);
+            list.add(tmp);
+        }
+
+        String merchantId = searchDTO.getMerchantId();
+        if (!StringUtils.isEmpty(merchantId)) {
+            tmp = cb.equal(root.get("merchantId"), merchantId);
+            list.add(tmp);
+        }
+
+        OrderDetailStatusEnum status = searchDTO.getStatus();
+        if (status != null) {
+            tmp = cb.equal(root.get("orderStatus"), status);
+            list.add(tmp);
+        }
+
+        Date beginTime = searchDTO.getBeginTime();
+        if (beginTime != null) {
+            tmp = cb.greaterThanOrEqualTo(root.get("gmtCreated"), beginTime);
+            list.add(tmp);
+        }
+
+        Date endTime = searchDTO.getEndTime();
+        if (endTime != null) {
+            tmp = cb.lessThanOrEqualTo(root.get("gmtCreated"), endTime);
+            list.add(tmp);
+        }
+        // where条件
+        return list.isEmpty() ? null : cb.and(list.toArray(new Predicate[list.size()]));
+    }
+}

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

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

+ 134 - 0
rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/OrderProductSnapshotService.java

@@ -0,0 +1,134 @@
+package cn.rankin.tradeservice.service;
+
+import cn.rankin.common.utils.api.model.APIResult;
+import cn.rankin.common.utils.api.page.Page;
+import cn.rankin.common.utils.enums.BaseOrderEnum;
+import cn.rankin.common.utils.util.JpaSortUtil;
+import cn.rankin.data.api.trade.dto.OrderSnapshotSearchDTO;
+import cn.rankin.data.api.trade.entity.OrderProductSnapshot;
+import cn.rankin.tradeservice.repository.OrderProductSnapshotRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+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;
+
+@Service
+public class OrderProductSnapshotService {
+
+    @Autowired
+    private OrderProductSnapshotRepository orderProductSnapshotRepository;
+
+    public APIResult<Page<OrderProductSnapshot>> search(OrderSnapshotSearchDTO searchDTO) {
+        Specification<OrderProductSnapshot> specification = new Specification<OrderProductSnapshot>() {
+            @Override
+            public Predicate toPredicate(Root<OrderProductSnapshot> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                return OrderProductSnapshotService.this.toPredicate(root, query, cb, searchDTO);
+            }
+        };
+
+        Long count = orderProductSnapshotRepository.count(specification);
+        Page<OrderProductSnapshot> page = new Page<>(count, searchDTO.getPageNo(), searchDTO.getPageSize());
+
+        Long start = page.getStart();
+        if (count == 0) {
+            return APIResult.ok(page);
+        }
+
+        LinkedHashMap<String, BaseOrderEnum> sort = new LinkedHashMap<>();
+        sort.put("gmtModified", BaseOrderEnum.DESC);
+        List<OrderProductSnapshot> orderList = orderProductSnapshotRepository.find(specification, start, page.getPageSize(), JpaSortUtil.sort(sort));
+        page.setList(orderList);
+
+        return APIResult.ok(page);
+    }
+
+    public Predicate toPredicate(Root<OrderProductSnapshot> root, CriteriaQuery<?> query, CriteriaBuilder cb, OrderSnapshotSearchDTO searchDTO) {
+        // 存放查询条件
+        List<Predicate> list = new ArrayList<Predicate>();
+        Predicate tmp = null;
+
+        String userId = searchDTO.getUid();
+        if (!StringUtils.isEmpty(userId)) {
+            tmp = cb.equal(root.get("uid"), userId);
+            list.add(tmp);
+        }
+
+        String userCode = searchDTO.getUserCode();
+        if (!StringUtils.isEmpty(userCode)) {
+            tmp = cb.like(root.get("userCode"), "%" + userCode + "%");
+            list.add(tmp);
+        }
+
+        String campusId = searchDTO.getCampusId();
+        if (!StringUtils.isEmpty(campusId)) {
+            tmp = cb.equal(root.get("campusId"), campusId);
+            list.add(tmp);
+        }
+
+        String campusCode = searchDTO.getCampusCode();
+        if (!StringUtils.isEmpty(campusCode)) {
+            tmp = cb.like(root.get("campusCode"), "%" + campusCode + "%");
+            list.add(tmp);
+        }
+
+        String campusName = searchDTO.getCampusName();
+        if (!StringUtils.isEmpty(campusName)) {
+            tmp = cb.like(root.get("campusName"), "%" + campusName + "%");
+            list.add(tmp);
+        }
+
+        String pkgId = searchDTO.getPkgId();
+        if (!StringUtils.isEmpty(pkgId)) {
+            tmp = cb.equal(root.get("pkgId"), pkgId);
+            list.add(tmp);
+        }
+
+        String productId = searchDTO.getPid();
+        if (!StringUtils.isEmpty(productId)) {
+            tmp = cb.equal(root.get("pid"), productId);
+            list.add(tmp);
+        }
+
+        String productCode = searchDTO.getProductCode();
+        if (!StringUtils.isEmpty(productCode)) {
+            tmp = cb.like(root.get("productCode"), productCode);
+            list.add(tmp);
+        }
+
+        String cpId = searchDTO.getCpId();
+        if (!StringUtils.isEmpty(cpId)) {
+            tmp = cb.equal(root.get("cpId"), cpId);
+            list.add(tmp);
+        }
+
+        String merchantId = searchDTO.getMerchantId();
+        if (!StringUtils.isEmpty(merchantId)) {
+            tmp = cb.equal(root.get("merchantId"), merchantId);
+            list.add(tmp);
+        }
+
+        Date beginTime = searchDTO.getBeginTime();
+        if (beginTime != null) {
+            tmp = cb.greaterThanOrEqualTo(root.get("gmtCreated"), beginTime);
+            list.add(tmp);
+        }
+
+        Date endTime = searchDTO.getEndTime();
+        if (endTime != null) {
+            tmp = cb.lessThanOrEqualTo(root.get("gmtCreated"), endTime);
+            list.add(tmp);
+        }
+        // where条件
+        return list.isEmpty() ? null : cb.and(list.toArray(new Predicate[list.size()]));
+    }
+
+}

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

@@ -19,6 +19,7 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -116,9 +117,14 @@ public class OrderService {
             list.add(tmp);
         }
 
+        String merchantId = searchDTO.getMerchantId();
+        if (!StringUtils.isEmpty(merchantId)) {
+            tmp = cb.equal(root.get("merchantId"), merchantId);
+            list.add(tmp);
+        }
         OrderStatusEnum status = searchDTO.getStatus();
         if (status != null) {
-            tmp = cb.equal(root.get("status"), status);
+            tmp = cb.equal(root.get("orderStatus"), status);
             list.add(tmp);
         }
 

+ 0 - 13
rankin-trade-service/src/main/java/cn/rankin/tradeservice/service/ProductSoldSnapshotService.java

@@ -1,13 +0,0 @@
-package cn.rankin.tradeservice.service;
-
-import cn.rankin.tradeservice.repository.ProductSoldSnapshotRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ProductSoldSnapshotService {
-
-    @Autowired
-    private ProductSoldSnapshotRepository productSoldSnapshotRepository;
-
-}

+ 1 - 1
rankin-user-service/src/main/java/cn/rankin/userservice/controller/CampusController.java

@@ -86,7 +86,7 @@ public class CampusController {
     }
 
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
-    public APIResult<Campus> getCampus(String id) {
+    public APIResult<Campus> getCampus(@PathVariable("id") String id) {
         APIResult<Campus> result = campusService.getCampus(id);
         if (result.getSuccess() && result.getData() != null) {
             Campus campus = result.getData();