Jelajahi Sumber

Merge remote-tracking branch 'origin/master'

wangtao 3 tahun lalu
induk
melakukan
4c1d205c1e

+ 9 - 2
lb-app/src/main/java/com/ydd/app/controller/OrderOpenApi.java

@@ -5,8 +5,10 @@ import com.ydd.app.dto.OrderCreateReq;
 import com.ydd.app.dto.OrderValuationReq;
 import com.ydd.app.service.OpenApiOrderService;
 import com.ydd.app.service.OpenApiOrderValuationService;
+import com.ydd.common.annotation.AccessToken;
 import com.ydd.common.annotation.ControllerLog;
 import com.ydd.common.annotation.RepeatSubmit;
+import com.ydd.common.core.controller.BaseController;
 import com.ydd.common.core.domain.ResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -28,7 +30,7 @@ import javax.validation.Valid;
 @RestController
 @RequestMapping("/api/order")
 @RequiredArgsConstructor(onConstructor_ = @Autowired)
-public class OrderOpenApi {
+public class OrderOpenApi extends BaseController {
 
     private final OpenApiOrderService openApiOrderService;
 
@@ -38,32 +40,37 @@ public class OrderOpenApi {
     @RequestMapping(value = "/valuation", method = RequestMethod.POST)
     @RepeatSubmit
     @ControllerLog("开放接口-计价")
+    @AccessToken
     public ResponseResult valuation(@RequestBody @Valid OrderValuationReq valuationReq) {
-        return openApiOrderValuationService.valuation(valuationReq);
+        return openApiOrderValuationService.valuation(valuationReq, getLoginId());
     }
 
     @ApiOperation("开放接口-创建订单")
     @RequestMapping(value = "/create", method = RequestMethod.POST)
     @RepeatSubmit
     @ControllerLog("开放接口-创建订单")
+    @AccessToken
     public ResponseResult create(@RequestBody @Valid OrderCreateReq orderCreateReq) {
         return openApiOrderService.createOrder(orderCreateReq);
     }
 
     @ApiOperation("开放接口-推送订单")
     @RequestMapping(value = "/push", method = RequestMethod.POST)
+    @AccessToken
     public ResponseResult pushOrder(@RequestBody @Valid OrderPushReq pushReq) {
         return openApiOrderService.pushOrder(pushReq);
     }
 
     @ApiOperation("开放接口-取消订单")
     @RequestMapping(value = "/cancel", method = RequestMethod.POST)
+    @AccessToken
     public ResponseResult cancelOrder(@RequestBody @Valid OrderCancelReq cancelReq) {
         return openApiOrderService.cancelOrder(cancelReq);
     }
 
     @ApiOperation("开放接口-骑手位置")
     @RequestMapping(value = "/rider/location", method = RequestMethod.POST)
+    @AccessToken
     public ResponseResult location(@RequestBody @Valid OrderLocationReq locationReq) {
         return openApiOrderService.riderLocation(locationReq);
     }

+ 19 - 11
lb-app/src/main/java/com/ydd/app/dto/OrderValuationReq.java

@@ -1,13 +1,10 @@
 package com.ydd.app.dto;
 
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
+import javax.validation.constraints.*;
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 
 /**
@@ -34,7 +31,6 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     @Size(max = 50, message = "收件人名称最长不能超过50个字符")
     private String receiverName;
 
-
     /**
      * 收件人联系电话
      */
@@ -59,6 +55,8 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     /**
      * 收件城市编码
      */
+    @NotBlank(message = "收件人城市编码不能为空")
+    @Size(max = 30, message = "收件人城市编码最长不能超过30个字符")
     private String receiverCityCode;
 
     /**
@@ -74,7 +72,6 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     @Size(max = 150, message = "收件人详细地址最长不能超过150个字符")
     private String receiverAddress;
 
-
     /**
      * 收件人门牌号
      */
@@ -118,9 +115,6 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     @Size(max = 30, message = "发件人所在省最长不能超过30个字符")
     private String sendProvinceName;
 
-    /** 发件人所在市,当传入shopCode门店编号时,不必填,根据门店信息发单,最长不超过30个字符 */
-    @ApiModelProperty(value = "发件人所在市")
-
     /**
      * 发件人所在市,当传入shopCode门店编号时,不必填,根据门店信息发单
      */
@@ -128,8 +122,9 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     private String sendCityName;
 
     /**
-     * 发件城市编码
+     * 发件城市编码, 当传入shopCode门店编号时,不必填,根据门店信息发单
      */
+    @Size(max = 30, message = "收件人城市编码最长不能超过30个字符")
     private String sendCityCode;
 
     /**
@@ -187,4 +182,17 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     @Size(max = 200, message = "订单备注最长不能超过200个字符")
     private String remark;
 
+    /**
+     * 商品金额
+     */
+    @Min(value = 1, message = "商品金额最低1元")
+    @Max(value = 99999, message = "商品金额最大99999元")
+    private BigDecimal productAmount;
+
+    /**
+     * 订单来源(0-其他 1-美团 2-饿了么 3-饿百零售 5-美团闪购 6-京东到家)
+     */
+    @NotNull(message = "订单来源不能为空")
+    private Integer platformType;
+
 }

+ 1 - 1
lb-app/src/main/java/com/ydd/app/service/OpenApiOrderValuationService.java

@@ -10,6 +10,6 @@ import com.ydd.common.core.domain.ResponseResult;
  */
 public interface OpenApiOrderValuationService {
 
-    ResponseResult valuation(OrderValuationReq valuationReq);
+    ResponseResult valuation(OrderValuationReq valuationReq, Long loginId);
 
 }

+ 25 - 12
lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderServiceImpl.java

@@ -4,11 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.ydd.api.DeliveryService;
-import com.ydd.app.dto.OrderCancelReq;
-import com.ydd.app.dto.OrderLocationReq;
-import com.ydd.app.dto.OrderCreateReq;
-import com.ydd.app.dto.OrderReq;
-import com.ydd.app.dto.OrderPushReq;
+import com.ydd.app.dto.*;
 import com.ydd.app.service.ApiOrderNewService;
 import com.ydd.app.service.OpenApiOrderService;
 import com.ydd.app.vo.OrderLocationVo;
@@ -29,6 +25,7 @@ import com.ydd.module.domain.*;
 import com.ydd.module.dto.CancelOrderDto;
 import com.ydd.module.dto.CouponDto;
 import com.ydd.module.enums.*;
+import com.ydd.module.expection.CustomAppException;
 import com.ydd.module.service.*;
 import com.ydd.third.common.utils.CoordinateUtils;
 import com.ydd.third.common.vo.ResObject;
@@ -45,10 +42,12 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 订单类开放接口 ServiceImpl
@@ -736,17 +735,31 @@ public class OpenApiOrderServiceImpl implements OpenApiOrderService {
 
     @Override
     public ResponseResult createOrder(OrderCreateReq orderCreateReq) {
-        // 计价结果缓存到redis, 10分钟有效, 时需重新计价
+        // 计价结果缓存到redis, 10分钟有效, 时需重新计价
         if (!redisCache.hasKey(RedisKeyConstant.VALUATION_RESULT + orderCreateReq.getOutOrderSn())) {
             return ResponseResult.error(ResponseResultCodeEnum.VALUATION_INVALID);
         }
         OrderReq orderReq = redisCache.getCacheObject(RedisKeyConstant.VALUATION_RESULT + orderCreateReq.getOutOrderSn());
-        Object result = apiOrderNewService.createOrder(orderReq.getMemberId(), orderReq, 1);
-        if ("amount_not_enough".equals(result)) {
-            return ResponseResult.error(ResponseResultCodeEnum.AMOUNT_NOT_ENOUGH);
-        } else if ("ok".equals(result)) {
-            OrderCreateVo orderCreateVo = OrderCreateVo.builder().orderSn(orderReq.getOrderNo()).outOrderSn(orderCreateReq.getOutOrderSn()).build();
-            return ResponseResult.success(orderCreateVo);
+        List<ValuationRes> valuationResList = orderReq.getValuationRes();
+        if (CollectionUtils.isEmpty(valuationResList)) {
+            return ResponseResult.error(ResponseResultCodeEnum.VALUATION_INVALID);
+        }
+        List<String> deliveryIds = Arrays.asList(orderCreateReq.getDeliveryIdStr().split(","));
+        List<ValuationRes> valuationRes = valuationResList.stream().filter(item -> deliveryIds.contains(String.valueOf(item.getDeliveryType()))).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(valuationRes)) {
+            return ResponseResult.error(ResponseResultCodeEnum.DELIVERY_ID_INVALID);
+        }
+        orderReq.setValuationRes(valuationRes);
+        try {
+            Object result = apiOrderNewService.createOrder(orderReq.getMemberId(), orderReq, 1);
+            if ("amount_not_enough".equals(result)) {
+                return ResponseResult.error(ResponseResultCodeEnum.AMOUNT_NOT_ENOUGH);
+            } else if ("ok".equals(result)) {
+                OrderCreateVo orderCreateVo = OrderCreateVo.builder().orderSn(orderReq.getOrderNo()).outOrderSn(orderCreateReq.getOutOrderSn()).build();
+                return ResponseResult.success(orderCreateVo);
+            }
+        } catch (Exception e) {
+            return ResponseResult.error(ResponseResultCodeEnum.ORDER_CREATE_ERR.getCode(), e.getMessage());
         }
         return ResponseResult.error(ResponseResultCodeEnum.ORDER_CREATE_ERR);
     }

+ 10 - 8
lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderValuationServiceImpl.java

@@ -94,10 +94,12 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
     private final IDspDeliveryUuService iDspDeliveryUuService;
 
     @Override
-    public ResponseResult valuation(OrderValuationReq valuationReq) {
+    public ResponseResult valuation(OrderValuationReq valuationReq, Long loginId) {
+        // 开放平台大商户对应的用户
+        Member member = iMemberService.getById(loginId);
         OrderValuationDto valuationDto = new OrderValuationDto();
         // 参数校验
-        ResponseResult result = this.validParam(valuationReq, valuationDto);
+        ResponseResult result = this.validParam(valuationReq, valuationDto, member);
         if (result.getCode() != ResponseResultCodeEnum.SUCCESS.getCode()) {
             return result;
         }
@@ -109,8 +111,6 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         valuationDto.setOrderSn(SnCodeUtils.createSn());
         valuationDto.setTakeType(0);
 
-        // 开放平台大商户对应的用户
-        Member member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", valuationDto.getMerchantId()));
         // 获取最匹配的运力包(门店 > 城市 > 全国)
         Long deliveryPackageId = iPackageCityConfigService.getPackageId(valuationDto.getShopId(), member, null, PackageCityConfigPackageTypeEnum.DELIVERY.type);
         List<Integer> types = Lists.newArrayList();
@@ -295,17 +295,14 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         orderReq.setReceiptAddress(receiptAddress);
 
         orderReq.setOrderNo(valuationDto.getOrderSn());
-        orderReq.setDaySeq(valuationDto.getDaySeq());
         orderReq.setProduct(valuationDto.getProduct());
         orderReq.setProductId(valuationDto.getCategoryId());
-        orderReq.setWeight(valuationDto.getWeight());
 
         if (StringUtils.isNotBlank(valuationDto.getShopCode())) {
             orderReq.setShopId(valuationDto.getShopId());
             orderReq.setShopName(valuationDto.getShopName());
         }
         orderReq.setIsMine(0);
-        orderReq.setPlatformType(0);
         orderReq.setTransport(0);
         // 对接开放接口的均为余额支付
         orderReq.setPaymentType(PaymentTypeEnum.BALANCE.type);
@@ -681,7 +678,7 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         return infos;
     }
 
-    private ResponseResult validParam(OrderValuationReq valuationReq, OrderValuationDto valuationDto) {
+    private ResponseResult validParam(OrderValuationReq valuationReq, OrderValuationDto valuationDto, Member member) {
         ResponseResult result = ResponseResult.success();
         if (StringUtils.isBlank(valuationReq.getShopCode())) {
             if (StringUtils.isBlank(valuationReq.getSendName())) {
@@ -696,6 +693,9 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
             if (StringUtils.isBlank(valuationReq.getSendCityName())) {
                 return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人所在市", null);
             }
+            if (StringUtils.isBlank(valuationReq.getSendCityCode())) {
+                return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人城市编码", null);
+            }
             if (StringUtils.isBlank(valuationReq.getSendAddress())) {
                 return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人详细地址", null);
             }
@@ -705,6 +705,8 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
             if (StringUtils.isBlank(valuationReq.getSendLat())) {
                 return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人经度", null);
             }
+            valuationDto.setShopId(member.getShopId());
+            valuationDto.setMerchantId(member.getMerchantId());
         } else {
             Shop shop = iShopService.getByCode(valuationReq.getShopCode());
             if (shop == null) {

+ 4 - 0
lb-common/src/main/java/com/ydd/common/core/domain/ResponseResult.java

@@ -71,6 +71,10 @@ public class ResponseResult<T> implements Serializable {
         return new ResponseResult<T>(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data);
     }
 
+    public static <T> ResponseResult<T> error(int code, String message) {
+        return new ResponseResult<T>(code, message, null);
+    }
+
     public static <T> ResponseResult<T> error(ResponseResultCodeEnum resultCodeEnum) {
         return error(resultCodeEnum, null);
     }

+ 1 - 0
lb-common/src/main/java/com/ydd/common/enums/ResponseResultCodeEnum.java

@@ -47,6 +47,7 @@ public enum ResponseResultCodeEnum {
     VALUATION_INVALID(2030, "计价已失效, 请重新计价"),
     AMOUNT_NOT_ENOUGH(2031, "账户余额不足"),
     ORDER_CREATE_ERR(2032, "下单失败"),
+    DELIVERY_ID_INVALID(2033, "无效的运力ID"),
     ;
 
     private final int code;

+ 4 - 2
lb-common/src/main/java/com/ydd/common/utils/http/HttpUtils.java

@@ -32,6 +32,7 @@ import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.config.Registry;
 import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.ConnectTimeoutException;
 import org.apache.http.conn.socket.ConnectionSocketFactory;
 import org.apache.http.conn.socket.PlainConnectionSocketFactory;
 import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
@@ -340,9 +341,10 @@ public class HttpUtils
             if (response.getStatusLine().getStatusCode() == 200) {
                 return EntityUtils.toString(entity, charset);
             }
+        } catch (ConnectException | SocketTimeoutException | ConnectTimeoutException e) {
+            log.error("post请求异常,请求地址:{}, param: {}, 异常信息: {}", url, requestBodyString, e);
         } catch (IOException e) {
-            log.error("post请求异常,请求地址:" + url + ", 异常信息:" + JSON.toJSONString(e));
-            throw e;
+            log.error("post请求异常,请求地址:{}, param: {}, 异常信息: {}", url, requestBodyString, JSON.toJSONString(e));
         } finally {
             closeALL(entity, response, httpClient);
         }